diff --git a/.coolify-logo b/.coolify-logo deleted file mode 100644 index fe8daf6984..0000000000 --- a/.coolify-logo +++ /dev/null @@ -1,8 +0,0 @@ - _____ _ _ __ - / ____| | (_)/ _| - | | ___ ___ | |_| |_ _ _ - | | / _ \ / _ \| | | _| | | | - | |___| (_) | (_) | | | | | |_| | - \_____\___/ \___/|_|_|_| \__, | - __/ | - |___/ diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 6f3c903f0f..0000000000 --- a/.dockerignore +++ /dev/null @@ -1,38 +0,0 @@ -/.phpunit.cache -/node_modules -/public/build -/public/hot -/public/storage -/vendor -.env -.env.backup -.env.secrets -.phpunit.result.cache -Homestead.json -Homestead.yaml -auth.json -npm-debug.log -yarn-error.log -/.fleet -/.idea -/.vscode -/.npm -/.bash_history -/_data -.rnd -/.ssh -.ignition.json -.env.dusk.local -docker/coolify-realtime/node_modules - -/storage/*.key -/storage/app/backups -/storage/app/ssh/keys -/storage/app/ssh/mux -/storage/app/tmp -/storage/app/debugbar -/storage/logs -/storage/pail - - - diff --git a/.env.development.example b/.env.development.example deleted file mode 100644 index d4daed4f74..0000000000 --- a/.env.development.example +++ /dev/null @@ -1,34 +0,0 @@ -# Coolify Configuration -APP_ENV=local -APP_NAME="Coolify Development" -APP_ID=development -APP_KEY= -APP_URL=http://localhost -APP_PORT=8000 -APP_DEBUG=true -SSH_MUX_ENABLED=true - -# PostgreSQL Database Configuration -DB_DATABASE=coolify -DB_USERNAME=coolify -DB_PASSWORD=password -DB_HOST=host.docker.internal -DB_PORT=5432 - -# Ray Configuration -# Set to true to enable Ray -RAY_ENABLED=false -# Set custom ray port -# RAY_PORT= - -# Enable Laravel Telescope for debugging -TELESCOPE_ENABLED=false - -# Selenium Driver URL for Dusk -DUSK_DRIVER_URL=http://selenium:4444 - -# Special Keys for Andras -# For cache purging -BUNNY_API_KEY= -# For asset uploads -BUNNY_STORAGE_API_KEY= diff --git a/.env.dusk.ci b/.env.dusk.ci deleted file mode 100644 index 9660de7b48..0000000000 --- a/.env.dusk.ci +++ /dev/null @@ -1,15 +0,0 @@ -APP_ENV=production -APP_NAME="Coolify Staging" -APP_ID=development -APP_KEY= -APP_URL=http://localhost -APP_PORT=8000 -SSH_MUX_ENABLED=true - -# PostgreSQL Database Configuration -DB_DATABASE=coolify -DB_USERNAME=coolify -DB_PASSWORD=password -DB_HOST=localhost -DB_PORT=5432 - diff --git a/.env.example b/.env.example new file mode 100644 index 0000000000..1696ab4873 --- /dev/null +++ b/.env.example @@ -0,0 +1,65 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost + +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US + +APP_MAINTENANCE_DRIVER=file +# APP_MAINTENANCE_STORE=database + +PHP_CLI_SERVER_WORKERS=4 + +BCRYPT_ROUNDS=12 + +LOG_CHANNEL=stack +LOG_STACK=single +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=pgsql +DB_HOST=127.0.0.1 +DB_PORT=5432 +DB_DATABASE=coolify +DB_USERNAME=root +DB_PASSWORD= + +SESSION_DRIVER=database +SESSION_LIFETIME=120 +SESSION_ENCRYPT=false +SESSION_PATH=/ +SESSION_DOMAIN=null + +BROADCAST_CONNECTION=log +FILESYSTEM_DISK=local +QUEUE_CONNECTION=database + +CACHE_STORE=database +# CACHE_PREFIX= + +MEMCACHED_HOST=127.0.0.1 + +REDIS_CLIENT=phpredis +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=log +MAIL_SCHEME=null +MAIL_HOST=127.0.0.1 +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +VITE_APP_NAME="${APP_NAME}" diff --git a/.env.production b/.env.production deleted file mode 100644 index 96833c2533..0000000000 --- a/.env.production +++ /dev/null @@ -1,16 +0,0 @@ -APP_ID= -APP_NAME=Coolify -APP_KEY= - -DB_USERNAME=coolify -DB_PASSWORD= - -REDIS_PASSWORD= - -PUSHER_APP_ID= -PUSHER_APP_KEY= -PUSHER_APP_SECRET= - -ROOT_USERNAME= -ROOT_USER_EMAIL= -ROOT_USER_PASSWORD= diff --git a/.env.windows-docker-desktop.example b/.env.windows-docker-desktop.example deleted file mode 100644 index b067b4c5c0..0000000000 --- a/.env.windows-docker-desktop.example +++ /dev/null @@ -1,13 +0,0 @@ -IS_WINDOWS_DOCKER_DESKTOP=true - -APP_ID=coolify-windows-docker-desktop -APP_NAME=Coolify -APP_KEY=base64:ssTlCmrIE/q7whnKMvT6DwURikg69COzGsAwFVROm80= - -DB_USERNAME=coolify -DB_PASSWORD=coolify -REDIS_PASSWORD=coolify - -PUSHER_APP_ID=coolify -PUSHER_APP_KEY=coolify -PUSHER_APP_SECRET=coolify diff --git a/.gitattributes b/.gitattributes index c48a5898bc..fcb21d396d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -8,4 +8,4 @@ /.github export-ignore CHANGELOG.md export-ignore -.styleci.yml export-ignore \ No newline at end of file +.styleci.yml export-ignore diff --git a/.github/FUNDING.yaml b/.github/FUNDING.yaml deleted file mode 100644 index 632a4655d8..0000000000 --- a/.github/FUNDING.yaml +++ /dev/null @@ -1,2 +0,0 @@ -open_collective: coollabsio -github: coollabsio diff --git a/.github/ISSUE_TEMPLATE/01_BUG_REPORT.yml b/.github/ISSUE_TEMPLATE/01_BUG_REPORT.yml deleted file mode 100644 index 42df4785e6..0000000000 --- a/.github/ISSUE_TEMPLATE/01_BUG_REPORT.yml +++ /dev/null @@ -1,65 +0,0 @@ -name: 🐞 Bug Report -description: "File a new bug report." -title: "[Bug]: " -labels: ["🐛 Bug", "🔍 Triage"] -body: - - type: markdown - attributes: - value: | - > [!IMPORTANT] - > **Please ensure you are using the latest version of Coolify before submitting an issue, as the bug may have already been fixed in a recent update.** (Of course, if you're experiencing an issue on the latest version that wasn't present in a previous version, please let us know.) - - # 💎 Bounty Program (with [algora.io](https://console.algora.io/org/coollabsio/bounties/new)) - - If you would like to prioritize the issue resolution, consider adding a bounty to this issue through our [Bounty Program](https://console.algora.io/org/coollabsio/bounties/new). - - - type: textarea - attributes: - label: Error Message and Logs - description: Provide a detailed description of the error or exception you encountered, along with any relevant log output. - validations: - required: true - - - type: textarea - attributes: - label: Steps to Reproduce - description: Please provide a step-by-step guide to reproduce the issue. Be as detailed as possible, otherwise we may not be able to assist you. - value: | - 1. - 2. - 3. - 4. - validations: - required: true - - - type: input - attributes: - label: Example Repository URL - description: If applicable, provide a URL to a repository demonstrating the issue. - - - type: input - attributes: - label: Coolify Version - description: Please provide the Coolify version you are using. This can be found in the top left corner of your Coolify dashboard. - placeholder: "v4.0.0-beta.335" - validations: - required: true - - - type: dropdown - attributes: - label: Are you using Coolify Cloud? - options: - - "No (self-hosted)" - - "Yes (Coolify Cloud)" - validations: - required: true - - - type: input - attributes: - label: Operating System and Version (self-hosted) - description: Run `cat /etc/os-release` or `lsb_release -a` in your terminal and provide the operating system and version. - placeholder: "Ubuntu 22.04" - - - type: textarea - attributes: - label: Additional Information - description: Any other relevant details about the issue. diff --git a/.github/ISSUE_TEMPLATE/02_ENHANCEMENT_BOUNTY.yml b/.github/ISSUE_TEMPLATE/02_ENHANCEMENT_BOUNTY.yml deleted file mode 100644 index ef26125e0b..0000000000 --- a/.github/ISSUE_TEMPLATE/02_ENHANCEMENT_BOUNTY.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: 💎 Enhancement Bounty -description: "Propose a new feature, service, or improvement with an attached bounty." -title: "[Enhancement]: " -labels: ["✨ Enhancement", "🔍 Triage"] -body: - - type: markdown - attributes: - value: | - > [!IMPORTANT] - > **This issue template is exclusively for proposing new features, services, or improvements with an attached bounty.** Enhancements without a bounty can be discussed in the appropriate category of [Github Discussions](https://github.com/coollabsio/coolify/discussions). - - # 💎 Add a Bounty (with [algora.io](https://console.algora.io/org/coollabsio/bounties/new)) - - [Click here to add the required bounty](https://console.algora.io/org/coollabsio/bounties/new) - - - type: dropdown - attributes: - label: Request Type - description: Select the type of request you are making. - options: - - New Feature - - New Service - - Improvement - validations: - required: true - - - type: textarea - attributes: - label: Description - description: Provide a detailed description of the feature, improvement, or service you are proposing. - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 92c48e2d62..0000000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,18 +0,0 @@ -blank_issues_enabled: false - -contact_links: - - name: 🤔 Questions and Community Support - url: https://coollabs.io/discord - about: If you have any questions, reach out to us on Discord inside the "#support" channel. - - - name: 💡 Feature Request - url: https://github.com/coollabsio/coolify/discussions/categories/feature-requests - about: Suggest a new feature for Coolify. - - - name: ⚙️ Service Request - url: https://github.com/coollabsio/coolify/discussions/categories/service-requests - about: Request a new service integration for Coolify. - - - name: 🔧 Improvements - url: https://github.com/coollabsio/coolify/discussions/categories/improvements - about: Suggest improvements to existing features for Coolify. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md deleted file mode 100644 index 5afe00a301..0000000000 --- a/.github/pull_request_template.md +++ /dev/null @@ -1,13 +0,0 @@ -## Submit Checklist (REMOVE THIS SECTION BEFORE SUBMITTING) -- [ ] I have selected the `next` branch as the destination for my PR, not `main`. -- [ ] I have listed all changes in the `Changes` section. -- [ ] I have filled out the `Issues` section with the issue/discussion link(s) (if applicable). -- [ ] I have tested my changes. -- [ ] I have considered backwards compatibility. -- [ ] I have removed this checklist and any unused sections. - -## Changes -- - -## Issues -- fix # diff --git a/.github/workflows/browser-tests.yml b/.github/workflows/browser-tests.yml deleted file mode 100644 index b06c9e97cf..0000000000 --- a/.github/workflows/browser-tests.yml +++ /dev/null @@ -1,65 +0,0 @@ -name: Dusk -on: - push: - branches: [ "not-existing" ] -jobs: - dusk: - runs-on: ubuntu-latest - - services: - redis: - image: redis - env: - REDIS_HOST: localhost - REDIS_PORT: 6379 - ports: - - 6379:6379 - options: >- - --health-cmd "redis-cli ping" - --health-interval 10s - --health-timeout 5s - --health-retries 5 - - steps: - - uses: actions/checkout@v4 - - name: Set up PostgreSQL - run: | - sudo systemctl start postgresql - sudo -u postgres psql -c "CREATE DATABASE coolify;" - sudo -u postgres psql -c "CREATE USER coolify WITH PASSWORD 'password';" - sudo -u postgres psql -c "ALTER ROLE coolify SET client_encoding TO 'utf8';" - sudo -u postgres psql -c "ALTER ROLE coolify SET default_transaction_isolation TO 'read committed';" - sudo -u postgres psql -c "ALTER ROLE coolify SET timezone TO 'UTC';" - sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE coolify TO coolify;" - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: '8.2' - - name: Copy .env - run: cp .env.dusk.ci .env - - name: Install Dependencies - run: composer install --no-progress --prefer-dist --optimize-autoloader - - name: Generate key - run: php artisan key:generate - - name: Install Chrome binaries - run: php artisan dusk:chrome-driver --detect - - name: Start Chrome Driver - run: ./vendor/laravel/dusk/bin/chromedriver-linux --port=4444 & - - name: Build assets - run: npm install && npm run build - - name: Run Laravel Server - run: php artisan serve --no-reload & - - name: Execute tests - run: php artisan dusk - - name: Upload Screenshots - if: failure() - uses: actions/upload-artifact@v4 - with: - name: screenshots - path: tests/Browser/screenshots - - name: Upload Console Logs - if: failure() - uses: actions/upload-artifact@v4 - with: - name: console - path: tests/Browser/console diff --git a/.github/workflows/chore-lock-closed-issues-discussions-and-prs.yml b/.github/workflows/chore-lock-closed-issues-discussions-and-prs.yml deleted file mode 100644 index d008539647..0000000000 --- a/.github/workflows/chore-lock-closed-issues-discussions-and-prs.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: Lock closed Issues, Discussions, and PRs - -on: - schedule: - - cron: '0 1 * * *' - -jobs: - lock-threads: - runs-on: ubuntu-latest - steps: - - name: Lock threads after 30 days of inactivity - uses: dessant/lock-threads@v5 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - issue-inactive-days: '30' - pr-inactive-days: '30' - discussion-inactive-days: '30' diff --git a/.github/workflows/chore-manage-stale-issues-and-prs.yml b/.github/workflows/chore-manage-stale-issues-and-prs.yml deleted file mode 100644 index 58a2b7d7e6..0000000000 --- a/.github/workflows/chore-manage-stale-issues-and-prs.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Manage Stale Issues and PRs - -on: - schedule: - - cron: '0 2 * * *' - -jobs: - manage-stale: - runs-on: ubuntu-latest - steps: - - name: Manage stale issues and PRs - uses: actions/stale@v9 - id: stale - with: - stale-issue-message: 'This issue will be automatically closed in a few days if no response is received. Please provide an update with the requested information.' - stale-pr-message: 'This pull request requires attention. If no changes or response is received within the next few days, it will be automatically closed. Please update your PR or leave a comment with the requested information.' - close-issue-message: 'This issue has been automatically closed due to inactivity.' - close-pr-message: 'Thank you for your contribution. Due to inactivity, this PR was automatically closed. If you would like to continue working on this change in the future, feel free to reopen this PR or submit a new one.' - days-before-stale: 14 - days-before-close: 7 - stale-issue-label: '⏱︎ Stale' - stale-pr-label: '⏱︎ Stale' - only-labels: '💤 Waiting for feedback, 💤 Waiting for changes' - remove-stale-when-updated: true - operations-per-run: 100 - labels-to-remove-when-unstale: '⏱︎ Stale, 💤 Waiting for feedback, 💤 Waiting for changes' - close-issue-reason: 'not_planned' - exempt-all-milestones: false diff --git a/.github/workflows/chore-remove-labels-and-assignees-on-close.yml b/.github/workflows/chore-remove-labels-and-assignees-on-close.yml deleted file mode 100644 index a3c299b5ea..0000000000 --- a/.github/workflows/chore-remove-labels-and-assignees-on-close.yml +++ /dev/null @@ -1,82 +0,0 @@ -name: Remove Labels and Assignees on Issue Close - -on: - issues: - types: [closed] - pull_request: - types: [closed] - pull_request_target: - types: [closed] - -jobs: - remove-labels-and-assignees: - runs-on: ubuntu-latest - steps: - - name: Remove labels and assignees - uses: actions/github-script@v7 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const { owner, repo } = context.repo; - - async function processIssue(issueNumber, isFromPR = false, prBaseBranch = null) { - try { - if (isFromPR && prBaseBranch !== 'main') { - return; - } - - const { data: currentLabels } = await github.rest.issues.listLabelsOnIssue({ - owner, - repo, - issue_number: issueNumber - }); - - const labelsToKeep = currentLabels - .filter(label => label.name === '⏱︎ Stale') - .map(label => label.name); - - await github.rest.issues.setLabels({ - owner, - repo, - issue_number: issueNumber, - labels: labelsToKeep - }); - - const { data: issue } = await github.rest.issues.get({ - owner, - repo, - issue_number: issueNumber - }); - - if (issue.assignees && issue.assignees.length > 0) { - await github.rest.issues.removeAssignees({ - owner, - repo, - issue_number: issueNumber, - assignees: issue.assignees.map(assignee => assignee.login) - }); - } - } catch (error) { - if (error.status !== 404) { - console.error(`Error processing issue ${issueNumber}:`, error); - } - } - } - - if (context.eventName === 'issues') { - await processIssue(context.payload.issue.number); - } - - if (context.eventName === 'pull_request' || context.eventName === 'pull_request_target') { - const pr = context.payload.pull_request; - await processIssue(pr.number); - if (pr.merged && pr.base.ref === 'main' && pr.body) { - const issueReferences = pr.body.match(/#(\d+)/g); - if (issueReferences) { - for (const reference of issueReferences) { - const issueNumber = parseInt(reference.substring(1)); - await processIssue(issueNumber, true, pr.base.ref); - } - } - } - } diff --git a/.github/workflows/coolify-helper-next.yml b/.github/workflows/coolify-helper-next.yml deleted file mode 100644 index a4a2a21f64..0000000000 --- a/.github/workflows/coolify-helper-next.yml +++ /dev/null @@ -1,142 +0,0 @@ -name: Coolify Helper Image Development - -on: - push: - branches: [ "next" ] - paths: - - .github/workflows/coolify-helper-next.yml - - docker/coolify-helper/Dockerfile - -env: - GITHUB_REGISTRY: ghcr.io - DOCKER_REGISTRY: docker.io - IMAGE_NAME: "coollabsio/coolify-helper" - -jobs: - amd64: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - steps: - - uses: actions/checkout@v4 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Get Version - id: version - run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getHelperVersion.php)"|xargs >> $GITHUB_OUTPUT - - - name: Build and Push Image - uses: docker/build-push-action@v6 - with: - context: . - file: docker/coolify-helper/Dockerfile - platforms: linux/amd64 - push: true - tags: | - ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next - ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next - labels: | - coolify.managed=true - aarch64: - runs-on: [ self-hosted, arm64 ] - permissions: - contents: read - packages: write - steps: - - uses: actions/checkout@v4 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Get Version - id: version - run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getHelperVersion.php)"|xargs >> $GITHUB_OUTPUT - - - name: Build and Push Image - uses: docker/build-push-action@v6 - with: - context: . - file: docker/coolify-helper/Dockerfile - platforms: linux/aarch64 - push: true - tags: | - ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-aarch64 - ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-aarch64 - labels: | - coolify.managed=true - - merge-manifest: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - needs: [ amd64, aarch64 ] - steps: - - uses: actions/checkout@v4 - - uses: docker/setup-buildx-action@v3 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Get Version - id: version - run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getHelperVersion.php)"|xargs >> $GITHUB_OUTPUT - - - name: Create & publish manifest on ${{ env.GITHUB_REGISTRY }} - run: | - docker buildx imagetools create \ - --append ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-aarch64 \ - --tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next \ - --tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:next - - - name: Create & publish manifest on ${{ env.DOCKER_REGISTRY }} - run: | - docker buildx imagetools create \ - --append ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-aarch64 \ - --tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next \ - --tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:next - - - uses: sarisia/actions-status-discord@v1 - if: always() - with: - webhook: ${{ secrets.DISCORD_WEBHOOK_DEV_RELEASE_CHANNEL }} - diff --git a/.github/workflows/coolify-helper.yml b/.github/workflows/coolify-helper.yml deleted file mode 100644 index 78c888a018..0000000000 --- a/.github/workflows/coolify-helper.yml +++ /dev/null @@ -1,142 +0,0 @@ -name: Coolify Helper Image - -on: - push: - branches: [ "main" ] - paths: - - .github/workflows/coolify-helper.yml - - docker/coolify-helper/Dockerfile - -env: - GITHUB_REGISTRY: ghcr.io - DOCKER_REGISTRY: docker.io - IMAGE_NAME: "coollabsio/coolify-helper" - -jobs: - amd64: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - steps: - - uses: actions/checkout@v4 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Get Version - id: version - run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getHelperVersion.php)"|xargs >> $GITHUB_OUTPUT - - - name: Build and Push Image - uses: docker/build-push-action@v6 - with: - context: . - file: docker/coolify-helper/Dockerfile - platforms: linux/amd64 - push: true - tags: | - ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }} - ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }} - labels: | - coolify.managed=true - aarch64: - runs-on: [ self-hosted, arm64 ] - permissions: - contents: read - packages: write - steps: - - uses: actions/checkout@v4 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Get Version - id: version - run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getHelperVersion.php)"|xargs >> $GITHUB_OUTPUT - - - name: Build and Push Image - uses: docker/build-push-action@v6 - with: - context: . - file: docker/coolify-helper/Dockerfile - platforms: linux/aarch64 - push: true - tags: | - ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-aarch64 - ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-aarch64 - labels: | - coolify.managed=true - merge-manifest: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - needs: [ amd64, aarch64 ] - steps: - - uses: actions/checkout@v4 - - - uses: docker/setup-buildx-action@v3 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Get Version - id: version - run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getHelperVersion.php)"|xargs >> $GITHUB_OUTPUT - - - name: Create & publish manifest on ${{ env.GITHUB_REGISTRY }} - run: | - docker buildx imagetools create \ - --append ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-aarch64 \ - --tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }} \ - --tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest - - - name: Create & publish manifest on ${{ env.DOCKER_REGISTRY }} - run: | - docker buildx imagetools create \ - --append ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-aarch64 \ - --tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }} \ - --tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest - - - uses: sarisia/actions-status-discord@v1 - if: always() - with: - webhook: ${{ secrets.DISCORD_WEBHOOK_PROD_RELEASE_CHANNEL }} - diff --git a/.github/workflows/coolify-production-build.yml b/.github/workflows/coolify-production-build.yml deleted file mode 100644 index ad08782056..0000000000 --- a/.github/workflows/coolify-production-build.yml +++ /dev/null @@ -1,140 +0,0 @@ -name: Production Build (v4) - -on: - push: - branches: ["main"] - paths-ignore: - - .github/workflows/coolify-helper.yml - - .github/workflows/coolify-helper-next.yml - - .github/workflows/coolify-realtime.yml - - .github/workflows/coolify-realtime-next.yml - - docker/coolify-helper/Dockerfile - - docker/coolify-realtime/Dockerfile - - docker/testing-host/Dockerfile - - templates/** - - CHANGELOG.md - -env: - GITHUB_REGISTRY: ghcr.io - DOCKER_REGISTRY: docker.io - IMAGE_NAME: "coollabsio/coolify" - -jobs: - amd64: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Get Version - id: version - run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getVersion.php)"|xargs >> $GITHUB_OUTPUT - - - name: Build and Push Image - uses: docker/build-push-action@v6 - with: - context: . - file: docker/production/Dockerfile - platforms: linux/amd64 - push: true - tags: | - ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }} - ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }} - - aarch64: - runs-on: [self-hosted, arm64] - steps: - - uses: actions/checkout@v4 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Get Version - id: version - run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getVersion.php)"|xargs >> $GITHUB_OUTPUT - - - name: Build and Push Image - uses: docker/build-push-action@v6 - with: - context: . - file: docker/production/Dockerfile - platforms: linux/aarch64 - push: true - tags: | - ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-aarch64 - ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-aarch64 - - merge-manifest: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - needs: [amd64, aarch64] - steps: - - uses: actions/checkout@v4 - - - uses: docker/setup-buildx-action@v3 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Get Version - id: version - run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getVersion.php)"|xargs >> $GITHUB_OUTPUT - - - name: Create & publish manifest on ${{ env.GITHUB_REGISTRY }} - run: | - docker buildx imagetools create \ - --append ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-aarch64 \ - --tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }} \ - --tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest - - - name: Create & publish manifest on ${{ env.DOCKER_REGISTRY }} - run: | - docker buildx imagetools create \ - --append ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-aarch64 \ - --tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }} \ - --tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest - - - uses: sarisia/actions-status-discord@v1 - if: always() - with: - webhook: ${{ secrets.DISCORD_WEBHOOK_PROD_RELEASE_CHANNEL }} diff --git a/.github/workflows/coolify-realtime-next.yml b/.github/workflows/coolify-realtime-next.yml deleted file mode 100644 index ad590146be..0000000000 --- a/.github/workflows/coolify-realtime-next.yml +++ /dev/null @@ -1,147 +0,0 @@ -name: Coolify Realtime Development - -on: - push: - branches: [ "next" ] - paths: - - .github/workflows/coolify-realtime-next.yml - - docker/coolify-realtime/Dockerfile - - docker/coolify-realtime/terminal-server.js - - docker/coolify-realtime/package.json - - docker/coolify-realtime/package-lock.json - - docker/coolify-realtime/soketi-entrypoint.sh - -env: - GITHUB_REGISTRY: ghcr.io - DOCKER_REGISTRY: docker.io - IMAGE_NAME: "coollabsio/coolify-realtime" - -jobs: - amd64: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - steps: - - uses: actions/checkout@v4 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Get Version - id: version - run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getRealtimeVersion.php)"|xargs >> $GITHUB_OUTPUT - - - name: Build and Push Image - uses: docker/build-push-action@v6 - with: - context: . - file: docker/coolify-realtime/Dockerfile - platforms: linux/amd64 - push: true - tags: | - ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next - ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next - labels: | - coolify.managed=true - - aarch64: - runs-on: [ self-hosted, arm64 ] - permissions: - contents: read - packages: write - steps: - - uses: actions/checkout@v4 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Get Version - id: version - run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getRealtimeVersion.php)"|xargs >> $GITHUB_OUTPUT - - - name: Build and Push Image - uses: docker/build-push-action@v6 - with: - context: . - file: docker/coolify-realtime/Dockerfile - platforms: linux/aarch64 - push: true - tags: | - ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-aarch64 - ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-aarch64 - labels: | - coolify.managed=true - - merge-manifest: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - needs: [ amd64, aarch64 ] - steps: - - uses: actions/checkout@v4 - - - uses: docker/setup-buildx-action@v3 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Get Version - id: version - run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getRealtimeVersion.php)"|xargs >> $GITHUB_OUTPUT - - - name: Create & publish manifest on ${{ env.GITHUB_REGISTRY }} - run: | - docker buildx imagetools create \ - --append ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-aarch64 \ - --tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next \ - --tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:next - - - name: Create & publish manifest on ${{ env.DOCKER_REGISTRY }} - run: | - docker buildx imagetools create \ - --append ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-aarch64 \ - --tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next \ - --tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:next - - - uses: sarisia/actions-status-discord@v1 - if: always() - with: - webhook: ${{ secrets.DISCORD_WEBHOOK_DEV_RELEASE_CHANNEL }} diff --git a/.github/workflows/coolify-realtime.yml b/.github/workflows/coolify-realtime.yml deleted file mode 100644 index d3af141449..0000000000 --- a/.github/workflows/coolify-realtime.yml +++ /dev/null @@ -1,147 +0,0 @@ -name: Coolify Realtime - -on: - push: - branches: [ "main" ] - paths: - - .github/workflows/coolify-realtime.yml - - docker/coolify-realtime/Dockerfile - - docker/coolify-realtime/terminal-server.js - - docker/coolify-realtime/package.json - - docker/coolify-realtime/package-lock.json - - docker/coolify-realtime/soketi-entrypoint.sh - -env: - GITHUB_REGISTRY: ghcr.io - DOCKER_REGISTRY: docker.io - IMAGE_NAME: "coollabsio/coolify-realtime" - -jobs: - amd64: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - steps: - - uses: actions/checkout@v4 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Get Version - id: version - run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getRealtimeVersion.php)"|xargs >> $GITHUB_OUTPUT - - - name: Build and Push Image - uses: docker/build-push-action@v6 - with: - context: . - file: docker/coolify-realtime/Dockerfile - platforms: linux/amd64 - push: true - tags: | - ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }} - ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }} - labels: | - coolify.managed=true - - aarch64: - runs-on: [ self-hosted, arm64 ] - permissions: - contents: read - packages: write - steps: - - uses: actions/checkout@v4 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Get Version - id: version - run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getRealtimeVersion.php)"|xargs >> $GITHUB_OUTPUT - - - name: Build and Push Image - uses: docker/build-push-action@v6 - with: - context: . - file: docker/coolify-realtime/Dockerfile - platforms: linux/aarch64 - push: true - tags: | - ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-aarch64 - ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-aarch64 - labels: | - coolify.managed=true - - merge-manifest: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - needs: [ amd64, aarch64 ] - steps: - - uses: actions/checkout@v4 - - - uses: docker/setup-buildx-action@v3 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Get Version - id: version - run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getRealtimeVersion.php)"|xargs >> $GITHUB_OUTPUT - - - name: Create & publish manifest on ${{ env.GITHUB_REGISTRY }} - run: | - docker buildx imagetools create \ - --append ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-aarch64 \ - --tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }} \ - --tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest - - - name: Create & publish manifest on ${{ env.DOCKER_REGISTRY }} - run: | - docker buildx imagetools create \ - --append ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-aarch64 \ - --tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }} \ - --tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest - - - uses: sarisia/actions-status-discord@v1 - if: always() - with: - webhook: ${{ secrets.DISCORD_WEBHOOK_PROD_RELEASE_CHANNEL }} diff --git a/.github/workflows/coolify-staging-build.yml b/.github/workflows/coolify-staging-build.yml deleted file mode 100644 index ff6b553dfd..0000000000 --- a/.github/workflows/coolify-staging-build.yml +++ /dev/null @@ -1,126 +0,0 @@ -name: Staging Build - -on: - push: - branches-ignore: ["main", "v3"] - paths-ignore: - - .github/workflows/coolify-helper.yml - - .github/workflows/coolify-helper-next.yml - - .github/workflows/coolify-realtime.yml - - .github/workflows/coolify-realtime-next.yml - - docker/coolify-helper/Dockerfile - - docker/coolify-realtime/Dockerfile - - docker/testing-host/Dockerfile - - templates/** - - CHANGELOG.md - -env: - GITHUB_REGISTRY: ghcr.io - DOCKER_REGISTRY: docker.io - IMAGE_NAME: "coollabsio/coolify" - -jobs: - amd64: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Build and Push Image - uses: docker/build-push-action@v6 - with: - context: . - file: docker/production/Dockerfile - platforms: linux/amd64 - push: true - tags: | - ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }} - ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }} - - aarch64: - runs-on: [self-hosted, arm64] - permissions: - contents: read - packages: write - steps: - - uses: actions/checkout@v4 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Build and Push Image - uses: docker/build-push-action@v6 - with: - context: . - file: docker/production/Dockerfile - platforms: linux/aarch64 - push: true - tags: | - ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}-aarch64 - ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}-aarch64 - - merge-manifest: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - needs: [amd64, aarch64] - steps: - - uses: actions/checkout@v4 - - - uses: docker/setup-buildx-action@v3 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Create & publish manifest on ${{ env.GITHUB_REGISTRY }} - run: | - docker buildx imagetools create \ - --append ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}-aarch64 \ - --tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }} - - - name: Create & publish manifest on ${{ env.DOCKER_REGISTRY }} - run: | - docker buildx imagetools create \ - --append ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}-aarch64 \ - --tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }} - - - uses: sarisia/actions-status-discord@v1 - if: always() - with: - webhook: ${{ secrets.DISCORD_WEBHOOK_DEV_RELEASE_CHANNEL }} diff --git a/.github/workflows/coolify-testing-host.yml b/.github/workflows/coolify-testing-host.yml deleted file mode 100644 index 95a228114a..0000000000 --- a/.github/workflows/coolify-testing-host.yml +++ /dev/null @@ -1,126 +0,0 @@ -name: Coolify Testing Host - -on: - push: - branches: [ "next" ] - paths: - - .github/workflows/coolify-testing-host.yml - - docker/testing-host/Dockerfile - -env: - GITHUB_REGISTRY: ghcr.io - DOCKER_REGISTRY: docker.io - IMAGE_NAME: "coollabsio/coolify-testing-host" - -jobs: - amd64: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - steps: - - uses: actions/checkout@v4 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Build and Push Image - uses: docker/build-push-action@v6 - with: - context: . - file: docker/testing-host/Dockerfile - platforms: linux/amd64 - push: true - tags: | - ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest - ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest - labels: | - coolify.managed=true - - aarch64: - runs-on: [ self-hosted, arm64 ] - permissions: - contents: read - packages: write - steps: - - uses: actions/checkout@v4 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Build and Push Image - uses: docker/build-push-action@v6 - with: - context: . - file: docker/testing-host/Dockerfile - platforms: linux/aarch64 - push: true - tags: | - ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest-aarch64 - ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest-aarch64 - labels: | - coolify.managed=true - - merge-manifest: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - needs: [ amd64, aarch64 ] - steps: - - uses: actions/checkout@v4 - - - uses: docker/setup-buildx-action@v3 - - - name: Login to ${{ env.GITHUB_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.GITHUB_REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to ${{ env.DOCKER_REGISTRY }} - uses: docker/login-action@v3 - with: - registry: ${{ env.DOCKER_REGISTRY }} - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Create & publish manifest on ${{ env.GITHUB_REGISTRY }} - run: | - docker buildx imagetools create \ - --append ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest-aarch64 \ - --tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest - - - name: Create & publish manifest on ${{ env.DOCKER_REGISTRY }} - run: | - docker buildx imagetools create \ - --append ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest-aarch64 \ - --tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest - - - uses: sarisia/actions-status-discord@v1 - if: always() - with: - webhook: ${{ secrets.DISCORD_WEBHOOK_DEV_RELEASE_CHANNEL }} diff --git a/.github/workflows/generate-changelog.yml b/.github/workflows/generate-changelog.yml deleted file mode 100644 index ee5af6b3d2..0000000000 --- a/.github/workflows/generate-changelog.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Generate Changelog - -on: - push: - branches: [ main ] - workflow_dispatch: - -permissions: - contents: write - -jobs: - changelog: - name: Generate changelog - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Generate changelog - uses: orhun/git-cliff-action@v4 - with: - config: cliff.toml - args: --verbose - env: - OUTPUT: CHANGELOG.md - GITHUB_REPO: ${{ github.repository }} - - - name: Commit - run: | - git config user.name 'github-actions[bot]' - git config user.email 'github-actions[bot]@users.noreply.github.com' - git add CHANGELOG.md - git commit -m "docs: update changelog" - git push https://${{ secrets.GITHUB_TOKEN }}@github.com/${GITHUB_REPOSITORY}.git main diff --git a/.gitignore b/.gitignore index 541c8e9203..5ac0f2a9cf 100644 --- a/.gitignore +++ b/.gitignore @@ -4,36 +4,21 @@ /public/hot /public/storage /storage/*.key +/storage/pail /vendor .env .env.backup -.env.secrets +.env.production +.phpactor.json .phpunit.result.cache Homestead.json Homestead.yaml -auth.json npm-debug.log yarn-error.log +/auth.json /.fleet /.idea +/.nova /.vscode -/.npm -/.bash_history -/_data -_testing_hosts/ -_volumes/ -.lesshst -psysh_history -.psql_history -_ide_helper.php -.gitignore -.phpstorm.meta.php -_ide_helper_models.php -.rnd -/.ssh -scripts/load-test/* -.ignition.json -.env.dusk.local -docker/coolify-realtime/node_modules +/.zed .DS_Store -Changelog.md diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index fa6a282642..0000000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,6844 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -## [unreleased] - -### 🚀 Features - -- *(billing)* Add Stripe past due subscription status tracking -- *(ui)* Add past due subscription warning banner - -### 🐛 Bug Fixes - -- *(billing)* Restrict Stripe subscription status update to 'active' only - -### 💼 Other - -- Bump Coolify to 4.0.0-beta.398 - -### 🚜 Refactor - -- *(billing)* Enhance Stripe subscription status handling and notifications - -## [4.0.0-beta.397] - 2025-02-28 - -### 🐛 Bug Fixes - -- *(billing)* Handle 'past_due' subscription status in Stripe processing -- *(revert)* Label parsing -- *(helpers)* Initialize command variable in parseCommandFromMagicEnvVariable - -### 📚 Documentation - -- Update changelog - -## [4.0.0-beta.396] - 2025-02-28 - -### 🚀 Features - -- *(ui)* Add wire:key to two-step confirmation settings -- *(database)* Add index to scheduled task executions for improved query performance -- *(database)* Add index to scheduled database backup executions - -### 🐛 Bug Fixes - -- *(core)* Production dockerfile -- *(ui)* Update storage configuration guidance link -- *(ui)* Set default SMTP encryption to starttls -- *(notifications)* Correct environment URL path in application notifications -- *(config)* Update default PostgreSQL host to coolify-db instead of postgres -- *(docker)* Improve Docker compose file validation process -- *(ui)* Restrict service retrieval to current team -- *(core)* Only validate custom compose files -- *(mail)* Set default mailer to array when not specified -- *(ui)* Correct redirect routes after task deletion -- *(core)* Adding a new server should not try to make the default docker network -- *(core)* Clean up unnecessary files during application image build -- *(core)* Improve label generation and merging for applications and services - -### 💼 Other - -- Bump all dependencies (#5216) - -### 🚜 Refactor - -- *(ui)* Simplify file storage modal confirmations -- *(notifications)* Improve transactional email settings handling -- *(scheduled-tasks)* Improve scheduled task creation and management - -### 📚 Documentation - -- Update changelog -- Update changelog - -### ⚙️ Miscellaneous Tasks - -- Bump helper and realtime version - -## [4.0.0-beta.395] - 2025-02-22 - -### 📚 Documentation - -- Update changelog - -## [4.0.0-beta.394] - 2025-02-17 - -### 📚 Documentation - -- Update changelog - -## [4.0.0-beta.393] - 2025-02-15 - -### 📚 Documentation - -- Update changelog - -## [4.0.0-beta.392] - 2025-02-13 - -### 🚀 Features - -- *(ui)* Add top padding to pricing plans view -- *(core)* Add error logging and cron parsing to docker/server schedules -- *(core)* Prevent using servers with existing resources as build servers -- *(ui)* Add textarea switching option in service compose editor - -### 🐛 Bug Fixes - -- Pull latest image from registry when using build server -- *(deployment)* Improve server selection for deployment cancellation -- *(deployment)* Improve log line rendering and formatting -- *(s3-storage)* Optimize team admin notification query -- *(core)* Improve connection testing with dynamic disk configuration for s3 backups -- *(core)* Update service status refresh event handling -- *(ui)* Adjust polling intervals for database and service status checks -- *(service)* Update Fider service template healthcheck command -- *(core)* Improve server selection error handling in Docker component -- *(core)* Add server functionality check before dispatching container status -- *(ui)* Disable sticky scroll in Monaco editor -- *(ui)* Add literal and multiline env support to services. -- *(services)* Owncloud docs link -- *(template)* Remove db-migration step from `infisical.yaml` (#5209) -- *(service)* Penpot (#5047) - -### 🚜 Refactor - -- Use pull flag on docker compose up - -### 📚 Documentation - -- Update changelog -- Update changelog - -### ⚙️ Miscellaneous Tasks - -- Rollback Coolify version to 4.0.0-beta.392 -- Bump Coolify version to 4.0.0-beta.393 -- Bump Coolify version to 4.0.0-beta.394 -- Bump Coolify version to 4.0.0-beta.395 -- Bump Coolify version to 4.0.0-beta.396 -- *(services)* Update zipline to use new Database env var. (#5210) -- *(service)* Upgrade authentik service -- *(service)* Remove unused env from zipline - -## [4.0.0-beta.391] - 2025-02-04 - -### 🚀 Features - -- Add application api route -- Container logs -- Remove ansi color from log -- Add lines query parameter -- *(changelog)* Add git cliff for automatic changelog generation -- *(workflows)* Improve changelog generation and workflows -- *(ui)* Add periodic status checking for services -- *(deployment)* Ensure private key is stored in filesystem before deployment -- *(slack)* Show message title in notification previews (#5063) -- *(i18n)* Add Arabic translations (#4991) -- *(i18n)* Add French translations (#4992) -- *(services)* Update `service-templates.json` - -### 🐛 Bug Fixes - -- *(core)* Improve deployment failure Slack notification formatting -- *(core)* Update Slack notification formatting to use bold correctly -- *(core)* Enhance Slack deployment success notification formatting -- *(ui)* Simplify service templates loading logic -- *(ui)* Align title and add button vertically in various views -- Handle pullrequest:updated for reliable preview deployments -- *(ui)* Fix typo on team page (#5105) -- Cal.com documentation link give 404 (#5070) -- *(slack)* Notification settings URL in `HighDiskUsage` message (#5071) -- *(ui)* Correct typo in Storage delete dialog (#5061) -- *(lang)* Add missing italian translations (#5057) -- *(service)* Improve duplicati.yaml (#4971) -- *(service)* Links in homepage service (#5002) -- *(service)* Added SMTP credentials to getoutline yaml template file (#5011) -- *(service)* Added `KEY` Variable to Beszel Template (#5021) -- *(cloudflare-tunnels)* Dead links to docs (#5104) -- System-wide GitHub apps (#5114) - -### 🚜 Refactor - -- Simplify service start and restart workflows - -### 📚 Documentation - -- *(services)* Reword nitropage url and slogan -- *(readme)* Add Convex to special sponsors section -- Update changelog - -### ⚙️ Miscellaneous Tasks - -- *(config)* Increase default PHP memory limit to 256M -- Add openapi response -- *(workflows)* Make naming more clear and remove unused code -- Bump Coolify version to 4.0.0-beta.392/393 -- *(ci)* Update changelog generation workflow to target 'next' branch -- *(ci)* Update changelog generation workflow to target main branch - -## [4.0.0-beta.390] - 2025-01-28 - -### 🚀 Features - -- *(template)* Add Open Web UI -- *(templates)* Add Open Web UI service template -- *(ui)* Update GitHub source creation advanced section label -- *(core)* Add dynamic label reset for application settings -- *(ui)* Conditionally enable advanced application settings based on label readonly status -- *(env)* Added COOLIFY_RESOURCE_UUID environment variable -- *(vite)* Add Cloudflare async script and style tag attributes -- *(meta)* Add comprehensive SEO and social media meta tags -- *(core)* Add name to default proxy configuration - -### 🐛 Bug Fixes - -- *(ui)* Update database control UI to check server functionality before displaying actions -- *(ui)* Typo in upgrade message -- *(ui)* Cloudflare tunnel configuration should be an info, not a warning -- *(s3)* DigitalOcean storage buckets do not work -- *(ui)* Correct typo in container label helper text -- Disable certain parts if readonly label is turned off -- Cleanup old scheduled_task_executions -- Validate cron expression in Scheduled Task update -- *(core)* Check cron expression on save -- *(database)* Detect more postgres database image types -- *(templates)* Update service templates -- Remove quotes in COOLIFY_CONTAINER_NAME -- *(templates)* Update Trigger.dev service templates with v3 configuration -- *(database)* Adjust MongoDB restore command and import view styling -- *(core)* Improve public repository URL parsing for branch and base directory -- *(core)* Increase HTTP/2 max concurrent streams to 250 (default) -- *(ui)* Update docker compose file helper text to clarify repository modification -- *(ui)* Skip SERVICE_FQDN and SERVICE_URL variables during update -- *(core)* Stopping database is not disabling db proxy -- *(core)* Remove --remove-orphans flag from proxy startup command to prevent other proxy deletions (db) -- *(api)* Domain check when updating domain -- *(ui)* Always redirect to dashboard after team switch -- *(backup)* Escape special characters in database backup commands - -### 💼 Other - -- Trigger.dev templates - wrong key length issue -- Trigger.dev template - missing ports and wrong env usage -- Trigger.dev template - fixed otel config -- Trigger.dev template - fixed otel config -- Trigger.dev template - fixed port config - -### 🚜 Refactor - -- *(s3)* Improve S3 bucket endpoint formatting -- *(vite)* Improve environment variable handling in Vite configuration -- *(ui)* Simplify GitHub App registration UI and layout - -### ⚙️ Miscellaneous Tasks - -- *(version)* Bump Coolify version to 4.0.0-beta.391 - -### ◀️ Revert - -- Remove Cloudflare async tag attributes - -## [4.0.0-beta.389] - 2025-01-23 - -### 🚀 Features - -- *(docs)* Update tech stack -- *(terminal)* Show terminal unavailable if the container does not have a shell on the global terminal UI -- *(ui)* Improve deployment UI - -### 🐛 Bug Fixes - -- *(service)* Infinite loading and lag with invoiceninja service (#4876) -- *(service)* Invoiceninja service -- *(workflows)* `Waiting for changes` label should also be considered and improved messages -- *(workflows)* Remove tags only if the PR has been merged into the main branch -- *(terminal)* Terminal shows that it is not available, even though it is -- *(labels)* Docker labels do not generated correctly -- *(helper)* Downgrade Nixpacks to v1.29.0 -- *(labels)* Generate labels when they are empty not when they are already generated -- *(storage)* Hetzner storage buckets not working - -### 📚 Documentation - -- Add TECH_STACK.md (#4883) - -### ⚙️ Miscellaneous Tasks - -- *(versions)* Update coolify versions to v4.0.0-beta.389 -- *(core)* EnvironmentVariable Model now extends BaseModel to remove duplicated code -- *(versions)* Update coolify versions to v4.0.0-beta.3909 - -## [4.0.0-beta.388] - 2025-01-22 - -### 🚀 Features - -- *(core)* Add SOURCE_COMMIT variable to build environment in ApplicationDeploymentJob -- *(service)* Update affine.yaml with AI environment variables (#4918) -- *(service)* Add new service Flipt (#4875) - -### 🐛 Bug Fixes - -- *(core)* Update environment variable generation logic in ApplicationDeploymentJob to handle different build packs -- *(env)* Shared variables can not be updated -- *(ui)* Metrics stuck in loading state -- *(ui)* Use `wire:navigate` to navigate to the server settings page -- *(service)* Plunk API & health check endpoint (#4925) - -## [4.0.0-beta.386] - 2025-01-22 - -### 🐛 Bug Fixes - -- *(redis)* Update environment variable keys from standalone_redis_id to resourceable_id -- *(routes)* Local API docs not available on domain or IP -- *(routes)* Local API docs not available on domain or IP -- *(core)* Update application_id references to resourable_id and resourable_type for Nixpacks configuration -- *(core)* Correct spelling of 'resourable' to 'resourceable' in Nixpacks configuration for ApplicationDeploymentJob -- *(ui)* Traefik dashboard url not working -- *(ui)* Proxy status badge flashing during navigation - -### 🚜 Refactor - -- *(workflows)* Replace jq with PHP script for version retrieval in workflows - -### ⚙️ Miscellaneous Tasks - -- *(dep)* Bump helper version to 1.0.5 -- *(docker)* Add blank line for readability in Dockerfile -- *(versions)* Update coolify versions to v4.0.0-beta.388 -- *(versions)* Update coolify versions to v4.0.0-beta.389 and add helper version retrieval script - -## [4.0.0-beta.385] - 2025-01-21 - -### 🚀 Features - -- *(core)* Wip version of coolify.json - -### 🐛 Bug Fixes - -- *(email)* Transactional email sending -- *(ui)* Add missing save button for new Docker Cleanup page -- *(ui)* Show preview deployment environment variables -- *(ui)* Show error on terminal if container has no shell (bash/sh) -- *(parser)* Resource URL should only be parsed if there is one -- *(core)* Compose parsing for apps - -### ⚙️ Miscellaneous Tasks - -- *(dep)* Bump nixpacks version -- *(dep)* Version++ - -## [4.0.0-beta.384] - 2025-01-21 - -### 🐛 Bug Fixes - -- *(ui)* Backups link should not redirected to general -- Envs with special chars during build -- *(db)* `finished_at` timestamps are not set for existing deployments -- Load service templates on cloud - -## [4.0.0-beta.383] - 2025-01-20 - -### 🐛 Bug Fixes - -- *(service)* Add healthcheck to Cloudflared service (#4859) -- Remove wire:navigate from import backups - -## [4.0.0-beta.382] - 2025-01-17 - -### 🚀 Features - -- Add log file check message in upgrade script for better troubleshooting -- Add root user details to install script - -### 🐛 Bug Fixes - -- Create the private key before the server in the prod seeder -- Update ProductionSeeder to check for private key instead of server's private key -- *(ui)* Missing underline for docs link in the Swarm section (#4860) -- *(service)* Change chatwoot service postgres image from `postgres:12` to `pgvector/pgvector:pg12` -- Docker image parser -- Add public key attribute to privatekey model -- Correct service update logic in Docker Compose parser -- Update CDN URL in install script to point to nightly version - -### 🚜 Refactor - -- Comment out RootUserSeeder call in ProductionSeeder for clarity -- Streamline ProductionSeeder by removing debug logs and unnecessary checks, while ensuring essential seeding operations remain intact -- Remove debug echo statements from Init command to clean up output and improve readability - -## [4.0.0-beta.381] - 2025-01-17 - -### 🚀 Features - -- Able to import full db backups for pg/mysql/mariadb -- Restore backup from server file -- Docker volume data cloning -- Move volume data cloning to a Job -- Volume cloning for ResourceOperations -- Remote server volume cloning -- Add horizon server details to queue -- Enhance horizon:manage command with worker restart check -- Add is_coolify_host to the server api responses -- DB migration for Backup retention -- UI for backup retention settings -- New global s3 and local backup deletion function -- Use new backup deletion functions -- Add calibre-web service -- Add actual-budget service -- Add rallly service -- Template for Gotenberg, a Docker-powered stateless API for PDF files -- Enhance import command options with additional guidance and improved checkbox label -- Purify for better sanitization -- Move docker cleanup to its own tab -- DB and Model for docker cleanup executions -- DockerCleanupExecutions relationship -- DockerCleanupDone event -- Get command and output for logs from CleanupDocker -- New sidebar menu and order -- Docker cleanup executions UI -- Add execution log to dockerCleanupJob -- Improve deployment UI -- Root user envs and seeding -- Email, username and password validation when they are set via envs -- Improved error handling and log output -- Add root user configuration variables to production environment - -### 🐛 Bug Fixes - -- Compose envs -- Scheduled tasks and backups are executed by server timezone. -- Show backup timezone on the UI -- Disappearing UI after livewire event received -- Add default vector db for anythingllm -- We need XSRF-TOKEN for terminal -- Prevent default link behavior for resource and settings actions in dashboard -- Increase default php memory limit -- Show if only build servers are added to your team -- Update Livewire button click method to use camelCase -- Local dropzonejs -- Import backups due to js stuff should not be navigated -- Install inetutils on Arch Linux -- Use ip in place of hostname from inetutils in arch -- Update import command to append file redirection for database restoration -- Ui bug on pw confirmation -- Exclude system and computed fields from model replication -- Service cloning on a separate server -- Application cloning -- `Undefined variable $fs_path` for databases -- Service and database cloning and label generation -- Labels and URL generation when cloning -- Clone naming for different database data volumes -- Implement all the cloneMe changes for ResourceOperations as well -- Volume and fileStorages cloning -- View text and helpers -- Teable -- Trigger with external db -- Set `EXPERIMENTAL_FEATURES` to false for labelstudio -- Monaco editor disabled state -- Edge case where executions could be null -- Create destination properly -- Getcontainer status should timeout after 30s -- Enable response for temporary unavailability in sentinel push endpoint -- Use timeout in cleanup resources -- Add timeout to sentinel process checks for improved reliability -- Horizon job checker -- Update response message for sentinel push route -- Add own servers on cloud -- Application deployment -- Service update statsu -- If $SERVICE found in the service specific configuration, then search for it in the db -- Instance wide GitHub apps are not available on other teams then the source team -- Function calls -- UI -- Deletion of single backup -- Backup job deletion - delete all backups from s3 and local -- Use new removeOldBackups function -- Retention functions and folder deletion for local backups -- Storage retention setting -- Db without s3 should still backup -- Wording -- `Undefined variable $service` when creating a new service -- Nodebb service -- Calibre-web service -- Rallly and actualbudget service -- Removed container_name -- Added healthcheck for gotenberg template -- Gotenberg -- *(template)* Gotenberg healthcheck, use /health instead of /version -- Use wire:navigate on sidebar -- Use wire:navigate on dashboard -- Use wire:navigate on projects page -- More wire:navigate -- Even more wire:navigate -- Service navigation -- Logs icons everywhere + terminal -- Redis DB should use the new resourceable columns -- Joomla service -- Add back letters to prod password requirement -- Check System and GitHub time and throw and error if it is over 50s out of sync -- Error message and server time getting -- Error rendering -- Render html correctly now -- Indent -- Potential fix for permissions update -- Expiration time claim ('exp') must be a numeric value -- Sanitize html error messages -- Production password rule and cleanup code -- Use json as it is just better than string for huge amount of logs -- Use `wire:navigate` on server sidebar -- Use finished_at for the end time instead of created_at -- Cancelled deployments should not show end and duration time -- Redirect to server index instead of show on error in Advanced and DockerCleanup components -- Disable registration after creating the root user -- RootUserSeeder -- Regex username validation -- Add spacing around echo outputs -- Success message -- Silent return if envs are empty or not set. - -### 💼 Other - -- Arrrrr -- Dep -- Docker dep - -### 🚜 Refactor - -- Rename parameter in DatabaseBackupJob for clarity -- Improve checkbox component accessibility and styling -- Remove unused tags method from ApplicationDeploymentJob -- Improve deployment status check in isAnyDeploymentInprogress function -- Extend HorizonServiceProvider from HorizonApplicationServiceProvider -- Streamline job status retrieval and clean up repository interface -- Enhance ApplicationDeploymentJob and HorizonServiceProvider for improved job handling -- Remove commented-out unsubscribe route from API -- Update redirect calls to use a consistent navigation method in deployment functions -- AppServiceProvider -- Github.php -- Improve data formatting and UI - -### ⚙️ Miscellaneous Tasks - -- Improve Penpot healthchecks -- Switch up readonly lables to make more sense -- Remove unused computed fields -- Use the new job dispatch -- Disable volume data cloning for now -- Improve code -- Lowcoder service naming -- Use new functions -- Improve error styling -- Css -- More css as it still looks like shit -- Final css touches -- Ajust time to 50s (tests done) -- Remove debug log, finally found it -- Remove more logging -- Remove limit on commit message -- Remove dayjs -- Remove unused code and fix import - -## [4.0.0-beta.380] - 2024-12-27 - -### 🚀 Features - -- New ServerReachabilityChanged event -- Use new ServerReachabilityChanged event instead of isDirty -- Add infomaniak oauth -- Add server disk usage check frequency -- Add environment_uuid support and update API documentation -- Add service/resource/project labels -- Add coolify.environment label -- Add database subtype -- Migrate to new encryption options -- New encryption options - -### 🐛 Bug Fixes - -- Render html on error page correctly -- Invalid API response on missing project -- Applications API response code + schema -- Applications API writing to unavailable models -- If an init script is renamed the old version is still on the server -- Oauthseeder -- Compose loading seq -- Resource clone name + volume name generation -- Update Dockerfile entrypoint path to /etc/entrypoint.d -- Debug mode -- Unreachable notifications -- Remove duplicated ServerCheckJob call -- Few fixes and use new ServerReachabilityChanged event -- Use serverStatus not just status -- Oauth seeder -- Service ui structure -- Check port 8080 and fallback to 80 -- Refactor database view -- Always use docker cleanup frequency -- Advanced server UI -- Html css -- Fix domain being override when update application -- Use nixpacks predefined build variables, but still could update the default values from Coolify -- Use local monaco-editor instead of Cloudflare -- N8n timezone -- Smtp encryption -- Bind() to 0.0.0.0:80 failed -- Oauth seeder -- Unreachable notifications -- Instance settings migration -- Only encrypt instance email settings if there are any -- Error message -- Update healthcheck and port configurations to use port 8080 - -### 🚜 Refactor - -- Rename `coolify.environment` to `coolify.environmentName` - -### ⚙️ Miscellaneous Tasks - -- Regenerate API spec, removing notification fields -- Remove ray debugging -- Version ++ - -## [4.0.0-beta.378] - 2024-12-13 - -### 🐛 Bug Fixes - -- Monaco editor light and dark mode switching -- Service status indicator + oauth saving -- Socialite for azure and authentik -- Saving oauth -- Fallback for copy button -- Copy the right text -- Maybe fallback is now working -- Only show copy button on secure context - -## [4.0.0-beta.377] - 2024-12-13 - -### 🚀 Features - -- Add deploy-only token permission -- Able to deploy without cache on every commit -- Update private key nam with new slug as well -- Allow disabling default redirect, set status to 503 -- Add TLS configuration for default redirect in Server model -- Slack notifications -- Introduce root permission -- Able to download schedule task logs -- Migrate old email notification settings from the teams table -- Migrate old discord notification settings from the teams table -- Migrate old telegram notification settings from the teams table -- Add slack notifications to a new table -- Enable success messages again -- Use new notification stuff inside team model -- Some more notification settings and better defaults -- New email notification settings -- New shared function name `is_transactional_emails_enabled()` -- New shared notifications functions -- Email Notification Settings Model -- Telegram notification settings Model -- Discord notification settings Model -- Slack notification settings Model -- New Discord notification UI -- New Slack notification UI -- New telegram UI -- Use new notification event names -- Always sent notifications -- Scheduled task success notification -- Notification trait -- Get discord Webhook form new table -- Get Slack Webhook form new table -- Use new table or instance settings for email -- Use new place for settings and topic IDs for telegram -- Encrypt instance email settings -- Use encryption in instance settings model -- Scheduled task success and failure notifications -- Add docker cleanup success and failure notification settings columns -- UI for docker cleanup success and failure notification -- Docker cleanup email views -- Docker cleanup success and failure notification files -- Scheduled task success email -- Send new docker cleanup notifications -- :passport_control: integrate Authentik authentication with Coolify -- *(notification)* Add Pushover -- Add seeder command and configuration for database seeding -- Add new password magic env with symbols -- Add documenso service - -### 🐛 Bug Fixes - -- Resolve undefined searchInput reference in Alpine.js component -- URL and sync new app name -- Typos and naming -- Client and webhook secret disappear after sync -- Missing `mysql_password` API property -- Incorrect MongoDB init API property -- Old git versions does not have --cone implemented properly -- Don't allow editing traefik config -- Restart proxy -- Dev mode -- Ui -- Display actual values for disk space checks in installer script -- Proxy change behaviour -- Add warning color -- Import NotificationSlack correctly -- Add middleware to new abilities, better ux for selecting permissions, etc. -- Root + read:sensive could read senstive data with a middlewarew -- Always have download logs button on scheduled tasks -- Missing css -- Development image -- Dockerignore -- DB migration error -- Drop all unused smtp columns -- Backward compatibility -- Email notification channel enabled function -- Instance email settins -- Make sure resend is false if SMTP is true and vice versa -- Email Notification saving -- Slack and discord url now uses text filed because encryption makes the url very long -- Notification trait -- Encryption fixes -- Docker cleanup email template -- Add missing deployment notifications to telegram -- New docker cleanup settings are now saved to the DB correctly -- Ui + migrations -- Docker cleanup email notifications -- General notifications does not go through email channel -- Test notifications to only send it to the right channel -- Remove resale_license from db as well -- Nexus service -- Fileflows volume names -- --cone -- Provider error -- Database migration -- Seeder -- Migration call -- Slack helper -- Telegram helper -- Discord helper -- Telegram topic IDs -- Make pushover settings more clear -- Typo in pushover user key -- Use Livewire refresh method and lock properties -- Create pushover settings for existing teams -- Update token permission check from 'write' to 'root' -- Pushover -- Oauth seeder -- Correct heading display for OAuth settings in settings-oauth.blade.php -- Adjust spacing in login form for improved layout -- Services env values should be sensitive -- Documenso -- Dolibarr -- Typo -- Update OauthSettingSeeder to handle new provider definitions and ensure authentik is recreated if missing -- Improve OauthSettingSeeder to correctly delete non-existent providers and ensure proper handling of provider definitions -- Encrypt resend API key in instance settings -- Resend api key is already a text column - -### 💼 Other - -- Test rename GitHub app -- Checkmate service and fix prowlar slogan (too long) - -### 🚜 Refactor - -- Update Traefik configuration for improved security and logging -- Improve proxy configuration and code consistency in Server model -- Rename name method to sanitizedName in BaseModel for clarity -- Improve migration command and enhance application model with global scope and status checks -- Unify notification icon -- Remove unused Azure and Authentik service configurations from services.php -- Change email column types in instance_settings migration from string to text -- Change OauthSetting creation to updateOrCreate for better handling of existing records - -### ⚙️ Miscellaneous Tasks - -- Regenerate openapi spec -- Composer dep bump -- Dep bump -- Upgrade cloudflared and minio -- Remove comments and improve DB column naming -- Remove unused seeder -- Remove unused waitlist stuff -- Remove wired.php (not used anymore) -- Remove unused resale license job -- Remove commented out internal notification -- Remove more waitlist stuff -- Remove commented out notification -- Remove more waitlist stuff -- Remove unused code -- Fix typo -- Remove comment out code -- Some reordering -- Remove resale license reference -- Remove functions from shared.php -- Public settings for email notification -- Remove waitlist redirect -- Remove log -- Use new notification trait -- Remove unused route -- Remove unused email component -- Comment status changes as it is disabled for now -- Bump dep -- Reorder navbar -- Rename topicID to threadId like in the telegram API response -- Update PHP configuration to set memory limit using environment variable - -## [4.0.0-beta.376] - 2024-12-07 - -### 🐛 Bug Fixes - -- Api endpoint - -## [4.0.0-beta.374] - 2024-12-03 - -### 🐛 Bug Fixes - -- Application view loading -- Postiz service -- Only able to select the right keys -- Test email should not be required -- A few inputs - -### 🧪 Testing - -- Setup database for upcoming tests - -## [4.0.0-beta.372] - 2024-11-26 - -### 🚀 Features - -- Add MacOS template -- Add Windows template -- *(service)* :sparkles: add mealie -- Add hex magic env var - -### 🐛 Bug Fixes - -- Service generate includes yml files as well (haha) -- ServercheckJob should run every 5 minutes on cloud -- New resource icons -- Search should be more visible on scroll on new resource -- Logdrain settings -- Ui -- Email should be retried with backoff -- Alpine in body layout - -### 💼 Other - -- Caddy docker labels do not honor "strip prefix" option - -## [4.0.0-beta.371] - 2024-11-22 - -### 🐛 Bug Fixes - -- Improve helper text for metrics input fields -- Refine helper text for metrics input fields -- If mux conn fails, still use it without mux + save priv key with better logic -- Migration -- Always validate ssh key -- Make sure important jobs/actions are running on high prio queue -- Do not send internal notification for backups and status jobs -- Validateconnection -- View issue -- Heading -- Remove mux cleanup -- Db backup for services -- Version should come from constants + fix stripe webhook error reporting -- Undefined variable -- Remove version.php as everything is coming from constants.php -- Sentry error -- Websocket connections autoreconnect -- Sentry error -- Sentry -- Empty server API response -- Incorrect server API patch response -- Missing `uuid` parameter on server API patch -- Missing `settings` property on servers API -- Move servers API `delete_unused_*` properties -- Servers API returning `port` as a string -> integer -- Only return server uuid on server update - -## [4.0.0-beta.370] - 2024-11-15 - -### 🐛 Bug Fixes - -- Modal (+ add) on dynamic config was not opening, removed x-cloak -- AUTOUPDATE + checkbox opacity - -## [4.0.0-beta.369] - 2024-11-15 - -### 🐛 Bug Fixes - -- Modal-input - -## [4.0.0-beta.368] - 2024-11-15 - -### 🚀 Features - -- Check local horizon scheduler deployments -- Add internal api docs to /docs/api with auth -- Add proxy type change to create/update apis - -### 🐛 Bug Fixes - -- Show proper error message on invalid Git source -- Convert HTTP to SSH source when using deploy key on GitHub -- Cloud + stripe related -- Terminal view loading in async -- Cool 500 error (thanks hugodos) -- Update schema in code decorator -- Openapi docs -- Add tests for git url converts -- Minio / logto url generation -- Admin view -- Min docker version 26 -- Pull latest service-templates.json on init -- Workflow files for coolify build -- Autocompletes -- Timezone settings validation -- Invalid tz should not prevent other jobs to be executed -- Testing-host should be built locally -- Poll with modal issue -- Terminal opening issue -- If service img not found, use github as a source -- Fallback to local coolify.png -- Gather private ips -- Cf tunnel menu should be visible when server is not validated -- Deployment optimizations -- Init script + optimize laravel -- Default docker engine version + fix install script -- Pull helper image on init -- SPA static site default nginx conf - -### 💼 Other - -- Https://github.com/coollabsio/coolify/issues/4186 -- Separate resources by type in projects view -- Improve s3 add view - -### ⚙️ Miscellaneous Tasks - -- Update dep - -## [4.0.0-beta.365] - 2024-11-11 - -### 🚀 Features - -- Custom nginx configuration for static deployments + fix 404 redirects in nginx conf - -### 🐛 Bug Fixes - -- Trigger.dev db host & sslmode=disable -- Manual update should be executed only once + better UX -- Upgrade.sh -- Missing privateKey - -## [4.0.0-beta.364] - 2024-11-08 - -### 🐛 Bug Fixes - -- Define separate volumes for mattermost service template -- Github app name is too long -- ServerTimezone update - -### ⚙️ Miscellaneous Tasks - -- Edit www helper - -## [4.0.0-beta.363] - 2024-11-08 - -### 🚀 Features - -- Add Firefox template -- Add template for Wiki.js -- Add upgrade logs to /data/coolify/source - -### 🐛 Bug Fixes - -- Saving resend api key -- Wildcard domain save -- Disable cloudflare tunnel on "localhost" - -## [4.0.0-beta.362] - 2024-11-08 - -### 🐛 Bug Fixes - -- Notifications ui -- Disable wire:navigate -- Confirmation Settings css for light mode -- Server wildcard - -## [4.0.0-beta.361] - 2024-11-08 - -### 🚀 Features - -- Add Transmission template -- Add transmission healhcheck -- Add zipline template -- Dify template -- Required envs -- Add EdgeDB -- Show warning if people would like to use sslip with https -- Add is shared to env variables -- Variabel sync and support shared vars -- Add notification settings to server_disk_usage -- Add coder service tamplate and logo -- Debug mode for sentinel -- Add jitsi template -- Add --gpu support for custom docker command - -### 🐛 Bug Fixes - -- Make sure caddy is not removed by cleanup -- Libretranslate -- Do not allow to change number of lines when streaming logs -- Plunk -- No manual timezones -- Helper push -- Format -- Add port metadata and Coolify magic to generate the domain -- Sentinel -- Metrics -- Generate sentinel url -- Only enable Sentinel for new servers -- Is_static through API -- Allow setting standalone redis variables via ENVs (team variables...) -- Check for username separately form password -- Encrypt all existing redis passwords -- Pull helper image on helper_version change -- Redis database user and password -- Able to update ipv4 / ipv6 instance settings -- Metrics for dbs -- Sentinel start fixed -- Validate sentinel custom URL when enabling sentinel -- Should be able to reset labels in read-only mode with manual click -- No sentinel for swarm yet -- Charts ui -- Volume -- Sentinel config changes restarts sentinel -- Disable sentinel for now -- Disable Sentinel temporarily -- Disable Sentinel temporarily for non-dev environments -- Access team's github apps only -- Admins should now invite owner -- Add experimental flag -- GenerateSentinelUrl method -- NumberOfLines could be null -- Login / register view -- Restart sentinel once a day -- Changing private key manually won't trigger a notification -- Grammar for helper -- Fix my own grammar -- Add telescope only in dev mode -- New way to update container statuses -- Only run server storage every 10 mins if sentinel is not active -- Cloud admin view -- Queries in kernel.php -- Lower case emails only -- Change emails to lowercase on init -- Do not error on update email -- Always authenticate with lowercase emails -- Dashboard refactor -- Add min/max length to input/texarea -- Remove livewire legacy from help view -- Remove unnecessary endpoints (magic) -- Transactional email livewire -- Destinations livewire refactor -- Refactor destination/docker view -- Logdrains validation -- Reworded -- Use Auth(), add new db proxy stop event refactor clickhouse view -- Add user/pw to db view -- Sort servers by name -- Keydb view -- Refactor tags view / remove obsolete one -- Send discord/telegram notifications on high job queue -- Server view refresh on validation -- ShowBoarding -- Show docker installation logs & ubuntu 24.10 notification -- Do not overlap servercheckjob -- Server limit check -- Server validation -- Clear route / view -- Only skip docker installation on 24.10 if its not installed -- For --gpus device support -- Db/service start should be on high queue -- Do not stop sentinel on Coolify restart -- Run resourceCheck after new serviceCheckJob -- Mongodb in dev -- Better invitation errors -- Loading indicator for db proxies -- Do not execute gh workflow on template changes -- Only use sentry in cloud -- Update packagejson of coolify-realtime + add lock file -- Update last online with old function -- Seeder should not start sentinel -- Start sentinel on seeder - -### 💼 Other - -- Add peppermint -- Loggy -- Add UI for redis password and username -- Wireguard-easy template - -### 📚 Documentation - -- Update link to deploy api docs - -### ⚙️ Miscellaneous Tasks - -- Add transmission template desc -- Update transmission docs link -- Update version numbers to 4.0.0-beta.360 in configuration files -- Update AWS environment variable names in unsend.yaml -- Update AWS environment variable names in unsend.yaml -- Update livewire/livewire dependency to version 3.4.9 -- Update version to 4.0.0-beta.361 -- Update Docker build and push actions to v6 -- Update Docker build and push actions to v6 -- Update Docker build and push actions to v6 -- Sync coolify-helper to dockerhub as well -- Push realtime to dockerhub -- Sync coolify-realtime to dockerhub -- Rename workflows -- Rename development to staging build -- Sync coolify-testing-host to dockerhbu -- Sync coolify prod image to dockerhub as well -- Update Docker version to 26.0 -- Update project resource index page -- Update project service configuration view - -## [4.0.0-beta.360] - 2024-10-11 - -### ⚙️ Miscellaneous Tasks - -- Update livewire/livewire dependency to version 3.4.9 - -## [4.0.0-beta.359] - 2024-10-11 - -### 🐛 Bug Fixes - -- Use correct env variable for invoice ninja password - -### ⚙️ Miscellaneous Tasks - -- Update laravel/horizon dependency to version 5.29.1 -- Update service extra fields to use dynamic keys - -## [4.0.0-beta.358] - 2024-10-10 - -### 🚀 Features - -- Add customHelper to stack-form -- Add cloudbeaver template -- Add ntfy template -- Add qbittorrent template -- Add Homebox template -- Add owncloud service and logo -- Add immich service -- Auto generate url -- Refactored to work with coolify auto env vars -- Affine service template and logo -- Add LibreTranslate template -- Open version in a new tab - -### 🐛 Bug Fixes - -- Signup -- Application domains should be http and https only -- Validate and sanitize application domains -- Sanitize and validate application domains - -### 💼 Other - -- Other DB options for freshrss -- Nextcloud MariaDB and MySQL versions - -### ⚙️ Miscellaneous Tasks - -- Fix form submission and keydown event handling in modal-confirmation.blade.php -- Update version numbers to 4.0.0-beta.359 in configuration files -- Disable adding default environment variables in shared.php - -## [4.0.0-beta.357] - 2024-10-08 - -### 🚀 Features - -- Add Mautic 4 and 5 to service templates -- Add keycloak template -- Add onedev template -- Improve search functionality in project selection - -### 🐛 Bug Fixes - -- Update mattermost image tag and add default port -- Remove env, change timezone -- Postgres healthcheck -- Azimutt template - still not working haha -- New parser with SERVICE_URL_ envs -- Improve service template readability -- Update password variables in Service model -- Scheduled database server -- Select server view - -### 💼 Other - -- Keycloak - -### ⚙️ Miscellaneous Tasks - -- Add mattermost logo as svg -- Add mattermost svg to compose -- Update version to 4.0.0-beta.357 - -## [4.0.0-beta.356] - 2024-10-07 - -### 🚀 Features - -- Add Argilla service configuration to Service model -- Add Invoice Ninja service configuration to Service model -- Project search on frontend -- Add ollama service with open webui and logo -- Update setType method to use slug value for type -- Refactor setType method to use slug value for type -- Refactor setType method to use slug value for type -- Add Supertokens template -- Add easyappointments service template -- Add dozzle template -- Adds forgejo service with runners - -### 🐛 Bug Fixes - -- Reset description and subject fields after submitting feedback -- Tag mass redeployments -- Service env orders, application env orders -- Proxy conf in dev -- One-click services -- Use local service-templates in dev -- New services -- Remove not used extra host -- Chatwoot service -- Directus -- Database descriptions -- Update services -- Soketi -- Select server view - -### 💼 Other - -- Update helper version -- Outline -- Directus -- Supertokens -- Supertokens json -- Rabbitmq -- Easyappointments -- Soketi -- Dozzle -- Windmill -- Coolify.json - -### ⚙️ Miscellaneous Tasks - -- Update version to 4.0.0-beta.356 -- Remove commented code for shared variable type validation -- Update MariaDB image to version 11 and fix service environment variable orders -- Update anythingllm.yaml volumes configuration -- Update proxy configuration paths for Caddy and Nginx in dev -- Update password form submission in modal-confirmation component -- Update project query to order by name in uppercase -- Update project query to order by name in lowercase -- Update select.blade.php with improved search functionality -- Add Nitropage service template and logo -- Bump coolify-helper version to 1.0.2 -- Refactor loadServices2 method and remove unused code -- Update version to 4.0.0-beta.357 -- Update service names and volumes in windmill.yaml -- Update version to 4.0.0-beta.358 -- Ignore .ignition.json files in Docker and Git - -## [4.0.0-beta.355] - 2024-10-03 - -### 🐛 Bug Fixes - -- Scheduled backup for services view -- Parser, espacing container labels - -### ⚙️ Miscellaneous Tasks - -- Update homarr service template and remove unnecessary code -- Update version to 4.0.0-beta.355 - -## [4.0.0-beta.354] - 2024-10-03 - -### 🚀 Features - -- Add it-tools service template and logo -- Add homarr service tamplate and logo - -### 🐛 Bug Fixes - -- Parse proxy config and check the set ports usage -- Update FQDN - -### ⚙️ Miscellaneous Tasks - -- Update version to 4.0.0-beta.354 -- Remove debug statement in Service model -- Remove commented code in Server model -- Fix application deployment queue filter logic -- Refactor modal-confirmation component -- Update it-tools service template and port configuration -- Update homarr service template and remove unnecessary code - -## [4.0.0-beta.353] - 2024-10-03 - -### ⚙️ Miscellaneous Tasks - -- Update version to 4.0.0-beta.353 -- Update service application view - -## [4.0.0-beta.352] - 2024-10-03 - -### 🐛 Bug Fixes - -- Service application view -- Add new supported database images - -### ⚙️ Miscellaneous Tasks - -- Update version to 4.0.0-beta.352 -- Refactor DatabaseBackupJob to handle missing team - -## [4.0.0-beta.351] - 2024-10-03 - -### 🚀 Features - -- Add strapi template - -### 🐛 Bug Fixes - -- Able to support more database dynamically from Coolify's UI -- Strapi template -- Bitcoin core template -- Api useBuildServer - -## [4.0.0-beta.349] - 2024-10-01 - -### 🚀 Features - -- Add command to check application deployment queue -- Support Hetzner S3 -- Handle HTTPS domain in ConfigureCloudflareTunnels -- Backup all databases for mysql,mariadb,postgresql -- Restart service without pulling the latest image - -### 🐛 Bug Fixes - -- Remove autofocuses -- Ipv6 scp should use -6 flag -- Cleanup stucked applicationdeploymentqueue -- Realtime watch in development mode -- Able to select root permission easier - -### 💼 Other - -- Show backup button on supported db service stacks - -### 🚜 Refactor - -- Remove deployment queue when deleting an application -- Improve SSH command generation in Terminal.php and terminal-server.js -- Fix indentation in modal-confirmation.blade.php -- Improve parsing of commands for sudo in parseCommandsByLineForSudo -- Improve popup component styling and button behavior -- Encode delimiter in SshMultiplexingHelper -- Remove inactivity timer in terminal-server.js -- Improve socket reconnection interval in terminal.js -- Remove unnecessary watch command from soketi service entrypoint - -### ⚙️ Miscellaneous Tasks - -- Update version numbers to 4.0.0-beta.350 in configuration files -- Update command signature and description for cleanup application deployment queue -- Add missing import for Attribute class in ApplicationDeploymentQueue model -- Update modal input in server form to prevent closing on outside click -- Remove unnecessary command from SshMultiplexingHelper -- Remove commented out code for uploading to S3 in DatabaseBackupJob -- Update soketi service image to version 1.0.3 - -## [4.0.0-beta.348] - 2024-10-01 - -### 🚀 Features - -- Update resource deletion job to allow configurable options through API -- Add query parameters for deleting configurations, volumes, docker cleanup, and connected networks - -### 🐛 Bug Fixes - -- In dev mode do not ask confirmation on delete -- Mixpost -- Handle deletion of 'hello' in confirmation modal for dev environment - -### 💼 Other - -- Server storage check - -### 🚜 Refactor - -- Update search input placeholder in resource index view - -### ⚙️ Miscellaneous Tasks - -- Fix docs link in running state -- Update Coolify Realtime workflow to only trigger on the main branch -- Refactor instanceSettings() function to improve code readability -- Update Coolify Realtime image to version 1.0.2 -- Remove unnecessary code in DatabaseBackupJob.php -- Add "Not Usable" indicator for storage items -- Refactor instanceSettings() function and improve code readability -- Update version numbers to 4.0.0-beta.349 and 4.0.0-beta.350 - -## [4.0.0-beta.347] - 2024-09-28 - -### 🚀 Features - -- Allow specify use_build_server when creating/updating an application -- Add support for `use_build_server` in API endpoints for creating/updating applications -- Add Mixpost template - -### 🐛 Bug Fixes - -- Filebrowser template -- Edit is_build_server_enabled upon creating application on other application type -- Save settings after assigning value - -### 💼 Other - -- Remove memlock as it caused problems for some users - -### ⚙️ Miscellaneous Tasks - -- Update Mailpit logo to use SVG format - -## [4.0.0-beta.346] - 2024-09-27 - -### 🚀 Features - -- Add ContainerStatusTypes enum for managing container status - -### 🐛 Bug Fixes - -- Proxy fixes -- Proxy -- *(templates)* Filebrowser FQDN env variable -- Handle edge case when build variables and env variables are in different format -- Compose based terminal - -### 💼 Other - -- Manual cleanup button and unused volumes and network deletion -- Force helper image removal -- Use the new confirmation flow -- Typo -- Typo in install script -- If API is disabeled do not show API token creation stuff -- Disable API by default -- Add debug bar - -### 🚜 Refactor - -- Update environment variable name for uptime-kuma service -- Improve start proxy script to handle existing containers gracefully -- Update delete server confirmation modal buttons -- Remove unnecessary code - -### ⚙️ Miscellaneous Tasks - -- Add autocomplete attribute to input fields -- Refactor API Tokens component to use isApiEnabled flag -- Update versions.json file -- Remove unused .env.development.example file -- Update API Tokens view to include link to Settings menu -- Update web.php to cast server port as integer -- Update backup deletion labels to use language files -- Update database startup heading title -- Update database startup heading title -- Custom vite envs -- Update version numbers to 4.0.0-beta.348 -- Refactor code to improve SSH key handling and storage - -## [4.0.0-beta.343] - 2024-09-25 - -### 🐛 Bug Fixes - -- Parser -- Exited services statuses -- Make sure to reload window if app status changes -- Deploy key based deployments - -### 🚜 Refactor - -- Remove commented out code and improve environment variable handling in newParser function -- Improve label positioning in input and checkbox components -- Group and sort fields in StackForm by service name and password status -- Improve layout and add checkbox for task enablement in scheduled task form -- Update checkbox component to support full width option -- Update confirmation label in danger.blade.php template -- Fix typo in execute-container-command.blade.php -- Update OS_TYPE for Asahi Linux in install.sh script -- Add localhost as Server if it doesn't exist and not in cloud environment -- Add localhost as Server if it doesn't exist and not in cloud environment -- Update ProductionSeeder to fix issue with coolify_key assignment -- Improve modal confirmation titles and button labels -- Update install.sh script to remove redirection of upgrade output to /dev/null -- Fix modal input closeOutside prop in configuration.blade.php -- Add support for IPv6 addresses in sslip function - -### ⚙️ Miscellaneous Tasks - -- Update version numbers to 4.0.0-beta.343 -- Update version numbers to 4.0.0-beta.344 -- Update version numbers to 4.0.0-beta.345 -- Update version numbers to 4.0.0-beta.346 - -## [4.0.0-beta.342] - 2024-09-24 - -### 🚀 Features - -- Add nullable constraint to 'fingerprint' column in private_keys table -- *(api)* Add an endpoint to execute a command -- *(api)* Add endpoint to execute a command - -### 🐛 Bug Fixes - -- Proxy status -- Coolify-db should not be in the managed resources -- Store original root key in the original location -- Logto service -- Cloudflared service -- Migrations -- Cloudflare tunnel configuration, ui, etc - -### 💼 Other - -- Volumes on development environment -- Clean new volume name for dev volumes -- Persist DBs, services and so on stored in data/coolify -- Add SSH Key fingerprint to DB -- Add a fingerprint to every private key on save, create... -- Make sure invalid private keys can not be added -- Encrypt private SSH keys in the DB -- Add is_sftp and is_server_ssh_key coloums -- New ssh key file name on disk -- Store all keys on disk by default -- Populate SSH key folder -- Populate SSH keys in dev -- Use new function names and logic everywhere -- Create a Multiplexing Helper -- SSH multiplexing -- Remove unused code form multiplexing -- SSH Key cleanup job -- Private key with ID 2 on dev -- Move more functions to the PrivateKey Model -- Add ssh key fingerprint and generate one for existing keys -- ID issues on dev seeders -- Server ID 0 -- Make sure in use private keys are not deleted -- Do not delete SSH Key from disk during server validation error -- UI bug, do not write ssh key to disk in server dialog -- SSH Multiplexing for Jobs -- SSH algorhytm text -- Few multiplexing things -- Clear mux directory -- Multiplexing do not write file manually -- Integrate tow step process in the modal component WIP -- Ability to hide labels -- DB start, stop confirm -- Del init script -- General confirm -- Preview deployments and typos -- Service confirmation -- Confirm file storage -- Stop service confirm -- DB image cleanup -- Confirm ressource operation -- Environment variabel deletion -- Confirm scheduled tasks -- Confirm API token -- Confirm private key -- Confirm server deletion -- Confirm server settings -- Proxy stop and restart confirmation -- GH app deletion confirmation -- Redeploy all confirmation -- User deletion confirmation -- Team deletion confirmation -- Backup job confirmation -- Delete volume confirmation -- More conformations and fixes -- Delete unused private keys button -- Ray error because port is not uncommented -- #3322 deploy DB alterations before updating -- Css issue with advanced settings and remove cf tunnel in onboarding -- New cf tunnel install flow -- Made help text more clear -- Cloudflare tunnel -- Make helper text more clean to use a FQDN and not an URL - -### 🚜 Refactor - -- Update Docker cleanup label in Heading.php and Navbar.php -- Remove commented out code in Navbar.php -- Remove CleanupSshKeysJob from schedule in Kernel.php -- Update getAJoke function to exclude offensive jokes -- Update getAJoke function to use HTTPS for API request -- Update CleanupHelperContainersJob to use more efficient Docker command -- Update PrivateKey model to improve code readability and maintainability -- Remove unnecessary code in PrivateKey model -- Update PrivateKey model to use ownedByCurrentTeam() scope for cleanupUnusedKeys() -- Update install.sh script to check if coolify-db volume exists before generating SSH key -- Update ServerSeeder and PopulateSshKeysDirectorySeeder -- Improve attribute sanitization in Server model -- Update confirmation button text for deletion actions -- Remove unnecessary code in shared.php file -- Update environment variables for services in compose files -- Update select.blade.php to improve trademarks policy display -- Update select.blade.php to improve trademarks policy display -- Fix typo in subscription URLs -- Add Postiz service to compose file (disabled for now) -- Update shared.php to include predefined ports for services -- Simplify SSH key synchronization logic -- Remove unused code in DatabaseBackupStatusJob and PopulateSshKeysDirectorySeeder - -### ⚙️ Miscellaneous Tasks - -- Update version numbers to 4.0.0-beta.342 -- Update remove-labels-and-assignees-on-close.yml -- Add SSH key for localhost in ProductionSeeder -- Update SSH key generation in install.sh script -- Update ProductionSeeder to call OauthSettingSeeder and PopulateSshKeysDirectorySeeder -- Update install.sh to support Asahi Linux -- Update install.sh version to 1.6 -- Remove unused middleware and uniqueId method in DockerCleanupJob -- Refactor DockerCleanupJob to remove unused middleware and uniqueId method -- Remove unused migration file for populating SSH keys and clearing mux directory -- Add modified files to the commit -- Refactor pre-commit hook to improve performance and readability -- Update CONTRIBUTING.md with troubleshooting note about database migrations -- Refactor pre-commit hook to improve performance and readability -- Update cleanup command to use Redis instead of queue -- Update Docker commands to start proxy - -## [4.0.0-beta.341] - 2024-09-18 - -### 🚀 Features - -- Add buddy logo - -## [4.0.0-beta.336] - 2024-09-16 - -### 🚀 Features - -- Make coolify full width by default -- Fully functional terminal for command center -- Custom terminal host - -### 🐛 Bug Fixes - -- Keep-alive ws connections -- Add build.sh to debug logs -- Update Coolify installer -- Terminal -- Generate https for minio -- Install script -- Handle WebSocket connection close in terminal.blade.php -- Able to open terminal to any containers -- Refactor run-command -- If you exit a container manually, it should close the underlying tty as well -- Move terminal to separate view on services -- Only update helper image in DB -- Generated fqdn for SERVICE_FQDN_APP_3000 magic envs - -### 💼 Other - -- Remove labels and assignees on issue close -- Make sure this action is also triggered on PR issue close - -### 🚜 Refactor - -- Remove unnecessary code in ExecuteContainerCommand.php -- Improve Docker network connection command in StartService.php -- Terminal / run command -- Add authorization check in ExecuteContainerCommand mount method -- Remove unnecessary code in Terminal.php -- Remove unnecessary code in Terminal.blade.php -- Update WebSocket connection initialization in terminal.blade.php -- Remove unnecessary console.log statements in terminal.blade.php - -### ⚙️ Miscellaneous Tasks - -- Update release version to 4.0.0-beta.336 -- Update coolify environment variable assignment with double quotes -- Update shared.php to fix issues with source and network variables -- Update terminal styling for better readability -- Update button text for container connection form -- Update Dockerfile and workflow for Coolify Realtime (v4) -- Remove unused entrypoint script and update volume mapping -- Update .env file and docker-compose configuration -- Update APP_NAME environment variable in docker-compose.prod.yml -- Update WebSocket URL in terminal.blade.php -- Update Dockerfile and workflow for Coolify Realtime (v4) -- Update Dockerfile and workflow for Coolify Realtime (v4) -- Update Dockerfile and workflow for Coolify Realtime (v4) -- Rename Command Center to Terminal in code and views -- Update branch restriction for push event in coolify-helper.yml -- Update terminal button text and layout in application heading view -- Refactor terminal component and select form layout -- Update coolify nightly version to 4.0.0-beta.335 -- Update helper version to 1.0.1 -- Fix syntax error in versions.json -- Update version numbers to 4.0.0-beta.337 -- Update Coolify installer and scripts to include a function for fetching programming jokes -- Update docker network connection command in ApplicationDeploymentJob.php -- Add validation to prevent selecting 'default' server or container in RunCommand.php -- Update versions.json to reflect latest version of realtime container -- Update soketi image to version 1.0.1 -- Nightly - Update soketi image to version 1.0.1 and versions.json to reflect latest version of realtime container -- Update version numbers to 4.0.0-beta.339 -- Update version numbers to 4.0.0-beta.340 -- Update version numbers to 4.0.0-beta.341 - -### ◀️ Revert - -- Databasebackup - -## [4.0.0-beta.335] - 2024-09-12 - -### 🐛 Bug Fixes - -- Cloudflare tunnel with new multiplexing feature - -### 💼 Other - -- SSH Multiplexing on docker desktop on Windows - -### ⚙️ Miscellaneous Tasks - -- Update release version to 4.0.0-beta.335 -- Update constants.ssh.mux_enabled in remoteProcess.php -- Update listeners and proxy settings in server form and new server components -- Remove unnecessary null check for proxy_type in generate_default_proxy_configuration -- Remove unnecessary SSH command execution time logging - -## [4.0.0-beta.334] - 2024-09-12 - -### ⚙️ Miscellaneous Tasks - -- Remove itsgoingd/clockwork from require-dev in composer.json -- Update 'key' value of gitlab in Service.php to use environment variable - -## [4.0.0-beta.333] - 2024-09-11 - -### 🐛 Bug Fixes - -- Disable mux_enabled during server validation -- Move mc command to coolify image from helper -- Keydb. add `:` delimiter for connection string - -### 💼 Other - -- Remote servers with port and user -- Do not change localhost server name on revalidation -- Release.md file - -### 🚜 Refactor - -- Improve handling of environment variable merging in upgrade script - -### ⚙️ Miscellaneous Tasks - -- Update version numbers to 4.0.0-beta.333 -- Copy .env file to .env-{DATE} if it exists -- Update .env file with new values -- Update server check job middleware to use server ID instead of UUID -- Add reminder to backup .env file before running install script again -- Copy .env file to backup location during installation script -- Add reminder to backup .env file during installation script -- Update permissions in pr-build.yml and version numbers -- Add minio/mc command to Dockerfile - -## [4.0.0-beta.332] - 2024-09-10 - -### 🚀 Features - -- Expose project description in API response -- Add elixir finetunes to the deployment job - -### 🐛 Bug Fixes - -- Reenable overlapping servercheckjob -- Appwrite template + parser -- Don't add `networks` key if `network_mode` is used -- Remove debug statement in shared.php -- Scp through cloudflare -- Delete older versions of the helper image other than the latest one -- Update remoteProcess.php to handle null values in logItem properties - -### 💼 Other - -- Set a default server timezone -- Implement SSH Multiplexing -- Enabel mux -- Cleanup stale multiplexing connections - -### 🚜 Refactor - -- Improve environment variable handling in shared.php - -### ⚙️ Miscellaneous Tasks - -- Set timeout for ServerCheckJob to 60 seconds -- Update appwrite.yaml to include OpenSSL key variable assignment - -## [4.0.0-beta.330] - 2024-09-06 - -### 🐛 Bug Fixes - -- Parser -- Plunk NEXT_PUBLIC_API_URI - -### 💼 Other - -- Pull helper image if not available otherwise s3 backup upload fails - -### 🚜 Refactor - -- Improve handling of server timezones in scheduled backups and tasks -- Improve handling of server timezones in scheduled backups and tasks -- Improve handling of server timezones in scheduled backups and tasks -- Update cleanup schedule to run daily at midnight -- Skip returning volume if driver type is cifs or nfs - -### ⚙️ Miscellaneous Tasks - -- Update coolify-helper.yml to get version from versions.json -- Disable Ray by default -- Enable Ray by default and update Dockerfile with latest versions of PACK and NIXPACKS -- Update Ray configuration and Dockerfile -- Add middleware for updating environment variables by UUID in `api.php` routes -- Expose port 3000 in browserless.yaml template -- Update Ray configuration and Dockerfile -- Update coolify version to 4.0.0-beta.331 -- Update versions.json and sentry.php to 4.0.0-beta.332 -- Update version to 4.0.0-beta.332 -- Update DATABASE_URL in plunk.yaml to use plunk database -- Add coolify.managed=true label to Docker image builds -- Update docker image pruning command to exclude managed images -- Update docker cleanup schedule to run daily at midnight -- Update versions.json to version 1.0.1 -- Update coolify-helper.yml to include "next" branch in push trigger - -## [4.0.0-beta.326] - 2024-09-03 - -### 🚀 Features - -- Update server_settings table to force docker cleanup -- Update Docker Compose file with DB_URL environment variable -- Refactor shared.php to improve environment variable handling - -### 🐛 Bug Fixes - -- Wrong executions order -- Handle project not found error in environment_details API endpoint -- Deployment running for - without "ago" -- Update helper image pulling logic to only pull if the version is newer - -### 💼 Other - -- Plunk svg - -### 📚 Documentation - -- Update Plunk documentation link in compose/plunk.yaml - -### ⚙️ Miscellaneous Tasks - -- Update UI for displaying no executions found in scheduled task list -- Update UI for displaying deployment status in deployment list -- Update UI for displaying deployment status in deployment list -- Ignore unnecessary files in production build workflow -- Update server form layout and settings -- Update Dockerfile with latest versions of PACK and NIXPACKS - -## [4.0.0-beta.324] - 2024-09-02 - -### 🚀 Features - -- Preserve git repository with advanced file storages -- Added Windmill template -- Added Budibase template -- Add shm-size for custom docker commands -- Add custom docker container options to all databases -- Able to select different postgres database -- Add new logos for jobscollider and hostinger -- Order scheduled task executions -- Add Code Server environment variables to Service model -- Add coolify build env variables to building phase -- Add new logos for GlueOps, Ubicloud, Juxtdigital, Saasykit, and Massivegrid -- Add new logos for GlueOps, Ubicloud, Juxtdigital, Saasykit, and Massivegrid - -### 🐛 Bug Fixes - -- Timezone not updated when systemd is missing -- If volumes + file mounts are defined, should merge them together in the compose file -- All mongo v4 backups should use the different backup command -- Database custom environment variables -- Connect compose apps to the right predefined network -- Docker compose destination network -- Server status when there are multiple servers -- Sync fqdn change on the UI -- Pr build names in case custom name is used -- Application patch request instant_deploy -- Canceling deployment on build server -- Backup of password protected postgresql database -- Docker cleanup job -- Storages with preserved git repository -- Parser parser parser -- New parser only in dev -- Parser parser -- Numberoflines should be number -- Docker cleanup job -- Fix directory and file mount headings in file-storage.blade.php -- Preview fqdn generation -- Revert a few lines -- Service ui sync bug -- Setup script doesn't work on rhel based images with some curl variant already installed -- Let's wait for healthy container during installation and wait an extra 20 seconds (for migrations) -- Infra files -- Log drain only for Applications -- Copy large compose files through scp (not ssh) -- Check if array is associative or not -- Openapi endpoint urls -- Convert environment variables to one format in shared.php -- Logical volumes could be overwritten with new path -- Env variable in value parsed -- Pull coolify image only when the app needs to be updated - -### 💼 Other - -- Actually update timezone on the server -- Cron jobs are executed based on the server timezone -- Server timezone seeder -- Recent backups UI -- Use apt-get instead of apt -- Typo -- Only pull helper image if the version is newer than the one - -### 🚜 Refactor - -- Update event listeners in Show components -- Refresh application to get latest database changes -- Update RabbitMQ configuration to use environment variable for port -- Remove debug statement in parseDockerComposeFile function -- ParseServiceVolumes -- Update OpenApi command to generate documentation -- Remove unnecessary server status check in destination view -- Remove unnecessary admin user email and password in budibase.yaml -- Improve saving of custom internal name in Advanced.php -- Add conditional check for volumes in generate_compose_file() -- Improve storage mount forms in add.blade.php -- Load environment variables based on resource type in sortEnvironmentVariables() -- Remove unnecessary network cleanup in Init.php -- Remove unnecessary environment variable checks in parseDockerComposeFile() -- Add null check for docker_compose_raw in parseCompose() -- Update dockerComposeParser to use YAML data from $yaml instead of $compose -- Convert service variables to key-value pairs in parseDockerComposeFile function -- Update database service name from mariadb to mysql -- Remove unnecessary code in DatabaseBackupJob and BackupExecutions -- Update Docker Compose parsing function to convert service variables to key-value pairs -- Update Docker Compose parsing function to convert service variables to key-value pairs -- Remove unused server timezone seeder and related code -- Remove unused server timezone seeder and related code -- Remove unused PullCoolifyImageJob from schedule -- Update parse method in Advanced, All, ApplicationPreview, General, and ApplicationDeploymentJob classes -- Remove commented out code for getIptables() in Dashboard.php -- Update .env file path in install.sh script -- Update SELF_HOSTED environment variable in docker-compose.prod.yml -- Remove unnecessary code for creating coolify network in upgrade.sh -- Update environment variable handling in StartClickhouse.php and ApplicationDeploymentJob.php -- Improve handling of COOLIFY_URL in shared.php -- Update build_args property type in ApplicationDeploymentJob -- Update background color of sponsor section in README.md -- Update Docker Compose location handling in PublicGitRepository -- Upgrade process of Coolify - -### 🧪 Testing - -- More tests - -### ⚙️ Miscellaneous Tasks - -- Update version to 4.0.0-beta.324 -- New compose parser with tests -- Update version to 1.3.4 in install.sh and 1.0.6 in upgrade.sh -- Update memory limit to 64MB in horizon configuration -- Update php packages -- Update axios npm dependency to version 1.7.5 -- Update Coolify version to 4.0.0-beta.324 and fix file paths in upgrade script -- Update Coolify version to 4.0.0-beta.324 -- Update Coolify version to 4.0.0-beta.325 -- Update Coolify version to 4.0.0-beta.326 -- Add cd command to change directory before removing .env file -- Update Coolify version to 4.0.0-beta.327 -- Update Coolify version to 4.0.0-beta.328 -- Update sponsor links in README.md -- Update version.json to versions.json in GitHub workflow -- Cleanup stucked resources and scheduled backups -- Update GitHub workflow to use versions.json instead of version.json -- Update GitHub workflow to use versions.json instead of version.json -- Update GitHub workflow to use versions.json instead of version.json -- Update GitHub workflow to use jq container for version extraction -- Update GitHub workflow to use jq container for version extraction - -## [4.0.0-beta.323] - 2024-08-08 - -### ⚙️ Miscellaneous Tasks - -- Update version to 4.0.0-beta.323 - -## [4.0.0-beta.322] - 2024-08-08 - -### 🐛 Bug Fixes - -- Manual update process - -### 🚜 Refactor - -- Update Server model getContainers method to use collect() for containers and containerReplicates -- Import ProxyTypes enum and use TRAEFIK instead of TRAEFIK_V2 - -### ⚙️ Miscellaneous Tasks - -- Update version to 4.0.0-beta.322 - -## [4.0.0-beta.321] - 2024-08-08 - -### 🐛 Bug Fixes - -- Scheduledbackup not found - -### 🚜 Refactor - -- Update StandalonePostgresql database initialization and backup handling -- Update cron expressions and add helper text for scheduled tasks - -### ⚙️ Miscellaneous Tasks - -- Update version to 4.0.0-beta.321 - -## [4.0.0-beta.320] - 2024-08-08 - -### 🚀 Features - -- Delete team in cloud without subscription -- Coolify init should cleanup stuck networks in proxy -- Add manual update check functionality to settings page -- Update auto update and update check frequencies in settings -- Update Upgrade component to check for latest version of Coolify -- Improve homepage service template -- Support map fields in Directus -- Labels by proxy type -- Able to generate only the required labels for resources - -### 🐛 Bug Fixes - -- Only append docker network if service/app is running -- Remove lazy load from scheduled tasks -- Plausible template -- Service_url should not have a trailing slash -- If usagebefore cannot be determined, cleanup docker with force -- Async remote command -- Only run logdrain if necessary -- Remove network if it is only connected to coolify proxy itself -- Dir mounts should have proper dirs -- File storages (dir/file mount) handled properly -- Do not use port exposes on docker compose buildpacks -- Minecraft server template fixed -- Graceful shutdown -- Stop resources gracefully -- Handle null and empty disk usage in DockerCleanupJob -- Show latest version on manual update view -- Empty string content should be saved as a file -- Update Traefik labels on init -- Add missing middleware for server check job - -### 🚜 Refactor - -- Update CleanupDatabase.php to adjust keep_days based on environment -- Adjust keep_days in CleanupDatabase.php based on environment -- Remove commented out code for cleaning up networks in CleanupDocker.php -- Update livewire polling interval in heading.blade.php -- Remove unused code for checking server status in Heading.php -- Simplify log drain installation in ServerCheckJob -- Remove unnecessary debug statement in ServerCheckJob -- Simplify log drain installation and stop log drain if necessary -- Cleanup unnecessary dynamic proxy configuration in Init command -- Remove unnecessary debug statement in ApplicationDeploymentJob -- Update timeout for graceful_shutdown_container in ApplicationDeploymentJob -- Remove unused code and optimize CheckForUpdatesJob -- Update ProxyTypes enum values to use TRAEFIK instead of TRAEFIK_V2 -- Update Traefik labels on init and cleanup unnecessary dynamic proxy configuration - -### 🎨 Styling - -- Linting - -### ⚙️ Miscellaneous Tasks - -- Update version to 4.0.0-beta.320 -- Add pull_request image builds to GH actions -- Add comment explaining the purpose of disconnecting the network in cleanup_unused_network_from_coolify_proxy() -- Update formbricks template -- Update registration view to display a notice for first user that it will be an admin -- Update server form to use password input for IP Address/Domain field -- Update navbar to include service status check -- Update navbar and configuration to improve service status check functionality -- Update workflows to include PR build and merge manifest steps -- Update UpdateCoolifyJob timeout to 10 minutes -- Update UpdateCoolifyJob to dispatch CheckForUpdatesJob synchronously - -## [4.0.0-beta.319] - 2024-07-26 - -### 🐛 Bug Fixes - -- Parse docker composer -- Service env parsing -- Service env variables -- Activity type invalid -- Update env on ui - -### 💼 Other - -- Service env parsing - -### ⚙️ Miscellaneous Tasks - -- Collect/create/update volumes in parseDockerComposeFile function - -## [4.0.0-beta.318] - 2024-07-24 - -### 🚀 Features - -- Create/delete project endpoints -- Add patch request to projects -- Add server api endpoints -- Add branddev logo to README.md -- Update API endpoint summaries -- Update Caddy button label in proxy.blade.php -- Check custom internal name through server's applications. -- New server check job - -### 🐛 Bug Fixes - -- Preview deployments should be stopped properly via gh webhook -- Deleting application should delete preview deployments -- Plane service images -- Fix issue with deployment start command in ApplicationDeploymentJob -- Directory will be created by default for compose host mounts -- Restart proxy does not work + status indicator on the UI -- Uuid in api docs type -- Raw compose deployment .env not found -- Api -> application patch endpoint -- Remove pull always when uploading backup to s3 -- Handle array env vars -- Link in task failed job notifications -- Random generated uuid will be full length (not 7 characters) -- Gitlab service -- Gitlab logo -- Bitbucket repository url -- By default volumes that we cannot determine if they are directories or files are treated as directories -- Domain update on services on the UI -- Update SERVICE_FQDN/URL env variables when you change the domain -- Several shared environment variables in one value, parsed correctly -- Members of root team should not see instance admin stuff - -### 💼 Other - -- Formbricks template add required CRON_SECRET -- Add required CRON_SECRET to Formbricks template - -### ⚙️ Miscellaneous Tasks - -- Update APP_BASE_URL to use SERVICE_FQDN_PLANE -- Update resource-limits.blade.php with improved input field helpers -- Update version numbers to 4.0.0-beta.319 -- Remove commented out code for docker image pruning - -## [4.0.0-beta.314] - 2024-07-15 - -### 🚀 Features - -- Improve error handling in loadComposeFile method -- Add readonly labels -- Preserve git repository -- Force cleanup server - -### 🐛 Bug Fixes - -- Typo in is_literal helper -- Env is_literal helper text typo -- Update docker compose pull command with --policy always -- Plane service template -- Vikunja -- Docmost template -- Drupal -- Improve github source creation -- Tag deployments -- New docker compose parsing -- Handle / in preselecting branches -- Handle custom_internal_name check in ApplicationDeploymentJob.php -- If git limit reached, ignore it and continue with a default selection -- Backup downloads -- Missing input for api endpoint -- Volume detection (dir or file) is fixed -- Supabase -- Create file storage even if content is empty - -### 💼 Other - -- Add basedir + compose file in new compose based apps - -### 🚜 Refactor - -- Remove unused code and fix storage form layout -- Update Docker Compose build command to include --pull flag -- Update DockerCleanupJob to handle nullable usageBefore property -- Server status job and docker cleanup job -- Update DockerCleanupJob to use server settings for force cleanup -- Update DockerCleanupJob to use server settings for force cleanup -- Disable health check for Rust applications during deployment - -### ⚙️ Miscellaneous Tasks - -- Update version to 4.0.0-beta.315 -- Update version to 4.0.0-beta.316 -- Update bug report template -- Update repository form with simplified URL input field -- Update width of container in general.blade.php -- Update checkbox labels in general.blade.php -- Update general page of apps -- Handle JSON parsing errors in format_docker_command_output_to_json -- Update Traefik image version to v2.11 -- Update version to 4.0.0-beta.317 -- Update version to 4.0.0-beta.318 -- Update helper message with link to documentation -- Disable health check by default -- Remove commented out code for sending internal notification - -### ◀️ Revert - -- Pull policy -- Advanced dropdown - -## [4.0.0-beta.308] - 2024-07-11 - -### 🚀 Features - -- Cleanup unused docker networks from proxy -- Compose parser v2 -- Display time interval for rollback images -- Add security and storage access key env to twenty template -- Add new logo for Latitude -- Enable legacy model binding in Livewire configuration - -### 🐛 Bug Fixes - -- Do not overwrite hardcoded variables if they rely on another variable -- Remove networks when deleting a docker compose based app -- Api -- Always set project name during app deployments -- Remove volumes as well -- Gitea pr previews -- Prevent instance fqdn persisting to other servers dynamic proxy configs -- Better volume cleanups -- Cleanup parameter -- Update redirect URL in unauthenticated exception handler -- Respect top-level configs and secrets -- Service status changed event -- Disable sentinel until a few bugs are fixed -- Service domains and envs are properly updated -- *(reactive-resume)* New healthcheck command for MinIO -- *(MinIO)* New command healthcheck -- Update minio hc in services -- Add validation for missing docker compose file - -### 🚜 Refactor - -- Add force parameter to StartProxy handle method -- Comment out unused code for network cleanup -- Reset default labels when docker_compose_domains is modified -- Webhooks view -- Tags view -- Only get instanceSettings once from db -- Update Dockerfile to set CI environment variable to true -- Remove unnecessary code in AppServiceProvider.php -- Update Livewire configuration views -- Update Webhooks.php to use nullable type for webhook URLs -- Add lazy loading to tags in Livewire configuration view -- Update metrics.blade.php to improve alert message clarity -- Update version numbers to 4.0.0-beta.312 -- Update version numbers to 4.0.0-beta.314 - -### ⚙️ Miscellaneous Tasks - -- Update Plausible docker compose template to Plausible 2.1.0 -- Update Plausible docker compose template to Plausible 2.1.0 -- Update livewire/livewire dependency to version 3.4.9 -- Refactor checkIfDomainIsAlreadyUsed function -- Update storage.blade.php view for livewire project service -- Update version to 4.0.0-beta.310 -- Update composer dependencies -- Add new logo for Latitude -- Bump version to 4.0.0-beta.311 - -### ◀️ Revert - -- Instancesettings - -## [4.0.0-beta.301] - 2024-06-24 - -### 🚀 Features - -- Local fonts -- More API endpoints -- Bulk env update api endpoint -- Update server settings metrics history days to 7 -- New app API endpoint -- Private gh deployments through api -- Lots of api endpoints -- Api api api api api api -- Rename CloudCleanupSubs to CloudCleanupSubscriptions -- Early fraud warning webhook -- Improve internal notification message for early fraud warning webhook -- Add schema for uuid property in app update response - -### 🐛 Bug Fixes - -- Run user commands on high prio queue -- Load js locally -- Remove lemon + paddle things -- Run container commands on high priority -- Image logo -- Remove both option for api endpoints. it just makes things complicated -- Cleanup subs in cloud -- Show keydbs/dragonflies/clickhouses -- Only run cloud clean on cloud + remove root team -- Force cleanup on busy servers -- Check domain on new app via api -- Custom container name will be the container name, not just internal network name -- Api updates -- Yaml everywhere -- Add newline character to private key before saving -- Add validation for webhook endpoint selection -- Database input validators -- Remove own app from domain checks -- Return data of app update - -### 💼 Other - -- Update process -- Glances service -- Glances -- Able to update application - -### 🚜 Refactor - -- Update Service model's saveComposeConfigs method -- Add default environment to Service model's saveComposeConfigs method -- Improve handling of default environment in Service model's saveComposeConfigs method -- Remove commented out code in Service model's saveComposeConfigs method -- Update stack-form.blade.php to include wire:target attribute for submit button -- Update code to use str() instead of Str::of() for string manipulation -- Improve formatting and readability of source.blade.php -- Add is_build_time property to nixpacks_php_fallback_path and nixpacks_php_root_dir -- Simplify code for retrieving subscription in Stripe webhook - -### ⚙️ Miscellaneous Tasks - -- Update version to 4.0.0-beta.302 -- Update version to 4.0.0-beta.303 -- Update version to 4.0.0-beta.305 -- Update version to 4.0.0-beta.306 -- Add log1x/laravel-webfonts package -- Update version to 4.0.0-beta.307 -- Refactor ServerStatusJob constructor formatting -- Update Monaco Editor for Docker Compose and Proxy Configuration -- More details -- Refactor shared.php helper functions - -## [4.0.0-beta.298] - 2024-06-24 - -### 🚀 Features - -- Spanish translation -- Cancelling a deployment will check if new could be started. -- Add supaguide logo to donations section -- Nixpacks now could reach local dbs internally -- Add Tigris logo to other/logos directory -- COOLIFY_CONTAINER_NAME predefined variable -- Charts -- Sentinel + charts -- Container metrics -- Add high priority queue -- Add metrics warning for servers without Sentinel enabled -- Add blacksmith logo to donations section -- Preselect server and destination if only one found -- More api endpoints -- Add API endpoint to update application by UUID -- Update statusnook logo filename in compose template - -### 🐛 Bug Fixes - -- Stripprefix middleware correctly labeled to http -- Bitbucket link -- Compose generator -- Do no truncate repositories wtih domain (git) in it -- In services should edit compose file for volumes and envs -- Handle laravel deployment better -- Db proxy status shown better in the UI -- Show commit message on webhooks + prs -- Metrics parsing -- Charts -- Application custom labels reset after saving -- Static build with new nixpacks build process -- Make server charts one livewire component with one interval selector -- You can now add env variable from ui to services -- Update compose environment with UI defined variables -- Refresh deployable compose without reload -- Remove cloud stripe notifications -- App deployment should be in high queue -- Remove zoom from modals -- Get envs before sortby -- MB is % lol -- Projects with 0 envs - -### 💼 Other - -- Unnecessary notification - -### 🚜 Refactor - -- Update text color for stderr output in deployment show view -- Update text color for stderr output in deployment show view -- Remove debug code for saving environment variables -- Update Docker build commands for better performance and flexibility -- Update image sizes and add new logos to README.md -- Update README.md with new logos and fix styling -- Update shared.php to use correct key for retrieving sentinel version -- Update container name assignment in Application model -- Remove commented code for docker container removal -- Update Application model to include getDomainsByUuid method -- Update Project/Show component to sort environments by created_at -- Update profile index view to display 2FA QR code in a centered container -- Update dashboard.blade.php to use project's default environment for redirection -- Update gitCommitLink method to handle null values in source.html_url -- Update docker-compose generation to use multi-line literal block - -### ⚙️ Miscellaneous Tasks - -- Update version numbers to 4.0.0-beta.298 -- Switch to database sessions from redis -- Update dependencies and remove unused code -- Update tailwindcss and vue versions in package.json -- Update service template URL in constants.php -- Update sentinel version to 0.0.8 -- Update chart styling and loading text -- Update sentinel version to 0.0.9 -- Update Spanish translation for failed authentication messages -- Add portuguese traslation -- Add Turkish translations -- Add Vietnamese translate -- Add Treive logo to donations section -- Update README.md with latest release version badge -- Update latest release version badge in README.md -- Update version to 4.0.0-beta.299 -- Move server delete component to the bottom of the page -- Update version to 4.0.0-beta.301 - -## [4.0.0-beta.297] - 2024-06-11 - -### 🚀 Features - -- Easily redirect between www-and-non-www domains -- Add logos for new sponsors -- Add homepage template -- Update homepage.yaml with environment variables and volumes - -### 🐛 Bug Fixes - -- Multiline build args -- Setup script doesnt link to the correct source code file -- Install.sh do not reinstall packages on arch -- Just restart - -### 🚜 Refactor - -- Replaces duplications in code with a single function - -### ⚙️ Miscellaneous Tasks - -- Update page title in resource index view -- Update logo file path in logto.yaml -- Update logo file path in logto.yaml -- Remove commented out code for docker container removal -- Add isAnyDeploymentInprogress function to check if any deployments are in progress -- Add ApplicationDeploymentJob and pint.json - -## [4.0.0-beta.295] - 2024-06-10 - -### 🚀 Features - -- Able to change database passwords on the UI. It won't sync to the database. -- Able to add several domains to compose based previews -- Add bounty program link to bug report template -- Add titles -- Db proxy logs - -### 🐛 Bug Fixes - -- Custom docker compose commands, add project dir if needed -- Autoupdate process -- Backup executions view -- Handle previously defined compose previews -- Sort backup executions -- Supabase service, newest versions -- Set default name for Docker volumes if it is null -- Multiline variable should be literal + should be multiline in bash with \ -- Gitlab merge request should close PR - -### 💼 Other - -- Rocketchat -- New services based git apps - -### 🚜 Refactor - -- Append utm_source parameter to documentation URL -- Update save_environment_variables method to use application's environment_variables instead of environment_variables_preview -- Update deployment previews heading to "Deployments" -- Remove unused variables and improve code readability -- Initialize null properties in Github Change component -- Improve pre and post deployment command inputs -- Improve handling of Docker volumes in parseDockerComposeFile function - -### ⚙️ Miscellaneous Tasks - -- Update version numbers to 4.0.0-beta.295 -- Update supported OS list with almalinux -- Update install.sh to support PopOS -- Update install.sh script to version 1.3.2 and handle Linux Mint as Ubuntu - -## [4.0.0-beta.294] - 2024-06-04 - -### ⚙️ Miscellaneous Tasks - -- Update Dockerfile with latest versions of Docker, Docker Compose, Docker Buildx, Pack, and Nixpacks - -## [4.0.0-beta.289] - 2024-05-29 - -### 🚀 Features - -- Add PHP memory limit environment variable to docker-compose.prod.yml -- Add manual update option to UpdateCoolify handle method -- Add port configuration for Vaultwarden service - -### 🐛 Bug Fixes - -- Sync upgrade process -- Publish horizon -- Add missing team model -- Test new upgrade process? -- Throw exception -- Build server dirs not created on main server -- Compose load with non-root user -- Able to redeploy dockerfile based apps without cache -- Compose previews does have env variables -- Fine-tune cdn pulls -- Spamming :D -- Parse docker version better -- Compose issues -- SERVICE_FQDN has source port in it -- Logto service -- Allow invitations via email -- Sort by defined order + fixed typo -- Only ignore volumes with driver_opts -- Check env in args for compose based apps - -### 🚜 Refactor - -- Update destination.blade.php to add group class for better styling -- Applicationdeploymentjob -- Improve code structure in ApplicationDeploymentJob.php -- Remove unnecessary debug statement in ApplicationDeploymentJob.php -- Remove unnecessary debug statements and improve code structure in RunRemoteProcess.php and ApplicationDeploymentJob.php -- Remove unnecessary logging statements from UpdateCoolify -- Update storage form inputs in show.blade.php -- Improve Docker Compose parsing for services -- Remove unnecessary port appending in updateCompose function -- Remove unnecessary form class in profile index.blade.php -- Update form layout in invite-link.blade.php -- Add log entry when starting new application deployment -- Improve Docker Compose parsing for services -- Update Docker Compose parsing for services -- Update slogan in shlink.yaml -- Improve display of deployment time in index.blade.php -- Remove commented out code for clearing Ray logs -- Update save_environment_variables method to use application's environment_variables instead of environment_variables_preview - -### ⚙️ Miscellaneous Tasks - -- Update for version 289 -- Fix formatting issue in deployment index.blade.php file -- Remove unnecessary wire:navigate attribute in breadcrumbs.blade.php -- Rename docker dirs -- Update laravel/socialite to version v5.14.0 and livewire/livewire to version 3.4.9 -- Update modal styles for better user experience -- Update deployment index.blade.php script for better performance -- Update version numbers to 4.0.0-beta.290 -- Update version numbers to 4.0.0-beta.291 -- Update version numbers to 4.0.0-beta.292 -- Update version numbers to 4.0.0-beta.293 -- Add upgrade guide link to upgrade.blade.php -- Improve upgrade.blade.php with clearer instructions and formatting -- Update version numbers to 4.0.0-beta.294 -- Add Lightspeed.run as a sponsor -- Update Dockerfile to install vim - -## [4.0.0-beta.288] - 2024-05-28 - -### 🐛 Bug Fixes - -- Do not allow service storage mount point modifications -- Volume adding - -### ⚙️ Miscellaneous Tasks - -- Update Sentry release version to 4.0.0-beta.288 - -## [4.0.0-beta.287] - 2024-05-27 - -### 🚀 Features - -- Handle incomplete expired subscriptions in Stripe webhook -- Add more persistent storage types - -### 🐛 Bug Fixes - -- Force load services from cdn on reload list - -### ⚙️ Miscellaneous Tasks - -- Update Sentry release version to 4.0.0-beta.287 -- Add Thompson Edolo as a sponsor -- Add null checks for team in Stripe webhook - -## [4.0.0-beta.286] - 2024-05-27 - -### 🚀 Features - -- If the time seems too long it remains at 0s -- Improve Docker Engine start logic in ServerStatusJob -- If proxy stopped manually, it won't start back again -- Exclude_from_hc magic -- Gitea manual webhooks -- Add container logs in case the container does not start healthy - -### 🐛 Bug Fixes - -- Wrong time during a failed deployment -- Removal of the failed deployment condition, addition of since started instead of finished time -- Use local versions + service templates and query them every 10 minutes -- Check proxy functionality before removing unnecessary coolify.yaml file and checking Docker Engine -- Show first 20 users only in admin view -- Add subpath for services -- Ghost subdir -- Do not pull templates in dev -- Templates -- Update error message for invalid token to mention invalid signature -- Disable containerStopped job for now -- Disable unreachable/revived notifications for now -- JSON_UNESCAPED_UNICODE -- Add wget to nixpacks builds -- Pre and post deployment commands -- Bitbucket commits link -- Better way to add curl/wget to nixpacks -- Root team able to download backups -- Build server should not have a proxy -- Improve build server functionalities -- Sentry issue -- Sentry -- Sentry error + livewire downgrade -- Sentry -- Sentry -- Sentry error -- Sentry - -### 🚜 Refactor - -- Update edit-domain form in project service view -- Add Huly services to compose file -- Remove redundant heading in backup settings page -- Add isBuildServer method to Server model -- Update docker network creation in ApplicationDeploymentJob - -### ⚙️ Miscellaneous Tasks - -- Change pre and post deployment command length in applications table -- Refactor container name logic in GetContainersStatus.php and ForcePasswordReset.php -- Remove unnecessary content from Docker Compose file - -## [4.0.0-beta.285] - 2024-05-21 - -### 🚀 Features - -- Add SerpAPI as a Github Sponsor -- Admin view for deleting users -- Scheduled task failed notification - -### 🐛 Bug Fixes - -- Optimize new resource creation -- Show it docker compose has syntax errors - -### 💼 Other - -- Responsive here and there - -## [4.0.0-beta.284] - 2024-05-19 - -### 🚀 Features - -- Add hc logs to healthchecks - -### ◀️ Revert - -- Hc return code check - -## [4.0.0-beta.283] - 2024-05-17 - -### 🚀 Features - -- Update healthcheck test in StartMongodb action -- Add pull_request_id filter to get_last_successful_deployment method in Application model - -### 🐛 Bug Fixes - -- PR deployments have good predefined envs - -### ⚙️ Miscellaneous Tasks - -- Update version to 4.0.0-beta.283 - -## [4.0.0-beta.281] - 2024-05-17 - -### 🚀 Features - -- Shows the latest deployment commit + message on status -- New manual update process + remove next_channel -- Add lastDeploymentInfo and lastDeploymentLink props to breadcrumbs and status components -- Sort envs alphabetically and creation date -- Improve sorting of environment variables in the All component - -### 🐛 Bug Fixes - -- Hc from localhost to 127.0.0.1 -- Use rc in hc -- Telegram group chat notifications - -## [4.0.0-beta.280] - 2024-05-16 - -### 🐛 Bug Fixes - -- Commit message length - -## [4.0.0-beta.279] - 2024-05-16 - -### ⚙️ Miscellaneous Tasks - -- Update version numbers to 4.0.0-beta.279 -- Limit commit message length to 50 characters in ApplicationDeploymentJob - -## [4.0.0-beta.278] - 2024-05-16 - -### 🚀 Features - -- Adding new COOLIFY_ variables -- Save commit message and better view on deployments -- Toggle label escaping mechanism - -### 🐛 Bug Fixes - -- Use commit hash on webhooks - -### ⚙️ Miscellaneous Tasks - -- Refactor Service.php to handle missing admin user in extraFields() method -- Update twenty CRM template with environment variables and dependencies -- Refactor applications.php to remove unused imports and improve code readability -- Refactor deployment index.blade.php for improved readability and rollback handling -- Refactor GitHub app selection UI in project creation form -- Update ServerLimitCheckJob.php to handle missing serverLimit value -- Remove unnecessary code for saving commit message -- Update DOCKER_VERSION to 26.0 in install.sh script -- Update Docker and Docker Compose versions in Dockerfiles - -## [4.0.0-beta.277] - 2024-05-10 - -### 🚀 Features - -- Add AdminRemoveUser command to remove users from the database - -### 🐛 Bug Fixes - -- Color for resource operation server and project name -- Only show realtime error on non-cloud instances -- Only allow push and mr gitlab events -- Improve scheduled task adding/removing -- Docker compose dependencies for pr previews -- Properly populating dependencies - -### 💼 Other - -- Fix a few boxes here and there - -### ⚙️ Miscellaneous Tasks - -- Update version numbers to 4.0.0-beta.278 -- Update hover behavior and cursor style in scheduled task executions view -- Refactor scheduled task view to improve code readability and maintainability -- Skip scheduled tasks if application or service is not running -- Remove debug logging statements in Kernel.php -- Handle invalid cron strings in Kernel.php - -## [4.0.0-beta.275] - 2024-05-06 - -### 🚀 Features - -- Add container name to network aliases in ApplicationDeploymentJob -- Add lazy loading for images in General.php and improve Docker Compose file handling in Application.php -- Experimental sentinel -- Start Sentinel on servers. -- Pull new sentinel image and restart container -- Init metrics - -### 🐛 Bug Fixes - -- Typo in tags.blade.php -- Install.sh error -- Env file -- Comment out internal notification in email_verify method -- Confirmation for custom labels -- Change permissions on newly created dirs - -### 💼 Other - -- Fix tag view - -### 🚜 Refactor - -- Add SCHEDULER environment variable to StartSentinel.php - -### ⚙️ Miscellaneous Tasks - -- Dark mode should be the default -- Improve menu item styling and spacing in service configuration and index views -- Improve menu item styling and spacing in service configuration and index views -- Improve menu item styling and spacing in project index and show views -- Remove docker compose versions -- Add Listmonk service template and logo -- Refactor GetContainersStatus.php for improved readability and maintainability -- Refactor ApplicationDeploymentJob.php for improved readability and maintainability -- Add metrics and logs directories to installation script -- Update sentinel version to 0.0.2 in versions.json -- Update permissions on metrics and logs directories -- Comment out server sentinel check in ServerStatusJob - -## [4.0.0-beta.273] - 2024-05-03 - -### 🐛 Bug Fixes - -- Formbricks image origin -- Add port even if traefik is used - -### ⚙️ Miscellaneous Tasks - -- Update version to 4.0.0-beta.275 -- Update DNS server validation helper text - -## [4.0.0-beta.267] - 2024-04-26 - -### 🚀 Features - -- Initial datalist -- Update service contribution docs URL -- The final pricing plan, pay-as-you-go - -### 🐛 Bug Fixes - -- Move s3 storages to separate view -- Mongo db backup -- Backups -- Autoupdate -- Respect start period and chekc interval for hc -- Parse HEALTHCHECK from dockerfile -- Make s3 name and endpoint required -- Able to update source path for predefined volumes -- Get logs with non-root user -- Mongo 4.0 db backup - -### 💼 Other - -- Update resource operations view - -### ◀️ Revert - -- Variable parsing - -## [4.0.0-beta.266] - 2024-04-24 - -### 🐛 Bug Fixes - -- Refresh public ips on start - -## [4.0.0-beta.259] - 2024-04-17 - -### 🚀 Features - -- Literal env variables -- Lazy load stuffs + tell user if compose based deployments have missing envs -- Can edit file/dir volumes from ui in compose based apps -- Upgrade Appwrite service template to 1.5 -- Upgrade Appwrite service template to 1.5 -- Add db name to backup notifications - -### 🐛 Bug Fixes - -- Helper image only pulled if required, not every 10 mins -- Make sure that confs when checking if it is changed sorted -- Respect .env file (for default values) -- Remove temporary cloudflared config -- Remove lazy loading until bug figured out -- Rollback feature -- Base64 encode .env -- $ in labels escaped -- .env saved to deployment server, not to build server -- Do no able to delete gh app without deleting resources -- 500 error on edge case -- Able to select server when creating new destination -- N8n template - -### 💼 Other - -- Non-root user for remote servers -- Non-root - -## [4.0.0-beta.258] - 2024-04-12 - -### 🚀 Features - -- Dynamic mux time - -### 🐛 Bug Fixes - -- Check each required binaries one-by-one - -## [4.0.0-beta.256] - 2024-04-12 - -### 🚀 Features - -- Upload large backups -- Edit domains easier for compose -- Able to delete configuration from server -- Configuration checker for all resources -- Allow tab in textarea - -### 🐛 Bug Fixes - -- Service config hash update -- Redeploy if image not found in restart only mode - -### 💼 Other - -- New pricing -- Fix allowTab logic -- Use 2 space instead of tab - -## [4.0.0-beta.252] - 2024-04-09 - -### 🚀 Features - -- Add amazon linux 2023 - -### 🐛 Bug Fixes - -- Git submodule update -- Unintended left padding on sidebar -- Hashed random delimeter in ssh commands + make sure to remove the delimeter from the command - -## [4.0.0-beta.250] - 2024-04-05 - -### 🚀 Features - -- *(application)* Update submodules after git checkout - -## [4.0.0-beta.249] - 2024-04-03 - -### 🚀 Features - -- Able to make rsa/ed ssh keys - -### 🐛 Bug Fixes - -- Warning if you use multiple domains for a service -- New github app creation -- Always rebuild Dockerfile / dockerimage buildpacks -- Do not rebuild dockerfile based apps twice -- Make sure if envs are changed, rebuild is needed -- Members cannot manage subscriptions -- IsMember -- Storage layout -- How to update docker-compose, environment variables and fqdns - -### 💼 Other - -- Light buttons -- Multiple server view - -## [4.0.0-beta.242] - 2024-03-25 - -### 🚀 Features - -- Change page width -- Watch paths - -### 🐛 Bug Fixes - -- Compose env has SERVICE, but not defined for Coolify -- Public service database -- Make sure service db proxy restarted -- Restart service db proxies -- Two factor -- Ui for tags -- Update resources view -- Realtime connection check -- Multline env in dev mode -- Scheduled backup for other service databases (supabase) -- PR deployments should not be distributed to 2 servers -- Name/from address required for resend -- Autoupdater -- Async service loads -- Disabled inputs are not trucated -- Duplicated generated fqdns are now working -- Uis -- Ui for cftunnels -- Search services -- Trial users subscription page -- Async public key loading -- Unfunctional server should see resources - -### 💼 Other - -- Run cleanup every day -- Fix -- Fix log outputs -- Automatic cloudflare tunnels -- Backup executions - -## [4.0.0-beta.241] - 2024-03-20 - -### 🚀 Features - -- Able to run scheduler/horizon programatically - -### 🐛 Bug Fixes - -- Volumes for prs -- Shared env variable parsing - -### 💼 Other - -- Redesign -- Redesign - -## [4.0.0-beta.240] - 2024-03-18 - -### 🐛 Bug Fixes - -- Empty get logs number of lines -- Only escape envs after v239+ -- 0 in env value -- Consistent container name -- Custom ip address should turn off rolling update -- Multiline input -- Raw compose deployment -- Dashboard view if no project found - -## [4.0.0-beta.239] - 2024-03-14 - -### 🐛 Bug Fixes - -- Duplicate dockerfile -- Multiline env variables -- Server stopped, service page not reachable - -## [4.0.0-beta.237] - 2024-03-14 - -### 🚀 Features - -- Domains api endpoint -- Resources api endpoint -- Team api endpoint -- Add deployment details to deploy endpoint -- Add deployments api -- Experimental caddy support -- Dynamic configuration for caddy -- Reset password -- Show resources on source page - -### 🐛 Bug Fixes - -- Deploy api messages -- Fqdn null in case docker compose bp -- Reload caddy issue -- /realtime endpoint -- Proxy switch -- Service ports for services + caddy -- Failed deployments should send failed email/notification -- Consider custom healthchecks in dockerfile -- Create initial files async -- Docker compose validation - -## [4.0.0-beta.235] - 2024-03-05 - -### 🐛 Bug Fixes - -- Should note delete personal teams -- Make sure to show some buttons -- Sort repositories by name - -## [4.0.0-beta.224] - 2024-02-23 - -### 🚀 Features - -- Custom server limit -- Delay container/server jobs -- Add static ipv4 ipv6 support -- Server disabled by overflow -- Preview deployment logs -- Collect webhooks during maintenance -- Logs and execute commands with several servers - -### 🐛 Bug Fixes - -- Subscription / plan switch, etc -- Firefly service -- Force enable/disable server in case ultimate package quantity decreases -- Server disabled -- Custom dockerfile location always checked -- Import to mysql and mariadb -- Resource tab not loading if server is not reachable -- Load unmanaged async -- Do not show n/a networsk -- Service container status updates -- Public prs should not be commented -- Pull request deployments + build servers -- Env value generation -- Sentry error -- Service status updated - -### 💼 Other - -- Change + icon to hamburger. - -## [4.0.0-beta.222] - 2024-02-22 - -### 🚀 Features - -- Able to add dynamic configurations from proxy dashboard - -### 🐛 Bug Fixes - -- Connections being stuck and not processed until proxy restarts -- Use latest image if nothing is specified -- No coolify.yaml found -- Server validation -- Statuses -- Unknown image of service until it is uploaded - -## [4.0.0-beta.220] - 2024-02-19 - -### 🚀 Features - -- Save github app permission locally -- Minversion for services - -### 🐛 Bug Fixes - -- Add openbsd ssh server check -- Resources -- Empty build variables -- *(server)* Revalidate server button not showing in server's page -- Fluent bit ident level -- Submodule cloning -- Database status -- Permission change updates from webhook -- Server validation - -### 💼 Other - -- Updates - -## [4.0.0-beta.213] - 2024-02-12 - -### 🚀 Features - -- Magic for traefik redirectregex in services -- Revalidate server -- Disable gzip compression on service applications - -### 🐛 Bug Fixes - -- Cleanup scheduled tasks -- Padding left on input boxes -- Use ls / command instead ls -- Do not add the same server twice -- Only show redeployment required if status is not exited - -## [4.0.0-beta.212] - 2024-02-08 - -### 🚀 Features - -- Cleanup queue - -### 🐛 Bug Fixes - -- New menu on navbar -- Make sure resources are deleted in async mode -- Go to prod env from dashboard if there is no other envs defined -- User proper image_tag, if set -- New menu ui -- Lock logdrain configuration when one of them are enabled -- Add docker compose check during server validation -- Get service stack as uuid, not name -- Menu -- Flex wrap deployment previews -- Boolean docker options -- Only add 'networks' key if 'network_mode' is absent - -## [4.0.0-beta.206] - 2024-02-05 - -### 🚀 Features - -- Clone to env -- Multi deployments - -### 🐛 Bug Fixes - -- Wrap tags and avoid horizontal overflow -- Stripe webhooks -- Feedback from self-hosted envs to discord - -### 💼 Other - -- Specific about newrelic logdrains - -## [4.0.0-beta.201] - 2024-01-29 - -### 🚀 Features - -- Added manual webhook support for bitbucket -- Add initial support for custom docker run commands -- Cleanup unreachable servers -- Tags and tag deploy webhooks - -### 🐛 Bug Fixes - -- Bitbucket manual deployments -- Webhooks for multiple apps -- Unhealthy deployments should be failed -- Add env variables for wordpress template without database -- Service deletion function -- Service deletion fix -- Dns validation + duplicated fqdns -- Validate server navbar upated -- Regenerate labels on application clone -- Service deletion -- Not able to use other shared envs -- Sentry fix -- Sentry -- Sentry error -- Sentry -- Sentry error -- Create dynamic directory -- Migrate to new modal -- Duplicate domain check -- Tags - -### 💼 Other - -- New modal component - -## [4.0.0-beta.188] - 2024-01-11 - -### 🚀 Features - -- Search between resources -- Move resources between projects / environments -- Clone any resource -- Shared environments -- Concurrent builds / server -- Able to deploy multiple resources with webhook -- Add PR comments -- Dashboard live deployment view - -### 🐛 Bug Fixes - -- Preview deployments with nixpacks -- Cleanup docker stuffs before upgrading -- Service deletion command -- Cpuset limits was determined in a way that apps only used 1 CPU max, ehh, sorry. -- Service stack view -- Change proxy view -- Checkbox click -- Git pull command for deploy key based previews -- Server status job -- Service deletion bug! -- Links -- Redis custom conf -- Sentry error -- Restrict concurrent deployments per server -- Queue -- Change env variable length - -### 💼 Other - -- Send notification email if payment - -### 🚜 Refactor - -- Compose file and install script - -## [4.0.0-beta.186] - 2024-01-11 - -### 🚀 Features - -- Import backups - -### 🐛 Bug Fixes - -- Do not include thegameplan.json into build image -- Submit error on postgresql -- Email verification / forgot password -- Escape build envs properly for nixpacks + docker build -- Undead endpoint -- Upload limit on ui -- Save cmd output propely (merge) -- Load profile on remote commands -- Load profile and set envs on remote cmd -- Restart should not update config hash - -## [4.0.0-beta.184] - 2024-01-09 - -### 🐛 Bug Fixes - -- Healthy status -- Show framework based notification in build logs -- Traefik labels -- Use ip for sslip in dev if remote server is used -- Service labels without ports (unknown ports) -- Sort and rename (unique part) of labels -- Settings menu -- Remove traefik debug in dev mode -- Php pgsql to 8.2 -- Static buildpack should set port 80 -- Update navbar on build_pack change - -## [4.0.0-beta.183] - 2024-01-06 - -### 🚀 Features - -- Add www-non-www redirects to traefik - -### 🐛 Bug Fixes - -- Database env variables - -## [4.0.0-beta.182] - 2024-01-04 - -### 🐛 Bug Fixes - -- File storage save - -## [4.0.0-beta.181] - 2024-01-03 - -### 🐛 Bug Fixes - -- Nixpacks buildpack - -## [4.0.0-beta.180] - 2024-01-03 - -### 🐛 Bug Fixes - -- Nixpacks cache -- Only add restart policy if its empty (compose) - -## [4.0.0-beta.179] - 2024-01-02 - -### 🐛 Bug Fixes - -- Set deployment failed if new container is not healthy - -## [4.0.0-beta.177] - 2024-01-02 - -### 🚀 Features - -- Raw docker compose deployments - -### 🐛 Bug Fixes - -- Duplicate compose variable - -## [4.0.0-beta.176] - 2023-12-31 - -### 🐛 Bug Fixes - -- Horizon - -## [4.0.0-beta.175] - 2023-12-30 - -### 🚀 Features - -- Add environment description + able to change name - -### 🐛 Bug Fixes - -- Sub -- Wrong env variable parsing -- Deploy key + docker compose - -## [4.0.0-beta.174] - 2023-12-27 - -### 🐛 Bug Fixes - -- Restore falsely deleted coolify-db-backup - -## [4.0.0-beta.173] - 2023-12-27 - -### 🐛 Bug Fixes - -- Cpu limit to float from int -- Add source commit to final envs -- Routing, switch back to old one -- Deploy instead of restart in case swarm is used -- Button title - -## [4.0.0-beta.163] - 2023-12-15 - -### 🚀 Features - -- Custom docker compose commands - -### 🐛 Bug Fixes - -- Domains for compose bp -- No action in webhooks -- Add debug output to gitlab webhooks -- Do not push dockerimage -- Add alpha to swarm -- Server not found -- Do not autovalidate server on mount -- Server update schedule -- Swarm support ui -- Server ready -- Get swarm service logs -- Docker compose apps env rewritten -- Storage error on dbs -- Why?! -- Stay tuned - -### 💼 Other - -- Swarm -- Swarm - -## [4.0.0-beta.155] - 2023-12-11 - -### 🚀 Features - -- Autoupdate env during seed -- Disable autoupdate -- Randomly sleep between executions -- Pull latest images for services - -### 🐛 Bug Fixes - -- Do not send telegram noti on intent payment failed -- Database ui is realtime based -- Live mode for github webhooks -- Ui -- Realtime connection popup could be disabled -- Realtime check -- Add new destination -- Proxy logs -- Db status check -- Pusher host -- Add ipv6 -- Realtime connection?! -- Websocket -- Better handling of errors with install script -- Install script parse version -- Only allow to modify in .env file if AUTOUPDATE is set -- Is autoupdate not null -- Run init command after production seeder -- Init -- Comma in traefik custom labels -- Ignore if dynamic config could not be set -- Service env variable ovewritten if it has a default value -- Labelling -- Non-ascii chars in labels -- Labels -- Init script echos -- Update Coolify script -- Null notify -- Check queued deployments as well -- Copy invitation -- Password reset / invitation link requests -- Add catch all route -- Revert random container job delay -- Backup executions view -- Only check server status in container status job -- Improve server status check times -- Handle other types of generated values -- Server checking status -- Ui for adding new destination -- Reset domains on compose file change - -### 💼 Other - -- Fix for comma in labels -- Add image name to service stack + better options visibility - -### 🚜 Refactor - -- Service logs are now on one page -- Application status changed realtime -- Custom labels -- Clone project - -## [4.0.0-beta.154] - 2023-12-07 - -### 🚀 Features - -- Execute command in container - -### 🐛 Bug Fixes - -- Container selection -- Service navbar using new realtime events -- Do not create duplicated networks -- Live event -- Service start + event -- Service deletion job -- Double ws connection -- Boarding view - -### 💼 Other - -- Env vars -- Migrate to livewire 3 - -## [4.0.0-beta.124] - 2023-11-13 - -### 🚀 Features - -- Log drain (wip) -- Enable/disable log drain by service -- Log drainer container check -- Add docker engine support install script to rhel based systems -- Save timestamp configuration for logs -- Custom log drain endpoints -- Auto-restart tcp proxies for databases - -### 🐛 Bug Fixes - -- *(fider template)* Use the correct docs url -- Fqdn for minio -- Generate service fields -- Mariadb backups -- When to pull image -- Do not allow to enter local ip addresses -- Reset password -- Only report nonruntime errors -- Handle different label formats in services -- Server adding process -- Show defined resources in server tab, so you will know what you need to delete before you can delete the server. -- Lots of regarding git + docker compose deployments -- Pull request build variables -- Double default password length -- Do not remove deployment in case compose based failed -- No container servers -- Sentry issue -- Dockercompose save ./ volumes under /data/coolify -- Server view for link() -- Default value do not overwrite existing env value -- Use official install script with rancher (one will work for sure) -- Add cf tunnel to boarding server view -- Prevent autorefresh of proxy status -- Missing docker image thing -- Add hc for soketi -- Deploy the right compose file -- Bind volumes for compose bp -- Use hc port 80 in case of static build -- Switching to static build - -### 💼 Other - -- New deployment jobs -- Compose based apps -- Swarm -- Swarm -- Swarm -- Swarm -- Disable trial -- Meilisearch -- Broadcast -- 🌮 - -### 🚜 Refactor - -- Env variable generator - -### ◀️ Revert - -- Wip - -## [4.0.0-beta.109] - 2023-11-06 - -### 🚀 Features - -- Deployment logs fullscreen -- Service database backups -- Make service databases public - -### 🐛 Bug Fixes - -- Missing environment variables prevewi on service -- Invoice.paid should sleep for 5 seconds -- Local dev repo -- Deployments ui -- Dockerfile build pack fix -- Set labels on generate domain -- Network service parse -- Notification url in containerstatusjob -- Gh webhook response 200 to installation_repositories -- Delete destination -- No id found -- Missing $mailMessage -- Set default from/sender names -- No environments -- Telegram text -- Private key not found error -- UI -- Resourcesdelete command -- Port number should be int -- Separate delete with validation of server -- Add nixpacks info -- Remove filter -- Container logs are now followable in full-screen and sorted by timestamp -- Ui for labels -- Ui -- Deletions -- Build_image not found -- Github source view -- Github source view -- Dockercleanupjob should be released back -- Ui -- Local ip address -- Revert workdir to basedir -- Container status jobs for old pr deployments -- Service updates - -## [4.0.0-beta.99] - 2023-10-24 - -### 🚀 Features - -- Improve deployment time by a lot - -### 🐛 Bug Fixes - -- Space in build args -- Lock SERVICE_FQDN envs -- If user is invited, that means its email is verified -- Force password reset on invited accounts -- Add ssh options to git ls-remote -- Git ls-remote -- Remove coolify labels from ui - -### 💼 Other - -- Fix subs - -## [4.0.0-beta.97] - 2023-10-20 - -### 🚀 Features - -- Standalone mongodb -- Cloning project -- Api tokens + deploy webhook -- Start all kinds of things -- Simple search functionality -- Mysql, mariadb -- Lock environment variables -- Download local backups - -### 🐛 Bug Fixes - -- Service docs links -- Add PGUSER to prevent HC warning -- Preselect s3 storage if available -- Port exposes change, shoud regenerate label -- Boarding -- Clone to with the same environment name -- Cleanup stucked resources on start -- Do not allow to delete env if a resource is defined -- Service template generator + appwrite -- Mongodb backup -- Make sure coolfiy network exists on install -- Syncbunny command -- Encrypt mongodb password -- Mongodb healtcheck command -- Rate limit for api + add mariadb + mysql -- Server settings guarded - -### 💼 Other - -- Generate services -- Mongodb backup -- Mongodb backup -- Updates - -## [4.0.0-beta.93] - 2023-10-18 - -### 🚀 Features - -- Able to customize docker labels on applications -- Show if config is not applied - -### 🐛 Bug Fixes - -- Setup:dev script & contribution guide -- Do not show configuration changed if config_hash is null -- Add config_hash if its null (old deployments) -- Label generation -- Labels -- Email channel no recepients -- Limit horizon processes to 2 by default -- Add custom port as ssh option to deploy_key based commands -- Remove custom port from git repo url -- ContainerStatus job - -### 💼 Other - -- PAT by team - -## [4.0.0-beta.92] - 2023-10-17 - -### 🐛 Bug Fixes - -- Proxy start process - -## [4.0.0-beta.91] - 2023-10-17 - -### 🐛 Bug Fixes - -- Always start proxy if not NONE is selected - -### 💼 Other - -- Add helper to service domains - -## [4.0.0-beta.90] - 2023-10-17 - -### 🐛 Bug Fixes - -- Only include config.json if its exists and a file - -### 💼 Other - -- Wordpress - -## [4.0.0-beta.89] - 2023-10-17 - -### 🐛 Bug Fixes - -- Noindex meta tag -- Show docker build logs - -## [4.0.0-beta.88] - 2023-10-17 - -### 🚀 Features - -- Use docker login credentials from server - -## [4.0.0-beta.87] - 2023-10-17 - -### 🐛 Bug Fixes - -- Service status check is a bit better -- Generate fqdn if you deleted a service app, but it requires fqdn -- Cancel any deployments + queue next -- Add internal domain names during build process - -## [4.0.0-beta.86] - 2023-10-15 - -### 🐛 Bug Fixes - -- Build image before starting dockerfile buildpacks - -## [4.0.0-beta.85] - 2023-10-14 - -### 🐛 Bug Fixes - -- Redis URL generated - -## [4.0.0-beta.83] - 2023-10-13 - -### 🐛 Bug Fixes - -- Docker hub URL - -## [4.0.0-beta.70] - 2023-10-09 - -### 🚀 Features - -- Add email verification for cloud -- Able to deploy docker images -- Add dockerfile location -- Proxy logs on the ui -- Add custom redis conf - -### 🐛 Bug Fixes - -- Server validation process -- Fqdn could be null -- Small -- Server unreachable count -- Do not reset unreachable count -- Contact docs -- Check connection -- Server saving -- No env goto envs from dashboard -- Goto -- Tcp proxy for dbs -- Database backups -- Only send email if transactional email set -- Backupfailed notification is forced -- Use port exposed for reverse proxy -- Contact link -- Use only ip addresses for servers -- Deleted team and it is the current one -- Add new team button -- Transactional email link -- Dashboard goto link -- Only require registry image in case of dockerimage bp -- Instant save build pack change -- Public git -- Cannot remove localhost -- Check localhost connection -- Send unreachable/revived notifications -- Boarding + verification -- Make sure proxy wont start in NONE mode -- Service check status 10 sec -- IsCloud in production seeder -- Make sure to use IP address -- Dockerfile location feature -- Server ip could be hostname in self-hosted -- Urls should be password fields -- No backup for redis -- Show database logs in case of its not healthy and running -- Proxy check for ports, do not kill anything listening on port 80/443 -- Traefik dashboard ip -- Db labels -- Docker cleanup jobs -- Timeout for instant remote processes -- Dev containerjobs -- Backup database one-by-one. -- Turn off static deployment if you switch buildpacks - -### 💼 Other - -- Dockerimage -- Updated dashboard -- Fix -- Fix -- Coolify proxy access logs exposed in dev -- Able to select environment on new resource -- Delete server -- Redis - -## [4.0.0-beta.58] - 2023-10-02 - -### 🚀 Features - -- Reset root password -- Attach Coolify defined networks to services -- Delete resource command -- Multiselect removable resources -- Disable service, required version -- Basedir / monorepo initial support -- Init version of any git deployment -- Deploy private repo with ssh key - -### 🐛 Bug Fixes - -- If waitlist is disabled, redirect to register -- Add destination to new services -- Predefined content for files -- Move /data to ./_data in dev -- UI -- Show all storages in one place for services -- Ui -- Add _data to vite ignore -- Only use _ in volume names for services -- Volume names in services -- Volume names -- Service logs visible if the whole service stack is not running -- Ui -- Compose magic -- Compose parser updated -- Dev compose files -- Traefik labels for multiport deployments -- Visible version number -- Remove SERVICE_ from deployable compose -- Delete event to deleting -- Move dev data to volumes to prevent permission issues -- Traefik labelling in case of several http and https domain added -- PR deployments use the first fqdn as base -- Email notifications subscription fixed -- Services - do not remove unnecessary things for now -- Decrease max horizon processes to get lower memory usage -- Test emails only available for user owned smtp/resend -- Ui for self-hosted email settings -- Set smtp notifications on by default -- Select branch on other git -- Private repository -- Contribution guide -- Public repository names -- *(create)* Flex wrap on server & network selection -- Better unreachable/revived server statuses -- Able to set base dir for Dockerfile build pack - -### 💼 Other - -- Uptime kume hc updated -- Switch back to /data (volume errors) -- Notifications -- Add shared email option to everyone - -## [4.0.0-beta.57] - 2023-10-02 - -### 🚀 Features - -- Container logs - -### 🐛 Bug Fixes - -- Always pull helper image in dev -- Only show last 1000 lines -- Service status - -## [4.0.0-beta.47] - 2023-09-28 - -### 🐛 Bug Fixes - -- Next helper image -- Service templates -- Sync:bunny -- Update process if server has been renamed -- Reporting handler -- Localhost privatekey update -- Remove private key in case you removed a github app -- Only show manually added private keys on server view -- Show source on all type of applications -- Docker cleanup should be a job by server -- File/dir based volumes are now read from the server -- Respect server fqdn -- If public repository does not have a main branch -- Preselect branc on private repos -- Deploykey branch -- Backups are now working again -- Not found base_branch in git webhooks -- Coolify db backup -- Preview deployments name, status etc -- Services should have destination as well -- Dockerfile expose is not overwritten -- If app settings is not saved to db -- Do not show subscription cancelled noti -- Show real volume names -- Only parse expose in dockerfiles if ports_exposes is empty -- Add uuid to volume names -- New volumes for services should have - instead of _ - -### 💼 Other - -- Fix previews to preview - -## [4.0.0-beta.46] - 2023-09-28 - -### 🐛 Bug Fixes - -- Containerstatusjob -- Aaaaaaaaaaaaaaaaa -- Services view -- Services -- Manually create network for services -- Disable early updates -- Sslip for localhost -- ContainerStatusJob -- Cannot delete env with available services -- Sync command -- Install script drops an error -- Prevent sync version (it needs an option) -- Instance fqdn setting -- Sentry 4510197209 -- Sentry 4504136641 -- Sentry 4502634789 - -## [4.0.0-beta.45] - 2023-09-24 - -### 🚀 Features - -- Services -- Image tag for services - -### 🐛 Bug Fixes - -- Applications with port mappins do a normal update (not rolling update) -- Put back build pack chooser -- Proxy configuration + starter -- Show real storage name on services -- New service template layout - -### 💼 Other - -- Fixed z-index for version link. -- Add source button -- Fixed z-index for magicbar -- A bit better error -- More visible feedback button -- Update help modal -- Help -- Marketing emails - -## [4.0.0-beta.28] - 2023-09-08 - -### 🚀 Features - -- Telegram topics separation -- Developer view for env variables -- Cache team settings -- Generate public key from private keys -- Able to invite more people at once -- Trial -- Dynamic trial period -- Ssh-agent instead of filesystem based ssh keys -- New container status checks -- Generate ssh key -- Sentry add email for better support -- Healthcheck for apps -- Add cloudflare tunnel support - -### 🐛 Bug Fixes - -- Db backup job -- Sentry 4459819517 -- Sentry 4451028626 -- Ui -- Retry notifications -- Instance email settings -- Ui -- Test email on for admins or custom smtp -- Coolify already exists should not throw error -- Delete database related things when delete database -- Remove -q from docker compose -- Errors in views -- Only send internal notifcations to enabled channels -- Recovery code -- Email sending error -- Sentry 4469575117 -- Old docker version error -- Errors -- Proxy check, reduce jobs, etc -- Queue after commit -- Remove nixpkgarchive -- Remove nixpkgarchive from ui -- Webhooks should not run if server is not functional -- Server is functional check -- Confirm email before sending -- Help should send cc on email -- Sub type -- Show help modal everywhere -- Forgot password -- Disable dockerfile based healtcheck for now -- Add timeout for ssh commands -- Prevent weird ui bug for validateServer -- Lowercase email in forgot password -- Lower case email on waitlist -- Encrypt jobs -- ProcessWithEnv()->run -- Plus boarding step about Coolify -- SaveConfigurationSync -- Help uri -- Sub for root -- Redirect on server not found -- Ip check -- Uniqueips -- Simply reply to help messages -- Help -- Rate limit -- Collect billing address -- Invitation -- Smtp view -- Ssh-agent revert -- Restarting container state on ui -- Generate new key -- Missing upgrade js -- Team error -- 4.0.0-beta.37 -- Localhost -- Proxy start (if not proxy defined, use Traefik) -- Do not remove localhost in boarding -- Allow non ip address (DNS) -- InstallDocker id not found -- Boarding -- Errors -- Proxy container status -- Proxy configuration saving -- Convert startProxy to action -- Stop/start UI on apps and dbs -- Improve localhost boarding process -- Try to use old docker-compose -- Boarding again -- Send internal notifications of email errors -- Add github app change on new app view -- Delete environment variables on app/db delete -- Save proxy configuration -- Add proxy to network with periodic check -- Proxy connections -- Delete persistent storages on resource deletion -- Prevent overwrite already existing env variables in services -- Mappings -- Sentry issue 4478125289 -- Make sure proxy path created -- StartProxy -- Server validation with cf tunnels -- Only show traefik dashboard if its available -- Services -- Database schema -- Report livewire errors -- Links with path -- Add traefik labels no matter if traefik is selected or not -- Add expose port for containers -- Also check docker socks permission on validation - -### 💼 Other - -- User should know that the public key -- Services are not availble yet -- Show registered users on waitlist page -- Nixpacksarchive -- Add Plausible analytics -- Global env variables -- Fix -- Trial emails -- Server check instead of app check -- Show trial instead of sub -- Server lost connection -- Services -- Services -- Services -- Ui for services -- Services -- Services -- Services -- Fixes -- Fix typo - -## [4.0.0-beta.27] - 2023-09-08 - -### 🐛 Bug Fixes - -- Bug - -## [4.0.0-beta.26] - 2023-09-08 - -### 🚀 Features - -- Public database - -## [4.0.0-beta.25] - 2023-09-07 - -### 🐛 Bug Fixes - -- SaveModel email settings - -## [4.0.0-beta.24] - 2023-09-06 - -### 🚀 Features - -- Send request in cloud -- Add discord notifications - -### 🐛 Bug Fixes - -- Form address -- Show hosted email service, just disable for non pro subs -- Add navbar for source + keys -- Add docker network to build process -- Overlapping apps -- Do not show system wide git on cloud -- Lowercase image names -- Typo - -### 💼 Other - -- Backup existing database - -## [4.0.0-beta.23] - 2023-09-01 - -### 🐛 Bug Fixes - -- Sentry bug -- Button loading animation - -## [4.0.0-beta.22] - 2023-09-01 - -### 🚀 Features - -- Add resend as transactional emails - -### 🐛 Bug Fixes - -- DockerCleanupjob -- Validation -- Webhook endpoint in cloud and no system wide gh app -- Subscriptions -- Password confirmation -- Proxy start job -- Dockerimage jobs are not overlapping - -## [4.0.0-beta.21] - 2023-08-27 - -### 🚀 Features - -- Invite by email from waitlist -- Rolling update - -### 🐛 Bug Fixes - -- Limits & server creation page -- Fqdn on apps - -### 💼 Other - -- Boarding - -## [4.0.0-beta.20] - 2023-08-17 - -### 🚀 Features - -- Send internal notification to discord -- Monitor server connection - -### 🐛 Bug Fixes - -- Make coolify-db backups unique dir - -## [4.0.0-beta.19] - 2023-08-15 - -### 🚀 Features - -- Pricing plans ans subs -- Add s3 storages -- Init postgresql database -- Add backup notifications -- Dockerfile build pack -- Cloud -- Force password reset + waitlist - -### 🐛 Bug Fixes - -- Remove buggregator from dev -- Able to change localhost's private key -- Readonly input box -- Notifications -- Licensing -- Subscription link -- Migrate db schema for smtp + discord -- Text field -- Null fqdn notifications -- Remove old modal -- Proxy stop/start ui -- Proxy UI -- Empty description -- Input and textarea -- Postgres_username name to not name, lol -- DatabaseBackupJob.php -- No storage -- Backup now button -- Ui + subscription -- Self-hosted - -### 💼 Other - -- Scheduled backups - -## [4.0.0-beta.18] - 2023-07-14 - -### 🚀 Features - -- Able to control multiplexing -- Add runRemoteCommandSync -- Github repo with deployment key -- Add persistent volumes -- Debuggable executeNow commands -- Add private gh repos -- Delete gh app -- Installation/update github apps -- Auto-deploy -- Deploy key based deployments -- Resource limits -- Long running queue with 1 hour of timeout -- Add arm build to dev -- Disk cleanup threshold by server -- Notify user of disk cleanup init - -### 🐛 Bug Fixes - -- Logo of CCCareers -- Typo -- Ssh -- Nullable name on deploy_keys -- Enviroments -- Remove dd - oops -- Add inprogress activity -- Application view -- Only set status in case the last command block is finished -- Poll activity -- Small typo -- Show activity on load -- Deployment should fail on error -- Tests -- Version -- Status not needed -- No project redirect -- Gh actions -- Set status -- Seeders -- Do not modify localhost -- Deployment_uuid -> type_uuid -- Read env from config, bc of cache -- Private key change view -- New destination -- Do not update next channel all the time -- Cancel deployment button -- Public repo limit shown + branch should be preselected. -- Better status on ui for apps -- Arm coolify version -- Formatting -- Gh actions -- Show github app secrets -- Do not force next version updates -- Debug log button -- Deployment key based works -- Deployment cancel/debug buttons -- Upgrade button -- Changing static build changes port -- Overwrite default nginx configuration -- Do not overlap docker image names -- Oops -- Found image name -- Name length -- Semicolons encoding by traefik -- Base_dir wip & outputs -- Cleanup docker images -- Nginx try_files -- Master is the default, not main -- No ms in rate limit resets -- Loading after button text -- Default value -- Localhost is usable -- Update docker-compose prod -- Cloud/checkoutid/lms -- Type of license code -- More verbose error -- Version lol -- Update prod compose -- Version - -### 💼 Other - -- Extract process handling from async job. -- Extract process handling from async job. -- Extract process handling from async job. -- Extract process handling from async job. -- Extract process handling from async job. -- Extract process handling from async job. -- Extract process handling from async job. -- Persisting data - -## [3.12.28] - 2023-03-16 - -### 🐛 Bug Fixes - -- Revert from dockerhub if ghcr.io does not exists - -## [3.12.27] - 2023-03-07 - -### 🐛 Bug Fixes - -- Show ip address as host in public dbs - -## [3.12.24] - 2023-03-04 - -### 🐛 Bug Fixes - -- Nestjs buildpack - -## [3.12.22] - 2023-03-03 - -### 🚀 Features - -- Add host path to any container - -### 🐛 Bug Fixes - -- Set PACK_VERSION to 0.27.0 -- PublishDirectory -- Host volumes -- Replace . & .. & $PWD with ~ -- Handle log format volumes - -## [3.12.19] - 2023-02-20 - -### 🚀 Features - -- Github raw icon url -- Remove svg support - -### 🐛 Bug Fixes - -- Typos in docs -- Url -- Network in compose files -- Escape new line chars in wp custom configs -- Applications cannot be deleted -- Arm servics -- Base directory not found -- Cannot delete resource when you are not on root team -- Empty port in docker compose - -## [3.12.18] - 2023-01-24 - -### 🐛 Bug Fixes - -- CleanupStuckedContainers -- CleanupStuckedContainers - -## [3.12.16] - 2023-01-20 - -### 🐛 Bug Fixes - -- Stucked containers - -## [3.12.15] - 2023-01-20 - -### 🐛 Bug Fixes - -- Cleanup function -- Cleanup stucked containers -- Deletion + cleanupStuckedContainers - -## [3.12.14] - 2023-01-19 - -### 🐛 Bug Fixes - -- Www redirect - -## [3.12.13] - 2023-01-18 - -### 🐛 Bug Fixes - -- Secrets - -## [3.12.12] - 2023-01-17 - -### 🚀 Features - -- Init h2c (http2/grpc) support -- Http + h2c paralel - -### 🐛 Bug Fixes - -- Build args docker compose -- Grpc - -## [3.12.11] - 2023-01-16 - -### 🐛 Bug Fixes - -- Compose file location -- Docker log sequence -- Delete apps with previews -- Do not cleanup compose applications as unconfigured -- Build env variables with docker compose -- Public gh repo reload compose - -### 💼 Other - -- Trpc -- Trpc -- Trpc -- Trpc -- Trpc -- Trpc -- Trpc - -## [3.12.10] - 2023-01-11 - -### 💼 Other - -- Add missing variables - -## [3.12.9] - 2023-01-11 - -### 🚀 Features - -- Add Openblocks icon -- Adding icon for whoogle -- *(ui)* Add libretranslate service icon -- Handle invite_only plausible analytics - -### 🐛 Bug Fixes - -- Custom gitlab git user -- Add documentation link again -- Remove prefetches -- Doc link -- Temporary disable dns check with dns servers -- Local images for reverting -- Secrets - -## [3.12.8] - 2022-12-27 - -### 🐛 Bug Fixes - -- Parsing secrets -- Read-only permission -- Read-only iam -- $ sign in secrets - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.12.5] - 2022-12-26 - -### 🐛 Bug Fixes - -- Remove unused imports - -### 💼 Other - -- Conditional on environment - -## [3.12.2] - 2022-12-19 - -### 🐛 Bug Fixes - -- Appwrite tmp volume -- Do not replace secret -- Root user for dbs on arm -- Escape secrets -- Escape env vars -- Envs -- Docker buildpack env -- Secrets with newline -- Secrets -- Add default node_env variable -- Add default node_env variable -- Secrets -- Secrets -- Gh actions -- Duplicate env variables -- Cleanupstorage - -### 💼 Other - -- Trpc -- Trpc -- Trpc -- Trpc -- Trpc -- Trpc -- Trpc -- Trpc -- Trpc -- Trpc - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.12.1] - 2022-12-13 - -### 🐛 Bug Fixes - -- Build commands -- Migration file -- Adding missing appwrite volume - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.12.0] - 2022-12-09 - -### 🚀 Features - -- Use registry for building -- Docker registries working -- Custom docker compose file location in repo -- Save doNotTrackData to db -- Add default sentry -- Do not track in settings -- System wide git out of beta -- Custom previewseparator -- Sentry frontend -- Able to host static/php sites on arm -- Save application data before deploying -- SimpleDockerfile deployment -- Able to push image to docker registry -- Revert to remote image -- *(api)* Name label - -### 🐛 Bug Fixes - -- 0 destinations redirect after creation -- Seed -- Sentry dsn update -- Dnt -- Ui -- Only visible with publicrepo -- Migrations -- Prevent webhook errors to be logged -- Login error -- Remove beta from systemwide git -- Git checkout -- Remove sentry before migration -- Webhook previewseparator -- Apache on arm -- Update PR/MRs with new previewSeparator -- Static for arm -- Failed builds should not push images -- Turn off autodeploy for simpledockerfiles -- Security hole -- Rde -- Delete resource on dashboard -- Wrong port in case of docker compose -- Public db icon on dashboard -- Cleanup - -### 💼 Other - -- Pocketbase release - -## [3.11.10] - 2022-11-16 - -### 🚀 Features - -- Only show expose if no proxy conf defined in template -- Custom/private docker registries - -### 🐛 Bug Fixes - -- Local dev api/ws urls -- Wrong template/type -- Gitea icon is svg -- Gh actions -- Gh actions -- Replace $$generate vars -- Webhook traefik -- Exposed ports -- Wrong icons on dashboard -- Escape % in secrets -- Move debug log settings to build logs -- Storage for compose bp + debug on -- Hasura admin secret -- Logs -- Mounts -- Load logs after build failed -- Accept logged and not logged user in /base -- Remote haproxy password/etc -- Remove hardcoded sentry dsn -- Nope in database strings - -### ⚙️ Miscellaneous Tasks - -- Version++ -- Version++ -- Version++ -- Version++ - -## [3.11.9] - 2022-11-15 - -### 🐛 Bug Fixes - -- IsBot issue - -## [3.11.8] - 2022-11-14 - -### 🐛 Bug Fixes - -- Default icon for new services - -## [3.11.1] - 2022-11-08 - -### 🚀 Features - -- Rollback coolify - -### 🐛 Bug Fixes - -- Remove contribution docs -- Umami template -- Compose webhooks fixed -- Variable replacements -- Doc links -- For rollback -- N8n and weblate icon -- Expose ports for services -- Wp + mysql on arm -- Show rollback button loading -- No tags error -- Update on mobile -- Dashboard error -- GetTemplates -- Docker compose persistent volumes -- Application persistent storage things -- Volume names for undefined volume names in compose -- Empty secrets on UI -- Ports for services - -### 💼 Other - -- Secrets on apps -- Fix -- Fixes -- Reload compose loading - -### 🚜 Refactor - -- Code - -### ⚙️ Miscellaneous Tasks - -- Version++ -- Add jda icon for lavalink service -- Version++ - -### ◀️ Revert - -- Revert: revert - -## [3.11.0] - 2022-11-07 - -### 🚀 Features - -- Initial support for specific git commit -- Add default to latest commit and support for gitlab -- Redirect catch-all rule - -### 🐛 Bug Fixes - -- Secret errors -- Service logs -- Heroku bp -- Expose port is readonly on the wrong condition -- Toast -- Traefik proxy q 10s -- App logs view -- Tooltip -- Toast, rde, webhooks -- Pathprefix -- Load public repos -- Webhook simplified -- Remote webhooks -- Previews wbh -- Webhooks -- Websecure redirect -- Wb for previews -- Pr stopps main deployment -- Preview wbh -- Wh catchall for all -- Remove old minio proxies -- Template files -- Compose icon -- Templates -- Confirm restart service -- Template -- Templates -- Templates -- Plausible analytics things -- Appwrite webhook -- Coolify instance proxy -- Migrate template -- Preview webhooks -- Simplify webhooks -- Remove ghost-mariadb from the list -- More simplified webhooks -- Umami + ghost issues - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.10.16] - 2022-10-12 - -### 🐛 Bug Fixes - -- Single container logs and usage with compose - -### 💼 Other - -- New resource label - -## [3.10.15] - 2022-10-12 - -### 🚀 Features - -- Monitoring by container - -### 🐛 Bug Fixes - -- Do not show nope as ip address for dbs -- Add git sha to build args -- Smart search for new services -- Logs for not running containers -- Update docker binaries -- Gh release -- Dev container -- Gitlab auth and compose reload -- Check compose domains in general -- Port required if fqdn is set -- Appwrite v1 missing containers -- Dockerfile -- Pull does not work remotely on huge compose file - -### ⚙️ Miscellaneous Tasks - -- Update staging release - -## [3.10.14] - 2022-10-05 - -### 🚀 Features - -- Docker compose support -- Docker compose -- Docker compose - -### 🐛 Bug Fixes - -- Do not use npx -- Pure docker based development - -### 💼 Other - -- Docker-compose support -- Docker compose -- Remove worker jobs -- One less worker thread - -### 🧪 Testing - -- Remove prisma - -## [3.10.5] - 2022-09-26 - -### 🚀 Features - -- Add migration button to appwrite -- Custom certificate -- Ssl cert on traefik config -- Refresh resource status on dashboard -- Ssl certificate sets custom ssl for applications -- System-wide github apps -- Cleanup unconfigured applications -- Cleanup unconfigured services and databases - -### 🐛 Bug Fixes - -- Ui -- Tooltip -- Dropdown -- Ssl certificate distribution -- Db migration -- Multiplex ssh connections -- Able to search with id -- Not found redirect -- Settings db requests -- Error during saving logs -- Consider base directory in heroku bp -- Basedirectory should be empty if null -- Allow basedirectory for heroku -- Stream logs for heroku bp -- Debug log for bp -- Scp without host verification & cert copy -- Base directory & docker bp -- Laravel php chooser -- Multiplex ssh and ssl copy -- Seed new preview secret types -- Error notification -- Empty preview value -- Error notification -- Seed -- Service logs -- Appwrite function network is not the default -- Logs in docker bp -- Able to delete apps in unconfigured state -- Disable development low disk space -- Only log things to console in dev mode -- Do not get status of more than 10 resources defined by category -- BaseDirectory -- Dashboard statuses -- Default buildImage and baseBuildImage -- Initial deploy status -- Show logs better -- Do not start tcp proxy without main container -- Cleanup stucked tcp proxies -- Default 0 pending invitations -- Handle forked repositories -- Typo -- Pr branches -- Fork pr previews -- Remove unnecessary things -- Meilisearch data dir -- Verify and configure remote docker engines -- Add buildkit features -- Nope if you are not logged in - -### 💼 Other - -- Responsive! -- Fixes -- Fix git icon -- Dropdown as infobox -- Small logs on mobile -- Improvements -- Fix destination view -- Settings view -- More UI improvements -- Fixes -- Fixes -- Fix -- Fixes -- Beta features -- Fix button -- Service fixes -- Fix basedirectory meaning -- Resource button fix -- Main resource search -- Dev logs -- Loading button -- Fix gitlab importer view -- Small fix -- Beta flag -- Hasura console notification -- Fix -- Fix -- Fixes -- Inprogress version of iam -- Fix indicato -- Iam & settings update -- Send 200 for ping and installation wh -- Settings icon - -### ⚙️ Miscellaneous Tasks - -- Version++ -- Version++ -- Version++ -- Version++ -- Version++ -- Version++ -- Version++ - -### ◀️ Revert - -- Show usage everytime - -## [3.10.2] - 2022-09-11 - -### 🚀 Features - -- Add queue reset button -- Previewapplications init -- PreviewApplications finalized -- Fluentbit -- Show remote servers -- *(layout)* Added drawer when user is in mobile -- Re-apply ui improves -- *(ui)* Improve header of pages -- *(styles)* Make header css component -- *(routes)* Improve ui for apps, databases and services logs - -### 🐛 Bug Fixes - -- Changing umami image URL to get latest version -- Gitlab importer for public repos -- Show error logs -- Umami init sql -- Plausible analytics actions -- Login -- Dev url -- UpdateMany build logs -- Fallback to db logs -- Fluentbit configuration -- Coolify update -- Fluentbit and logs -- Canceling build -- Logging -- Load more -- Build logs -- Versions of appwrite -- Appwrite?! -- Get building status -- Await -- Await #2 -- Update PR building status -- Appwrite default version 1.0 -- Undead endpoint does not require JWT -- *(routes)* Improve design of application page -- *(routes)* Improve design of git sources page -- *(routes)* Ui from destinations page -- *(routes)* Ui from databases page -- *(routes)* Ui from databases page -- *(routes)* Ui from databases page -- *(routes)* Ui from services page -- *(routes)* More ui tweaks -- *(routes)* More ui tweaks -- *(routes)* More ui tweaks -- *(routes)* More ui tweaks -- *(routes)* Ui from settings page -- *(routes)* Duplicates classes in services page -- *(routes)* Searchbar ui -- Github conflicts -- *(routes)* More ui tweaks -- *(routes)* More ui tweaks -- *(routes)* More ui tweaks -- *(routes)* More ui tweaks -- Ui with headers -- *(routes)* Header of settings page in databases -- *(routes)* Ui from secrets table - -### 💼 Other - -- Fix plausible -- Fix cleanup button -- Fix buttons - -### ⚙️ Miscellaneous Tasks - -- Version++ -- Minor changes -- Minor changes -- Minor changes -- Whoops - -## [3.10.1] - 2022-09-10 - -### 🐛 Bug Fixes - -- Show restarting apps -- Show restarting application & logs -- Remove unnecessary gitlab group name -- Secrets for PR -- Volumes for services -- Build secrets for apps -- Delete resource use window location - -### 💼 Other - -- Fix button -- Fix follow button -- Arm should be on next all the time - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.10.0] - 2022-09-08 - -### 🚀 Features - -- New servers view - -### 🐛 Bug Fixes - -- Change to execa from utils -- Save search input -- Ispublic status on databases -- Port checkers -- Ui variables -- Glitchtip env to pyhton boolean -- Autoupdater - -### 💼 Other - -- Dashboard updates -- Fix tooltip - -## [3.9.4] - 2022-09-07 - -### 🐛 Bug Fixes - -- DnsServer formatting -- Settings for service - -## [3.9.3] - 2022-09-07 - -### 🐛 Bug Fixes - -- Pr previews - -## [3.9.2] - 2022-09-07 - -### 🚀 Features - -- Add traefik acme json to coolify container -- Database secrets - -### 🐛 Bug Fixes - -- Gitlab webhook -- Use ip address instead of window location -- Use ip instead of window location host -- Service state update -- Add initial DNS servers -- Revert last change with domain check -- Service volume generation -- Minio default env variables -- Add php 8.1/8.2 -- Edgedb ui -- Edgedb stuff -- Edgedb - -### 💼 Other - -- Fix login/register page -- Update devcontainer -- Add debug log -- Fix initial loading icon bg -- Fix loading start/stop db/services -- Dashboard updates and a lot more - -### ⚙️ Miscellaneous Tasks - -- Version++ -- Version++ - -## [3.9.0] - 2022-09-06 - -### 🐛 Bug Fixes - -- Debug api logging + gh actions -- Workdir -- Move restart button to settings - -## [3.9.1-rc.1] - 2022-09-06 - -### 🚀 Features - -- *(routes)* Rework ui from login and register page - -### 🐛 Bug Fixes - -- Ssh pid agent name -- Repository link trim -- Fqdn or expose port required -- Service deploymentEnabled -- Expose port is not required -- Remote verification -- Dockerfile - -### 💼 Other - -- Database_branches -- Login page - -### ⚙️ Miscellaneous Tasks - -- Version++ -- Version++ - -## [3.9.0-rc.1] - 2022-09-02 - -### 🚀 Features - -- New service - weblate -- Restart application -- Show elapsed time on running builds -- Github allow fual branches -- Gitlab dual branch -- Taiga - -### 🐛 Bug Fixes - -- Glitchtip things -- Loading state on start -- Ui -- Submodule -- Gitlab webhooks -- UI + refactor -- Exposedport on save -- Appwrite letsencrypt -- Traefik appwrite -- Traefik -- Finally works! :) -- Rename components + remove PR/MR deployment from public repos -- Settings missing id -- Explainer component -- Database name on logs view -- Taiga - -### 💼 Other - -- Fixes -- Change tooltips and info boxes -- Added rc release - -### 🧪 Testing - -- Native binary target -- Dockerfile - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.8.9] - 2022-08-30 - -### 🐛 Bug Fixes - -- Oh god Prisma - -## [3.8.8] - 2022-08-30 - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.8.6] - 2022-08-30 - -### 🐛 Bug Fixes - -- Pr deployment -- CompareVersions -- Include -- Include -- Gitlab apps - -### 💼 Other - -- Fixes -- Route to the correct path when creating destination from db config - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.8.5] - 2022-08-27 - -### 🐛 Bug Fixes - -- Copy all files during install process -- Typo -- Process -- White labeled icon on navbar -- Whitelabeled icon -- Next/nuxt deployment type -- Again - -## [3.8.4] - 2022-08-27 - -### 🐛 Bug Fixes - -- UI thinkgs -- Delete team while it is active -- Team switching -- Queue cleanup -- Decrypt secrets -- Cleanup build cache as well -- Pr deployments + remove public gits - -### 💼 Other - -- Dashbord fixes -- Fixes - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.8.3] - 2022-08-26 - -### 🐛 Bug Fixes - -- Secrets decryption - -## [3.8.2] - 2022-08-26 - -### 🚀 Features - -- *(ui)* Rework home UI and with responsive design - -### 🐛 Bug Fixes - -- Never stop deplyo queue -- Build queue system -- High cpu usage -- Worker -- Better worker system - -### 💼 Other - -- Dashboard fine-tunes -- Fine-tune -- Fixes -- Fix - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.8.1] - 2022-08-24 - -### 🐛 Bug Fixes - -- Ui buttons -- Clear queue on cancelling jobs -- Cancelling jobs -- Dashboard for admins - -## [3.8.0] - 2022-08-23 - -### 🚀 Features - -- Searxng service - -### 🐛 Bug Fixes - -- Port checker -- Cancel build after 5 seconds -- ExposedPort checker -- Batch secret = -- Dashboard for non-root users -- Stream build logs -- Show build log start/end - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.7.0] - 2022-08-19 - -### 🚀 Features - -- Add GlitchTip service - -### 🐛 Bug Fixes - -- Missing commas -- ExposedPort is just optional - -### ⚙️ Miscellaneous Tasks - -- Add .pnpm-store in .gitignore -- Version++ - -## [3.6.0] - 2022-08-18 - -### 🚀 Features - -- Import public repos (wip) -- Public repo deployment -- Force rebuild + env.PORT for port + public repo build - -### 🐛 Bug Fixes - -- Bots without exposed ports - -### 💼 Other - -- Fixes here and there - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.5.2] - 2022-08-17 - -### 🐛 Bug Fixes - -- Restart containers on-failure instead of always -- Show that Ghost values could be changed - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.5.1] - 2022-08-17 - -### 🐛 Bug Fixes - -- Revert docker compose version to 2.6.1 -- Trim secrets - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.5.0] - 2022-08-17 - -### 🚀 Features - -- Deploy bots (no domains) -- Custom dns servers - -### 🐛 Bug Fixes - -- Dns button ui -- Bot deployments -- Bots -- AutoUpdater & cleanupStorage jobs - -### 💼 Other - -- Typing - -## [3.4.0] - 2022-08-16 - -### 🚀 Features - -- Appwrite service -- Heroku deployments - -### 🐛 Bug Fixes - -- Replace docker compose with docker-compose on CSB -- Dashboard ui -- Create coolify-infra, if it does not exists -- Gitpod conf and heroku buildpacks -- Appwrite -- Autoimport + readme -- Services import -- Heroku icon -- Heroku icon - -## [3.3.4] - 2022-08-15 - -### 🐛 Bug Fixes - -- Make it public button -- Loading indicator - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.3.3] - 2022-08-14 - -### 🐛 Bug Fixes - -- Decryption errors -- Postgresql on ARM - -## [3.3.2] - 2022-08-12 - -### 🐛 Bug Fixes - -- Debounce dashboard status requests - -### 💼 Other - -- Fider - -## [3.3.1] - 2022-08-12 - -### 🐛 Bug Fixes - -- Empty buildpack icons - -## [3.2.3] - 2022-08-12 - -### 🚀 Features - -- Databases on ARM -- Mongodb arm support -- New dashboard - -### 🐛 Bug Fixes - -- Cleanup stucked prisma-engines -- Toast -- Secrets -- Cleanup prisma engine if there is more than 1 -- !isARM to isARM -- Enterprise GH link - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.2.2] - 2022-08-11 - -### 🐛 Bug Fixes - -- Coolify-network on verification - -## [3.2.1] - 2022-08-11 - -### 🚀 Features - -- Init heroku buildpacks - -### 🐛 Bug Fixes - -- Follow/cancel buttons -- Only remove coolify managed containers -- White-labeled env -- Schema - -### 💼 Other - -- Fix - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.2.0] - 2022-08-11 - -### 🚀 Features - -- Persistent storage for all services -- Cleanup clickhouse db - -### 🐛 Bug Fixes - -- Rde local ports -- Empty remote destinations could be removed -- Tips -- Lowercase issues fider -- Tooltip colors -- Update clickhouse configuration -- Cleanup command -- Enterprise Github instance endpoint - -### 💼 Other - -- Local ssh port -- Redesign a lot -- Fixes -- Loading indicator for plausible buttons - -## [3.1.4] - 2022-08-01 - -### 🚀 Features - -- Moodle init -- Remote docker engine init -- Working on remote docker engine -- Rde -- Remote docker engine -- Ipv4 and ipv6 -- Contributors -- Add arch to database -- Stop preview deployment - -### 🐛 Bug Fixes - -- Settings from api -- Selectable destinations -- Gitpod hardcodes -- Typo -- Typo -- Expose port checker -- States and exposed ports -- CleanupStorage -- Remote traefik webhook -- Remote engine ip address -- RemoteipAddress -- Explanation for remote engine url -- Tcp proxy -- Lol -- Webhook -- Dns check for rde -- Gitpod -- Revert last commit -- Dns check -- Dns checker -- Webhook -- Df and more debug -- Webhooks -- Load previews async -- Destination icon -- Pr webhook -- Cache image -- No ssh key found -- Prisma migration + update of docker and stuffs -- Ui -- Ui -- Only 1 ssh-agent is needed -- Reuse ssh connection -- Ssh tunnel -- Dns checking -- Fider BASE_URL set correctly - -### 💼 Other - -- Error message https://github.com/coollabsio/coolify/issues/502 -- Changes -- Settings -- For removing app - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.1.3] - 2022-07-18 - -### 🚀 Features - -- Init moodle and separate stuffs to shared package - -### 🐛 Bug Fixes - -- More types for API -- More types -- Do not rebuild in case image exists and sha not changed -- Gitpod urls -- Remove new service start process -- Remove shared dir, deployment does not work -- Gitlab custom url -- Location url for services and apps - -## [3.1.2] - 2022-07-14 - -### 🐛 Bug Fixes - -- Admin password reset should not timeout -- Message for double branches -- Turn off autodeploy if double branch is configured - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.1.1] - 2022-07-13 - -### 🚀 Features - -- Gitpod integration - -### 🐛 Bug Fixes - -- Cleanup less often and can do it manually - -### ⚙️ Miscellaneous Tasks - -- Version++ -- Version++ - -## [3.1.0] - 2022-07-12 - -### 🚀 Features - -- Ability to change deployment type for nextjs -- Ability to change deployment type for nuxtjs -- Gitpod ready code(almost) -- Add Docker buildpack exposed port setting -- Custom port for git instances - -### 🐛 Bug Fixes - -- GitLab pagination load data -- Service domain checker -- Wp missing ftp solution -- Ftp WP issues -- Ftp?! -- Gitpod updates -- Gitpod -- Gitpod -- Wordpress FTP permission issues -- GitLab search fields -- GitHub App button -- GitLab loop on misconfigured source -- Gitpod - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [3.0.3] - 2022-07-06 - -### 🐛 Bug Fixes - -- Domain check -- Domain check -- TrustProxy for Fastify -- Hostname issue - -## [3.0.2] - 2022-07-06 - -### 🐛 Bug Fixes - -- New destination can be created -- Include post -- New destinations - -## [3.0.1] - 2022-07-06 - -### 🐛 Bug Fixes - -- Seeding -- Forgot that the version bump changed 😅 - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.9.11] - 2022-06-20 - -### 🐛 Bug Fixes - -- Be able to change database + service versions -- Lock file - -## [2.9.10] - 2022-06-17 - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.9.9] - 2022-06-10 - -### 🐛 Bug Fixes - -- Host and reload for uvicorn -- Remove package-lock - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.9.8] - 2022-06-10 - -### 🐛 Bug Fixes - -- Persistent nocodb -- Nocodb persistency - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.9.7] - 2022-06-09 - -### 🐛 Bug Fixes - -- Plausible custom script -- Plausible script and middlewares -- Remove console log -- Remove comments -- Traefik middleware - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.9.6] - 2022-06-02 - -### 🐛 Bug Fixes - -- Fider changed an env variable name -- Pnpm command - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.9.5] - 2022-06-02 - -### 🐛 Bug Fixes - -- Proxy stop missing argument - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.9.4] - 2022-06-01 - -### 🐛 Bug Fixes - -- Demo version forms -- Typo -- Revert gh and gl cloning - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.9.3] - 2022-05-31 - -### 🐛 Bug Fixes - -- Recurisve clone instead of submodule -- Versions -- Only reconfigure coolify proxy if its missconfigured - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.9.2] - 2022-05-31 - -### 🐛 Bug Fixes - -- TrustProxy -- Force restart proxy -- Only restart coolify proxy in case of version prior to 2.9.2 -- Force restart proxy on seeding -- Add GIT ENV variable for submodules - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.9.1] - 2022-05-31 - -### 🐛 Bug Fixes - -- GitHub fixes - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.9.0] - 2022-05-31 - -### 🚀 Features - -- PageLoader -- Database + service usage - -### 🐛 Bug Fixes - -- Service checks -- Remove console.log -- Traefik -- Remove debug things -- WIP Traefik -- Proxy for http -- PR deployments view -- Minio urls + domain checks -- Remove gh token on git source changes -- Do not fetch app state in case of missconfiguration -- Demo instance save domain instantly -- Instant save on demo instance -- New source canceled view -- Lint errors in database services -- Otherfqdns -- Host key verification -- Ftp connection - -### 💼 Other - -- Appwrite -- Testing WS -- Traefik?! -- Traefik -- Traefik -- Traefik migration -- Traefik -- Traefik -- Traefik -- Notifications and application usage -- *(fix)* Traefik -- Css - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.8.2] - 2022-05-16 - -### 🐛 Bug Fixes - -- Gastby buildpack - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.8.1] - 2022-05-10 - -### 🐛 Bug Fixes - -- WP custom db -- UI - -## [2.6.1] - 2022-05-03 - -### 🚀 Features - -- Basic server usage on dashboard -- Show usage trends -- Usage on dashboard -- Custom script path for Plausible -- WP could have custom db -- Python image selection - -### 🐛 Bug Fixes - -- ExposedPorts -- Logos for dbs -- Do not run SSL renew in development -- Check domain for coolify before saving -- Remove debug info -- Cancel jobs -- Cancel old builds in database -- Better DNS check to prevent errors -- Check DNS in prod only -- DNS check -- Disable sentry for now -- Cancel -- Sentry -- No image for Docker buildpack -- Default packagemanager -- Server usage only shown for root team -- Expose ports for services -- UI -- Navbar UI -- UI -- UI -- Remove RC python -- UI -- UI -- UI -- Default Python package - -### ⚙️ Miscellaneous Tasks - -- Version++ -- Version++ -- Version++ -- Version++ - -## [2.6.0] - 2022-05-02 - -### 🚀 Features - -- Hasura as a service -- Gzip compression -- Laravel buildpack is working! -- Laravel -- Fider service -- Database and services logs -- DNS check settings for SSL generation -- Cancel builds! - -### 🐛 Bug Fixes - -- Unami svg size -- Team switching moved to IAM menu -- Always use IP address for webhooks -- Remove unnecessary test endpoint -- UI -- Migration -- Fider envs -- Checking low disk space -- Build image -- Update autoupdate env variable -- Renew certificates -- Webhook build images -- Missing node versions - -### 💼 Other - -- Laravel - -## [2.4.11] - 2022-04-20 - -### 🚀 Features - -- Deno DB migration -- Show exited containers on UI & better UX -- Query container state periodically -- Install svelte-18n and init setup -- Umami service -- Coolify auto-updater -- Autoupdater -- Select base image for buildpacks - -### 🐛 Bug Fixes - -- Deno configurations -- Text on deno buildpack -- Correct branch shown in build logs -- Vscode permission fix -- I18n -- Locales -- Application logs is not reversed and queried better -- Do not activate i18n for now -- GitHub token cleanup on team switch -- No logs found -- Code cleanups -- Reactivate posgtres password -- Contribution guide -- Simplify list services -- Contribution -- Contribution guide -- Contribution guide -- Packagemanager finder - -### 💼 Other - -- Umami service -- Base image selector - -### 📚 Documentation - -- How to add new services -- Update -- Update - -### ⚙️ Miscellaneous Tasks - -- Version++ -- Version++ -- Version++ - -## [2.4.10] - 2022-04-17 - -### 🚀 Features - -- Add persistent storage for services -- Multiply dockerfile locations for docker buildpack -- Testing fluentd logging driver -- Fluentbit investigation -- Initial deno support - -### 🐛 Bug Fixes - -- Switch from bitnami/redis to normal redis -- Use redis-alpine -- Wordpress extra config -- Stop sFTP connection on wp stop -- Change user's id in sftp wp instance -- Use arm based certbot on arm -- Buildlog line number is not string -- Application logs paginated -- Switch to stream on applications logs -- Scroll to top for logs -- Pull new images for services all the time it's started. -- White-labeled custom logo -- Application logs - -### 💼 Other - -- Show extraconfig if wp is running - -### ⚙️ Miscellaneous Tasks - -- Version++ -- Version++ - -## [2.4.9] - 2022-04-14 - -### 🐛 Bug Fixes - -- Postgres root pw is pw field -- Teams view -- Improved tcp proxy monitoring for databases/ftp -- Add HTTP proxy checks -- Loading of new destinations -- Better performance for cleanup images -- Remove proxy container in case of dependent container is down -- Restart local docker coolify proxy in case of something happens to it -- Id of service container - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.4.8] - 2022-04-13 - -### 🐛 Bug Fixes - -- Register should happen if coolify proxy cannot be started -- GitLab typo -- Remove system wide pw reset - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.4.7] - 2022-04-13 - -### 🐛 Bug Fixes - -- Destinations to HAProxy - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.4.6] - 2022-04-13 - -### 🐛 Bug Fixes - -- Cleanup images older than a day -- Meilisearch service -- Load all branches, not just the first 30 -- ProjectID for Github -- DNS check before creating SSL cert -- Try catch me -- Restart policy for resources -- No permission on first registration -- Reverting postgres password for now - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.4.5] - 2022-04-12 - -### 🐛 Bug Fixes - -- Types -- Invitations -- Timeout values - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.4.4] - 2022-04-12 - -### 🐛 Bug Fixes - -- Haproxy build stuffs -- Proxy - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.4.3] - 2022-04-12 - -### 🐛 Bug Fixes - -- Remove unnecessary save button haha -- Update dockerfile - -### ⚙️ Miscellaneous Tasks - -- Update packages -- Version++ -- Update build scripts -- Update build packages - -## [2.4.2] - 2022-04-09 - -### 🐛 Bug Fixes - -- Missing install repositories GitHub -- Return own and other sources better -- Show config missing on sources - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.4.1] - 2022-04-09 - -### 🐛 Bug Fixes - -- Enable https for Ghost -- Postgres root passwor shown and set -- Able to change postgres user password from ui -- DB Connecting string generator - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.4.0] - 2022-04-08 - -### 🚀 Features - -- Wordpress on-demand SFTP -- Finalize on-demand sftp for wp -- PHP Composer support -- Working on-demand sftp to wp data -- Admin team sees everything -- Able to change service version/tag -- Basic white labeled version -- Able to modify database passwords - -### 🐛 Bug Fixes - -- Add openssl to image -- Permission issues -- On-demand sFTP for wp -- Fix for fix haha -- Do not pull latest image -- Updated db versions -- Only show proxy for admin team -- Team view for root team -- Do not trigger >1 webhooks on GitLab -- Possible fix for spikes in CPU usage -- Last commit -- Www or not-www, that's the question -- Fix for the fix that fixes the fix -- Ton of updates for users/teams -- Small typo -- Unique storage paths -- Self-hosted GitLab URL -- No line during buildLog -- Html/apiUrls cannot end with / -- Typo -- Missing buildpack - -### 💼 Other - -- Fix -- Better layout for root team -- Fix -- Fixes -- Fix -- Fix -- Fix -- Fix -- Fix -- Fix -- Fix -- Insane amount -- Fix -- Fixes -- Fixes -- Fix -- Fixes -- Fixes - -### 📚 Documentation - -- Contribution guide - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.3.3] - 2022-04-05 - -### 🐛 Bug Fixes - -- Add git lfs while deploying -- Try to update build status several times -- Update stucked builds -- Update stucked builds on startup -- Revert seed -- Lame fixing -- Remove asyncUntil - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.3.2] - 2022-04-04 - -### 🐛 Bug Fixes - -- *(php)* If .htaccess file found use apache -- Add default webhook domain for n8n - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.3.1] - 2022-04-04 - -### 🐛 Bug Fixes - -- Secrets build/runtime coudl be changed after save -- Default configuration - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.3.0] - 2022-04-04 - -### 🚀 Features - -- Initial python support -- Add loading on register button -- *(dev)* Allow windows users to use pnpm dev -- MeiliSearch service -- Add abilitry to paste env files - -### 🐛 Bug Fixes - -- Ignore coolify proxy error for now -- Python no wsgi -- If user not found -- Rename envs to secrets -- Infinite loop on www domains -- No need to paste clear text env for previews -- Build log fix attempt #1 -- Small UI fix on logs -- Lets await! -- Async progress -- Remove console.log -- Build log -- UI -- Gitlab & Github urls - -### 💼 Other - -- Improvements - -### ⚙️ Miscellaneous Tasks - -- Version++ -- Version++ -- Lock file + fix packages - -## [2.2.7] - 2022-04-01 - -### 🐛 Bug Fixes - -- Haproxy errors -- Build variables -- Use NodeJS for sveltekit for now - -## [2.2.6] - 2022-03-31 - -### 🐛 Bug Fixes - -- Add PROTO headers - -## [2.2.5] - 2022-03-31 - -### 🐛 Bug Fixes - -- Registration enabled/disabled - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.2.4] - 2022-03-31 - -### 🐛 Bug Fixes - -- Gitlab repo url -- No need to dashify anymore - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.2.3] - 2022-03-31 - -### 🐛 Bug Fixes - -- List ghost services -- Reload window on settings saved -- Persistent storage on webhooks -- Add license -- Space in repo names - -### ⚙️ Miscellaneous Tasks - -- Version++ -- Version++ -- Version++ -- Fixed typo on New Git Source view - -## [2.2.0] - 2022-03-27 - -### 🚀 Features - -- Add n8n.io service -- Add update kuma service -- Ghost service - -### 🐛 Bug Fixes - -- Ghost logo size -- Ghost icon, remove console.log - -### 💼 Other - -- Colors on svelte-select - -### ⚙️ Miscellaneous Tasks - -- Version ++ - -## [2.1.1] - 2022-03-25 - -### 🐛 Bug Fixes - -- Cleanup only 2 hours+ old images - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.1.0] - 2022-03-23 - -### 🚀 Features - -- Use compose instead of normal docker cmd -- Be able to redeploy PRs - -### 🐛 Bug Fixes - -- Skip ssl cert in case of error -- Volumes - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.0.31] - 2022-03-20 - -### 🚀 Features - -- Add PHP modules - -### 🐛 Bug Fixes - -- Cleanup old builds -- Only cleanup same app -- Add nginx + htaccess files - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.0.30] - 2022-03-19 - -### 🐛 Bug Fixes - -- No cookie found -- Missing session data -- No error if GitSource is missing -- No webhook secret found? -- Basedir for dockerfiles -- Better queue system + more support on monorepos -- Remove build logs in case of app removed - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.0.29] - 2022-03-11 - -### 🚀 Features - -- Webhooks inititate all applications with the correct branch -- Check ssl for new apps/services first -- Autodeploy pause -- Install pnpm into docker image if pnpm lock file is used - -### 🐛 Bug Fixes - -- Personal Gitlab repos -- Autodeploy true by default for GH repos - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.0.28] - 2022-03-04 - -### 🚀 Features - -- Service secrets - -### 🐛 Bug Fixes - -- Do not error if proxy is not running - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.0.27] - 2022-03-02 - -### 🚀 Features - -- Send version with update request - -### 🐛 Bug Fixes - -- Check when a container is running -- Reload haproxy if new cert is added -- Cleanup coolify images -- Application state in UI - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.0.26] - 2022-03-02 - -### 🐛 Bug Fixes - -- Update process - -## [2.0.25] - 2022-03-02 - -### 🚀 Features - -- Languagetool service - -### 🐛 Bug Fixes - -- Reload proxy on ssl cert -- Volume name - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.0.24] - 2022-03-02 - -### 🐛 Bug Fixes - -- Better proxy check -- Ssl + sslrenew -- Null proxyhash on restart -- Reconfigure proxy on restart -- Update process - -## [2.0.23] - 2022-02-28 - -### 🐛 Bug Fixes - -- Be sure .env exists -- Missing fqdn for services -- Default npm command -- Add coolify-image label for build images -- Cleanup old images, > 3 days - -### 💼 Other - -- Colorful states -- Application start - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.0.22] - 2022-02-27 - -### 🐛 Bug Fixes - -- Coolify image pulls -- Remove wrong/stuck proxy configurations -- Always use a buildpack -- Add icons for eleventy + astro -- Fix proxy every 10 secs -- Do not remove coolify proxy -- Update version - -### 💼 Other - -- Remote docker engine - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.0.21] - 2022-02-24 - -### 🚀 Features - -- Random subdomain for demo -- Random domain for services -- Astro buildpack -- 11ty buildpack -- Registration page - -### 🐛 Bug Fixes - -- Http for demo, oops -- Docker scanner -- Improvement on image pulls - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.0.20] - 2022-02-23 - -### 🐛 Bug Fixes - -- Revert default network - -### 💼 Other - -- Dns check - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.0.19] - 2022-02-23 - -### 🐛 Bug Fixes - -- Random network name for demo -- Settings fqdn grr - -## [2.0.18] - 2022-02-22 - -### 🚀 Features - -- Ports range - -### 🐛 Bug Fixes - -- Email is lowercased in login -- Lowercase email everywhere -- Use normal docker-compose in dev - -### 💼 Other - -- Make copy/password visible - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.0.17] - 2022-02-21 - -### 🐛 Bug Fixes - -- Move tokens from session to cookie/store - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.0.14] - 2022-02-18 - -### 🚀 Features - -- Basic password reset form -- Scan for lock files and set right commands -- Public port range (WIP) - -### 🐛 Bug Fixes - -- SSL app off -- Local docker host -- Typo -- Lets encrypt -- Remove SSL with stop -- SSL off for services -- Grr -- Running state css -- Minor fixes -- Remove force SSL when doing let's encrypt request -- GhToken in session now -- Random port for certbot -- Follow icon -- Plausible volume fixed -- Database connection strings -- Gitlab webhooks fixed -- If DNS not found, do not redirect -- Github token - -### ⚙️ Miscellaneous Tasks - -- Version++ -- Version ++ - -## [2.0.13] - 2022-02-17 - -### 🐛 Bug Fixes - -- Login issues - -## [2.0.11] - 2022-02-15 - -### 🚀 Features - -- Follow logs -- Generate www & non-www SSL certs - -### 🐛 Bug Fixes - -- Window error in SSR -- GitHub sync PR's -- Load more button -- Small fixes -- Typo -- Error with follow logs -- IsDomainConfigured -- TransactionIds -- Coolify image cleanup -- Cleanup every 10 mins -- Cleanup images -- Add no user redis to uri -- Secure cookie disabled by default -- Buggy svelte-kit-cookie-session - -### 💼 Other - -- Only allow cleanup in production - -### ⚙️ Miscellaneous Tasks - -- Version++ -- Version++ - -## [2.0.10] - 2022-02-15 - -### 🐛 Bug Fixes - -- Typo -- Error handling -- Stopping service without proxy -- Coolify proxy start - -### ⚙️ Miscellaneous Tasks - -- Version++ - -## [2.0.8] - 2022-02-14 - -### 🐛 Bug Fixes - -- Validate secrets -- Truncate git clone errors -- Branch used does not throw error - -## [2.0.7] - 2022-02-13 - -### 🚀 Features - -- Www <-> non-www redirection for apps -- Www <-> non-www redirection - -### 🐛 Bug Fixes - -- Package.json -- Build secrets should be visible in runtime -- New secret should have default values - -## [2.0.5] - 2022-02-11 - -### 🚀 Features - -- VaultWarden service - -### 🐛 Bug Fixes - -- PreventDefault on a button, thats all -- Haproxy check should not throw error -- Delete all build files -- Cleanup images -- More error handling in proxy configuration + cleanups -- Local static assets -- Check sentry -- Typo - -### ⚙️ Miscellaneous Tasks - -- Version -- Version - -## [2.0.4] - 2022-02-11 - -### 🚀 Features - -- Use tags in update -- New update process (#115) - -### 🐛 Bug Fixes - -- Docker Engine bug related to live-restore and IPs -- Version - -## [2.0.3] - 2022-02-10 - -### 🐛 Bug Fixes - -- Capture non-error as error -- Only delete id.rsa in case of it exists -- Status is not available yet - -### ⚙️ Miscellaneous Tasks - -- Version bump - -## [2.0.2] - 2022-02-10 - -### 🐛 Bug Fixes - -- Secrets join -- ENV variables set differently - - diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 246e0dae54..0000000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,94 +0,0 @@ -# Citizen Code of Conduct - -## 1. Purpose - -A primary goal of Coolify is to be inclusive to the largest number of contributors, with the most varied and diverse backgrounds possible. As such, we are committed to providing a friendly, safe and welcoming environment for all, regardless of gender, sexual orientation, ability, ethnicity, socioeconomic status, and religion (or lack thereof). - -This code of conduct outlines our expectations for all those who participate in our community, as well as the consequences for unacceptable behavior. - -We invite all those who participate in Coolify to help us create safe and positive experiences for everyone. - -## 2. Open [Source/Culture/Tech] Citizenship - -A supplemental goal of this Code of Conduct is to increase open [source/culture/tech] citizenship by encouraging participants to recognize and strengthen the relationships between our actions and their effects on our community. - -Communities mirror the societies in which they exist and positive action is essential to counteract the many forms of inequality and abuses of power that exist in society. - -If you see someone who is making an extra effort to ensure our community is welcoming, friendly, and encourages all participants to contribute to the fullest extent, we want to know. - -## 3. Expected Behavior - -The following behaviors are expected and requested of all community members: - - * Participate in an authentic and active way. In doing so, you contribute to the health and longevity of this community. - * Exercise consideration and respect in your speech and actions. - * Attempt collaboration before conflict. - * Refrain from demeaning, discriminatory, or harassing behavior and speech. - * Be mindful of your surroundings and of your fellow participants. Alert community leaders if you notice a dangerous situation, someone in distress, or violations of this Code of Conduct, even if they seem inconsequential. - * Remember that community event venues may be shared with members of the public; please be respectful to all patrons of these locations. - -## 4. Unacceptable Behavior - -The following behaviors are considered harassment and are unacceptable within our community: - - * Violence, threats of violence or violent language directed against another person. - * Sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory jokes and language. - * Posting or displaying sexually explicit or violent material. - * Posting or threatening to post other people's personally identifying information ("doxing"). - * Personal insults, particularly those related to gender, sexual orientation, race, religion, or disability. - * Inappropriate photography or recording. - * Inappropriate physical contact. You should have someone's consent before touching them. - * Unwelcome sexual attention. This includes, sexualized comments or jokes; inappropriate touching, groping, and unwelcomed sexual advances. - * Deliberate intimidation, stalking or following (online or in person). - * Advocating for, or encouraging, any of the above behavior. - * Sustained disruption of community events, including talks and presentations. - -## 5. Weapons Policy - -No weapons will be allowed at Coolify events, community spaces, or in other spaces covered by the scope of this Code of Conduct. Weapons include but are not limited to guns, explosives (including fireworks), and large knives such as those used for hunting or display, as well as any other item used for the purpose of causing injury or harm to others. Anyone seen in possession of one of these items will be asked to leave immediately, and will only be allowed to return without the weapon. Community members are further expected to comply with all state and local laws on this matter. - -## 6. Consequences of Unacceptable Behavior - -Unacceptable behavior from any community member, including sponsors and those with decision-making authority, will not be tolerated. - -Anyone asked to stop unacceptable behavior is expected to comply immediately. - -If a community member engages in unacceptable behavior, the community organizers may take any action they deem appropriate, up to and including a temporary ban or permanent expulsion from the community without warning (and without refund in the case of a paid event). - -## 7. Reporting Guidelines - -If you are subject to or witness unacceptable behavior, or have any other concerns, please notify a community organizer as soon as possible. hi@coollabs.io. - - - -Additionally, community organizers are available to help community members engage with local law enforcement or to otherwise help those experiencing unacceptable behavior feel safe. In the context of in-person events, organizers will also provide escorts as desired by the person experiencing distress. - -## 8. Addressing Grievances - -If you feel you have been falsely or unfairly accused of violating this Code of Conduct, you should notify coollabsio with a concise description of your grievance. Your grievance will be handled in accordance with our existing governing policies. - - - -## 9. Scope - -We expect all community participants (contributors, paid or otherwise; sponsors; and other guests) to abide by this Code of Conduct in all community venues--online and in-person--as well as in all one-on-one communications pertaining to community business. - -This code of conduct and its related procedures also applies to unacceptable behavior occurring outside the scope of community activities when such behavior has the potential to adversely affect the safety and well-being of community members. - -## 10. Contact info - -hi@coollabs.io - -## 11. License and attribution - -The Citizen Code of Conduct is distributed by [Stumptown Syndicate](http://stumptownsyndicate.org) under a [Creative Commons Attribution-ShareAlike license](http://creativecommons.org/licenses/by-sa/3.0/). - -Portions of text derived from the [Django Code of Conduct](https://www.djangoproject.com/conduct/) and the [Geek Feminism Anti-Harassment Policy](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy). - -_Revision 2.3. Posted 6 March 2017._ - -_Revision 2.2. Posted 4 February 2016._ - -_Revision 2.1. Posted 23 June 2014._ - -_Revision 2.0, adopted by the [Stumptown Syndicate](http://stumptownsyndicate.org) board on 10 January 2013. Posted 17 March 2013._ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index dba3676cfb..0000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,245 +0,0 @@ -# Contributing to Coolify - -> "First, thanks for considering contributing to my project. It really means a lot!" - [@andrasbacsai](https://github.com/andrasbacsai) - -You can ask for guidance anytime on our [Discord server](https://coollabs.io/discord) in the `#contribute` channel. - -To understand the tech stack, please refer to the [Tech Stack](TECH_STACK.md) document. - -## Table of Contents - -1. [Setup Development Environment](#1-setup-development-environment) -2. [Verify Installation](#2-verify-installation-optional) -3. [Fork and Setup Local Repository](#3-fork-and-setup-local-repository) -4. [Set up Environment Variables](#4-set-up-environment-variables) -5. [Start Coolify](#5-start-coolify) -6. [Start Development](#6-start-development) -7. [Create a Pull Request](#7-create-a-pull-request) -8. [Development Notes](#development-notes) -9. [Resetting Development Environment](#resetting-development-environment) -10. [Additional Contribution Guidelines](#additional-contribution-guidelines) - -## 1. Setup Development Environment - -Follow the steps below for your operating system: - -
-Windows - -1. Install `docker-ce`, Docker Desktop (or similar): - - Docker CE (recommended): - - Install Windows Subsystem for Linux v2 (WSL2) by following this guide: [Install WSL](https://learn.microsoft.com/en-us/windows/wsl/install?ref=coolify) - - After installing WSL2, install Docker CE for your Linux distribution by following this guide: [Install Docker Engine](https://docs.docker.com/engine/install/?ref=coolify) - - Make sure to choose the appropriate Linux distribution (e.g., Ubuntu) when following the Docker installation guide - - Install Docker Desktop (easier): - - Download and install [Docker Desktop for Windows](https://docs.docker.com/desktop/install/windows-install/?ref=coolify) - - Ensure WSL2 backend is enabled in Docker Desktop settings - -2. Install Spin: - - Follow the instructions to install Spin on Windows from the [Spin documentation](https://serversideup.net/open-source/spin/docs/installation/install-windows#download-and-install-spin-into-wsl2?ref=coolify) - -
- -
-MacOS - -1. Install Orbstack, Docker Desktop (or similar): - - Orbstack (recommended, as it is a faster and lighter alternative to Docker Desktop): - - Download and install [Orbstack](https://docs.orbstack.dev/quick-start#installation?ref=coolify) - - Docker Desktop: - - Download and install [Docker Desktop for Mac](https://docs.docker.com/desktop/install/mac-install/?ref=coolify) - -2. Install Spin: - - Follow the instructions to install Spin on MacOS from the [Spin documentation](https://serversideup.net/open-source/spin/docs/installation/install-macos/#download-and-install-spin?ref=coolify) - -
- -
-Linux - -1. Install Docker Engine, Docker Desktop (or similar): - - Docker Engine (recommended, as there is no VM overhead): - - Follow the official [Docker Engine installation guide](https://docs.docker.com/engine/install/?ref=coolify) for your Linux distribution - - Docker Desktop: - - If you want a GUI, you can use [Docker Desktop for Linux](https://docs.docker.com/desktop/install/linux-install/?ref=coolify) - -2. Install Spin: - - Follow the instructions to install Spin on Linux from the [Spin documentation](https://serversideup.net/open-source/spin/docs/installation/install-linux#configure-docker-permissions?ref=coolify) - -
- -## 2. Verify Installation (Optional) - -After installing Docker (or Orbstack) and Spin, verify the installation: - -1. Open a terminal or command prompt -2. Run the following commands: - ```bash - docker --version - spin --version - ``` - You should see version information for both Docker and Spin. - -## 3. Fork and Setup Local Repository - -1. Fork the [Coolify](https://github.com/coollabsio/coolify) repository to your GitHub account. - -2. Install a code editor on your machine (choose one): - - | Editor | Platform | Download Link | - |--------|----------|---------------| - | Visual Studio Code (recommended free) | Windows/macOS/Linux | [Download](https://code.visualstudio.com/download?ref=coolify) | - | Cursor (recommended but paid) | Windows/macOS/Linux | [Download](https://www.cursor.com/?ref=coolify) | - | Zed (very fast) | macOS/Linux | [Download](https://zed.dev/download?ref=coolify) | - -3. Clone the Coolify Repository from your fork to your local machine - - Use `git clone` in the command line, or - - Use GitHub Desktop (recommended): - - Download and install from [https://desktop.github.com/](https://desktop.github.com/?ref=coolify) - - Open GitHub Desktop and login with your GitHub account - - Click on `File` -> `Clone Repository` select `github.com` as the repository location, then select your forked Coolify repository, choose the local path and then click `Clone` - -4. Open the cloned Coolify Repository in your chosen code editor. - -## 4. Set up Environment Variables - -1. In the Code Editor, locate the `.env.development.example` file in the root directory of your local Coolify repository. -2. Duplicate the `.env.development.example` file and rename the copy to `.env`. -3. Open the new `.env` file and review its contents. Adjust any environment variables as needed for your development setup. -4. If you encounter errors during database migrations, update the database connection settings in your `.env` file. Use the IP address or hostname of your PostgreSQL database container. You can find this information by running `docker ps` after executing `spin up`. -5. Save the changes to your `.env` file. - -## 5. Start Coolify - -1. Open a terminal in the local Coolify directory. -2. Run the following command in the terminal (leave that terminal open): - ```bash - spin up - ``` - -> [!NOTE] -> You may see some errors, but don't worry; this is expected. - -3. If you encounter permission errors, especially on macOS, use: - ```bash - sudo spin up - ``` - -> [!NOTE] -> If you change environment variables afterwards or anything seems broken, press Ctrl + C to stop the process and run `spin up` again. - -## 6. Start Development - -1. Access your Coolify instance: - - URL: `http://localhost:8000` - - Login: `test@example.com` - - Password: `password` - -2. Additional development tools: - | Tool | URL | Note | - |------|-----|------| - | Laravel Horizon (scheduler) | `http://localhost:8000/horizon` | Only accessible when logged in as root user | - | Mailpit (email catcher) | `http://localhost:8025` | | - | Telescope (debugging tool) | `http://localhost:8000/telescope` | Disabled by default | - -> [!NOTE] -> To enable Telescope, add the following to your `.env` file: -> ```env -> TELESCOPE_ENABLED=true -> ``` - -## 7. Create a Pull Request - -1. After making changes or adding a new service: - - Commit your changes to your forked repository. - - Push the changes to your GitHub account. - -2. Creating the Pull Request (PR): - - Navigate to the main Coolify repository on GitHub. - - Click the "Pull requests" tab. - - Click the green "New pull request" button. - - Choose your fork and branch as the compare branch. - - Click "Create pull request". - -3. Filling out the PR details: - - Give your PR a descriptive title. - - Use the Pull Request Template provided and fill in the details. - -> [!IMPORTANT] -> Always set the base branch for your PR to the `next` branch of the Coolify repository, not the `main` branch. - -4. Submit your PR: - - Review your changes one last time. - - Click "Create pull request" to submit. - -> [!NOTE] -> Make sure your PR is out of draft mode as soon as it's ready for review. PRs that are in draft mode for a long time may be closed by maintainers. - -After submission, maintainers will review your PR and may request changes or provide feedback. - -## Development Notes - -When working on Coolify, keep the following in mind: - -1. **Database Migrations**: After switching branches or making changes to the database structure, always run migrations: - ```bash - docker exec -it coolify php artisan migrate - ``` - -2. **Resetting Development Setup**: To reset your development setup to a clean database with default values: - ```bash - docker exec -it coolify php artisan migrate:fresh --seed - ``` - -3. **Troubleshooting**: If you encounter unexpected behavior, ensure your database is up-to-date with the latest migrations and if possible reset the development setup to eliminate any environment-specific issues. - -> [!IMPORTANT] -> Forgetting to migrate the database can cause problems, so make it a habit to run migrations after pulling changes or switching branches. - -## Resetting Development Environment - -If you encounter issues or break your database or something else, follow these steps to start from a clean slate (works since `v4.0.0-beta.342`): - -1. Stop all running containers `ctrl + c`. - -2. Remove all Coolify containers: - ```bash - docker rm coolify coolify-db coolify-redis coolify-realtime coolify-testing-host coolify-minio coolify-vite-1 coolify-mail - ``` - -3. Remove Coolify volumes (it is possible that the volumes have no `coolify` prefix on your machine, in that case remove the prefix from the command): - ```bash - docker volume rm coolify_dev_backups_data coolify_dev_postgres_data coolify_dev_redis_data coolify_dev_coolify_data coolify_dev_minio_data - ``` - -4. Remove unused images: - ```bash - docker image prune -a - ``` - -5. Start Coolify again: - ```bash - spin up - ``` - -6. Run database migrations and seeders: - ```bash - docker exec -it coolify php artisan migrate:fresh --seed - ``` - -After completing these steps, you'll have a fresh development setup. - -> [!IMPORTANT] -> Always run database migrations and seeders after switching branches or pulling updates to ensure your local database structure matches the current codebase and includes necessary seed data. - -## Additional Contribution Guidelines - -### Contributing a New Service - -To add a new service to Coolify, please refer to our documentation: -[Adding a New Service](https://coolify.io/docs/knowledge-base/contribute/service) - -### Contributing to Documentation - -To contribute to the Coolify documentation, please refer to this guide: -[Contributing to the Coolify Documentation](https://github.com/coollabsio/documentation-coolify/blob/main/CONTRIBUTING.md) diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 86c87eba2d..0000000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [2022] [Andras Bacsai] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md index 8670e9c76c..4fafb32cea 100644 --- a/README.md +++ b/README.md @@ -1,169 +1,3 @@ -![Latest Release Version](https://img.shields.io/badge/dynamic/json?labelColor=grey&color=6366f1&label=Latest_released_version&url=https%3A%2F%2Fcdn.coollabs.io%2Fcoolify%2Fversions.json&query=coolify.v4.version&style=for-the-badge -) +## v5.x -[![Bounty Issues](https://img.shields.io/static/v1?labelColor=grey&color=6366f1&label=Algora&message=%F0%9F%92%8E+Bounty+issues&style=for-the-badge)](https://console.algora.io/org/coollabsio/bounties/new) - -# About the Project - -Coolify is an open-source & self-hostable alternative to Heroku / Netlify / Vercel / etc. - -It helps you manage your servers, applications, and databases on your own hardware; you only need an SSH connection. You can manage VPS, Bare Metal, Raspberry PIs, and anything else. - -Imagine having the ease of a cloud but with your own servers. That is **Coolify**. - -No vendor lock-in, which means that all the configurations for your applications/databases/etc are saved to your server. So, if you decide to stop using Coolify (oh nooo), you could still manage your running resources. You lose the automations and all the magic. 🪄️ - -For more information, take a look at our landing page at [coolify.io](https://coolify.io). - -# Installation - -```bash -curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash -``` -You can find the installation script source [here](./scripts/install.sh). - -> [!NOTE] -> Please refer to the [docs](https://coolify.io/docs/installation) for more information about the installation. - -# Support - -Contact us at [coolify.io/docs/contact](https://coolify.io/docs/contact). - -# Donations -To stay completely free and open-source, with no feature behind the paywall and evolve the project, we need your help. If you like Coolify, please consider donating to help us fund the project's future development. - -[coolify.io/sponsorships](https://coolify.io/sponsorships) - -Thank you so much! - -Special thanks to our biggest sponsors! - -### Special Sponsors - -![image](https://github.com/user-attachments/assets/6022bc9c-8435-4d14-9497-8be230ed8cb1) - - -* [CCCareers](https://cccareers.org/) - A career development platform connecting coding bootcamp graduates with job opportunities in the tech industry. -* [Hetzner](http://htznr.li/CoolifyXHetzner) - A German web hosting company offering affordable dedicated servers, cloud services, and web hosting solutions. -* [Logto](https://logto.io/?ref=coolify) - An open-source authentication and authorization solution for building secure login systems and managing user identities. -* [Tolgee](https://tolgee.io/?ref=coolify) - Developer & translator friendly web-based localization platform. -* [BC Direct](https://bc.direct/?ref=coolify.io) - A digital marketing agency specializing in e-commerce solutions and online business growth strategies. -* [QuantCDN](https://www.quantcdn.io/?ref=coolify.io) - A content delivery network (CDN) optimizing website performance through global content distribution. -* [Arcjet](https://arcjet.com/?ref=coolify.io) - A cloud-based platform providing real-time protection against API abuse and bot attacks. -* [SupaGuide](https://supa.guide/?ref=coolify.io) - A comprehensive resource hub offering guides and tutorials for web development using Supabase. -* [GoldenVM](https://billing.goldenvm.com/?ref=coolify.io) - A cloud hosting provider offering scalable infrastructure solutions for businesses of all sizes. -* [Tigris](https://tigrisdata.com/?ref=coolify.io) - A fully managed serverless object storage service compatible with Amazon S3 API. Offers high performance, scalability, and built-in search capabilities for efficient data management. -* [Convex](https://convex.link/coolify.io) - Convex is the open-source reactive database for web app developers. -* [Cloudify.ro](https://cloudify.ro/?ref=coolify.io) - A cloud hosting provider offering scalable infrastructure solutions for businesses of all sizes. -* [Syntaxfm](https://syntax.fm/?ref=coolify.io) - Podcast for web developers. -* [PFGlabs](https://pfglabs.com/?ref=coolify.io) - Build real project with Golang. -* [Treive](https://trieve.ai/?ref=coolify.io) - An AI-powered search and discovery platform for enhancing information retrieval in large datasets. -* [Blacksmith](https://blacksmith.sh/?ref=coolify.io) - A cloud-native platform for automating infrastructure provisioning and management across multiple cloud providers. -* [Brand Dev](https://brand.dev/?ref=coolify.io) - The #1 Brand API for B2B software startups - instantly pull logos, fonts, descriptions, social links, slogans, and so much more from any domain via a single api call. -* [Jobscollider](https://jobscollider.com/remote-jobs?ref=coolify.io) - A job search platform connecting professionals with remote work opportunities across various industries. -* [Hostinger](https://www.hostinger.com/vps/coolify-hosting?ref=coolify.io) - A web hosting provider offering affordable hosting solutions, domain registration, and website building tools. -* [Glueops](https://www.glueops.dev/?ref=coolify.io) - A DevOps consulting company providing infrastructure automation and cloud optimization services. -* [Ubicloud](https://ubicloud.com/?ref=coolify.io) - An open-source alternative to hyperscale cloud providers, offering high-performance cloud computing services. -* [Juxtdigital](https://juxtdigital.dev/?ref=coolify.io) - A digital agency offering web development, design, and digital marketing services for businesses. -* [Saasykit](https://saasykit.com/?ref=coolify.io) - A Laravel-based boilerplate providing essential components and features for building SaaS applications quickly. -* [Massivegrid](https://massivegrid.com/?ref=coolify.io) - A cloud hosting provider offering scalable infrastructure solutions for businesses of all sizes. -* [LiquidWeb](https://liquidweb.com/?utm_source=coolify.io) - A Fast web hosting provider. - - -## Github Sponsors ($40+) -SerpAPI -typebot - - -Lightspeed.run -DartNode - FlintCompany -American Cloud -CryptoJobsList -Codext -Thompson Edolo -UXWizz -Younes Barrad -Automaze -Corentin Clichy -Niklas Lausch -Pixel Infinito -Tyler Whitesides -NiftyCo -Imre Ujlaki -Ilias Ism -Breakcold -Paweł Pierścionek -Michael Mazurczak -Formbricks -StartupFame -jyc.dev -BitLaunch -Internet Garden -Jonas Jaeger -JP -Evercam -Web3 Career - -## Organizations - - - - - - - - - - - - -## Individuals - - - -# Cloud - -If you do not want to self-host Coolify, there is a paid cloud version available: [app.coolify.io](https://app.coolify.io) - -For more information & pricing, take a look at our landing page [coolify.io](https://coolify.io). - -## Why should I use the Cloud version? -The recommended way to use Coolify is to have one server for Coolify and one (or more) for the resources you are deploying. A server is around 4-5$/month. - -By subscribing to the cloud version, you get the Coolify server for the same price, but with: -- High-availability -- Free email notifications -- Better support -- Less maintenance for you - -# Recognitions - -

- - Featured on Hacker News - -

- -Coolify - An open-source & self-hostable Heroku, Netlify alternative | Product Hunt - -coollabsio%2Fcoolify | Trendshift - -# Core Maintainers - -| Andras Bacsai | 🏔️ Peak | -|------------|------------| -| Andras Bacsai | peaklabs-dev | -| | | - -# Repo Activity - -![Alt](https://repobeats.axiom.co/api/embed/eab1c8066f9c59d0ad37b76c23ebb5ccac4278ae.svg "Repobeats analytics image") - -# Star History - -[![Star History Chart](https://api.star-history.com/svg?repos=coollabsio/coolify&type=Date)](https://star-history.com/#coollabsio/coolify&Date) +- WIP \ No newline at end of file diff --git a/RELEASE.md b/RELEASE.md deleted file mode 100644 index bc159b0409..0000000000 --- a/RELEASE.md +++ /dev/null @@ -1,133 +0,0 @@ -# Coolify Release Guide - -This guide outlines the release process for Coolify, intended for developers and those interested in understanding how Coolify releases are managed and deployed. - -## Table of Contents -- [Release Process](#release-process) -- [Version Types](#version-types) - - [Stable](#stable) - - [Nightly](#nightly) - - [Beta](#beta) -- [Version Availability](#version-availability) - - [Self-Hosted](#self-hosted) - - [Cloud](#cloud) -- [Manually Update to Specific Versions](#manually-update-to-specific-versions) - -## Release Process - -1. **Development on `next` or Feature Branches** - - Improvements, fixes, and new features are developed on the `next` branch or separate feature branches. - -2. **Merging to `main`** - - Once ready, changes are merged from the `next` branch into the `main` branch (via a pull request). - -3. **Building the Release** - - After merging to `main`, GitHub Actions automatically builds release images for all architectures and pushes them to the GitHub Container Registry and Docker Hub with the specific version tag and the `latest` tag. - -4. **Creating a GitHub Release** - - A new GitHub release is manually created with details of the changes made in the version. - -5. **Updating the CDN** - - To make a new version publicly available, the version information on the CDN needs to be updated manually. After that the new version number will be available at [https://cdn.coollabs.io/coolify/versions.json](https://cdn.coollabs.io/coolify/versions.json). - -> [!NOTE] -> The CDN update may not occur immediately after the GitHub release. It can take hours or even days due to additional testing, stability checks, or potential hotfixes. **The update becomes available only after the CDN is updated. After the CDN is updated, a discord announcement will be made in the Production Release channel.** - -## Version Types - -
- Stable (coming soon) - -- **Stable** - - The production version suitable for stable, production environments (recommended). - - **Update Frequency:** Every 2 to 4 weeks, with more frequent possible fixes. - - **Release Size:** Larger but less frequent releases. Multiple nightly versions are consolidated into a single stable release. - - **Versioning Scheme:** Follows semantic versioning (e.g., `v4.0.0`, `4.1.0`, etc.). - - **Installation Command:** - ```bash - curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash - ``` - -
- -
- Nightly - -- **Nightly** - - The latest development version, suitable for testing the latest changes and experimenting with new features. - - **Update Frequency:** Daily or bi-weekly updates. - - **Release Size:** Smaller, more frequent releases. - - **Versioning Scheme:** Follows semantic versioning (e.g., `4.1.0-nightly.1`, `4.1.0-nightly.2`, etc.). - - **Installation Command:** - ```bash - curl -fsSL https://cdn.coollabs.io/coolify-nightly/install.sh | bash -s next - ``` - -
- -
- Beta - -- **Beta** - - Test releases for the upcoming stable version. - - **Purpose:** Allows users to test and provide feedback on new features and changes before they become stable. - - **Update Frequency:** Available if we think beta testing is necessary. - - **Release Size:** Same size as stable release as it will become the next stabe release after some time. - - **Versioning Scheme:** Follows semantic versioning (e.g., `4.1.0-beta.1`, `4.1.0-beta.2`, etc.). - - **Installation Command:** - ```bash - curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash - ``` - -
- -> [!WARNING] -> Do not use nightly/beta builds in production as there is no guarantee of stability. - -## Version Availability - -When a new version is released and a new GitHub release is created, it doesn't immediately become available for your instance. Here's how version availability works for different instance types. - -### Self-Hosted - -- **Update Frequency:** More frequent updates, especially on the nightly release channel. -- **Update Availability:** New versions are available once the CDN has been updated. -- **Update Methods:** - 1. **Manual Update in Instance Settings:** - - Go to `Settings > Update Check Frequency` and click the `Check Manually` button. - - If an update is available, an upgrade button will appear on the sidebar. - 2. **Automatic Update:** - - If enabled, the instance will update automatically at the time set in the settings. - 3. **Re-run Installation Script:** - - Run the installation script again to upgrade to the latest version available on the CDN: - ```bash - curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash - ``` - -> [!IMPORTANT] -> If a new release is available on GitHub but your instance hasn't updated yet or no upgrade button is shown in the UI, the CDN might not have been updated yet. This intentional delay ensures stability and allows for hotfixes before official release. - -### Cloud - -- **Update Frequency:** Less frequent as it's a managed service. -- **Update Availability:** New versions are available once Andras has updated the cloud version manually. -- **Update Method:** - - Updates are managed by Andras, who ensures each cloud version is thoroughly tested and stable before releasing it. - -> [!IMPORTANT] -> The cloud version of Coolify may be several versions behind the latest GitHub releases even if the CDN is updated. This is intentional to ensure stability and reliability for cloud users and Andras will manully update the cloud version when the update is ready. - -## Manually Update/ Downgrade to Specific Versions - -> [!CAUTION] -> Updating to unreleased versions is not recommended and can cause issues. - -> [!IMPORTANT] -> Downgrading is supported but not recommended and can cause issues because of database migrations and other changes. - -To update your Coolify instance to a specific version, use the following command: - -```bash -curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash -s -``` -Replace `` with the version you want to update to (for example `4.0.0-beta.332`). diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 0711bf5b5e..0000000000 --- a/SECURITY.md +++ /dev/null @@ -1,25 +0,0 @@ -# Security Policy - -## Supported Versions - -Currently supported, maintained and updated versions: - -| Version | Supported | Support Status | -| ------- | ------------------ | -------------- | -| 4.x | :white_check_mark: | Active Development & Security Updates | -| < 4.0 | :x: | End of Life (no security updates) | - -## Security Updates - -We take security seriously. Security updates are released as soon as possible after a vulnerability is discovered and verified. - -## Reporting a Vulnerability - -If you discover a security vulnerability, please follow these steps: - -1. **DO NOT** disclose the vulnerability publicly. -2. Send a detailed report to: `hi@coollabs.io`. -3. Include in your report: - - A description of the vulnerability - - Steps to reproduce the issue - - Potential impact diff --git a/TECH_STACK.md b/TECH_STACK.md deleted file mode 100644 index 6a779eb293..0000000000 --- a/TECH_STACK.md +++ /dev/null @@ -1,29 +0,0 @@ -# Coolify Technology Stack - -## Frontend - -- Livewire and Alpine.js -- Blade (PHP templating engine) -- Tailwind CSS -- Monaco Editor (Code editor component) -- XTerm.js (Terminal component) - -## Backend - -- Laravel 11 (PHP Framework) -- PostgreSQL 15 (Database) -- Redis 7 (Caching & Real-time features) -- Soketi (WebSocket Server) - -## DevOps & Infrastructure - -- Docker & Docker Compose -- Nginx (Web Server) -- S6 Overlay (Process Supervisor) -- GitHub Actions (CI/CD) - -## Languages - -- PHP 8.4 -- JavaScript -- Shell/Bash scripts diff --git a/app/Actions/Application/GenerateConfig.php b/app/Actions/Application/GenerateConfig.php deleted file mode 100644 index 991146b482..0000000000 --- a/app/Actions/Application/GenerateConfig.php +++ /dev/null @@ -1,16 +0,0 @@ -generateConfig(is_json: $is_json); - } -} diff --git a/app/Actions/Application/IsHorizonQueueEmpty.php b/app/Actions/Application/IsHorizonQueueEmpty.php deleted file mode 100644 index 17966b8a0d..0000000000 --- a/app/Actions/Application/IsHorizonQueueEmpty.php +++ /dev/null @@ -1,37 +0,0 @@ -getRecent(); - if ($recent) { - $running = $recent->filter(function ($job) use ($hostname) { - $payload = json_decode($job->payload); - $tags = data_get($payload, 'tags'); - - return $job->status != 'completed' && - $job->status != 'failed' && - isset($tags) && - is_array($tags) && - in_array('server:'.$hostname, $tags); - }); - if ($running->count() > 0) { - echo 'false'; - - return false; - } - } - echo 'true'; - - return true; - } -} diff --git a/app/Actions/Application/LoadComposeFile.php b/app/Actions/Application/LoadComposeFile.php deleted file mode 100644 index 838b541e2f..0000000000 --- a/app/Actions/Application/LoadComposeFile.php +++ /dev/null @@ -1,16 +0,0 @@ -loadComposeFile(); - } -} diff --git a/app/Actions/Application/StopApplication.php b/app/Actions/Application/StopApplication.php deleted file mode 100644 index 642b4ba456..0000000000 --- a/app/Actions/Application/StopApplication.php +++ /dev/null @@ -1,43 +0,0 @@ -destination->server; - if (! $server->isFunctional()) { - return 'Server is not functional'; - } - - if ($server->isSwarm()) { - instant_remote_process(["docker stack rm {$application->uuid}"], $server); - - return; - } - - $containersToStop = $application->getContainersToStop($previewDeployments); - $application->stopContainers($containersToStop, $server); - - if ($application->build_pack === 'dockercompose') { - $application->delete_connected_networks($application->uuid); - } - - if ($dockerCleanup) { - CleanupDocker::dispatch($server, true); - } - } catch (\Exception $e) { - return $e->getMessage(); - } - } -} diff --git a/app/Actions/Application/StopApplicationOneServer.php b/app/Actions/Application/StopApplicationOneServer.php deleted file mode 100644 index b13b10efd6..0000000000 --- a/app/Actions/Application/StopApplicationOneServer.php +++ /dev/null @@ -1,38 +0,0 @@ -destination->server->isSwarm()) { - return; - } - if (! $server->isFunctional()) { - return 'Server is not functional'; - } - try { - $containers = getCurrentApplicationContainerStatus($server, $application->id, 0); - if ($containers->count() > 0) { - foreach ($containers as $container) { - $containerName = data_get($container, 'Names'); - if ($containerName) { - instant_remote_process( - ["docker rm -f {$containerName}"], - $server - ); - } - } - } - } catch (\Exception $e) { - return $e->getMessage(); - } - } -} diff --git a/app/Actions/CoolifyTask/PrepareCoolifyTask.php b/app/Actions/CoolifyTask/PrepareCoolifyTask.php deleted file mode 100644 index 3f76a2e3c7..0000000000 --- a/app/Actions/CoolifyTask/PrepareCoolifyTask.php +++ /dev/null @@ -1,54 +0,0 @@ -remoteProcessArgs = $remoteProcessArgs; - - if ($remoteProcessArgs->model) { - $properties = $remoteProcessArgs->toArray(); - unset($properties['model']); - - $this->activity = activity() - ->withProperties($properties) - ->performedOn($remoteProcessArgs->model) - ->event($remoteProcessArgs->type) - ->log('[]'); - } else { - $this->activity = activity() - ->withProperties($remoteProcessArgs->toArray()) - ->event($remoteProcessArgs->type) - ->log('[]'); - } - } - - public function __invoke(): Activity - { - $job = new CoolifyTask( - activity: $this->activity, - ignore_errors: $this->remoteProcessArgs->ignore_errors, - call_event_on_finish: $this->remoteProcessArgs->call_event_on_finish, - call_event_data: $this->remoteProcessArgs->call_event_data, - ); - dispatch($job); - $this->activity->refresh(); - - return $this->activity; - } -} diff --git a/app/Actions/CoolifyTask/RunRemoteProcess.php b/app/Actions/CoolifyTask/RunRemoteProcess.php deleted file mode 100644 index 926d30fe6c..0000000000 --- a/app/Actions/CoolifyTask/RunRemoteProcess.php +++ /dev/null @@ -1,198 +0,0 @@ -getExtraProperty('type') !== ActivityTypes::INLINE->value && $activity->getExtraProperty('type') !== ActivityTypes::COMMAND->value) { - throw new \RuntimeException('Incompatible Activity to run a remote command.'); - } - - $this->activity = $activity; - $this->hide_from_output = $hide_from_output; - $this->ignore_errors = $ignore_errors; - $this->call_event_on_finish = $call_event_on_finish; - $this->call_event_data = $call_event_data; - } - - public static function decodeOutput(?Activity $activity = null): string - { - if (is_null($activity)) { - return ''; - } - - try { - $decoded = json_decode( - data_get($activity, 'description'), - associative: true, - flags: JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE - ); - } catch (\JsonException $exception) { - return ''; - } - - return collect($decoded) - ->sortBy(fn ($i) => $i['order']) - ->map(fn ($i) => $i['output']) - ->implode(''); - } - - public function __invoke(): ProcessResult - { - $this->time_start = hrtime(true); - - $status = ProcessStatus::IN_PROGRESS; - $timeout = config('constants.ssh.command_timeout'); - $process = Process::timeout($timeout)->start($this->getCommand(), $this->handleOutput(...)); - $this->activity->properties = $this->activity->properties->merge([ - 'process_id' => $process->id(), - ]); - - $processResult = $process->wait(); - // $processResult = Process::timeout($timeout)->run($this->getCommand(), $this->handleOutput(...)); - if ($this->activity->properties->get('status') === ProcessStatus::ERROR->value) { - $status = ProcessStatus::ERROR; - } else { - if ($processResult->exitCode() == 0) { - $status = ProcessStatus::FINISHED; - } else { - $status = ProcessStatus::ERROR; - } - } - - $this->activity->properties = $this->activity->properties->merge([ - 'exitCode' => $processResult->exitCode(), - 'stdout' => $processResult->output(), - 'stderr' => $processResult->errorOutput(), - 'status' => $status->value, - ]); - $this->activity->save(); - if ($this->call_event_on_finish) { - try { - if ($this->call_event_data) { - event(resolve("App\\Events\\$this->call_event_on_finish", [ - 'data' => $this->call_event_data, - ])); - } else { - event(resolve("App\\Events\\$this->call_event_on_finish", [ - 'userId' => $this->activity->causer_id, - ])); - } - } catch (\Throwable $e) { - Log::error('Error calling event: '.$e->getMessage()); - } - } - if ($processResult->exitCode() != 0 && ! $this->ignore_errors) { - throw new \RuntimeException($processResult->errorOutput(), $processResult->exitCode()); - } - - return $processResult; - } - - protected function getCommand(): string - { - $server_uuid = $this->activity->getExtraProperty('server_uuid'); - $command = $this->activity->getExtraProperty('command'); - $server = Server::whereUuid($server_uuid)->firstOrFail(); - - return SshMultiplexingHelper::generateSshCommand($server, $command); - } - - protected function handleOutput(string $type, string $output) - { - if ($this->hide_from_output) { - return; - } - $this->current_time = $this->elapsedTime(); - $this->activity->description = $this->encodeOutput($type, $output); - if ($this->isAfterLastThrottle()) { - // Let's write to database. - DB::transaction(function () { - $this->activity->save(); - $this->last_write_at = $this->current_time; - }); - } - } - - protected function elapsedTime(): int - { - $timeMs = (hrtime(true) - $this->time_start) / 1_000_000; - - return intval($timeMs); - } - - public function encodeOutput($type, $output) - { - $outputStack = json_decode($this->activity->description, associative: true, flags: JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE); - $outputStack[] = [ - 'type' => $type, - 'output' => $output, - 'timestamp' => hrtime(true), - 'batch' => ApplicationDeploymentJob::$batch_counter, - 'order' => $this->getLatestCounter(), - ]; - - return json_encode($outputStack, flags: JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE); - } - - protected function getLatestCounter(): int - { - $description = json_decode($this->activity->description, associative: true, flags: JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE); - if ($description === null || count($description) === 0) { - return 1; - } - - return end($description)['order'] + 1; - } - - /** - * Determines if it's time to write again to database. - * - * @return bool - */ - protected function isAfterLastThrottle() - { - // If DB was never written, then we immediately decide we have to write. - if ($this->last_write_at === 0) { - return true; - } - - return ($this->current_time - $this->throttle_interval_ms) > $this->last_write_at; - } -} diff --git a/app/Actions/Database/RestartDatabase.php b/app/Actions/Database/RestartDatabase.php deleted file mode 100644 index 0400d924dd..0000000000 --- a/app/Actions/Database/RestartDatabase.php +++ /dev/null @@ -1,29 +0,0 @@ -destination->server; - if (! $server->isFunctional()) { - return 'Server is not functional'; - } - StopDatabase::run($database); - - return StartDatabase::run($database); - } -} diff --git a/app/Actions/Database/StartClickhouse.php b/app/Actions/Database/StartClickhouse.php deleted file mode 100644 index f218fcabb0..0000000000 --- a/app/Actions/Database/StartClickhouse.php +++ /dev/null @@ -1,165 +0,0 @@ -database = $database; - - $container_name = $this->database->uuid; - $this->configuration_dir = database_configuration_dir().'/'.$container_name; - - $this->commands = [ - "echo 'Starting database.'", - "mkdir -p $this->configuration_dir", - ]; - - $persistent_storages = $this->generate_local_persistent_volumes(); - $persistent_file_volumes = $this->database->fileStorages()->get(); - $volume_names = $this->generate_local_persistent_volumes_only_volume_names(); - $environment_variables = $this->generate_environment_variables(); - - $docker_compose = [ - 'services' => [ - $container_name => [ - 'image' => $this->database->image, - 'container_name' => $container_name, - 'environment' => $environment_variables, - 'restart' => RESTART_MODE, - 'networks' => [ - $this->database->destination->network, - ], - 'ulimits' => [ - 'nofile' => [ - 'soft' => 262144, - 'hard' => 262144, - ], - ], - 'labels' => defaultDatabaseLabels($this->database)->toArray(), - 'healthcheck' => [ - 'test' => "clickhouse-client --password {$this->database->clickhouse_admin_password} --query 'SELECT 1'", - 'interval' => '5s', - 'timeout' => '5s', - 'retries' => 10, - 'start_period' => '5s', - ], - 'mem_limit' => $this->database->limits_memory, - 'memswap_limit' => $this->database->limits_memory_swap, - 'mem_swappiness' => $this->database->limits_memory_swappiness, - 'mem_reservation' => $this->database->limits_memory_reservation, - 'cpus' => (float) $this->database->limits_cpus, - 'cpu_shares' => $this->database->limits_cpu_shares, - ], - ], - 'networks' => [ - $this->database->destination->network => [ - 'external' => true, - 'name' => $this->database->destination->network, - 'attachable' => true, - ], - ], - ]; - if (! is_null($this->database->limits_cpuset)) { - data_set($docker_compose, "services.{$container_name}.cpuset", $this->database->limits_cpuset); - } - if ($this->database->destination->server->isLogDrainEnabled() && $this->database->isLogDrainEnabled()) { - $docker_compose['services'][$container_name]['logging'] = generate_fluentd_configuration(); - } - if (count($this->database->ports_mappings_array) > 0) { - $docker_compose['services'][$container_name]['ports'] = $this->database->ports_mappings_array; - } - if (count($persistent_storages) > 0) { - $docker_compose['services'][$container_name]['volumes'] = $persistent_storages; - } - if (count($persistent_file_volumes) > 0) { - $docker_compose['services'][$container_name]['volumes'] = $persistent_file_volumes->map(function ($item) { - return "$item->fs_path:$item->mount_path"; - })->toArray(); - } - if (count($volume_names) > 0) { - $docker_compose['volumes'] = $volume_names; - } - - // Add custom docker run options - $docker_run_options = convertDockerRunToCompose($this->database->custom_docker_run_options); - $docker_compose = generateCustomDockerRunOptionsForDatabases($docker_run_options, $docker_compose, $container_name, $this->database->destination->network); - - $docker_compose = Yaml::dump($docker_compose, 10); - $docker_compose_base64 = base64_encode($docker_compose); - $this->commands[] = "echo '{$docker_compose_base64}' | base64 -d | tee $this->configuration_dir/docker-compose.yml > /dev/null"; - $readme = generate_readme_file($this->database->name, now()); - $this->commands[] = "echo '{$readme}' > $this->configuration_dir/README.md"; - $this->commands[] = "echo 'Pulling {$database->image} image.'"; - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml pull"; - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml up -d"; - $this->commands[] = "echo 'Database started.'"; - - return remote_process($this->commands, $database->destination->server, callEventOnFinish: 'DatabaseStatusChanged'); - } - - private function generate_local_persistent_volumes() - { - $local_persistent_volumes = []; - foreach ($this->database->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path !== '' && $persistentStorage->host_path !== null) { - $local_persistent_volumes[] = $persistentStorage->host_path.':'.$persistentStorage->mount_path; - } else { - $volume_name = $persistentStorage->name; - $local_persistent_volumes[] = $volume_name.':'.$persistentStorage->mount_path; - } - } - - return $local_persistent_volumes; - } - - private function generate_local_persistent_volumes_only_volume_names() - { - $local_persistent_volumes_names = []; - foreach ($this->database->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path) { - continue; - } - $name = $persistentStorage->name; - $local_persistent_volumes_names[$name] = [ - 'name' => $name, - 'external' => false, - ]; - } - - return $local_persistent_volumes_names; - } - - private function generate_environment_variables() - { - $environment_variables = collect(); - foreach ($this->database->runtime_environment_variables as $env) { - $environment_variables->push("$env->key=$env->real_value"); - } - - if ($environment_variables->filter(fn ($env) => str($env)->contains('CLICKHOUSE_ADMIN_USER'))->isEmpty()) { - $environment_variables->push("CLICKHOUSE_ADMIN_USER={$this->database->clickhouse_admin_user}"); - } - - if ($environment_variables->filter(fn ($env) => str($env)->contains('CLICKHOUSE_ADMIN_PASSWORD'))->isEmpty()) { - $environment_variables->push("CLICKHOUSE_ADMIN_PASSWORD={$this->database->clickhouse_admin_password}"); - } - - add_coolify_default_environment_variables($this->database, $environment_variables, $environment_variables); - - return $environment_variables->all(); - } -} diff --git a/app/Actions/Database/StartDatabase.php b/app/Actions/Database/StartDatabase.php deleted file mode 100644 index e2fa6fc871..0000000000 --- a/app/Actions/Database/StartDatabase.php +++ /dev/null @@ -1,59 +0,0 @@ -destination->server; - if (! $server->isFunctional()) { - return 'Server is not functional'; - } - switch ($database->getMorphClass()) { - case \App\Models\StandalonePostgresql::class: - $activity = StartPostgresql::run($database); - break; - case \App\Models\StandaloneRedis::class: - $activity = StartRedis::run($database); - break; - case \App\Models\StandaloneMongodb::class: - $activity = StartMongodb::run($database); - break; - case \App\Models\StandaloneMysql::class: - $activity = StartMysql::run($database); - break; - case \App\Models\StandaloneMariadb::class: - $activity = StartMariadb::run($database); - break; - case \App\Models\StandaloneKeydb::class: - $activity = StartKeydb::run($database); - break; - case \App\Models\StandaloneDragonfly::class: - $activity = StartDragonfly::run($database); - break; - case \App\Models\StandaloneClickhouse::class: - $activity = StartClickhouse::run($database); - break; - } - if ($database->is_public && $database->public_port) { - StartDatabaseProxy::dispatch($database); - } - - return $activity; - } -} diff --git a/app/Actions/Database/StartDatabaseProxy.php b/app/Actions/Database/StartDatabaseProxy.php deleted file mode 100644 index c4a40f020c..0000000000 --- a/app/Actions/Database/StartDatabaseProxy.php +++ /dev/null @@ -1,117 +0,0 @@ -database_type; - $network = data_get($database, 'destination.network'); - $server = data_get($database, 'destination.server'); - $containerName = data_get($database, 'uuid'); - $proxyContainerName = "{$database->uuid}-proxy"; - if ($database->getMorphClass() === \App\Models\ServiceDatabase::class) { - $databaseType = $database->databaseType(); - $network = $database->service->uuid; - $server = data_get($database, 'service.destination.server'); - $proxyContainerName = "{$database->service->uuid}-proxy"; - $containerName = "{$database->name}-{$database->service->uuid}"; - } - $internalPort = match ($databaseType) { - 'standalone-mariadb', 'standalone-mysql' => 3306, - 'standalone-postgresql', 'standalone-supabase/postgres' => 5432, - 'standalone-redis', 'standalone-keydb', 'standalone-dragonfly' => 6379, - 'standalone-clickhouse' => 9000, - 'standalone-mongodb' => 27017, - default => throw new \Exception("Unsupported database type: $databaseType"), - }; - - $configuration_dir = database_proxy_dir($database->uuid); - $nginxconf = <<public_port; - proxy_pass $containerName:$internalPort; - } - } - EOF; - $dockerfile = <<< 'EOF' - FROM nginx:stable-alpine - - COPY nginx.conf /etc/nginx/nginx.conf - EOF; - $docker_compose = [ - 'services' => [ - $proxyContainerName => [ - 'build' => [ - 'context' => $configuration_dir, - 'dockerfile' => 'Dockerfile', - ], - 'image' => 'nginx:stable-alpine', - 'container_name' => $proxyContainerName, - 'restart' => RESTART_MODE, - 'ports' => [ - "$database->public_port:$database->public_port", - ], - 'networks' => [ - $network, - ], - 'healthcheck' => [ - 'test' => [ - 'CMD-SHELL', - 'stat /etc/nginx/nginx.conf || exit 1', - ], - 'interval' => '5s', - 'timeout' => '5s', - 'retries' => 3, - 'start_period' => '1s', - ], - ], - ], - 'networks' => [ - $network => [ - 'external' => true, - 'name' => $network, - 'attachable' => true, - ], - ], - ]; - $dockercompose_base64 = base64_encode(Yaml::dump($docker_compose, 4, 2)); - $nginxconf_base64 = base64_encode($nginxconf); - $dockerfile_base64 = base64_encode($dockerfile); - instant_remote_process(["docker rm -f $proxyContainerName"], $server, false); - instant_remote_process([ - "mkdir -p $configuration_dir", - "echo '{$dockerfile_base64}' | base64 -d | tee $configuration_dir/Dockerfile > /dev/null", - "echo '{$nginxconf_base64}' | base64 -d | tee $configuration_dir/nginx.conf > /dev/null", - "echo '{$dockercompose_base64}' | base64 -d | tee $configuration_dir/docker-compose.yaml > /dev/null", - "docker compose --project-directory {$configuration_dir} pull", - "docker compose --project-directory {$configuration_dir} up --build -d", - ], $server); - } -} diff --git a/app/Actions/Database/StartDragonfly.php b/app/Actions/Database/StartDragonfly.php deleted file mode 100644 index 4f9f45b7c7..0000000000 --- a/app/Actions/Database/StartDragonfly.php +++ /dev/null @@ -1,156 +0,0 @@ -database = $database; - - $startCommand = "dragonfly --requirepass {$this->database->dragonfly_password}"; - - $container_name = $this->database->uuid; - $this->configuration_dir = database_configuration_dir().'/'.$container_name; - - $this->commands = [ - "echo 'Starting database.'", - "mkdir -p $this->configuration_dir", - ]; - - $persistent_storages = $this->generate_local_persistent_volumes(); - $persistent_file_volumes = $this->database->fileStorages()->get(); - $volume_names = $this->generate_local_persistent_volumes_only_volume_names(); - $environment_variables = $this->generate_environment_variables(); - - $docker_compose = [ - 'services' => [ - $container_name => [ - 'image' => $this->database->image, - 'command' => $startCommand, - 'container_name' => $container_name, - 'environment' => $environment_variables, - 'restart' => RESTART_MODE, - 'networks' => [ - $this->database->destination->network, - ], - 'labels' => defaultDatabaseLabels($this->database)->toArray(), - 'healthcheck' => [ - 'test' => "redis-cli -a {$this->database->dragonfly_password} ping", - 'interval' => '5s', - 'timeout' => '5s', - 'retries' => 10, - 'start_period' => '5s', - ], - 'mem_limit' => $this->database->limits_memory, - 'memswap_limit' => $this->database->limits_memory_swap, - 'mem_swappiness' => $this->database->limits_memory_swappiness, - 'mem_reservation' => $this->database->limits_memory_reservation, - 'cpus' => (float) $this->database->limits_cpus, - 'cpu_shares' => $this->database->limits_cpu_shares, - ], - ], - 'networks' => [ - $this->database->destination->network => [ - 'external' => true, - 'name' => $this->database->destination->network, - 'attachable' => true, - ], - ], - ]; - if (! is_null($this->database->limits_cpuset)) { - data_set($docker_compose, "services.{$container_name}.cpuset", $this->database->limits_cpuset); - } - if ($this->database->destination->server->isLogDrainEnabled() && $this->database->isLogDrainEnabled()) { - $docker_compose['services'][$container_name]['logging'] = generate_fluentd_configuration(); - } - if (count($this->database->ports_mappings_array) > 0) { - $docker_compose['services'][$container_name]['ports'] = $this->database->ports_mappings_array; - } - if (count($persistent_storages) > 0) { - $docker_compose['services'][$container_name]['volumes'] = $persistent_storages; - } - if (count($persistent_file_volumes) > 0) { - $docker_compose['services'][$container_name]['volumes'] = $persistent_file_volumes->map(function ($item) { - return "$item->fs_path:$item->mount_path"; - })->toArray(); - } - if (count($volume_names) > 0) { - $docker_compose['volumes'] = $volume_names; - } - - // Add custom docker run options - $docker_run_options = convertDockerRunToCompose($this->database->custom_docker_run_options); - $docker_compose = generateCustomDockerRunOptionsForDatabases($docker_run_options, $docker_compose, $container_name, $this->database->destination->network); - - $docker_compose = Yaml::dump($docker_compose, 10); - $docker_compose_base64 = base64_encode($docker_compose); - $this->commands[] = "echo '{$docker_compose_base64}' | base64 -d | tee $this->configuration_dir/docker-compose.yml > /dev/null"; - $readme = generate_readme_file($this->database->name, now()); - $this->commands[] = "echo '{$readme}' > $this->configuration_dir/README.md"; - $this->commands[] = "echo 'Pulling {$database->image} image.'"; - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml pull"; - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml up -d"; - $this->commands[] = "echo 'Database started.'"; - - return remote_process($this->commands, $database->destination->server, callEventOnFinish: 'DatabaseStatusChanged'); - } - - private function generate_local_persistent_volumes() - { - $local_persistent_volumes = []; - foreach ($this->database->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path !== '' && $persistentStorage->host_path !== null) { - $local_persistent_volumes[] = $persistentStorage->host_path.':'.$persistentStorage->mount_path; - } else { - $volume_name = $persistentStorage->name; - $local_persistent_volumes[] = $volume_name.':'.$persistentStorage->mount_path; - } - } - - return $local_persistent_volumes; - } - - private function generate_local_persistent_volumes_only_volume_names() - { - $local_persistent_volumes_names = []; - foreach ($this->database->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path) { - continue; - } - $name = $persistentStorage->name; - $local_persistent_volumes_names[$name] = [ - 'name' => $name, - 'external' => false, - ]; - } - - return $local_persistent_volumes_names; - } - - private function generate_environment_variables() - { - $environment_variables = collect(); - foreach ($this->database->runtime_environment_variables as $env) { - $environment_variables->push("$env->key=$env->real_value"); - } - - if ($environment_variables->filter(fn ($env) => str($env)->contains('REDIS_PASSWORD'))->isEmpty()) { - $environment_variables->push("REDIS_PASSWORD={$this->database->dragonfly_password}"); - } - - return $environment_variables->all(); - } -} diff --git a/app/Actions/Database/StartKeydb.php b/app/Actions/Database/StartKeydb.php deleted file mode 100644 index 6c733d3180..0000000000 --- a/app/Actions/Database/StartKeydb.php +++ /dev/null @@ -1,180 +0,0 @@ -database = $database; - - $startCommand = "keydb-server --requirepass {$this->database->keydb_password} --appendonly yes"; - - $container_name = $this->database->uuid; - $this->configuration_dir = database_configuration_dir().'/'.$container_name; - - $this->commands = [ - "echo 'Starting database.'", - "mkdir -p $this->configuration_dir", - ]; - - $persistent_storages = $this->generate_local_persistent_volumes(); - $persistent_file_volumes = $this->database->fileStorages()->get(); - $volume_names = $this->generate_local_persistent_volumes_only_volume_names(); - $environment_variables = $this->generate_environment_variables(); - $this->add_custom_keydb(); - - $docker_compose = [ - 'services' => [ - $container_name => [ - 'image' => $this->database->image, - 'command' => $startCommand, - 'container_name' => $container_name, - 'environment' => $environment_variables, - 'restart' => RESTART_MODE, - 'networks' => [ - $this->database->destination->network, - ], - 'labels' => defaultDatabaseLabels($this->database)->toArray(), - 'healthcheck' => [ - 'test' => "keydb-cli --pass {$this->database->keydb_password} ping", - 'interval' => '5s', - 'timeout' => '5s', - 'retries' => 10, - 'start_period' => '5s', - ], - 'mem_limit' => $this->database->limits_memory, - 'memswap_limit' => $this->database->limits_memory_swap, - 'mem_swappiness' => $this->database->limits_memory_swappiness, - 'mem_reservation' => $this->database->limits_memory_reservation, - 'cpus' => (float) $this->database->limits_cpus, - 'cpu_shares' => $this->database->limits_cpu_shares, - ], - ], - 'networks' => [ - $this->database->destination->network => [ - 'external' => true, - 'name' => $this->database->destination->network, - 'attachable' => true, - ], - ], - ]; - if (! is_null($this->database->limits_cpuset)) { - data_set($docker_compose, "services.{$container_name}.cpuset", $this->database->limits_cpuset); - } - if ($this->database->destination->server->isLogDrainEnabled() && $this->database->isLogDrainEnabled()) { - $docker_compose['services'][$container_name]['logging'] = generate_fluentd_configuration(); - } - if (count($this->database->ports_mappings_array) > 0) { - $docker_compose['services'][$container_name]['ports'] = $this->database->ports_mappings_array; - } - if (count($persistent_storages) > 0) { - $docker_compose['services'][$container_name]['volumes'] = $persistent_storages; - } - if (count($persistent_file_volumes) > 0) { - $docker_compose['services'][$container_name]['volumes'] = $persistent_file_volumes->map(function ($item) { - return "$item->fs_path:$item->mount_path"; - })->toArray(); - } - if (count($volume_names) > 0) { - $docker_compose['volumes'] = $volume_names; - } - if (! is_null($this->database->keydb_conf) || ! empty($this->database->keydb_conf)) { - $docker_compose['services'][$container_name]['volumes'][] = [ - 'type' => 'bind', - 'source' => $this->configuration_dir.'/keydb.conf', - 'target' => '/etc/keydb/keydb.conf', - 'read_only' => true, - ]; - $docker_compose['services'][$container_name]['command'] = "keydb-server /etc/keydb/keydb.conf --requirepass {$this->database->keydb_password} --appendonly yes"; - } - - // Add custom docker run options - $docker_run_options = convertDockerRunToCompose($this->database->custom_docker_run_options); - $docker_compose = generateCustomDockerRunOptionsForDatabases($docker_run_options, $docker_compose, $container_name, $this->database->destination->network); - $docker_compose = Yaml::dump($docker_compose, 10); - $docker_compose_base64 = base64_encode($docker_compose); - $this->commands[] = "echo '{$docker_compose_base64}' | base64 -d | tee $this->configuration_dir/docker-compose.yml > /dev/null"; - $readme = generate_readme_file($this->database->name, now()); - $this->commands[] = "echo '{$readme}' > $this->configuration_dir/README.md"; - $this->commands[] = "echo 'Pulling {$database->image} image.'"; - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml pull"; - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml up -d"; - $this->commands[] = "echo 'Database started.'"; - - return remote_process($this->commands, $database->destination->server, callEventOnFinish: 'DatabaseStatusChanged'); - } - - private function generate_local_persistent_volumes() - { - $local_persistent_volumes = []; - foreach ($this->database->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path !== '' && $persistentStorage->host_path !== null) { - $local_persistent_volumes[] = $persistentStorage->host_path.':'.$persistentStorage->mount_path; - } else { - $volume_name = $persistentStorage->name; - $local_persistent_volumes[] = $volume_name.':'.$persistentStorage->mount_path; - } - } - - return $local_persistent_volumes; - } - - private function generate_local_persistent_volumes_only_volume_names() - { - $local_persistent_volumes_names = []; - foreach ($this->database->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path) { - continue; - } - $name = $persistentStorage->name; - $local_persistent_volumes_names[$name] = [ - 'name' => $name, - 'external' => false, - ]; - } - - return $local_persistent_volumes_names; - } - - private function generate_environment_variables() - { - $environment_variables = collect(); - foreach ($this->database->runtime_environment_variables as $env) { - $environment_variables->push("$env->key=$env->real_value"); - } - - if ($environment_variables->filter(fn ($env) => str($env)->contains('REDIS_PASSWORD'))->isEmpty()) { - $environment_variables->push("REDIS_PASSWORD={$this->database->keydb_password}"); - } - - add_coolify_default_environment_variables($this->database, $environment_variables, $environment_variables); - - return $environment_variables->all(); - } - - private function add_custom_keydb() - { - if (is_null($this->database->keydb_conf) || empty($this->database->keydb_conf)) { - return; - } - $filename = 'keydb.conf'; - Storage::disk('local')->put("tmp/keydb.conf_{$this->database->uuid}", $this->database->keydb_conf); - $path = Storage::path("tmp/keydb.conf_{$this->database->uuid}"); - instant_scp($path, "{$this->configuration_dir}/{$filename}", $this->database->destination->server); - Storage::disk('local')->delete("tmp/keydb.conf_{$this->database->uuid}"); - } -} diff --git a/app/Actions/Database/StartMariadb.php b/app/Actions/Database/StartMariadb.php deleted file mode 100644 index 299b07385b..0000000000 --- a/app/Actions/Database/StartMariadb.php +++ /dev/null @@ -1,185 +0,0 @@ -database = $database; - - $container_name = $this->database->uuid; - $this->configuration_dir = database_configuration_dir().'/'.$container_name; - - $this->commands = [ - "echo 'Starting database.'", - "mkdir -p $this->configuration_dir", - ]; - - $persistent_storages = $this->generate_local_persistent_volumes(); - $persistent_file_volumes = $this->database->fileStorages()->get(); - $volume_names = $this->generate_local_persistent_volumes_only_volume_names(); - $environment_variables = $this->generate_environment_variables(); - $this->add_custom_mysql(); - $docker_compose = [ - 'services' => [ - $container_name => [ - 'image' => $this->database->image, - 'container_name' => $container_name, - 'environment' => $environment_variables, - 'restart' => RESTART_MODE, - 'networks' => [ - $this->database->destination->network, - ], - 'labels' => defaultDatabaseLabels($this->database)->toArray(), - 'healthcheck' => [ - 'test' => ['CMD', 'healthcheck.sh', '--connect', '--innodb_initialized'], - 'interval' => '5s', - 'timeout' => '5s', - 'retries' => 10, - 'start_period' => '5s', - ], - 'mem_limit' => $this->database->limits_memory, - 'memswap_limit' => $this->database->limits_memory_swap, - 'mem_swappiness' => $this->database->limits_memory_swappiness, - 'mem_reservation' => $this->database->limits_memory_reservation, - 'cpus' => (float) $this->database->limits_cpus, - 'cpu_shares' => $this->database->limits_cpu_shares, - ], - ], - 'networks' => [ - $this->database->destination->network => [ - 'external' => true, - 'name' => $this->database->destination->network, - 'attachable' => true, - ], - ], - ]; - if (! is_null($this->database->limits_cpuset)) { - data_set($docker_compose, "services.{$container_name}.cpuset", $this->database->limits_cpuset); - } - if ($this->database->destination->server->isLogDrainEnabled() && $this->database->isLogDrainEnabled()) { - $docker_compose['services'][$container_name]['logging'] = generate_fluentd_configuration(); - } - if (count($this->database->ports_mappings_array) > 0) { - $docker_compose['services'][$container_name]['ports'] = $this->database->ports_mappings_array; - } - if (count($persistent_storages) > 0) { - $docker_compose['services'][$container_name]['volumes'] = $persistent_storages; - } - if (count($persistent_file_volumes) > 0) { - $docker_compose['services'][$container_name]['volumes'] = $persistent_file_volumes->map(function ($item) { - return "$item->fs_path:$item->mount_path"; - })->toArray(); - } - if (count($volume_names) > 0) { - $docker_compose['volumes'] = $volume_names; - } - if (! is_null($this->database->mariadb_conf) || ! empty($this->database->mariadb_conf)) { - $docker_compose['services'][$container_name]['volumes'][] = [ - 'type' => 'bind', - 'source' => $this->configuration_dir.'/custom-config.cnf', - 'target' => '/etc/mysql/conf.d/custom-config.cnf', - 'read_only' => true, - ]; - } - - // Add custom docker run options - $docker_run_options = convertDockerRunToCompose($this->database->custom_docker_run_options); - $docker_compose = generateCustomDockerRunOptionsForDatabases($docker_run_options, $docker_compose, $container_name, $this->database->destination->network); - - $docker_compose = Yaml::dump($docker_compose, 10); - $docker_compose_base64 = base64_encode($docker_compose); - $this->commands[] = "echo '{$docker_compose_base64}' | base64 -d | tee $this->configuration_dir/docker-compose.yml > /dev/null"; - $readme = generate_readme_file($this->database->name, now()); - $this->commands[] = "echo '{$readme}' > $this->configuration_dir/README.md"; - $this->commands[] = "echo 'Pulling {$database->image} image.'"; - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml pull"; - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml up -d"; - $this->commands[] = "echo 'Database started.'"; - - return remote_process($this->commands, $database->destination->server, callEventOnFinish: 'DatabaseStatusChanged'); - } - - private function generate_local_persistent_volumes() - { - $local_persistent_volumes = []; - foreach ($this->database->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path !== '' && $persistentStorage->host_path !== null) { - $local_persistent_volumes[] = $persistentStorage->host_path.':'.$persistentStorage->mount_path; - } else { - $volume_name = $persistentStorage->name; - $local_persistent_volumes[] = $volume_name.':'.$persistentStorage->mount_path; - } - } - - return $local_persistent_volumes; - } - - private function generate_local_persistent_volumes_only_volume_names() - { - $local_persistent_volumes_names = []; - foreach ($this->database->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path) { - continue; - } - $name = $persistentStorage->name; - $local_persistent_volumes_names[$name] = [ - 'name' => $name, - 'external' => false, - ]; - } - - return $local_persistent_volumes_names; - } - - private function generate_environment_variables() - { - $environment_variables = collect(); - foreach ($this->database->runtime_environment_variables as $env) { - $environment_variables->push("$env->key=$env->real_value"); - } - - if ($environment_variables->filter(fn ($env) => str($env)->contains('MARIADB_ROOT_PASSWORD'))->isEmpty()) { - $environment_variables->push("MARIADB_ROOT_PASSWORD={$this->database->mariadb_root_password}"); - } - - if ($environment_variables->filter(fn ($env) => str($env)->contains('MARIADB_DATABASE'))->isEmpty()) { - $environment_variables->push("MARIADB_DATABASE={$this->database->mariadb_database}"); - } - - if ($environment_variables->filter(fn ($env) => str($env)->contains('MARIADB_USER'))->isEmpty()) { - $environment_variables->push("MARIADB_USER={$this->database->mariadb_user}"); - } - if ($environment_variables->filter(fn ($env) => str($env)->contains('MARIADB_PASSWORD'))->isEmpty()) { - $environment_variables->push("MARIADB_PASSWORD={$this->database->mariadb_password}"); - } - - add_coolify_default_environment_variables($this->database, $environment_variables, $environment_variables); - - return $environment_variables->all(); - } - - private function add_custom_mysql() - { - if (is_null($this->database->mariadb_conf) || empty($this->database->mariadb_conf)) { - return; - } - $filename = 'custom-config.cnf'; - $content = $this->database->mariadb_conf; - $content_base64 = base64_encode($content); - $this->commands[] = "echo '{$content_base64}' | base64 -d | tee $this->configuration_dir/{$filename} > /dev/null"; - } -} diff --git a/app/Actions/Database/StartMongodb.php b/app/Actions/Database/StartMongodb.php deleted file mode 100644 index 89d35ca7b4..0000000000 --- a/app/Actions/Database/StartMongodb.php +++ /dev/null @@ -1,210 +0,0 @@ -database = $database; - - $startCommand = 'mongod'; - - $container_name = $this->database->uuid; - $this->configuration_dir = database_configuration_dir().'/'.$container_name; - - if (isDev()) { - $this->configuration_dir = '/var/lib/docker/volumes/coolify_dev_coolify_data/_data/databases/'.$container_name; - } - - $this->commands = [ - "echo 'Starting database.'", - "mkdir -p $this->configuration_dir", - ]; - - $persistent_storages = $this->generate_local_persistent_volumes(); - $persistent_file_volumes = $this->database->fileStorages()->get(); - $volume_names = $this->generate_local_persistent_volumes_only_volume_names(); - $environment_variables = $this->generate_environment_variables(); - $this->add_custom_mongo_conf(); - - $docker_compose = [ - 'services' => [ - $container_name => [ - 'image' => $this->database->image, - 'command' => $startCommand, - 'container_name' => $container_name, - 'environment' => $environment_variables, - 'restart' => RESTART_MODE, - 'networks' => [ - $this->database->destination->network, - ], - 'labels' => defaultDatabaseLabels($this->database)->toArray(), - 'healthcheck' => [ - 'test' => [ - 'CMD', - 'echo', - 'ok', - ], - 'interval' => '5s', - 'timeout' => '5s', - 'retries' => 10, - 'start_period' => '5s', - ], - 'mem_limit' => $this->database->limits_memory, - 'memswap_limit' => $this->database->limits_memory_swap, - 'mem_swappiness' => $this->database->limits_memory_swappiness, - 'mem_reservation' => $this->database->limits_memory_reservation, - 'cpus' => (float) $this->database->limits_cpus, - 'cpu_shares' => $this->database->limits_cpu_shares, - ], - ], - 'networks' => [ - $this->database->destination->network => [ - 'external' => true, - 'name' => $this->database->destination->network, - 'attachable' => true, - ], - ], - ]; - if (! is_null($this->database->limits_cpuset)) { - data_set($docker_compose, "services.{$container_name}.cpuset", $this->database->limits_cpuset); - } - if ($this->database->destination->server->isLogDrainEnabled() && $this->database->isLogDrainEnabled()) { - $docker_compose['services'][$container_name]['logging'] = generate_fluentd_configuration(); - } - if (count($this->database->ports_mappings_array) > 0) { - $docker_compose['services'][$container_name]['ports'] = $this->database->ports_mappings_array; - } - if (count($persistent_storages) > 0) { - $docker_compose['services'][$container_name]['volumes'] = $persistent_storages; - } - if (count($persistent_file_volumes) > 0) { - $docker_compose['services'][$container_name]['volumes'] = $persistent_file_volumes->map(function ($item) { - return "$item->fs_path:$item->mount_path"; - })->toArray(); - } - if (count($volume_names) > 0) { - $docker_compose['volumes'] = $volume_names; - } - if (! is_null($this->database->mongo_conf) || ! empty($this->database->mongo_conf)) { - $docker_compose['services'][$container_name]['volumes'][] = [ - 'type' => 'bind', - 'source' => $this->configuration_dir.'/mongod.conf', - 'target' => '/etc/mongo/mongod.conf', - 'read_only' => true, - ]; - $docker_compose['services'][$container_name]['command'] = $startCommand.' --config /etc/mongo/mongod.conf'; - } - $this->add_default_database(); - $docker_compose['services'][$container_name]['volumes'][] = [ - 'type' => 'bind', - 'source' => $this->configuration_dir.'/docker-entrypoint-initdb.d', - 'target' => '/docker-entrypoint-initdb.d', - 'read_only' => true, - ]; - - // Add custom docker run options - $docker_run_options = convertDockerRunToCompose($this->database->custom_docker_run_options); - $docker_compose = generateCustomDockerRunOptionsForDatabases($docker_run_options, $docker_compose, $container_name, $this->database->destination->network); - - $docker_compose = Yaml::dump($docker_compose, 10); - $docker_compose_base64 = base64_encode($docker_compose); - $this->commands[] = "echo '{$docker_compose_base64}' | base64 -d | tee $this->configuration_dir/docker-compose.yml > /dev/null"; - $readme = generate_readme_file($this->database->name, now()); - $this->commands[] = "echo '{$readme}' > $this->configuration_dir/README.md"; - $this->commands[] = "echo 'Pulling {$database->image} image.'"; - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml pull"; - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml up -d"; - $this->commands[] = "echo 'Database started.'"; - - return remote_process($this->commands, $database->destination->server, callEventOnFinish: 'DatabaseStatusChanged'); - } - - private function generate_local_persistent_volumes() - { - $local_persistent_volumes = []; - foreach ($this->database->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path !== '' && $persistentStorage->host_path !== null) { - $local_persistent_volumes[] = $persistentStorage->host_path.':'.$persistentStorage->mount_path; - } else { - $volume_name = $persistentStorage->name; - $local_persistent_volumes[] = $volume_name.':'.$persistentStorage->mount_path; - } - } - - return $local_persistent_volumes; - } - - private function generate_local_persistent_volumes_only_volume_names() - { - $local_persistent_volumes_names = []; - foreach ($this->database->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path) { - continue; - } - $name = $persistentStorage->name; - $local_persistent_volumes_names[$name] = [ - 'name' => $name, - 'external' => false, - ]; - } - - return $local_persistent_volumes_names; - } - - private function generate_environment_variables() - { - $environment_variables = collect(); - foreach ($this->database->runtime_environment_variables as $env) { - $environment_variables->push("$env->key=$env->real_value"); - } - - if ($environment_variables->filter(fn ($env) => str($env)->contains('MONGO_INITDB_ROOT_USERNAME'))->isEmpty()) { - $environment_variables->push("MONGO_INITDB_ROOT_USERNAME={$this->database->mongo_initdb_root_username}"); - } - - if ($environment_variables->filter(fn ($env) => str($env)->contains('MONGO_INITDB_ROOT_PASSWORD'))->isEmpty()) { - $environment_variables->push("MONGO_INITDB_ROOT_PASSWORD={$this->database->mongo_initdb_root_password}"); - } - - if ($environment_variables->filter(fn ($env) => str($env)->contains('MONGO_INITDB_DATABASE'))->isEmpty()) { - $environment_variables->push("MONGO_INITDB_DATABASE={$this->database->mongo_initdb_database}"); - } - - add_coolify_default_environment_variables($this->database, $environment_variables, $environment_variables); - - return $environment_variables->all(); - } - - private function add_custom_mongo_conf() - { - if (is_null($this->database->mongo_conf) || empty($this->database->mongo_conf)) { - return; - } - $filename = 'mongod.conf'; - $content = $this->database->mongo_conf; - $content_base64 = base64_encode($content); - $this->commands[] = "echo '{$content_base64}' | base64 -d | tee $this->configuration_dir/{$filename} > /dev/null"; - } - - private function add_default_database() - { - $content = "db = db.getSiblingDB(\"{$this->database->mongo_initdb_database}\");db.createCollection('init_collection');db.createUser({user: \"{$this->database->mongo_initdb_root_username}\", pwd: \"{$this->database->mongo_initdb_root_password}\",roles: [{role:\"readWrite\",db:\"{$this->database->mongo_initdb_database}\"}]});"; - $content_base64 = base64_encode($content); - $this->commands[] = "mkdir -p $this->configuration_dir/docker-entrypoint-initdb.d"; - $this->commands[] = "echo '{$content_base64}' | base64 -d | tee $this->configuration_dir/docker-entrypoint-initdb.d/01-default-database.js > /dev/null"; - } -} diff --git a/app/Actions/Database/StartMysql.php b/app/Actions/Database/StartMysql.php deleted file mode 100644 index 73db1512a3..0000000000 --- a/app/Actions/Database/StartMysql.php +++ /dev/null @@ -1,185 +0,0 @@ -database = $database; - - $container_name = $this->database->uuid; - $this->configuration_dir = database_configuration_dir().'/'.$container_name; - - $this->commands = [ - "echo 'Starting database.'", - "mkdir -p $this->configuration_dir", - ]; - - $persistent_storages = $this->generate_local_persistent_volumes(); - $persistent_file_volumes = $this->database->fileStorages()->get(); - $volume_names = $this->generate_local_persistent_volumes_only_volume_names(); - $environment_variables = $this->generate_environment_variables(); - $this->add_custom_mysql(); - $docker_compose = [ - 'services' => [ - $container_name => [ - 'image' => $this->database->image, - 'container_name' => $container_name, - 'environment' => $environment_variables, - 'restart' => RESTART_MODE, - 'networks' => [ - $this->database->destination->network, - ], - 'labels' => defaultDatabaseLabels($this->database)->toArray(), - 'healthcheck' => [ - 'test' => ['CMD', 'mysqladmin', 'ping', '-h', 'localhost', '-u', 'root', "-p{$this->database->mysql_root_password}"], - 'interval' => '5s', - 'timeout' => '5s', - 'retries' => 10, - 'start_period' => '5s', - ], - 'mem_limit' => $this->database->limits_memory, - 'memswap_limit' => $this->database->limits_memory_swap, - 'mem_swappiness' => $this->database->limits_memory_swappiness, - 'mem_reservation' => $this->database->limits_memory_reservation, - 'cpus' => (float) $this->database->limits_cpus, - 'cpu_shares' => $this->database->limits_cpu_shares, - ], - ], - 'networks' => [ - $this->database->destination->network => [ - 'external' => true, - 'name' => $this->database->destination->network, - 'attachable' => true, - ], - ], - ]; - if (! is_null($this->database->limits_cpuset)) { - data_set($docker_compose, "services.{$container_name}.cpuset", $this->database->limits_cpuset); - } - if ($this->database->destination->server->isLogDrainEnabled() && $this->database->isLogDrainEnabled()) { - $docker_compose['services'][$container_name]['logging'] = generate_fluentd_configuration(); - } - if (count($this->database->ports_mappings_array) > 0) { - $docker_compose['services'][$container_name]['ports'] = $this->database->ports_mappings_array; - } - if (count($persistent_storages) > 0) { - $docker_compose['services'][$container_name]['volumes'] = $persistent_storages; - } - if (count($persistent_file_volumes) > 0) { - $docker_compose['services'][$container_name]['volumes'] = $persistent_file_volumes->map(function ($item) { - return "$item->fs_path:$item->mount_path"; - })->toArray(); - } - if (count($volume_names) > 0) { - $docker_compose['volumes'] = $volume_names; - } - if (! is_null($this->database->mysql_conf) || ! empty($this->database->mysql_conf)) { - $docker_compose['services'][$container_name]['volumes'][] = [ - 'type' => 'bind', - 'source' => $this->configuration_dir.'/custom-config.cnf', - 'target' => '/etc/mysql/conf.d/custom-config.cnf', - 'read_only' => true, - ]; - } - - // Add custom docker run options - $docker_run_options = convertDockerRunToCompose($this->database->custom_docker_run_options); - $docker_compose = generateCustomDockerRunOptionsForDatabases($docker_run_options, $docker_compose, $container_name, $this->database->destination->network); - - $docker_compose = Yaml::dump($docker_compose, 10); - $docker_compose_base64 = base64_encode($docker_compose); - $this->commands[] = "echo '{$docker_compose_base64}' | base64 -d | tee $this->configuration_dir/docker-compose.yml > /dev/null"; - $readme = generate_readme_file($this->database->name, now()); - $this->commands[] = "echo '{$readme}' > $this->configuration_dir/README.md"; - $this->commands[] = "echo 'Pulling {$database->image} image.'"; - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml pull"; - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml up -d"; - $this->commands[] = "echo 'Database started.'"; - - return remote_process($this->commands, $database->destination->server, callEventOnFinish: 'DatabaseStatusChanged'); - } - - private function generate_local_persistent_volumes() - { - $local_persistent_volumes = []; - foreach ($this->database->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path !== '' && $persistentStorage->host_path !== null) { - $local_persistent_volumes[] = $persistentStorage->host_path.':'.$persistentStorage->mount_path; - } else { - $volume_name = $persistentStorage->name; - $local_persistent_volumes[] = $volume_name.':'.$persistentStorage->mount_path; - } - } - - return $local_persistent_volumes; - } - - private function generate_local_persistent_volumes_only_volume_names() - { - $local_persistent_volumes_names = []; - foreach ($this->database->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path) { - continue; - } - $name = $persistentStorage->name; - $local_persistent_volumes_names[$name] = [ - 'name' => $name, - 'external' => false, - ]; - } - - return $local_persistent_volumes_names; - } - - private function generate_environment_variables() - { - $environment_variables = collect(); - foreach ($this->database->runtime_environment_variables as $env) { - $environment_variables->push("$env->key=$env->real_value"); - } - - if ($environment_variables->filter(fn ($env) => str($env)->contains('MYSQL_ROOT_PASSWORD'))->isEmpty()) { - $environment_variables->push("MYSQL_ROOT_PASSWORD={$this->database->mysql_root_password}"); - } - - if ($environment_variables->filter(fn ($env) => str($env)->contains('MYSQL_DATABASE'))->isEmpty()) { - $environment_variables->push("MYSQL_DATABASE={$this->database->mysql_database}"); - } - - if ($environment_variables->filter(fn ($env) => str($env)->contains('MYSQL_USER'))->isEmpty()) { - $environment_variables->push("MYSQL_USER={$this->database->mysql_user}"); - } - if ($environment_variables->filter(fn ($env) => str($env)->contains('MYSQL_PASSWORD'))->isEmpty()) { - $environment_variables->push("MYSQL_PASSWORD={$this->database->mysql_password}"); - } - - add_coolify_default_environment_variables($this->database, $environment_variables, $environment_variables); - - return $environment_variables->all(); - } - - private function add_custom_mysql() - { - if (is_null($this->database->mysql_conf) || empty($this->database->mysql_conf)) { - return; - } - $filename = 'custom-config.cnf'; - $content = $this->database->mysql_conf; - $content_base64 = base64_encode($content); - $this->commands[] = "echo '{$content_base64}' | base64 -d | tee $this->configuration_dir/{$filename} > /dev/null"; - } -} diff --git a/app/Actions/Database/StartPostgresql.php b/app/Actions/Database/StartPostgresql.php deleted file mode 100644 index 035849340d..0000000000 --- a/app/Actions/Database/StartPostgresql.php +++ /dev/null @@ -1,236 +0,0 @@ -database = $database; - $container_name = $this->database->uuid; - $this->configuration_dir = database_configuration_dir().'/'.$container_name; - if (isDev()) { - $this->configuration_dir = '/var/lib/docker/volumes/coolify_dev_coolify_data/_data/databases/'.$container_name; - } - - $this->commands = [ - "echo 'Starting database.'", - "mkdir -p $this->configuration_dir", - "mkdir -p $this->configuration_dir/docker-entrypoint-initdb.d/", - ]; - - $persistent_storages = $this->generate_local_persistent_volumes(); - $persistent_file_volumes = $this->database->fileStorages()->get(); - $volume_names = $this->generate_local_persistent_volumes_only_volume_names(); - $environment_variables = $this->generate_environment_variables(); - $this->generate_init_scripts(); - $this->add_custom_conf(); - - $docker_compose = [ - 'services' => [ - $container_name => [ - 'image' => $this->database->image, - 'container_name' => $container_name, - 'environment' => $environment_variables, - 'restart' => RESTART_MODE, - 'networks' => [ - $this->database->destination->network, - ], - 'labels' => defaultDatabaseLabels($this->database)->toArray(), - 'healthcheck' => [ - 'test' => [ - 'CMD-SHELL', - "psql -U {$this->database->postgres_user} -d {$this->database->postgres_db} -c 'SELECT 1' || exit 1", - ], - 'interval' => '5s', - 'timeout' => '5s', - 'retries' => 10, - 'start_period' => '5s', - ], - 'mem_limit' => $this->database->limits_memory, - 'memswap_limit' => $this->database->limits_memory_swap, - 'mem_swappiness' => $this->database->limits_memory_swappiness, - 'mem_reservation' => $this->database->limits_memory_reservation, - 'cpus' => (float) $this->database->limits_cpus, - 'cpu_shares' => $this->database->limits_cpu_shares, - ], - ], - 'networks' => [ - $this->database->destination->network => [ - 'external' => true, - 'name' => $this->database->destination->network, - 'attachable' => true, - ], - ], - ]; - if (filled($this->database->limits_cpuset)) { - data_set($docker_compose, "services.{$container_name}.cpuset", $this->database->limits_cpuset); - } - if ($this->database->destination->server->isLogDrainEnabled() && $this->database->isLogDrainEnabled()) { - $docker_compose['services'][$container_name]['logging'] = generate_fluentd_configuration(); - } - if (count($this->database->ports_mappings_array) > 0) { - $docker_compose['services'][$container_name]['ports'] = $this->database->ports_mappings_array; - } - if (count($persistent_storages) > 0) { - $docker_compose['services'][$container_name]['volumes'] = $persistent_storages; - } - if (count($persistent_file_volumes) > 0) { - $docker_compose['services'][$container_name]['volumes'] = $persistent_file_volumes->map(function ($item) { - return "$item->fs_path:$item->mount_path"; - })->toArray(); - } - if (count($volume_names) > 0) { - $docker_compose['volumes'] = $volume_names; - } - if (count($this->init_scripts) > 0) { - foreach ($this->init_scripts as $init_script) { - $docker_compose['services'][$container_name]['volumes'][] = [ - 'type' => 'bind', - 'source' => $init_script, - 'target' => '/docker-entrypoint-initdb.d/'.basename($init_script), - 'read_only' => true, - ]; - } - } - if (filled($this->database->postgres_conf)) { - $docker_compose['services'][$container_name]['volumes'][] = [ - 'type' => 'bind', - 'source' => $this->configuration_dir.'/custom-postgres.conf', - 'target' => '/etc/postgresql/postgresql.conf', - 'read_only' => true, - ]; - $docker_compose['services'][$container_name]['command'] = [ - 'postgres', - '-c', - 'config_file=/etc/postgresql/postgresql.conf', - ]; - } - // Add custom docker run options - $docker_run_options = convertDockerRunToCompose($this->database->custom_docker_run_options); - $docker_compose = generateCustomDockerRunOptionsForDatabases($docker_run_options, $docker_compose, $container_name, $this->database->destination->network); - - $docker_compose = Yaml::dump($docker_compose, 10); - $docker_compose_base64 = base64_encode($docker_compose); - $this->commands[] = "echo '{$docker_compose_base64}' | base64 -d | tee $this->configuration_dir/docker-compose.yml > /dev/null"; - $readme = generate_readme_file($this->database->name, now()); - $this->commands[] = "echo '{$readme}' > $this->configuration_dir/README.md"; - $this->commands[] = "echo 'Pulling {$database->image} image.'"; - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml pull"; - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml up -d"; - $this->commands[] = "echo 'Database started.'"; - - return remote_process($this->commands, $database->destination->server, callEventOnFinish: 'DatabaseStatusChanged'); - } - - private function generate_local_persistent_volumes() - { - $local_persistent_volumes = []; - foreach ($this->database->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path !== '' && $persistentStorage->host_path !== null) { - $local_persistent_volumes[] = $persistentStorage->host_path.':'.$persistentStorage->mount_path; - } else { - $volume_name = $persistentStorage->name; - $local_persistent_volumes[] = $volume_name.':'.$persistentStorage->mount_path; - } - } - - return $local_persistent_volumes; - } - - private function generate_local_persistent_volumes_only_volume_names() - { - $local_persistent_volumes_names = []; - foreach ($this->database->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path) { - continue; - } - $name = $persistentStorage->name; - $local_persistent_volumes_names[$name] = [ - 'name' => $name, - 'external' => false, - ]; - } - - return $local_persistent_volumes_names; - } - - private function generate_environment_variables() - { - $environment_variables = collect(); - foreach ($this->database->runtime_environment_variables as $env) { - $environment_variables->push("$env->key=$env->real_value"); - } - - if ($environment_variables->filter(fn ($env) => str($env)->contains('POSTGRES_USER'))->isEmpty()) { - $environment_variables->push("POSTGRES_USER={$this->database->postgres_user}"); - } - if ($environment_variables->filter(fn ($env) => str($env)->contains('PGUSER'))->isEmpty()) { - $environment_variables->push("PGUSER={$this->database->postgres_user}"); - } - - if ($environment_variables->filter(fn ($env) => str($env)->contains('POSTGRES_PASSWORD'))->isEmpty()) { - $environment_variables->push("POSTGRES_PASSWORD={$this->database->postgres_password}"); - } - - if ($environment_variables->filter(fn ($env) => str($env)->contains('POSTGRES_DB'))->isEmpty()) { - $environment_variables->push("POSTGRES_DB={$this->database->postgres_db}"); - } - - add_coolify_default_environment_variables($this->database, $environment_variables, $environment_variables); - - return $environment_variables->all(); - } - - private function generate_init_scripts() - { - $this->commands[] = "rm -rf $this->configuration_dir/docker-entrypoint-initdb.d/*"; - - if (blank($this->database->init_scripts) || count($this->database->init_scripts) === 0) { - return; - } - - foreach ($this->database->init_scripts as $init_script) { - $filename = data_get($init_script, 'filename'); - $content = data_get($init_script, 'content'); - $content_base64 = base64_encode($content); - $this->commands[] = "echo '{$content_base64}' | base64 -d | tee $this->configuration_dir/docker-entrypoint-initdb.d/{$filename} > /dev/null"; - $this->init_scripts[] = "$this->configuration_dir/docker-entrypoint-initdb.d/{$filename}"; - } - } - - private function add_custom_conf() - { - $filename = 'custom-postgres.conf'; - $config_file_path = "$this->configuration_dir/$filename"; - - if (blank($this->database->postgres_conf)) { - $this->commands[] = "rm -f $config_file_path"; - - return; - } - - $content = $this->database->postgres_conf; - if (! str($content)->contains('listen_addresses')) { - $content .= "\nlisten_addresses = '*'"; - $this->database->postgres_conf = $content; - $this->database->save(); - } - $content_base64 = base64_encode($content); - $this->commands[] = "echo '{$content_base64}' | base64 -d | tee $config_file_path > /dev/null"; - } -} diff --git a/app/Actions/Database/StartRedis.php b/app/Actions/Database/StartRedis.php deleted file mode 100644 index 1beebd134b..0000000000 --- a/app/Actions/Database/StartRedis.php +++ /dev/null @@ -1,219 +0,0 @@ -database = $database; - - $container_name = $this->database->uuid; - $this->configuration_dir = database_configuration_dir().'/'.$container_name; - - $this->commands = [ - "echo 'Starting database.'", - "mkdir -p $this->configuration_dir", - ]; - - $persistent_storages = $this->generate_local_persistent_volumes(); - $persistent_file_volumes = $this->database->fileStorages()->get(); - $volume_names = $this->generate_local_persistent_volumes_only_volume_names(); - $environment_variables = $this->generate_environment_variables(); - $this->add_custom_redis(); - - $startCommand = $this->buildStartCommand(); - - $docker_compose = [ - 'services' => [ - $container_name => [ - 'image' => $this->database->image, - 'command' => $startCommand, - 'container_name' => $container_name, - 'environment' => $environment_variables, - 'restart' => RESTART_MODE, - 'networks' => [ - $this->database->destination->network, - ], - 'labels' => defaultDatabaseLabels($this->database)->toArray(), - 'healthcheck' => [ - 'test' => [ - 'CMD-SHELL', - 'redis-cli', - 'ping', - ], - 'interval' => '5s', - 'timeout' => '5s', - 'retries' => 10, - 'start_period' => '5s', - ], - 'mem_limit' => $this->database->limits_memory, - 'memswap_limit' => $this->database->limits_memory_swap, - 'mem_swappiness' => $this->database->limits_memory_swappiness, - 'mem_reservation' => $this->database->limits_memory_reservation, - 'cpus' => (float) $this->database->limits_cpus, - 'cpu_shares' => $this->database->limits_cpu_shares, - ], - ], - 'networks' => [ - $this->database->destination->network => [ - 'external' => true, - 'name' => $this->database->destination->network, - 'attachable' => true, - ], - ], - ]; - if (! is_null($this->database->limits_cpuset)) { - data_set($docker_compose, "services.{$container_name}.cpuset", $this->database->limits_cpuset); - } - if ($this->database->destination->server->isLogDrainEnabled() && $this->database->isLogDrainEnabled()) { - $docker_compose['services'][$container_name]['logging'] = generate_fluentd_configuration(); - } - if (count($this->database->ports_mappings_array) > 0) { - $docker_compose['services'][$container_name]['ports'] = $this->database->ports_mappings_array; - } - if (count($persistent_storages) > 0) { - $docker_compose['services'][$container_name]['volumes'] = $persistent_storages; - } - if (count($persistent_file_volumes) > 0) { - $docker_compose['services'][$container_name]['volumes'] = $persistent_file_volumes->map(function ($item) { - return "$item->fs_path:$item->mount_path"; - })->toArray(); - } - if (count($volume_names) > 0) { - $docker_compose['volumes'] = $volume_names; - } - if (! is_null($this->database->redis_conf) || ! empty($this->database->redis_conf)) { - $docker_compose['services'][$container_name]['volumes'][] = [ - 'type' => 'bind', - 'source' => $this->configuration_dir.'/redis.conf', - 'target' => '/usr/local/etc/redis/redis.conf', - 'read_only' => true, - ]; - } - - // Add custom docker run options - $docker_run_options = convertDockerRunToCompose($this->database->custom_docker_run_options); - $docker_compose = generateCustomDockerRunOptionsForDatabases($docker_run_options, $docker_compose, $container_name, $this->database->destination->network); - - $docker_compose = Yaml::dump($docker_compose, 10); - $docker_compose_base64 = base64_encode($docker_compose); - $this->commands[] = "echo '{$docker_compose_base64}' | base64 -d | tee $this->configuration_dir/docker-compose.yml > /dev/null"; - $readme = generate_readme_file($this->database->name, now()); - $this->commands[] = "echo '{$readme}' > $this->configuration_dir/README.md"; - $this->commands[] = "echo 'Pulling {$database->image} image.'"; - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml pull"; - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml up -d"; - $this->commands[] = "echo 'Database started.'"; - - return remote_process($this->commands, $database->destination->server, callEventOnFinish: 'DatabaseStatusChanged'); - } - - private function generate_local_persistent_volumes() - { - $local_persistent_volumes = []; - foreach ($this->database->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path !== '' && $persistentStorage->host_path !== null) { - $local_persistent_volumes[] = $persistentStorage->host_path.':'.$persistentStorage->mount_path; - } else { - $volume_name = $persistentStorage->name; - $local_persistent_volumes[] = $volume_name.':'.$persistentStorage->mount_path; - } - } - - return $local_persistent_volumes; - } - - private function generate_local_persistent_volumes_only_volume_names() - { - $local_persistent_volumes_names = []; - foreach ($this->database->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path) { - continue; - } - $name = $persistentStorage->name; - $local_persistent_volumes_names[$name] = [ - 'name' => $name, - 'external' => false, - ]; - } - - return $local_persistent_volumes_names; - } - - private function generate_environment_variables() - { - $environment_variables = collect(); - - foreach ($this->database->runtime_environment_variables as $env) { - if ($env->is_shared) { - $environment_variables->push("$env->key=$env->real_value"); - - if ($env->key === 'REDIS_PASSWORD') { - $this->database->update(['redis_password' => $env->real_value]); - } - - if ($env->key === 'REDIS_USERNAME') { - $this->database->update(['redis_username' => $env->real_value]); - } - } else { - if ($env->key === 'REDIS_PASSWORD') { - $env->update(['value' => $this->database->redis_password]); - } elseif ($env->key === 'REDIS_USERNAME') { - $env->update(['value' => $this->database->redis_username]); - } - $environment_variables->push("$env->key=$env->real_value"); - } - } - - add_coolify_default_environment_variables($this->database, $environment_variables, $environment_variables); - - return $environment_variables->all(); - } - - private function buildStartCommand(): string - { - $hasRedisConf = ! is_null($this->database->redis_conf) && ! empty($this->database->redis_conf); - $redisConfPath = '/usr/local/etc/redis/redis.conf'; - - if ($hasRedisConf) { - $confContent = $this->database->redis_conf; - $hasRequirePass = str_contains($confContent, 'requirepass'); - - if ($hasRequirePass) { - $command = "redis-server $redisConfPath"; - } else { - $command = "redis-server $redisConfPath --requirepass {$this->database->redis_password}"; - } - } else { - $command = "redis-server --requirepass {$this->database->redis_password} --appendonly yes"; - } - - return $command; - } - - private function add_custom_redis() - { - if (is_null($this->database->redis_conf) || empty($this->database->redis_conf)) { - return; - } - $filename = 'redis.conf'; - Storage::disk('local')->put("tmp/redis.conf_{$this->database->uuid}", $this->database->redis_conf); - $path = Storage::path("tmp/redis.conf_{$this->database->uuid}"); - instant_scp($path, "{$this->configuration_dir}/{$filename}", $this->database->destination->server); - Storage::disk('local')->delete("tmp/redis.conf_{$this->database->uuid}"); - } -} diff --git a/app/Actions/Database/StopDatabase.php b/app/Actions/Database/StopDatabase.php deleted file mode 100644 index e4cea7cee8..0000000000 --- a/app/Actions/Database/StopDatabase.php +++ /dev/null @@ -1,75 +0,0 @@ -destination->server; - if (! $server->isFunctional()) { - return 'Server is not functional'; - } - - $this->stopContainer($database, $database->uuid, 300); - if (! $isDeleteOperation) { - if ($dockerCleanup) { - CleanupDocker::dispatch($server, true); - } - } - - if ($database->is_public) { - StopDatabaseProxy::run($database); - } - - return 'Database stopped successfully'; - } - - private function stopContainer($database, string $containerName, int $timeout = 300): void - { - $server = $database->destination->server; - - $process = Process::timeout($timeout)->start("docker stop --time=$timeout $containerName"); - - $startTime = time(); - while ($process->running()) { - if (time() - $startTime >= $timeout) { - $this->forceStopContainer($containerName, $server); - break; - } - usleep(100000); - } - - $this->removeContainer($containerName, $server); - } - - private function forceStopContainer(string $containerName, $server): void - { - instant_remote_process(command: ["docker kill $containerName"], server: $server, throwError: false); - } - - private function removeContainer(string $containerName, $server): void - { - instant_remote_process(command: ["docker rm -f $containerName"], server: $server, throwError: false); - } - - private function deleteConnectedNetworks($uuid, $server) - { - instant_remote_process(["docker network disconnect {$uuid} coolify-proxy"], $server, false); - instant_remote_process(["docker network rm {$uuid}"], $server, false); - } -} diff --git a/app/Actions/Database/StopDatabaseProxy.php b/app/Actions/Database/StopDatabaseProxy.php deleted file mode 100644 index a753153eb5..0000000000 --- a/app/Actions/Database/StopDatabaseProxy.php +++ /dev/null @@ -1,38 +0,0 @@ -uuid; - if ($database->getMorphClass() === \App\Models\ServiceDatabase::class) { - $uuid = $database->service->uuid; - $server = data_get($database, 'service.server'); - } - instant_remote_process(["docker rm -f {$uuid}-proxy"], $server); - - $database->save(); - - DatabaseProxyStopped::dispatch(); - - } -} diff --git a/app/Actions/Docker/GetContainersStatus.php b/app/Actions/Docker/GetContainersStatus.php deleted file mode 100644 index 091268043e..0000000000 --- a/app/Actions/Docker/GetContainersStatus.php +++ /dev/null @@ -1,345 +0,0 @@ -containers = $containers; - $this->containerReplicates = $containerReplicates; - $this->server = $server; - if (! $this->server->isFunctional()) { - return 'Server is not functional.'; - } - $this->applications = $this->server->applications(); - $skip_these_applications = collect([]); - foreach ($this->applications as $application) { - if ($application->additional_servers->count() > 0) { - $skip_these_applications->push($application); - ComplexStatusCheck::run($application); - $this->applications = $this->applications->filter(function ($value, $key) use ($application) { - return $value->id !== $application->id; - }); - } - } - $this->applications = $this->applications->filter(function ($value, $key) use ($skip_these_applications) { - return ! $skip_these_applications->pluck('id')->contains($value->id); - }); - if ($this->containers === null) { - ['containers' => $this->containers, 'containerReplicates' => $this->containerReplicates] = $this->server->getContainers(); - } - - if (is_null($this->containers)) { - return; - } - - if ($this->containerReplicates) { - foreach ($this->containerReplicates as $containerReplica) { - $name = data_get($containerReplica, 'Name'); - $this->containers = $this->containers->map(function ($container) use ($name, $containerReplica) { - if (data_get($container, 'Spec.Name') === $name) { - $replicas = data_get($containerReplica, 'Replicas'); - $running = str($replicas)->explode('/')[0]; - $total = str($replicas)->explode('/')[1]; - if ($running === $total) { - data_set($container, 'State.Status', 'running'); - data_set($container, 'State.Health.Status', 'healthy'); - } else { - data_set($container, 'State.Status', 'starting'); - data_set($container, 'State.Health.Status', 'unhealthy'); - } - } - - return $container; - }); - } - } - $databases = $this->server->databases(); - $services = $this->server->services()->get(); - $previews = $this->server->previews(); - $foundApplications = []; - $foundApplicationPreviews = []; - $foundDatabases = []; - $foundServices = []; - - foreach ($this->containers as $container) { - if ($this->server->isSwarm()) { - $labels = data_get($container, 'Spec.Labels'); - $uuid = data_get($labels, 'coolify.name'); - } else { - $labels = data_get($container, 'Config.Labels'); - } - $containerStatus = data_get($container, 'State.Status'); - $containerHealth = data_get($container, 'State.Health.Status', 'unhealthy'); - $containerStatus = "$containerStatus ($containerHealth)"; - $labels = Arr::undot(format_docker_labels_to_json($labels)); - $applicationId = data_get($labels, 'coolify.applicationId'); - if ($applicationId) { - $pullRequestId = data_get($labels, 'coolify.pullRequestId'); - if ($pullRequestId) { - if (str($applicationId)->contains('-')) { - $applicationId = str($applicationId)->before('-'); - } - $preview = ApplicationPreview::where('application_id', $applicationId)->where('pull_request_id', $pullRequestId)->first(); - if ($preview) { - $foundApplicationPreviews[] = $preview->id; - $statusFromDb = $preview->status; - if ($statusFromDb !== $containerStatus) { - $preview->update(['status' => $containerStatus]); - } else { - $preview->update(['last_online_at' => now()]); - } - } else { - // Notify user that this container should not be there. - } - } else { - $application = $this->applications->where('id', $applicationId)->first(); - if ($application) { - $foundApplications[] = $application->id; - $statusFromDb = $application->status; - if ($statusFromDb !== $containerStatus) { - $application->update(['status' => $containerStatus]); - } else { - $application->update(['last_online_at' => now()]); - } - } else { - // Notify user that this container should not be there. - } - } - } else { - $uuid = data_get($labels, 'com.docker.compose.service'); - $type = data_get($labels, 'coolify.type'); - - if ($uuid) { - if ($type === 'service') { - $database_id = data_get($labels, 'coolify.service.subId'); - if ($database_id) { - $service_db = ServiceDatabase::where('id', $database_id)->first(); - if ($service_db) { - $uuid = data_get($service_db, 'service.uuid'); - if ($uuid) { - $isPublic = data_get($service_db, 'is_public'); - if ($isPublic) { - $foundTcpProxy = $this->containers->filter(function ($value, $key) use ($uuid) { - if ($this->server->isSwarm()) { - return data_get($value, 'Spec.Name') === "coolify-proxy_$uuid"; - } else { - return data_get($value, 'Name') === "/$uuid-proxy"; - } - })->first(); - if (! $foundTcpProxy) { - StartDatabaseProxy::run($service_db); - // $this->server->team?->notify(new ContainerRestarted("TCP Proxy for {$service_db->service->name}", $this->server)); - } - } - } - } - } - } else { - $database = $databases->where('uuid', $uuid)->first(); - if ($database) { - $isPublic = data_get($database, 'is_public'); - $foundDatabases[] = $database->id; - $statusFromDb = $database->status; - if ($statusFromDb !== $containerStatus) { - $database->update(['status' => $containerStatus]); - } else { - $database->update(['last_online_at' => now()]); - } - - if ($isPublic) { - $foundTcpProxy = $this->containers->filter(function ($value, $key) use ($uuid) { - if ($this->server->isSwarm()) { - return data_get($value, 'Spec.Name') === "coolify-proxy_$uuid"; - } else { - return data_get($value, 'Name') === "/$uuid-proxy"; - } - })->first(); - if (! $foundTcpProxy) { - StartDatabaseProxy::run($database); - // $this->server->team?->notify(new ContainerRestarted("TCP Proxy for database", $this->server)); - } - } - } else { - // Notify user that this container should not be there. - } - } - } - if (data_get($container, 'Name') === '/coolify-db') { - $foundDatabases[] = 0; - } - } - $serviceLabelId = data_get($labels, 'coolify.serviceId'); - if ($serviceLabelId) { - $subType = data_get($labels, 'coolify.service.subType'); - $subId = data_get($labels, 'coolify.service.subId'); - $service = $services->where('id', $serviceLabelId)->first(); - if (! $service) { - continue; - } - if ($subType === 'application') { - $service = $service->applications()->where('id', $subId)->first(); - } else { - $service = $service->databases()->where('id', $subId)->first(); - } - if ($service) { - $foundServices[] = "$service->id-$service->name"; - $statusFromDb = $service->status; - if ($statusFromDb !== $containerStatus) { - $service->update(['status' => $containerStatus]); - } else { - $service->update(['last_online_at' => now()]); - } - } - } - } - $exitedServices = collect([]); - foreach ($services as $service) { - $apps = $service->applications()->get(); - $dbs = $service->databases()->get(); - foreach ($apps as $app) { - if (in_array("$app->id-$app->name", $foundServices)) { - continue; - } else { - $exitedServices->push($app); - } - } - foreach ($dbs as $db) { - if (in_array("$db->id-$db->name", $foundServices)) { - continue; - } else { - $exitedServices->push($db); - } - } - } - $exitedServices = $exitedServices->unique('uuid'); - foreach ($exitedServices as $exitedService) { - if (str($exitedService->status)->startsWith('exited')) { - continue; - } - $name = data_get($exitedService, 'name'); - $fqdn = data_get($exitedService, 'fqdn'); - if ($name) { - if ($fqdn) { - $containerName = "$name, available at $fqdn"; - } else { - $containerName = $name; - } - } else { - if ($fqdn) { - $containerName = $fqdn; - } else { - $containerName = null; - } - } - $projectUuid = data_get($service, 'environment.project.uuid'); - $serviceUuid = data_get($service, 'uuid'); - $environmentName = data_get($service, 'environment.name'); - - if ($projectUuid && $serviceUuid && $environmentName) { - $url = base_url().'/project/'.$projectUuid.'/'.$environmentName.'/service/'.$serviceUuid; - } else { - $url = null; - } - // $this->server->team?->notify(new ContainerStopped($containerName, $this->server, $url)); - $exitedService->update(['status' => 'exited']); - } - - $notRunningApplications = $this->applications->pluck('id')->diff($foundApplications); - foreach ($notRunningApplications as $applicationId) { - $application = $this->applications->where('id', $applicationId)->first(); - if (str($application->status)->startsWith('exited')) { - continue; - } - $application->update(['status' => 'exited']); - - $name = data_get($application, 'name'); - $fqdn = data_get($application, 'fqdn'); - - $containerName = $name ? "$name ($fqdn)" : $fqdn; - - $projectUuid = data_get($application, 'environment.project.uuid'); - $applicationUuid = data_get($application, 'uuid'); - $environment = data_get($application, 'environment.name'); - - if ($projectUuid && $applicationUuid && $environment) { - $url = base_url().'/project/'.$projectUuid.'/'.$environment.'/application/'.$applicationUuid; - } else { - $url = null; - } - - // $this->server->team?->notify(new ContainerStopped($containerName, $this->server, $url)); - } - $notRunningApplicationPreviews = $previews->pluck('id')->diff($foundApplicationPreviews); - foreach ($notRunningApplicationPreviews as $previewId) { - $preview = $previews->where('id', $previewId)->first(); - if (str($preview->status)->startsWith('exited')) { - continue; - } - $preview->update(['status' => 'exited']); - - $name = data_get($preview, 'name'); - $fqdn = data_get($preview, 'fqdn'); - - $containerName = $name ? "$name ($fqdn)" : $fqdn; - - $projectUuid = data_get($preview, 'application.environment.project.uuid'); - $environmentName = data_get($preview, 'application.environment.name'); - $applicationUuid = data_get($preview, 'application.uuid'); - - if ($projectUuid && $applicationUuid && $environmentName) { - $url = base_url().'/project/'.$projectUuid.'/'.$environmentName.'/application/'.$applicationUuid; - } else { - $url = null; - } - - // $this->server->team?->notify(new ContainerStopped($containerName, $this->server, $url)); - } - $notRunningDatabases = $databases->pluck('id')->diff($foundDatabases); - foreach ($notRunningDatabases as $database) { - $database = $databases->where('id', $database)->first(); - if (str($database->status)->startsWith('exited')) { - continue; - } - $database->update(['status' => 'exited']); - - $name = data_get($database, 'name'); - $fqdn = data_get($database, 'fqdn'); - - $containerName = $name; - - $projectUuid = data_get($database, 'environment.project.uuid'); - $environmentName = data_get($database, 'environment.name'); - $databaseUuid = data_get($database, 'uuid'); - - if ($projectUuid && $databaseUuid && $environmentName) { - $url = base_url().'/project/'.$projectUuid.'/'.$environmentName.'/database/'.$databaseUuid; - } else { - $url = null; - } - // $this->server->team?->notify(new ContainerStopped($containerName, $this->server, $url)); - } - } -} diff --git a/app/Actions/Fortify/CreateNewUser.php b/app/Actions/Fortify/CreateNewUser.php deleted file mode 100644 index ea2befd3a8..0000000000 --- a/app/Actions/Fortify/CreateNewUser.php +++ /dev/null @@ -1,70 +0,0 @@ - $input - */ - public function create(array $input): User - { - $settings = instanceSettings(); - if (! $settings->is_registration_enabled) { - abort(403); - } - Validator::make($input, [ - 'name' => ['required', 'string', 'max:255'], - 'email' => [ - 'required', - 'string', - 'email', - 'max:255', - Rule::unique(User::class), - ], - 'password' => ['required', Password::defaults(), 'confirmed'], - ])->validate(); - - if (User::count() == 0) { - // If this is the first user, make them the root user - // Team is already created in the database/seeders/ProductionSeeder.php - $user = User::create([ - 'id' => 0, - 'name' => $input['name'], - 'email' => strtolower($input['email']), - 'password' => Hash::make($input['password']), - ]); - $team = $user->teams()->first(); - - // Disable registration after first user is created - $settings = instanceSettings(); - $settings->is_registration_enabled = false; - $settings->save(); - } else { - $user = User::create([ - 'name' => $input['name'], - 'email' => strtolower($input['email']), - 'password' => Hash::make($input['password']), - ]); - $team = $user->teams()->first(); - if (isCloud()) { - $user->sendVerificationEmail(); - } else { - $user->markEmailAsVerified(); - } - } - // Set session variable - session(['currentTeam' => $user->currentTeam = $team]); - - return $user; - } -} diff --git a/app/Actions/Fortify/ResetUserPassword.php b/app/Actions/Fortify/ResetUserPassword.php deleted file mode 100644 index d3727a52cd..0000000000 --- a/app/Actions/Fortify/ResetUserPassword.php +++ /dev/null @@ -1,28 +0,0 @@ - $input - */ - public function reset(User $user, array $input): void - { - Validator::make($input, [ - 'password' => ['required', Password::defaults(), 'confirmed'], - ])->validate(); - - $user->forceFill([ - 'password' => Hash::make($input['password']), - ])->save(); - } -} diff --git a/app/Actions/Fortify/UpdateUserPassword.php b/app/Actions/Fortify/UpdateUserPassword.php deleted file mode 100644 index 0c51ec56db..0000000000 --- a/app/Actions/Fortify/UpdateUserPassword.php +++ /dev/null @@ -1,31 +0,0 @@ - $input - */ - public function update(User $user, array $input): void - { - Validator::make($input, [ - 'current_password' => ['required', 'string', 'current_password:web'], - 'password' => ['required', Password::defaults(), 'confirmed'], - ], [ - 'current_password.current_password' => __('The provided password does not match your current password.'), - ])->validateWithBag('updatePassword'); - - $user->forceFill([ - 'password' => Hash::make($input['password']), - ])->save(); - } -} diff --git a/app/Actions/Fortify/UpdateUserProfileInformation.php b/app/Actions/Fortify/UpdateUserProfileInformation.php deleted file mode 100644 index c8bfd930a6..0000000000 --- a/app/Actions/Fortify/UpdateUserProfileInformation.php +++ /dev/null @@ -1,60 +0,0 @@ - $input - */ - public function update(User $user, array $input): void - { - Validator::make($input, [ - 'name' => ['required', 'string', 'max:255'], - - 'email' => [ - 'required', - 'string', - 'email', - 'max:255', - Rule::unique('users')->ignore($user->id), - ], - ])->validateWithBag('updateProfileInformation'); - - if ( - $input['email'] !== $user->email && - $user instanceof MustVerifyEmail - ) { - $this->updateVerifiedUser($user, $input); - } else { - $user->forceFill([ - 'name' => $input['name'], - 'email' => $input['email'], - ])->save(); - } - } - - /** - * Update the given verified user's profile information. - * - * @param array $input - */ - protected function updateVerifiedUser(User $user, array $input): void - { - $user->forceFill([ - 'name' => $input['name'], - 'email' => $input['email'], - 'email_verified_at' => null, - ])->save(); - - $user->sendEmailVerificationNotification(); - } -} diff --git a/app/Actions/Proxy/CheckConfiguration.php b/app/Actions/Proxy/CheckConfiguration.php deleted file mode 100644 index bdeafd0611..0000000000 --- a/app/Actions/Proxy/CheckConfiguration.php +++ /dev/null @@ -1,33 +0,0 @@ -proxyType(); - if ($proxyType === 'NONE') { - return 'OK'; - } - $proxy_path = $server->proxyPath(); - $payload = [ - "mkdir -p $proxy_path", - "cat $proxy_path/docker-compose.yml", - ]; - $proxy_configuration = instant_remote_process($payload, $server, false); - if ($reset || ! $proxy_configuration || is_null($proxy_configuration)) { - $proxy_configuration = str(generate_default_proxy_configuration($server))->trim()->value(); - } - if (! $proxy_configuration || is_null($proxy_configuration)) { - throw new \Exception('Could not generate proxy configuration'); - } - - return $proxy_configuration; - } -} diff --git a/app/Actions/Proxy/CheckProxy.php b/app/Actions/Proxy/CheckProxy.php deleted file mode 100644 index 6c8dd52347..0000000000 --- a/app/Actions/Proxy/CheckProxy.php +++ /dev/null @@ -1,111 +0,0 @@ -isFunctional()) { - return false; - } - if ($server->isBuildServer()) { - if ($server->proxy) { - $server->proxy = null; - $server->save(); - } - - return false; - } - $proxyType = $server->proxyType(); - if (is_null($proxyType) || $proxyType === 'NONE' || $server->proxy->force_stop) { - return false; - } - ['uptime' => $uptime, 'error' => $error] = $server->validateConnection(); - if (! $uptime) { - throw new \Exception($error); - } - if (! $server->isProxyShouldRun()) { - if ($fromUI) { - throw new \Exception('Proxy should not run. You selected the Custom Proxy.'); - } else { - return false; - } - } - if ($server->isSwarm()) { - $status = getContainerStatus($server, 'coolify-proxy_traefik'); - $server->proxy->set('status', $status); - $server->save(); - if ($status === 'running') { - return false; - } - - return true; - } else { - $status = getContainerStatus($server, 'coolify-proxy'); - if ($status === 'running') { - $server->proxy->set('status', 'running'); - $server->save(); - - return false; - } - if ($server->settings->is_cloudflare_tunnel) { - return false; - } - $ip = $server->ip; - if ($server->id === 0) { - $ip = 'host.docker.internal'; - } - - $portsToCheck = ['80', '443']; - - try { - if ($server->proxyType() !== ProxyTypes::NONE->value) { - $proxyCompose = CheckConfiguration::run($server); - if (isset($proxyCompose)) { - $yaml = Yaml::parse($proxyCompose); - $portsToCheck = []; - if ($server->proxyType() === ProxyTypes::TRAEFIK->value) { - $ports = data_get($yaml, 'services.traefik.ports'); - } elseif ($server->proxyType() === ProxyTypes::CADDY->value) { - $ports = data_get($yaml, 'services.caddy.ports'); - } - if (isset($ports)) { - foreach ($ports as $port) { - $portsToCheck[] = str($port)->before(':')->value(); - } - } - } - } else { - $portsToCheck = []; - } - } catch (\Exception $e) { - Log::error('Error checking proxy: '.$e->getMessage()); - } - if (count($portsToCheck) === 0) { - return false; - } - foreach ($portsToCheck as $port) { - $connection = @fsockopen($ip, $port); - if (is_resource($connection) && fclose($connection)) { - if ($fromUI) { - throw new \Exception("Port $port is in use.
You must stop the process using this port.
Docs: https://coolify.io/docs
Discord: https://coollabs.io/discord"); - } else { - return false; - } - } - } - - return true; - } - } -} diff --git a/app/Actions/Proxy/SaveConfiguration.php b/app/Actions/Proxy/SaveConfiguration.php deleted file mode 100644 index f2de2b3f5a..0000000000 --- a/app/Actions/Proxy/SaveConfiguration.php +++ /dev/null @@ -1,28 +0,0 @@ -proxyPath(); - $docker_compose_yml_base64 = base64_encode($proxy_settings); - - $server->proxy->last_saved_settings = str($docker_compose_yml_base64)->pipe('md5')->value; - $server->save(); - - return instant_remote_process([ - "mkdir -p $proxy_path", - "echo '$docker_compose_yml_base64' | base64 -d | tee $proxy_path/docker-compose.yml > /dev/null", - ], $server); - } -} diff --git a/app/Actions/Proxy/StartProxy.php b/app/Actions/Proxy/StartProxy.php deleted file mode 100644 index 1fff558618..0000000000 --- a/app/Actions/Proxy/StartProxy.php +++ /dev/null @@ -1,78 +0,0 @@ -proxyType(); - if ((is_null($proxyType) || $proxyType === 'NONE' || $server->proxy->force_stop || $server->isBuildServer()) && $force === false) { - return 'OK'; - } - $commands = collect([]); - $proxy_path = $server->proxyPath(); - $configuration = CheckConfiguration::run($server); - if (! $configuration) { - throw new \Exception('Configuration is not synced'); - } - SaveConfiguration::run($server, $configuration); - $docker_compose_yml_base64 = base64_encode($configuration); - $server->proxy->last_applied_settings = str($docker_compose_yml_base64)->pipe('md5')->value(); - $server->save(); - if ($server->isSwarmManager()) { - $commands = $commands->merge([ - "mkdir -p $proxy_path/dynamic", - "cd $proxy_path", - "echo 'Creating required Docker Compose file.'", - "echo 'Starting coolify-proxy.'", - 'docker stack deploy --detach=true -c docker-compose.yml coolify-proxy', - "echo 'Successfully started coolify-proxy.'", - ]); - } else { - if (isDev()) { - if ($proxyType === ProxyTypes::CADDY->value) { - $proxy_path = '/data/coolify/proxy/caddy'; - } - } - $caddyfile = 'import /dynamic/*.caddy'; - $commands = $commands->merge([ - "mkdir -p $proxy_path/dynamic", - "cd $proxy_path", - "echo '$caddyfile' > $proxy_path/dynamic/Caddyfile", - "echo 'Creating required Docker Compose file.'", - "echo 'Pulling docker image.'", - 'docker compose pull', - 'if docker ps -a --format "{{.Names}}" | grep -q "^coolify-proxy$"; then', - " echo 'Stopping and removing existing coolify-proxy.'", - ' docker rm -f coolify-proxy || true', - " echo 'Successfully stopped and removed existing coolify-proxy.'", - 'fi', - "echo 'Starting coolify-proxy.'", - 'docker compose up -d', - "echo 'Successfully started coolify-proxy.'", - ]); - $commands = $commands->merge(connectProxyToNetworks($server)); - } - - if ($async) { - return remote_process($commands, $server, callEventOnFinish: 'ProxyStarted', callEventData: $server); - } else { - instant_remote_process($commands, $server); - $server->proxy->set('status', 'running'); - $server->proxy->set('type', $proxyType); - $server->save(); - ProxyStarted::dispatch($server); - - return 'OK'; - } - } -} diff --git a/app/Actions/Server/CleanupDocker.php b/app/Actions/Server/CleanupDocker.php deleted file mode 100644 index ba4c2311ae..0000000000 --- a/app/Actions/Server/CleanupDocker.php +++ /dev/null @@ -1,49 +0,0 @@ -settings->delete_unused_volumes) { - $commands[] = 'docker volume prune -af'; - } - - if ($server->settings->delete_unused_networks) { - $commands[] = 'docker network prune -f'; - } - - $cleanupLog = []; - foreach ($commands as $command) { - $commandOutput = instant_remote_process([$command], $server, false); - if ($commandOutput !== null) { - $cleanupLog[] = [ - 'command' => $command, - 'output' => $commandOutput, - ]; - } - } - - return $cleanupLog; - } -} diff --git a/app/Actions/Server/ConfigureCloudflared.php b/app/Actions/Server/ConfigureCloudflared.php deleted file mode 100644 index fc04e67a45..0000000000 --- a/app/Actions/Server/ConfigureCloudflared.php +++ /dev/null @@ -1,55 +0,0 @@ - [ - 'coolify-cloudflared' => [ - 'container_name' => 'coolify-cloudflared', - 'image' => 'cloudflare/cloudflared:latest', - 'restart' => RESTART_MODE, - 'network_mode' => 'host', - 'command' => 'tunnel run', - 'environment' => [ - "TUNNEL_TOKEN={$cloudflare_token}", - ], - ], - ], - ]; - $config = Yaml::dump($config, 12, 2); - $docker_compose_yml_base64 = base64_encode($config); - $commands = collect([ - 'mkdir -p /tmp/cloudflared', - 'cd /tmp/cloudflared', - "echo '$docker_compose_yml_base64' | base64 -d | tee docker-compose.yml > /dev/null", - 'docker compose pull', - 'docker compose down -v --remove-orphans > /dev/null 2>&1', - 'docker compose up -d --remove-orphans', - ]); - instant_remote_process($commands, $server); - } catch (\Throwable $e) { - $server->settings->is_cloudflare_tunnel = false; - $server->settings->save(); - throw $e; - } finally { - CloudflareTunnelConfigured::dispatch($server->team_id); - - $commands = collect([ - 'rm -fr /tmp/cloudflared', - ]); - instant_remote_process($commands, $server); - } - } -} diff --git a/app/Actions/Server/DeleteServer.php b/app/Actions/Server/DeleteServer.php deleted file mode 100644 index 15c892e755..0000000000 --- a/app/Actions/Server/DeleteServer.php +++ /dev/null @@ -1,17 +0,0 @@ -forceDelete(); - } -} diff --git a/app/Actions/Server/InstallDocker.php b/app/Actions/Server/InstallDocker.php deleted file mode 100644 index cbcb20368c..0000000000 --- a/app/Actions/Server/InstallDocker.php +++ /dev/null @@ -1,109 +0,0 @@ -validateOS(); - if (! $supported_os_type) { - throw new \Exception('Server OS type is not supported for automated installation. Please install Docker manually before continuing: documentation.'); - } - $config = base64_encode('{ - "log-driver": "json-file", - "log-opts": { - "max-size": "10m", - "max-file": "3" - } - }'); - $found = StandaloneDocker::where('server_id', $server->id); - if ($found->count() == 0 && $server->id) { - StandaloneDocker::create([ - 'name' => 'coolify', - 'network' => 'coolify', - 'server_id' => $server->id, - ]); - } - $command = collect([]); - if (isDev() && $server->id === 0) { - $command = $command->merge([ - "echo 'Installing Prerequisites...'", - 'sleep 1', - "echo 'Installing Docker Engine...'", - "echo 'Configuring Docker Engine (merging existing configuration with the required)...'", - 'sleep 4', - "echo 'Restarting Docker Engine...'", - 'ls -l /tmp', - ]); - - return remote_process($command, $server); - } else { - if ($supported_os_type->contains('debian')) { - $command = $command->merge([ - "echo 'Installing Prerequisites...'", - 'apt-get update -y', - 'command -v curl >/dev/null || apt install -y curl', - 'command -v wget >/dev/null || apt install -y wget', - 'command -v git >/dev/null || apt install -y git', - 'command -v jq >/dev/null || apt install -y jq', - ]); - } elseif ($supported_os_type->contains('rhel')) { - $command = $command->merge([ - "echo 'Installing Prerequisites...'", - 'command -v curl >/dev/null || dnf install -y curl', - 'command -v wget >/dev/null || dnf install -y wget', - 'command -v git >/dev/null || dnf install -y git', - 'command -v jq >/dev/null || dnf install -y jq', - ]); - } elseif ($supported_os_type->contains('sles')) { - $command = $command->merge([ - "echo 'Installing Prerequisites...'", - 'zypper update -y', - 'command -v curl >/dev/null || zypper install -y curl', - 'command -v wget >/dev/null || zypper install -y wget', - 'command -v git >/dev/null || zypper install -y git', - 'command -v jq >/dev/null || zypper install -y jq', - ]); - } else { - throw new \Exception('Unsupported OS'); - } - $command = $command->merge([ - "echo 'Installing Docker Engine...'", - "curl https://releases.rancher.com/install-docker/{$dockerVersion}.sh | sh || curl https://get.docker.com | sh -s -- --version {$dockerVersion}", - "echo 'Configuring Docker Engine (merging existing configuration with the required)...'", - 'test -s /etc/docker/daemon.json && cp /etc/docker/daemon.json "/etc/docker/daemon.json.original-$(date +"%Y%m%d-%H%M%S")"', - "test ! -s /etc/docker/daemon.json && echo '{$config}' | base64 -d | tee /etc/docker/daemon.json > /dev/null", - "echo '{$config}' | base64 -d | tee /etc/docker/daemon.json.coolify > /dev/null", - 'jq . /etc/docker/daemon.json.coolify | tee /etc/docker/daemon.json.coolify.pretty > /dev/null', - 'mv /etc/docker/daemon.json.coolify.pretty /etc/docker/daemon.json.coolify', - "jq -s '.[0] * .[1]' /etc/docker/daemon.json.coolify /etc/docker/daemon.json | tee /etc/docker/daemon.json.appended > /dev/null", - 'mv /etc/docker/daemon.json.appended /etc/docker/daemon.json', - "echo 'Restarting Docker Engine...'", - 'systemctl enable docker >/dev/null 2>&1 || true', - 'systemctl restart docker', - ]); - if ($server->isSwarm()) { - $command = $command->merge([ - 'docker network create --attachable --driver overlay coolify-overlay >/dev/null 2>&1 || true', - ]); - } else { - $command = $command->merge([ - 'docker network create --attachable coolify >/dev/null 2>&1 || true', - ]); - $command = $command->merge([ - "echo 'Done!'", - ]); - } - - return remote_process($command, $server); - } - } -} diff --git a/app/Actions/Server/ResourcesCheck.php b/app/Actions/Server/ResourcesCheck.php deleted file mode 100644 index e6b90ba380..0000000000 --- a/app/Actions/Server/ResourcesCheck.php +++ /dev/null @@ -1,41 +0,0 @@ -subSeconds($seconds))->update(['status' => 'exited']); - ServiceApplication::where('last_online_at', '<', now()->subSeconds($seconds))->update(['status' => 'exited']); - ServiceDatabase::where('last_online_at', '<', now()->subSeconds($seconds))->update(['status' => 'exited']); - StandalonePostgresql::where('last_online_at', '<', now()->subSeconds($seconds))->update(['status' => 'exited']); - StandaloneRedis::where('last_online_at', '<', now()->subSeconds($seconds))->update(['status' => 'exited']); - StandaloneMongodb::where('last_online_at', '<', now()->subSeconds($seconds))->update(['status' => 'exited']); - StandaloneMysql::where('last_online_at', '<', now()->subSeconds($seconds))->update(['status' => 'exited']); - StandaloneMariadb::where('last_online_at', '<', now()->subSeconds($seconds))->update(['status' => 'exited']); - StandaloneKeydb::where('last_online_at', '<', now()->subSeconds($seconds))->update(['status' => 'exited']); - StandaloneDragonfly::where('last_online_at', '<', now()->subSeconds($seconds))->update(['status' => 'exited']); - StandaloneClickhouse::where('last_online_at', '<', now()->subSeconds($seconds))->update(['status' => 'exited']); - } catch (\Throwable $e) { - return handleError($e); - } - } -} diff --git a/app/Actions/Server/RestartContainer.php b/app/Actions/Server/RestartContainer.php deleted file mode 100644 index 63361d8b71..0000000000 --- a/app/Actions/Server/RestartContainer.php +++ /dev/null @@ -1,16 +0,0 @@ -restartContainer($containerName); - } -} diff --git a/app/Actions/Server/RunCommand.php b/app/Actions/Server/RunCommand.php deleted file mode 100644 index 254c78587c..0000000000 --- a/app/Actions/Server/RunCommand.php +++ /dev/null @@ -1,17 +0,0 @@ -value); - } -} diff --git a/app/Actions/Server/ServerCheck.php b/app/Actions/Server/ServerCheck.php deleted file mode 100644 index 75b8501f32..0000000000 --- a/app/Actions/Server/ServerCheck.php +++ /dev/null @@ -1,267 +0,0 @@ -server = $server; - try { - if ($this->server->isFunctional() === false) { - return 'Server is not functional.'; - } - - if (! $this->server->isSwarmWorker() && ! $this->server->isBuildServer()) { - - if (isset($data)) { - $data = collect($data); - - $this->server->sentinelHeartbeat(); - - $this->containers = collect(data_get($data, 'containers')); - - $filesystemUsageRoot = data_get($data, 'filesystem_usage_root.used_percentage'); - ServerStorageCheckJob::dispatch($this->server, $filesystemUsageRoot); - - $containerReplicates = null; - $this->isSentinel = true; - } else { - ['containers' => $this->containers, 'containerReplicates' => $containerReplicates] = $this->server->getContainers(); - // ServerStorageCheckJob::dispatch($this->server); - } - - if (is_null($this->containers)) { - return 'No containers found.'; - } - - if (isset($containerReplicates)) { - foreach ($containerReplicates as $containerReplica) { - $name = data_get($containerReplica, 'Name'); - $this->containers = $this->containers->map(function ($container) use ($name, $containerReplica) { - if (data_get($container, 'Spec.Name') === $name) { - $replicas = data_get($containerReplica, 'Replicas'); - $running = str($replicas)->explode('/')[0]; - $total = str($replicas)->explode('/')[1]; - if ($running === $total) { - data_set($container, 'State.Status', 'running'); - data_set($container, 'State.Health.Status', 'healthy'); - } else { - data_set($container, 'State.Status', 'starting'); - data_set($container, 'State.Health.Status', 'unhealthy'); - } - } - - return $container; - }); - } - } - $this->checkContainers(); - - if ($this->server->isSentinelEnabled() && $this->isSentinel === false) { - CheckAndStartSentinelJob::dispatch($this->server); - } - - if ($this->server->isLogDrainEnabled()) { - $this->checkLogDrainContainer(); - } - - if ($this->server->proxySet() && ! $this->server->proxy->force_stop) { - $foundProxyContainer = $this->containers->filter(function ($value, $key) { - if ($this->server->isSwarm()) { - return data_get($value, 'Spec.Name') === 'coolify-proxy_traefik'; - } else { - return data_get($value, 'Name') === '/coolify-proxy'; - } - })->first(); - if (! $foundProxyContainer) { - try { - $shouldStart = CheckProxy::run($this->server); - if ($shouldStart) { - StartProxy::run($this->server, false); - $this->server->team?->notify(new ContainerRestarted('coolify-proxy', $this->server)); - } - } catch (\Throwable $e) { - } - } else { - $this->server->proxy->status = data_get($foundProxyContainer, 'State.Status'); - $this->server->save(); - $connectProxyToDockerNetworks = connectProxyToNetworks($this->server); - instant_remote_process($connectProxyToDockerNetworks, $this->server, false); - } - } - } - } catch (\Throwable $e) { - return handleError($e); - } - } - - private function checkLogDrainContainer() - { - $foundLogDrainContainer = $this->containers->filter(function ($value, $key) { - return data_get($value, 'Name') === '/coolify-log-drain'; - })->first(); - if ($foundLogDrainContainer) { - $status = data_get($foundLogDrainContainer, 'State.Status'); - if ($status !== 'running') { - StartLogDrain::dispatch($this->server); - } - } else { - StartLogDrain::dispatch($this->server); - } - } - - private function checkContainers() - { - foreach ($this->containers as $container) { - if ($this->isSentinel) { - $labels = Arr::undot(data_get($container, 'labels')); - } else { - if ($this->server->isSwarm()) { - $labels = Arr::undot(data_get($container, 'Spec.Labels')); - } else { - $labels = Arr::undot(data_get($container, 'Config.Labels')); - } - } - $managed = data_get($labels, 'coolify.managed'); - if (! $managed) { - continue; - } - $uuid = data_get($labels, 'coolify.name'); - if (! $uuid) { - $uuid = data_get($labels, 'com.docker.compose.service'); - } - - if ($this->isSentinel) { - $containerStatus = data_get($container, 'state'); - $containerHealth = data_get($container, 'health_status'); - } else { - $containerStatus = data_get($container, 'State.Status'); - $containerHealth = data_get($container, 'State.Health.Status', 'unhealthy'); - } - $containerStatus = "$containerStatus ($containerHealth)"; - - $applicationId = data_get($labels, 'coolify.applicationId'); - $serviceId = data_get($labels, 'coolify.serviceId'); - $databaseId = data_get($labels, 'coolify.databaseId'); - $pullRequestId = data_get($labels, 'coolify.pullRequestId'); - - if ($applicationId) { - // Application - if ($pullRequestId != 0) { - if (str($applicationId)->contains('-')) { - $applicationId = str($applicationId)->before('-'); - } - $preview = ApplicationPreview::where('application_id', $applicationId)->where('pull_request_id', $pullRequestId)->first(); - if ($preview) { - $preview->update(['status' => $containerStatus]); - } - } else { - $application = Application::where('id', $applicationId)->first(); - if ($application) { - $application->update([ - 'status' => $containerStatus, - 'last_online_at' => now(), - ]); - } - } - } elseif (isset($serviceId)) { - // Service - $subType = data_get($labels, 'coolify.service.subType'); - $subId = data_get($labels, 'coolify.service.subId'); - $service = Service::where('id', $serviceId)->first(); - if (! $service) { - continue; - } - if ($subType === 'application') { - $service = ServiceApplication::where('id', $subId)->first(); - } else { - $service = ServiceDatabase::where('id', $subId)->first(); - } - if ($service) { - $service->update([ - 'status' => $containerStatus, - 'last_online_at' => now(), - ]); - if ($subType === 'database') { - $isPublic = data_get($service, 'is_public'); - if ($isPublic) { - $foundTcpProxy = $this->containers->filter(function ($value, $key) use ($uuid) { - if ($this->isSentinel) { - return data_get($value, 'name') === $uuid.'-proxy'; - } else { - - if ($this->server->isSwarm()) { - return data_get($value, 'Spec.Name') === "coolify-proxy_$uuid"; - } else { - return data_get($value, 'Name') === "/$uuid-proxy"; - } - } - })->first(); - if (! $foundTcpProxy) { - StartDatabaseProxy::run($service); - } - } - } - } - } else { - // Database - if (is_null($this->databases)) { - $this->databases = $this->server->databases(); - } - $database = $this->databases->where('uuid', $uuid)->first(); - if ($database) { - $database->update([ - 'status' => $containerStatus, - 'last_online_at' => now(), - ]); - - $isPublic = data_get($database, 'is_public'); - if ($isPublic) { - $foundTcpProxy = $this->containers->filter(function ($value, $key) use ($uuid) { - if ($this->isSentinel) { - return data_get($value, 'name') === $uuid.'-proxy'; - } else { - if ($this->server->isSwarm()) { - return data_get($value, 'Spec.Name') === "coolify-proxy_$uuid"; - } else { - - return data_get($value, 'Name') === "/$uuid-proxy"; - } - } - })->first(); - if (! $foundTcpProxy) { - StartDatabaseProxy::run($database); - // $this->server->team?->notify(new ContainerRestarted("TCP Proxy for database", $this->server)); - } - } - } - } - } - } -} diff --git a/app/Actions/Server/StartLogDrain.php b/app/Actions/Server/StartLogDrain.php deleted file mode 100644 index 0d28a00994..0000000000 --- a/app/Actions/Server/StartLogDrain.php +++ /dev/null @@ -1,223 +0,0 @@ -settings->is_logdrain_newrelic_enabled) { - $type = 'newrelic'; - StopLogDrain::run($server); - } elseif ($server->settings->is_logdrain_highlight_enabled) { - $type = 'highlight'; - StopLogDrain::run($server); - } elseif ($server->settings->is_logdrain_axiom_enabled) { - $type = 'axiom'; - StopLogDrain::run($server); - } elseif ($server->settings->is_logdrain_custom_enabled) { - $type = 'custom'; - StopLogDrain::run($server); - } else { - $type = 'none'; - } - try { - if ($type === 'none') { - return 'No log drain is enabled.'; - } elseif ($type === 'newrelic') { - if (! $server->settings->is_logdrain_newrelic_enabled) { - throw new \Exception('New Relic log drain is not enabled.'); - } - $config = base64_encode(" -[SERVICE] - Flush 5 - Daemon off - Tag container_logs - Log_Level debug - Parsers_File parsers.conf -[INPUT] - Name forward - Buffer_Chunk_Size 1M - Buffer_Max_Size 6M -[FILTER] - Name grep - Match * - Exclude log 127.0.0.1 -[FILTER] - Name modify - Match * - Set coolify.server_name {$server->name} - Rename COOLIFY_APP_NAME coolify.app_name - Rename COOLIFY_PROJECT_NAME coolify.project_name - Rename COOLIFY_SERVER_IP coolify.server_ip - Rename COOLIFY_ENVIRONMENT_NAME coolify.environment_name -[OUTPUT] - Name nrlogs - Match * - license_key \${LICENSE_KEY} - # https://log-api.eu.newrelic.com/log/v1 - EU - # https://log-api.newrelic.com/log/v1 - US - base_uri \${BASE_URI} -"); - } elseif ($type === 'highlight') { - if (! $server->settings->is_logdrain_highlight_enabled) { - throw new \Exception('Highlight log drain is not enabled.'); - } - $config = base64_encode(' -[SERVICE] - Flush 5 - Daemon off - Log_Level debug - Parsers_File parsers.conf -[INPUT] - Name forward - tag ${HIGHLIGHT_PROJECT_ID} - Buffer_Chunk_Size 1M - Buffer_Max_Size 6M -[OUTPUT] - Name forward - Match * - Host otel.highlight.io - Port 24224 -'); - } elseif ($type === 'axiom') { - if (! $server->settings->is_logdrain_axiom_enabled) { - throw new \Exception('Axiom log drain is not enabled.'); - } - $config = base64_encode(" -[SERVICE] - Flush 5 - Daemon off - Log_Level debug - Parsers_File parsers.conf -[INPUT] - Name forward - Buffer_Chunk_Size 1M - Buffer_Max_Size 6M -[FILTER] - Name grep - Match * - Exclude log 127.0.0.1 -[FILTER] - Name modify - Match * - Set coolify.server_name {$server->name} - Rename COOLIFY_APP_NAME coolify.app_name - Rename COOLIFY_PROJECT_NAME coolify.project_name - Rename COOLIFY_SERVER_IP coolify.server_ip - Rename COOLIFY_ENVIRONMENT_NAME coolify.environment_name -[OUTPUT] - Name http - Match * - Host api.axiom.co - Port 443 - URI /v1/datasets/\${AXIOM_DATASET_NAME}/ingest - # Authorization Bearer should be an API token - Header Authorization Bearer \${AXIOM_API_KEY} - compress gzip - format json - json_date_key _time - json_date_format iso8601 - tls On -"); - } elseif ($type === 'custom') { - if (! $server->settings->is_logdrain_custom_enabled) { - throw new \Exception('Custom log drain is not enabled.'); - } - $config = base64_encode($server->settings->logdrain_custom_config); - $parsers = base64_encode($server->settings->logdrain_custom_config_parser); - } else { - throw new \Exception('Unknown log drain type.'); - } - if ($type !== 'custom') { - $parsers = base64_encode(" -[PARSER] - Name empty_line_skipper - Format regex - Regex /^(?!\s*$).+/ -"); - } - $compose = base64_encode(' -services: - coolify-log-drain: - image: cr.fluentbit.io/fluent/fluent-bit:2.0 - container_name: coolify-log-drain - command: -c /fluent-bit.conf - env_file: - - .env - volumes: - - ./fluent-bit.conf:/fluent-bit.conf - - ./parsers.conf:/parsers.conf - ports: - - 127.0.0.1:24224:24224 - labels: - - coolify.managed=true - restart: unless-stopped -'); - $readme = base64_encode('# New Relic Log Drain -This log drain is based on [Fluent Bit](https://fluentbit.io/) and New Relic Log Forwarder. - -Files: -- `fluent-bit.conf` - configuration file for Fluent Bit -- `docker-compose.yml` - docker-compose file to run Fluent Bit -- `.env` - environment variables for Fluent Bit -'); - $license_key = $server->settings->logdrain_newrelic_license_key; - $base_uri = $server->settings->logdrain_newrelic_base_uri; - $base_path = config('constants.coolify.base_config_path'); - - $config_path = $base_path.'/log-drains'; - $fluent_bit_config = $config_path.'/fluent-bit.conf'; - $parsers_config = $config_path.'/parsers.conf'; - $compose_path = $config_path.'/docker-compose.yml'; - $readme_path = $config_path.'/README.md'; - $command = [ - "echo 'Saving configuration'", - "mkdir -p $config_path", - "echo '{$parsers}' | base64 -d | tee $parsers_config > /dev/null", - "echo '{$config}' | base64 -d | tee $fluent_bit_config > /dev/null", - "echo '{$compose}' | base64 -d | tee $compose_path > /dev/null", - "echo '{$readme}' | base64 -d | tee $readme_path > /dev/null", - "test -f $config_path/.env && rm $config_path/.env", - - ]; - if ($type === 'newrelic') { - $add_envs_command = [ - "echo LICENSE_KEY=$license_key >> $config_path/.env", - "echo BASE_URI=$base_uri >> $config_path/.env", - ]; - } elseif ($type === 'highlight') { - $add_envs_command = [ - "echo HIGHLIGHT_PROJECT_ID={$server->settings->logdrain_highlight_project_id} >> $config_path/.env", - ]; - } elseif ($type === 'axiom') { - $add_envs_command = [ - "echo AXIOM_DATASET_NAME={$server->settings->logdrain_axiom_dataset_name} >> $config_path/.env", - "echo AXIOM_API_KEY={$server->settings->logdrain_axiom_api_key} >> $config_path/.env", - ]; - } elseif ($type === 'custom') { - $add_envs_command = [ - "touch $config_path/.env", - ]; - } else { - throw new \Exception('Unknown log drain type.'); - } - $restart_command = [ - "echo 'Starting Fluent Bit'", - "cd $config_path && docker compose up -d", - ]; - $command = array_merge($command, $add_envs_command, $restart_command); - - return instant_remote_process($command, $server); - } catch (\Throwable $e) { - return handleError($e); - } - } -} diff --git a/app/Actions/Server/StartSentinel.php b/app/Actions/Server/StartSentinel.php deleted file mode 100644 index 587ac4a8db..0000000000 --- a/app/Actions/Server/StartSentinel.php +++ /dev/null @@ -1,65 +0,0 @@ -isSwarm() || $server->isBuildServer()) { - return; - } - if ($restart) { - StopSentinel::run($server); - } - $version = $latestVersion ?? get_latest_sentinel_version(); - $metricsHistory = data_get($server, 'settings.sentinel_metrics_history_days'); - $refreshRate = data_get($server, 'settings.sentinel_metrics_refresh_rate_seconds'); - $pushInterval = data_get($server, 'settings.sentinel_push_interval_seconds'); - $token = data_get($server, 'settings.sentinel_token'); - $endpoint = data_get($server, 'settings.sentinel_custom_url'); - $debug = data_get($server, 'settings.is_sentinel_debug_enabled'); - $mountDir = '/data/coolify/sentinel'; - $image = "ghcr.io/coollabsio/sentinel:$version"; - if (! $endpoint) { - throw new \Exception('You should set FQDN in Instance Settings.'); - } - $environments = [ - 'TOKEN' => $token, - 'DEBUG' => $debug ? 'true' : 'false', - 'PUSH_ENDPOINT' => $endpoint, - 'PUSH_INTERVAL_SECONDS' => $pushInterval, - 'COLLECTOR_ENABLED' => $server->isMetricsEnabled() ? 'true' : 'false', - 'COLLECTOR_REFRESH_RATE_SECONDS' => $refreshRate, - 'COLLECTOR_RETENTION_PERIOD_DAYS' => $metricsHistory, - ]; - $labels = [ - 'coolify.managed' => 'true', - ]; - if (isDev()) { - // data_set($environments, 'DEBUG', 'true'); - // $image = 'sentinel'; - $mountDir = '/var/lib/docker/volumes/coolify_dev_coolify_data/_data/sentinel'; - } - $dockerEnvironments = '-e "'.implode('" -e "', array_map(fn ($key, $value) => "$key=$value", array_keys($environments), $environments)).'"'; - $dockerLabels = implode(' ', array_map(fn ($key, $value) => "$key=$value", array_keys($labels), $labels)); - $dockerCommand = "docker run -d $dockerEnvironments --name coolify-sentinel -v /var/run/docker.sock:/var/run/docker.sock -v $mountDir:/app/db --pid host --health-cmd \"curl --fail http://127.0.0.1:8888/api/health || exit 1\" --health-interval 10s --health-retries 3 --add-host=host.docker.internal:host-gateway --label $dockerLabels $image"; - - instant_remote_process([ - 'docker rm -f coolify-sentinel || true', - "mkdir -p $mountDir", - $dockerCommand, - "chown -R 9999:root $mountDir", - "chmod -R 700 $mountDir", - ], $server); - - $server->settings->is_sentinel_enabled = true; - $server->settings->save(); - $server->sentinelHeartbeat(); - } -} diff --git a/app/Actions/Server/StopLogDrain.php b/app/Actions/Server/StopLogDrain.php deleted file mode 100644 index 96c2466dec..0000000000 --- a/app/Actions/Server/StopLogDrain.php +++ /dev/null @@ -1,20 +0,0 @@ -sentinelHeartbeat(isReset: true); - } -} diff --git a/app/Actions/Server/UpdateCoolify.php b/app/Actions/Server/UpdateCoolify.php deleted file mode 100644 index be9b4062c9..0000000000 --- a/app/Actions/Server/UpdateCoolify.php +++ /dev/null @@ -1,62 +0,0 @@ -seconds(); - - return; - } - $settings = instanceSettings(); - $this->server = Server::find(0); - if (! $this->server) { - return; - } - CleanupDocker::dispatch($this->server); - $this->latestVersion = get_latest_version_of_coolify(); - $this->currentVersion = config('constants.coolify.version'); - if (! $manual_update) { - if (! $settings->is_auto_update_enabled) { - return; - } - if ($this->latestVersion === $this->currentVersion) { - return; - } - if (version_compare($this->latestVersion, $this->currentVersion, '<')) { - return; - } - } - $this->update(); - $settings->new_version_available = false; - $settings->save(); - } - - private function update() - { - PullHelperImageJob::dispatch($this->server); - - instant_remote_process(["docker pull -q ghcr.io/coollabsio/coolify:{$this->latestVersion}"], $this->server, false); - - remote_process([ - 'curl -fsSL https://cdn.coollabs.io/coolify/upgrade.sh -o /data/coolify/source/upgrade.sh', - "bash /data/coolify/source/upgrade.sh $this->latestVersion", - ], $this->server); - } -} diff --git a/app/Actions/Server/ValidateServer.php b/app/Actions/Server/ValidateServer.php deleted file mode 100644 index 55b37a77c0..0000000000 --- a/app/Actions/Server/ValidateServer.php +++ /dev/null @@ -1,69 +0,0 @@ -update([ - 'validation_logs' => null, - ]); - ['uptime' => $this->uptime, 'error' => $error] = $server->validateConnection(); - if (! $this->uptime) { - $this->error = 'Server is not reachable. Please validate your configuration and connection.
Check this documentation for further help.

Error: '.$error.'
'; - $server->update([ - 'validation_logs' => $this->error, - ]); - throw new \Exception($this->error); - } - $this->supported_os_type = $server->validateOS(); - if (! $this->supported_os_type) { - $this->error = 'Server OS type is not supported. Please install Docker manually before continuing: documentation.'; - $server->update([ - 'validation_logs' => $this->error, - ]); - throw new \Exception($this->error); - } - - $this->docker_installed = $server->validateDockerEngine(); - $this->docker_compose_installed = $server->validateDockerCompose(); - if (! $this->docker_installed || ! $this->docker_compose_installed) { - $this->error = 'Docker Engine is not installed. Please install Docker manually before continuing: documentation.'; - $server->update([ - 'validation_logs' => $this->error, - ]); - throw new \Exception($this->error); - } - $this->docker_version = $server->validateDockerEngineVersion(); - - if ($this->docker_version) { - return 'OK'; - } else { - $this->error = 'Docker Engine is not installed. Please install Docker manually before continuing: documentation.'; - $server->update([ - 'validation_logs' => $this->error, - ]); - throw new \Exception($this->error); - } - } -} diff --git a/app/Actions/Service/DeleteService.php b/app/Actions/Service/DeleteService.php deleted file mode 100644 index 9b87454dac..0000000000 --- a/app/Actions/Service/DeleteService.php +++ /dev/null @@ -1,78 +0,0 @@ -isFunctional()) { - $storagesToDelete = collect([]); - - $service->environment_variables()->delete(); - $commands = []; - foreach ($service->applications()->get() as $application) { - $storages = $application->persistentStorages()->get(); - foreach ($storages as $storage) { - $storagesToDelete->push($storage); - } - } - foreach ($service->databases()->get() as $database) { - $storages = $database->persistentStorages()->get(); - foreach ($storages as $storage) { - $storagesToDelete->push($storage); - } - } - foreach ($storagesToDelete as $storage) { - $commands[] = "docker volume rm -f $storage->name"; - } - - // Execute volume deletion first, this must be done first otherwise volumes will not be deleted. - if (! empty($commands)) { - foreach ($commands as $command) { - $result = instant_remote_process([$command], $server, false); - if ($result !== null && $result !== 0) { - Log::error('Error deleting volumes: '.$result); - } - } - } - } - - if ($deleteConnectedNetworks) { - $service->delete_connected_networks($service->uuid); - } - - instant_remote_process(["docker rm -f $service->uuid"], $server, throwError: false); - } catch (\Exception $e) { - throw new \Exception($e->getMessage()); - } finally { - if ($deleteConfigurations) { - $service->delete_configurations(); - } - foreach ($service->applications()->get() as $application) { - $application->forceDelete(); - } - foreach ($service->databases()->get() as $database) { - $database->forceDelete(); - } - foreach ($service->scheduled_tasks as $task) { - $task->delete(); - } - $service->tags()->detach(); - $service->forceDelete(); - - if ($dockerCleanup) { - CleanupDocker::dispatch($server, true); - } - } - } -} diff --git a/app/Actions/Service/RestartService.php b/app/Actions/Service/RestartService.php deleted file mode 100644 index 4151ea9474..0000000000 --- a/app/Actions/Service/RestartService.php +++ /dev/null @@ -1,20 +0,0 @@ -parse(); - if ($stopBeforeStart) { - StopService::run(service: $service, dockerCleanup: false); - } - $service->saveComposeConfigs(); - $commands[] = 'cd '.$service->workdir(); - $commands[] = "echo 'Saved configuration files to {$service->workdir()}.'"; - if ($pullLatestImages) { - $commands[] = "echo 'Pulling images.'"; - $commands[] = 'docker compose pull'; - } - if ($service->networks()->count() > 0) { - $commands[] = "echo 'Creating Docker network.'"; - $commands[] = "docker network inspect $service->uuid >/dev/null 2>&1 || docker network create --attachable $service->uuid"; - } - $commands[] = 'echo Starting service.'; - $commands[] = 'docker compose up -d --remove-orphans --force-recreate --build'; - $commands[] = "docker network connect $service->uuid coolify-proxy >/dev/null 2>&1 || true"; - if (data_get($service, 'connect_to_docker_network')) { - $compose = data_get($service, 'docker_compose', []); - $network = $service->destination->network; - $serviceNames = data_get(Yaml::parse($compose), 'services', []); - foreach ($serviceNames as $serviceName => $serviceConfig) { - $commands[] = "docker network connect --alias {$serviceName}-{$service->uuid} $network {$serviceName}-{$service->uuid} >/dev/null 2>&1 || true"; - } - } - - return remote_process($commands, $service->server, type_uuid: $service->uuid, callEventOnFinish: 'ServiceStatusChanged'); - } -} diff --git a/app/Actions/Service/StopService.php b/app/Actions/Service/StopService.php deleted file mode 100644 index 95b08b4370..0000000000 --- a/app/Actions/Service/StopService.php +++ /dev/null @@ -1,36 +0,0 @@ -destination->server; - if (! $server->isFunctional()) { - return 'Server is not functional'; - } - - $containersToStop = $service->getContainersToStop(); - $service->stopContainers($containersToStop, $server); - - if (! $isDeleteOperation) { - $service->delete_connected_networks($service->uuid); - if ($dockerCleanup) { - CleanupDocker::dispatch($server, true); - } - } - } catch (\Exception $e) { - return $e->getMessage(); - } - } -} diff --git a/app/Actions/Shared/ComplexStatusCheck.php b/app/Actions/Shared/ComplexStatusCheck.php deleted file mode 100644 index 5a7ba6637c..0000000000 --- a/app/Actions/Shared/ComplexStatusCheck.php +++ /dev/null @@ -1,60 +0,0 @@ -additional_servers; - $servers->push($application->destination->server); - foreach ($servers as $server) { - $is_main_server = $application->destination->server->id === $server->id; - if (! $server->isFunctional()) { - if ($is_main_server) { - $application->update(['status' => 'exited:unhealthy']); - - continue; - } else { - $application->additional_servers()->updateExistingPivot($server->id, ['status' => 'exited:unhealthy']); - - continue; - } - } - $container = instant_remote_process(["docker container inspect $(docker container ls -q --filter 'label=coolify.applicationId={$application->id}' --filter 'label=coolify.pullRequestId=0') --format '{{json .}}'"], $server, false); - $container = format_docker_command_output_to_json($container); - if ($container->count() === 1) { - $container = $container->first(); - $containerStatus = data_get($container, 'State.Status'); - $containerHealth = data_get($container, 'State.Health.Status', 'unhealthy'); - if ($is_main_server) { - $statusFromDb = $application->status; - if ($statusFromDb !== $containerStatus) { - $application->update(['status' => "$containerStatus:$containerHealth"]); - } - } else { - $additional_server = $application->additional_servers()->wherePivot('server_id', $server->id); - $statusFromDb = $additional_server->first()->pivot->status; - if ($statusFromDb !== $containerStatus) { - $additional_server->updateExistingPivot($server->id, ['status' => "$containerStatus:$containerHealth"]); - } - } - } else { - if ($is_main_server) { - $application->update(['status' => 'exited:unhealthy']); - - continue; - } else { - $application->additional_servers()->updateExistingPivot($server->id, ['status' => 'exited:unhealthy']); - - continue; - } - } - } - } -} diff --git a/app/Console/Commands/AdminRemoveUser.php b/app/Console/Commands/AdminRemoveUser.php deleted file mode 100644 index d4534399cd..0000000000 --- a/app/Console/Commands/AdminRemoveUser.php +++ /dev/null @@ -1,56 +0,0 @@ -argument('email'); - $confirm = $this->confirm('Are you sure you want to remove user with email: '.$email.'?'); - if (! $confirm) { - $this->info('User removal cancelled.'); - - return; - } - $this->info("Removing user with email: $email"); - $user = User::whereEmail($email)->firstOrFail(); - $teams = $user->teams; - foreach ($teams as $team) { - if ($team->members->count() > 1) { - $this->error('User is a member of a team with more than one member. Please remove user from team first.'); - - return; - } - $team->delete(); - } - $user->delete(); - } catch (\Exception $e) { - $this->error('Failed to remove user.'); - $this->error($e->getMessage()); - - return; - } - } -} diff --git a/app/Console/Commands/CheckApplicationDeploymentQueue.php b/app/Console/Commands/CheckApplicationDeploymentQueue.php deleted file mode 100644 index e89d26f2c3..0000000000 --- a/app/Console/Commands/CheckApplicationDeploymentQueue.php +++ /dev/null @@ -1,50 +0,0 @@ -option('seconds'); - $deployments = ApplicationDeploymentQueue::whereIn('status', [ - ApplicationDeploymentStatus::IN_PROGRESS, - ApplicationDeploymentStatus::QUEUED, - ])->where('created_at', '<=', now()->subSeconds($seconds))->get(); - if ($deployments->isEmpty()) { - $this->info('No deployments found in the last '.$seconds.' seconds.'); - - return; - } - - $this->info('Found '.$deployments->count().' deployments created in the last '.$seconds.' seconds.'); - - foreach ($deployments as $deployment) { - if ($this->option('force')) { - $this->info('Deployment '.$deployment->id.' created at '.$deployment->created_at.' is older than '.$seconds.' seconds. Setting status to failed.'); - $this->cancelDeployment($deployment); - } else { - $this->info('Deployment '.$deployment->id.' created at '.$deployment->created_at.' is older than '.$seconds.' seconds. Setting status to failed.'); - if ($this->confirm('Do you want to cancel this deployment?', true)) { - $this->cancelDeployment($deployment); - } - } - } - } - - private function cancelDeployment(ApplicationDeploymentQueue $deployment) - { - $deployment->update(['status' => ApplicationDeploymentStatus::FAILED]); - if ($deployment->server?->isFunctional()) { - remote_process(['docker rm -f '.$deployment->deployment_uuid], $deployment->server, false); - } - } -} diff --git a/app/Console/Commands/CleanupApplicationDeploymentQueue.php b/app/Console/Commands/CleanupApplicationDeploymentQueue.php deleted file mode 100644 index 3aae28ae60..0000000000 --- a/app/Console/Commands/CleanupApplicationDeploymentQueue.php +++ /dev/null @@ -1,26 +0,0 @@ -option('team-id'); - $servers = \App\Models\Server::where('team_id', $team_id)->get(); - foreach ($servers as $server) { - $deployments = ApplicationDeploymentQueue::whereIn('status', ['in_progress', 'queued'])->where('server_id', $server->id)->get(); - foreach ($deployments as $deployment) { - $deployment->update(['status' => 'failed']); - instant_remote_process(['docker rm -f '.$deployment->deployment_uuid], $server, false); - } - } - } -} diff --git a/app/Console/Commands/CleanupDatabase.php b/app/Console/Commands/CleanupDatabase.php deleted file mode 100644 index 2ccb76529d..0000000000 --- a/app/Console/Commands/CleanupDatabase.php +++ /dev/null @@ -1,76 +0,0 @@ -option('yes')) { - echo "Running database cleanup...\n"; - } else { - echo "Running database cleanup in dry-run mode...\n"; - } - if (isCloud()) { - // Later on we can increase this to 180 days or dynamically set - $keep_days = $this->option('keep-days') ?? 60; - } else { - $keep_days = $this->option('keep-days') ?? 60; - } - echo "Keep days: $keep_days\n"; - // Cleanup failed jobs table - $failed_jobs = DB::table('failed_jobs')->where('failed_at', '<', now()->subDays(1)); - $count = $failed_jobs->count(); - echo "Delete $count entries from failed_jobs.\n"; - if ($this->option('yes')) { - $failed_jobs->delete(); - } - - // Cleanup sessions table - $sessions = DB::table('sessions')->where('last_activity', '<', now()->subDays($keep_days)->timestamp); - $count = $sessions->count(); - echo "Delete $count entries from sessions.\n"; - if ($this->option('yes')) { - $sessions->delete(); - } - - // Cleanup activity_log table - $activity_log = DB::table('activity_log')->where('created_at', '<', now()->subDays($keep_days))->orderBy('created_at', 'desc')->skip(10); - $count = $activity_log->count(); - echo "Delete $count entries from activity_log.\n"; - if ($this->option('yes')) { - $activity_log->delete(); - } - - // Cleanup application_deployment_queues table - $application_deployment_queues = DB::table('application_deployment_queues')->where('created_at', '<', now()->subDays($keep_days))->orderBy('created_at', 'desc')->skip(10); - $count = $application_deployment_queues->count(); - echo "Delete $count entries from application_deployment_queues.\n"; - if ($this->option('yes')) { - $application_deployment_queues->delete(); - } - - // Cleanup scheduled_task_executions table - $scheduled_task_executions = DB::table('scheduled_task_executions')->where('created_at', '<', now()->subDays($keep_days))->orderBy('created_at', 'desc'); - $count = $scheduled_task_executions->count(); - echo "Delete $count entries from scheduled_task_executions.\n"; - if ($this->option('yes')) { - $scheduled_task_executions->delete(); - } - - // Cleanup webhooks table - $webhooks = DB::table('webhooks')->where('created_at', '<', now()->subDays($keep_days)); - $count = $webhooks->count(); - echo "Delete $count entries from webhooks.\n"; - if ($this->option('yes')) { - $webhooks->delete(); - } - } -} diff --git a/app/Console/Commands/CleanupRedis.php b/app/Console/Commands/CleanupRedis.php deleted file mode 100644 index e16a82be4c..0000000000 --- a/app/Console/Commands/CleanupRedis.php +++ /dev/null @@ -1,29 +0,0 @@ -keys('*:laravel*'); - collect($keys)->each(function ($key) use ($prefix) { - $keyWithoutPrefix = str_replace($prefix, '', $key); - Redis::connection()->del($keyWithoutPrefix); - }); - - $queueOverlaps = Redis::connection()->keys('*laravel-queue-overlap*'); - collect($queueOverlaps)->each(function ($key) { - Redis::connection()->del($key); - }); - } -} diff --git a/app/Console/Commands/CleanupStuckedResources.php b/app/Console/Commands/CleanupStuckedResources.php deleted file mode 100644 index 0b5eef84d5..0000000000 --- a/app/Console/Commands/CleanupStuckedResources.php +++ /dev/null @@ -1,414 +0,0 @@ -cleanup_stucked_resources(); - } - - private function cleanup_stucked_resources() - { - try { - $servers = Server::all()->filter(function ($server) { - return $server->isFunctional(); - }); - if (isCloud()) { - $servers = $servers->filter(function ($server) { - return data_get($server->team->subscription, 'stripe_invoice_paid', false) === true; - }); - } - foreach ($servers as $server) { - CleanupHelperContainersJob::dispatch($server); - } - } catch (\Throwable $e) { - echo "Error in cleaning stucked resources: {$e->getMessage()}\n"; - } - try { - $applicationsDeploymentQueue = ApplicationDeploymentQueue::get(); - foreach ($applicationsDeploymentQueue as $applicationDeploymentQueue) { - if (is_null($applicationDeploymentQueue->application)) { - echo "Deleting stuck application deployment queue: {$applicationDeploymentQueue->id}\n"; - $applicationDeploymentQueue->delete(); - } - } - } catch (\Throwable $e) { - echo "Error in cleaning stuck application deployment queue: {$e->getMessage()}\n"; - } - try { - $applications = Application::withTrashed()->whereNotNull('deleted_at')->get(); - foreach ($applications as $application) { - echo "Deleting stuck application: {$application->name}\n"; - $application->forceDelete(); - } - } catch (\Throwable $e) { - echo "Error in cleaning stuck application: {$e->getMessage()}\n"; - } - try { - $applicationsPreviews = ApplicationPreview::get(); - foreach ($applicationsPreviews as $applicationPreview) { - if (! data_get($applicationPreview, 'application')) { - echo "Deleting stuck application preview: {$applicationPreview->uuid}\n"; - $applicationPreview->delete(); - } - } - } catch (\Throwable $e) { - echo "Error in cleaning stuck application: {$e->getMessage()}\n"; - } - try { - $postgresqls = StandalonePostgresql::withTrashed()->whereNotNull('deleted_at')->get(); - foreach ($postgresqls as $postgresql) { - echo "Deleting stuck postgresql: {$postgresql->name}\n"; - $postgresql->forceDelete(); - } - } catch (\Throwable $e) { - echo "Error in cleaning stuck postgresql: {$e->getMessage()}\n"; - } - try { - $redis = StandaloneRedis::withTrashed()->whereNotNull('deleted_at')->get(); - foreach ($redis as $redis) { - echo "Deleting stuck redis: {$redis->name}\n"; - $redis->forceDelete(); - } - } catch (\Throwable $e) { - echo "Error in cleaning stuck redis: {$e->getMessage()}\n"; - } - try { - $keydbs = StandaloneKeydb::withTrashed()->whereNotNull('deleted_at')->get(); - foreach ($keydbs as $keydb) { - echo "Deleting stuck keydb: {$keydb->name}\n"; - $keydb->forceDelete(); - } - } catch (\Throwable $e) { - echo "Error in cleaning stuck keydb: {$e->getMessage()}\n"; - } - try { - $dragonflies = StandaloneDragonfly::withTrashed()->whereNotNull('deleted_at')->get(); - foreach ($dragonflies as $dragonfly) { - echo "Deleting stuck dragonfly: {$dragonfly->name}\n"; - $dragonfly->forceDelete(); - } - } catch (\Throwable $e) { - echo "Error in cleaning stuck dragonfly: {$e->getMessage()}\n"; - } - try { - $clickhouses = StandaloneClickhouse::withTrashed()->whereNotNull('deleted_at')->get(); - foreach ($clickhouses as $clickhouse) { - echo "Deleting stuck clickhouse: {$clickhouse->name}\n"; - $clickhouse->forceDelete(); - } - } catch (\Throwable $e) { - echo "Error in cleaning stuck clickhouse: {$e->getMessage()}\n"; - } - try { - $mongodbs = StandaloneMongodb::withTrashed()->whereNotNull('deleted_at')->get(); - foreach ($mongodbs as $mongodb) { - echo "Deleting stuck mongodb: {$mongodb->name}\n"; - $mongodb->forceDelete(); - } - } catch (\Throwable $e) { - echo "Error in cleaning stuck mongodb: {$e->getMessage()}\n"; - } - try { - $mysqls = StandaloneMysql::withTrashed()->whereNotNull('deleted_at')->get(); - foreach ($mysqls as $mysql) { - echo "Deleting stuck mysql: {$mysql->name}\n"; - $mysql->forceDelete(); - } - } catch (\Throwable $e) { - echo "Error in cleaning stuck mysql: {$e->getMessage()}\n"; - } - try { - $mariadbs = StandaloneMariadb::withTrashed()->whereNotNull('deleted_at')->get(); - foreach ($mariadbs as $mariadb) { - echo "Deleting stuck mariadb: {$mariadb->name}\n"; - $mariadb->forceDelete(); - } - } catch (\Throwable $e) { - echo "Error in cleaning stuck mariadb: {$e->getMessage()}\n"; - } - try { - $services = Service::withTrashed()->whereNotNull('deleted_at')->get(); - foreach ($services as $service) { - echo "Deleting stuck service: {$service->name}\n"; - $service->forceDelete(); - } - } catch (\Throwable $e) { - echo "Error in cleaning stuck service: {$e->getMessage()}\n"; - } - try { - $serviceApps = ServiceApplication::withTrashed()->whereNotNull('deleted_at')->get(); - foreach ($serviceApps as $serviceApp) { - echo "Deleting stuck serviceapp: {$serviceApp->name}\n"; - $serviceApp->forceDelete(); - } - } catch (\Throwable $e) { - echo "Error in cleaning stuck serviceapp: {$e->getMessage()}\n"; - } - try { - $serviceDbs = ServiceDatabase::withTrashed()->whereNotNull('deleted_at')->get(); - foreach ($serviceDbs as $serviceDb) { - echo "Deleting stuck serviceapp: {$serviceDb->name}\n"; - $serviceDb->forceDelete(); - } - } catch (\Throwable $e) { - echo "Error in cleaning stuck serviceapp: {$e->getMessage()}\n"; - } - try { - $scheduled_tasks = ScheduledTask::all(); - foreach ($scheduled_tasks as $scheduled_task) { - if (! $scheduled_task->service && ! $scheduled_task->application) { - echo "Deleting stuck scheduledtask: {$scheduled_task->name}\n"; - $scheduled_task->delete(); - } - } - } catch (\Throwable $e) { - echo "Error in cleaning stuck scheduledtasks: {$e->getMessage()}\n"; - } - - try { - $scheduled_backups = ScheduledDatabaseBackup::all(); - foreach ($scheduled_backups as $scheduled_backup) { - if (! $scheduled_backup->server()) { - echo "Deleting stuck scheduledbackup: {$scheduled_backup->name}\n"; - $scheduled_backup->delete(); - } - } - } catch (\Throwable $e) { - echo "Error in cleaning stuck scheduledbackups: {$e->getMessage()}\n"; - } - - // Cleanup any resources that are not attached to any environment or destination or server - try { - $applications = Application::all(); - foreach ($applications as $application) { - if (! data_get($application, 'environment')) { - echo 'Application without environment: '.$application->name.'\n'; - $application->forceDelete(); - - continue; - } - if (! $application->destination()) { - echo 'Application without destination: '.$application->name.'\n'; - $application->forceDelete(); - - continue; - } - if (! data_get($application, 'destination.server')) { - echo 'Application without server: '.$application->name.'\n'; - $application->forceDelete(); - - continue; - } - } - } catch (\Throwable $e) { - echo "Error in application: {$e->getMessage()}\n"; - } - try { - $postgresqls = StandalonePostgresql::all()->where('id', '!=', 0); - foreach ($postgresqls as $postgresql) { - if (! data_get($postgresql, 'environment')) { - echo 'Postgresql without environment: '.$postgresql->name.'\n'; - $postgresql->forceDelete(); - - continue; - } - if (! $postgresql->destination()) { - echo 'Postgresql without destination: '.$postgresql->name.'\n'; - $postgresql->forceDelete(); - - continue; - } - if (! data_get($postgresql, 'destination.server')) { - echo 'Postgresql without server: '.$postgresql->name.'\n'; - $postgresql->forceDelete(); - - continue; - } - } - } catch (\Throwable $e) { - echo "Error in postgresql: {$e->getMessage()}\n"; - } - try { - $redis = StandaloneRedis::all(); - foreach ($redis as $redis) { - if (! data_get($redis, 'environment')) { - echo 'Redis without environment: '.$redis->name.'\n'; - $redis->forceDelete(); - - continue; - } - if (! $redis->destination()) { - echo 'Redis without destination: '.$redis->name.'\n'; - $redis->forceDelete(); - - continue; - } - if (! data_get($redis, 'destination.server')) { - echo 'Redis without server: '.$redis->name.'\n'; - $redis->forceDelete(); - - continue; - } - } - } catch (\Throwable $e) { - echo "Error in redis: {$e->getMessage()}\n"; - } - - try { - $mongodbs = StandaloneMongodb::all(); - foreach ($mongodbs as $mongodb) { - if (! data_get($mongodb, 'environment')) { - echo 'Mongodb without environment: '.$mongodb->name.'\n'; - $mongodb->forceDelete(); - - continue; - } - if (! $mongodb->destination()) { - echo 'Mongodb without destination: '.$mongodb->name.'\n'; - $mongodb->forceDelete(); - - continue; - } - if (! data_get($mongodb, 'destination.server')) { - echo 'Mongodb without server: '.$mongodb->name.'\n'; - $mongodb->forceDelete(); - - continue; - } - } - } catch (\Throwable $e) { - echo "Error in mongodb: {$e->getMessage()}\n"; - } - - try { - $mysqls = StandaloneMysql::all(); - foreach ($mysqls as $mysql) { - if (! data_get($mysql, 'environment')) { - echo 'Mysql without environment: '.$mysql->name.'\n'; - $mysql->forceDelete(); - - continue; - } - if (! $mysql->destination()) { - echo 'Mysql without destination: '.$mysql->name.'\n'; - $mysql->forceDelete(); - - continue; - } - if (! data_get($mysql, 'destination.server')) { - echo 'Mysql without server: '.$mysql->name.'\n'; - $mysql->forceDelete(); - - continue; - } - } - } catch (\Throwable $e) { - echo "Error in mysql: {$e->getMessage()}\n"; - } - - try { - $mariadbs = StandaloneMariadb::all(); - foreach ($mariadbs as $mariadb) { - if (! data_get($mariadb, 'environment')) { - echo 'Mariadb without environment: '.$mariadb->name.'\n'; - $mariadb->forceDelete(); - - continue; - } - if (! $mariadb->destination()) { - echo 'Mariadb without destination: '.$mariadb->name.'\n'; - $mariadb->forceDelete(); - - continue; - } - if (! data_get($mariadb, 'destination.server')) { - echo 'Mariadb without server: '.$mariadb->name.'\n'; - $mariadb->forceDelete(); - - continue; - } - } - } catch (\Throwable $e) { - echo "Error in mariadb: {$e->getMessage()}\n"; - } - - try { - $services = Service::all(); - foreach ($services as $service) { - if (! data_get($service, 'environment')) { - echo 'Service without environment: '.$service->name.'\n'; - $service->forceDelete(); - - continue; - } - if (! $service->destination()) { - echo 'Service without destination: '.$service->name.'\n'; - $service->forceDelete(); - - continue; - } - if (! data_get($service, 'server')) { - echo 'Service without server: '.$service->name.'\n'; - $service->forceDelete(); - - continue; - } - } - } catch (\Throwable $e) { - echo "Error in service: {$e->getMessage()}\n"; - } - try { - $serviceApplications = ServiceApplication::all(); - foreach ($serviceApplications as $service) { - if (! data_get($service, 'service')) { - echo 'ServiceApplication without service: '.$service->name.'\n'; - $service->forceDelete(); - - continue; - } - } - } catch (\Throwable $e) { - echo "Error in serviceApplications: {$e->getMessage()}\n"; - } - try { - $serviceDatabases = ServiceDatabase::all(); - foreach ($serviceDatabases as $service) { - if (! data_get($service, 'service')) { - echo 'ServiceDatabase without service: '.$service->name.'\n'; - $service->forceDelete(); - - continue; - } - } - } catch (\Throwable $e) { - echo "Error in ServiceDatabases: {$e->getMessage()}\n"; - } - } -} diff --git a/app/Console/Commands/CleanupUnreachableServers.php b/app/Console/Commands/CleanupUnreachableServers.php deleted file mode 100644 index def01b2651..0000000000 --- a/app/Console/Commands/CleanupUnreachableServers.php +++ /dev/null @@ -1,27 +0,0 @@ -where('unreachable_notification_sent', true)->where('updated_at', '<', now()->subDays(7))->get(); - if ($servers->count() > 0) { - foreach ($servers as $server) { - echo "Cleanup unreachable server ($server->id) with name $server->name"; - $server->update([ - 'ip' => '1.2.3.4', - ]); - } - } - } -} diff --git a/app/Console/Commands/CloudCheckSubscription.php b/app/Console/Commands/CloudCheckSubscription.php deleted file mode 100644 index 6e237e84b2..0000000000 --- a/app/Console/Commands/CloudCheckSubscription.php +++ /dev/null @@ -1,49 +0,0 @@ -get(); - foreach ($activeSubscribers as $team) { - $stripeSubscriptionId = $team->subscription->stripe_subscription_id; - $stripeInvoicePaid = $team->subscription->stripe_invoice_paid; - $stripeCustomerId = $team->subscription->stripe_customer_id; - if (! $stripeSubscriptionId) { - echo "Team {$team->id} has no subscription, but invoice status is: {$stripeInvoicePaid}\n"; - echo "Link on Stripe: https://dashboard.stripe.com/customers/{$stripeCustomerId}\n"; - - continue; - } - $subscription = $stripe->subscriptions->retrieve($stripeSubscriptionId); - if ($subscription->status === 'active') { - continue; - } - echo "Subscription {$stripeSubscriptionId} is not active ({$subscription->status})\n"; - echo "Link on Stripe: https://dashboard.stripe.com/subscriptions/{$stripeSubscriptionId}\n"; - } - } -} diff --git a/app/Console/Commands/CloudCleanupSubscriptions.php b/app/Console/Commands/CloudCleanupSubscriptions.php deleted file mode 100644 index ab676c9278..0000000000 --- a/app/Console/Commands/CloudCleanupSubscriptions.php +++ /dev/null @@ -1,101 +0,0 @@ -error('This command can only be run on cloud'); - - return; - } - $this->info('Cleaning up subcriptions teams'); - $stripe = new \Stripe\StripeClient(config('subscription.stripe_api_key')); - - $teams = Team::all()->filter(function ($team) { - return $team->id !== 0; - })->sortBy('id'); - foreach ($teams as $team) { - if ($team) { - $this->info("Checking team {$team->id}"); - } - if (! data_get($team, 'subscription')) { - $this->disableServers($team); - - continue; - } - // If the team has no subscription id and the invoice is paid, we need to reset the invoice paid status - if (! (data_get($team, 'subscription.stripe_subscription_id'))) { - $this->info("Resetting invoice paid status for team {$team->id}"); - - $team->subscription->update([ - 'stripe_invoice_paid' => false, - 'stripe_trial_already_ended' => false, - 'stripe_subscription_id' => null, - ]); - $this->disableServers($team); - - continue; - } else { - $subscription = $stripe->subscriptions->retrieve(data_get($team, 'subscription.stripe_subscription_id'), []); - $status = data_get($subscription, 'status'); - if ($status === 'active') { - $team->subscription->update([ - 'stripe_invoice_paid' => true, - 'stripe_trial_already_ended' => false, - ]); - - continue; - } - $this->info('Subscription status: '.$status); - $this->info('Subscription id: '.data_get($team, 'subscription.stripe_subscription_id')); - $confirm = $this->confirm('Do you want to cancel the subscription?', true); - if (! $confirm) { - $this->info("Skipping team {$team->id}"); - } else { - $this->info("Cancelling subscription for team {$team->id}"); - $team->subscription->update([ - 'stripe_invoice_paid' => false, - 'stripe_trial_already_ended' => false, - 'stripe_subscription_id' => null, - ]); - $this->disableServers($team); - } - } - } - } catch (\Exception $e) { - $this->error($e->getMessage()); - - return; - } - } - - private function disableServers(Team $team) - { - foreach ($team->servers as $server) { - if ($server->settings->is_usable === true || $server->settings->is_reachable === true || $server->ip !== '1.2.3.4') { - $this->info("Disabling server {$server->id} {$server->name}"); - $server->settings()->update([ - 'is_usable' => false, - 'is_reachable' => false, - ]); - $server->update([ - 'ip' => '1.2.3.4', - ]); - - ServerReachabilityChanged::dispatch($server); - } - } - } -} diff --git a/app/Console/Commands/Dev.php b/app/Console/Commands/Dev.php deleted file mode 100644 index 257de0a927..0000000000 --- a/app/Console/Commands/Dev.php +++ /dev/null @@ -1,80 +0,0 @@ -option('init')) { - $this->init(); - - return; - } - if ($this->option('generate-openapi')) { - $this->generateOpenApi(); - - return; - } - } - - public function generateOpenApi() - { - // Generate OpenAPI documentation - echo "Generating OpenAPI documentation.\n"; - // https://github.com/OAI/OpenAPI-Specification/releases - $process = Process::run([ - '/var/www/html/vendor/bin/openapi', - 'app', - '-o', - 'openapi.yaml', - '--version', - '3.1.0', - ]); - $error = $process->errorOutput(); - $error = preg_replace('/^.*an object literal,.*$/m', '', $error); - $error = preg_replace('/^\h*\v+/m', '', $error); - echo $error; - echo $process->output(); - // Convert YAML to JSON - $yaml = file_get_contents('openapi.yaml'); - $json = json_encode(Yaml::parse($yaml), JSON_PRETTY_PRINT); - file_put_contents('openapi.json', $json); - echo "Converted OpenAPI YAML to JSON.\n"; - } - - public function init() - { - // Generate APP_KEY if not exists - - if (empty(config('app.key'))) { - echo "Generating APP_KEY.\n"; - Artisan::call('key:generate'); - } - - // Generate STORAGE link if not exists - if (! file_exists(public_path('storage'))) { - echo "Generating STORAGE link.\n"; - Artisan::call('storage:link'); - } - - // Seed database if it's empty - $settings = InstanceSettings::find(0); - if (! $settings) { - echo "Initializing instance, seeding database.\n"; - Artisan::call('migrate --seed'); - } else { - echo "Instance already initialized.\n"; - } - } -} diff --git a/app/Console/Commands/Emails.php b/app/Console/Commands/Emails.php deleted file mode 100644 index a022d54dc6..0000000000 --- a/app/Console/Commands/Emails.php +++ /dev/null @@ -1,277 +0,0 @@ - 'Send Update Email to all users', - 'emails-test' => 'Test', - 'database-backup-statuses-daily' => 'Database - Backup Statuses (Daily)', - 'application-deployment-success-daily' => 'Application - Deployment Success (Daily)', - 'application-deployment-success' => 'Application - Deployment Success', - 'application-deployment-failed' => 'Application - Deployment Failed', - 'application-status-changed' => 'Application - Status Changed', - 'backup-success' => 'Database - Backup Success', - 'backup-failed' => 'Database - Backup Failed', - // 'invitation-link' => 'Invitation Link', - 'realusers-before-trial' => 'REAL - Registered Users Before Trial without Subscription', - 'realusers-server-lost-connection' => 'REAL - Server Lost Connection', - ], - ); - $emailsGathered = ['realusers-before-trial', 'realusers-server-lost-connection']; - if (isDev()) { - $this->email = 'test@example.com'; - } else { - if (! in_array($type, $emailsGathered)) { - $this->email = text('Email Address to send to:'); - } - } - set_transanctional_email_settings(); - - $this->mail = new MailMessage; - $this->mail->subject('Test Email'); - switch ($type) { - case 'updates': - $teams = Team::all(); - if (! $teams || $teams->isEmpty()) { - echo 'No teams found.'.PHP_EOL; - - return; - } - $emails = []; - foreach ($teams as $team) { - foreach ($team->members as $member) { - if ($member->email && $member->marketing_emails) { - $emails[] = $member->email; - } - } - } - $emails = array_unique($emails); - $this->info('Sending to '.count($emails).' emails.'); - foreach ($emails as $email) { - $this->info($email); - } - $confirmed = confirm('Are you sure?'); - if ($confirmed) { - foreach ($emails as $email) { - $this->mail = new MailMessage; - $this->mail->subject('One-click Services, Docker Compose support'); - $unsubscribeUrl = route('unsubscribe.marketing.emails', [ - 'token' => encrypt($email), - ]); - $this->mail->view('emails.updates', ['unsubscribeUrl' => $unsubscribeUrl]); - $this->sendEmail($email); - } - } - break; - case 'emails-test': - $this->mail = (new Test)->toMail(); - $this->sendEmail(); - break; - case 'application-deployment-success-daily': - $applications = Application::all(); - foreach ($applications as $application) { - $deployments = $application->get_last_days_deployments(); - if ($deployments->isEmpty()) { - continue; - } - $this->mail = (new DeploymentSuccess($application, 'test'))->toMail(); - $this->sendEmail(); - } - break; - case 'application-deployment-success': - $application = Application::all()->first(); - $this->mail = (new DeploymentSuccess($application, 'test'))->toMail(); - $this->sendEmail(); - break; - case 'application-deployment-failed': - $application = Application::all()->first(); - $preview = ApplicationPreview::all()->first(); - if (! $preview) { - $preview = ApplicationPreview::create([ - 'application_id' => $application->id, - 'pull_request_id' => 1, - 'pull_request_html_url' => 'http://example.com', - 'fqdn' => $application->fqdn, - ]); - } - $this->mail = (new DeploymentFailed($application, 'test'))->toMail(); - $this->sendEmail(); - $this->mail = (new DeploymentFailed($application, 'test', $preview))->toMail(); - $this->sendEmail(); - break; - case 'application-status-changed': - $application = Application::all()->first(); - $this->mail = (new StatusChanged($application))->toMail(); - $this->sendEmail(); - break; - case 'backup-failed': - $backup = ScheduledDatabaseBackup::all()->first(); - $db = StandalonePostgresql::all()->first(); - if (! $backup) { - $backup = ScheduledDatabaseBackup::create([ - 'enabled' => true, - 'frequency' => 'daily', - 'save_s3' => false, - 'database_id' => $db->id, - 'database_type' => $db->getMorphClass(), - 'team_id' => 0, - ]); - } - $output = 'Because of an error, the backup of the database '.$db->name.' failed.'; - $this->mail = (new BackupFailed($backup, $db, $output))->toMail(); - $this->sendEmail(); - break; - case 'backup-success': - $backup = ScheduledDatabaseBackup::all()->first(); - $db = StandalonePostgresql::all()->first(); - if (! $backup) { - $backup = ScheduledDatabaseBackup::create([ - 'enabled' => true, - 'frequency' => 'daily', - 'save_s3' => false, - 'database_id' => $db->id, - 'database_type' => $db->getMorphClass(), - 'team_id' => 0, - ]); - } - // $this->mail = (new BackupSuccess($backup->frequency, $db->name))->toMail(); - $this->sendEmail(); - break; - // case 'invitation-link': - // $user = User::all()->first(); - // $invitation = TeamInvitation::whereEmail($user->email)->first(); - // if (!$invitation) { - // $invitation = TeamInvitation::create([ - // 'uuid' => Str::uuid(), - // 'email' => $user->email, - // 'team_id' => 1, - // 'link' => 'http://example.com', - // ]); - // } - // $this->mail = (new InvitationLink($user))->toMail(); - // $this->sendEmail(); - // break; - case 'realusers-before-trial': - $this->mail = new MailMessage; - $this->mail->view('emails.before-trial-conversion'); - $this->mail->subject('Trial period has been added for all subscription plans.'); - $teams = Team::doesntHave('subscription')->where('id', '!=', 0)->get(); - if (! $teams || $teams->isEmpty()) { - echo 'No teams found.'.PHP_EOL; - - return; - } - $emails = []; - foreach ($teams as $team) { - foreach ($team->members as $member) { - if ($member->email) { - $emails[] = $member->email; - } - } - } - $emails = array_unique($emails); - $this->info('Sending to '.count($emails).' emails.'); - foreach ($emails as $email) { - $this->info($email); - } - $confirmed = confirm('Are you sure?'); - if ($confirmed) { - foreach ($emails as $email) { - $this->sendEmail($email); - } - } - break; - case 'realusers-server-lost-connection': - $serverId = text('Server Id'); - $server = Server::find($serverId); - if (! $server) { - throw new Exception('Server not found'); - } - $admins = []; - $members = $server->team->members; - foreach ($members as $member) { - if ($member->isAdmin()) { - $admins[] = $member->email; - } - } - $this->info('Sending to '.count($admins).' admins.'); - foreach ($admins as $admin) { - $this->info($admin); - } - $this->mail = new MailMessage; - $this->mail->view('emails.server-lost-connection', [ - 'name' => $server->name, - ]); - $this->mail->subject('Action required: Server '.$server->name.' lost connection.'); - foreach ($admins as $email) { - $this->sendEmail($email); - } - break; - } - } - - private function sendEmail(?string $email = null) - { - if ($email) { - $this->email = $email; - } - Mail::send( - [], - [], - fn (Message $message) => $message - ->to($this->email) - ->subject($this->mail->subject) - ->html((string) $this->mail->render()) - ); - $this->info("Email sent to $this->email successfully. 📧"); - } -} diff --git a/app/Console/Commands/Horizon.php b/app/Console/Commands/Horizon.php deleted file mode 100644 index d3e35ca5a1..0000000000 --- a/app/Console/Commands/Horizon.php +++ /dev/null @@ -1,23 +0,0 @@ -info('Horizon is enabled on this server.'); - $this->call('horizon'); - exit(0); - } else { - exit(0); - } - } -} diff --git a/app/Console/Commands/HorizonManage.php b/app/Console/Commands/HorizonManage.php deleted file mode 100644 index ca2da147c4..0000000000 --- a/app/Console/Commands/HorizonManage.php +++ /dev/null @@ -1,178 +0,0 @@ -option('can-i-restart-this-worker')) { - return $this->isThereAJobInProgress(); - } - - if ($this->option('job-status')) { - return $this->getJobStatus($this->option('job-status')); - } - - $action = select( - label: 'What to do?', - options: [ - 'pending' => 'Pending Jobs', - 'running' => 'Running Jobs', - 'can-i-restart-this-worker' => 'Can I restart this worker?', - 'job-status' => 'Job Status', - 'workers' => 'Workers', - 'failed' => 'Failed Jobs', - 'failed-delete' => 'Failed Jobs - Delete', - 'purge-queues' => 'Purge Queues', - ] - ); - - if ($action === 'can-i-restart-this-worker') { - $this->isThereAJobInProgress(); - } - - if ($action === 'job-status') { - $jobId = text('Which job to check?'); - $jobStatus = $this->getJobStatus($jobId); - $this->info('Job Status: '.$jobStatus); - } - - if ($action === 'pending') { - $pendingJobs = app(JobRepository::class)->getPending(); - $pendingJobsTable = []; - if (count($pendingJobs) === 0) { - $this->info('No pending jobs found.'); - - return; - } - foreach ($pendingJobs as $pendingJob) { - $pendingJobsTable[] = [ - 'id' => $pendingJob->id, - 'name' => $pendingJob->name, - 'status' => $pendingJob->status, - 'reserved_at' => $pendingJob->reserved_at ? now()->parse($pendingJob->reserved_at)->format('Y-m-d H:i:s') : null, - ]; - } - table($pendingJobsTable); - } - - if ($action === 'failed') { - $failedJobs = app(JobRepository::class)->getFailed(); - $failedJobsTable = []; - if (count($failedJobs) === 0) { - $this->info('No failed jobs found.'); - - return; - } - foreach ($failedJobs as $failedJob) { - $failedJobsTable[] = [ - 'id' => $failedJob->id, - 'name' => $failedJob->name, - 'failed_at' => $failedJob->failed_at ? now()->parse($failedJob->failed_at)->format('Y-m-d H:i:s') : null, - ]; - } - table($failedJobsTable); - } - - if ($action === 'failed-delete') { - $failedJobs = app(JobRepository::class)->getFailed(); - $failedJobsTable = []; - foreach ($failedJobs as $failedJob) { - $failedJobsTable[] = [ - 'id' => $failedJob->id, - 'name' => $failedJob->name, - 'failed_at' => $failedJob->failed_at ? now()->parse($failedJob->failed_at)->format('Y-m-d H:i:s') : null, - ]; - } - app(MetricsRepository::class)->clear(); - if (count($failedJobsTable) === 0) { - $this->info('No failed jobs found.'); - - return; - } - $jobIds = multiselect( - label: 'Which job to delete?', - options: collect($failedJobsTable)->mapWithKeys(fn ($job) => [$job['id'] => $job['id'].' - '.$job['name']])->toArray(), - ); - foreach ($jobIds as $jobId) { - Artisan::queue('horizon:forget', ['id' => $jobId]); - } - } - - if ($action === 'running') { - $redisJobRepository = app(CustomJobRepository::class); - $runningJobs = $redisJobRepository->getReservedJobs(); - $runningJobsTable = []; - if (count($runningJobs) === 0) { - $this->info('No running jobs found.'); - - return; - } - foreach ($runningJobs as $runningJob) { - $runningJobsTable[] = [ - 'id' => $runningJob->id, - 'name' => $runningJob->name, - 'reserved_at' => $runningJob->reserved_at ? now()->parse($runningJob->reserved_at)->format('Y-m-d H:i:s') : null, - ]; - } - table($runningJobsTable); - } - - if ($action === 'workers') { - $redisJobRepository = app(CustomJobRepository::class); - $workers = $redisJobRepository->getHorizonWorkers(); - $workersTable = []; - foreach ($workers as $worker) { - $workersTable[] = [ - 'name' => $worker->name, - ]; - } - table($workersTable); - } - - if ($action === 'purge-queues') { - $getQueues = app(CustomJobRepository::class)->getQueues(); - $queueName = select( - label: 'Which queue to purge?', - options: $getQueues, - ); - $redisJobRepository = app(RedisJobRepository::class); - $redisJobRepository->purge($queueName); - } - } - - public function isThereAJobInProgress() - { - $runningJobs = ApplicationDeploymentQueue::where('horizon_job_worker', gethostname())->where('status', ApplicationDeploymentStatus::IN_PROGRESS->value)->get(); - $count = $runningJobs->count(); - if ($count === 0) { - return false; - } - - return true; - } - - public function getJobStatus(string $jobId) - { - return getJobStatus($jobId); - } -} diff --git a/app/Console/Commands/Init.php b/app/Console/Commands/Init.php deleted file mode 100644 index a954b10fdf..0000000000 --- a/app/Console/Commands/Init.php +++ /dev/null @@ -1,273 +0,0 @@ -optimize(); - - if (isCloud() && ! $this->option('force-cloud')) { - echo "Skipping init as we are on cloud and --force-cloud option is not set\n"; - - return; - } - - $this->servers = Server::all(); - if (! isCloud()) { - $this->send_alive_signal(); - get_public_ips(); - } - - // Backward compatibility - $this->replace_slash_in_environment_name(); - $this->restore_coolify_db_backup(); - $this->update_user_emails(); - // - $this->update_traefik_labels(); - if (! isCloud() || $this->option('force-cloud')) { - $this->cleanup_unused_network_from_coolify_proxy(); - } - if (isCloud()) { - $this->cleanup_unnecessary_dynamic_proxy_configuration(); - } else { - $this->cleanup_in_progress_application_deployments(); - } - $this->call('cleanup:redis'); - - $this->call('cleanup:stucked-resources'); - - try { - $this->pullHelperImage(); - } catch (\Throwable $e) { - // - } - - if (isCloud()) { - try { - $this->pullTemplatesFromCDN(); - } catch (\Throwable $e) { - echo "Could not pull templates from CDN: {$e->getMessage()}\n"; - } - } - - if (! isCloud()) { - try { - $this->pullTemplatesFromCDN(); - } catch (\Throwable $e) { - echo "Could not pull templates from CDN: {$e->getMessage()}\n"; - } - try { - $localhost = $this->servers->where('id', 0)->first(); - $localhost->setupDynamicProxyConfiguration(); - } catch (\Throwable $e) { - echo "Could not setup dynamic configuration: {$e->getMessage()}\n"; - } - $settings = instanceSettings(); - if (! is_null(config('constants.coolify.autoupdate', null))) { - if (config('constants.coolify.autoupdate') == true) { - echo "Enabling auto-update\n"; - $settings->update(['is_auto_update_enabled' => true]); - } else { - echo "Disabling auto-update\n"; - $settings->update(['is_auto_update_enabled' => false]); - } - } - } - } - - private function pullHelperImage() - { - CheckHelperImageJob::dispatch(); - } - - private function pullTemplatesFromCDN() - { - $response = Http::retry(3, 1000)->get(config('constants.services.official')); - if ($response->successful()) { - $services = $response->json(); - File::put(base_path('templates/service-templates.json'), json_encode($services)); - } - } - - private function optimize() - { - Artisan::call('optimize:clear'); - Artisan::call('optimize'); - } - - private function update_user_emails() - { - try { - User::whereRaw('email ~ \'[A-Z]\'')->get()->each(function (User $user) { - $user->update(['email' => strtolower($user->email)]); - }); - } catch (\Throwable $e) { - echo "Error in updating user emails: {$e->getMessage()}\n"; - } - } - - private function update_traefik_labels() - { - try { - Server::where('proxy->type', 'TRAEFIK_V2')->update(['proxy->type' => 'TRAEFIK']); - } catch (\Throwable $e) { - echo "Error in updating traefik labels: {$e->getMessage()}\n"; - } - } - - private function cleanup_unnecessary_dynamic_proxy_configuration() - { - foreach ($this->servers as $server) { - try { - if (! $server->isFunctional()) { - continue; - } - if ($server->id === 0) { - continue; - } - $file = $server->proxyPath().'/dynamic/coolify.yaml'; - - return instant_remote_process([ - "rm -f $file", - ], $server, false); - } catch (\Throwable $e) { - echo "Error in cleaning up unnecessary dynamic proxy configuration: {$e->getMessage()}\n"; - } - } - } - - private function cleanup_unused_network_from_coolify_proxy() - { - foreach ($this->servers as $server) { - if (! $server->isFunctional()) { - continue; - } - if (! $server->isProxyShouldRun()) { - continue; - } - try { - ['networks' => $networks, 'allNetworks' => $allNetworks] = collectDockerNetworksByServer($server); - $removeNetworks = $allNetworks->diff($networks); - $commands = collect(); - foreach ($removeNetworks as $network) { - $out = instant_remote_process(["docker network inspect -f json $network | jq '.[].Containers | if . == {} then null else . end'"], $server, false); - if (empty($out)) { - $commands->push("docker network disconnect $network coolify-proxy >/dev/null 2>&1 || true"); - $commands->push("docker network rm $network >/dev/null 2>&1 || true"); - } else { - $data = collect(json_decode($out, true)); - if ($data->count() === 1) { - // If only coolify-proxy itself is connected to that network (it should not be possible, but who knows) - $isCoolifyProxyItself = data_get($data->first(), 'Name') === 'coolify-proxy'; - if ($isCoolifyProxyItself) { - $commands->push("docker network disconnect $network coolify-proxy >/dev/null 2>&1 || true"); - $commands->push("docker network rm $network >/dev/null 2>&1 || true"); - } - } - } - } - if ($commands->isNotEmpty()) { - remote_process(command: $commands, type: ActivityTypes::INLINE->value, server: $server, ignore_errors: false); - } - } catch (\Throwable $e) { - echo "Error in cleaning up unused networks from coolify proxy: {$e->getMessage()}\n"; - } - } - } - - private function restore_coolify_db_backup() - { - if (version_compare('4.0.0-beta.179', config('constants.coolify.version'), '<=')) { - try { - $database = StandalonePostgresql::withTrashed()->find(0); - if ($database && $database->trashed()) { - $database->restore(); - $scheduledBackup = ScheduledDatabaseBackup::find(0); - if (! $scheduledBackup) { - ScheduledDatabaseBackup::create([ - 'id' => 0, - 'enabled' => true, - 'save_s3' => false, - 'frequency' => '0 0 * * *', - 'database_id' => $database->id, - 'database_type' => \App\Models\StandalonePostgresql::class, - 'team_id' => 0, - ]); - } - } - } catch (\Throwable $e) { - echo "Error in restoring coolify db backup: {$e->getMessage()}\n"; - } - } - } - - private function send_alive_signal() - { - $id = config('app.id'); - $version = config('constants.coolify.version'); - $settings = instanceSettings(); - $do_not_track = data_get($settings, 'do_not_track'); - if ($do_not_track == true) { - echo "Do_not_track is enabled\n"; - - return; - } - try { - Http::get("https://undead.coolify.io/v4/alive?appId=$id&version=$version"); - } catch (\Throwable $e) { - echo "Error in sending live signal: {$e->getMessage()}\n"; - } - } - - private function cleanup_in_progress_application_deployments() - { - // Cleanup any failed deployments - try { - if (isCloud()) { - return; - } - $queued_inprogress_deployments = ApplicationDeploymentQueue::whereIn('status', [ApplicationDeploymentStatus::IN_PROGRESS->value, ApplicationDeploymentStatus::QUEUED->value])->get(); - foreach ($queued_inprogress_deployments as $deployment) { - $deployment->status = ApplicationDeploymentStatus::FAILED->value; - $deployment->save(); - } - } catch (\Throwable $e) { - echo "Error: {$e->getMessage()}\n"; - } - } - - private function replace_slash_in_environment_name() - { - if (version_compare('4.0.0-beta.298', config('constants.coolify.version'), '<=')) { - $environments = Environment::all(); - foreach ($environments as $environment) { - if (str_contains($environment->name, '/')) { - $environment->name = str_replace('/', '-', $environment->name); - $environment->save(); - } - } - } - } -} diff --git a/app/Console/Commands/Migration.php b/app/Console/Commands/Migration.php deleted file mode 100644 index 44c17203bf..0000000000 --- a/app/Console/Commands/Migration.php +++ /dev/null @@ -1,24 +0,0 @@ -info('Migration is enabled on this server.'); - $this->call('migrate', ['--force' => true, '--isolated' => true]); - exit(0); - } else { - $this->info('Migration is disabled on this server.'); - exit(0); - } - } -} diff --git a/app/Console/Commands/NotifyDemo.php b/app/Console/Commands/NotifyDemo.php deleted file mode 100644 index 990a03869c..0000000000 --- a/app/Console/Commands/NotifyDemo.php +++ /dev/null @@ -1,78 +0,0 @@ -argument('channel'); - - if (blank($channel)) { - $this->showHelp(); - - return; - } - } - - private function showHelp() - { - style('coolify')->color('#9333EA'); - style('title-box')->apply('mt-1 px-2 py-1 bg-coolify'); - - render( - <<<'HTML' -
-
- Coolify -
-

- Demo Notify => Send a demo notification to a given channel. -

-

- php artisan app:demo-notify {channel} -

-
-
Channels:
-
    -
  • email
  • -
  • discord
  • -
  • telegram
  • -
  • slack
  • -
  • pushover
  • -
-
-
- HTML - ); - - ask(<<<'HTML' -
- In which manner you wish a coolified notification? -
- HTML, ['email', 'discord', 'telegram', 'slack', 'pushover']); - } -} diff --git a/app/Console/Commands/OpenApi.php b/app/Console/Commands/OpenApi.php deleted file mode 100644 index 6cbcb310c3..0000000000 --- a/app/Console/Commands/OpenApi.php +++ /dev/null @@ -1,33 +0,0 @@ -errorOutput(); - $error = preg_replace('/^.*an object literal,.*$/m', '', $error); - $error = preg_replace('/^\h*\v+/m', '', $error); - echo $error; - echo $process->output(); - } -} diff --git a/app/Console/Commands/RootChangeEmail.php b/app/Console/Commands/RootChangeEmail.php deleted file mode 100644 index c87a545c5b..0000000000 --- a/app/Console/Commands/RootChangeEmail.php +++ /dev/null @@ -1,42 +0,0 @@ -info('You are about to change the root user\'s email.'); - $email = $this->ask('Give me a new email for root user'); - $this->info('Updating root email...'); - try { - User::find(0)->update(['email' => $email]); - $this->info('Root user\'s email updated successfully.'); - } catch (\Exception $e) { - $this->error('Failed to update root user\'s email.'); - - return; - } - } -} diff --git a/app/Console/Commands/RootResetPassword.php b/app/Console/Commands/RootResetPassword.php deleted file mode 100644 index f36c11a4f1..0000000000 --- a/app/Console/Commands/RootResetPassword.php +++ /dev/null @@ -1,50 +0,0 @@ -info('You are about to reset the root password.'); - $password = password('Give me a new password for root user: '); - $passwordAgain = password('Again'); - if ($password != $passwordAgain) { - $this->error('Passwords do not match.'); - - return; - } - $this->info('Updating root password...'); - try { - User::find(0)->update(['password' => Hash::make($password)]); - $this->info('Root password updated successfully.'); - } catch (\Exception $e) { - $this->error('Failed to update root password.'); - - return; - } - } -} diff --git a/app/Console/Commands/Scheduler.php b/app/Console/Commands/Scheduler.php deleted file mode 100644 index ee64368c3d..0000000000 --- a/app/Console/Commands/Scheduler.php +++ /dev/null @@ -1,23 +0,0 @@ -info('Scheduler is enabled on this server.'); - $this->call('schedule:work'); - exit(0); - } else { - exit(0); - } - } -} diff --git a/app/Console/Commands/Seeder.php b/app/Console/Commands/Seeder.php deleted file mode 100644 index e37b6a9d27..0000000000 --- a/app/Console/Commands/Seeder.php +++ /dev/null @@ -1,24 +0,0 @@ -info('Seeder is enabled on this server.'); - $this->call('db:seed', ['--class' => 'ProductionSeeder', '--force' => true]); - exit(0); - } else { - $this->info('Seeder is disabled on this server.'); - exit(0); - } - } -} diff --git a/app/Console/Commands/ServicesDelete.php b/app/Console/Commands/ServicesDelete.php deleted file mode 100644 index b5a74166a5..0000000000 --- a/app/Console/Commands/ServicesDelete.php +++ /dev/null @@ -1,155 +0,0 @@ -deleteApplication(); - } elseif ($resource === 'Database') { - $this->deleteDatabase(); - } elseif ($resource === 'Service') { - $this->deleteService(); - } elseif ($resource === 'Server') { - $this->deleteServer(); - } - } - - private function deleteServer() - { - $servers = Server::all(); - if ($servers->count() === 0) { - $this->error('There are no applications to delete.'); - - return; - } - $serversToDelete = multiselect( - label: 'What server do you want to delete?', - options: $servers->pluck('name', 'id')->sortKeys(), - ); - - foreach ($serversToDelete as $server) { - $toDelete = $servers->where('id', $server)->first(); - if ($toDelete) { - $this->info($toDelete); - $confirmed = confirm('Are you sure you want to delete all selected resources?'); - if (! $confirmed) { - break; - } - $toDelete->delete(); - } - } - } - - private function deleteApplication() - { - $applications = Application::all(); - if ($applications->count() === 0) { - $this->error('There are no applications to delete.'); - - return; - } - $applicationsToDelete = multiselect( - 'What application do you want to delete?', - $applications->pluck('name', 'id')->sortKeys(), - ); - - foreach ($applicationsToDelete as $application) { - $toDelete = $applications->where('id', $application)->first(); - if ($toDelete) { - $this->info($toDelete); - $confirmed = confirm('Are you sure you want to delete all selected resources? '); - if (! $confirmed) { - break; - } - DeleteResourceJob::dispatch($toDelete); - } - } - } - - private function deleteDatabase() - { - $databases = StandalonePostgresql::all(); - if ($databases->count() === 0) { - $this->error('There are no databases to delete.'); - - return; - } - $databasesToDelete = multiselect( - 'What database do you want to delete?', - $databases->pluck('name', 'id')->sortKeys(), - ); - - foreach ($databasesToDelete as $database) { - $toDelete = $databases->where('id', $database)->first(); - if ($toDelete) { - $this->info($toDelete); - $confirmed = confirm('Are you sure you want to delete all selected resources?'); - if (! $confirmed) { - return; - } - DeleteResourceJob::dispatch($toDelete); - } - } - } - - private function deleteService() - { - $services = Service::all(); - if ($services->count() === 0) { - $this->error('There are no services to delete.'); - - return; - } - $servicesToDelete = multiselect( - 'What service do you want to delete?', - $services->pluck('name', 'id')->sortKeys(), - ); - - foreach ($servicesToDelete as $service) { - $toDelete = $services->where('id', $service)->first(); - if ($toDelete) { - $this->info($toDelete); - $confirmed = confirm('Are you sure you want to delete all selected resources?'); - if (! $confirmed) { - return; - } - DeleteResourceJob::dispatch($toDelete); - } - } - } -} diff --git a/app/Console/Commands/ServicesGenerate.php b/app/Console/Commands/ServicesGenerate.php deleted file mode 100644 index b45707c5c0..0000000000 --- a/app/Console/Commands/ServicesGenerate.php +++ /dev/null @@ -1,89 +0,0 @@ -mapWithKeys(function ($file): array { - $file = basename($file); - $parsed = $this->processFile($file); - - return $parsed === false ? [] : [ - Arr::pull($parsed, 'name') => $parsed, - ]; - })->toJson(JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); - - file_put_contents(base_path('templates/service-templates.json'), $serviceTemplatesJson.PHP_EOL); - - return self::SUCCESS; - } - - private function processFile(string $file): false|array - { - $content = file_get_contents(base_path("templates/compose/$file")); - - $data = collect(explode(PHP_EOL, $content))->mapWithKeys(function ($line): array { - preg_match('/^#(?.*):(?.*)$/U', $line, $m); - - return $m ? [trim($m['key']) => trim($m['value'])] : []; - }); - - if (str($data->get('ignore'))->toBoolean()) { - $this->info("Ignoring $file"); - - return false; - } - - $this->info("Processing $file"); - - $documentation = $data->get('documentation'); - $documentation = $documentation ? $documentation.'?utm_source=coolify.io' : 'https://coolify.io/docs'; - - $json = Yaml::parse($content); - $compose = base64_encode(Yaml::dump($json, 10, 2)); - - $tags = str($data->get('tags'))->lower()->explode(',')->map(fn ($tag) => trim($tag))->filter(); - $tags = $tags->isEmpty() ? null : $tags->all(); - - $payload = [ - 'name' => pathinfo($file, PATHINFO_FILENAME), - 'documentation' => $documentation, - 'slogan' => $data->get('slogan', str($file)->headline()), - 'compose' => $compose, - 'tags' => $tags, - 'logo' => $data->get('logo', 'svgs/default.webp'), - 'minversion' => $data->get('minversion', '0.0.0'), - ]; - - if ($port = $data->get('port')) { - $payload['port'] = $port; - } - - if ($envFile = $data->get('env_file')) { - $envFileContent = file_get_contents(base_path("templates/compose/$envFile")); - $payload['envs'] = base64_encode($envFileContent); - } - - return $payload; - } -} diff --git a/app/Console/Commands/SyncBunny.php b/app/Console/Commands/SyncBunny.php deleted file mode 100644 index df19038286..0000000000 --- a/app/Console/Commands/SyncBunny.php +++ /dev/null @@ -1,159 +0,0 @@ -option('templates'); - $only_version = $this->option('release'); - $nightly = $this->option('nightly'); - $bunny_cdn = 'https://cdn.coollabs.io'; - $bunny_cdn_path = 'coolify'; - $bunny_cdn_storage_name = 'coolcdn'; - - $parent_dir = realpath(dirname(__FILE__).'/../../..'); - - $compose_file = 'docker-compose.yml'; - $compose_file_prod = 'docker-compose.prod.yml'; - $install_script = 'install.sh'; - $upgrade_script = 'upgrade.sh'; - $production_env = '.env.production'; - $service_template = 'service-templates.json'; - $versions = 'versions.json'; - - $compose_file_location = "$parent_dir/$compose_file"; - $compose_file_prod_location = "$parent_dir/$compose_file_prod"; - $install_script_location = "$parent_dir/scripts/install.sh"; - $upgrade_script_location = "$parent_dir/scripts/upgrade.sh"; - $production_env_location = "$parent_dir/.env.production"; - $versions_location = "$parent_dir/$versions"; - - PendingRequest::macro('storage', function ($fileName) use ($that) { - $headers = [ - 'AccessKey' => config('constants.bunny.storage_api_key'), - 'Accept' => 'application/json', - 'Content-Type' => 'application/octet-stream', - ]; - $fileStream = fopen($fileName, 'r'); - $file = fread($fileStream, filesize($fileName)); - $that->info('Uploading: '.$fileName); - - return PendingRequest::baseUrl('https://storage.bunnycdn.com')->withHeaders($headers)->withBody($file)->throw(); - }); - PendingRequest::macro('purge', function ($url) use ($that) { - $headers = [ - 'AccessKey' => config('constants.bunny.api_key'), - 'Accept' => 'application/json', - ]; - $that->info('Purging: '.$url); - - return PendingRequest::withHeaders($headers)->get('https://api.bunny.net/purge', [ - 'url' => $url, - 'async' => false, - ]); - }); - try { - if ($nightly) { - $bunny_cdn_path = 'coolify-nightly'; - - $compose_file_location = "$parent_dir/other/nightly/$compose_file"; - $compose_file_prod_location = "$parent_dir/other/nightly/$compose_file_prod"; - $production_env_location = "$parent_dir/other/nightly/$production_env"; - $upgrade_script_location = "$parent_dir/other/nightly/$upgrade_script"; - $install_script_location = "$parent_dir/other/nightly/$install_script"; - $versions_location = "$parent_dir/other/nightly/$versions"; - } - if (! $only_template && ! $only_version) { - if ($nightly) { - $this->info('About to sync files NIGHTLY (docker-compose.prod.yaml, upgrade.sh, install.sh, etc) to BunnyCDN.'); - } else { - $this->info('About to sync files PRODUCTION (docker-compose.yml, docker-compose.prod.yml, upgrade.sh, install.sh, etc) to BunnyCDN.'); - } - $confirmed = confirm('Are you sure you want to sync?'); - if (! $confirmed) { - return; - } - } - if ($only_template) { - $this->info('About to sync service-templates.json to BunnyCDN.'); - $confirmed = confirm('Are you sure you want to sync?'); - if (! $confirmed) { - return; - } - Http::pool(fn (Pool $pool) => [ - $pool->storage(fileName: "$parent_dir/templates/$service_template")->put("/$bunny_cdn_storage_name/$bunny_cdn_path/$service_template"), - $pool->purge("$bunny_cdn/$bunny_cdn_path/$service_template"), - ]); - $this->info('Service template uploaded & purged...'); - - return; - } elseif ($only_version) { - if ($nightly) { - $this->info('About to sync NIGHLTY versions.json to BunnyCDN.'); - } else { - $this->info('About to sync PRODUCTION versions.json to BunnyCDN.'); - } - $file = file_get_contents($versions_location); - $json = json_decode($file, true); - $actual_version = data_get($json, 'coolify.v4.version'); - - $confirmed = confirm("Are you sure you want to sync to {$actual_version}?"); - if (! $confirmed) { - return; - } - Http::pool(fn (Pool $pool) => [ - $pool->storage(fileName: $versions_location)->put("/$bunny_cdn_storage_name/$bunny_cdn_path/$versions"), - $pool->purge("$bunny_cdn/$bunny_cdn_path/$versions"), - ]); - $this->info('versions.json uploaded & purged...'); - - return; - } - - Http::pool(fn (Pool $pool) => [ - $pool->storage(fileName: "$compose_file_location")->put("/$bunny_cdn_storage_name/$bunny_cdn_path/$compose_file"), - $pool->storage(fileName: "$compose_file_prod_location")->put("/$bunny_cdn_storage_name/$bunny_cdn_path/$compose_file_prod"), - $pool->storage(fileName: "$production_env_location")->put("/$bunny_cdn_storage_name/$bunny_cdn_path/$production_env"), - $pool->storage(fileName: "$upgrade_script_location")->put("/$bunny_cdn_storage_name/$bunny_cdn_path/$upgrade_script"), - $pool->storage(fileName: "$install_script_location")->put("/$bunny_cdn_storage_name/$bunny_cdn_path/$install_script"), - ]); - Http::pool(fn (Pool $pool) => [ - $pool->purge("$bunny_cdn/$bunny_cdn_path/$compose_file"), - $pool->purge("$bunny_cdn/$bunny_cdn_path/$compose_file_prod"), - $pool->purge("$bunny_cdn/$bunny_cdn_path/$production_env"), - $pool->purge("$bunny_cdn/$bunny_cdn_path/$upgrade_script"), - $pool->purge("$bunny_cdn/$bunny_cdn_path/$install_script"), - ]); - $this->info('All files uploaded & purged...'); - } catch (\Throwable $e) { - $this->error('Error: '.$e->getMessage()); - } - } -} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php deleted file mode 100644 index 122d72c396..0000000000 --- a/app/Console/Kernel.php +++ /dev/null @@ -1,312 +0,0 @@ -scheduleInstance = $schedule; - $this->allServers = Server::where('ip', '!=', '1.2.3.4'); - - $this->settings = instanceSettings(); - $this->updateCheckFrequency = $this->settings->update_check_frequency ?: '0 * * * *'; - - $this->instanceTimezone = $this->settings->instance_timezone ?: config('app.timezone'); - - if (validate_timezone($this->instanceTimezone) === false) { - $this->instanceTimezone = config('app.timezone'); - } - - // $this->scheduleInstance->job(new CleanupStaleMultiplexedConnections)->hourly(); - - if (isDev()) { - // Instance Jobs - $this->scheduleInstance->command('horizon:snapshot')->everyMinute(); - $this->scheduleInstance->job(new CleanupInstanceStuffsJob)->everyMinute()->onOneServer(); - $this->scheduleInstance->job(new CheckHelperImageJob)->everyTenMinutes()->onOneServer(); - - // Server Jobs - $this->checkResources(); - - $this->checkScheduledBackups(); - $this->checkScheduledTasks(); - - $this->scheduleInstance->command('uploads:clear')->everyTwoMinutes(); - - } else { - // Instance Jobs - $this->scheduleInstance->command('horizon:snapshot')->everyFiveMinutes(); - $this->scheduleInstance->command('cleanup:unreachable-servers')->daily()->onOneServer(); - - $this->scheduleInstance->job(new PullTemplatesFromCDN)->cron($this->updateCheckFrequency)->timezone($this->instanceTimezone)->onOneServer(); - - $this->scheduleInstance->job(new CleanupInstanceStuffsJob)->everyTwoMinutes()->onOneServer(); - $this->scheduleUpdates(); - - // Server Jobs - $this->checkResources(); - - $this->pullImages(); - - $this->checkScheduledBackups(); - $this->checkScheduledTasks(); - - $this->scheduleInstance->command('cleanup:database --yes')->daily(); - $this->scheduleInstance->command('uploads:clear')->everyTwoMinutes(); - } - } - - private function pullImages(): void - { - if (isCloud()) { - $servers = $this->allServers->whereRelation('team.subscription', 'stripe_invoice_paid', true)->whereRelation('settings', 'is_usable', true)->whereRelation('settings', 'is_reachable', true)->get(); - $own = Team::find(0)->servers; - $servers = $servers->merge($own); - } else { - $servers = $this->allServers->whereRelation('settings', 'is_usable', true)->whereRelation('settings', 'is_reachable', true)->get(); - } - foreach ($servers as $server) { - try { - if ($server->isSentinelEnabled()) { - $this->scheduleInstance->job(function () use ($server) { - CheckAndStartSentinelJob::dispatch($server); - })->cron($this->updateCheckFrequency)->timezone($this->instanceTimezone)->onOneServer(); - } - } catch (\Exception $e) { - Log::error('Error pulling images: '.$e->getMessage()); - } - } - $this->scheduleInstance->job(new CheckHelperImageJob) - ->cron($this->updateCheckFrequency) - ->timezone($this->instanceTimezone) - ->onOneServer(); - } - - private function scheduleUpdates(): void - { - $this->scheduleInstance->job(new CheckForUpdatesJob) - ->cron($this->updateCheckFrequency) - ->timezone($this->instanceTimezone) - ->onOneServer(); - - if ($this->settings->is_auto_update_enabled) { - $autoUpdateFrequency = $this->settings->auto_update_frequency; - $this->scheduleInstance->job(new UpdateCoolifyJob) - ->cron($autoUpdateFrequency) - ->timezone($this->instanceTimezone) - ->onOneServer(); - } - } - - private function checkResources(): void - { - if (isCloud()) { - $servers = $this->allServers->whereRelation('team.subscription', 'stripe_invoice_paid', true)->get(); - $own = Team::find(0)->servers; - $servers = $servers->merge($own); - } else { - $servers = $this->allServers->get(); - } - - foreach ($servers as $server) { - try { - $serverTimezone = data_get($server->settings, 'server_timezone', $this->instanceTimezone); - if (validate_timezone($serverTimezone) === false) { - $serverTimezone = config('app.timezone'); - } - - // Sentinel check - $lastSentinelUpdate = $server->sentinel_updated_at; - if (Carbon::parse($lastSentinelUpdate)->isBefore(now()->subSeconds($server->waitBeforeDoingSshCheck()))) { - // Check container status every minute if Sentinel does not activated - if (isCloud()) { - $this->scheduleInstance->job(new ServerCheckJob($server))->timezone($serverTimezone)->everyFiveMinutes()->onOneServer(); - } else { - $this->scheduleInstance->job(new ServerCheckJob($server))->timezone($serverTimezone)->everyMinute()->onOneServer(); - } - // $this->scheduleInstance->job(new \App\Jobs\ServerCheckNewJob($server))->everyFiveMinutes()->onOneServer(); - - $serverDiskUsageCheckFrequency = data_get($server->settings, 'server_disk_usage_check_frequency', '0 * * * *'); - if (isset(VALID_CRON_STRINGS[$serverDiskUsageCheckFrequency])) { - $serverDiskUsageCheckFrequency = VALID_CRON_STRINGS[$serverDiskUsageCheckFrequency]; - } - $this->scheduleInstance->job(new ServerStorageCheckJob($server))->cron($serverDiskUsageCheckFrequency)->timezone($serverTimezone)->onOneServer(); - } - - $dockerCleanupFrequency = data_get($server->settings, 'docker_cleanup_frequency', '0 * * * *'); - if (isset(VALID_CRON_STRINGS[$dockerCleanupFrequency])) { - $dockerCleanupFrequency = VALID_CRON_STRINGS[$dockerCleanupFrequency]; - } - $this->scheduleInstance->job(new DockerCleanupJob($server))->cron($dockerCleanupFrequency)->timezone($serverTimezone)->onOneServer(); - - // Cleanup multiplexed connections every hour - // $this->scheduleInstance->job(new ServerCleanupMux($server))->hourly()->onOneServer(); - - // Temporary solution until we have better memory management for Sentinel - if ($server->isSentinelEnabled()) { - $this->scheduleInstance->job(function () use ($server) { - $server->restartContainer('coolify-sentinel'); - })->daily()->onOneServer(); - } - } catch (\Exception $e) { - Log::error('Error checking resources: '.$e->getMessage()); - } - } - } - - private function checkScheduledBackups(): void - { - $scheduled_backups = ScheduledDatabaseBackup::where('enabled', true)->get(); - if ($scheduled_backups->isEmpty()) { - return; - } - $finalScheduledBackups = collect(); - foreach ($scheduled_backups as $scheduled_backup) { - if (blank(data_get($scheduled_backup, 'database'))) { - $scheduled_backup->delete(); - - continue; - } - $server = $scheduled_backup->server(); - if (blank($server)) { - $scheduled_backup->delete(); - - continue; - } - if ($server->isFunctional() === false) { - continue; - } - if (isCloud() && data_get($server->team->subscription, 'stripe_invoice_paid', false) === false && $server->team->id !== 0) { - continue; - } - $finalScheduledBackups->push($scheduled_backup); - } - - foreach ($finalScheduledBackups as $scheduled_backup) { - try { - if (isset(VALID_CRON_STRINGS[$scheduled_backup->frequency])) { - $scheduled_backup->frequency = VALID_CRON_STRINGS[$scheduled_backup->frequency]; - } - $server = $scheduled_backup->server(); - $serverTimezone = data_get($server->settings, 'server_timezone', $this->instanceTimezone); - - if (validate_timezone($serverTimezone) === false) { - $serverTimezone = config('app.timezone'); - } - - if (isset(VALID_CRON_STRINGS[$scheduled_backup->frequency])) { - $scheduled_backup->frequency = VALID_CRON_STRINGS[$scheduled_backup->frequency]; - } - $serverTimezone = data_get($server->settings, 'server_timezone', $this->instanceTimezone); - $this->scheduleInstance->job(new DatabaseBackupJob( - backup: $scheduled_backup - ))->cron($scheduled_backup->frequency)->timezone($serverTimezone)->onOneServer(); - } catch (\Exception $e) { - Log::error('Error scheduling backup: '.$e->getMessage()); - Log::error($e->getTraceAsString()); - } - } - } - - private function checkScheduledTasks(): void - { - $scheduled_tasks = ScheduledTask::where('enabled', true)->get(); - if ($scheduled_tasks->isEmpty()) { - return; - } - $finalScheduledTasks = collect(); - foreach ($scheduled_tasks as $scheduled_task) { - $service = $scheduled_task->service; - $application = $scheduled_task->application; - - $server = $scheduled_task->server(); - if (blank($server)) { - $scheduled_task->delete(); - - continue; - } - - if ($server->isFunctional() === false) { - continue; - } - - if (isCloud() && data_get($server->team->subscription, 'stripe_invoice_paid', false) === false && $server->team->id !== 0) { - continue; - } - - if (! $service && ! $application) { - $scheduled_task->delete(); - - continue; - } - - if ($application && str($application->status)->contains('running') === false) { - continue; - } - if ($service && str($service->status)->contains('running') === false) { - continue; - } - - $finalScheduledTasks->push($scheduled_task); - } - - foreach ($finalScheduledTasks as $scheduled_task) { - try { - $server = $scheduled_task->server(); - if (isset(VALID_CRON_STRINGS[$scheduled_task->frequency])) { - $scheduled_task->frequency = VALID_CRON_STRINGS[$scheduled_task->frequency]; - } - $serverTimezone = data_get($server->settings, 'server_timezone', $this->instanceTimezone); - - if (validate_timezone($serverTimezone) === false) { - $serverTimezone = config('app.timezone'); - } - $this->scheduleInstance->job(new ScheduledTaskJob( - task: $scheduled_task - ))->cron($scheduled_task->frequency)->timezone($serverTimezone)->onOneServer(); - } catch (\Exception $e) { - Log::error('Error scheduling task: '.$e->getMessage()); - Log::error($e->getTraceAsString()); - } - } - } - - protected function commands(): void - { - $this->load(__DIR__.'/Commands'); - - require base_path('routes/console.php'); - } -} diff --git a/app/Contracts/CustomJobRepositoryInterface.php b/app/Contracts/CustomJobRepositoryInterface.php deleted file mode 100644 index 1fbd71f464..0000000000 --- a/app/Contracts/CustomJobRepositoryInterface.php +++ /dev/null @@ -1,19 +0,0 @@ -status = ProcessStatus::QUEUED->value; - } - } -} diff --git a/app/Data/ServerMetadata.php b/app/Data/ServerMetadata.php deleted file mode 100644 index d95944b15a..0000000000 --- a/app/Data/ServerMetadata.php +++ /dev/null @@ -1,15 +0,0 @@ - 1, - self::ADMIN => 2, - self::OWNER => 3, - }; - } - - public function lt(Role|string $role): bool - { - if (is_string($role)) { - $role = Role::from($role); - } - - return $this->rank() < $role->rank(); - } - - public function gt(Role|string $role): bool - { - if (is_string($role)) { - $role = Role::from($role); - } - - return $this->rank() > $role->rank(); - } -} diff --git a/app/Enums/StaticImageTypes.php b/app/Enums/StaticImageTypes.php deleted file mode 100644 index 5f5304bf87..0000000000 --- a/app/Enums/StaticImageTypes.php +++ /dev/null @@ -1,8 +0,0 @@ -user()->currentTeam()->id ?? null; - } - if (is_null($teamId)) { - throw new \Exception('Team id is null'); - } - $this->teamId = $teamId; - } - - public function broadcastOn(): array - { - return [ - new PrivateChannel("team.{$this->teamId}"), - ]; - } -} diff --git a/app/Events/BackupCreated.php b/app/Events/BackupCreated.php deleted file mode 100644 index 45b2aacb7a..0000000000 --- a/app/Events/BackupCreated.php +++ /dev/null @@ -1,34 +0,0 @@ -user()->currentTeam()->id ?? null; - } - if (is_null($teamId)) { - throw new \Exception('Team id is null'); - } - $this->teamId = $teamId; - } - - public function broadcastOn(): array - { - return [ - new PrivateChannel("team.{$this->teamId}"), - ]; - } -} diff --git a/app/Events/CloudflareTunnelConfigured.php b/app/Events/CloudflareTunnelConfigured.php deleted file mode 100644 index 3d7076d0da..0000000000 --- a/app/Events/CloudflareTunnelConfigured.php +++ /dev/null @@ -1,34 +0,0 @@ -user()->currentTeam()->id ?? null; - } - if (is_null($teamId)) { - throw new \Exception('Team id is null'); - } - $this->teamId = $teamId; - } - - public function broadcastOn(): array - { - return [ - new PrivateChannel("team.{$this->teamId}"), - ]; - } -} diff --git a/app/Events/DatabaseProxyStopped.php b/app/Events/DatabaseProxyStopped.php deleted file mode 100644 index 96b35a5cac..0000000000 --- a/app/Events/DatabaseProxyStopped.php +++ /dev/null @@ -1,35 +0,0 @@ -currentTeam()?->id ?? null; - } - if (is_null($teamId)) { - throw new \Exception('Team id is null'); - } - $this->teamId = $teamId; - } - - public function broadcastOn(): array - { - return [ - new PrivateChannel("team.{$this->teamId}"), - ]; - } -} diff --git a/app/Events/DatabaseStatusChanged.php b/app/Events/DatabaseStatusChanged.php deleted file mode 100644 index 913b21bc22..0000000000 --- a/app/Events/DatabaseStatusChanged.php +++ /dev/null @@ -1,40 +0,0 @@ -userId = $userId; - } - - public function broadcastOn(): ?array - { - if (! is_null($this->userId)) { - return [ - new PrivateChannel("user.{$this->userId}"), - ]; - } - - return null; - } -} diff --git a/app/Events/DockerCleanupDone.php b/app/Events/DockerCleanupDone.php deleted file mode 100644 index 2bd7fee198..0000000000 --- a/app/Events/DockerCleanupDone.php +++ /dev/null @@ -1,24 +0,0 @@ -execution->server->team->id), - ]; - } -} diff --git a/app/Events/FileStorageChanged.php b/app/Events/FileStorageChanged.php deleted file mode 100644 index 57004cf4c3..0000000000 --- a/app/Events/FileStorageChanged.php +++ /dev/null @@ -1,31 +0,0 @@ -teamId = $teamId; - } - - public function broadcastOn(): array - { - return [ - new PrivateChannel("team.{$this->teamId}"), - ]; - } -} diff --git a/app/Events/ProxyStarted.php b/app/Events/ProxyStarted.php deleted file mode 100644 index 64d562e0a6..0000000000 --- a/app/Events/ProxyStarted.php +++ /dev/null @@ -1,14 +0,0 @@ -user()->currentTeam()->id ?? null; - } - if (is_null($teamId)) { - throw new \Exception('Team id is null'); - } - $this->teamId = $teamId; - } - - public function broadcastOn(): array - { - return [ - new PrivateChannel("team.{$this->teamId}"), - ]; - } -} diff --git a/app/Events/RestoreJobFinished.php b/app/Events/RestoreJobFinished.php deleted file mode 100644 index d3adb77984..0000000000 --- a/app/Events/RestoreJobFinished.php +++ /dev/null @@ -1,34 +0,0 @@ -startsWith('/tmp/') - && str($scriptPath)->startsWith('/tmp/') - && ! str($tmpPath)->contains('..') - && ! str($scriptPath)->contains('..') - && strlen($tmpPath) > 5 // longer than just "/tmp/" - && strlen($scriptPath) > 5 - ) { - $commands[] = "docker exec {$container} sh -c 'rm {$scriptPath}'"; - $commands[] = "docker exec {$container} sh -c 'rm {$tmpPath}'"; - instant_remote_process($commands, Server::find($serverId), throwError: true); - } - } - } -} diff --git a/app/Events/ScheduledTaskDone.php b/app/Events/ScheduledTaskDone.php deleted file mode 100644 index c8b5547f61..0000000000 --- a/app/Events/ScheduledTaskDone.php +++ /dev/null @@ -1,34 +0,0 @@ -user()->currentTeam()->id ?? null; - } - if (is_null($teamId)) { - throw new \Exception('Team id is null'); - } - $this->teamId = $teamId; - } - - public function broadcastOn(): array - { - return [ - new PrivateChannel("team.{$this->teamId}"), - ]; - } -} diff --git a/app/Events/ServerReachabilityChanged.php b/app/Events/ServerReachabilityChanged.php deleted file mode 100644 index fb4680146c..0000000000 --- a/app/Events/ServerReachabilityChanged.php +++ /dev/null @@ -1,17 +0,0 @@ -server->isReachableChanged(); - } -} diff --git a/app/Events/ServiceStatusChanged.php b/app/Events/ServiceStatusChanged.php deleted file mode 100644 index 3950022e10..0000000000 --- a/app/Events/ServiceStatusChanged.php +++ /dev/null @@ -1,39 +0,0 @@ -userId = $userId; - } - - public function broadcastOn(): ?array - { - if (! is_null($this->userId)) { - return [ - new PrivateChannel("user.{$this->userId}"), - ]; - } - - return null; - } -} diff --git a/app/Events/TestEvent.php b/app/Events/TestEvent.php deleted file mode 100644 index 2cc6683dc2..0000000000 --- a/app/Events/TestEvent.php +++ /dev/null @@ -1,28 +0,0 @@ -teamId = auth()->user()->currentTeam()->id; - } - - public function broadcastOn(): array - { - return [ - new PrivateChannel("team.{$this->teamId}"), - ]; - } -} diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php deleted file mode 100644 index 8c89bb07f9..0000000000 --- a/app/Exceptions/Handler.php +++ /dev/null @@ -1,90 +0,0 @@ -, \Psr\Log\LogLevel::*> - */ - protected $levels = [ - // - ]; - - /** - * A list of the exception types that are not reported. - * - * @var array> - */ - protected $dontReport = [ - ProcessException::class, - ]; - - /** - * A list of the inputs that are never flashed to the session on validation exceptions. - * - * @var array - */ - protected $dontFlash = [ - 'current_password', - 'password', - 'password_confirmation', - ]; - - private InstanceSettings $settings; - - protected function unauthenticated($request, AuthenticationException $exception) - { - if ($request->is('api/*') || $request->expectsJson() || $this->shouldReturnJson($request, $exception)) { - return response()->json(['message' => $exception->getMessage()], 401); - } - - return redirect()->guest($exception->redirectTo($request) ?? route('login')); - } - - /** - * Register the exception handling callbacks for the application. - */ - public function register(): void - { - $this->reportable(function (Throwable $e) { - if (isDev()) { - return; - } - if ($e instanceof RuntimeException) { - return; - } - $this->settings = instanceSettings(); - if ($this->settings->do_not_track) { - return; - } - app('sentry')->configureScope( - function (Scope $scope) { - $email = auth()?->user() ? auth()->user()->email : 'guest'; - $instanceAdmin = User::find(0)->email ?? 'admin@localhost'; - $scope->setUser( - [ - 'email' => $email, - 'instanceAdmin' => $instanceAdmin, - ] - ); - } - ); - if (str($e->getMessage())->contains('No space left on device')) { - return; - } - Integration::captureUnhandledException($e); - }); - } -} diff --git a/app/Exceptions/ProcessException.php b/app/Exceptions/ProcessException.php deleted file mode 100644 index 47eaa6fd81..0000000000 --- a/app/Exceptions/ProcessException.php +++ /dev/null @@ -1,7 +0,0 @@ -private_key_id); - $sshKeyLocation = $privateKey->getKeyLocation(); - $muxFilename = '/var/www/html/storage/app/ssh/mux/mux_'.$server->uuid; - - return [ - 'sshKeyLocation' => $sshKeyLocation, - 'muxFilename' => $muxFilename, - ]; - } - - public static function ensureMultiplexedConnection(Server $server): bool - { - if (! self::isMultiplexingEnabled()) { - return false; - } - - $sshConfig = self::serverSshConfiguration($server); - $muxSocket = $sshConfig['muxFilename']; - - $checkCommand = "ssh -O check -o ControlPath=$muxSocket "; - if (data_get($server, 'settings.is_cloudflare_tunnel')) { - $checkCommand .= '-o ProxyCommand="cloudflared access ssh --hostname %h" '; - } - $checkCommand .= "{$server->user}@{$server->ip}"; - $process = Process::run($checkCommand); - - if ($process->exitCode() !== 0) { - return self::establishNewMultiplexedConnection($server); - } - - return true; - } - - public static function establishNewMultiplexedConnection(Server $server): bool - { - $sshConfig = self::serverSshConfiguration($server); - $sshKeyLocation = $sshConfig['sshKeyLocation']; - $muxSocket = $sshConfig['muxFilename']; - $connectionTimeout = config('constants.ssh.connection_timeout'); - $serverInterval = config('constants.ssh.server_interval'); - $muxPersistTime = config('constants.ssh.mux_persist_time'); - - $establishCommand = "ssh -fNM -o ControlMaster=auto -o ControlPath=$muxSocket -o ControlPersist={$muxPersistTime} "; - - if (data_get($server, 'settings.is_cloudflare_tunnel')) { - $establishCommand .= ' -o ProxyCommand="cloudflared access ssh --hostname %h" '; - } - $establishCommand .= self::getCommonSshOptions($server, $sshKeyLocation, $connectionTimeout, $serverInterval); - $establishCommand .= "{$server->user}@{$server->ip}"; - $establishProcess = Process::run($establishCommand); - if ($establishProcess->exitCode() !== 0) { - return false; - } - - return true; - } - - public static function removeMuxFile(Server $server) - { - $sshConfig = self::serverSshConfiguration($server); - $muxSocket = $sshConfig['muxFilename']; - - $closeCommand = "ssh -O exit -o ControlPath=$muxSocket "; - if (data_get($server, 'settings.is_cloudflare_tunnel')) { - $closeCommand .= '-o ProxyCommand="cloudflared access ssh --hostname %h" '; - } - $closeCommand .= "{$server->user}@{$server->ip}"; - Process::run($closeCommand); - } - - public static function generateScpCommand(Server $server, string $source, string $dest) - { - $sshConfig = self::serverSshConfiguration($server); - $sshKeyLocation = $sshConfig['sshKeyLocation']; - $muxSocket = $sshConfig['muxFilename']; - - $timeout = config('constants.ssh.command_timeout'); - $muxPersistTime = config('constants.ssh.mux_persist_time'); - - $scp_command = "timeout $timeout scp "; - if ($server->isIpv6()) { - $scp_command .= '-6 '; - } - if (self::isMultiplexingEnabled() && self::ensureMultiplexedConnection($server)) { - $scp_command .= "-o ControlMaster=auto -o ControlPath=$muxSocket -o ControlPersist={$muxPersistTime} "; - } - - if (data_get($server, 'settings.is_cloudflare_tunnel')) { - $scp_command .= '-o ProxyCommand="cloudflared access ssh --hostname %h" '; - } - - $scp_command .= self::getCommonSshOptions($server, $sshKeyLocation, config('constants.ssh.connection_timeout'), config('constants.ssh.server_interval'), isScp: true); - $scp_command .= "{$source} {$server->user}@{$server->ip}:{$dest}"; - - return $scp_command; - } - - public static function generateSshCommand(Server $server, string $command) - { - if ($server->settings->force_disabled) { - throw new \RuntimeException('Server is disabled.'); - } - - $sshConfig = self::serverSshConfiguration($server); - $sshKeyLocation = $sshConfig['sshKeyLocation']; - - self::validateSshKey($server->privateKey); - - $muxSocket = $sshConfig['muxFilename']; - - $timeout = config('constants.ssh.command_timeout'); - $muxPersistTime = config('constants.ssh.mux_persist_time'); - - $ssh_command = "timeout $timeout ssh "; - - if (self::isMultiplexingEnabled() && self::ensureMultiplexedConnection($server)) { - $ssh_command .= "-o ControlMaster=auto -o ControlPath=$muxSocket -o ControlPersist={$muxPersistTime} "; - } - - if (data_get($server, 'settings.is_cloudflare_tunnel')) { - $ssh_command .= "-o ProxyCommand='cloudflared access ssh --hostname %h' "; - } - - $ssh_command .= self::getCommonSshOptions($server, $sshKeyLocation, config('constants.ssh.connection_timeout'), config('constants.ssh.server_interval')); - - $delimiter = Hash::make($command); - $delimiter = base64_encode($delimiter); - $command = str_replace($delimiter, '', $command); - - $ssh_command .= "{$server->user}@{$server->ip} 'bash -se' << \\$delimiter".PHP_EOL - .$command.PHP_EOL - .$delimiter; - - return $ssh_command; - } - - private static function isMultiplexingEnabled(): bool - { - return config('constants.ssh.mux_enabled') && ! config('constants.coolify.is_windows_docker_desktop'); - } - - private static function validateSshKey(PrivateKey $privateKey): void - { - $keyLocation = $privateKey->getKeyLocation(); - $checkKeyCommand = "ls $keyLocation 2>/dev/null"; - $keyCheckProcess = Process::run($checkKeyCommand); - - if ($keyCheckProcess->exitCode() !== 0) { - $privateKey->storeInFileSystem(); - } - } - - private static function getCommonSshOptions(Server $server, string $sshKeyLocation, int $connectionTimeout, int $serverInterval, bool $isScp = false): string - { - $options = "-i {$sshKeyLocation} " - .'-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ' - .'-o PasswordAuthentication=no ' - ."-o ConnectTimeout=$connectionTimeout " - ."-o ServerAliveInterval=$serverInterval " - .'-o RequestTTY=no ' - .'-o LogLevel=ERROR '; - - // Bruh - if ($isScp) { - $options .= "-P {$server->port} "; - } else { - $options .= "-p {$server->port} "; - } - - return $options; - } -} diff --git a/app/Http/Controllers/Api/ApplicationsController.php b/app/Http/Controllers/Api/ApplicationsController.php deleted file mode 100644 index aef19af23c..0000000000 --- a/app/Http/Controllers/Api/ApplicationsController.php +++ /dev/null @@ -1,3056 +0,0 @@ -makeHidden([ - 'id', - 'resourceable', - 'resourceable_id', - 'resourceable_type', - ]); - if (request()->attributes->get('can_read_sensitive', false) === false) { - $application->makeHidden([ - 'custom_labels', - 'dockerfile', - 'docker_compose', - 'docker_compose_raw', - 'manual_webhook_secret_bitbucket', - 'manual_webhook_secret_gitea', - 'manual_webhook_secret_github', - 'manual_webhook_secret_gitlab', - 'private_key_id', - 'value', - 'real_value', - ]); - } - - return serializeApiResponse($application); - } - - #[OA\Get( - summary: 'List', - description: 'List all applications.', - path: '/applications', - operationId: 'list-applications', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - responses: [ - new OA\Response( - response: 200, - description: 'Get all applications.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'array', - items: new OA\Items(ref: '#/components/schemas/Application') - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function applications(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $projects = Project::where('team_id', $teamId)->get(); - $applications = collect(); - $applications->push($projects->pluck('applications')->flatten()); - $applications = $applications->flatten(); - $applications = $applications->map(function ($application) { - return $this->removeSensitiveData($application); - }); - - return response()->json($applications); - } - - #[OA\Post( - summary: 'Create (Public)', - description: 'Create new application based on a public git repository.', - path: '/applications/public', - operationId: 'create-public-application', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - requestBody: new OA\RequestBody( - description: 'Application object that needs to be created.', - required: true, - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['project_uuid', 'server_uuid', 'environment_name', 'environment_uuid', 'git_repository', 'git_branch', 'build_pack', 'ports_exposes'], - properties: [ - 'project_uuid' => ['type' => 'string', 'description' => 'The project UUID.'], - 'server_uuid' => ['type' => 'string', 'description' => 'The server UUID.'], - 'environment_name' => ['type' => 'string', 'description' => 'The environment name. You need to provide at least one of environment_name or environment_uuid.'], - 'environment_uuid' => ['type' => 'string', 'description' => 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.'], - 'git_repository' => ['type' => 'string', 'description' => 'The git repository URL.'], - 'git_branch' => ['type' => 'string', 'description' => 'The git branch.'], - 'build_pack' => ['type' => 'string', 'enum' => ['nixpacks', 'static', 'dockerfile', 'dockercompose'], 'description' => 'The build pack type.'], - 'ports_exposes' => ['type' => 'string', 'description' => 'The ports to expose.'], - 'destination_uuid' => ['type' => 'string', 'description' => 'The destination UUID.'], - 'name' => ['type' => 'string', 'description' => 'The application name.'], - 'description' => ['type' => 'string', 'description' => 'The application description.'], - 'domains' => ['type' => 'string', 'description' => 'The application domains.'], - 'git_commit_sha' => ['type' => 'string', 'description' => 'The git commit SHA.'], - 'docker_registry_image_name' => ['type' => 'string', 'description' => 'The docker registry image name.'], - 'docker_registry_image_tag' => ['type' => 'string', 'description' => 'The docker registry image tag.'], - 'is_static' => ['type' => 'boolean', 'description' => 'The flag to indicate if the application is static.'], - 'static_image' => ['type' => 'string', 'enum' => ['nginx:alpine'], 'description' => 'The static image.'], - 'install_command' => ['type' => 'string', 'description' => 'The install command.'], - 'build_command' => ['type' => 'string', 'description' => 'The build command.'], - 'start_command' => ['type' => 'string', 'description' => 'The start command.'], - 'ports_mappings' => ['type' => 'string', 'description' => 'The ports mappings.'], - 'base_directory' => ['type' => 'string', 'description' => 'The base directory for all commands.'], - 'publish_directory' => ['type' => 'string', 'description' => 'The publish directory.'], - 'health_check_enabled' => ['type' => 'boolean', 'description' => 'Health check enabled.'], - 'health_check_path' => ['type' => 'string', 'description' => 'Health check path.'], - 'health_check_port' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check port.'], - 'health_check_host' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check host.'], - 'health_check_method' => ['type' => 'string', 'description' => 'Health check method.'], - 'health_check_return_code' => ['type' => 'integer', 'description' => 'Health check return code.'], - 'health_check_scheme' => ['type' => 'string', 'description' => 'Health check scheme.'], - 'health_check_response_text' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check response text.'], - 'health_check_interval' => ['type' => 'integer', 'description' => 'Health check interval in seconds.'], - 'health_check_timeout' => ['type' => 'integer', 'description' => 'Health check timeout in seconds.'], - 'health_check_retries' => ['type' => 'integer', 'description' => 'Health check retries count.'], - 'health_check_start_period' => ['type' => 'integer', 'description' => 'Health check start period in seconds.'], - 'limits_memory' => ['type' => 'string', 'description' => 'Memory limit.'], - 'limits_memory_swap' => ['type' => 'string', 'description' => 'Memory swap limit.'], - 'limits_memory_swappiness' => ['type' => 'integer', 'description' => 'Memory swappiness.'], - 'limits_memory_reservation' => ['type' => 'string', 'description' => 'Memory reservation.'], - 'limits_cpus' => ['type' => 'string', 'description' => 'CPU limit.'], - 'limits_cpuset' => ['type' => 'string', 'nullable' => true, 'description' => 'CPU set.'], - 'limits_cpu_shares' => ['type' => 'integer', 'description' => 'CPU shares.'], - 'custom_labels' => ['type' => 'string', 'description' => 'Custom labels.'], - 'custom_docker_run_options' => ['type' => 'string', 'description' => 'Custom docker run options.'], - 'post_deployment_command' => ['type' => 'string', 'description' => 'Post deployment command.'], - 'post_deployment_command_container' => ['type' => 'string', 'description' => 'Post deployment command container.'], - 'pre_deployment_command' => ['type' => 'string', 'description' => 'Pre deployment command.'], - 'pre_deployment_command_container' => ['type' => 'string', 'description' => 'Pre deployment command container.'], - 'manual_webhook_secret_github' => ['type' => 'string', 'description' => 'Manual webhook secret for Github.'], - 'manual_webhook_secret_gitlab' => ['type' => 'string', 'description' => 'Manual webhook secret for Gitlab.'], - 'manual_webhook_secret_bitbucket' => ['type' => 'string', 'description' => 'Manual webhook secret for Bitbucket.'], - 'manual_webhook_secret_gitea' => ['type' => 'string', 'description' => 'Manual webhook secret for Gitea.'], - 'redirect' => ['type' => 'string', 'nullable' => true, 'description' => 'How to set redirect with Traefik / Caddy. www<->non-www.', 'enum' => ['www', 'non-www', 'both']], - // 'github_app_uuid' => ['type' => 'string', 'description' => 'The Github App UUID.'], - 'instant_deploy' => ['type' => 'boolean', 'description' => 'The flag to indicate if the application should be deployed instantly.'], - 'dockerfile' => ['type' => 'string', 'description' => 'The Dockerfile content.'], - 'docker_compose_location' => ['type' => 'string', 'description' => 'The Docker Compose location.'], - 'docker_compose_raw' => ['type' => 'string', 'description' => 'The Docker Compose raw content.'], - 'docker_compose_custom_start_command' => ['type' => 'string', 'description' => 'The Docker Compose custom start command.'], - 'docker_compose_custom_build_command' => ['type' => 'string', 'description' => 'The Docker Compose custom build command.'], - 'docker_compose_domains' => ['type' => 'array', 'description' => 'The Docker Compose domains.'], - 'watch_paths' => ['type' => 'string', 'description' => 'The watch paths.'], - 'use_build_server' => ['type' => 'boolean', 'nullable' => true, 'description' => 'Use build server.'], - ], - ) - ), - ] - ), - responses: [ - new OA\Response( - response: 201, - description: 'Application created successfully.', - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'uuid' => ['type' => 'string'], - ] - ) - ) - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function create_public_application(Request $request) - { - return $this->create_application($request, 'public'); - } - - #[OA\Post( - summary: 'Create (Private - GH App)', - description: 'Create new application based on a private repository through a Github App.', - path: '/applications/private-github-app', - operationId: 'create-private-github-app-application', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - requestBody: new OA\RequestBody( - description: 'Application object that needs to be created.', - required: true, - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['project_uuid', 'server_uuid', 'environment_name', 'environment_uuid', 'github_app_uuid', 'git_repository', 'git_branch', 'build_pack', 'ports_exposes'], - properties: [ - 'project_uuid' => ['type' => 'string', 'description' => 'The project UUID.'], - 'server_uuid' => ['type' => 'string', 'description' => 'The server UUID.'], - 'environment_name' => ['type' => 'string', 'description' => 'The environment name. You need to provide at least one of environment_name or environment_uuid.'], - 'environment_uuid' => ['type' => 'string', 'description' => 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.'], - 'github_app_uuid' => ['type' => 'string', 'description' => 'The Github App UUID.'], - 'git_repository' => ['type' => 'string', 'description' => 'The git repository URL.'], - 'git_branch' => ['type' => 'string', 'description' => 'The git branch.'], - 'ports_exposes' => ['type' => 'string', 'description' => 'The ports to expose.'], - 'destination_uuid' => ['type' => 'string', 'description' => 'The destination UUID.'], - 'build_pack' => ['type' => 'string', 'enum' => ['nixpacks', 'static', 'dockerfile', 'dockercompose'], 'description' => 'The build pack type.'], - 'name' => ['type' => 'string', 'description' => 'The application name.'], - 'description' => ['type' => 'string', 'description' => 'The application description.'], - 'domains' => ['type' => 'string', 'description' => 'The application domains.'], - 'git_commit_sha' => ['type' => 'string', 'description' => 'The git commit SHA.'], - 'docker_registry_image_name' => ['type' => 'string', 'description' => 'The docker registry image name.'], - 'docker_registry_image_tag' => ['type' => 'string', 'description' => 'The docker registry image tag.'], - 'is_static' => ['type' => 'boolean', 'description' => 'The flag to indicate if the application is static.'], - 'static_image' => ['type' => 'string', 'enum' => ['nginx:alpine'], 'description' => 'The static image.'], - 'install_command' => ['type' => 'string', 'description' => 'The install command.'], - 'build_command' => ['type' => 'string', 'description' => 'The build command.'], - 'start_command' => ['type' => 'string', 'description' => 'The start command.'], - 'ports_mappings' => ['type' => 'string', 'description' => 'The ports mappings.'], - 'base_directory' => ['type' => 'string', 'description' => 'The base directory for all commands.'], - 'publish_directory' => ['type' => 'string', 'description' => 'The publish directory.'], - 'health_check_enabled' => ['type' => 'boolean', 'description' => 'Health check enabled.'], - 'health_check_path' => ['type' => 'string', 'description' => 'Health check path.'], - 'health_check_port' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check port.'], - 'health_check_host' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check host.'], - 'health_check_method' => ['type' => 'string', 'description' => 'Health check method.'], - 'health_check_return_code' => ['type' => 'integer', 'description' => 'Health check return code.'], - 'health_check_scheme' => ['type' => 'string', 'description' => 'Health check scheme.'], - 'health_check_response_text' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check response text.'], - 'health_check_interval' => ['type' => 'integer', 'description' => 'Health check interval in seconds.'], - 'health_check_timeout' => ['type' => 'integer', 'description' => 'Health check timeout in seconds.'], - 'health_check_retries' => ['type' => 'integer', 'description' => 'Health check retries count.'], - 'health_check_start_period' => ['type' => 'integer', 'description' => 'Health check start period in seconds.'], - 'limits_memory' => ['type' => 'string', 'description' => 'Memory limit.'], - 'limits_memory_swap' => ['type' => 'string', 'description' => 'Memory swap limit.'], - 'limits_memory_swappiness' => ['type' => 'integer', 'description' => 'Memory swappiness.'], - 'limits_memory_reservation' => ['type' => 'string', 'description' => 'Memory reservation.'], - 'limits_cpus' => ['type' => 'string', 'description' => 'CPU limit.'], - 'limits_cpuset' => ['type' => 'string', 'nullable' => true, 'description' => 'CPU set.'], - 'limits_cpu_shares' => ['type' => 'integer', 'description' => 'CPU shares.'], - 'custom_labels' => ['type' => 'string', 'description' => 'Custom labels.'], - 'custom_docker_run_options' => ['type' => 'string', 'description' => 'Custom docker run options.'], - 'post_deployment_command' => ['type' => 'string', 'description' => 'Post deployment command.'], - 'post_deployment_command_container' => ['type' => 'string', 'description' => 'Post deployment command container.'], - 'pre_deployment_command' => ['type' => 'string', 'description' => 'Pre deployment command.'], - 'pre_deployment_command_container' => ['type' => 'string', 'description' => 'Pre deployment command container.'], - 'manual_webhook_secret_github' => ['type' => 'string', 'description' => 'Manual webhook secret for Github.'], - 'manual_webhook_secret_gitlab' => ['type' => 'string', 'description' => 'Manual webhook secret for Gitlab.'], - 'manual_webhook_secret_bitbucket' => ['type' => 'string', 'description' => 'Manual webhook secret for Bitbucket.'], - 'manual_webhook_secret_gitea' => ['type' => 'string', 'description' => 'Manual webhook secret for Gitea.'], - 'redirect' => ['type' => 'string', 'nullable' => true, 'description' => 'How to set redirect with Traefik / Caddy. www<->non-www.', 'enum' => ['www', 'non-www', 'both']], - 'instant_deploy' => ['type' => 'boolean', 'description' => 'The flag to indicate if the application should be deployed instantly.'], - 'dockerfile' => ['type' => 'string', 'description' => 'The Dockerfile content.'], - 'docker_compose_location' => ['type' => 'string', 'description' => 'The Docker Compose location.'], - 'docker_compose_raw' => ['type' => 'string', 'description' => 'The Docker Compose raw content.'], - 'docker_compose_custom_start_command' => ['type' => 'string', 'description' => 'The Docker Compose custom start command.'], - 'docker_compose_custom_build_command' => ['type' => 'string', 'description' => 'The Docker Compose custom build command.'], - 'docker_compose_domains' => ['type' => 'array', 'description' => 'The Docker Compose domains.'], - 'watch_paths' => ['type' => 'string', 'description' => 'The watch paths.'], - 'use_build_server' => ['type' => 'boolean', 'nullable' => true, 'description' => 'Use build server.'], - ], - ) - ), - ] - ), - responses: [ - new OA\Response( - response: 201, - description: 'Application created successfully.', - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'uuid' => ['type' => 'string'], - ] - ) - ) - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function create_private_gh_app_application(Request $request) - { - return $this->create_application($request, 'private-gh-app'); - } - - #[OA\Post( - summary: 'Create (Private - Deploy Key)', - description: 'Create new application based on a private repository through a Deploy Key.', - path: '/applications/private-deploy-key', - operationId: 'create-private-deploy-key-application', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - requestBody: new OA\RequestBody( - description: 'Application object that needs to be created.', - required: true, - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['project_uuid', 'server_uuid', 'environment_name', 'environment_uuid', 'private_key_uuid', 'git_repository', 'git_branch', 'build_pack', 'ports_exposes'], - properties: [ - 'project_uuid' => ['type' => 'string', 'description' => 'The project UUID.'], - 'server_uuid' => ['type' => 'string', 'description' => 'The server UUID.'], - 'environment_name' => ['type' => 'string', 'description' => 'The environment name. You need to provide at least one of environment_name or environment_uuid.'], - 'environment_uuid' => ['type' => 'string', 'description' => 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.'], - 'private_key_uuid' => ['type' => 'string', 'description' => 'The private key UUID.'], - 'git_repository' => ['type' => 'string', 'description' => 'The git repository URL.'], - 'git_branch' => ['type' => 'string', 'description' => 'The git branch.'], - 'ports_exposes' => ['type' => 'string', 'description' => 'The ports to expose.'], - 'destination_uuid' => ['type' => 'string', 'description' => 'The destination UUID.'], - 'build_pack' => ['type' => 'string', 'enum' => ['nixpacks', 'static', 'dockerfile', 'dockercompose'], 'description' => 'The build pack type.'], - 'name' => ['type' => 'string', 'description' => 'The application name.'], - 'description' => ['type' => 'string', 'description' => 'The application description.'], - 'domains' => ['type' => 'string', 'description' => 'The application domains.'], - 'git_commit_sha' => ['type' => 'string', 'description' => 'The git commit SHA.'], - 'docker_registry_image_name' => ['type' => 'string', 'description' => 'The docker registry image name.'], - 'docker_registry_image_tag' => ['type' => 'string', 'description' => 'The docker registry image tag.'], - 'is_static' => ['type' => 'boolean', 'description' => 'The flag to indicate if the application is static.'], - 'static_image' => ['type' => 'string', 'enum' => ['nginx:alpine'], 'description' => 'The static image.'], - 'install_command' => ['type' => 'string', 'description' => 'The install command.'], - 'build_command' => ['type' => 'string', 'description' => 'The build command.'], - 'start_command' => ['type' => 'string', 'description' => 'The start command.'], - 'ports_mappings' => ['type' => 'string', 'description' => 'The ports mappings.'], - 'base_directory' => ['type' => 'string', 'description' => 'The base directory for all commands.'], - 'publish_directory' => ['type' => 'string', 'description' => 'The publish directory.'], - 'health_check_enabled' => ['type' => 'boolean', 'description' => 'Health check enabled.'], - 'health_check_path' => ['type' => 'string', 'description' => 'Health check path.'], - 'health_check_port' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check port.'], - 'health_check_host' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check host.'], - 'health_check_method' => ['type' => 'string', 'description' => 'Health check method.'], - 'health_check_return_code' => ['type' => 'integer', 'description' => 'Health check return code.'], - 'health_check_scheme' => ['type' => 'string', 'description' => 'Health check scheme.'], - 'health_check_response_text' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check response text.'], - 'health_check_interval' => ['type' => 'integer', 'description' => 'Health check interval in seconds.'], - 'health_check_timeout' => ['type' => 'integer', 'description' => 'Health check timeout in seconds.'], - 'health_check_retries' => ['type' => 'integer', 'description' => 'Health check retries count.'], - 'health_check_start_period' => ['type' => 'integer', 'description' => 'Health check start period in seconds.'], - 'limits_memory' => ['type' => 'string', 'description' => 'Memory limit.'], - 'limits_memory_swap' => ['type' => 'string', 'description' => 'Memory swap limit.'], - 'limits_memory_swappiness' => ['type' => 'integer', 'description' => 'Memory swappiness.'], - 'limits_memory_reservation' => ['type' => 'string', 'description' => 'Memory reservation.'], - 'limits_cpus' => ['type' => 'string', 'description' => 'CPU limit.'], - 'limits_cpuset' => ['type' => 'string', 'nullable' => true, 'description' => 'CPU set.'], - 'limits_cpu_shares' => ['type' => 'integer', 'description' => 'CPU shares.'], - 'custom_labels' => ['type' => 'string', 'description' => 'Custom labels.'], - 'custom_docker_run_options' => ['type' => 'string', 'description' => 'Custom docker run options.'], - 'post_deployment_command' => ['type' => 'string', 'description' => 'Post deployment command.'], - 'post_deployment_command_container' => ['type' => 'string', 'description' => 'Post deployment command container.'], - 'pre_deployment_command' => ['type' => 'string', 'description' => 'Pre deployment command.'], - 'pre_deployment_command_container' => ['type' => 'string', 'description' => 'Pre deployment command container.'], - 'manual_webhook_secret_github' => ['type' => 'string', 'description' => 'Manual webhook secret for Github.'], - 'manual_webhook_secret_gitlab' => ['type' => 'string', 'description' => 'Manual webhook secret for Gitlab.'], - 'manual_webhook_secret_bitbucket' => ['type' => 'string', 'description' => 'Manual webhook secret for Bitbucket.'], - 'manual_webhook_secret_gitea' => ['type' => 'string', 'description' => 'Manual webhook secret for Gitea.'], - 'redirect' => ['type' => 'string', 'nullable' => true, 'description' => 'How to set redirect with Traefik / Caddy. www<->non-www.', 'enum' => ['www', 'non-www', 'both']], - 'instant_deploy' => ['type' => 'boolean', 'description' => 'The flag to indicate if the application should be deployed instantly.'], - 'dockerfile' => ['type' => 'string', 'description' => 'The Dockerfile content.'], - 'docker_compose_location' => ['type' => 'string', 'description' => 'The Docker Compose location.'], - 'docker_compose_raw' => ['type' => 'string', 'description' => 'The Docker Compose raw content.'], - 'docker_compose_custom_start_command' => ['type' => 'string', 'description' => 'The Docker Compose custom start command.'], - 'docker_compose_custom_build_command' => ['type' => 'string', 'description' => 'The Docker Compose custom build command.'], - 'docker_compose_domains' => ['type' => 'array', 'description' => 'The Docker Compose domains.'], - 'watch_paths' => ['type' => 'string', 'description' => 'The watch paths.'], - 'use_build_server' => ['type' => 'boolean', 'nullable' => true, 'description' => 'Use build server.'], - ], - ) - ), - ] - ), - responses: [ - new OA\Response( - response: 201, - description: 'Application created successfully.', - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'uuid' => ['type' => 'string'], - ] - ) - ) - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function create_private_deploy_key_application(Request $request) - { - return $this->create_application($request, 'private-deploy-key'); - } - - #[OA\Post( - summary: 'Create (Dockerfile)', - description: 'Create new application based on a simple Dockerfile.', - path: '/applications/dockerfile', - operationId: 'create-dockerfile-application', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - requestBody: new OA\RequestBody( - description: 'Application object that needs to be created.', - required: true, - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['project_uuid', 'server_uuid', 'environment_name', 'environment_uuid', 'dockerfile'], - properties: [ - 'project_uuid' => ['type' => 'string', 'description' => 'The project UUID.'], - 'server_uuid' => ['type' => 'string', 'description' => 'The server UUID.'], - 'environment_name' => ['type' => 'string', 'description' => 'The environment name. You need to provide at least one of environment_name or environment_uuid.'], - 'environment_uuid' => ['type' => 'string', 'description' => 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.'], - 'dockerfile' => ['type' => 'string', 'description' => 'The Dockerfile content.'], - 'build_pack' => ['type' => 'string', 'enum' => ['nixpacks', 'static', 'dockerfile', 'dockercompose'], 'description' => 'The build pack type.'], - 'ports_exposes' => ['type' => 'string', 'description' => 'The ports to expose.'], - 'destination_uuid' => ['type' => 'string', 'description' => 'The destination UUID.'], - 'name' => ['type' => 'string', 'description' => 'The application name.'], - 'description' => ['type' => 'string', 'description' => 'The application description.'], - 'domains' => ['type' => 'string', 'description' => 'The application domains.'], - 'docker_registry_image_name' => ['type' => 'string', 'description' => 'The docker registry image name.'], - 'docker_registry_image_tag' => ['type' => 'string', 'description' => 'The docker registry image tag.'], - 'ports_mappings' => ['type' => 'string', 'description' => 'The ports mappings.'], - 'base_directory' => ['type' => 'string', 'description' => 'The base directory for all commands.'], - 'health_check_enabled' => ['type' => 'boolean', 'description' => 'Health check enabled.'], - 'health_check_path' => ['type' => 'string', 'description' => 'Health check path.'], - 'health_check_port' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check port.'], - 'health_check_host' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check host.'], - 'health_check_method' => ['type' => 'string', 'description' => 'Health check method.'], - 'health_check_return_code' => ['type' => 'integer', 'description' => 'Health check return code.'], - 'health_check_scheme' => ['type' => 'string', 'description' => 'Health check scheme.'], - 'health_check_response_text' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check response text.'], - 'health_check_interval' => ['type' => 'integer', 'description' => 'Health check interval in seconds.'], - 'health_check_timeout' => ['type' => 'integer', 'description' => 'Health check timeout in seconds.'], - 'health_check_retries' => ['type' => 'integer', 'description' => 'Health check retries count.'], - 'health_check_start_period' => ['type' => 'integer', 'description' => 'Health check start period in seconds.'], - 'limits_memory' => ['type' => 'string', 'description' => 'Memory limit.'], - 'limits_memory_swap' => ['type' => 'string', 'description' => 'Memory swap limit.'], - 'limits_memory_swappiness' => ['type' => 'integer', 'description' => 'Memory swappiness.'], - 'limits_memory_reservation' => ['type' => 'string', 'description' => 'Memory reservation.'], - 'limits_cpus' => ['type' => 'string', 'description' => 'CPU limit.'], - 'limits_cpuset' => ['type' => 'string', 'nullable' => true, 'description' => 'CPU set.'], - 'limits_cpu_shares' => ['type' => 'integer', 'description' => 'CPU shares.'], - 'custom_labels' => ['type' => 'string', 'description' => 'Custom labels.'], - 'custom_docker_run_options' => ['type' => 'string', 'description' => 'Custom docker run options.'], - 'post_deployment_command' => ['type' => 'string', 'description' => 'Post deployment command.'], - 'post_deployment_command_container' => ['type' => 'string', 'description' => 'Post deployment command container.'], - 'pre_deployment_command' => ['type' => 'string', 'description' => 'Pre deployment command.'], - 'pre_deployment_command_container' => ['type' => 'string', 'description' => 'Pre deployment command container.'], - 'manual_webhook_secret_github' => ['type' => 'string', 'description' => 'Manual webhook secret for Github.'], - 'manual_webhook_secret_gitlab' => ['type' => 'string', 'description' => 'Manual webhook secret for Gitlab.'], - 'manual_webhook_secret_bitbucket' => ['type' => 'string', 'description' => 'Manual webhook secret for Bitbucket.'], - 'manual_webhook_secret_gitea' => ['type' => 'string', 'description' => 'Manual webhook secret for Gitea.'], - 'redirect' => ['type' => 'string', 'nullable' => true, 'description' => 'How to set redirect with Traefik / Caddy. www<->non-www.', 'enum' => ['www', 'non-www', 'both']], - 'instant_deploy' => ['type' => 'boolean', 'description' => 'The flag to indicate if the application should be deployed instantly.'], - 'use_build_server' => ['type' => 'boolean', 'nullable' => true, 'description' => 'Use build server.'], - ], - ) - ), - ] - ), - responses: [ - new OA\Response( - response: 201, - description: 'Application created successfully.', - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'uuid' => ['type' => 'string'], - ] - ) - ) - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function create_dockerfile_application(Request $request) - { - return $this->create_application($request, 'dockerfile'); - } - - #[OA\Post( - summary: 'Create (Docker Image)', - description: 'Create new application based on a prebuilt docker image', - path: '/applications/dockerimage', - operationId: 'create-dockerimage-application', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - requestBody: new OA\RequestBody( - description: 'Application object that needs to be created.', - required: true, - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['project_uuid', 'server_uuid', 'environment_name', 'environment_uuid', 'docker_registry_image_name', 'ports_exposes'], - properties: [ - 'project_uuid' => ['type' => 'string', 'description' => 'The project UUID.'], - 'server_uuid' => ['type' => 'string', 'description' => 'The server UUID.'], - 'environment_name' => ['type' => 'string', 'description' => 'The environment name. You need to provide at least one of environment_name or environment_uuid.'], - 'environment_uuid' => ['type' => 'string', 'description' => 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.'], - 'docker_registry_image_name' => ['type' => 'string', 'description' => 'The docker registry image name.'], - 'docker_registry_image_tag' => ['type' => 'string', 'description' => 'The docker registry image tag.'], - 'ports_exposes' => ['type' => 'string', 'description' => 'The ports to expose.'], - 'destination_uuid' => ['type' => 'string', 'description' => 'The destination UUID.'], - 'name' => ['type' => 'string', 'description' => 'The application name.'], - 'description' => ['type' => 'string', 'description' => 'The application description.'], - 'domains' => ['type' => 'string', 'description' => 'The application domains.'], - 'ports_mappings' => ['type' => 'string', 'description' => 'The ports mappings.'], - 'health_check_enabled' => ['type' => 'boolean', 'description' => 'Health check enabled.'], - 'health_check_path' => ['type' => 'string', 'description' => 'Health check path.'], - 'health_check_port' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check port.'], - 'health_check_host' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check host.'], - 'health_check_method' => ['type' => 'string', 'description' => 'Health check method.'], - 'health_check_return_code' => ['type' => 'integer', 'description' => 'Health check return code.'], - 'health_check_scheme' => ['type' => 'string', 'description' => 'Health check scheme.'], - 'health_check_response_text' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check response text.'], - 'health_check_interval' => ['type' => 'integer', 'description' => 'Health check interval in seconds.'], - 'health_check_timeout' => ['type' => 'integer', 'description' => 'Health check timeout in seconds.'], - 'health_check_retries' => ['type' => 'integer', 'description' => 'Health check retries count.'], - 'health_check_start_period' => ['type' => 'integer', 'description' => 'Health check start period in seconds.'], - 'limits_memory' => ['type' => 'string', 'description' => 'Memory limit.'], - 'limits_memory_swap' => ['type' => 'string', 'description' => 'Memory swap limit.'], - 'limits_memory_swappiness' => ['type' => 'integer', 'description' => 'Memory swappiness.'], - 'limits_memory_reservation' => ['type' => 'string', 'description' => 'Memory reservation.'], - 'limits_cpus' => ['type' => 'string', 'description' => 'CPU limit.'], - 'limits_cpuset' => ['type' => 'string', 'nullable' => true, 'description' => 'CPU set.'], - 'limits_cpu_shares' => ['type' => 'integer', 'description' => 'CPU shares.'], - 'custom_labels' => ['type' => 'string', 'description' => 'Custom labels.'], - 'custom_docker_run_options' => ['type' => 'string', 'description' => 'Custom docker run options.'], - 'post_deployment_command' => ['type' => 'string', 'description' => 'Post deployment command.'], - 'post_deployment_command_container' => ['type' => 'string', 'description' => 'Post deployment command container.'], - 'pre_deployment_command' => ['type' => 'string', 'description' => 'Pre deployment command.'], - 'pre_deployment_command_container' => ['type' => 'string', 'description' => 'Pre deployment command container.'], - 'manual_webhook_secret_github' => ['type' => 'string', 'description' => 'Manual webhook secret for Github.'], - 'manual_webhook_secret_gitlab' => ['type' => 'string', 'description' => 'Manual webhook secret for Gitlab.'], - 'manual_webhook_secret_bitbucket' => ['type' => 'string', 'description' => 'Manual webhook secret for Bitbucket.'], - 'manual_webhook_secret_gitea' => ['type' => 'string', 'description' => 'Manual webhook secret for Gitea.'], - 'redirect' => ['type' => 'string', 'nullable' => true, 'description' => 'How to set redirect with Traefik / Caddy. www<->non-www.', 'enum' => ['www', 'non-www', 'both']], - 'instant_deploy' => ['type' => 'boolean', 'description' => 'The flag to indicate if the application should be deployed instantly.'], - 'use_build_server' => ['type' => 'boolean', 'nullable' => true, 'description' => 'Use build server.'], - ], - ) - ), - ] - ), - responses: [ - new OA\Response( - response: 201, - description: 'Application created successfully.', - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'uuid' => ['type' => 'string'], - ] - ) - ) - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function create_dockerimage_application(Request $request) - { - return $this->create_application($request, 'dockerimage'); - } - - #[OA\Post( - summary: 'Create (Docker Compose)', - description: 'Create new application based on a docker-compose file.', - path: '/applications/dockercompose', - operationId: 'create-dockercompose-application', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - requestBody: new OA\RequestBody( - description: 'Application object that needs to be created.', - required: true, - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['project_uuid', 'server_uuid', 'environment_name', 'environment_uuid', 'docker_compose_raw'], - properties: [ - 'project_uuid' => ['type' => 'string', 'description' => 'The project UUID.'], - 'server_uuid' => ['type' => 'string', 'description' => 'The server UUID.'], - 'environment_name' => ['type' => 'string', 'description' => 'The environment name. You need to provide at least one of environment_name or environment_uuid.'], - 'environment_uuid' => ['type' => 'string', 'description' => 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.'], - 'docker_compose_raw' => ['type' => 'string', 'description' => 'The Docker Compose raw content.'], - 'destination_uuid' => ['type' => 'string', 'description' => 'The destination UUID if the server has more than one destinations.'], - 'name' => ['type' => 'string', 'description' => 'The application name.'], - 'description' => ['type' => 'string', 'description' => 'The application description.'], - 'instant_deploy' => ['type' => 'boolean', 'description' => 'The flag to indicate if the application should be deployed instantly.'], - 'use_build_server' => ['type' => 'boolean', 'nullable' => true, 'description' => 'Use build server.'], - ], - ) - ), - ] - ), - responses: [ - new OA\Response( - response: 201, - description: 'Application created successfully.', - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'uuid' => ['type' => 'string'], - ] - ) - ) - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function create_dockercompose_application(Request $request) - { - return $this->create_application($request, 'dockercompose'); - } - - private function create_application(Request $request, $type) - { - $allowedFields = ['project_uuid', 'environment_name', 'environment_uuid', 'server_uuid', 'destination_uuid', 'type', 'name', 'description', 'is_static', 'domains', 'git_repository', 'git_branch', 'git_commit_sha', 'private_key_uuid', 'docker_registry_image_name', 'docker_registry_image_tag', 'build_pack', 'install_command', 'build_command', 'start_command', 'ports_exposes', 'ports_mappings', 'base_directory', 'publish_directory', 'health_check_enabled', 'health_check_path', 'health_check_port', 'health_check_host', 'health_check_method', 'health_check_return_code', 'health_check_scheme', 'health_check_response_text', 'health_check_interval', 'health_check_timeout', 'health_check_retries', 'health_check_start_period', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'custom_labels', 'custom_docker_run_options', 'post_deployment_command', 'post_deployment_command_container', 'pre_deployment_command', 'pre_deployment_command_container', 'manual_webhook_secret_github', 'manual_webhook_secret_gitlab', 'manual_webhook_secret_bitbucket', 'manual_webhook_secret_gitea', 'redirect', 'github_app_uuid', 'instant_deploy', 'dockerfile', 'docker_compose_location', 'docker_compose_raw', 'docker_compose_custom_start_command', 'docker_compose_custom_build_command', 'docker_compose_domains', 'watch_paths', 'use_build_server', 'static_image', 'custom_nginx_configuration']; - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - $return = validateIncomingRequest($request); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - $validator = customApiValidator($request->all(), [ - 'name' => 'string|max:255', - 'description' => 'string|nullable', - 'project_uuid' => 'string|required', - 'environment_name' => 'string|nullable', - 'environment_uuid' => 'string|nullable', - 'server_uuid' => 'string|required', - 'destination_uuid' => 'string', - ]); - - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - - $environmentUuid = $request->environment_uuid; - $environmentName = $request->environment_name; - if (blank($environmentUuid) && blank($environmentName)) { - return response()->json(['message' => 'You need to provide at least one of environment_name or environment_uuid.'], 422); - } - $serverUuid = $request->server_uuid; - $fqdn = $request->domains; - $instantDeploy = $request->instant_deploy; - $githubAppUuid = $request->github_app_uuid; - $useBuildServer = $request->use_build_server; - $isStatic = $request->is_static; - $customNginxConfiguration = $request->custom_nginx_configuration; - - if (! is_null($customNginxConfiguration)) { - if (! isBase64Encoded($customNginxConfiguration)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'custom_nginx_configuration' => 'The custom_nginx_configuration should be base64 encoded.', - ], - ], 422); - } - $customNginxConfiguration = base64_decode($customNginxConfiguration); - if (mb_detect_encoding($customNginxConfiguration, 'ASCII', true) === false) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'custom_nginx_configuration' => 'The custom_nginx_configuration should be base64 encoded.', - ], - ], 422); - } - } - - $project = Project::whereTeamId($teamId)->whereUuid($request->project_uuid)->first(); - if (! $project) { - return response()->json(['message' => 'Project not found.'], 404); - } - $environment = $project->environments()->where('name', $environmentName)->first(); - if (! $environment) { - $environment = $project->environments()->where('uuid', $environmentUuid)->first(); - } - if (! $environment) { - return response()->json(['message' => 'Environment not found.'], 404); - } - $server = Server::whereTeamId($teamId)->whereUuid($serverUuid)->first(); - if (! $server) { - return response()->json(['message' => 'Server not found.'], 404); - } - $destinations = $server->destinations(); - if ($destinations->count() == 0) { - return response()->json(['message' => 'Server has no destinations.'], 400); - } - if ($destinations->count() > 1 && ! $request->has('destination_uuid')) { - return response()->json(['message' => 'Server has multiple destinations and you do not set destination_uuid.'], 400); - } - $destination = $destinations->first(); - if ($type === 'public') { - $validationRules = [ - 'git_repository' => 'string|required', - 'git_branch' => 'string|required', - 'build_pack' => ['required', Rule::enum(BuildPackTypes::class)], - 'ports_exposes' => 'string|regex:/^(\d+)(,\d+)*$/|required', - 'docker_compose_location' => 'string', - 'docker_compose_raw' => 'string|nullable', - 'docker_compose_domains' => 'array|nullable', - ]; - // ports_exposes is not required for dockercompose - if ($request->build_pack === 'dockercompose') { - $validationRules['ports_exposes'] = 'string'; - $request->offsetSet('ports_exposes', '80'); - } - $validationRules = array_merge(sharedDataApplications(), $validationRules); - $validator = customApiValidator($request->all(), $validationRules); - if ($validator->fails()) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $validator->errors(), - ], 422); - } - if (! $request->has('name')) { - $request->offsetSet('name', generate_application_name($request->git_repository, $request->git_branch)); - } - $return = $this->validateDataApplications($request, $server); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - - $application = new Application; - removeUnnecessaryFieldsFromRequest($request); - - $application->fill($request->all()); - $dockerComposeDomainsJson = collect(); - if ($request->has('docker_compose_domains')) { - $dockerComposeDomains = collect($request->docker_compose_domains); - if ($dockerComposeDomains->count() > 0) { - $dockerComposeDomains->each(function ($domain, $key) use ($dockerComposeDomainsJson) { - $dockerComposeDomainsJson->put(data_get($domain, 'name'), ['domain' => data_get($domain, 'domain')]); - }); - } - $request->offsetUnset('docker_compose_domains'); - } - if ($dockerComposeDomainsJson->count() > 0) { - $application->docker_compose_domains = $dockerComposeDomainsJson; - } - $repository_url_parsed = Url::fromString($request->git_repository); - $git_host = $repository_url_parsed->getHost(); - if ($git_host === 'github.com') { - $application->source_type = GithubApp::class; - $application->source_id = GithubApp::find(0)->id; - } - $application->git_repository = $repository_url_parsed->getSegment(1).'/'.$repository_url_parsed->getSegment(2); - $application->fqdn = $fqdn; - $application->destination_id = $destination->id; - $application->destination_type = $destination->getMorphClass(); - $application->environment_id = $environment->id; - $application->save(); - if (isset($isStatic)) { - $application->settings->is_static = $isStatic; - $application->settings->save(); - } - if (isset($useBuildServer)) { - $application->settings->is_build_server_enabled = $useBuildServer; - $application->settings->save(); - } - $application->refresh(); - if ($application->settings->is_container_label_readonly_enabled) { - $application->custom_labels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n"); - $application->save(); - } - $application->isConfigurationChanged(true); - - if ($instantDeploy) { - $deployment_uuid = new Cuid2; - - queue_application_deployment( - application: $application, - deployment_uuid: $deployment_uuid, - no_questions_asked: true, - is_api: true, - ); - } else { - if ($application->build_pack === 'dockercompose') { - LoadComposeFile::dispatch($application); - } - } - - return response()->json(serializeApiResponse([ - 'uuid' => data_get($application, 'uuid'), - 'domains' => data_get($application, 'domains'), - ]))->setStatusCode(201); - } elseif ($type === 'private-gh-app') { - $validationRules = [ - 'git_repository' => 'string|required', - 'git_branch' => 'string|required', - 'build_pack' => ['required', Rule::enum(BuildPackTypes::class)], - 'ports_exposes' => 'string|regex:/^(\d+)(,\d+)*$/|required', - 'github_app_uuid' => 'string|required', - 'watch_paths' => 'string|nullable', - 'docker_compose_location' => 'string', - 'docker_compose_raw' => 'string|nullable', - ]; - $validationRules = array_merge(sharedDataApplications(), $validationRules); - - $validator = customApiValidator($request->all(), $validationRules); - if ($validator->fails()) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $validator->errors(), - ], 422); - } - - if (! $request->has('name')) { - $request->offsetSet('name', generate_application_name($request->git_repository, $request->git_branch)); - } - if ($request->build_pack === 'dockercompose') { - $request->offsetSet('ports_exposes', '80'); - } - - $return = $this->validateDataApplications($request, $server); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - $githubApp = GithubApp::whereTeamId($teamId)->where('uuid', $githubAppUuid)->first(); - if (! $githubApp) { - return response()->json(['message' => 'Github App not found.'], 404); - } - $gitRepository = $request->git_repository; - if (str($gitRepository)->startsWith('http') || str($gitRepository)->contains('github.com')) { - $gitRepository = str($gitRepository)->replace('https://', '')->replace('http://', '')->replace('github.com/', ''); - } - $application = new Application; - removeUnnecessaryFieldsFromRequest($request); - - $application->fill($request->all()); - - $dockerComposeDomainsJson = collect(); - if ($request->has('docker_compose_domains')) { - $yaml = Yaml::parse($application->docker_compose_raw); - $services = data_get($yaml, 'services'); - $dockerComposeDomains = collect($request->docker_compose_domains); - if ($dockerComposeDomains->count() > 0) { - $dockerComposeDomains->each(function ($domain, $key) use ($services, $dockerComposeDomainsJson) { - $name = data_get($domain, 'name'); - if (data_get($services, $name)) { - $dockerComposeDomainsJson->put($name, ['domain' => data_get($domain, 'domain')]); - } - }); - } - $request->offsetUnset('docker_compose_domains'); - } - if ($dockerComposeDomainsJson->count() > 0) { - $application->docker_compose_domains = $dockerComposeDomainsJson; - } - $application->fqdn = $fqdn; - $application->git_repository = $gitRepository; - $application->destination_id = $destination->id; - $application->destination_type = $destination->getMorphClass(); - $application->environment_id = $environment->id; - $application->source_type = $githubApp->getMorphClass(); - $application->source_id = $githubApp->id; - $application->save(); - $application->refresh(); - if (isset($useBuildServer)) { - $application->settings->is_build_server_enabled = $useBuildServer; - $application->settings->save(); - } - if ($application->settings->is_container_label_readonly_enabled) { - $application->custom_labels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n"); - $application->save(); - } - $application->isConfigurationChanged(true); - - if ($instantDeploy) { - $deployment_uuid = new Cuid2; - - queue_application_deployment( - application: $application, - deployment_uuid: $deployment_uuid, - no_questions_asked: true, - is_api: true, - ); - } else { - if ($application->build_pack === 'dockercompose') { - LoadComposeFile::dispatch($application); - } - } - - return response()->json(serializeApiResponse([ - 'uuid' => data_get($application, 'uuid'), - 'domains' => data_get($application, 'domains'), - ]))->setStatusCode(201); - } elseif ($type === 'private-deploy-key') { - - $validationRules = [ - 'git_repository' => 'string|required', - 'git_branch' => 'string|required', - 'build_pack' => ['required', Rule::enum(BuildPackTypes::class)], - 'ports_exposes' => 'string|regex:/^(\d+)(,\d+)*$/|required', - 'private_key_uuid' => 'string|required', - 'watch_paths' => 'string|nullable', - 'docker_compose_location' => 'string', - 'docker_compose_raw' => 'string|nullable', - ]; - - $validationRules = array_merge(sharedDataApplications(), $validationRules); - $validator = customApiValidator($request->all(), $validationRules); - - if ($validator->fails()) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $validator->errors(), - ], 422); - } - if (! $request->has('name')) { - $request->offsetSet('name', generate_application_name($request->git_repository, $request->git_branch)); - } - if ($request->build_pack === 'dockercompose') { - $request->offsetSet('ports_exposes', '80'); - } - - $return = $this->validateDataApplications($request, $server); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - $privateKey = PrivateKey::whereTeamId($teamId)->where('uuid', $request->private_key_uuid)->first(); - if (! $privateKey) { - return response()->json(['message' => 'Private Key not found.'], 404); - } - - $application = new Application; - removeUnnecessaryFieldsFromRequest($request); - - $application->fill($request->all()); - - $dockerComposeDomainsJson = collect(); - if ($request->has('docker_compose_domains')) { - $yaml = Yaml::parse($application->docker_compose_raw); - $services = data_get($yaml, 'services'); - $dockerComposeDomains = collect($request->docker_compose_domains); - if ($dockerComposeDomains->count() > 0) { - $dockerComposeDomains->each(function ($domain, $key) use ($services, $dockerComposeDomainsJson) { - $name = data_get($domain, 'name'); - if (data_get($services, $name)) { - $dockerComposeDomainsJson->put($name, ['domain' => data_get($domain, 'domain')]); - } - }); - } - $request->offsetUnset('docker_compose_domains'); - } - if ($dockerComposeDomainsJson->count() > 0) { - $application->docker_compose_domains = $dockerComposeDomainsJson; - } - $application->fqdn = $fqdn; - $application->private_key_id = $privateKey->id; - $application->destination_id = $destination->id; - $application->destination_type = $destination->getMorphClass(); - $application->environment_id = $environment->id; - $application->save(); - $application->refresh(); - if (isset($useBuildServer)) { - $application->settings->is_build_server_enabled = $useBuildServer; - $application->settings->save(); - } - if ($application->settings->is_container_label_readonly_enabled) { - $application->custom_labels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n"); - $application->save(); - } - $application->isConfigurationChanged(true); - - if ($instantDeploy) { - $deployment_uuid = new Cuid2; - - queue_application_deployment( - application: $application, - deployment_uuid: $deployment_uuid, - no_questions_asked: true, - is_api: true, - ); - } else { - if ($application->build_pack === 'dockercompose') { - LoadComposeFile::dispatch($application); - } - } - - return response()->json(serializeApiResponse([ - 'uuid' => data_get($application, 'uuid'), - 'domains' => data_get($application, 'domains'), - ]))->setStatusCode(201); - } elseif ($type === 'dockerfile') { - $validationRules = [ - 'dockerfile' => 'string|required', - ]; - $validationRules = array_merge(sharedDataApplications(), $validationRules); - $validator = customApiValidator($request->all(), $validationRules); - - if ($validator->fails()) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $validator->errors(), - ], 422); - } - if (! $request->has('name')) { - $request->offsetSet('name', 'dockerfile-'.new Cuid2); - } - - $return = $this->validateDataApplications($request, $server); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - if (! isBase64Encoded($request->dockerfile)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'dockerfile' => 'The dockerfile should be base64 encoded.', - ], - ], 422); - } - $dockerFile = base64_decode($request->dockerfile); - if (mb_detect_encoding($dockerFile, 'ASCII', true) === false) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'dockerfile' => 'The dockerfile should be base64 encoded.', - ], - ], 422); - } - $dockerFile = base64_decode($request->dockerfile); - removeUnnecessaryFieldsFromRequest($request); - - $port = get_port_from_dockerfile($request->dockerfile); - if (! $port) { - $port = 80; - } - - $application = new Application; - $application->fill($request->all()); - $application->fqdn = $fqdn; - $application->ports_exposes = $port; - $application->build_pack = 'dockerfile'; - $application->dockerfile = $dockerFile; - $application->destination_id = $destination->id; - $application->destination_type = $destination->getMorphClass(); - $application->environment_id = $environment->id; - - $application->git_repository = 'coollabsio/coolify'; - $application->git_branch = 'main'; - $application->save(); - $application->refresh(); - if (isset($useBuildServer)) { - $application->settings->is_build_server_enabled = $useBuildServer; - $application->settings->save(); - } - if ($application->settings->is_container_label_readonly_enabled) { - $application->custom_labels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n"); - $application->save(); - } - $application->isConfigurationChanged(true); - - if ($instantDeploy) { - $deployment_uuid = new Cuid2; - - queue_application_deployment( - application: $application, - deployment_uuid: $deployment_uuid, - no_questions_asked: true, - is_api: true, - ); - } - - return response()->json(serializeApiResponse([ - 'uuid' => data_get($application, 'uuid'), - 'domains' => data_get($application, 'domains'), - ]))->setStatusCode(201); - } elseif ($type === 'dockerimage') { - $validationRules = [ - 'docker_registry_image_name' => 'string|required', - 'docker_registry_image_tag' => 'string', - 'ports_exposes' => 'string|regex:/^(\d+)(,\d+)*$/|required', - ]; - $validationRules = array_merge(sharedDataApplications(), $validationRules); - $validator = customApiValidator($request->all(), $validationRules); - - if ($validator->fails()) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $validator->errors(), - ], 422); - } - if (! $request->has('name')) { - $request->offsetSet('name', 'docker-image-'.new Cuid2); - } - $return = $this->validateDataApplications($request, $server); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - if (! $request->docker_registry_image_tag) { - $request->offsetSet('docker_registry_image_tag', 'latest'); - } - $application = new Application; - removeUnnecessaryFieldsFromRequest($request); - - $application->fill($request->all()); - $application->fqdn = $fqdn; - $application->build_pack = 'dockerimage'; - $application->destination_id = $destination->id; - $application->destination_type = $destination->getMorphClass(); - $application->environment_id = $environment->id; - - $application->git_repository = 'coollabsio/coolify'; - $application->git_branch = 'main'; - $application->save(); - $application->refresh(); - if (isset($useBuildServer)) { - $application->settings->is_build_server_enabled = $useBuildServer; - $application->settings->save(); - } - if ($application->settings->is_container_label_readonly_enabled) { - $application->custom_labels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n"); - $application->save(); - } - $application->isConfigurationChanged(true); - - if ($instantDeploy) { - $deployment_uuid = new Cuid2; - - queue_application_deployment( - application: $application, - deployment_uuid: $deployment_uuid, - no_questions_asked: true, - is_api: true, - ); - } - - return response()->json(serializeApiResponse([ - 'uuid' => data_get($application, 'uuid'), - 'domains' => data_get($application, 'domains'), - ]))->setStatusCode(201); - } elseif ($type === 'dockercompose') { - $allowedFields = ['project_uuid', 'environment_name', 'environment_uuid', 'server_uuid', 'destination_uuid', 'type', 'name', 'description', 'instant_deploy', 'docker_compose_raw']; - - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - if (! $request->has('name')) { - $request->offsetSet('name', 'service'.new Cuid2); - } - $validationRules = [ - 'docker_compose_raw' => 'string|required', - ]; - $validationRules = array_merge(sharedDataApplications(), $validationRules); - $validator = customApiValidator($request->all(), $validationRules); - - if ($validator->fails()) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $validator->errors(), - ], 422); - } - $return = $this->validateDataApplications($request, $server); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - if (! isBase64Encoded($request->docker_compose_raw)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'docker_compose_raw' => 'The docker_compose_raw should be base64 encoded.', - ], - ], 422); - } - $dockerComposeRaw = base64_decode($request->docker_compose_raw); - if (mb_detect_encoding($dockerComposeRaw, 'ASCII', true) === false) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'docker_compose_raw' => 'The docker_compose_raw should be base64 encoded.', - ], - ], 422); - } - $dockerCompose = base64_decode($request->docker_compose_raw); - $dockerComposeRaw = Yaml::dump(Yaml::parse($dockerCompose), 10, 2, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK); - - $service = new Service; - removeUnnecessaryFieldsFromRequest($request); - $service->fill($request->all()); - - $service->docker_compose_raw = $dockerComposeRaw; - $service->environment_id = $environment->id; - $service->server_id = $server->id; - $service->destination_id = $destination->id; - $service->destination_type = $destination->getMorphClass(); - $service->save(); - - $service->name = "service-$service->uuid"; - $service->parse(isNew: true); - if ($instantDeploy) { - StartService::dispatch($service); - } - - return response()->json(serializeApiResponse([ - 'uuid' => data_get($service, 'uuid'), - 'domains' => data_get($service, 'domains'), - ]))->setStatusCode(201); - } - - return response()->json(['message' => 'Invalid type.'], 400); - } - - #[OA\Get( - summary: 'Get', - description: 'Get application by UUID.', - path: '/applications/{uuid}', - operationId: 'get-application-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the application.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Get application by UUID.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - ref: '#/components/schemas/Application' - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function application_by_uuid(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $uuid = $request->route('uuid'); - if (! $uuid) { - return response()->json(['message' => 'UUID is required.'], 400); - } - $application = Application::ownedByCurrentTeamAPI($teamId)->where('uuid', $request->uuid)->first(); - if (! $application) { - return response()->json(['message' => 'Application not found.'], 404); - } - - return response()->json($this->removeSensitiveData($application)); - } - - #[OA\Get( - summary: 'Get application logs.', - description: 'Get application logs by UUID.', - path: '/applications/{uuid}/logs', - operationId: 'get-application-logs-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the application.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - new OA\Parameter( - name: 'lines', - in: 'query', - description: 'Number of lines to show from the end of the logs.', - required: false, - schema: new OA\Schema( - type: 'integer', - format: 'int32', - default: 100, - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Get application logs by UUID.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'logs' => ['type' => 'string'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function logs_by_uuid(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $uuid = $request->route('uuid'); - if (! $uuid) { - return response()->json(['message' => 'UUID is required.'], 400); - } - $application = Application::ownedByCurrentTeamAPI($teamId)->where('uuid', $request->uuid)->first(); - if (! $application) { - return response()->json(['message' => 'Application not found.'], 404); - } - - $containers = getCurrentApplicationContainerStatus($application->destination->server, $application->id); - - if ($containers->count() == 0) { - return response()->json([ - 'message' => 'Application is not running.', - ], 400); - } - - $container = $containers->first(); - - $status = getContainerStatus($application->destination->server, $container['Names']); - if ($status !== 'running') { - return response()->json([ - 'message' => 'Application is not running.', - ], 400); - } - - $lines = $request->query->get('lines', 100) ?: 100; - $logs = getContainerLogs($application->destination->server, $container['ID'], $lines); - - return response()->json([ - 'logs' => $logs, - ]); - } - - #[OA\Delete( - summary: 'Delete', - description: 'Delete application by UUID.', - path: '/applications/{uuid}', - operationId: 'delete-application-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the application.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - new OA\Parameter(name: 'delete_configurations', in: 'query', required: false, description: 'Delete configurations.', schema: new OA\Schema(type: 'boolean', default: true)), - new OA\Parameter(name: 'delete_volumes', in: 'query', required: false, description: 'Delete volumes.', schema: new OA\Schema(type: 'boolean', default: true)), - new OA\Parameter(name: 'docker_cleanup', in: 'query', required: false, description: 'Run docker cleanup.', schema: new OA\Schema(type: 'boolean', default: true)), - new OA\Parameter(name: 'delete_connected_networks', in: 'query', required: false, description: 'Delete connected networks.', schema: new OA\Schema(type: 'boolean', default: true)), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Application deleted.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Application deleted.'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function delete_by_uuid(Request $request) - { - $teamId = getTeamIdFromToken(); - $cleanup = filter_var($request->query->get('cleanup', true), FILTER_VALIDATE_BOOLEAN); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - if (! $request->uuid) { - return response()->json(['message' => 'UUID is required.'], 404); - } - $application = Application::ownedByCurrentTeamAPI($teamId)->where('uuid', $request->uuid)->first(); - - if (! $application) { - return response()->json([ - 'message' => 'Application not found', - ], 404); - } - - DeleteResourceJob::dispatch( - resource: $application, - deleteConfigurations: $request->query->get('delete_configurations', true), - deleteVolumes: $request->query->get('delete_volumes', true), - dockerCleanup: $request->query->get('docker_cleanup', true), - deleteConnectedNetworks: $request->query->get('delete_connected_networks', true) - ); - - return response()->json([ - 'message' => 'Application deletion request queued.', - ]); - } - - #[OA\Patch( - summary: 'Update', - description: 'Update application by UUID.', - path: '/applications/{uuid}', - operationId: 'update-application-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - requestBody: new OA\RequestBody( - description: 'Application updated.', - required: true, - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'project_uuid' => ['type' => 'string', 'description' => 'The project UUID.'], - 'server_uuid' => ['type' => 'string', 'description' => 'The server UUID.'], - 'environment_name' => ['type' => 'string', 'description' => 'The environment name.'], - 'github_app_uuid' => ['type' => 'string', 'description' => 'The Github App UUID.'], - 'git_repository' => ['type' => 'string', 'description' => 'The git repository URL.'], - 'git_branch' => ['type' => 'string', 'description' => 'The git branch.'], - 'ports_exposes' => ['type' => 'string', 'description' => 'The ports to expose.'], - 'destination_uuid' => ['type' => 'string', 'description' => 'The destination UUID.'], - 'build_pack' => ['type' => 'string', 'enum' => ['nixpacks', 'static', 'dockerfile', 'dockercompose'], 'description' => 'The build pack type.'], - 'name' => ['type' => 'string', 'description' => 'The application name.'], - 'description' => ['type' => 'string', 'description' => 'The application description.'], - 'domains' => ['type' => 'string', 'description' => 'The application domains.'], - 'git_commit_sha' => ['type' => 'string', 'description' => 'The git commit SHA.'], - 'docker_registry_image_name' => ['type' => 'string', 'description' => 'The docker registry image name.'], - 'docker_registry_image_tag' => ['type' => 'string', 'description' => 'The docker registry image tag.'], - 'is_static' => ['type' => 'boolean', 'description' => 'The flag to indicate if the application is static.'], - 'install_command' => ['type' => 'string', 'description' => 'The install command.'], - 'build_command' => ['type' => 'string', 'description' => 'The build command.'], - 'start_command' => ['type' => 'string', 'description' => 'The start command.'], - 'ports_mappings' => ['type' => 'string', 'description' => 'The ports mappings.'], - 'base_directory' => ['type' => 'string', 'description' => 'The base directory for all commands.'], - 'publish_directory' => ['type' => 'string', 'description' => 'The publish directory.'], - 'health_check_enabled' => ['type' => 'boolean', 'description' => 'Health check enabled.'], - 'health_check_path' => ['type' => 'string', 'description' => 'Health check path.'], - 'health_check_port' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check port.'], - 'health_check_host' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check host.'], - 'health_check_method' => ['type' => 'string', 'description' => 'Health check method.'], - 'health_check_return_code' => ['type' => 'integer', 'description' => 'Health check return code.'], - 'health_check_scheme' => ['type' => 'string', 'description' => 'Health check scheme.'], - 'health_check_response_text' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check response text.'], - 'health_check_interval' => ['type' => 'integer', 'description' => 'Health check interval in seconds.'], - 'health_check_timeout' => ['type' => 'integer', 'description' => 'Health check timeout in seconds.'], - 'health_check_retries' => ['type' => 'integer', 'description' => 'Health check retries count.'], - 'health_check_start_period' => ['type' => 'integer', 'description' => 'Health check start period in seconds.'], - 'limits_memory' => ['type' => 'string', 'description' => 'Memory limit.'], - 'limits_memory_swap' => ['type' => 'string', 'description' => 'Memory swap limit.'], - 'limits_memory_swappiness' => ['type' => 'integer', 'description' => 'Memory swappiness.'], - 'limits_memory_reservation' => ['type' => 'string', 'description' => 'Memory reservation.'], - 'limits_cpus' => ['type' => 'string', 'description' => 'CPU limit.'], - 'limits_cpuset' => ['type' => 'string', 'nullable' => true, 'description' => 'CPU set.'], - 'limits_cpu_shares' => ['type' => 'integer', 'description' => 'CPU shares.'], - 'custom_labels' => ['type' => 'string', 'description' => 'Custom labels.'], - 'custom_docker_run_options' => ['type' => 'string', 'description' => 'Custom docker run options.'], - 'post_deployment_command' => ['type' => 'string', 'description' => 'Post deployment command.'], - 'post_deployment_command_container' => ['type' => 'string', 'description' => 'Post deployment command container.'], - 'pre_deployment_command' => ['type' => 'string', 'description' => 'Pre deployment command.'], - 'pre_deployment_command_container' => ['type' => 'string', 'description' => 'Pre deployment command container.'], - 'manual_webhook_secret_github' => ['type' => 'string', 'description' => 'Manual webhook secret for Github.'], - 'manual_webhook_secret_gitlab' => ['type' => 'string', 'description' => 'Manual webhook secret for Gitlab.'], - 'manual_webhook_secret_bitbucket' => ['type' => 'string', 'description' => 'Manual webhook secret for Bitbucket.'], - 'manual_webhook_secret_gitea' => ['type' => 'string', 'description' => 'Manual webhook secret for Gitea.'], - 'redirect' => ['type' => 'string', 'nullable' => true, 'description' => 'How to set redirect with Traefik / Caddy. www<->non-www.', 'enum' => ['www', 'non-www', 'both']], - 'instant_deploy' => ['type' => 'boolean', 'description' => 'The flag to indicate if the application should be deployed instantly.'], - 'dockerfile' => ['type' => 'string', 'description' => 'The Dockerfile content.'], - 'docker_compose_location' => ['type' => 'string', 'description' => 'The Docker Compose location.'], - 'docker_compose_raw' => ['type' => 'string', 'description' => 'The Docker Compose raw content.'], - 'docker_compose_custom_start_command' => ['type' => 'string', 'description' => 'The Docker Compose custom start command.'], - 'docker_compose_custom_build_command' => ['type' => 'string', 'description' => 'The Docker Compose custom build command.'], - 'docker_compose_domains' => ['type' => 'array', 'description' => 'The Docker Compose domains.'], - 'watch_paths' => ['type' => 'string', 'description' => 'The watch paths.'], - 'use_build_server' => ['type' => 'boolean', 'nullable' => true, 'description' => 'Use build server.'], - ], - ) - ), - ] - ), - responses: [ - new OA\Response( - response: 200, - description: 'Application updated.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'uuid' => ['type' => 'string'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function update_by_uuid(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - if ($request->collect()->count() == 0) { - return response()->json([ - 'message' => 'Invalid request.', - ], 400); - } - $return = validateIncomingRequest($request); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - $application = Application::ownedByCurrentTeamAPI($teamId)->where('uuid', $request->uuid)->first(); - - if (! $application) { - return response()->json([ - 'message' => 'Application not found', - ], 404); - } - $server = $application->destination->server; - $allowedFields = ['name', 'description', 'is_static', 'domains', 'git_repository', 'git_branch', 'git_commit_sha', 'docker_registry_image_name', 'docker_registry_image_tag', 'build_pack', 'static_image', 'install_command', 'build_command', 'start_command', 'ports_exposes', 'ports_mappings', 'base_directory', 'publish_directory', 'health_check_enabled', 'health_check_path', 'health_check_port', 'health_check_host', 'health_check_method', 'health_check_return_code', 'health_check_scheme', 'health_check_response_text', 'health_check_interval', 'health_check_timeout', 'health_check_retries', 'health_check_start_period', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'custom_labels', 'custom_docker_run_options', 'post_deployment_command', 'post_deployment_command_container', 'pre_deployment_command', 'pre_deployment_command_container', 'watch_paths', 'manual_webhook_secret_github', 'manual_webhook_secret_gitlab', 'manual_webhook_secret_bitbucket', 'manual_webhook_secret_gitea', 'docker_compose_location', 'docker_compose_raw', 'docker_compose_custom_start_command', 'docker_compose_custom_build_command', 'docker_compose_domains', 'redirect', 'instant_deploy', 'use_build_server', 'custom_nginx_configuration']; - - $validationRules = [ - 'name' => 'string|max:255', - 'description' => 'string|nullable', - 'static_image' => 'string', - 'watch_paths' => 'string|nullable', - 'docker_compose_location' => 'string', - 'docker_compose_raw' => 'string|nullable', - 'docker_compose_domains' => 'array|nullable', - 'docker_compose_custom_start_command' => 'string|nullable', - 'docker_compose_custom_build_command' => 'string|nullable', - 'custom_nginx_configuration' => 'string|nullable', - ]; - $validationRules = array_merge(sharedDataApplications(), $validationRules); - $validator = customApiValidator($request->all(), $validationRules); - - // Validate ports_exposes - if ($request->has('ports_exposes')) { - $ports = explode(',', $request->ports_exposes); - foreach ($ports as $port) { - if (! is_numeric($port)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'ports_exposes' => 'The ports_exposes should be a comma separated list of numbers.', - ], - ], 422); - } - } - } - if ($request->has('custom_nginx_configuration')) { - if (! isBase64Encoded($request->custom_nginx_configuration)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'custom_nginx_configuration' => 'The custom_nginx_configuration should be base64 encoded.', - ], - ], 422); - } - $customNginxConfiguration = base64_decode($request->custom_nginx_configuration); - if (mb_detect_encoding($customNginxConfiguration, 'ASCII', true) === false) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'custom_nginx_configuration' => 'The custom_nginx_configuration should be base64 encoded.', - ], - ], 422); - } - } - $return = $this->validateDataApplications($request, $server); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - $domains = $request->domains; - $requestHasDomains = $request->has('domains'); - if ($requestHasDomains && $server->isProxyShouldRun()) { - $uuid = $request->uuid; - $fqdn = $request->domains; - $fqdn = str($fqdn)->replaceEnd(',', '')->trim(); - $fqdn = str($fqdn)->replaceStart(',', '')->trim(); - $errors = []; - $fqdn = str($fqdn)->trim()->explode(',')->map(function ($domain) use (&$errors) { - $domain = trim($domain); - if (filter_var($domain, FILTER_VALIDATE_URL) === false || ! preg_match('/^https?:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,}/', $domain)) { - $errors[] = 'Invalid domain: '.$domain; - } - - return $domain; - }); - if (count($errors) > 0) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - if (checkIfDomainIsAlreadyUsed($fqdn, $teamId, $uuid)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'domains' => 'One of the domain is already used.', - ], - ], 422); - } - } - - $dockerComposeDomainsJson = collect(); - if ($request->has('docker_compose_domains')) { - $yaml = Yaml::parse($application->docker_compose_raw); - $services = data_get($yaml, 'services'); - $dockerComposeDomains = collect($request->docker_compose_domains); - if ($dockerComposeDomains->count() > 0) { - $dockerComposeDomains->each(function ($domain, $key) use ($services, $dockerComposeDomainsJson) { - $name = data_get($domain, 'name'); - if (data_get($services, $name)) { - $dockerComposeDomainsJson->put($name, ['domain' => data_get($domain, 'domain')]); - } - }); - } - $request->offsetUnset('docker_compose_domains'); - } - $instantDeploy = $request->instant_deploy; - $isStatic = $request->is_static; - $useBuildServer = $request->use_build_server; - - if (isset($useBuildServer)) { - $application->settings->is_build_server_enabled = $useBuildServer; - $application->settings->save(); - } - - if (isset($isStatic)) { - $application->settings->is_static = $isStatic; - $application->settings->save(); - } - - removeUnnecessaryFieldsFromRequest($request); - - $data = $request->all(); - if ($requestHasDomains && $server->isProxyShouldRun()) { - data_set($data, 'fqdn', $domains); - } - - if ($dockerComposeDomainsJson->count() > 0) { - data_set($data, 'docker_compose_domains', json_encode($dockerComposeDomainsJson)); - } - $application->fill($data); - $application->save(); - - if ($instantDeploy) { - $deployment_uuid = new Cuid2; - - queue_application_deployment( - application: $application, - deployment_uuid: $deployment_uuid, - is_api: true, - ); - } - - return response()->json([ - 'uuid' => $application->uuid, - ]); - } - - #[OA\Get( - summary: 'List Envs', - description: 'List all envs by application UUID.', - path: '/applications/{uuid}/envs', - operationId: 'list-envs-by-application-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the application.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'All environment variables by application UUID.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'array', - items: new OA\Items(ref: '#/components/schemas/EnvironmentVariable') - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function envs(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $application = Application::ownedByCurrentTeamAPI($teamId)->where('uuid', $request->uuid)->first(); - - if (! $application) { - return response()->json([ - 'message' => 'Application not found', - ], 404); - } - $envs = $application->environment_variables->sortBy('id')->merge($application->environment_variables_preview->sortBy('id')); - - $envs = $envs->map(function ($env) { - $env->makeHidden([ - 'service_id', - 'standalone_clickhouse_id', - 'standalone_dragonfly_id', - 'standalone_keydb_id', - 'standalone_mariadb_id', - 'standalone_mongodb_id', - 'standalone_mysql_id', - 'standalone_postgresql_id', - 'standalone_redis_id', - ]); - - return $this->removeSensitiveData($env); - }); - - return response()->json($envs); - } - - #[OA\Patch( - summary: 'Update Env', - description: 'Update env by application UUID.', - path: '/applications/{uuid}/envs', - operationId: 'update-env-by-application-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the application.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - requestBody: new OA\RequestBody( - description: 'Env updated.', - required: true, - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['key', 'value'], - properties: [ - 'key' => ['type' => 'string', 'description' => 'The key of the environment variable.'], - 'value' => ['type' => 'string', 'description' => 'The value of the environment variable.'], - 'is_preview' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is used in preview deployments.'], - 'is_build_time' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is used in build time.'], - 'is_literal' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is a literal, nothing espaced.'], - 'is_multiline' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is multiline.'], - 'is_shown_once' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable\'s value is shown on the UI.'], - ], - ), - ), - ], - ), - responses: [ - new OA\Response( - response: 201, - description: 'Environment variable updated.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Environment variable updated.'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function update_env_by_uuid(Request $request) - { - $allowedFields = ['key', 'value', 'is_preview', 'is_build_time', 'is_literal']; - $teamId = getTeamIdFromToken(); - - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - $return = validateIncomingRequest($request); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - $application = Application::ownedByCurrentTeamAPI($teamId)->where('uuid', $request->uuid)->first(); - - if (! $application) { - return response()->json([ - 'message' => 'Application not found', - ], 404); - } - $validator = customApiValidator($request->all(), [ - 'key' => 'string|required', - 'value' => 'string|nullable', - 'is_preview' => 'boolean', - 'is_build_time' => 'boolean', - 'is_literal' => 'boolean', - 'is_multiline' => 'boolean', - 'is_shown_once' => 'boolean', - ]); - - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - $is_preview = $request->is_preview ?? false; - $is_build_time = $request->is_build_time ?? false; - $is_literal = $request->is_literal ?? false; - $key = str($request->key)->trim()->replace(' ', '_')->value; - if ($is_preview) { - $env = $application->environment_variables_preview->where('key', $key)->first(); - if ($env) { - $env->value = $request->value; - if ($env->is_build_time != $is_build_time) { - $env->is_build_time = $is_build_time; - } - if ($env->is_literal != $is_literal) { - $env->is_literal = $is_literal; - } - if ($env->is_preview != $is_preview) { - $env->is_preview = $is_preview; - } - if ($env->is_multiline != $request->is_multiline) { - $env->is_multiline = $request->is_multiline; - } - if ($env->is_shown_once != $request->is_shown_once) { - $env->is_shown_once = $request->is_shown_once; - } - $env->save(); - - return response()->json($this->removeSensitiveData($env))->setStatusCode(201); - } else { - return response()->json([ - 'message' => 'Environment variable not found.', - ], 404); - } - } else { - $env = $application->environment_variables->where('key', $key)->first(); - if ($env) { - $env->value = $request->value; - if ($env->is_build_time != $is_build_time) { - $env->is_build_time = $is_build_time; - } - if ($env->is_literal != $is_literal) { - $env->is_literal = $is_literal; - } - if ($env->is_preview != $is_preview) { - $env->is_preview = $is_preview; - } - if ($env->is_multiline != $request->is_multiline) { - $env->is_multiline = $request->is_multiline; - } - if ($env->is_shown_once != $request->is_shown_once) { - $env->is_shown_once = $request->is_shown_once; - } - $env->save(); - - return response()->json($this->removeSensitiveData($env))->setStatusCode(201); - } else { - return response()->json([ - 'message' => 'Environment variable not found.', - ], 404); - } - } - - return response()->json([ - 'message' => 'Something is not okay. Are you okay?', - ], 500); - } - - #[OA\Patch( - summary: 'Update Envs (Bulk)', - description: 'Update multiple envs by application UUID.', - path: '/applications/{uuid}/envs/bulk', - operationId: 'update-envs-by-application-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the application.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - requestBody: new OA\RequestBody( - description: 'Bulk envs updated.', - required: true, - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['data'], - properties: [ - 'data' => [ - 'type' => 'array', - 'items' => new OA\Schema( - type: 'object', - properties: [ - 'key' => ['type' => 'string', 'description' => 'The key of the environment variable.'], - 'value' => ['type' => 'string', 'description' => 'The value of the environment variable.'], - 'is_preview' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is used in preview deployments.'], - 'is_build_time' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is used in build time.'], - 'is_literal' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is a literal, nothing espaced.'], - 'is_multiline' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is multiline.'], - 'is_shown_once' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable\'s value is shown on the UI.'], - ], - ), - ], - ], - ), - ), - ], - ), - responses: [ - new OA\Response( - response: 201, - description: 'Environment variables updated.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Environment variables updated.'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function create_bulk_envs(Request $request) - { - $teamId = getTeamIdFromToken(); - - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - $return = validateIncomingRequest($request); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - $application = Application::ownedByCurrentTeamAPI($teamId)->where('uuid', $request->uuid)->first(); - - if (! $application) { - return response()->json([ - 'message' => 'Application not found', - ], 404); - } - - $bulk_data = $request->get('data'); - if (! $bulk_data) { - return response()->json([ - 'message' => 'Bulk data is required.', - ], 400); - } - $bulk_data = collect($bulk_data)->map(function ($item) { - return collect($item)->only(['key', 'value', 'is_preview', 'is_build_time', 'is_literal']); - }); - $returnedEnvs = collect(); - foreach ($bulk_data as $item) { - $validator = customApiValidator($item, [ - 'key' => 'string|required', - 'value' => 'string|nullable', - 'is_preview' => 'boolean', - 'is_build_time' => 'boolean', - 'is_literal' => 'boolean', - 'is_multiline' => 'boolean', - 'is_shown_once' => 'boolean', - ]); - if ($validator->fails()) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $validator->errors(), - ], 422); - } - $is_preview = $item->get('is_preview') ?? false; - $is_build_time = $item->get('is_build_time') ?? false; - $is_literal = $item->get('is_literal') ?? false; - $is_multi_line = $item->get('is_multiline') ?? false; - $is_shown_once = $item->get('is_shown_once') ?? false; - $key = str($item->get('key'))->trim()->replace(' ', '_')->value; - if ($is_preview) { - $env = $application->environment_variables_preview->where('key', $key)->first(); - if ($env) { - $env->value = $item->get('value'); - if ($env->is_build_time != $is_build_time) { - $env->is_build_time = $is_build_time; - } - if ($env->is_literal != $is_literal) { - $env->is_literal = $is_literal; - } - if ($env->is_multiline != $item->get('is_multiline')) { - $env->is_multiline = $item->get('is_multiline'); - } - if ($env->is_shown_once != $item->get('is_shown_once')) { - $env->is_shown_once = $item->get('is_shown_once'); - } - $env->save(); - } else { - $env = $application->environment_variables()->create([ - 'key' => $item->get('key'), - 'value' => $item->get('value'), - 'is_preview' => $is_preview, - 'is_build_time' => $is_build_time, - 'is_literal' => $is_literal, - 'is_multiline' => $is_multi_line, - 'is_shown_once' => $is_shown_once, - 'resourceable_type' => get_class($application), - 'resourceable_id' => $application->id, - ]); - } - } else { - $env = $application->environment_variables->where('key', $key)->first(); - if ($env) { - $env->value = $item->get('value'); - if ($env->is_build_time != $is_build_time) { - $env->is_build_time = $is_build_time; - } - if ($env->is_literal != $is_literal) { - $env->is_literal = $is_literal; - } - if ($env->is_multiline != $item->get('is_multiline')) { - $env->is_multiline = $item->get('is_multiline'); - } - if ($env->is_shown_once != $item->get('is_shown_once')) { - $env->is_shown_once = $item->get('is_shown_once'); - } - $env->save(); - } else { - $env = $application->environment_variables()->create([ - 'key' => $item->get('key'), - 'value' => $item->get('value'), - 'is_preview' => $is_preview, - 'is_build_time' => $is_build_time, - 'is_literal' => $is_literal, - 'is_multiline' => $is_multi_line, - 'is_shown_once' => $is_shown_once, - 'resourceable_type' => get_class($application), - 'resourceable_id' => $application->id, - ]); - } - } - $returnedEnvs->push($this->removeSensitiveData($env)); - } - - return response()->json($returnedEnvs)->setStatusCode(201); - } - - #[OA\Post( - summary: 'Create Env', - description: 'Create env by application UUID.', - path: '/applications/{uuid}/envs', - operationId: 'create-env-by-application-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the application.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - requestBody: new OA\RequestBody( - required: true, - description: 'Env created.', - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'key' => ['type' => 'string', 'description' => 'The key of the environment variable.'], - 'value' => ['type' => 'string', 'description' => 'The value of the environment variable.'], - 'is_preview' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is used in preview deployments.'], - 'is_build_time' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is used in build time.'], - 'is_literal' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is a literal, nothing espaced.'], - 'is_multiline' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is multiline.'], - 'is_shown_once' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable\'s value is shown on the UI.'], - ], - ), - ), - ), - responses: [ - new OA\Response( - response: 201, - description: 'Environment variable created.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'uuid' => ['type' => 'string', 'example' => 'nc0k04gk8g0cgsk440g0koko'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function create_env(Request $request) - { - $allowedFields = ['key', 'value', 'is_preview', 'is_build_time', 'is_literal']; - $teamId = getTeamIdFromToken(); - - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $application = Application::ownedByCurrentTeamAPI($teamId)->where('uuid', $request->uuid)->first(); - - if (! $application) { - return response()->json([ - 'message' => 'Application not found', - ], 404); - } - $validator = customApiValidator($request->all(), [ - 'key' => 'string|required', - 'value' => 'string|nullable', - 'is_preview' => 'boolean', - 'is_build_time' => 'boolean', - 'is_literal' => 'boolean', - 'is_multiline' => 'boolean', - 'is_shown_once' => 'boolean', - ]); - - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - $is_preview = $request->is_preview ?? false; - $key = str($request->key)->trim()->replace(' ', '_')->value; - - if ($is_preview) { - $env = $application->environment_variables_preview->where('key', $key)->first(); - if ($env) { - return response()->json([ - 'message' => 'Environment variable already exists. Use PATCH request to update it.', - ], 409); - } else { - $env = $application->environment_variables()->create([ - 'key' => $request->key, - 'value' => $request->value, - 'is_preview' => $request->is_preview ?? false, - 'is_build_time' => $request->is_build_time ?? false, - 'is_literal' => $request->is_literal ?? false, - 'is_multiline' => $request->is_multiline ?? false, - 'is_shown_once' => $request->is_shown_once ?? false, - 'resourceable_type' => get_class($application), - 'resourceable_id' => $application->id, - ]); - - return response()->json([ - 'uuid' => $env->uuid, - ])->setStatusCode(201); - } - } else { - $env = $application->environment_variables->where('key', $key)->first(); - if ($env) { - return response()->json([ - 'message' => 'Environment variable already exists. Use PATCH request to update it.', - ], 409); - } else { - $env = $application->environment_variables()->create([ - 'key' => $request->key, - 'value' => $request->value, - 'is_preview' => $request->is_preview ?? false, - 'is_build_time' => $request->is_build_time ?? false, - 'is_literal' => $request->is_literal ?? false, - 'is_multiline' => $request->is_multiline ?? false, - 'is_shown_once' => $request->is_shown_once ?? false, - 'resourceable_type' => get_class($application), - 'resourceable_id' => $application->id, - ]); - - return response()->json([ - 'uuid' => $env->uuid, - ])->setStatusCode(201); - } - } - - return response()->json([ - 'message' => 'Something went wrong.', - ], 500); - } - - #[OA\Delete( - summary: 'Delete Env', - description: 'Delete env by UUID.', - path: '/applications/{uuid}/envs/{env_uuid}', - operationId: 'delete-env-by-application-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the application.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - new OA\Parameter( - name: 'env_uuid', - in: 'path', - description: 'UUID of the environment variable.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Environment variable deleted.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Environment variable deleted.'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function delete_env_by_uuid(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $application = Application::ownedByCurrentTeamAPI($teamId)->where('uuid', $request->uuid)->first(); - - if (! $application) { - return response()->json([ - 'message' => 'Application not found.', - ], 404); - } - $found_env = EnvironmentVariable::where('uuid', $request->env_uuid) - ->where('resourceable_type', Application::class) - ->where('resourceable_id', $application->id) - ->first(); - if (! $found_env) { - return response()->json([ - 'message' => 'Environment variable not found.', - ], 404); - } - $found_env->forceDelete(); - - return response()->json([ - 'message' => 'Environment variable deleted.', - ]); - } - - #[OA\Get( - summary: 'Start', - description: 'Start application. `Post` request is also accepted.', - path: '/applications/{uuid}/start', - operationId: 'start-application-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the application.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - new OA\Parameter( - name: 'force', - in: 'query', - description: 'Force rebuild.', - schema: new OA\Schema( - type: 'boolean', - default: false, - ) - ), - new OA\Parameter( - name: 'instant_deploy', - in: 'query', - description: 'Instant deploy (skip queuing).', - schema: new OA\Schema( - type: 'boolean', - default: false, - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Start application.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Deployment request queued.', 'description' => 'Message.'], - 'deployment_uuid' => ['type' => 'string', 'example' => 'doogksw', 'description' => 'UUID of the deployment.'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function action_deploy(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $force = $request->query->get('force') ?? false; - $instant_deploy = $request->query->get('instant_deploy') ?? false; - $uuid = $request->route('uuid'); - if (! $uuid) { - return response()->json(['message' => 'UUID is required.'], 400); - } - $application = Application::ownedByCurrentTeamAPI($teamId)->where('uuid', $request->uuid)->first(); - if (! $application) { - return response()->json(['message' => 'Application not found.'], 404); - } - - $deployment_uuid = new Cuid2; - - queue_application_deployment( - application: $application, - deployment_uuid: $deployment_uuid, - force_rebuild: $force, - is_api: true, - no_questions_asked: $instant_deploy - ); - - return response()->json( - [ - 'message' => 'Deployment request queued.', - 'deployment_uuid' => $deployment_uuid->toString(), - ], - 200 - ); - } - - #[OA\Get( - summary: 'Stop', - description: 'Stop application. `Post` request is also accepted.', - path: '/applications/{uuid}/stop', - operationId: 'stop-application-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the application.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Stop application.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Application stopping request queued.'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function action_stop(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $uuid = $request->route('uuid'); - if (! $uuid) { - return response()->json(['message' => 'UUID is required.'], 400); - } - $application = Application::ownedByCurrentTeamAPI($teamId)->where('uuid', $request->uuid)->first(); - if (! $application) { - return response()->json(['message' => 'Application not found.'], 404); - } - StopApplication::dispatch($application); - - return response()->json( - [ - 'message' => 'Application stopping request queued.', - ], - ); - } - - #[OA\Get( - summary: 'Restart', - description: 'Restart application. `Post` request is also accepted.', - path: '/applications/{uuid}/restart', - operationId: 'restart-application-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the application.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Restart application.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Restart request queued.'], - 'deployment_uuid' => ['type' => 'string', 'example' => 'doogksw', 'description' => 'UUID of the deployment.'], - ] - ) - ), - ] - ), - - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function action_restart(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $uuid = $request->route('uuid'); - if (! $uuid) { - return response()->json(['message' => 'UUID is required.'], 400); - } - $application = Application::ownedByCurrentTeamAPI($teamId)->where('uuid', $request->uuid)->first(); - if (! $application) { - return response()->json(['message' => 'Application not found.'], 404); - } - - $deployment_uuid = new Cuid2; - - queue_application_deployment( - application: $application, - deployment_uuid: $deployment_uuid, - restart_only: true, - is_api: true, - ); - - return response()->json( - [ - 'message' => 'Restart request queued.', - 'deployment_uuid' => $deployment_uuid->toString(), - ], - ); - } - - #[OA\Post( - summary: 'Execute Command', - description: "Execute a command on the application's current container.", - path: '/applications/{uuid}/execute', - operationId: 'execute-command-application', - security: [ - ['bearerAuth' => []], - ], - tags: ['Applications'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the application.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - requestBody: new OA\RequestBody( - required: true, - description: 'Command to execute.', - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'command' => ['type' => 'string', 'description' => 'Command to execute.'], - ], - ), - ), - ), - responses: [ - new OA\Response( - response: 200, - description: "Execute a command on the application's current container.", - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Command executed.'], - 'response' => ['type' => 'string'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function execute_command_by_uuid(Request $request) - { - // TODO: Need to review this from security perspective, to not allow arbitrary command execution - $allowedFields = ['command']; - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $uuid = $request->route('uuid'); - if (! $uuid) { - return response()->json(['message' => 'UUID is required.'], 400); - } - $application = Application::ownedByCurrentTeamAPI($teamId)->where('uuid', $request->uuid)->first(); - if (! $application) { - return response()->json(['message' => 'Application not found.'], 404); - } - $return = validateIncomingRequest($request); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - $validator = customApiValidator($request->all(), [ - 'command' => 'string|required', - ]); - - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - - $container = getCurrentApplicationContainerStatus($application->destination->server, $application->id)->firstOrFail(); - $status = getContainerStatus($application->destination->server, $container['Names']); - - if ($status !== 'running') { - return response()->json([ - 'message' => 'Application is not running.', - ], 400); - } - - $commands = collect([ - executeInDocker($container['Names'], $request->command), - ]); - - $res = instant_remote_process(command: $commands, server: $application->destination->server); - - return response()->json([ - 'message' => 'Command executed.', - 'response' => $res, - ]); - } - - private function validateDataApplications(Request $request, Server $server) - { - $teamId = getTeamIdFromToken(); - - // Validate ports_mappings - if ($request->has('ports_mappings')) { - $ports = []; - foreach (explode(',', $request->ports_mappings) as $portMapping) { - $port = explode(':', $portMapping); - if (in_array($port[0], $ports)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'ports_mappings' => 'The first number before : should be unique between mappings.', - ], - ], 422); - } - $ports[] = $port[0]; - } - } - // Validate custom_labels - if ($request->has('custom_labels')) { - if (! isBase64Encoded($request->custom_labels)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'custom_labels' => 'The custom_labels should be base64 encoded.', - ], - ], 422); - } - $customLabels = base64_decode($request->custom_labels); - if (mb_detect_encoding($customLabels, 'ASCII', true) === false) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'custom_labels' => 'The custom_labels should be base64 encoded.', - ], - ], 422); - } - } - if ($request->has('domains') && $server->isProxyShouldRun()) { - $uuid = $request->uuid; - $fqdn = $request->domains; - $fqdn = str($fqdn)->replaceEnd(',', '')->trim(); - $fqdn = str($fqdn)->replaceStart(',', '')->trim(); - $errors = []; - $fqdn = str($fqdn)->trim()->explode(',')->map(function ($domain) use (&$errors) { - if (filter_var($domain, FILTER_VALIDATE_URL) === false) { - $errors[] = 'Invalid domain: '.$domain; - } - - return str($domain)->trim()->lower(); - }); - if (count($errors) > 0) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - if (checkIfDomainIsAlreadyUsed($fqdn, $teamId, $uuid)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'domains' => 'One of the domain is already used.', - ], - ], 422); - } - } - } -} diff --git a/app/Http/Controllers/Api/DatabasesController.php b/app/Http/Controllers/Api/DatabasesController.php deleted file mode 100644 index 504665f6a8..0000000000 --- a/app/Http/Controllers/Api/DatabasesController.php +++ /dev/null @@ -1,1852 +0,0 @@ -makeHidden([ - 'id', - 'laravel_through_key', - ]); - if (request()->attributes->get('can_read_sensitive', false) === false) { - $database->makeHidden([ - 'internal_db_url', - 'external_db_url', - 'postgres_password', - 'dragonfly_password', - 'redis_password', - 'mongo_initdb_root_password', - 'keydb_password', - 'clickhouse_admin_password', - ]); - } - - return serializeApiResponse($database); - } - - #[OA\Get( - summary: 'List', - description: 'List all databases.', - path: '/databases', - operationId: 'list-databases', - security: [ - ['bearerAuth' => []], - ], - tags: ['Databases'], - responses: [ - new OA\Response( - response: 200, - description: 'Get all databases', - content: new OA\JsonContent( - type: 'string', - example: 'Content is very complex. Will be implemented later.', - ), - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function databases(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $projects = Project::where('team_id', $teamId)->get(); - $databases = collect(); - foreach ($projects as $project) { - $databases = $databases->merge($project->databases()); - } - $databases = $databases->map(function ($database) { - return $this->removeSensitiveData($database); - }); - - return response()->json($databases); - } - - #[OA\Get( - summary: 'Get', - description: 'Get database by UUID.', - path: '/databases/{uuid}', - operationId: 'get-database-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Databases'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the database.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Get all databases', - content: new OA\JsonContent( - type: 'string', - example: 'Content is very complex. Will be implemented later.', - ), - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function database_by_uuid(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - if (! $request->uuid) { - return response()->json(['message' => 'UUID is required.'], 404); - } - $database = queryDatabaseByUuidWithinTeam($request->uuid, $teamId); - if (! $database) { - return response()->json(['message' => 'Database not found.'], 404); - } - - return response()->json($this->removeSensitiveData($database)); - } - - #[OA\Patch( - summary: 'Update', - description: 'Update database by UUID.', - path: '/databases/{uuid}', - operationId: 'update-database-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Databases'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the database.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - requestBody: new OA\RequestBody( - description: 'Database data', - required: true, - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'name' => ['type' => 'string', 'description' => 'Name of the database'], - 'description' => ['type' => 'string', 'description' => 'Description of the database'], - 'image' => ['type' => 'string', 'description' => 'Docker Image of the database'], - 'is_public' => ['type' => 'boolean', 'description' => 'Is the database public?'], - 'public_port' => ['type' => 'integer', 'description' => 'Public port of the database'], - 'limits_memory' => ['type' => 'string', 'description' => 'Memory limit of the database'], - 'limits_memory_swap' => ['type' => 'string', 'description' => 'Memory swap limit of the database'], - 'limits_memory_swappiness' => ['type' => 'integer', 'description' => 'Memory swappiness of the database'], - 'limits_memory_reservation' => ['type' => 'string', 'description' => 'Memory reservation of the database'], - 'limits_cpus' => ['type' => 'string', 'description' => 'CPU limit of the database'], - 'limits_cpuset' => ['type' => 'string', 'description' => 'CPU set of the database'], - 'limits_cpu_shares' => ['type' => 'integer', 'description' => 'CPU shares of the database'], - 'postgres_user' => ['type' => 'string', 'description' => 'PostgreSQL user'], - 'postgres_password' => ['type' => 'string', 'description' => 'PostgreSQL password'], - 'postgres_db' => ['type' => 'string', 'description' => 'PostgreSQL database'], - 'postgres_initdb_args' => ['type' => 'string', 'description' => 'PostgreSQL initdb args'], - 'postgres_host_auth_method' => ['type' => 'string', 'description' => 'PostgreSQL host auth method'], - 'postgres_conf' => ['type' => 'string', 'description' => 'PostgreSQL conf'], - 'clickhouse_admin_user' => ['type' => 'string', 'description' => 'Clickhouse admin user'], - 'clickhouse_admin_password' => ['type' => 'string', 'description' => 'Clickhouse admin password'], - 'dragonfly_password' => ['type' => 'string', 'description' => 'DragonFly password'], - 'redis_password' => ['type' => 'string', 'description' => 'Redis password'], - 'redis_conf' => ['type' => 'string', 'description' => 'Redis conf'], - 'keydb_password' => ['type' => 'string', 'description' => 'KeyDB password'], - 'keydb_conf' => ['type' => 'string', 'description' => 'KeyDB conf'], - 'mariadb_conf' => ['type' => 'string', 'description' => 'MariaDB conf'], - 'mariadb_root_password' => ['type' => 'string', 'description' => 'MariaDB root password'], - 'mariadb_user' => ['type' => 'string', 'description' => 'MariaDB user'], - 'mariadb_password' => ['type' => 'string', 'description' => 'MariaDB password'], - 'mariadb_database' => ['type' => 'string', 'description' => 'MariaDB database'], - 'mongo_conf' => ['type' => 'string', 'description' => 'Mongo conf'], - 'mongo_initdb_root_username' => ['type' => 'string', 'description' => 'Mongo initdb root username'], - 'mongo_initdb_root_password' => ['type' => 'string', 'description' => 'Mongo initdb root password'], - 'mongo_initdb_database' => ['type' => 'string', 'description' => 'Mongo initdb init database'], - 'mysql_root_password' => ['type' => 'string', 'description' => 'MySQL root password'], - 'mysql_password' => ['type' => 'string', 'description' => 'MySQL password'], - 'mysql_user' => ['type' => 'string', 'description' => 'MySQL user'], - 'mysql_database' => ['type' => 'string', 'description' => 'MySQL database'], - 'mysql_conf' => ['type' => 'string', 'description' => 'MySQL conf'], - ], - ), - ) - ), - responses: [ - new OA\Response( - response: 200, - description: 'Database updated', - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function update_by_uuid(Request $request) - { - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'postgres_user', 'postgres_password', 'postgres_db', 'postgres_initdb_args', 'postgres_host_auth_method', 'postgres_conf', 'clickhouse_admin_user', 'clickhouse_admin_password', 'dragonfly_password', 'redis_password', 'redis_conf', 'keydb_password', 'keydb_conf', 'mariadb_conf', 'mariadb_root_password', 'mariadb_user', 'mariadb_password', 'mariadb_database', 'mongo_conf', 'mongo_initdb_root_username', 'mongo_initdb_root_password', 'mongo_initdb_database', 'mysql_root_password', 'mysql_password', 'mysql_user', 'mysql_database', 'mysql_conf']; - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - $return = validateIncomingRequest($request); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - $validator = customApiValidator($request->all(), [ - 'name' => 'string|max:255', - 'description' => 'string|nullable', - 'image' => 'string', - 'is_public' => 'boolean', - 'public_port' => 'numeric|nullable', - 'limits_memory' => 'string', - 'limits_memory_swap' => 'string', - 'limits_memory_swappiness' => 'numeric', - 'limits_memory_reservation' => 'string', - 'limits_cpus' => 'string', - 'limits_cpuset' => 'string|nullable', - 'limits_cpu_shares' => 'numeric', - ]); - - if ($validator->fails()) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $validator->errors(), - ], 422); - } - $uuid = $request->uuid; - removeUnnecessaryFieldsFromRequest($request); - $database = queryDatabaseByUuidWithinTeam($uuid, $teamId); - if (! $database) { - return response()->json(['message' => 'Database not found.'], 404); - } - if ($request->is_public && $request->public_port) { - if (isPublicPortAlreadyUsed($database->destination->server, $request->public_port, $database->id)) { - return response()->json(['message' => 'Public port already used by another database.'], 400); - } - } - switch ($database->type()) { - case 'standalone-postgresql': - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'postgres_user', 'postgres_password', 'postgres_db', 'postgres_initdb_args', 'postgres_host_auth_method', 'postgres_conf']; - $validator = customApiValidator($request->all(), [ - 'postgres_user' => 'string', - 'postgres_password' => 'string', - 'postgres_db' => 'string', - 'postgres_initdb_args' => 'string', - 'postgres_host_auth_method' => 'string', - 'postgres_conf' => 'string', - ]); - if ($request->has('postgres_conf')) { - if (! isBase64Encoded($request->postgres_conf)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'postgres_conf' => 'The postgres_conf should be base64 encoded.', - ], - ], 422); - } - $postgresConf = base64_decode($request->postgres_conf); - if (mb_detect_encoding($postgresConf, 'ASCII', true) === false) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'postgres_conf' => 'The postgres_conf should be base64 encoded.', - ], - ], 422); - } - $request->offsetSet('postgres_conf', $postgresConf); - } - break; - case 'standalone-clickhouse': - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'clickhouse_admin_user', 'clickhouse_admin_password']; - $validator = customApiValidator($request->all(), [ - 'clickhouse_admin_user' => 'string', - 'clickhouse_admin_password' => 'string', - ]); - break; - case 'standalone-dragonfly': - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'dragonfly_password']; - $validator = customApiValidator($request->all(), [ - 'dragonfly_password' => 'string', - ]); - break; - case 'standalone-redis': - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'redis_password', 'redis_conf']; - $validator = customApiValidator($request->all(), [ - 'redis_password' => 'string', - 'redis_conf' => 'string', - ]); - if ($request->has('redis_conf')) { - if (! isBase64Encoded($request->redis_conf)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'redis_conf' => 'The redis_conf should be base64 encoded.', - ], - ], 422); - } - $redisConf = base64_decode($request->redis_conf); - if (mb_detect_encoding($redisConf, 'ASCII', true) === false) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'redis_conf' => 'The redis_conf should be base64 encoded.', - ], - ], 422); - } - $request->offsetSet('redis_conf', $redisConf); - } - break; - case 'standalone-keydb': - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'keydb_password', 'keydb_conf']; - $validator = customApiValidator($request->all(), [ - 'keydb_password' => 'string', - 'keydb_conf' => 'string', - ]); - if ($request->has('keydb_conf')) { - if (! isBase64Encoded($request->keydb_conf)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'keydb_conf' => 'The keydb_conf should be base64 encoded.', - ], - ], 422); - } - $keydbConf = base64_decode($request->keydb_conf); - if (mb_detect_encoding($keydbConf, 'ASCII', true) === false) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'keydb_conf' => 'The keydb_conf should be base64 encoded.', - ], - ], 422); - } - $request->offsetSet('keydb_conf', $keydbConf); - } - break; - case 'standalone-mariadb': - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'mariadb_conf', 'mariadb_root_password', 'mariadb_user', 'mariadb_password', 'mariadb_database']; - $validator = customApiValidator($request->all(), [ - 'mariadb_conf' => 'string', - 'mariadb_root_password' => 'string', - 'mariadb_user' => 'string', - 'mariadb_password' => 'string', - 'mariadb_database' => 'string', - ]); - if ($request->has('mariadb_conf')) { - if (! isBase64Encoded($request->mariadb_conf)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'mariadb_conf' => 'The mariadb_conf should be base64 encoded.', - ], - ], 422); - } - $mariadbConf = base64_decode($request->mariadb_conf); - if (mb_detect_encoding($mariadbConf, 'ASCII', true) === false) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'mariadb_conf' => 'The mariadb_conf should be base64 encoded.', - ], - ], 422); - } - $request->offsetSet('mariadb_conf', $mariadbConf); - } - break; - case 'standalone-mongodb': - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'mongo_conf', 'mongo_initdb_root_username', 'mongo_initdb_root_password', 'mongo_initdb_database']; - $validator = customApiValidator($request->all(), [ - 'mongo_conf' => 'string', - 'mongo_initdb_root_username' => 'string', - 'mongo_initdb_root_password' => 'string', - 'mongo_initdb_database' => 'string', - ]); - if ($request->has('mongo_conf')) { - if (! isBase64Encoded($request->mongo_conf)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'mongo_conf' => 'The mongo_conf should be base64 encoded.', - ], - ], 422); - } - $mongoConf = base64_decode($request->mongo_conf); - if (mb_detect_encoding($mongoConf, 'ASCII', true) === false) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'mongo_conf' => 'The mongo_conf should be base64 encoded.', - ], - ], 422); - } - $request->offsetSet('mongo_conf', $mongoConf); - } - - break; - case 'standalone-mysql': - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'mysql_root_password', 'mysql_password', 'mysql_user', 'mysql_database', 'mysql_conf']; - $validator = customApiValidator($request->all(), [ - 'mysql_root_password' => 'string', - 'mysql_password' => 'string', - 'mysql_user' => 'string', - 'mysql_database' => 'string', - 'mysql_conf' => 'string', - ]); - if ($request->has('mysql_conf')) { - if (! isBase64Encoded($request->mysql_conf)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'mysql_conf' => 'The mysql_conf should be base64 encoded.', - ], - ], 422); - } - $mysqlConf = base64_decode($request->mysql_conf); - if (mb_detect_encoding($mysqlConf, 'ASCII', true) === false) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'mysql_conf' => 'The mysql_conf should be base64 encoded.', - ], - ], 422); - } - $request->offsetSet('mysql_conf', $mysqlConf); - } - break; - } - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - $whatToDoWithDatabaseProxy = null; - if ($request->is_public === false && $database->is_public === true) { - $whatToDoWithDatabaseProxy = 'stop'; - } - if ($request->is_public === true && $request->public_port && $database->is_public === false) { - $whatToDoWithDatabaseProxy = 'start'; - } - - $database->update($request->all()); - - if ($whatToDoWithDatabaseProxy === 'start') { - StartDatabaseProxy::dispatch($database); - } elseif ($whatToDoWithDatabaseProxy === 'stop') { - StopDatabaseProxy::dispatch($database); - } - - return response()->json([ - 'message' => 'Database updated.', - ]); - } - - #[OA\Post( - summary: 'Create (PostgreSQL)', - description: 'Create a new PostgreSQL database.', - path: '/databases/postgresql', - operationId: 'create-database-postgresql', - security: [ - ['bearerAuth' => []], - ], - tags: ['Databases'], - - requestBody: new OA\RequestBody( - description: 'Database data', - required: true, - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['server_uuid', 'project_uuid', 'environment_name', 'environment_uuid'], - properties: [ - 'server_uuid' => ['type' => 'string', 'description' => 'UUID of the server'], - 'project_uuid' => ['type' => 'string', 'description' => 'UUID of the project'], - 'environment_name' => ['type' => 'string', 'description' => 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'], - 'environment_uuid' => ['type' => 'string', 'description' => 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'], - 'postgres_user' => ['type' => 'string', 'description' => 'PostgreSQL user'], - 'postgres_password' => ['type' => 'string', 'description' => 'PostgreSQL password'], - 'postgres_db' => ['type' => 'string', 'description' => 'PostgreSQL database'], - 'postgres_initdb_args' => ['type' => 'string', 'description' => 'PostgreSQL initdb args'], - 'postgres_host_auth_method' => ['type' => 'string', 'description' => 'PostgreSQL host auth method'], - 'postgres_conf' => ['type' => 'string', 'description' => 'PostgreSQL conf'], - 'destination_uuid' => ['type' => 'string', 'description' => 'UUID of the destination if the server has multiple destinations'], - 'name' => ['type' => 'string', 'description' => 'Name of the database'], - 'description' => ['type' => 'string', 'description' => 'Description of the database'], - 'image' => ['type' => 'string', 'description' => 'Docker Image of the database'], - 'is_public' => ['type' => 'boolean', 'description' => 'Is the database public?'], - 'public_port' => ['type' => 'integer', 'description' => 'Public port of the database'], - 'limits_memory' => ['type' => 'string', 'description' => 'Memory limit of the database'], - 'limits_memory_swap' => ['type' => 'string', 'description' => 'Memory swap limit of the database'], - 'limits_memory_swappiness' => ['type' => 'integer', 'description' => 'Memory swappiness of the database'], - 'limits_memory_reservation' => ['type' => 'string', 'description' => 'Memory reservation of the database'], - 'limits_cpus' => ['type' => 'string', 'description' => 'CPU limit of the database'], - 'limits_cpuset' => ['type' => 'string', 'description' => 'CPU set of the database'], - 'limits_cpu_shares' => ['type' => 'integer', 'description' => 'CPU shares of the database'], - 'instant_deploy' => ['type' => 'boolean', 'description' => 'Instant deploy the database'], - ], - ), - ) - ), - responses: [ - new OA\Response( - response: 200, - description: 'Database updated', - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function create_database_postgresql(Request $request) - { - return $this->create_database($request, NewDatabaseTypes::POSTGRESQL); - } - - #[OA\Post( - summary: 'Create (Clickhouse)', - description: 'Create a new Clickhouse database.', - path: '/databases/clickhouse', - operationId: 'create-database-clickhouse', - security: [ - ['bearerAuth' => []], - ], - tags: ['Databases'], - - requestBody: new OA\RequestBody( - description: 'Database data', - required: true, - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['server_uuid', 'project_uuid', 'environment_name', 'environment_uuid'], - properties: [ - 'server_uuid' => ['type' => 'string', 'description' => 'UUID of the server'], - 'project_uuid' => ['type' => 'string', 'description' => 'UUID of the project'], - 'environment_name' => ['type' => 'string', 'description' => 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'], - 'environment_uuid' => ['type' => 'string', 'description' => 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'], - 'destination_uuid' => ['type' => 'string', 'description' => 'UUID of the destination if the server has multiple destinations'], - 'clickhouse_admin_user' => ['type' => 'string', 'description' => 'Clickhouse admin user'], - 'clickhouse_admin_password' => ['type' => 'string', 'description' => 'Clickhouse admin password'], - 'name' => ['type' => 'string', 'description' => 'Name of the database'], - 'description' => ['type' => 'string', 'description' => 'Description of the database'], - 'image' => ['type' => 'string', 'description' => 'Docker Image of the database'], - 'is_public' => ['type' => 'boolean', 'description' => 'Is the database public?'], - 'public_port' => ['type' => 'integer', 'description' => 'Public port of the database'], - 'limits_memory' => ['type' => 'string', 'description' => 'Memory limit of the database'], - 'limits_memory_swap' => ['type' => 'string', 'description' => 'Memory swap limit of the database'], - 'limits_memory_swappiness' => ['type' => 'integer', 'description' => 'Memory swappiness of the database'], - 'limits_memory_reservation' => ['type' => 'string', 'description' => 'Memory reservation of the database'], - 'limits_cpus' => ['type' => 'string', 'description' => 'CPU limit of the database'], - 'limits_cpuset' => ['type' => 'string', 'description' => 'CPU set of the database'], - 'limits_cpu_shares' => ['type' => 'integer', 'description' => 'CPU shares of the database'], - 'instant_deploy' => ['type' => 'boolean', 'description' => 'Instant deploy the database'], - ], - ), - ) - ), - responses: [ - new OA\Response( - response: 200, - description: 'Database updated', - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function create_database_clickhouse(Request $request) - { - return $this->create_database($request, NewDatabaseTypes::CLICKHOUSE); - } - - #[OA\Post( - summary: 'Create (DragonFly)', - description: 'Create a new DragonFly database.', - path: '/databases/dragonfly', - operationId: 'create-database-dragonfly', - security: [ - ['bearerAuth' => []], - ], - tags: ['Databases'], - - requestBody: new OA\RequestBody( - description: 'Database data', - required: true, - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['server_uuid', 'project_uuid', 'environment_name', 'environment_uuid'], - properties: [ - 'server_uuid' => ['type' => 'string', 'description' => 'UUID of the server'], - 'project_uuid' => ['type' => 'string', 'description' => 'UUID of the project'], - 'environment_name' => ['type' => 'string', 'description' => 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'], - 'environment_uuid' => ['type' => 'string', 'description' => 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'], - 'destination_uuid' => ['type' => 'string', 'description' => 'UUID of the destination if the server has multiple destinations'], - 'dragonfly_password' => ['type' => 'string', 'description' => 'DragonFly password'], - 'name' => ['type' => 'string', 'description' => 'Name of the database'], - 'description' => ['type' => 'string', 'description' => 'Description of the database'], - 'image' => ['type' => 'string', 'description' => 'Docker Image of the database'], - 'is_public' => ['type' => 'boolean', 'description' => 'Is the database public?'], - 'public_port' => ['type' => 'integer', 'description' => 'Public port of the database'], - 'limits_memory' => ['type' => 'string', 'description' => 'Memory limit of the database'], - 'limits_memory_swap' => ['type' => 'string', 'description' => 'Memory swap limit of the database'], - 'limits_memory_swappiness' => ['type' => 'integer', 'description' => 'Memory swappiness of the database'], - 'limits_memory_reservation' => ['type' => 'string', 'description' => 'Memory reservation of the database'], - 'limits_cpus' => ['type' => 'string', 'description' => 'CPU limit of the database'], - 'limits_cpuset' => ['type' => 'string', 'description' => 'CPU set of the database'], - 'limits_cpu_shares' => ['type' => 'integer', 'description' => 'CPU shares of the database'], - 'instant_deploy' => ['type' => 'boolean', 'description' => 'Instant deploy the database'], - ], - ), - ) - ), - responses: [ - new OA\Response( - response: 200, - description: 'Database updated', - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function create_database_dragonfly(Request $request) - { - return $this->create_database($request, NewDatabaseTypes::DRAGONFLY); - } - - #[OA\Post( - summary: 'Create (Redis)', - description: 'Create a new Redis database.', - path: '/databases/redis', - operationId: 'create-database-redis', - security: [ - ['bearerAuth' => []], - ], - tags: ['Databases'], - - requestBody: new OA\RequestBody( - description: 'Database data', - required: true, - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['server_uuid', 'project_uuid', 'environment_name', 'environment_uuid'], - properties: [ - 'server_uuid' => ['type' => 'string', 'description' => 'UUID of the server'], - 'project_uuid' => ['type' => 'string', 'description' => 'UUID of the project'], - 'environment_name' => ['type' => 'string', 'description' => 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'], - 'environment_uuid' => ['type' => 'string', 'description' => 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'], - 'destination_uuid' => ['type' => 'string', 'description' => 'UUID of the destination if the server has multiple destinations'], - 'redis_password' => ['type' => 'string', 'description' => 'Redis password'], - 'redis_conf' => ['type' => 'string', 'description' => 'Redis conf'], - 'name' => ['type' => 'string', 'description' => 'Name of the database'], - 'description' => ['type' => 'string', 'description' => 'Description of the database'], - 'image' => ['type' => 'string', 'description' => 'Docker Image of the database'], - 'is_public' => ['type' => 'boolean', 'description' => 'Is the database public?'], - 'public_port' => ['type' => 'integer', 'description' => 'Public port of the database'], - 'limits_memory' => ['type' => 'string', 'description' => 'Memory limit of the database'], - 'limits_memory_swap' => ['type' => 'string', 'description' => 'Memory swap limit of the database'], - 'limits_memory_swappiness' => ['type' => 'integer', 'description' => 'Memory swappiness of the database'], - 'limits_memory_reservation' => ['type' => 'string', 'description' => 'Memory reservation of the database'], - 'limits_cpus' => ['type' => 'string', 'description' => 'CPU limit of the database'], - 'limits_cpuset' => ['type' => 'string', 'description' => 'CPU set of the database'], - 'limits_cpu_shares' => ['type' => 'integer', 'description' => 'CPU shares of the database'], - 'instant_deploy' => ['type' => 'boolean', 'description' => 'Instant deploy the database'], - ], - ), - ) - ), - responses: [ - new OA\Response( - response: 200, - description: 'Database updated', - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function create_database_redis(Request $request) - { - return $this->create_database($request, NewDatabaseTypes::REDIS); - } - - #[OA\Post( - summary: 'Create (KeyDB)', - description: 'Create a new KeyDB database.', - path: '/databases/keydb', - operationId: 'create-database-keydb', - security: [ - ['bearerAuth' => []], - ], - tags: ['Databases'], - - requestBody: new OA\RequestBody( - description: 'Database data', - required: true, - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['server_uuid', 'project_uuid', 'environment_name', 'environment_uuid'], - properties: [ - 'server_uuid' => ['type' => 'string', 'description' => 'UUID of the server'], - 'project_uuid' => ['type' => 'string', 'description' => 'UUID of the project'], - 'environment_name' => ['type' => 'string', 'description' => 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'], - 'environment_uuid' => ['type' => 'string', 'description' => 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'], - 'destination_uuid' => ['type' => 'string', 'description' => 'UUID of the destination if the server has multiple destinations'], - 'keydb_password' => ['type' => 'string', 'description' => 'KeyDB password'], - 'keydb_conf' => ['type' => 'string', 'description' => 'KeyDB conf'], - 'name' => ['type' => 'string', 'description' => 'Name of the database'], - 'description' => ['type' => 'string', 'description' => 'Description of the database'], - 'image' => ['type' => 'string', 'description' => 'Docker Image of the database'], - 'is_public' => ['type' => 'boolean', 'description' => 'Is the database public?'], - 'public_port' => ['type' => 'integer', 'description' => 'Public port of the database'], - 'limits_memory' => ['type' => 'string', 'description' => 'Memory limit of the database'], - 'limits_memory_swap' => ['type' => 'string', 'description' => 'Memory swap limit of the database'], - 'limits_memory_swappiness' => ['type' => 'integer', 'description' => 'Memory swappiness of the database'], - 'limits_memory_reservation' => ['type' => 'string', 'description' => 'Memory reservation of the database'], - 'limits_cpus' => ['type' => 'string', 'description' => 'CPU limit of the database'], - 'limits_cpuset' => ['type' => 'string', 'description' => 'CPU set of the database'], - 'limits_cpu_shares' => ['type' => 'integer', 'description' => 'CPU shares of the database'], - 'instant_deploy' => ['type' => 'boolean', 'description' => 'Instant deploy the database'], - ], - ), - ) - ), - responses: [ - new OA\Response( - response: 200, - description: 'Database updated', - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function create_database_keydb(Request $request) - { - return $this->create_database($request, NewDatabaseTypes::KEYDB); - } - - #[OA\Post( - summary: 'Create (MariaDB)', - description: 'Create a new MariaDB database.', - path: '/databases/mariadb', - operationId: 'create-database-mariadb', - security: [ - ['bearerAuth' => []], - ], - tags: ['Databases'], - - requestBody: new OA\RequestBody( - description: 'Database data', - required: true, - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['server_uuid', 'project_uuid', 'environment_name', 'environment_uuid'], - properties: [ - 'server_uuid' => ['type' => 'string', 'description' => 'UUID of the server'], - 'project_uuid' => ['type' => 'string', 'description' => 'UUID of the project'], - 'environment_name' => ['type' => 'string', 'description' => 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'], - 'environment_uuid' => ['type' => 'string', 'description' => 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'], - 'destination_uuid' => ['type' => 'string', 'description' => 'UUID of the destination if the server has multiple destinations'], - 'mariadb_conf' => ['type' => 'string', 'description' => 'MariaDB conf'], - 'mariadb_root_password' => ['type' => 'string', 'description' => 'MariaDB root password'], - 'mariadb_user' => ['type' => 'string', 'description' => 'MariaDB user'], - 'mariadb_password' => ['type' => 'string', 'description' => 'MariaDB password'], - 'mariadb_database' => ['type' => 'string', 'description' => 'MariaDB database'], - 'name' => ['type' => 'string', 'description' => 'Name of the database'], - 'description' => ['type' => 'string', 'description' => 'Description of the database'], - 'image' => ['type' => 'string', 'description' => 'Docker Image of the database'], - 'is_public' => ['type' => 'boolean', 'description' => 'Is the database public?'], - 'public_port' => ['type' => 'integer', 'description' => 'Public port of the database'], - 'limits_memory' => ['type' => 'string', 'description' => 'Memory limit of the database'], - 'limits_memory_swap' => ['type' => 'string', 'description' => 'Memory swap limit of the database'], - 'limits_memory_swappiness' => ['type' => 'integer', 'description' => 'Memory swappiness of the database'], - 'limits_memory_reservation' => ['type' => 'string', 'description' => 'Memory reservation of the database'], - 'limits_cpus' => ['type' => 'string', 'description' => 'CPU limit of the database'], - 'limits_cpuset' => ['type' => 'string', 'description' => 'CPU set of the database'], - 'limits_cpu_shares' => ['type' => 'integer', 'description' => 'CPU shares of the database'], - 'instant_deploy' => ['type' => 'boolean', 'description' => 'Instant deploy the database'], - ], - ), - ) - ), - responses: [ - new OA\Response( - response: 200, - description: 'Database updated', - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function create_database_mariadb(Request $request) - { - return $this->create_database($request, NewDatabaseTypes::MARIADB); - } - - #[OA\Post( - summary: 'Create (MySQL)', - description: 'Create a new MySQL database.', - path: '/databases/mysql', - operationId: 'create-database-mysql', - security: [ - ['bearerAuth' => []], - ], - tags: ['Databases'], - - requestBody: new OA\RequestBody( - description: 'Database data', - required: true, - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['server_uuid', 'project_uuid', 'environment_name', 'environment_uuid'], - properties: [ - 'server_uuid' => ['type' => 'string', 'description' => 'UUID of the server'], - 'project_uuid' => ['type' => 'string', 'description' => 'UUID of the project'], - 'environment_name' => ['type' => 'string', 'description' => 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'], - 'environment_uuid' => ['type' => 'string', 'description' => 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'], - 'destination_uuid' => ['type' => 'string', 'description' => 'UUID of the destination if the server has multiple destinations'], - 'mysql_root_password' => ['type' => 'string', 'description' => 'MySQL root password'], - 'mysql_password' => ['type' => 'string', 'description' => 'MySQL password'], - 'mysql_user' => ['type' => 'string', 'description' => 'MySQL user'], - 'mysql_database' => ['type' => 'string', 'description' => 'MySQL database'], - 'mysql_conf' => ['type' => 'string', 'description' => 'MySQL conf'], - 'name' => ['type' => 'string', 'description' => 'Name of the database'], - 'description' => ['type' => 'string', 'description' => 'Description of the database'], - 'image' => ['type' => 'string', 'description' => 'Docker Image of the database'], - 'is_public' => ['type' => 'boolean', 'description' => 'Is the database public?'], - 'public_port' => ['type' => 'integer', 'description' => 'Public port of the database'], - 'limits_memory' => ['type' => 'string', 'description' => 'Memory limit of the database'], - 'limits_memory_swap' => ['type' => 'string', 'description' => 'Memory swap limit of the database'], - 'limits_memory_swappiness' => ['type' => 'integer', 'description' => 'Memory swappiness of the database'], - 'limits_memory_reservation' => ['type' => 'string', 'description' => 'Memory reservation of the database'], - 'limits_cpus' => ['type' => 'string', 'description' => 'CPU limit of the database'], - 'limits_cpuset' => ['type' => 'string', 'description' => 'CPU set of the database'], - 'limits_cpu_shares' => ['type' => 'integer', 'description' => 'CPU shares of the database'], - 'instant_deploy' => ['type' => 'boolean', 'description' => 'Instant deploy the database'], - ], - ), - ) - ), - responses: [ - new OA\Response( - response: 200, - description: 'Database updated', - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function create_database_mysql(Request $request) - { - return $this->create_database($request, NewDatabaseTypes::MYSQL); - } - - #[OA\Post( - summary: 'Create (MongoDB)', - description: 'Create a new MongoDB database.', - path: '/databases/mongodb', - operationId: 'create-database-mongodb', - security: [ - ['bearerAuth' => []], - ], - tags: ['Databases'], - - requestBody: new OA\RequestBody( - description: 'Database data', - required: true, - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['server_uuid', 'project_uuid', 'environment_name', 'environment_uuid'], - properties: [ - 'server_uuid' => ['type' => 'string', 'description' => 'UUID of the server'], - 'project_uuid' => ['type' => 'string', 'description' => 'UUID of the project'], - 'environment_name' => ['type' => 'string', 'description' => 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.'], - 'environment_uuid' => ['type' => 'string', 'description' => 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.'], - 'destination_uuid' => ['type' => 'string', 'description' => 'UUID of the destination if the server has multiple destinations'], - 'mongo_conf' => ['type' => 'string', 'description' => 'MongoDB conf'], - 'mongo_initdb_root_username' => ['type' => 'string', 'description' => 'MongoDB initdb root username'], - 'name' => ['type' => 'string', 'description' => 'Name of the database'], - 'description' => ['type' => 'string', 'description' => 'Description of the database'], - 'image' => ['type' => 'string', 'description' => 'Docker Image of the database'], - 'is_public' => ['type' => 'boolean', 'description' => 'Is the database public?'], - 'public_port' => ['type' => 'integer', 'description' => 'Public port of the database'], - 'limits_memory' => ['type' => 'string', 'description' => 'Memory limit of the database'], - 'limits_memory_swap' => ['type' => 'string', 'description' => 'Memory swap limit of the database'], - 'limits_memory_swappiness' => ['type' => 'integer', 'description' => 'Memory swappiness of the database'], - 'limits_memory_reservation' => ['type' => 'string', 'description' => 'Memory reservation of the database'], - 'limits_cpus' => ['type' => 'string', 'description' => 'CPU limit of the database'], - 'limits_cpuset' => ['type' => 'string', 'description' => 'CPU set of the database'], - 'limits_cpu_shares' => ['type' => 'integer', 'description' => 'CPU shares of the database'], - 'instant_deploy' => ['type' => 'boolean', 'description' => 'Instant deploy the database'], - ], - ), - ) - ), - responses: [ - new OA\Response( - response: 200, - description: 'Database updated', - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function create_database_mongodb(Request $request) - { - return $this->create_database($request, NewDatabaseTypes::MONGODB); - } - - public function create_database(Request $request, NewDatabaseTypes $type) - { - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'project_uuid', 'environment_name', 'environment_uuid', 'server_uuid', 'destination_uuid', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'postgres_user', 'postgres_password', 'postgres_db', 'postgres_initdb_args', 'postgres_host_auth_method', 'postgres_conf', 'clickhouse_admin_user', 'clickhouse_admin_password', 'dragonfly_password', 'redis_password', 'redis_conf', 'keydb_password', 'keydb_conf', 'mariadb_conf', 'mariadb_root_password', 'mariadb_user', 'mariadb_password', 'mariadb_database', 'mongo_conf', 'mongo_initdb_root_username', 'mongo_initdb_root_password', 'mongo_initdb_database', 'mysql_root_password', 'mysql_password', 'mysql_user', 'mysql_database', 'mysql_conf']; - - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - $return = validateIncomingRequest($request); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if (! empty($extraFields)) { - $errors = collect([]); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - $environmentUuid = $request->environment_uuid; - $environmentName = $request->environment_name; - if (blank($environmentUuid) && blank($environmentName)) { - return response()->json(['message' => 'You need to provide at least one of environment_name or environment_uuid.'], 422); - } - $serverUuid = $request->server_uuid; - $instantDeploy = $request->instant_deploy ?? false; - if ($request->is_public && ! $request->public_port) { - $request->offsetSet('is_public', false); - } - $project = Project::whereTeamId($teamId)->whereUuid($request->project_uuid)->first(); - if (! $project) { - return response()->json(['message' => 'Project not found.'], 404); - } - $environment = $project->environments()->where('name', $environmentName)->first(); - if (! $environment) { - $environment = $project->environments()->where('uuid', $environmentUuid)->first(); - } - if (! $environment) { - return response()->json(['message' => 'You need to provide a valid environment_name or environment_uuid.'], 422); - } - $server = Server::whereTeamId($teamId)->whereUuid($serverUuid)->first(); - if (! $server) { - return response()->json(['message' => 'Server not found.'], 404); - } - $destinations = $server->destinations(); - if ($destinations->count() == 0) { - return response()->json(['message' => 'Server has no destinations.'], 400); - } - if ($destinations->count() > 1 && ! $request->has('destination_uuid')) { - return response()->json(['message' => 'Server has multiple destinations and you do not set destination_uuid.'], 400); - } - $destination = $destinations->first(); - if ($request->has('public_port') && $request->is_public) { - if (isPublicPortAlreadyUsed($server, $request->public_port)) { - return response()->json(['message' => 'Public port already used by another database.'], 400); - } - } - $validator = customApiValidator($request->all(), [ - 'name' => 'string|max:255', - 'description' => 'string|nullable', - 'image' => 'string', - 'project_uuid' => 'string|required', - 'environment_name' => 'string|nullable', - 'environment_uuid' => 'string|nullable', - 'server_uuid' => 'string|required', - 'destination_uuid' => 'string', - 'is_public' => 'boolean', - 'public_port' => 'numeric|nullable', - 'limits_memory' => 'string', - 'limits_memory_swap' => 'string', - 'limits_memory_swappiness' => 'numeric', - 'limits_memory_reservation' => 'string', - 'limits_cpus' => 'string', - 'limits_cpuset' => 'string|nullable', - 'limits_cpu_shares' => 'numeric', - 'instant_deploy' => 'boolean', - ]); - if ($validator->failed()) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $validator->errors(), - ], 422); - } - if ($request->public_port) { - if ($request->public_port < 1024 || $request->public_port > 65535) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'public_port' => 'The public port should be between 1024 and 65535.', - ], - ], 422); - } - } - if ($type === NewDatabaseTypes::POSTGRESQL) { - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'project_uuid', 'environment_name', 'environment_uuid', 'server_uuid', 'destination_uuid', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'postgres_user', 'postgres_password', 'postgres_db', 'postgres_initdb_args', 'postgres_host_auth_method', 'postgres_conf']; - $validator = customApiValidator($request->all(), [ - 'postgres_user' => 'string', - 'postgres_password' => 'string', - 'postgres_db' => 'string', - 'postgres_initdb_args' => 'string', - 'postgres_host_auth_method' => 'string', - 'postgres_conf' => 'string', - ]); - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - removeUnnecessaryFieldsFromRequest($request); - if ($request->has('postgres_conf')) { - if (! isBase64Encoded($request->postgres_conf)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'postgres_conf' => 'The postgres_conf should be base64 encoded.', - ], - ], 422); - } - $postgresConf = base64_decode($request->postgres_conf); - if (mb_detect_encoding($postgresConf, 'ASCII', true) === false) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'postgres_conf' => 'The postgres_conf should be base64 encoded.', - ], - ], 422); - } - $request->offsetSet('postgres_conf', $postgresConf); - } - $database = create_standalone_postgresql($environment->id, $destination->uuid, $request->all()); - if ($instantDeploy) { - StartDatabase::dispatch($database); - } - $database->refresh(); - $payload = [ - 'uuid' => $database->uuid, - 'internal_db_url' => $database->internal_db_url, - ]; - if ($database->is_public && $database->public_port) { - $payload['external_db_url'] = $database->external_db_url; - } - - return response()->json(serializeApiResponse($payload))->setStatusCode(201); - } elseif ($type === NewDatabaseTypes::MARIADB) { - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'project_uuid', 'environment_name', 'environment_uuid', 'server_uuid', 'destination_uuid', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'mariadb_conf', 'mariadb_root_password', 'mariadb_user', 'mariadb_password', 'mariadb_database']; - $validator = customApiValidator($request->all(), [ - 'clickhouse_admin_user' => 'string', - 'clickhouse_admin_password' => 'string', - ]); - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - removeUnnecessaryFieldsFromRequest($request); - if ($request->has('mariadb_conf')) { - if (! isBase64Encoded($request->mariadb_conf)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'mariadb_conf' => 'The mariadb_conf should be base64 encoded.', - ], - ], 422); - } - $mariadbConf = base64_decode($request->mariadb_conf); - if (mb_detect_encoding($mariadbConf, 'ASCII', true) === false) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'mariadb_conf' => 'The mariadb_conf should be base64 encoded.', - ], - ], 422); - } - $request->offsetSet('mariadb_conf', $mariadbConf); - } - $database = create_standalone_mariadb($environment->id, $destination->uuid, $request->all()); - if ($instantDeploy) { - StartDatabase::dispatch($database); - } - - $database->refresh(); - $payload = [ - 'uuid' => $database->uuid, - 'internal_db_url' => $database->internal_db_url, - ]; - if ($database->is_public && $database->public_port) { - $payload['external_db_url'] = $database->external_db_url; - } - - return response()->json(serializeApiResponse($payload))->setStatusCode(201); - } elseif ($type === NewDatabaseTypes::MYSQL) { - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'project_uuid', 'environment_name', 'environment_uuid', 'server_uuid', 'destination_uuid', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'mysql_root_password', 'mysql_password', 'mysql_user', 'mysql_database', 'mysql_conf']; - $validator = customApiValidator($request->all(), [ - 'mysql_root_password' => 'string', - 'mysql_password' => 'string', - 'mysql_user' => 'string', - 'mysql_database' => 'string', - 'mysql_conf' => 'string', - ]); - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - removeUnnecessaryFieldsFromRequest($request); - if ($request->has('mysql_conf')) { - if (! isBase64Encoded($request->mysql_conf)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'mysql_conf' => 'The mysql_conf should be base64 encoded.', - ], - ], 422); - } - $mysqlConf = base64_decode($request->mysql_conf); - if (mb_detect_encoding($mysqlConf, 'ASCII', true) === false) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'mysql_conf' => 'The mysql_conf should be base64 encoded.', - ], - ], 422); - } - $request->offsetSet('mysql_conf', $mysqlConf); - } - $database = create_standalone_mysql($environment->id, $destination->uuid, $request->all()); - if ($instantDeploy) { - StartDatabase::dispatch($database); - } - - $database->refresh(); - $payload = [ - 'uuid' => $database->uuid, - 'internal_db_url' => $database->internal_db_url, - ]; - if ($database->is_public && $database->public_port) { - $payload['external_db_url'] = $database->external_db_url; - } - - return response()->json(serializeApiResponse($payload))->setStatusCode(201); - } elseif ($type === NewDatabaseTypes::REDIS) { - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'project_uuid', 'environment_name', 'environment_uuid', 'server_uuid', 'destination_uuid', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'redis_password', 'redis_conf']; - $validator = customApiValidator($request->all(), [ - 'redis_password' => 'string', - 'redis_conf' => 'string', - ]); - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - removeUnnecessaryFieldsFromRequest($request); - if ($request->has('redis_conf')) { - if (! isBase64Encoded($request->redis_conf)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'redis_conf' => 'The redis_conf should be base64 encoded.', - ], - ], 422); - } - $redisConf = base64_decode($request->redis_conf); - if (mb_detect_encoding($redisConf, 'ASCII', true) === false) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'redis_conf' => 'The redis_conf should be base64 encoded.', - ], - ], 422); - } - $request->offsetSet('redis_conf', $redisConf); - } - $database = create_standalone_redis($environment->id, $destination->uuid, $request->all()); - if ($instantDeploy) { - StartDatabase::dispatch($database); - } - - $database->refresh(); - $payload = [ - 'uuid' => $database->uuid, - 'internal_db_url' => $database->internal_db_url, - ]; - if ($database->is_public && $database->public_port) { - $payload['external_db_url'] = $database->external_db_url; - } - - return response()->json(serializeApiResponse($payload))->setStatusCode(201); - } elseif ($type === NewDatabaseTypes::DRAGONFLY) { - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'project_uuid', 'environment_name', 'environment_uuid', 'server_uuid', 'destination_uuid', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'dragonfly_password']; - $validator = customApiValidator($request->all(), [ - 'dragonfly_password' => 'string', - ]); - - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - - removeUnnecessaryFieldsFromRequest($request); - $database = create_standalone_dragonfly($environment->id, $destination->uuid, $request->all()); - if ($instantDeploy) { - StartDatabase::dispatch($database); - } - - return response()->json(serializeApiResponse([ - 'uuid' => $database->uuid, - ]))->setStatusCode(201); - } elseif ($type === NewDatabaseTypes::KEYDB) { - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'project_uuid', 'environment_name', 'environment_uuid', 'server_uuid', 'destination_uuid', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'keydb_password', 'keydb_conf']; - $validator = customApiValidator($request->all(), [ - 'keydb_password' => 'string', - 'keydb_conf' => 'string', - ]); - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - removeUnnecessaryFieldsFromRequest($request); - if ($request->has('keydb_conf')) { - if (! isBase64Encoded($request->keydb_conf)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'keydb_conf' => 'The keydb_conf should be base64 encoded.', - ], - ], 422); - } - $keydbConf = base64_decode($request->keydb_conf); - if (mb_detect_encoding($keydbConf, 'ASCII', true) === false) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'keydb_conf' => 'The keydb_conf should be base64 encoded.', - ], - ], 422); - } - $request->offsetSet('keydb_conf', $keydbConf); - } - $database = create_standalone_keydb($environment->id, $destination->uuid, $request->all()); - if ($instantDeploy) { - StartDatabase::dispatch($database); - } - - $database->refresh(); - $payload = [ - 'uuid' => $database->uuid, - 'internal_db_url' => $database->internal_db_url, - ]; - if ($database->is_public && $database->public_port) { - $payload['external_db_url'] = $database->external_db_url; - } - - return response()->json(serializeApiResponse($payload))->setStatusCode(201); - } elseif ($type === NewDatabaseTypes::CLICKHOUSE) { - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'project_uuid', 'environment_name', 'environment_uuid', 'server_uuid', 'destination_uuid', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'clickhouse_admin_user', 'clickhouse_admin_password']; - $validator = customApiValidator($request->all(), [ - 'clickhouse_admin_user' => 'string', - 'clickhouse_admin_password' => 'string', - ]); - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - removeUnnecessaryFieldsFromRequest($request); - $database = create_standalone_clickhouse($environment->id, $destination->uuid, $request->all()); - if ($instantDeploy) { - StartDatabase::dispatch($database); - } - - $database->refresh(); - $payload = [ - 'uuid' => $database->uuid, - 'internal_db_url' => $database->internal_db_url, - ]; - if ($database->is_public && $database->public_port) { - $payload['external_db_url'] = $database->external_db_url; - } - - return response()->json(serializeApiResponse($payload))->setStatusCode(201); - } elseif ($type === NewDatabaseTypes::MONGODB) { - $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'project_uuid', 'environment_name', 'environment_uuid', 'server_uuid', 'destination_uuid', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'mongo_conf', 'mongo_initdb_root_username', 'mongo_initdb_root_password', 'mongo_initdb_database']; - $validator = customApiValidator($request->all(), [ - 'mongo_conf' => 'string', - 'mongo_initdb_root_username' => 'string', - 'mongo_initdb_root_password' => 'string', - 'mongo_initdb_database' => 'string', - ]); - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - removeUnnecessaryFieldsFromRequest($request); - if ($request->has('mongo_conf')) { - if (! isBase64Encoded($request->mongo_conf)) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'mongo_conf' => 'The mongo_conf should be base64 encoded.', - ], - ], 422); - } - $mongoConf = base64_decode($request->mongo_conf); - if (mb_detect_encoding($mongoConf, 'ASCII', true) === false) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => [ - 'mongo_conf' => 'The mongo_conf should be base64 encoded.', - ], - ], 422); - } - $request->offsetSet('mongo_conf', $mongoConf); - } - $database = create_standalone_mongodb($environment->id, $destination->uuid, $request->all()); - if ($instantDeploy) { - StartDatabase::dispatch($database); - } - - $database->refresh(); - $payload = [ - 'uuid' => $database->uuid, - 'internal_db_url' => $database->internal_db_url, - ]; - if ($database->is_public && $database->public_port) { - $payload['external_db_url'] = $database->external_db_url; - } - - return response()->json(serializeApiResponse($payload))->setStatusCode(201); - } - - return response()->json(['message' => 'Invalid database type requested.'], 400); - } - - #[OA\Delete( - summary: 'Delete', - description: 'Delete database by UUID.', - path: '/databases/{uuid}', - operationId: 'delete-database-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Databases'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the database.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - new OA\Parameter(name: 'delete_configurations', in: 'query', required: false, description: 'Delete configurations.', schema: new OA\Schema(type: 'boolean', default: true)), - new OA\Parameter(name: 'delete_volumes', in: 'query', required: false, description: 'Delete volumes.', schema: new OA\Schema(type: 'boolean', default: true)), - new OA\Parameter(name: 'docker_cleanup', in: 'query', required: false, description: 'Run docker cleanup.', schema: new OA\Schema(type: 'boolean', default: true)), - new OA\Parameter(name: 'delete_connected_networks', in: 'query', required: false, description: 'Delete connected networks.', schema: new OA\Schema(type: 'boolean', default: true)), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Database deleted.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Database deleted.'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function delete_by_uuid(Request $request) - { - $teamId = getTeamIdFromToken(); - $cleanup = filter_var($request->query->get('cleanup', true), FILTER_VALIDATE_BOOLEAN); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - if (! $request->uuid) { - return response()->json(['message' => 'UUID is required.'], 404); - } - $database = queryDatabaseByUuidWithinTeam($request->uuid, $teamId); - if (! $database) { - return response()->json(['message' => 'Database not found.'], 404); - } - - DeleteResourceJob::dispatch( - resource: $database, - deleteConfigurations: $request->query->get('delete_configurations', true), - deleteVolumes: $request->query->get('delete_volumes', true), - dockerCleanup: $request->query->get('docker_cleanup', true), - deleteConnectedNetworks: $request->query->get('delete_connected_networks', true) - ); - - return response()->json([ - 'message' => 'Database deletion request queued.', - ]); - } - - #[OA\Get( - summary: 'Start', - description: 'Start database. `Post` request is also accepted.', - path: '/databases/{uuid}/start', - operationId: 'start-database-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Databases'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the database.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Start database.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Database starting request queued.'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function action_deploy(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $uuid = $request->route('uuid'); - if (! $uuid) { - return response()->json(['message' => 'UUID is required.'], 400); - } - $database = queryDatabaseByUuidWithinTeam($request->uuid, $teamId); - if (! $database) { - return response()->json(['message' => 'Database not found.'], 404); - } - if (str($database->status)->contains('running')) { - return response()->json(['message' => 'Database is already running.'], 400); - } - StartDatabase::dispatch($database); - - return response()->json( - [ - 'message' => 'Database starting request queued.', - ], - 200 - ); - } - - #[OA\Get( - summary: 'Stop', - description: 'Stop database. `Post` request is also accepted.', - path: '/databases/{uuid}/stop', - operationId: 'stop-database-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Databases'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the database.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Stop database.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Database stopping request queued.'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function action_stop(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $uuid = $request->route('uuid'); - if (! $uuid) { - return response()->json(['message' => 'UUID is required.'], 400); - } - $database = queryDatabaseByUuidWithinTeam($request->uuid, $teamId); - if (! $database) { - return response()->json(['message' => 'Database not found.'], 404); - } - if (str($database->status)->contains('stopped') || str($database->status)->contains('exited')) { - return response()->json(['message' => 'Database is already stopped.'], 400); - } - StopDatabase::dispatch($database); - - return response()->json( - [ - 'message' => 'Database stopping request queued.', - ], - 200 - ); - } - - #[OA\Get( - summary: 'Restart', - description: 'Restart database. `Post` request is also accepted.', - path: '/databases/{uuid}/restart', - operationId: 'restart-database-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Databases'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the database.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Restart database.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Database restaring request queued.'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function action_restart(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $uuid = $request->route('uuid'); - if (! $uuid) { - return response()->json(['message' => 'UUID is required.'], 400); - } - $database = queryDatabaseByUuidWithinTeam($request->uuid, $teamId); - if (! $database) { - return response()->json(['message' => 'Database not found.'], 404); - } - RestartDatabase::dispatch($database); - - return response()->json( - [ - 'message' => 'Database restarting request queued.', - ], - 200 - ); - } -} diff --git a/app/Http/Controllers/Api/DeployController.php b/app/Http/Controllers/Api/DeployController.php deleted file mode 100644 index 73b452f865..0000000000 --- a/app/Http/Controllers/Api/DeployController.php +++ /dev/null @@ -1,317 +0,0 @@ -attributes->get('can_read_sensitive', false) === false) { - $deployment->makeHidden([ - 'logs', - ]); - } - - return serializeApiResponse($deployment); - } - - #[OA\Get( - summary: 'List', - description: 'List currently running deployments', - path: '/deployments', - operationId: 'list-deployments', - security: [ - ['bearerAuth' => []], - ], - tags: ['Deployments'], - responses: [ - new OA\Response( - response: 200, - description: 'Get all currently running deployments.', - content: [ - - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'array', - items: new OA\Items(ref: '#/components/schemas/ApplicationDeploymentQueue'), - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function deployments(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $servers = Server::whereTeamId($teamId)->get(); - $deployments_per_server = ApplicationDeploymentQueue::whereIn('status', ['in_progress', 'queued'])->whereIn('server_id', $servers->pluck('id'))->get()->sortBy('id'); - $deployments_per_server = $deployments_per_server->map(function ($deployment) { - return $this->removeSensitiveData($deployment); - }); - - return response()->json($deployments_per_server); - } - - #[OA\Get( - summary: 'Get', - description: 'Get deployment by UUID.', - path: '/deployments/{uuid}', - operationId: 'get-deployment-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Deployments'], - parameters: [ - new OA\Parameter(name: 'uuid', in: 'path', required: true, description: 'Deployment UUID', schema: new OA\Schema(type: 'string')), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Get deployment by UUID.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - ref: '#/components/schemas/ApplicationDeploymentQueue', - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function deployment_by_uuid(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $uuid = $request->route('uuid'); - if (! $uuid) { - return response()->json(['message' => 'UUID is required.'], 400); - } - $deployment = ApplicationDeploymentQueue::where('deployment_uuid', $uuid)->first(); - if (! $deployment) { - return response()->json(['message' => 'Deployment not found.'], 404); - } - - return response()->json($this->removeSensitiveData($deployment)); - } - - #[OA\Get( - summary: 'Deploy', - description: 'Deploy by tag or uuid. `Post` request also accepted.', - path: '/deploy', - operationId: 'deploy-by-tag-or-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Deployments'], - parameters: [ - new OA\Parameter(name: 'tag', in: 'query', description: 'Tag name(s). Comma separated list is also accepted.', schema: new OA\Schema(type: 'string')), - new OA\Parameter(name: 'uuid', in: 'query', description: 'Resource UUID(s). Comma separated list is also accepted.', schema: new OA\Schema(type: 'string')), - new OA\Parameter(name: 'force', in: 'query', description: 'Force rebuild (without cache)', schema: new OA\Schema(type: 'boolean')), - ], - - responses: [ - new OA\Response( - response: 200, - description: 'Get deployment(s) UUID\'s', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'deployments' => new OA\Property( - property: 'deployments', - type: 'array', - items: new OA\Items( - type: 'object', - properties: [ - 'message' => ['type' => 'string'], - 'resource_uuid' => ['type' => 'string'], - 'deployment_uuid' => ['type' => 'string'], - ] - ), - ), - ], - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - - ] - )] - public function deploy(Request $request) - { - $teamId = getTeamIdFromToken(); - $uuids = $request->query->get('uuid'); - $tags = $request->query->get('tag'); - $force = $request->query->get('force') ?? false; - - if ($uuids && $tags) { - return response()->json(['message' => 'You can only use uuid or tag, not both.'], 400); - } - if (is_null($teamId)) { - return invalidTokenResponse(); - } - if ($tags) { - return $this->by_tags($tags, $teamId, $force); - } elseif ($uuids) { - return $this->by_uuids($uuids, $teamId, $force); - } - - return response()->json(['message' => 'You must provide uuid or tag.'], 400); - } - - private function by_uuids(string $uuid, int $teamId, bool $force = false) - { - $uuids = explode(',', $uuid); - $uuids = collect(array_filter($uuids)); - - if (count($uuids) === 0) { - return response()->json(['message' => 'No UUIDs provided.'], 400); - } - $deployments = collect(); - $payload = collect(); - foreach ($uuids as $uuid) { - $resource = getResourceByUuid($uuid, $teamId); - if ($resource) { - ['message' => $return_message, 'deployment_uuid' => $deployment_uuid] = $this->deploy_resource($resource, $force); - if ($deployment_uuid) { - $deployments->push(['message' => $return_message, 'resource_uuid' => $uuid, 'deployment_uuid' => $deployment_uuid->toString()]); - } else { - $deployments->push(['message' => $return_message, 'resource_uuid' => $uuid]); - } - } - } - if ($deployments->count() > 0) { - $payload->put('deployments', $deployments->toArray()); - - return response()->json(serializeApiResponse($payload->toArray())); - } - - return response()->json(['message' => 'No resources found.'], 404); - } - - public function by_tags(string $tags, int $team_id, bool $force = false) - { - $tags = explode(',', $tags); - $tags = collect(array_filter($tags)); - - if (count($tags) === 0) { - return response()->json(['message' => 'No TAGs provided.'], 400); - } - $message = collect([]); - $deployments = collect(); - $payload = collect(); - foreach ($tags as $tag) { - $found_tag = Tag::where(['name' => $tag, 'team_id' => $team_id])->first(); - if (! $found_tag) { - // $message->push("Tag {$tag} not found."); - continue; - } - $applications = $found_tag->applications()->get(); - $services = $found_tag->services()->get(); - if ($applications->count() === 0 && $services->count() === 0) { - $message->push("No resources found for tag {$tag}."); - - continue; - } - foreach ($applications as $resource) { - ['message' => $return_message, 'deployment_uuid' => $deployment_uuid] = $this->deploy_resource($resource, $force); - if ($deployment_uuid) { - $deployments->push(['resource_uuid' => $resource->uuid, 'deployment_uuid' => $deployment_uuid->toString()]); - } - $message = $message->merge($return_message); - } - foreach ($services as $resource) { - ['message' => $return_message] = $this->deploy_resource($resource, $force); - $message = $message->merge($return_message); - } - } - if ($message->count() > 0) { - $payload->put('message', $message->toArray()); - if ($deployments->count() > 0) { - $payload->put('details', $deployments->toArray()); - } - - return response()->json(serializeApiResponse($payload->toArray())); - } - - return response()->json(['message' => 'No resources found with this tag.'], 404); - } - - public function deploy_resource($resource, bool $force = false): array - { - $message = null; - $deployment_uuid = null; - if (gettype($resource) !== 'object') { - return ['message' => "Resource ($resource) not found.", 'deployment_uuid' => $deployment_uuid]; - } - switch ($resource?->getMorphClass()) { - case \App\Models\Application::class: - $deployment_uuid = new Cuid2; - queue_application_deployment( - application: $resource, - deployment_uuid: $deployment_uuid, - force_rebuild: $force, - ); - $message = "Application {$resource->name} deployment queued."; - break; - case \App\Models\Service::class: - StartService::run($resource); - $message = "Service {$resource->name} started. It could take a while, be patient."; - break; - default: - // Database resource - StartDatabase::dispatch($resource); - $resource->update([ - 'started_at' => now(), - ]); - $message = "Database {$resource->name} started."; - break; - } - - return ['message' => $message, 'deployment_uuid' => $deployment_uuid]; - } -} diff --git a/app/Http/Controllers/Api/OpenApi.php b/app/Http/Controllers/Api/OpenApi.php deleted file mode 100644 index 60337a76cf..0000000000 --- a/app/Http/Controllers/Api/OpenApi.php +++ /dev/null @@ -1,51 +0,0 @@ - []], - ], - responses: [ - new OA\Response( - response: 200, - description: 'Returns the version of the application', - content: new OA\JsonContent( - type: 'string', - example: 'v4.0.0', - )), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function version(Request $request) - { - return response(config('constants.coolify.version')); - } - - #[OA\Get( - summary: 'Enable API', - description: 'Enable API (only with root permissions).', - path: '/enable', - operationId: 'enable-api', - security: [ - ['bearerAuth' => []], - ], - responses: [ - new OA\Response( - response: 200, - description: 'Enable API.', - content: new OA\JsonContent( - type: 'object', - properties: [ - new OA\Property(property: 'message', type: 'string', example: 'API enabled.'), - ] - )), - new OA\Response( - response: 403, - description: 'You are not allowed to enable the API.', - content: new OA\JsonContent( - type: 'object', - properties: [ - new OA\Property(property: 'message', type: 'string', example: 'You are not allowed to enable the API.'), - ] - )), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function enable_api(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - if ($teamId !== '0') { - return response()->json(['message' => 'You are not allowed to enable the API.'], 403); - } - $settings = instanceSettings(); - $settings->update(['is_api_enabled' => true]); - - return response()->json(['message' => 'API enabled.'], 200); - } - - #[OA\Get( - summary: 'Disable API', - description: 'Disable API (only with root permissions).', - path: '/disable', - operationId: 'disable-api', - security: [ - ['bearerAuth' => []], - ], - responses: [ - new OA\Response( - response: 200, - description: 'Disable API.', - content: new OA\JsonContent( - type: 'object', - properties: [ - new OA\Property(property: 'message', type: 'string', example: 'API disabled.'), - ] - )), - new OA\Response( - response: 403, - description: 'You are not allowed to disable the API.', - content: new OA\JsonContent( - type: 'object', - properties: [ - new OA\Property(property: 'message', type: 'string', example: 'You are not allowed to disable the API.'), - ] - )), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function disable_api(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - if ($teamId !== '0') { - return response()->json(['message' => 'You are not allowed to disable the API.'], 403); - } - $settings = instanceSettings(); - $settings->update(['is_api_enabled' => false]); - - return response()->json(['message' => 'API disabled.'], 200); - } - - public function feedback(Request $request) - { - $content = $request->input('content'); - $webhook_url = config('constants.webhooks.feedback_discord_webhook'); - if ($webhook_url) { - Http::post($webhook_url, [ - 'content' => $content, - ]); - } - - return response()->json(['message' => 'Feedback sent.'], 200); - } - - #[OA\Get( - summary: 'Healthcheck', - description: 'Healthcheck endpoint.', - path: '/health', - operationId: 'healthcheck', - responses: [ - new OA\Response( - response: 200, - description: 'Healthcheck endpoint.', - content: new OA\JsonContent( - type: 'string', - example: 'OK', - )), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function healthcheck(Request $request) - { - return 'OK'; - } -} diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php deleted file mode 100644 index b94ce9c67f..0000000000 --- a/app/Http/Controllers/Api/ProjectController.php +++ /dev/null @@ -1,438 +0,0 @@ - []], - ], - tags: ['Projects'], - responses: [ - new OA\Response( - response: 200, - description: 'Get all projects.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'array', - items: new OA\Items(ref: '#/components/schemas/Project') - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function projects(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $projects = Project::whereTeamId($teamId)->select('id', 'name', 'description', 'uuid')->get(); - - return response()->json(serializeApiResponse($projects), - ); - } - - #[OA\Get( - summary: 'Get', - description: 'Get project by UUID.', - path: '/projects/{uuid}', - operationId: 'get-project-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Projects'], - parameters: [ - new OA\Parameter(name: 'uuid', in: 'path', required: true, description: 'Project UUID', schema: new OA\Schema(type: 'string')), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Project details', - content: new OA\JsonContent(ref: '#/components/schemas/Project')), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - description: 'Project not found.', - ), - ] - )] - public function project_by_uuid(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $project = Project::whereTeamId($teamId)->whereUuid(request()->uuid)->first(); - if (! $project) { - return response()->json(['message' => 'Project not found.'], 404); - } - - $project->load(['environments']); - - return response()->json( - serializeApiResponse($project), - ); - } - - #[OA\Get( - summary: 'Environment', - description: 'Get environment by name or UUID.', - path: '/projects/{uuid}/{environment_name_or_uuid}', - operationId: 'get-environment-by-name-or-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Projects'], - parameters: [ - new OA\Parameter(name: 'uuid', in: 'path', required: true, description: 'Project UUID', schema: new OA\Schema(type: 'string')), - new OA\Parameter(name: 'environment_name_or_uuid', in: 'path', required: true, description: 'Environment name or UUID', schema: new OA\Schema(type: 'string')), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Environment details', - content: new OA\JsonContent(ref: '#/components/schemas/Environment')), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function environment_details(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - if (! $request->uuid) { - return response()->json(['message' => 'UUID is required.'], 422); - } - if (! $request->environment_name_or_uuid) { - return response()->json(['message' => 'Environment name or UUID is required.'], 422); - } - $project = Project::whereTeamId($teamId)->whereUuid($request->uuid)->first(); - if (! $project) { - return response()->json(['message' => 'Project not found.'], 404); - } - $environment = $project->environments()->whereName($request->environment_name_or_uuid)->first(); - if (! $environment) { - $environment = $project->environments()->whereUuid($request->environment_name_or_uuid)->first(); - } - if (! $environment) { - return response()->json(['message' => 'Environment not found.'], 404); - } - $environment = $environment->load(['applications', 'postgresqls', 'redis', 'mongodbs', 'mysqls', 'mariadbs', 'services']); - - return response()->json(serializeApiResponse($environment)); - } - - #[OA\Post( - summary: 'Create', - description: 'Create Project.', - path: '/projects', - operationId: 'create-project', - security: [ - ['bearerAuth' => []], - ], - tags: ['Projects'], - requestBody: new OA\RequestBody( - required: true, - description: 'Project created.', - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'name' => ['type' => 'string', 'description' => 'The name of the project.'], - 'description' => ['type' => 'string', 'description' => 'The description of the project.'], - ], - ), - ), - ), - responses: [ - new OA\Response( - response: 201, - description: 'Project created.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'uuid' => ['type' => 'string', 'example' => 'og888os', 'description' => 'The UUID of the project.'], - ] - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function create_project(Request $request) - { - $allowedFields = ['name', 'description']; - - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - $return = validateIncomingRequest($request); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - $validator = customApiValidator($request->all(), [ - 'name' => 'string|max:255|required', - 'description' => 'string|nullable', - ]); - - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - - $project = Project::create([ - 'name' => $request->name, - 'description' => $request->description, - 'team_id' => $teamId, - ]); - - return response()->json([ - 'uuid' => $project->uuid, - ])->setStatusCode(201); - } - - #[OA\Patch( - summary: 'Update', - description: 'Update Project.', - path: '/projects/{uuid}', - operationId: 'update-project-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Projects'], - requestBody: new OA\RequestBody( - required: true, - description: 'Project updated.', - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'name' => ['type' => 'string', 'description' => 'The name of the project.'], - 'description' => ['type' => 'string', 'description' => 'The description of the project.'], - ], - ), - ), - ), - responses: [ - new OA\Response( - response: 201, - description: 'Project updated.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'uuid' => ['type' => 'string', 'example' => 'og888os'], - 'name' => ['type' => 'string', 'example' => 'Project Name'], - 'description' => ['type' => 'string', 'example' => 'Project Description'], - ] - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function update_project(Request $request) - { - $allowedFields = ['name', 'description']; - - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - $return = validateIncomingRequest($request); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - $validator = customApiValidator($request->all(), [ - 'name' => 'string|max:255|nullable', - 'description' => 'string|nullable', - ]); - - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - $uuid = $request->uuid; - if (! $uuid) { - return response()->json(['message' => 'UUID is required.'], 422); - } - - $project = Project::whereTeamId($teamId)->whereUuid($uuid)->first(); - if (! $project) { - return response()->json(['message' => 'Project not found.'], 404); - } - - $project->update($request->only($allowedFields)); - - return response()->json([ - 'uuid' => $project->uuid, - 'name' => $project->name, - 'description' => $project->description, - ])->setStatusCode(201); - } - - #[OA\Delete( - summary: 'Delete', - description: 'Delete project by UUID.', - path: '/projects/{uuid}', - operationId: 'delete-project-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Projects'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the application.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Project deleted.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Project deleted.'], - ] - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function delete_project(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - if (! $request->uuid) { - return response()->json(['message' => 'UUID is required.'], 422); - } - $project = Project::whereTeamId($teamId)->whereUuid($request->uuid)->first(); - if (! $project) { - return response()->json(['message' => 'Project not found.'], 404); - } - if (! $project->isEmpty()) { - return response()->json(['message' => 'Project has resources, so it cannot be deleted.'], 400); - } - - $project->delete(); - - return response()->json(['message' => 'Project deleted.']); - } -} diff --git a/app/Http/Controllers/Api/ResourcesController.php b/app/Http/Controllers/Api/ResourcesController.php deleted file mode 100644 index ad12c83ab8..0000000000 --- a/app/Http/Controllers/Api/ResourcesController.php +++ /dev/null @@ -1,64 +0,0 @@ - []], - ], - tags: ['Resources'], - responses: [ - new OA\Response( - response: 200, - description: 'Get all resources', - content: new OA\JsonContent( - type: 'string', - example: 'Content is very complex. Will be implemented later.', - ), - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function resources(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $projects = Project::where('team_id', $teamId)->get(); - $resources = collect(); - $resources->push($projects->pluck('applications')->flatten()); - $resources->push($projects->pluck('services')->flatten()); - foreach (collect(DATABASE_TYPES) as $db) { - $resources->push($projects->pluck(str($db)->plural(2))->flatten()); - } - $resources = $resources->flatten(); - $resources = $resources->map(function ($resource) { - $payload = $resource->toArray(); - $payload['status'] = $resource->status; - $payload['type'] = $resource->type(); - - return $payload; - }); - - return response()->json(serializeApiResponse($resources)); - } -} diff --git a/app/Http/Controllers/Api/SecurityController.php b/app/Http/Controllers/Api/SecurityController.php deleted file mode 100644 index fdd46b1001..0000000000 --- a/app/Http/Controllers/Api/SecurityController.php +++ /dev/null @@ -1,393 +0,0 @@ -attributes->get('can_read_sensitive', false) === false) { - $team->makeHidden([ - 'private_key', - ]); - } - - return serializeApiResponse($team); - } - - #[OA\Get( - summary: 'List', - description: 'List all private keys.', - path: '/security/keys', - operationId: 'list-private-keys', - security: [ - ['bearerAuth' => []], - ], - tags: ['Private Keys'], - responses: [ - new OA\Response( - response: 200, - description: 'Get all private keys.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'array', - items: new OA\Items(ref: '#/components/schemas/PrivateKey') - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function keys(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $keys = PrivateKey::where('team_id', $teamId)->get(); - - return response()->json($this->removeSensitiveData($keys)); - } - - #[OA\Get( - summary: 'Get', - description: 'Get key by UUID.', - path: '/security/keys/{uuid}', - operationId: 'get-private-key-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Private Keys'], - parameters: [ - new OA\Parameter(name: 'uuid', in: 'path', required: true, description: 'Private Key UUID', schema: new OA\Schema(type: 'string')), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Get all private keys.', - content: new OA\JsonContent(ref: '#/components/schemas/PrivateKey') - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - description: 'Private Key not found.', - ), - ] - )] - public function key_by_uuid(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - $key = PrivateKey::where('team_id', $teamId)->where('uuid', $request->uuid)->first(); - - if (is_null($key)) { - return response()->json([ - 'message' => 'Private Key not found.', - ], 404); - } - - return response()->json($this->removeSensitiveData($key)); - } - - #[OA\Post( - summary: 'Create', - description: 'Create a new private key.', - path: '/security/keys', - operationId: 'create-private-key', - security: [ - ['bearerAuth' => []], - ], - tags: ['Private Keys'], - requestBody: new OA\RequestBody( - required: true, - content: [ - 'application/json' => new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['private_key'], - properties: [ - 'name' => ['type' => 'string'], - 'description' => ['type' => 'string'], - 'private_key' => ['type' => 'string'], - ], - additionalProperties: false, - ) - ), - ] - ), - responses: [ - new OA\Response( - response: 201, - description: 'The created private key\'s UUID.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'uuid' => ['type' => 'string'], - ] - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function create_key(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $return = validateIncomingRequest($request); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - $validator = customApiValidator($request->all(), [ - 'name' => 'string|max:255', - 'description' => 'string|max:255', - 'private_key' => 'required|string', - ]); - - if ($validator->fails()) { - $errors = $validator->errors(); - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - if (! $request->name) { - $request->offsetSet('name', generate_random_name()); - } - if (! $request->description) { - $request->offsetSet('description', 'Created by Coolify via API'); - } - - $isPrivateKeyString = str_starts_with($request->private_key, '-----BEGIN'); - if (! $isPrivateKeyString) { - try { - $base64PrivateKey = base64_decode($request->private_key); - $request->offsetSet('private_key', $base64PrivateKey); - } catch (\Exception $e) { - return response()->json([ - 'message' => 'Invalid private key.', - ], 422); - } - } - $isPrivateKeyValid = PrivateKey::validatePrivateKey($request->private_key); - if (! $isPrivateKeyValid) { - return response()->json([ - 'message' => 'Invalid private key.', - ], 422); - } - $fingerPrint = PrivateKey::generateFingerprint($request->private_key); - $isFingerPrintExists = PrivateKey::fingerprintExists($fingerPrint); - if ($isFingerPrintExists) { - return response()->json([ - 'message' => 'Private key already exists.', - ], 422); - } - $key = PrivateKey::create([ - 'team_id' => $teamId, - 'name' => $request->name, - 'description' => $request->description, - 'private_key' => $request->private_key, - ]); - - return response()->json(serializeApiResponse([ - 'uuid' => $key->uuid, - ]))->setStatusCode(201); - } - - #[OA\Patch( - summary: 'Update', - description: 'Update a private key.', - path: '/security/keys', - operationId: 'update-private-key', - security: [ - ['bearerAuth' => []], - ], - tags: ['Private Keys'], - requestBody: new OA\RequestBody( - required: true, - content: [ - 'application/json' => new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['private_key'], - properties: [ - 'name' => ['type' => 'string'], - 'description' => ['type' => 'string'], - 'private_key' => ['type' => 'string'], - ], - additionalProperties: false, - ) - ), - ] - ), - responses: [ - new OA\Response( - response: 201, - description: 'The updated private key\'s UUID.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'uuid' => ['type' => 'string'], - ] - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function update_key(Request $request) - { - $allowedFields = ['name', 'description', 'private_key']; - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $return = validateIncomingRequest($request); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - - $validator = customApiValidator($request->all(), [ - 'name' => 'string|max:255', - 'description' => 'string|max:255', - 'private_key' => 'required|string', - ]); - - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - $foundKey = PrivateKey::where('team_id', $teamId)->where('uuid', $request->uuid)->first(); - if (is_null($foundKey)) { - return response()->json([ - 'message' => 'Private Key not found.', - ], 404); - } - $foundKey->update($request->all()); - - return response()->json(serializeApiResponse([ - 'uuid' => $foundKey->uuid, - ]))->setStatusCode(201); - } - - #[OA\Delete( - summary: 'Delete', - description: 'Delete a private key.', - path: '/security/keys/{uuid}', - operationId: 'delete-private-key-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Private Keys'], - parameters: [ - new OA\Parameter(name: 'uuid', in: 'path', required: true, description: 'Private Key UUID', schema: new OA\Schema(type: 'string')), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Private Key deleted.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Private Key deleted.'], - ] - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - description: 'Private Key not found.', - ), - ] - )] - public function delete_key(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - if (! $request->uuid) { - return response()->json(['message' => 'UUID is required.'], 422); - } - - $key = PrivateKey::where('team_id', $teamId)->where('uuid', $request->uuid)->first(); - if (is_null($key)) { - return response()->json(['message' => 'Private Key not found.'], 404); - } - $key->forceDelete(); - - return response()->json([ - 'message' => 'Private Key deleted.', - ]); - } -} diff --git a/app/Http/Controllers/Api/ServersController.php b/app/Http/Controllers/Api/ServersController.php deleted file mode 100644 index a9a0a2e536..0000000000 --- a/app/Http/Controllers/Api/ServersController.php +++ /dev/null @@ -1,814 +0,0 @@ -attributes->get('can_read_sensitive', false) === false) { - $settings = $settings->makeHidden([ - 'sentinel_token', - ]); - } - - return serializeApiResponse($settings); - } - - private function removeSensitiveData($server) - { - $server->makeHidden([ - 'id', - ]); - if (request()->attributes->get('can_read_sensitive', false) === false) { - // Do nothing - } - - return serializeApiResponse($server); - } - - #[OA\Get( - summary: 'List', - description: 'List all servers.', - path: '/servers', - operationId: 'list-servers', - security: [ - ['bearerAuth' => []], - ], - tags: ['Servers'], - responses: [ - new OA\Response( - response: 200, - description: 'Get all servers.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'array', - items: new OA\Items(ref: '#/components/schemas/Server') - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function servers(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $servers = ModelsServer::whereTeamId($teamId)->select('id', 'name', 'uuid', 'ip', 'user', 'port', 'description')->get()->load(['settings'])->map(function ($server) { - $server['is_reachable'] = $server->settings->is_reachable; - $server['is_usable'] = $server->settings->is_usable; - - return $server; - }); - $servers = $servers->map(function ($server) { - $settings = $this->removeSensitiveDataFromSettings($server->settings); - $server = $this->removeSensitiveData($server); - data_set($server, 'settings', $settings); - - return $server; - }); - - return response()->json($servers); - } - - #[OA\Get( - summary: 'Get', - description: 'Get server by UUID.', - path: '/servers/{uuid}', - operationId: 'get-server-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Servers'], - parameters: [ - new OA\Parameter(name: 'uuid', in: 'path', required: true, description: 'Server\'s UUID', schema: new OA\Schema(type: 'string')), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Get server by UUID', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - ref: '#/components/schemas/Server' - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function server_by_uuid(Request $request) - { - $with_resources = $request->query('resources'); - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $server = ModelsServer::whereTeamId($teamId)->whereUuid(request()->uuid)->first(); - if (is_null($server)) { - return response()->json(['message' => 'Server not found.'], 404); - } - if ($with_resources) { - $server['resources'] = $server->definedResources()->map(function ($resource) { - $payload = [ - 'id' => $resource->id, - 'uuid' => $resource->uuid, - 'name' => $resource->name, - 'type' => $resource->type(), - 'created_at' => $resource->created_at, - 'updated_at' => $resource->updated_at, - ]; - $payload['status'] = $resource->status; - - return $payload; - }); - } else { - $server->load(['settings']); - } - - $settings = $this->removeSensitiveDataFromSettings($server->settings); - $server = $this->removeSensitiveData($server); - data_set($server, 'settings', $settings); - - return response()->json(serializeApiResponse($server)); - } - - #[OA\Get( - summary: 'Resources', - description: 'Get resources by server.', - path: '/servers/{uuid}/resources', - operationId: 'get-resources-by-server-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Servers'], - parameters: [ - new OA\Parameter(name: 'uuid', in: 'path', required: true, description: 'Server\'s UUID', schema: new OA\Schema(type: 'string')), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Get resources by server', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'array', - items: new OA\Items( - type: 'object', - properties: [ - 'id' => ['type' => 'integer'], - 'uuid' => ['type' => 'string'], - 'name' => ['type' => 'string'], - 'type' => ['type' => 'string'], - 'created_at' => ['type' => 'string'], - 'updated_at' => ['type' => 'string'], - 'status' => ['type' => 'string'], - ] - ) - )), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function resources_by_server(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $server = ModelsServer::whereTeamId($teamId)->whereUuid(request()->uuid)->first(); - if (is_null($server)) { - return response()->json(['message' => 'Server not found.'], 404); - } - $server['resources'] = $server->definedResources()->map(function ($resource) { - $payload = [ - 'id' => $resource->id, - 'uuid' => $resource->uuid, - 'name' => $resource->name, - 'type' => $resource->type(), - 'created_at' => $resource->created_at, - 'updated_at' => $resource->updated_at, - ]; - $payload['status'] = $resource->status; - - return $payload; - }); - $server = $this->removeSensitiveData($server); - - return response()->json(serializeApiResponse(data_get($server, 'resources'))); - } - - #[OA\Get( - summary: 'Domains', - description: 'Get domains by server.', - path: '/servers/{uuid}/domains', - operationId: 'get-domains-by-server-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Servers'], - parameters: [ - new OA\Parameter(name: 'uuid', in: 'path', required: true, description: 'Server\'s UUID', schema: new OA\Schema(type: 'string')), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Get domains by server', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'array', - items: new OA\Items( - type: 'object', - properties: [ - 'ip' => ['type' => 'string'], - 'domains' => ['type' => 'array', 'items' => ['type' => 'string']], - ] - ) - )), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function domains_by_server(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $uuid = $request->get('uuid'); - if ($uuid) { - $domains = Application::getDomainsByUuid($uuid); - - return response()->json(serializeApiResponse($domains)); - } - $projects = Project::where('team_id', $teamId)->get(); - $domains = collect(); - $applications = $projects->pluck('applications')->flatten(); - $settings = instanceSettings(); - if ($applications->count() > 0) { - foreach ($applications as $application) { - $ip = $application->destination->server->ip; - $fqdn = str($application->fqdn)->explode(',')->map(function ($fqdn) { - $f = str($fqdn)->replace('http://', '')->replace('https://', '')->explode('/'); - - return str(str($f[0])->explode(':')[0]); - })->filter(function (Stringable $fqdn) { - return $fqdn->isNotEmpty(); - }); - - if ($ip === 'host.docker.internal') { - if ($settings->public_ipv4) { - $domains->push([ - 'domain' => $fqdn, - 'ip' => $settings->public_ipv4, - ]); - } - if ($settings->public_ipv6) { - $domains->push([ - 'domain' => $fqdn, - 'ip' => $settings->public_ipv6, - ]); - } - if (! $settings->public_ipv4 && ! $settings->public_ipv6) { - $domains->push([ - 'domain' => $fqdn, - 'ip' => $ip, - ]); - } - } else { - $domains->push([ - 'domain' => $fqdn, - 'ip' => $ip, - ]); - } - } - } - $services = $projects->pluck('services')->flatten(); - if ($services->count() > 0) { - foreach ($services as $service) { - $service_applications = $service->applications; - if ($service_applications->count() > 0) { - foreach ($service_applications as $application) { - $fqdn = str($application->fqdn)->explode(',')->map(function ($fqdn) { - $f = str($fqdn)->replace('http://', '')->replace('https://', '')->explode('/'); - - return str(str($f[0])->explode(':')[0]); - })->filter(function (Stringable $fqdn) { - return $fqdn->isNotEmpty(); - }); - if ($ip === 'host.docker.internal') { - if ($settings->public_ipv4) { - $domains->push([ - 'domain' => $fqdn, - 'ip' => $settings->public_ipv4, - ]); - } - if ($settings->public_ipv6) { - $domains->push([ - 'domain' => $fqdn, - 'ip' => $settings->public_ipv6, - ]); - } - if (! $settings->public_ipv4 && ! $settings->public_ipv6) { - $domains->push([ - 'domain' => $fqdn, - 'ip' => $ip, - ]); - } - } else { - $domains->push([ - 'domain' => $fqdn, - 'ip' => $ip, - ]); - } - } - } - } - } - $domains = $domains->groupBy('ip')->map(function ($domain) { - return $domain->pluck('domain')->flatten(); - })->map(function ($domain, $ip) { - return [ - 'ip' => $ip, - 'domains' => $domain, - ]; - })->values(); - - return response()->json(serializeApiResponse($domains)); - } - - #[OA\Post( - summary: 'Create', - description: 'Create Server.', - path: '/servers', - operationId: 'create-server', - security: [ - ['bearerAuth' => []], - ], - tags: ['Servers'], - requestBody: new OA\RequestBody( - required: true, - description: 'Server created.', - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'name' => ['type' => 'string', 'example' => 'My Server', 'description' => 'The name of the server.'], - 'description' => ['type' => 'string', 'example' => 'My Server Description', 'description' => 'The description of the server.'], - 'ip' => ['type' => 'string', 'example' => '127.0.0.1', 'description' => 'The IP of the server.'], - 'port' => ['type' => 'integer', 'example' => 22, 'description' => 'The port of the server.'], - 'user' => ['type' => 'string', 'example' => 'root', 'description' => 'The user of the server.'], - 'private_key_uuid' => ['type' => 'string', 'example' => 'og888os', 'description' => 'The UUID of the private key.'], - 'is_build_server' => ['type' => 'boolean', 'example' => false, 'description' => 'Is build server.'], - 'instant_validate' => ['type' => 'boolean', 'example' => false, 'description' => 'Instant validate.'], - 'proxy_type' => ['type' => 'string', 'enum' => ['traefik', 'caddy', 'none'], 'example' => 'traefik', 'description' => 'The proxy type.'], - ], - ), - ), - ), - responses: [ - new OA\Response( - response: 201, - description: 'Server created.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'uuid' => ['type' => 'string', 'example' => 'og888os', 'description' => 'The UUID of the server.'], - ] - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function create_server(Request $request) - { - $allowedFields = ['name', 'description', 'ip', 'port', 'user', 'private_key_uuid', 'is_build_server', 'instant_validate', 'proxy_type']; - - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - $return = validateIncomingRequest($request); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - $validator = customApiValidator($request->all(), [ - 'name' => 'string|max:255', - 'description' => 'string|nullable', - 'ip' => 'string|required', - 'port' => 'integer|nullable', - 'private_key_uuid' => 'string|required', - 'user' => 'string|nullable', - 'is_build_server' => 'boolean|nullable', - 'instant_validate' => 'boolean|nullable', - 'proxy_type' => 'string|nullable', - ]); - - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - if (! $request->name) { - $request->offsetSet('name', generate_random_name()); - } - if (! $request->user) { - $request->offsetSet('user', 'root'); - } - if (is_null($request->port)) { - $request->offsetSet('port', 22); - } - if (is_null($request->is_build_server)) { - $request->offsetSet('is_build_server', false); - } - if (is_null($request->instant_validate)) { - $request->offsetSet('instant_validate', false); - } - if ($request->proxy_type) { - $validProxyTypes = collect(ProxyTypes::cases())->map(function ($proxyType) { - return str($proxyType->value)->lower(); - }); - if (! $validProxyTypes->contains(str($request->proxy_type)->lower())) { - return response()->json(['message' => 'Invalid proxy type.'], 422); - } - } - $privateKey = PrivateKey::whereTeamId($teamId)->whereUuid($request->private_key_uuid)->first(); - if (! $privateKey) { - return response()->json(['message' => 'Private key not found.'], 404); - } - $allServers = ModelsServer::whereIp($request->ip)->get(); - if ($allServers->count() > 0) { - return response()->json(['message' => 'Server with this IP already exists.'], 400); - } - - $proxyType = $request->proxy_type ? str($request->proxy_type)->upper() : ProxyTypes::TRAEFIK->value; - - $server = ModelsServer::create([ - 'name' => $request->name, - 'description' => $request->description, - 'ip' => $request->ip, - 'port' => $request->port, - 'user' => $request->user, - 'private_key_id' => $privateKey->id, - 'team_id' => $teamId, - ]); - $server->proxy->set('type', $proxyType); - $server->proxy->set('status', ProxyStatus::EXITED->value); - $server->save(); - - $server->settings()->update([ - 'is_build_server' => $request->is_build_server, - ]); - if ($request->instant_validate) { - ValidateServer::dispatch($server); - } - - return response()->json([ - 'uuid' => $server->uuid, - ])->setStatusCode(201); - } - - #[OA\Patch( - summary: 'Update', - description: 'Update Server.', - path: '/servers/{uuid}', - operationId: 'update-server-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Servers'], - parameters: [ - new OA\Parameter(name: 'uuid', in: 'path', required: true, description: 'Server UUID', schema: new OA\Schema(type: 'string')), - ], - requestBody: new OA\RequestBody( - required: true, - description: 'Server updated.', - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'name' => ['type' => 'string', 'description' => 'The name of the server.'], - 'description' => ['type' => 'string', 'description' => 'The description of the server.'], - 'ip' => ['type' => 'string', 'description' => 'The IP of the server.'], - 'port' => ['type' => 'integer', 'description' => 'The port of the server.'], - 'user' => ['type' => 'string', 'description' => 'The user of the server.'], - 'private_key_uuid' => ['type' => 'string', 'description' => 'The UUID of the private key.'], - 'is_build_server' => ['type' => 'boolean', 'description' => 'Is build server.'], - 'instant_validate' => ['type' => 'boolean', 'description' => 'Instant validate.'], - 'proxy_type' => ['type' => 'string', 'enum' => ['traefik', 'caddy', 'none'], 'description' => 'The proxy type.'], - ], - ), - ), - ), - responses: [ - new OA\Response( - response: 201, - description: 'Server updated.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - ref: '#/components/schemas/Server' - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function update_server(Request $request) - { - $allowedFields = ['name', 'description', 'ip', 'port', 'user', 'private_key_uuid', 'is_build_server', 'instant_validate', 'proxy_type']; - - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - $return = validateIncomingRequest($request); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - $validator = customApiValidator($request->all(), [ - 'name' => 'string|max:255|nullable', - 'description' => 'string|nullable', - 'ip' => 'string|nullable', - 'port' => 'integer|nullable', - 'private_key_uuid' => 'string|nullable', - 'user' => 'string|nullable', - 'is_build_server' => 'boolean|nullable', - 'instant_validate' => 'boolean|nullable', - 'proxy_type' => 'string|nullable', - ]); - - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - $server = ModelsServer::whereTeamId($teamId)->whereUuid($request->uuid)->first(); - if (! $server) { - return response()->json(['message' => 'Server not found.'], 404); - } - if ($request->proxy_type) { - $validProxyTypes = collect(ProxyTypes::cases())->map(function ($proxyType) { - return str($proxyType->value)->lower(); - }); - if ($validProxyTypes->contains(str($request->proxy_type)->lower())) { - $server->changeProxy($request->proxy_type, async: true); - } else { - return response()->json(['message' => 'Invalid proxy type.'], 422); - } - } - $server->update($request->only(['name', 'description', 'ip', 'port', 'user'])); - if ($request->is_build_server) { - $server->settings()->update([ - 'is_build_server' => $request->is_build_server, - ]); - } - if ($request->instant_validate) { - ValidateServer::dispatch($server); - } - - return response()->json([ - 'uuid' => $server->uuid, - ])->setStatusCode(201); - } - - #[OA\Delete( - summary: 'Delete', - description: 'Delete server by UUID.', - path: '/servers/{uuid}', - operationId: 'delete-server-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Servers'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the server.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Server deleted.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Server deleted.'], - ] - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function delete_server(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - if (! $request->uuid) { - return response()->json(['message' => 'Uuid is required.'], 422); - } - $server = ModelsServer::whereTeamId($teamId)->whereUuid($request->uuid)->first(); - - if (! $server) { - return response()->json(['message' => 'Server not found.'], 404); - } - if ($server->definedResources()->count() > 0) { - return response()->json(['message' => 'Server has resources, so you need to delete them before.'], 400); - } - if ($server->isLocalhost()) { - return response()->json(['message' => 'Local server cannot be deleted.'], 400); - } - $server->delete(); - DeleteServer::dispatch($server); - - return response()->json(['message' => 'Server deleted.']); - } - - #[OA\Get( - summary: 'Validate', - description: 'Validate server by UUID.', - path: '/servers/{uuid}/validate', - operationId: 'validate-server-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Servers'], - parameters: [ - new OA\Parameter(name: 'uuid', in: 'path', required: true, description: 'Server UUID', schema: new OA\Schema(type: 'string')), - ], - responses: [ - new OA\Response( - response: 201, - description: 'Server validation started.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Validation started.'], - ] - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function validate_server(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - if (! $request->uuid) { - return response()->json(['message' => 'Uuid is required.'], 422); - } - $server = ModelsServer::whereTeamId($teamId)->whereUuid($request->uuid)->first(); - - if (! $server) { - return response()->json(['message' => 'Server not found.'], 404); - } - ValidateServer::dispatch($server); - - return response()->json(['message' => 'Validation started.']); - } -} diff --git a/app/Http/Controllers/Api/ServicesController.php b/app/Http/Controllers/Api/ServicesController.php deleted file mode 100644 index 03d9d209cc..0000000000 --- a/app/Http/Controllers/Api/ServicesController.php +++ /dev/null @@ -1,1261 +0,0 @@ -makeHidden([ - 'id', - 'resourceable', - 'resourceable_id', - 'resourceable_type', - ]); - if (request()->attributes->get('can_read_sensitive', false) === false) { - $service->makeHidden([ - 'docker_compose_raw', - 'docker_compose', - 'value', - 'real_value', - ]); - } - - return serializeApiResponse($service); - } - - #[OA\Get( - summary: 'List', - description: 'List all services.', - path: '/services', - operationId: 'list-services', - security: [ - ['bearerAuth' => []], - ], - tags: ['Services'], - responses: [ - new OA\Response( - response: 200, - description: 'Get all services', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'array', - items: new OA\Items(ref: '#/components/schemas/Service') - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function services(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $projects = Project::where('team_id', $teamId)->get(); - $services = collect(); - foreach ($projects as $project) { - $services->push($project->services()->get()); - } - foreach ($services as $service) { - $service = $this->removeSensitiveData($service); - } - - return response()->json($services->flatten()); - } - - #[OA\Post( - summary: 'Create', - description: 'Create a one-click service', - path: '/services', - operationId: 'create-service', - security: [ - ['bearerAuth' => []], - ], - tags: ['Services'], - requestBody: new OA\RequestBody( - required: true, - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['server_uuid', 'project_uuid', 'environment_name', 'environment_uuid', 'type'], - properties: [ - 'type' => [ - 'description' => 'The one-click service type', - 'type' => 'string', - 'enum' => [ - 'activepieces', - 'appsmith', - 'appwrite', - 'authentik', - 'babybuddy', - 'budge', - 'changedetection', - 'chatwoot', - 'classicpress-with-mariadb', - 'classicpress-with-mysql', - 'classicpress-without-database', - 'cloudflared', - 'code-server', - 'dashboard', - 'directus', - 'directus-with-postgresql', - 'docker-registry', - 'docuseal', - 'docuseal-with-postgres', - 'dokuwiki', - 'duplicati', - 'emby', - 'embystat', - 'fider', - 'filebrowser', - 'firefly', - 'formbricks', - 'ghost', - 'gitea', - 'gitea-with-mariadb', - 'gitea-with-mysql', - 'gitea-with-postgresql', - 'glance', - 'glances', - 'glitchtip', - 'grafana', - 'grafana-with-postgresql', - 'grocy', - 'heimdall', - 'homepage', - 'jellyfin', - 'kuzzle', - 'listmonk', - 'logto', - 'mediawiki', - 'meilisearch', - 'metabase', - 'metube', - 'minio', - 'moodle', - 'n8n', - 'n8n-with-postgresql', - 'next-image-transformation', - 'nextcloud', - 'nocodb', - 'odoo', - 'openblocks', - 'pairdrop', - 'penpot', - 'phpmyadmin', - 'pocketbase', - 'posthog', - 'reactive-resume', - 'rocketchat', - 'shlink', - 'slash', - 'snapdrop', - 'statusnook', - 'stirling-pdf', - 'supabase', - 'syncthing', - 'tolgee', - 'trigger', - 'trigger-with-external-database', - 'twenty', - 'umami', - 'unleash-with-postgresql', - 'unleash-without-database', - 'uptime-kuma', - 'vaultwarden', - 'vikunja', - 'weblate', - 'whoogle', - 'wordpress-with-mariadb', - 'wordpress-with-mysql', - 'wordpress-without-database', - ], - ], - 'name' => ['type' => 'string', 'maxLength' => 255, 'description' => 'Name of the service.'], - 'description' => ['type' => 'string', 'nullable' => true, 'description' => 'Description of the service.'], - 'project_uuid' => ['type' => 'string', 'description' => 'Project UUID.'], - 'environment_name' => ['type' => 'string', 'description' => 'Environment name. You need to provide at least one of environment_name or environment_uuid.'], - 'environment_uuid' => ['type' => 'string', 'description' => 'Environment UUID. You need to provide at least one of environment_name or environment_uuid.'], - 'server_uuid' => ['type' => 'string', 'description' => 'Server UUID.'], - 'destination_uuid' => ['type' => 'string', 'description' => 'Destination UUID. Required if server has multiple destinations.'], - 'instant_deploy' => ['type' => 'boolean', 'default' => false, 'description' => 'Start the service immediately after creation.'], - ], - ), - ), - ), - responses: [ - new OA\Response( - response: 201, - description: 'Create a service.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'uuid' => ['type' => 'string', 'description' => 'Service UUID.'], - 'domains' => ['type' => 'array', 'items' => ['type' => 'string'], 'description' => 'Service domains.'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function create_service(Request $request) - { - $allowedFields = ['type', 'name', 'description', 'project_uuid', 'environment_name', 'environment_uuid', 'server_uuid', 'destination_uuid', 'instant_deploy']; - - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - $return = validateIncomingRequest($request); - if ($return instanceof \Illuminate\Http\JsonResponse) { - return $return; - } - $validator = customApiValidator($request->all(), [ - 'type' => 'string|required', - 'project_uuid' => 'string|required', - 'environment_name' => 'string|nullable', - 'environment_uuid' => 'string|nullable', - 'server_uuid' => 'string|required', - 'destination_uuid' => 'string', - 'name' => 'string|max:255', - 'description' => 'string|nullable', - 'instant_deploy' => 'boolean', - ]); - - $extraFields = array_diff(array_keys($request->all()), $allowedFields); - if ($validator->fails() || ! empty($extraFields)) { - $errors = $validator->errors(); - if (! empty($extraFields)) { - foreach ($extraFields as $field) { - $errors->add($field, 'This field is not allowed.'); - } - } - - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $errors, - ], 422); - } - $environmentUuid = $request->environment_uuid; - $environmentName = $request->environment_name; - if (blank($environmentUuid) && blank($environmentName)) { - return response()->json(['message' => 'You need to provide at least one of environment_name or environment_uuid.'], 422); - } - $serverUuid = $request->server_uuid; - $instantDeploy = $request->instant_deploy ?? false; - if ($request->is_public && ! $request->public_port) { - $request->offsetSet('is_public', false); - } - $project = Project::whereTeamId($teamId)->whereUuid($request->project_uuid)->first(); - if (! $project) { - return response()->json(['message' => 'Project not found.'], 404); - } - $environment = $project->environments()->where('name', $environmentName)->first(); - if (! $environment) { - $environment = $project->environments()->where('uuid', $environmentUuid)->first(); - } - if (! $environment) { - return response()->json(['message' => 'Environment not found.'], 404); - } - $server = Server::whereTeamId($teamId)->whereUuid($serverUuid)->first(); - if (! $server) { - return response()->json(['message' => 'Server not found.'], 404); - } - $destinations = $server->destinations(); - if ($destinations->count() == 0) { - return response()->json(['message' => 'Server has no destinations.'], 400); - } - if ($destinations->count() > 1 && ! $request->has('destination_uuid')) { - return response()->json(['message' => 'Server has multiple destinations and you do not set destination_uuid.'], 400); - } - $destination = $destinations->first(); - $services = get_service_templates(); - $serviceKeys = $services->keys(); - if ($serviceKeys->contains($request->type)) { - $oneClickServiceName = $request->type; - $oneClickService = data_get($services, "$oneClickServiceName.compose"); - $oneClickDotEnvs = data_get($services, "$oneClickServiceName.envs", null); - if ($oneClickDotEnvs) { - $oneClickDotEnvs = str(base64_decode($oneClickDotEnvs))->split('/\r\n|\r|\n/')->filter(function ($value) { - return ! empty($value); - }); - } - if ($oneClickService) { - $service_payload = [ - 'name' => "$oneClickServiceName-".str()->random(10), - 'docker_compose_raw' => base64_decode($oneClickService), - 'environment_id' => $environment->id, - 'service_type' => $oneClickServiceName, - 'server_id' => $server->id, - 'destination_id' => $destination->id, - 'destination_type' => $destination->getMorphClass(), - ]; - if ($oneClickServiceName === 'cloudflared') { - data_set($service_payload, 'connect_to_docker_network', true); - } - $service = Service::create($service_payload); - $service->name = "$oneClickServiceName-".$service->uuid; - $service->save(); - if ($oneClickDotEnvs?->count() > 0) { - $oneClickDotEnvs->each(function ($value) use ($service) { - $key = str()->before($value, '='); - $value = str(str()->after($value, '=')); - $generatedValue = $value; - if ($value->contains('SERVICE_')) { - $command = $value->after('SERVICE_')->beforeLast('_'); - $generatedValue = generateEnvValue($command->value(), $service); - } - EnvironmentVariable::create([ - 'key' => $key, - 'value' => $generatedValue, - 'resourceable_id' => $service->id, - 'resourceable_type' => $service->getMorphClass(), - 'is_build_time' => false, - 'is_preview' => false, - ]); - }); - } - $service->parse(isNew: true); - if ($instantDeploy) { - StartService::dispatch($service); - } - $domains = $service->applications()->get()->pluck('fqdn')->sort(); - $domains = $domains->map(function ($domain) { - if (count(explode(':', $domain)) > 2) { - return str($domain)->beforeLast(':')->value(); - } - - return $domain; - }); - - return response()->json([ - 'uuid' => $service->uuid, - 'domains' => $domains, - ]); - } - - return response()->json(['message' => 'Service not found.'], 404); - } else { - return response()->json(['message' => 'Invalid service type.', 'valid_service_types' => $serviceKeys], 400); - } - - return response()->json(['message' => 'Invalid service type.'], 400); - } - - #[OA\Get( - summary: 'Get', - description: 'Get service by UUID.', - path: '/services/{uuid}', - operationId: 'get-service-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Services'], - parameters: [ - new OA\Parameter(name: 'uuid', in: 'path', required: true, description: 'Service UUID', schema: new OA\Schema(type: 'string')), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Get a service by UUID.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - ref: '#/components/schemas/Service' - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function service_by_uuid(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - if (! $request->uuid) { - return response()->json(['message' => 'UUID is required.'], 404); - } - $service = Service::whereRelation('environment.project.team', 'id', $teamId)->whereUuid($request->uuid)->first(); - if (! $service) { - return response()->json(['message' => 'Service not found.'], 404); - } - - $service = $service->load(['applications', 'databases']); - - return response()->json($this->removeSensitiveData($service)); - } - - #[OA\Delete( - summary: 'Delete', - description: 'Delete service by UUID.', - path: '/services/{uuid}', - operationId: 'delete-service-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Services'], - parameters: [ - new OA\Parameter(name: 'uuid', in: 'path', required: true, description: 'Service UUID', schema: new OA\Schema(type: 'string')), - new OA\Parameter(name: 'delete_configurations', in: 'query', required: false, description: 'Delete configurations.', schema: new OA\Schema(type: 'boolean', default: true)), - new OA\Parameter(name: 'delete_volumes', in: 'query', required: false, description: 'Delete volumes.', schema: new OA\Schema(type: 'boolean', default: true)), - new OA\Parameter(name: 'docker_cleanup', in: 'query', required: false, description: 'Run docker cleanup.', schema: new OA\Schema(type: 'boolean', default: true)), - new OA\Parameter(name: 'delete_connected_networks', in: 'query', required: false, description: 'Delete connected networks.', schema: new OA\Schema(type: 'boolean', default: true)), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Delete a service by UUID', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Service deletion request queued.'], - ], - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function delete_by_uuid(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - if (! $request->uuid) { - return response()->json(['message' => 'UUID is required.'], 404); - } - $service = Service::whereRelation('environment.project.team', 'id', $teamId)->whereUuid($request->uuid)->first(); - if (! $service) { - return response()->json(['message' => 'Service not found.'], 404); - } - - DeleteResourceJob::dispatch( - resource: $service, - deleteConfigurations: $request->query->get('delete_configurations', true), - deleteVolumes: $request->query->get('delete_volumes', true), - dockerCleanup: $request->query->get('docker_cleanup', true), - deleteConnectedNetworks: $request->query->get('delete_connected_networks', true) - ); - - return response()->json([ - 'message' => 'Service deletion request queued.', - ]); - } - - #[OA\Get( - summary: 'List Envs', - description: 'List all envs by service UUID.', - path: '/services/{uuid}/envs', - operationId: 'list-envs-by-service-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Services'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the service.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'All environment variables by service UUID.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'array', - items: new OA\Items(ref: '#/components/schemas/EnvironmentVariable') - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function envs(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $service = Service::whereRelation('environment.project.team', 'id', $teamId)->whereUuid($request->uuid)->first(); - if (! $service) { - return response()->json(['message' => 'Service not found.'], 404); - } - - $envs = $service->environment_variables->map(function ($env) { - $env->makeHidden([ - 'application_id', - 'standalone_clickhouse_id', - 'standalone_dragonfly_id', - 'standalone_keydb_id', - 'standalone_mariadb_id', - 'standalone_mongodb_id', - 'standalone_mysql_id', - 'standalone_postgresql_id', - 'standalone_redis_id', - ]); - - return $this->removeSensitiveData($env); - }); - - return response()->json($envs); - } - - #[OA\Patch( - summary: 'Update Env', - description: 'Update env by service UUID.', - path: '/services/{uuid}/envs', - operationId: 'update-env-by-service-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Services'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the service.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - requestBody: new OA\RequestBody( - description: 'Env updated.', - required: true, - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['key', 'value'], - properties: [ - 'key' => ['type' => 'string', 'description' => 'The key of the environment variable.'], - 'value' => ['type' => 'string', 'description' => 'The value of the environment variable.'], - 'is_preview' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is used in preview deployments.'], - 'is_build_time' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is used in build time.'], - 'is_literal' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is a literal, nothing espaced.'], - 'is_multiline' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is multiline.'], - 'is_shown_once' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable\'s value is shown on the UI.'], - ], - ), - ), - ], - ), - responses: [ - new OA\Response( - response: 201, - description: 'Environment variable updated.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Environment variable updated.'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function update_env_by_uuid(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - $service = Service::whereRelation('environment.project.team', 'id', $teamId)->whereUuid($request->uuid)->first(); - if (! $service) { - return response()->json(['message' => 'Service not found.'], 404); - } - - $validator = customApiValidator($request->all(), [ - 'key' => 'string|required', - 'value' => 'string|nullable', - 'is_build_time' => 'boolean', - 'is_literal' => 'boolean', - 'is_multiline' => 'boolean', - 'is_shown_once' => 'boolean', - ]); - - if ($validator->fails()) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $validator->errors(), - ], 422); - } - - $key = str($request->key)->trim()->replace(' ', '_')->value; - $env = $service->environment_variables()->where('key', $key)->first(); - if (! $env) { - return response()->json(['message' => 'Environment variable not found.'], 404); - } - - $env->fill($request->all()); - $env->save(); - - return response()->json($this->removeSensitiveData($env))->setStatusCode(201); - } - - #[OA\Patch( - summary: 'Update Envs (Bulk)', - description: 'Update multiple envs by service UUID.', - path: '/services/{uuid}/envs/bulk', - operationId: 'update-envs-by-service-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Services'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the service.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - requestBody: new OA\RequestBody( - description: 'Bulk envs updated.', - required: true, - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - required: ['data'], - properties: [ - 'data' => [ - 'type' => 'array', - 'items' => new OA\Schema( - type: 'object', - properties: [ - 'key' => ['type' => 'string', 'description' => 'The key of the environment variable.'], - 'value' => ['type' => 'string', 'description' => 'The value of the environment variable.'], - 'is_preview' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is used in preview deployments.'], - 'is_build_time' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is used in build time.'], - 'is_literal' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is a literal, nothing espaced.'], - 'is_multiline' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is multiline.'], - 'is_shown_once' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable\'s value is shown on the UI.'], - ], - ), - ], - ], - ), - ), - ], - ), - responses: [ - new OA\Response( - response: 201, - description: 'Environment variables updated.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Environment variables updated.'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function create_bulk_envs(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - $service = Service::whereRelation('environment.project.team', 'id', $teamId)->whereUuid($request->uuid)->first(); - if (! $service) { - return response()->json(['message' => 'Service not found.'], 404); - } - - $bulk_data = $request->get('data'); - if (! $bulk_data) { - return response()->json(['message' => 'Bulk data is required.'], 400); - } - - $updatedEnvs = collect(); - foreach ($bulk_data as $item) { - $validator = customApiValidator($item, [ - 'key' => 'string|required', - 'value' => 'string|nullable', - 'is_build_time' => 'boolean', - 'is_literal' => 'boolean', - 'is_multiline' => 'boolean', - 'is_shown_once' => 'boolean', - ]); - - if ($validator->fails()) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $validator->errors(), - ], 422); - } - $key = str($item['key'])->trim()->replace(' ', '_')->value; - $env = $service->environment_variables()->updateOrCreate( - ['key' => $key], - $item - ); - - $updatedEnvs->push($this->removeSensitiveData($env)); - } - - return response()->json($updatedEnvs)->setStatusCode(201); - } - - #[OA\Post( - summary: 'Create Env', - description: 'Create env by service UUID.', - path: '/services/{uuid}/envs', - operationId: 'create-env-by-service-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Services'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the service.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - requestBody: new OA\RequestBody( - required: true, - description: 'Env created.', - content: new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'key' => ['type' => 'string', 'description' => 'The key of the environment variable.'], - 'value' => ['type' => 'string', 'description' => 'The value of the environment variable.'], - 'is_preview' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is used in preview deployments.'], - 'is_build_time' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is used in build time.'], - 'is_literal' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is a literal, nothing espaced.'], - 'is_multiline' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable is multiline.'], - 'is_shown_once' => ['type' => 'boolean', 'description' => 'The flag to indicate if the environment variable\'s value is shown on the UI.'], - ], - ), - ), - ), - responses: [ - new OA\Response( - response: 201, - description: 'Environment variable created.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'uuid' => ['type' => 'string', 'example' => 'nc0k04gk8g0cgsk440g0koko'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function create_env(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - $service = Service::whereRelation('environment.project.team', 'id', $teamId)->whereUuid($request->uuid)->first(); - if (! $service) { - return response()->json(['message' => 'Service not found.'], 404); - } - - $validator = customApiValidator($request->all(), [ - 'key' => 'string|required', - 'value' => 'string|nullable', - 'is_build_time' => 'boolean', - 'is_literal' => 'boolean', - 'is_multiline' => 'boolean', - 'is_shown_once' => 'boolean', - ]); - - if ($validator->fails()) { - return response()->json([ - 'message' => 'Validation failed.', - 'errors' => $validator->errors(), - ], 422); - } - - $key = str($request->key)->trim()->replace(' ', '_')->value; - $existingEnv = $service->environment_variables()->where('key', $key)->first(); - if ($existingEnv) { - return response()->json([ - 'message' => 'Environment variable already exists. Use PATCH request to update it.', - ], 409); - } - - $env = $service->environment_variables()->create($request->all()); - - return response()->json($this->removeSensitiveData($env))->setStatusCode(201); - } - - #[OA\Delete( - summary: 'Delete Env', - description: 'Delete env by UUID.', - path: '/services/{uuid}/envs/{env_uuid}', - operationId: 'delete-env-by-service-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Services'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the service.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - new OA\Parameter( - name: 'env_uuid', - in: 'path', - description: 'UUID of the environment variable.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Environment variable deleted.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Environment variable deleted.'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function delete_env_by_uuid(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - - $service = Service::whereRelation('environment.project.team', 'id', $teamId)->whereUuid($request->uuid)->first(); - if (! $service) { - return response()->json(['message' => 'Service not found.'], 404); - } - - $env = EnvironmentVariable::where('uuid', $request->env_uuid) - ->where('resourceable_type', Service::class) - ->where('resourceable_id', $service->id) - ->first(); - - if (! $env) { - return response()->json(['message' => 'Environment variable not found.'], 404); - } - - $env->forceDelete(); - - return response()->json(['message' => 'Environment variable deleted.']); - } - - #[OA\Get( - summary: 'Start', - description: 'Start service. `Post` request is also accepted.', - path: '/services/{uuid}/start', - operationId: 'start-service-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Services'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the service.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Start service.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Service starting request queued.'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function action_deploy(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $uuid = $request->route('uuid'); - if (! $uuid) { - return response()->json(['message' => 'UUID is required.'], 400); - } - $service = Service::whereRelation('environment.project.team', 'id', $teamId)->whereUuid($request->uuid)->first(); - if (! $service) { - return response()->json(['message' => 'Service not found.'], 404); - } - if (str($service->status)->contains('running')) { - return response()->json(['message' => 'Service is already running.'], 400); - } - StartService::dispatch($service); - - return response()->json( - [ - 'message' => 'Service starting request queued.', - ], - 200 - ); - } - - #[OA\Get( - summary: 'Stop', - description: 'Stop service. `Post` request is also accepted.', - path: '/services/{uuid}/stop', - operationId: 'stop-service-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Services'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the service.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Stop service.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Service stopping request queued.'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function action_stop(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $uuid = $request->route('uuid'); - if (! $uuid) { - return response()->json(['message' => 'UUID is required.'], 400); - } - $service = Service::whereRelation('environment.project.team', 'id', $teamId)->whereUuid($request->uuid)->first(); - if (! $service) { - return response()->json(['message' => 'Service not found.'], 404); - } - if (str($service->status)->contains('stopped') || str($service->status)->contains('exited')) { - return response()->json(['message' => 'Service is already stopped.'], 400); - } - StopService::dispatch($service); - - return response()->json( - [ - 'message' => 'Service stopping request queued.', - ], - 200 - ); - } - - #[OA\Get( - summary: 'Restart', - description: 'Restart service. `Post` request is also accepted.', - path: '/services/{uuid}/restart', - operationId: 'restart-service-by-uuid', - security: [ - ['bearerAuth' => []], - ], - tags: ['Services'], - parameters: [ - new OA\Parameter( - name: 'uuid', - in: 'path', - description: 'UUID of the service.', - required: true, - schema: new OA\Schema( - type: 'string', - format: 'uuid', - ) - ), - ], - responses: [ - new OA\Response( - response: 200, - description: 'Restart service.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'object', - properties: [ - 'message' => ['type' => 'string', 'example' => 'Service restaring request queued.'], - ] - ) - ), - ] - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function action_restart(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $uuid = $request->route('uuid'); - if (! $uuid) { - return response()->json(['message' => 'UUID is required.'], 400); - } - $service = Service::whereRelation('environment.project.team', 'id', $teamId)->whereUuid($request->uuid)->first(); - if (! $service) { - return response()->json(['message' => 'Service not found.'], 404); - } - RestartService::dispatch($service); - - return response()->json( - [ - 'message' => 'Service restarting request queued.', - ], - 200 - ); - } -} diff --git a/app/Http/Controllers/Api/TeamController.php b/app/Http/Controllers/Api/TeamController.php deleted file mode 100644 index d4b24d8ab2..0000000000 --- a/app/Http/Controllers/Api/TeamController.php +++ /dev/null @@ -1,273 +0,0 @@ -makeHidden([ - 'custom_server_limit', - 'pivot', - ]); - if (request()->attributes->get('can_read_sensitive', false) === false) { - $team->makeHidden([ - 'smtp_username', - 'smtp_password', - 'resend_api_key', - 'telegram_token', - ]); - } - - return serializeApiResponse($team); - } - - #[OA\Get( - summary: 'List', - description: 'Get all teams.', - path: '/teams', - operationId: 'list-teams', - security: [ - ['bearerAuth' => []], - ], - tags: ['Teams'], - responses: [ - new OA\Response( - response: 200, - description: 'List of teams.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'array', - items: new OA\Items(ref: '#/components/schemas/Team') - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function teams(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $teams = auth()->user()->teams->sortBy('id'); - $teams = $teams->map(function ($team) { - return $this->removeSensitiveData($team); - }); - - return response()->json( - $teams, - ); - } - - #[OA\Get( - summary: 'Get', - description: 'Get team by TeamId.', - path: '/teams/{id}', - operationId: 'get-team-by-id', - security: [ - ['bearerAuth' => []], - ], - tags: ['Teams'], - parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Team ID', schema: new OA\Schema(type: 'integer')), - ], - responses: [ - new OA\Response( - response: 200, - description: 'List of teams.', - content: new OA\JsonContent(ref: '#/components/schemas/Team') - ), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function team_by_id(Request $request) - { - $id = $request->id; - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $teams = auth()->user()->teams; - $team = $teams->where('id', $id)->first(); - if (is_null($team)) { - return response()->json(['message' => 'Team not found.'], 404); - } - $team = $this->removeSensitiveData($team); - - return response()->json( - serializeApiResponse($team), - ); - } - - #[OA\Get( - summary: 'Members', - description: 'Get members by TeamId.', - path: '/teams/{id}/members', - operationId: 'get-members-by-team-id', - security: [ - ['bearerAuth' => []], - ], - tags: ['Teams'], - parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Team ID', schema: new OA\Schema(type: 'integer')), - ], - responses: [ - new OA\Response( - response: 200, - description: 'List of members.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'array', - items: new OA\Items(ref: '#/components/schemas/User') - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - new OA\Response( - response: 404, - ref: '#/components/responses/404', - ), - ] - )] - public function members_by_id(Request $request) - { - $id = $request->id; - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $teams = auth()->user()->teams; - $team = $teams->where('id', $id)->first(); - if (is_null($team)) { - return response()->json(['message' => 'Team not found.'], 404); - } - $members = $team->members; - $members->makeHidden([ - 'pivot', - ]); - - return response()->json( - serializeApiResponse($members), - ); - } - - #[OA\Get( - summary: 'Authenticated Team', - description: 'Get currently authenticated team.', - path: '/teams/current', - operationId: 'get-current-team', - security: [ - ['bearerAuth' => []], - ], - tags: ['Teams'], - responses: [ - new OA\Response( - response: 200, - description: 'Current Team.', - content: new OA\JsonContent(ref: '#/components/schemas/Team')), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function current_team(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $team = auth()->user()->currentTeam(); - - return response()->json( - $this->removeSensitiveData($team), - ); - } - - #[OA\Get( - summary: 'Authenticated Team Members', - description: 'Get currently authenticated team members.', - path: '/teams/current/members', - operationId: 'get-current-team-members', - security: [ - ['bearerAuth' => []], - ], - tags: ['Teams'], - responses: [ - new OA\Response( - response: 200, - description: 'Currently authenticated team members.', - content: [ - new OA\MediaType( - mediaType: 'application/json', - schema: new OA\Schema( - type: 'array', - items: new OA\Items(ref: '#/components/schemas/User') - ) - ), - ]), - new OA\Response( - response: 401, - ref: '#/components/responses/401', - ), - new OA\Response( - response: 400, - ref: '#/components/responses/400', - ), - ] - )] - public function current_team_members(Request $request) - { - $teamId = getTeamIdFromToken(); - if (is_null($teamId)) { - return invalidTokenResponse(); - } - $team = auth()->user()->currentTeam(); - $team->members->makeHidden([ - 'pivot', - ]); - - return response()->json( - serializeApiResponse($team->members), - ); - } -} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php deleted file mode 100644 index 14a2950afb..0000000000 --- a/app/Http/Controllers/Controller.php +++ /dev/null @@ -1,161 +0,0 @@ -user()?->currentTeam()->id !== 0) { - return redirect(RouteServiceProvider::HOME); - } - TestEvent::dispatch(); - - return 'Look at your other tab.'; - } - - public function verify() - { - return view('auth.verify-email'); - } - - public function email_verify(EmailVerificationRequest $request) - { - $request->fulfill(); - - return redirect(RouteServiceProvider::HOME); - } - - public function forgot_password(Request $request) - { - if (is_transactional_emails_enabled()) { - $arrayOfRequest = $request->only(Fortify::email()); - $request->merge([ - 'email' => Str::lower($arrayOfRequest['email']), - ]); - $type = set_transanctional_email_settings(); - if (blank($type)) { - return response()->json(['message' => 'Transactional emails are not active'], 400); - } - $request->validate([Fortify::email() => 'required|email']); - $status = Password::broker(config('fortify.passwords'))->sendResetLink( - $request->only(Fortify::email()) - ); - if ($status == Password::RESET_LINK_SENT) { - return app(SuccessfulPasswordResetLinkRequestResponse::class, ['status' => $status]); - } - if ($status == Password::RESET_THROTTLED) { - return response('Already requested a password reset in the past minutes.', 400); - } - - return app(FailedPasswordResetLinkRequestResponse::class, ['status' => $status]); - } - - return response()->json(['message' => 'Transactional emails are not active'], 400); - } - - public function link() - { - $token = request()->get('token'); - if ($token) { - $decrypted = Crypt::decryptString($token); - $email = str($decrypted)->before('@@@'); - $password = str($decrypted)->after('@@@'); - $user = User::whereEmail($email)->first(); - if (! $user) { - return redirect()->route('login'); - } - if (Hash::check($password, $user->password)) { - $invitation = TeamInvitation::whereEmail($email); - if ($invitation->exists()) { - $team = $invitation->first()->team; - $user->teams()->attach($team->id, ['role' => $invitation->first()->role]); - $invitation->delete(); - } else { - $team = $user->teams()->first(); - } - if (is_null(data_get($user, 'email_verified_at'))) { - $user->email_verified_at = now(); - $user->save(); - } - Auth::login($user); - session(['currentTeam' => $team]); - - return redirect()->route('dashboard'); - } - } - - return redirect()->route('login')->with('error', 'Invalid credentials.'); - } - - public function acceptInvitation() - { - $resetPassword = request()->query('reset-password'); - $invitationUuid = request()->route('uuid'); - - $invitation = TeamInvitation::whereUuid($invitationUuid)->firstOrFail(); - $user = User::whereEmail($invitation->email)->firstOrFail(); - - if (Auth::id() !== $user->id) { - abort(400, 'You are not allowed to accept this invitation.'); - } - $invitationValid = $invitation->isValid(); - - if ($invitationValid) { - if ($resetPassword) { - $user->update([ - 'password' => Hash::make($invitationUuid), - 'force_password_reset' => true, - ]); - } - if ($user->teams()->where('team_id', $invitation->team->id)->exists()) { - $invitation->delete(); - - return redirect()->route('team.index'); - } - $user->teams()->attach($invitation->team->id, ['role' => $invitation->role]); - $invitation->delete(); - - refreshSession($invitation->team); - - return redirect()->route('team.index'); - } else { - abort(400, 'Invitation expired.'); - } - } - - public function revoke_invitation() - { - $invitation = TeamInvitation::whereUuid(request()->route('uuid'))->firstOrFail(); - $user = User::whereEmail($invitation->email)->firstOrFail(); - if (is_null(Auth::user())) { - return redirect()->route('login'); - } - if (Auth::id() !== $user->id) { - abort(401); - } - $invitation->delete(); - - return redirect()->route('team.index'); - } -} diff --git a/app/Http/Controllers/MagicController.php b/app/Http/Controllers/MagicController.php deleted file mode 100644 index 59c9b8b94e..0000000000 --- a/app/Http/Controllers/MagicController.php +++ /dev/null @@ -1,84 +0,0 @@ -json([ - 'servers' => Server::isUsable()->get(), - ]); - } - - public function destinations() - { - return response()->json([ - 'destinations' => Server::destinationsByServer(request()->query('server_id'))->sortBy('name'), - ]); - } - - public function projects() - { - return response()->json([ - 'projects' => Project::ownedByCurrentTeam()->get(), - ]); - } - - public function environments() - { - $project = Project::ownedByCurrentTeam()->whereUuid(request()->query('project_uuid'))->first(); - if (! $project) { - return response()->json([ - 'environments' => [], - ]); - } - - return response()->json([ - 'environments' => $project->environments, - ]); - } - - public function newProject() - { - $project = Project::firstOrCreate( - ['name' => request()->query('name') ?? generate_random_name()], - ['team_id' => currentTeam()->id] - ); - - return response()->json([ - 'project_uuid' => $project->uuid, - ]); - } - - public function newEnvironment() - { - $environment = Environment::firstOrCreate( - ['name' => request()->query('name') ?? generate_random_name()], - ['project_id' => Project::ownedByCurrentTeam()->whereUuid(request()->query('project_uuid'))->firstOrFail()->id] - ); - - return response()->json([ - 'environment_name' => $environment->name, - ]); - } - - public function newTeam() - { - $team = Team::create( - [ - 'name' => request()->query('name') ?? generate_random_name(), - 'personal_team' => false, - ], - ); - auth()->user()->teams()->attach($team, ['role' => 'admin']); - refreshSession(); - - return redirect(request()->header('Referer')); - } -} diff --git a/app/Http/Controllers/OauthController.php b/app/Http/Controllers/OauthController.php deleted file mode 100644 index 3a3f18c9c4..0000000000 --- a/app/Http/Controllers/OauthController.php +++ /dev/null @@ -1,43 +0,0 @@ -redirect(); - } - - public function callback(string $provider) - { - try { - $oauthUser = get_socialite_provider($provider)->user(); - $user = User::whereEmail($oauthUser->email)->first(); - if (! $user) { - $settings = instanceSettings(); - if (! $settings->is_registration_enabled) { - abort(403, 'Registration is disabled'); - } - - $user = User::create([ - 'name' => $oauthUser->name, - 'email' => $oauthUser->email, - ]); - } - Auth::login($user); - - return redirect('/'); - } catch (\Exception $e) { - $errorCode = $e instanceof HttpException ? 'auth.failed' : 'auth.failed.callback'; - - return redirect()->route('login')->withErrors([__($errorCode)]); - } - } -} diff --git a/app/Http/Controllers/UploadController.php b/app/Http/Controllers/UploadController.php deleted file mode 100644 index 4d34a10007..0000000000 --- a/app/Http/Controllers/UploadController.php +++ /dev/null @@ -1,81 +0,0 @@ -route('databaseUuid'), data_get(auth()->user()->currentTeam(), 'id')); - if (is_null($resource)) { - return response()->json(['error' => 'You do not have permission for this database'], 500); - } - $receiver = new FileReceiver('file', $request, HandlerFactory::classFromRequest($request)); - - if ($receiver->isUploaded() === false) { - throw new UploadMissingFileException; - } - - $save = $receiver->receive(); - - if ($save->isFinished()) { - return $this->saveFile($save->getFile(), $resource); - } - - $handler = $save->handler(); - - return response()->json([ - 'done' => $handler->getPercentageDone(), - 'status' => true, - ]); - } - // protected function saveFileToS3($file) - // { - // $fileName = $this->createFilename($file); - - // $disk = Storage::disk('s3'); - // // It's better to use streaming Streaming (laravel 5.4+) - // $disk->putFileAs('photos', $file, $fileName); - - // // for older laravel - // // $disk->put($fileName, file_get_contents($file), 'public'); - // $mime = str_replace('/', '-', $file->getMimeType()); - - // // We need to delete the file when uploaded to s3 - // unlink($file->getPathname()); - - // return response()->json([ - // 'path' => $disk->url($fileName), - // 'name' => $fileName, - // 'mime_type' => $mime - // ]); - // } - protected function saveFile(UploadedFile $file, $resource) - { - $mime = str_replace('/', '-', $file->getMimeType()); - $filePath = "upload/{$resource->uuid}"; - $finalPath = storage_path('app/'.$filePath); - $file->move($finalPath, 'restore'); - - return response()->json([ - 'mime_type' => $mime, - ]); - } - - protected function createFilename(UploadedFile $file) - { - $extension = $file->getClientOriginalExtension(); - $filename = str_replace('.'.$extension, '', $file->getClientOriginalName()); // Filename without extension - - $filename .= '_'.md5(time()).'.'.$extension; - - return $filename; - } -} diff --git a/app/Http/Controllers/Webhook/Bitbucket.php b/app/Http/Controllers/Webhook/Bitbucket.php deleted file mode 100644 index 33d8f85321..0000000000 --- a/app/Http/Controllers/Webhook/Bitbucket.php +++ /dev/null @@ -1,194 +0,0 @@ -isDownForMaintenance()) { - $epoch = now()->valueOf(); - $data = [ - 'attributes' => $request->attributes->all(), - 'request' => $request->request->all(), - 'query' => $request->query->all(), - 'server' => $request->server->all(), - 'files' => $request->files->all(), - 'cookies' => $request->cookies->all(), - 'headers' => $request->headers->all(), - 'content' => $request->getContent(), - ]; - $json = json_encode($data); - Storage::disk('webhooks-during-maintenance')->put("{$epoch}_Bitbicket::manual_bitbucket", $json); - - return; - } - $return_payloads = collect([]); - $payload = $request->collect(); - $headers = $request->headers->all(); - $x_bitbucket_token = data_get($headers, 'x-hub-signature.0', ''); - $x_bitbucket_event = data_get($headers, 'x-event-key.0', ''); - $handled_events = collect(['repo:push', 'pullrequest:updated', 'pullrequest:created', 'pullrequest:rejected', 'pullrequest:fulfilled']); - if (! $handled_events->contains($x_bitbucket_event)) { - return response([ - 'status' => 'failed', - 'message' => 'Nothing to do. Event not handled.', - ]); - } - if ($x_bitbucket_event === 'repo:push') { - $branch = data_get($payload, 'push.changes.0.new.name'); - $full_name = data_get($payload, 'repository.full_name'); - $commit = data_get($payload, 'push.changes.0.new.target.hash'); - - if (! $branch) { - return response([ - 'status' => 'failed', - 'message' => 'Nothing to do. No branch found in the request.', - ]); - } - } - if ($x_bitbucket_event === 'pullrequest:updated' || $x_bitbucket_event === 'pullrequest:created' || $x_bitbucket_event === 'pullrequest:rejected' || $x_bitbucket_event === 'pullrequest:fulfilled') { - $branch = data_get($payload, 'pullrequest.destination.branch.name'); - $base_branch = data_get($payload, 'pullrequest.source.branch.name'); - $full_name = data_get($payload, 'repository.full_name'); - $pull_request_id = data_get($payload, 'pullrequest.id'); - $pull_request_html_url = data_get($payload, 'pullrequest.links.html.href'); - $commit = data_get($payload, 'pullrequest.source.commit.hash'); - } - $applications = Application::where('git_repository', 'like', "%$full_name%"); - $applications = $applications->where('git_branch', $branch)->get(); - if ($applications->isEmpty()) { - return response([ - 'status' => 'failed', - 'message' => "Nothing to do. No applications found with deploy key set, branch is '$branch' and Git Repository name has $full_name.", - ]); - } - foreach ($applications as $application) { - $webhook_secret = data_get($application, 'manual_webhook_secret_bitbucket'); - $payload = $request->getContent(); - - [$algo, $hash] = explode('=', $x_bitbucket_token, 2); - $payloadHash = hash_hmac($algo, $payload, $webhook_secret); - if (! hash_equals($hash, $payloadHash) && ! isDev()) { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'Invalid signature.', - ]); - - continue; - } - $isFunctional = $application->destination->server->isFunctional(); - if (! $isFunctional) { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'Server is not functional.', - ]); - - continue; - } - if ($x_bitbucket_event === 'repo:push') { - if ($application->isDeployable()) { - $deployment_uuid = new Cuid2; - queue_application_deployment( - application: $application, - deployment_uuid: $deployment_uuid, - commit: $commit, - force_rebuild: false, - is_webhook: true - ); - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'success', - 'message' => 'Preview deployment queued.', - ]); - } else { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'Auto deployment disabled.', - ]); - } - } - if ($x_bitbucket_event === 'pullrequest:created' || $x_bitbucket_event === 'pullrequest:updated') { - if ($application->isPRDeployable()) { - $deployment_uuid = new Cuid2; - $found = ApplicationPreview::where('application_id', $application->id)->where('pull_request_id', $pull_request_id)->first(); - if (! $found) { - if ($application->build_pack === 'dockercompose') { - $pr_app = ApplicationPreview::create([ - 'git_type' => 'bitbucket', - 'application_id' => $application->id, - 'pull_request_id' => $pull_request_id, - 'pull_request_html_url' => $pull_request_html_url, - 'docker_compose_domains' => $application->docker_compose_domains, - ]); - $pr_app->generate_preview_fqdn_compose(); - } else { - ApplicationPreview::create([ - 'git_type' => 'bitbucket', - 'application_id' => $application->id, - 'pull_request_id' => $pull_request_id, - 'pull_request_html_url' => $pull_request_html_url, - ]); - } - } - queue_application_deployment( - application: $application, - pull_request_id: $pull_request_id, - deployment_uuid: $deployment_uuid, - force_rebuild: false, - commit: $commit, - is_webhook: true, - git_type: 'bitbucket' - ); - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'success', - 'message' => 'Preview deployment queued.', - ]); - } else { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'Preview deployments disabled.', - ]); - } - } - if ($x_bitbucket_event === 'pullrequest:rejected' || $x_bitbucket_event === 'pullrequest:fulfilled') { - $found = ApplicationPreview::where('application_id', $application->id)->where('pull_request_id', $pull_request_id)->first(); - if ($found) { - $found->delete(); - $container_name = generateApplicationContainerName($application, $pull_request_id); - instant_remote_process(["docker rm -f $container_name"], $application->destination->server); - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'success', - 'message' => 'Preview deployment closed.', - ]); - } else { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'No preview deployment found.', - ]); - } - } - } - - return response($return_payloads); - } catch (Exception $e) { - return handleError($e); - } - } -} diff --git a/app/Http/Controllers/Webhook/Gitea.php b/app/Http/Controllers/Webhook/Gitea.php deleted file mode 100644 index 87fd2255f2..0000000000 --- a/app/Http/Controllers/Webhook/Gitea.php +++ /dev/null @@ -1,227 +0,0 @@ -header('X-Gitea-Delivery'); - if (app()->isDownForMaintenance()) { - $epoch = now()->valueOf(); - $files = Storage::disk('webhooks-during-maintenance')->files(); - $gitea_delivery_found = collect($files)->filter(function ($file) use ($x_gitea_delivery) { - return Str::contains($file, $x_gitea_delivery); - })->first(); - if ($gitea_delivery_found) { - return; - } - $data = [ - 'attributes' => $request->attributes->all(), - 'request' => $request->request->all(), - 'query' => $request->query->all(), - 'server' => $request->server->all(), - 'files' => $request->files->all(), - 'cookies' => $request->cookies->all(), - 'headers' => $request->headers->all(), - 'content' => $request->getContent(), - ]; - $json = json_encode($data); - Storage::disk('webhooks-during-maintenance')->put("{$epoch}_Gitea::manual_{$x_gitea_delivery}", $json); - - return; - } - $x_gitea_event = Str::lower($request->header('X-Gitea-Event')); - $x_hub_signature_256 = Str::after($request->header('X-Hub-Signature-256'), 'sha256='); - $content_type = $request->header('Content-Type'); - $payload = $request->collect(); - if ($x_gitea_event === 'ping') { - // Just pong - return response('pong'); - } - - if ($content_type !== 'application/json') { - $payload = json_decode(data_get($payload, 'payload'), true); - } - if ($x_gitea_event === 'push') { - $branch = data_get($payload, 'ref'); - $full_name = data_get($payload, 'repository.full_name'); - if (Str::isMatch('/refs\/heads\/*/', $branch)) { - $branch = Str::after($branch, 'refs/heads/'); - } - $added_files = data_get($payload, 'commits.*.added'); - $removed_files = data_get($payload, 'commits.*.removed'); - $modified_files = data_get($payload, 'commits.*.modified'); - $changed_files = collect($added_files)->concat($removed_files)->concat($modified_files)->unique()->flatten(); - } - if ($x_gitea_event === 'pull_request') { - $action = data_get($payload, 'action'); - $full_name = data_get($payload, 'repository.full_name'); - $pull_request_id = data_get($payload, 'number'); - $pull_request_html_url = data_get($payload, 'pull_request.html_url'); - $branch = data_get($payload, 'pull_request.head.ref'); - $base_branch = data_get($payload, 'pull_request.base.ref'); - } - if (! $branch) { - return response('Nothing to do. No branch found in the request.'); - } - $applications = Application::where('git_repository', 'like', "%$full_name%"); - if ($x_gitea_event === 'push') { - $applications = $applications->where('git_branch', $branch)->get(); - if ($applications->isEmpty()) { - return response("Nothing to do. No applications found with deploy key set, branch is '$branch' and Git Repository name has $full_name."); - } - } - if ($x_gitea_event === 'pull_request') { - $applications = $applications->where('git_branch', $base_branch)->get(); - if ($applications->isEmpty()) { - return response("Nothing to do. No applications found with branch '$base_branch'."); - } - } - foreach ($applications as $application) { - $webhook_secret = data_get($application, 'manual_webhook_secret_gitea'); - $hmac = hash_hmac('sha256', $request->getContent(), $webhook_secret); - if (! hash_equals($x_hub_signature_256, $hmac) && ! isDev()) { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'Invalid signature.', - ]); - - continue; - } - $isFunctional = $application->destination->server->isFunctional(); - if (! $isFunctional) { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'Server is not functional.', - ]); - - continue; - } - if ($x_gitea_event === 'push') { - if ($application->isDeployable()) { - $is_watch_path_triggered = $application->isWatchPathsTriggered($changed_files); - if ($is_watch_path_triggered || is_null($application->watch_paths)) { - $deployment_uuid = new Cuid2; - queue_application_deployment( - application: $application, - deployment_uuid: $deployment_uuid, - force_rebuild: false, - commit: data_get($payload, 'after', 'HEAD'), - is_webhook: true, - ); - $return_payloads->push([ - 'status' => 'success', - 'message' => 'Deployment queued.', - 'application_uuid' => $application->uuid, - 'application_name' => $application->name, - ]); - } else { - $paths = str($application->watch_paths)->explode("\n"); - $return_payloads->push([ - 'status' => 'failed', - 'message' => 'Changed files do not match watch paths. Ignoring deployment.', - 'application_uuid' => $application->uuid, - 'application_name' => $application->name, - 'details' => [ - 'changed_files' => $changed_files, - 'watch_paths' => $paths, - ], - ]); - } - } else { - $return_payloads->push([ - 'status' => 'failed', - 'message' => 'Deployments disabled.', - 'application_uuid' => $application->uuid, - 'application_name' => $application->name, - ]); - } - } - if ($x_gitea_event === 'pull_request') { - if ($action === 'opened' || $action === 'synchronized' || $action === 'reopened') { - if ($application->isPRDeployable()) { - $deployment_uuid = new Cuid2; - $found = ApplicationPreview::where('application_id', $application->id)->where('pull_request_id', $pull_request_id)->first(); - if (! $found) { - if ($application->build_pack === 'dockercompose') { - $pr_app = ApplicationPreview::create([ - 'git_type' => 'gitea', - 'application_id' => $application->id, - 'pull_request_id' => $pull_request_id, - 'pull_request_html_url' => $pull_request_html_url, - 'docker_compose_domains' => $application->docker_compose_domains, - ]); - $pr_app->generate_preview_fqdn_compose(); - } else { - ApplicationPreview::create([ - 'git_type' => 'gitea', - 'application_id' => $application->id, - 'pull_request_id' => $pull_request_id, - 'pull_request_html_url' => $pull_request_html_url, - ]); - } - } - queue_application_deployment( - application: $application, - pull_request_id: $pull_request_id, - deployment_uuid: $deployment_uuid, - force_rebuild: false, - commit: data_get($payload, 'head.sha', 'HEAD'), - is_webhook: true, - git_type: 'gitea' - ); - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'success', - 'message' => 'Preview deployment queued.', - ]); - } else { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'Preview deployments disabled.', - ]); - } - } - if ($action === 'closed') { - $found = ApplicationPreview::where('application_id', $application->id)->where('pull_request_id', $pull_request_id)->first(); - if ($found) { - $found->delete(); - $container_name = generateApplicationContainerName($application, $pull_request_id); - instant_remote_process(["docker rm -f $container_name"], $application->destination->server); - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'success', - 'message' => 'Preview deployment closed.', - ]); - } else { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'No preview deployment found.', - ]); - } - } - } - } - - return response($return_payloads); - } catch (Exception $e) { - return handleError($e); - } - } -} diff --git a/app/Http/Controllers/Webhook/Github.php b/app/Http/Controllers/Webhook/Github.php deleted file mode 100644 index 882f2be8b9..0000000000 --- a/app/Http/Controllers/Webhook/Github.php +++ /dev/null @@ -1,518 +0,0 @@ -header('X-GitHub-Delivery'); - if (app()->isDownForMaintenance()) { - $epoch = now()->valueOf(); - $files = Storage::disk('webhooks-during-maintenance')->files(); - $github_delivery_found = collect($files)->filter(function ($file) use ($x_github_delivery) { - return Str::contains($file, $x_github_delivery); - })->first(); - if ($github_delivery_found) { - return; - } - $data = [ - 'attributes' => $request->attributes->all(), - 'request' => $request->request->all(), - 'query' => $request->query->all(), - 'server' => $request->server->all(), - 'files' => $request->files->all(), - 'cookies' => $request->cookies->all(), - 'headers' => $request->headers->all(), - 'content' => $request->getContent(), - ]; - $json = json_encode($data); - Storage::disk('webhooks-during-maintenance')->put("{$epoch}_Github::manual_{$x_github_delivery}", $json); - - return; - } - $x_github_event = Str::lower($request->header('X-GitHub-Event')); - $x_hub_signature_256 = Str::after($request->header('X-Hub-Signature-256'), 'sha256='); - $content_type = $request->header('Content-Type'); - $payload = $request->collect(); - if ($x_github_event === 'ping') { - // Just pong - return response('pong'); - } - - if ($content_type !== 'application/json') { - $payload = json_decode(data_get($payload, 'payload'), true); - } - if ($x_github_event === 'push') { - $branch = data_get($payload, 'ref'); - $full_name = data_get($payload, 'repository.full_name'); - if (Str::isMatch('/refs\/heads\/*/', $branch)) { - $branch = Str::after($branch, 'refs/heads/'); - } - $added_files = data_get($payload, 'commits.*.added'); - $removed_files = data_get($payload, 'commits.*.removed'); - $modified_files = data_get($payload, 'commits.*.modified'); - $changed_files = collect($added_files)->concat($removed_files)->concat($modified_files)->unique()->flatten(); - } - if ($x_github_event === 'pull_request') { - $action = data_get($payload, 'action'); - $full_name = data_get($payload, 'repository.full_name'); - $pull_request_id = data_get($payload, 'number'); - $pull_request_html_url = data_get($payload, 'pull_request.html_url'); - $branch = data_get($payload, 'pull_request.head.ref'); - $base_branch = data_get($payload, 'pull_request.base.ref'); - } - if (! $branch) { - return response('Nothing to do. No branch found in the request.'); - } - $applications = Application::where('git_repository', 'like', "%$full_name%"); - if ($x_github_event === 'push') { - $applications = $applications->where('git_branch', $branch)->get(); - if ($applications->isEmpty()) { - return response("Nothing to do. No applications found with deploy key set, branch is '$branch' and Git Repository name has $full_name."); - } - } - if ($x_github_event === 'pull_request') { - $applications = $applications->where('git_branch', $base_branch)->get(); - if ($applications->isEmpty()) { - return response("Nothing to do. No applications found with branch '$base_branch'."); - } - } - foreach ($applications as $application) { - $webhook_secret = data_get($application, 'manual_webhook_secret_github'); - $hmac = hash_hmac('sha256', $request->getContent(), $webhook_secret); - if (! hash_equals($x_hub_signature_256, $hmac) && ! isDev()) { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'Invalid signature.', - ]); - - continue; - } - $isFunctional = $application->destination->server->isFunctional(); - if (! $isFunctional) { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'Server is not functional.', - ]); - - continue; - } - if ($x_github_event === 'push') { - if ($application->isDeployable()) { - $is_watch_path_triggered = $application->isWatchPathsTriggered($changed_files); - if ($is_watch_path_triggered || is_null($application->watch_paths)) { - $deployment_uuid = new Cuid2; - queue_application_deployment( - application: $application, - deployment_uuid: $deployment_uuid, - force_rebuild: false, - commit: data_get($payload, 'after', 'HEAD'), - is_webhook: true, - ); - $return_payloads->push([ - 'status' => 'success', - 'message' => 'Deployment queued.', - 'application_uuid' => $application->uuid, - 'application_name' => $application->name, - ]); - } else { - $paths = str($application->watch_paths)->explode("\n"); - $return_payloads->push([ - 'status' => 'failed', - 'message' => 'Changed files do not match watch paths. Ignoring deployment.', - 'application_uuid' => $application->uuid, - 'application_name' => $application->name, - 'details' => [ - 'changed_files' => $changed_files, - 'watch_paths' => $paths, - ], - ]); - } - } else { - $return_payloads->push([ - 'status' => 'failed', - 'message' => 'Deployments disabled.', - 'application_uuid' => $application->uuid, - 'application_name' => $application->name, - ]); - } - } - if ($x_github_event === 'pull_request') { - if ($action === 'opened' || $action === 'synchronize' || $action === 'reopened') { - if ($application->isPRDeployable()) { - $deployment_uuid = new Cuid2; - $found = ApplicationPreview::where('application_id', $application->id)->where('pull_request_id', $pull_request_id)->first(); - if (! $found) { - if ($application->build_pack === 'dockercompose') { - $pr_app = ApplicationPreview::create([ - 'git_type' => 'github', - 'application_id' => $application->id, - 'pull_request_id' => $pull_request_id, - 'pull_request_html_url' => $pull_request_html_url, - 'docker_compose_domains' => $application->docker_compose_domains, - ]); - $pr_app->generate_preview_fqdn_compose(); - } else { - ApplicationPreview::create([ - 'git_type' => 'github', - 'application_id' => $application->id, - 'pull_request_id' => $pull_request_id, - 'pull_request_html_url' => $pull_request_html_url, - ]); - } - } - queue_application_deployment( - application: $application, - pull_request_id: $pull_request_id, - deployment_uuid: $deployment_uuid, - force_rebuild: false, - commit: data_get($payload, 'head.sha', 'HEAD'), - is_webhook: true, - git_type: 'github' - ); - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'success', - 'message' => 'Preview deployment queued.', - ]); - } else { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'Preview deployments disabled.', - ]); - } - } - if ($action === 'closed') { - $found = ApplicationPreview::where('application_id', $application->id)->where('pull_request_id', $pull_request_id)->first(); - if ($found) { - $found->delete(); - $container_name = generateApplicationContainerName($application, $pull_request_id); - instant_remote_process(["docker rm -f $container_name"], $application->destination->server); - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'success', - 'message' => 'Preview deployment closed.', - ]); - } else { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'No preview deployment found.', - ]); - } - } - } - } - - return response($return_payloads); - } catch (Exception $e) { - return handleError($e); - } - } - - public function normal(Request $request) - { - try { - $return_payloads = collect([]); - $id = null; - $x_github_delivery = $request->header('X-GitHub-Delivery'); - if (app()->isDownForMaintenance()) { - $epoch = now()->valueOf(); - $files = Storage::disk('webhooks-during-maintenance')->files(); - $github_delivery_found = collect($files)->filter(function ($file) use ($x_github_delivery) { - return Str::contains($file, $x_github_delivery); - })->first(); - if ($github_delivery_found) { - return; - } - $data = [ - 'attributes' => $request->attributes->all(), - 'request' => $request->request->all(), - 'query' => $request->query->all(), - 'server' => $request->server->all(), - 'files' => $request->files->all(), - 'cookies' => $request->cookies->all(), - 'headers' => $request->headers->all(), - 'content' => $request->getContent(), - ]; - $json = json_encode($data); - Storage::disk('webhooks-during-maintenance')->put("{$epoch}_Github::normal_{$x_github_delivery}", $json); - - return; - } - $x_github_event = Str::lower($request->header('X-GitHub-Event')); - $x_github_hook_installation_target_id = $request->header('X-GitHub-Hook-Installation-Target-Id'); - $x_hub_signature_256 = Str::after($request->header('X-Hub-Signature-256'), 'sha256='); - $payload = $request->collect(); - if ($x_github_event === 'ping') { - // Just pong - return response('pong'); - } - $github_app = GithubApp::where('app_id', $x_github_hook_installation_target_id)->first(); - if (is_null($github_app)) { - return response('Nothing to do. No GitHub App found.'); - } - $webhook_secret = data_get($github_app, 'webhook_secret'); - $hmac = hash_hmac('sha256', $request->getContent(), $webhook_secret); - if (config('app.env') !== 'local') { - if (! hash_equals($x_hub_signature_256, $hmac)) { - return response('Invalid signature.'); - } - } - if ($x_github_event === 'installation' || $x_github_event === 'installation_repositories') { - // Installation handled by setup redirect url. Repositories queried on-demand. - $action = data_get($payload, 'action'); - if ($action === 'new_permissions_accepted') { - GithubAppPermissionJob::dispatch($github_app); - } - - return response('cool'); - } - if ($x_github_event === 'push') { - $id = data_get($payload, 'repository.id'); - $branch = data_get($payload, 'ref'); - if (Str::isMatch('/refs\/heads\/*/', $branch)) { - $branch = Str::after($branch, 'refs/heads/'); - } - $added_files = data_get($payload, 'commits.*.added'); - $removed_files = data_get($payload, 'commits.*.removed'); - $modified_files = data_get($payload, 'commits.*.modified'); - $changed_files = collect($added_files)->concat($removed_files)->concat($modified_files)->unique()->flatten(); - } - if ($x_github_event === 'pull_request') { - $action = data_get($payload, 'action'); - $id = data_get($payload, 'repository.id'); - $pull_request_id = data_get($payload, 'number'); - $pull_request_html_url = data_get($payload, 'pull_request.html_url'); - $branch = data_get($payload, 'pull_request.head.ref'); - $base_branch = data_get($payload, 'pull_request.base.ref'); - } - if (! $id || ! $branch) { - return response('Nothing to do. No id or branch found.'); - } - $applications = Application::where('repository_project_id', $id)->whereRelation('source', 'is_public', false); - if ($x_github_event === 'push') { - $applications = $applications->where('git_branch', $branch)->get(); - if ($applications->isEmpty()) { - return response("Nothing to do. No applications found with branch '$branch'."); - } - } - if ($x_github_event === 'pull_request') { - $applications = $applications->where('git_branch', $base_branch)->get(); - if ($applications->isEmpty()) { - return response("Nothing to do. No applications found with branch '$base_branch'."); - } - } - foreach ($applications as $application) { - $isFunctional = $application->destination->server->isFunctional(); - if (! $isFunctional) { - $return_payloads->push([ - 'status' => 'failed', - 'message' => 'Server is not functional.', - 'application_uuid' => $application->uuid, - 'application_name' => $application->name, - ]); - - continue; - } - if ($x_github_event === 'push') { - if ($application->isDeployable()) { - $is_watch_path_triggered = $application->isWatchPathsTriggered($changed_files); - if ($is_watch_path_triggered || is_null($application->watch_paths)) { - $deployment_uuid = new Cuid2; - queue_application_deployment( - application: $application, - deployment_uuid: $deployment_uuid, - commit: data_get($payload, 'after', 'HEAD'), - force_rebuild: false, - is_webhook: true, - ); - $return_payloads->push([ - 'status' => 'success', - 'message' => 'Deployment queued.', - 'application_uuid' => $application->uuid, - 'application_name' => $application->name, - ]); - } else { - $paths = str($application->watch_paths)->explode("\n"); - $return_payloads->push([ - 'status' => 'failed', - 'message' => 'Changed files do not match watch paths. Ignoring deployment.', - 'application_uuid' => $application->uuid, - 'application_name' => $application->name, - 'details' => [ - 'changed_files' => $changed_files, - 'watch_paths' => $paths, - ], - ]); - } - } else { - $return_payloads->push([ - 'status' => 'failed', - 'message' => 'Deployments disabled.', - 'application_uuid' => $application->uuid, - 'application_name' => $application->name, - ]); - } - } - if ($x_github_event === 'pull_request') { - if ($action === 'opened' || $action === 'synchronize' || $action === 'reopened') { - if ($application->isPRDeployable()) { - $deployment_uuid = new Cuid2; - $found = ApplicationPreview::where('application_id', $application->id)->where('pull_request_id', $pull_request_id)->first(); - if (! $found) { - ApplicationPreview::create([ - 'git_type' => 'github', - 'application_id' => $application->id, - 'pull_request_id' => $pull_request_id, - 'pull_request_html_url' => $pull_request_html_url, - ]); - } - queue_application_deployment( - application: $application, - pull_request_id: $pull_request_id, - deployment_uuid: $deployment_uuid, - force_rebuild: false, - commit: data_get($payload, 'head.sha', 'HEAD'), - is_webhook: true, - git_type: 'github' - ); - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'success', - 'message' => 'Preview deployment queued.', - ]); - } else { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'Preview deployments disabled.', - ]); - } - } - if ($action === 'closed' || $action === 'close') { - $found = ApplicationPreview::where('application_id', $application->id)->where('pull_request_id', $pull_request_id)->first(); - if ($found) { - $containers = getCurrentApplicationContainerStatus($application->destination->server, $application->id, $pull_request_id); - if ($containers->isNotEmpty()) { - $containers->each(function ($container) use ($application) { - $container_name = data_get($container, 'Names'); - instant_remote_process(["docker rm -f $container_name"], $application->destination->server); - }); - } - - ApplicationPullRequestUpdateJob::dispatchSync(application: $application, preview: $found, status: ProcessStatus::CLOSED); - $found->delete(); - - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'success', - 'message' => 'Preview deployment closed.', - ]); - } else { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'No preview deployment found.', - ]); - } - } - } - } - - return response($return_payloads); - } catch (Exception $e) { - return handleError($e); - } - } - - public function redirect(Request $request) - { - try { - $code = $request->get('code'); - $state = $request->get('state'); - $github_app = GithubApp::where('uuid', $state)->firstOrFail(); - $api_url = data_get($github_app, 'api_url'); - $data = Http::withBody(null)->accept('application/vnd.github+json')->post("$api_url/app-manifests/$code/conversions")->throw()->json(); - $id = data_get($data, 'id'); - $slug = data_get($data, 'slug'); - $client_id = data_get($data, 'client_id'); - $client_secret = data_get($data, 'client_secret'); - $private_key = data_get($data, 'pem'); - $webhook_secret = data_get($data, 'webhook_secret'); - $private_key = PrivateKey::create([ - 'name' => "github-app-{$slug}", - 'private_key' => $private_key, - 'team_id' => $github_app->team_id, - 'is_git_related' => true, - ]); - $github_app->name = $slug; - $github_app->app_id = $id; - $github_app->client_id = $client_id; - $github_app->client_secret = $client_secret; - $github_app->webhook_secret = $webhook_secret; - $github_app->private_key_id = $private_key->id; - $github_app->save(); - - return redirect()->route('source.github.show', ['github_app_uuid' => $github_app->uuid]); - } catch (Exception $e) { - return handleError($e); - } - } - - public function install(Request $request) - { - try { - $installation_id = $request->get('installation_id'); - if (app()->isDownForMaintenance()) { - $epoch = now()->valueOf(); - $data = [ - 'attributes' => $request->attributes->all(), - 'request' => $request->request->all(), - 'query' => $request->query->all(), - 'server' => $request->server->all(), - 'files' => $request->files->all(), - 'cookies' => $request->cookies->all(), - 'headers' => $request->headers->all(), - 'content' => $request->getContent(), - ]; - $json = json_encode($data); - Storage::disk('webhooks-during-maintenance')->put("{$epoch}_Github::install_{$installation_id}", $json); - - return; - } - $source = $request->get('source'); - $setup_action = $request->get('setup_action'); - $github_app = GithubApp::where('uuid', $source)->firstOrFail(); - if ($setup_action === 'install') { - $github_app->installation_id = $installation_id; - $github_app->save(); - } - - return redirect()->route('source.github.show', ['github_app_uuid' => $github_app->uuid]); - } catch (Exception $e) { - return handleError($e); - } - } -} diff --git a/app/Http/Controllers/Webhook/Gitlab.php b/app/Http/Controllers/Webhook/Gitlab.php deleted file mode 100644 index cf6874b8cc..0000000000 --- a/app/Http/Controllers/Webhook/Gitlab.php +++ /dev/null @@ -1,259 +0,0 @@ -isDownForMaintenance()) { - $epoch = now()->valueOf(); - $data = [ - 'attributes' => $request->attributes->all(), - 'request' => $request->request->all(), - 'query' => $request->query->all(), - 'server' => $request->server->all(), - 'files' => $request->files->all(), - 'cookies' => $request->cookies->all(), - 'headers' => $request->headers->all(), - 'content' => $request->getContent(), - ]; - $json = json_encode($data); - Storage::disk('webhooks-during-maintenance')->put("{$epoch}_Gitlab::manual_gitlab", $json); - - return; - } - - $return_payloads = collect([]); - $payload = $request->collect(); - $headers = $request->headers->all(); - $x_gitlab_token = data_get($headers, 'x-gitlab-token.0'); - $x_gitlab_event = data_get($payload, 'object_kind'); - $allowed_events = ['push', 'merge_request']; - if (! in_array($x_gitlab_event, $allowed_events)) { - $return_payloads->push([ - 'status' => 'failed', - 'message' => 'Event not allowed. Only push and merge_request events are allowed.', - ]); - - return response($return_payloads); - } - - if (empty($x_gitlab_token)) { - $return_payloads->push([ - 'status' => 'failed', - 'message' => 'Invalid signature.', - ]); - - return response($return_payloads); - } - - if ($x_gitlab_event === 'push') { - $branch = data_get($payload, 'ref'); - $full_name = data_get($payload, 'project.path_with_namespace'); - if (Str::isMatch('/refs\/heads\/*/', $branch)) { - $branch = Str::after($branch, 'refs/heads/'); - } - if (! $branch) { - $return_payloads->push([ - 'status' => 'failed', - 'message' => 'Nothing to do. No branch found in the request.', - ]); - - return response($return_payloads); - } - $added_files = data_get($payload, 'commits.*.added'); - $removed_files = data_get($payload, 'commits.*.removed'); - $modified_files = data_get($payload, 'commits.*.modified'); - $changed_files = collect($added_files)->concat($removed_files)->concat($modified_files)->unique()->flatten(); - } - if ($x_gitlab_event === 'merge_request') { - $action = data_get($payload, 'object_attributes.action'); - $branch = data_get($payload, 'object_attributes.source_branch'); - $base_branch = data_get($payload, 'object_attributes.target_branch'); - $full_name = data_get($payload, 'project.path_with_namespace'); - $pull_request_id = data_get($payload, 'object_attributes.iid'); - $pull_request_html_url = data_get($payload, 'object_attributes.url'); - if (! $branch) { - $return_payloads->push([ - 'status' => 'failed', - 'message' => 'Nothing to do. No branch found in the request.', - ]); - - return response($return_payloads); - } - } - $applications = Application::where('git_repository', 'like', "%$full_name%"); - if ($x_gitlab_event === 'push') { - $applications = $applications->where('git_branch', $branch)->get(); - if ($applications->isEmpty()) { - $return_payloads->push([ - 'status' => 'failed', - 'message' => "Nothing to do. No applications found with deploy key set, branch is '$branch' and Git Repository name has $full_name.", - ]); - - return response($return_payloads); - } - } - if ($x_gitlab_event === 'merge_request') { - $applications = $applications->where('git_branch', $base_branch)->get(); - if ($applications->isEmpty()) { - $return_payloads->push([ - 'status' => 'failed', - 'message' => "Nothing to do. No applications found with branch '$base_branch'.", - ]); - - return response($return_payloads); - } - } - foreach ($applications as $application) { - $webhook_secret = data_get($application, 'manual_webhook_secret_gitlab'); - if ($webhook_secret !== $x_gitlab_token) { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'Invalid signature.', - ]); - - continue; - } - $isFunctional = $application->destination->server->isFunctional(); - if (! $isFunctional) { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'Server is not functional', - ]); - - continue; - } - if ($x_gitlab_event === 'push') { - if ($application->isDeployable()) { - $is_watch_path_triggered = $application->isWatchPathsTriggered($changed_files); - if ($is_watch_path_triggered || is_null($application->watch_paths)) { - $deployment_uuid = new Cuid2; - queue_application_deployment( - application: $application, - deployment_uuid: $deployment_uuid, - commit: data_get($payload, 'after', 'HEAD'), - force_rebuild: false, - is_webhook: true, - ); - $return_payloads->push([ - 'status' => 'success', - 'message' => 'Deployment queued.', - 'application_uuid' => $application->uuid, - 'application_name' => $application->name, - ]); - } else { - $paths = str($application->watch_paths)->explode("\n"); - $return_payloads->push([ - 'status' => 'failed', - 'message' => 'Changed files do not match watch paths. Ignoring deployment.', - 'application_uuid' => $application->uuid, - 'application_name' => $application->name, - 'details' => [ - 'changed_files' => $changed_files, - 'watch_paths' => $paths, - ], - ]); - } - } else { - $return_payloads->push([ - 'status' => 'failed', - 'message' => 'Deployments disabled', - 'application_uuid' => $application->uuid, - 'application_name' => $application->name, - ]); - } - } - if ($x_gitlab_event === 'merge_request') { - if ($action === 'open' || $action === 'opened' || $action === 'synchronize' || $action === 'reopened' || $action === 'reopen' || $action === 'update') { - if ($application->isPRDeployable()) { - $deployment_uuid = new Cuid2; - $found = ApplicationPreview::where('application_id', $application->id)->where('pull_request_id', $pull_request_id)->first(); - if (! $found) { - if ($application->build_pack === 'dockercompose') { - $pr_app = ApplicationPreview::create([ - 'git_type' => 'gitlab', - 'application_id' => $application->id, - 'pull_request_id' => $pull_request_id, - 'pull_request_html_url' => $pull_request_html_url, - 'docker_compose_domains' => $application->docker_compose_domains, - ]); - $pr_app->generate_preview_fqdn_compose(); - } else { - ApplicationPreview::create([ - 'git_type' => 'gitlab', - 'application_id' => $application->id, - 'pull_request_id' => $pull_request_id, - 'pull_request_html_url' => $pull_request_html_url, - ]); - } - } - queue_application_deployment( - application: $application, - pull_request_id: $pull_request_id, - deployment_uuid: $deployment_uuid, - commit: data_get($payload, 'object_attributes.last_commit.id', 'HEAD'), - force_rebuild: false, - is_webhook: true, - git_type: 'gitlab' - ); - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'success', - 'message' => 'Preview Deployment queued', - ]); - } else { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'Preview deployments disabled', - ]); - } - } elseif ($action === 'closed' || $action === 'close' || $action === 'merge') { - $found = ApplicationPreview::where('application_id', $application->id)->where('pull_request_id', $pull_request_id)->first(); - if ($found) { - $found->delete(); - $container_name = generateApplicationContainerName($application, $pull_request_id); - instant_remote_process(["docker rm -f $container_name"], $application->destination->server); - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'success', - 'message' => 'Preview Deployment closed', - ]); - - return response($return_payloads); - } - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'No Preview Deployment found', - ]); - } else { - $return_payloads->push([ - 'application' => $application->name, - 'status' => 'failed', - 'message' => 'No action found. Contact us for debugging.', - ]); - } - } - } - - return response($return_payloads); - } catch (Exception $e) { - return handleError($e); - } - } -} diff --git a/app/Http/Controllers/Webhook/Stripe.php b/app/Http/Controllers/Webhook/Stripe.php deleted file mode 100644 index 83ba16699a..0000000000 --- a/app/Http/Controllers/Webhook/Stripe.php +++ /dev/null @@ -1,59 +0,0 @@ -header('Stripe-Signature'); - $event = \Stripe\Webhook::constructEvent( - $request->getContent(), - $signature, - $webhookSecret - ); - if (app()->isDownForMaintenance()) { - $epoch = now()->valueOf(); - $data = [ - 'attributes' => $request->attributes->all(), - 'request' => $request->request->all(), - 'query' => $request->query->all(), - 'server' => $request->server->all(), - 'files' => $request->files->all(), - 'cookies' => $request->cookies->all(), - 'headers' => $request->headers->all(), - 'content' => $request->getContent(), - ]; - $json = json_encode($data); - Storage::disk('webhooks-during-maintenance')->put("{$epoch}_Stripe::events_stripe", $json); - - return response('Webhook received. Cool cool cool cool cool.', 200); - } - $this->webhook = Webhook::create([ - 'type' => 'stripe', - 'payload' => $request->getContent(), - ]); - StripeProcessJob::dispatch($event); - - return response('Webhook received. Cool cool cool cool cool.', 200); - } catch (Exception $e) { - $this->webhook->update([ - 'status' => 'failed', - 'failure_reason' => $e->getMessage(), - ]); - - return response($e->getMessage(), 400); - } - } -} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php deleted file mode 100644 index a1ce20295b..0000000000 --- a/app/Http/Kernel.php +++ /dev/null @@ -1,75 +0,0 @@ - - */ - protected $middleware = [ - // \App\Http\Middleware\TrustHosts::class, - \App\Http\Middleware\TrustProxies::class, - \Illuminate\Http\Middleware\HandleCors::class, - \App\Http\Middleware\PreventRequestsDuringMaintenance::class, - \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, - \App\Http\Middleware\TrimStrings::class, - \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, - - ]; - - /** - * The application's route middleware groups. - * - * @var array> - */ - protected $middlewareGroups = [ - 'web' => [ - \App\Http\Middleware\EncryptCookies::class, - \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, - \Illuminate\Session\Middleware\StartSession::class, - \Illuminate\View\Middleware\ShareErrorsFromSession::class, - \App\Http\Middleware\VerifyCsrfToken::class, - \Illuminate\Routing\Middleware\SubstituteBindings::class, - \App\Http\Middleware\CheckForcePasswordReset::class, - \App\Http\Middleware\DecideWhatToDoWithUser::class, - - ], - - 'api' => [ - // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, - \Illuminate\Routing\Middleware\ThrottleRequests::class.':api', - \Illuminate\Routing\Middleware\SubstituteBindings::class, - ], - ]; - - /** - * The application's middleware aliases. - * - * Aliases may be used to conveniently assign middleware to routes and groups. - * - * @var array - */ - protected $middlewareAliases = [ - 'auth' => \App\Http\Middleware\Authenticate::class, - 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, - 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, - 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, - 'can' => \Illuminate\Auth\Middleware\Authorize::class, - 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, - 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, - 'signed' => \App\Http\Middleware\ValidateSignature::class, - 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, - 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, - 'abilities' => \Laravel\Sanctum\Http\Middleware\CheckAbilities::class, - 'ability' => \Laravel\Sanctum\Http\Middleware\CheckForAnyAbility::class, - 'api.ability' => \App\Http\Middleware\ApiAbility::class, - 'api.sensitive' => \App\Http\Middleware\ApiSensitiveData::class, - ]; -} diff --git a/app/Http/Middleware/ApiAbility.php b/app/Http/Middleware/ApiAbility.php deleted file mode 100644 index 324eeebaa3..0000000000 --- a/app/Http/Middleware/ApiAbility.php +++ /dev/null @@ -1,27 +0,0 @@ -user()->tokenCan('root')) { - return $next($request); - } - - return parent::handle($request, $next, ...$abilities); - } catch (\Illuminate\Auth\AuthenticationException $e) { - return response()->json([ - 'message' => 'Unauthenticated.', - ], 401); - } catch (\Exception $e) { - return response()->json([ - 'message' => 'Missing required permissions: '.implode(', ', $abilities), - ], 403); - } - } -} diff --git a/app/Http/Middleware/ApiAllowed.php b/app/Http/Middleware/ApiAllowed.php deleted file mode 100644 index dc6be5da3d..0000000000 --- a/app/Http/Middleware/ApiAllowed.php +++ /dev/null @@ -1,32 +0,0 @@ -is_api_enabled === false) { - return response()->json(['success' => true, 'message' => 'API is disabled.'], 403); - } - - if (! isDev()) { - if ($settings->allowed_ips) { - $allowedIps = explode(',', $settings->allowed_ips); - if (! in_array($request->ip(), $allowedIps)) { - return response()->json(['success' => true, 'message' => 'You are not allowed to access the API.'], 403); - } - } - } - - return $next($request); - } -} diff --git a/app/Http/Middleware/ApiSensitiveData.php b/app/Http/Middleware/ApiSensitiveData.php deleted file mode 100644 index 49584ddb3f..0000000000 --- a/app/Http/Middleware/ApiSensitiveData.php +++ /dev/null @@ -1,21 +0,0 @@ -user()->currentAccessToken(); - - // Allow access to sensitive data if token has root or read:sensitive permission - $request->attributes->add([ - 'can_read_sensitive' => $token->can('root') || $token->can('read:sensitive'), - ]); - - return $next($request); - } -} diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php deleted file mode 100644 index d4ef6447a9..0000000000 --- a/app/Http/Middleware/Authenticate.php +++ /dev/null @@ -1,17 +0,0 @@ -expectsJson() ? null : route('login'); - } -} diff --git a/app/Http/Middleware/CheckForcePasswordReset.php b/app/Http/Middleware/CheckForcePasswordReset.php deleted file mode 100644 index 78b1f896c4..0000000000 --- a/app/Http/Middleware/CheckForcePasswordReset.php +++ /dev/null @@ -1,38 +0,0 @@ -user()) { - if ($request->path() === 'auth/link') { - auth()->logout(); - request()->session()->invalidate(); - request()->session()->regenerateToken(); - - return $next($request); - } - $force_password_reset = auth()->user()->force_password_reset; - if ($force_password_reset) { - if ($request->routeIs('auth.force-password-reset') || $request->path() === 'force-password-reset' || $request->path() === 'livewire/update' || $request->path() === 'logout') { - return $next($request); - } - - return redirect()->route('auth.force-password-reset'); - } - } - - return $next($request); - } -} diff --git a/app/Http/Middleware/DecideWhatToDoWithUser.php b/app/Http/Middleware/DecideWhatToDoWithUser.php deleted file mode 100644 index 8b1c550dfe..0000000000 --- a/app/Http/Middleware/DecideWhatToDoWithUser.php +++ /dev/null @@ -1,61 +0,0 @@ -user()?->teams?->count() === 0) { - $currentTeam = auth()->user()?->recreate_personal_team(); - refreshSession($currentTeam); - } - if (auth()?->user()?->currentTeam()) { - refreshSession(auth()->user()->currentTeam()); - } - if (! auth()->user() || ! isCloud() || isInstanceAdmin()) { - if (! isCloud() && showBoarding() && ! in_array($request->path(), allowedPathsForBoardingAccounts())) { - return redirect()->route('onboarding'); - } - - return $next($request); - } - if (! auth()->user()->hasVerifiedEmail()) { - if ($request->path() === 'verify' || in_array($request->path(), allowedPathsForInvalidAccounts()) || $request->routeIs('verify.verify')) { - return $next($request); - } - - return redirect()->route('verify.email'); - } - if (! isSubscriptionActive() && ! isSubscriptionOnGracePeriod()) { - if (! in_array($request->path(), allowedPathsForUnsubscribedAccounts())) { - if (Str::startsWith($request->path(), 'invitations')) { - return $next($request); - } - - return redirect()->route('subscription.index'); - } - } - if (showBoarding() && ! in_array($request->path(), allowedPathsForBoardingAccounts())) { - if (Str::startsWith($request->path(), 'invitations')) { - return $next($request); - } - - return redirect()->route('onboarding'); - } - if (auth()->user()->hasVerifiedEmail() && $request->path() === 'verify') { - return redirect(RouteServiceProvider::HOME); - } - if (isSubscriptionActive() && $request->routeIs('subscription.index')) { - return redirect(RouteServiceProvider::HOME); - } - - return $next($request); - } -} diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php deleted file mode 100644 index 867695bdcf..0000000000 --- a/app/Http/Middleware/EncryptCookies.php +++ /dev/null @@ -1,17 +0,0 @@ - - */ - protected $except = [ - // - ]; -} diff --git a/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/app/Http/Middleware/PreventRequestsDuringMaintenance.php deleted file mode 100644 index 2a4feea1e4..0000000000 --- a/app/Http/Middleware/PreventRequestsDuringMaintenance.php +++ /dev/null @@ -1,18 +0,0 @@ - - */ - protected $except = [ - 'webhooks/*', - '/api/health', - ]; -} diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php deleted file mode 100644 index afc78c4e53..0000000000 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ /dev/null @@ -1,30 +0,0 @@ -check()) { - return redirect(RouteServiceProvider::HOME); - } - } - - return $next($request); - } -} diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php deleted file mode 100644 index 88cadcaaf2..0000000000 --- a/app/Http/Middleware/TrimStrings.php +++ /dev/null @@ -1,19 +0,0 @@ - - */ - protected $except = [ - 'current_password', - 'password', - 'password_confirmation', - ]; -} diff --git a/app/Http/Middleware/TrustHosts.php b/app/Http/Middleware/TrustHosts.php deleted file mode 100644 index c9c58bddce..0000000000 --- a/app/Http/Middleware/TrustHosts.php +++ /dev/null @@ -1,20 +0,0 @@ - - */ - public function hosts(): array - { - return [ - $this->allSubdomainsOfApplicationUrl(), - ]; - } -} diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php deleted file mode 100644 index 559dd2fc3f..0000000000 --- a/app/Http/Middleware/TrustProxies.php +++ /dev/null @@ -1,28 +0,0 @@ -|string|null - */ - protected $proxies = '*'; - - /** - * The headers that should be used to detect proxies. - * - * @var int - */ - protected $headers = - Request::HEADER_X_FORWARDED_FOR | - Request::HEADER_X_FORWARDED_HOST | - Request::HEADER_X_FORWARDED_PORT | - Request::HEADER_X_FORWARDED_PROTO | - Request::HEADER_X_FORWARDED_AWS_ELB; -} diff --git a/app/Http/Middleware/ValidateSignature.php b/app/Http/Middleware/ValidateSignature.php deleted file mode 100644 index 093bf64af8..0000000000 --- a/app/Http/Middleware/ValidateSignature.php +++ /dev/null @@ -1,22 +0,0 @@ - - */ - protected $except = [ - // 'fbclid', - // 'utm_campaign', - // 'utm_content', - // 'utm_medium', - // 'utm_source', - // 'utm_term', - ]; -} diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php deleted file mode 100644 index 9e86521722..0000000000 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ /dev/null @@ -1,17 +0,0 @@ - - */ - protected $except = [ - // - ]; -} diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php deleted file mode 100644 index 5301363785..0000000000 --- a/app/Jobs/ApplicationDeploymentJob.php +++ /dev/null @@ -1,2460 +0,0 @@ -application_deployment_queue_id]; - } - - public function __construct(public int $application_deployment_queue_id) - { - $this->onQueue('high'); - - $this->application_deployment_queue = ApplicationDeploymentQueue::find($this->application_deployment_queue_id); - $this->nixpacks_plan_json = collect([]); - - $this->application = Application::find($this->application_deployment_queue->application_id); - $this->build_pack = data_get($this->application, 'build_pack'); - $this->build_args = collect([]); - - $this->deployment_uuid = $this->application_deployment_queue->deployment_uuid; - $this->pull_request_id = $this->application_deployment_queue->pull_request_id; - $this->commit = $this->application_deployment_queue->commit; - $this->rollback = $this->application_deployment_queue->rollback; - $this->disableBuildCache = $this->application->settings->disable_build_cache; - $this->force_rebuild = $this->application_deployment_queue->force_rebuild; - if ($this->disableBuildCache) { - $this->force_rebuild = true; - } - $this->restart_only = $this->application_deployment_queue->restart_only; - $this->restart_only = $this->restart_only && $this->application->build_pack !== 'dockerimage' && $this->application->build_pack !== 'dockerfile'; - $this->only_this_server = $this->application_deployment_queue->only_this_server; - - $this->git_type = data_get($this->application_deployment_queue, 'git_type'); - - $source = data_get($this->application, 'source'); - if ($source) { - $this->source = $source->getMorphClass()::where('id', $this->application->source->id)->first(); - } - $this->server = Server::find($this->application_deployment_queue->server_id); - $this->timeout = $this->server->settings->dynamic_timeout; - $this->destination = $this->server->destinations()->where('id', $this->application_deployment_queue->destination_id)->first(); - $this->server = $this->mainServer = $this->destination->server; - $this->serverUser = $this->server->user; - $this->is_this_additional_server = $this->application->additional_servers()->wherePivot('server_id', $this->server->id)->count() > 0; - $this->preserveRepository = $this->application->settings->is_preserve_repository_enabled; - - $this->basedir = $this->application->generateBaseDir($this->deployment_uuid); - $this->workdir = "{$this->basedir}".rtrim($this->application->base_directory, '/'); - $this->configuration_dir = application_configuration_dir()."/{$this->application->uuid}"; - $this->is_debug_enabled = $this->application->settings->is_debug_enabled; - - $this->container_name = generateApplicationContainerName($this->application, $this->pull_request_id); - if ($this->application->settings->custom_internal_name && ! $this->application->settings->is_consistent_container_name_enabled) { - if ($this->pull_request_id === 0) { - $this->container_name = $this->application->settings->custom_internal_name; - } else { - $this->container_name = "{$this->application->settings->custom_internal_name}-pr-{$this->pull_request_id}"; - } - } - - $this->saved_outputs = collect(); - - // Set preview fqdn - if ($this->pull_request_id !== 0) { - $this->preview = $this->application->generate_preview_fqdn($this->pull_request_id); - if ($this->application->is_github_based()) { - ApplicationPullRequestUpdateJob::dispatch(application: $this->application, preview: $this->preview, deployment_uuid: $this->deployment_uuid, status: ProcessStatus::IN_PROGRESS); - } - if ($this->application->build_pack === 'dockerfile') { - if (data_get($this->application, 'dockerfile_location')) { - $this->dockerfile_location = $this->application->dockerfile_location; - } - } - } - } - - public function handle(): void - { - $this->application_deployment_queue->update([ - 'status' => ApplicationDeploymentStatus::IN_PROGRESS->value, - 'horizon_job_worker' => gethostname(), - ]); - if ($this->server->isFunctional() === false) { - $this->application_deployment_queue->addLogEntry('Server is not functional.'); - $this->fail('Server is not functional.'); - - return; - } - try { - // Make sure the private key is stored in the filesystem - $this->server->privateKey->storeInFileSystem(); - - // Generate custom host<->ip mapping - $allContainers = instant_remote_process(["docker network inspect {$this->destination->network} -f '{{json .Containers}}' "], $this->server); - - if (! is_null($allContainers)) { - $allContainers = format_docker_command_output_to_json($allContainers); - $ips = collect([]); - if (count($allContainers) > 0) { - $allContainers = $allContainers[0]; - $allContainers = collect($allContainers)->sort()->values(); - foreach ($allContainers as $container) { - $containerName = data_get($container, 'Name'); - if ($containerName === 'coolify-proxy') { - continue; - } - if (preg_match('/-(\d{12})/', $containerName)) { - continue; - } - $containerIp = data_get($container, 'IPv4Address'); - if ($containerName && $containerIp) { - $containerIp = str($containerIp)->before('/'); - $ips->put($containerName, $containerIp->value()); - } - } - } - $this->addHosts = $ips->map(function ($ip, $name) { - return "--add-host $name:$ip"; - })->implode(' '); - } - - if ($this->application->dockerfile_target_build) { - $this->buildTarget = " --target {$this->application->dockerfile_target_build} "; - } - - // Check custom port - ['repository' => $this->customRepository, 'port' => $this->customPort] = $this->application->customRepository(); - - if (data_get($this->application, 'settings.is_build_server_enabled')) { - $teamId = data_get($this->application, 'environment.project.team.id'); - $buildServers = Server::buildServers($teamId)->get(); - if ($buildServers->count() === 0) { - $this->application_deployment_queue->addLogEntry('No suitable build server found. Using the deployment server.'); - $this->build_server = $this->server; - $this->original_server = $this->server; - } else { - $this->build_server = $buildServers->random(); - $this->application_deployment_queue->build_server_id = $this->build_server->id; - $this->application_deployment_queue->addLogEntry("Found a suitable build server ({$this->build_server->name})."); - $this->original_server = $this->server; - $this->use_build_server = true; - } - } else { - // Set build server & original_server to the same as deployment server - $this->build_server = $this->server; - $this->original_server = $this->server; - } - $this->decide_what_to_do(); - } catch (Exception $e) { - if ($this->pull_request_id !== 0 && $this->application->is_github_based()) { - ApplicationPullRequestUpdateJob::dispatch(application: $this->application, preview: $this->preview, deployment_uuid: $this->deployment_uuid, status: ProcessStatus::ERROR); - } - $this->fail($e); - throw $e; - } finally { - $this->application_deployment_queue->update([ - 'finished_at' => Carbon::now()->toImmutable(), - ]); - - if ($this->use_build_server) { - $this->server = $this->build_server; - } else { - $this->write_deployment_configurations(); - } - $this->execute_remote_command( - [ - "docker rm -f {$this->deployment_uuid} >/dev/null 2>&1", - 'hidden' => true, - 'ignore_errors' => true, - ] - ); - - ApplicationStatusChanged::dispatch(data_get($this->application, 'environment.project.team.id')); - } - } - - private function decide_what_to_do() - { - if ($this->restart_only) { - $this->just_restart(); - - return; - } elseif ($this->pull_request_id !== 0) { - $this->deploy_pull_request(); - } elseif ($this->application->dockerfile) { - $this->deploy_simple_dockerfile(); - } elseif ($this->application->build_pack === 'dockercompose') { - $this->deploy_docker_compose_buildpack(); - } elseif ($this->application->build_pack === 'dockerimage') { - $this->deploy_dockerimage_buildpack(); - } elseif ($this->application->build_pack === 'dockerfile') { - $this->deploy_dockerfile_buildpack(); - } elseif ($this->application->build_pack === 'static') { - $this->deploy_static_buildpack(); - } else { - $this->deploy_nixpacks_buildpack(); - } - $this->post_deployment(); - } - - private function post_deployment() - { - if ($this->server->isProxyShouldRun()) { - GetContainersStatus::dispatch($this->server); - } - $this->next(ApplicationDeploymentStatus::FINISHED->value); - if ($this->pull_request_id !== 0) { - if ($this->application->is_github_based()) { - ApplicationPullRequestUpdateJob::dispatch(application: $this->application, preview: $this->preview, deployment_uuid: $this->deployment_uuid, status: ProcessStatus::FINISHED); - } - } - $this->run_post_deployment_command(); - $this->application->isConfigurationChanged(true); - } - - private function deploy_simple_dockerfile() - { - if ($this->use_build_server) { - $this->server = $this->build_server; - } - $dockerfile_base64 = base64_encode($this->application->dockerfile); - $this->application_deployment_queue->addLogEntry("Starting deployment of {$this->application->name} to {$this->server->name}."); - $this->prepare_builder_image(); - $this->execute_remote_command( - [ - executeInDocker($this->deployment_uuid, "echo '$dockerfile_base64' | base64 -d | tee {$this->workdir}{$this->dockerfile_location} > /dev/null"), - ], - ); - $this->generate_image_names(); - $this->generate_compose_file(); - $this->generate_build_env_variables(); - $this->add_build_env_variables_to_dockerfile(); - $this->build_image(); - $this->push_to_docker_registry(); - $this->rolling_update(); - } - - private function deploy_dockerimage_buildpack() - { - $this->dockerImage = $this->application->docker_registry_image_name; - if (str($this->application->docker_registry_image_tag)->isEmpty()) { - $this->dockerImageTag = 'latest'; - } else { - $this->dockerImageTag = $this->application->docker_registry_image_tag; - } - $this->application_deployment_queue->addLogEntry("Starting deployment of {$this->dockerImage}:{$this->dockerImageTag} to {$this->server->name}."); - $this->generate_image_names(); - $this->prepare_builder_image(); - $this->generate_compose_file(); - $this->rolling_update(); - } - - private function deploy_docker_compose_buildpack() - { - if (data_get($this->application, 'docker_compose_location')) { - $this->docker_compose_location = $this->application->docker_compose_location; - } - if (data_get($this->application, 'docker_compose_custom_start_command')) { - $this->docker_compose_custom_start_command = $this->application->docker_compose_custom_start_command; - if (! str($this->docker_compose_custom_start_command)->contains('--project-directory')) { - $this->docker_compose_custom_start_command = str($this->docker_compose_custom_start_command)->replaceFirst('compose', 'compose --project-directory '.$this->workdir)->value(); - } - } - if (data_get($this->application, 'docker_compose_custom_build_command')) { - $this->docker_compose_custom_build_command = $this->application->docker_compose_custom_build_command; - if (! str($this->docker_compose_custom_build_command)->contains('--project-directory')) { - $this->docker_compose_custom_build_command = str($this->docker_compose_custom_build_command)->replaceFirst('compose', 'compose --project-directory '.$this->workdir)->value(); - } - } - if ($this->pull_request_id === 0) { - $this->application_deployment_queue->addLogEntry("Starting deployment of {$this->application->name} to {$this->server->name}."); - } else { - $this->application_deployment_queue->addLogEntry("Starting pull request (#{$this->pull_request_id}) deployment of {$this->customRepository}:{$this->application->git_branch} to {$this->server->name}."); - } - $this->prepare_builder_image(); - $this->check_git_if_build_needed(); - $this->clone_repository(); - if ($this->preserveRepository) { - foreach ($this->application->fileStorages as $fileStorage) { - $path = $fileStorage->fs_path; - $saveName = 'file_stat_'.$fileStorage->id; - $realPathInGit = str($path)->replace($this->application->workdir(), $this->workdir)->value(); - // check if the file is a directory or a file inside the repository - $this->execute_remote_command( - [executeInDocker($this->deployment_uuid, "stat -c '%F' {$realPathInGit}"), 'hidden' => true, 'ignore_errors' => true, 'save' => $saveName] - ); - if ($this->saved_outputs->has($saveName)) { - $fileStat = $this->saved_outputs->get($saveName); - if ($fileStat->value() === 'directory' && ! $fileStorage->is_directory) { - $fileStorage->is_directory = true; - $fileStorage->content = null; - $fileStorage->save(); - $fileStorage->deleteStorageOnServer(); - $fileStorage->saveStorageOnServer(); - } elseif ($fileStat->value() === 'regular file' && $fileStorage->is_directory) { - $fileStorage->is_directory = false; - $fileStorage->is_based_on_git = true; - $fileStorage->save(); - $fileStorage->deleteStorageOnServer(); - $fileStorage->saveStorageOnServer(); - } - } - } - } - $this->generate_image_names(); - $this->cleanup_git(); - $this->application->loadComposeFile(isInit: false); - if ($this->application->settings->is_raw_compose_deployment_enabled) { - $this->application->oldRawParser(); - $yaml = $composeFile = $this->application->docker_compose_raw; - $this->save_environment_variables(); - } else { - $composeFile = $this->application->parse(pull_request_id: $this->pull_request_id, preview_id: data_get($this->preview, 'id')); - $this->save_environment_variables(); - if (! is_null($this->env_filename)) { - $services = collect(data_get($composeFile, 'services', [])); - $services = $services->map(function ($service, $name) { - $service['env_file'] = [$this->env_filename]; - - return $service; - }); - $composeFile['services'] = $services->toArray(); - } - if (is_null($composeFile)) { - $this->application_deployment_queue->addLogEntry('Failed to parse docker-compose file.'); - $this->fail('Failed to parse docker-compose file.'); - - return; - } - $yaml = Yaml::dump(convertToArray($composeFile), 10); - } - $this->docker_compose_base64 = base64_encode($yaml); - $this->execute_remote_command([ - executeInDocker($this->deployment_uuid, "echo '{$this->docker_compose_base64}' | base64 -d | tee {$this->workdir}{$this->docker_compose_location} > /dev/null"), - 'hidden' => true, - ]); - // Build new container to limit downtime. - $this->application_deployment_queue->addLogEntry('Pulling & building required images.'); - - if ($this->docker_compose_custom_build_command) { - $this->execute_remote_command( - [executeInDocker($this->deployment_uuid, "cd {$this->basedir} && {$this->docker_compose_custom_build_command}"), 'hidden' => true], - ); - } else { - $command = "{$this->coolify_variables} docker compose"; - if ($this->env_filename) { - $command .= " --env-file {$this->workdir}/{$this->env_filename}"; - } - $command .= " --project-name {$this->application->uuid} --project-directory {$this->workdir} -f {$this->workdir}{$this->docker_compose_location} build --pull"; - $this->execute_remote_command( - [executeInDocker($this->deployment_uuid, $command), 'hidden' => true], - ); - } - - $this->stop_running_container(force: true); - $this->application_deployment_queue->addLogEntry('Starting new application.'); - $networkId = $this->application->uuid; - if ($this->pull_request_id !== 0) { - $networkId = "{$this->application->uuid}-{$this->pull_request_id}"; - } - if ($this->server->isSwarm()) { - // TODO - } else { - $this->execute_remote_command([ - "docker network inspect '{$networkId}' >/dev/null 2>&1 || docker network create --attachable '{$networkId}' >/dev/null || true", - 'hidden' => true, - 'ignore_errors' => true, - ], [ - "docker network connect {$networkId} coolify-proxy >/dev/null 2>&1 || true", - 'hidden' => true, - 'ignore_errors' => true, - ]); - } - - // Start compose file - $server_workdir = $this->application->workdir(); - if ($this->application->settings->is_raw_compose_deployment_enabled) { - if ($this->docker_compose_custom_start_command) { - $this->write_deployment_configurations(); - $this->execute_remote_command( - [executeInDocker($this->deployment_uuid, "cd {$this->workdir} && {$this->docker_compose_custom_start_command}"), 'hidden' => true], - ); - } else { - $this->write_deployment_configurations(); - $this->docker_compose_location = '/docker-compose.yaml'; - - $command = "{$this->coolify_variables} docker compose"; - if ($this->env_filename) { - $command .= " --env-file {$server_workdir}/{$this->env_filename}"; - } - $command .= " --project-directory {$server_workdir} -f {$server_workdir}{$this->docker_compose_location} up -d"; - $this->execute_remote_command( - ['command' => $command, 'hidden' => true], - ); - } - } else { - if ($this->docker_compose_custom_start_command) { - $this->write_deployment_configurations(); - $this->execute_remote_command( - [executeInDocker($this->deployment_uuid, "cd {$this->basedir} && {$this->docker_compose_custom_start_command}"), 'hidden' => true], - ); - } else { - $command = "{$this->coolify_variables} docker compose"; - if ($this->preserveRepository) { - if ($this->env_filename) { - $command .= " --env-file {$server_workdir}/{$this->env_filename}"; - } - $command .= " --project-name {$this->application->uuid} --project-directory {$server_workdir} -f {$server_workdir}{$this->docker_compose_location} up -d"; - $this->write_deployment_configurations(); - - $this->execute_remote_command( - ['command' => $command, 'hidden' => true], - ); - } else { - if ($this->env_filename) { - $command .= " --env-file {$this->workdir}/{$this->env_filename}"; - } - $command .= " --project-name {$this->application->uuid} --project-directory {$this->workdir} -f {$this->workdir}{$this->docker_compose_location} up -d"; - $this->execute_remote_command( - [executeInDocker($this->deployment_uuid, $command), 'hidden' => true], - ); - $this->write_deployment_configurations(); - } - } - } - - $this->application_deployment_queue->addLogEntry('New container started.'); - } - - private function deploy_dockerfile_buildpack() - { - $this->application_deployment_queue->addLogEntry("Starting deployment of {$this->customRepository}:{$this->application->git_branch} to {$this->server->name}."); - if ($this->use_build_server) { - $this->server = $this->build_server; - } - if (data_get($this->application, 'dockerfile_location')) { - $this->dockerfile_location = $this->application->dockerfile_location; - } - $this->prepare_builder_image(); - $this->check_git_if_build_needed(); - $this->generate_image_names(); - $this->clone_repository(); - if (! $this->force_rebuild) { - $this->check_image_locally_or_remotely(); - if ($this->should_skip_build()) { - return; - } - } - $this->cleanup_git(); - $this->generate_compose_file(); - $this->generate_build_env_variables(); - $this->add_build_env_variables_to_dockerfile(); - $this->build_image(); - $this->push_to_docker_registry(); - $this->rolling_update(); - } - - private function deploy_nixpacks_buildpack() - { - if ($this->use_build_server) { - $this->server = $this->build_server; - } - $this->application_deployment_queue->addLogEntry("Starting deployment of {$this->customRepository}:{$this->application->git_branch} to {$this->server->name}."); - $this->prepare_builder_image(); - $this->check_git_if_build_needed(); - $this->generate_image_names(); - if (! $this->force_rebuild) { - $this->check_image_locally_or_remotely(); - if ($this->should_skip_build()) { - return; - } - } - $this->clone_repository(); - $this->cleanup_git(); - $this->generate_nixpacks_confs(); - $this->generate_compose_file(); - $this->generate_build_env_variables(); - $this->build_image(); - $this->push_to_docker_registry(); - $this->rolling_update(); - } - - private function deploy_static_buildpack() - { - if ($this->use_build_server) { - $this->server = $this->build_server; - } - $this->application_deployment_queue->addLogEntry("Starting deployment of {$this->customRepository}:{$this->application->git_branch} to {$this->server->name}."); - $this->prepare_builder_image(); - $this->check_git_if_build_needed(); - $this->generate_image_names(); - if (! $this->force_rebuild) { - $this->check_image_locally_or_remotely(); - if ($this->should_skip_build()) { - return; - } - } - $this->clone_repository(); - $this->cleanup_git(); - $this->generate_compose_file(); - $this->build_image(); - $this->push_to_docker_registry(); - $this->rolling_update(); - } - - private function write_deployment_configurations() - { - if ($this->preserveRepository) { - if ($this->use_build_server) { - $this->server = $this->original_server; - } - if (str($this->configuration_dir)->isNotEmpty()) { - $this->execute_remote_command( - [ - "mkdir -p $this->configuration_dir", - ], - [ - "docker cp {$this->deployment_uuid}:{$this->workdir}/. {$this->configuration_dir}", - ], - ); - } - foreach ($this->application->fileStorages as $fileStorage) { - if (! $fileStorage->is_based_on_git && ! $fileStorage->is_directory) { - $fileStorage->saveStorageOnServer(); - } - } - if ($this->use_build_server) { - $this->server = $this->build_server; - } - } - if (isset($this->docker_compose_base64)) { - if ($this->use_build_server) { - $this->server = $this->original_server; - } - $readme = generate_readme_file($this->application->name, $this->application_deployment_queue->updated_at); - - $mainDir = $this->configuration_dir; - if ($this->application->settings->is_raw_compose_deployment_enabled) { - $mainDir = $this->application->workdir(); - } - if ($this->pull_request_id === 0) { - $composeFileName = "$mainDir/docker-compose.yaml"; - } else { - $composeFileName = "$mainDir/docker-compose-pr-{$this->pull_request_id}.yaml"; - $this->docker_compose_location = "/docker-compose-pr-{$this->pull_request_id}.yaml"; - } - $this->execute_remote_command( - [ - "mkdir -p $mainDir", - ], - [ - "echo '{$this->docker_compose_base64}' | base64 -d | tee $composeFileName > /dev/null", - ], - [ - "echo '{$readme}' > $mainDir/README.md", - ] - ); - if ($this->use_build_server) { - $this->server = $this->build_server; - } - } - } - - private function push_to_docker_registry() - { - $forceFail = true; - if (str($this->application->docker_registry_image_name)->isEmpty()) { - return; - } - if ($this->restart_only) { - return; - } - if ($this->application->build_pack === 'dockerimage') { - return; - } - if ($this->use_build_server) { - $forceFail = true; - } - if ($this->server->isSwarm() && $this->build_pack !== 'dockerimage') { - $forceFail = true; - } - if ($this->application->additional_servers->count() > 0) { - $forceFail = true; - } - if ($this->is_this_additional_server) { - return; - } - try { - instant_remote_process(["docker images --format '{{json .}}' {$this->production_image_name}"], $this->server); - $this->application_deployment_queue->addLogEntry('----------------------------------------'); - $this->application_deployment_queue->addLogEntry("Pushing image to docker registry ({$this->production_image_name})."); - $this->execute_remote_command( - [ - executeInDocker($this->deployment_uuid, "docker push {$this->production_image_name}"), - 'hidden' => true, - ], - ); - if ($this->application->docker_registry_image_tag) { - // Tag image with docker_registry_image_tag - $this->application_deployment_queue->addLogEntry("Tagging and pushing image with {$this->application->docker_registry_image_tag} tag."); - $this->execute_remote_command( - [ - executeInDocker($this->deployment_uuid, "docker tag {$this->production_image_name} {$this->application->docker_registry_image_name}:{$this->application->docker_registry_image_tag}"), - 'ignore_errors' => true, - 'hidden' => true, - ], - [ - executeInDocker($this->deployment_uuid, "docker push {$this->application->docker_registry_image_name}:{$this->application->docker_registry_image_tag}"), - 'ignore_errors' => true, - 'hidden' => true, - ], - ); - } - } catch (Exception $e) { - $this->application_deployment_queue->addLogEntry('Failed to push image to docker registry. Please check debug logs for more information.'); - if ($forceFail) { - throw new RuntimeException($e->getMessage(), 69420); - } - } - } - - private function generate_image_names() - { - if ($this->application->dockerfile) { - if ($this->application->docker_registry_image_name) { - $this->build_image_name = "{$this->application->docker_registry_image_name}:build"; - $this->production_image_name = "{$this->application->docker_registry_image_name}:latest"; - } else { - $this->build_image_name = "{$this->application->uuid}:build"; - $this->production_image_name = "{$this->application->uuid}:latest"; - } - } elseif ($this->application->build_pack === 'dockerimage') { - $this->production_image_name = "{$this->dockerImage}:{$this->dockerImageTag}"; - } elseif ($this->pull_request_id !== 0) { - if ($this->application->docker_registry_image_name) { - $this->build_image_name = "{$this->application->docker_registry_image_name}:pr-{$this->pull_request_id}-build"; - $this->production_image_name = "{$this->application->docker_registry_image_name}:pr-{$this->pull_request_id}"; - } else { - $this->build_image_name = "{$this->application->uuid}:pr-{$this->pull_request_id}-build"; - $this->production_image_name = "{$this->application->uuid}:pr-{$this->pull_request_id}"; - } - } else { - $this->dockerImageTag = str($this->commit)->substr(0, 128); - // if ($this->application->docker_registry_image_tag) { - // $this->dockerImageTag = $this->application->docker_registry_image_tag; - // } - if ($this->application->docker_registry_image_name) { - $this->build_image_name = "{$this->application->docker_registry_image_name}:{$this->dockerImageTag}-build"; - $this->production_image_name = "{$this->application->docker_registry_image_name}:{$this->dockerImageTag}"; - } else { - $this->build_image_name = "{$this->application->uuid}:{$this->dockerImageTag}-build"; - $this->production_image_name = "{$this->application->uuid}:{$this->dockerImageTag}"; - } - } - } - - private function just_restart() - { - $this->application_deployment_queue->addLogEntry("Restarting {$this->customRepository}:{$this->application->git_branch} on {$this->server->name}."); - $this->prepare_builder_image(); - $this->check_git_if_build_needed(); - $this->generate_image_names(); - $this->check_image_locally_or_remotely(); - $this->should_skip_build(); - $this->next(ApplicationDeploymentStatus::FINISHED->value); - } - - private function should_skip_build() - { - if (str($this->saved_outputs->get('local_image_found'))->isNotEmpty()) { - if ($this->is_this_additional_server) { - $this->application_deployment_queue->addLogEntry("Image found ({$this->production_image_name}) with the same Git Commit SHA. Build step skipped."); - $this->generate_compose_file(); - $this->push_to_docker_registry(); - $this->rolling_update(); - if ($this->restart_only) { - $this->post_deployment(); - } - - return true; - } - if (! $this->application->isConfigurationChanged()) { - $this->application_deployment_queue->addLogEntry("No configuration changed & image found ({$this->production_image_name}) with the same Git Commit SHA. Build step skipped."); - $this->generate_compose_file(); - $this->push_to_docker_registry(); - $this->rolling_update(); - - return true; - } else { - $this->application_deployment_queue->addLogEntry('Configuration changed. Rebuilding image.'); - } - } else { - $this->application_deployment_queue->addLogEntry("Image not found ({$this->production_image_name}). Building new image."); - } - if ($this->restart_only) { - $this->restart_only = false; - $this->decide_what_to_do(); - } - - return false; - } - - private function check_image_locally_or_remotely() - { - $this->execute_remote_command([ - "docker images -q {$this->production_image_name} 2>/dev/null", - 'hidden' => true, - 'save' => 'local_image_found', - ]); - if (str($this->saved_outputs->get('local_image_found'))->isEmpty() && $this->application->docker_registry_image_name) { - $this->execute_remote_command([ - "docker pull {$this->production_image_name} 2>/dev/null", - 'ignore_errors' => true, - 'hidden' => true, - ]); - $this->execute_remote_command([ - "docker images -q {$this->production_image_name} 2>/dev/null", - 'hidden' => true, - 'save' => 'local_image_found', - ]); - } - } - - private function save_environment_variables() - { - $envs = collect([]); - $local_branch = $this->branch; - if ($this->pull_request_id !== 0) { - $local_branch = "pull/{$this->pull_request_id}/head"; - } - $sort = $this->application->settings->is_env_sorting_enabled; - if ($sort) { - $sorted_environment_variables = $this->application->environment_variables->sortBy('key'); - $sorted_environment_variables_preview = $this->application->environment_variables_preview->sortBy('key'); - } else { - $sorted_environment_variables = $this->application->environment_variables->sortBy('id'); - $sorted_environment_variables_preview = $this->application->environment_variables_preview->sortBy('id'); - } - $ports = $this->application->main_port(); - if ($this->pull_request_id !== 0) { - $this->env_filename = ".env-pr-$this->pull_request_id"; - // Add SOURCE_COMMIT if not exists - if ($this->application->environment_variables_preview->where('key', 'SOURCE_COMMIT')->isEmpty()) { - if (! is_null($this->commit)) { - $envs->push("SOURCE_COMMIT={$this->commit}"); - } else { - $envs->push('SOURCE_COMMIT=unknown'); - } - } - if ($this->application->environment_variables_preview->where('key', 'COOLIFY_FQDN')->isEmpty()) { - $envs->push("COOLIFY_FQDN={$this->preview->fqdn}"); - $envs->push("COOLIFY_DOMAIN_URL={$this->preview->fqdn}"); - } - if ($this->application->environment_variables_preview->where('key', 'COOLIFY_URL')->isEmpty()) { - $url = str($this->preview->fqdn)->replace('http://', '')->replace('https://', ''); - $envs->push("COOLIFY_URL={$url}"); - $envs->push("COOLIFY_DOMAIN_FQDN={$url}"); - } - if ($this->application->build_pack !== 'dockercompose' || $this->application->compose_parsing_version === '1' || $this->application->compose_parsing_version === '2') { - if ($this->application->environment_variables_preview->where('key', 'COOLIFY_BRANCH')->isEmpty()) { - $envs->push("COOLIFY_BRANCH=\"{$local_branch}\""); - } - if ($this->application->environment_variables_preview->where('key', 'COOLIFY_RESOURCE_UUID')->isEmpty()) { - $envs->push("COOLIFY_RESOURCE_UUID={$this->application->uuid}"); - } - if ($this->application->environment_variables_preview->where('key', 'COOLIFY_CONTAINER_NAME')->isEmpty()) { - $envs->push("COOLIFY_CONTAINER_NAME={$this->container_name}"); - } - } - - add_coolify_default_environment_variables($this->application, $envs, $this->application->environment_variables_preview); - - foreach ($sorted_environment_variables_preview as $env) { - $real_value = $env->real_value; - if ($env->version === '4.0.0-beta.239') { - $real_value = $env->real_value; - } else { - if ($env->is_literal || $env->is_multiline) { - $real_value = '\''.$real_value.'\''; - } else { - $real_value = escapeEnvVariables($env->real_value); - } - } - $envs->push($env->key.'='.$real_value); - } - // Add PORT if not exists, use the first port as default - if ($this->build_pack !== 'dockercompose') { - if ($this->application->environment_variables_preview->where('key', 'PORT')->isEmpty()) { - $envs->push("PORT={$ports[0]}"); - } - } - // Add HOST if not exists - if ($this->application->environment_variables_preview->where('key', 'HOST')->isEmpty()) { - $envs->push('HOST=0.0.0.0'); - } - } else { - $this->env_filename = '.env'; - // Add SOURCE_COMMIT if not exists - if ($this->application->environment_variables->where('key', 'SOURCE_COMMIT')->isEmpty()) { - if (! is_null($this->commit)) { - $envs->push("SOURCE_COMMIT={$this->commit}"); - } else { - $envs->push('SOURCE_COMMIT=unknown'); - } - } - if ($this->application->environment_variables->where('key', 'COOLIFY_FQDN')->isEmpty()) { - if ((int) $this->application->compose_parsing_version >= 3) { - $envs->push("COOLIFY_URL={$this->application->fqdn}"); - } else { - $envs->push("COOLIFY_FQDN={$this->application->fqdn}"); - } - } - if ($this->application->environment_variables->where('key', 'COOLIFY_URL')->isEmpty()) { - $url = str($this->application->fqdn)->replace('http://', '')->replace('https://', ''); - if ((int) $this->application->compose_parsing_version >= 3) { - $envs->push("COOLIFY_FQDN={$url}"); - } else { - $envs->push("COOLIFY_URL={$url}"); - } - } - if ($this->application->build_pack !== 'dockercompose' || $this->application->compose_parsing_version === '1' || $this->application->compose_parsing_version === '2') { - if ($this->application->environment_variables->where('key', 'COOLIFY_BRANCH')->isEmpty()) { - $envs->push("COOLIFY_BRANCH=\"{$local_branch}\""); - } - if ($this->application->environment_variables->where('key', 'COOLIFY_RESOURCE_UUID')->isEmpty()) { - $envs->push("COOLIFY_RESOURCE_UUID={$this->application->uuid}"); - } - if ($this->application->environment_variables->where('key', 'COOLIFY_CONTAINER_NAME')->isEmpty()) { - $envs->push("COOLIFY_CONTAINER_NAME={$this->container_name}"); - } - } - - add_coolify_default_environment_variables($this->application, $envs, $this->application->environment_variables); - - foreach ($sorted_environment_variables as $env) { - $real_value = $env->real_value; - if ($env->version === '4.0.0-beta.239') { - $real_value = $env->real_value; - } else { - if ($env->is_literal || $env->is_multiline) { - $real_value = '\''.$real_value.'\''; - } else { - $real_value = escapeEnvVariables($env->real_value); - } - } - $envs->push($env->key.'='.$real_value); - } - // Add PORT if not exists, use the first port as default - if ($this->build_pack !== 'dockercompose') { - if ($this->application->environment_variables->where('key', 'PORT')->isEmpty()) { - $envs->push("PORT={$ports[0]}"); - } - } - // Add HOST if not exists - if ($this->application->environment_variables->where('key', 'HOST')->isEmpty()) { - $envs->push('HOST=0.0.0.0'); - } - } - if ($envs->isEmpty()) { - $this->env_filename = null; - if ($this->use_build_server) { - $this->server = $this->original_server; - $this->execute_remote_command( - [ - 'command' => "rm -f $this->configuration_dir/{$this->env_filename}", - 'hidden' => true, - 'ignore_errors' => true, - ] - ); - $this->server = $this->build_server; - $this->execute_remote_command( - [ - 'command' => "rm -f $this->configuration_dir/{$this->env_filename}", - 'hidden' => true, - 'ignore_errors' => true, - ] - ); - } else { - $this->execute_remote_command( - [ - 'command' => "rm -f $this->configuration_dir/{$this->env_filename}", - 'hidden' => true, - 'ignore_errors' => true, - ] - ); - } - } else { - $envs_base64 = base64_encode($envs->implode("\n")); - $this->execute_remote_command( - [ - executeInDocker($this->deployment_uuid, "echo '$envs_base64' | base64 -d | tee $this->workdir/{$this->env_filename} > /dev/null"), - ], - - ); - if ($this->use_build_server) { - $this->server = $this->original_server; - $this->execute_remote_command( - [ - "echo '$envs_base64' | base64 -d | tee $this->configuration_dir/{$this->env_filename} > /dev/null", - ] - ); - $this->server = $this->build_server; - } else { - $this->execute_remote_command( - [ - "echo '$envs_base64' | base64 -d | tee $this->configuration_dir/{$this->env_filename} > /dev/null", - ] - ); - } - } - $this->environment_variables = $envs; - } - - private function elixir_finetunes() - { - if ($this->pull_request_id === 0) { - $envType = 'environment_variables'; - } else { - $envType = 'environment_variables_preview'; - } - $mix_env = $this->application->{$envType}->where('key', 'MIX_ENV')->first(); - if ($mix_env) { - if ($mix_env->is_build_time === false) { - $this->application_deployment_queue->addLogEntry('MIX_ENV environment variable is not set as build time.', type: 'error'); - $this->application_deployment_queue->addLogEntry('Please set MIX_ENV environment variable to be build time variable if you facing any issues with the deployment.', type: 'error'); - } - } else { - $this->application_deployment_queue->addLogEntry('MIX_ENV environment variable not found.', type: 'error'); - $this->application_deployment_queue->addLogEntry('Please add MIX_ENV environment variable and set it to be build time variable if you facing any issues with the deployment.', type: 'error'); - } - $secret_key_base = $this->application->{$envType}->where('key', 'SECRET_KEY_BASE')->first(); - if ($secret_key_base) { - if ($secret_key_base->is_build_time === false) { - $this->application_deployment_queue->addLogEntry('SECRET_KEY_BASE environment variable is not set as build time.', type: 'error'); - $this->application_deployment_queue->addLogEntry('Please set SECRET_KEY_BASE environment variable to be build time variable if you facing any issues with the deployment.', type: 'error'); - } - } else { - $this->application_deployment_queue->addLogEntry('SECRET_KEY_BASE environment variable not found.', type: 'error'); - $this->application_deployment_queue->addLogEntry('Please add SECRET_KEY_BASE environment variable and set it to be build time variable if you facing any issues with the deployment.', type: 'error'); - } - $database_url = $this->application->{$envType}->where('key', 'DATABASE_URL')->first(); - if ($database_url) { - if ($database_url->is_build_time === false) { - $this->application_deployment_queue->addLogEntry('DATABASE_URL environment variable is not set as build time.', type: 'error'); - $this->application_deployment_queue->addLogEntry('Please set DATABASE_URL environment variable to be build time variable if you facing any issues with the deployment.', type: 'error'); - } - } else { - $this->application_deployment_queue->addLogEntry('DATABASE_URL environment variable not found.', type: 'error'); - $this->application_deployment_queue->addLogEntry('Please add DATABASE_URL environment variable and set it to be build time variable if you facing any issues with the deployment.', type: 'error'); - } - } - - private function laravel_finetunes() - { - if ($this->pull_request_id === 0) { - $envType = 'environment_variables'; - } else { - $envType = 'environment_variables_preview'; - } - $nixpacks_php_fallback_path = $this->application->{$envType}->where('key', 'NIXPACKS_PHP_FALLBACK_PATH')->first(); - $nixpacks_php_root_dir = $this->application->{$envType}->where('key', 'NIXPACKS_PHP_ROOT_DIR')->first(); - - if (! $nixpacks_php_fallback_path) { - $nixpacks_php_fallback_path = new EnvironmentVariable; - $nixpacks_php_fallback_path->key = 'NIXPACKS_PHP_FALLBACK_PATH'; - $nixpacks_php_fallback_path->value = '/index.php'; - $nixpacks_php_fallback_path->is_build_time = false; - $nixpacks_php_fallback_path->resourceable_id = $this->application->id; - $nixpacks_php_fallback_path->resourceable_type = 'App\Models\Application'; - $nixpacks_php_fallback_path->save(); - } - if (! $nixpacks_php_root_dir) { - $nixpacks_php_root_dir = new EnvironmentVariable; - $nixpacks_php_root_dir->key = 'NIXPACKS_PHP_ROOT_DIR'; - $nixpacks_php_root_dir->value = '/app/public'; - $nixpacks_php_root_dir->is_build_time = false; - $nixpacks_php_root_dir->resourceable_id = $this->application->id; - $nixpacks_php_root_dir->resourceable_type = 'App\Models\Application'; - $nixpacks_php_root_dir->save(); - } - - return [$nixpacks_php_fallback_path, $nixpacks_php_root_dir]; - } - - private function rolling_update() - { - if ($this->server->isSwarm()) { - $this->application_deployment_queue->addLogEntry('Rolling update started.'); - $this->execute_remote_command( - [ - executeInDocker($this->deployment_uuid, "docker stack deploy --detach=true --with-registry-auth -c {$this->workdir}{$this->docker_compose_location} {$this->application->uuid}"), - ], - ); - $this->application_deployment_queue->addLogEntry('Rolling update completed.'); - } else { - if ($this->use_build_server) { - $this->write_deployment_configurations(); - $this->server = $this->original_server; - } - if (count($this->application->ports_mappings_array) > 0 || (bool) $this->application->settings->is_consistent_container_name_enabled || str($this->application->settings->custom_internal_name)->isNotEmpty() || $this->pull_request_id !== 0 || str($this->application->custom_docker_run_options)->contains('--ip') || str($this->application->custom_docker_run_options)->contains('--ip6')) { - $this->application_deployment_queue->addLogEntry('----------------------------------------'); - if (count($this->application->ports_mappings_array) > 0) { - $this->application_deployment_queue->addLogEntry('Application has ports mapped to the host system, rolling update is not supported.'); - } - if ((bool) $this->application->settings->is_consistent_container_name_enabled) { - $this->application_deployment_queue->addLogEntry('Consistent container name feature enabled, rolling update is not supported.'); - } - if (str($this->application->settings->custom_internal_name)->isNotEmpty()) { - $this->application_deployment_queue->addLogEntry('Custom internal name is set, rolling update is not supported.'); - } - if ($this->pull_request_id !== 0) { - $this->application->settings->is_consistent_container_name_enabled = true; - $this->application_deployment_queue->addLogEntry('Pull request deployment, rolling update is not supported.'); - } - if (str($this->application->custom_docker_run_options)->contains('--ip') || str($this->application->custom_docker_run_options)->contains('--ip6')) { - $this->application_deployment_queue->addLogEntry('Custom IP address is set, rolling update is not supported.'); - } - $this->stop_running_container(force: true); - $this->start_by_compose_file(); - } else { - $this->application_deployment_queue->addLogEntry('----------------------------------------'); - $this->application_deployment_queue->addLogEntry('Rolling update started.'); - $this->start_by_compose_file(); - $this->health_check(); - $this->stop_running_container(); - $this->application_deployment_queue->addLogEntry('Rolling update completed.'); - } - } - } - - private function health_check() - { - if ($this->server->isSwarm()) { - // Implement healthcheck for swarm - } else { - if ($this->application->isHealthcheckDisabled() && $this->application->custom_healthcheck_found === false) { - $this->newVersionIsHealthy = true; - - return; - } - if ($this->application->custom_healthcheck_found) { - $this->application_deployment_queue->addLogEntry('Custom healthcheck found, skipping default healthcheck.'); - } - if ($this->container_name) { - $counter = 1; - $this->application_deployment_queue->addLogEntry('Waiting for healthcheck to pass on the new container.'); - if ($this->full_healthcheck_url) { - $this->application_deployment_queue->addLogEntry("Healthcheck URL (inside the container): {$this->full_healthcheck_url}"); - } - $this->application_deployment_queue->addLogEntry("Waiting for the start period ({$this->application->health_check_start_period} seconds) before starting healthcheck."); - $sleeptime = 0; - while ($sleeptime < $this->application->health_check_start_period) { - Sleep::for(1)->seconds(); - $sleeptime++; - } - while ($counter <= $this->application->health_check_retries) { - $this->execute_remote_command( - [ - "docker inspect --format='{{json .State.Health.Status}}' {$this->container_name}", - 'hidden' => true, - 'save' => 'health_check', - 'append' => false, - ], - [ - "docker inspect --format='{{json .State.Health.Log}}' {$this->container_name}", - 'hidden' => true, - 'save' => 'health_check_logs', - 'append' => false, - ], - ); - $this->application_deployment_queue->addLogEntry("Attempt {$counter} of {$this->application->health_check_retries} | Healthcheck status: {$this->saved_outputs->get('health_check')}"); - $health_check_logs = data_get(collect(json_decode($this->saved_outputs->get('health_check_logs')))->last(), 'Output', '(no logs)'); - if (empty($health_check_logs)) { - $health_check_logs = '(no logs)'; - } - $health_check_return_code = data_get(collect(json_decode($this->saved_outputs->get('health_check_logs')))->last(), 'ExitCode', '(no return code)'); - if ($health_check_logs !== '(no logs)' || $health_check_return_code !== '(no return code)') { - $this->application_deployment_queue->addLogEntry("Healthcheck logs: {$health_check_logs} | Return code: {$health_check_return_code}"); - } - - if (str($this->saved_outputs->get('health_check'))->replace('"', '')->value() === 'healthy') { - $this->newVersionIsHealthy = true; - $this->application->update(['status' => 'running']); - $this->application_deployment_queue->addLogEntry('New container is healthy.'); - break; - } - if (str($this->saved_outputs->get('health_check'))->replace('"', '')->value() === 'unhealthy') { - $this->newVersionIsHealthy = false; - $this->query_logs(); - break; - } - $counter++; - $sleeptime = 0; - while ($sleeptime < $this->application->health_check_interval) { - Sleep::for(1)->seconds(); - $sleeptime++; - } - } - if (str($this->saved_outputs->get('health_check'))->replace('"', '')->value() === 'starting') { - $this->query_logs(); - } - } - } - } - - private function query_logs() - { - $this->application_deployment_queue->addLogEntry('----------------------------------------'); - $this->application_deployment_queue->addLogEntry('Container logs:'); - $this->execute_remote_command( - [ - 'command' => "docker logs -n 100 {$this->container_name}", - 'type' => 'stderr', - 'ignore_errors' => true, - ], - ); - $this->application_deployment_queue->addLogEntry('----------------------------------------'); - } - - private function deploy_pull_request() - { - if ($this->application->build_pack === 'dockercompose') { - $this->deploy_docker_compose_buildpack(); - - return; - } - if ($this->use_build_server) { - $this->server = $this->build_server; - } - $this->newVersionIsHealthy = true; - $this->generate_image_names(); - $this->application_deployment_queue->addLogEntry("Starting pull request (#{$this->pull_request_id}) deployment of {$this->customRepository}:{$this->application->git_branch}."); - $this->prepare_builder_image(); - $this->check_git_if_build_needed(); - $this->clone_repository(); - $this->cleanup_git(); - if ($this->application->build_pack === 'nixpacks') { - $this->generate_nixpacks_confs(); - } - $this->generate_compose_file(); - $this->generate_build_env_variables(); - if ($this->application->build_pack === 'dockerfile') { - $this->add_build_env_variables_to_dockerfile(); - } - $this->build_image(); - $this->push_to_docker_registry(); - // $this->stop_running_container(); - $this->rolling_update(); - } - - private function create_workdir() - { - if ($this->use_build_server) { - $this->server = $this->original_server; - $this->execute_remote_command( - [ - 'command' => "mkdir -p {$this->configuration_dir}", - ], - ); - $this->server = $this->build_server; - $this->execute_remote_command( - [ - 'command' => executeInDocker($this->deployment_uuid, "mkdir -p {$this->workdir}"), - ], - [ - 'command' => "mkdir -p {$this->configuration_dir}", - ], - ); - } else { - $this->execute_remote_command( - [ - 'command' => executeInDocker($this->deployment_uuid, "mkdir -p {$this->workdir}"), - ], - [ - 'command' => "mkdir -p {$this->configuration_dir}", - ], - ); - } - } - - private function prepare_builder_image() - { - $settings = instanceSettings(); - $helperImage = config('constants.coolify.helper_image'); - $helperImage = "{$helperImage}:{$settings->helper_version}"; - // Get user home directory - $this->serverUserHomeDir = instant_remote_process(['echo $HOME'], $this->server); - $this->dockerConfigFileExists = instant_remote_process(["test -f {$this->serverUserHomeDir}/.docker/config.json && echo 'OK' || echo 'NOK'"], $this->server); - if ($this->use_build_server) { - if ($this->dockerConfigFileExists === 'NOK') { - throw new RuntimeException('Docker config file (~/.docker/config.json) not found on the build server. Please run "docker login" to login to the docker registry on the server.'); - } - $runCommand = "docker run -d --name {$this->deployment_uuid} --rm -v {$this->serverUserHomeDir}/.docker/config.json:/root/.docker/config.json:ro -v /var/run/docker.sock:/var/run/docker.sock {$helperImage}"; - } else { - if ($this->dockerConfigFileExists === 'OK') { - $runCommand = "docker run -d --network {$this->destination->network} --name {$this->deployment_uuid} --rm -v {$this->serverUserHomeDir}/.docker/config.json:/root/.docker/config.json:ro -v /var/run/docker.sock:/var/run/docker.sock {$helperImage}"; - } else { - $runCommand = "docker run -d --network {$this->destination->network} --name {$this->deployment_uuid} --rm -v /var/run/docker.sock:/var/run/docker.sock {$helperImage}"; - } - } - $this->application_deployment_queue->addLogEntry("Preparing container with helper image: $helperImage."); - $this->execute_remote_command( - [ - 'command' => "docker rm -f {$this->deployment_uuid}", - 'ignore_errors' => true, - 'hidden' => true, - ] - ); - $this->execute_remote_command( - [ - $runCommand, - 'hidden' => true, - ], - [ - 'command' => executeInDocker($this->deployment_uuid, "mkdir -p {$this->basedir}"), - ], - ); - $this->run_pre_deployment_command(); - } - - private function deploy_to_additional_destinations() - { - if ($this->application->additional_networks->count() === 0) { - return; - } - if ($this->pull_request_id !== 0) { - return; - } - $destination_ids = $this->application->additional_networks->pluck('id'); - if ($this->server->isSwarm()) { - $this->application_deployment_queue->addLogEntry('Additional destinations are not supported in swarm mode.'); - - return; - } - if ($destination_ids->contains($this->destination->id)) { - return; - } - foreach ($destination_ids as $destination_id) { - $destination = StandaloneDocker::find($destination_id); - $server = $destination->server; - if ($server->team_id !== $this->mainServer->team_id) { - $this->application_deployment_queue->addLogEntry("Skipping deployment to {$server->name}. Not in the same team?!"); - - continue; - } - $deployment_uuid = new Cuid2; - queue_application_deployment( - deployment_uuid: $deployment_uuid, - application: $this->application, - server: $server, - destination: $destination, - no_questions_asked: true, - ); - $this->application_deployment_queue->addLogEntry("Deployment to {$server->name}. Logs: ".route('project.application.deployment.show', [ - 'project_uuid' => data_get($this->application, 'environment.project.uuid'), - 'application_uuid' => data_get($this->application, 'uuid'), - 'deployment_uuid' => $deployment_uuid, - 'environment_uuid' => data_get($this->application, 'environment.uuid'), - ])); - } - } - - private function set_coolify_variables() - { - $this->coolify_variables = "SOURCE_COMMIT={$this->commit} "; - if ($this->pull_request_id === 0) { - $fqdn = $this->application->fqdn; - } else { - $fqdn = $this->preview->fqdn; - } - if (isset($fqdn)) { - $this->coolify_variables .= "COOLIFY_FQDN={$fqdn} "; - $url = str($fqdn)->replace('http://', '')->replace('https://', ''); - $this->coolify_variables .= "COOLIFY_URL={$url} "; - } - if (isset($this->application->git_branch)) { - $this->coolify_variables .= "COOLIFY_BRANCH={$this->application->git_branch} "; - } - } - - private function check_git_if_build_needed() - { - $this->generate_git_import_commands(); - $local_branch = $this->branch; - if ($this->pull_request_id !== 0) { - $local_branch = "pull/{$this->pull_request_id}/head"; - } - $private_key = data_get($this->application, 'private_key.private_key'); - if ($private_key) { - $private_key = base64_encode($private_key); - $this->execute_remote_command( - [ - executeInDocker($this->deployment_uuid, 'mkdir -p /root/.ssh'), - ], - [ - executeInDocker($this->deployment_uuid, "echo '{$private_key}' | base64 -d | tee /root/.ssh/id_rsa > /dev/null"), - ], - [ - executeInDocker($this->deployment_uuid, 'chmod 600 /root/.ssh/id_rsa'), - ], - [ - executeInDocker($this->deployment_uuid, "GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$this->customPort} -o Port={$this->customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null\" git ls-remote {$this->fullRepoUrl} {$local_branch}"), - 'hidden' => true, - 'save' => 'git_commit_sha', - ] - ); - } else { - $this->execute_remote_command( - [ - executeInDocker($this->deployment_uuid, "GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$this->customPort} -o Port={$this->customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null\" git ls-remote {$this->fullRepoUrl} {$local_branch}"), - 'hidden' => true, - 'save' => 'git_commit_sha', - ], - ); - } - if ($this->saved_outputs->get('git_commit_sha') && ! $this->rollback) { - $this->commit = $this->saved_outputs->get('git_commit_sha')->before("\t"); - $this->application_deployment_queue->commit = $this->commit; - $this->application_deployment_queue->save(); - } - $this->set_coolify_variables(); - } - - private function clone_repository() - { - $importCommands = $this->generate_git_import_commands(); - $this->application_deployment_queue->addLogEntry("\n----------------------------------------"); - $this->application_deployment_queue->addLogEntry("Importing {$this->customRepository}:{$this->application->git_branch} (commit sha {$this->application->git_commit_sha}) to {$this->basedir}."); - if ($this->pull_request_id !== 0) { - $this->application_deployment_queue->addLogEntry("Checking out tag pull/{$this->pull_request_id}/head."); - } - $this->execute_remote_command( - [ - $importCommands, - 'hidden' => true, - ] - ); - $this->create_workdir(); - $this->execute_remote_command( - [ - executeInDocker($this->deployment_uuid, "cd {$this->workdir} && git log -1 {$this->commit} --pretty=%B"), - 'hidden' => true, - 'save' => 'commit_message', - ] - ); - if ($this->saved_outputs->get('commit_message')) { - $commit_message = str($this->saved_outputs->get('commit_message')); - $this->application_deployment_queue->commit_message = $commit_message->value(); - ApplicationDeploymentQueue::whereCommit($this->commit)->whereApplicationId($this->application->id)->update( - ['commit_message' => $commit_message->value()] - ); - } - } - - private function generate_git_import_commands() - { - ['commands' => $commands, 'branch' => $this->branch, 'fullRepoUrl' => $this->fullRepoUrl] = $this->application->generateGitImportCommands( - deployment_uuid: $this->deployment_uuid, - pull_request_id: $this->pull_request_id, - git_type: $this->git_type, - commit: $this->commit - ); - - return $commands; - } - - private function cleanup_git() - { - $this->execute_remote_command( - [executeInDocker($this->deployment_uuid, "rm -fr {$this->basedir}/.git")], - ); - } - - private function generate_nixpacks_confs() - { - $nixpacks_command = $this->nixpacks_build_cmd(); - $this->application_deployment_queue->addLogEntry("Generating nixpacks configuration with: $nixpacks_command"); - $this->execute_remote_command( - [executeInDocker($this->deployment_uuid, $nixpacks_command), 'save' => 'nixpacks_plan', 'hidden' => true], - [executeInDocker($this->deployment_uuid, "nixpacks detect {$this->workdir}"), 'save' => 'nixpacks_type', 'hidden' => true], - ); - if ($this->saved_outputs->get('nixpacks_type')) { - $this->nixpacks_type = $this->saved_outputs->get('nixpacks_type'); - if (str($this->nixpacks_type)->isEmpty()) { - throw new RuntimeException('Nixpacks failed to detect the application type. Please check the documentation of Nixpacks: https://nixpacks.com/docs/providers'); - } - } - - if ($this->saved_outputs->get('nixpacks_plan')) { - $this->nixpacks_plan = $this->saved_outputs->get('nixpacks_plan'); - if ($this->nixpacks_plan) { - $this->application_deployment_queue->addLogEntry("Found application type: {$this->nixpacks_type}."); - $this->application_deployment_queue->addLogEntry("If you need further customization, please check the documentation of Nixpacks: https://nixpacks.com/docs/providers/{$this->nixpacks_type}"); - $parsed = Toml::Parse($this->nixpacks_plan); - - // Do any modifications here - $this->generate_env_variables(); - $merged_envs = collect(data_get($parsed, 'variables', []))->merge($this->env_args); - $aptPkgs = data_get($parsed, 'phases.setup.aptPkgs', []); - if (count($aptPkgs) === 0) { - $aptPkgs = ['curl', 'wget']; - data_set($parsed, 'phases.setup.aptPkgs', ['curl', 'wget']); - } else { - if (! in_array('curl', $aptPkgs)) { - $aptPkgs[] = 'curl'; - } - if (! in_array('wget', $aptPkgs)) { - $aptPkgs[] = 'wget'; - } - data_set($parsed, 'phases.setup.aptPkgs', $aptPkgs); - } - data_set($parsed, 'variables', $merged_envs->toArray()); - $is_laravel = data_get($parsed, 'variables.IS_LARAVEL', false); - if ($is_laravel) { - $variables = $this->laravel_finetunes(); - data_set($parsed, 'variables.NIXPACKS_PHP_FALLBACK_PATH', $variables[0]->value); - data_set($parsed, 'variables.NIXPACKS_PHP_ROOT_DIR', $variables[1]->value); - } - if ($this->nixpacks_type === 'elixir') { - $this->elixir_finetunes(); - } - $this->nixpacks_plan = json_encode($parsed, JSON_PRETTY_PRINT); - $this->nixpacks_plan_json = collect($parsed); - $this->application_deployment_queue->addLogEntry("Final Nixpacks plan: {$this->nixpacks_plan}", hidden: true); - if ($this->nixpacks_type === 'rust') { - // temporary: disable healthcheck for rust because the start phase does not have curl/wget - $this->application->health_check_enabled = false; - $this->application->save(); - } - } - } - } - - private function nixpacks_build_cmd() - { - $this->generate_nixpacks_env_variables(); - $nixpacks_command = "nixpacks plan -f toml {$this->env_nixpacks_args}"; - if ($this->application->build_command) { - $nixpacks_command .= " --build-cmd \"{$this->application->build_command}\""; - } - if ($this->application->start_command) { - $nixpacks_command .= " --start-cmd \"{$this->application->start_command}\""; - } - if ($this->application->install_command) { - $nixpacks_command .= " --install-cmd \"{$this->application->install_command}\""; - } - $nixpacks_command .= " {$this->workdir}"; - - return $nixpacks_command; - } - - private function generate_nixpacks_env_variables() - { - $this->env_nixpacks_args = collect([]); - if ($this->pull_request_id === 0) { - foreach ($this->application->nixpacks_environment_variables as $env) { - if (! is_null($env->real_value)) { - $this->env_nixpacks_args->push("--env {$env->key}={$env->real_value}"); - } - } - } else { - foreach ($this->application->nixpacks_environment_variables_preview as $env) { - if (! is_null($env->real_value)) { - $this->env_nixpacks_args->push("--env {$env->key}={$env->real_value}"); - } - } - } - - $this->env_nixpacks_args = $this->env_nixpacks_args->implode(' '); - } - - private function generate_env_variables() - { - $this->env_args = collect([]); - $this->env_args->put('SOURCE_COMMIT', $this->commit); - if ($this->pull_request_id === 0) { - foreach ($this->application->build_environment_variables as $env) { - if (! is_null($env->real_value)) { - $this->env_args->put($env->key, $env->real_value); - } - } - } else { - foreach ($this->application->build_environment_variables_preview as $env) { - if (! is_null($env->real_value)) { - $this->env_args->put($env->key, $env->real_value); - } - } - } - } - - private function generate_compose_file() - { - $this->create_workdir(); - $ports = $this->application->main_port(); - $onlyPort = null; - if (count($ports) > 0) { - $onlyPort = $ports[0]; - } - $persistent_storages = $this->generate_local_persistent_volumes(); - $persistent_file_volumes = $this->application->fileStorages()->get(); - $volume_names = $this->generate_local_persistent_volumes_only_volume_names(); - // $environment_variables = $this->generate_environment_variables($ports); - $this->save_environment_variables(); - if (data_get($this->application, 'custom_labels')) { - $this->application->parseContainerLabels(); - $labels = collect(preg_split("/\r\n|\n|\r/", base64_decode($this->application->custom_labels))); - $labels = $labels->filter(function ($value, $key) { - return ! Str::startsWith($value, 'coolify.'); - }); - $found_caddy_labels = $labels->filter(function ($value, $key) { - return Str::startsWith($value, 'caddy_'); - }); - if ($found_caddy_labels->count() === 0) { - if ($this->pull_request_id !== 0) { - $domains = str(data_get($this->preview, 'fqdn'))->explode(','); - } else { - $domains = str(data_get($this->application, 'fqdn'))->explode(','); - } - $labels = $labels->merge(fqdnLabelsForCaddy( - network: $this->application->destination->network, - uuid: $this->application->uuid, - domains: $domains, - onlyPort: $onlyPort, - is_force_https_enabled: $this->application->isForceHttpsEnabled(), - is_gzip_enabled: $this->application->isGzipEnabled(), - is_stripprefix_enabled: $this->application->isStripprefixEnabled() - )); - } - $this->application->custom_labels = base64_encode($labels->implode("\n")); - $this->application->save(); - } else { - if ($this->application->settings->is_container_label_readonly_enabled) { - $labels = collect(generateLabelsApplication($this->application, $this->preview)); - } - } - if ($this->pull_request_id !== 0) { - $labels = collect(generateLabelsApplication($this->application, $this->preview)); - } - if ($this->application->settings->is_container_label_escape_enabled) { - $labels = $labels->map(function ($value, $key) { - return escapeDollarSign($value); - }); - } - $labels = $labels->merge(defaultLabels($this->application->id, $this->application->uuid, $this->application->project()->name, $this->application->name, $this->application->environment->name, $this->pull_request_id))->toArray(); - - // Check for custom HEALTHCHECK - if ($this->application->build_pack === 'dockerfile' || $this->application->dockerfile) { - $this->execute_remote_command([ - executeInDocker($this->deployment_uuid, "cat {$this->workdir}{$this->dockerfile_location}"), - 'hidden' => true, - 'save' => 'dockerfile_from_repo', - 'ignore_errors' => true, - ]); - $dockerfile = collect(str($this->saved_outputs->get('dockerfile_from_repo'))->trim()->explode("\n")); - $this->application->parseHealthcheckFromDockerfile($dockerfile); - } - $docker_compose = [ - 'services' => [ - $this->container_name => [ - 'image' => $this->production_image_name, - 'container_name' => $this->container_name, - 'restart' => RESTART_MODE, - 'expose' => $ports, - 'networks' => [ - $this->destination->network => [ - 'aliases' => [ - $this->container_name, - ], - ], - ], - 'mem_limit' => $this->application->limits_memory, - 'memswap_limit' => $this->application->limits_memory_swap, - 'mem_swappiness' => $this->application->limits_memory_swappiness, - 'mem_reservation' => $this->application->limits_memory_reservation, - 'cpus' => (float) $this->application->limits_cpus, - 'cpu_shares' => $this->application->limits_cpu_shares, - ], - ], - 'networks' => [ - $this->destination->network => [ - 'external' => true, - 'name' => $this->destination->network, - 'attachable' => true, - ], - ], - ]; - if (! is_null($this->env_filename)) { - $docker_compose['services'][$this->container_name]['env_file'] = [$this->env_filename]; - } - $docker_compose['services'][$this->container_name]['healthcheck'] = [ - 'test' => [ - 'CMD-SHELL', - $this->generate_healthcheck_commands(), - ], - 'interval' => $this->application->health_check_interval.'s', - 'timeout' => $this->application->health_check_timeout.'s', - 'retries' => $this->application->health_check_retries, - 'start_period' => $this->application->health_check_start_period.'s', - ]; - - if (! is_null($this->application->limits_cpuset)) { - data_set($docker_compose, 'services.'.$this->container_name.'.cpuset', $this->application->limits_cpuset); - } - if ($this->server->isSwarm()) { - data_forget($docker_compose, 'services.'.$this->container_name.'.container_name'); - data_forget($docker_compose, 'services.'.$this->container_name.'.expose'); - data_forget($docker_compose, 'services.'.$this->container_name.'.restart'); - - data_forget($docker_compose, 'services.'.$this->container_name.'.mem_limit'); - data_forget($docker_compose, 'services.'.$this->container_name.'.memswap_limit'); - data_forget($docker_compose, 'services.'.$this->container_name.'.mem_swappiness'); - data_forget($docker_compose, 'services.'.$this->container_name.'.mem_reservation'); - data_forget($docker_compose, 'services.'.$this->container_name.'.cpus'); - data_forget($docker_compose, 'services.'.$this->container_name.'.cpuset'); - data_forget($docker_compose, 'services.'.$this->container_name.'.cpu_shares'); - - $docker_compose['services'][$this->container_name]['deploy'] = [ - 'mode' => 'replicated', - 'replicas' => data_get($this->application, 'swarm_replicas', 1), - 'update_config' => [ - 'order' => 'start-first', - ], - 'rollback_config' => [ - 'order' => 'start-first', - ], - 'labels' => $labels, - 'resources' => [ - 'limits' => [ - 'cpus' => $this->application->limits_cpus, - 'memory' => $this->application->limits_memory, - ], - 'reservations' => [ - 'cpus' => $this->application->limits_cpus, - 'memory' => $this->application->limits_memory, - ], - ], - ]; - if (data_get($this->application, 'swarm_placement_constraints')) { - $swarm_placement_constraints = Yaml::parse(base64_decode(data_get($this->application, 'swarm_placement_constraints'))); - $docker_compose['services'][$this->container_name]['deploy'] = array_merge( - $docker_compose['services'][$this->container_name]['deploy'], - $swarm_placement_constraints - ); - } - if (data_get($this->application, 'settings.is_swarm_only_worker_nodes')) { - $docker_compose['services'][$this->container_name]['deploy']['placement']['constraints'][] = 'node.role == worker'; - } - if ($this->pull_request_id !== 0) { - $docker_compose['services'][$this->container_name]['deploy']['replicas'] = 1; - } - } else { - $docker_compose['services'][$this->container_name]['labels'] = $labels; - } - if ($this->server->isLogDrainEnabled() && $this->application->isLogDrainEnabled()) { - $docker_compose['services'][$this->container_name]['logging'] = generate_fluentd_configuration(); - } - if ($this->application->settings->is_gpu_enabled) { - $docker_compose['services'][$this->container_name]['deploy']['resources']['reservations']['devices'] = [ - [ - 'driver' => data_get($this->application, 'settings.gpu_driver', 'nvidia'), - 'capabilities' => ['gpu'], - 'options' => data_get($this->application, 'settings.gpu_options', []), - ], - ]; - if (data_get($this->application, 'settings.gpu_count')) { - $count = data_get($this->application, 'settings.gpu_count'); - if ($count === 'all') { - $docker_compose['services'][$this->container_name]['deploy']['resources']['reservations']['devices'][0]['count'] = $count; - } else { - $docker_compose['services'][$this->container_name]['deploy']['resources']['reservations']['devices'][0]['count'] = (int) $count; - } - } elseif (data_get($this->application, 'settings.gpu_device_ids')) { - $docker_compose['services'][$this->container_name]['deploy']['resources']['reservations']['devices'][0]['ids'] = data_get($this->application, 'settings.gpu_device_ids'); - } - } - if ($this->application->isHealthcheckDisabled()) { - data_forget($docker_compose, 'services.'.$this->container_name.'.healthcheck'); - } - if (count($this->application->ports_mappings_array) > 0 && $this->pull_request_id === 0) { - $docker_compose['services'][$this->container_name]['ports'] = $this->application->ports_mappings_array; - } - - if (count($persistent_storages) > 0) { - if (! data_get($docker_compose, 'services.'.$this->container_name.'.volumes')) { - $docker_compose['services'][$this->container_name]['volumes'] = []; - } - $docker_compose['services'][$this->container_name]['volumes'] = array_merge($docker_compose['services'][$this->container_name]['volumes'], $persistent_storages); - } - if (count($persistent_file_volumes) > 0) { - if (! data_get($docker_compose, 'services.'.$this->container_name.'.volumes')) { - $docker_compose['services'][$this->container_name]['volumes'] = []; - } - $docker_compose['services'][$this->container_name]['volumes'] = array_merge($docker_compose['services'][$this->container_name]['volumes'], $persistent_file_volumes->map(function ($item) { - return "$item->fs_path:$item->mount_path"; - })->toArray()); - } - if (count($volume_names) > 0) { - $docker_compose['volumes'] = $volume_names; - } - - if ($this->pull_request_id === 0) { - $custom_compose = convertDockerRunToCompose($this->application->custom_docker_run_options); - if ((bool) $this->application->settings->is_consistent_container_name_enabled) { - if (! $this->application->settings->custom_internal_name) { - $docker_compose['services'][$this->application->uuid] = $docker_compose['services'][$this->container_name]; - if (count($custom_compose) > 0) { - $ipv4 = data_get($custom_compose, 'ip.0'); - $ipv6 = data_get($custom_compose, 'ip6.0'); - data_forget($custom_compose, 'ip'); - data_forget($custom_compose, 'ip6'); - if ($ipv4 || $ipv6) { - data_forget($docker_compose['services'][$this->application->uuid], 'networks'); - } - if ($ipv4) { - $docker_compose['services'][$this->application->uuid]['networks'][$this->destination->network]['ipv4_address'] = $ipv4; - } - if ($ipv6) { - $docker_compose['services'][$this->application->uuid]['networks'][$this->destination->network]['ipv6_address'] = $ipv6; - } - $docker_compose['services'][$this->application->uuid] = array_merge_recursive($docker_compose['services'][$this->application->uuid], $custom_compose); - } - } - } else { - if (count($custom_compose) > 0) { - $ipv4 = data_get($custom_compose, 'ip.0'); - $ipv6 = data_get($custom_compose, 'ip6.0'); - data_forget($custom_compose, 'ip'); - data_forget($custom_compose, 'ip6'); - if ($ipv4 || $ipv6) { - data_forget($docker_compose['services'][$this->container_name], 'networks'); - } - if ($ipv4) { - $docker_compose['services'][$this->container_name]['networks'][$this->destination->network]['ipv4_address'] = $ipv4; - } - if ($ipv6) { - $docker_compose['services'][$this->container_name]['networks'][$this->destination->network]['ipv6_address'] = $ipv6; - } - $docker_compose['services'][$this->container_name] = array_merge_recursive($docker_compose['services'][$this->container_name], $custom_compose); - } - } - } - - $this->docker_compose = Yaml::dump($docker_compose, 10); - $this->docker_compose_base64 = base64_encode($this->docker_compose); - $this->execute_remote_command([executeInDocker($this->deployment_uuid, "echo '{$this->docker_compose_base64}' | base64 -d | tee {$this->workdir}/docker-compose.yaml > /dev/null"), 'hidden' => true]); - } - - private function generate_local_persistent_volumes() - { - $local_persistent_volumes = []; - foreach ($this->application->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path !== '' && $persistentStorage->host_path !== null) { - $volume_name = $persistentStorage->host_path; - } else { - $volume_name = $persistentStorage->name; - } - if ($this->pull_request_id !== 0) { - $volume_name = $volume_name.'-pr-'.$this->pull_request_id; - } - $local_persistent_volumes[] = $volume_name.':'.$persistentStorage->mount_path; - } - - return $local_persistent_volumes; - } - - private function generate_local_persistent_volumes_only_volume_names() - { - $local_persistent_volumes_names = []; - foreach ($this->application->persistentStorages as $persistentStorage) { - if ($persistentStorage->host_path) { - continue; - } - $name = $persistentStorage->name; - - if ($this->pull_request_id !== 0) { - $name = $name.'-pr-'.$this->pull_request_id; - } - - $local_persistent_volumes_names[$name] = [ - 'name' => $name, - 'external' => false, - ]; - } - - return $local_persistent_volumes_names; - } - - private function generate_healthcheck_commands() - { - if (! $this->application->health_check_port) { - $health_check_port = $this->application->ports_exposes_array[0]; - } else { - $health_check_port = $this->application->health_check_port; - } - if ($this->application->settings->is_static || $this->application->build_pack === 'static') { - $health_check_port = 80; - } - if ($this->application->health_check_path) { - $this->full_healthcheck_url = "{$this->application->health_check_method}: {$this->application->health_check_scheme}://{$this->application->health_check_host}:{$health_check_port}{$this->application->health_check_path}"; - $generated_healthchecks_commands = [ - "curl -s -X {$this->application->health_check_method} -f {$this->application->health_check_scheme}://{$this->application->health_check_host}:{$health_check_port}{$this->application->health_check_path} > /dev/null || wget -q -O- {$this->application->health_check_scheme}://{$this->application->health_check_host}:{$health_check_port}{$this->application->health_check_path} > /dev/null || exit 1", - ]; - } else { - $this->full_healthcheck_url = "{$this->application->health_check_method}: {$this->application->health_check_scheme}://{$this->application->health_check_host}:{$health_check_port}/"; - $generated_healthchecks_commands = [ - "curl -s -X {$this->application->health_check_method} -f {$this->application->health_check_scheme}://{$this->application->health_check_host}:{$health_check_port}/ > /dev/null || wget -q -O- {$this->application->health_check_scheme}://{$this->application->health_check_host}:{$health_check_port}/ > /dev/null || exit 1", - ]; - } - - return implode(' ', $generated_healthchecks_commands); - } - - private function pull_latest_image($image) - { - $this->application_deployment_queue->addLogEntry("Pulling latest image ($image) from the registry."); - $this->execute_remote_command( - [ - executeInDocker($this->deployment_uuid, "docker pull {$image}"), - 'hidden' => true, - ] - ); - } - - private function build_image() - { - // Add Coolify related variables to the build args - $this->environment_variables->filter(function ($key, $value) { - return str($key)->startsWith('COOLIFY_'); - })->each(function ($key, $value) { - $this->build_args->push("--build-arg '{$key}'"); - }); - - $this->build_args = $this->build_args->implode(' '); - - $this->application_deployment_queue->addLogEntry('----------------------------------------'); - if ($this->disableBuildCache) { - $this->application_deployment_queue->addLogEntry('Docker build cache is disabled. It will not be used during the build process.'); - } - if ($this->application->build_pack === 'static') { - $this->application_deployment_queue->addLogEntry('Static deployment. Copying static assets to the image.'); - } else { - $this->application_deployment_queue->addLogEntry('Building docker image started.'); - $this->application_deployment_queue->addLogEntry('To check the current progress, click on Show Debug Logs.'); - } - - if ($this->application->settings->is_static || $this->application->build_pack === 'static') { - if ($this->application->static_image) { - $this->pull_latest_image($this->application->static_image); - $this->application_deployment_queue->addLogEntry('Continuing with the building process.'); - } - if ($this->application->build_pack === 'static') { - $dockerfile = base64_encode("FROM {$this->application->static_image} -WORKDIR /usr/share/nginx/html/ -LABEL coolify.deploymentId={$this->deployment_uuid} -COPY . . -RUN rm -f /usr/share/nginx/html/nginx.conf -RUN rm -f /usr/share/nginx/html/Dockerfile -RUN rm -f /usr/share/nginx/html/docker-compose.yaml -RUN rm -f /usr/share/nginx/html/.env -COPY ./nginx.conf /etc/nginx/conf.d/default.conf"); - if (str($this->application->custom_nginx_configuration)->isNotEmpty()) { - $nginx_config = base64_encode($this->application->custom_nginx_configuration); - } else { - $nginx_config = base64_encode(defaultNginxConfiguration()); - } - } else { - if ($this->application->build_pack === 'nixpacks') { - $this->nixpacks_plan = base64_encode($this->nixpacks_plan); - $this->execute_remote_command([executeInDocker($this->deployment_uuid, "echo '{$this->nixpacks_plan}' | base64 -d | tee /artifacts/thegameplan.json > /dev/null"), 'hidden' => true]); - if ($this->force_rebuild) { - $this->execute_remote_command([ - executeInDocker($this->deployment_uuid, "nixpacks build -c /artifacts/thegameplan.json --no-cache --no-error-without-start -n {$this->build_image_name} {$this->workdir} -o {$this->workdir}"), - 'hidden' => true, - ]); - $build_command = "docker build --no-cache {$this->addHosts} --network host -f {$this->workdir}/.nixpacks/Dockerfile {$this->build_args} --progress plain -t {$this->build_image_name} {$this->workdir}"; - } else { - $this->execute_remote_command([ - executeInDocker($this->deployment_uuid, "nixpacks build -c /artifacts/thegameplan.json --cache-key '{$this->application->uuid}' --no-error-without-start -n {$this->build_image_name} {$this->workdir} -o {$this->workdir}"), - 'hidden' => true, - ]); - $build_command = "docker build {$this->addHosts} --network host -f {$this->workdir}/.nixpacks/Dockerfile {$this->build_args} --progress plain -t {$this->build_image_name} {$this->workdir}"; - } - - $base64_build_command = base64_encode($build_command); - $this->execute_remote_command( - [ - executeInDocker($this->deployment_uuid, "echo '{$base64_build_command}' | base64 -d | tee /artifacts/build.sh > /dev/null"), - 'hidden' => true, - ], - [ - executeInDocker($this->deployment_uuid, 'cat /artifacts/build.sh'), - 'hidden' => true, - ], - [ - executeInDocker($this->deployment_uuid, 'bash /artifacts/build.sh'), - 'hidden' => true, - ] - ); - $this->execute_remote_command([executeInDocker($this->deployment_uuid, 'rm /artifacts/thegameplan.json'), 'hidden' => true]); - } else { - if ($this->force_rebuild) { - $build_command = "docker build --no-cache {$this->buildTarget} --network {$this->destination->network} -f {$this->workdir}{$this->dockerfile_location} {$this->build_args} --progress plain -t $this->build_image_name {$this->workdir}"; - $base64_build_command = base64_encode($build_command); - } else { - $build_command = "docker build {$this->buildTarget} --network {$this->destination->network} -f {$this->workdir}{$this->dockerfile_location} {$this->build_args} --progress plain -t $this->build_image_name {$this->workdir}"; - $base64_build_command = base64_encode($build_command); - } - $this->execute_remote_command( - [ - executeInDocker($this->deployment_uuid, "echo '{$base64_build_command}' | base64 -d | tee /artifacts/build.sh > /dev/null"), - 'hidden' => true, - ], - [ - executeInDocker($this->deployment_uuid, 'cat /artifacts/build.sh'), - 'hidden' => true, - ], - [ - executeInDocker($this->deployment_uuid, 'bash /artifacts/build.sh'), - 'hidden' => true, - ] - ); - } - $dockerfile = base64_encode("FROM {$this->application->static_image} -WORKDIR /usr/share/nginx/html/ -LABEL coolify.deploymentId={$this->deployment_uuid} -COPY --from=$this->build_image_name /app/{$this->application->publish_directory} . -COPY ./nginx.conf /etc/nginx/conf.d/default.conf"); - if (str($this->application->custom_nginx_configuration)->isNotEmpty()) { - $nginx_config = base64_encode($this->application->custom_nginx_configuration); - } else { - $nginx_config = base64_encode(defaultNginxConfiguration()); - } - } - $build_command = "docker build {$this->addHosts} --network host -f {$this->workdir}/Dockerfile {$this->build_args} --progress plain -t {$this->production_image_name} {$this->workdir}"; - $base64_build_command = base64_encode($build_command); - $this->execute_remote_command( - [ - executeInDocker($this->deployment_uuid, "echo '{$dockerfile}' | base64 -d | tee {$this->workdir}/Dockerfile > /dev/null"), - ], - [ - executeInDocker($this->deployment_uuid, "echo '{$nginx_config}' | base64 -d | tee {$this->workdir}/nginx.conf > /dev/null"), - ], - [ - executeInDocker($this->deployment_uuid, "echo '{$base64_build_command}' | base64 -d | tee /artifacts/build.sh > /dev/null"), - 'hidden' => true, - ], - [ - executeInDocker($this->deployment_uuid, 'cat /artifacts/build.sh'), - 'hidden' => true, - ], - [ - executeInDocker($this->deployment_uuid, 'bash /artifacts/build.sh'), - 'hidden' => true, - ] - ); - } else { - // Pure Dockerfile based deployment - if ($this->application->dockerfile) { - if ($this->force_rebuild) { - $build_command = "docker build --no-cache --pull {$this->buildTarget} {$this->addHosts} --network host -f {$this->workdir}{$this->dockerfile_location} {$this->build_args} --progress plain -t {$this->production_image_name} {$this->workdir}"; - } else { - $build_command = "docker build --pull {$this->buildTarget} {$this->addHosts} --network host -f {$this->workdir}{$this->dockerfile_location} {$this->build_args} --progress plain -t {$this->production_image_name} {$this->workdir}"; - } - $base64_build_command = base64_encode($build_command); - $this->execute_remote_command( - [ - executeInDocker($this->deployment_uuid, "echo '{$base64_build_command}' | base64 -d | tee /artifacts/build.sh > /dev/null"), - 'hidden' => true, - ], - [ - executeInDocker($this->deployment_uuid, 'cat /artifacts/build.sh'), - 'hidden' => true, - ], - [ - executeInDocker($this->deployment_uuid, 'bash /artifacts/build.sh'), - 'hidden' => true, - ] - ); - } else { - if ($this->application->build_pack === 'nixpacks') { - $this->nixpacks_plan = base64_encode($this->nixpacks_plan); - $this->execute_remote_command([executeInDocker($this->deployment_uuid, "echo '{$this->nixpacks_plan}' | base64 -d | tee /artifacts/thegameplan.json > /dev/null"), 'hidden' => true]); - if ($this->force_rebuild) { - $this->execute_remote_command([ - executeInDocker($this->deployment_uuid, "nixpacks build -c /artifacts/thegameplan.json --no-cache --no-error-without-start -n {$this->production_image_name} {$this->workdir} -o {$this->workdir}"), - 'hidden' => true, - ]); - $build_command = "docker build --no-cache {$this->addHosts} --network host -f {$this->workdir}/.nixpacks/Dockerfile {$this->build_args} --progress plain -t {$this->production_image_name} {$this->workdir}"; - } else { - $this->execute_remote_command([ - executeInDocker($this->deployment_uuid, "nixpacks build -c /artifacts/thegameplan.json --cache-key '{$this->application->uuid}' --no-error-without-start -n {$this->production_image_name} {$this->workdir} -o {$this->workdir}"), - 'hidden' => true, - ]); - $build_command = "docker build {$this->addHosts} --network host -f {$this->workdir}/.nixpacks/Dockerfile {$this->build_args} --progress plain -t {$this->production_image_name} {$this->workdir}"; - } - $base64_build_command = base64_encode($build_command); - $this->execute_remote_command( - [ - executeInDocker($this->deployment_uuid, "echo '{$base64_build_command}' | base64 -d | tee /artifacts/build.sh > /dev/null"), - 'hidden' => true, - ], - [ - executeInDocker($this->deployment_uuid, 'cat /artifacts/build.sh'), - 'hidden' => true, - ], - [ - executeInDocker($this->deployment_uuid, 'bash /artifacts/build.sh'), - 'hidden' => true, - ] - ); - $this->execute_remote_command([executeInDocker($this->deployment_uuid, 'rm /artifacts/thegameplan.json'), 'hidden' => true]); - } else { - if ($this->force_rebuild) { - $build_command = "docker build --no-cache {$this->buildTarget} {$this->addHosts} --network host -f {$this->workdir}{$this->dockerfile_location} {$this->build_args} --progress plain -t {$this->production_image_name} {$this->workdir}"; - $base64_build_command = base64_encode($build_command); - } else { - $build_command = "docker build {$this->buildTarget} {$this->addHosts} --network host -f {$this->workdir}{$this->dockerfile_location} {$this->build_args} --progress plain -t {$this->production_image_name} {$this->workdir}"; - $base64_build_command = base64_encode($build_command); - } - $this->execute_remote_command( - [ - executeInDocker($this->deployment_uuid, "echo '{$base64_build_command}' | base64 -d | tee /artifacts/build.sh > /dev/null"), - 'hidden' => true, - ], - [ - executeInDocker($this->deployment_uuid, 'cat /artifacts/build.sh'), - 'hidden' => true, - ], - [ - executeInDocker($this->deployment_uuid, 'bash /artifacts/build.sh'), - 'hidden' => true, - ] - ); - } - } - } - $this->application_deployment_queue->addLogEntry('Building docker image completed.'); - } - - private function graceful_shutdown_container(string $containerName, int $timeout = 300) - { - try { - $process = Process::timeout($timeout)->start("docker stop --time=$timeout $containerName"); - - $startTime = time(); - while ($process->running()) { - if (time() - $startTime >= $timeout) { - $this->execute_remote_command( - ["docker kill $containerName", 'hidden' => true, 'ignore_errors' => true] - ); - break; - } - usleep(100000); - } - - $isRunning = $this->execute_remote_command( - ["docker inspect -f '{{.State.Running}}' $containerName", 'hidden' => true, 'ignore_errors' => true] - ) === 'true'; - - if ($isRunning) { - $this->execute_remote_command( - ["docker kill $containerName", 'hidden' => true, 'ignore_errors' => true] - ); - } - } catch (\Exception $error) { - $this->application_deployment_queue->addLogEntry("Error stopping container $containerName: ".$error->getMessage(), 'stderr'); - } - - $this->remove_container($containerName); - } - - private function remove_container(string $containerName) - { - $this->execute_remote_command( - ["docker rm -f $containerName", 'hidden' => true, 'ignore_errors' => true] - ); - } - - private function stop_running_container(bool $force = false) - { - $this->application_deployment_queue->addLogEntry('Removing old containers.'); - if ($this->newVersionIsHealthy || $force) { - if ($this->application->settings->is_consistent_container_name_enabled || str($this->application->settings->custom_internal_name)->isNotEmpty()) { - $this->graceful_shutdown_container($this->container_name); - } else { - $containers = getCurrentApplicationContainerStatus($this->server, $this->application->id, $this->pull_request_id); - if ($this->pull_request_id === 0) { - $containers = $containers->filter(function ($container) { - return data_get($container, 'Names') !== $this->container_name && data_get($container, 'Names') !== $this->container_name.'-pr-'.$this->pull_request_id; - }); - } - $containers->each(function ($container) { - $this->graceful_shutdown_container(data_get($container, 'Names')); - }); - } - } else { - if ($this->application->dockerfile || $this->application->build_pack === 'dockerfile' || $this->application->build_pack === 'dockerimage') { - $this->application_deployment_queue->addLogEntry('----------------------------------------'); - $this->application_deployment_queue->addLogEntry("WARNING: Dockerfile or Docker Image based deployment detected. The healthcheck needs a curl or wget command to check the health of the application. Please make sure that it is available in the image or turn off healthcheck on Coolify's UI."); - $this->application_deployment_queue->addLogEntry('----------------------------------------'); - } - $this->application_deployment_queue->addLogEntry('New container is not healthy, rolling back to the old container.'); - $this->application_deployment_queue->update([ - 'status' => ApplicationDeploymentStatus::FAILED->value, - ]); - $this->graceful_shutdown_container($this->container_name); - } - } - - private function start_by_compose_file() - { - if ($this->application->build_pack === 'dockerimage') { - $this->application_deployment_queue->addLogEntry('Pulling latest images from the registry.'); - $this->execute_remote_command( - [executeInDocker($this->deployment_uuid, "docker compose --project-name {$this->application->uuid} --project-directory {$this->workdir} pull"), 'hidden' => true], - [executeInDocker($this->deployment_uuid, "{$this->coolify_variables} docker compose --project-name {$this->application->uuid} --project-directory {$this->workdir} up --build -d"), 'hidden' => true], - ); - } else { - if ($this->use_build_server) { - $this->execute_remote_command( - ["{$this->coolify_variables} docker compose --project-name {$this->application->uuid} --project-directory {$this->configuration_dir} -f {$this->configuration_dir}{$this->docker_compose_location} up --pull always --build -d", 'hidden' => true], - ); - } else { - $this->execute_remote_command( - [executeInDocker($this->deployment_uuid, "{$this->coolify_variables} docker compose --project-name {$this->application->uuid} --project-directory {$this->workdir} -f {$this->workdir}{$this->docker_compose_location} up --build -d"), 'hidden' => true], - ); - } - } - $this->application_deployment_queue->addLogEntry('New container started.'); - } - - private function generate_build_env_variables() - { - if ($this->application->build_pack === 'nixpacks') { - $variables = collect($this->nixpacks_plan_json->get('variables')); - } else { - $this->generate_env_variables(); - $variables = collect([])->merge($this->env_args); - } - - $this->build_args = $variables->map(function ($value, $key) { - $value = escapeshellarg($value); - - return "--build-arg {$key}={$value}"; - }); - } - - private function add_build_env_variables_to_dockerfile() - { - $this->execute_remote_command([ - executeInDocker($this->deployment_uuid, "cat {$this->workdir}{$this->dockerfile_location}"), - 'hidden' => true, - 'save' => 'dockerfile', - ]); - $dockerfile = collect(str($this->saved_outputs->get('dockerfile'))->trim()->explode("\n")); - if ($this->pull_request_id === 0) { - foreach ($this->application->build_environment_variables as $env) { - if (data_get($env, 'is_multiline') === true) { - $dockerfile->splice(1, 0, "ARG {$env->key}"); - } else { - $dockerfile->splice(1, 0, "ARG {$env->key}={$env->real_value}"); - } - } - } else { - foreach ($this->application->build_environment_variables_preview as $env) { - if (data_get($env, 'is_multiline') === true) { - $dockerfile->splice(1, 0, "ARG {$env->key}"); - } else { - $dockerfile->splice(1, 0, "ARG {$env->key}={$env->real_value}"); - } - } - } - $dockerfile_base64 = base64_encode($dockerfile->implode("\n")); - $this->execute_remote_command([ - executeInDocker($this->deployment_uuid, "echo '{$dockerfile_base64}' | base64 -d | tee {$this->workdir}{$this->dockerfile_location} > /dev/null"), - 'hidden' => true, - ]); - } - - private function run_pre_deployment_command() - { - if (empty($this->application->pre_deployment_command)) { - return; - } - $containers = getCurrentApplicationContainerStatus($this->server, $this->application->id, $this->pull_request_id); - if ($containers->count() == 0) { - return; - } - $this->application_deployment_queue->addLogEntry('Executing pre-deployment command (see debug log for output/errors).'); - - foreach ($containers as $container) { - $containerName = data_get($container, 'Names'); - if ($containers->count() == 1 || str_starts_with($containerName, $this->application->pre_deployment_command_container.'-'.$this->application->uuid)) { - $cmd = "sh -c '".str_replace("'", "'\''", $this->application->pre_deployment_command)."'"; - $exec = "docker exec {$containerName} {$cmd}"; - $this->execute_remote_command( - [ - 'command' => $exec, - 'hidden' => true, - ], - ); - - return; - } - } - throw new RuntimeException('Pre-deployment command: Could not find a valid container. Is the container name correct?'); - } - - private function run_post_deployment_command() - { - if (empty($this->application->post_deployment_command)) { - return; - } - $this->application_deployment_queue->addLogEntry('----------------------------------------'); - $this->application_deployment_queue->addLogEntry('Executing post-deployment command (see debug log for output).'); - - $containers = getCurrentApplicationContainerStatus($this->server, $this->application->id, $this->pull_request_id); - foreach ($containers as $container) { - $containerName = data_get($container, 'Names'); - if ($containers->count() == 1 || str_starts_with($containerName, $this->application->post_deployment_command_container.'-'.$this->application->uuid)) { - $cmd = "sh -c '".str_replace("'", "'\''", $this->application->post_deployment_command)."'"; - $exec = "docker exec {$containerName} {$cmd}"; - try { - $this->execute_remote_command( - [ - 'command' => $exec, - 'hidden' => true, - 'save' => 'post-deployment-command-output', - ], - ); - } catch (Exception $e) { - $post_deployment_command_output = $this->saved_outputs->get('post-deployment-command-output'); - if ($post_deployment_command_output) { - $this->application_deployment_queue->addLogEntry('Post-deployment command failed.'); - $this->application_deployment_queue->addLogEntry($post_deployment_command_output, 'stderr'); - } - } - - return; - } - } - throw new RuntimeException('Post-deployment command: Could not find a valid container. Is the container name correct?'); - } - - private function next(string $status) - { - queue_next_deployment($this->application); - // If the deployment is cancelled by the user, don't update the status - if ( - $this->application_deployment_queue->status !== ApplicationDeploymentStatus::CANCELLED_BY_USER->value && - $this->application_deployment_queue->status !== ApplicationDeploymentStatus::FAILED->value - ) { - $this->application_deployment_queue->update([ - 'status' => $status, - ]); - } - if ($this->application_deployment_queue->status === ApplicationDeploymentStatus::FAILED->value) { - $this->application->environment->project->team?->notify(new DeploymentFailed($this->application, $this->deployment_uuid, $this->preview)); - - return; - } - if ($status === ApplicationDeploymentStatus::FINISHED->value) { - if (! $this->only_this_server) { - $this->deploy_to_additional_destinations(); - } - $this->application->environment->project->team?->notify(new DeploymentSuccess($this->application, $this->deployment_uuid, $this->preview)); - } - } - - public function failed(Throwable $exception): void - { - $this->next(ApplicationDeploymentStatus::FAILED->value); - $this->application_deployment_queue->addLogEntry('Oops something is not okay, are you okay? 😢', 'stderr'); - if (str($exception->getMessage())->isNotEmpty()) { - $this->application_deployment_queue->addLogEntry($exception->getMessage(), 'stderr'); - } - - if ($this->application->build_pack !== 'dockercompose') { - $code = $exception->getCode(); - if ($code !== 69420) { - // 69420 means failed to push the image to the registry, so we don't need to remove the new version as it is the currently running one - if ($this->application->settings->is_consistent_container_name_enabled || str($this->application->settings->custom_internal_name)->isNotEmpty()) { - // do not remove already running container - } else { - $this->application_deployment_queue->addLogEntry('Deployment failed. Removing the new version of your application.', 'stderr'); - $this->execute_remote_command( - ["docker rm -f $this->container_name >/dev/null 2>&1", 'hidden' => true, 'ignore_errors' => true] - ); - } - } - } - } -} diff --git a/app/Jobs/ApplicationPullRequestUpdateJob.php b/app/Jobs/ApplicationPullRequestUpdateJob.php deleted file mode 100755 index ef8e6efb6e..0000000000 --- a/app/Jobs/ApplicationPullRequestUpdateJob.php +++ /dev/null @@ -1,89 +0,0 @@ -onQueue('high'); - } - - public function handle() - { - try { - if ($this->application->is_public_repository()) { - return; - } - if ($this->status === ProcessStatus::CLOSED) { - $this->delete_comment(); - - return; - } elseif ($this->status === ProcessStatus::IN_PROGRESS) { - $this->body = "The preview deployment is in progress. 🟡\n\n"; - } elseif ($this->status === ProcessStatus::FINISHED) { - $this->body = "The preview deployment is ready. 🟢\n\n"; - if ($this->preview->fqdn) { - $this->body .= "[Open Preview]({$this->preview->fqdn}) | "; - } - } elseif ($this->status === ProcessStatus::ERROR) { - $this->body = "The preview deployment failed. 🔴\n\n"; - } - $this->build_logs_url = base_url()."/project/{$this->application->environment->project->uuid}/{$this->application->environment->name}/application/{$this->application->uuid}/deployment/{$this->deployment_uuid}"; - - $this->body .= '[Open Build Logs]('.$this->build_logs_url.")\n\n\n"; - $this->body .= 'Last updated at: '.now()->toDateTimeString().' CET'; - if ($this->preview->pull_request_issue_comment_id) { - $this->update_comment(); - } else { - $this->create_comment(); - } - } catch (\Throwable $e) { - return $e; - } - } - - private function update_comment() - { - ['data' => $data] = githubApi(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/issues/comments/{$this->preview->pull_request_issue_comment_id}", method: 'patch', data: [ - 'body' => $this->body, - ], throwError: false); - if (data_get($data, 'message') === 'Not Found') { - $this->create_comment(); - } - } - - private function create_comment() - { - ['data' => $data] = githubApi(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/issues/{$this->preview->pull_request_id}/comments", method: 'post', data: [ - 'body' => $this->body, - ]); - $this->preview->pull_request_issue_comment_id = $data['id']; - $this->preview->save(); - } - - private function delete_comment() - { - githubApi(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/issues/comments/{$this->preview->pull_request_issue_comment_id}", method: 'delete'); - } -} diff --git a/app/Jobs/CheckAndStartSentinelJob.php b/app/Jobs/CheckAndStartSentinelJob.php deleted file mode 100644 index 304b2a15c4..0000000000 --- a/app/Jobs/CheckAndStartSentinelJob.php +++ /dev/null @@ -1,52 +0,0 @@ -server, false, 10); - $sentinelFoundJson = json_decode($sentinelFound, true); - $sentinelStatus = data_get($sentinelFoundJson, '0.State.Status', 'exited'); - if ($sentinelStatus !== 'running') { - StartSentinel::run(server: $this->server, restart: true, latestVersion: $latestVersion); - - return; - } - // If sentinel is running, check if it needs an update - $runningVersion = instant_remote_process_with_timeout(['docker exec coolify-sentinel sh -c "curl http://127.0.0.1:8888/api/version"'], $this->server, false); - if (empty($runningVersion)) { - $runningVersion = '0.0.0'; - } - if ($latestVersion === '0.0.0' && $runningVersion === '0.0.0') { - StartSentinel::run(server: $this->server, restart: true, latestVersion: 'latest'); - - return; - } else { - if (version_compare($runningVersion, $latestVersion, '<')) { - StartSentinel::run(server: $this->server, restart: true, latestVersion: $latestVersion); - - return; - } - } - } -} diff --git a/app/Jobs/CheckForUpdatesJob.php b/app/Jobs/CheckForUpdatesJob.php deleted file mode 100644 index 1d3a345e15..0000000000 --- a/app/Jobs/CheckForUpdatesJob.php +++ /dev/null @@ -1,44 +0,0 @@ -get('https://cdn.coollabs.io/coolify/versions.json'); - if ($response->successful()) { - $versions = $response->json(); - - $latest_version = data_get($versions, 'coolify.v4.version'); - $current_version = config('constants.coolify.version'); - - if (version_compare($latest_version, $current_version, '>')) { - // New version available - $settings->update(['new_version_available' => true]); - File::put(base_path('versions.json'), json_encode($versions, JSON_PRETTY_PRINT)); - } else { - $settings->update(['new_version_available' => false]); - } - } - } catch (\Throwable $e) { - // Consider implementing a notification to administrators - } - } -} diff --git a/app/Jobs/CheckHelperImageJob.php b/app/Jobs/CheckHelperImageJob.php deleted file mode 100644 index 6abb8a1502..0000000000 --- a/app/Jobs/CheckHelperImageJob.php +++ /dev/null @@ -1,39 +0,0 @@ -get('https://cdn.coollabs.io/coolify/versions.json'); - if ($response->successful()) { - $versions = $response->json(); - $settings = instanceSettings(); - $latest_version = data_get($versions, 'coolify.helper.version'); - $current_version = $settings->helper_version; - if (version_compare($latest_version, $current_version, '>')) { - $settings->update(['helper_version' => $latest_version]); - } - } - } catch (\Throwable $e) { - send_internal_notification('CheckHelperImageJob failed with: '.$e->getMessage()); - throw $e; - } - } -} diff --git a/app/Jobs/CleanupHelperContainersJob.php b/app/Jobs/CleanupHelperContainersJob.php deleted file mode 100644 index 0e1fcb4d75..0000000000 --- a/app/Jobs/CleanupHelperContainersJob.php +++ /dev/null @@ -1,34 +0,0 @@ -server, false); - $containerIds = collect(json_decode($containers))->pluck('ID'); - if ($containerIds->count() > 0) { - foreach ($containerIds as $containerId) { - instant_remote_process_with_timeout(['docker container rm -f '.$containerId], $this->server, false); - } - } - } catch (\Throwable $e) { - send_internal_notification('CleanupHelperContainersJob failed with error: '.$e->getMessage()); - } - } -} diff --git a/app/Jobs/CleanupInstanceStuffsJob.php b/app/Jobs/CleanupInstanceStuffsJob.php deleted file mode 100644 index 84f14ed02a..0000000000 --- a/app/Jobs/CleanupInstanceStuffsJob.php +++ /dev/null @@ -1,43 +0,0 @@ -dontRelease()]; - } - - public function handle(): void - { - try { - $this->cleanupInvitationLink(); - } catch (\Throwable $e) { - Log::error('CleanupInstanceStuffsJob failed with error: '.$e->getMessage()); - } - } - - private function cleanupInvitationLink() - { - $invitation = TeamInvitation::all(); - foreach ($invitation as $item) { - $item->isValid(); - } - } -} diff --git a/app/Jobs/CleanupStaleMultiplexedConnections.php b/app/Jobs/CleanupStaleMultiplexedConnections.php deleted file mode 100644 index 6d49bee4b0..0000000000 --- a/app/Jobs/CleanupStaleMultiplexedConnections.php +++ /dev/null @@ -1,82 +0,0 @@ -cleanupStaleConnections(); - $this->cleanupNonExistentServerConnections(); - } - - private function cleanupStaleConnections() - { - $muxFiles = Storage::disk('ssh-mux')->files(); - - foreach ($muxFiles as $muxFile) { - $serverUuid = $this->extractServerUuidFromMuxFile($muxFile); - $server = Server::where('uuid', $serverUuid)->first(); - - if (! $server) { - $this->removeMultiplexFile($muxFile); - - continue; - } - - $muxSocket = "/var/www/html/storage/app/ssh/mux/{$muxFile}"; - $checkCommand = "ssh -O check -o ControlPath={$muxSocket} {$server->user}@{$server->ip} 2>/dev/null"; - $checkProcess = Process::run($checkCommand); - - if ($checkProcess->exitCode() !== 0) { - $this->removeMultiplexFile($muxFile); - } else { - $muxContent = Storage::disk('ssh-mux')->get($muxFile); - $establishedAt = Carbon::parse(substr($muxContent, 37)); - $expirationTime = $establishedAt->addSeconds(config('constants.ssh.mux_persist_time')); - - if (Carbon::now()->isAfter($expirationTime)) { - $this->removeMultiplexFile($muxFile); - } - } - } - } - - private function cleanupNonExistentServerConnections() - { - $muxFiles = Storage::disk('ssh-mux')->files(); - $existingServerUuids = Server::pluck('uuid')->toArray(); - - foreach ($muxFiles as $muxFile) { - $serverUuid = $this->extractServerUuidFromMuxFile($muxFile); - if (! in_array($serverUuid, $existingServerUuids)) { - $this->removeMultiplexFile($muxFile); - } - } - } - - private function extractServerUuidFromMuxFile($muxFile) - { - return substr($muxFile, 4); - } - - private function removeMultiplexFile($muxFile) - { - $muxSocket = "/var/www/html/storage/app/ssh/mux/{$muxFile}"; - $closeCommand = "ssh -O exit -o ControlPath={$muxSocket} localhost 2>/dev/null"; - Process::run($closeCommand); - Storage::disk('ssh-mux')->delete($muxFile); - } -} diff --git a/app/Jobs/ContainerStatusJob.php b/app/Jobs/ContainerStatusJob.php deleted file mode 100644 index 22ae06ebde..0000000000 --- a/app/Jobs/ContainerStatusJob.php +++ /dev/null @@ -1,31 +0,0 @@ -server); - } -} diff --git a/app/Jobs/CoolifyTask.php b/app/Jobs/CoolifyTask.php deleted file mode 100755 index 49a5ba8dd2..0000000000 --- a/app/Jobs/CoolifyTask.php +++ /dev/null @@ -1,45 +0,0 @@ -onQueue('high'); - } - - /** - * Execute the job. - */ - public function handle(): void - { - $remote_process = resolve(RunRemoteProcess::class, [ - 'activity' => $this->activity, - 'ignore_errors' => $this->ignore_errors, - 'call_event_on_finish' => $this->call_event_on_finish, - 'call_event_data' => $this->call_event_data, - ]); - - $remote_process(); - } -} diff --git a/app/Jobs/DatabaseBackupJob.php b/app/Jobs/DatabaseBackupJob.php deleted file mode 100644 index 6070ad16ab..0000000000 --- a/app/Jobs/DatabaseBackupJob.php +++ /dev/null @@ -1,520 +0,0 @@ -onQueue('high'); - } - - public function handle(): void - { - try { - $databasesToBackup = null; - - $this->team = Team::find($this->backup->team_id); - if (! $this->team) { - $this->backup->delete(); - - return; - } - if (data_get($this->backup, 'database_type') === \App\Models\ServiceDatabase::class) { - $this->database = data_get($this->backup, 'database'); - $this->server = $this->database->service->server; - $this->s3 = $this->backup->s3; - } else { - $this->database = data_get($this->backup, 'database'); - $this->server = $this->database->destination->server; - $this->s3 = $this->backup->s3; - } - if (is_null($this->server)) { - throw new \Exception('Server not found?!'); - } - if (is_null($this->database)) { - throw new \Exception('Database not found?!'); - } - - BackupCreated::dispatch($this->team->id); - - $status = str(data_get($this->database, 'status')); - if (! $status->startsWith('running') && $this->database->id !== 0) { - return; - } - if (data_get($this->backup, 'database_type') === \App\Models\ServiceDatabase::class) { - $databaseType = $this->database->databaseType(); - $serviceUuid = $this->database->service->uuid; - $serviceName = str($this->database->service->name)->slug(); - if (str($databaseType)->contains('postgres')) { - $this->container_name = "{$this->database->name}-$serviceUuid"; - $this->directory_name = $serviceName.'-'.$this->container_name; - $commands[] = "docker exec $this->container_name env | grep POSTGRES_"; - $envs = instant_remote_process($commands, $this->server); - $envs = str($envs)->explode("\n"); - - $user = $envs->filter(function ($env) { - return str($env)->startsWith('POSTGRES_USER='); - })->first(); - if ($user) { - $this->database->postgres_user = str($user)->after('POSTGRES_USER=')->value(); - } else { - $this->database->postgres_user = 'postgres'; - } - - $db = $envs->filter(function ($env) { - return str($env)->startsWith('POSTGRES_DB='); - })->first(); - - if ($db) { - $databasesToBackup = str($db)->after('POSTGRES_DB=')->value(); - } else { - $databasesToBackup = $this->database->postgres_user; - } - $this->postgres_password = $envs->filter(function ($env) { - return str($env)->startsWith('POSTGRES_PASSWORD='); - })->first(); - if ($this->postgres_password) { - $this->postgres_password = str($this->postgres_password)->after('POSTGRES_PASSWORD=')->value(); - } - } elseif (str($databaseType)->contains('mysql')) { - $this->container_name = "{$this->database->name}-$serviceUuid"; - $this->directory_name = $serviceName.'-'.$this->container_name; - $commands[] = "docker exec $this->container_name env | grep MYSQL_"; - $envs = instant_remote_process($commands, $this->server); - $envs = str($envs)->explode("\n"); - - $rootPassword = $envs->filter(function ($env) { - return str($env)->startsWith('MYSQL_ROOT_PASSWORD='); - })->first(); - if ($rootPassword) { - $this->database->mysql_root_password = str($rootPassword)->after('MYSQL_ROOT_PASSWORD=')->value(); - } - - $db = $envs->filter(function ($env) { - return str($env)->startsWith('MYSQL_DATABASE='); - })->first(); - - if ($db) { - $databasesToBackup = str($db)->after('MYSQL_DATABASE=')->value(); - } else { - throw new \Exception('MYSQL_DATABASE not found'); - } - } elseif (str($databaseType)->contains('mariadb')) { - $this->container_name = "{$this->database->name}-$serviceUuid"; - $this->directory_name = $serviceName.'-'.$this->container_name; - $commands[] = "docker exec $this->container_name env"; - $envs = instant_remote_process($commands, $this->server); - $envs = str($envs)->explode("\n"); - $rootPassword = $envs->filter(function ($env) { - return str($env)->startsWith('MARIADB_ROOT_PASSWORD='); - })->first(); - if ($rootPassword) { - $this->database->mariadb_root_password = str($rootPassword)->after('MARIADB_ROOT_PASSWORD=')->value(); - } else { - $rootPassword = $envs->filter(function ($env) { - return str($env)->startsWith('MYSQL_ROOT_PASSWORD='); - })->first(); - if ($rootPassword) { - $this->database->mariadb_root_password = str($rootPassword)->after('MYSQL_ROOT_PASSWORD=')->value(); - } - } - - $db = $envs->filter(function ($env) { - return str($env)->startsWith('MARIADB_DATABASE='); - })->first(); - - if ($db) { - $databasesToBackup = str($db)->after('MARIADB_DATABASE=')->value(); - } else { - $db = $envs->filter(function ($env) { - return str($env)->startsWith('MYSQL_DATABASE='); - })->first(); - - if ($db) { - $databasesToBackup = str($db)->after('MYSQL_DATABASE=')->value(); - } else { - throw new \Exception('MARIADB_DATABASE or MYSQL_DATABASE not found'); - } - } - } - } else { - $databaseName = str($this->database->name)->slug()->value(); - $this->container_name = $this->database->uuid; - $this->directory_name = $databaseName.'-'.$this->container_name; - $databaseType = $this->database->type(); - $databasesToBackup = data_get($this->backup, 'databases_to_backup'); - } - if (blank($databasesToBackup)) { - if (str($databaseType)->contains('postgres')) { - $databasesToBackup = [$this->database->postgres_db]; - } elseif (str($databaseType)->contains('mongodb')) { - $databasesToBackup = ['*']; - } elseif (str($databaseType)->contains('mysql')) { - $databasesToBackup = [$this->database->mysql_database]; - } elseif (str($databaseType)->contains('mariadb')) { - $databasesToBackup = [$this->database->mariadb_database]; - } else { - return; - } - } else { - if (str($databaseType)->contains('postgres')) { - // Format: db1,db2,db3 - $databasesToBackup = explode(',', $databasesToBackup); - $databasesToBackup = array_map('trim', $databasesToBackup); - } elseif (str($databaseType)->contains('mongodb')) { - // Format: db1:collection1,collection2|db2:collection3,collection4 - $databasesToBackup = explode('|', $databasesToBackup); - $databasesToBackup = array_map('trim', $databasesToBackup); - } elseif (str($databaseType)->contains('mysql')) { - // Format: db1,db2,db3 - $databasesToBackup = explode(',', $databasesToBackup); - $databasesToBackup = array_map('trim', $databasesToBackup); - } elseif (str($databaseType)->contains('mariadb')) { - // Format: db1,db2,db3 - $databasesToBackup = explode(',', $databasesToBackup); - $databasesToBackup = array_map('trim', $databasesToBackup); - } else { - return; - } - } - $this->backup_dir = backup_dir().'/databases/'.str($this->team->name)->slug().'-'.$this->team->id.'/'.$this->directory_name; - if ($this->database->name === 'coolify-db') { - $databasesToBackup = ['coolify']; - $this->directory_name = $this->container_name = 'coolify-db'; - $ip = Str::slug($this->server->ip); - $this->backup_dir = backup_dir().'/coolify'."/coolify-db-$ip"; - } - foreach ($databasesToBackup as $database) { - $size = 0; - try { - if (str($databaseType)->contains('postgres')) { - $this->backup_file = "/pg-dump-$database-".Carbon::now()->timestamp.'.dmp'; - if ($this->backup->dump_all) { - $this->backup_file = '/pg-dump-all-'.Carbon::now()->timestamp.'.gz'; - } - $this->backup_location = $this->backup_dir.$this->backup_file; - $this->backup_log = ScheduledDatabaseBackupExecution::create([ - 'database_name' => $database, - 'filename' => $this->backup_location, - 'scheduled_database_backup_id' => $this->backup->id, - ]); - $this->backup_standalone_postgresql($database); - } elseif (str($databaseType)->contains('mongodb')) { - if ($database === '*') { - $database = 'all'; - $databaseName = 'all'; - } else { - if (str($database)->contains(':')) { - $databaseName = str($database)->before(':'); - } else { - $databaseName = $database; - } - } - $this->backup_file = "/mongo-dump-$databaseName-".Carbon::now()->timestamp.'.tar.gz'; - $this->backup_location = $this->backup_dir.$this->backup_file; - $this->backup_log = ScheduledDatabaseBackupExecution::create([ - 'database_name' => $databaseName, - 'filename' => $this->backup_location, - 'scheduled_database_backup_id' => $this->backup->id, - ]); - $this->backup_standalone_mongodb($database); - } elseif (str($databaseType)->contains('mysql')) { - $this->backup_file = "/mysql-dump-$database-".Carbon::now()->timestamp.'.dmp'; - if ($this->backup->dump_all) { - $this->backup_file = '/mysql-dump-all-'.Carbon::now()->timestamp.'.gz'; - } - $this->backup_location = $this->backup_dir.$this->backup_file; - $this->backup_log = ScheduledDatabaseBackupExecution::create([ - 'database_name' => $database, - 'filename' => $this->backup_location, - 'scheduled_database_backup_id' => $this->backup->id, - ]); - $this->backup_standalone_mysql($database); - } elseif (str($databaseType)->contains('mariadb')) { - $this->backup_file = "/mariadb-dump-$database-".Carbon::now()->timestamp.'.dmp'; - if ($this->backup->dump_all) { - $this->backup_file = '/mariadb-dump-all-'.Carbon::now()->timestamp.'.gz'; - } - $this->backup_location = $this->backup_dir.$this->backup_file; - $this->backup_log = ScheduledDatabaseBackupExecution::create([ - 'database_name' => $database, - 'filename' => $this->backup_location, - 'scheduled_database_backup_id' => $this->backup->id, - ]); - $this->backup_standalone_mariadb($database); - } else { - throw new \Exception('Unsupported database type'); - } - $size = $this->calculate_size(); - if ($this->backup->save_s3) { - $this->upload_to_s3(); - } - - $this->team->notify(new BackupSuccess($this->backup, $this->database, $database)); - - $this->backup_log->update([ - 'status' => 'success', - 'message' => $this->backup_output, - 'size' => $size, - ]); - } catch (\Throwable $e) { - if ($this->backup_log) { - $this->backup_log->update([ - 'status' => 'failed', - 'message' => $this->backup_output, - 'size' => $size, - 'filename' => null, - ]); - } - $this->team?->notify(new BackupFailed($this->backup, $this->database, $this->backup_output, $database)); - } - } - if ($this->backup_log && $this->backup_log->status === 'success') { - removeOldBackups($this->backup); - } - } catch (\Throwable $e) { - throw $e; - } finally { - if ($this->team) { - BackupCreated::dispatch($this->team->id); - } - if ($this->backup_log) { - $this->backup_log->update([ - 'finished_at' => Carbon::now()->toImmutable(), - ]); - } - } - } - - private function backup_standalone_mongodb(string $databaseWithCollections): void - { - try { - $url = $this->database->internal_db_url; - if ($databaseWithCollections === 'all') { - $commands[] = 'mkdir -p '.$this->backup_dir; - if (str($this->database->image)->startsWith('mongo:4')) { - $commands[] = "docker exec $this->container_name mongodump --uri=\"$url\" --gzip --archive > $this->backup_location"; - } else { - $commands[] = "docker exec $this->container_name mongodump --authenticationDatabase=admin --uri=\"$url\" --gzip --archive > $this->backup_location"; - } - } else { - if (str($databaseWithCollections)->contains(':')) { - $databaseName = str($databaseWithCollections)->before(':'); - $collectionsToExclude = str($databaseWithCollections)->after(':')->explode(','); - } else { - $databaseName = $databaseWithCollections; - $collectionsToExclude = collect(); - } - $commands[] = 'mkdir -p '.$this->backup_dir; - if ($collectionsToExclude->count() === 0) { - if (str($this->database->image)->startsWith('mongo:4')) { - $commands[] = "docker exec $this->container_name mongodump --uri=\"$url\" --gzip --archive > $this->backup_location"; - } else { - $commands[] = "docker exec $this->container_name mongodump --authenticationDatabase=admin --uri=\"$url\" --db $databaseName --gzip --archive > $this->backup_location"; - } - } else { - if (str($this->database->image)->startsWith('mongo:4')) { - $commands[] = "docker exec $this->container_name mongodump --uri=$url --gzip --excludeCollection ".$collectionsToExclude->implode(' --excludeCollection ')." --archive > $this->backup_location"; - } else { - $commands[] = "docker exec $this->container_name mongodump --authenticationDatabase=admin --uri=\"$url\" --db $databaseName --gzip --excludeCollection ".$collectionsToExclude->implode(' --excludeCollection ')." --archive > $this->backup_location"; - } - } - } - $this->backup_output = instant_remote_process($commands, $this->server); - $this->backup_output = trim($this->backup_output); - if ($this->backup_output === '') { - $this->backup_output = null; - } - } catch (\Throwable $e) { - $this->add_to_backup_output($e->getMessage()); - throw $e; - } - } - - private function backup_standalone_postgresql(string $database): void - { - try { - $commands[] = 'mkdir -p '.$this->backup_dir; - $backupCommand = 'docker exec'; - if ($this->postgres_password) { - $backupCommand .= " -e PGPASSWORD=$this->postgres_password"; - } - if ($this->backup->dump_all) { - $backupCommand .= " $this->container_name pg_dumpall --username {$this->database->postgres_user} | gzip > $this->backup_location"; - } else { - $backupCommand .= " $this->container_name pg_dump --format=custom --no-acl --no-owner --username {$this->database->postgres_user} $database > $this->backup_location"; - } - - $commands[] = $backupCommand; - $this->backup_output = instant_remote_process($commands, $this->server); - $this->backup_output = trim($this->backup_output); - if ($this->backup_output === '') { - $this->backup_output = null; - } - } catch (\Throwable $e) { - $this->add_to_backup_output($e->getMessage()); - throw $e; - } - } - - private function backup_standalone_mysql(string $database): void - { - try { - $commands[] = 'mkdir -p '.$this->backup_dir; - if ($this->backup->dump_all) { - $commands[] = "docker exec $this->container_name mysqldump -u root -p\"{$this->database->mysql_root_password}\" --all-databases --single-transaction --quick --lock-tables=false --compress | gzip > $this->backup_location"; - } else { - $commands[] = "docker exec $this->container_name mysqldump -u root -p\"{$this->database->mysql_root_password}\" $database > $this->backup_location"; - } - $this->backup_output = instant_remote_process($commands, $this->server); - $this->backup_output = trim($this->backup_output); - if ($this->backup_output === '') { - $this->backup_output = null; - } - } catch (\Throwable $e) { - $this->add_to_backup_output($e->getMessage()); - throw $e; - } - } - - private function backup_standalone_mariadb(string $database): void - { - try { - $commands[] = 'mkdir -p '.$this->backup_dir; - if ($this->backup->dump_all) { - $commands[] = "docker exec $this->container_name mariadb-dump -u root -p\"{$this->database->mariadb_root_password}\" --all-databases --single-transaction --quick --lock-tables=false --compress > $this->backup_location"; - } else { - $commands[] = "docker exec $this->container_name mariadb-dump -u root -p\"{$this->database->mariadb_root_password}\" $database > $this->backup_location"; - } - $this->backup_output = instant_remote_process($commands, $this->server); - $this->backup_output = trim($this->backup_output); - if ($this->backup_output === '') { - $this->backup_output = null; - } - } catch (\Throwable $e) { - $this->add_to_backup_output($e->getMessage()); - throw $e; - } - } - - private function add_to_backup_output($output): void - { - if ($this->backup_output) { - $this->backup_output = $this->backup_output."\n".$output; - } else { - $this->backup_output = $output; - } - } - - private function calculate_size() - { - return instant_remote_process(["du -b $this->backup_location | cut -f1"], $this->server, false); - } - - private function upload_to_s3(): void - { - try { - if (is_null($this->s3)) { - return; - } - $key = $this->s3->key; - $secret = $this->s3->secret; - // $region = $this->s3->region; - $bucket = $this->s3->bucket; - $endpoint = $this->s3->endpoint; - $this->s3->testConnection(shouldSave: true); - if (data_get($this->backup, 'database_type') === \App\Models\ServiceDatabase::class) { - $network = $this->database->service->destination->network; - } else { - $network = $this->database->destination->network; - } - - $fullImageName = $this->getFullImageName(); - - if (isDev()) { - if ($this->database->name === 'coolify-db') { - $backup_location_from = '/var/lib/docker/volumes/coolify_dev_backups_data/_data/coolify/coolify-db-'.$this->server->ip.$this->backup_file; - $commands[] = "docker run -d --network {$network} --name backup-of-{$this->backup->uuid} --rm -v $backup_location_from:$this->backup_location:ro {$fullImageName}"; - } else { - $backup_location_from = '/var/lib/docker/volumes/coolify_dev_backups_data/_data/databases/'.str($this->team->name)->slug().'-'.$this->team->id.'/'.$this->directory_name.$this->backup_file; - $commands[] = "docker run -d --network {$network} --name backup-of-{$this->backup->uuid} --rm -v $backup_location_from:$this->backup_location:ro {$fullImageName}"; - } - } else { - $commands[] = "docker run -d --network {$network} --name backup-of-{$this->backup->uuid} --rm -v $this->backup_location:$this->backup_location:ro {$fullImageName}"; - } - $commands[] = "docker exec backup-of-{$this->backup->uuid} mc config host add temporary {$endpoint} $key \"$secret\""; - $commands[] = "docker exec backup-of-{$this->backup->uuid} mc cp $this->backup_location temporary/$bucket{$this->backup_dir}/"; - instant_remote_process($commands, $this->server); - - $this->add_to_backup_output('Uploaded to S3.'); - } catch (\Throwable $e) { - $this->add_to_backup_output($e->getMessage()); - throw $e; - } finally { - $command = "docker rm -f backup-of-{$this->backup->uuid}"; - instant_remote_process([$command], $this->server); - } - } - - private function getFullImageName(): string - { - $settings = instanceSettings(); - $helperImage = config('constants.coolify.helper_image'); - $latestVersion = $settings->helper_version; - - return "{$helperImage}:{$latestVersion}"; - } -} diff --git a/app/Jobs/DeleteResourceJob.php b/app/Jobs/DeleteResourceJob.php deleted file mode 100644 index 8b9228e5f5..0000000000 --- a/app/Jobs/DeleteResourceJob.php +++ /dev/null @@ -1,101 +0,0 @@ -onQueue('high'); - } - - public function handle() - { - try { - $persistentStorages = collect(); - switch ($this->resource->type()) { - case 'application': - $persistentStorages = $this->resource?->persistentStorages()?->get(); - StopApplication::run($this->resource, previewDeployments: true); - break; - case 'standalone-postgresql': - case 'standalone-redis': - case 'standalone-mongodb': - case 'standalone-mysql': - case 'standalone-mariadb': - case 'standalone-keydb': - case 'standalone-dragonfly': - case 'standalone-clickhouse': - $persistentStorages = $this->resource?->persistentStorages()?->get(); - StopDatabase::run($this->resource, true); - break; - case 'service': - StopService::run($this->resource, true); - DeleteService::run($this->resource, $this->deleteConfigurations, $this->deleteVolumes, $this->dockerCleanup, $this->deleteConnectedNetworks); - break; - } - - if ($this->deleteVolumes && $this->resource->type() !== 'service') { - $this->resource?->delete_volumes($persistentStorages); - } - if ($this->deleteConfigurations) { - $this->resource?->delete_configurations(); - } - - $isDatabase = $this->resource instanceof StandalonePostgresql - || $this->resource instanceof StandaloneRedis - || $this->resource instanceof StandaloneMongodb - || $this->resource instanceof StandaloneMysql - || $this->resource instanceof StandaloneMariadb - || $this->resource instanceof StandaloneKeydb - || $this->resource instanceof StandaloneDragonfly - || $this->resource instanceof StandaloneClickhouse; - $server = data_get($this->resource, 'server') ?? data_get($this->resource, 'destination.server'); - if (($this->dockerCleanup || $isDatabase) && $server) { - CleanupDocker::dispatch($server, true); - } - - if ($this->deleteConnectedNetworks && ! $isDatabase) { - $this->resource?->delete_connected_networks($this->resource->uuid); - } - } catch (\Throwable $e) { - throw $e; - } finally { - $this->resource->forceDelete(); - if ($this->dockerCleanup) { - CleanupDocker::dispatch($server, true); - } - Artisan::queue('cleanup:stucked-resources'); - } - } -} diff --git a/app/Jobs/DockerCleanupJob.php b/app/Jobs/DockerCleanupJob.php deleted file mode 100644 index 05a4aa8de2..0000000000 --- a/app/Jobs/DockerCleanupJob.php +++ /dev/null @@ -1,131 +0,0 @@ -server->uuid))->dontRelease()]; - } - - public function __construct(public Server $server, public bool $manualCleanup = false) {} - - public function handle(): void - { - try { - if (! $this->server->isFunctional()) { - return; - } - - $this->execution_log = DockerCleanupExecution::create([ - 'server_id' => $this->server->id, - ]); - - $this->usageBefore = $this->server->getDiskUsage(); - - if ($this->manualCleanup || $this->server->settings->force_docker_cleanup) { - $cleanup_log = CleanupDocker::run(server: $this->server); - $usageAfter = $this->server->getDiskUsage(); - $message = ($this->manualCleanup ? 'Manual' : 'Forced').' Docker cleanup job executed successfully. Disk usage before: '.$this->usageBefore.'%, Disk usage after: '.$usageAfter.'%.'; - - $this->execution_log->update([ - 'status' => 'success', - 'message' => $message, - 'cleanup_log' => $cleanup_log, - ]); - - $this->server->team?->notify(new DockerCleanupSuccess($this->server, $message)); - event(new DockerCleanupDone($this->execution_log)); - - return; - } - - if (str($this->usageBefore)->isEmpty() || $this->usageBefore === null || $this->usageBefore === 0) { - $cleanup_log = CleanupDocker::run(server: $this->server); - $message = 'Docker cleanup job executed successfully, but no disk usage could be determined.'; - - $this->execution_log->update([ - 'status' => 'success', - 'message' => $message, - 'cleanup_log' => $cleanup_log, - ]); - - $this->server->team?->notify(new DockerCleanupSuccess($this->server, $message)); - event(new DockerCleanupDone($this->execution_log)); - } - - if ($this->usageBefore >= $this->server->settings->docker_cleanup_threshold) { - $cleanup_log = CleanupDocker::run(server: $this->server); - $usageAfter = $this->server->getDiskUsage(); - $diskSaved = $this->usageBefore - $usageAfter; - - if ($diskSaved > 0) { - $message = 'Saved '.$diskSaved.'% disk space. Disk usage before: '.$this->usageBefore.'%, Disk usage after: '.$usageAfter.'%.'; - } else { - $message = 'Docker cleanup job executed successfully, but no disk space was saved. Disk usage before: '.$this->usageBefore.'%, Disk usage after: '.$usageAfter.'%.'; - } - - $this->execution_log->update([ - 'status' => 'success', - 'message' => $message, - 'cleanup_log' => $cleanup_log, - ]); - - $this->server->team?->notify(new DockerCleanupSuccess($this->server, $message)); - event(new DockerCleanupDone($this->execution_log)); - } else { - $message = 'No cleanup needed for '.$this->server->name; - - $this->execution_log->update([ - 'status' => 'success', - 'message' => $message, - ]); - - $this->server->team?->notify(new DockerCleanupSuccess($this->server, $message)); - event(new DockerCleanupDone($this->execution_log)); - } - } catch (\Throwable $e) { - if ($this->execution_log) { - $this->execution_log->update([ - 'status' => 'failed', - 'message' => $e->getMessage(), - ]); - event(new DockerCleanupDone($this->execution_log)); - } - $this->server->team?->notify(new DockerCleanupFailed($this->server, 'Docker cleanup job failed with the following error: '.$e->getMessage())); - throw $e; - } finally { - if ($this->execution_log) { - $this->execution_log->update([ - 'finished_at' => Carbon::now()->toImmutable(), - ]); - } - } - } -} diff --git a/app/Jobs/GithubAppPermissionJob.php b/app/Jobs/GithubAppPermissionJob.php deleted file mode 100644 index 7cd1b86ac0..0000000000 --- a/app/Jobs/GithubAppPermissionJob.php +++ /dev/null @@ -1,57 +0,0 @@ -github_app); - - $response = Http::withHeaders([ - 'Authorization' => "Bearer $github_access_token", - 'Accept' => 'application/vnd.github+json', - ])->get("{$this->github_app->api_url}/app"); - - if (! $response->successful()) { - throw new \RuntimeException('Failed to fetch GitHub app permissions: '.$response->body()); - } - - $response = $response->json(); - $permissions = data_get($response, 'permissions'); - - $this->github_app->contents = data_get($permissions, 'contents'); - $this->github_app->metadata = data_get($permissions, 'metadata'); - $this->github_app->pull_requests = data_get($permissions, 'pull_requests'); - $this->github_app->administration = data_get($permissions, 'administration'); - - $this->github_app->save(); - $this->github_app->makeVisible('client_secret')->makeVisible('webhook_secret'); - - } catch (\Throwable $e) { - send_internal_notification('GithubAppPermissionJob failed with: '.$e->getMessage()); - throw $e; - } - } -} diff --git a/app/Jobs/PullHelperImageJob.php b/app/Jobs/PullHelperImageJob.php deleted file mode 100644 index b92886d388..0000000000 --- a/app/Jobs/PullHelperImageJob.php +++ /dev/null @@ -1,30 +0,0 @@ -onQueue('high'); - } - - public function handle(): void - { - $helperImage = config('constants.coolify.helper_image'); - $latest_version = instanceSettings()->helper_version; - instant_remote_process(["docker pull -q {$helperImage}:{$latest_version}"], $this->server, false); - } -} diff --git a/app/Jobs/PullTemplatesFromCDN.php b/app/Jobs/PullTemplatesFromCDN.php deleted file mode 100644 index 9a4c991bc6..0000000000 --- a/app/Jobs/PullTemplatesFromCDN.php +++ /dev/null @@ -1,42 +0,0 @@ -onQueue('high'); - } - - public function handle(): void - { - try { - if (isDev()) { - return; - } - $response = Http::retry(3, 1000)->get(config('constants.services.official')); - if ($response->successful()) { - $services = $response->json(); - File::put(base_path('templates/service-templates.json'), json_encode($services)); - } else { - send_internal_notification('PullTemplatesAndVersions failed with: '.$response->status().' '.$response->body()); - } - } catch (\Throwable $e) { - send_internal_notification('PullTemplatesAndVersions failed with: '.$e->getMessage()); - } - } -} diff --git a/app/Jobs/PushServerUpdateJob.php b/app/Jobs/PushServerUpdateJob.php deleted file mode 100644 index 93b203fcbd..0000000000 --- a/app/Jobs/PushServerUpdateJob.php +++ /dev/null @@ -1,372 +0,0 @@ -server->uuid))->dontRelease()]; - } - - public function backoff(): int - { - return isDev() ? 1 : 3; - } - - public function __construct(public Server $server, public $data) - { - $this->containers = collect(); - $this->foundApplicationIds = collect(); - $this->foundDatabaseUuids = collect(); - $this->foundServiceApplicationIds = collect(); - $this->foundApplicationPreviewsIds = collect(); - $this->foundServiceDatabaseIds = collect(); - $this->allApplicationIds = collect(); - $this->allDatabaseUuids = collect(); - $this->allTcpProxyUuids = collect(); - $this->allServiceApplicationIds = collect(); - $this->allServiceDatabaseIds = collect(); - } - - public function handle() - { - // TODO: Swarm is not supported yet - if (! $this->data) { - throw new \Exception('No data provided'); - } - $data = collect($this->data); - - $this->server->sentinelHeartbeat(); - - $this->containers = collect(data_get($data, 'containers')); - - $filesystemUsageRoot = data_get($data, 'filesystem_usage_root.used_percentage'); - ServerStorageCheckJob::dispatch($this->server, $filesystemUsageRoot); - - if ($this->containers->isEmpty()) { - return; - } - $this->applications = $this->server->applications(); - $this->databases = $this->server->databases(); - $this->previews = $this->server->previews(); - $this->services = $this->server->services()->get(); - $this->allApplicationIds = $this->applications->filter(function ($application) { - return $application->additional_servers->count() === 0; - })->pluck('id'); - $this->allApplicationsWithAdditionalServers = $this->applications->filter(function ($application) { - return $application->additional_servers->count() > 0; - }); - $this->allApplicationPreviewsIds = $this->previews->pluck('id'); - $this->allDatabaseUuids = $this->databases->pluck('uuid'); - $this->allTcpProxyUuids = $this->databases->where('is_public', true)->pluck('uuid'); - $this->services->each(function ($service) { - $service->applications()->pluck('id')->each(function ($applicationId) { - $this->allServiceApplicationIds->push($applicationId); - }); - $service->databases()->pluck('id')->each(function ($databaseId) { - $this->allServiceDatabaseIds->push($databaseId); - }); - }); - - foreach ($this->containers as $container) { - $containerStatus = data_get($container, 'state', 'exited'); - $containerHealth = data_get($container, 'health_status', 'unhealthy'); - $containerStatus = "$containerStatus ($containerHealth)"; - $labels = collect(data_get($container, 'labels')); - $coolify_managed = $labels->has('coolify.managed'); - if ($coolify_managed) { - $name = data_get($container, 'name'); - if ($name === 'coolify-log-drain' && $this->isRunning($containerStatus)) { - $this->foundLogDrainContainer = true; - } - if ($labels->has('coolify.applicationId')) { - $applicationId = $labels->get('coolify.applicationId'); - $pullRequestId = data_get($labels, 'coolify.pullRequestId', '0'); - try { - if ($pullRequestId === '0') { - if ($this->allApplicationIds->contains($applicationId) && $this->isRunning($containerStatus)) { - $this->foundApplicationIds->push($applicationId); - } - $this->updateApplicationStatus($applicationId, $containerStatus); - } else { - if ($this->allApplicationPreviewsIds->contains($applicationId) && $this->isRunning($containerStatus)) { - $this->foundApplicationPreviewsIds->push($applicationId); - } - $this->updateApplicationPreviewStatus($applicationId, $containerStatus); - } - } catch (\Exception $e) { - } - } elseif ($labels->has('coolify.serviceId')) { - $serviceId = $labels->get('coolify.serviceId'); - $subType = $labels->get('coolify.service.subType'); - $subId = $labels->get('coolify.service.subId'); - if ($subType === 'application' && $this->isRunning($containerStatus)) { - $this->foundServiceApplicationIds->push($subId); - $this->updateServiceSubStatus($serviceId, $subType, $subId, $containerStatus); - } elseif ($subType === 'database' && $this->isRunning($containerStatus)) { - $this->foundServiceDatabaseIds->push($subId); - $this->updateServiceSubStatus($serviceId, $subType, $subId, $containerStatus); - } - } else { - $uuid = $labels->get('com.docker.compose.service'); - $type = $labels->get('coolify.type'); - if ($name === 'coolify-proxy' && $this->isRunning($containerStatus)) { - $this->foundProxy = true; - } elseif ($type === 'service' && $this->isRunning($containerStatus)) { - } else { - if ($this->allDatabaseUuids->contains($uuid) && $this->isRunning($containerStatus)) { - $this->foundDatabaseUuids->push($uuid); - if ($this->allTcpProxyUuids->contains($uuid) && $this->isRunning($containerStatus)) { - $this->updateDatabaseStatus($uuid, $containerStatus, tcpProxy: true); - } else { - $this->updateDatabaseStatus($uuid, $containerStatus, tcpProxy: false); - } - } - } - } - } - } - - $this->updateProxyStatus(); - - $this->updateNotFoundApplicationStatus(); - $this->updateNotFoundApplicationPreviewStatus(); - $this->updateNotFoundDatabaseStatus(); - $this->updateNotFoundServiceStatus(); - - $this->updateAdditionalServersStatus(); - - $this->checkLogDrainContainer(); - } - - private function updateApplicationStatus(string $applicationId, string $containerStatus) - { - $application = $this->applications->where('id', $applicationId)->first(); - if (! $application) { - return; - } - $application->status = $containerStatus; - $application->save(); - } - - private function updateApplicationPreviewStatus(string $applicationId, string $containerStatus) - { - $application = $this->previews->where('id', $applicationId)->first(); - if (! $application) { - return; - } - $application->status = $containerStatus; - $application->save(); - } - - private function updateNotFoundApplicationStatus() - { - $notFoundApplicationIds = $this->allApplicationIds->diff($this->foundApplicationIds); - if ($notFoundApplicationIds->isNotEmpty()) { - $notFoundApplicationIds->each(function ($applicationId) { - $application = Application::find($applicationId); - if ($application) { - $application->status = 'exited'; - $application->save(); - } - }); - } - } - - private function updateNotFoundApplicationPreviewStatus() - { - $notFoundApplicationPreviewsIds = $this->allApplicationPreviewsIds->diff($this->foundApplicationPreviewsIds); - if ($notFoundApplicationPreviewsIds->isNotEmpty()) { - $notFoundApplicationPreviewsIds->each(function ($applicationPreviewId) { - $applicationPreview = ApplicationPreview::find($applicationPreviewId); - if ($applicationPreview) { - $applicationPreview->status = 'exited'; - $applicationPreview->save(); - } - }); - } - } - - private function updateProxyStatus() - { - // If proxy is not found, start it - if ($this->server->isProxyShouldRun()) { - if ($this->foundProxy === false) { - try { - if (CheckProxy::run($this->server)) { - StartProxy::run($this->server, false); - $this->server->team?->notify(new ContainerRestarted('coolify-proxy', $this->server)); - } - } catch (\Throwable $e) { - } - } else { - $connectProxyToDockerNetworks = connectProxyToNetworks($this->server); - instant_remote_process($connectProxyToDockerNetworks, $this->server, false); - } - } - } - - private function updateDatabaseStatus(string $databaseUuid, string $containerStatus, bool $tcpProxy = false) - { - $database = $this->databases->where('uuid', $databaseUuid)->first(); - if (! $database) { - return; - } - $database->status = $containerStatus; - $database->save(); - if ($this->isRunning($containerStatus) && $tcpProxy) { - $tcpProxyContainerFound = $this->containers->filter(function ($value, $key) use ($databaseUuid) { - return data_get($value, 'name') === "$databaseUuid-proxy" && data_get($value, 'state') === 'running'; - })->first(); - if (! $tcpProxyContainerFound) { - StartDatabaseProxy::dispatch($database); - $this->server->team?->notify(new ContainerRestarted("TCP Proxy for {$database->name}", $this->server)); - } else { - } - } - } - - private function updateNotFoundDatabaseStatus() - { - $notFoundDatabaseUuids = $this->allDatabaseUuids->diff($this->foundDatabaseUuids); - if ($notFoundDatabaseUuids->isNotEmpty()) { - $notFoundDatabaseUuids->each(function ($databaseUuid) { - $database = $this->databases->where('uuid', $databaseUuid)->first(); - if ($database) { - $database->status = 'exited'; - $database->save(); - if ($database->is_public) { - StopDatabaseProxy::dispatch($database); - } - } - }); - } - } - - private function updateServiceSubStatus(string $serviceId, string $subType, string $subId, string $containerStatus) - { - $service = $this->services->where('id', $serviceId)->first(); - if (! $service) { - return; - } - if ($subType === 'application') { - $application = $service->applications()->where('id', $subId)->first(); - $application->status = $containerStatus; - $application->save(); - } elseif ($subType === 'database') { - $database = $service->databases()->where('id', $subId)->first(); - $database->status = $containerStatus; - $database->save(); - } else { - } - } - - private function updateNotFoundServiceStatus() - { - $notFoundServiceApplicationIds = $this->allServiceApplicationIds->diff($this->foundServiceApplicationIds); - $notFoundServiceDatabaseIds = $this->allServiceDatabaseIds->diff($this->foundServiceDatabaseIds); - if ($notFoundServiceApplicationIds->isNotEmpty()) { - $notFoundServiceApplicationIds->each(function ($serviceApplicationId) { - $application = ServiceApplication::find($serviceApplicationId); - if ($application) { - $application->status = 'exited'; - $application->save(); - } - }); - } - if ($notFoundServiceDatabaseIds->isNotEmpty()) { - $notFoundServiceDatabaseIds->each(function ($serviceDatabaseId) { - $database = ServiceDatabase::find($serviceDatabaseId); - if ($database) { - $database->status = 'exited'; - $database->save(); - } - }); - } - } - - private function updateAdditionalServersStatus() - { - $this->allApplicationsWithAdditionalServers->each(function ($application) { - ComplexStatusCheck::run($application); - }); - } - - private function isRunning(string $containerStatus) - { - return str($containerStatus)->contains('running'); - } - - private function checkLogDrainContainer() - { - if ($this->server->isLogDrainEnabled() && $this->foundLogDrainContainer === false) { - StartLogDrain::dispatch($this->server); - } - } -} diff --git a/app/Jobs/ScheduledTaskJob.php b/app/Jobs/ScheduledTaskJob.php deleted file mode 100644 index 6c0c017e73..0000000000 --- a/app/Jobs/ScheduledTaskJob.php +++ /dev/null @@ -1,142 +0,0 @@ -onQueue('high'); - - $this->task = $task; - if ($service = $task->service()->first()) { - $this->resource = $service; - } elseif ($application = $task->application()->first()) { - $this->resource = $application; - } else { - throw new \RuntimeException('ScheduledTaskJob failed: No resource found.'); - } - $this->team = Team::findOrFail($task->team_id); - $this->server_timezone = $this->getServerTimezone(); - } - - private function getServerTimezone(): string - { - if ($this->resource instanceof Application) { - return $this->resource->destination->server->settings->server_timezone; - } elseif ($this->resource instanceof Service) { - return $this->resource->server->settings->server_timezone; - } - - return 'UTC'; - } - - public function handle(): void - { - try { - $this->task_log = ScheduledTaskExecution::create([ - 'scheduled_task_id' => $this->task->id, - ]); - - $this->server = $this->resource->destination->server; - - if ($this->resource->type() === 'application') { - $containers = getCurrentApplicationContainerStatus($this->server, $this->resource->id, 0); - if ($containers->count() > 0) { - $containers->each(function ($container) { - $this->containers[] = str_replace('/', '', $container['Names']); - }); - } - } elseif ($this->resource->type() === 'service') { - $this->resource->applications()->get()->each(function ($application) { - if (str(data_get($application, 'status'))->contains('running')) { - $this->containers[] = data_get($application, 'name').'-'.data_get($this->resource, 'uuid'); - } - }); - $this->resource->databases()->get()->each(function ($database) { - if (str(data_get($database, 'status'))->contains('running')) { - $this->containers[] = data_get($database, 'name').'-'.data_get($this->resource, 'uuid'); - } - }); - } - if (count($this->containers) == 0) { - throw new \Exception('ScheduledTaskJob failed: No containers running.'); - } - - if (count($this->containers) > 1 && empty($this->task->container)) { - throw new \Exception('ScheduledTaskJob failed: More than one container exists but no container name was provided.'); - } - - foreach ($this->containers as $containerName) { - if (count($this->containers) == 1 || str_starts_with($containerName, $this->task->container.'-'.$this->resource->uuid)) { - $cmd = "sh -c '".str_replace("'", "'\''", $this->task->command)."'"; - $exec = "docker exec {$containerName} {$cmd}"; - $this->task_output = instant_remote_process([$exec], $this->server, true); - $this->task_log->update([ - 'status' => 'success', - 'message' => $this->task_output, - ]); - - $this->team?->notify(new TaskSuccess($this->task, $this->task_output)); - - return; - } - } - - // No valid container was found. - throw new \Exception('ScheduledTaskJob failed: No valid container was found. Is the container name correct?'); - } catch (\Throwable $e) { - if ($this->task_log) { - $this->task_log->update([ - 'status' => 'failed', - 'message' => $this->task_output ?? $e->getMessage(), - ]); - } - $this->team?->notify(new TaskFailed($this->task, $e->getMessage())); - throw $e; - } finally { - ScheduledTaskDone::dispatch($this->team->id); - if ($this->task_log) { - $this->task_log->update([ - 'finished_at' => Carbon::now()->toImmutable(), - ]); - } - } - } -} diff --git a/app/Jobs/SendMessageToDiscordJob.php b/app/Jobs/SendMessageToDiscordJob.php deleted file mode 100644 index 99aeaeea27..0000000000 --- a/app/Jobs/SendMessageToDiscordJob.php +++ /dev/null @@ -1,46 +0,0 @@ -onQueue('high'); - } - - /** - * Execute the job. - */ - public function handle(): void - { - Http::post($this->webhookUrl, $this->message->toPayload()); - } -} diff --git a/app/Jobs/SendMessageToPushoverJob.php b/app/Jobs/SendMessageToPushoverJob.php deleted file mode 100644 index e2a94cdaa0..0000000000 --- a/app/Jobs/SendMessageToPushoverJob.php +++ /dev/null @@ -1,50 +0,0 @@ -onQueue('high'); - } - - /** - * Execute the job. - */ - public function handle(): void - { - $response = Http::post('https://api.pushover.net/1/messages.json', $this->message->toPayload($this->token, $this->user)); - if ($response->failed()) { - throw new \RuntimeException('Pushover notification failed with '.$response->status().' status code.'.$response->body()); - } - } -} diff --git a/app/Jobs/SendMessageToSlackJob.php b/app/Jobs/SendMessageToSlackJob.php deleted file mode 100644 index dd5335850b..0000000000 --- a/app/Jobs/SendMessageToSlackJob.php +++ /dev/null @@ -1,60 +0,0 @@ -onQueue('high'); - } - - public function handle(): void - { - Http::post($this->webhookUrl, [ - 'text' => $this->message->title, - 'blocks' => [ - [ - 'type' => 'section', - 'text' => [ - 'type' => 'plain_text', - 'text' => 'Coolify Notification', - ], - ], - ], - 'attachments' => [ - [ - 'color' => $this->message->color, - 'blocks' => [ - [ - 'type' => 'header', - 'text' => [ - 'type' => 'plain_text', - 'text' => $this->message->title, - ], - ], - [ - 'type' => 'section', - 'text' => [ - 'type' => 'mrkdwn', - 'text' => $this->message->description, - ], - ], - ], - ], - ], - ]); - } -} diff --git a/app/Jobs/SendMessageToTelegramJob.php b/app/Jobs/SendMessageToTelegramJob.php deleted file mode 100644 index 6b0a64ae39..0000000000 --- a/app/Jobs/SendMessageToTelegramJob.php +++ /dev/null @@ -1,78 +0,0 @@ -onQueue('high'); - } - - /** - * Execute the job. - */ - public function handle(): void - { - $url = 'https://api.telegram.org/bot'.$this->token.'/sendMessage'; - $inlineButtons = []; - if (! empty($this->buttons)) { - foreach ($this->buttons as $button) { - $buttonUrl = data_get($button, 'url'); - $text = data_get($button, 'text', 'Click here'); - if ($buttonUrl && Str::contains($buttonUrl, 'http://localhost')) { - $buttonUrl = str_replace('http://localhost', config('app.url'), $buttonUrl); - } - $inlineButtons[] = [ - 'text' => $text, - 'url' => $buttonUrl, - ]; - } - } - $payload = [ - // 'parse_mode' => 'markdown', - 'reply_markup' => json_encode([ - 'inline_keyboard' => [ - [...$inlineButtons], - ], - ]), - 'chat_id' => $this->chatId, - 'text' => $this->text, - ]; - if ($this->threadId) { - $payload['message_thread_id'] = $this->threadId; - } - $response = Http::post($url, $payload); - if ($response->failed()) { - throw new \RuntimeException('Telegram notification failed with '.$response->status().' status code.'.$response->body()); - } - } -} diff --git a/app/Jobs/ServerCheckJob.php b/app/Jobs/ServerCheckJob.php deleted file mode 100644 index 9818d5c6a0..0000000000 --- a/app/Jobs/ServerCheckJob.php +++ /dev/null @@ -1,103 +0,0 @@ -server->uuid))->dontRelease()]; - } - - public function __construct(public Server $server) {} - - public function handle() - { - try { - if ($this->server->serverStatus() === false) { - return 'Server is not reachable or not ready.'; - } - - if (! $this->server->isSwarmWorker() && ! $this->server->isBuildServer()) { - ['containers' => $this->containers, 'containerReplicates' => $containerReplicates] = $this->server->getContainers(); - if (is_null($this->containers)) { - return 'No containers found.'; - } - GetContainersStatus::run($this->server, $this->containers, $containerReplicates); - - if ($this->server->isSentinelEnabled()) { - CheckAndStartSentinelJob::dispatch($this->server); - } - - if ($this->server->isLogDrainEnabled()) { - $this->checkLogDrainContainer(); - } - - if ($this->server->proxySet() && ! $this->server->proxy->force_stop) { - $this->server->proxyType(); - $foundProxyContainer = $this->containers->filter(function ($value, $key) { - if ($this->server->isSwarm()) { - return data_get($value, 'Spec.Name') === 'coolify-proxy_traefik'; - } else { - return data_get($value, 'Name') === '/coolify-proxy'; - } - })->first(); - if (! $foundProxyContainer) { - try { - $shouldStart = CheckProxy::run($this->server); - if ($shouldStart) { - StartProxy::run($this->server, false); - $this->server->team?->notify(new ContainerRestarted('coolify-proxy', $this->server)); - } - } catch (\Throwable $e) { - } - } else { - $this->server->proxy->status = data_get($foundProxyContainer, 'State.Status'); - $this->server->save(); - $connectProxyToDockerNetworks = connectProxyToNetworks($this->server); - instant_remote_process($connectProxyToDockerNetworks, $this->server, false); - } - } - } - } catch (\Throwable $e) { - return handleError($e); - } - } - - private function checkLogDrainContainer() - { - $foundLogDrainContainer = $this->containers->filter(function ($value, $key) { - return data_get($value, 'Name') === '/coolify-log-drain'; - })->first(); - if ($foundLogDrainContainer) { - $status = data_get($foundLogDrainContainer, 'State.Status'); - if ($status !== 'running') { - StartLogDrain::dispatch($this->server); - } - } else { - StartLogDrain::dispatch($this->server); - } - } -} diff --git a/app/Jobs/ServerCheckNewJob.php b/app/Jobs/ServerCheckNewJob.php deleted file mode 100644 index 3e8e60a31d..0000000000 --- a/app/Jobs/ServerCheckNewJob.php +++ /dev/null @@ -1,34 +0,0 @@ -server); - ResourcesCheck::dispatch($this->server); - } catch (\Throwable $e) { - return handleError($e); - } - } -} diff --git a/app/Jobs/ServerCleanupMux.php b/app/Jobs/ServerCleanupMux.php deleted file mode 100644 index b793c3eca6..0000000000 --- a/app/Jobs/ServerCleanupMux.php +++ /dev/null @@ -1,40 +0,0 @@ -server->serverStatus() === false) { - return 'Server is not reachable or not ready.'; - } - SshMultiplexingHelper::removeMuxFile($this->server); - } catch (\Throwable $e) { - return handleError($e); - } - } -} diff --git a/app/Jobs/ServerFilesFromServerJob.php b/app/Jobs/ServerFilesFromServerJob.php deleted file mode 100644 index 58455df2f4..0000000000 --- a/app/Jobs/ServerFilesFromServerJob.php +++ /dev/null @@ -1,28 +0,0 @@ -onQueue('high'); - } - - public function handle() - { - $this->resource->getFilesFromServer(isInit: true); - } -} diff --git a/app/Jobs/ServerLimitCheckJob.php b/app/Jobs/ServerLimitCheckJob.php deleted file mode 100644 index aa82c6dade..0000000000 --- a/app/Jobs/ServerLimitCheckJob.php +++ /dev/null @@ -1,55 +0,0 @@ -team->servers; - $servers_count = $servers->count(); - $number_of_servers_to_disable = $servers_count - $this->team->limits; - if ($number_of_servers_to_disable > 0) { - $servers = $servers->sortbyDesc('created_at'); - $servers_to_disable = $servers->take($number_of_servers_to_disable); - $servers_to_disable->each(function ($server) { - $server->forceDisableServer(); - $this->team->notify(new ForceDisabled($server)); - }); - } elseif ($number_of_servers_to_disable === 0) { - $servers->each(function ($server) { - if ($server->isForceDisabled()) { - $server->forceEnableServer(); - $this->team->notify(new ForceEnabled($server)); - } - }); - } - } catch (\Throwable $e) { - send_internal_notification('ServerLimitCheckJob failed with: '.$e->getMessage()); - - return handleError($e); - } - } -} diff --git a/app/Jobs/ServerStorageCheckJob.php b/app/Jobs/ServerStorageCheckJob.php deleted file mode 100644 index 9a8d86be1e..0000000000 --- a/app/Jobs/ServerStorageCheckJob.php +++ /dev/null @@ -1,65 +0,0 @@ -server->isFunctional() === false) { - return 'Server is not functional.'; - } - $team = data_get($this->server, 'team'); - $serverDiskUsageNotificationThreshold = data_get($this->server, 'settings.server_disk_usage_notification_threshold'); - - if (is_null($this->percentage)) { - $this->percentage = $this->server->storageCheck(); - } - if (! $this->percentage) { - return 'No percentage could be retrieved.'; - } - if ($this->percentage > $serverDiskUsageNotificationThreshold) { - $executed = RateLimiter::attempt( - 'high-disk-usage:'.$this->server->id, - $maxAttempts = 0, - function () use ($team, $serverDiskUsageNotificationThreshold) { - $team->notify(new HighDiskUsage($this->server, $this->percentage, $serverDiskUsageNotificationThreshold)); - }, - $decaySeconds = 3600, - ); - - if (! $executed) { - return 'Too many messages sent!'; - } - } else { - RateLimiter::hit('high-disk-usage:'.$this->server->id, 600); - } - } catch (\Throwable $e) { - return handleError($e); - } - } -} diff --git a/app/Jobs/ServerStorageSaveJob.php b/app/Jobs/ServerStorageSaveJob.php deleted file mode 100644 index 17a293f94f..0000000000 --- a/app/Jobs/ServerStorageSaveJob.php +++ /dev/null @@ -1,26 +0,0 @@ -onQueue('high'); - } - - public function handle() - { - $this->localFileVolume->saveStorageOnServer(); - } -} diff --git a/app/Jobs/StripeProcessJob.php b/app/Jobs/StripeProcessJob.php deleted file mode 100644 index f1c5bc1a8a..0000000000 --- a/app/Jobs/StripeProcessJob.php +++ /dev/null @@ -1,291 +0,0 @@ -onQueue('high'); - } - - public function handle(): void - { - try { - $excludedPlans = config('subscription.stripe_excluded_plans'); - - $type = data_get($this->event, 'type'); - $this->type = $type; - $data = data_get($this->event, 'data.object'); - switch ($type) { - case 'radar.early_fraud_warning.created': - $stripe = new \Stripe\StripeClient(config('subscription.stripe_api_key')); - $id = data_get($data, 'id'); - $charge = data_get($data, 'charge'); - if ($charge) { - $stripe->refunds->create(['charge' => $charge]); - } - $pi = data_get($data, 'payment_intent'); - $piData = $stripe->paymentIntents->retrieve($pi, []); - $customerId = data_get($piData, 'customer'); - $subscription = Subscription::where('stripe_customer_id', $customerId)->first(); - if ($subscription) { - $subscriptionId = data_get($subscription, 'stripe_subscription_id'); - $stripe->subscriptions->cancel($subscriptionId, []); - $subscription->update([ - 'stripe_invoice_paid' => false, - ]); - send_internal_notification("Early fraud warning created Refunded, subscription canceled. Charge: {$charge}, id: {$id}, pi: {$pi}"); - } else { - send_internal_notification("Early fraud warning: subscription not found. Charge: {$charge}, id: {$id}, pi: {$pi}"); - throw new \RuntimeException("Early fraud warning: subscription not found. Charge: {$charge}, id: {$id}, pi: {$pi}"); - } - break; - case 'checkout.session.completed': - $clientReferenceId = data_get($data, 'client_reference_id'); - if (is_null($clientReferenceId)) { - send_internal_notification('Checkout session completed without client reference id.'); - break; - } - $userId = Str::before($clientReferenceId, ':'); - $teamId = Str::after($clientReferenceId, ':'); - $subscriptionId = data_get($data, 'subscription'); - $customerId = data_get($data, 'customer'); - $team = Team::find($teamId); - $found = $team->members->where('id', $userId)->first(); - if (! $found->isAdmin()) { - send_internal_notification("User {$userId} is not an admin or owner of team {$team->id}, customerid: {$customerId}, subscriptionid: {$subscriptionId}."); - throw new \RuntimeException("User {$userId} is not an admin or owner of team {$team->id}, customerid: {$customerId}, subscriptionid: {$subscriptionId}."); - } - $subscription = Subscription::where('team_id', $teamId)->first(); - if ($subscription) { - // send_internal_notification('Old subscription activated for team: '.$teamId); - $subscription->update([ - 'stripe_subscription_id' => $subscriptionId, - 'stripe_customer_id' => $customerId, - 'stripe_invoice_paid' => true, - 'stripe_past_due' => false, - ]); - } else { - // send_internal_notification('New subscription for team: '.$teamId); - Subscription::create([ - 'team_id' => $teamId, - 'stripe_subscription_id' => $subscriptionId, - 'stripe_customer_id' => $customerId, - 'stripe_invoice_paid' => true, - 'stripe_past_due' => false, - ]); - } - break; - case 'invoice.paid': - $customerId = data_get($data, 'customer'); - $planId = data_get($data, 'lines.data.0.plan.id'); - if (Str::contains($excludedPlans, $planId)) { - send_internal_notification('Subscription excluded.'); - break; - } - $subscription = Subscription::where('stripe_customer_id', $customerId)->first(); - if ($subscription) { - $subscription->update([ - 'stripe_invoice_paid' => true, - 'stripe_past_due' => false, - ]); - } else { - throw new \RuntimeException("No subscription found for customer: {$customerId}"); - } - break; - case 'invoice.payment_failed': - $customerId = data_get($data, 'customer'); - $subscription = Subscription::where('stripe_customer_id', $customerId)->first(); - if (! $subscription) { - send_internal_notification('invoice.payment_failed failed but no subscription found in Coolify for customer: '.$customerId); - throw new \RuntimeException("No subscription found for customer: {$customerId}"); - } - $team = data_get($subscription, 'team'); - if (! $team) { - send_internal_notification('invoice.payment_failed failed but no team found in Coolify for customer: '.$customerId); - throw new \RuntimeException("No team found in Coolify for customer: {$customerId}"); - } - if (! $subscription->stripe_invoice_paid) { - SubscriptionInvoiceFailedJob::dispatch($team); - // send_internal_notification('Invoice payment failed: '.$customerId); - } - break; - case 'payment_intent.payment_failed': - $customerId = data_get($data, 'customer'); - $subscription = Subscription::where('stripe_customer_id', $customerId)->first(); - if (! $subscription) { - send_internal_notification('payment_intent.payment_failed, no subscription found in Coolify for customer: '.$customerId); - throw new \RuntimeException("No subscription found in Coolify for customer: {$customerId}"); - } - if ($subscription->stripe_invoice_paid) { - send_internal_notification('payment_intent.payment_failed but invoice is active for customer: '.$customerId); - - return; - } - // send_internal_notification('Subscription payment failed for customer: '.$customerId); - break; - case 'customer.subscription.created': - $customerId = data_get($data, 'customer'); - $subscriptionId = data_get($data, 'id'); - $teamId = data_get($data, 'metadata.team_id'); - $userId = data_get($data, 'metadata.user_id'); - if (! $teamId || ! $userId) { - $subscription = Subscription::where('stripe_customer_id', $customerId)->first(); - if ($subscription) { - throw new \RuntimeException("Subscription already exists for customer: {$customerId}"); - } - throw new \RuntimeException('No team id or user id found'); - } - $team = Team::find($teamId); - $found = $team->members->where('id', $userId)->first(); - if (! $found->isAdmin()) { - send_internal_notification("User {$userId} is not an admin or owner of team {$team->id}, customerid: {$customerId}."); - throw new \RuntimeException("User {$userId} is not an admin or owner of team {$team->id}, customerid: {$customerId}."); - } - $subscription = Subscription::where('team_id', $teamId)->first(); - if ($subscription) { - // send_internal_notification("Subscription already exists for team: {$teamId}"); - throw new \RuntimeException("Subscription already exists for team: {$teamId}"); - } else { - Subscription::create([ - 'team_id' => $teamId, - 'stripe_subscription_id' => $subscriptionId, - 'stripe_customer_id' => $customerId, - 'stripe_invoice_paid' => false, - ]); - } - case 'customer.subscription.updated': - $teamId = data_get($data, 'metadata.team_id'); - $userId = data_get($data, 'metadata.user_id'); - $customerId = data_get($data, 'customer'); - $status = data_get($data, 'status'); - $subscriptionId = data_get($data, 'items.data.0.subscription') ?? data_get($data, 'id'); - $planId = data_get($data, 'items.data.0.plan.id') ?? data_get($data, 'plan.id'); - if (Str::contains($excludedPlans, $planId)) { - send_internal_notification('Subscription excluded.'); - break; - } - $subscription = Subscription::where('stripe_customer_id', $customerId)->first(); - if (! $subscription) { - if ($status === 'incomplete_expired') { - // send_internal_notification('Subscription incomplete expired'); - throw new \RuntimeException('Subscription incomplete expired'); - } - if ($teamId) { - $subscription = Subscription::create([ - 'team_id' => $teamId, - 'stripe_subscription_id' => $subscriptionId, - 'stripe_customer_id' => $customerId, - 'stripe_invoice_paid' => false, - ]); - } else { - send_internal_notification('No subscription and team id found'); - throw new \RuntimeException('No subscription and team id found'); - } - } - $cancelAtPeriodEnd = data_get($data, 'cancel_at_period_end'); - $feedback = data_get($data, 'cancellation_details.feedback'); - $comment = data_get($data, 'cancellation_details.comment'); - $lookup_key = data_get($data, 'items.data.0.price.lookup_key'); - if (str($lookup_key)->contains('dynamic')) { - $quantity = data_get($data, 'items.data.0.quantity', 2); - $team = data_get($subscription, 'team'); - if ($team) { - $team->update([ - 'custom_server_limit' => $quantity, - ]); - } - ServerLimitCheckJob::dispatch($team); - } - $subscription->update([ - 'stripe_feedback' => $feedback, - 'stripe_comment' => $comment, - 'stripe_plan_id' => $planId, - 'stripe_cancel_at_period_end' => $cancelAtPeriodEnd, - ]); - if ($status === 'paused' || $status === 'incomplete_expired') { - if ($subscription->stripe_subscription_id === $subscriptionId) { - $subscription->update([ - 'stripe_invoice_paid' => false, - ]); - } - } - if ($status === 'past_due') { - if ($subscription->stripe_subscription_id === $subscriptionId) { - $subscription->update([ - 'stripe_past_due' => true, - ]); - send_internal_notification('Past Due: '.$customerId.'Subscription ID: '.$subscriptionId); - } - } - if ($status === 'unpaid') { - if ($subscription->stripe_subscription_id === $subscriptionId) { - $subscription->update([ - 'stripe_invoice_paid' => false, - ]); - send_internal_notification('Unpaid: '.$customerId.'Subscription ID: '.$subscriptionId); - } - $team = data_get($subscription, 'team'); - if ($team) { - $team->subscriptionEnded(); - } else { - send_internal_notification('Subscription unpaid but no team found in Coolify for customer: '.$customerId); - throw new \RuntimeException("No team found in Coolify for customer: {$customerId}"); - } - } - if ($status === 'active') { - if ($subscription->stripe_subscription_id === $subscriptionId) { - $subscription->update([ - 'stripe_past_due' => false, - 'stripe_invoice_paid' => true, - ]); - } - } - if ($feedback) { - $reason = "Cancellation feedback for {$customerId}: '".$feedback."'"; - if ($comment) { - $reason .= ' with comment: \''.$comment."'"; - } - } - - break; - case 'customer.subscription.deleted': - $customerId = data_get($data, 'customer'); - $subscriptionId = data_get($data, 'id'); - $subscription = Subscription::where('stripe_customer_id', $customerId)->where('stripe_subscription_id', $subscriptionId)->first(); - if ($subscription) { - $team = data_get($subscription, 'team'); - if ($team) { - $team->subscriptionEnded(); - } else { - send_internal_notification('Subscription deleted but no team found in Coolify for customer: '.$customerId); - throw new \RuntimeException("No team found in Coolify for customer: {$customerId}"); - } - } else { - send_internal_notification('Subscription deleted but no subscription found in Coolify for customer: '.$customerId); - throw new \RuntimeException("No subscription found in Coolify for customer: {$customerId}"); - } - break; - default: - throw new \RuntimeException("Unhandled event type: {$type}"); - } - } catch (\Exception $e) { - send_internal_notification('StripeProcessJob error: '.$e->getMessage()); - } - } -} diff --git a/app/Jobs/SubscriptionInvoiceFailedJob.php b/app/Jobs/SubscriptionInvoiceFailedJob.php deleted file mode 100755 index dc511f4452..0000000000 --- a/app/Jobs/SubscriptionInvoiceFailedJob.php +++ /dev/null @@ -1,42 +0,0 @@ -onQueue('high'); - } - - public function handle() - { - try { - $session = getStripeCustomerPortalSession($this->team); - $mail = new MailMessage; - $mail->view('emails.subscription-invoice-failed', [ - 'stripeCustomerPortal' => $session->url, - ]); - $mail->subject('Your last payment was failed for Coolify Cloud.'); - $this->team->members()->each(function ($member) use ($mail) { - if ($member->isAdmin()) { - send_user_an_email($mail, $member->email); - } - }); - } catch (\Throwable $e) { - send_internal_notification('SubscriptionInvoiceFailedJob failed with: '.$e->getMessage()); - throw $e; - } - } -} diff --git a/app/Jobs/UpdateCoolifyJob.php b/app/Jobs/UpdateCoolifyJob.php deleted file mode 100644 index f0e43cbc0a..0000000000 --- a/app/Jobs/UpdateCoolifyJob.php +++ /dev/null @@ -1,54 +0,0 @@ -onQueue('high'); - } - - public function handle(): void - { - try { - CheckForUpdatesJob::dispatchSync(); - $settings = instanceSettings(); - if (! $settings->new_version_available) { - Log::info('No new version available. Skipping update.'); - - return; - } - - $server = Server::findOrFail(0); - if (! $server) { - Log::error('Server not found. Cannot proceed with update.'); - - return; - } - - Log::info('Starting Coolify update process...'); - UpdateCoolify::run(false); // false means it's not a manual update - - $settings->update(['new_version_available' => false]); - Log::info('Coolify update completed successfully.'); - } catch (\Throwable $e) { - Log::error('UpdateCoolifyJob failed: '.$e->getMessage()); - // Consider implementing a notification to administrators - } - } -} diff --git a/app/Jobs/VolumeCloneJob.php b/app/Jobs/VolumeCloneJob.php deleted file mode 100644 index f37a9704e3..0000000000 --- a/app/Jobs/VolumeCloneJob.php +++ /dev/null @@ -1,104 +0,0 @@ -onQueue('high'); - } - - public function handle() - { - try { - if (! $this->targetServer || $this->targetServer->id === $this->sourceServer->id) { - $this->cloneLocalVolume(); - } else { - $this->cloneRemoteVolume(); - } - } catch (\Exception $e) { - \Log::error("Failed to copy volume data for {$this->sourceVolume}: ".$e->getMessage()); - throw $e; - } - } - - protected function cloneLocalVolume() - { - instant_remote_process([ - "docker volume create $this->targetVolume", - "docker run --rm -v $this->sourceVolume:/source -v $this->targetVolume:/target alpine sh -c 'cp -a /source/. /target/ && chown -R 1000:1000 /target'", - ], $this->sourceServer); - } - - protected function cloneRemoteVolume() - { - $sourceCloneDir = "{$this->cloneDir}/{$this->sourceVolume}"; - $targetCloneDir = "{$this->cloneDir}/{$this->targetVolume}"; - - try { - instant_remote_process([ - "mkdir -p $sourceCloneDir", - "chmod 777 $sourceCloneDir", - "docker run --rm -v $this->sourceVolume:/source -v $sourceCloneDir:/clone alpine sh -c 'cd /source && tar czf /clone/volume-data.tar.gz .'", - ], $this->sourceServer); - - instant_remote_process([ - "mkdir -p $targetCloneDir", - "chmod 777 $targetCloneDir", - ], $this->targetServer); - - instant_scp( - "$sourceCloneDir/volume-data.tar.gz", - "$targetCloneDir/volume-data.tar.gz", - $this->sourceServer, - $this->targetServer - ); - - instant_remote_process([ - "docker volume create $this->targetVolume", - "docker run --rm -v $this->targetVolume:/target -v $targetCloneDir:/clone alpine sh -c 'cd /target && tar xzf /clone/volume-data.tar.gz && chown -R 1000:1000 /target'", - ], $this->targetServer); - - } catch (\Exception $e) { - \Log::error("Failed to clone volume {$this->sourceVolume} to {$this->targetVolume}: ".$e->getMessage()); - throw $e; - } finally { - try { - instant_remote_process([ - "rm -rf $sourceCloneDir", - ], $this->sourceServer, false); - } catch (\Exception $e) { - \Log::warning('Failed to clean up source server clone directory: '.$e->getMessage()); - } - - try { - if ($this->targetServer) { - instant_remote_process([ - "rm -rf $targetCloneDir", - ], $this->targetServer, false); - } - } catch (\Exception $e) { - \Log::warning('Failed to clean up target server clone directory: '.$e->getMessage()); - } - } - } -} diff --git a/app/Listeners/MaintenanceModeDisabledNotification.php b/app/Listeners/MaintenanceModeDisabledNotification.php deleted file mode 100644 index 6c3ab83d8f..0000000000 --- a/app/Listeners/MaintenanceModeDisabledNotification.php +++ /dev/null @@ -1,48 +0,0 @@ -files(); - $files = collect($files); - $files = $files->sort(); - foreach ($files as $file) { - $content = Storage::disk('webhooks-during-maintenance')->get($file); - $data = json_decode($content, true); - $symfonyRequest = new SymfonyRequest( - $data['query'], - $data['request'], - $data['attributes'], - $data['cookies'], - $data['files'], - $data['server'], - $data['content'] - ); - - foreach ($data['headers'] as $key => $value) { - $symfonyRequest->headers->set($key, $value); - } - $request = Request::createFromBase($symfonyRequest); - $endpoint = str($file)->after('_')->beforeLast('_')->value(); - $class = "App\Http\Controllers\Webhook\\".ucfirst(str($endpoint)->before('::')->value()); - $method = str($endpoint)->after('::')->value(); - try { - $instance = new $class; - $instance->$method($request); - } catch (\Throwable $th) { - } finally { - Storage::disk('webhooks-during-maintenance')->delete($file); - } - } - } -} diff --git a/app/Listeners/MaintenanceModeEnabledNotification.php b/app/Listeners/MaintenanceModeEnabledNotification.php deleted file mode 100644 index 5aab248ea8..0000000000 --- a/app/Listeners/MaintenanceModeEnabledNotification.php +++ /dev/null @@ -1,21 +0,0 @@ -server = data_get($event, 'data'); - $this->server->setupDefaultRedirect(); - $this->server->setupDynamicProxyConfiguration(); - $this->server->proxy->force_stop = false; - $this->server->save(); - } -} diff --git a/app/Livewire/ActivityMonitor.php b/app/Livewire/ActivityMonitor.php deleted file mode 100644 index 024f53c3d2..0000000000 --- a/app/Livewire/ActivityMonitor.php +++ /dev/null @@ -1,67 +0,0 @@ - 'newMonitorActivity']; - - public function newMonitorActivity($activityId, $eventToDispatch = 'activityFinished') - { - $this->activityId = $activityId; - $this->eventToDispatch = $eventToDispatch; - - $this->hydrateActivity(); - - $this->isPollingActive = true; - } - - public function hydrateActivity() - { - $this->activity = Activity::find($this->activityId); - } - - public function polling() - { - $this->hydrateActivity(); - $exit_code = data_get($this->activity, 'properties.exitCode'); - if ($exit_code !== null) { - $this->isPollingActive = false; - if ($exit_code === 0) { - if ($this->eventToDispatch !== null) { - if (str($this->eventToDispatch)->startsWith('App\\Events\\')) { - $causer_id = data_get($this->activity, 'causer_id'); - $user = User::find($causer_id); - if ($user) { - foreach ($user->teams as $team) { - $teamId = $team->id; - $this->eventToDispatch::dispatch($teamId); - } - } - - return; - } - $this->dispatch($this->eventToDispatch); - } - } - } - } -} diff --git a/app/Livewire/Admin/Index.php b/app/Livewire/Admin/Index.php deleted file mode 100644 index b5f6d29294..0000000000 --- a/app/Livewire/Admin/Index.php +++ /dev/null @@ -1,81 +0,0 @@ -route('dashboard'); - } - if (Auth::id() !== 0 && ! session('impersonating')) { - return redirect()->route('dashboard'); - } - $this->getSubscribers(); - } - - public function back() - { - if (session('impersonating')) { - session()->forget('impersonating'); - $user = User::find(0); - $team_to_switch_to = $user->teams->first(); - Auth::login($user); - refreshSession($team_to_switch_to); - - return redirect(request()->header('Referer')); - } - } - - public function submitSearch() - { - if ($this->search !== '') { - $this->foundUsers = User::where(function ($query) { - $query->where('name', 'like', "%{$this->search}%") - ->orWhere('email', 'like', "%{$this->search}%"); - })->get(); - } - } - - public function getSubscribers() - { - $this->inactiveSubscribers = Team::whereRelation('subscription', 'stripe_invoice_paid', false)->count(); - $this->activeSubscribers = Team::whereRelation('subscription', 'stripe_invoice_paid', true)->count(); - } - - public function switchUser(int $user_id) - { - if (Auth::id() !== 0) { - return redirect()->route('dashboard'); - } - session(['impersonating' => true]); - $user = User::find($user_id); - $team_to_switch_to = $user->teams->first(); - // Cache::forget("team:{$user->id}"); - Auth::login($user); - refreshSession($team_to_switch_to); - - return redirect(request()->header('Referer')); - } - - public function render() - { - return view('livewire.admin.index'); - } -} diff --git a/app/Livewire/Boarding/Index.php b/app/Livewire/Boarding/Index.php deleted file mode 100644 index 15eabfec57..0000000000 --- a/app/Livewire/Boarding/Index.php +++ /dev/null @@ -1,383 +0,0 @@ - 'validateServer']; - - public string $currentState = 'welcome'; - - public ?string $selectedServerType = null; - - public ?Collection $privateKeys = null; - - public ?int $selectedExistingPrivateKey = null; - - public ?string $privateKeyType = null; - - public ?string $privateKey = null; - - public ?string $publicKey = null; - - public ?string $privateKeyName = null; - - public ?string $privateKeyDescription = null; - - public ?PrivateKey $createdPrivateKey = null; - - public ?Collection $servers = null; - - public ?int $selectedExistingServer = null; - - public ?string $remoteServerName = null; - - public ?string $remoteServerDescription = null; - - public ?string $remoteServerHost = null; - - public ?int $remoteServerPort = 22; - - public ?string $remoteServerUser = 'root'; - - public bool $isSwarmManager = false; - - public bool $isCloudflareTunnel = false; - - public ?Server $createdServer = null; - - public Collection $projects; - - public ?int $selectedProject = null; - - public ?Project $createdProject = null; - - public bool $dockerInstallationStarted = false; - - public string $serverPublicKey; - - public bool $serverReachable = true; - - public ?string $minDockerVersion = null; - - public function mount() - { - if (auth()->user()?->isMember() && auth()->user()->currentTeam()->show_boarding === true) { - return redirect()->route('dashboard'); - } - - $this->minDockerVersion = str(config('constants.docker.minimum_required_version'))->before('.'); - $this->privateKeyName = generate_random_name(); - $this->remoteServerName = generate_random_name(); - if (isDev()) { - $this->privateKey = '-----BEGIN OPENSSH PRIVATE KEY----- -b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW -QyNTUxOQAAACBbhpqHhqv6aI67Mj9abM3DVbmcfYhZAhC7ca4d9UCevAAAAJi/QySHv0Mk -hwAAAAtzc2gtZWQyNTUxOQAAACBbhpqHhqv6aI67Mj9abM3DVbmcfYhZAhC7ca4d9UCevA -AAAECBQw4jg1WRT2IGHMncCiZhURCts2s24HoDS0thHnnRKVuGmoeGq/pojrsyP1pszcNV -uZx9iFkCELtxrh31QJ68AAAAEXNhaWxANzZmZjY2ZDJlMmRkAQIDBA== ------END OPENSSH PRIVATE KEY-----'; - $this->privateKeyDescription = 'Created by Coolify'; - $this->remoteServerDescription = 'Created by Coolify'; - $this->remoteServerHost = 'coolify-testing-host'; - } - } - - public function explanation() - { - if (isCloud()) { - return $this->setServerType('remote'); - } - $this->currentState = 'select-server-type'; - } - - public function restartBoarding() - { - return redirect()->route('onboarding'); - } - - public function skipBoarding() - { - Team::find(currentTeam()->id)->update([ - 'show_boarding' => false, - ]); - refreshSession(); - - return redirect()->route('dashboard'); - } - - public function setServerType(string $type) - { - $this->selectedServerType = $type; - if ($this->selectedServerType === 'localhost') { - $this->createdServer = Server::find(0); - $this->selectedExistingServer = 0; - if (! $this->createdServer) { - return $this->dispatch('error', 'Localhost server is not found. Something went wrong during installation. Please try to reinstall or contact support.'); - } - $this->serverPublicKey = $this->createdServer->privateKey->getPublicKey(); - - return $this->validateServer('localhost'); - } elseif ($this->selectedServerType === 'remote') { - if (isDev()) { - $this->privateKeys = PrivateKey::ownedByCurrentTeam(['name'])->get(); - } else { - $this->privateKeys = PrivateKey::ownedByCurrentTeam(['name'])->where('id', '!=', 0)->get(); - } - if ($this->privateKeys->count() > 0) { - $this->selectedExistingPrivateKey = $this->privateKeys->first()->id; - } - $this->servers = Server::ownedByCurrentTeam(['name'])->where('id', '!=', 0)->get(); - if ($this->servers->count() > 0) { - $this->selectedExistingServer = $this->servers->first()->id; - $this->updateServerDetails(); - $this->currentState = 'select-existing-server'; - - return; - } - $this->currentState = 'private-key'; - } - } - - public function selectExistingServer() - { - $this->createdServer = Server::find($this->selectedExistingServer); - if (! $this->createdServer) { - $this->dispatch('error', 'Server is not found.'); - $this->currentState = 'private-key'; - - return; - } - $this->selectedExistingPrivateKey = $this->createdServer->privateKey->id; - $this->serverPublicKey = $this->createdServer->privateKey->getPublicKey(); - $this->updateServerDetails(); - $this->currentState = 'validate-server'; - } - - private function updateServerDetails() - { - if ($this->createdServer) { - $this->remoteServerPort = $this->createdServer->port; - $this->remoteServerUser = $this->createdServer->user; - } - } - - public function getProxyType() - { - $this->selectProxy(ProxyTypes::TRAEFIK->value); - $this->getProjects(); - } - - public function selectExistingPrivateKey() - { - if (is_null($this->selectedExistingPrivateKey)) { - $this->restartBoarding(); - - return; - } - $this->createdPrivateKey = PrivateKey::where('team_id', currentTeam()->id)->where('id', $this->selectedExistingPrivateKey)->first(); - $this->privateKey = $this->createdPrivateKey->private_key; - $this->currentState = 'create-server'; - } - - public function createNewServer() - { - $this->selectedExistingServer = null; - $this->currentState = 'private-key'; - } - - public function setPrivateKey(string $type) - { - $this->selectedExistingPrivateKey = null; - $this->privateKeyType = $type; - if ($type === 'create') { - $this->createNewPrivateKey(); - } - $this->currentState = 'create-private-key'; - } - - public function savePrivateKey() - { - $this->validate([ - 'privateKeyName' => 'required|string|max:255', - 'privateKeyDescription' => 'nullable|string|max:255', - 'privateKey' => 'required|string', - ]); - - try { - $privateKey = PrivateKey::createAndStore([ - 'name' => $this->privateKeyName, - 'description' => $this->privateKeyDescription, - 'private_key' => $this->privateKey, - 'team_id' => currentTeam()->id, - ]); - - $this->createdPrivateKey = $privateKey; - $this->currentState = 'create-server'; - } catch (\Exception $e) { - $this->addError('privateKey', 'Failed to save private key: '.$e->getMessage()); - } - } - - public function saveServer() - { - $this->validate([ - 'remoteServerName' => 'required|string', - 'remoteServerHost' => 'required|string', - 'remoteServerPort' => 'required|integer', - 'remoteServerUser' => 'required|string', - ]); - - $this->privateKey = formatPrivateKey($this->privateKey); - $foundServer = Server::whereIp($this->remoteServerHost)->first(); - if ($foundServer) { - return $this->dispatch('error', 'IP address is already in use by another team.'); - } - $this->createdServer = Server::create([ - 'name' => $this->remoteServerName, - 'ip' => $this->remoteServerHost, - 'port' => $this->remoteServerPort, - 'user' => $this->remoteServerUser, - 'description' => $this->remoteServerDescription, - 'private_key_id' => $this->createdPrivateKey->id, - 'team_id' => currentTeam()->id, - ]); - $this->createdServer->settings->is_swarm_manager = $this->isSwarmManager; - $this->createdServer->settings->is_cloudflare_tunnel = $this->isCloudflareTunnel; - $this->createdServer->settings->save(); - $this->selectedExistingServer = $this->createdServer->id; - $this->currentState = 'validate-server'; - } - - public function installServer() - { - $this->dispatch('init', true); - } - - public function validateServer() - { - try { - config()->set('constants.ssh.mux_enabled', false); - - // EC2 does not have `uptime` command, lol - instant_remote_process(['ls /'], $this->createdServer, true); - - $this->createdServer->settings()->update([ - 'is_reachable' => true, - ]); - $this->serverReachable = true; - } catch (\Throwable $e) { - $this->serverReachable = false; - $this->createdServer->settings()->update([ - 'is_reachable' => false, - ]); - - return handleError(error: $e, livewire: $this); - } - - try { - $dockerVersion = instant_remote_process(["docker version|head -2|grep -i version| awk '{print $2}'"], $this->createdServer, true); - $dockerVersion = checkMinimumDockerEngineVersion($dockerVersion); - if (is_null($dockerVersion)) { - $this->currentState = 'validate-server'; - throw new \Exception('Docker not found or old version is installed.'); - } - $this->createdServer->settings()->update([ - 'is_usable' => true, - ]); - $this->getProxyType(); - } catch (\Throwable $e) { - $this->createdServer->settings()->update([ - 'is_usable' => false, - ]); - - return handleError(error: $e, livewire: $this); - } - } - - public function selectProxy(?string $proxyType = null) - { - if (! $proxyType) { - return $this->getProjects(); - } - $this->createdServer->proxy->type = $proxyType; - $this->createdServer->proxy->status = 'exited'; - $this->createdServer->save(); - $this->getProjects(); - } - - public function getProjects() - { - $this->projects = Project::ownedByCurrentTeam(['name'])->get(); - if ($this->projects->count() > 0) { - $this->selectedProject = $this->projects->first()->id; - } - $this->currentState = 'create-project'; - } - - public function selectExistingProject() - { - $this->createdProject = Project::find($this->selectedProject); - $this->currentState = 'create-resource'; - } - - public function createNewProject() - { - $this->createdProject = Project::create([ - 'name' => 'My first project', - 'team_id' => currentTeam()->id, - 'uuid' => (string) new Cuid2, - ]); - $this->currentState = 'create-resource'; - } - - public function showNewResource() - { - $this->skipBoarding(); - - return redirect()->route( - 'project.resource.create', - [ - 'project_uuid' => $this->createdProject->uuid, - 'environment_uuid' => $this->createdProject->environments->first()->uuid, - 'server' => $this->createdServer->id, - ] - ); - } - - public function saveAndValidateServer() - { - $this->validate([ - 'remoteServerPort' => 'required|integer|min:1|max:65535', - 'remoteServerUser' => 'required|string', - ]); - - $this->createdServer->update([ - 'port' => $this->remoteServerPort, - 'user' => $this->remoteServerUser, - 'timezone' => 'UTC', - ]); - $this->validateServer(); - } - - private function createNewPrivateKey() - { - $this->privateKeyName = generate_random_name(); - $this->privateKeyDescription = 'Created by Coolify'; - ['private' => $this->privateKey, 'public' => $this->publicKey] = generateSSHKey(); - } - - public function render() - { - return view('livewire.boarding.index')->layout('layouts.boarding'); - } -} diff --git a/app/Livewire/Dashboard.php b/app/Livewire/Dashboard.php deleted file mode 100644 index d89f2b970f..0000000000 --- a/app/Livewire/Dashboard.php +++ /dev/null @@ -1,61 +0,0 @@ -privateKeys = PrivateKey::ownedByCurrentTeam()->get(); - $this->servers = Server::ownedByCurrentTeam()->get(); - $this->projects = Project::ownedByCurrentTeam()->get(); - $this->loadDeployments(); - } - - public function cleanupQueue() - { - Artisan::queue('cleanup:deployment-queue', [ - '--team-id' => currentTeam()->id, - ]); - } - - public function loadDeployments() - { - $this->deploymentsPerServer = ApplicationDeploymentQueue::whereIn('status', ['in_progress', 'queued'])->whereIn('server_id', $this->servers->pluck('id'))->get([ - 'id', - 'application_id', - 'application_name', - 'deployment_url', - 'pull_request_id', - 'server_name', - 'server_id', - 'status', - ])->sortBy('id')->groupBy('server_name')->toArray(); - } - - public function navigateToProject($projectUuid) - { - return $this->redirect(collect($this->projects)->firstWhere('uuid', $projectUuid)->navigateTo(), true); - } - - public function render() - { - return view('livewire.dashboard'); - } -} diff --git a/app/Livewire/Destination/Index.php b/app/Livewire/Destination/Index.php deleted file mode 100644 index a3df3fd562..0000000000 --- a/app/Livewire/Destination/Index.php +++ /dev/null @@ -1,23 +0,0 @@ -servers = Server::isUsable()->get(); - } - - public function render() - { - return view('livewire.destination.index'); - } -} diff --git a/app/Livewire/Destination/New/Docker.php b/app/Livewire/Destination/New/Docker.php deleted file mode 100644 index eb768d1916..0000000000 --- a/app/Livewire/Destination/New/Docker.php +++ /dev/null @@ -1,99 +0,0 @@ -network = new Cuid2; - $this->servers = Server::isUsable()->get(); - if ($server_id) { - $foundServer = $this->servers->find($server_id) ?: $this->servers->first(); - if (! $foundServer) { - throw new \Exception('Server not found.'); - } - $this->selectedServer = $foundServer; - $this->serverId = $this->selectedServer->id; - } else { - $foundServer = $this->servers->first(); - if (! $foundServer) { - throw new \Exception('Server not found.'); - } - $this->selectedServer = $foundServer; - $this->serverId = $this->selectedServer->id; - } - $this->generateName(); - } - - public function updatedServerId() - { - $this->selectedServer = $this->servers->find($this->serverId); - $this->generateName(); - } - - public function generateName() - { - $name = data_get($this->selectedServer, 'name', new Cuid2); - $this->name = str("{$name}-{$this->network}")->kebab(); - } - - public function submit() - { - try { - $this->validate(); - if ($this->isSwarm) { - $found = $this->selectedServer->swarmDockers()->where('network', $this->network)->first(); - if ($found) { - throw new \Exception('Network already added to this server.'); - } else { - $docker = SwarmDocker::create([ - 'name' => $this->name, - 'network' => $this->network, - 'server_id' => $this->selectedServer->id, - ]); - } - } else { - $found = $this->selectedServer->standaloneDockers()->where('network', $this->network)->first(); - if ($found) { - throw new \Exception('Network already added to this server.'); - } else { - $docker = StandaloneDocker::create([ - 'name' => $this->name, - 'network' => $this->network, - 'server_id' => $this->selectedServer->id, - ]); - } - } - $this->redirect(route('destination.show', $docker->uuid)); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Destination/Show.php b/app/Livewire/Destination/Show.php deleted file mode 100644 index 5c4d6c1701..0000000000 --- a/app/Livewire/Destination/Show.php +++ /dev/null @@ -1,95 +0,0 @@ -first() ?? - SwarmDocker::whereUuid($destination_uuid)->firstOrFail(); - - $ownedByTeam = Server::ownedByCurrentTeam()->each(function ($server) use ($destination) { - if ($server->standaloneDockers->contains($destination) || $server->swarmDockers->contains($destination)) { - $this->destination = $destination; - $this->syncData(); - } - }); - if ($ownedByTeam === false) { - return redirect()->route('destination.index'); - } - $this->destination = $destination; - $this->syncData(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $this->destination->name = $this->name; - $this->destination->network = $this->network; - $this->destination->server->ip = $this->serverIp; - $this->destination->save(); - } else { - $this->name = $this->destination->name; - $this->network = $this->destination->network; - $this->serverIp = $this->destination->server->ip; - } - } - - public function submit() - { - try { - $this->syncData(true); - $this->dispatch('success', 'Destination saved.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function delete() - { - try { - if ($this->destination->getMorphClass() === \App\Models\StandaloneDocker::class) { - if ($this->destination->attachedTo()) { - return $this->dispatch('error', 'You must delete all resources before deleting this destination.'); - } - instant_remote_process(["docker network disconnect {$this->destination->network} coolify-proxy"], $this->destination->server, throwError: false); - instant_remote_process(['docker network rm -f '.$this->destination->network], $this->destination->server); - } - $this->destination->delete(); - - return redirect()->route('destination.index'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.destination.show'); - } -} diff --git a/app/Livewire/ForcePasswordReset.php b/app/Livewire/ForcePasswordReset.php deleted file mode 100644 index 61a2a20e95..0000000000 --- a/app/Livewire/ForcePasswordReset.php +++ /dev/null @@ -1,64 +0,0 @@ - ['required', 'email'], - 'password' => ['required', Password::defaults(), 'confirmed'], - ]; - } - - public function mount() - { - if (auth()->user()->force_password_reset === false) { - return redirect()->route('dashboard'); - } - $this->email = auth()->user()->email; - } - - public function render() - { - return view('livewire.force-password-reset')->layout('layouts.simple'); - } - - public function submit() - { - if (auth()->user()->force_password_reset === false) { - return redirect()->route('dashboard'); - } - - try { - $this->rateLimit(10); - $this->validate(); - $firstLogin = auth()->user()->created_at == auth()->user()->updated_at; - auth()->user()->forceFill([ - 'password' => Hash::make($this->password), - 'force_password_reset' => false, - ])->save(); - if ($firstLogin) { - send_internal_notification('First login for '.auth()->user()->email); - } - - return redirect()->route('dashboard'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Help.php b/app/Livewire/Help.php deleted file mode 100644 index 9137105885..0000000000 --- a/app/Livewire/Help.php +++ /dev/null @@ -1,58 +0,0 @@ -validate(); - $this->rateLimit(3, 30); - - $settings = instanceSettings(); - $mail = new MailMessage; - $mail->view( - 'emails.help', - [ - 'description' => $this->description, - ] - ); - $mail->subject("[HELP]: {$this->subject}"); - $type = set_transanctional_email_settings($settings); - - // Sending feedback through Cloud API - if (blank($type)) { - $url = 'https://app.coolify.io/api/feedback'; - Http::post($url, [ - 'content' => 'User: `'.auth()->user()?->email.'` with subject: `'.$this->subject.'` has the following problem: `'.$this->description.'`', - ]); - } else { - send_user_an_email($mail, auth()->user()?->email, 'hi@coollabs.io'); - } - $this->dispatch('success', 'Feedback sent.', 'We will get in touch with you as soon as possible.'); - $this->reset('description', 'subject'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.help')->layout('layouts.app'); - } -} diff --git a/app/Livewire/LayoutPopups.php b/app/Livewire/LayoutPopups.php deleted file mode 100644 index f2ba788938..0000000000 --- a/app/Livewire/LayoutPopups.php +++ /dev/null @@ -1,27 +0,0 @@ -user()->currentTeam()->id; - - return [ - "echo-private:team.{$teamId},TestEvent" => 'testEvent', - ]; - } - - public function testEvent() - { - $this->dispatch('success', 'Realtime events configured!'); - } - - public function render() - { - return view('livewire.layout-popups'); - } -} diff --git a/app/Livewire/MonacoEditor.php b/app/Livewire/MonacoEditor.php deleted file mode 100644 index 53ca1d3866..0000000000 --- a/app/Livewire/MonacoEditor.php +++ /dev/null @@ -1,51 +0,0 @@ - '$refresh', - ]; - - public function __construct( - public ?string $id, - public ?string $name, - public ?string $type, - public ?string $monacoContent, - public ?string $value, - public ?string $label, - public ?string $placeholder, - public bool $required, - public bool $disabled, - public bool $readonly, - public bool $allowTab, - public bool $spellcheck, - public ?string $helper, - public bool $realtimeValidation, - public bool $allowToPeak, - public string $defaultClass, - public string $defaultClassInput, - public ?string $language - - ) { - // - } - - public function render() - { - if (is_null($this->id)) { - $this->id = new Cuid2; - } - - if (is_null($this->name)) { - $this->name = $this->id; - } - - return view('components.forms.monaco-editor'); - } -} diff --git a/app/Livewire/NavbarDeleteTeam.php b/app/Livewire/NavbarDeleteTeam.php deleted file mode 100644 index e97cceb0da..0000000000 --- a/app/Livewire/NavbarDeleteTeam.php +++ /dev/null @@ -1,53 +0,0 @@ -team = currentTeam()->name; - } - - public function delete($password) - { - if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) { - if (! Hash::check($password, Auth::user()->password)) { - $this->addError('password', 'The provided password is incorrect.'); - - return; - } - } - - $currentTeam = currentTeam(); - $currentTeam->delete(); - - $currentTeam->members->each(function ($user) use ($currentTeam) { - if ($user->id === Auth::id()) { - return; - } - $user->teams()->detach($currentTeam); - $session = DB::table('sessions')->where('user_id', $user->id)->first(); - if ($session) { - DB::table('sessions')->where('id', $session->id)->delete(); - } - }); - - refreshSession(); - - return redirect()->route('team.index'); - } - - public function render() - { - return view('livewire.navbar-delete-team'); - } -} diff --git a/app/Livewire/NewActivityMonitor.php b/app/Livewire/NewActivityMonitor.php deleted file mode 100644 index a9334e7108..0000000000 --- a/app/Livewire/NewActivityMonitor.php +++ /dev/null @@ -1,74 +0,0 @@ - 'newMonitorActivity']; - - public function newMonitorActivity($activityId, $eventToDispatch = 'activityFinished', $eventData = null) - { - $this->activityId = $activityId; - $this->eventToDispatch = $eventToDispatch; - $this->eventData = $eventData; - - $this->hydrateActivity(); - - $this->isPollingActive = true; - } - - public function hydrateActivity() - { - $this->activity = Activity::find($this->activityId); - } - - public function polling() - { - $this->hydrateActivity(); - // $this->setStatus(ProcessStatus::IN_PROGRESS); - $exit_code = data_get($this->activity, 'properties.exitCode'); - if ($exit_code !== null) { - // if ($exit_code === 0) { - // // $this->setStatus(ProcessStatus::FINISHED); - // } else { - // // $this->setStatus(ProcessStatus::ERROR); - // } - $this->isPollingActive = false; - if ($this->eventToDispatch !== null) { - if (str($this->eventToDispatch)->startsWith('App\\Events\\')) { - $causer_id = data_get($this->activity, 'causer_id'); - $user = User::find($causer_id); - if ($user) { - foreach ($user->teams as $team) { - $teamId = $team->id; - $this->eventToDispatch::dispatch($teamId); - } - } - - return; - } - if (! is_null($this->eventData)) { - $this->dispatch($this->eventToDispatch, $this->eventData); - } else { - $this->dispatch($this->eventToDispatch); - } - } - } - } -} diff --git a/app/Livewire/Notifications/Discord.php b/app/Livewire/Notifications/Discord.php deleted file mode 100644 index 57007813ee..0000000000 --- a/app/Livewire/Notifications/Discord.php +++ /dev/null @@ -1,168 +0,0 @@ -team = auth()->user()->currentTeam(); - $this->settings = $this->team->discordNotificationSettings; - $this->syncData(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $this->settings->discord_enabled = $this->discordEnabled; - $this->settings->discord_webhook_url = $this->discordWebhookUrl; - - $this->settings->deployment_success_discord_notifications = $this->deploymentSuccessDiscordNotifications; - $this->settings->deployment_failure_discord_notifications = $this->deploymentFailureDiscordNotifications; - $this->settings->status_change_discord_notifications = $this->statusChangeDiscordNotifications; - $this->settings->backup_success_discord_notifications = $this->backupSuccessDiscordNotifications; - $this->settings->backup_failure_discord_notifications = $this->backupFailureDiscordNotifications; - $this->settings->scheduled_task_success_discord_notifications = $this->scheduledTaskSuccessDiscordNotifications; - $this->settings->scheduled_task_failure_discord_notifications = $this->scheduledTaskFailureDiscordNotifications; - $this->settings->docker_cleanup_success_discord_notifications = $this->dockerCleanupSuccessDiscordNotifications; - $this->settings->docker_cleanup_failure_discord_notifications = $this->dockerCleanupFailureDiscordNotifications; - $this->settings->server_disk_usage_discord_notifications = $this->serverDiskUsageDiscordNotifications; - $this->settings->server_reachable_discord_notifications = $this->serverReachableDiscordNotifications; - $this->settings->server_unreachable_discord_notifications = $this->serverUnreachableDiscordNotifications; - - $this->settings->save(); - refreshSession(); - } else { - $this->discordEnabled = $this->settings->discord_enabled; - $this->discordWebhookUrl = $this->settings->discord_webhook_url; - - $this->deploymentSuccessDiscordNotifications = $this->settings->deployment_success_discord_notifications; - $this->deploymentFailureDiscordNotifications = $this->settings->deployment_failure_discord_notifications; - $this->statusChangeDiscordNotifications = $this->settings->status_change_discord_notifications; - $this->backupSuccessDiscordNotifications = $this->settings->backup_success_discord_notifications; - $this->backupFailureDiscordNotifications = $this->settings->backup_failure_discord_notifications; - $this->scheduledTaskSuccessDiscordNotifications = $this->settings->scheduled_task_success_discord_notifications; - $this->scheduledTaskFailureDiscordNotifications = $this->settings->scheduled_task_failure_discord_notifications; - $this->dockerCleanupSuccessDiscordNotifications = $this->settings->docker_cleanup_success_discord_notifications; - $this->dockerCleanupFailureDiscordNotifications = $this->settings->docker_cleanup_failure_discord_notifications; - $this->serverDiskUsageDiscordNotifications = $this->settings->server_disk_usage_discord_notifications; - $this->serverReachableDiscordNotifications = $this->settings->server_reachable_discord_notifications; - $this->serverUnreachableDiscordNotifications = $this->settings->server_unreachable_discord_notifications; - } - } - - public function instantSaveDiscordEnabled() - { - try { - $this->validate([ - 'discordWebhookUrl' => 'required', - ], [ - 'discordWebhookUrl.required' => 'Discord Webhook URL is required.', - ]); - $this->saveModel(); - } catch (\Throwable $e) { - $this->discordEnabled = false; - - return handleError($e, $this); - } - } - - public function instantSave() - { - try { - $this->syncData(true); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function submit() - { - try { - $this->resetErrorBag(); - $this->syncData(true); - $this->saveModel(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function saveModel() - { - $this->syncData(true); - refreshSession(); - $this->dispatch('success', 'Settings saved.'); - } - - public function sendTestNotification() - { - try { - $this->team->notify(new Test(channel: 'discord')); - $this->dispatch('success', 'Test notification sent.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.notifications.discord'); - } -} diff --git a/app/Livewire/Notifications/Email.php b/app/Livewire/Notifications/Email.php deleted file mode 100644 index 3ed20f907c..0000000000 --- a/app/Livewire/Notifications/Email.php +++ /dev/null @@ -1,372 +0,0 @@ - '$refresh']; - - #[Locked] - public Team $team; - - #[Locked] - public EmailNotificationSettings $settings; - - #[Locked] - public string $emails; - - #[Validate(['boolean'])] - public bool $smtpEnabled = false; - - #[Validate(['nullable', 'email'])] - public ?string $smtpFromAddress = null; - - #[Validate(['nullable', 'string'])] - public ?string $smtpFromName = null; - - #[Validate(['nullable', 'string'])] - public ?string $smtpRecipients = null; - - #[Validate(['nullable', 'string'])] - public ?string $smtpHost = null; - - #[Validate(['nullable', 'numeric', 'min:1', 'max:65535'])] - public ?int $smtpPort = null; - - #[Validate(['nullable', 'string', 'in:starttls,tls,none'])] - public ?string $smtpEncryption = null; - - #[Validate(['nullable', 'string'])] - public ?string $smtpUsername = null; - - #[Validate(['nullable', 'string'])] - public ?string $smtpPassword = null; - - #[Validate(['nullable', 'numeric'])] - public ?int $smtpTimeout = null; - - #[Validate(['boolean'])] - public bool $resendEnabled = false; - - #[Validate(['nullable', 'string'])] - public ?string $resendApiKey = null; - - #[Validate(['boolean'])] - public bool $useInstanceEmailSettings = false; - - #[Validate(['boolean'])] - public bool $deploymentSuccessEmailNotifications = false; - - #[Validate(['boolean'])] - public bool $deploymentFailureEmailNotifications = true; - - #[Validate(['boolean'])] - public bool $statusChangeEmailNotifications = false; - - #[Validate(['boolean'])] - public bool $backupSuccessEmailNotifications = false; - - #[Validate(['boolean'])] - public bool $backupFailureEmailNotifications = true; - - #[Validate(['boolean'])] - public bool $scheduledTaskSuccessEmailNotifications = false; - - #[Validate(['boolean'])] - public bool $scheduledTaskFailureEmailNotifications = true; - - #[Validate(['boolean'])] - public bool $dockerCleanupSuccessEmailNotifications = false; - - #[Validate(['boolean'])] - public bool $dockerCleanupFailureEmailNotifications = true; - - #[Validate(['boolean'])] - public bool $serverDiskUsageEmailNotifications = true; - - #[Validate(['boolean'])] - public bool $serverReachableEmailNotifications = false; - - #[Validate(['boolean'])] - public bool $serverUnreachableEmailNotifications = true; - - #[Validate(['nullable', 'email'])] - public ?string $testEmailAddress = null; - - public function mount() - { - try { - $this->team = auth()->user()->currentTeam(); - $this->emails = auth()->user()->email; - $this->settings = $this->team->emailNotificationSettings; - $this->syncData(); - $this->testEmailAddress = auth()->user()->email; - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $this->settings->smtp_enabled = $this->smtpEnabled; - $this->settings->smtp_from_address = $this->smtpFromAddress; - $this->settings->smtp_from_name = $this->smtpFromName; - $this->settings->smtp_recipients = $this->smtpRecipients; - $this->settings->smtp_host = $this->smtpHost; - $this->settings->smtp_port = $this->smtpPort; - $this->settings->smtp_encryption = $this->smtpEncryption; - $this->settings->smtp_username = $this->smtpUsername; - $this->settings->smtp_password = $this->smtpPassword; - $this->settings->smtp_timeout = $this->smtpTimeout; - - $this->settings->resend_enabled = $this->resendEnabled; - $this->settings->resend_api_key = $this->resendApiKey; - - $this->settings->use_instance_email_settings = $this->useInstanceEmailSettings; - - $this->settings->deployment_success_email_notifications = $this->deploymentSuccessEmailNotifications; - $this->settings->deployment_failure_email_notifications = $this->deploymentFailureEmailNotifications; - $this->settings->status_change_email_notifications = $this->statusChangeEmailNotifications; - $this->settings->backup_success_email_notifications = $this->backupSuccessEmailNotifications; - $this->settings->backup_failure_email_notifications = $this->backupFailureEmailNotifications; - $this->settings->scheduled_task_success_email_notifications = $this->scheduledTaskSuccessEmailNotifications; - $this->settings->scheduled_task_failure_email_notifications = $this->scheduledTaskFailureEmailNotifications; - $this->settings->docker_cleanup_success_email_notifications = $this->dockerCleanupSuccessEmailNotifications; - $this->settings->docker_cleanup_failure_email_notifications = $this->dockerCleanupFailureEmailNotifications; - $this->settings->server_disk_usage_email_notifications = $this->serverDiskUsageEmailNotifications; - $this->settings->server_reachable_email_notifications = $this->serverReachableEmailNotifications; - $this->settings->server_unreachable_email_notifications = $this->serverUnreachableEmailNotifications; - $this->settings->save(); - - } else { - $this->smtpEnabled = $this->settings->smtp_enabled; - $this->smtpFromAddress = $this->settings->smtp_from_address; - $this->smtpFromName = $this->settings->smtp_from_name; - $this->smtpRecipients = $this->settings->smtp_recipients; - $this->smtpHost = $this->settings->smtp_host; - $this->smtpPort = $this->settings->smtp_port; - $this->smtpEncryption = $this->settings->smtp_encryption; - $this->smtpUsername = $this->settings->smtp_username; - $this->smtpPassword = $this->settings->smtp_password; - $this->smtpTimeout = $this->settings->smtp_timeout; - - $this->resendEnabled = $this->settings->resend_enabled; - $this->resendApiKey = $this->settings->resend_api_key; - - $this->useInstanceEmailSettings = $this->settings->use_instance_email_settings; - - $this->deploymentSuccessEmailNotifications = $this->settings->deployment_success_email_notifications; - $this->deploymentFailureEmailNotifications = $this->settings->deployment_failure_email_notifications; - $this->statusChangeEmailNotifications = $this->settings->status_change_email_notifications; - $this->backupSuccessEmailNotifications = $this->settings->backup_success_email_notifications; - $this->backupFailureEmailNotifications = $this->settings->backup_failure_email_notifications; - $this->scheduledTaskSuccessEmailNotifications = $this->settings->scheduled_task_success_email_notifications; - $this->scheduledTaskFailureEmailNotifications = $this->settings->scheduled_task_failure_email_notifications; - $this->dockerCleanupSuccessEmailNotifications = $this->settings->docker_cleanup_success_email_notifications; - $this->dockerCleanupFailureEmailNotifications = $this->settings->docker_cleanup_failure_email_notifications; - $this->serverDiskUsageEmailNotifications = $this->settings->server_disk_usage_email_notifications; - $this->serverReachableEmailNotifications = $this->settings->server_reachable_email_notifications; - $this->serverUnreachableEmailNotifications = $this->settings->server_unreachable_email_notifications; - } - } - - public function submit() - { - try { - $this->resetErrorBag(); - $this->saveModel(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function saveModel() - { - $this->syncData(true); - $this->dispatch('success', 'Email notifications settings updated.'); - } - - public function instantSave(?string $type = null) - { - try { - $this->resetErrorBag(); - - if ($type === 'SMTP') { - $this->submitSmtp(); - } elseif ($type === 'Resend') { - $this->submitResend(); - } else { - $this->smtpEnabled = false; - $this->resendEnabled = false; - $this->saveModel(); - - return; - } - } catch (\Throwable $e) { - if ($type === 'SMTP') { - $this->smtpEnabled = false; - } elseif ($type === 'Resend') { - $this->resendEnabled = false; - } - - return handleError($e, $this); - } finally { - $this->dispatch('refresh'); - } - } - - public function submitSmtp() - { - try { - $this->resetErrorBag(); - $this->validate([ - 'smtpEnabled' => 'boolean', - 'smtpFromAddress' => 'required|email', - 'smtpFromName' => 'required|string', - 'smtpHost' => 'required|string', - 'smtpPort' => 'required|numeric', - 'smtpEncryption' => 'required|string|in:starttls,tls,none', - 'smtpUsername' => 'nullable|string', - 'smtpPassword' => 'nullable|string', - 'smtpTimeout' => 'nullable|numeric', - ], [ - 'smtpFromAddress.required' => 'From Address is required.', - 'smtpFromAddress.email' => 'Please enter a valid email address.', - 'smtpFromName.required' => 'From Name is required.', - 'smtpHost.required' => 'SMTP Host is required.', - 'smtpPort.required' => 'SMTP Port is required.', - 'smtpPort.numeric' => 'SMTP Port must be a number.', - 'smtpEncryption.required' => 'Encryption type is required.', - ]); - - $this->settings->resend_enabled = false; - $this->settings->use_instance_email_settings = false; - $this->resendEnabled = false; - $this->useInstanceEmailSettings = false; - - $this->settings->smtp_enabled = $this->smtpEnabled; - $this->settings->smtp_from_address = $this->smtpFromAddress; - $this->settings->smtp_from_name = $this->smtpFromName; - $this->settings->smtp_host = $this->smtpHost; - $this->settings->smtp_port = $this->smtpPort; - $this->settings->smtp_encryption = $this->smtpEncryption; - $this->settings->smtp_username = $this->smtpUsername; - $this->settings->smtp_password = $this->smtpPassword; - $this->settings->smtp_timeout = $this->smtpTimeout; - - $this->settings->save(); - $this->dispatch('success', 'SMTP settings updated.'); - } catch (\Throwable $e) { - $this->smtpEnabled = false; - - return handleError($e); - } - } - - public function submitResend() - { - try { - $this->resetErrorBag(); - $this->validate([ - 'resendEnabled' => 'boolean', - 'resendApiKey' => 'required|string', - 'smtpFromAddress' => 'required|email', - 'smtpFromName' => 'required|string', - ], [ - 'resendApiKey.required' => 'Resend API Key is required.', - 'smtpFromAddress.required' => 'From Address is required.', - 'smtpFromAddress.email' => 'Please enter a valid email address.', - 'smtpFromName.required' => 'From Name is required.', - ]); - - $this->settings->smtp_enabled = false; - $this->settings->use_instance_email_settings = false; - $this->smtpEnabled = false; - $this->useInstanceEmailSettings = false; - - $this->settings->resend_enabled = $this->resendEnabled; - $this->settings->resend_api_key = $this->resendApiKey; - $this->settings->smtp_from_address = $this->smtpFromAddress; - $this->settings->smtp_from_name = $this->smtpFromName; - - $this->settings->save(); - $this->dispatch('success', 'Resend settings updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function sendTestEmail() - { - try { - $this->validate([ - 'testEmailAddress' => 'required|email', - ], [ - 'testEmailAddress.required' => 'Test email address is required.', - 'testEmailAddress.email' => 'Please enter a valid email address.', - ]); - - $executed = RateLimiter::attempt( - 'test-email:'.$this->team->id, - $perMinute = 0, - function () { - $this->team?->notify(new Test($this->testEmailAddress, 'email')); - $this->dispatch('success', 'Test Email sent.'); - }, - $decaySeconds = 10, - ); - - if (! $executed) { - throw new \Exception('Too many messages sent!'); - } - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function copyFromInstanceSettings() - { - $settings = instanceSettings(); - - if ($settings->smtp_enabled) { - $this->smtpEnabled = true; - $this->smtpFromAddress = $settings->smtp_from_address; - $this->smtpFromName = $settings->smtp_from_name; - $this->smtpRecipients = $settings->smtp_recipients; - $this->smtpHost = $settings->smtp_host; - $this->smtpPort = $settings->smtp_port; - $this->smtpEncryption = $settings->smtp_encryption; - $this->smtpUsername = $settings->smtp_username; - $this->smtpPassword = $settings->smtp_password; - $this->smtpTimeout = $settings->smtp_timeout; - $this->resendEnabled = false; - $this->saveModel(); - - return; - } - if ($settings->resend_enabled) { - $this->resendEnabled = true; - $this->resendApiKey = $settings->resend_api_key; - $this->smtpEnabled = false; - $this->saveModel(); - - return; - } - $this->dispatch('error', 'Instance SMTP/Resend settings are not enabled.'); - } - - public function render() - { - return view('livewire.notifications.email'); - } -} diff --git a/app/Livewire/Notifications/Pushover.php b/app/Livewire/Notifications/Pushover.php deleted file mode 100644 index f1e4c464da..0000000000 --- a/app/Livewire/Notifications/Pushover.php +++ /dev/null @@ -1,184 +0,0 @@ - '$refresh']; - - #[Locked] - public Team $team; - - #[Locked] - public PushoverNotificationSettings $settings; - - #[Validate(['boolean'])] - public bool $pushoverEnabled = false; - - #[Validate(['nullable', 'string'])] - public ?string $pushoverUserKey = null; - - #[Validate(['nullable', 'string'])] - public ?string $pushoverApiToken = null; - - #[Validate(['boolean'])] - public bool $deploymentSuccessPushoverNotifications = false; - - #[Validate(['boolean'])] - public bool $deploymentFailurePushoverNotifications = true; - - #[Validate(['boolean'])] - public bool $statusChangePushoverNotifications = false; - - #[Validate(['boolean'])] - public bool $backupSuccessPushoverNotifications = false; - - #[Validate(['boolean'])] - public bool $backupFailurePushoverNotifications = true; - - #[Validate(['boolean'])] - public bool $scheduledTaskSuccessPushoverNotifications = false; - - #[Validate(['boolean'])] - public bool $scheduledTaskFailurePushoverNotifications = true; - - #[Validate(['boolean'])] - public bool $dockerCleanupSuccessPushoverNotifications = false; - - #[Validate(['boolean'])] - public bool $dockerCleanupFailurePushoverNotifications = true; - - #[Validate(['boolean'])] - public bool $serverDiskUsagePushoverNotifications = true; - - #[Validate(['boolean'])] - public bool $serverReachablePushoverNotifications = false; - - #[Validate(['boolean'])] - public bool $serverUnreachablePushoverNotifications = true; - - public function mount() - { - try { - $this->team = auth()->user()->currentTeam(); - $this->settings = $this->team->pushoverNotificationSettings; - $this->syncData(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $this->settings->pushover_enabled = $this->pushoverEnabled; - $this->settings->pushover_user_key = $this->pushoverUserKey; - $this->settings->pushover_api_token = $this->pushoverApiToken; - - $this->settings->deployment_success_pushover_notifications = $this->deploymentSuccessPushoverNotifications; - $this->settings->deployment_failure_pushover_notifications = $this->deploymentFailurePushoverNotifications; - $this->settings->status_change_pushover_notifications = $this->statusChangePushoverNotifications; - $this->settings->backup_success_pushover_notifications = $this->backupSuccessPushoverNotifications; - $this->settings->backup_failure_pushover_notifications = $this->backupFailurePushoverNotifications; - $this->settings->scheduled_task_success_pushover_notifications = $this->scheduledTaskSuccessPushoverNotifications; - $this->settings->scheduled_task_failure_pushover_notifications = $this->scheduledTaskFailurePushoverNotifications; - $this->settings->docker_cleanup_success_pushover_notifications = $this->dockerCleanupSuccessPushoverNotifications; - $this->settings->docker_cleanup_failure_pushover_notifications = $this->dockerCleanupFailurePushoverNotifications; - $this->settings->server_disk_usage_pushover_notifications = $this->serverDiskUsagePushoverNotifications; - $this->settings->server_reachable_pushover_notifications = $this->serverReachablePushoverNotifications; - $this->settings->server_unreachable_pushover_notifications = $this->serverUnreachablePushoverNotifications; - - $this->settings->save(); - refreshSession(); - } else { - $this->pushoverEnabled = $this->settings->pushover_enabled; - $this->pushoverUserKey = $this->settings->pushover_user_key; - $this->pushoverApiToken = $this->settings->pushover_api_token; - - $this->deploymentSuccessPushoverNotifications = $this->settings->deployment_success_pushover_notifications; - $this->deploymentFailurePushoverNotifications = $this->settings->deployment_failure_pushover_notifications; - $this->statusChangePushoverNotifications = $this->settings->status_change_pushover_notifications; - $this->backupSuccessPushoverNotifications = $this->settings->backup_success_pushover_notifications; - $this->backupFailurePushoverNotifications = $this->settings->backup_failure_pushover_notifications; - $this->scheduledTaskSuccessPushoverNotifications = $this->settings->scheduled_task_success_pushover_notifications; - $this->scheduledTaskFailurePushoverNotifications = $this->settings->scheduled_task_failure_pushover_notifications; - $this->dockerCleanupSuccessPushoverNotifications = $this->settings->docker_cleanup_success_pushover_notifications; - $this->dockerCleanupFailurePushoverNotifications = $this->settings->docker_cleanup_failure_pushover_notifications; - $this->serverDiskUsagePushoverNotifications = $this->settings->server_disk_usage_pushover_notifications; - $this->serverReachablePushoverNotifications = $this->settings->server_reachable_pushover_notifications; - $this->serverUnreachablePushoverNotifications = $this->settings->server_unreachable_pushover_notifications; - } - } - - public function instantSavePushoverEnabled() - { - try { - $this->validate([ - 'pushoverUserKey' => 'required', - 'pushoverApiToken' => 'required', - ], [ - 'pushoverUserKey.required' => 'Pushover User Key is required.', - 'pushoverApiToken.required' => 'Pushover API Token is required.', - ]); - $this->saveModel(); - } catch (\Throwable $e) { - $this->pushoverEnabled = false; - - return handleError($e, $this); - } finally { - $this->dispatch('refresh'); - } - } - - public function instantSave() - { - try { - $this->syncData(true); - } catch (\Throwable $e) { - return handleError($e, $this); - } finally { - $this->dispatch('refresh'); - } - } - - public function submit() - { - try { - $this->resetErrorBag(); - $this->syncData(true); - $this->saveModel(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function saveModel() - { - $this->syncData(true); - refreshSession(); - $this->dispatch('success', 'Settings saved.'); - } - - public function sendTestNotification() - { - try { - $this->team->notify(new Test(channel: 'pushover')); - $this->dispatch('success', 'Test notification sent.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.notifications.pushover'); - } -} diff --git a/app/Livewire/Notifications/Slack.php b/app/Livewire/Notifications/Slack.php deleted file mode 100644 index f47ad8a979..0000000000 --- a/app/Livewire/Notifications/Slack.php +++ /dev/null @@ -1,177 +0,0 @@ - '$refresh']; - - #[Locked] - public Team $team; - - #[Locked] - public SlackNotificationSettings $settings; - - #[Validate(['boolean'])] - public bool $slackEnabled = false; - - #[Validate(['url', 'nullable'])] - public ?string $slackWebhookUrl = null; - - #[Validate(['boolean'])] - public bool $deploymentSuccessSlackNotifications = false; - - #[Validate(['boolean'])] - public bool $deploymentFailureSlackNotifications = true; - - #[Validate(['boolean'])] - public bool $statusChangeSlackNotifications = false; - - #[Validate(['boolean'])] - public bool $backupSuccessSlackNotifications = false; - - #[Validate(['boolean'])] - public bool $backupFailureSlackNotifications = true; - - #[Validate(['boolean'])] - public bool $scheduledTaskSuccessSlackNotifications = false; - - #[Validate(['boolean'])] - public bool $scheduledTaskFailureSlackNotifications = true; - - #[Validate(['boolean'])] - public bool $dockerCleanupSuccessSlackNotifications = false; - - #[Validate(['boolean'])] - public bool $dockerCleanupFailureSlackNotifications = true; - - #[Validate(['boolean'])] - public bool $serverDiskUsageSlackNotifications = true; - - #[Validate(['boolean'])] - public bool $serverReachableSlackNotifications = false; - - #[Validate(['boolean'])] - public bool $serverUnreachableSlackNotifications = true; - - public function mount() - { - try { - $this->team = auth()->user()->currentTeam(); - $this->settings = $this->team->slackNotificationSettings; - $this->syncData(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $this->settings->slack_enabled = $this->slackEnabled; - $this->settings->slack_webhook_url = $this->slackWebhookUrl; - - $this->settings->deployment_success_slack_notifications = $this->deploymentSuccessSlackNotifications; - $this->settings->deployment_failure_slack_notifications = $this->deploymentFailureSlackNotifications; - $this->settings->status_change_slack_notifications = $this->statusChangeSlackNotifications; - $this->settings->backup_success_slack_notifications = $this->backupSuccessSlackNotifications; - $this->settings->backup_failure_slack_notifications = $this->backupFailureSlackNotifications; - $this->settings->scheduled_task_success_slack_notifications = $this->scheduledTaskSuccessSlackNotifications; - $this->settings->scheduled_task_failure_slack_notifications = $this->scheduledTaskFailureSlackNotifications; - $this->settings->docker_cleanup_success_slack_notifications = $this->dockerCleanupSuccessSlackNotifications; - $this->settings->docker_cleanup_failure_slack_notifications = $this->dockerCleanupFailureSlackNotifications; - $this->settings->server_disk_usage_slack_notifications = $this->serverDiskUsageSlackNotifications; - $this->settings->server_reachable_slack_notifications = $this->serverReachableSlackNotifications; - $this->settings->server_unreachable_slack_notifications = $this->serverUnreachableSlackNotifications; - - $this->settings->save(); - refreshSession(); - } else { - $this->slackEnabled = $this->settings->slack_enabled; - $this->slackWebhookUrl = $this->settings->slack_webhook_url; - - $this->deploymentSuccessSlackNotifications = $this->settings->deployment_success_slack_notifications; - $this->deploymentFailureSlackNotifications = $this->settings->deployment_failure_slack_notifications; - $this->statusChangeSlackNotifications = $this->settings->status_change_slack_notifications; - $this->backupSuccessSlackNotifications = $this->settings->backup_success_slack_notifications; - $this->backupFailureSlackNotifications = $this->settings->backup_failure_slack_notifications; - $this->scheduledTaskSuccessSlackNotifications = $this->settings->scheduled_task_success_slack_notifications; - $this->scheduledTaskFailureSlackNotifications = $this->settings->scheduled_task_failure_slack_notifications; - $this->dockerCleanupSuccessSlackNotifications = $this->settings->docker_cleanup_success_slack_notifications; - $this->dockerCleanupFailureSlackNotifications = $this->settings->docker_cleanup_failure_slack_notifications; - $this->serverDiskUsageSlackNotifications = $this->settings->server_disk_usage_slack_notifications; - $this->serverReachableSlackNotifications = $this->settings->server_reachable_slack_notifications; - $this->serverUnreachableSlackNotifications = $this->settings->server_unreachable_slack_notifications; - } - } - - public function instantSaveSlackEnabled() - { - try { - $this->validate([ - 'slackWebhookUrl' => 'required', - ], [ - 'slackWebhookUrl.required' => 'Slack Webhook URL is required.', - ]); - $this->saveModel(); - } catch (\Throwable $e) { - $this->slackEnabled = false; - - return handleError($e, $this); - } finally { - $this->dispatch('refresh'); - } - } - - public function instantSave() - { - try { - $this->syncData(true); - } catch (\Throwable $e) { - return handleError($e, $this); - } finally { - $this->dispatch('refresh'); - } - } - - public function submit() - { - try { - $this->resetErrorBag(); - $this->syncData(true); - $this->saveModel(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function saveModel() - { - $this->syncData(true); - refreshSession(); - $this->dispatch('success', 'Settings saved.'); - } - - public function sendTestNotification() - { - try { - $this->team->notify(new Test(channel: 'slack')); - $this->dispatch('success', 'Test notification sent.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.notifications.slack'); - } -} diff --git a/app/Livewire/Notifications/Telegram.php b/app/Livewire/Notifications/Telegram.php deleted file mode 100644 index 01afb4ac67..0000000000 --- a/app/Livewire/Notifications/Telegram.php +++ /dev/null @@ -1,245 +0,0 @@ - '$refresh']; - - #[Locked] - public Team $team; - - #[Locked] - public TelegramNotificationSettings $settings; - - #[Validate(['boolean'])] - public bool $telegramEnabled = false; - - #[Validate(['nullable', 'string'])] - public ?string $telegramToken = null; - - #[Validate(['nullable', 'string'])] - public ?string $telegramChatId = null; - - #[Validate(['boolean'])] - public bool $deploymentSuccessTelegramNotifications = false; - - #[Validate(['boolean'])] - public bool $deploymentFailureTelegramNotifications = true; - - #[Validate(['boolean'])] - public bool $statusChangeTelegramNotifications = false; - - #[Validate(['boolean'])] - public bool $backupSuccessTelegramNotifications = false; - - #[Validate(['boolean'])] - public bool $backupFailureTelegramNotifications = true; - - #[Validate(['boolean'])] - public bool $scheduledTaskSuccessTelegramNotifications = false; - - #[Validate(['boolean'])] - public bool $scheduledTaskFailureTelegramNotifications = true; - - #[Validate(['boolean'])] - public bool $dockerCleanupSuccessTelegramNotifications = false; - - #[Validate(['boolean'])] - public bool $dockerCleanupFailureTelegramNotifications = true; - - #[Validate(['boolean'])] - public bool $serverDiskUsageTelegramNotifications = true; - - #[Validate(['boolean'])] - public bool $serverReachableTelegramNotifications = false; - - #[Validate(['boolean'])] - public bool $serverUnreachableTelegramNotifications = true; - - #[Validate(['nullable', 'string'])] - public ?string $telegramNotificationsDeploymentSuccessThreadId = null; - - #[Validate(['nullable', 'string'])] - public ?string $telegramNotificationsDeploymentFailureThreadId = null; - - #[Validate(['nullable', 'string'])] - public ?string $telegramNotificationsStatusChangeThreadId = null; - - #[Validate(['nullable', 'string'])] - public ?string $telegramNotificationsBackupSuccessThreadId = null; - - #[Validate(['nullable', 'string'])] - public ?string $telegramNotificationsBackupFailureThreadId = null; - - #[Validate(['nullable', 'string'])] - public ?string $telegramNotificationsScheduledTaskSuccessThreadId = null; - - #[Validate(['nullable', 'string'])] - public ?string $telegramNotificationsScheduledTaskFailureThreadId = null; - - #[Validate(['nullable', 'string'])] - public ?string $telegramNotificationsDockerCleanupSuccessThreadId = null; - - #[Validate(['nullable', 'string'])] - public ?string $telegramNotificationsDockerCleanupFailureThreadId = null; - - #[Validate(['nullable', 'string'])] - public ?string $telegramNotificationsServerDiskUsageThreadId = null; - - #[Validate(['nullable', 'string'])] - public ?string $telegramNotificationsServerReachableThreadId = null; - - #[Validate(['nullable', 'string'])] - public ?string $telegramNotificationsServerUnreachableThreadId = null; - - public function mount() - { - try { - $this->team = auth()->user()->currentTeam(); - $this->settings = $this->team->telegramNotificationSettings; - $this->syncData(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $this->settings->telegram_enabled = $this->telegramEnabled; - $this->settings->telegram_token = $this->telegramToken; - $this->settings->telegram_chat_id = $this->telegramChatId; - - $this->settings->deployment_success_telegram_notifications = $this->deploymentSuccessTelegramNotifications; - $this->settings->deployment_failure_telegram_notifications = $this->deploymentFailureTelegramNotifications; - $this->settings->status_change_telegram_notifications = $this->statusChangeTelegramNotifications; - $this->settings->backup_success_telegram_notifications = $this->backupSuccessTelegramNotifications; - $this->settings->backup_failure_telegram_notifications = $this->backupFailureTelegramNotifications; - $this->settings->scheduled_task_success_telegram_notifications = $this->scheduledTaskSuccessTelegramNotifications; - $this->settings->scheduled_task_failure_telegram_notifications = $this->scheduledTaskFailureTelegramNotifications; - $this->settings->docker_cleanup_success_telegram_notifications = $this->dockerCleanupSuccessTelegramNotifications; - $this->settings->docker_cleanup_failure_telegram_notifications = $this->dockerCleanupFailureTelegramNotifications; - $this->settings->server_disk_usage_telegram_notifications = $this->serverDiskUsageTelegramNotifications; - $this->settings->server_reachable_telegram_notifications = $this->serverReachableTelegramNotifications; - $this->settings->server_unreachable_telegram_notifications = $this->serverUnreachableTelegramNotifications; - - $this->settings->telegram_notifications_deployment_success_thread_id = $this->telegramNotificationsDeploymentSuccessThreadId; - $this->settings->telegram_notifications_deployment_failure_thread_id = $this->telegramNotificationsDeploymentFailureThreadId; - $this->settings->telegram_notifications_status_change_thread_id = $this->telegramNotificationsStatusChangeThreadId; - $this->settings->telegram_notifications_backup_success_thread_id = $this->telegramNotificationsBackupSuccessThreadId; - $this->settings->telegram_notifications_backup_failure_thread_id = $this->telegramNotificationsBackupFailureThreadId; - $this->settings->telegram_notifications_scheduled_task_success_thread_id = $this->telegramNotificationsScheduledTaskSuccessThreadId; - $this->settings->telegram_notifications_scheduled_task_failure_thread_id = $this->telegramNotificationsScheduledTaskFailureThreadId; - $this->settings->telegram_notifications_docker_cleanup_success_thread_id = $this->telegramNotificationsDockerCleanupSuccessThreadId; - $this->settings->telegram_notifications_docker_cleanup_failure_thread_id = $this->telegramNotificationsDockerCleanupFailureThreadId; - $this->settings->telegram_notifications_server_disk_usage_thread_id = $this->telegramNotificationsServerDiskUsageThreadId; - $this->settings->telegram_notifications_server_reachable_thread_id = $this->telegramNotificationsServerReachableThreadId; - $this->settings->telegram_notifications_server_unreachable_thread_id = $this->telegramNotificationsServerUnreachableThreadId; - - $this->settings->save(); - } else { - $this->telegramEnabled = $this->settings->telegram_enabled; - $this->telegramToken = $this->settings->telegram_token; - $this->telegramChatId = $this->settings->telegram_chat_id; - - $this->deploymentSuccessTelegramNotifications = $this->settings->deployment_success_telegram_notifications; - $this->deploymentFailureTelegramNotifications = $this->settings->deployment_failure_telegram_notifications; - $this->statusChangeTelegramNotifications = $this->settings->status_change_telegram_notifications; - $this->backupSuccessTelegramNotifications = $this->settings->backup_success_telegram_notifications; - $this->backupFailureTelegramNotifications = $this->settings->backup_failure_telegram_notifications; - $this->scheduledTaskSuccessTelegramNotifications = $this->settings->scheduled_task_success_telegram_notifications; - $this->scheduledTaskFailureTelegramNotifications = $this->settings->scheduled_task_failure_telegram_notifications; - $this->dockerCleanupSuccessTelegramNotifications = $this->settings->docker_cleanup_success_telegram_notifications; - $this->dockerCleanupFailureTelegramNotifications = $this->settings->docker_cleanup_failure_telegram_notifications; - $this->serverDiskUsageTelegramNotifications = $this->settings->server_disk_usage_telegram_notifications; - $this->serverReachableTelegramNotifications = $this->settings->server_reachable_telegram_notifications; - $this->serverUnreachableTelegramNotifications = $this->settings->server_unreachable_telegram_notifications; - - $this->telegramNotificationsDeploymentSuccessThreadId = $this->settings->telegram_notifications_deployment_success_thread_id; - $this->telegramNotificationsDeploymentFailureThreadId = $this->settings->telegram_notifications_deployment_failure_thread_id; - $this->telegramNotificationsStatusChangeThreadId = $this->settings->telegram_notifications_status_change_thread_id; - $this->telegramNotificationsBackupSuccessThreadId = $this->settings->telegram_notifications_backup_success_thread_id; - $this->telegramNotificationsBackupFailureThreadId = $this->settings->telegram_notifications_backup_failure_thread_id; - $this->telegramNotificationsScheduledTaskSuccessThreadId = $this->settings->telegram_notifications_scheduled_task_success_thread_id; - $this->telegramNotificationsScheduledTaskFailureThreadId = $this->settings->telegram_notifications_scheduled_task_failure_thread_id; - $this->telegramNotificationsDockerCleanupSuccessThreadId = $this->settings->telegram_notifications_docker_cleanup_success_thread_id; - $this->telegramNotificationsDockerCleanupFailureThreadId = $this->settings->telegram_notifications_docker_cleanup_failure_thread_id; - $this->telegramNotificationsServerDiskUsageThreadId = $this->settings->telegram_notifications_server_disk_usage_thread_id; - $this->telegramNotificationsServerReachableThreadId = $this->settings->telegram_notifications_server_reachable_thread_id; - $this->telegramNotificationsServerUnreachableThreadId = $this->settings->telegram_notifications_server_unreachable_thread_id; - } - } - - public function instantSave() - { - try { - $this->syncData(true); - } catch (\Throwable $e) { - return handleError($e, $this); - } finally { - $this->dispatch('refresh'); - } - } - - public function submit() - { - try { - $this->resetErrorBag(); - $this->syncData(true); - $this->saveModel(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function instantSaveTelegramEnabled() - { - try { - $this->validate([ - 'telegramToken' => 'required', - 'telegramChatId' => 'required', - ], [ - 'telegramToken.required' => 'Telegram Token is required.', - 'telegramChatId.required' => 'Telegram Chat ID is required.', - ]); - $this->saveModel(); - } catch (\Throwable $e) { - $this->telegramEnabled = false; - - return handleError($e, $this); - } finally { - $this->dispatch('refresh'); - } - } - - public function saveModel() - { - $this->syncData(true); - refreshSession(); - $this->dispatch('success', 'Settings saved.'); - } - - public function sendTestNotification() - { - try { - $this->team->notify(new Test(channel: 'telegram')); - $this->dispatch('success', 'Test notification sent.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.notifications.telegram'); - } -} diff --git a/app/Livewire/Profile/Index.php b/app/Livewire/Profile/Index.php deleted file mode 100644 index 53314cd5c3..0000000000 --- a/app/Livewire/Profile/Index.php +++ /dev/null @@ -1,82 +0,0 @@ -userId = Auth::id(); - $this->name = Auth::user()->name; - $this->email = Auth::user()->email; - } - - public function submit() - { - try { - $this->validate([ - 'name' => 'required', - ]); - Auth::user()->update([ - 'name' => $this->name, - ]); - - $this->dispatch('success', 'Profile updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function resetPassword() - { - try { - $this->validate([ - 'current_password' => ['required'], - 'new_password' => ['required', Password::defaults(), 'confirmed'], - ]); - if (! Hash::check($this->current_password, auth()->user()->password)) { - $this->dispatch('error', 'Current password is incorrect.'); - - return; - } - if ($this->new_password !== $this->new_password_confirmation) { - $this->dispatch('error', 'The two new passwords does not match.'); - - return; - } - auth()->user()->update([ - 'password' => Hash::make($this->new_password), - ]); - $this->dispatch('success', 'Password updated.'); - $this->current_password = ''; - $this->new_password = ''; - $this->new_password_confirmation = ''; - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.profile.index'); - } -} diff --git a/app/Livewire/Project/AddEmpty.php b/app/Livewire/Project/AddEmpty.php deleted file mode 100644 index 07873c059d..0000000000 --- a/app/Livewire/Project/AddEmpty.php +++ /dev/null @@ -1,34 +0,0 @@ -validate(); - $project = Project::create([ - 'name' => $this->name, - 'description' => $this->description, - 'team_id' => currentTeam()->id, - 'uuid' => (string) new Cuid2, - ]); - - return redirect()->route('project.show', $project->uuid); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Project/Application/Advanced.php b/app/Livewire/Project/Application/Advanced.php deleted file mode 100644 index bd13888060..0000000000 --- a/app/Livewire/Project/Application/Advanced.php +++ /dev/null @@ -1,228 +0,0 @@ -syncData(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $this->application->settings->is_force_https_enabled = $this->isForceHttpsEnabled; - $this->application->settings->is_git_submodules_enabled = $this->isGitSubmodulesEnabled; - $this->application->settings->is_git_lfs_enabled = $this->isGitLfsEnabled; - $this->application->settings->is_preview_deployments_enabled = $this->isPreviewDeploymentsEnabled; - $this->application->settings->is_auto_deploy_enabled = $this->isAutoDeployEnabled; - $this->application->settings->is_log_drain_enabled = $this->isLogDrainEnabled; - $this->application->settings->is_gpu_enabled = $this->isGpuEnabled; - $this->application->settings->gpu_driver = $this->gpuDriver; - $this->application->settings->gpu_count = $this->gpuCount; - $this->application->settings->gpu_device_ids = $this->gpuDeviceIds; - $this->application->settings->gpu_options = $this->gpuOptions; - $this->application->settings->is_build_server_enabled = $this->isBuildServerEnabled; - $this->application->settings->is_consistent_container_name_enabled = $this->isConsistentContainerNameEnabled; - $this->application->settings->custom_internal_name = $this->customInternalName; - $this->application->settings->is_gzip_enabled = $this->isGzipEnabled; - $this->application->settings->is_stripprefix_enabled = $this->isStripprefixEnabled; - $this->application->settings->is_raw_compose_deployment_enabled = $this->isRawComposeDeploymentEnabled; - $this->application->settings->connect_to_docker_network = $this->isConnectToDockerNetworkEnabled; - $this->application->settings->disable_build_cache = $this->disableBuildCache; - $this->application->settings->save(); - } else { - $this->isForceHttpsEnabled = $this->application->isForceHttpsEnabled(); - $this->isGzipEnabled = $this->application->isGzipEnabled(); - $this->isStripprefixEnabled = $this->application->isStripprefixEnabled(); - $this->isLogDrainEnabled = $this->application->isLogDrainEnabled(); - - $this->isGitSubmodulesEnabled = $this->application->settings->is_git_submodules_enabled; - $this->isGitLfsEnabled = $this->application->settings->is_git_lfs_enabled; - $this->isPreviewDeploymentsEnabled = $this->application->settings->is_preview_deployments_enabled; - $this->isAutoDeployEnabled = $this->application->settings->is_auto_deploy_enabled; - $this->isGpuEnabled = $this->application->settings->is_gpu_enabled; - $this->gpuDriver = $this->application->settings->gpu_driver; - $this->gpuCount = $this->application->settings->gpu_count; - $this->gpuDeviceIds = $this->application->settings->gpu_device_ids; - $this->gpuOptions = $this->application->settings->gpu_options; - $this->isBuildServerEnabled = $this->application->settings->is_build_server_enabled; - $this->isConsistentContainerNameEnabled = $this->application->settings->is_consistent_container_name_enabled; - $this->customInternalName = $this->application->settings->custom_internal_name; - $this->isRawComposeDeploymentEnabled = $this->application->settings->is_raw_compose_deployment_enabled; - $this->isConnectToDockerNetworkEnabled = $this->application->settings->connect_to_docker_network; - $this->disableBuildCache = $this->application->settings->disable_build_cache; - } - } - - private function resetDefaultLabels() - { - if ($this->application->settings->is_container_label_readonly_enabled === false) { - return; - } - $customLabels = str(implode('|coolify|', generateLabelsApplication($this->application)))->replace('|coolify|', "\n"); - $this->application->custom_labels = base64_encode($customLabels); - $this->application->save(); - } - - public function instantSave() - { - try { - $reset = false; - if ($this->isLogDrainEnabled) { - if (! $this->application->destination->server->isLogDrainEnabled()) { - $this->isLogDrainEnabled = false; - $this->syncData(true); - $this->dispatch('error', 'Log drain is not enabled on this server.'); - - return; - } - } - if ($this->application->isForceHttpsEnabled() !== $this->isForceHttpsEnabled || - $this->application->isGzipEnabled() !== $this->isGzipEnabled || - $this->application->isStripprefixEnabled() !== $this->isStripprefixEnabled - ) { - $reset = true; - } - - if ($this->application->settings->is_raw_compose_deployment_enabled) { - $this->application->oldRawParser(); - } else { - $this->application->parse(); - } - $this->syncData(true); - - if ($reset) { - $this->resetDefaultLabels(); - } - - $this->dispatch('success', 'Settings saved.'); - $this->dispatch('configurationChanged'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function submit() - { - try { - if ($this->gpuCount && $this->gpuDeviceIds) { - $this->dispatch('error', 'You cannot set both GPU count and GPU device IDs.'); - $this->gpuCount = null; - $this->gpuDeviceIds = null; - $this->syncData(true); - - return; - } - $this->syncData(true); - $this->dispatch('success', 'Settings saved.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function saveCustomName() - { - if (str($this->customInternalName)->isNotEmpty()) { - $this->customInternalName = str($this->customInternalName)->slug()->value(); - } else { - $this->customInternalName = null; - } - if (is_null($this->customInternalName)) { - $this->syncData(true); - $this->dispatch('success', 'Custom name saved.'); - - return; - } - $customInternalName = $this->customInternalName; - $server = $this->application->destination->server; - $allApplications = $server->applications(); - - $foundSameInternalName = $allApplications->filter(function ($application) { - return $application->id !== $this->application->id && $application->settings->custom_internal_name === $this->customInternalName; - }); - if ($foundSameInternalName->isNotEmpty()) { - $this->dispatch('error', 'This custom container name is already in use by another application on this server.'); - $this->customInternalName = $customInternalName; - $this->syncData(true); - - return; - } - $this->syncData(true); - $this->dispatch('success', 'Custom name saved.'); - } - - public function render() - { - return view('livewire.project.application.advanced'); - } -} diff --git a/app/Livewire/Project/Application/Configuration.php b/app/Livewire/Project/Application/Configuration.php deleted file mode 100644 index 56e0caf750..0000000000 --- a/app/Livewire/Project/Application/Configuration.php +++ /dev/null @@ -1,48 +0,0 @@ - '$refresh']; - - public function mount() - { - $this->currentRoute = request()->route()->getName(); - $project = currentTeam() - ->projects() - ->select('id', 'uuid', 'team_id') - ->where('uuid', request()->route('project_uuid')) - ->firstOrFail(); - $environment = $project->environments() - ->select('id', 'uuid', 'name', 'project_id') - ->where('uuid', request()->route('environment_uuid')) - ->firstOrFail(); - $application = $environment->applications() - ->with(['destination']) - ->where('uuid', request()->route('application_uuid')) - ->firstOrFail(); - - $this->project = $project; - $this->environment = $environment; - $this->application = $application; - } - - public function render() - { - return view('livewire.project.application.configuration'); - } -} diff --git a/app/Livewire/Project/Application/Deployment/Index.php b/app/Livewire/Project/Application/Deployment/Index.php deleted file mode 100644 index 0567a6e8a6..0000000000 --- a/app/Livewire/Project/Application/Deployment/Index.php +++ /dev/null @@ -1,113 +0,0 @@ -load(['projects'])->projects->where('uuid', request()->route('project_uuid'))->first(); - if (! $project) { - return redirect()->route('dashboard'); - } - $environment = $project->load(['environments'])->environments->where('uuid', request()->route('environment_uuid'))->first()->load(['applications']); - if (! $environment) { - return redirect()->route('dashboard'); - } - $application = $environment->applications->where('uuid', request()->route('application_uuid'))->first(); - if (! $application) { - return redirect()->route('dashboard'); - } - ['deployments' => $deployments, 'count' => $count] = $application->deployments(0, $this->default_take); - $this->application = $application; - $this->deployments = $deployments; - $this->deployments_count = $count; - $this->current_url = url()->current(); - $this->show_pull_request_only(); - $this->show_more(); - } - - private function show_pull_request_only() - { - if ($this->pull_request_id) { - $this->deployments = $this->deployments->where('pull_request_id', $this->pull_request_id); - } - } - - private function show_more() - { - if ($this->deployments->count() !== 0) { - $this->show_next = true; - if ($this->deployments->count() < $this->default_take) { - $this->show_next = false; - } - - return; - } - } - - public function reload_deployments() - { - $this->load_deployments(); - } - - public function previous_page(?int $take = null) - { - if ($take) { - $this->skip = $this->skip - $take; - } - $this->skip = $this->skip - $this->default_take; - if ($this->skip < 0) { - $this->show_prev = false; - $this->skip = 0; - } - $this->load_deployments(); - } - - public function next_page(?int $take = null) - { - if ($take) { - $this->skip = $this->skip + $take; - } - $this->show_prev = true; - $this->load_deployments(); - } - - public function load_deployments() - { - ['deployments' => $deployments, 'count' => $count] = $this->application->deployments($this->skip, $this->default_take); - $this->deployments = $deployments; - $this->deployments_count = $count; - $this->show_pull_request_only(); - $this->show_more(); - } - - public function render() - { - return view('livewire.project.application.deployment.index'); - } -} diff --git a/app/Livewire/Project/Application/Deployment/Show.php b/app/Livewire/Project/Application/Deployment/Show.php deleted file mode 100644 index 7b2ac09d36..0000000000 --- a/app/Livewire/Project/Application/Deployment/Show.php +++ /dev/null @@ -1,94 +0,0 @@ -route('deployment_uuid'); - - $project = currentTeam()->load(['projects'])->projects->where('uuid', request()->route('project_uuid'))->first(); - if (! $project) { - return redirect()->route('dashboard'); - } - $environment = $project->load(['environments'])->environments->where('uuid', request()->route('environment_uuid'))->first()->load(['applications']); - if (! $environment) { - return redirect()->route('dashboard'); - } - $application = $environment->applications->where('uuid', request()->route('application_uuid'))->first(); - if (! $application) { - return redirect()->route('dashboard'); - } - $application_deployment_queue = ApplicationDeploymentQueue::where('deployment_uuid', $deploymentUuid)->first(); - if (! $application_deployment_queue) { - return redirect()->route('project.application.deployment.index', [ - 'project_uuid' => $project->uuid, - 'environment_uuid' => $environment->uuid, - 'application_uuid' => $application->uuid, - ]); - } - $this->application = $application; - $this->application_deployment_queue = $application_deployment_queue; - $this->horizon_job_status = $this->application_deployment_queue->getHorizonJobStatus(); - $this->deployment_uuid = $deploymentUuid; - $this->isKeepAliveOn(); - } - - public function refreshQueue() - { - $this->application_deployment_queue->refresh(); - } - - private function isKeepAliveOn() - { - if (data_get($this->application_deployment_queue, 'status') === 'finished' || data_get($this->application_deployment_queue, 'status') === 'failed') { - $this->isKeepAliveOn = false; - } else { - $this->isKeepAliveOn = true; - } - } - - public function polling() - { - $this->dispatch('deploymentFinished'); - $this->application_deployment_queue->refresh(); - $this->horizon_job_status = $this->application_deployment_queue->getHorizonJobStatus(); - $this->isKeepAliveOn(); - } - - public function getLogLinesProperty() - { - return decode_remote_command_output($this->application_deployment_queue)->map(function ($logLine) { - $logLine['line'] = e($logLine['line']); - $logLine['line'] = preg_replace( - '/(https?:\/\/[^\s]+)/', - '$1', - $logLine['line'], - ); - - return $logLine; - }); - } - - public function render() - { - return view('livewire.project.application.deployment.show'); - } -} diff --git a/app/Livewire/Project/Application/DeploymentNavbar.php b/app/Livewire/Project/Application/DeploymentNavbar.php deleted file mode 100644 index 66f387fcfa..0000000000 --- a/app/Livewire/Project/Application/DeploymentNavbar.php +++ /dev/null @@ -1,91 +0,0 @@ -application = Application::ownedByCurrentTeam()->find($this->application_deployment_queue->application_id); - $this->server = $this->application->destination->server; - $this->is_debug_enabled = $this->application->settings->is_debug_enabled; - } - - public function deploymentFinished() - { - $this->application_deployment_queue->refresh(); - } - - public function show_debug() - { - $this->application->settings->is_debug_enabled = ! $this->application->settings->is_debug_enabled; - $this->application->settings->save(); - $this->is_debug_enabled = $this->application->settings->is_debug_enabled; - $this->dispatch('refreshQueue'); - } - - public function force_start() - { - try { - force_start_deployment($this->application_deployment_queue); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function cancel() - { - $kill_command = "docker rm -f {$this->application_deployment_queue->deployment_uuid}"; - $build_server_id = $this->application_deployment_queue->build_server_id ?? $this->application->destination->server_id; - $server_id = $this->application_deployment_queue->server_id ?? $this->application->destination->server_id; - try { - if ($this->application->settings->is_build_server_enabled) { - $server = Server::ownedByCurrentTeam()->find($build_server_id); - } else { - $server = Server::ownedByCurrentTeam()->find($server_id); - } - if ($this->application_deployment_queue->logs) { - $previous_logs = json_decode($this->application_deployment_queue->logs, associative: true, flags: JSON_THROW_ON_ERROR); - - $new_log_entry = [ - 'command' => $kill_command, - 'output' => 'Deployment cancelled by user.', - 'type' => 'stderr', - 'order' => count($previous_logs) + 1, - 'timestamp' => Carbon::now('UTC'), - 'hidden' => false, - ]; - $previous_logs[] = $new_log_entry; - $this->application_deployment_queue->update([ - 'logs' => json_encode($previous_logs, flags: JSON_THROW_ON_ERROR), - ]); - } - instant_remote_process([$kill_command], $server); - } catch (\Throwable $e) { - return handleError($e, $this); - } finally { - $this->application_deployment_queue->update([ - 'current_process_id' => null, - 'status' => ApplicationDeploymentStatus::CANCELLED_BY_USER->value, - ]); - next_after_cancel($server); - } - } -} diff --git a/app/Livewire/Project/Application/General.php b/app/Livewire/Project/Application/General.php deleted file mode 100644 index 08fff38c61..0000000000 --- a/app/Livewire/Project/Application/General.php +++ /dev/null @@ -1,458 +0,0 @@ - '$refresh', - ]; - - protected $rules = [ - 'application.name' => 'required', - 'application.description' => 'nullable', - 'application.fqdn' => 'nullable', - 'application.git_repository' => 'required', - 'application.git_branch' => 'required', - 'application.git_commit_sha' => 'nullable', - 'application.install_command' => 'nullable', - 'application.build_command' => 'nullable', - 'application.start_command' => 'nullable', - 'application.build_pack' => 'required', - 'application.static_image' => 'required', - 'application.base_directory' => 'required', - 'application.publish_directory' => 'nullable', - 'application.ports_exposes' => 'required', - 'application.ports_mappings' => 'nullable', - 'application.dockerfile' => 'nullable', - 'application.docker_registry_image_name' => 'nullable', - 'application.docker_registry_image_tag' => 'nullable', - 'application.dockerfile_location' => 'nullable', - 'application.docker_compose_location' => 'nullable', - 'application.docker_compose' => 'nullable', - 'application.docker_compose_raw' => 'nullable', - 'application.dockerfile_target_build' => 'nullable', - 'application.docker_compose_custom_start_command' => 'nullable', - 'application.docker_compose_custom_build_command' => 'nullable', - 'application.custom_labels' => 'nullable', - 'application.custom_docker_run_options' => 'nullable', - 'application.pre_deployment_command' => 'nullable', - 'application.pre_deployment_command_container' => 'nullable', - 'application.post_deployment_command' => 'nullable', - 'application.post_deployment_command_container' => 'nullable', - 'application.custom_nginx_configuration' => 'nullable', - 'application.settings.is_static' => 'boolean|required', - 'application.settings.is_build_server_enabled' => 'boolean|required', - 'application.settings.is_container_label_escape_enabled' => 'boolean|required', - 'application.settings.is_container_label_readonly_enabled' => 'boolean|required', - 'application.settings.is_preserve_repository_enabled' => 'boolean|required', - 'application.watch_paths' => 'nullable', - 'application.redirect' => 'string|required', - ]; - - protected $validationAttributes = [ - 'application.name' => 'name', - 'application.description' => 'description', - 'application.fqdn' => 'FQDN', - 'application.git_repository' => 'Git repository', - 'application.git_branch' => 'Git branch', - 'application.git_commit_sha' => 'Git commit SHA', - 'application.install_command' => 'Install command', - 'application.build_command' => 'Build command', - 'application.start_command' => 'Start command', - 'application.build_pack' => 'Build pack', - 'application.static_image' => 'Static image', - 'application.base_directory' => 'Base directory', - 'application.publish_directory' => 'Publish directory', - 'application.ports_exposes' => 'Ports exposes', - 'application.ports_mappings' => 'Ports mappings', - 'application.dockerfile' => 'Dockerfile', - 'application.docker_registry_image_name' => 'Docker registry image name', - 'application.docker_registry_image_tag' => 'Docker registry image tag', - 'application.dockerfile_location' => 'Dockerfile location', - 'application.docker_compose_location' => 'Docker compose location', - 'application.docker_compose' => 'Docker compose', - 'application.docker_compose_raw' => 'Docker compose raw', - 'application.custom_labels' => 'Custom labels', - 'application.dockerfile_target_build' => 'Dockerfile target build', - 'application.custom_docker_run_options' => 'Custom docker run commands', - 'application.docker_compose_custom_start_command' => 'Docker compose custom start command', - 'application.docker_compose_custom_build_command' => 'Docker compose custom build command', - 'application.custom_nginx_configuration' => 'Custom Nginx configuration', - 'application.settings.is_static' => 'Is static', - 'application.settings.is_build_server_enabled' => 'Is build server enabled', - 'application.settings.is_container_label_escape_enabled' => 'Is container label escape enabled', - 'application.settings.is_container_label_readonly_enabled' => 'Is container label readonly', - 'application.settings.is_preserve_repository_enabled' => 'Is preserve repository enabled', - 'application.watch_paths' => 'Watch paths', - 'application.redirect' => 'Redirect', - ]; - - public function mount() - { - try { - $this->parsedServices = $this->application->parse(); - if (is_null($this->parsedServices) || empty($this->parsedServices)) { - $this->dispatch('error', 'Failed to parse your docker-compose file. Please check the syntax and try again.'); - - return; - } - } catch (\Throwable $e) { - $this->dispatch('error', $e->getMessage()); - } - if ($this->application->build_pack === 'dockercompose') { - $this->application->fqdn = null; - $this->application->settings->save(); - } - $this->parsedServiceDomains = $this->application->docker_compose_domains ? json_decode($this->application->docker_compose_domains, true) : []; - $this->ports_exposes = $this->application->ports_exposes; - $this->is_preserve_repository_enabled = $this->application->settings->is_preserve_repository_enabled; - $this->is_container_label_escape_enabled = $this->application->settings->is_container_label_escape_enabled; - $this->customLabels = $this->application->parseContainerLabels(); - if (! $this->customLabels && $this->application->destination->server->proxyType() !== 'NONE' && $this->application->settings->is_container_label_readonly_enabled === true) { - $this->customLabels = str(implode('|coolify|', generateLabelsApplication($this->application)))->replace('|coolify|', "\n"); - $this->application->custom_labels = base64_encode($this->customLabels); - $this->application->save(); - } - $this->initialDockerComposeLocation = $this->application->docker_compose_location; - if ($this->application->build_pack === 'dockercompose' && ! $this->application->docker_compose_raw) { - $this->initLoadingCompose = true; - $this->dispatch('info', 'Loading docker compose file.'); - } - - if (str($this->application->status)->startsWith('running') && is_null($this->application->config_hash)) { - $this->dispatch('configurationChanged'); - } - } - - public function instantSave() - { - $this->application->settings->save(); - $this->dispatch('success', 'Settings saved.'); - $this->application->refresh(); - - // If port_exposes changed, reset default labels - if ($this->ports_exposes !== $this->application->ports_exposes || $this->is_container_label_escape_enabled !== $this->application->settings->is_container_label_escape_enabled) { - $this->resetDefaultLabels(false); - } - if ($this->is_preserve_repository_enabled !== $this->application->settings->is_preserve_repository_enabled) { - if ($this->application->settings->is_preserve_repository_enabled === false) { - $this->application->fileStorages->each(function ($storage) { - $storage->is_based_on_git = $this->application->settings->is_preserve_repository_enabled; - $storage->save(); - }); - } - } - if ($this->application->settings->is_container_label_readonly_enabled) { - $this->resetDefaultLabels(false); - } - } - - public function loadComposeFile($isInit = false) - { - try { - if ($isInit && $this->application->docker_compose_raw) { - return; - } - - // Must reload the application to get the latest database changes - // Why? Not sure, but it works. - // $this->application->refresh(); - - ['parsedServices' => $this->parsedServices, 'initialDockerComposeLocation' => $this->initialDockerComposeLocation] = $this->application->loadComposeFile($isInit); - if (is_null($this->parsedServices)) { - $this->dispatch('error', 'Failed to parse your docker-compose file. Please check the syntax and try again.'); - - return; - } - $this->application->parse(); - $this->dispatch('success', 'Docker compose file loaded.'); - $this->dispatch('compose_loaded'); - $this->dispatch('refreshStorages'); - $this->dispatch('refreshEnvs'); - } catch (\Throwable $e) { - $this->application->docker_compose_location = $this->initialDockerComposeLocation; - $this->application->save(); - - return handleError($e, $this); - } finally { - $this->initLoadingCompose = false; - } - } - - public function generateDomain(string $serviceName) - { - $uuid = new Cuid2; - $domain = generateFqdn($this->application->destination->server, $uuid); - $this->parsedServiceDomains[$serviceName]['domain'] = $domain; - $this->application->docker_compose_domains = json_encode($this->parsedServiceDomains); - $this->application->save(); - $this->dispatch('success', 'Domain generated.'); - if ($this->application->build_pack === 'dockercompose') { - $this->loadComposeFile(); - } - - return $domain; - } - - public function updatedApplicationBaseDirectory() - { - if ($this->application->build_pack === 'dockercompose') { - $this->loadComposeFile(); - } - } - - public function updatedApplicationSettingsIsStatic($value) - { - if ($value) { - $this->generateNginxConfiguration(); - } - } - - public function updatedApplicationBuildPack() - { - if ($this->application->build_pack !== 'nixpacks') { - $this->application->settings->is_static = false; - $this->application->settings->save(); - } else { - $this->application->ports_exposes = $this->ports_exposes = 3000; - $this->resetDefaultLabels(false); - } - if ($this->application->build_pack === 'dockercompose') { - $this->application->fqdn = null; - $this->application->settings->save(); - } - if ($this->application->build_pack === 'static') { - $this->application->ports_exposes = $this->ports_exposes = 80; - $this->resetDefaultLabels(false); - $this->generateNginxConfiguration(); - } - $this->submit(); - $this->dispatch('buildPackUpdated'); - } - - public function getWildcardDomain() - { - $server = data_get($this->application, 'destination.server'); - if ($server) { - $fqdn = generateFqdn($server, $this->application->uuid); - $this->application->fqdn = $fqdn; - $this->application->save(); - $this->resetDefaultLabels(); - $this->dispatch('success', 'Wildcard domain generated.'); - } - } - - public function generateNginxConfiguration() - { - $this->application->custom_nginx_configuration = defaultNginxConfiguration(); - $this->application->save(); - $this->dispatch('success', 'Nginx configuration generated.'); - } - - public function resetDefaultLabels($manualReset = false) - { - try { - if (! $this->application->settings->is_container_label_readonly_enabled && ! $manualReset) { - return; - } - $this->customLabels = str(implode('|coolify|', generateLabelsApplication($this->application)))->replace('|coolify|', "\n"); - $this->ports_exposes = $this->application->ports_exposes; - $this->is_container_label_escape_enabled = $this->application->settings->is_container_label_escape_enabled; - $this->application->custom_labels = base64_encode($this->customLabels); - $this->application->save(); - if ($this->application->build_pack === 'dockercompose') { - $this->loadComposeFile(); - } - $this->dispatch('configurationChanged'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function checkFqdns($showToaster = true) - { - if (data_get($this->application, 'fqdn')) { - $domains = str($this->application->fqdn)->trim()->explode(','); - if ($this->application->additional_servers->count() === 0) { - foreach ($domains as $domain) { - if (! validate_dns_entry($domain, $this->application->destination->server)) { - $showToaster && $this->dispatch('error', 'Validating DNS failed.', "Make sure you have added the DNS records correctly.

$domain->{$this->application->destination->server->ip}

Check this documentation for further help."); - } - } - } - check_domain_usage(resource: $this->application); - $this->application->fqdn = $domains->implode(','); - $this->resetDefaultLabels(false); - } - } - - public function setRedirect() - { - try { - $has_www = collect($this->application->fqdns)->filter(fn ($fqdn) => str($fqdn)->contains('www.'))->count(); - if ($has_www === 0 && $this->application->redirect === 'www') { - $this->dispatch('error', 'You want to redirect to www, but you do not have a www domain set.

Please add www to your domain list and as an A DNS record (if applicable).'); - - return; - } - $this->application->save(); - $this->resetDefaultLabels(); - $this->dispatch('success', 'Redirect updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function submit($showToaster = true) - { - try { - $this->application->fqdn = str($this->application->fqdn)->replaceEnd(',', '')->trim(); - $this->application->fqdn = str($this->application->fqdn)->replaceStart(',', '')->trim(); - $this->application->fqdn = str($this->application->fqdn)->trim()->explode(',')->map(function ($domain) { - Url::fromString($domain, ['http', 'https']); - - return str($domain)->trim()->lower(); - }); - - $this->application->fqdn = $this->application->fqdn->unique()->implode(','); - $warning = sslipDomainWarning($this->application->fqdn); - if ($warning) { - $this->dispatch('warning', __('warning.sslipdomain')); - } - // $this->resetDefaultLabels(); - - if ($this->application->isDirty('redirect')) { - $this->setRedirect(); - } - - $this->checkFqdns(); - - $this->application->save(); - if (! $this->customLabels && $this->application->destination->server->proxyType() !== 'NONE' && ! $this->application->settings->is_container_label_readonly_enabled) { - $this->customLabels = str(implode('|coolify|', generateLabelsApplication($this->application)))->replace('|coolify|', "\n"); - $this->application->custom_labels = base64_encode($this->customLabels); - $this->application->save(); - } - - if ($this->application->build_pack === 'dockercompose' && $this->initialDockerComposeLocation !== $this->application->docker_compose_location) { - $compose_return = $this->loadComposeFile(); - if ($compose_return instanceof \Livewire\Features\SupportEvents\Event) { - return; - } - } - $this->validate(); - - if ($this->ports_exposes !== $this->application->ports_exposes || $this->is_container_label_escape_enabled !== $this->application->settings->is_container_label_escape_enabled) { - $this->resetDefaultLabels(); - } - if (data_get($this->application, 'build_pack') === 'dockerimage') { - $this->validate([ - 'application.docker_registry_image_name' => 'required', - ]); - } - - if (data_get($this->application, 'custom_docker_run_options')) { - $this->application->custom_docker_run_options = str($this->application->custom_docker_run_options)->trim(); - } - if (data_get($this->application, 'dockerfile')) { - $port = get_port_from_dockerfile($this->application->dockerfile); - if ($port && ! $this->application->ports_exposes) { - $this->application->ports_exposes = $port; - } - } - if ($this->application->base_directory && $this->application->base_directory !== '/') { - $this->application->base_directory = rtrim($this->application->base_directory, '/'); - } - if ($this->application->publish_directory && $this->application->publish_directory !== '/') { - $this->application->publish_directory = rtrim($this->application->publish_directory, '/'); - } - if ($this->application->build_pack === 'dockercompose') { - $this->application->docker_compose_domains = json_encode($this->parsedServiceDomains); - - foreach ($this->parsedServiceDomains as $serviceName => $service) { - $domain = data_get($service, 'domain'); - if ($domain) { - if (! validate_dns_entry($domain, $this->application->destination->server)) { - $showToaster && $this->dispatch('error', 'Validating DNS failed.', "Make sure you have added the DNS records correctly.

$domain->{$this->application->destination->server->ip}

Check this documentation for further help."); - } - check_domain_usage(resource: $this->application); - } - } - if ($this->application->isDirty('docker_compose_domains')) { - $this->resetDefaultLabels(); - } - } - $this->application->custom_labels = base64_encode($this->customLabels); - $this->application->save(); - $showToaster && ! $warning && $this->dispatch('success', 'Application settings updated!'); - } catch (\Throwable $e) { - $originalFqdn = $this->application->getOriginal('fqdn'); - if ($originalFqdn !== $this->application->fqdn) { - $this->application->fqdn = $originalFqdn; - } - - return handleError($e, $this); - } finally { - $this->dispatch('configurationChanged'); - } - } - - public function downloadConfig() - { - $config = GenerateConfig::run($this->application, true); - $fileName = str($this->application->name)->slug()->append('_config.json'); - dd($config); - - return response()->streamDownload(function () use ($config) { - echo $config; - }, $fileName, [ - 'Content-Type' => 'application/json', - 'Content-Disposition' => 'attachment; filename='.$fileName, - ]); - } -} diff --git a/app/Livewire/Project/Application/Heading.php b/app/Livewire/Project/Application/Heading.php deleted file mode 100644 index 0d7d7755f4..0000000000 --- a/app/Livewire/Project/Application/Heading.php +++ /dev/null @@ -1,151 +0,0 @@ -user()->currentTeam()->id; - - return [ - "echo-private:team.{$teamId},ApplicationStatusChanged" => 'check_status', - 'compose_loaded' => '$refresh', - 'update_links' => '$refresh', - ]; - } - - public function mount() - { - $this->parameters = [ - 'project_uuid' => $this->application->project()->uuid, - 'environment_uuid' => $this->application->environment->uuid, - 'application_uuid' => $this->application->uuid, - ]; - $lastDeployment = $this->application->get_last_successful_deployment(); - $this->lastDeploymentInfo = data_get_str($lastDeployment, 'commit')->limit(7).' '.data_get($lastDeployment, 'commit_message'); - $this->lastDeploymentLink = $this->application->gitCommitLink(data_get($lastDeployment, 'commit')); - } - - public function check_status($showNotification = false) - { - if ($this->application->destination->server->isFunctional()) { - GetContainersStatus::dispatch($this->application->destination->server); - } - if ($showNotification) { - $this->dispatch('success', 'Success', 'Application status updated.'); - } - } - - public function force_deploy_without_cache() - { - $this->deploy(force_rebuild: true); - } - - public function deploy(bool $force_rebuild = false) - { - if ($this->application->build_pack === 'dockercompose' && is_null($this->application->docker_compose_raw)) { - $this->dispatch('error', 'Failed to deploy', 'Please load a Compose file first.'); - - return; - } - if ($this->application->destination->server->isSwarm() && str($this->application->docker_registry_image_name)->isEmpty()) { - $this->dispatch('error', 'Failed to deploy.', 'To deploy to a Swarm cluster you must set a Docker image name first.'); - - return; - } - if (data_get($this->application, 'settings.is_build_server_enabled') && str($this->application->docker_registry_image_name)->isEmpty()) { - $this->dispatch('error', 'Failed to deploy.', 'To use a build server, you must first set a Docker image.
More information here: documentation'); - - return; - } - if ($this->application->additional_servers->count() > 0 && str($this->application->docker_registry_image_name)->isEmpty()) { - $this->dispatch('error', 'Failed to deploy.', 'Before deploying to multiple servers, you must first set a Docker image in the General tab.
More information here: documentation'); - - return; - } - $this->setDeploymentUuid(); - queue_application_deployment( - application: $this->application, - deployment_uuid: $this->deploymentUuid, - force_rebuild: $force_rebuild, - ); - - return $this->redirectRoute('project.application.deployment.show', [ - 'project_uuid' => $this->parameters['project_uuid'], - 'application_uuid' => $this->parameters['application_uuid'], - 'deployment_uuid' => $this->deploymentUuid, - 'environment_uuid' => $this->parameters['environment_uuid'], - ], navigate: true); - } - - protected function setDeploymentUuid() - { - $this->deploymentUuid = new Cuid2; - $this->parameters['deployment_uuid'] = $this->deploymentUuid; - } - - public function stop() - { - StopApplication::run($this->application, false, $this->docker_cleanup); - $this->application->status = 'exited'; - $this->application->save(); - if ($this->application->additional_servers->count() > 0) { - $this->application->additional_servers->each(function ($server) { - $server->pivot->status = 'exited:unhealthy'; - $server->pivot->save(); - }); - } - ApplicationStatusChanged::dispatch(data_get($this->application, 'environment.project.team.id')); - } - - public function restart() - { - if ($this->application->additional_servers->count() > 0 && str($this->application->docker_registry_image_name)->isEmpty()) { - $this->dispatch('error', 'Failed to deploy', 'Before deploying to multiple servers, you must first set a Docker image in the General tab.
More information here: documentation'); - - return; - } - $this->setDeploymentUuid(); - queue_application_deployment( - application: $this->application, - deployment_uuid: $this->deploymentUuid, - restart_only: true, - ); - - return $this->redirectRoute('project.application.deployment.show', [ - 'project_uuid' => $this->parameters['project_uuid'], - 'application_uuid' => $this->parameters['application_uuid'], - 'deployment_uuid' => $this->deploymentUuid, - 'environment_uuid' => $this->parameters['environment_uuid'], - ], navigate: true); - } - - public function render() - { - return view('livewire.project.application.heading', [ - 'checkboxes' => [ - ['id' => 'docker_cleanup', 'label' => __('resource.docker_cleanup')], - ], - ]); - } -} diff --git a/app/Livewire/Project/Application/Preview/Form.php b/app/Livewire/Project/Application/Preview/Form.php deleted file mode 100644 index edcab44c88..0000000000 --- a/app/Livewire/Project/Application/Preview/Form.php +++ /dev/null @@ -1,63 +0,0 @@ -previewUrlTemplate = $this->application->preview_url_template; - $this->generateRealUrl(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function submit() - { - try { - $this->resetErrorBag(); - $this->validate(); - $this->application->preview_url_template = str_replace(' ', '', $this->previewUrlTemplate); - $this->application->save(); - $this->dispatch('success', 'Preview url template updated.'); - $this->generateRealUrl(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function resetToDefault() - { - try { - $this->application->preview_url_template = '{{pr_id}}.{{domain}}'; - $this->previewUrlTemplate = $this->application->preview_url_template; - $this->application->save(); - $this->generateRealUrl(); - $this->dispatch('success', 'Preview url template updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function generateRealUrl() - { - if (data_get($this->application, 'fqdn')) { - $firstFqdn = str($this->application->fqdn)->before(','); - $url = Url::fromString($firstFqdn); - $host = $url->getHost(); - $this->previewUrlTemplate = str($this->application->preview_url_template)->replace('{{domain}}', $host); - } - } -} diff --git a/app/Livewire/Project/Application/Previews.php b/app/Livewire/Project/Application/Previews.php deleted file mode 100644 index bdf62706c3..0000000000 --- a/app/Livewire/Project/Application/Previews.php +++ /dev/null @@ -1,279 +0,0 @@ - 'string|nullable', - ]; - - public function mount() - { - $this->pull_requests = collect(); - $this->parameters = get_route_parameters(); - } - - public function load_prs() - { - try { - ['rate_limit_remaining' => $rate_limit_remaining, 'data' => $data] = githubApi(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/pulls"); - $this->rate_limit_remaining = $rate_limit_remaining; - $this->pull_requests = $data->sortBy('number')->values(); - } catch (\Throwable $e) { - $this->rate_limit_remaining = 0; - - return handleError($e, $this); - } - } - - public function save_preview($preview_id) - { - try { - $success = true; - $preview = $this->application->previews->find($preview_id); - if (data_get_str($preview, 'fqdn')->isNotEmpty()) { - $preview->fqdn = str($preview->fqdn)->replaceEnd(',', '')->trim(); - $preview->fqdn = str($preview->fqdn)->replaceStart(',', '')->trim(); - $preview->fqdn = str($preview->fqdn)->trim()->lower(); - if (! validate_dns_entry($preview->fqdn, $this->application->destination->server)) { - $this->dispatch('error', 'Validating DNS failed.', "Make sure you have added the DNS records correctly.

$preview->fqdn->{$this->application->destination->server->ip}

Check this documentation for further help."); - $success = false; - } - check_domain_usage(resource: $this->application, domain: $preview->fqdn); - } - - if (! $preview) { - throw new \Exception('Preview not found'); - } - $success && $preview->save(); - $success && $this->dispatch('success', 'Preview saved.

Do not forget to redeploy the preview to apply the changes.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function generate_preview($preview_id) - { - $preview = $this->application->previews->find($preview_id); - if (! $preview) { - $this->dispatch('error', 'Preview not found.'); - - return; - } - if ($this->application->build_pack === 'dockercompose') { - $preview->generate_preview_fqdn_compose(); - $this->application->refresh(); - $this->dispatch('success', 'Domain generated.'); - - return; - } - - $fqdn = generateFqdn($this->application->destination->server, $this->application->uuid); - $url = Url::fromString($fqdn); - $template = $this->application->preview_url_template; - $host = $url->getHost(); - $schema = $url->getScheme(); - $random = new Cuid2; - $preview_fqdn = str_replace('{{random}}', $random, $template); - $preview_fqdn = str_replace('{{domain}}', $host, $preview_fqdn); - $preview_fqdn = str_replace('{{pr_id}}', $preview->pull_request_id, $preview_fqdn); - $preview_fqdn = "$schema://$preview_fqdn"; - $preview->fqdn = $preview_fqdn; - $preview->save(); - $this->dispatch('success', 'Domain generated.'); - } - - public function add(int $pull_request_id, ?string $pull_request_html_url = null) - { - try { - if ($this->application->build_pack === 'dockercompose') { - $this->setDeploymentUuid(); - $found = ApplicationPreview::where('application_id', $this->application->id)->where('pull_request_id', $pull_request_id)->first(); - if (! $found && ! is_null($pull_request_html_url)) { - $found = ApplicationPreview::create([ - 'application_id' => $this->application->id, - 'pull_request_id' => $pull_request_id, - 'pull_request_html_url' => $pull_request_html_url, - 'docker_compose_domains' => $this->application->docker_compose_domains, - ]); - } - $found->generate_preview_fqdn_compose(); - $this->application->refresh(); - } else { - $this->setDeploymentUuid(); - $found = ApplicationPreview::where('application_id', $this->application->id)->where('pull_request_id', $pull_request_id)->first(); - if (! $found && ! is_null($pull_request_html_url)) { - $found = ApplicationPreview::create([ - 'application_id' => $this->application->id, - 'pull_request_id' => $pull_request_id, - 'pull_request_html_url' => $pull_request_html_url, - ]); - } - $this->application->generate_preview_fqdn($pull_request_id); - $this->application->refresh(); - $this->dispatch('update_links'); - $this->dispatch('success', 'Preview added.'); - } - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function add_and_deploy(int $pull_request_id, ?string $pull_request_html_url = null) - { - $this->add($pull_request_id, $pull_request_html_url); - $this->deploy($pull_request_id, $pull_request_html_url); - } - - public function deploy(int $pull_request_id, ?string $pull_request_html_url = null) - { - try { - $this->setDeploymentUuid(); - $found = ApplicationPreview::where('application_id', $this->application->id)->where('pull_request_id', $pull_request_id)->first(); - if (! $found && ! is_null($pull_request_html_url)) { - ApplicationPreview::create([ - 'application_id' => $this->application->id, - 'pull_request_id' => $pull_request_id, - 'pull_request_html_url' => $pull_request_html_url, - ]); - } - queue_application_deployment( - application: $this->application, - deployment_uuid: $this->deployment_uuid, - force_rebuild: false, - pull_request_id: $pull_request_id, - git_type: $found->git_type ?? null, - ); - - return redirect()->route('project.application.deployment.show', [ - 'project_uuid' => $this->parameters['project_uuid'], - 'application_uuid' => $this->parameters['application_uuid'], - 'deployment_uuid' => $this->deployment_uuid, - 'environment_uuid' => $this->parameters['environment_uuid'], - ]); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - protected function setDeploymentUuid() - { - $this->deployment_uuid = new Cuid2; - $this->parameters['deployment_uuid'] = $this->deployment_uuid; - } - - public function stop(int $pull_request_id) - { - try { - $server = $this->application->destination->server; - $timeout = 300; - - if ($this->application->destination->server->isSwarm()) { - instant_remote_process(["docker stack rm {$this->application->uuid}-{$pull_request_id}"], $server); - } else { - $containers = getCurrentApplicationContainerStatus($server, $this->application->id, $pull_request_id)->toArray(); - $this->stopContainers($containers, $server, $timeout); - } - - GetContainersStatus::run($server); - $this->application->refresh(); - $this->dispatch('containerStatusUpdated'); - $this->dispatch('success', 'Preview Deployment stopped.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function delete(int $pull_request_id) - { - try { - $server = $this->application->destination->server; - $timeout = 300; - - if ($this->application->destination->server->isSwarm()) { - instant_remote_process(["docker stack rm {$this->application->uuid}-{$pull_request_id}"], $server); - } else { - $containers = getCurrentApplicationContainerStatus($server, $this->application->id, $pull_request_id)->toArray(); - $this->stopContainers($containers, $server, $timeout); - } - - ApplicationPreview::where('application_id', $this->application->id) - ->where('pull_request_id', $pull_request_id) - ->first() - ->delete(); - - $this->application->refresh(); - $this->dispatch('update_links'); - $this->dispatch('success', 'Preview deleted.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - private function stopContainers(array $containers, $server, int $timeout) - { - $processes = []; - foreach ($containers as $container) { - $containerName = str_replace('/', '', $container['Names']); - $processes[$containerName] = $this->stopContainer($containerName, $timeout); - } - - $startTime = Carbon::now()->getTimestamp(); - while (count($processes) > 0) { - $finishedProcesses = array_filter($processes, function ($process) { - return ! $process->running(); - }); - foreach (array_keys($finishedProcesses) as $containerName) { - unset($processes[$containerName]); - $this->removeContainer($containerName, $server); - } - - if (Carbon::now()->getTimestamp() - $startTime >= $timeout) { - $this->forceStopRemainingContainers(array_keys($processes), $server); - break; - } - - usleep(100000); - } - } - - private function stopContainer(string $containerName, int $timeout): InvokedProcess - { - return Process::timeout($timeout)->start("docker stop --time=$timeout $containerName"); - } - - private function removeContainer(string $containerName, $server) - { - instant_remote_process(["docker rm -f $containerName"], $server, throwError: false); - } - - private function forceStopRemainingContainers(array $containerNames, $server) - { - foreach ($containerNames as $containerName) { - instant_remote_process(["docker kill $containerName"], $server, throwError: false); - $this->removeContainer($containerName, $server); - } - } -} diff --git a/app/Livewire/Project/Application/PreviewsCompose.php b/app/Livewire/Project/Application/PreviewsCompose.php deleted file mode 100644 index b3e838bb3f..0000000000 --- a/app/Livewire/Project/Application/PreviewsCompose.php +++ /dev/null @@ -1,61 +0,0 @@ -service, 'domain'); - $docker_compose_domains = data_get($this->preview, 'docker_compose_domains'); - $docker_compose_domains = json_decode($docker_compose_domains, true); - $docker_compose_domains[$this->serviceName]['domain'] = $domain; - $this->preview->docker_compose_domains = json_encode($docker_compose_domains); - $this->preview->save(); - $this->dispatch('update_links'); - $this->dispatch('success', 'Domain saved.'); - } - - public function generate() - { - $domains = collect(json_decode($this->preview->application->docker_compose_domains)) ?? collect(); - $domain = $domains->first(function ($_, $key) { - return $key === $this->serviceName; - }); - if ($domain) { - $domain = data_get($domain, 'domain'); - $url = Url::fromString($domain); - $template = $this->preview->application->preview_url_template; - $host = $url->getHost(); - $schema = $url->getScheme(); - $random = new Cuid2; - $preview_fqdn = str_replace('{{random}}', $random, $template); - $preview_fqdn = str_replace('{{domain}}', $host, $preview_fqdn); - $preview_fqdn = str_replace('{{pr_id}}', $this->preview->pull_request_id, $preview_fqdn); - $preview_fqdn = "$schema://$preview_fqdn"; - $docker_compose_domains = data_get($this->preview, 'docker_compose_domains'); - $docker_compose_domains = json_decode($docker_compose_domains, true); - $docker_compose_domains[$this->serviceName]['domain'] = $this->service->domain = $preview_fqdn; - $this->preview->docker_compose_domains = json_encode($docker_compose_domains); - $this->preview->save(); - } - $this->dispatch('update_links'); - $this->dispatch('success', 'Domain generated.'); - } -} diff --git a/app/Livewire/Project/Application/Rollback.php b/app/Livewire/Project/Application/Rollback.php deleted file mode 100644 index ff5db1e08c..0000000000 --- a/app/Livewire/Project/Application/Rollback.php +++ /dev/null @@ -1,80 +0,0 @@ -parameters = get_route_parameters(); - } - - public function rollbackImage($commit) - { - $deployment_uuid = new Cuid2; - - queue_application_deployment( - application: $this->application, - deployment_uuid: $deployment_uuid, - commit: $commit, - rollback: true, - force_rebuild: false, - ); - - return redirect()->route('project.application.deployment.show', [ - 'project_uuid' => $this->parameters['project_uuid'], - 'application_uuid' => $this->parameters['application_uuid'], - 'deployment_uuid' => $deployment_uuid, - 'environment_uuid' => $this->parameters['environment_uuid'], - ]); - } - - public function loadImages($showToast = false) - { - try { - $image = $this->application->docker_registry_image_name ?? $this->application->uuid; - if ($this->application->destination->server->isFunctional()) { - $output = instant_remote_process([ - "docker inspect --format='{{.Config.Image}}' {$this->application->uuid}", - ], $this->application->destination->server, throwError: false); - $current_tag = str($output)->trim()->explode(':'); - $this->current = data_get($current_tag, 1); - - $output = instant_remote_process([ - "docker images --format '{{.Repository}}#{{.Tag}}#{{.CreatedAt}}'", - ], $this->application->destination->server); - $this->images = str($output)->trim()->explode("\n")->filter(function ($item) use ($image) { - return str($item)->contains($image); - })->map(function ($item) { - $item = str($item)->explode('#'); - if ($item[1] === $this->current) { - // $is_current = true; - } - - return [ - 'tag' => $item[1], - 'created_at' => $item[2], - 'is_current' => $is_current ?? null, - ]; - })->toArray(); - } - $showToast && $this->dispatch('success', 'Images loaded.'); - - return []; - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Project/Application/Source.php b/app/Livewire/Project/Application/Source.php deleted file mode 100644 index ade297d501..0000000000 --- a/app/Livewire/Project/Application/Source.php +++ /dev/null @@ -1,95 +0,0 @@ -syncData(); - $this->getPrivateKeys(); - } catch (\Throwable $e) { - handleError($e, $this); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $this->application->update([ - 'git_repository' => $this->gitRepository, - 'git_branch' => $this->gitBranch, - 'git_commit_sha' => $this->gitCommitSha, - 'private_key_id' => $this->privateKeyId, - ]); - } else { - $this->gitRepository = $this->application->git_repository; - $this->gitBranch = $this->application->git_branch; - $this->gitCommitSha = $this->application->git_commit_sha; - $this->privateKeyId = $this->application->private_key_id; - $this->privateKeyName = data_get($this->application, 'private_key.name'); - } - } - - private function getPrivateKeys() - { - $this->privateKeys = PrivateKey::whereTeamId(currentTeam()->id)->get()->reject(function ($key) { - return $key->id == $this->privateKeyId; - }); - } - - public function setPrivateKey(int $privateKeyId) - { - try { - $this->privateKeyId = $privateKeyId; - $this->syncData(true); - $this->getPrivateKeys(); - $this->application->refresh(); - $this->privateKeyName = $this->application->private_key->name; - $this->dispatch('success', 'Private key updated!'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function submit() - { - try { - if (str($this->gitCommitSha)->isEmpty()) { - $this->gitCommitSha = 'HEAD'; - } - $this->syncData(true); - $this->dispatch('success', 'Application source updated!'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Project/Application/Swarm.php b/app/Livewire/Project/Application/Swarm.php deleted file mode 100644 index 197dc41ed3..0000000000 --- a/app/Livewire/Project/Application/Swarm.php +++ /dev/null @@ -1,75 +0,0 @@ -syncData(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $this->application->swarm_replicas = $this->swarmReplicas; - $this->application->swarm_placement_constraints = $this->swarmPlacementConstraints ? base64_encode($this->swarmPlacementConstraints) : null; - $this->application->settings->is_swarm_only_worker_nodes = $this->isSwarmOnlyWorkerNodes; - $this->application->save(); - $this->application->settings->save(); - } else { - $this->swarmReplicas = $this->application->swarm_replicas; - if ($this->application->swarm_placement_constraints) { - $this->swarmPlacementConstraints = base64_decode($this->application->swarm_placement_constraints); - } else { - $this->swarmPlacementConstraints = null; - } - $this->isSwarmOnlyWorkerNodes = $this->application->settings->is_swarm_only_worker_nodes; - } - } - - public function instantSave() - { - try { - $this->syncData(true); - $this->dispatch('success', 'Swarm settings updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function submit() - { - try { - $this->syncData(true); - $this->dispatch('success', 'Swarm settings updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.project.application.swarm'); - } -} diff --git a/app/Livewire/Project/CloneMe.php b/app/Livewire/Project/CloneMe.php deleted file mode 100644 index c71f6db64f..0000000000 --- a/app/Livewire/Project/CloneMe.php +++ /dev/null @@ -1,568 +0,0 @@ - 'Please select a server.', - 'selectedDestination' => 'Please select a server & destination.', - 'newName' => 'Please enter a name for the new project or environment.', - ]; - - public function mount($project_uuid) - { - $this->project_uuid = $project_uuid; - $this->project = Project::where('uuid', $project_uuid)->firstOrFail(); - $this->environment = $this->project->environments->where('uuid', $this->environment_uuid)->first(); - $this->project_id = $this->project->id; - $this->servers = currentTeam()->servers; - $this->newName = str($this->project->name.'-clone-'.(string) new Cuid2)->slug(); - } - - public function toggleVolumeCloning(bool $value) - { - $this->cloneVolumeData = $value; - } - - public function render() - { - return view('livewire.project.clone-me'); - } - - public function selectServer($server_id, $destination_id) - { - if ($server_id == $this->selectedServer && $destination_id == $this->selectedDestination) { - $this->selectedServer = null; - $this->selectedDestination = null; - $this->server = null; - - return; - } - $this->selectedServer = $server_id; - $this->selectedDestination = $destination_id; - $this->server = $this->servers->where('id', $server_id)->first(); - } - - public function clone(string $type) - { - try { - $this->validate([ - 'selectedDestination' => 'required', - 'newName' => 'required', - ]); - if ($type === 'project') { - $foundProject = Project::where('name', $this->newName)->first(); - if ($foundProject) { - throw new \Exception('Project with the same name already exists.'); - } - $project = Project::create([ - 'name' => $this->newName, - 'team_id' => currentTeam()->id, - 'description' => $this->project->description.' (clone)', - ]); - if ($this->environment->name !== 'production') { - $project->environments()->create([ - 'name' => $this->environment->name, - 'uuid' => (string) new Cuid2, - ]); - } - $environment = $project->environments->where('name', $this->environment->name)->first(); - } else { - $foundEnv = $this->project->environments()->where('name', $this->newName)->first(); - if ($foundEnv) { - throw new \Exception('Environment with the same name already exists.'); - } - $project = $this->project; - $environment = $this->project->environments()->create([ - 'name' => $this->newName, - 'uuid' => (string) new Cuid2, - ]); - } - $applications = $this->environment->applications; - $databases = $this->environment->databases(); - $services = $this->environment->services; - foreach ($applications as $application) { - $applicationSettings = $application->settings; - - $uuid = (string) new Cuid2; - $url = $application->fqdn; - if ($this->server->proxyType() !== 'NONE' && $applicationSettings->is_container_label_readonly_enabled === true) { - $url = generateFqdn($this->server, $uuid); - } - - $newApplication = $application->replicate([ - 'id', - 'created_at', - 'updated_at', - 'additional_servers_count', - 'additional_networks_count', - ])->fill([ - 'uuid' => $uuid, - 'fqdn' => $url, - 'status' => 'exited', - 'environment_id' => $environment->id, - 'destination_id' => $this->selectedDestination, - ]); - $newApplication->save(); - - if ($newApplication->destination->server->proxyType() !== 'NONE' && $applicationSettings->is_container_label_readonly_enabled === true) { - $customLabels = str(implode('|coolify|', generateLabelsApplication($newApplication)))->replace('|coolify|', "\n"); - $newApplication->custom_labels = base64_encode($customLabels); - $newApplication->save(); - } - - $newApplication->settings()->delete(); - if ($applicationSettings) { - $newApplicationSettings = $applicationSettings->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'application_id' => $newApplication->id, - ]); - $newApplicationSettings->save(); - } - - $tags = $application->tags; - foreach ($tags as $tag) { - $newApplication->tags()->attach($tag->id); - } - - $scheduledTasks = $application->scheduled_tasks()->get(); - foreach ($scheduledTasks as $task) { - $newTask = $task->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'uuid' => (string) new Cuid2, - 'application_id' => $newApplication->id, - 'team_id' => currentTeam()->id, - ]); - $newTask->save(); - } - - $applicationPreviews = $application->previews()->get(); - foreach ($applicationPreviews as $preview) { - $newPreview = $preview->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'application_id' => $newApplication->id, - 'status' => 'exited', - ]); - $newPreview->save(); - } - - $persistentVolumes = $application->persistentStorages()->get(); - foreach ($persistentVolumes as $volume) { - $newName = ''; - if (str_starts_with($volume->name, $application->uuid)) { - $newName = str($volume->name)->replace($application->uuid, $newApplication->uuid); - } else { - $newName = $newApplication->uuid.'-'.$volume->name; - } - - $newPersistentVolume = $volume->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'name' => $newName, - 'resource_id' => $newApplication->id, - ]); - $newPersistentVolume->save(); - - if ($this->cloneVolumeData) { - try { - StopApplication::dispatch($application, false, false); - $sourceVolume = $volume->name; - $targetVolume = $newPersistentVolume->name; - $sourceServer = $application->destination->server; - $targetServer = $newApplication->destination->server; - - VolumeCloneJob::dispatch($sourceVolume, $targetVolume, $sourceServer, $targetServer, $newPersistentVolume); - - queue_application_deployment( - deployment_uuid: (string) new Cuid2, - application: $application, - server: $sourceServer, - destination: $application->destination, - no_questions_asked: true - ); - } catch (\Exception $e) { - \Log::error('Failed to copy volume data for '.$volume->name.': '.$e->getMessage()); - } - } - } - - $fileStorages = $application->fileStorages()->get(); - foreach ($fileStorages as $storage) { - $newStorage = $storage->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'resource_id' => $newApplication->id, - ]); - $newStorage->save(); - } - - $environmentVaribles = $application->environment_variables()->get(); - foreach ($environmentVaribles as $environmentVarible) { - $newEnvironmentVariable = $environmentVarible->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'resourceable_id' => $newApplication->id, - ]); - $newEnvironmentVariable->save(); - } - } - - foreach ($databases as $database) { - $uuid = (string) new Cuid2; - $newDatabase = $database->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'uuid' => $uuid, - 'status' => 'exited', - 'started_at' => null, - 'environment_id' => $environment->id, - 'destination_id' => $this->selectedDestination, - ]); - $newDatabase->save(); - - $tags = $database->tags; - foreach ($tags as $tag) { - $newDatabase->tags()->attach($tag->id); - } - - $newDatabase->persistentStorages()->delete(); - $persistentVolumes = $database->persistentStorages()->get(); - foreach ($persistentVolumes as $volume) { - $originalName = $volume->name; - $newName = ''; - - if (str_starts_with($originalName, 'postgres-data-')) { - $newName = 'postgres-data-'.$newDatabase->uuid; - } elseif (str_starts_with($originalName, 'mysql-data-')) { - $newName = 'mysql-data-'.$newDatabase->uuid; - } elseif (str_starts_with($originalName, 'redis-data-')) { - $newName = 'redis-data-'.$newDatabase->uuid; - } elseif (str_starts_with($originalName, 'clickhouse-data-')) { - $newName = 'clickhouse-data-'.$newDatabase->uuid; - } elseif (str_starts_with($originalName, 'mariadb-data-')) { - $newName = 'mariadb-data-'.$newDatabase->uuid; - } elseif (str_starts_with($originalName, 'mongodb-data-')) { - $newName = 'mongodb-data-'.$newDatabase->uuid; - } elseif (str_starts_with($originalName, 'keydb-data-')) { - $newName = 'keydb-data-'.$newDatabase->uuid; - } elseif (str_starts_with($originalName, 'dragonfly-data-')) { - $newName = 'dragonfly-data-'.$newDatabase->uuid; - } else { - if (str_starts_with($volume->name, $database->uuid)) { - $newName = str($volume->name)->replace($database->uuid, $newDatabase->uuid); - } else { - $newName = $newDatabase->uuid.'-'.$volume->name; - } - } - - $newPersistentVolume = $volume->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'name' => $newName, - 'resource_id' => $newDatabase->id, - ]); - $newPersistentVolume->save(); - - if ($this->cloneVolumeData) { - try { - StopDatabase::dispatch($database); - $sourceVolume = $volume->name; - $targetVolume = $newPersistentVolume->name; - $sourceServer = $database->destination->server; - $targetServer = $newDatabase->destination->server; - - VolumeCloneJob::dispatch($sourceVolume, $targetVolume, $sourceServer, $targetServer, $newPersistentVolume); - - StartDatabase::dispatch($database); - } catch (\Exception $e) { - \Log::error('Failed to copy volume data for '.$volume->name.': '.$e->getMessage()); - } - } - } - - $fileStorages = $database->fileStorages()->get(); - foreach ($fileStorages as $storage) { - $newStorage = $storage->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'resource_id' => $newDatabase->id, - ]); - $newStorage->save(); - } - - $scheduledBackups = $database->scheduledBackups()->get(); - foreach ($scheduledBackups as $backup) { - $uuid = (string) new Cuid2; - $newBackup = $backup->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'uuid' => $uuid, - 'database_id' => $newDatabase->id, - 'database_type' => $newDatabase->getMorphClass(), - 'team_id' => currentTeam()->id, - ]); - $newBackup->save(); - } - - $environmentVaribles = $database->environment_variables()->get(); - foreach ($environmentVaribles as $environmentVarible) { - $payload = []; - $payload['resourceable_id'] = $newDatabase->id; - $payload['resourceable_type'] = $newDatabase->getMorphClass(); - $newEnvironmentVariable = $environmentVarible->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill($payload); - $newEnvironmentVariable->save(); - } - } - - foreach ($services as $service) { - $uuid = (string) new Cuid2; - $newService = $service->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'uuid' => $uuid, - 'environment_id' => $environment->id, - 'destination_id' => $this->selectedDestination, - ]); - $newService->save(); - - $tags = $service->tags; - foreach ($tags as $tag) { - $newService->tags()->attach($tag->id); - } - - $scheduledTasks = $service->scheduled_tasks()->get(); - foreach ($scheduledTasks as $task) { - $newTask = $task->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'uuid' => (string) new Cuid2, - 'service_id' => $newService->id, - 'team_id' => currentTeam()->id, - ]); - $newTask->save(); - } - - $environmentVariables = $service->environment_variables()->get(); - foreach ($environmentVariables as $environmentVariable) { - $newEnvironmentVariable = $environmentVariable->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'resourceable_id' => $newService->id, - 'resourceable_type' => $newService->getMorphClass(), - ]); - $newEnvironmentVariable->save(); - } - - foreach ($newService->applications() as $application) { - $application->update([ - 'status' => 'exited', - ]); - - $persistentVolumes = $application->persistentStorages()->get(); - foreach ($persistentVolumes as $volume) { - $newName = ''; - if (str_starts_with($volume->name, $application->uuid)) { - $newName = str($volume->name)->replace($application->uuid, $application->uuid); - } else { - $newName = $application->uuid.'-'.$volume->name; - } - - $newPersistentVolume = $volume->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'name' => $newName, - 'resource_id' => $application->id, - ]); - $newPersistentVolume->save(); - - if ($this->cloneVolumeData) { - try { - StopService::dispatch($application, false, false); - $sourceVolume = $volume->name; - $targetVolume = $newPersistentVolume->name; - $sourceServer = $application->service->destination->server; - $targetServer = $newService->destination->server; - - VolumeCloneJob::dispatch($sourceVolume, $targetVolume, $sourceServer, $targetServer, $newPersistentVolume); - - StartService::dispatch($application); - } catch (\Exception $e) { - \Log::error('Failed to copy volume data for '.$volume->name.': '.$e->getMessage()); - } - } - } - - $fileStorages = $application->fileStorages()->get(); - foreach ($fileStorages as $storage) { - $newStorage = $storage->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'resource_id' => $application->id, - ]); - $newStorage->save(); - } - } - - foreach ($newService->databases() as $database) { - $database->update([ - 'status' => 'exited', - ]); - - $persistentVolumes = $database->persistentStorages()->get(); - foreach ($persistentVolumes as $volume) { - $newName = ''; - if (str_starts_with($volume->name, $database->uuid)) { - $newName = str($volume->name)->replace($database->uuid, $database->uuid); - } else { - $newName = $database->uuid.'-'.$volume->name; - } - - $newPersistentVolume = $volume->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'name' => $newName, - 'resource_id' => $database->id, - ]); - $newPersistentVolume->save(); - - if ($this->cloneVolumeData) { - try { - StopService::dispatch($database->service, false, false); - $sourceVolume = $volume->name; - $targetVolume = $newPersistentVolume->name; - $sourceServer = $database->service->destination->server; - $targetServer = $newService->destination->server; - - VolumeCloneJob::dispatch($sourceVolume, $targetVolume, $sourceServer, $targetServer, $newPersistentVolume); - - StartService::dispatch($database->service); - } catch (\Exception $e) { - \Log::error('Failed to copy volume data for '.$volume->name.': '.$e->getMessage()); - } - } - } - - $fileStorages = $database->fileStorages()->get(); - foreach ($fileStorages as $storage) { - $newStorage = $storage->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'resource_id' => $database->id, - ]); - $newStorage->save(); - } - - $scheduledBackups = $database->scheduledBackups()->get(); - foreach ($scheduledBackups as $backup) { - $uuid = (string) new Cuid2; - $newBackup = $backup->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'uuid' => $uuid, - 'database_id' => $database->id, - 'database_type' => $database->getMorphClass(), - 'team_id' => currentTeam()->id, - ]); - $newBackup->save(); - } - } - - $newService->parse(); - } - - } catch (\Exception $e) { - handleError($e, $this); - - return; - } finally { - if (! isset($e)) { - return redirect()->route('project.resource.index', [ - 'project_uuid' => $project->uuid, - 'environment_uuid' => $environment->uuid, - ]); - } - } - } -} diff --git a/app/Livewire/Project/Database/Backup/Execution.php b/app/Livewire/Project/Database/Backup/Execution.php deleted file mode 100644 index 4ac3b2e2c5..0000000000 --- a/app/Livewire/Project/Database/Backup/Execution.php +++ /dev/null @@ -1,48 +0,0 @@ -route('backup_uuid'); - $project = currentTeam()->load(['projects'])->projects->where('uuid', request()->route('project_uuid'))->first(); - if (! $project) { - return redirect()->route('dashboard'); - } - $environment = $project->load(['environments'])->environments->where('uuid', request()->route('environment_uuid'))->first()->load(['applications']); - if (! $environment) { - return redirect()->route('dashboard'); - } - $database = $environment->databases()->where('uuid', request()->route('database_uuid'))->first(); - if (! $database) { - return redirect()->route('dashboard'); - } - $backup = $database->scheduledBackups->where('uuid', $backup_uuid)->first(); - if (! $backup) { - return redirect()->route('dashboard'); - } - $executions = collect($backup->executions)->sortByDesc('created_at'); - $this->database = $database; - $this->backup = $backup; - $this->executions = $executions; - $this->s3s = currentTeam()->s3s; - } - - public function render() - { - return view('livewire.project.database.backup.execution'); - } -} diff --git a/app/Livewire/Project/Database/Backup/Index.php b/app/Livewire/Project/Database/Backup/Index.php deleted file mode 100644 index 2df32ec7bf..0000000000 --- a/app/Livewire/Project/Database/Backup/Index.php +++ /dev/null @@ -1,45 +0,0 @@ -load(['projects'])->projects->where('uuid', request()->route('project_uuid'))->first(); - if (! $project) { - return redirect()->route('dashboard'); - } - $environment = $project->load(['environments'])->environments->where('uuid', request()->route('environment_uuid'))->first()->load(['applications']); - if (! $environment) { - return redirect()->route('dashboard'); - } - $database = $environment->databases()->where('uuid', request()->route('database_uuid'))->first(); - if (! $database) { - return redirect()->route('dashboard'); - } - // No backups - if ( - $database->getMorphClass() === \App\Models\StandaloneRedis::class || - $database->getMorphClass() === \App\Models\StandaloneKeydb::class || - $database->getMorphClass() === \App\Models\StandaloneDragonfly::class || - $database->getMorphClass() === \App\Models\StandaloneClickhouse::class - ) { - return redirect()->route('project.database.configuration', [ - 'project_uuid' => $project->uuid, - 'environment_uuid' => $environment->uuid, - 'database_uuid' => $database->uuid, - ]); - } - $this->database = $database; - } - - public function render() - { - return view('livewire.project.database.backup.index'); - } -} diff --git a/app/Livewire/Project/Database/BackupEdit.php b/app/Livewire/Project/Database/BackupEdit.php deleted file mode 100644 index 0d363e9832..0000000000 --- a/app/Livewire/Project/Database/BackupEdit.php +++ /dev/null @@ -1,218 +0,0 @@ -parameters = get_route_parameters(); - $this->syncData(); - } catch (Exception $e) { - return handleError($e, $this); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->backup->enabled = $this->backupEnabled; - $this->backup->frequency = $this->frequency; - $this->backup->database_backup_retention_amount_locally = $this->databaseBackupRetentionAmountLocally; - $this->backup->database_backup_retention_days_locally = $this->databaseBackupRetentionDaysLocally; - $this->backup->database_backup_retention_max_storage_locally = $this->databaseBackupRetentionMaxStorageLocally; - $this->backup->database_backup_retention_amount_s3 = $this->databaseBackupRetentionAmountS3; - $this->backup->database_backup_retention_days_s3 = $this->databaseBackupRetentionDaysS3; - $this->backup->database_backup_retention_max_storage_s3 = $this->databaseBackupRetentionMaxStorageS3; - $this->backup->save_s3 = $this->saveS3; - $this->backup->s3_storage_id = $this->s3StorageId; - $this->backup->databases_to_backup = $this->databasesToBackup; - $this->backup->dump_all = $this->dumpAll; - $this->customValidate(); - $this->backup->save(); - } else { - $this->backupEnabled = $this->backup->enabled; - $this->frequency = $this->backup->frequency; - $this->timezone = data_get($this->backup->server(), 'settings.server_timezone', 'Instance timezone'); - $this->databaseBackupRetentionAmountLocally = $this->backup->database_backup_retention_amount_locally; - $this->databaseBackupRetentionDaysLocally = $this->backup->database_backup_retention_days_locally; - $this->databaseBackupRetentionMaxStorageLocally = $this->backup->database_backup_retention_max_storage_locally; - $this->databaseBackupRetentionAmountS3 = $this->backup->database_backup_retention_amount_s3; - $this->databaseBackupRetentionDaysS3 = $this->backup->database_backup_retention_days_s3; - $this->databaseBackupRetentionMaxStorageS3 = $this->backup->database_backup_retention_max_storage_s3; - $this->saveS3 = $this->backup->save_s3; - $this->s3StorageId = $this->backup->s3_storage_id; - $this->databasesToBackup = $this->backup->databases_to_backup; - $this->dumpAll = $this->backup->dump_all; - } - } - - public function delete($password) - { - if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) { - if (! Hash::check($password, Auth::user()->password)) { - $this->addError('password', 'The provided password is incorrect.'); - - return; - } - } - - try { - $server = null; - if ($this->backup->database instanceof \App\Models\ServiceDatabase) { - $server = $this->backup->database->service->destination->server; - } elseif ($this->backup->database->destination && $this->backup->database->destination->server) { - $server = $this->backup->database->destination->server; - } - - $filenames = $this->backup->executions() - ->whereNotNull('filename') - ->where('filename', '!=', '') - ->where('scheduled_database_backup_id', $this->backup->id) - ->pluck('filename') - ->filter() - ->all(); - - if (! empty($filenames)) { - if ($this->delete_associated_backups_locally && $server) { - deleteBackupsLocally($filenames, $server); - } - - if ($this->delete_associated_backups_s3 && $this->backup->s3) { - deleteBackupsS3($filenames, $this->backup->s3); - } - } - - $this->backup->delete(); - - if ($this->backup->database->getMorphClass() === \App\Models\ServiceDatabase::class) { - $previousUrl = url()->previous(); - $url = Url::fromString($previousUrl); - $url = $url->withoutQueryParameter('selectedBackupId'); - $url = $url->withFragment('backups'); - $url = $url->getPath()."#{$url->getFragment()}"; - - return redirect($url); - } else { - return redirect()->route('project.database.backup.index', $this->parameters); - } - } catch (\Exception $e) { - $this->dispatch('error', 'Failed to delete backup: '.$e->getMessage()); - - return handleError($e, $this); - } - } - - public function instantSave() - { - try { - $this->syncData(true); - $this->dispatch('success', 'Backup updated successfully.'); - } catch (\Throwable $e) { - $this->dispatch('error', $e->getMessage()); - } - } - - private function customValidate() - { - if (! is_numeric($this->backup->s3_storage_id)) { - $this->backup->s3_storage_id = null; - } - $isValid = validate_cron_expression($this->backup->frequency); - if (! $isValid) { - throw new \Exception('Invalid Cron / Human expression'); - } - $this->validate(); - } - - public function submit() - { - try { - $this->syncData(true); - $this->dispatch('success', 'Backup updated successfully.'); - } catch (\Throwable $e) { - $this->dispatch('error', $e->getMessage()); - } - } - - public function render() - { - return view('livewire.project.database.backup-edit', [ - 'checkboxes' => [ - ['id' => 'delete_associated_backups_locally', 'label' => __('database.delete_backups_locally')], - ['id' => 'delete_associated_backups_s3', 'label' => 'All backups will be permanently deleted (associated with this backup job) from the selected S3 Storage.'], - // ['id' => 'delete_associated_backups_sftp', 'label' => 'All backups associated with this backup job from this database will be permanently deleted from the selected SFTP Storage.'] - ], - ]); - } -} diff --git a/app/Livewire/Project/Database/BackupExecutions.php b/app/Livewire/Project/Database/BackupExecutions.php deleted file mode 100644 index 3fc721fda3..0000000000 --- a/app/Livewire/Project/Database/BackupExecutions.php +++ /dev/null @@ -1,129 +0,0 @@ - 'refreshBackupExecutions', - ]; - } - - public function cleanupFailed() - { - if ($this->backup) { - $this->backup->executions()->where('status', 'failed')->delete(); - $this->refreshBackupExecutions(); - $this->dispatch('success', 'Failed backups cleaned up.'); - } - } - - public function deleteBackup($executionId, $password) - { - if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) { - if (! Hash::check($password, Auth::user()->password)) { - $this->addError('password', 'The provided password is incorrect.'); - - return; - } - } - - $execution = $this->backup->executions()->where('id', $executionId)->first(); - if (is_null($execution)) { - $this->dispatch('error', 'Backup execution not found.'); - - return; - } - - $server = $execution->scheduledDatabaseBackup->database->getMorphClass() === \App\Models\ServiceDatabase::class - ? $execution->scheduledDatabaseBackup->database->service->destination->server - : $execution->scheduledDatabaseBackup->database->destination->server; - - try { - if ($execution->filename) { - deleteBackupsLocally($execution->filename, $server); - - if ($this->delete_backup_s3 && $execution->scheduledDatabaseBackup->s3) { - deleteBackupsS3($execution->filename, $execution->scheduledDatabaseBackup->s3); - } - } - - $execution->delete(); - $this->dispatch('success', 'Backup deleted.'); - $this->refreshBackupExecutions(); - } catch (\Exception $e) { - $this->dispatch('error', 'Failed to delete backup: '.$e->getMessage()); - } - } - - public function download_file($exeuctionId) - { - return redirect()->route('download.backup', $exeuctionId); - } - - public function refreshBackupExecutions(): void - { - if ($this->backup && $this->backup->exists) { - $this->executions = $this->backup->executions()->get()->toArray(); - } else { - $this->executions = []; - } - } - - public function mount(ScheduledDatabaseBackup $backup) - { - $this->backup = $backup; - $this->database = $backup->database; - $this->refreshBackupExecutions(); - } - - public function server() - { - if ($this->database) { - $server = null; - - if ($this->database instanceof \App\Models\ServiceDatabase) { - $server = $this->database->service->destination->server; - } elseif ($this->database->destination && $this->database->destination->server) { - $server = $this->database->destination->server; - } - if ($server) { - return $server; - } - } - - return null; - } - - public function render() - { - return view('livewire.project.database.backup-executions', [ - 'checkboxes' => [ - ['id' => 'delete_backup_s3', 'label' => 'Delete the selected backup permanently form S3 Storage'], - // ['id' => 'delete_backup_sftp', 'label' => 'Delete the selected backup permanently form SFTP Storage'], - ], - ]); - } -} diff --git a/app/Livewire/Project/Database/BackupNow.php b/app/Livewire/Project/Database/BackupNow.php deleted file mode 100644 index 3cd3605623..0000000000 --- a/app/Livewire/Project/Database/BackupNow.php +++ /dev/null @@ -1,17 +0,0 @@ -backup); - $this->dispatch('success', 'Backup queued. It will be available in a few minutes.'); - } -} diff --git a/app/Livewire/Project/Database/Clickhouse/General.php b/app/Livewire/Project/Database/Clickhouse/General.php deleted file mode 100644 index 2d39c5151f..0000000000 --- a/app/Livewire/Project/Database/Clickhouse/General.php +++ /dev/null @@ -1,182 +0,0 @@ -currentTeam()->id; - - return [ - "echo-private:team.{$teamId},DatabaseProxyStopped" => 'databaseProxyStopped', - ]; - } - - public function mount() - { - try { - $this->syncData(); - $this->server = data_get($this->database, 'destination.server'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $this->database->name = $this->name; - $this->database->description = $this->description; - $this->database->clickhouse_admin_user = $this->clickhouseAdminUser; - $this->database->clickhouse_admin_password = $this->clickhouseAdminPassword; - $this->database->image = $this->image; - $this->database->ports_mappings = $this->portsMappings; - $this->database->is_public = $this->isPublic; - $this->database->public_port = $this->publicPort; - $this->database->custom_docker_run_options = $this->customDockerRunOptions; - $this->database->is_log_drain_enabled = $this->isLogDrainEnabled; - $this->database->save(); - - $this->dbUrl = $this->database->internal_db_url; - $this->dbUrlPublic = $this->database->external_db_url; - } else { - $this->name = $this->database->name; - $this->description = $this->database->description; - $this->clickhouseAdminUser = $this->database->clickhouse_admin_user; - $this->clickhouseAdminPassword = $this->database->clickhouse_admin_password; - $this->image = $this->database->image; - $this->portsMappings = $this->database->ports_mappings; - $this->isPublic = $this->database->is_public; - $this->publicPort = $this->database->public_port; - $this->customDockerRunOptions = $this->database->custom_docker_run_options; - $this->isLogDrainEnabled = $this->database->is_log_drain_enabled; - $this->dbUrl = $this->database->internal_db_url; - $this->dbUrlPublic = $this->database->external_db_url; - } - } - - public function instantSaveAdvanced() - { - try { - if (! $this->server->isLogDrainEnabled()) { - $this->isLogDrainEnabled = false; - $this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.'); - - return; - } - $this->syncData(true); - - $this->dispatch('success', 'Database updated.'); - $this->dispatch('success', 'You need to restart the service for the changes to take effect.'); - } catch (Exception $e) { - return handleError($e, $this); - } - } - - public function instantSave() - { - try { - if ($this->isPublic && ! $this->publicPort) { - $this->dispatch('error', 'Public port is required.'); - $this->isPublic = false; - - return; - } - if ($this->isPublic) { - if (! str($this->database->status)->startsWith('running')) { - $this->dispatch('error', 'Database must be started to be publicly accessible.'); - $this->isPublic = false; - - return; - } - StartDatabaseProxy::run($this->database); - $this->dispatch('success', 'Database is now publicly accessible.'); - } else { - StopDatabaseProxy::run($this->database); - $this->dispatch('success', 'Database is no longer publicly accessible.'); - } - $this->dbUrlPublic = $this->database->external_db_url; - $this->syncData(true); - } catch (\Throwable $e) { - $this->isPublic = ! $this->isPublic; - $this->syncData(true); - - return handleError($e, $this); - } - } - - public function databaseProxyStopped() - { - $this->syncData(); - } - - public function submit() - { - try { - if (str($this->publicPort)->isEmpty()) { - $this->publicPort = null; - } - $this->syncData(true); - $this->dispatch('success', 'Database updated.'); - } catch (Exception $e) { - return handleError($e, $this); - } finally { - if (is_null($this->database->config_hash)) { - $this->database->isConfigurationChanged(true); - } else { - $this->dispatch('configurationChanged'); - } - } - } -} diff --git a/app/Livewire/Project/Database/Configuration.php b/app/Livewire/Project/Database/Configuration.php deleted file mode 100644 index 938abba549..0000000000 --- a/app/Livewire/Project/Database/Configuration.php +++ /dev/null @@ -1,47 +0,0 @@ -currentRoute = request()->route()->getName(); - - $project = currentTeam() - ->projects() - ->select('id', 'uuid', 'team_id') - ->where('uuid', request()->route('project_uuid')) - ->firstOrFail(); - $environment = $project->environments() - ->select('id', 'name', 'project_id', 'uuid') - ->where('uuid', request()->route('environment_uuid')) - ->firstOrFail(); - $database = $environment->databases() - ->where('uuid', request()->route('database_uuid')) - ->firstOrFail(); - - $this->database = $database; - $this->project = $project; - $this->environment = $environment; - if (str($this->database->status)->startsWith('running') && is_null($this->database->config_hash)) { - $this->database->isConfigurationChanged(true); - $this->dispatch('configurationChanged'); - } - } - - public function render() - { - return view('livewire.project.database.configuration'); - } -} diff --git a/app/Livewire/Project/Database/CreateScheduledBackup.php b/app/Livewire/Project/Database/CreateScheduledBackup.php deleted file mode 100644 index 01108c2900..0000000000 --- a/app/Livewire/Project/Database/CreateScheduledBackup.php +++ /dev/null @@ -1,84 +0,0 @@ -definedS3s = currentTeam()->s3s; - if ($this->definedS3s->count() > 0) { - $this->s3StorageId = $this->definedS3s->first()->id; - } - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function submit() - { - try { - $this->validate(); - - $isValid = validate_cron_expression($this->frequency); - if (! $isValid) { - $this->dispatch('error', 'Invalid Cron / Human expression.'); - - return; - } - - $payload = [ - 'enabled' => true, - 'frequency' => $this->frequency, - 'save_s3' => $this->saveToS3, - 's3_storage_id' => $this->s3StorageId, - 'database_id' => $this->database->id, - 'database_type' => $this->database->getMorphClass(), - 'team_id' => currentTeam()->id, - ]; - - if ($this->database->type() === 'standalone-postgresql') { - $payload['databases_to_backup'] = $this->database->postgres_db; - } elseif ($this->database->type() === 'standalone-mysql') { - $payload['databases_to_backup'] = $this->database->mysql_database; - } elseif ($this->database->type() === 'standalone-mariadb') { - $payload['databases_to_backup'] = $this->database->mariadb_database; - } - - $databaseBackup = ScheduledDatabaseBackup::create($payload); - if ($this->database->getMorphClass() === \App\Models\ServiceDatabase::class) { - $this->dispatch('refreshScheduledBackups', $databaseBackup->id); - } else { - $this->dispatch('refreshScheduledBackups'); - } - - } catch (\Throwable $e) { - return handleError($e, $this); - } finally { - $this->frequency = ''; - } - } -} diff --git a/app/Livewire/Project/Database/Dragonfly/General.php b/app/Livewire/Project/Database/Dragonfly/General.php deleted file mode 100644 index ea6cd46b04..0000000000 --- a/app/Livewire/Project/Database/Dragonfly/General.php +++ /dev/null @@ -1,177 +0,0 @@ -currentTeam()->id; - - return [ - "echo-private:team.{$teamId},DatabaseProxyStopped" => 'databaseProxyStopped', - ]; - } - - public function mount() - { - try { - $this->syncData(); - $this->server = data_get($this->database, 'destination.server'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $this->database->name = $this->name; - $this->database->description = $this->description; - $this->database->dragonfly_password = $this->dragonflyPassword; - $this->database->image = $this->image; - $this->database->ports_mappings = $this->portsMappings; - $this->database->is_public = $this->isPublic; - $this->database->public_port = $this->publicPort; - $this->database->custom_docker_run_options = $this->customDockerRunOptions; - $this->database->is_log_drain_enabled = $this->isLogDrainEnabled; - $this->database->save(); - - $this->dbUrl = $this->database->internal_db_url; - $this->dbUrlPublic = $this->database->external_db_url; - } else { - $this->name = $this->database->name; - $this->description = $this->database->description; - $this->dragonflyPassword = $this->database->dragonfly_password; - $this->image = $this->database->image; - $this->portsMappings = $this->database->ports_mappings; - $this->isPublic = $this->database->is_public; - $this->publicPort = $this->database->public_port; - $this->customDockerRunOptions = $this->database->custom_docker_run_options; - $this->isLogDrainEnabled = $this->database->is_log_drain_enabled; - $this->dbUrl = $this->database->internal_db_url; - $this->dbUrlPublic = $this->database->external_db_url; - } - } - - public function instantSaveAdvanced() - { - try { - if (! $this->server->isLogDrainEnabled()) { - $this->isLogDrainEnabled = false; - $this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.'); - - return; - } - $this->syncData(true); - - $this->dispatch('success', 'Database updated.'); - $this->dispatch('success', 'You need to restart the service for the changes to take effect.'); - } catch (Exception $e) { - return handleError($e, $this); - } - } - - public function instantSave() - { - try { - if ($this->isPublic && ! $this->publicPort) { - $this->dispatch('error', 'Public port is required.'); - $this->isPublic = false; - - return; - } - if ($this->isPublic) { - if (! str($this->database->status)->startsWith('running')) { - $this->dispatch('error', 'Database must be started to be publicly accessible.'); - $this->isPublic = false; - - return; - } - StartDatabaseProxy::run($this->database); - $this->dispatch('success', 'Database is now publicly accessible.'); - } else { - StopDatabaseProxy::run($this->database); - $this->dispatch('success', 'Database is no longer publicly accessible.'); - } - $this->dbUrlPublic = $this->database->external_db_url; - $this->syncData(true); - } catch (\Throwable $e) { - $this->isPublic = ! $this->isPublic; - $this->syncData(true); - - return handleError($e, $this); - } - } - - public function databaseProxyStopped() - { - $this->syncData(); - } - - public function submit() - { - try { - if (str($this->publicPort)->isEmpty()) { - $this->publicPort = null; - } - $this->syncData(true); - $this->dispatch('success', 'Database updated.'); - } catch (Exception $e) { - return handleError($e, $this); - } finally { - if (is_null($this->database->config_hash)) { - $this->database->isConfigurationChanged(true); - } else { - $this->dispatch('configurationChanged'); - } - } - } -} diff --git a/app/Livewire/Project/Database/Heading.php b/app/Livewire/Project/Database/Heading.php deleted file mode 100644 index c3b57b9f4d..0000000000 --- a/app/Livewire/Project/Database/Heading.php +++ /dev/null @@ -1,88 +0,0 @@ - 'activityFinished', - ]; - } - - public function activityFinished() - { - $this->database->update([ - 'started_at' => now(), - ]); - $this->dispatch('refresh'); - $this->check_status(); - if (is_null($this->database->config_hash) || $this->database->isConfigurationChanged()) { - $this->database->isConfigurationChanged(true); - $this->dispatch('configurationChanged'); - } else { - $this->dispatch('configurationChanged'); - } - } - - public function check_status($showNotification = false) - { - if ($this->database->destination->server->isFunctional()) { - GetContainersStatus::dispatch($this->database->destination->server); - } - - if ($showNotification) { - $this->dispatch('success', 'Database status updated.'); - } - } - - public function mount() - { - $this->parameters = get_route_parameters(); - } - - public function stop() - { - StopDatabase::run($this->database, false, $this->docker_cleanup); - $this->database->status = 'exited'; - $this->database->save(); - $this->check_status(); - } - - public function restart() - { - $activity = RestartDatabase::run($this->database); - $this->dispatch('activityMonitor', $activity->id); - } - - public function start() - { - $activity = StartDatabase::run($this->database); - $this->dispatch('activityMonitor', $activity->id); - } - - public function render() - { - return view('livewire.project.database.heading', [ - 'checkboxes' => [ - ['id' => 'docker_cleanup', 'label' => __('resource.docker_cleanup')], - ], - ]); - } -} diff --git a/app/Livewire/Project/Database/Import.php b/app/Livewire/Project/Database/Import.php deleted file mode 100644 index eb80ca6f6f..0000000000 --- a/app/Livewire/Project/Database/Import.php +++ /dev/null @@ -1,253 +0,0 @@ - '$refresh', - ]; - } - - public function mount() - { - if (isDev()) { - $this->customLocation = '/data/coolify/pg-dump-all-1736245863.gz'; - } - $this->parameters = get_route_parameters(); - $this->getContainers(); - } - - public function updatedDumpAll($value) - { - switch ($this->resource->getMorphClass()) { - case \App\Models\StandaloneMariadb::class: - if ($value === true) { - $this->mariadbRestoreCommand = <<<'EOD' -for pid in $(mariadb -u root -p$MARIADB_ROOT_PASSWORD -N -e "SELECT id FROM information_schema.processlist WHERE user != 'root';"); do - mariadb -u root -p$MARIADB_ROOT_PASSWORD -e "KILL $pid" 2>/dev/null || true -done && \ -mariadb -u root -p$MARIADB_ROOT_PASSWORD -N -e "SELECT CONCAT('DROP DATABASE IF EXISTS \`',schema_name,'\`;') FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql','performance_schema','sys');" | mariadb -u root -p$MARIADB_ROOT_PASSWORD && \ -mariadb -u root -p$MARIADB_ROOT_PASSWORD -e "CREATE DATABASE IF NOT EXISTS \`default\`;" && \ -(gunzip -cf $tmpPath 2>/dev/null || cat $tmpPath) | sed -e '/^CREATE DATABASE/d' -e '/^USE \`mysql\`/d' | mariadb -u root -p$MARIADB_ROOT_PASSWORD default -EOD; - $this->restoreCommandText = $this->mariadbRestoreCommand.' && (gunzip -cf 2>/dev/null || cat ) | mariadb -u root -p$MARIADB_ROOT_PASSWORD default'; - } else { - $this->mariadbRestoreCommand = 'mariadb -u $MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE'; - } - break; - case \App\Models\StandaloneMysql::class: - if ($value === true) { - $this->mysqlRestoreCommand = <<<'EOD' -for pid in $(mysql -u root -p$MYSQL_ROOT_PASSWORD -N -e "SELECT id FROM information_schema.processlist WHERE user != 'root';"); do - mysql -u root -p$MYSQL_ROOT_PASSWORD -e "KILL $pid" 2>/dev/null || true -done && \ -mysql -u root -p$MYSQL_ROOT_PASSWORD -N -e "SELECT CONCAT('DROP DATABASE IF EXISTS \`',schema_name,'\`;') FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql','performance_schema','sys');" | mysql -u root -p$MYSQL_ROOT_PASSWORD && \ -mysql -u root -p$MYSQL_ROOT_PASSWORD -e "CREATE DATABASE IF NOT EXISTS \`default\`;" && \ -(gunzip -cf $tmpPath 2>/dev/null || cat $tmpPath) | sed -e '/^CREATE DATABASE/d' -e '/^USE \`mysql\`/d' | mysql -u root -p$MYSQL_ROOT_PASSWORD default -EOD; - $this->restoreCommandText = $this->mysqlRestoreCommand.' && (gunzip -cf 2>/dev/null || cat ) | mysql -u root -p$MYSQL_ROOT_PASSWORD default'; - } else { - $this->mysqlRestoreCommand = 'mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE'; - } - break; - case \App\Models\StandalonePostgresql::class: - if ($value === true) { - $this->postgresqlRestoreCommand = <<<'EOD' -psql -U $POSTGRES_USER -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname IS NOT NULL AND pid <> pg_backend_pid()" && \ -psql -U $POSTGRES_USER -t -c "SELECT datname FROM pg_database WHERE NOT datistemplate" | xargs -I {} dropdb -U $POSTGRES_USER --if-exists {} && \ -createdb -U $POSTGRES_USER postgres -EOD; - $this->restoreCommandText = $this->postgresqlRestoreCommand.' && (gunzip -cf 2>/dev/null || cat ) | psql -U $POSTGRES_USER postgres'; - } else { - $this->postgresqlRestoreCommand = 'pg_restore -U $POSTGRES_USER -d $POSTGRES_DB'; - } - break; - } - - } - - public function getContainers() - { - $this->containers = collect(); - if (! data_get($this->parameters, 'database_uuid')) { - abort(404); - } - $resource = getResourceByUuid($this->parameters['database_uuid'], data_get(auth()->user()->currentTeam(), 'id')); - if (is_null($resource)) { - abort(404); - } - $this->resource = $resource; - $this->server = $this->resource->destination->server; - $this->container = $this->resource->uuid; - if (str(data_get($this, 'resource.status'))->startsWith('running')) { - $this->containers->push($this->container); - } - - if ( - $this->resource->getMorphClass() === \App\Models\StandaloneRedis::class || - $this->resource->getMorphClass() === \App\Models\StandaloneKeydb::class || - $this->resource->getMorphClass() === \App\Models\StandaloneDragonfly::class || - $this->resource->getMorphClass() === \App\Models\StandaloneClickhouse::class - ) { - $this->unsupported = true; - } - } - - public function checkFile() - { - if (filled($this->customLocation)) { - try { - $result = instant_remote_process(["ls -l {$this->customLocation}"], $this->server, throwError: false); - if (blank($result)) { - $this->dispatch('error', 'The file does not exist or has been deleted.'); - - return; - } - $this->filename = $this->customLocation; - $this->dispatch('success', 'The file exists.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - } - - public function runImport() - { - if ($this->filename === '') { - $this->dispatch('error', 'Please select a file to import.'); - - return; - } - try { - $this->importCommands = []; - if (filled($this->customLocation)) { - $backupFileName = '/tmp/restore_'.$this->resource->uuid; - $this->importCommands[] = "docker cp {$this->customLocation} {$this->container}:{$backupFileName}"; - $tmpPath = $backupFileName; - } else { - $backupFileName = "upload/{$this->resource->uuid}/restore"; - $path = Storage::path($backupFileName); - if (! Storage::exists($backupFileName)) { - $this->dispatch('error', 'The file does not exist or has been deleted.'); - - return; - } - $tmpPath = '/tmp/'.basename($backupFileName).'_'.$this->resource->uuid; - instant_scp($path, $tmpPath, $this->server); - Storage::delete($backupFileName); - $this->importCommands[] = "docker cp {$tmpPath} {$this->container}:{$tmpPath}"; - } - - // Copy the restore command to a script file - $scriptPath = "/tmp/restore_{$this->resource->uuid}.sh"; - - switch ($this->resource->getMorphClass()) { - case \App\Models\StandaloneMariadb::class: - $restoreCommand = $this->mariadbRestoreCommand; - if ($this->dumpAll) { - $restoreCommand .= " && (gunzip -cf {$tmpPath} 2>/dev/null || cat {$tmpPath}) | mariadb -u root -p\$MARIADB_ROOT_PASSWORD"; - } else { - $restoreCommand .= " < {$tmpPath}"; - } - break; - case \App\Models\StandaloneMysql::class: - $restoreCommand = $this->mysqlRestoreCommand; - if ($this->dumpAll) { - $restoreCommand .= " && (gunzip -cf {$tmpPath} 2>/dev/null || cat {$tmpPath}) | mysql -u root -p\$MYSQL_ROOT_PASSWORD"; - } else { - $restoreCommand .= " < {$tmpPath}"; - } - break; - case \App\Models\StandalonePostgresql::class: - $restoreCommand = $this->postgresqlRestoreCommand; - if ($this->dumpAll) { - $restoreCommand .= " && (gunzip -cf {$tmpPath} 2>/dev/null || cat {$tmpPath}) | psql -U \$POSTGRES_USER postgres"; - } else { - $restoreCommand .= " {$tmpPath}"; - } - break; - case \App\Models\StandaloneMongodb::class: - $restoreCommand = $this->mongodbRestoreCommand; - if ($this->dumpAll === false) { - $restoreCommand .= "{$tmpPath}"; - } - break; - } - - $restoreCommandBase64 = base64_encode($restoreCommand); - $this->importCommands[] = "echo \"{$restoreCommandBase64}\" | base64 -d > {$scriptPath}"; - $this->importCommands[] = "chmod +x {$scriptPath}"; - $this->importCommands[] = "docker cp {$scriptPath} {$this->container}:{$scriptPath}"; - - $this->importCommands[] = "docker exec {$this->container} sh -c '{$scriptPath}'"; - $this->importCommands[] = "docker exec {$this->container} sh -c 'echo \"Import finished with exit code $?\"'"; - - if (! empty($this->importCommands)) { - $activity = remote_process($this->importCommands, $this->server, ignore_errors: true, callEventOnFinish: 'RestoreJobFinished', callEventData: [ - 'scriptPath' => $scriptPath, - 'tmpPath' => $tmpPath, - 'container' => $this->container, - 'serverId' => $this->server->id, - ]); - $this->dispatch('activityMonitor', $activity->id); - } - } catch (\Throwable $e) { - return handleError($e, $this); - } finally { - $this->filename = null; - $this->importCommands = []; - } - } -} diff --git a/app/Livewire/Project/Database/InitScript.php b/app/Livewire/Project/Database/InitScript.php deleted file mode 100644 index e3baa1c8ee..0000000000 --- a/app/Livewire/Project/Database/InitScript.php +++ /dev/null @@ -1,56 +0,0 @@ -index = data_get($this->script, 'index'); - $this->filename = data_get($this->script, 'filename'); - $this->content = data_get($this->script, 'content'); - } catch (Exception $e) { - return handleError($e, $this); - } - } - - public function submit() - { - try { - $this->validate(); - $this->script['index'] = $this->index; - $this->script['content'] = $this->content; - $this->script['filename'] = $this->filename; - $this->dispatch('save_init_script', $this->script); - } catch (Exception $e) { - return handleError($e, $this); - } - } - - public function delete() - { - try { - $this->dispatch('delete_init_script', $this->script); - } catch (Exception $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Project/Database/Keydb/General.php b/app/Livewire/Project/Database/Keydb/General.php deleted file mode 100644 index e768495eb8..0000000000 --- a/app/Livewire/Project/Database/Keydb/General.php +++ /dev/null @@ -1,182 +0,0 @@ -currentTeam()->id; - - return [ - "echo-private:team.{$teamId},DatabaseProxyStopped" => 'databaseProxyStopped', - ]; - } - - public function mount() - { - try { - $this->syncData(); - $this->server = data_get($this->database, 'destination.server'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $this->database->name = $this->name; - $this->database->description = $this->description; - $this->database->keydb_conf = $this->keydbConf; - $this->database->keydb_password = $this->keydbPassword; - $this->database->image = $this->image; - $this->database->ports_mappings = $this->portsMappings; - $this->database->is_public = $this->isPublic; - $this->database->public_port = $this->publicPort; - $this->database->custom_docker_run_options = $this->customDockerRunOptions; - $this->database->is_log_drain_enabled = $this->isLogDrainEnabled; - $this->database->save(); - - $this->dbUrl = $this->database->internal_db_url; - $this->dbUrlPublic = $this->database->external_db_url; - } else { - $this->name = $this->database->name; - $this->description = $this->database->description; - $this->keydbConf = $this->database->keydb_conf; - $this->keydbPassword = $this->database->keydb_password; - $this->image = $this->database->image; - $this->portsMappings = $this->database->ports_mappings; - $this->isPublic = $this->database->is_public; - $this->publicPort = $this->database->public_port; - $this->customDockerRunOptions = $this->database->custom_docker_run_options; - $this->isLogDrainEnabled = $this->database->is_log_drain_enabled; - $this->dbUrl = $this->database->internal_db_url; - $this->dbUrlPublic = $this->database->external_db_url; - } - } - - public function instantSaveAdvanced() - { - try { - if (! $this->server->isLogDrainEnabled()) { - $this->isLogDrainEnabled = false; - $this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.'); - - return; - } - $this->syncData(true); - - $this->dispatch('success', 'Database updated.'); - $this->dispatch('success', 'You need to restart the service for the changes to take effect.'); - } catch (Exception $e) { - return handleError($e, $this); - } - } - - public function instantSave() - { - try { - if ($this->isPublic && ! $this->publicPort) { - $this->dispatch('error', 'Public port is required.'); - $this->isPublic = false; - - return; - } - if ($this->isPublic) { - if (! str($this->database->status)->startsWith('running')) { - $this->dispatch('error', 'Database must be started to be publicly accessible.'); - $this->isPublic = false; - - return; - } - StartDatabaseProxy::run($this->database); - $this->dispatch('success', 'Database is now publicly accessible.'); - } else { - StopDatabaseProxy::run($this->database); - $this->dispatch('success', 'Database is no longer publicly accessible.'); - } - $this->dbUrlPublic = $this->database->external_db_url; - $this->syncData(true); - } catch (\Throwable $e) { - $this->isPublic = ! $this->isPublic; - $this->syncData(true); - - return handleError($e, $this); - } - } - - public function databaseProxyStopped() - { - $this->syncData(); - } - - public function submit() - { - try { - if (str($this->publicPort)->isEmpty()) { - $this->publicPort = null; - } - $this->syncData(true); - $this->dispatch('success', 'Database updated.'); - } catch (Exception $e) { - return handleError($e, $this); - } finally { - if (is_null($this->database->config_hash)) { - $this->database->isConfigurationChanged(true); - } else { - $this->dispatch('configurationChanged'); - } - } - } -} diff --git a/app/Livewire/Project/Database/Mariadb/General.php b/app/Livewire/Project/Database/Mariadb/General.php deleted file mode 100644 index c9d473223f..0000000000 --- a/app/Livewire/Project/Database/Mariadb/General.php +++ /dev/null @@ -1,139 +0,0 @@ - 'required', - 'database.description' => 'nullable', - 'database.mariadb_root_password' => 'required', - 'database.mariadb_user' => 'required', - 'database.mariadb_password' => 'required', - 'database.mariadb_database' => 'required', - 'database.mariadb_conf' => 'nullable', - 'database.image' => 'required', - 'database.ports_mappings' => 'nullable', - 'database.is_public' => 'nullable|boolean', - 'database.public_port' => 'nullable|integer', - 'database.is_log_drain_enabled' => 'nullable|boolean', - 'database.custom_docker_run_options' => 'nullable', - ]; - - protected $validationAttributes = [ - 'database.name' => 'Name', - 'database.description' => 'Description', - 'database.mariadb_root_password' => 'Root Password', - 'database.mariadb_user' => 'User', - 'database.mariadb_password' => 'Password', - 'database.mariadb_database' => 'Database', - 'database.mariadb_conf' => 'MariaDB Configuration', - 'database.image' => 'Image', - 'database.ports_mappings' => 'Port Mapping', - 'database.is_public' => 'Is Public', - 'database.public_port' => 'Public Port', - 'database.custom_docker_run_options' => 'Custom Docker Options', - ]; - - public function mount() - { - $this->db_url = $this->database->internal_db_url; - $this->db_url_public = $this->database->external_db_url; - $this->server = data_get($this->database, 'destination.server'); - } - - public function instantSaveAdvanced() - { - try { - if (! $this->server->isLogDrainEnabled()) { - $this->database->is_log_drain_enabled = false; - $this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.'); - - return; - } - $this->database->save(); - $this->dispatch('success', 'Database updated.'); - $this->dispatch('success', 'You need to restart the service for the changes to take effect.'); - } catch (Exception $e) { - return handleError($e, $this); - } - } - - public function submit() - { - try { - if (str($this->database->public_port)->isEmpty()) { - $this->database->public_port = null; - } - $this->validate(); - $this->database->save(); - $this->dispatch('success', 'Database updated.'); - } catch (Exception $e) { - return handleError($e, $this); - } finally { - if (is_null($this->database->config_hash)) { - $this->database->isConfigurationChanged(true); - } else { - $this->dispatch('configurationChanged'); - } - } - } - - public function instantSave() - { - try { - if ($this->database->is_public && ! $this->database->public_port) { - $this->dispatch('error', 'Public port is required.'); - $this->database->is_public = false; - - return; - } - if ($this->database->is_public) { - if (! str($this->database->status)->startsWith('running')) { - $this->dispatch('error', 'Database must be started to be publicly accessible.'); - $this->database->is_public = false; - - return; - } - StartDatabaseProxy::run($this->database); - $this->dispatch('success', 'Database is now publicly accessible.'); - } else { - StopDatabaseProxy::run($this->database); - $this->dispatch('success', 'Database is no longer publicly accessible.'); - } - $this->db_url_public = $this->database->external_db_url; - $this->database->save(); - } catch (\Throwable $e) { - $this->database->is_public = ! $this->database->is_public; - - return handleError($e, $this); - } - } - - public function refresh(): void - { - $this->database->refresh(); - } - - public function render() - { - return view('livewire.project.database.mariadb.general'); - } -} diff --git a/app/Livewire/Project/Database/Mongodb/General.php b/app/Livewire/Project/Database/Mongodb/General.php deleted file mode 100644 index e19895dae6..0000000000 --- a/app/Livewire/Project/Database/Mongodb/General.php +++ /dev/null @@ -1,140 +0,0 @@ - 'required', - 'database.description' => 'nullable', - 'database.mongo_conf' => 'nullable', - 'database.mongo_initdb_root_username' => 'required', - 'database.mongo_initdb_root_password' => 'required', - 'database.mongo_initdb_database' => 'required', - 'database.image' => 'required', - 'database.ports_mappings' => 'nullable', - 'database.is_public' => 'nullable|boolean', - 'database.public_port' => 'nullable|integer', - 'database.is_log_drain_enabled' => 'nullable|boolean', - 'database.custom_docker_run_options' => 'nullable', - ]; - - protected $validationAttributes = [ - 'database.name' => 'Name', - 'database.description' => 'Description', - 'database.mongo_conf' => 'Mongo Configuration', - 'database.mongo_initdb_root_username' => 'Root Username', - 'database.mongo_initdb_root_password' => 'Root Password', - 'database.mongo_initdb_database' => 'Database', - 'database.image' => 'Image', - 'database.ports_mappings' => 'Port Mapping', - 'database.is_public' => 'Is Public', - 'database.public_port' => 'Public Port', - 'database.custom_docker_run_options' => 'Custom Docker Run Options', - ]; - - public function mount() - { - $this->db_url = $this->database->internal_db_url; - $this->db_url_public = $this->database->external_db_url; - $this->server = data_get($this->database, 'destination.server'); - } - - public function instantSaveAdvanced() - { - try { - if (! $this->server->isLogDrainEnabled()) { - $this->database->is_log_drain_enabled = false; - $this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.'); - - return; - } - $this->database->save(); - $this->dispatch('success', 'Database updated.'); - $this->dispatch('success', 'You need to restart the service for the changes to take effect.'); - } catch (Exception $e) { - return handleError($e, $this); - } - } - - public function submit() - { - try { - if (str($this->database->public_port)->isEmpty()) { - $this->database->public_port = null; - } - if (str($this->database->mongo_conf)->isEmpty()) { - $this->database->mongo_conf = null; - } - $this->validate(); - $this->database->save(); - $this->dispatch('success', 'Database updated.'); - } catch (Exception $e) { - return handleError($e, $this); - } finally { - if (is_null($this->database->config_hash)) { - $this->database->isConfigurationChanged(true); - } else { - $this->dispatch('configurationChanged'); - } - } - } - - public function instantSave() - { - try { - if ($this->database->is_public && ! $this->database->public_port) { - $this->dispatch('error', 'Public port is required.'); - $this->database->is_public = false; - - return; - } - if ($this->database->is_public) { - if (! str($this->database->status)->startsWith('running')) { - $this->dispatch('error', 'Database must be started to be publicly accessible.'); - $this->database->is_public = false; - - return; - } - StartDatabaseProxy::run($this->database); - $this->dispatch('success', 'Database is now publicly accessible.'); - } else { - StopDatabaseProxy::run($this->database); - $this->dispatch('success', 'Database is no longer publicly accessible.'); - } - $this->db_url_public = $this->database->external_db_url; - $this->database->save(); - } catch (\Throwable $e) { - $this->database->is_public = ! $this->database->is_public; - - return handleError($e, $this); - } - } - - public function refresh(): void - { - $this->database->refresh(); - } - - public function render() - { - return view('livewire.project.database.mongodb.general'); - } -} diff --git a/app/Livewire/Project/Database/Mysql/General.php b/app/Livewire/Project/Database/Mysql/General.php deleted file mode 100644 index 7d5270ddf5..0000000000 --- a/app/Livewire/Project/Database/Mysql/General.php +++ /dev/null @@ -1,139 +0,0 @@ - 'required', - 'database.description' => 'nullable', - 'database.mysql_root_password' => 'required', - 'database.mysql_user' => 'required', - 'database.mysql_password' => 'required', - 'database.mysql_database' => 'required', - 'database.mysql_conf' => 'nullable', - 'database.image' => 'required', - 'database.ports_mappings' => 'nullable', - 'database.is_public' => 'nullable|boolean', - 'database.public_port' => 'nullable|integer', - 'database.is_log_drain_enabled' => 'nullable|boolean', - 'database.custom_docker_run_options' => 'nullable', - ]; - - protected $validationAttributes = [ - 'database.name' => 'Name', - 'database.description' => 'Description', - 'database.mysql_root_password' => 'Root Password', - 'database.mysql_user' => 'User', - 'database.mysql_password' => 'Password', - 'database.mysql_database' => 'Database', - 'database.mysql_conf' => 'MySQL Configuration', - 'database.image' => 'Image', - 'database.ports_mappings' => 'Port Mapping', - 'database.is_public' => 'Is Public', - 'database.public_port' => 'Public Port', - 'database.custom_docker_run_options' => 'Custom Docker Run Options', - ]; - - public function mount() - { - $this->db_url = $this->database->internal_db_url; - $this->db_url_public = $this->database->external_db_url; - $this->server = data_get($this->database, 'destination.server'); - } - - public function instantSaveAdvanced() - { - try { - if (! $this->server->isLogDrainEnabled()) { - $this->database->is_log_drain_enabled = false; - $this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.'); - - return; - } - $this->database->save(); - $this->dispatch('success', 'Database updated.'); - $this->dispatch('success', 'You need to restart the service for the changes to take effect.'); - } catch (Exception $e) { - return handleError($e, $this); - } - } - - public function submit() - { - try { - if (str($this->database->public_port)->isEmpty()) { - $this->database->public_port = null; - } - $this->validate(); - $this->database->save(); - $this->dispatch('success', 'Database updated.'); - } catch (Exception $e) { - return handleError($e, $this); - } finally { - if (is_null($this->database->config_hash)) { - $this->database->isConfigurationChanged(true); - } else { - $this->dispatch('configurationChanged'); - } - } - } - - public function instantSave() - { - try { - if ($this->database->is_public && ! $this->database->public_port) { - $this->dispatch('error', 'Public port is required.'); - $this->database->is_public = false; - - return; - } - if ($this->database->is_public) { - if (! str($this->database->status)->startsWith('running')) { - $this->dispatch('error', 'Database must be started to be publicly accessible.'); - $this->database->is_public = false; - - return; - } - StartDatabaseProxy::run($this->database); - $this->dispatch('success', 'Database is now publicly accessible.'); - } else { - StopDatabaseProxy::run($this->database); - $this->dispatch('success', 'Database is no longer publicly accessible.'); - } - $this->db_url_public = $this->database->external_db_url; - $this->database->save(); - } catch (\Throwable $e) { - $this->database->is_public = ! $this->database->is_public; - - return handleError($e, $this); - } - } - - public function refresh(): void - { - $this->database->refresh(); - } - - public function render() - { - return view('livewire.project.database.mysql.general'); - } -} diff --git a/app/Livewire/Project/Database/Postgresql/General.php b/app/Livewire/Project/Database/Postgresql/General.php deleted file mode 100644 index 88dd5c1a86..0000000000 --- a/app/Livewire/Project/Database/Postgresql/General.php +++ /dev/null @@ -1,261 +0,0 @@ - 'required', - 'database.description' => 'nullable', - 'database.postgres_user' => 'required', - 'database.postgres_password' => 'required', - 'database.postgres_db' => 'required', - 'database.postgres_initdb_args' => 'nullable', - 'database.postgres_host_auth_method' => 'nullable', - 'database.postgres_conf' => 'nullable', - 'database.init_scripts' => 'nullable', - 'database.image' => 'required', - 'database.ports_mappings' => 'nullable', - 'database.is_public' => 'nullable|boolean', - 'database.public_port' => 'nullable|integer', - 'database.is_log_drain_enabled' => 'nullable|boolean', - 'database.custom_docker_run_options' => 'nullable', - ]; - - protected $validationAttributes = [ - 'database.name' => 'Name', - 'database.description' => 'Description', - 'database.postgres_user' => 'Postgres User', - 'database.postgres_password' => 'Postgres Password', - 'database.postgres_db' => 'Postgres DB', - 'database.postgres_initdb_args' => 'Postgres Initdb Args', - 'database.postgres_host_auth_method' => 'Postgres Host Auth Method', - 'database.postgres_conf' => 'Postgres Configuration', - 'database.init_scripts' => 'Init Scripts', - 'database.image' => 'Image', - 'database.ports_mappings' => 'Port Mapping', - 'database.is_public' => 'Is Public', - 'database.public_port' => 'Public Port', - 'database.custom_docker_run_options' => 'Custom Docker Run Options', - ]; - - public function mount() - { - $this->db_url = $this->database->internal_db_url; - $this->db_url_public = $this->database->external_db_url; - $this->server = data_get($this->database, 'destination.server'); - } - - public function instantSaveAdvanced() - { - try { - if (! $this->server->isLogDrainEnabled()) { - $this->database->is_log_drain_enabled = false; - $this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.'); - - return; - } - $this->database->save(); - $this->dispatch('success', 'Database updated.'); - $this->dispatch('success', 'You need to restart the service for the changes to take effect.'); - } catch (Exception $e) { - return handleError($e, $this); - } - } - - public function instantSave() - { - try { - if ($this->database->is_public && ! $this->database->public_port) { - $this->dispatch('error', 'Public port is required.'); - $this->database->is_public = false; - - return; - } - if ($this->database->is_public) { - if (! str($this->database->status)->startsWith('running')) { - $this->dispatch('error', 'Database must be started to be publicly accessible.'); - $this->database->is_public = false; - - return; - } - StartDatabaseProxy::run($this->database); - $this->dispatch('success', 'Database is now publicly accessible.'); - } else { - StopDatabaseProxy::run($this->database); - $this->dispatch('success', 'Database is no longer publicly accessible.'); - } - $this->db_url_public = $this->database->external_db_url; - $this->database->save(); - } catch (\Throwable $e) { - $this->database->is_public = ! $this->database->is_public; - - return handleError($e, $this); - } - } - - public function save_init_script($script) - { - $initScripts = collect($this->database->init_scripts ?? []); - - $existingScript = $initScripts->firstWhere('filename', $script['filename']); - $oldScript = $initScripts->firstWhere('index', $script['index']); - - if ($existingScript && $existingScript['index'] !== $script['index']) { - $this->dispatch('error', 'A script with this filename already exists.'); - - return; - } - - $container_name = $this->database->uuid; - $configuration_dir = database_configuration_dir().'/'.$container_name; - - if ($oldScript && $oldScript['filename'] !== $script['filename']) { - $old_file_path = "$configuration_dir/docker-entrypoint-initdb.d/{$oldScript['filename']}"; - $delete_command = "rm -f $old_file_path"; - try { - instant_remote_process([$delete_command], $this->server); - } catch (\Exception $e) { - $this->dispatch('error', 'Failed to remove old init script from server: '.$e->getMessage()); - - return; - } - } - - $index = $initScripts->search(function ($item) use ($script) { - return $item['index'] === $script['index']; - }); - - if ($index !== false) { - $initScripts[$index] = $script; - } else { - $initScripts->push($script); - } - - $this->database->init_scripts = $initScripts->values() - ->map(function ($item, $index) { - $item['index'] = $index; - - return $item; - }) - ->all(); - - $this->database->save(); - $this->dispatch('success', 'Init script saved and updated.'); - } - - public function delete_init_script($script) - { - $collection = collect($this->database->init_scripts); - $found = $collection->firstWhere('filename', $script['filename']); - if ($found) { - $container_name = $this->database->uuid; - $configuration_dir = database_configuration_dir().'/'.$container_name; - $file_path = "$configuration_dir/docker-entrypoint-initdb.d/{$script['filename']}"; - - $command = "rm -f $file_path"; - try { - instant_remote_process([$command], $this->server); - } catch (\Exception $e) { - $this->dispatch('error', 'Failed to remove init script from server: '.$e->getMessage()); - - return; - } - - $updatedScripts = $collection->filter(fn ($s) => $s['filename'] !== $script['filename']) - ->values() - ->map(function ($item, $index) { - $item['index'] = $index; - - return $item; - }) - ->all(); - - $this->database->init_scripts = $updatedScripts; - $this->database->save(); - $this->refresh(); - $this->dispatch('success', 'Init script deleted from the database and the server.'); - } - } - - public function refresh(): void - { - $this->database->refresh(); - } - - public function save_new_init_script() - { - $this->validate([ - 'new_filename' => 'required|string', - 'new_content' => 'required|string', - ]); - $found = collect($this->database->init_scripts)->firstWhere('filename', $this->new_filename); - if ($found) { - $this->dispatch('error', 'Filename already exists.'); - - return; - } - if (! isset($this->database->init_scripts)) { - $this->database->init_scripts = []; - } - $this->database->init_scripts = array_merge($this->database->init_scripts, [ - [ - 'index' => count($this->database->init_scripts), - 'filename' => $this->new_filename, - 'content' => $this->new_content, - ], - ]); - $this->database->save(); - $this->dispatch('success', 'Init script added.'); - $this->new_content = ''; - $this->new_filename = ''; - } - - public function submit() - { - try { - if (str($this->database->public_port)->isEmpty()) { - $this->database->public_port = null; - } - $this->validate(); - $this->database->save(); - $this->dispatch('success', 'Database updated.'); - } catch (Exception $e) { - return handleError($e, $this); - } finally { - if (is_null($this->database->config_hash)) { - $this->database->isConfigurationChanged(true); - } else { - $this->dispatch('configurationChanged'); - } - } - } -} diff --git a/app/Livewire/Project/Database/Redis/General.php b/app/Livewire/Project/Database/Redis/General.php deleted file mode 100644 index 05babeaec7..0000000000 --- a/app/Livewire/Project/Database/Redis/General.php +++ /dev/null @@ -1,163 +0,0 @@ - 'refresh', - 'refresh', - ]; - - public Server $server; - - public StandaloneRedis $database; - - public string $redis_username; - - public string $redis_password; - - public string $redis_version; - - public ?string $db_url = null; - - public ?string $db_url_public = null; - - protected $rules = [ - 'database.name' => 'required', - 'database.description' => 'nullable', - 'database.redis_conf' => 'nullable', - 'database.image' => 'required', - 'database.ports_mappings' => 'nullable', - 'database.is_public' => 'nullable|boolean', - 'database.public_port' => 'nullable|integer', - 'database.is_log_drain_enabled' => 'nullable|boolean', - 'database.custom_docker_run_options' => 'nullable', - 'redis_username' => 'required', - 'redis_password' => 'required', - ]; - - protected $validationAttributes = [ - 'database.name' => 'Name', - 'database.description' => 'Description', - 'database.redis_conf' => 'Redis Configuration', - 'database.image' => 'Image', - 'database.ports_mappings' => 'Port Mapping', - 'database.is_public' => 'Is Public', - 'database.public_port' => 'Public Port', - 'database.custom_docker_run_options' => 'Custom Docker Options', - 'redis_username' => 'Redis Username', - 'redis_password' => 'Redis Password', - ]; - - public function mount() - { - $this->server = data_get($this->database, 'destination.server'); - $this->refreshView(); - } - - public function instantSaveAdvanced() - { - try { - if (! $this->server->isLogDrainEnabled()) { - $this->database->is_log_drain_enabled = false; - $this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.'); - - return; - } - $this->database->save(); - $this->dispatch('success', 'Database updated.'); - $this->dispatch('success', 'You need to restart the service for the changes to take effect.'); - } catch (Exception $e) { - return handleError($e, $this); - } - } - - public function submit() - { - try { - $this->validate(); - - if (version_compare($this->redis_version, '6.0', '>=')) { - $this->database->runtime_environment_variables()->updateOrCreate( - ['key' => 'REDIS_USERNAME'], - ['value' => $this->redis_username, 'resourceable_id' => $this->database->id] - ); - } - $this->database->runtime_environment_variables()->updateOrCreate( - ['key' => 'REDIS_PASSWORD'], - ['value' => $this->redis_password, 'resourceable_id' => $this->database->id] - ); - - $this->database->save(); - $this->dispatch('success', 'Database updated.'); - } catch (Exception $e) { - return handleError($e, $this); - } finally { - $this->dispatch('refreshEnvs'); - } - } - - public function instantSave() - { - try { - if ($this->database->is_public && ! $this->database->public_port) { - $this->dispatch('error', 'Public port is required.'); - $this->database->is_public = false; - - return; - } - if ($this->database->is_public) { - if (! str($this->database->status)->startsWith('running')) { - $this->dispatch('error', 'Database must be started to be publicly accessible.'); - $this->database->is_public = false; - - return; - } - StartDatabaseProxy::run($this->database); - $this->dispatch('success', 'Database is now publicly accessible.'); - } else { - StopDatabaseProxy::run($this->database); - $this->dispatch('success', 'Database is no longer publicly accessible.'); - } - $this->db_url_public = $this->database->external_db_url; - $this->database->save(); - } catch (\Throwable $e) { - $this->database->is_public = ! $this->database->is_public; - - return handleError($e, $this); - } - } - - public function refresh(): void - { - $this->database->refresh(); - $this->refreshView(); - } - - private function refreshView() - { - $this->db_url = $this->database->internal_db_url; - $this->db_url_public = $this->database->external_db_url; - $this->redis_version = $this->database->getRedisVersion(); - $this->redis_username = $this->database->redis_username; - $this->redis_password = $this->database->redis_password; - } - - public function render() - { - return view('livewire.project.database.redis.general'); - } - - public function isSharedVariable($name) - { - return $this->database->runtime_environment_variables()->where('key', $name)->where('is_shared', true)->exists(); - } -} diff --git a/app/Livewire/Project/Database/ScheduledBackups.php b/app/Livewire/Project/Database/ScheduledBackups.php deleted file mode 100644 index 412240bd4e..0000000000 --- a/app/Livewire/Project/Database/ScheduledBackups.php +++ /dev/null @@ -1,66 +0,0 @@ -selectedBackupId) { - $this->setSelectedBackup($this->selectedBackupId, true); - } - $this->parameters = get_route_parameters(); - if ($this->database->getMorphClass() === \App\Models\ServiceDatabase::class) { - $this->type = 'service-database'; - } else { - $this->type = 'database'; - } - $this->s3s = currentTeam()->s3s; - } - - public function setSelectedBackup($backupId, $force = false) - { - if ($this->selectedBackupId === $backupId && ! $force) { - return; - } - $this->selectedBackupId = $backupId; - $this->selectedBackup = $this->database->scheduledBackups->find($backupId); - if (is_null($this->selectedBackup)) { - $this->selectedBackupId = null; - } - } - - public function delete($scheduled_backup_id): void - { - $this->database->scheduledBackups->find($scheduled_backup_id)->delete(); - $this->dispatch('success', 'Scheduled backup deleted.'); - $this->refreshScheduledBackups(); - } - - public function refreshScheduledBackups(?int $id = null): void - { - $this->database->refresh(); - if ($id) { - $this->setSelectedBackup($id); - } - } -} diff --git a/app/Livewire/Project/DeleteEnvironment.php b/app/Livewire/Project/DeleteEnvironment.php deleted file mode 100644 index 1ee5de2691..0000000000 --- a/app/Livewire/Project/DeleteEnvironment.php +++ /dev/null @@ -1,42 +0,0 @@ -environmentName = Environment::findOrFail($this->environment_id)->name; - $this->parameters = get_route_parameters(); - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function delete() - { - $this->validate([ - 'environment_id' => 'required|int', - ]); - $environment = Environment::findOrFail($this->environment_id); - if ($environment->isEmpty()) { - $environment->delete(); - - return redirect()->route('project.show', parameters: ['project_uuid' => $this->parameters['project_uuid']]); - } - - return $this->dispatch('error', "Environment {$environment->name} has defined resources, please delete them first."); - } -} diff --git a/app/Livewire/Project/DeleteProject.php b/app/Livewire/Project/DeleteProject.php deleted file mode 100644 index f320a19b0f..0000000000 --- a/app/Livewire/Project/DeleteProject.php +++ /dev/null @@ -1,38 +0,0 @@ -parameters = get_route_parameters(); - $this->projectName = Project::findOrFail($this->project_id)->name; - } - - public function delete() - { - $this->validate([ - 'project_id' => 'required|int', - ]); - $project = Project::findOrFail($this->project_id); - if ($project->isEmpty()) { - $project->delete(); - - return redirect()->route('project.index'); - } - - return $this->dispatch('error', "Project {$project->name} has resources defined, please delete them first."); - } -} diff --git a/app/Livewire/Project/Edit.php b/app/Livewire/Project/Edit.php deleted file mode 100644 index 463febb10d..0000000000 --- a/app/Livewire/Project/Edit.php +++ /dev/null @@ -1,52 +0,0 @@ -project = Project::where('team_id', currentTeam()->id)->where('uuid', $project_uuid)->firstOrFail(); - $this->syncData(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $this->project->update([ - 'name' => $this->name, - 'description' => $this->description, - ]); - } else { - $this->name = $this->project->name; - $this->description = $this->project->description; - } - } - - public function submit() - { - try { - $this->syncData(true); - $this->dispatch('success', 'Project updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Project/EnvironmentEdit.php b/app/Livewire/Project/EnvironmentEdit.php deleted file mode 100644 index e98b088ecf..0000000000 --- a/app/Livewire/Project/EnvironmentEdit.php +++ /dev/null @@ -1,68 +0,0 @@ -project = Project::ownedByCurrentTeam()->where('uuid', $project_uuid)->firstOrFail(); - $this->environment = $this->project->environments()->where('uuid', $environment_uuid)->firstOrFail(); - $this->syncData(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $this->environment->update([ - 'name' => $this->name, - 'description' => $this->description, - ]); - } else { - $this->name = $this->environment->name; - $this->description = $this->environment->description; - } - } - - public function submit() - { - try { - $this->syncData(true); - $this->redirectRoute('project.environment.edit', [ - 'environment_uuid' => $this->environment->uuid, - 'project_uuid' => $this->project->uuid, - ]); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.project.environment-edit'); - } -} diff --git a/app/Livewire/Project/Index.php b/app/Livewire/Project/Index.php deleted file mode 100644 index 8bf511a66a..0000000000 --- a/app/Livewire/Project/Index.php +++ /dev/null @@ -1,40 +0,0 @@ -private_keys = PrivateKey::ownedByCurrentTeam()->get(); - $this->projects = Project::ownedByCurrentTeam()->get()->map(function ($project) { - $project->settingsRoute = route('project.edit', ['project_uuid' => $project->uuid]); - - return $project; - }); - $this->servers = Server::ownedByCurrentTeam()->count(); - } - - public function render() - { - return view('livewire.project.index'); - } - - public function navigateToProject($projectUuid) - { - $project = collect($this->projects)->firstWhere('uuid', $projectUuid); - - return $this->redirect($project->navigateTo(), true); - } -} diff --git a/app/Livewire/Project/New/DockerCompose.php b/app/Livewire/Project/New/DockerCompose.php deleted file mode 100644 index 2f51094d10..0000000000 --- a/app/Livewire/Project/New/DockerCompose.php +++ /dev/null @@ -1,101 +0,0 @@ -parameters = get_route_parameters(); - $this->query = request()->query(); - if (isDev()) { - $this->dockerComposeRaw = 'services: - appsmith: - build: - context: . - dockerfile_inline: | - FROM nginx - ARG GIT_COMMIT - ARG GIT_BRANCH - RUN echo "Hello World ${GIT_COMMIT} ${GIT_BRANCH}" - args: - - GIT_COMMIT=cdc3b19 - - GIT_BRANCH=${GIT_BRANCH} - environment: - - APPSMITH_MAIL_ENABLED=${APPSMITH_MAIL_ENABLED} - '; - } - } - - public function submit() - { - $server_id = $this->query['server_id']; - try { - $this->validate([ - 'dockerComposeRaw' => 'required', - ]); - $this->dockerComposeRaw = Yaml::dump(Yaml::parse($this->dockerComposeRaw), 10, 2, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK); - $project = Project::where('uuid', $this->parameters['project_uuid'])->first(); - $environment = $project->load(['environments'])->environments->where('uuid', $this->parameters['environment_uuid'])->first(); - - $destination_uuid = $this->query['destination']; - $destination = StandaloneDocker::where('uuid', $destination_uuid)->first(); - if (! $destination) { - $destination = SwarmDocker::where('uuid', $destination_uuid)->first(); - } - if (! $destination) { - throw new \Exception('Destination not found. What?!'); - } - $destination_class = $destination->getMorphClass(); - - $service = Service::create([ - 'name' => 'service'.Str::random(10), - 'docker_compose_raw' => $this->dockerComposeRaw, - 'environment_id' => $environment->id, - 'server_id' => (int) $server_id, - 'destination_id' => $destination->id, - 'destination_type' => $destination_class, - ]); - - $variables = parseEnvFormatToArray($this->envFile); - foreach ($variables as $key => $variable) { - EnvironmentVariable::create([ - 'key' => $key, - 'value' => $variable, - 'is_build_time' => false, - 'is_preview' => false, - 'resourceable_id' => $service->id, - 'resourceable_type' => $service->getMorphClass(), - ]); - } - $service->name = "service-$service->uuid"; - - $service->parse(isNew: true); - - return redirect()->route('project.service.configuration', [ - 'service_uuid' => $service->uuid, - 'environment_uuid' => $environment->uuid, - 'project_uuid' => $project->uuid, - ]); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Project/New/DockerImage.php b/app/Livewire/Project/New/DockerImage.php deleted file mode 100644 index 7d68ce0684..0000000000 --- a/app/Livewire/Project/New/DockerImage.php +++ /dev/null @@ -1,80 +0,0 @@ -parameters = get_route_parameters(); - $this->query = request()->query(); - } - - public function submit() - { - $this->validate([ - 'dockerImage' => 'required', - ]); - - $parser = new DockerImageParser; - $parser->parse($this->dockerImage); - - $destination_uuid = $this->query['destination']; - $destination = StandaloneDocker::where('uuid', $destination_uuid)->first(); - if (! $destination) { - $destination = SwarmDocker::where('uuid', $destination_uuid)->first(); - } - if (! $destination) { - throw new \Exception('Destination not found. What?!'); - } - $destination_class = $destination->getMorphClass(); - - $project = Project::where('uuid', $this->parameters['project_uuid'])->first(); - $environment = $project->load(['environments'])->environments->where('uuid', $this->parameters['environment_uuid'])->first(); - $application = Application::create([ - 'name' => 'docker-image-'.new Cuid2, - 'repository_project_id' => 0, - 'git_repository' => 'coollabsio/coolify', - 'git_branch' => 'main', - 'build_pack' => 'dockerimage', - 'ports_exposes' => 80, - 'docker_registry_image_name' => $parser->getFullImageNameWithoutTag(), - 'docker_registry_image_tag' => $parser->getTag(), - 'environment_id' => $environment->id, - 'destination_id' => $destination->id, - 'destination_type' => $destination_class, - 'health_check_enabled' => false, - ]); - - $fqdn = generateFqdn($destination->server, $application->uuid); - $application->update([ - 'name' => 'docker-image-'.$application->uuid, - 'fqdn' => $fqdn, - ]); - - return redirect()->route('project.application.configuration', [ - 'application_uuid' => $application->uuid, - 'environment_uuid' => $environment->uuid, - 'project_uuid' => $project->uuid, - ]); - } - - public function render() - { - return view('livewire.project.new.docker-image'); - } -} diff --git a/app/Livewire/Project/New/EmptyProject.php b/app/Livewire/Project/New/EmptyProject.php deleted file mode 100644 index 54cfc4b4d8..0000000000 --- a/app/Livewire/Project/New/EmptyProject.php +++ /dev/null @@ -1,21 +0,0 @@ - generate_random_name(), - 'team_id' => currentTeam()->id, - 'uuid' => (string) new Cuid2, - ]); - - return redirect()->route('project.show', ['project_uuid' => $project->uuid, 'environment_uuid' => $project->environments->first()->uuid]); - } -} diff --git a/app/Livewire/Project/New/GithubPrivateRepository.php b/app/Livewire/Project/New/GithubPrivateRepository.php deleted file mode 100644 index 4a81d841f2..0000000000 --- a/app/Livewire/Project/New/GithubPrivateRepository.php +++ /dev/null @@ -1,233 +0,0 @@ -currentRoute = Route::currentRouteName(); - $this->parameters = get_route_parameters(); - $this->query = request()->query(); - $this->repositories = $this->branches = collect(); - $this->github_apps = GithubApp::private(); - } - - public function updatedBaseDirectory() - { - if ($this->base_directory) { - $this->base_directory = rtrim($this->base_directory, '/'); - if (! str($this->base_directory)->startsWith('/')) { - $this->base_directory = '/'.$this->base_directory; - } - } - } - - public function updatedBuildPack() - { - if ($this->build_pack === 'nixpacks') { - $this->show_is_static = true; - $this->port = 3000; - } elseif ($this->build_pack === 'static') { - $this->show_is_static = false; - $this->is_static = false; - $this->port = 80; - } else { - $this->show_is_static = false; - $this->is_static = false; - } - } - - public function loadRepositories($github_app_id) - { - $this->repositories = collect(); - $this->page = 1; - $this->selected_github_app_id = $github_app_id; - $this->github_app = GithubApp::where('id', $github_app_id)->first(); - $this->token = generateGithubInstallationToken($this->github_app); - $this->loadRepositoryByPage(); - if ($this->repositories->count() < $this->total_repositories_count) { - while ($this->repositories->count() < $this->total_repositories_count) { - $this->page++; - $this->loadRepositoryByPage(); - } - } - $this->repositories = $this->repositories->sortBy('name'); - if ($this->repositories->count() > 0) { - $this->selected_repository_id = data_get($this->repositories->first(), 'id'); - } - $this->current_step = 'repository'; - } - - protected function loadRepositoryByPage() - { - $response = Http::withToken($this->token)->get("{$this->github_app->api_url}/installation/repositories?per_page=100&page={$this->page}"); - $json = $response->json(); - if ($response->status() !== 200) { - return $this->dispatch('error', $json['message']); - } - - if ($json['total_count'] === 0) { - return; - } - $this->total_repositories_count = $json['total_count']; - $this->repositories = $this->repositories->concat(collect($json['repositories'])); - } - - public function loadBranches() - { - $this->selected_repository_owner = $this->repositories->where('id', $this->selected_repository_id)->first()['owner']['login']; - $this->selected_repository_repo = $this->repositories->where('id', $this->selected_repository_id)->first()['name']; - $this->branches = collect(); - $this->page = 1; - $this->loadBranchByPage(); - if ($this->total_branches_count === 100) { - while ($this->total_branches_count === 100) { - $this->page++; - $this->loadBranchByPage(); - } - } - $this->selected_branch_name = data_get($this->branches, '0.name', 'main'); - } - - protected function loadBranchByPage() - { - $response = Http::withToken($this->token)->get("{$this->github_app->api_url}/repos/{$this->selected_repository_owner}/{$this->selected_repository_repo}/branches?per_page=100&page={$this->page}"); - $json = $response->json(); - if ($response->status() !== 200) { - return $this->dispatch('error', $json['message']); - } - - $this->total_branches_count = count($json); - $this->branches = $this->branches->concat(collect($json)); - } - - public function submit() - { - try { - $destination_uuid = $this->query['destination']; - $destination = StandaloneDocker::where('uuid', $destination_uuid)->first(); - if (! $destination) { - $destination = SwarmDocker::where('uuid', $destination_uuid)->first(); - } - if (! $destination) { - throw new \Exception('Destination not found. What?!'); - } - $destination_class = $destination->getMorphClass(); - - $project = Project::where('uuid', $this->parameters['project_uuid'])->first(); - $environment = $project->load(['environments'])->environments->where('uuid', $this->parameters['environment_uuid'])->first(); - - $application = Application::create([ - 'name' => generate_application_name($this->selected_repository_owner.'/'.$this->selected_repository_repo, $this->selected_branch_name), - 'repository_project_id' => $this->selected_repository_id, - 'git_repository' => "{$this->selected_repository_owner}/{$this->selected_repository_repo}", - 'git_branch' => $this->selected_branch_name, - 'build_pack' => $this->build_pack, - 'ports_exposes' => $this->port, - 'publish_directory' => $this->publish_directory, - 'environment_id' => $environment->id, - 'destination_id' => $destination->id, - 'destination_type' => $destination_class, - 'source_id' => $this->github_app->id, - 'source_type' => $this->github_app->getMorphClass(), - ]); - $application->settings->is_static = $this->is_static; - $application->settings->save(); - - if ($this->build_pack === 'dockerfile' || $this->build_pack === 'dockerimage') { - $application->health_check_enabled = false; - } - if ($this->build_pack === 'dockercompose') { - $application['docker_compose_location'] = $this->docker_compose_location; - $application['base_directory'] = $this->base_directory; - } - $fqdn = generateFqdn($destination->server, $application->uuid); - $application->fqdn = $fqdn; - - $application->name = generate_application_name($this->selected_repository_owner.'/'.$this->selected_repository_repo, $this->selected_branch_name, $application->uuid); - $application->save(); - - return redirect()->route('project.application.configuration', [ - 'application_uuid' => $application->uuid, - 'environment_uuid' => $environment->uuid, - 'project_uuid' => $project->uuid, - ]); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function instantSave() - { - if ($this->is_static) { - $this->port = 80; - $this->publish_directory = '/dist'; - } else { - $this->port = 3000; - $this->publish_directory = null; - } - $this->dispatch('success', 'Application settings updated!'); - } -} diff --git a/app/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php b/app/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php deleted file mode 100644 index 01b0c9ae85..0000000000 --- a/app/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php +++ /dev/null @@ -1,215 +0,0 @@ - 'required', - 'branch' => 'required|string', - 'port' => 'required|numeric', - 'is_static' => 'required|boolean', - 'publish_directory' => 'nullable|string', - 'build_pack' => 'required|string', - ]; - - protected $validationAttributes = [ - 'repository_url' => 'Repository', - 'branch' => 'Branch', - 'port' => 'Port', - 'is_static' => 'Is static', - 'publish_directory' => 'Publish directory', - 'build_pack' => 'Build pack', - ]; - - public function mount() - { - if (isDev()) { - $this->repository_url = 'https://github.com/coollabsio/coolify-examples'; - } - $this->parameters = get_route_parameters(); - $this->query = request()->query(); - if (isDev()) { - $this->private_keys = PrivateKey::where('team_id', currentTeam()->id)->get(); - } else { - $this->private_keys = PrivateKey::where('team_id', currentTeam()->id)->where('id', '!=', 0)->get(); - } - } - - public function updatedBuildPack() - { - if ($this->build_pack === 'nixpacks') { - $this->show_is_static = true; - $this->port = 3000; - } elseif ($this->build_pack === 'static') { - $this->show_is_static = false; - $this->is_static = false; - $this->port = 80; - } else { - $this->show_is_static = false; - $this->is_static = false; - } - } - - public function instantSave() - { - if ($this->is_static) { - $this->port = 80; - $this->publish_directory = '/dist'; - } else { - $this->port = 3000; - $this->publish_directory = null; - } - } - - public function setPrivateKey($private_key_id) - { - $this->private_key_id = $private_key_id; - $this->current_step = 'repository'; - } - - public function submit() - { - $this->validate(); - try { - $destination_uuid = $this->query['destination']; - $destination = StandaloneDocker::where('uuid', $destination_uuid)->first(); - if (! $destination) { - $destination = SwarmDocker::where('uuid', $destination_uuid)->first(); - } - if (! $destination) { - throw new \Exception('Destination not found. What?!'); - } - $destination_class = $destination->getMorphClass(); - - $this->get_git_source(); - - $project = Project::where('uuid', $this->parameters['project_uuid'])->first(); - $environment = $project->load(['environments'])->environments->where('uuid', $this->parameters['environment_uuid'])->first(); - if ($this->git_source === 'other') { - $application_init = [ - 'name' => generate_random_name(), - 'git_repository' => $this->git_repository, - 'git_branch' => $this->branch, - 'build_pack' => $this->build_pack, - 'ports_exposes' => $this->port, - 'publish_directory' => $this->publish_directory, - 'environment_id' => $environment->id, - 'destination_id' => $destination->id, - 'destination_type' => $destination_class, - 'private_key_id' => $this->private_key_id, - ]; - } else { - $application_init = [ - 'name' => generate_random_name(), - 'git_repository' => $this->git_repository, - 'git_branch' => $this->branch, - 'build_pack' => $this->build_pack, - 'ports_exposes' => $this->port, - 'publish_directory' => $this->publish_directory, - 'environment_id' => $environment->id, - 'destination_id' => $destination->id, - 'destination_type' => $destination_class, - 'private_key_id' => $this->private_key_id, - 'source_id' => $this->git_source->id, - 'source_type' => $this->git_source->getMorphClass(), - ]; - } - if ($this->build_pack === 'dockerfile' || $this->build_pack === 'dockerimage') { - $application_init['health_check_enabled'] = false; - } - if ($this->build_pack === 'dockercompose') { - $application_init['docker_compose_location'] = $this->docker_compose_location; - $application_init['base_directory'] = $this->base_directory; - } - $application = Application::create($application_init); - $application->settings->is_static = $this->is_static; - $application->settings->save(); - - $fqdn = generateFqdn($destination->server, $application->uuid); - $application->fqdn = $fqdn; - $application->name = generate_random_name($application->uuid); - $application->save(); - - return redirect()->route('project.application.configuration', [ - 'application_uuid' => $application->uuid, - 'environment_uuid' => $environment->uuid, - 'project_uuid' => $project->uuid, - ]); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - private function get_git_source() - { - $this->repository_url_parsed = Url::fromString($this->repository_url); - $this->git_host = $this->repository_url_parsed->getHost(); - $this->git_repository = $this->repository_url_parsed->getSegment(1).'/'.$this->repository_url_parsed->getSegment(2); - - if ($this->git_host === 'github.com') { - $this->git_source = GithubApp::where('name', 'Public GitHub')->first(); - - return; - } - if (str($this->repository_url)->startsWith('http')) { - $this->git_host = $this->repository_url_parsed->getHost(); - $this->git_repository = $this->repository_url_parsed->getSegment(1).'/'.$this->repository_url_parsed->getSegment(2); - $this->git_repository = Str::finish("git@$this->git_host:$this->git_repository", '.git'); - } else { - $this->git_repository = $this->repository_url; - } - $this->git_source = 'other'; - } -} diff --git a/app/Livewire/Project/New/PublicGitRepository.php b/app/Livewire/Project/New/PublicGitRepository.php deleted file mode 100644 index 45b3b57261..0000000000 --- a/app/Livewire/Project/New/PublicGitRepository.php +++ /dev/null @@ -1,340 +0,0 @@ - 'required|url', - 'port' => 'required|numeric', - 'isStatic' => 'required|boolean', - 'publish_directory' => 'nullable|string', - 'build_pack' => 'required|string', - 'base_directory' => 'nullable|string', - 'docker_compose_location' => 'nullable|string', - ]; - - protected $validationAttributes = [ - 'repository_url' => 'repository', - 'port' => 'port', - 'isStatic' => 'static', - 'publish_directory' => 'publish directory', - 'build_pack' => 'build pack', - 'base_directory' => 'base directory', - 'docker_compose_location' => 'docker compose location', - ]; - - public function mount() - { - if (isDev()) { - $this->repository_url = 'https://github.com/coollabsio/coolify-examples'; - $this->port = 3000; - } - $this->parameters = get_route_parameters(); - $this->query = request()->query(); - } - - public function updatedBaseDirectory() - { - if ($this->base_directory) { - $this->base_directory = rtrim($this->base_directory, '/'); - if (! str($this->base_directory)->startsWith('/')) { - $this->base_directory = '/'.$this->base_directory; - } - } - } - - public function updatedDockerComposeLocation() - { - if ($this->docker_compose_location) { - $this->docker_compose_location = rtrim($this->docker_compose_location, '/'); - if (! str($this->docker_compose_location)->startsWith('/')) { - $this->docker_compose_location = '/'.$this->docker_compose_location; - } - } - } - - public function updatedBuildPack() - { - if ($this->build_pack === 'nixpacks') { - $this->show_is_static = true; - $this->port = 3000; - } elseif ($this->build_pack === 'static') { - $this->show_is_static = false; - $this->isStatic = false; - $this->port = 80; - } else { - $this->show_is_static = false; - $this->isStatic = false; - } - } - - public function instantSave() - { - if ($this->isStatic) { - $this->port = 80; - $this->publish_directory = '/dist'; - } else { - $this->port = 3000; - $this->publish_directory = null; - } - $this->dispatch('success', 'Application settings updated!'); - } - - public function loadBranch() - { - try { - if (str($this->repository_url)->startsWith('git@')) { - $github_instance = str($this->repository_url)->after('git@')->before(':'); - $repository = str($this->repository_url)->after(':')->before('.git'); - $this->repository_url = 'https://'.str($github_instance).'/'.$repository; - } - if ( - (str($this->repository_url)->startsWith('https://') || - str($this->repository_url)->startsWith('http://')) && - ! str($this->repository_url)->endsWith('.git') && - (! str($this->repository_url)->contains('github.com') || - ! str($this->repository_url)->contains('git.sr.ht')) - ) { - $this->repository_url = $this->repository_url.'.git'; - } - if (str($this->repository_url)->contains('github.com') && str($this->repository_url)->endsWith('.git')) { - $this->repository_url = str($this->repository_url)->beforeLast('.git')->value(); - } - } catch (\Throwable $e) { - return handleError($e, $this); - } - try { - $this->branchFound = false; - $this->getGitSource(); - $this->getBranch(); - $this->selectedBranch = $this->git_branch; - } catch (\Throwable $e) { - if ($this->rate_limit_remaining == 0) { - $this->selectedBranch = $this->git_branch; - $this->branchFound = true; - - return; - } - if (! $this->branchFound && $this->git_branch === 'main') { - try { - $this->git_branch = 'master'; - $this->getBranch(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } else { - return handleError($e, $this); - } - } - } - - private function getGitSource() - { - $this->git_branch = 'main'; - $this->base_directory = '/'; - - $this->repository_url_parsed = Url::fromString($this->repository_url); - $this->git_host = $this->repository_url_parsed->getHost(); - $this->git_repository = $this->repository_url_parsed->getSegment(1).'/'.$this->repository_url_parsed->getSegment(2); - - if ($this->repository_url_parsed->getSegment(3) === 'tree') { - $path = str($this->repository_url_parsed->getPath())->trim('/'); - $this->git_branch = str($path)->after('tree/')->before('/')->value(); - $this->base_directory = str($path)->after($this->git_branch)->after('/')->value(); - if (filled($this->base_directory)) { - $this->base_directory = '/'.$this->base_directory; - } else { - $this->base_directory = '/'; - } - } else { - $this->git_branch = 'main'; - } - if ($this->git_host === 'github.com') { - $this->git_source = GithubApp::where('name', 'Public GitHub')->first(); - - return; - } - $this->git_repository = $this->repository_url; - $this->git_source = 'other'; - } - - private function getBranch() - { - if ($this->git_source === 'other') { - $this->branchFound = true; - - return; - } - if ($this->git_source->getMorphClass() === \App\Models\GithubApp::class) { - ['rate_limit_remaining' => $this->rate_limit_remaining, 'rate_limit_reset' => $this->rate_limit_reset] = githubApi(source: $this->git_source, endpoint: "/repos/{$this->git_repository}/branches/{$this->git_branch}"); - $this->rate_limit_reset = Carbon::parse((int) $this->rate_limit_reset)->format('Y-M-d H:i:s'); - $this->branchFound = true; - } - } - - public function submit() - { - try { - $this->validate(); - $destination_uuid = $this->query['destination']; - $project_uuid = $this->parameters['project_uuid']; - $environment_uuid = $this->parameters['environment_uuid']; - - $destination = StandaloneDocker::where('uuid', $destination_uuid)->first(); - if (! $destination) { - $destination = SwarmDocker::where('uuid', $destination_uuid)->first(); - } - if (! $destination) { - throw new \Exception('Destination not found. What?!'); - } - $destination_class = $destination->getMorphClass(); - - $project = Project::where('uuid', $project_uuid)->first(); - $environment = $project->load(['environments'])->environments->where('uuid', $environment_uuid)->first(); - - if ($this->build_pack === 'dockercompose' && isDev() && $this->new_compose_services) { - $server = $destination->server; - $new_service = [ - 'name' => 'service'.str()->random(10), - 'docker_compose_raw' => 'coolify', - 'environment_id' => $environment->id, - 'server_id' => $server->id, - ]; - if ($this->git_source === 'other') { - $new_service['git_repository'] = $this->git_repository; - $new_service['git_branch'] = $this->git_branch; - } else { - $new_service['git_repository'] = $this->git_repository; - $new_service['git_branch'] = $this->git_branch; - $new_service['source_id'] = $this->git_source->id; - $new_service['source_type'] = $this->git_source->getMorphClass(); - } - $service = Service::create($new_service); - - return redirect()->route('project.service.configuration', [ - 'service_uuid' => $service->uuid, - 'environment_uuid' => $environment->uuid, - 'project_uuid' => $project->uuid, - ]); - - return; - } - if ($this->git_source === 'other') { - $application_init = [ - 'name' => generate_random_name(), - 'git_repository' => $this->git_repository, - 'git_branch' => $this->git_branch, - 'ports_exposes' => $this->port, - 'publish_directory' => $this->publish_directory, - 'environment_id' => $environment->id, - 'destination_id' => $destination->id, - 'destination_type' => $destination_class, - 'build_pack' => $this->build_pack, - 'base_directory' => $this->base_directory, - ]; - } else { - $application_init = [ - 'name' => generate_application_name($this->git_repository, $this->git_branch), - 'git_repository' => $this->git_repository, - 'git_branch' => $this->git_branch, - 'ports_exposes' => $this->port, - 'publish_directory' => $this->publish_directory, - 'environment_id' => $environment->id, - 'destination_id' => $destination->id, - 'destination_type' => $destination_class, - 'source_id' => $this->git_source->id, - 'source_type' => $this->git_source->getMorphClass(), - 'build_pack' => $this->build_pack, - 'base_directory' => $this->base_directory, - ]; - } - - if ($this->build_pack === 'dockerfile' || $this->build_pack === 'dockerimage') { - $application_init['health_check_enabled'] = false; - } - if ($this->build_pack === 'dockercompose') { - $application_init['docker_compose_location'] = $this->docker_compose_location; - $application_init['base_directory'] = $this->base_directory; - } - $application = Application::create($application_init); - - $application->settings->is_static = $this->isStatic; - $application->settings->save(); - $fqdn = generateFqdn($destination->server, $application->uuid); - $application->fqdn = $fqdn; - $application->save(); - if ($this->checkCoolifyConfig) { - // $config = loadConfigFromGit($this->repository_url, $this->git_branch, $this->base_directory, $this->query['server_id'], auth()->user()->currentTeam()->id); - // if ($config) { - // $application->setConfig($config); - // } - } - - return redirect()->route('project.application.configuration', [ - 'application_uuid' => $application->uuid, - 'environment_uuid' => $environment->uuid, - 'project_uuid' => $project->uuid, - ]); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Project/New/Select.php b/app/Livewire/Project/New/Select.php deleted file mode 100644 index 396930c403..0000000000 --- a/app/Livewire/Project/New/Select.php +++ /dev/null @@ -1,337 +0,0 @@ -parameters = get_route_parameters(); - if (isDev()) { - $this->existingPostgresqlUrl = 'postgres://coolify:password@coolify-db:5432'; - } - $projectUuid = data_get($this->parameters, 'project_uuid'); - $this->environments = Project::whereUuid($projectUuid)->first()->environments; - $this->selectedEnvironment = data_get($this->parameters, 'environment_uuid'); - } - - public function render() - { - return view('livewire.project.new.select'); - } - - public function updatedSelectedEnvironment() - { - return redirect()->route('project.resource.create', [ - 'project_uuid' => $this->parameters['project_uuid'], - 'environment_uuid' => $this->selectedEnvironment, - ]); - } - - public function loadServices() - { - $services = get_service_templates(); - $services = collect($services)->map(function ($service, $key) { - $default_logo = 'images/default.webp'; - $logo = data_get($service, 'logo', $default_logo); - $local_logo_path = public_path($logo); - - return [ - 'name' => str($key)->headline(), - 'logo' => asset($logo), - 'logo_github_url' => file_exists($local_logo_path) - ? 'https://raw.githubusercontent.com/coollabsio/coolify/refs/heads/main/public/'.$logo - : asset($default_logo), - ] + (array) $service; - })->all(); - $gitBasedApplications = [ - [ - 'id' => 'public', - 'name' => 'Public Repository', - 'description' => 'You can deploy any kind of public repositories from the supported git providers.', - 'logo' => asset('svgs/git.svg'), - ], - [ - 'id' => 'private-gh-app', - 'name' => 'Private Repository (with GitHub App)', - 'description' => 'You can deploy public & private repositories through your GitHub Apps.', - 'logo' => asset('svgs/github.svg'), - ], - [ - 'id' => 'private-deploy-key', - 'name' => 'Private Repository (with Deploy Key)', - 'description' => 'You can deploy private repositories with a deploy key.', - 'logo' => asset('svgs/git.svg'), - ], - ]; - $dockerBasedApplications = [ - [ - 'id' => 'dockerfile', - 'name' => 'Dockerfile', - 'description' => 'You can deploy a simple Dockerfile, without Git.', - 'logo' => asset('svgs/docker.svg'), - ], - [ - 'id' => 'docker-compose-empty', - 'name' => 'Docker Compose Empty', - 'description' => 'You can deploy complex application easily with Docker Compose, without Git.', - 'logo' => asset('svgs/docker.svg'), - ], - [ - 'id' => 'docker-image', - 'name' => 'Docker Image', - 'description' => 'You can deploy an existing Docker Image from any Registry, without Git.', - 'logo' => asset('svgs/docker.svg'), - ], - ]; - $databases = [ - [ - 'id' => 'postgresql', - 'name' => 'PostgreSQL', - 'description' => 'PostgreSQL is an object-relational database known for its robustness, advanced features, and strong standards compliance.', - 'logo' => ' -', - ], - [ - 'id' => 'mysql', - 'name' => 'MySQL', - 'description' => 'MySQL is an open-source relational database management system. ', - 'logo' => ' - - - -', - - ], - [ - 'id' => 'mariadb', - 'name' => 'MariaDB', - 'description' => 'MariaDB is a community-developed, commercially supported fork of the MySQL relational database management system, intended to remain free and open-source.', - 'logo' => '', - ], - [ - 'id' => 'redis', - 'name' => 'Redis', - 'description' => 'Redis is a source-available, in-memory storage, used as a distributed, in-memory key–value database, cache and message broker, with optional durability.', - 'logo' => '', - ], - [ - 'id' => 'keydb', - 'name' => 'KeyDB', - 'description' => 'KeyDB is a database that offers high performance, low latency, and scalability for various data structures and workloads.', - 'logo' => '
', - ], - [ - 'id' => 'dragonfly', - 'name' => 'Dragonfly', - 'description' => 'Dragonfly DB is a drop-in Redis replacement that delivers 25x more throughput and 12x faster snapshotting than Redis.', - 'logo' => '
', - ], - [ - 'id' => 'mongodb', - 'name' => 'MongoDB', - 'description' => 'MongoDB is a source-available, cross-platform, document-oriented database program.', - 'logo' => '', - ], - [ - 'id' => 'clickhouse', - 'name' => 'ClickHouse', - 'description' => 'ClickHouse is a column-oriented database that supports real-time analytics, business intelligence, observability, ML and GenAI, and more.', - 'logo' => '
', - ], - - ]; - - return [ - 'services' => $services, - 'gitBasedApplications' => $gitBasedApplications, - 'dockerBasedApplications' => $dockerBasedApplications, - 'databases' => $databases, - ]; - } - - public function instantSave() - { - if ($this->includeSwarm) { - $this->servers = $this->allServers; - } else { - if ($this->allServers instanceof Collection) { - $this->servers = $this->allServers->where('settings.is_swarm_worker', false)->where('settings.is_swarm_manager', false)->where('settings.is_build_server', false); - } else { - $this->servers = $this->allServers; - } - } - } - - public function setType(string $type) - { - $type = str($type)->lower()->slug()->value(); - if ($this->loading) { - return; - } - $this->loading = true; - $this->type = $type; - switch ($type) { - case 'postgresql': - case 'mysql': - case 'mariadb': - case 'redis': - case 'keydb': - case 'dragonfly': - case 'clickhouse': - case 'mongodb': - $this->isDatabase = true; - $this->includeSwarm = false; - if ($this->allServers instanceof Collection) { - $this->servers = $this->allServers->where('settings.is_swarm_worker', false)->where('settings.is_swarm_manager', false)->where('settings.is_build_server', false); - } else { - $this->servers = $this->allServers; - } - break; - } - if (str($type)->startsWith('one-click-service') || str($type)->startsWith('docker-compose-empty')) { - $this->isDatabase = true; - $this->includeSwarm = false; - if ($this->allServers instanceof Collection) { - $this->servers = $this->allServers->where('settings.is_swarm_worker', false)->where('settings.is_swarm_manager', false)->where('settings.is_build_server', false); - } else { - $this->servers = $this->allServers; - } - } - if ($type === 'existing-postgresql') { - $this->current_step = $type; - - return; - } - if (count($this->servers) === 1) { - $server = $this->servers->first(); - if ($server instanceof Server) { - $this->setServer($server); - } - } - if (! is_null($this->server)) { - $foundServer = $this->servers->where('id', $this->server->id)->first(); - if ($foundServer) { - return $this->setServer($foundServer); - } - } - $this->current_step = 'servers'; - } - - public function setServer(Server $server) - { - $this->server_id = $server->id; - $this->server = $server; - $this->standaloneDockers = $server->standaloneDockers; - $this->swarmDockers = $server->swarmDockers; - $count = count($this->standaloneDockers) + count($this->swarmDockers); - if ($count === 1) { - $docker = $this->standaloneDockers->first() ?? $this->swarmDockers->first(); - if ($docker) { - $this->setDestination($docker->uuid); - - return $this->whatToDoNext(); - } - } - $this->current_step = 'destinations'; - } - - public function setDestination(string $destination_uuid) - { - $this->destination_uuid = $destination_uuid; - - return $this->whatToDoNext(); - } - - public function setPostgresqlType(string $type) - { - $this->postgresql_type = $type; - - return redirect()->route('project.resource.create', [ - 'project_uuid' => $this->parameters['project_uuid'], - 'environment_uuid' => $this->parameters['environment_uuid'], - 'type' => $this->type, - 'destination' => $this->destination_uuid, - 'server_id' => $this->server_id, - 'database_image' => $this->postgresql_type, - ]); - } - - public function whatToDoNext() - { - if ($this->type === 'postgresql') { - $this->current_step = 'select-postgresql-type'; - } else { - return redirect()->route('project.resource.create', [ - 'project_uuid' => $this->parameters['project_uuid'], - 'environment_uuid' => $this->parameters['environment_uuid'], - 'type' => $this->type, - 'destination' => $this->destination_uuid, - 'server_id' => $this->server_id, - ]); - } - } - - public function loadServers() - { - $this->servers = Server::isUsable()->get()->sortBy('name'); - $this->allServers = $this->servers; - - if ($this->allServers && $this->allServers->isNotEmpty()) { - $this->onlyBuildServerAvailable = $this->allServers->every(function ($server) { - return $server->isBuildServer(); - }); - } - } -} diff --git a/app/Livewire/Project/New/SimpleDockerfile.php b/app/Livewire/Project/New/SimpleDockerfile.php deleted file mode 100644 index c3ed6039a0..0000000000 --- a/app/Livewire/Project/New/SimpleDockerfile.php +++ /dev/null @@ -1,85 +0,0 @@ -parameters = get_route_parameters(); - $this->query = request()->query(); - if (isDev()) { - $this->dockerfile = 'FROM nginx -EXPOSE 80 -CMD ["nginx", "-g", "daemon off;"] -'; - } - } - - public function submit() - { - $this->validate([ - 'dockerfile' => 'required', - ]); - $destination_uuid = $this->query['destination']; - $destination = StandaloneDocker::where('uuid', $destination_uuid)->first(); - if (! $destination) { - $destination = SwarmDocker::where('uuid', $destination_uuid)->first(); - } - if (! $destination) { - throw new \Exception('Destination not found. What?!'); - } - $destination_class = $destination->getMorphClass(); - - $project = Project::where('uuid', $this->parameters['project_uuid'])->first(); - $environment = $project->load(['environments'])->environments->where('uuid', $this->parameters['environment_uuid'])->first(); - - $port = get_port_from_dockerfile($this->dockerfile); - if (! $port) { - $port = 80; - } - $application = Application::create([ - 'name' => 'dockerfile-'.new Cuid2, - 'repository_project_id' => 0, - 'git_repository' => 'coollabsio/coolify', - 'git_branch' => 'main', - 'build_pack' => 'dockerfile', - 'dockerfile' => $this->dockerfile, - 'ports_exposes' => $port, - 'environment_id' => $environment->id, - 'destination_id' => $destination->id, - 'destination_type' => $destination_class, - 'health_check_enabled' => false, - 'source_id' => 0, - 'source_type' => GithubApp::class, - ]); - - $fqdn = generateFqdn($destination->server, $application->uuid); - $application->update([ - 'name' => 'dockerfile-'.$application->uuid, - 'fqdn' => $fqdn, - ]); - - $application->parseHealthcheckFromDockerfile(dockerfile: collect(str($this->dockerfile)->trim()->explode("\n")), isInit: true); - - return redirect()->route('project.application.configuration', [ - 'application_uuid' => $application->uuid, - 'environment_uuid' => $environment->uuid, - 'project_uuid' => $project->uuid, - ]); - } -} diff --git a/app/Livewire/Project/Resource/Create.php b/app/Livewire/Project/Resource/Create.php deleted file mode 100644 index 0faf0b8da2..0000000000 --- a/app/Livewire/Project/Resource/Create.php +++ /dev/null @@ -1,123 +0,0 @@ -query('type')); - $destination_uuid = request()->query('destination'); - $server_id = request()->query('server_id'); - $database_image = request()->query('database_image'); - - $project = currentTeam()->load(['projects'])->projects->where('uuid', request()->route('project_uuid'))->first(); - if (! $project) { - return redirect()->route('dashboard'); - } - $this->project = $project; - $environment = $project->load(['environments'])->environments->where('uuid', request()->route('environment_uuid'))->first(); - if (! $environment) { - return redirect()->route('dashboard'); - } - if (isset($type) && isset($destination_uuid) && isset($server_id)) { - $services = get_service_templates(); - - if (in_array($type, DATABASE_TYPES)) { - if ($type->value() === 'postgresql') { - $database = create_standalone_postgresql( - environmentId: $environment->id, - destinationUuid: $destination_uuid, - databaseImage: $database_image - ); - } elseif ($type->value() === 'redis') { - $database = create_standalone_redis($environment->id, $destination_uuid); - } elseif ($type->value() === 'mongodb') { - $database = create_standalone_mongodb($environment->id, $destination_uuid); - } elseif ($type->value() === 'mysql') { - $database = create_standalone_mysql($environment->id, $destination_uuid); - } elseif ($type->value() === 'mariadb') { - $database = create_standalone_mariadb($environment->id, $destination_uuid); - } elseif ($type->value() === 'keydb') { - $database = create_standalone_keydb($environment->id, $destination_uuid); - } elseif ($type->value() === 'dragonfly') { - $database = create_standalone_dragonfly($environment->id, $destination_uuid); - } elseif ($type->value() === 'clickhouse') { - $database = create_standalone_clickhouse($environment->id, $destination_uuid); - } - - return redirect()->route('project.database.configuration', [ - 'project_uuid' => $project->uuid, - 'environment_uuid' => $environment->uuid, - 'database_uuid' => $database->uuid, - ]); - } - if ($type->startsWith('one-click-service-') && ! is_null((int) $server_id)) { - $oneClickServiceName = $type->after('one-click-service-')->value(); - $oneClickService = data_get($services, "$oneClickServiceName.compose"); - $oneClickDotEnvs = data_get($services, "$oneClickServiceName.envs", null); - if ($oneClickDotEnvs) { - $oneClickDotEnvs = str(base64_decode($oneClickDotEnvs))->split('/\r\n|\r|\n/')->filter(function ($value) { - return ! empty($value); - }); - } - if ($oneClickService) { - $destination = StandaloneDocker::whereUuid($destination_uuid)->first(); - $service_payload = [ - 'name' => "$oneClickServiceName-".str()->random(10), - 'docker_compose_raw' => base64_decode($oneClickService), - 'environment_id' => $environment->id, - 'service_type' => $oneClickServiceName, - 'server_id' => (int) $server_id, - 'destination_id' => $destination->id, - 'destination_type' => $destination->getMorphClass(), - ]; - if ($oneClickServiceName === 'cloudflared') { - data_set($service_payload, 'connect_to_docker_network', true); - } - $service = Service::create($service_payload); - $service->name = "$oneClickServiceName-".$service->uuid; - $service->save(); - if ($oneClickDotEnvs?->count() > 0) { - $oneClickDotEnvs->each(function ($value) use ($service) { - $key = str()->before($value, '='); - $value = str(str()->after($value, '=')); - if ($value) { - EnvironmentVariable::create([ - 'key' => $key, - 'value' => $value, - 'resourceable_id' => $service->id, - 'resourceable_type' => $service->getMorphClass(), - 'is_build_time' => false, - 'is_preview' => false, - ]); - } - }); - } - $service->parse(isNew: true); - - return redirect()->route('project.service.configuration', [ - 'service_uuid' => $service->uuid, - 'environment_uuid' => $environment->uuid, - 'project_uuid' => $project->uuid, - ]); - } - } - $this->type = $type->value(); - } - } - - public function render() - { - return view('livewire.project.resource.create'); - } -} diff --git a/app/Livewire/Project/Resource/EnvironmentSelect.php b/app/Livewire/Project/Resource/EnvironmentSelect.php deleted file mode 100644 index a38d750daa..0000000000 --- a/app/Livewire/Project/Resource/EnvironmentSelect.php +++ /dev/null @@ -1,35 +0,0 @@ -selectedEnvironment = request()->route('environment_uuid'); - $this->project_uuid = request()->route('project_uuid'); - } - - public function updatedSelectedEnvironment($value) - { - if ($value === 'edit') { - return redirect()->route('project.show', [ - 'project_uuid' => $this->project_uuid, - ]); - } else { - return redirect()->route('project.resource.index', [ - 'project_uuid' => $this->project_uuid, - 'environment_uuid' => $value, - ]); - } - } -} diff --git a/app/Livewire/Project/Resource/Index.php b/app/Livewire/Project/Resource/Index.php deleted file mode 100644 index 2b199dcfd6..0000000000 --- a/app/Livewire/Project/Resource/Index.php +++ /dev/null @@ -1,132 +0,0 @@ -applications = $this->postgresqls = $this->redis = $this->mongodbs = $this->mysqls = $this->mariadbs = $this->keydbs = $this->dragonflies = $this->clickhouses = $this->services = collect(); - $this->parameters = get_route_parameters(); - $project = currentTeam() - ->projects() - ->select('id', 'uuid', 'team_id', 'name') - ->where('uuid', request()->route('project_uuid')) - ->firstOrFail(); - $environment = $project->environments() - ->select('id', 'uuid', 'name', 'project_id') - ->where('uuid', request()->route('environment_uuid')) - ->firstOrFail(); - - $this->project = $project; - $this->environment = $environment->loadCount([ - 'applications', - 'redis', - 'postgresqls', - 'mysqls', - 'keydbs', - 'dragonflies', - 'clickhouses', - 'mariadbs', - 'mongodbs', - 'services', - ]); - - // Eager load all relationships for applications including nested ones - $this->applications = $this->environment->applications()->with([ - 'tags', - 'additional_servers.settings', - 'additional_networks', - 'destination.server.settings', - 'settings', - ])->get()->sortBy('name'); - $this->applications = $this->applications->map(function ($application) { - $application->hrefLink = route('project.application.configuration', [ - 'project_uuid' => data_get($application, 'environment.project.uuid'), - 'environment_uuid' => data_get($application, 'environment.uuid'), - 'application_uuid' => data_get($application, 'uuid'), - ]); - - return $application; - }); - - // Load all database resources in a single query per type - $databaseTypes = [ - 'postgresqls' => 'postgresqls', - 'redis' => 'redis', - 'mongodbs' => 'mongodbs', - 'mysqls' => 'mysqls', - 'mariadbs' => 'mariadbs', - 'keydbs' => 'keydbs', - 'dragonflies' => 'dragonflies', - 'clickhouses' => 'clickhouses', - ]; - - foreach ($databaseTypes as $property => $relation) { - $this->{$property} = $this->environment->{$relation}()->with([ - 'tags', - 'destination.server.settings', - ])->get()->sortBy('name'); - $this->{$property} = $this->{$property}->map(function ($db) { - $db->hrefLink = route('project.database.configuration', [ - 'project_uuid' => $this->project->uuid, - 'database_uuid' => $db->uuid, - 'environment_uuid' => data_get($this->environment, 'uuid'), - ]); - - return $db; - }); - } - - // Load services with their tags and server - $this->services = $this->environment->services()->with([ - 'tags', - 'destination.server.settings', - ])->get()->sortBy('name'); - $this->services = $this->services->map(function ($service) { - $service->hrefLink = route('project.service.configuration', [ - 'project_uuid' => data_get($service, 'environment.project.uuid'), - 'environment_uuid' => data_get($service, 'environment.uuid'), - 'service_uuid' => data_get($service, 'uuid'), - ]); - - return $service; - }); - } - - public function render() - { - return view('livewire.project.resource.index'); - } -} diff --git a/app/Livewire/Project/Service/Configuration.php b/app/Livewire/Project/Service/Configuration.php deleted file mode 100644 index da49dcae98..0000000000 --- a/app/Livewire/Project/Service/Configuration.php +++ /dev/null @@ -1,109 +0,0 @@ - 'check_status', - 'check_status', - 'refreshStatus' => '$refresh', - ]; - } - - public function render() - { - return view('livewire.project.service.configuration'); - } - - public function mount() - { - $this->parameters = get_route_parameters(); - $this->currentRoute = request()->route()->getName(); - $this->query = request()->query(); - $project = currentTeam() - ->projects() - ->select('id', 'uuid', 'team_id') - ->where('uuid', request()->route('project_uuid')) - ->firstOrFail(); - $environment = $project->environments() - ->select('id', 'uuid', 'name', 'project_id') - ->where('uuid', request()->route('environment_uuid')) - ->firstOrFail(); - $this->service = $environment->services()->whereUuid(request()->route('service_uuid'))->firstOrFail(); - - $this->project = $project; - $this->environment = $environment; - $this->applications = $this->service->applications->sort(); - $this->databases = $this->service->databases->sort(); - } - - public function restartApplication($id) - { - try { - $application = $this->service->applications->find($id); - if ($application) { - $application->restart(); - $this->dispatch('success', 'Service application restarted successfully.'); - } - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function restartDatabase($id) - { - try { - $database = $this->service->databases->find($id); - if ($database) { - $database->restart(); - $this->dispatch('success', 'Service database restarted successfully.'); - } - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function check_status() - { - try { - if ($this->service->server->isFunctional()) { - GetContainersStatus::dispatch($this->service->server); - } - $this->service->applications->each(function ($application) { - $application->refresh(); - }); - $this->service->databases->each(function ($database) { - $database->refresh(); - }); - $this->dispatch('refreshStatus'); - } catch (\Exception $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Project/Service/Database.php b/app/Livewire/Project/Service/Database.php deleted file mode 100644 index c3b7577e9d..0000000000 --- a/app/Livewire/Project/Service/Database.php +++ /dev/null @@ -1,129 +0,0 @@ - 'nullable', - 'database.description' => 'nullable', - 'database.image' => 'required', - 'database.exclude_from_status' => 'required|boolean', - 'database.public_port' => 'nullable|integer', - 'database.is_public' => 'required|boolean', - 'database.is_log_drain_enabled' => 'required|boolean', - ]; - - public function render() - { - return view('livewire.project.service.database'); - } - - public function mount() - { - $this->parameters = get_route_parameters(); - if ($this->database->is_public) { - $this->db_url_public = $this->database->getServiceDatabaseUrl(); - } - $this->refreshFileStorages(); - } - - public function delete($password) - { - if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) { - if (! Hash::check($password, Auth::user()->password)) { - $this->addError('password', 'The provided password is incorrect.'); - - return; - } - } - - try { - $this->database->delete(); - $this->dispatch('success', 'Database deleted.'); - - return redirect()->route('project.service.configuration', $this->parameters); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function instantSaveExclude() - { - $this->submit(); - } - - public function instantSaveLogDrain() - { - if (! $this->database->service->destination->server->isLogDrainEnabled()) { - $this->database->is_log_drain_enabled = false; - $this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.'); - - return; - } - $this->submit(); - $this->dispatch('success', 'You need to restart the service for the changes to take effect.'); - } - - public function instantSave() - { - if ($this->database->is_public && ! $this->database->public_port) { - $this->dispatch('error', 'Public port is required.'); - $this->database->is_public = false; - - return; - } - if ($this->database->is_public) { - if (! str($this->database->status)->startsWith('running')) { - $this->dispatch('error', 'Database must be started to be publicly accessible.'); - $this->database->is_public = false; - - return; - } - StartDatabaseProxy::run($this->database); - $this->db_url_public = $this->database->getServiceDatabaseUrl(); - $this->dispatch('success', 'Database is now publicly accessible.'); - } else { - StopDatabaseProxy::run($this->database); - $this->db_url_public = null; - $this->dispatch('success', 'Database is no longer publicly accessible.'); - } - $this->submit(); - } - - public function refreshFileStorages() - { - $this->fileStorages = $this->database->fileStorages()->get(); - } - - public function submit() - { - try { - $this->validate(); - $this->database->save(); - updateCompose($this->database); - $this->dispatch('success', 'Database saved.'); - } catch (\Throwable) { - } finally { - $this->dispatch('generateDockerCompose'); - } - } -} diff --git a/app/Livewire/Project/Service/EditCompose.php b/app/Livewire/Project/Service/EditCompose.php deleted file mode 100644 index b5f2089415..0000000000 --- a/app/Livewire/Project/Service/EditCompose.php +++ /dev/null @@ -1,72 +0,0 @@ - 'envsUpdated', - ]; - - protected $rules = [ - 'service.docker_compose_raw' => 'required', - 'service.docker_compose' => 'required', - 'service.is_container_label_escape_enabled' => 'required', - ]; - - public function envsUpdated() - { - $this->dispatch('saveCompose', $this->service->docker_compose_raw); - $this->refreshEnvs(); - } - - public function refreshEnvs() - { - $this->service = Service::ownedByCurrentTeam()->find($this->serviceId); - } - - public function mount() - { - $this->service = Service::ownedByCurrentTeam()->find($this->serviceId); - } - - public function validateCompose() - { - $isValid = validateComposeFile($this->service->docker_compose_raw, $this->service->server_id); - if ($isValid !== 'OK') { - $this->dispatch('error', "Invalid docker-compose file.\n$isValid"); - } else { - $this->dispatch('success', 'Docker compose is valid.'); - } - } - - public function saveEditedCompose() - { - $this->dispatch('info', 'Saving new docker compose...'); - $this->dispatch('saveCompose', $this->service->docker_compose_raw); - $this->dispatch('refreshStorages'); - } - - public function instantSave() - { - $this->validate([ - 'service.is_container_label_escape_enabled' => 'required', - ]); - $this->service->save(['is_container_label_escape_enabled' => $this->service->is_container_label_escape_enabled]); - $this->dispatch('success', 'Service updated successfully'); - } - - public function render() - { - return view('livewire.project.service.edit-compose'); - } -} diff --git a/app/Livewire/Project/Service/EditDomain.php b/app/Livewire/Project/Service/EditDomain.php deleted file mode 100644 index fb1c052554..0000000000 --- a/app/Livewire/Project/Service/EditDomain.php +++ /dev/null @@ -1,65 +0,0 @@ - 'nullable', - 'application.required_fqdn' => 'required|boolean', - ]; - - public function mount() - { - $this->application = ServiceApplication::find($this->applicationId); - } - - public function submit() - { - try { - $this->application->fqdn = str($this->application->fqdn)->replaceEnd(',', '')->trim(); - $this->application->fqdn = str($this->application->fqdn)->replaceStart(',', '')->trim(); - $this->application->fqdn = str($this->application->fqdn)->trim()->explode(',')->map(function ($domain) { - Url::fromString($domain, ['http', 'https']); - - return str($domain)->trim()->lower(); - }); - $this->application->fqdn = $this->application->fqdn->unique()->implode(','); - $warning = sslipDomainWarning($this->application->fqdn); - if ($warning) { - $this->dispatch('warning', __('warning.sslipdomain')); - } - check_domain_usage(resource: $this->application); - $this->validate(); - $this->application->save(); - updateCompose($this->application); - if (str($this->application->fqdn)->contains(',')) { - $this->dispatch('warning', 'Some services do not support multiple domains, which can lead to problems and is NOT RECOMMENDED.

Only use multiple domains if you know what you are doing.'); - } - $this->application->service->parse(); - $this->dispatch('refresh'); - $this->dispatch('configurationChanged'); - $this->dispatch('refreshStatus'); - } catch (\Throwable $e) { - $originalFqdn = $this->application->getOriginal('fqdn'); - if ($originalFqdn !== $this->application->fqdn) { - $this->application->fqdn = $originalFqdn; - } - - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.project.service.edit-domain'); - } -} diff --git a/app/Livewire/Project/Service/FileStorage.php b/app/Livewire/Project/Service/FileStorage.php deleted file mode 100644 index 4d070bc0cc..0000000000 --- a/app/Livewire/Project/Service/FileStorage.php +++ /dev/null @@ -1,152 +0,0 @@ - 'required', - 'fileStorage.fs_path' => 'required', - 'fileStorage.mount_path' => 'required', - 'fileStorage.content' => 'nullable', - 'fileStorage.is_based_on_git' => 'required|boolean', - ]; - - public function mount() - { - $this->resource = $this->fileStorage->service; - if (str($this->fileStorage->fs_path)->startsWith('.')) { - $this->workdir = $this->resource->service?->workdir(); - $this->fs_path = str($this->fileStorage->fs_path)->after('.'); - } else { - $this->workdir = null; - $this->fs_path = $this->fileStorage->fs_path; - } - $this->fileStorage->loadStorageOnServer(); - } - - public function convertToDirectory() - { - try { - $this->fileStorage->deleteStorageOnServer(); - $this->fileStorage->is_directory = true; - $this->fileStorage->content = null; - $this->fileStorage->is_based_on_git = false; - $this->fileStorage->save(); - $this->fileStorage->saveStorageOnServer(); - } catch (\Throwable $e) { - return handleError($e, $this); - } finally { - $this->dispatch('refreshStorages'); - } - } - - public function convertToFile() - { - try { - $this->fileStorage->deleteStorageOnServer(); - $this->fileStorage->is_directory = false; - $this->fileStorage->content = null; - if (data_get($this->resource, 'settings.is_preserve_repository_enabled')) { - $this->fileStorage->is_based_on_git = true; - } - $this->fileStorage->save(); - $this->fileStorage->saveStorageOnServer(); - } catch (\Throwable $e) { - return handleError($e, $this); - } finally { - $this->dispatch('refreshStorages'); - } - } - - public function delete($password) - { - if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) { - if (! Hash::check($password, Auth::user()->password)) { - $this->addError('password', 'The provided password is incorrect.'); - - return; - } - } - - try { - $message = 'File deleted.'; - if ($this->fileStorage->is_directory) { - $message = 'Directory deleted.'; - } - if ($this->permanently_delete) { - $message = 'Directory deleted from the server.'; - $this->fileStorage->deleteStorageOnServer(); - } - $this->fileStorage->delete(); - $this->dispatch('success', $message); - } catch (\Throwable $e) { - return handleError($e, $this); - } finally { - $this->dispatch('refreshStorages'); - } - } - - public function submit() - { - $original = $this->fileStorage->getOriginal(); - try { - $this->validate(); - if ($this->fileStorage->is_directory) { - $this->fileStorage->content = null; - } - $this->fileStorage->save(); - $this->fileStorage->saveStorageOnServer(); - $this->dispatch('success', 'File updated.'); - } catch (\Throwable $e) { - $this->fileStorage->setRawAttributes($original); - $this->fileStorage->save(); - - return handleError($e, $this); - } - } - - public function instantSave() - { - $this->submit(); - } - - public function render() - { - return view('livewire.project.service.file-storage', [ - 'directoryDeletionCheckboxes' => [ - ['id' => 'permanently_delete', 'label' => 'The selected directory and all its contents will be permantely deleted form the server.'], - ], - 'fileDeletionCheckboxes' => [ - ['id' => 'permanently_delete', 'label' => 'The selected file will be permanently deleted form the server.'], - ], - ]); - } -} diff --git a/app/Livewire/Project/Service/Index.php b/app/Livewire/Project/Service/Index.php deleted file mode 100644 index ba4ebe2fca..0000000000 --- a/app/Livewire/Project/Service/Index.php +++ /dev/null @@ -1,62 +0,0 @@ -services = collect([]); - $this->parameters = get_route_parameters(); - $this->query = request()->query(); - $this->service = Service::whereUuid($this->parameters['service_uuid'])->first(); - if (! $this->service) { - return redirect()->route('dashboard'); - } - $service = $this->service->applications()->whereUuid($this->parameters['stack_service_uuid'])->first(); - if ($service) { - $this->serviceApplication = $service; - $this->serviceApplication->getFilesFromServer(); - } else { - $this->serviceDatabase = $this->service->databases()->whereUuid($this->parameters['stack_service_uuid'])->first(); - $this->serviceDatabase->getFilesFromServer(); - } - $this->s3s = currentTeam()->s3s; - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function generateDockerCompose() - { - $this->service->parse(); - } - - public function render() - { - return view('livewire.project.service.index'); - } -} diff --git a/app/Livewire/Project/Service/Navbar.php b/app/Livewire/Project/Service/Navbar.php deleted file mode 100644 index 5da425cbd1..0000000000 --- a/app/Livewire/Project/Service/Navbar.php +++ /dev/null @@ -1,154 +0,0 @@ -service->status)->contains('running') && is_null($this->service->config_hash)) { - $this->service->isConfigurationChanged(true); - $this->dispatch('configurationChanged'); - } - } - - public function getListeners() - { - $userId = Auth::id(); - - return [ - "echo-private:user.{$userId},ServiceStatusChanged" => 'serviceStarted', - 'envsUpdated' => '$refresh', - 'refreshStatus' => '$refresh', - ]; - } - - public function serviceStarted() - { - // $this->dispatch('success', 'Service status changed.'); - if (is_null($this->service->config_hash) || $this->service->isConfigurationChanged()) { - $this->service->isConfigurationChanged(true); - $this->dispatch('configurationChanged'); - } else { - $this->dispatch('configurationChanged'); - } - } - - public function check_status_without_notification() - { - $this->dispatch('check_status'); - } - - public function check_status() - { - $this->dispatch('check_status'); - $this->dispatch('success', 'Service status updated.'); - } - - public function checkDeployments() - { - try { - $activity = Activity::where('properties->type_uuid', $this->service->uuid)->latest()->first(); - $status = data_get($activity, 'properties.status'); - if ($status === ProcessStatus::QUEUED->value || $status === ProcessStatus::IN_PROGRESS->value) { - $this->isDeploymentProgress = true; - } else { - $this->isDeploymentProgress = false; - } - } catch (\Throwable) { - $this->isDeploymentProgress = false; - } - - return $this->isDeploymentProgress; - } - - public function start() - { - $activity = StartService::run($this->service, pullLatestImages: true); - $this->dispatch('activityMonitor', $activity->id); - } - - public function forceDeploy() - { - try { - $activities = Activity::where('properties->type_uuid', $this->service->uuid)->where('properties->status', ProcessStatus::IN_PROGRESS->value)->orWhere('properties->status', ProcessStatus::QUEUED->value)->get(); - foreach ($activities as $activity) { - $activity->properties->status = ProcessStatus::ERROR->value; - $activity->save(); - } - $activity = StartService::run($this->service, pullLatestImages: true, stopBeforeStart: true); - $this->dispatch('activityMonitor', $activity->id); - } catch (\Exception $e) { - $this->dispatch('error', $e->getMessage()); - } - } - - public function stop($cleanupContainers = false) - { - try { - StopService::run($this->service, false, $this->docker_cleanup); - ServiceStatusChanged::dispatch(); - if ($cleanupContainers) { - $this->dispatch('success', 'Containers cleaned up.'); - } else { - $this->dispatch('success', 'Service stopped.'); - } - } catch (\Exception $e) { - $this->dispatch('error', $e->getMessage()); - } - } - - public function restart() - { - $this->checkDeployments(); - if ($this->isDeploymentProgress) { - $this->dispatch('error', 'There is a deployment in progress.'); - - return; - } - $activity = StartService::run($this->service, stopBeforeStart: true); - $this->dispatch('activityMonitor', $activity->id); - } - - public function pullAndRestartEvent() - { - $this->checkDeployments(); - if ($this->isDeploymentProgress) { - $this->dispatch('error', 'There is a deployment in progress.'); - - return; - } - $activity = StartService::run($this->service, pullLatestImages: true, stopBeforeStart: true); - $this->dispatch('activityMonitor', $activity->id); - } - - public function render() - { - return view('livewire.project.service.navbar', [ - 'checkboxes' => [ - ['id' => 'docker_cleanup', 'label' => __('resource.docker_cleanup')], - ], - ]); - } -} diff --git a/app/Livewire/Project/Service/ServiceApplicationView.php b/app/Livewire/Project/Service/ServiceApplicationView.php deleted file mode 100644 index 8324ee645c..0000000000 --- a/app/Livewire/Project/Service/ServiceApplicationView.php +++ /dev/null @@ -1,123 +0,0 @@ - 'nullable', - 'application.description' => 'nullable', - 'application.fqdn' => 'nullable', - 'application.image' => 'required', - 'application.exclude_from_status' => 'required|boolean', - 'application.required_fqdn' => 'required|boolean', - 'application.is_log_drain_enabled' => 'nullable|boolean', - 'application.is_gzip_enabled' => 'nullable|boolean', - 'application.is_stripprefix_enabled' => 'nullable|boolean', - ]; - - public function instantSave() - { - $this->submit(); - } - - public function instantSaveAdvanced() - { - if (! $this->application->service->destination->server->isLogDrainEnabled()) { - $this->application->is_log_drain_enabled = false; - $this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.'); - - return; - } - $this->application->save(); - $this->dispatch('success', 'You need to restart the service for the changes to take effect.'); - } - - public function delete($password) - { - if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) { - if (! Hash::check($password, Auth::user()->password)) { - $this->addError('password', 'The provided password is incorrect.'); - - return; - } - } - - try { - $this->application->delete(); - $this->dispatch('success', 'Application deleted.'); - - return redirect()->route('project.service.configuration', $this->parameters); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function mount() - { - $this->parameters = get_route_parameters(); - } - - public function submit() - { - try { - $this->application->fqdn = str($this->application->fqdn)->replaceEnd(',', '')->trim(); - $this->application->fqdn = str($this->application->fqdn)->replaceStart(',', '')->trim(); - $this->application->fqdn = str($this->application->fqdn)->trim()->explode(',')->map(function ($domain) { - Url::fromString($domain, ['http', 'https']); - - return str($domain)->trim()->lower(); - }); - $this->application->fqdn = $this->application->fqdn->unique()->implode(','); - $warning = sslipDomainWarning($this->application->fqdn); - if ($warning) { - $this->dispatch('warning', __('warning.sslipdomain')); - } - check_domain_usage(resource: $this->application); - $this->validate(); - $this->application->save(); - updateCompose($this->application); - if (str($this->application->fqdn)->contains(',')) { - $this->dispatch('warning', 'Some services do not support multiple domains, which can lead to problems and is NOT RECOMMENDED.

Only use multiple domains if you know what you are doing.'); - } else { - ! $warning && $this->dispatch('success', 'Service saved.'); - } - $this->dispatch('generateDockerCompose'); - } catch (\Throwable $e) { - $originalFqdn = $this->application->getOriginal('fqdn'); - if ($originalFqdn !== $this->application->fqdn) { - $this->application->fqdn = $originalFqdn; - } - - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.project.service.service-application-view', [ - 'checkboxes' => [ - ['id' => 'delete_volumes', 'label' => __('resource.delete_volumes')], - ['id' => 'docker_cleanup', 'label' => __('resource.docker_cleanup')], - // ['id' => 'delete_associated_backups_locally', 'label' => 'All backups associated with this Ressource will be permanently deleted from local storage.'], - // ['id' => 'delete_associated_backups_s3', 'label' => 'All backups associated with this Ressource will be permanently deleted from the selected S3 Storage.'], - // ['id' => 'delete_associated_backups_sftp', 'label' => 'All backups associated with this Ressource will be permanently deleted from the selected SFTP Storage.'] - ], - ]); - } -} diff --git a/app/Livewire/Project/Service/StackForm.php b/app/Livewire/Project/Service/StackForm.php deleted file mode 100644 index 3685984660..0000000000 --- a/app/Livewire/Project/Service/StackForm.php +++ /dev/null @@ -1,101 +0,0 @@ - 'required', - 'service.docker_compose' => 'required', - 'service.name' => 'required', - 'service.description' => 'nullable', - 'service.connect_to_docker_network' => 'nullable', - ]; - - public $validationAttributes = []; - - public function mount() - { - $this->fields = collect([]); - $extraFields = $this->service->extraFields(); - foreach ($extraFields as $serviceName => $fields) { - foreach ($fields as $fieldKey => $field) { - $key = data_get($field, 'key'); - $value = data_get($field, 'value'); - $rules = data_get($field, 'rules', 'nullable'); - $isPassword = data_get($field, 'isPassword', false); - $customHelper = data_get($field, 'customHelper', false); - $this->fields->put($key, [ - 'serviceName' => $serviceName, - 'key' => $key, - 'name' => $fieldKey, - 'value' => $value, - 'isPassword' => $isPassword, - 'rules' => $rules, - 'customHelper' => $customHelper, - ]); - - $this->rules["fields.$key.value"] = $rules; - $this->validationAttributes["fields.$key.value"] = $fieldKey; - } - } - $this->fields = $this->fields->groupBy('serviceName')->map(function ($group) { - return $group->sortBy(function ($field) { - return data_get($field, 'isPassword') ? 1 : 0; - })->mapWithKeys(function ($field) { - return [$field['key'] => $field]; - }); - })->flatMap(function ($group) { - return $group; - }); - } - - public function saveCompose($raw) - { - $this->service->docker_compose_raw = $raw; - $this->submit(notify: true); - } - - public function instantSave() - { - $this->service->save(); - $this->dispatch('success', 'Service settings saved.'); - } - - public function submit($notify = true) - { - try { - $this->validate(); - $this->service->save(); - $this->service->saveExtraFields($this->fields); - $this->service->parse(); - $this->service->refresh(); - $this->service->saveComposeConfigs(); - $this->dispatch('refreshEnvs'); - $notify && $this->dispatch('success', 'Service saved.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } finally { - if (is_null($this->service->config_hash)) { - $this->service->isConfigurationChanged(true); - } else { - $this->dispatch('configurationChanged'); - } - } - } - - public function render() - { - return view('livewire.project.service.stack-form'); - } -} diff --git a/app/Livewire/Project/Service/Storage.php b/app/Livewire/Project/Service/Storage.php deleted file mode 100644 index 4b64a8b5ef..0000000000 --- a/app/Livewire/Project/Service/Storage.php +++ /dev/null @@ -1,65 +0,0 @@ -user()->currentTeam()->id; - - return [ - "echo-private:team.{$teamId},FileStorageChanged" => 'refreshStoragesFromEvent', - 'refreshStorages', - 'addNewVolume', - ]; - } - - public function mount() - { - $this->refreshStorages(); - } - - public function refreshStoragesFromEvent() - { - $this->refreshStorages(); - $this->dispatch('warning', 'File storage changed. Usually it means that the file / directory is already defined on the server, so Coolify set it up for you properly on the UI.'); - } - - public function refreshStorages() - { - $this->fileStorage = $this->resource->fileStorages()->get(); - $this->dispatch('$refresh'); - } - - public function addNewVolume($data) - { - try { - LocalPersistentVolume::create([ - 'name' => $data['name'], - 'mount_path' => $data['mount_path'], - 'host_path' => $data['host_path'], - 'resource_id' => $this->resource->id, - 'resource_type' => $this->resource->getMorphClass(), - ]); - $this->resource->refresh(); - $this->dispatch('success', 'Storage added successfully'); - $this->dispatch('clearAddStorage'); - $this->dispatch('refreshStorages'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.project.service.storage'); - } -} diff --git a/app/Livewire/Project/Shared/ConfigurationChecker.php b/app/Livewire/Project/Shared/ConfigurationChecker.php deleted file mode 100644 index ab9f3785df..0000000000 --- a/app/Livewire/Project/Shared/ConfigurationChecker.php +++ /dev/null @@ -1,39 +0,0 @@ -configurationChanged(); - } - - public function render() - { - return view('livewire.project.shared.configuration-checker'); - } - - public function configurationChanged() - { - $this->isConfigurationChanged = $this->resource->isConfigurationChanged(); - } -} diff --git a/app/Livewire/Project/Shared/Danger.php b/app/Livewire/Project/Shared/Danger.php deleted file mode 100644 index 7da48f9fb4..0000000000 --- a/app/Livewire/Project/Shared/Danger.php +++ /dev/null @@ -1,131 +0,0 @@ -modalId = new Cuid2; - $this->projectUuid = data_get($parameters, 'project_uuid'); - $this->environmentUuid = data_get($parameters, 'environment_uuid'); - - if ($this->resource === null) { - if (isset($parameters['service_uuid'])) { - $this->resource = Service::where('uuid', $parameters['service_uuid'])->first(); - } elseif (isset($parameters['stack_service_uuid'])) { - $this->resource = ServiceApplication::where('uuid', $parameters['stack_service_uuid'])->first() - ?? ServiceDatabase::where('uuid', $parameters['stack_service_uuid'])->first(); - } - } - - if ($this->resource === null) { - $this->resourceName = 'Unknown Resource'; - - return; - } - - if (! method_exists($this->resource, 'type')) { - $this->resourceName = 'Unknown Resource'; - - return; - } - - $this->resourceName = match ($this->resource->type()) { - 'application' => $this->resource->name ?? 'Application', - 'standalone-postgresql', - 'standalone-redis', - 'standalone-mongodb', - 'standalone-mysql', - 'standalone-mariadb', - 'standalone-keydb', - 'standalone-dragonfly', - 'standalone-clickhouse' => $this->resource->name ?? 'Database', - 'service' => $this->resource->name ?? 'Service', - 'service-application' => $this->resource->name ?? 'Service Application', - 'service-database' => $this->resource->name ?? 'Service Database', - default => 'Unknown Resource', - }; - } - - public function delete($password) - { - if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) { - if (! Hash::check($password, Auth::user()->password)) { - $this->addError('password', 'The provided password is incorrect.'); - - return; - } - } - - if (! $this->resource) { - $this->addError('resource', 'Resource not found.'); - - return; - } - - try { - $this->resource->delete(); - DeleteResourceJob::dispatch( - $this->resource, - $this->delete_configurations, - $this->delete_volumes, - $this->docker_cleanup, - $this->delete_connected_networks - ); - - return redirect()->route('project.resource.index', [ - 'project_uuid' => $this->projectUuid, - 'environment_uuid' => $this->environmentUuid, - ]); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.project.shared.danger', [ - 'checkboxes' => [ - ['id' => 'delete_volumes', 'label' => __('resource.delete_volumes')], - ['id' => 'delete_connected_networks', 'label' => __('resource.delete_connected_networks')], - ['id' => 'delete_configurations', 'label' => __('resource.delete_configurations')], - ['id' => 'docker_cleanup', 'label' => __('resource.docker_cleanup')], - // ['id' => 'delete_associated_backups_locally', 'label' => 'All backups associated with this Ressource will be permanently deleted from local storage.'], - // ['id' => 'delete_associated_backups_s3', 'label' => 'All backups associated with this Ressource will be permanently deleted from the selected S3 Storage.'], - // ['id' => 'delete_associated_backups_sftp', 'label' => 'All backups associated with this Ressource will be permanently deleted from the selected SFTP Storage.'] - ], - ]); - } -} diff --git a/app/Livewire/Project/Shared/Destination.php b/app/Livewire/Project/Shared/Destination.php deleted file mode 100644 index 1759fe08ac..0000000000 --- a/app/Livewire/Project/Shared/Destination.php +++ /dev/null @@ -1,155 +0,0 @@ -user()->currentTeam()->id; - - return [ - "echo-private:team.{$teamId},ApplicationStatusChanged" => 'loadData', - ]; - } - - public function mount() - { - $this->networks = collect([]); - $this->loadData(); - } - - public function loadData() - { - $all_networks = collect([]); - $all_networks = $all_networks->push($this->resource->destination); - $all_networks = $all_networks->merge($this->resource->additional_networks); - - $this->networks = Server::isUsable()->get()->map(function ($server) { - return $server->standaloneDockers; - })->flatten(); - $this->networks = $this->networks->reject(function ($network) use ($all_networks) { - return $all_networks->pluck('id')->contains($network->id); - }); - $this->networks = $this->networks->reject(function ($network) { - return $this->resource->destination->server->id == $network->server->id; - }); - if ($this->resource?->additional_servers?->count() > 0) { - $this->networks = $this->networks->reject(function ($network) { - return $this->resource->additional_servers->pluck('id')->contains($network->server->id); - }); - } - } - - public function stop($serverId) - { - try { - $server = Server::ownedByCurrentTeam()->findOrFail($serverId); - StopApplicationOneServer::run($this->resource, $server); - $this->refreshServers(); - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function redeploy(int $network_id, int $server_id) - { - try { - if ($this->resource->additional_servers->count() > 0 && str($this->resource->docker_registry_image_name)->isEmpty()) { - $this->dispatch('error', 'Failed to deploy.', 'Before deploying to multiple servers, you must first set a Docker image in the General tab.
More information here: documentation'); - - return; - } - $deployment_uuid = new Cuid2; - $server = Server::ownedByCurrentTeam()->findOrFail($server_id); - $destination = $server->standaloneDockers->where('id', $network_id)->firstOrFail(); - queue_application_deployment( - deployment_uuid: $deployment_uuid, - application: $this->resource, - server: $server, - destination: $destination, - only_this_server: true, - no_questions_asked: true, - ); - - return redirect()->route('project.application.deployment.show', [ - 'project_uuid' => data_get($this->resource, 'environment.project.uuid'), - 'application_uuid' => data_get($this->resource, 'uuid'), - 'deployment_uuid' => $deployment_uuid, - 'environment_uuid' => data_get($this->resource, 'environment.uuid'), - ]); - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function promote(int $network_id, int $server_id) - { - $main_destination = $this->resource->destination; - $this->resource->update([ - 'destination_id' => $network_id, - 'destination_type' => StandaloneDocker::class, - ]); - $this->resource->additional_networks()->detach($network_id, ['server_id' => $server_id]); - $this->resource->additional_networks()->attach($main_destination->id, ['server_id' => $main_destination->server->id]); - $this->refreshServers(); - } - - public function refreshServers() - { - GetContainersStatus::run($this->resource->destination->server); - // ContainerStatusJob::dispatchSync($this->resource->destination->server); - $this->loadData(); - $this->dispatch('refresh'); - ApplicationStatusChanged::dispatch(data_get($this->resource, 'environment.project.team.id')); - } - - public function addServer(int $network_id, int $server_id) - { - $this->resource->additional_networks()->attach($network_id, ['server_id' => $server_id]); - $this->loadData(); - ApplicationStatusChanged::dispatch(data_get($this->resource, 'environment.project.team.id')); - } - - public function removeServer(int $network_id, int $server_id, $password) - { - try { - if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) { - if (! Hash::check($password, Auth::user()->password)) { - $this->addError('password', 'The provided password is incorrect.'); - - return; - } - } - - if ($this->resource->destination->server->id == $server_id && $this->resource->destination->id == $network_id) { - $this->dispatch('error', 'You cannot remove this destination server.', 'You are trying to remove the main server.'); - - return; - } - $server = Server::ownedByCurrentTeam()->findOrFail($server_id); - StopApplicationOneServer::run($this->resource, $server); - $this->resource->additional_networks()->detach($network_id, ['server_id' => $server_id]); - $this->loadData(); - ApplicationStatusChanged::dispatch(data_get($this->resource, 'environment.project.team.id')); - } catch (\Exception $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Project/Shared/EnvironmentVariable/Add.php b/app/Livewire/Project/Shared/EnvironmentVariable/Add.php deleted file mode 100644 index 0dbf0f957f..0000000000 --- a/app/Livewire/Project/Shared/EnvironmentVariable/Add.php +++ /dev/null @@ -1,70 +0,0 @@ - 'clear']; - - protected $rules = [ - 'key' => 'required|string', - 'value' => 'nullable', - 'is_build_time' => 'required|boolean', - 'is_multiline' => 'required|boolean', - 'is_literal' => 'required|boolean', - ]; - - protected $validationAttributes = [ - 'key' => 'key', - 'value' => 'value', - 'is_build_time' => 'build', - 'is_multiline' => 'multiline', - 'is_literal' => 'literal', - ]; - - public function mount() - { - $this->parameters = get_route_parameters(); - } - - public function submit() - { - $this->validate(); - $this->dispatch('saveKey', [ - 'key' => $this->key, - 'value' => $this->value, - 'is_build_time' => $this->is_build_time, - 'is_multiline' => $this->is_multiline, - 'is_literal' => $this->is_literal, - 'is_preview' => $this->is_preview, - ]); - $this->clear(); - } - - public function clear() - { - $this->key = ''; - $this->value = ''; - $this->is_build_time = false; - $this->is_multiline = false; - $this->is_literal = false; - } -} diff --git a/app/Livewire/Project/Shared/EnvironmentVariable/All.php b/app/Livewire/Project/Shared/EnvironmentVariable/All.php deleted file mode 100644 index 35e585c82e..0000000000 --- a/app/Livewire/Project/Shared/EnvironmentVariable/All.php +++ /dev/null @@ -1,225 +0,0 @@ - 'submit', - 'refreshEnvs', - 'environmentVariableDeleted' => 'refreshEnvs', - ]; - - public function mount() - { - $this->is_env_sorting_enabled = data_get($this->resource, 'settings.is_env_sorting_enabled', false); - $this->resourceClass = get_class($this->resource); - $resourceWithPreviews = [\App\Models\Application::class]; - $simpleDockerfile = filled(data_get($this->resource, 'dockerfile')); - if (str($this->resourceClass)->contains($resourceWithPreviews) && ! $simpleDockerfile) { - $this->showPreview = true; - } - $this->sortEnvironmentVariables(); - } - - public function instantSave() - { - $this->resource->settings->is_env_sorting_enabled = $this->is_env_sorting_enabled; - $this->resource->settings->save(); - $this->sortEnvironmentVariables(); - $this->dispatch('success', 'Environment variable settings updated.'); - } - - public function sortEnvironmentVariables() - { - if ($this->is_env_sorting_enabled === false) { - if ($this->resource->environment_variables) { - $this->resource->environment_variables = $this->resource->environment_variables->sortBy('order')->values(); - } - - if ($this->resource->environment_variables_preview) { - $this->resource->environment_variables_preview = $this->resource->environment_variables_preview->sortBy('order')->values(); - } - } - - $this->getDevView(); - } - - public function getDevView() - { - $this->variables = $this->formatEnvironmentVariables($this->resource->environment_variables); - if ($this->showPreview) { - $this->variablesPreview = $this->formatEnvironmentVariables($this->resource->environment_variables_preview); - } - } - - private function formatEnvironmentVariables($variables) - { - return $variables->map(function ($item) { - if ($item->is_shown_once) { - return "$item->key=(Locked Secret, delete and add again to change)"; - } - if ($item->is_multiline) { - return "$item->key=(Multiline environment variable, edit in normal view)"; - } - - return "$item->key=$item->value"; - })->join("\n"); - } - - public function switch() - { - $this->view = $this->view === 'normal' ? 'dev' : 'normal'; - $this->sortEnvironmentVariables(); - } - - public function submit($data = null) - { - try { - if ($data === null) { - $this->handleBulkSubmit(); - } else { - $this->handleSingleSubmit($data); - } - - $this->updateOrder(); - $this->sortEnvironmentVariables(); - } catch (\Throwable $e) { - return handleError($e, $this); - } finally { - $this->refreshEnvs(); - } - } - - private function updateOrder() - { - $variables = parseEnvFormatToArray($this->variables); - $order = 1; - foreach ($variables as $key => $value) { - $env = $this->resource->environment_variables()->where('key', $key)->first(); - if ($env) { - $env->order = $order; - $env->save(); - } - $order++; - } - - if ($this->showPreview) { - $previewVariables = parseEnvFormatToArray($this->variablesPreview); - $order = 1; - foreach ($previewVariables as $key => $value) { - $env = $this->resource->environment_variables_preview()->where('key', $key)->first(); - if ($env) { - $env->order = $order; - $env->save(); - } - $order++; - } - } - } - - private function handleBulkSubmit() - { - $variables = parseEnvFormatToArray($this->variables); - - $this->deleteRemovedVariables(false, $variables); - $this->updateOrCreateVariables(false, $variables); - - if ($this->showPreview) { - $previewVariables = parseEnvFormatToArray($this->variablesPreview); - $this->deleteRemovedVariables(true, $previewVariables); - $this->updateOrCreateVariables(true, $previewVariables); - } - - $this->dispatch('success', 'Environment variables updated.'); - } - - private function handleSingleSubmit($data) - { - $found = $this->resource->environment_variables()->where('key', $data['key'])->first(); - if ($found) { - $this->dispatch('error', 'Environment variable already exists.'); - - return; - } - - $maxOrder = $this->resource->environment_variables()->max('order') ?? 0; - $environment = $this->createEnvironmentVariable($data); - $environment->order = $maxOrder + 1; - $environment->save(); - } - - private function createEnvironmentVariable($data) - { - $environment = new EnvironmentVariable; - $environment->key = $data['key']; - $environment->value = $data['value']; - $environment->is_build_time = $data['is_build_time'] ?? false; - $environment->is_multiline = $data['is_multiline'] ?? false; - $environment->is_literal = $data['is_literal'] ?? false; - $environment->is_preview = $data['is_preview'] ?? false; - $environment->resourceable_id = $this->resource->id; - $environment->resourceable_type = $this->resource->getMorphClass(); - - return $environment; - } - - private function deleteRemovedVariables($isPreview, $variables) - { - $method = $isPreview ? 'environment_variables_preview' : 'environment_variables'; - $this->resource->$method()->whereNotIn('key', array_keys($variables))->delete(); - } - - private function updateOrCreateVariables($isPreview, $variables) - { - foreach ($variables as $key => $value) { - if (str($key)->startsWith('SERVICE_FQDN') || str($key)->startsWith('SERVICE_URL')) { - continue; - } - $method = $isPreview ? 'environment_variables_preview' : 'environment_variables'; - $found = $this->resource->$method()->where('key', $key)->first(); - - if ($found) { - if (! $found->is_shown_once && ! $found->is_multiline) { - $found->value = $value; - $found->save(); - } - } else { - $environment = new EnvironmentVariable; - $environment->key = $key; - $environment->value = $value; - $environment->is_build_time = false; - $environment->is_multiline = false; - $environment->is_preview = $isPreview; - $environment->resourceable_id = $this->resource->id; - $environment->resourceable_type = $this->resource->getMorphClass(); - - $environment->save(); - } - } - } - - public function refreshEnvs() - { - $this->resource->refresh(); - $this->sortEnvironmentVariables(); - $this->getDevView(); - } -} diff --git a/app/Livewire/Project/Shared/EnvironmentVariable/Show.php b/app/Livewire/Project/Shared/EnvironmentVariable/Show.php deleted file mode 100644 index 3a7d0faa57..0000000000 --- a/app/Livewire/Project/Shared/EnvironmentVariable/Show.php +++ /dev/null @@ -1,181 +0,0 @@ - 'refresh', - 'refresh', - 'compose_loaded' => '$refresh', - ]; - - protected $rules = [ - 'key' => 'required|string', - 'value' => 'nullable', - 'is_build_time' => 'required|boolean', - 'is_multiline' => 'required|boolean', - 'is_literal' => 'required|boolean', - 'is_shown_once' => 'required|boolean', - 'real_value' => 'nullable', - 'is_required' => 'required|boolean', - ]; - - public function mount() - { - $this->syncData(); - if ($this->env->getMorphClass() === \App\Models\SharedEnvironmentVariable::class) { - $this->isSharedVariable = true; - } - $this->parameters = get_route_parameters(); - $this->checkEnvs(); - - } - - public function refresh() - { - $this->syncData(); - $this->checkEnvs(); - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - if ($this->isSharedVariable) { - $this->validate([ - 'key' => 'required|string', - 'value' => 'nullable', - 'is_multiline' => 'required|boolean', - 'is_literal' => 'required|boolean', - 'is_shown_once' => 'required|boolean', - 'real_value' => 'nullable', - ]); - } else { - $this->validate(); - $this->env->is_build_time = $this->is_build_time; - $this->env->is_required = $this->is_required; - $this->env->is_shared = $this->is_shared; - } - $this->env->key = $this->key; - $this->env->value = $this->value; - $this->env->is_multiline = $this->is_multiline; - $this->env->is_literal = $this->is_literal; - $this->env->is_shown_once = $this->is_shown_once; - $this->env->save(); - } else { - $this->key = $this->env->key; - $this->value = $this->env->value; - $this->is_build_time = $this->env->is_build_time ?? false; - $this->is_multiline = $this->env->is_multiline; - $this->is_literal = $this->env->is_literal; - $this->is_shown_once = $this->env->is_shown_once; - $this->is_required = $this->env->is_required ?? false; - $this->is_really_required = $this->env->is_really_required ?? false; - $this->is_shared = $this->env->is_shared ?? false; - $this->real_value = $this->env->real_value; - } - } - - public function checkEnvs() - { - $this->isDisabled = false; - if (str($this->env->key)->startsWith('SERVICE_FQDN') || str($this->env->key)->startsWith('SERVICE_URL')) { - $this->isDisabled = true; - } - if ($this->env->is_shown_once) { - $this->isLocked = true; - } - } - - public function serialize() - { - data_forget($this->env, 'real_value'); - if ($this->env->getMorphClass() === \App\Models\SharedEnvironmentVariable::class) { - data_forget($this->env, 'is_build_time'); - } - } - - public function lock() - { - $this->env->is_shown_once = true; - if ($this->isSharedVariable) { - unset($this->env->is_required); - } - $this->serialize(); - $this->env->save(); - $this->checkEnvs(); - $this->dispatch('refreshEnvs'); - } - - public function instantSave() - { - $this->submit(); - } - - public function submit() - { - try { - if (! $this->isSharedVariable && $this->is_required && str($this->value)->isEmpty()) { - $oldValue = $this->env->getOriginal('value'); - $this->value = $oldValue; - $this->dispatch('error', 'Required environment variables cannot be empty.'); - - return; - } - - $this->serialize(); - $this->syncData(true); - $this->dispatch('success', 'Environment variable updated.'); - $this->dispatch('envsUpdated'); - } catch (\Exception $e) { - return handleError($e); - } - } - - public function delete() - { - try { - $this->env->delete(); - $this->dispatch('environmentVariableDeleted'); - $this->dispatch('success', 'Environment variable deleted successfully.'); - } catch (\Exception $e) { - return handleError($e); - } - } -} diff --git a/app/Livewire/Project/Shared/ExecuteContainerCommand.php b/app/Livewire/Project/Shared/ExecuteContainerCommand.php deleted file mode 100644 index 98289c5365..0000000000 --- a/app/Livewire/Project/Shared/ExecuteContainerCommand.php +++ /dev/null @@ -1,242 +0,0 @@ - 'required', - 'container' => 'required', - 'command' => 'required', - ]; - - public function mount() - { - if (! auth()->user()->isAdmin()) { - abort(403); - } - $this->parameters = get_route_parameters(); - $this->containers = collect(); - $this->servers = collect(); - if (data_get($this->parameters, 'application_uuid')) { - $this->type = 'application'; - $this->resource = Application::where('uuid', $this->parameters['application_uuid'])->firstOrFail(); - if ($this->resource->destination->server->isFunctional()) { - $this->servers = $this->servers->push($this->resource->destination->server); - } - foreach ($this->resource->additional_servers as $server) { - if ($server->isFunctional()) { - $this->servers = $this->servers->push($server); - } - } - $this->loadContainers(); - } elseif (data_get($this->parameters, 'database_uuid')) { - $this->type = 'database'; - $resource = getResourceByUuid($this->parameters['database_uuid'], data_get(auth()->user()->currentTeam(), 'id')); - if (is_null($resource)) { - abort(404); - } - $this->resource = $resource; - if ($this->resource->destination->server->isFunctional()) { - $this->servers = $this->servers->push($this->resource->destination->server); - } - $this->loadContainers(); - } elseif (data_get($this->parameters, 'service_uuid')) { - $this->type = 'service'; - $this->resource = Service::where('uuid', $this->parameters['service_uuid'])->firstOrFail(); - if ($this->resource->server->isFunctional()) { - $this->servers = $this->servers->push($this->resource->server); - } - $this->loadContainers(); - } elseif (data_get($this->parameters, 'server_uuid')) { - $this->type = 'server'; - $this->resource = Server::where('uuid', $this->parameters['server_uuid'])->firstOrFail(); - $this->server = $this->resource; - } - } - - public function loadContainers() - { - foreach ($this->servers as $server) { - if (data_get($this->parameters, 'application_uuid')) { - if ($server->isSwarm()) { - $containers = collect([ - [ - 'Names' => $this->resource->uuid.'_'.$this->resource->uuid, - ], - ]); - } else { - $containers = getCurrentApplicationContainerStatus($server, $this->resource->id, includePullrequests: true); - } - foreach ($containers as $container) { - // if container state is running - if (data_get($container, 'State') === 'running') { - $payload = [ - 'server' => $server, - 'container' => $container, - ]; - $this->containers = $this->containers->push($payload); - } - } - } elseif (data_get($this->parameters, 'database_uuid')) { - if ($this->resource->isRunning()) { - $this->containers = $this->containers->push([ - 'server' => $server, - 'container' => [ - 'Names' => $this->resource->uuid, - ], - ]); - } - } elseif (data_get($this->parameters, 'service_uuid')) { - $this->resource->applications()->get()->each(function ($application) { - if ($application->isRunning()) { - $this->containers->push([ - 'server' => $this->resource->server, - 'container' => [ - 'Names' => data_get($application, 'name').'-'.data_get($this->resource, 'uuid'), - ], - ]); - } - }); - $this->resource->databases()->get()->each(function ($database) { - if ($database->isRunning()) { - $this->containers->push([ - 'server' => $this->resource->server, - 'container' => [ - 'Names' => data_get($database, 'name').'-'.data_get($this->resource, 'uuid'), - ], - ]); - } - }); - } - } - if ($this->containers->count() > 0) { - $this->container = $this->containers->first(); - } - if ($this->containers->count() === 1) { - $this->selected_container = data_get($this->containers->first(), 'container.Names'); - } - } - - private function checkShellAvailability(Server $server, string $container): bool - { - $escapedContainer = escapeshellarg($container); - try { - instant_remote_process([ - "docker exec {$escapedContainer} bash -c 'exit 0' 2>/dev/null || ". - "docker exec {$escapedContainer} sh -c 'exit 0' 2>/dev/null", - ], $server); - - return true; - } catch (\Throwable) { - return false; - } - } - - #[On('connectToServer')] - public function connectToServer() - { - try { - if ($this->server->isForceDisabled()) { - throw new \RuntimeException('Server is disabled.'); - } - $this->hasShell = true; - $this->dispatch( - 'send-terminal-command', - false, - data_get($this->server, 'name'), - data_get($this->server, 'uuid') - ); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - #[On('connectToContainer')] - public function connectToContainer() - { - if ($this->selected_container === 'default') { - $this->dispatch('error', 'Please select a container.'); - - return; - } - try { - // Validate container name format - if (! preg_match('/^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/', $this->selected_container)) { - throw new \InvalidArgumentException('Invalid container name format'); - } - - // Verify container exists in our allowed list - $container = collect($this->containers)->firstWhere('container.Names', $this->selected_container); - if (is_null($container)) { - throw new \RuntimeException('Container not found.'); - } - - // Verify server ownership and status - $server = data_get($container, 'server'); - if (! $server || ! $server instanceof Server) { - throw new \RuntimeException('Invalid server configuration.'); - } - - if ($server->isForceDisabled()) { - throw new \RuntimeException('Server is disabled.'); - } - - // Additional ownership verification based on resource type - $resourceServer = match ($this->type) { - 'application' => $this->resource->destination->server, - 'database' => $this->resource->destination->server, - 'service' => $this->resource->server, - default => throw new \RuntimeException('Invalid resource type.') - }; - - if ($server->id !== $resourceServer->id && ! $this->resource->additional_servers->contains('id', $server->id)) { - throw new \RuntimeException('Server ownership verification failed.'); - } - - $this->hasShell = $this->checkShellAvailability($server, data_get($container, 'container.Names')); - if (! $this->hasShell) { - return; - } - - $this->dispatch( - 'send-terminal-command', - true, - data_get($container, 'container.Names'), - data_get($container, 'server.uuid') - ); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.project.shared.execute-container-command'); - } -} diff --git a/app/Livewire/Project/Shared/GetLogs.php b/app/Livewire/Project/Shared/GetLogs.php deleted file mode 100644 index 43fd97c341..0000000000 --- a/app/Livewire/Project/Shared/GetLogs.php +++ /dev/null @@ -1,159 +0,0 @@ -resource)) { - if ($this->resource->getMorphClass() === \App\Models\Application::class) { - $this->showTimeStamps = $this->resource->settings->is_include_timestamps; - } else { - if ($this->servicesubtype) { - $this->showTimeStamps = $this->servicesubtype->is_include_timestamps; - } else { - $this->showTimeStamps = $this->resource->is_include_timestamps; - } - } - if ($this->resource?->getMorphClass() === \App\Models\Application::class) { - if (str($this->container)->contains('-pr-')) { - $this->pull_request = 'Pull Request: '.str($this->container)->afterLast('-pr-')->beforeLast('_')->value(); - } - } - } - } - - public function doSomethingWithThisChunkOfOutput($output) - { - $this->outputs .= removeAnsiColors($output); - } - - public function instantSave() - { - if (! is_null($this->resource)) { - if ($this->resource->getMorphClass() === \App\Models\Application::class) { - $this->resource->settings->is_include_timestamps = $this->showTimeStamps; - $this->resource->settings->save(); - } - if ($this->resource->getMorphClass() === \App\Models\Service::class) { - $serviceName = str($this->container)->beforeLast('-')->value(); - $subType = $this->resource->applications()->where('name', $serviceName)->first(); - if ($subType) { - $subType->is_include_timestamps = $this->showTimeStamps; - $subType->save(); - } else { - $subType = $this->resource->databases()->where('name', $serviceName)->first(); - if ($subType) { - $subType->is_include_timestamps = $this->showTimeStamps; - $subType->save(); - } - } - } - } - } - - public function getLogs($refresh = false) - { - if (! $this->server->isFunctional()) { - return; - } - if (! $refresh && ($this->resource?->getMorphClass() === \App\Models\Service::class || str($this->container)->contains('-pr-'))) { - return; - } - if ($this->numberOfLines <= 0 || is_null($this->numberOfLines)) { - $this->numberOfLines = 1000; - } - if ($this->container) { - if ($this->showTimeStamps) { - if ($this->server->isSwarm()) { - $command = "docker service logs -n {$this->numberOfLines} -t {$this->container}"; - if ($this->server->isNonRoot()) { - $command = parseCommandsByLineForSudo(collect($command), $this->server); - $command = $command[0]; - } - $sshCommand = SshMultiplexingHelper::generateSshCommand($this->server, $command); - } else { - $command = "docker logs -n {$this->numberOfLines} -t {$this->container}"; - if ($this->server->isNonRoot()) { - $command = parseCommandsByLineForSudo(collect($command), $this->server); - $command = $command[0]; - } - $sshCommand = SshMultiplexingHelper::generateSshCommand($this->server, $command); - } - } else { - if ($this->server->isSwarm()) { - $command = "docker service logs -n {$this->numberOfLines} {$this->container}"; - if ($this->server->isNonRoot()) { - $command = parseCommandsByLineForSudo(collect($command), $this->server); - $command = $command[0]; - } - $sshCommand = SshMultiplexingHelper::generateSshCommand($this->server, $command); - } else { - $command = "docker logs -n {$this->numberOfLines} {$this->container}"; - if ($this->server->isNonRoot()) { - $command = parseCommandsByLineForSudo(collect($command), $this->server); - $command = $command[0]; - } - $sshCommand = SshMultiplexingHelper::generateSshCommand($this->server, $command); - } - } - if ($refresh) { - $this->outputs = ''; - } - Process::run($sshCommand, function (string $type, string $output) { - $this->doSomethingWithThisChunkOfOutput($output); - }); - if ($this->showTimeStamps) { - $this->outputs = str($this->outputs)->split('/\n/')->sort(function ($a, $b) { - $a = explode(' ', $a); - $b = explode(' ', $b); - - return $a[0] <=> $b[0]; - })->join("\n"); - } - } - } - - public function render() - { - return view('livewire.project.shared.get-logs'); - } -} diff --git a/app/Livewire/Project/Shared/HealthChecks.php b/app/Livewire/Project/Shared/HealthChecks.php deleted file mode 100644 index 83162e36a2..0000000000 --- a/app/Livewire/Project/Shared/HealthChecks.php +++ /dev/null @@ -1,49 +0,0 @@ - 'boolean', - 'resource.health_check_path' => 'string', - 'resource.health_check_port' => 'nullable|string', - 'resource.health_check_host' => 'string', - 'resource.health_check_method' => 'string', - 'resource.health_check_return_code' => 'integer', - 'resource.health_check_scheme' => 'string', - 'resource.health_check_response_text' => 'nullable|string', - 'resource.health_check_interval' => 'integer|min:1', - 'resource.health_check_timeout' => 'integer|min:1', - 'resource.health_check_retries' => 'integer|min:1', - 'resource.health_check_start_period' => 'integer', - 'resource.custom_healthcheck_found' => 'boolean', - - ]; - - public function instantSave() - { - $this->resource->save(); - $this->dispatch('success', 'Health check updated.'); - } - - public function submit() - { - try { - $this->validate(); - $this->resource->save(); - $this->dispatch('success', 'Health check updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.project.shared.health-checks'); - } -} diff --git a/app/Livewire/Project/Shared/Logs.php b/app/Livewire/Project/Shared/Logs.php deleted file mode 100644 index 12022b1eeb..0000000000 --- a/app/Livewire/Project/Shared/Logs.php +++ /dev/null @@ -1,122 +0,0 @@ -servers->firstWhere('id', $server_id); - if (! $server->isFunctional()) { - return; - } - if ($server->isSwarm()) { - $containers = collect([ - [ - 'Names' => $this->resource->uuid.'_'.$this->resource->uuid, - ], - ]); - } else { - $containers = getCurrentApplicationContainerStatus($server, $this->resource->id, includePullrequests: true); - } - $server->containers = $containers->sort(); - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function mount() - { - try { - $this->containers = collect(); - $this->servers = collect(); - $this->parameters = get_route_parameters(); - $this->query = request()->query(); - if (data_get($this->parameters, 'application_uuid')) { - $this->type = 'application'; - $this->resource = Application::where('uuid', $this->parameters['application_uuid'])->firstOrFail(); - $this->status = $this->resource->status; - if ($this->resource->destination->server->isFunctional()) { - $this->servers = $this->servers->push($this->resource->destination->server); - } - foreach ($this->resource->additional_servers as $server) { - if ($server->isFunctional()) { - $this->servers = $this->servers->push($server); - } - } - } elseif (data_get($this->parameters, 'database_uuid')) { - $this->type = 'database'; - $resource = getResourceByUuid($this->parameters['database_uuid'], data_get(auth()->user()->currentTeam(), 'id')); - if (is_null($resource)) { - abort(404); - } - $this->resource = $resource; - $this->status = $this->resource->status; - if ($this->resource->destination->server->isFunctional()) { - $this->servers = $this->servers->push($this->resource->destination->server); - } - $this->container = $this->resource->uuid; - $this->containers->push($this->container); - } elseif (data_get($this->parameters, 'service_uuid')) { - $this->type = 'service'; - $this->resource = Service::where('uuid', $this->parameters['service_uuid'])->firstOrFail(); - $this->resource->applications()->get()->each(function ($application) { - $this->containers->push(data_get($application, 'name').'-'.data_get($this->resource, 'uuid')); - }); - $this->resource->databases()->get()->each(function ($database) { - $this->containers->push(data_get($database, 'name').'-'.data_get($this->resource, 'uuid')); - }); - if ($this->resource->server->isFunctional()) { - $this->servers = $this->servers->push($this->resource->server); - } - } - $this->containers = $this->containers->sort(); - if (data_get($this->query, 'pull_request_id')) { - $this->containers = $this->containers->filter(function ($container) { - return str_contains($container, $this->query['pull_request_id']); - }); - } - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.project.shared.logs'); - } -} diff --git a/app/Livewire/Project/Shared/Metrics.php b/app/Livewire/Project/Shared/Metrics.php deleted file mode 100644 index fdc35fc0fb..0000000000 --- a/app/Livewire/Project/Shared/Metrics.php +++ /dev/null @@ -1,59 +0,0 @@ -poll || $this->interval <= 10) { - $this->loadData(); - if ($this->interval > 10) { - $this->poll = false; - } - } - } - - public function loadData() - { - try { - $cpuMetrics = $this->resource->getCpuMetrics($this->interval); - $memoryMetrics = $this->resource->getMemoryMetrics($this->interval); - $this->dispatch("refreshChartData-{$this->chartId}-cpu", [ - 'seriesData' => $cpuMetrics, - ]); - $this->dispatch("refreshChartData-{$this->chartId}-memory", [ - 'seriesData' => $memoryMetrics, - ]); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function setInterval() - { - if ($this->interval <= 10) { - $this->poll = true; - } - $this->loadData(); - } - - public function render() - { - return view('livewire.project.shared.metrics'); - } -} diff --git a/app/Livewire/Project/Shared/ResourceLimits.php b/app/Livewire/Project/Shared/ResourceLimits.php deleted file mode 100644 index 608dfbf022..0000000000 --- a/app/Livewire/Project/Shared/ResourceLimits.php +++ /dev/null @@ -1,62 +0,0 @@ - 'required|string', - 'resource.limits_memory_swap' => 'required|string', - 'resource.limits_memory_swappiness' => 'required|integer|min:0|max:100', - 'resource.limits_memory_reservation' => 'required|string', - 'resource.limits_cpus' => 'nullable', - 'resource.limits_cpuset' => 'nullable', - 'resource.limits_cpu_shares' => 'nullable', - ]; - - protected $validationAttributes = [ - 'resource.limits_memory' => 'memory', - 'resource.limits_memory_swap' => 'swap', - 'resource.limits_memory_swappiness' => 'swappiness', - 'resource.limits_memory_reservation' => 'reservation', - 'resource.limits_cpus' => 'cpus', - 'resource.limits_cpuset' => 'cpuset', - 'resource.limits_cpu_shares' => 'cpu shares', - ]; - - public function submit() - { - try { - if (! $this->resource->limits_memory) { - $this->resource->limits_memory = '0'; - } - if (! $this->resource->limits_memory_swap) { - $this->resource->limits_memory_swap = '0'; - } - if (is_null($this->resource->limits_memory_swappiness)) { - $this->resource->limits_memory_swappiness = '60'; - } - if (! $this->resource->limits_memory_reservation) { - $this->resource->limits_memory_reservation = '0'; - } - if (! $this->resource->limits_cpus) { - $this->resource->limits_cpus = '0'; - } - if ($this->resource->limits_cpuset === '') { - $this->resource->limits_cpuset = null; - } - if (is_null($this->resource->limits_cpu_shares)) { - $this->resource->limits_cpu_shares = 1024; - } - $this->validate(); - $this->resource->save(); - $this->dispatch('success', 'Resource limits updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Project/Shared/ResourceOperations.php b/app/Livewire/Project/Shared/ResourceOperations.php deleted file mode 100644 index e19f1272dd..0000000000 --- a/app/Livewire/Project/Shared/ResourceOperations.php +++ /dev/null @@ -1,526 +0,0 @@ -projectUuid = data_get($parameters, 'project_uuid'); - $this->environmentUuid = data_get($parameters, 'environment_uuid'); - $this->projects = Project::ownedByCurrentTeam()->get(); - $this->servers = currentTeam()->servers; - } - - public function toggleVolumeCloning(bool $value) - { - $this->cloneVolumeData = $value; - } - - public function cloneTo($destination_id) - { - $new_destination = StandaloneDocker::find($destination_id); - if (! $new_destination) { - $new_destination = SwarmDocker::find($destination_id); - } - if (! $new_destination) { - return $this->addError('destination_id', 'Destination not found.'); - } - $uuid = (string) new Cuid2; - $server = $new_destination->server; - - if ($this->resource->getMorphClass() === \App\Models\Application::class) { - $name = 'clone-of-'.str($this->resource->name)->limit(20).'-'.$uuid; - $applicationSettings = $this->resource->settings; - $url = $this->resource->fqdn; - - if ($server->proxyType() !== 'NONE' && $applicationSettings->is_container_label_readonly_enabled === true) { - $url = generateFqdn($server, $uuid); - } - - $new_resource = $this->resource->replicate([ - 'id', - 'created_at', - 'updated_at', - 'additional_servers_count', - 'additional_networks_count', - ])->fill([ - 'uuid' => $uuid, - 'name' => $name, - 'fqdn' => $url, - 'status' => 'exited', - 'destination_id' => $new_destination->id, - ]); - $new_resource->save(); - - if ($new_resource->destination->server->proxyType() !== 'NONE' && $applicationSettings->is_container_label_readonly_enabled === true) { - $customLabels = str(implode('|coolify|', generateLabelsApplication($new_resource)))->replace('|coolify|', "\n"); - $new_resource->custom_labels = base64_encode($customLabels); - $new_resource->save(); - } - - $new_resource->settings()->delete(); - if ($applicationSettings) { - $newApplicationSettings = $applicationSettings->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'application_id' => $new_resource->id, - ]); - $newApplicationSettings->save(); - } - - $tags = $this->resource->tags; - foreach ($tags as $tag) { - $new_resource->tags()->attach($tag->id); - } - - $scheduledTasks = $this->resource->scheduled_tasks()->get(); - foreach ($scheduledTasks as $task) { - $newTask = $task->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'uuid' => (string) new Cuid2, - 'application_id' => $new_resource->id, - 'team_id' => currentTeam()->id, - ]); - $newTask->save(); - } - - $applicationPreviews = $this->resource->previews()->get(); - foreach ($applicationPreviews as $preview) { - $newPreview = $preview->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'application_id' => $new_resource->id, - 'status' => 'exited', - ]); - $newPreview->save(); - } - - $persistentVolumes = $this->resource->persistentStorages()->get(); - foreach ($persistentVolumes as $volume) { - $newName = ''; - if (str_starts_with($volume->name, $this->resource->uuid)) { - $newName = str($volume->name)->replace($this->resource->uuid, $new_resource->uuid); - } else { - $newName = $new_resource->uuid.'-'.str($volume->name)->afterLast('-'); - } - - $newPersistentVolume = $volume->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'name' => $newName, - 'resource_id' => $new_resource->id, - ]); - $newPersistentVolume->save(); - - if ($this->cloneVolumeData) { - try { - StopApplication::dispatch($this->resource, false, false); - $sourceVolume = $volume->name; - $targetVolume = $newPersistentVolume->name; - $sourceServer = $this->resource->destination->server; - $targetServer = $new_resource->destination->server; - - VolumeCloneJob::dispatch($sourceVolume, $targetVolume, $sourceServer, $targetServer, $newPersistentVolume); - - queue_application_deployment( - deployment_uuid: (string) new Cuid2, - application: $this->resource, - server: $sourceServer, - destination: $this->resource->destination, - no_questions_asked: true - ); - } catch (\Exception $e) { - \Log::error('Failed to copy volume data for '.$volume->name.': '.$e->getMessage()); - } - } - } - - $fileStorages = $this->resource->fileStorages()->get(); - foreach ($fileStorages as $storage) { - $newStorage = $storage->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'resource_id' => $new_resource->id, - ]); - $newStorage->save(); - } - - $environmentVaribles = $this->resource->environment_variables()->get(); - foreach ($environmentVaribles as $environmentVarible) { - $newEnvironmentVariable = $environmentVarible->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'resourceable_id' => $new_resource->id, - 'resourceable_type' => $new_resource->getMorphClass(), - ]); - $newEnvironmentVariable->save(); - } - - $route = route('project.application.configuration', [ - 'project_uuid' => $this->projectUuid, - 'environment_uuid' => $this->environmentUuid, - 'application_uuid' => $new_resource->uuid, - ]).'#resource-operations'; - - return redirect()->to($route); - } elseif ( - $this->resource->getMorphClass() === \App\Models\StandalonePostgresql::class || - $this->resource->getMorphClass() === \App\Models\StandaloneMongodb::class || - $this->resource->getMorphClass() === \App\Models\StandaloneMysql::class || - $this->resource->getMorphClass() === \App\Models\StandaloneMariadb::class || - $this->resource->getMorphClass() === \App\Models\StandaloneRedis::class || - $this->resource->getMorphClass() === \App\Models\StandaloneKeydb::class || - $this->resource->getMorphClass() === \App\Models\StandaloneDragonfly::class || - $this->resource->getMorphClass() === \App\Models\StandaloneClickhouse::class - ) { - $uuid = (string) new Cuid2; - $new_resource = $this->resource->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'uuid' => $uuid, - 'name' => $this->resource->name.'-clone-'.$uuid, - 'status' => 'exited', - 'started_at' => null, - 'destination_id' => $new_destination->id, - ]); - $new_resource->save(); - - $tags = $this->resource->tags; - foreach ($tags as $tag) { - $new_resource->tags()->attach($tag->id); - } - - $new_resource->persistentStorages()->delete(); - $persistentVolumes = $this->resource->persistentStorages()->get(); - foreach ($persistentVolumes as $volume) { - $originalName = $volume->name; - $newName = ''; - - if (str_starts_with($originalName, 'postgres-data-')) { - $newName = 'postgres-data-'.$new_resource->uuid; - } elseif (str_starts_with($originalName, 'mysql-data-')) { - $newName = 'mysql-data-'.$new_resource->uuid; - } elseif (str_starts_with($originalName, 'redis-data-')) { - $newName = 'redis-data-'.$new_resource->uuid; - } elseif (str_starts_with($originalName, 'clickhouse-data-')) { - $newName = 'clickhouse-data-'.$new_resource->uuid; - } elseif (str_starts_with($originalName, 'mariadb-data-')) { - $newName = 'mariadb-data-'.$new_resource->uuid; - } elseif (str_starts_with($originalName, 'mongodb-data-')) { - $newName = 'mongodb-data-'.$new_resource->uuid; - } elseif (str_starts_with($originalName, 'keydb-data-')) { - $newName = 'keydb-data-'.$new_resource->uuid; - } elseif (str_starts_with($originalName, 'dragonfly-data-')) { - $newName = 'dragonfly-data-'.$new_resource->uuid; - } else { - if (str_starts_with($volume->name, $this->resource->uuid)) { - $newName = str($volume->name)->replace($this->resource->uuid, $new_resource->uuid); - } else { - $newName = $new_resource->uuid.'-'.$volume->name; - } - } - - $newPersistentVolume = $volume->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'name' => $newName, - 'resource_id' => $new_resource->id, - ]); - $newPersistentVolume->save(); - - if ($this->cloneVolumeData) { - try { - StopDatabase::dispatch($this->resource); - $sourceVolume = $volume->name; - $targetVolume = $newPersistentVolume->name; - $sourceServer = $this->resource->destination->server; - $targetServer = $new_resource->destination->server; - - VolumeCloneJob::dispatch($sourceVolume, $targetVolume, $sourceServer, $targetServer, $newPersistentVolume); - - StartDatabase::dispatch($this->resource); - } catch (\Exception $e) { - \Log::error('Failed to copy volume data for '.$volume->name.': '.$e->getMessage()); - } - } - } - - $fileStorages = $this->resource->fileStorages()->get(); - foreach ($fileStorages as $storage) { - $newStorage = $storage->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'resource_id' => $new_resource->id, - ]); - $newStorage->save(); - } - - $scheduledBackups = $this->resource->scheduledBackups()->get(); - foreach ($scheduledBackups as $backup) { - $uuid = (string) new Cuid2; - $newBackup = $backup->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'uuid' => $uuid, - 'database_id' => $new_resource->id, - 'database_type' => $new_resource->getMorphClass(), - 'team_id' => currentTeam()->id, - ]); - $newBackup->save(); - } - - $environmentVaribles = $this->resource->environment_variables()->get(); - foreach ($environmentVaribles as $environmentVarible) { - $payload = [ - 'resourceable_id' => $new_resource->id, - 'resourceable_type' => $new_resource->getMorphClass(), - ]; - $newEnvironmentVariable = $environmentVarible->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill($payload); - $newEnvironmentVariable->save(); - } - - $route = route('project.database.configuration', [ - 'project_uuid' => $this->projectUuid, - 'environment_uuid' => $this->environmentUuid, - 'database_uuid' => $new_resource->uuid, - ]).'#resource-operations'; - - return redirect()->to($route); - } elseif ($this->resource->type() === 'service') { - $uuid = (string) new Cuid2; - $new_resource = $this->resource->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'uuid' => $uuid, - 'name' => $this->resource->name.'-clone-'.$uuid, - 'destination_id' => $new_destination->id, - 'destination_type' => $new_destination->getMorphClass(), - 'server_id' => $new_destination->server_id, // server_id is probably not needed anymore because of the new polymorphic relationships (here it is needed for clone to a different server to work - but maybe we can drop the column) - ]); - - $new_resource->save(); - - $tags = $this->resource->tags; - foreach ($tags as $tag) { - $new_resource->tags()->attach($tag->id); - } - - $scheduledTasks = $this->resource->scheduled_tasks()->get(); - foreach ($scheduledTasks as $task) { - $newTask = $task->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'uuid' => (string) new Cuid2, - 'service_id' => $new_resource->id, - 'team_id' => currentTeam()->id, - ]); - $newTask->save(); - } - - $environmentVariables = $this->resource->environment_variables()->get(); - foreach ($environmentVariables as $environmentVariable) { - $newEnvironmentVariable = $environmentVariable->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'resourceable_id' => $new_resource->id, - 'resourceable_type' => $new_resource->getMorphClass(), - ]); - $newEnvironmentVariable->save(); - } - - foreach ($new_resource->applications() as $application) { - $application->update([ - 'status' => 'exited', - ]); - - $persistentVolumes = $application->persistentStorages()->get(); - foreach ($persistentVolumes as $volume) { - $newName = ''; - if (str_starts_with($volume->name, $volume->resource->uuid)) { - $newName = str($volume->name)->replace($volume->resource->uuid, $application->uuid); - } else { - $newName = $application->uuid.'-'.str($volume->name)->afterLast('-'); - } - - $newPersistentVolume = $volume->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'name' => $newName, - 'resource_id' => $application->id, - ]); - $newPersistentVolume->save(); - - if ($this->cloneVolumeData) { - try { - StopService::dispatch($application, false, false); - $sourceVolume = $volume->name; - $targetVolume = $newPersistentVolume->name; - $sourceServer = $application->service->destination->server; - $targetServer = $new_resource->destination->server; - - VolumeCloneJob::dispatch($sourceVolume, $targetVolume, $sourceServer, $targetServer, $newPersistentVolume); - - StartService::dispatch($application); - } catch (\Exception $e) { - \Log::error('Failed to copy volume data for '.$volume->name.': '.$e->getMessage()); - } - } - } - } - - foreach ($new_resource->databases() as $database) { - $database->update([ - 'status' => 'exited', - ]); - - $persistentVolumes = $database->persistentStorages()->get(); - foreach ($persistentVolumes as $volume) { - $newName = ''; - if (str_starts_with($volume->name, $volume->resource->uuid)) { - $newName = str($volume->name)->replace($volume->resource->uuid, $database->uuid); - } else { - $newName = $database->uuid.'-'.str($volume->name)->afterLast('-'); - } - - $newPersistentVolume = $volume->replicate([ - 'id', - 'created_at', - 'updated_at', - ])->fill([ - 'name' => $newName, - 'resource_id' => $database->id, - ]); - $newPersistentVolume->save(); - - if ($this->cloneVolumeData) { - try { - StopService::dispatch($database->service, false, false); - $sourceVolume = $volume->name; - $targetVolume = $newPersistentVolume->name; - $sourceServer = $database->service->destination->server; - $targetServer = $new_resource->destination->server; - - VolumeCloneJob::dispatch($sourceVolume, $targetVolume, $sourceServer, $targetServer, $newPersistentVolume); - - StartService::dispatch($database->service); - } catch (\Exception $e) { - \Log::error('Failed to copy volume data for '.$volume->name.': '.$e->getMessage()); - } - } - } - } - - $new_resource->parse(); - - $route = route('project.service.configuration', [ - 'project_uuid' => $this->projectUuid, - 'environment_uuid' => $this->environmentUuid, - 'service_uuid' => $new_resource->uuid, - ]).'#resource-operations'; - - return redirect()->to($route); - } - } - - public function moveTo($environment_id) - { - try { - $new_environment = Environment::findOrFail($environment_id); - $this->resource->update([ - 'environment_id' => $environment_id, - ]); - if ($this->resource->type() === 'application') { - $route = route('project.application.configuration', [ - 'project_uuid' => $new_environment->project->uuid, - 'environment_uuid' => $new_environment->uuid, - 'application_uuid' => $this->resource->uuid, - ]).'#resource-operations'; - - return redirect()->to($route); - } elseif (str($this->resource->type())->startsWith('standalone-')) { - $route = route('project.database.configuration', [ - 'project_uuid' => $new_environment->project->uuid, - 'environment_uuid' => $new_environment->uuid, - 'database_uuid' => $this->resource->uuid, - ]).'#resource-operations'; - - return redirect()->to($route); - } elseif ($this->resource->type() === 'service') { - $route = route('project.service.configuration', [ - 'project_uuid' => $new_environment->project->uuid, - 'environment_uuid' => $new_environment->uuid, - 'service_uuid' => $this->resource->uuid, - ]).'#resource-operations'; - - return redirect()->to($route); - } - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.project.shared.resource-operations'); - } -} diff --git a/app/Livewire/Project/Shared/ScheduledTask/Add.php b/app/Livewire/Project/Shared/ScheduledTask/Add.php deleted file mode 100644 index c286fee5a8..0000000000 --- a/app/Livewire/Project/Shared/ScheduledTask/Add.php +++ /dev/null @@ -1,111 +0,0 @@ - 'required|string', - 'command' => 'required|string', - 'frequency' => 'required|string', - 'container' => 'nullable|string', - ]; - - protected $validationAttributes = [ - 'name' => 'name', - 'command' => 'command', - 'frequency' => 'frequency', - 'container' => 'container', - ]; - - public function mount() - { - $this->parameters = get_route_parameters(); - if ($this->containerNames->count() > 0) { - $this->container = $this->containerNames->first(); - } - } - - public function submit() - { - try { - $this->validate(); - $isValid = validate_cron_expression($this->frequency); - if (! $isValid) { - $this->dispatch('error', 'Invalid Cron / Human expression.'); - - return; - } - if (empty($this->container) || $this->container === 'null') { - if ($this->type === 'service') { - $this->container = $this->subServiceName; - } - } - $this->saveScheduledTask(); - $this->clear(); - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function saveScheduledTask() - { - try { - $task = new ScheduledTask; - $task->name = $this->name; - $task->command = $this->command; - $task->frequency = $this->frequency; - $task->container = $this->container; - $task->team_id = currentTeam()->id; - - switch ($this->type) { - case 'application': - $task->application_id = $this->id; - break; - case 'standalone-postgresql': - $task->standalone_postgresql_id = $this->id; - break; - case 'service': - $task->service_id = $this->id; - break; - } - $task->save(); - $this->dispatch('refreshTasks'); - $this->dispatch('success', 'Scheduled task added.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function clear() - { - $this->name = ''; - $this->command = ''; - $this->frequency = ''; - $this->container = ''; - } -} diff --git a/app/Livewire/Project/Shared/ScheduledTask/All.php b/app/Livewire/Project/Shared/ScheduledTask/All.php deleted file mode 100644 index b58e4f97a9..0000000000 --- a/app/Livewire/Project/Shared/ScheduledTask/All.php +++ /dev/null @@ -1,44 +0,0 @@ -parameters = get_route_parameters(); - if ($this->resource->type() === 'service') { - $this->containerNames = $this->resource->applications()->pluck('name'); - $this->containerNames = $this->containerNames->merge($this->resource->databases()->pluck('name')); - } elseif ($this->resource->type() === 'application') { - if ($this->resource->build_pack === 'dockercompose') { - $parsed = $this->resource->parse(); - $containers = collect(data_get($parsed, 'services'))->keys(); - $this->containerNames = $containers; - } else { - $this->containerNames = collect([]); - } - } - } - - #[On('refreshTasks')] - public function refreshTasks() - { - $this->resource->refresh(); - } -} diff --git a/app/Livewire/Project/Shared/ScheduledTask/Executions.php b/app/Livewire/Project/Shared/ScheduledTask/Executions.php deleted file mode 100644 index 6f62a5b5bf..0000000000 --- a/app/Livewire/Project/Shared/ScheduledTask/Executions.php +++ /dev/null @@ -1,144 +0,0 @@ -currentTeam()->id; - - return [ - "echo-private:team.{$teamId},ScheduledTaskDone" => 'refreshExecutions', - ]; - } - - public function mount($taskId) - { - try { - $this->taskId = $taskId; - $this->task = ScheduledTask::findOrFail($taskId); - $this->executions = $this->task->executions()->take(20)->get(); - $this->serverTimezone = data_get($this->task, 'application.destination.server.settings.server_timezone'); - if (! $this->serverTimezone) { - $this->serverTimezone = data_get($this->task, 'service.destination.server.settings.server_timezone'); - } - if (! $this->serverTimezone) { - $this->serverTimezone = 'UTC'; - } - } catch (\Exception $e) { - return handleError($e); - } - } - - public function refreshExecutions(): void - { - $this->executions = $this->task->executions()->take(20)->get(); - if ($this->selectedKey) { - $this->selectedExecution = $this->task->executions()->find($this->selectedKey); - if ($this->selectedExecution && $this->selectedExecution->status !== 'running') { - $this->isPollingActive = false; - } - } - } - - public function selectTask($key): void - { - if ($key == $this->selectedKey) { - $this->selectedKey = null; - $this->selectedExecution = null; - $this->currentPage = 1; - $this->isPollingActive = false; - - return; - } - $this->selectedKey = $key; - $this->selectedExecution = $this->task->executions()->find($key); - $this->currentPage = 1; - - // Start polling if task is running - if ($this->selectedExecution && $this->selectedExecution->status === 'running') { - $this->isPollingActive = true; - } - } - - public function polling() - { - if ($this->selectedExecution && $this->isPollingActive) { - $this->selectedExecution->refresh(); - if ($this->selectedExecution->status !== 'running') { - $this->isPollingActive = false; - } - } - } - - public function loadMoreLogs() - { - $this->currentPage++; - } - - public function getLogLinesProperty() - { - if (! $this->selectedExecution) { - return collect(); - } - - if (! $this->selectedExecution->message) { - return collect(['Waiting for task output...']); - } - - $lines = collect(explode("\n", $this->selectedExecution->message)); - - return $lines->take($this->currentPage * $this->logsPerPage); - } - - public function downloadLogs(int $executionId) - { - $execution = $this->executions->firstWhere('id', $executionId); - if (! $execution) { - return; - } - - return response()->streamDownload(function () use ($execution) { - echo $execution->message; - }, 'task-execution-'.$execution->id.'.log'); - } - - public function hasMoreLogs() - { - if (! $this->selectedExecution || ! $this->selectedExecution->message) { - return false; - } - $lines = collect(explode("\n", $this->selectedExecution->message)); - - return $lines->count() > ($this->currentPage * $this->logsPerPage); - } -} diff --git a/app/Livewire/Project/Shared/ScheduledTask/Show.php b/app/Livewire/Project/Shared/ScheduledTask/Show.php deleted file mode 100644 index 6d9c6982a6..0000000000 --- a/app/Livewire/Project/Shared/ScheduledTask/Show.php +++ /dev/null @@ -1,154 +0,0 @@ -task_uuid = $task_uuid; - if ($application_uuid) { - $this->type = 'application'; - $this->application_uuid = $application_uuid; - $this->resource = Application::ownedByCurrentTeam()->where('uuid', $application_uuid)->firstOrFail(); - } elseif ($service_uuid) { - $this->type = 'service'; - $this->service_uuid = $service_uuid; - $this->resource = Service::ownedByCurrentTeam()->where('uuid', $service_uuid)->firstOrFail(); - } - $this->parameters = [ - 'environment_uuid' => $environment_uuid, - 'project_uuid' => $project_uuid, - 'application_uuid' => $application_uuid, - 'service_uuid' => $service_uuid, - ]; - - $this->task = $this->resource->scheduled_tasks()->where('uuid', $task_uuid)->firstOrFail(); - $this->syncData(); - } catch (\Exception $e) { - return handleError($e); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $isValid = validate_cron_expression($this->frequency); - if (! $isValid) { - $this->frequency = $this->task->frequency; - throw new \Exception('Invalid Cron / Human expression.'); - } - $this->task->enabled = $this->isEnabled; - $this->task->name = str($this->name)->trim()->value(); - $this->task->command = str($this->command)->trim()->value(); - $this->task->frequency = str($this->frequency)->trim()->value(); - $this->task->container = str($this->container)->trim()->value(); - $this->task->save(); - } else { - $this->isEnabled = $this->task->enabled; - $this->name = $this->task->name; - $this->command = $this->task->command; - $this->frequency = $this->task->frequency; - $this->container = $this->task->container; - } - } - - public function instantSave() - { - try { - $this->syncData(true); - $this->dispatch('success', 'Scheduled task updated.'); - $this->refreshTasks(); - } catch (\Exception $e) { - return handleError($e); - } - } - - public function submit() - { - try { - $this->syncData(true); - $this->dispatch('success', 'Scheduled task updated.'); - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function refreshTasks() - { - try { - $this->task->refresh(); - } catch (\Exception $e) { - return handleError($e); - } - } - - public function delete() - { - try { - $this->task->delete(); - - if ($this->type === 'application') { - return redirect()->route('project.application.scheduled-tasks.show', $this->parameters); - } else { - return redirect()->route('project.service.scheduled-tasks.show', $this->parameters); - } - } catch (\Exception $e) { - return handleError($e); - } - } - - public function executeNow() - { - try { - ScheduledTaskJob::dispatch($this->task); - $this->dispatch('success', 'Scheduled task executed.'); - } catch (\Exception $e) { - return handleError($e); - } - } -} diff --git a/app/Livewire/Project/Shared/Storages/Add.php b/app/Livewire/Project/Shared/Storages/Add.php deleted file mode 100644 index dc015386c6..0000000000 --- a/app/Livewire/Project/Shared/Storages/Add.php +++ /dev/null @@ -1,165 +0,0 @@ - 'required|string', - 'mount_path' => 'required|string', - 'host_path' => 'string|nullable', - 'file_storage_path' => 'string', - 'file_storage_content' => 'nullable|string', - 'file_storage_directory_source' => 'string', - 'file_storage_directory_destination' => 'string', - ]; - - protected $listeners = ['clearAddStorage' => 'clear']; - - protected $validationAttributes = [ - 'name' => 'name', - 'mount_path' => 'mount', - 'host_path' => 'host', - 'file_storage_path' => 'file storage path', - 'file_storage_content' => 'file storage content', - 'file_storage_directory_source' => 'file storage directory source', - 'file_storage_directory_destination' => 'file storage directory destination', - ]; - - public function mount() - { - if (str($this->resource->getMorphClass())->contains('Standalone')) { - $this->file_storage_directory_source = database_configuration_dir()."/{$this->resource->uuid}"; - } else { - $this->file_storage_directory_source = application_configuration_dir()."/{$this->resource->uuid}"; - } - $this->uuid = $this->resource->uuid; - $this->parameters = get_route_parameters(); - if (data_get($this->parameters, 'application_uuid')) { - $applicationUuid = $this->parameters['application_uuid']; - $application = Application::where('uuid', $applicationUuid)->first(); - if (! $application) { - abort(404); - } - if ($application->destination->server->isSwarm()) { - $this->isSwarm = true; - $this->rules['host_path'] = 'required|string'; - } - } - } - - public function submitFileStorage() - { - try { - $this->validate([ - 'file_storage_path' => 'string', - 'file_storage_content' => 'nullable|string', - ]); - - $this->file_storage_path = trim($this->file_storage_path); - $this->file_storage_path = str($this->file_storage_path)->start('/')->value(); - - if ($this->resource->getMorphClass() === \App\Models\Application::class) { - $fs_path = application_configuration_dir().'/'.$this->resource->uuid.$this->file_storage_path; - } elseif (str($this->resource->getMorphClass())->contains('Standalone')) { - $fs_path = database_configuration_dir().'/'.$this->resource->uuid.$this->file_storage_path; - } else { - throw new \Exception('No valid resource type for file mount storage type!'); - } - - LocalFileVolume::create( - [ - 'fs_path' => $fs_path, - 'mount_path' => $this->file_storage_path, - 'content' => $this->file_storage_content, - 'is_directory' => false, - 'resource_id' => $this->resource->id, - 'resource_type' => get_class($this->resource), - ], - ); - $this->dispatch('refreshStorages'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function submitFileStorageDirectory() - { - try { - $this->validate([ - 'file_storage_directory_source' => 'string', - 'file_storage_directory_destination' => 'string', - ]); - - $this->file_storage_directory_source = trim($this->file_storage_directory_source); - $this->file_storage_directory_source = str($this->file_storage_directory_source)->start('/')->value(); - $this->file_storage_directory_destination = trim($this->file_storage_directory_destination); - $this->file_storage_directory_destination = str($this->file_storage_directory_destination)->start('/')->value(); - - LocalFileVolume::create( - [ - 'fs_path' => $this->file_storage_directory_source, - 'mount_path' => $this->file_storage_directory_destination, - 'is_directory' => true, - 'resource_id' => $this->resource->id, - 'resource_type' => get_class($this->resource), - ], - ); - $this->dispatch('refreshStorages'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function submitPersistentVolume() - { - try { - $this->validate([ - 'name' => 'required|string', - 'mount_path' => 'required|string', - 'host_path' => 'string|nullable', - ]); - $name = $this->uuid.'-'.$this->name; - $this->dispatch('addNewVolume', [ - 'name' => $name, - 'mount_path' => $this->mount_path, - 'host_path' => $this->host_path, - ]); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function clear() - { - $this->name = ''; - $this->mount_path = ''; - $this->host_path = null; - } -} diff --git a/app/Livewire/Project/Shared/Storages/All.php b/app/Livewire/Project/Shared/Storages/All.php deleted file mode 100644 index c26315d3b2..0000000000 --- a/app/Livewire/Project/Shared/Storages/All.php +++ /dev/null @@ -1,12 +0,0 @@ - '$refresh']; -} diff --git a/app/Livewire/Project/Shared/Storages/Show.php b/app/Livewire/Project/Shared/Storages/Show.php deleted file mode 100644 index 54b1be3af5..0000000000 --- a/app/Livewire/Project/Shared/Storages/Show.php +++ /dev/null @@ -1,55 +0,0 @@ - 'required|string', - 'storage.mount_path' => 'required|string', - 'storage.host_path' => 'string|nullable', - ]; - - protected $validationAttributes = [ - 'name' => 'name', - 'mount_path' => 'mount', - 'host_path' => 'host', - ]; - - public function submit() - { - $this->validate(); - $this->storage->save(); - $this->dispatch('success', 'Storage updated successfully'); - } - - public function delete($password) - { - if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) { - if (! Hash::check($password, Auth::user()->password)) { - $this->addError('password', 'The provided password is incorrect.'); - - return; - } - } - - $this->storage->delete(); - $this->dispatch('refreshStorages'); - } -} diff --git a/app/Livewire/Project/Shared/Tags.php b/app/Livewire/Project/Shared/Tags.php deleted file mode 100644 index 811859cb88..0000000000 --- a/app/Livewire/Project/Shared/Tags.php +++ /dev/null @@ -1,104 +0,0 @@ -loadTags(); - } - - public function loadTags() - { - $this->tags = Tag::ownedByCurrentTeam()->get(); - $this->filteredTags = $this->tags->filter(function ($tag) { - return ! $this->resource->tags->contains($tag); - }); - } - - public function submit() - { - try { - $this->validate(); - $tags = str($this->newTags)->trim()->explode(' '); - foreach ($tags as $tag) { - $tag = strip_tags($tag); - if (strlen($tag) < 2) { - $this->dispatch('error', 'Invalid tag.', "Tag $tag is invalid. Min length is 2."); - - continue; - } - if ($this->resource->tags()->where('name', $tag)->exists()) { - $this->dispatch('error', 'Duplicate tags.', "Tag $tag already added."); - - continue; - } - $found = Tag::ownedByCurrentTeam()->where(['name' => $tag])->exists(); - if (! $found) { - $found = Tag::create([ - 'name' => $tag, - 'team_id' => currentTeam()->id, - ]); - } - $this->resource->tags()->attach($found->id); - } - $this->refresh(); - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function addTag(string $id, string $name) - { - try { - $name = strip_tags($name); - if ($this->resource->tags()->where('id', $id)->exists()) { - $this->dispatch('error', 'Duplicate tags.', "Tag $name already added."); - - return; - } - $this->resource->tags()->attach($id); - $this->refresh(); - $this->dispatch('success', 'Tag added.'); - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function deleteTag(string $id) - { - try { - $this->resource->tags()->detach($id); - $found_more_tags = Tag::ownedByCurrentTeam()->find($id); - if ($found_more_tags && $found_more_tags->applications()->count() == 0 && $found_more_tags->services()->count() == 0) { - $found_more_tags->delete(); - } - $this->refresh(); - $this->dispatch('success', 'Tag deleted.'); - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function refresh() - { - $this->resource->refresh(); // Remove this when legacy_model_binding is false - $this->loadTags(); - $this->reset('newTags'); - } -} diff --git a/app/Livewire/Project/Shared/Terminal.php b/app/Livewire/Project/Shared/Terminal.php deleted file mode 100644 index a3d1aa10f5..0000000000 --- a/app/Livewire/Project/Shared/Terminal.php +++ /dev/null @@ -1,89 +0,0 @@ -user()->currentTeam()->id; - - return [ - "echo-private:team.{$teamId},ApplicationStatusChanged" => 'closeTerminal', - ]; - } - - public function closeTerminal() - { - $this->dispatch('reloadWindow'); - } - - private function checkShellAvailability(Server $server, string $container): bool - { - $escapedContainer = escapeshellarg($container); - try { - instant_remote_process([ - "docker exec {$escapedContainer} bash -c 'exit 0' 2>/dev/null || ". - "docker exec {$escapedContainer} sh -c 'exit 0' 2>/dev/null", - ], $server); - - return true; - } catch (\Throwable) { - return false; - } - } - - #[On('send-terminal-command')] - public function sendTerminalCommand($isContainer, $identifier, $serverUuid) - { - $server = Server::ownedByCurrentTeam()->whereUuid($serverUuid)->firstOrFail(); - - if ($isContainer) { - // Validate container identifier format (alphanumeric, dashes, and underscores only) - if (! preg_match('/^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/', $identifier)) { - throw new \InvalidArgumentException('Invalid container identifier format'); - } - - // Verify container exists and belongs to the user's team - $status = getContainerStatus($server, $identifier); - if ($status !== 'running') { - return; - } - - // Check shell availability - $this->hasShell = $this->checkShellAvailability($server, $identifier); - if (! $this->hasShell) { - return; - } - - // Escape the identifier for shell usage - $escapedIdentifier = escapeshellarg($identifier); - $command = SshMultiplexingHelper::generateSshCommand($server, "docker exec -it {$escapedIdentifier} sh -c 'PATH=\$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin && if [ -f ~/.profile ]; then . ~/.profile; fi && if [ -n \"\$SHELL\" ]; then exec \$SHELL; else sh; fi'"); - } else { - $command = SshMultiplexingHelper::generateSshCommand($server, 'PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin && if [ -f ~/.profile ]; then . ~/.profile; fi && if [ -n "$SHELL" ]; then exec $SHELL; else sh; fi'); - } - - // ssh command is sent back to frontend then to websocket - // this is done because the websocket connection is not available here - // a better solution would be to remove websocket on NodeJS and work with something like - // 1. Laravel Pusher/Echo connection (not possible without a sdk) - // 2. Ratchet / Revolt / ReactPHP / Event Loop (possible but hard to implement and huge dependencies) - // 3. Just found out about this https://github.com/sirn-se/websocket-php, perhaps it can be used - // 4. Follow-up discussions here: - // - https://github.com/coollabsio/coolify/issues/2298 - // - https://github.com/coollabsio/coolify/discussions/3362 - $this->dispatch('send-back-command', $command); - } - - public function render() - { - return view('livewire.project.shared.terminal'); - } -} diff --git a/app/Livewire/Project/Shared/UploadConfig.php b/app/Livewire/Project/Shared/UploadConfig.php deleted file mode 100644 index 1b10f588b8..0000000000 --- a/app/Livewire/Project/Shared/UploadConfig.php +++ /dev/null @@ -1,46 +0,0 @@ -config = '{ - "build_pack": "nixpacks", - "base_directory": "/nodejs", - "publish_directory": "/", - "ports_exposes": "3000", - "settings": { - "is_static": false - } -}'; - } - } - - public function uploadConfig() - { - try { - $application = Application::findOrFail($this->applicationId); - $application->setConfig($this->config); - $this->dispatch('success', 'Application settings updated'); - } catch (\Exception $e) { - $this->dispatch('error', $e->getMessage()); - - return; - } - } - - public function render() - { - return view('livewire.project.shared.upload-config'); - } -} diff --git a/app/Livewire/Project/Shared/Webhooks.php b/app/Livewire/Project/Shared/Webhooks.php deleted file mode 100644 index 57c65c4dd2..0000000000 --- a/app/Livewire/Project/Shared/Webhooks.php +++ /dev/null @@ -1,62 +0,0 @@ -deploywebhook = generateDeployWebhook($this->resource); - - $this->githubManualWebhookSecret = data_get($this->resource, 'manual_webhook_secret_github'); - $this->githubManualWebhook = generateGitManualWebhook($this->resource, 'github'); - - $this->gitlabManualWebhookSecret = data_get($this->resource, 'manual_webhook_secret_gitlab'); - $this->gitlabManualWebhook = generateGitManualWebhook($this->resource, 'gitlab'); - - $this->bitbucketManualWebhookSecret = data_get($this->resource, 'manual_webhook_secret_bitbucket'); - $this->bitbucketManualWebhook = generateGitManualWebhook($this->resource, 'bitbucket'); - - $this->giteaManualWebhookSecret = data_get($this->resource, 'manual_webhook_secret_gitea'); - $this->giteaManualWebhook = generateGitManualWebhook($this->resource, 'gitea'); - } - - public function submit() - { - try { - $this->authorize('update', $this->resource); - $this->resource->update([ - 'manual_webhook_secret_github' => $this->githubManualWebhookSecret, - 'manual_webhook_secret_gitlab' => $this->gitlabManualWebhookSecret, - 'manual_webhook_secret_bitbucket' => $this->bitbucketManualWebhookSecret, - 'manual_webhook_secret_gitea' => $this->giteaManualWebhookSecret, - ]); - $this->dispatch('success', 'Secret Saved.'); - } catch (\Exception $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Project/Show.php b/app/Livewire/Project/Show.php deleted file mode 100644 index 886a20218f..0000000000 --- a/app/Livewire/Project/Show.php +++ /dev/null @@ -1,61 +0,0 @@ -project = Project::where('team_id', currentTeam()->id)->where('uuid', $project_uuid)->firstOrFail(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function submit() - { - try { - $this->validate(); - $environment = Environment::create([ - 'name' => $this->name, - 'project_id' => $this->project->id, - 'uuid' => (string) new Cuid2, - ]); - - return redirect()->route('project.resource.index', [ - 'project_uuid' => $this->project->uuid, - 'environment_uuid' => $environment->uuid, - ]); - } catch (\Throwable $e) { - handleError($e, $this); - } - } - - public function navigateToEnvironment($projectUuid, $environmentUuid) - { - return redirect()->route('project.resource.index', [ - 'project_uuid' => $projectUuid, - 'environment_uuid' => $environmentUuid, - ]); - } - - public function render() - { - return view('livewire.project.show'); - } -} diff --git a/app/Livewire/Security/ApiTokens.php b/app/Livewire/Security/ApiTokens.php deleted file mode 100644 index 72684bdc63..0000000000 --- a/app/Livewire/Security/ApiTokens.php +++ /dev/null @@ -1,74 +0,0 @@ -isApiEnabled = InstanceSettings::get()->is_api_enabled; - $this->getTokens(); - } - - private function getTokens() - { - $this->tokens = auth()->user()->tokens->sortByDesc('created_at'); - } - - public function updatedPermissions($permissionToUpdate) - { - if ($permissionToUpdate == 'root') { - $this->permissions = ['root']; - } elseif ($permissionToUpdate == 'read:sensitive' && ! in_array('read', $this->permissions)) { - $this->permissions[] = 'read'; - } elseif ($permissionToUpdate == 'deploy') { - $this->permissions = ['deploy']; - } else { - if (count($this->permissions) == 0) { - $this->permissions = ['read']; - } - } - sort($this->permissions); - } - - public function addNewToken() - { - try { - $this->validate([ - 'description' => 'required|min:3|max:255', - ]); - $token = auth()->user()->createToken($this->description, array_values($this->permissions)); - $this->getTokens(); - session()->flash('token', $token->plainTextToken); - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function revoke(int $id) - { - try { - $token = auth()->user()->tokens()->where('id', $id)->firstOrFail(); - $token->delete(); - $this->getTokens(); - } catch (\Exception $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Security/PrivateKey/Create.php b/app/Livewire/Security/PrivateKey/Create.php deleted file mode 100644 index 319cec1926..0000000000 --- a/app/Livewire/Security/PrivateKey/Create.php +++ /dev/null @@ -1,90 +0,0 @@ - 'required|string', - 'value' => 'required|string', - ]; - - public function generateNewRSAKey() - { - $this->generateNewKey('rsa'); - } - - public function generateNewEDKey() - { - $this->generateNewKey('ed25519'); - } - - private function generateNewKey($type) - { - $keyData = PrivateKey::generateNewKeyPair($type); - $this->setKeyData($keyData); - } - - public function updated($property) - { - if ($property === 'value') { - $this->validatePrivateKey(); - } - } - - public function createPrivateKey() - { - $this->validate(); - - try { - $privateKey = PrivateKey::createAndStore([ - 'name' => $this->name, - 'description' => $this->description, - 'private_key' => trim($this->value)."\n", - 'team_id' => currentTeam()->id, - ]); - - return $this->redirectAfterCreation($privateKey); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - private function setKeyData(array $keyData) - { - $this->name = $keyData['name']; - $this->description = $keyData['description']; - $this->value = $keyData['private_key']; - $this->publicKey = $keyData['public_key']; - } - - private function validatePrivateKey() - { - $validationResult = PrivateKey::validateAndExtractPublicKey($this->value); - $this->publicKey = $validationResult['publicKey']; - - if (! $validationResult['isValid']) { - $this->addError('value', 'Invalid private key'); - } - } - - private function redirectAfterCreation(PrivateKey $privateKey) - { - return $this->from === 'server' - ? redirect()->route('dashboard') - : redirect()->route('security.private-key.show', ['private_key_uuid' => $privateKey->uuid]); - } -} diff --git a/app/Livewire/Security/PrivateKey/Index.php b/app/Livewire/Security/PrivateKey/Index.php deleted file mode 100644 index 76441a67e5..0000000000 --- a/app/Livewire/Security/PrivateKey/Index.php +++ /dev/null @@ -1,24 +0,0 @@ -get(); - - return view('livewire.security.private-key.index', [ - 'privateKeys' => $privateKeys, - ])->layout('components.layout'); - } - - public function cleanupUnusedKeys() - { - PrivateKey::cleanupUnusedKeys(); - $this->dispatch('success', 'Unused keys have been cleaned up.'); - } -} diff --git a/app/Livewire/Security/PrivateKey/Show.php b/app/Livewire/Security/PrivateKey/Show.php deleted file mode 100644 index b9195b5430..0000000000 --- a/app/Livewire/Security/PrivateKey/Show.php +++ /dev/null @@ -1,70 +0,0 @@ - 'required|string', - 'private_key.description' => 'nullable|string', - 'private_key.private_key' => 'required|string', - 'private_key.is_git_related' => 'nullable|boolean', - ]; - - protected $validationAttributes = [ - 'private_key.name' => 'name', - 'private_key.description' => 'description', - 'private_key.private_key' => 'private key', - ]; - - public function mount() - { - try { - $this->private_key = PrivateKey::ownedByCurrentTeam(['name', 'description', 'private_key', 'is_git_related'])->whereUuid(request()->private_key_uuid)->firstOrFail(); - } catch (\Throwable) { - abort(404); - } - } - - public function loadPublicKey() - { - $this->public_key = $this->private_key->getPublicKey(); - if ($this->public_key === 'Error loading private key') { - $this->dispatch('error', 'Failed to load public key. The private key may be invalid.'); - } - } - - public function delete() - { - try { - $this->private_key->safeDelete(); - currentTeam()->privateKeys = PrivateKey::where('team_id', currentTeam()->id)->get(); - - return redirect()->route('security.private-key.index'); - } catch (\Exception $e) { - $this->dispatch('error', $e->getMessage()); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function changePrivateKey() - { - try { - $this->private_key->updatePrivateKey([ - 'private_key' => formatPrivateKey($this->private_key->private_key), - ]); - refresh_server_connection($this->private_key); - $this->dispatch('success', 'Private key updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Server/Advanced.php b/app/Livewire/Server/Advanced.php deleted file mode 100644 index b269c916f9..0000000000 --- a/app/Livewire/Server/Advanced.php +++ /dev/null @@ -1,83 +0,0 @@ -server = Server::ownedByCurrentTeam()->whereUuid($server_uuid)->firstOrFail(); - $this->parameters = get_route_parameters(); - $this->syncData(); - } catch (\Throwable) { - return redirect()->route('server.index'); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $this->server->settings->concurrent_builds = $this->concurrentBuilds; - $this->server->settings->dynamic_timeout = $this->dynamicTimeout; - $this->server->settings->server_disk_usage_notification_threshold = $this->serverDiskUsageNotificationThreshold; - $this->server->settings->server_disk_usage_check_frequency = $this->serverDiskUsageCheckFrequency; - $this->server->settings->save(); - } else { - $this->concurrentBuilds = $this->server->settings->concurrent_builds; - $this->dynamicTimeout = $this->server->settings->dynamic_timeout; - $this->serverDiskUsageNotificationThreshold = $this->server->settings->server_disk_usage_notification_threshold; - $this->serverDiskUsageCheckFrequency = $this->server->settings->server_disk_usage_check_frequency; - } - } - - public function instantSave() - { - try { - $this->syncData(true); - $this->dispatch('success', 'Server updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function submit() - { - try { - if (! validate_cron_expression($this->serverDiskUsageCheckFrequency)) { - $this->serverDiskUsageCheckFrequency = $this->server->settings->getOriginal('server_disk_usage_check_frequency'); - throw new \Exception('Invalid Cron / Human expression for Disk Usage Check Frequency.'); - } - $this->syncData(true); - $this->dispatch('success', 'Server updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.server.advanced'); - } -} diff --git a/app/Livewire/Server/Charts.php b/app/Livewire/Server/Charts.php deleted file mode 100644 index d0db87f577..0000000000 --- a/app/Livewire/Server/Charts.php +++ /dev/null @@ -1,64 +0,0 @@ -server = Server::ownedByCurrentTeam()->whereUuid($server_uuid)->firstOrFail(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function pollData() - { - if ($this->poll || $this->interval <= 10) { - $this->loadData(); - if ($this->interval > 10) { - $this->poll = false; - } - } - } - - public function loadData() - { - try { - $cpuMetrics = $this->server->getCpuMetrics($this->interval); - $memoryMetrics = $this->server->getMemoryMetrics($this->interval); - $this->dispatch("refreshChartData-{$this->chartId}-cpu", [ - 'seriesData' => $cpuMetrics, - ]); - $this->dispatch("refreshChartData-{$this->chartId}-memory", [ - 'seriesData' => $memoryMetrics, - ]); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function setInterval() - { - if ($this->interval <= 10) { - $this->poll = true; - } - $this->loadData(); - } -} diff --git a/app/Livewire/Server/CloudflareTunnels.php b/app/Livewire/Server/CloudflareTunnels.php deleted file mode 100644 index f69fc86557..0000000000 --- a/app/Livewire/Server/CloudflareTunnels.php +++ /dev/null @@ -1,54 +0,0 @@ -server = Server::ownedByCurrentTeam()->whereUuid($server_uuid)->firstOrFail(); - if ($this->server->isLocalhost()) { - return redirect()->route('server.show', ['server_uuid' => $server_uuid]); - } - $this->isCloudflareTunnelsEnabled = $this->server->settings->is_cloudflare_tunnel; - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function instantSave() - { - try { - $this->validate(); - $this->server->settings->is_cloudflare_tunnel = $this->isCloudflareTunnelsEnabled; - $this->server->settings->save(); - $this->dispatch('success', 'Server updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function manualCloudflareConfig() - { - $this->isCloudflareTunnelsEnabled = true; - $this->server->settings->is_cloudflare_tunnel = true; - $this->server->settings->save(); - $this->server->refresh(); - $this->dispatch('success', 'Cloudflare Tunnels enabled.'); - } - - public function render() - { - return view('livewire.server.cloudflare-tunnels'); - } -} diff --git a/app/Livewire/Server/ConfigureCloudflareTunnels.php b/app/Livewire/Server/ConfigureCloudflareTunnels.php deleted file mode 100644 index f27614aa4c..0000000000 --- a/app/Livewire/Server/ConfigureCloudflareTunnels.php +++ /dev/null @@ -1,54 +0,0 @@ -where('id', $this->server_id)->firstOrFail(); - $server->settings->is_cloudflare_tunnel = true; - $server->settings->save(); - $this->dispatch('success', 'Cloudflare Tunnels configured successfully.'); - $this->dispatch('refreshServerShow'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function submit() - { - try { - if (str($this->ssh_domain)->contains('https://')) { - $this->ssh_domain = str($this->ssh_domain)->replace('https://', '')->replace('http://', '')->trim(); - // remove / from the end - $this->ssh_domain = str($this->ssh_domain)->replace('/', ''); - } - $server = Server::ownedByCurrentTeam()->where('id', $this->server_id)->firstOrFail(); - ConfigureCloudflared::dispatch($server, $this->cloudflare_token); - $server->settings->is_cloudflare_tunnel = true; - $server->ip = $this->ssh_domain; - $server->save(); - $server->settings->save(); - $this->dispatch('info', 'Cloudflare Tunnels configuration started.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.server.configure-cloudflare-tunnels'); - } -} diff --git a/app/Livewire/Server/Create.php b/app/Livewire/Server/Create.php deleted file mode 100644 index 2d4ba4430c..0000000000 --- a/app/Livewire/Server/Create.php +++ /dev/null @@ -1,30 +0,0 @@ -private_keys = PrivateKey::ownedByCurrentTeam()->get(); - if (! isCloud()) { - $this->limit_reached = false; - - return; - } - $this->limit_reached = Team::serverLimitReached(); - } - - public function render() - { - return view('livewire.server.create'); - } -} diff --git a/app/Livewire/Server/Delete.php b/app/Livewire/Server/Delete.php deleted file mode 100644 index b9e3944b54..0000000000 --- a/app/Livewire/Server/Delete.php +++ /dev/null @@ -1,57 +0,0 @@ -server = Server::ownedByCurrentTeam()->whereUuid($server_uuid)->firstOrFail(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function delete($password) - { - if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) { - if (! Hash::check($password, Auth::user()->password)) { - $this->addError('password', 'The provided password is incorrect.'); - - return; - } - } - try { - $this->authorize('delete', $this->server); - if ($this->server->hasDefinedResources()) { - $this->dispatch('error', 'Server has defined resources. Please delete them first.'); - - return; - } - $this->server->delete(); - DeleteServer::dispatch($this->server); - - return redirect()->route('server.index'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.server.delete'); - } -} diff --git a/app/Livewire/Server/Destinations.php b/app/Livewire/Server/Destinations.php deleted file mode 100644 index dbab6e03f0..0000000000 --- a/app/Livewire/Server/Destinations.php +++ /dev/null @@ -1,90 +0,0 @@ -networks = collect(); - $this->server = Server::ownedByCurrentTeam()->whereUuid($server_uuid)->firstOrFail(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - private function createNetworkAndAttachToProxy() - { - $connectProxyToDockerNetworks = connectProxyToNetworks($this->server); - instant_remote_process($connectProxyToDockerNetworks, $this->server, false); - } - - public function add($name) - { - if ($this->server->isSwarm()) { - $found = $this->server->swarmDockers()->where('network', $name)->first(); - if ($found) { - $this->dispatch('error', 'Network already added to this server.'); - - return; - } else { - SwarmDocker::create([ - 'name' => $this->server->name.'-'.$name, - 'network' => $this->name, - 'server_id' => $this->server->id, - ]); - } - } else { - $found = $this->server->standaloneDockers()->where('network', $name)->first(); - if ($found) { - $this->dispatch('error', 'Network already added to this server.'); - - return; - } else { - StandaloneDocker::create([ - 'name' => $this->server->name.'-'.$name, - 'network' => $name, - 'server_id' => $this->server->id, - ]); - } - $this->createNetworkAndAttachToProxy(); - } - } - - public function scan() - { - if ($this->server->isSwarm()) { - $alreadyAddedNetworks = $this->server->swarmDockers; - } else { - $alreadyAddedNetworks = $this->server->standaloneDockers; - } - $networks = instant_remote_process(['docker network ls --format "{{json .}}"'], $this->server, false); - $this->networks = format_docker_command_output_to_json($networks)->filter(function ($network) { - return $network['Name'] !== 'bridge' && $network['Name'] !== 'host' && $network['Name'] !== 'none'; - })->filter(function ($network) use ($alreadyAddedNetworks) { - return ! $alreadyAddedNetworks->contains('network', $network['Name']); - }); - if ($this->networks->count() === 0) { - $this->dispatch('success', 'No new destinations found on this server.'); - - return; - } - $this->dispatch('success', 'Scan done.'); - } - - public function render() - { - return view('livewire.server.destinations'); - } -} diff --git a/app/Livewire/Server/DockerCleanup.php b/app/Livewire/Server/DockerCleanup.php deleted file mode 100644 index d3378d63f6..0000000000 --- a/app/Livewire/Server/DockerCleanup.php +++ /dev/null @@ -1,99 +0,0 @@ -server = Server::ownedByCurrentTeam()->whereUuid($server_uuid)->firstOrFail(); - $this->parameters = get_route_parameters(); - $this->syncData(); - } catch (\Throwable) { - return redirect()->route('server.index'); - } - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $this->server->settings->force_docker_cleanup = $this->forceDockerCleanup; - $this->server->settings->docker_cleanup_frequency = $this->dockerCleanupFrequency; - $this->server->settings->docker_cleanup_threshold = $this->dockerCleanupThreshold; - $this->server->settings->delete_unused_volumes = $this->deleteUnusedVolumes; - $this->server->settings->delete_unused_networks = $this->deleteUnusedNetworks; - $this->server->settings->save(); - } else { - $this->forceDockerCleanup = $this->server->settings->force_docker_cleanup; - $this->dockerCleanupFrequency = $this->server->settings->docker_cleanup_frequency; - $this->dockerCleanupThreshold = $this->server->settings->docker_cleanup_threshold; - $this->deleteUnusedVolumes = $this->server->settings->delete_unused_volumes; - $this->deleteUnusedNetworks = $this->server->settings->delete_unused_networks; - } - } - - public function instantSave() - { - try { - $this->syncData(true); - $this->dispatch('success', 'Server updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function manualCleanup() - { - try { - DockerCleanupJob::dispatch($this->server, true); - $this->dispatch('success', 'Manual cleanup job started. Depending on the amount of data, this might take a while.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function submit() - { - try { - if (! validate_cron_expression($this->dockerCleanupFrequency)) { - $this->dockerCleanupFrequency = $this->server->settings->getOriginal('docker_cleanup_frequency'); - throw new \Exception('Invalid Cron / Human expression for Docker Cleanup Frequency.'); - } - $this->syncData(true); - $this->dispatch('success', 'Server updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.server.docker-cleanup'); - } -} diff --git a/app/Livewire/Server/DockerCleanupExecutions.php b/app/Livewire/Server/DockerCleanupExecutions.php deleted file mode 100644 index 56d6130644..0000000000 --- a/app/Livewire/Server/DockerCleanupExecutions.php +++ /dev/null @@ -1,132 +0,0 @@ -user()->currentTeam()->id; - - return [ - "echo-private:team.{$teamId},DockerCleanupDone" => 'refreshExecutions', - ]; - } - - public function mount(Server $server) - { - $this->server = $server; - $this->refreshExecutions(); - } - - public function refreshExecutions(): void - { - $this->executions = $this->server->dockerCleanupExecutions() - ->orderBy('created_at', 'desc') - ->take(20) - ->get(); - - if ($this->selectedKey) { - $this->selectedExecution = DockerCleanupExecution::find($this->selectedKey); - if ($this->selectedExecution && $this->selectedExecution->status !== 'running') { - $this->isPollingActive = false; - } - } - } - - public function selectExecution($key): void - { - if ($key == $this->selectedKey) { - $this->selectedKey = null; - $this->selectedExecution = null; - $this->currentPage = 1; - $this->isPollingActive = false; - - return; - } - $this->selectedKey = $key; - $this->selectedExecution = DockerCleanupExecution::find($key); - $this->currentPage = 1; - - if ($this->selectedExecution && $this->selectedExecution->status === 'running') { - $this->isPollingActive = true; - } - } - - public function polling() - { - if ($this->selectedExecution && $this->isPollingActive) { - $this->selectedExecution->refresh(); - if ($this->selectedExecution->status !== 'running') { - $this->isPollingActive = false; - } - } - $this->refreshExecutions(); - } - - public function loadMoreLogs() - { - $this->currentPage++; - } - - public function getLogLinesProperty() - { - if (! $this->selectedExecution) { - return collect(); - } - - if (! $this->selectedExecution->message) { - return collect(['Waiting for execution output...']); - } - - $lines = collect(explode("\n", $this->selectedExecution->message)); - - return $lines->take($this->currentPage * $this->logsPerPage); - } - - public function downloadLogs(int $executionId) - { - $execution = $this->executions->firstWhere('id', $executionId); - if (! $execution) { - return; - } - - return response()->streamDownload(function () use ($execution) { - echo $execution->message; - }, "docker-cleanup-{$execution->uuid}.log"); - } - - public function hasMoreLogs() - { - if (! $this->selectedExecution || ! $this->selectedExecution->message) { - return false; - } - $lines = collect(explode("\n", $this->selectedExecution->message)); - - return $lines->count() > ($this->currentPage * $this->logsPerPage); - } - - public function render() - { - return view('livewire.server.docker-cleanup-executions'); - } -} diff --git a/app/Livewire/Server/Index.php b/app/Livewire/Server/Index.php deleted file mode 100644 index 74764960ae..0000000000 --- a/app/Livewire/Server/Index.php +++ /dev/null @@ -1,22 +0,0 @@ -servers = Server::ownedByCurrentTeam()->get(); - } - - public function render() - { - return view('livewire.server.index'); - } -} diff --git a/app/Livewire/Server/LogDrains.php b/app/Livewire/Server/LogDrains.php deleted file mode 100644 index edddfc7557..0000000000 --- a/app/Livewire/Server/LogDrains.php +++ /dev/null @@ -1,190 +0,0 @@ -server = Server::ownedByCurrentTeam()->whereUuid($server_uuid)->firstOrFail(); - $this->syncData(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function syncDataNewRelic(bool $toModel = false) - { - if ($toModel) { - $this->server->settings->is_logdrain_newrelic_enabled = $this->isLogDrainNewRelicEnabled; - $this->server->settings->logdrain_newrelic_license_key = $this->logDrainNewRelicLicenseKey; - $this->server->settings->logdrain_newrelic_base_uri = $this->logDrainNewRelicBaseUri; - } else { - $this->isLogDrainNewRelicEnabled = $this->server->settings->is_logdrain_newrelic_enabled; - $this->logDrainNewRelicLicenseKey = $this->server->settings->logdrain_newrelic_license_key; - $this->logDrainNewRelicBaseUri = $this->server->settings->logdrain_newrelic_base_uri; - } - } - - public function syncDataAxiom(bool $toModel = false) - { - if ($toModel) { - $this->server->settings->is_logdrain_axiom_enabled = $this->isLogDrainAxiomEnabled; - $this->server->settings->logdrain_axiom_dataset_name = $this->logDrainAxiomDatasetName; - $this->server->settings->logdrain_axiom_api_key = $this->logDrainAxiomApiKey; - } else { - $this->isLogDrainAxiomEnabled = $this->server->settings->is_logdrain_axiom_enabled; - $this->logDrainAxiomDatasetName = $this->server->settings->logdrain_axiom_dataset_name; - $this->logDrainAxiomApiKey = $this->server->settings->logdrain_axiom_api_key; - } - } - - public function syncDataCustom(bool $toModel = false) - { - if ($toModel) { - $this->server->settings->is_logdrain_custom_enabled = $this->isLogDrainCustomEnabled; - $this->server->settings->logdrain_custom_config = $this->logDrainCustomConfig; - $this->server->settings->logdrain_custom_config_parser = $this->logDrainCustomConfigParser; - } else { - $this->isLogDrainCustomEnabled = $this->server->settings->is_logdrain_custom_enabled; - $this->logDrainCustomConfig = $this->server->settings->logdrain_custom_config; - $this->logDrainCustomConfigParser = $this->server->settings->logdrain_custom_config_parser; - } - } - - public function syncData(bool $toModel = false, ?string $type = null) - { - if ($toModel) { - $this->customValidation(); - if ($type === 'newrelic') { - $this->syncDataNewRelic($toModel); - } elseif ($type === 'axiom') { - $this->syncDataAxiom($toModel); - } elseif ($type === 'custom') { - $this->syncDataCustom($toModel); - } else { - $this->syncDataNewRelic($toModel); - $this->syncDataAxiom($toModel); - $this->syncDataCustom($toModel); - } - $this->server->settings->save(); - } else { - if ($type === 'newrelic') { - $this->syncDataNewRelic($toModel); - } elseif ($type === 'axiom') { - $this->syncDataAxiom($toModel); - } elseif ($type === 'custom') { - $this->syncDataCustom($toModel); - } else { - $this->syncDataNewRelic($toModel); - $this->syncDataAxiom($toModel); - $this->syncDataCustom($toModel); - } - } - } - - public function customValidation() - { - if ($this->isLogDrainNewRelicEnabled) { - try { - $this->validate([ - 'logDrainNewRelicLicenseKey' => ['required'], - 'logDrainNewRelicBaseUri' => ['required', 'url'], - ]); - } catch (\Throwable $e) { - $this->isLogDrainNewRelicEnabled = false; - - throw $e; - } - } elseif ($this->isLogDrainAxiomEnabled) { - try { - $this->validate([ - 'logDrainAxiomDatasetName' => ['required'], - 'logDrainAxiomApiKey' => ['required'], - ]); - } catch (\Throwable $e) { - $this->isLogDrainAxiomEnabled = false; - - throw $e; - } - } elseif ($this->isLogDrainCustomEnabled) { - try { - $this->validate([ - 'logDrainCustomConfig' => ['required'], - 'logDrainCustomConfigParser' => ['string', 'nullable'], - ]); - } catch (\Throwable $e) { - $this->isLogDrainCustomEnabled = false; - - throw $e; - } - } - } - - public function instantSave() - { - try { - $this->syncData(true); - if ($this->server->isLogDrainEnabled()) { - StartLogDrain::run($this->server); - $this->dispatch('success', 'Log drain service started.'); - } else { - StopLogDrain::run($this->server); - $this->dispatch('success', 'Log drain service stopped.'); - } - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function submit(string $type) - { - try { - $this->syncData(true, $type); - $this->dispatch('success', 'Settings saved.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.server.log-drains'); - } -} diff --git a/app/Livewire/Server/New/ByIp.php b/app/Livewire/Server/New/ByIp.php deleted file mode 100644 index 5f60c5db5e..0000000000 --- a/app/Livewire/Server/New/ByIp.php +++ /dev/null @@ -1,133 +0,0 @@ -name = generate_random_name(); - $this->private_key_id = $this->private_keys->first()?->id; - $this->swarm_managers = Server::isUsable()->get()->where('settings.is_swarm_manager', true); - if ($this->swarm_managers->count() > 0) { - $this->selected_swarm_cluster = $this->swarm_managers->first()->id; - } - } - - public function setPrivateKey(string $private_key_id) - { - $this->private_key_id = $private_key_id; - } - - public function instantSave() - { - // $this->dispatch('success', 'Application settings updated!'); - } - - public function submit() - { - $this->validate(); - try { - if (Server::where('team_id', currentTeam()->id) - ->where('ip', $this->ip) - ->exists()) { - return $this->dispatch('error', 'This IP/Domain is already in use by another server in your team.'); - } - - if (is_null($this->private_key_id)) { - return $this->dispatch('error', 'You must select a private key'); - } - if (Team::serverLimitReached()) { - return $this->dispatch('error', 'You have reached the server limit for your subscription.'); - } - $payload = [ - 'name' => $this->name, - 'description' => $this->description, - 'ip' => $this->ip, - 'user' => $this->user, - 'port' => $this->port, - 'team_id' => currentTeam()->id, - 'private_key_id' => $this->private_key_id, - ]; - if ($this->is_swarm_worker) { - $payload['swarm_cluster'] = $this->selected_swarm_cluster; - } - if ($this->is_build_server) { - data_forget($payload, 'proxy'); - } - $server = Server::create($payload); - $server->proxy->set('status', 'exited'); - $server->proxy->set('type', ProxyTypes::TRAEFIK->value); - $server->save(); - if ($this->is_build_server) { - $this->is_swarm_manager = false; - $this->is_swarm_worker = false; - } else { - $server->settings->is_swarm_manager = $this->is_swarm_manager; - $server->settings->is_swarm_worker = $this->is_swarm_worker; - } - $server->settings->is_build_server = $this->is_build_server; - $server->settings->save(); - - return redirect()->route('server.show', $server->uuid); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Server/PrivateKey/Show.php b/app/Livewire/Server/PrivateKey/Show.php deleted file mode 100644 index 64aa1884ba..0000000000 --- a/app/Livewire/Server/PrivateKey/Show.php +++ /dev/null @@ -1,72 +0,0 @@ -server = Server::ownedByCurrentTeam()->whereUuid($server_uuid)->firstOrFail(); - $this->privateKeys = PrivateKey::ownedByCurrentTeam()->get()->where('is_git_related', false); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function setPrivateKey($privateKeyId) - { - $ownedPrivateKey = PrivateKey::ownedByCurrentTeam()->find($privateKeyId); - if (is_null($ownedPrivateKey)) { - $this->dispatch('error', 'You are not allowed to use this private key.'); - - return; - } - - $originalPrivateKeyId = $this->server->getOriginal('private_key_id'); - try { - $this->server->update(['private_key_id' => $privateKeyId]); - ['uptime' => $uptime, 'error' => $error] = $this->server->validateConnection(justCheckingNewKey: true); - if ($uptime) { - $this->dispatch('success', 'Private key updated successfully.'); - } else { - throw new \Exception($error); - } - } catch (\Exception $e) { - $this->server->update(['private_key_id' => $originalPrivateKeyId]); - $this->server->validateConnection(); - $this->dispatch('error', $e->getMessage()); - } - } - - public function checkConnection() - { - try { - ['uptime' => $uptime, 'error' => $error] = $this->server->validateConnection(); - if ($uptime) { - $this->dispatch('success', 'Server is reachable.'); - } else { - $this->dispatch('error', 'Server is not reachable.

Check this documentation for further help.

Error: '.$error); - - return; - } - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.server.private-key.show'); - } -} diff --git a/app/Livewire/Server/Proxy.php b/app/Livewire/Server/Proxy.php deleted file mode 100644 index 4e325c1ff6..0000000000 --- a/app/Livewire/Server/Proxy.php +++ /dev/null @@ -1,119 +0,0 @@ - 'submit']; - - protected $rules = [ - 'server.settings.generate_exact_labels' => 'required|boolean', - ]; - - public function mount() - { - $this->selectedProxy = $this->server->proxyType(); - $this->redirect_enabled = data_get($this->server, 'proxy.redirect_enabled', true); - $this->redirect_url = data_get($this->server, 'proxy.redirect_url'); - } - - public function proxyStatusUpdated() - { - $this->dispatch('refresh')->self(); - } - - public function changeProxy() - { - $this->server->proxy = null; - $this->server->save(); - $this->dispatch('reloadWindow'); - } - - public function selectProxy($proxy_type) - { - try { - $this->server->changeProxy($proxy_type, async: false); - $this->selectedProxy = $this->server->proxy->type; - $this->dispatch('reloadWindow'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function instantSave() - { - try { - $this->validate(); - $this->server->settings->save(); - $this->dispatch('success', 'Settings saved.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function instantSaveRedirect() - { - try { - $this->server->proxy->redirect_enabled = $this->redirect_enabled; - $this->server->save(); - $this->server->setupDefaultRedirect(); - $this->dispatch('success', 'Proxy configuration saved.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function submit() - { - try { - SaveConfiguration::run($this->server, $this->proxy_settings); - $this->server->proxy->redirect_url = $this->redirect_url; - $this->server->save(); - $this->server->setupDefaultRedirect(); - $this->dispatch('success', 'Proxy configuration saved.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function reset_proxy_configuration() - { - try { - $this->proxy_settings = CheckConfiguration::run($this->server, true); - SaveConfiguration::run($this->server, $this->proxy_settings); - $this->server->save(); - $this->dispatch('success', 'Proxy configuration saved.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function loadProxyConfiguration() - { - try { - $this->proxy_settings = CheckConfiguration::run($this->server); - if (str($this->proxy_settings)->contains('--api.dashboard=true') && str($this->proxy_settings)->contains('--api.insecure=true')) { - $this->dispatch('traefikDashboardAvailable', true); - } else { - $this->dispatch('traefikDashboardAvailable', false); - } - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Server/Proxy/Deploy.php b/app/Livewire/Server/Proxy/Deploy.php deleted file mode 100644 index f823ff3d44..0000000000 --- a/app/Livewire/Server/Proxy/Deploy.php +++ /dev/null @@ -1,140 +0,0 @@ -user()->currentTeam()->id; - - return [ - "echo-private:team.{$teamId},ProxyStatusChanged" => 'proxyStarted', - 'proxyStatusUpdated', - 'traefikDashboardAvailable', - 'serverRefresh' => 'proxyStatusUpdated', - 'checkProxy', - 'startProxy', - 'proxyChanged' => 'proxyStatusUpdated', - ]; - } - - public function mount() - { - if ($this->server->id === 0) { - $this->serverIp = base_ip(); - } else { - $this->serverIp = $this->server->ip; - } - $this->currentRoute = request()->route()->getName(); - } - - public function traefikDashboardAvailable(bool $data) - { - $this->traefikDashboardAvailable = $data; - } - - public function proxyStarted() - { - CheckProxy::run($this->server, true); - $this->dispatch('proxyStatusUpdated'); - } - - public function proxyStatusUpdated() - { - $this->server->refresh(); - } - - public function restart() - { - try { - $this->stop(); - $this->dispatch('checkProxy'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function checkProxy() - { - try { - CheckProxy::run($this->server, true); - $this->dispatch('startProxyPolling'); - $this->dispatch('proxyChecked'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function startProxy() - { - try { - $this->server->proxy->force_stop = false; - $this->server->save(); - $activity = StartProxy::run($this->server, force: true); - $this->dispatch('activityMonitor', $activity->id, ProxyStatusChanged::class); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function stop(bool $forceStop = true) - { - try { - $containerName = $this->server->isSwarm() ? 'coolify-proxy_traefik' : 'coolify-proxy'; - $timeout = 30; - - $process = $this->stopContainer($containerName, $timeout); - - $startTime = Carbon::now()->getTimestamp(); - while ($process->running()) { - if (Carbon::now()->getTimestamp() - $startTime >= $timeout) { - $this->forceStopContainer($containerName); - break; - } - usleep(100000); - } - - $this->removeContainer($containerName); - } catch (\Throwable $e) { - return handleError($e, $this); - } finally { - $this->server->proxy->force_stop = $forceStop; - $this->server->proxy->status = 'exited'; - $this->server->save(); - $this->dispatch('proxyStatusUpdated'); - } - } - - private function stopContainer(string $containerName, int $timeout): InvokedProcess - { - return Process::timeout($timeout)->start("docker stop --time=$timeout $containerName"); - } - - private function forceStopContainer(string $containerName) - { - instant_remote_process(["docker kill $containerName"], $this->server, throwError: false); - } - - private function removeContainer(string $containerName) - { - instant_remote_process(["docker rm -f $containerName"], $this->server, throwError: false); - } -} diff --git a/app/Livewire/Server/Proxy/DynamicConfigurationNavbar.php b/app/Livewire/Server/Proxy/DynamicConfigurationNavbar.php deleted file mode 100644 index 392ad38fa9..0000000000 --- a/app/Livewire/Server/Proxy/DynamicConfigurationNavbar.php +++ /dev/null @@ -1,42 +0,0 @@ -whereId($this->server_id)->first(); - $proxy_path = $server->proxyPath(); - $proxy_type = $server->proxyType(); - $file = str_replace('|', '.', $fileName); - if ($proxy_type === 'CADDY' && $file === 'Caddyfile') { - $this->dispatch('error', 'Cannot delete Caddyfile.'); - - return; - } - instant_remote_process(["rm -f {$proxy_path}/dynamic/{$file}"], $server); - if ($proxy_type === 'CADDY') { - $server->reloadCaddy(); - } - $this->dispatch('success', 'File deleted.'); - $this->dispatch('loadDynamicConfigurations'); - $this->dispatch('refresh'); - } - - public function render() - { - return view('livewire.server.proxy.dynamic-configuration-navbar'); - } -} diff --git a/app/Livewire/Server/Proxy/DynamicConfigurations.php b/app/Livewire/Server/Proxy/DynamicConfigurations.php deleted file mode 100644 index 6277a24bd4..0000000000 --- a/app/Livewire/Server/Proxy/DynamicConfigurations.php +++ /dev/null @@ -1,64 +0,0 @@ -user()->currentTeam()->id; - - return [ - "echo-private:team.{$teamId},ProxyStatusChanged" => 'loadDynamicConfigurations', - 'loadDynamicConfigurations', - ]; - } - - protected $rules = [ - 'contents.*' => 'nullable|string', - ]; - - public function loadDynamicConfigurations() - { - $proxy_path = $this->server->proxyPath(); - $files = instant_remote_process(["mkdir -p $proxy_path/dynamic && ls -1 {$proxy_path}/dynamic"], $this->server); - $files = collect(explode("\n", $files))->filter(fn ($file) => ! empty($file)); - $files = $files->map(fn ($file) => trim($file)); - $files = $files->sort(); - $contents = collect([]); - foreach ($files as $file) { - $without_extension = str_replace('.', '|', $file); - $contents[$without_extension] = instant_remote_process(["cat {$proxy_path}/dynamic/{$file}"], $this->server); - } - $this->contents = $contents; - $this->dispatch('$refresh'); - } - - public function mount() - { - $this->parameters = get_route_parameters(); - try { - $this->server = Server::ownedByCurrentTeam()->whereUuid(request()->server_uuid)->first(); - if (is_null($this->server)) { - return redirect()->route('server.index'); - } - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.server.proxy.dynamic-configurations'); - } -} diff --git a/app/Livewire/Server/Proxy/Logs.php b/app/Livewire/Server/Proxy/Logs.php deleted file mode 100644 index 8e0f40c54e..0000000000 --- a/app/Livewire/Server/Proxy/Logs.php +++ /dev/null @@ -1,31 +0,0 @@ -parameters = get_route_parameters(); - try { - $this->server = Server::ownedByCurrentTeam()->whereUuid(request()->server_uuid)->first(); - if (is_null($this->server)) { - return redirect()->route('server.index'); - } - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.server.proxy.logs'); - } -} diff --git a/app/Livewire/Server/Proxy/NewDynamicConfiguration.php b/app/Livewire/Server/Proxy/NewDynamicConfiguration.php deleted file mode 100644 index 2155f1e82d..0000000000 --- a/app/Livewire/Server/Proxy/NewDynamicConfiguration.php +++ /dev/null @@ -1,97 +0,0 @@ -parameters = get_route_parameters(); - if ($this->fileName !== '') { - $this->fileName = str_replace('|', '.', $this->fileName); - } - } - - public function addDynamicConfiguration() - { - try { - $this->validate([ - 'fileName' => 'required', - 'value' => 'required', - ]); - if (data_get($this->parameters, 'server_uuid')) { - $this->server = Server::ownedByCurrentTeam()->whereUuid(data_get($this->parameters, 'server_uuid'))->first(); - } - if (! is_null($this->server_id)) { - $this->server = Server::ownedByCurrentTeam()->whereId($this->server_id)->first(); - } - if (is_null($this->server)) { - return redirect()->route('server.index'); - } - $proxy_type = $this->server->proxyType(); - if ($proxy_type === ProxyTypes::TRAEFIK->value) { - if (! str($this->fileName)->endsWith('.yaml') && ! str($this->fileName)->endsWith('.yml')) { - $this->fileName = "{$this->fileName}.yaml"; - } - if ($this->fileName === 'coolify.yaml') { - $this->dispatch('error', 'File name is reserved.'); - - return; - } - } elseif ($proxy_type === 'CADDY') { - if (! str($this->fileName)->endsWith('.caddy')) { - $this->fileName = "{$this->fileName}.caddy"; - } - } - $proxy_path = $this->server->proxyPath(); - $file = "{$proxy_path}/dynamic/{$this->fileName}"; - if ($this->newFile) { - $exists = instant_remote_process(["test -f $file && echo 1 || echo 0"], $this->server); - if ($exists == 1) { - $this->dispatch('error', 'File already exists'); - - return; - } - } - if ($proxy_type === ProxyTypes::TRAEFIK->value) { - $yaml = Yaml::parse($this->value); - $yaml = Yaml::dump($yaml, 10, 2); - $this->value = $yaml; - } - $base64_value = base64_encode($this->value); - instant_remote_process([ - "echo '{$base64_value}' | base64 -d | tee {$file} > /dev/null", - ], $this->server); - if ($proxy_type === 'CADDY') { - $this->server->reloadCaddy(); - } - $this->dispatch('loadDynamicConfigurations'); - $this->dispatch('dynamic-configuration-added'); - $this->dispatch('success', 'Dynamic configuration saved.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.server.proxy.new-dynamic-configuration'); - } -} diff --git a/app/Livewire/Server/Proxy/Show.php b/app/Livewire/Server/Proxy/Show.php deleted file mode 100644 index 5ecb56a691..0000000000 --- a/app/Livewire/Server/Proxy/Show.php +++ /dev/null @@ -1,35 +0,0 @@ - 'proxyStatusUpdated']; - - public function proxyStatusUpdated() - { - $this->server->refresh(); - } - - public function mount() - { - $this->parameters = get_route_parameters(); - try { - $this->server = Server::ownedByCurrentTeam()->whereUuid(request()->server_uuid)->firstOrFail(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.server.proxy.show'); - } -} diff --git a/app/Livewire/Server/Proxy/Status.php b/app/Livewire/Server/Proxy/Status.php deleted file mode 100644 index f4f18381f8..0000000000 --- a/app/Livewire/Server/Proxy/Status.php +++ /dev/null @@ -1,77 +0,0 @@ -checkProxy(); - } - - public function proxyStatusUpdated() - { - $this->server->refresh(); - } - - public function checkProxy(bool $notification = false) - { - try { - if ($this->polling) { - if ($this->numberOfPolls >= 10) { - $this->polling = false; - $this->numberOfPolls = 0; - $notification && $this->dispatch('error', 'Proxy is not running.'); - - return; - } - $this->numberOfPolls++; - } - $shouldStart = CheckProxy::run($this->server, true); - if ($shouldStart) { - StartProxy::run($this->server, false); - } - $this->dispatch('proxyStatusUpdated'); - if ($this->server->proxy->status === 'running') { - $this->polling = false; - $notification && $this->dispatch('success', 'Proxy is running.'); - } elseif ($this->server->proxy->status === 'exited' and ! $this->server->proxy->force_stop) { - $notification && $this->dispatch('error', 'Proxy has exited.'); - } elseif ($this->server->proxy->force_stop) { - $notification && $this->dispatch('error', 'Proxy is stopped manually.'); - } else { - $notification && $this->dispatch('error', 'Proxy is not running.'); - } - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function getProxyStatus() - { - try { - GetContainersStatus::run($this->server); - // dispatch_sync(new ContainerStatusJob($this->server)); - $this->dispatch('proxyStatusUpdated'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Server/Resources.php b/app/Livewire/Server/Resources.php deleted file mode 100644 index f549b43cbd..0000000000 --- a/app/Livewire/Server/Resources.php +++ /dev/null @@ -1,102 +0,0 @@ -user()->currentTeam()->id; - - return [ - "echo-private:team.{$teamId},ApplicationStatusChanged" => 'refreshStatus', - ]; - } - - public function startUnmanaged($id) - { - $this->server->startUnmanaged($id); - $this->dispatch('success', 'Container started.'); - $this->loadUnmanagedContainers(); - } - - public function restartUnmanaged($id) - { - $this->server->restartUnmanaged($id); - $this->dispatch('success', 'Container restarted.'); - $this->loadUnmanagedContainers(); - } - - public function stopUnmanaged($id) - { - $this->server->stopUnmanaged($id); - $this->dispatch('success', 'Container stopped.'); - $this->loadUnmanagedContainers(); - } - - public function refreshStatus() - { - $this->server->refresh(); - if ($this->activeTab === 'managed') { - $this->loadManagedContainers(); - } else { - $this->loadUnmanagedContainers(); - } - $this->dispatch('success', 'Resource statuses refreshed.'); - } - - public function loadManagedContainers() - { - try { - $this->activeTab = 'managed'; - $this->containers = $this->server->refresh()->definedResources(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function loadUnmanagedContainers() - { - $this->activeTab = 'unmanaged'; - try { - $this->containers = $this->server->loadUnmanagedContainers(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function mount() - { - $this->containers = collect(); - $this->parameters = get_route_parameters(); - try { - $this->server = Server::ownedByCurrentTeam()->whereUuid(request()->server_uuid)->first(); - if (is_null($this->server)) { - return redirect()->route('server.index'); - } - $this->loadManagedContainers(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.server.resources'); - } -} diff --git a/app/Livewire/Server/Show.php b/app/Livewire/Server/Show.php deleted file mode 100644 index b0e6d88588..0000000000 --- a/app/Livewire/Server/Show.php +++ /dev/null @@ -1,282 +0,0 @@ -user()->currentTeam()->id; - - return [ - "echo-private:team.{$teamId},CloudflareTunnelConfigured" => 'refresh', - 'refreshServerShow' => 'refresh', - ]; - } - - public function mount(string $server_uuid) - { - try { - $this->server = Server::ownedByCurrentTeam()->whereUuid($server_uuid)->firstOrFail(); - $this->syncData(); - if (! $this->server->isEmpty()) { - $this->isBuildServerLocked = true; - } - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - #[Computed] - public function timezones(): array - { - return collect(timezone_identifiers_list()) - ->sort() - ->values() - ->toArray(); - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - - if (Server::where('team_id', currentTeam()->id) - ->where('ip', $this->ip) - ->where('id', '!=', $this->server->id) - ->exists()) { - $this->ip = $this->server->ip; - throw new \Exception('This IP/Domain is already in use by another server in your team.'); - } - - $this->server->name = $this->name; - $this->server->description = $this->description; - $this->server->ip = $this->ip; - $this->server->user = $this->user; - $this->server->port = $this->port; - $this->server->validation_logs = $this->validationLogs; - $this->server->save(); - - $this->server->settings->is_swarm_manager = $this->isSwarmManager; - $this->server->settings->wildcard_domain = $this->wildcardDomain; - $this->server->settings->is_swarm_worker = $this->isSwarmWorker; - $this->server->settings->is_build_server = $this->isBuildServer; - $this->server->settings->is_metrics_enabled = $this->isMetricsEnabled; - $this->server->settings->sentinel_token = $this->sentinelToken; - $this->server->settings->sentinel_metrics_refresh_rate_seconds = $this->sentinelMetricsRefreshRateSeconds; - $this->server->settings->sentinel_metrics_history_days = $this->sentinelMetricsHistoryDays; - $this->server->settings->sentinel_push_interval_seconds = $this->sentinelPushIntervalSeconds; - $this->server->settings->sentinel_custom_url = $this->sentinelCustomUrl; - $this->server->settings->is_sentinel_enabled = $this->isSentinelEnabled; - $this->server->settings->is_sentinel_debug_enabled = $this->isSentinelDebugEnabled; - - if (! validate_timezone($this->serverTimezone)) { - $this->serverTimezone = config('app.timezone'); - throw new \Exception('Invalid timezone.'); - } else { - $this->server->settings->server_timezone = $this->serverTimezone; - } - - $this->server->settings->save(); - } else { - $this->name = $this->server->name; - $this->description = $this->server->description; - $this->ip = $this->server->ip; - $this->user = $this->server->user; - $this->port = $this->server->port; - - $this->wildcardDomain = $this->server->settings->wildcard_domain; - $this->isReachable = $this->server->settings->is_reachable; - $this->isUsable = $this->server->settings->is_usable; - $this->isSwarmManager = $this->server->settings->is_swarm_manager; - $this->isSwarmWorker = $this->server->settings->is_swarm_worker; - $this->isBuildServer = $this->server->settings->is_build_server; - $this->isMetricsEnabled = $this->server->settings->is_metrics_enabled; - $this->sentinelToken = $this->server->settings->sentinel_token; - $this->sentinelMetricsRefreshRateSeconds = $this->server->settings->sentinel_metrics_refresh_rate_seconds; - $this->sentinelMetricsHistoryDays = $this->server->settings->sentinel_metrics_history_days; - $this->sentinelPushIntervalSeconds = $this->server->settings->sentinel_push_interval_seconds; - $this->sentinelCustomUrl = $this->server->settings->sentinel_custom_url; - $this->isSentinelEnabled = $this->server->settings->is_sentinel_enabled; - $this->isSentinelDebugEnabled = $this->server->settings->is_sentinel_debug_enabled; - $this->sentinelUpdatedAt = $this->server->settings->updated_at; - $this->serverTimezone = $this->server->settings->server_timezone; - } - } - - public function refresh() - { - $this->syncData(); - $this->dispatch('$refresh'); - } - - public function validateServer($install = true) - { - try { - $this->validationLogs = $this->server->validation_logs = null; - $this->server->save(); - $this->dispatch('init', $install); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function checkLocalhostConnection() - { - $this->syncData(true); - ['uptime' => $uptime, 'error' => $error] = $this->server->validateConnection(); - if ($uptime) { - $this->dispatch('success', 'Server is reachable.'); - $this->server->settings->is_reachable = $this->isReachable = true; - $this->server->settings->is_usable = $this->isUsable = true; - $this->server->settings->save(); - ServerReachabilityChanged::dispatch($this->server); - $this->dispatch('proxyStatusUpdated'); - } else { - $this->dispatch('error', 'Server is not reachable.', 'Please validate your configuration and connection.

Check this documentation for further help.

Error: '.$error); - - return; - } - } - - public function restartSentinel() - { - $this->server->restartSentinel(); - $this->dispatch('success', 'Sentinel restarted.'); - } - - public function updatedIsSentinelDebugEnabled($value) - { - $this->submit(); - $this->restartSentinel(); - } - - public function updatedIsMetricsEnabled($value) - { - $this->submit(); - $this->restartSentinel(); - } - - public function updatedIsSentinelEnabled($value) - { - if ($value === true) { - StartSentinel::run($this->server, true); - } else { - $this->isMetricsEnabled = false; - $this->isSentinelDebugEnabled = false; - StopSentinel::dispatch($this->server); - } - $this->submit(); - - } - - public function regenerateSentinelToken() - { - try { - $this->server->settings->generateSentinelToken(); - $this->dispatch('success', 'Token regenerated & Sentinel restarted.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function instantSave() - { - $this->submit(); - } - - public function submit() - { - try { - $this->syncData(true); - $this->dispatch('success', 'Server updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.server.show'); - } -} diff --git a/app/Livewire/Server/ValidateAndInstall.php b/app/Livewire/Server/ValidateAndInstall.php deleted file mode 100644 index 791ef93501..0000000000 --- a/app/Livewire/Server/ValidateAndInstall.php +++ /dev/null @@ -1,182 +0,0 @@ - '$refresh', - ]; - - public function init(int $data = 0) - { - $this->uptime = null; - $this->supported_os_type = null; - $this->docker_installed = null; - $this->docker_version = null; - $this->docker_compose_installed = null; - $this->proxy_started = null; - $this->error = null; - $this->number_of_tries = $data; - if (! $this->ask) { - $this->dispatch('validateConnection'); - } - } - - public function startValidatingAfterAsking() - { - $this->ask = false; - $this->init(); - } - - public function startProxy() - { - try { - $shouldStart = CheckProxy::run($this->server); - if ($shouldStart) { - $proxy = StartProxy::run($this->server, false); - if ($proxy === 'OK') { - $this->proxy_started = true; - } else { - throw new \Exception('Proxy could not be started.'); - } - } else { - $this->proxy_started = true; - } - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function validateConnection() - { - ['uptime' => $this->uptime, 'error' => $error] = $this->server->validateConnection(); - if (! $this->uptime) { - $this->error = 'Server is not reachable. Please validate your configuration and connection.
Check this documentation for further help.

Error: '.$error.'
'; - $this->server->update([ - 'validation_logs' => $this->error, - ]); - - return; - } - $this->dispatch('validateOS'); - } - - public function validateOS() - { - $this->supported_os_type = $this->server->validateOS(); - if (! $this->supported_os_type) { - $this->error = 'Server OS type is not supported. Please install Docker manually before continuing: documentation.'; - $this->server->update([ - 'validation_logs' => $this->error, - ]); - - return; - } - $this->dispatch('validateDockerEngine'); - } - - public function validateDockerEngine() - { - $this->docker_installed = $this->server->validateDockerEngine(); - $this->docker_compose_installed = $this->server->validateDockerCompose(); - if (! $this->docker_installed || ! $this->docker_compose_installed) { - if ($this->install) { - if ($this->number_of_tries == $this->max_tries) { - $this->error = 'Docker Engine could not be installed. Please install Docker manually before continuing: documentation.'; - $this->server->update([ - 'validation_logs' => $this->error, - ]); - - return; - } else { - if ($this->number_of_tries <= $this->max_tries) { - $activity = $this->server->installDocker(); - $this->number_of_tries++; - $this->dispatch('newActivityMonitor', $activity->id, 'init', $this->number_of_tries); - } - - return; - } - } else { - $this->error = 'Docker Engine is not installed. Please install Docker manually before continuing: documentation.'; - $this->server->update([ - 'validation_logs' => $this->error, - ]); - - return; - } - } - $this->dispatch('validateDockerVersion'); - } - - public function validateDockerVersion() - { - if ($this->server->isSwarm()) { - $swarmInstalled = $this->server->validateDockerSwarm(); - if ($swarmInstalled) { - $this->dispatch('success', 'Docker Swarm is initiated.'); - } - } else { - $this->docker_version = $this->server->validateDockerEngineVersion(); - if ($this->docker_version) { - $this->dispatch('refreshServerShow'); - $this->dispatch('refreshBoardingIndex'); - $this->dispatch('success', 'Server validated.'); - } else { - $requiredDockerVersion = str(config('constants.docker.minimum_required_version'))->before('.'); - $this->error = 'Minimum Docker Engine version '.$requiredDockerVersion.' is not instaled. Please install Docker manually before continuing: documentation.'; - $this->server->update([ - 'validation_logs' => $this->error, - ]); - - return; - } - } - - if ($this->server->isBuildServer()) { - return; - } - $this->dispatch('startProxy'); - } - - public function render() - { - return view('livewire.server.validate-and-install'); - } -} diff --git a/app/Livewire/Settings/Index.php b/app/Livewire/Settings/Index.php deleted file mode 100644 index 3d90024b7e..0000000000 --- a/app/Livewire/Settings/Index.php +++ /dev/null @@ -1,243 +0,0 @@ -route('dashboard'); - } else { - $this->settings = instanceSettings(); - $this->fqdn = $this->settings->fqdn; - $this->public_port_min = $this->settings->public_port_min; - $this->public_port_max = $this->settings->public_port_max; - $this->custom_dns_servers = $this->settings->custom_dns_servers; - $this->instance_name = $this->settings->instance_name; - $this->allowed_ips = $this->settings->allowed_ips; - $this->public_ipv4 = $this->settings->public_ipv4; - $this->public_ipv6 = $this->settings->public_ipv6; - $this->do_not_track = $this->settings->do_not_track; - $this->is_auto_update_enabled = $this->settings->is_auto_update_enabled; - $this->is_registration_enabled = $this->settings->is_registration_enabled; - $this->is_dns_validation_enabled = $this->settings->is_dns_validation_enabled; - $this->is_api_enabled = $this->settings->is_api_enabled; - $this->auto_update_frequency = $this->settings->auto_update_frequency; - $this->update_check_frequency = $this->settings->update_check_frequency; - $this->instance_timezone = $this->settings->instance_timezone; - $this->disable_two_step_confirmation = $this->settings->disable_two_step_confirmation; - } - } - - #[Computed] - public function timezones(): array - { - return collect(timezone_identifiers_list()) - ->sort() - ->values() - ->toArray(); - } - - public function instantSave($isSave = true) - { - $this->validate(); - if ($this->settings->is_auto_update_enabled === true) { - $this->validate([ - 'auto_update_frequency' => ['required', 'string'], - ]); - } - - $this->settings->fqdn = $this->fqdn; - $this->settings->public_port_min = $this->public_port_min; - $this->settings->public_port_max = $this->public_port_max; - $this->settings->custom_dns_servers = $this->custom_dns_servers; - $this->settings->instance_name = $this->instance_name; - $this->settings->allowed_ips = $this->allowed_ips; - $this->settings->public_ipv4 = $this->public_ipv4; - $this->settings->public_ipv6 = $this->public_ipv6; - $this->settings->do_not_track = $this->do_not_track; - $this->settings->is_auto_update_enabled = $this->is_auto_update_enabled; - $this->settings->is_registration_enabled = $this->is_registration_enabled; - $this->settings->is_dns_validation_enabled = $this->is_dns_validation_enabled; - $this->settings->is_api_enabled = $this->is_api_enabled; - $this->settings->auto_update_frequency = $this->auto_update_frequency; - $this->settings->update_check_frequency = $this->update_check_frequency; - $this->settings->disable_two_step_confirmation = $this->disable_two_step_confirmation; - $this->settings->instance_timezone = $this->instance_timezone; - if ($isSave) { - $this->settings->save(); - $this->dispatch('success', 'Settings updated!'); - } - } - - public function submit() - { - try { - $error_show = false; - $this->server = Server::findOrFail(0); - $this->resetErrorBag(); - - if (! validate_timezone($this->instance_timezone)) { - $this->instance_timezone = config('app.timezone'); - throw new \Exception('Invalid timezone.'); - } else { - $this->settings->instance_timezone = $this->instance_timezone; - } - - if ($this->settings->public_port_min > $this->settings->public_port_max) { - $this->addError('settings.public_port_min', 'The minimum port must be lower than the maximum port.'); - - return; - } - $this->validate(); - - if ($this->is_auto_update_enabled && ! validate_cron_expression($this->auto_update_frequency)) { - $this->dispatch('error', 'Invalid Cron / Human expression for Auto Update Frequency.'); - if (empty($this->auto_update_frequency)) { - $this->auto_update_frequency = '0 0 * * *'; - } - - return; - } - - if (! validate_cron_expression($this->update_check_frequency)) { - $this->dispatch('error', 'Invalid Cron / Human expression for Update Check Frequency.'); - if (empty($this->update_check_frequency)) { - $this->update_check_frequency = '0 * * * *'; - } - - return; - } - - if ($this->settings->is_dns_validation_enabled && $this->settings->fqdn) { - if (! validate_dns_entry($this->settings->fqdn, $this->server)) { - $this->dispatch('error', "Validating DNS failed.

Make sure you have added the DNS records correctly.

{$this->settings->fqdn}->{$this->server->ip}

Check this documentation for further help."); - $error_show = true; - } - } - if ($this->settings->fqdn) { - check_domain_usage(domain: $this->settings->fqdn); - } - $this->settings->custom_dns_servers = str($this->settings->custom_dns_servers)->replaceEnd(',', '')->trim(); - $this->settings->custom_dns_servers = str($this->settings->custom_dns_servers)->trim()->explode(',')->map(function ($dns) { - return str($dns)->trim()->lower(); - }); - $this->settings->custom_dns_servers = $this->settings->custom_dns_servers->unique(); - $this->settings->custom_dns_servers = $this->settings->custom_dns_servers->implode(','); - - $this->settings->allowed_ips = str($this->settings->allowed_ips)->replaceEnd(',', '')->trim(); - $this->settings->allowed_ips = str($this->settings->allowed_ips)->trim()->explode(',')->map(function ($ip) { - return str($ip)->trim(); - }); - $this->settings->allowed_ips = $this->settings->allowed_ips->unique(); - $this->settings->allowed_ips = $this->settings->allowed_ips->implode(','); - - $this->instantSave(isSave: false); - - $this->settings->save(); - $this->server->setupDynamicProxyConfiguration(); - if (! $error_show) { - $this->dispatch('success', 'Instance settings updated successfully!'); - } - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function checkManually() - { - CheckForUpdatesJob::dispatchSync(); - $this->dispatch('updateAvailable'); - $settings = instanceSettings(); - if ($settings->new_version_available) { - $this->dispatch('success', 'New version available!'); - } else { - $this->dispatch('success', 'No new version available.'); - } - } - - public function toggleTwoStepConfirmation($password): bool - { - if (! Hash::check($password, Auth::user()->password)) { - $this->addError('password', 'The provided password is incorrect.'); - - return false; - } - - $this->settings->disable_two_step_confirmation = $this->disable_two_step_confirmation = true; - $this->settings->save(); - $this->dispatch('success', 'Two step confirmation has been disabled.'); - - return true; - } -} diff --git a/app/Livewire/SettingsBackup.php b/app/Livewire/SettingsBackup.php deleted file mode 100644 index 1b0599ffee..0000000000 --- a/app/Livewire/SettingsBackup.php +++ /dev/null @@ -1,125 +0,0 @@ -route('dashboard'); - } else { - $settings = instanceSettings(); - $this->database = StandalonePostgresql::whereName('coolify-db')->first(); - $s3s = S3Storage::whereTeamId(0)->get() ?? []; - if ($this->database) { - $this->uuid = $this->database->uuid; - $this->name = $this->database->name; - $this->description = $this->database->description; - $this->postgres_user = $this->database->postgres_user; - $this->postgres_password = $this->database->postgres_password; - - if ($this->database->status !== 'running') { - $this->database->status = 'running'; - $this->database->save(); - } - $this->backup = $this->database->scheduledBackups->first(); - $this->executions = $this->backup->executions; - } - $this->settings = $settings; - $this->s3s = $s3s; - } - } - - public function addCoolifyDatabase() - { - try { - $server = Server::findOrFail(0); - $out = instant_remote_process(['docker inspect coolify-db'], $server); - $envs = format_docker_envs_to_json($out); - $postgres_password = $envs['POSTGRES_PASSWORD']; - $postgres_user = $envs['POSTGRES_USER']; - $postgres_db = $envs['POSTGRES_DB']; - $this->database = StandalonePostgresql::create([ - 'id' => 0, - 'name' => 'coolify-db', - 'description' => 'Coolify database', - 'postgres_user' => $postgres_user, - 'postgres_password' => $postgres_password, - 'postgres_db' => $postgres_db, - 'status' => 'running', - 'destination_type' => \App\Models\StandaloneDocker::class, - 'destination_id' => 0, - ]); - $this->backup = ScheduledDatabaseBackup::create([ - 'id' => 0, - 'enabled' => true, - 'save_s3' => false, - 'frequency' => '0 0 * * *', - 'database_id' => $this->database->id, - 'database_type' => \App\Models\StandalonePostgresql::class, - 'team_id' => currentTeam()->id, - ]); - $this->database->refresh(); - $this->backup->refresh(); - $this->s3s = S3Storage::whereTeamId(0)->get(); - - $this->uuid = $this->database->uuid; - $this->name = $this->database->name; - $this->description = $this->database->description; - $this->postgres_user = $this->database->postgres_user; - $this->postgres_password = $this->database->postgres_password; - $this->executions = $this->backup->executions; - - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function submit() - { - $this->database->update([ - 'name' => $this->name, - 'description' => $this->description, - 'postgres_user' => $this->postgres_user, - 'postgres_password' => $this->postgres_password, - ]); - $this->dispatch('success', 'Backup updated.'); - } -} diff --git a/app/Livewire/SettingsEmail.php b/app/Livewire/SettingsEmail.php deleted file mode 100644 index 4205594a52..0000000000 --- a/app/Livewire/SettingsEmail.php +++ /dev/null @@ -1,241 +0,0 @@ -route('dashboard'); - } - $this->settings = instanceSettings(); - $this->syncData(); - $this->team = auth()->user()->currentTeam(); - $this->testEmailAddress = auth()->user()->email; - } - - public function syncData(bool $toModel = false) - { - if ($toModel) { - $this->validate(); - $this->settings->smtp_enabled = $this->smtpEnabled; - $this->settings->smtp_host = $this->smtpHost; - $this->settings->smtp_port = $this->smtpPort; - $this->settings->smtp_encryption = $this->smtpEncryption; - $this->settings->smtp_username = $this->smtpUsername; - $this->settings->smtp_password = $this->smtpPassword; - $this->settings->smtp_timeout = $this->smtpTimeout; - $this->settings->smtp_from_address = $this->smtpFromAddress; - $this->settings->smtp_from_name = $this->smtpFromName; - - $this->settings->resend_enabled = $this->resendEnabled; - $this->settings->resend_api_key = $this->resendApiKey; - $this->settings->save(); - } else { - $this->smtpEnabled = $this->settings->smtp_enabled; - $this->smtpHost = $this->settings->smtp_host; - $this->smtpPort = $this->settings->smtp_port; - $this->smtpEncryption = $this->settings->smtp_encryption; - $this->smtpUsername = $this->settings->smtp_username; - $this->smtpPassword = $this->settings->smtp_password; - $this->smtpTimeout = $this->settings->smtp_timeout; - $this->smtpFromAddress = $this->settings->smtp_from_address; - $this->smtpFromName = $this->settings->smtp_from_name; - - $this->resendEnabled = $this->settings->resend_enabled; - $this->resendApiKey = $this->settings->resend_api_key; - } - } - - public function submit() - { - try { - $this->resetErrorBag(); - $this->syncData(true); - $this->dispatch('success', 'Transactional email settings updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function instantSave(string $type) - { - try { - $currentSmtpEnabled = $this->settings->smtp_enabled; - $currentResendEnabled = $this->settings->resend_enabled; - $this->resetErrorBag(); - - if ($type === 'SMTP') { - $this->submitSmtp(); - $this->resendEnabled = $this->settings->resend_enabled = false; - } elseif ($type === 'Resend') { - $this->submitResend(); - $this->smtpEnabled = $this->settings->smtp_enabled = false; - } - $this->settings->save(); - - } catch (\Throwable $e) { - if ($type === 'SMTP') { - $this->smtpEnabled = $currentSmtpEnabled; - } elseif ($type === 'Resend') { - $this->resendEnabled = $currentResendEnabled; - } - - return handleError($e, $this); - } - } - - public function submitSmtp() - { - try { - $this->validate([ - 'smtpEnabled' => 'boolean', - 'smtpFromAddress' => 'required|email', - 'smtpFromName' => 'required|string', - 'smtpHost' => 'required|string', - 'smtpPort' => 'required|numeric', - 'smtpEncryption' => 'required|string|in:starttls,tls,none', - 'smtpUsername' => 'nullable|string', - 'smtpPassword' => 'nullable|string', - 'smtpTimeout' => 'nullable|numeric', - ], [ - 'smtpFromAddress.required' => 'From Address is required.', - 'smtpFromAddress.email' => 'Please enter a valid email address.', - 'smtpFromName.required' => 'From Name is required.', - 'smtpHost.required' => 'SMTP Host is required.', - 'smtpPort.required' => 'SMTP Port is required.', - 'smtpPort.numeric' => 'SMTP Port must be a number.', - 'smtpEncryption.required' => 'Encryption type is required.', - ]); - - $this->settings->smtp_enabled = $this->smtpEnabled; - $this->settings->smtp_host = $this->smtpHost; - $this->settings->smtp_port = $this->smtpPort; - $this->settings->smtp_encryption = $this->smtpEncryption; - $this->settings->smtp_username = $this->smtpUsername; - $this->settings->smtp_password = $this->smtpPassword; - $this->settings->smtp_timeout = $this->smtpTimeout; - $this->settings->smtp_from_address = $this->smtpFromAddress; - $this->settings->smtp_from_name = $this->smtpFromName; - - $this->settings->save(); - - $this->dispatch('success', 'SMTP settings updated.'); - } catch (\Throwable $e) { - $this->smtpEnabled = false; - - return handleError($e); - } - } - - public function submitResend() - { - try { - $this->validate([ - 'resendEnabled' => 'boolean', - 'resendApiKey' => 'required|string', - 'smtpFromAddress' => 'required|email', - 'smtpFromName' => 'required|string', - ], [ - 'resendApiKey.required' => 'Resend API Key is required.', - 'smtpFromAddress.required' => 'From Address is required.', - 'smtpFromAddress.email' => 'Please enter a valid email address.', - 'smtpFromName.required' => 'From Name is required.', - ]); - - $this->settings->resend_enabled = $this->resendEnabled; - $this->settings->resend_api_key = $this->resendApiKey; - $this->settings->smtp_from_address = $this->smtpFromAddress; - $this->settings->smtp_from_name = $this->smtpFromName; - - $this->settings->save(); - - $this->dispatch('success', 'Resend settings updated.'); - } catch (\Throwable $e) { - $this->resendEnabled = false; - - return handleError($e); - } - } - - public function sendTestEmail() - { - try { - $this->validate([ - 'testEmailAddress' => 'required|email', - ], [ - 'testEmailAddress.required' => 'Test email address is required.', - 'testEmailAddress.email' => 'Please enter a valid email address.', - ]); - - $executed = RateLimiter::attempt( - 'test-email:'.$this->team->id, - $perMinute = 0, - function () { - $this->team?->notify(new Test($this->testEmailAddress, 'email')); - $this->dispatch('success', 'Test Email sent.'); - }, - $decaySeconds = 10, - ); - - if (! $executed) { - throw new \Exception('Too many messages sent!'); - } - } catch (\Throwable $e) { - return handleError($e); - } - } -} diff --git a/app/Livewire/SettingsOauth.php b/app/Livewire/SettingsOauth.php deleted file mode 100644 index e23f94a73b..0000000000 --- a/app/Livewire/SettingsOauth.php +++ /dev/null @@ -1,69 +0,0 @@ -reduce(function ($carry, $setting) { - $carry["oauth_settings_map.$setting->provider.enabled"] = 'required'; - $carry["oauth_settings_map.$setting->provider.client_id"] = 'nullable'; - $carry["oauth_settings_map.$setting->provider.client_secret"] = 'nullable'; - $carry["oauth_settings_map.$setting->provider.redirect_uri"] = 'nullable'; - $carry["oauth_settings_map.$setting->provider.tenant"] = 'nullable'; - $carry["oauth_settings_map.$setting->provider.base_url"] = 'nullable'; - - return $carry; - }, []); - } - - public function mount() - { - if (! isInstanceAdmin()) { - return redirect()->route('home'); - } - $this->oauth_settings_map = OauthSetting::all()->sortBy('provider')->reduce(function ($carry, $setting) { - $carry[$setting->provider] = $setting; - - return $carry; - }, []); - } - - private function updateOauthSettings(?string $provider = null) - { - if ($provider) { - $oauth = $this->oauth_settings_map[$provider]; - if (! $oauth->couldBeEnabled()) { - $oauth->update(['enabled' => false]); - throw new \Exception('OAuth settings are not complete for '.$oauth->provider.'.
Please fill in all required fields.'); - } - $oauth->save(); - $this->dispatch('success', 'OAuth settings for '.$oauth->provider.' updated successfully!'); - } else { - foreach (array_values($this->oauth_settings_map) as &$setting) { - $setting->save(); - } - } - } - - public function instantSave(string $provider) - { - try { - $this->updateOauthSettings($provider); - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function submit() - { - $this->updateOauthSettings(); - $this->dispatch('success', 'Instance settings updated successfully!'); - } -} diff --git a/app/Livewire/SharedVariables/Environment/Index.php b/app/Livewire/SharedVariables/Environment/Index.php deleted file mode 100644 index 3673a3882c..0000000000 --- a/app/Livewire/SharedVariables/Environment/Index.php +++ /dev/null @@ -1,22 +0,0 @@ -projects = Project::ownedByCurrentTeam()->get(); - } - - public function render() - { - return view('livewire.shared-variables.environment.index'); - } -} diff --git a/app/Livewire/SharedVariables/Environment/Show.php b/app/Livewire/SharedVariables/Environment/Show.php deleted file mode 100644 index e88ac5f135..0000000000 --- a/app/Livewire/SharedVariables/Environment/Show.php +++ /dev/null @@ -1,53 +0,0 @@ - '$refresh', 'saveKey', 'environmentVariableDeleted' => '$refresh']; - - public function saveKey($data) - { - try { - $found = $this->environment->environment_variables()->where('key', $data['key'])->first(); - if ($found) { - throw new \Exception('Variable already exists.'); - } - $this->environment->environment_variables()->create([ - 'key' => $data['key'], - 'value' => $data['value'], - 'is_multiline' => $data['is_multiline'], - 'is_literal' => $data['is_literal'], - 'type' => 'environment', - 'team_id' => currentTeam()->id, - ]); - $this->environment->refresh(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function mount() - { - $this->parameters = get_route_parameters(); - $this->project = Project::ownedByCurrentTeam()->where('uuid', request()->route('project_uuid'))->firstOrFail(); - $this->environment = $this->project->environments()->where('uuid', request()->route('environment_uuid'))->firstOrFail(); - } - - public function render() - { - return view('livewire.shared-variables.environment.show'); - } -} diff --git a/app/Livewire/SharedVariables/Index.php b/app/Livewire/SharedVariables/Index.php deleted file mode 100644 index 61c31e9f83..0000000000 --- a/app/Livewire/SharedVariables/Index.php +++ /dev/null @@ -1,13 +0,0 @@ -projects = Project::ownedByCurrentTeam()->get(); - } - - public function render() - { - return view('livewire.shared-variables.project.index'); - } -} diff --git a/app/Livewire/SharedVariables/Project/Show.php b/app/Livewire/SharedVariables/Project/Show.php deleted file mode 100644 index 0171283c4a..0000000000 --- a/app/Livewire/SharedVariables/Project/Show.php +++ /dev/null @@ -1,50 +0,0 @@ - '$refresh', 'saveKey' => 'saveKey', 'environmentVariableDeleted' => '$refresh']; - - public function saveKey($data) - { - try { - $found = $this->project->environment_variables()->where('key', $data['key'])->first(); - if ($found) { - throw new \Exception('Variable already exists.'); - } - $this->project->environment_variables()->create([ - 'key' => $data['key'], - 'value' => $data['value'], - 'is_multiline' => $data['is_multiline'], - 'is_literal' => $data['is_literal'], - 'type' => 'project', - 'team_id' => currentTeam()->id, - ]); - $this->project->refresh(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function mount() - { - $projectUuid = request()->route('project_uuid'); - $teamId = currentTeam()->id; - $project = Project::where('team_id', $teamId)->where('uuid', $projectUuid)->first(); - if (! $project) { - return redirect()->route('dashboard'); - } - $this->project = $project; - } - - public function render() - { - return view('livewire.shared-variables.project.show'); - } -} diff --git a/app/Livewire/SharedVariables/Team/Index.php b/app/Livewire/SharedVariables/Team/Index.php deleted file mode 100644 index a76ccf58a6..0000000000 --- a/app/Livewire/SharedVariables/Team/Index.php +++ /dev/null @@ -1,44 +0,0 @@ - '$refresh', 'saveKey' => 'saveKey', 'environmentVariableDeleted' => '$refresh']; - - public function saveKey($data) - { - try { - $found = $this->team->environment_variables()->where('key', $data['key'])->first(); - if ($found) { - throw new \Exception('Variable already exists.'); - } - $this->team->environment_variables()->create([ - 'key' => $data['key'], - 'value' => $data['value'], - 'is_multiline' => $data['is_multiline'], - 'is_literal' => $data['is_literal'], - 'type' => 'team', - 'team_id' => currentTeam()->id, - ]); - $this->team->refresh(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function mount() - { - $this->team = currentTeam(); - } - - public function render() - { - return view('livewire.shared-variables.team.index'); - } -} diff --git a/app/Livewire/Source/Github/Change.php b/app/Livewire/Source/Github/Change.php deleted file mode 100644 index e73c9dc737..0000000000 --- a/app/Livewire/Source/Github/Change.php +++ /dev/null @@ -1,299 +0,0 @@ - 'required|string', - 'github_app.organization' => 'nullable|string', - 'github_app.api_url' => 'required|string', - 'github_app.html_url' => 'required|string', - 'github_app.custom_user' => 'required|string', - 'github_app.custom_port' => 'required|int', - 'github_app.app_id' => 'required|int', - 'github_app.installation_id' => 'required|int', - 'github_app.client_id' => 'required|string', - 'github_app.client_secret' => 'required|string', - 'github_app.webhook_secret' => 'required|string', - 'github_app.is_system_wide' => 'required|bool', - 'github_app.contents' => 'nullable|string', - 'github_app.metadata' => 'nullable|string', - 'github_app.pull_requests' => 'nullable|string', - 'github_app.administration' => 'nullable|string', - 'github_app.private_key_id' => 'required|int', - ]; - - public function boot() - { - if ($this->github_app) { - $this->github_app->makeVisible(['client_secret', 'webhook_secret']); - } - } - - public function checkPermissions() - { - try { - GithubAppPermissionJob::dispatchSync($this->github_app); - $this->github_app->refresh()->makeVisible('client_secret')->makeVisible('webhook_secret'); - $this->dispatch('success', 'Github App permissions updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - // public function check() - // { - - // Need administration:read:write permission - // https://docs.github.com/en/rest/actions/self-hosted-runners?apiVersion=2022-11-28#list-self-hosted-runners-for-a-repository - - // $github_access_token = generateGithubInstallationToken($this->github_app); - // $repositories = Http::withToken($github_access_token)->get("{$this->github_app->api_url}/installation/repositories?per_page=100"); - // $runners_by_repository = collect([]); - // $repositories = $repositories->json()['repositories']; - // foreach ($repositories as $repository) { - // $runners_downloads = Http::withToken($github_access_token)->get("{$this->github_app->api_url}/repos/{$repository['full_name']}/actions/runners/downloads"); - // $runners = Http::withToken($github_access_token)->get("{$this->github_app->api_url}/repos/{$repository['full_name']}/actions/runners"); - // $token = Http::withHeaders([ - // 'Authorization' => "Bearer $github_access_token", - // 'Accept' => 'application/vnd.github+json' - // ])->withBody(null)->post("{$this->github_app->api_url}/repos/{$repository['full_name']}/actions/runners/registration-token"); - // $token = $token->json(); - // $remove_token = Http::withHeaders([ - // 'Authorization' => "Bearer $github_access_token", - // 'Accept' => 'application/vnd.github+json' - // ])->withBody(null)->post("{$this->github_app->api_url}/repos/{$repository['full_name']}/actions/runners/remove-token"); - // $remove_token = $remove_token->json(); - // $runners_by_repository->put($repository['full_name'], [ - // 'token' => $token, - // 'remove_token' => $remove_token, - // 'runners' => $runners->json(), - // 'runners_downloads' => $runners_downloads->json() - // ]); - // } - - // } - - public function mount() - { - try { - $github_app_uuid = request()->github_app_uuid; - $this->github_app = GithubApp::ownedByCurrentTeam()->whereUuid($github_app_uuid)->firstOrFail(); - $this->github_app->makeVisible(['client_secret', 'webhook_secret']); - $this->privateKeys = PrivateKey::ownedByCurrentTeam()->get(); - - $this->applications = $this->github_app->applications; - $settings = instanceSettings(); - - $this->name = str($this->github_app->name)->kebab(); - $this->fqdn = $settings->fqdn; - - if ($settings->public_ipv4) { - $this->ipv4 = 'http://'.$settings->public_ipv4.':'.config('app.port'); - } - if ($settings->public_ipv6) { - $this->ipv6 = 'http://'.$settings->public_ipv6.':'.config('app.port'); - } - if ($this->github_app->installation_id && session('from')) { - $source_id = data_get(session('from'), 'source_id'); - if (! $source_id || $this->github_app->id !== $source_id) { - session()->forget('from'); - } else { - $parameters = data_get(session('from'), 'parameters'); - $back = data_get(session('from'), 'back'); - $environment_uuid = data_get($parameters, 'environment_uuid'); - $project_uuid = data_get($parameters, 'project_uuid'); - $type = data_get($parameters, 'type'); - $destination = data_get($parameters, 'destination'); - session()->forget('from'); - - return redirect()->route($back, [ - 'environment_uuid' => $environment_uuid, - 'project_uuid' => $project_uuid, - 'type' => $type, - 'destination' => $destination, - ]); - } - } - $this->parameters = get_route_parameters(); - if (isCloud() && ! isDev()) { - $this->webhook_endpoint = config('app.url'); - } else { - $this->webhook_endpoint = $this->ipv4; - $this->is_system_wide = $this->github_app->is_system_wide; - } - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function getGithubAppNameUpdatePath() - { - if (str($this->github_app->organization)->isNotEmpty()) { - return "{$this->github_app->html_url}/organizations/{$this->github_app->organization}/settings/apps/{$this->github_app->name}"; - } - - return "{$this->github_app->html_url}/settings/apps/{$this->github_app->name}"; - } - - private function generateGithubJwt($private_key, $app_id): string - { - $configuration = Configuration::forAsymmetricSigner( - new Sha256, - InMemory::plainText($private_key), - InMemory::plainText($private_key) - ); - - $now = time(); - - return $configuration->builder() - ->issuedBy((string) $app_id) - ->permittedFor('https://api.github.com') - ->identifiedBy((string) $now) - ->issuedAt(new \DateTimeImmutable("@{$now}")) - ->expiresAt(new \DateTimeImmutable('@'.($now + 600))) - ->getToken($configuration->signer(), $configuration->signingKey()) - ->toString(); - } - - public function updateGithubAppName() - { - try { - $privateKey = PrivateKey::ownedByCurrentTeam()->find($this->github_app->private_key_id); - - if (! $privateKey) { - $this->dispatch('error', 'No private key found for this GitHub App.'); - - return; - } - - $jwt = $this->generateGithubJwt($privateKey->private_key, $this->github_app->app_id); - - $response = Http::withHeaders([ - 'Accept' => 'application/vnd.github+json', - 'X-GitHub-Api-Version' => '2022-11-28', - 'Authorization' => "Bearer {$jwt}", - ])->get("{$this->github_app->api_url}/app"); - - if ($response->successful()) { - $app_data = $response->json(); - $app_slug = $app_data['slug'] ?? null; - - if ($app_slug) { - $this->github_app->name = $app_slug; - $this->name = str($app_slug)->kebab(); - $privateKey->name = "github-app-{$app_slug}"; - $privateKey->save(); - $this->github_app->save(); - $this->dispatch('success', 'GitHub App name and SSH key name synchronized successfully.'); - } else { - $this->dispatch('info', 'Could not find App Name (slug) in GitHub response.'); - } - } else { - $error_message = $response->json()['message'] ?? 'Unknown error'; - $this->dispatch('error', "Failed to fetch GitHub App information: {$error_message}"); - } - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function submit() - { - try { - $this->github_app->makeVisible('client_secret')->makeVisible('webhook_secret'); - $this->validate([ - 'github_app.name' => 'required|string', - 'github_app.organization' => 'nullable|string', - 'github_app.api_url' => 'required|string', - 'github_app.html_url' => 'required|string', - 'github_app.custom_user' => 'required|string', - 'github_app.custom_port' => 'required|int', - 'github_app.app_id' => 'required|int', - 'github_app.installation_id' => 'required|int', - 'github_app.client_id' => 'required|string', - 'github_app.client_secret' => 'required|string', - 'github_app.webhook_secret' => 'required|string', - 'github_app.is_system_wide' => 'required|bool', - 'github_app.private_key_id' => 'required|int', - ]); - $this->github_app->save(); - $this->dispatch('success', 'Github App updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function createGithubAppManually() - { - $this->github_app->makeVisible('client_secret')->makeVisible('webhook_secret'); - $this->github_app->app_id = '1234567890'; - $this->github_app->installation_id = '1234567890'; - $this->github_app->save(); - $this->dispatch('success', 'Github App updated.'); - } - - public function instantSave() - { - try { - $this->github_app->makeVisible('client_secret')->makeVisible('webhook_secret'); - $this->github_app->save(); - $this->dispatch('success', 'Github App updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function delete() - { - try { - if ($this->github_app->applications->isNotEmpty()) { - $this->dispatch('error', 'This source is being used by an application. Please delete all applications first.'); - $this->github_app->makeVisible('client_secret')->makeVisible('webhook_secret'); - - return; - } - $this->github_app->delete(); - - return redirect()->route('source.all'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Source/Github/Create.php b/app/Livewire/Source/Github/Create.php deleted file mode 100644 index 136d3525e0..0000000000 --- a/app/Livewire/Source/Github/Create.php +++ /dev/null @@ -1,63 +0,0 @@ -name = substr(generate_random_name(), 0, 30); - } - - public function createGitHubApp() - { - try { - $this->validate([ - 'name' => 'required|string', - 'organization' => 'nullable|string', - 'api_url' => 'required|string', - 'html_url' => 'required|string', - 'custom_user' => 'required|string', - 'custom_port' => 'required|int', - 'is_system_wide' => 'required|bool', - ]); - $payload = [ - 'name' => $this->name, - 'organization' => $this->organization, - 'api_url' => $this->api_url, - 'html_url' => $this->html_url, - 'custom_user' => $this->custom_user, - 'custom_port' => $this->custom_port, - 'team_id' => currentTeam()->id, - ]; - if (isCloud()) { - $payload['is_system_wide'] = $this->is_system_wide; - } - $github_app = GithubApp::create($payload); - if (session('from')) { - session(['from' => session('from') + ['source_id' => $github_app->id]]); - } - - return redirect()->route('source.github.show', ['github_app_uuid' => $github_app->uuid]); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Source/Gitlab/Change.php b/app/Livewire/Source/Gitlab/Change.php deleted file mode 100644 index 34600bb7dc..0000000000 --- a/app/Livewire/Source/Gitlab/Change.php +++ /dev/null @@ -1,13 +0,0 @@ - 'required|min:3|max:255', - 'description' => 'nullable|min:3|max:255', - 'region' => 'required|max:255', - 'key' => 'required|max:255', - 'secret' => 'required|max:255', - 'bucket' => 'required|max:255', - 'endpoint' => 'required|url|max:255', - ]; - - protected $validationAttributes = [ - 'name' => 'Name', - 'description' => 'Description', - 'region' => 'Region', - 'key' => 'Key', - 'secret' => 'Secret', - 'bucket' => 'Bucket', - 'endpoint' => 'Endpoint', - ]; - - public function updatedEndpoint($value) - { - try { - if (empty($value)) { - return; - } - if (str($value)->contains('digitaloceanspaces.com')) { - $uri = Uri::of($value); - $host = $uri->host(); - - if (preg_match('/^(.+)\.([^.]+\.digitaloceanspaces\.com)$/', $host, $matches)) { - $host = $matches[2]; - $value = "https://{$host}"; - } - } - } finally { - if (! str($value)->startsWith('https://') && ! str($value)->startsWith('http://')) { - $value = 'https://'.$value; - } - $this->endpoint = $value; - } - } - - public function submit() - { - try { - $this->validate(); - $this->storage = new S3Storage; - $this->storage->name = $this->name; - $this->storage->description = $this->description ?? null; - $this->storage->region = $this->region; - $this->storage->key = $this->key; - $this->storage->secret = $this->secret; - $this->storage->bucket = $this->bucket; - if (empty($this->endpoint)) { - $this->storage->endpoint = "https://s3.{$this->region}.amazonaws.com"; - } else { - $this->storage->endpoint = $this->endpoint; - } - $this->storage->team_id = currentTeam()->id; - $this->storage->testConnection(); - $this->storage->save(); - - return redirect()->route('storage.show', $this->storage->uuid); - } catch (\Throwable $e) { - $this->dispatch('error', 'Failed to create storage.', $e->getMessage()); - // return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Storage/Form.php b/app/Livewire/Storage/Form.php deleted file mode 100644 index 8ca0020c7b..0000000000 --- a/app/Livewire/Storage/Form.php +++ /dev/null @@ -1,65 +0,0 @@ - 'nullable|boolean', - 'storage.name' => 'nullable|min:3|max:255', - 'storage.description' => 'nullable|min:3|max:255', - 'storage.region' => 'required|max:255', - 'storage.key' => 'required|max:255', - 'storage.secret' => 'required|max:255', - 'storage.bucket' => 'required|max:255', - 'storage.endpoint' => 'required|url|max:255', - ]; - - protected $validationAttributes = [ - 'storage.is_usable' => 'Is Usable', - 'storage.name' => 'Name', - 'storage.description' => 'Description', - 'storage.region' => 'Region', - 'storage.key' => 'Key', - 'storage.secret' => 'Secret', - 'storage.bucket' => 'Bucket', - 'storage.endpoint' => 'Endpoint', - ]; - - public function test_s3_connection() - { - try { - $this->storage->testConnection(shouldSave: true); - - return $this->dispatch('success', 'Connection is working.', 'Tested with "ListObjectsV2" action.'); - } catch (\Throwable $e) { - $this->dispatch('error', 'Failed to create storage.', $e->getMessage()); - } - } - - public function delete() - { - try { - $this->storage->delete(); - - return redirect()->route('storage.index'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function submit() - { - $this->validate(); - try { - $this->test_s3_connection(); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Storage/Index.php b/app/Livewire/Storage/Index.php deleted file mode 100644 index 71ad89f702..0000000000 --- a/app/Livewire/Storage/Index.php +++ /dev/null @@ -1,21 +0,0 @@ -s3 = S3Storage::ownedByCurrentTeam()->get(); - } - - public function render() - { - return view('livewire.storage.index'); - } -} diff --git a/app/Livewire/Storage/Show.php b/app/Livewire/Storage/Show.php deleted file mode 100644 index bdea9a3b04..0000000000 --- a/app/Livewire/Storage/Show.php +++ /dev/null @@ -1,24 +0,0 @@ -storage = S3Storage::ownedByCurrentTeam()->whereUuid(request()->storage_uuid)->first(); - if (! $this->storage) { - abort(404); - } - } - - public function render() - { - return view('livewire.storage.show'); - } -} diff --git a/app/Livewire/Subscription/Actions.php b/app/Livewire/Subscription/Actions.php deleted file mode 100644 index 1388d32441..0000000000 --- a/app/Livewire/Subscription/Actions.php +++ /dev/null @@ -1,22 +0,0 @@ -server_limits = Team::serverLimit(); - } - - public function stripeCustomerPortal() - { - $session = getStripeCustomerPortalSession(currentTeam()); - redirect($session->url); - } -} diff --git a/app/Livewire/Subscription/Index.php b/app/Livewire/Subscription/Index.php deleted file mode 100644 index df450cf7ef..0000000000 --- a/app/Livewire/Subscription/Index.php +++ /dev/null @@ -1,44 +0,0 @@ -user()?->isMember()) { - return redirect()->route('dashboard'); - } - if (data_get(currentTeam(), 'subscription') && isSubscriptionActive()) { - return redirect()->route('subscription.show'); - } - $this->settings = instanceSettings(); - $this->alreadySubscribed = currentTeam()->subscription()->exists(); - } - - public function stripeCustomerPortal() - { - $session = getStripeCustomerPortalSession(currentTeam()); - if (is_null($session)) { - return; - } - - return redirect($session->url); - } - - public function render() - { - return view('livewire.subscription.index'); - } -} diff --git a/app/Livewire/Subscription/PricingPlans.php b/app/Livewire/Subscription/PricingPlans.php deleted file mode 100644 index 6b2d3fb364..0000000000 --- a/app/Livewire/Subscription/PricingPlans.php +++ /dev/null @@ -1,70 +0,0 @@ - config('subscription.stripe_price_id_dynamic_monthly'), - 'dynamic-yearly' => config('subscription.stripe_price_id_dynamic_yearly'), - default => config('subscription.stripe_price_id_dynamic_monthly'), - }; - - if (! $priceId) { - $this->dispatch('error', 'Price ID not found! Please contact the administrator.'); - - return; - } - $payload = [ - 'allow_promotion_codes' => true, - 'billing_address_collection' => 'required', - 'client_reference_id' => Auth::id().':'.currentTeam()->id, - 'line_items' => [[ - 'price' => $priceId, - 'adjustable_quantity' => [ - 'enabled' => true, - 'minimum' => 2, - ], - 'quantity' => 2, - ]], - 'tax_id_collection' => [ - 'enabled' => true, - ], - 'automatic_tax' => [ - 'enabled' => true, - ], - 'subscription_data' => [ - 'metadata' => [ - 'user_id' => Auth::id(), - 'team_id' => currentTeam()->id, - ], - ], - 'payment_method_collection' => 'if_required', - 'mode' => 'subscription', - 'success_url' => route('dashboard', ['success' => true]), - 'cancel_url' => route('subscription.index', ['cancelled' => true]), - ]; - - $customer = currentTeam()->subscription?->stripe_customer_id ?? null; - if ($customer) { - $payload['customer'] = $customer; - $payload['customer_update'] = [ - 'name' => 'auto', - ]; - } else { - $payload['customer_email'] = Auth::user()->email; - } - $session = Session::create($payload); - - return redirect($session->url, 303); - } -} diff --git a/app/Livewire/Subscription/Show.php b/app/Livewire/Subscription/Show.php deleted file mode 100644 index 96258c64e0..0000000000 --- a/app/Livewire/Subscription/Show.php +++ /dev/null @@ -1,26 +0,0 @@ -route('dashboard'); - } - if (auth()->user()?->isMember()) { - return redirect()->route('dashboard'); - } - if (! data_get(currentTeam(), 'subscription')) { - return redirect()->route('subscription.index'); - } - } - - public function render() - { - return view('livewire.subscription.show'); - } -} diff --git a/app/Livewire/SwitchTeam.php b/app/Livewire/SwitchTeam.php deleted file mode 100644 index 145c285ab5..0000000000 --- a/app/Livewire/SwitchTeam.php +++ /dev/null @@ -1,35 +0,0 @@ -selectedTeamId = auth()->user()->currentTeam()->id; - } - - public function updatedSelectedTeamId() - { - $this->switch_to($this->selectedTeamId); - } - - public function switch_to($team_id) - { - if (! auth()->user()->teams->contains($team_id)) { - return; - } - $team_to_switch_to = Team::find($team_id); - if (! $team_to_switch_to) { - return; - } - refreshSession($team_to_switch_to); - - return redirect('dashboard'); - } -} diff --git a/app/Livewire/Tags/Deployments.php b/app/Livewire/Tags/Deployments.php deleted file mode 100644 index e4afa5b606..0000000000 --- a/app/Livewire/Tags/Deployments.php +++ /dev/null @@ -1,37 +0,0 @@ -deploymentsPerTagPerServer = ApplicationDeploymentQueue::whereIn('status', ['in_progress', 'queued'])->whereIn('application_id', $this->resourceIds)->get([ - 'id', - 'application_id', - 'application_name', - 'deployment_url', - 'pull_request_id', - 'server_name', - 'server_id', - 'status', - ])->sortBy('id')->groupBy('server_name')->toArray(); - $this->dispatch('deployments', $this->deploymentsPerTagPerServer); - } catch (\Exception $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Tags/Show.php b/app/Livewire/Tags/Show.php deleted file mode 100644 index fc5b133749..0000000000 --- a/app/Livewire/Tags/Show.php +++ /dev/null @@ -1,95 +0,0 @@ -tags = Tag::ownedByCurrentTeam()->get()->unique('name')->sortBy('name'); - if (str($this->tagName)->isNotEmpty()) { - $tag = $this->tags->where('name', $this->tagName)->first(); - $this->webhook = generateTagDeployWebhook($tag->name); - $this->applications = $tag->applications()->get(); - $this->services = $tag->services()->get(); - $this->tag = $tag; - $this->getDeployments(); - } - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function getDeployments() - { - try { - $resource_ids = $this->applications->pluck('id'); - $this->deploymentsPerTagPerServer = ApplicationDeploymentQueue::whereIn('status', ['in_progress', 'queued'])->whereIn('application_id', $resource_ids)->get([ - 'id', - 'application_id', - 'application_name', - 'deployment_url', - 'pull_request_id', - 'server_name', - 'server_id', - 'status', - ])->sortBy('id')->groupBy('server_name')->toArray(); - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function redeployAll() - { - try { - $message = collect([]); - $this->applications->each(function ($resource) use ($message) { - $deploy = new DeployController; - $message->push($deploy->deploy_resource($resource)); - }); - $this->services->each(function ($resource) use ($message) { - $deploy = new DeployController; - $message->push($deploy->deploy_resource($resource)); - }); - $this->dispatch('success', 'Mass deployment started.'); - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.tags.show'); - } -} diff --git a/app/Livewire/Team/AdminView.php b/app/Livewire/Team/AdminView.php deleted file mode 100644 index cfb47d9d83..0000000000 --- a/app/Livewire/Team/AdminView.php +++ /dev/null @@ -1,139 +0,0 @@ -route('dashboard'); - } - $this->getUsers(); - } - - public function submitSearch() - { - if ($this->search !== '') { - $this->users = User::where(function ($query) { - $query->where('name', 'like', "%{$this->search}%") - ->orWhere('email', 'like', "%{$this->search}%"); - })->get()->filter(function ($user) { - return $user->id !== auth()->id(); - }); - } else { - $this->getUsers(); - } - } - - public function getUsers() - { - $users = User::where('id', '!=', auth()->id())->get(); - if ($users->count() > $this->number_of_users_to_show) { - $this->lots_of_users = true; - $this->users = $users->take($this->number_of_users_to_show); - } else { - $this->lots_of_users = false; - $this->users = $users; - } - } - - private function finalizeDeletion(User $user, Team $team) - { - $servers = $team->servers; - foreach ($servers as $server) { - $resources = $server->definedResources(); - foreach ($resources as $resource) { - $resource->forceDelete(); - } - $server->forceDelete(); - } - - $projects = $team->projects; - foreach ($projects as $project) { - $project->forceDelete(); - } - $team->members()->detach($user->id); - $team->delete(); - } - - public function delete($id, $password) - { - if (! isInstanceAdmin()) { - return redirect()->route('dashboard'); - } - if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) { - if (! Hash::check($password, Auth::user()->password)) { - $this->addError('password', 'The provided password is incorrect.'); - - return; - } - } - if (! auth()->user()->isInstanceAdmin()) { - return $this->dispatch('error', 'You are not authorized to delete users'); - } - $user = User::find($id); - $teams = $user->teams; - foreach ($teams as $team) { - $user_alone_in_team = $team->members->count() === 1; - if ($team->id === 0) { - if ($user_alone_in_team) { - return $this->dispatch('error', 'User is alone in the root team, cannot delete'); - } - } - if ($user_alone_in_team) { - $this->finalizeDeletion($user, $team); - - continue; - } - if ($user->isOwner()) { - $found_other_owner_or_admin = $team->members->filter(function ($member) { - return $member->pivot->role === 'owner' || $member->pivot->role === 'admin'; - })->where('id', '!=', $user->id)->first(); - - if ($found_other_owner_or_admin) { - $team->members()->detach($user->id); - - continue; - } else { - $found_other_member_who_is_not_owner = $team->members->filter(function ($member) { - return $member->pivot->role === 'member'; - })->first(); - if ($found_other_member_who_is_not_owner) { - $found_other_member_who_is_not_owner->pivot->role = 'owner'; - $found_other_member_who_is_not_owner->pivot->save(); - $team->members()->detach($user->id); - } else { - $this->finalizeDeletion($user, $team); - } - - continue; - } - } else { - $team->members()->detach($user->id); - } - } - $user->delete(); - $this->getUsers(); - } - - public function render() - { - return view('livewire.team.admin-view'); - } -} diff --git a/app/Livewire/Team/Create.php b/app/Livewire/Team/Create.php deleted file mode 100644 index f805d61222..0000000000 --- a/app/Livewire/Team/Create.php +++ /dev/null @@ -1,34 +0,0 @@ -validate(); - $team = Team::create([ - 'name' => $this->name, - 'description' => $this->description, - 'personal_team' => false, - ]); - auth()->user()->teams()->attach($team, ['role' => 'admin']); - refreshSession(); - - return redirect()->route('team.index'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/Team/Index.php b/app/Livewire/Team/Index.php deleted file mode 100644 index 0972e7364f..0000000000 --- a/app/Livewire/Team/Index.php +++ /dev/null @@ -1,73 +0,0 @@ - 'required|min:3|max:255', - 'team.description' => 'nullable|min:3|max:255', - ]; - - protected $validationAttributes = [ - 'team.name' => 'name', - 'team.description' => 'description', - ]; - - public function mount() - { - $this->team = currentTeam(); - - if (auth()->user()->isAdminFromSession()) { - $this->invitations = TeamInvitation::whereTeamId(currentTeam()->id)->get(); - } - } - - public function render() - { - return view('livewire.team.index'); - } - - public function submit() - { - $this->validate(); - try { - $this->team->save(); - refreshSession(); - $this->dispatch('success', 'Team updated.'); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function delete() - { - $currentTeam = currentTeam(); - $currentTeam->delete(); - - $currentTeam->members->each(function ($user) use ($currentTeam) { - if ($user->id === Auth::id()) { - return; - } - $user->teams()->detach($currentTeam); - $session = DB::table('sessions')->where('user_id', $user->id)->first(); - if ($session) { - DB::table('sessions')->where('id', $session->id)->delete(); - } - }); - - refreshSession(); - - return redirect()->route('team.index'); - } -} diff --git a/app/Livewire/Team/Invitations.php b/app/Livewire/Team/Invitations.php deleted file mode 100644 index 93432efc86..0000000000 --- a/app/Livewire/Team/Invitations.php +++ /dev/null @@ -1,30 +0,0 @@ -findOrFail($invitation_id); - $initiation_found->delete(); - $this->refreshInvitations(); - $this->dispatch('success', 'Invitation revoked.'); - } catch (\Exception) { - return $this->dispatch('error', 'Invitation not found.'); - } - } - - public function refreshInvitations() - { - $this->invitations = TeamInvitation::ownedByCurrentTeam()->get(); - } -} diff --git a/app/Livewire/Team/InviteLink.php b/app/Livewire/Team/InviteLink.php deleted file mode 100644 index 25f8a1ff51..0000000000 --- a/app/Livewire/Team/InviteLink.php +++ /dev/null @@ -1,109 +0,0 @@ - 'required|email', - 'role' => 'required|string', - ]; - - public function mount() - { - $this->email = isDev() ? 'test3@example.com' : ''; - } - - public function viaEmail() - { - $this->generate_invite_link(sendEmail: true); - } - - public function viaLink() - { - $this->generate_invite_link(sendEmail: false); - } - - private function generate_invite_link(bool $sendEmail = false) - { - try { - $this->validate(); - if (auth()->user()->role() === 'admin' && $this->role === 'owner') { - throw new \Exception('Admins cannot invite owners.'); - } - $member_emails = currentTeam()->members()->get()->pluck('email'); - if ($member_emails->contains($this->email)) { - return handleError(livewire: $this, customErrorMessage: "$this->email is already a member of ".currentTeam()->name.'.'); - } - $uuid = new Cuid2(32); - $link = url('/').config('constants.invitation.link.base_url').$uuid; - $user = User::whereEmail($this->email)->first(); - - if (is_null($user)) { - $password = Str::password(); - $user = User::create([ - 'name' => str($this->email)->before('@'), - 'email' => $this->email, - 'password' => Hash::make($password), - 'force_password_reset' => true, - ]); - $token = Crypt::encryptString("{$user->email}@@@$password"); - $link = route('auth.link', ['token' => $token]); - } - $invitation = TeamInvitation::whereEmail($this->email)->first(); - if (! is_null($invitation)) { - $invitationValid = $invitation->isValid(); - if ($invitationValid) { - return handleError(livewire: $this, customErrorMessage: "Pending invitation already exists for $this->email."); - } else { - $invitation->delete(); - } - } - - $invitation = TeamInvitation::firstOrCreate([ - 'team_id' => currentTeam()->id, - 'uuid' => $uuid, - 'email' => $this->email, - 'role' => $this->role, - 'link' => $link, - 'via' => $sendEmail ? 'email' : 'link', - ]); - if ($sendEmail) { - $mail = new MailMessage; - $mail->view('emails.invitation-link', [ - 'team' => currentTeam()->name, - 'invitation_link' => $link, - ]); - $mail->subject('You have been invited to '.currentTeam()->name.' on '.config('app.name').'.'); - send_user_an_email($mail, $this->email); - $this->dispatch('success', 'Invitation sent via email.'); - $this->dispatch('refreshInvitations'); - - return; - } else { - $this->dispatch('success', 'Invitation link generated.'); - $this->dispatch('refreshInvitations'); - } - } catch (\Throwable $e) { - $error_message = $e->getMessage(); - if ($e->getCode() === '23505') { - $error_message = 'Invitation already sent.'; - } - - return handleError(error: $e, livewire: $this, customErrorMessage: $error_message); - } - } -} diff --git a/app/Livewire/Team/Member.php b/app/Livewire/Team/Member.php deleted file mode 100644 index 890d640a07..0000000000 --- a/app/Livewire/Team/Member.php +++ /dev/null @@ -1,78 +0,0 @@ -user()->role())->lt(Role::ADMIN) - || Role::from($this->getMemberRole())->gt(auth()->user()->role())) { - throw new \Exception('You are not authorized to perform this action.'); - } - $this->member->teams()->updateExistingPivot(currentTeam()->id, ['role' => Role::ADMIN->value]); - $this->dispatch('reloadWindow'); - } catch (\Exception $e) { - $this->dispatch('error', $e->getMessage()); - } - } - - public function makeOwner() - { - try { - if (Role::from(auth()->user()->role())->lt(Role::OWNER) - || Role::from($this->getMemberRole())->gt(auth()->user()->role())) { - throw new \Exception('You are not authorized to perform this action.'); - } - $this->member->teams()->updateExistingPivot(currentTeam()->id, ['role' => Role::OWNER->value]); - $this->dispatch('reloadWindow'); - } catch (\Exception $e) { - $this->dispatch('error', $e->getMessage()); - } - } - - public function makeReadonly() - { - try { - if (Role::from(auth()->user()->role())->lt(Role::ADMIN) - || Role::from($this->getMemberRole())->gt(auth()->user()->role())) { - throw new \Exception('You are not authorized to perform this action.'); - } - $this->member->teams()->updateExistingPivot(currentTeam()->id, ['role' => Role::MEMBER->value]); - $this->dispatch('reloadWindow'); - } catch (\Exception $e) { - $this->dispatch('error', $e->getMessage()); - } - } - - public function remove() - { - try { - if (Role::from(auth()->user()->role())->lt(Role::ADMIN) - || Role::from($this->getMemberRole())->gt(auth()->user()->role())) { - throw new \Exception('You are not authorized to perform this action.'); - } - $this->member->teams()->detach(currentTeam()); - Cache::forget("team:{$this->member->id}"); - Cache::remember('team:'.$this->member->id, 3600, function () { - return $this->member->teams()->first(); - }); - $this->dispatch('reloadWindow'); - } catch (\Exception $e) { - $this->dispatch('error', $e->getMessage()); - } - } - - private function getMemberRole() - { - return $this->member->teams()->where('teams.id', currentTeam()->id)->first()?->pivot?->role; - } -} diff --git a/app/Livewire/Team/Member/Index.php b/app/Livewire/Team/Member/Index.php deleted file mode 100644 index 00b745fe43..0000000000 --- a/app/Livewire/Team/Member/Index.php +++ /dev/null @@ -1,23 +0,0 @@ -user()->isAdminFromSession()) { - $this->invitations = TeamInvitation::whereTeamId(currentTeam()->id)->get(); - } - } - - public function render() - { - return view('livewire.team.member.index'); - } -} diff --git a/app/Livewire/Team/Storage/Show.php b/app/Livewire/Team/Storage/Show.php deleted file mode 100644 index d3051afd42..0000000000 --- a/app/Livewire/Team/Storage/Show.php +++ /dev/null @@ -1,24 +0,0 @@ -storage = S3Storage::ownedByCurrentTeam()->whereUuid(request()->storage_uuid)->first(); - if (! $this->storage) { - abort(404); - } - } - - public function render() - { - return view('livewire.storage.show'); - } -} diff --git a/app/Livewire/Terminal/Index.php b/app/Livewire/Terminal/Index.php deleted file mode 100644 index a24a237c58..0000000000 --- a/app/Livewire/Terminal/Index.php +++ /dev/null @@ -1,88 +0,0 @@ -user()->isAdmin()) { - abort(403); - } - $this->servers = Server::isReachable()->get(); - } - - public function loadContainers() - { - try { - $this->containers = $this->getAllActiveContainers(); - } catch (\Exception $e) { - return handleError($e, $this); - } finally { - $this->isLoadingContainers = false; - } - } - - private function getAllActiveContainers() - { - return collect($this->servers)->flatMap(function ($server) { - if (! $server->isFunctional()) { - return []; - } - - return $server->loadAllContainers()->map(function ($container) use ($server) { - $state = data_get_str($container, 'State')->lower(); - if ($state->contains('running')) { - return [ - 'name' => data_get($container, 'Names'), - 'connection_name' => data_get($container, 'Names'), - 'uuid' => data_get($container, 'Names'), - 'status' => data_get_str($container, 'State')->lower(), - 'server' => $server, - 'server_uuid' => $server->uuid, - ]; - } - - return null; - })->filter(); - }); - } - - public function updatedSelectedUuid() - { - $this->connectToContainer(); - } - - #[On('connectToContainer')] - public function connectToContainer() - { - if ($this->selected_uuid === 'default') { - $this->dispatch('error', 'Please select a server or a container.'); - - return; - } - $container = collect($this->containers)->firstWhere('uuid', $this->selected_uuid); - $this->dispatch('send-terminal-command', - isset($container), - $container['connection_name'] ?? $this->selected_uuid, - $container['server_uuid'] ?? $this->selected_uuid - ); - } - - public function render() - { - return view('livewire.terminal.index'); - } -} diff --git a/app/Livewire/Upgrade.php b/app/Livewire/Upgrade.php deleted file mode 100644 index e50085c64e..0000000000 --- a/app/Livewire/Upgrade.php +++ /dev/null @@ -1,46 +0,0 @@ - 'checkUpdate']; - - public function checkUpdate() - { - try { - $this->latestVersion = get_latest_version_of_coolify(); - $this->isUpgradeAvailable = data_get(InstanceSettings::get(), 'new_version_available', false); - if (isDev()) { - $this->isUpgradeAvailable = true; - } - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - - public function upgrade() - { - try { - if ($this->updateInProgress) { - return; - } - $this->updateInProgress = true; - UpdateCoolify::run(manual_update: true); - } catch (\Throwable $e) { - return handleError($e, $this); - } - } -} diff --git a/app/Livewire/VerifyEmail.php b/app/Livewire/VerifyEmail.php deleted file mode 100644 index fab3265b65..0000000000 --- a/app/Livewire/VerifyEmail.php +++ /dev/null @@ -1,27 +0,0 @@ -rateLimit(1, 300); - auth()->user()->sendVerificationEmail(); - $this->dispatch('success', 'Email verification link sent!'); - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.verify-email'); - } -} diff --git a/app/Models/Application.php b/app/Models/Application.php deleted file mode 100644 index 3913ce37a3..0000000000 --- a/app/Models/Application.php +++ /dev/null @@ -1,1700 +0,0 @@ - ['type' => 'integer', 'description' => 'The application identifier in the database.'], - 'description' => ['type' => 'string', 'nullable' => true, 'description' => 'The application description.'], - 'repository_project_id' => ['type' => 'integer', 'nullable' => true, 'description' => 'The repository project identifier.'], - 'uuid' => ['type' => 'string', 'description' => 'The application UUID.'], - 'name' => ['type' => 'string', 'description' => 'The application name.'], - 'fqdn' => ['type' => 'string', 'nullable' => true, 'description' => 'The application domains.'], - 'config_hash' => ['type' => 'string', 'description' => 'Configuration hash.'], - 'git_repository' => ['type' => 'string', 'description' => 'Git repository URL.'], - 'git_branch' => ['type' => 'string', 'description' => 'Git branch.'], - 'git_commit_sha' => ['type' => 'string', 'description' => 'Git commit SHA.'], - 'git_full_url' => ['type' => 'string', 'nullable' => true, 'description' => 'Git full URL.'], - 'docker_registry_image_name' => ['type' => 'string', 'nullable' => true, 'description' => 'Docker registry image name.'], - 'docker_registry_image_tag' => ['type' => 'string', 'nullable' => true, 'description' => 'Docker registry image tag.'], - 'build_pack' => ['type' => 'string', 'description' => 'Build pack.', 'enum' => ['nixpacks', 'static', 'dockerfile', 'dockercompose']], - 'static_image' => ['type' => 'string', 'description' => 'Static image used when static site is deployed.'], - 'install_command' => ['type' => 'string', 'description' => 'Install command.'], - 'build_command' => ['type' => 'string', 'description' => 'Build command.'], - 'start_command' => ['type' => 'string', 'description' => 'Start command.'], - 'ports_exposes' => ['type' => 'string', 'description' => 'Ports exposes.'], - 'ports_mappings' => ['type' => 'string', 'nullable' => true, 'description' => 'Ports mappings.'], - 'base_directory' => ['type' => 'string', 'description' => 'Base directory for all commands.'], - 'publish_directory' => ['type' => 'string', 'description' => 'Publish directory.'], - 'health_check_enabled' => ['type' => 'boolean', 'description' => 'Health check enabled.'], - 'health_check_path' => ['type' => 'string', 'description' => 'Health check path.'], - 'health_check_port' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check port.'], - 'health_check_host' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check host.'], - 'health_check_method' => ['type' => 'string', 'description' => 'Health check method.'], - 'health_check_return_code' => ['type' => 'integer', 'description' => 'Health check return code.'], - 'health_check_scheme' => ['type' => 'string', 'description' => 'Health check scheme.'], - 'health_check_response_text' => ['type' => 'string', 'nullable' => true, 'description' => 'Health check response text.'], - 'health_check_interval' => ['type' => 'integer', 'description' => 'Health check interval in seconds.'], - 'health_check_timeout' => ['type' => 'integer', 'description' => 'Health check timeout in seconds.'], - 'health_check_retries' => ['type' => 'integer', 'description' => 'Health check retries count.'], - 'health_check_start_period' => ['type' => 'integer', 'description' => 'Health check start period in seconds.'], - 'limits_memory' => ['type' => 'string', 'description' => 'Memory limit.'], - 'limits_memory_swap' => ['type' => 'string', 'description' => 'Memory swap limit.'], - 'limits_memory_swappiness' => ['type' => 'integer', 'description' => 'Memory swappiness.'], - 'limits_memory_reservation' => ['type' => 'string', 'description' => 'Memory reservation.'], - 'limits_cpus' => ['type' => 'string', 'description' => 'CPU limit.'], - 'limits_cpuset' => ['type' => 'string', 'nullable' => true, 'description' => 'CPU set.'], - 'limits_cpu_shares' => ['type' => 'integer', 'description' => 'CPU shares.'], - 'status' => ['type' => 'string', 'description' => 'Application status.'], - 'preview_url_template' => ['type' => 'string', 'description' => 'Preview URL template.'], - 'destination_type' => ['type' => 'string', 'description' => 'Destination type.'], - 'destination_id' => ['type' => 'integer', 'description' => 'Destination identifier.'], - 'source_id' => ['type' => 'integer', 'nullable' => true, 'description' => 'Source identifier.'], - 'private_key_id' => ['type' => 'integer', 'nullable' => true, 'description' => 'Private key identifier.'], - 'environment_id' => ['type' => 'integer', 'description' => 'Environment identifier.'], - 'dockerfile' => ['type' => 'string', 'nullable' => true, 'description' => 'Dockerfile content. Used for dockerfile build pack.'], - 'dockerfile_location' => ['type' => 'string', 'description' => 'Dockerfile location.'], - 'custom_labels' => ['type' => 'string', 'nullable' => true, 'description' => 'Custom labels.'], - 'dockerfile_target_build' => ['type' => 'string', 'nullable' => true, 'description' => 'Dockerfile target build.'], - 'manual_webhook_secret_github' => ['type' => 'string', 'nullable' => true, 'description' => 'Manual webhook secret for GitHub.'], - 'manual_webhook_secret_gitlab' => ['type' => 'string', 'nullable' => true, 'description' => 'Manual webhook secret for GitLab.'], - 'manual_webhook_secret_bitbucket' => ['type' => 'string', 'nullable' => true, 'description' => 'Manual webhook secret for Bitbucket.'], - 'manual_webhook_secret_gitea' => ['type' => 'string', 'nullable' => true, 'description' => 'Manual webhook secret for Gitea.'], - 'docker_compose_location' => ['type' => 'string', 'description' => 'Docker compose location.'], - 'docker_compose' => ['type' => 'string', 'nullable' => true, 'description' => 'Docker compose content. Used for docker compose build pack.'], - 'docker_compose_raw' => ['type' => 'string', 'nullable' => true, 'description' => 'Docker compose raw content.'], - 'docker_compose_domains' => ['type' => 'string', 'nullable' => true, 'description' => 'Docker compose domains.'], - 'docker_compose_custom_start_command' => ['type' => 'string', 'nullable' => true, 'description' => 'Docker compose custom start command.'], - 'docker_compose_custom_build_command' => ['type' => 'string', 'nullable' => true, 'description' => 'Docker compose custom build command.'], - 'swarm_replicas' => ['type' => 'integer', 'nullable' => true, 'description' => 'Swarm replicas. Only used for swarm deployments.'], - 'swarm_placement_constraints' => ['type' => 'string', 'nullable' => true, 'description' => 'Swarm placement constraints. Only used for swarm deployments.'], - 'custom_docker_run_options' => ['type' => 'string', 'nullable' => true, 'description' => 'Custom docker run options.'], - 'post_deployment_command' => ['type' => 'string', 'nullable' => true, 'description' => 'Post deployment command.'], - 'post_deployment_command_container' => ['type' => 'string', 'nullable' => true, 'description' => 'Post deployment command container.'], - 'pre_deployment_command' => ['type' => 'string', 'nullable' => true, 'description' => 'Pre deployment command.'], - 'pre_deployment_command_container' => ['type' => 'string', 'nullable' => true, 'description' => 'Pre deployment command container.'], - 'watch_paths' => ['type' => 'string', 'nullable' => true, 'description' => 'Watch paths.'], - 'custom_healthcheck_found' => ['type' => 'boolean', 'description' => 'Custom healthcheck found.'], - 'redirect' => ['type' => 'string', 'nullable' => true, 'description' => 'How to set redirect with Traefik / Caddy. www<->non-www.', 'enum' => ['www', 'non-www', 'both']], - 'created_at' => ['type' => 'string', 'format' => 'date-time', 'description' => 'The date and time when the application was created.'], - 'updated_at' => ['type' => 'string', 'format' => 'date-time', 'description' => 'The date and time when the application was last updated.'], - 'deleted_at' => ['type' => 'string', 'format' => 'date-time', 'nullable' => true, 'description' => 'The date and time when the application was deleted.'], - 'compose_parsing_version' => ['type' => 'string', 'description' => 'How Coolify parse the compose file.'], - 'custom_nginx_configuration' => ['type' => 'string', 'nullable' => true, 'description' => 'Custom Nginx configuration base64 encoded.'], - ] -)] - -class Application extends BaseModel -{ - use HasConfiguration, HasFactory, SoftDeletes; - - private static $parserVersion = '4'; - - protected $guarded = []; - - protected $appends = ['server_status']; - - protected static function booted() - { - static::addGlobalScope('withRelations', function ($builder) { - $builder->withCount([ - 'additional_servers', - 'additional_networks', - ]); - }); - static::saving(function ($application) { - $payload = []; - if ($application->isDirty('fqdn')) { - if ($application->fqdn === '') { - $application->fqdn = null; - } - $payload['fqdn'] = $application->fqdn; - } - if ($application->isDirty('install_command')) { - $payload['install_command'] = str($application->install_command)->trim(); - } - if ($application->isDirty('build_command')) { - $payload['build_command'] = str($application->build_command)->trim(); - } - if ($application->isDirty('start_command')) { - $payload['start_command'] = str($application->start_command)->trim(); - } - if ($application->isDirty('base_directory')) { - $payload['base_directory'] = str($application->base_directory)->trim(); - } - if ($application->isDirty('publish_directory')) { - $payload['publish_directory'] = str($application->publish_directory)->trim(); - } - if ($application->isDirty('status')) { - $payload['last_online_at'] = now(); - } - if ($application->isDirty('custom_nginx_configuration')) { - if ($application->custom_nginx_configuration === '') { - $payload['custom_nginx_configuration'] = null; - } - } - if (count($payload) > 0) { - $application->forceFill($payload); - } - }); - static::created(function ($application) { - ApplicationSetting::create([ - 'application_id' => $application->id, - ]); - $application->compose_parsing_version = self::$parserVersion; - $application->save(); - }); - static::forceDeleting(function ($application) { - $application->update(['fqdn' => null]); - $application->settings()->delete(); - $application->persistentStorages()->delete(); - $application->environment_variables()->delete(); - $application->environment_variables_preview()->delete(); - foreach ($application->scheduled_tasks as $task) { - $task->delete(); - } - $application->tags()->detach(); - $application->previews()->delete(); - foreach ($application->deployment_queue as $deployment) { - $deployment->delete(); - } - }); - } - - public static function ownedByCurrentTeamAPI(int $teamId) - { - return Application::whereRelation('environment.project.team', 'id', $teamId)->orderBy('name'); - } - - public static function ownedByCurrentTeam() - { - return Application::whereRelation('environment.project.team', 'id', currentTeam()->id)->orderBy('name'); - } - - public function getContainersToStop(bool $previewDeployments = false): array - { - $containers = $previewDeployments - ? getCurrentApplicationContainerStatus($this->destination->server, $this->id, includePullrequests: true) - : getCurrentApplicationContainerStatus($this->destination->server, $this->id, 0); - - return $containers->pluck('Names')->toArray(); - } - - public function stopContainers(array $containerNames, $server, int $timeout = 600) - { - $processes = []; - foreach ($containerNames as $containerName) { - $processes[$containerName] = $this->stopContainer($containerName, $server, $timeout); - } - - $startTime = time(); - while (count($processes) > 0) { - $finishedProcesses = array_filter($processes, function ($process) { - return ! $process->running(); - }); - foreach ($finishedProcesses as $containerName => $process) { - unset($processes[$containerName]); - $this->removeContainer($containerName, $server); - } - - if (time() - $startTime >= $timeout) { - $this->forceStopRemainingContainers(array_keys($processes), $server); - break; - } - - usleep(100000); - } - } - - public function stopContainer(string $containerName, $server, int $timeout): InvokedProcess - { - return Process::timeout($timeout)->start("docker stop --time=$timeout $containerName"); - } - - public function removeContainer(string $containerName, $server) - { - instant_remote_process(command: ["docker rm -f $containerName"], server: $server, throwError: false); - } - - public function forceStopRemainingContainers(array $containerNames, $server) - { - foreach ($containerNames as $containerName) { - instant_remote_process(command: ["docker kill $containerName"], server: $server, throwError: false); - $this->removeContainer($containerName, $server); - } - } - - public function delete_configurations() - { - $server = data_get($this, 'destination.server'); - $workdir = $this->workdir(); - if (str($workdir)->endsWith($this->uuid)) { - instant_remote_process(['rm -rf '.$this->workdir()], $server, false); - } - } - - public function delete_volumes(?Collection $persistentStorages) - { - if ($this->build_pack === 'dockercompose') { - $server = data_get($this, 'destination.server'); - instant_remote_process(["cd {$this->dirOnServer()} && docker compose down -v"], $server, false); - } else { - if ($persistentStorages->count() === 0) { - return; - } - $server = data_get($this, 'destination.server'); - foreach ($persistentStorages as $storage) { - instant_remote_process(["docker volume rm -f $storage->name"], $server, false); - } - } - } - - public function delete_connected_networks($uuid) - { - $server = data_get($this, 'destination.server'); - instant_remote_process(["docker network disconnect {$uuid} coolify-proxy"], $server, false); - instant_remote_process(["docker network rm {$uuid}"], $server, false); - } - - public function additional_servers() - { - return $this->belongsToMany(Server::class, 'additional_destinations') - ->withPivot('standalone_docker_id', 'status'); - } - - public function additional_networks() - { - return $this->belongsToMany(StandaloneDocker::class, 'additional_destinations') - ->withPivot('server_id', 'status'); - } - - public function is_public_repository(): bool - { - if (data_get($this, 'source.is_public')) { - return true; - } - - return false; - } - - public function is_github_based(): bool - { - if (data_get($this, 'source')) { - return true; - } - - return false; - } - - public function isForceHttpsEnabled() - { - return data_get($this, 'settings.is_force_https_enabled', false); - } - - public function isStripprefixEnabled() - { - return data_get($this, 'settings.is_stripprefix_enabled', true); - } - - public function isGzipEnabled() - { - return data_get($this, 'settings.is_gzip_enabled', true); - } - - public function link() - { - if (data_get($this, 'environment.project.uuid')) { - return route('project.application.configuration', [ - 'project_uuid' => data_get($this, 'environment.project.uuid'), - 'environment_uuid' => data_get($this, 'environment.uuid'), - 'application_uuid' => data_get($this, 'uuid'), - ]); - } - - return null; - } - - public function taskLink($task_uuid) - { - if (data_get($this, 'environment.project.uuid')) { - $route = route('project.application.scheduled-tasks', [ - 'project_uuid' => data_get($this, 'environment.project.uuid'), - 'environment_uuid' => data_get($this, 'environment.uuid'), - 'application_uuid' => data_get($this, 'uuid'), - 'task_uuid' => $task_uuid, - ]); - $settings = instanceSettings(); - if (data_get($settings, 'fqdn')) { - $url = Url::fromString($route); - $url = $url->withPort(null); - $fqdn = data_get($settings, 'fqdn'); - $fqdn = str_replace(['http://', 'https://'], '', $fqdn); - $url = $url->withHost($fqdn); - - return $url->__toString(); - } - - return $route; - } - - return null; - } - - public function settings() - { - return $this->hasOne(ApplicationSetting::class); - } - - public function persistentStorages() - { - return $this->morphMany(LocalPersistentVolume::class, 'resource'); - } - - public function fileStorages() - { - return $this->morphMany(LocalFileVolume::class, 'resource'); - } - - public function type() - { - return 'application'; - } - - public function publishDirectory(): Attribute - { - return Attribute::make( - set: fn ($value) => $value ? '/'.ltrim($value, '/') : null, - ); - } - - public function gitBranchLocation(): Attribute - { - return Attribute::make( - get: function () { - if (! is_null($this->source?->html_url) && ! is_null($this->git_repository) && ! is_null($this->git_branch)) { - if (str($this->git_repository)->contains('bitbucket')) { - return "{$this->source->html_url}/{$this->git_repository}/src/{$this->git_branch}"; - } - - return "{$this->source->html_url}/{$this->git_repository}/tree/{$this->git_branch}"; - } - // Convert the SSH URL to HTTPS URL - if (strpos($this->git_repository, 'git@') === 0) { - $git_repository = str_replace(['git@', ':', '.git'], ['', '/', ''], $this->git_repository); - - if (str($this->git_repository)->contains('bitbucket')) { - return "https://{$git_repository}/src/{$this->git_branch}"; - } - - return "https://{$git_repository}/tree/{$this->git_branch}"; - } - - return $this->git_repository; - } - ); - } - - public function gitWebhook(): Attribute - { - return Attribute::make( - get: function () { - if (! is_null($this->source?->html_url) && ! is_null($this->git_repository) && ! is_null($this->git_branch)) { - return "{$this->source->html_url}/{$this->git_repository}/settings/hooks"; - } - // Convert the SSH URL to HTTPS URL - if (strpos($this->git_repository, 'git@') === 0) { - $git_repository = str_replace(['git@', ':', '.git'], ['', '/', ''], $this->git_repository); - - return "https://{$git_repository}/settings/hooks"; - } - - return $this->git_repository; - } - ); - } - - public function gitCommits(): Attribute - { - return Attribute::make( - get: function () { - if (! is_null($this->source?->html_url) && ! is_null($this->git_repository) && ! is_null($this->git_branch)) { - return "{$this->source->html_url}/{$this->git_repository}/commits/{$this->git_branch}"; - } - // Convert the SSH URL to HTTPS URL - if (strpos($this->git_repository, 'git@') === 0) { - $git_repository = str_replace(['git@', ':', '.git'], ['', '/', ''], $this->git_repository); - - return "https://{$git_repository}/commits/{$this->git_branch}"; - } - - return $this->git_repository; - } - ); - } - - public function gitCommitLink($link): string - { - if (! is_null(data_get($this, 'source.html_url')) && ! is_null(data_get($this, 'git_repository')) && ! is_null(data_get($this, 'git_branch'))) { - if (str($this->source->html_url)->contains('bitbucket')) { - return "{$this->source->html_url}/{$this->git_repository}/commits/{$link}"; - } - - return "{$this->source->html_url}/{$this->git_repository}/commit/{$link}"; - } - if (str($this->git_repository)->contains('bitbucket')) { - $git_repository = str_replace('.git', '', $this->git_repository); - $url = Url::fromString($git_repository); - $url = $url->withUserInfo(''); - $url = $url->withPath($url->getPath().'/commits/'.$link); - - return $url->__toString(); - } - if (strpos($this->git_repository, 'git@') === 0) { - $git_repository = str_replace(['git@', ':', '.git'], ['', '/', ''], $this->git_repository); - if (data_get($this, 'source.html_url')) { - return "{$this->source->html_url}/{$git_repository}/commit/{$link}"; - } - - return "{$git_repository}/commit/{$link}"; - } - - return $this->git_repository; - } - - public function dockerfileLocation(): Attribute - { - return Attribute::make( - set: function ($value) { - if (is_null($value) || $value === '') { - return '/Dockerfile'; - } else { - if ($value !== '/') { - return Str::start(Str::replaceEnd('/', '', $value), '/'); - } - - return Str::start($value, '/'); - } - } - ); - } - - public function dockerComposeLocation(): Attribute - { - return Attribute::make( - set: function ($value) { - if (is_null($value) || $value === '') { - return '/docker-compose.yaml'; - } else { - if ($value !== '/') { - return Str::start(Str::replaceEnd('/', '', $value), '/'); - } - - return Str::start($value, '/'); - } - } - ); - } - - public function baseDirectory(): Attribute - { - return Attribute::make( - set: fn ($value) => '/'.ltrim($value, '/'), - ); - } - - public function portsMappings(): Attribute - { - return Attribute::make( - set: fn ($value) => $value === '' ? null : $value, - ); - } - - public function portsMappingsArray(): Attribute - { - return Attribute::make( - get: fn () => is_null($this->ports_mappings) - ? [] - : explode(',', $this->ports_mappings), - - ); - } - - public function isRunning() - { - return (bool) str($this->status)->startsWith('running'); - } - - public function isExited() - { - return (bool) str($this->status)->startsWith('exited'); - } - - public function realStatus() - { - return $this->getRawOriginal('status'); - } - - protected function serverStatus(): Attribute - { - return Attribute::make( - get: function () { - if (! $this->relationLoaded('additional_servers') || $this->additional_servers->count() === 0) { - return $this->destination?->server?->isFunctional() ?? false; - } - - $additional_servers_status = $this->additional_servers->pluck('pivot.status'); - $main_server_status = $this->destination?->server?->isFunctional() ?? false; - - foreach ($additional_servers_status as $status) { - $server_status = str($status)->before(':')->value(); - if ($server_status !== 'running') { - return false; - } - } - - return $main_server_status; - } - ); - } - - public function status(): Attribute - { - return Attribute::make( - set: function ($value) { - if ($this->additional_servers->count() === 0) { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - } else { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - } - }, - get: function ($value) { - if ($this->additional_servers->count() === 0) { - // running (healthy) - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - } else { - $complex_status = null; - $complex_health = null; - $complex_status = $main_server_status = str($value)->before(':')->value(); - $complex_health = $main_server_health = str($value)->after(':')->value() ?? 'unhealthy'; - $additional_servers_status = $this->additional_servers->pluck('pivot.status'); - foreach ($additional_servers_status as $status) { - $server_status = str($status)->before(':')->value(); - $server_health = str($status)->after(':')->value() ?? 'unhealthy'; - if ($main_server_status !== $server_status) { - $complex_status = 'degraded'; - } - if ($main_server_health !== $server_health) { - $complex_health = 'unhealthy'; - } - } - - return "$complex_status:$complex_health"; - } - }, - ); - } - - public function customNginxConfiguration(): Attribute - { - return Attribute::make( - set: fn ($value) => base64_encode($value), - get: fn ($value) => base64_decode($value), - ); - } - - public function portsExposesArray(): Attribute - { - return Attribute::make( - get: fn () => is_null($this->ports_exposes) - ? [] - : explode(',', $this->ports_exposes) - ); - } - - public function tags() - { - return $this->morphToMany(Tag::class, 'taggable'); - } - - public function project() - { - return data_get($this, 'environment.project'); - } - - public function team() - { - return data_get($this, 'environment.project.team'); - } - - public function serviceType() - { - $found = str(collect(SPECIFIC_SERVICES)->filter(function ($service) { - return str($this->image)->before(':')->value() === $service; - })->first()); - if ($found->isNotEmpty()) { - return $found; - } - - return null; - } - - public function main_port() - { - return $this->settings->is_static ? [80] : $this->ports_exposes_array; - } - - public function environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->where('is_preview', false) - ->orderBy('key', 'asc'); - } - - public function runtime_environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->where('is_preview', false) - ->where('key', 'not like', 'NIXPACKS_%'); - } - - public function build_environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->where('is_preview', false) - ->where('is_build_time', true) - ->where('key', 'not like', 'NIXPACKS_%'); - } - - public function nixpacks_environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->where('is_preview', false) - ->where('key', 'like', 'NIXPACKS_%'); - } - - public function environment_variables_preview() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->where('is_preview', true) - ->orderByRaw("LOWER(key) LIKE LOWER('SERVICE%') DESC, LOWER(key) ASC"); - } - - public function runtime_environment_variables_preview() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->where('is_preview', true) - ->where('key', 'not like', 'NIXPACKS_%'); - } - - public function build_environment_variables_preview() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->where('is_preview', true) - ->where('is_build_time', true) - ->where('key', 'not like', 'NIXPACKS_%'); - } - - public function nixpacks_environment_variables_preview() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->where('is_preview', true) - ->where('key', 'like', 'NIXPACKS_%'); - } - - public function scheduled_tasks(): HasMany - { - return $this->hasMany(ScheduledTask::class)->orderBy('name', 'asc'); - } - - public function private_key() - { - return $this->belongsTo(PrivateKey::class); - } - - public function environment() - { - return $this->belongsTo(Environment::class); - } - - public function previews() - { - return $this->hasMany(ApplicationPreview::class); - } - - public function deployment_queue() - { - return $this->hasMany(ApplicationDeploymentQueue::class); - } - - public function destination() - { - return $this->morphTo(); - } - - public function source() - { - return $this->morphTo(); - } - - public function isDeploymentInprogress() - { - $deployments = ApplicationDeploymentQueue::where('application_id', $this->id)->whereIn('status', [ApplicationDeploymentStatus::IN_PROGRESS, ApplicationDeploymentStatus::QUEUED])->count(); - if ($deployments > 0) { - return true; - } - - return false; - } - - public function get_last_successful_deployment() - { - return ApplicationDeploymentQueue::where('application_id', $this->id)->where('status', ApplicationDeploymentStatus::FINISHED)->where('pull_request_id', 0)->orderBy('created_at', 'desc')->first(); - } - - public function get_last_days_deployments() - { - return ApplicationDeploymentQueue::where('application_id', $this->id)->where('created_at', '>=', now()->subDays(7))->orderBy('created_at', 'desc')->get(); - } - - public function deployments(int $skip = 0, int $take = 10) - { - $deployments = ApplicationDeploymentQueue::where('application_id', $this->id)->orderBy('created_at', 'desc'); - $count = $deployments->count(); - $deployments = $deployments->skip($skip)->take($take)->get(); - - return [ - 'count' => $count, - 'deployments' => $deployments, - ]; - } - - public function get_deployment(string $deployment_uuid) - { - return Activity::where('subject_id', $this->id)->where('properties->type_uuid', '=', $deployment_uuid)->first(); - } - - public function isDeployable(): bool - { - if ($this->settings->is_auto_deploy_enabled) { - return true; - } - - return false; - } - - public function isPRDeployable(): bool - { - if ($this->settings->is_preview_deployments_enabled) { - return true; - } - - return false; - } - - public function deploymentType() - { - if (isDev() && data_get($this, 'private_key_id') === 0) { - return 'deploy_key'; - } - if (data_get($this, 'private_key_id')) { - return 'deploy_key'; - } elseif (data_get($this, 'source')) { - return 'source'; - } else { - return 'other'; - } - throw new \Exception('No deployment type found'); - } - - public function could_set_build_commands(): bool - { - if ($this->build_pack === 'nixpacks') { - return true; - } - - return false; - } - - public function git_based(): bool - { - if ($this->dockerfile) { - return false; - } - if ($this->build_pack === 'dockerimage') { - return false; - } - - return true; - } - - public function isHealthcheckDisabled(): bool - { - if (data_get($this, 'health_check_enabled') === false) { - return true; - } - - return false; - } - - public function workdir() - { - return application_configuration_dir()."/{$this->uuid}"; - } - - public function isLogDrainEnabled() - { - return data_get($this, 'settings.is_log_drain_enabled', false); - } - - public function isConfigurationChanged(bool $save = false) - { - $newConfigHash = base64_encode($this->fqdn.$this->git_repository.$this->git_branch.$this->git_commit_sha.$this->build_pack.$this->static_image.$this->install_command.$this->build_command.$this->start_command.$this->ports_exposes.$this->ports_mappings.$this->base_directory.$this->publish_directory.$this->dockerfile.$this->dockerfile_location.$this->custom_labels.$this->custom_docker_run_options.$this->dockerfile_target_build.$this->redirect.$this->custom_nginx_configuration); - if ($this->pull_request_id === 0 || $this->pull_request_id === null) { - $newConfigHash .= json_encode($this->environment_variables()->get('value')->sort()); - } else { - $newConfigHash .= json_encode($this->environment_variables_preview->get('value')->sort()); - } - $newConfigHash = md5($newConfigHash); - $oldConfigHash = data_get($this, 'config_hash'); - if ($oldConfigHash === null) { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - if ($oldConfigHash === $newConfigHash) { - return false; - } else { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - } - - public function customRepository() - { - return convertGitUrl($this->git_repository, $this->deploymentType(), $this->source); - } - - public function generateBaseDir(string $uuid) - { - return "/artifacts/{$uuid}"; - } - - public function dirOnServer() - { - return application_configuration_dir()."/{$this->uuid}"; - } - - public function setGitImportSettings(string $deployment_uuid, string $git_clone_command, bool $public = false) - { - $baseDir = $this->generateBaseDir($deployment_uuid); - - if ($this->git_commit_sha !== 'HEAD') { - $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null\" git -c advice.detachedHead=false checkout {$this->git_commit_sha} >/dev/null 2>&1"; - } - if ($this->settings->is_git_submodules_enabled) { - if ($public) { - $git_clone_command = "{$git_clone_command} && cd {$baseDir} && sed -i \"s#git@\(.*\):#https://\\1/#g\" {$baseDir}/.gitmodules || true"; - } - $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null\" git submodule update --init --recursive"; - } - if ($this->settings->is_git_lfs_enabled) { - $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null\" git lfs pull"; - } - - return $git_clone_command; - } - - public function getGitRemoteStatus(string $deployment_uuid) - { - try { - ['commands' => $lsRemoteCommand] = $this->generateGitLsRemoteCommands(deployment_uuid: $deployment_uuid, exec_in_docker: false); - instant_remote_process([$lsRemoteCommand], $this->destination->server, true); - - return [ - 'is_accessible' => true, - 'error' => null, - ]; - } catch (\RuntimeException $ex) { - return [ - 'is_accessible' => false, - 'error' => $ex->getMessage(), - ]; - } - } - - public function generateGitLsRemoteCommands(string $deployment_uuid, bool $exec_in_docker = true) - { - $branch = $this->git_branch; - ['repository' => $customRepository, 'port' => $customPort] = $this->customRepository(); - $commands = collect([]); - $base_command = 'git ls-remote'; - - if ($this->deploymentType() === 'source') { - $source_html_url = data_get($this, 'source.html_url'); - $url = parse_url(filter_var($source_html_url, FILTER_SANITIZE_URL)); - $source_html_url_host = $url['host']; - $source_html_url_scheme = $url['scheme']; - - if ($this->source->getMorphClass() == 'App\Models\GithubApp') { - if ($this->source->is_public) { - $fullRepoUrl = "{$this->source->html_url}/{$customRepository}"; - $base_command = "{$base_command} {$this->source->html_url}/{$customRepository}"; - } else { - $github_access_token = generateGithubInstallationToken($this->source); - - if ($exec_in_docker) { - $base_command = "{$base_command} $source_html_url_scheme://x-access-token:$github_access_token@$source_html_url_host/{$customRepository}.git"; - $fullRepoUrl = "$source_html_url_scheme://x-access-token:$github_access_token@$source_html_url_host/{$customRepository}.git"; - } else { - $base_command = "{$base_command} $source_html_url_scheme://x-access-token:$github_access_token@$source_html_url_host/{$customRepository}"; - $fullRepoUrl = "$source_html_url_scheme://x-access-token:$github_access_token@$source_html_url_host/{$customRepository}"; - } - } - - if ($exec_in_docker) { - $commands->push(executeInDocker($deployment_uuid, $base_command)); - } else { - $commands->push($base_command); - } - - return [ - 'commands' => $commands->implode(' && '), - 'branch' => $branch, - 'fullRepoUrl' => $fullRepoUrl, - ]; - } - } - - if ($this->deploymentType() === 'deploy_key') { - $fullRepoUrl = $customRepository; - $private_key = data_get($this, 'private_key.private_key'); - if (is_null($private_key)) { - throw new RuntimeException('Private key not found. Please add a private key to the application and try again.'); - } - $private_key = base64_encode($private_key); - $base_comamnd = "GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" {$base_command} {$customRepository}"; - - if ($exec_in_docker) { - $commands = collect([ - executeInDocker($deployment_uuid, 'mkdir -p /root/.ssh'), - executeInDocker($deployment_uuid, "echo '{$private_key}' | base64 -d | tee /root/.ssh/id_rsa > /dev/null"), - executeInDocker($deployment_uuid, 'chmod 600 /root/.ssh/id_rsa'), - ]); - } else { - $commands = collect([ - 'mkdir -p /root/.ssh', - "echo '{$private_key}' | base64 -d | tee /root/.ssh/id_rsa > /dev/null", - 'chmod 600 /root/.ssh/id_rsa', - ]); - } - - if ($exec_in_docker) { - $commands->push(executeInDocker($deployment_uuid, $base_comamnd)); - } else { - $commands->push($base_comamnd); - } - - return [ - 'commands' => $commands->implode(' && '), - 'branch' => $branch, - 'fullRepoUrl' => $fullRepoUrl, - ]; - } - - if ($this->deploymentType() === 'other') { - $fullRepoUrl = $customRepository; - $base_command = "{$base_command} {$customRepository}"; - $base_command = $this->setGitImportSettings($deployment_uuid, $base_command, public: true); - - if ($exec_in_docker) { - $commands->push(executeInDocker($deployment_uuid, $base_command)); - } else { - $commands->push($base_command); - } - - return [ - 'commands' => $commands->implode(' && '), - 'branch' => $branch, - 'fullRepoUrl' => $fullRepoUrl, - ]; - } - } - - public function generateGitImportCommands(string $deployment_uuid, int $pull_request_id = 0, ?string $git_type = null, bool $exec_in_docker = true, bool $only_checkout = false, ?string $custom_base_dir = null, ?string $commit = null) - { - $branch = $this->git_branch; - ['repository' => $customRepository, 'port' => $customPort] = $this->customRepository(); - $baseDir = $custom_base_dir ?? $this->generateBaseDir($deployment_uuid); - $commands = collect([]); - $git_clone_command = "git clone -b \"{$this->git_branch}\""; - if ($only_checkout) { - $git_clone_command = "git clone --no-checkout -b \"{$this->git_branch}\""; - } - if ($pull_request_id !== 0) { - $pr_branch_name = "pr-{$pull_request_id}-coolify"; - } - if ($this->deploymentType() === 'source') { - $source_html_url = data_get($this, 'source.html_url'); - $url = parse_url(filter_var($source_html_url, FILTER_SANITIZE_URL)); - $source_html_url_host = $url['host']; - $source_html_url_scheme = $url['scheme']; - - if ($this->source->getMorphClass() === \App\Models\GithubApp::class) { - if ($this->source->is_public) { - $fullRepoUrl = "{$this->source->html_url}/{$customRepository}"; - $git_clone_command = "{$git_clone_command} {$this->source->html_url}/{$customRepository} {$baseDir}"; - if (! $only_checkout) { - $git_clone_command = $this->setGitImportSettings($deployment_uuid, $git_clone_command, public: true); - } - if ($exec_in_docker) { - $commands->push(executeInDocker($deployment_uuid, $git_clone_command)); - } else { - $commands->push($git_clone_command); - } - } else { - $github_access_token = generateGithubInstallationToken($this->source); - if ($exec_in_docker) { - $git_clone_command = "{$git_clone_command} $source_html_url_scheme://x-access-token:$github_access_token@$source_html_url_host/{$customRepository}.git {$baseDir}"; - $fullRepoUrl = "$source_html_url_scheme://x-access-token:$github_access_token@$source_html_url_host/{$customRepository}.git"; - } else { - $git_clone_command = "{$git_clone_command} $source_html_url_scheme://x-access-token:$github_access_token@$source_html_url_host/{$customRepository} {$baseDir}"; - $fullRepoUrl = "$source_html_url_scheme://x-access-token:$github_access_token@$source_html_url_host/{$customRepository}"; - } - if (! $only_checkout) { - $git_clone_command = $this->setGitImportSettings($deployment_uuid, $git_clone_command, public: false); - } - if ($exec_in_docker) { - $commands->push(executeInDocker($deployment_uuid, $git_clone_command)); - } else { - $commands->push($git_clone_command); - } - } - if ($pull_request_id !== 0) { - $branch = "pull/{$pull_request_id}/head:$pr_branch_name"; - - $git_checkout_command = $this->buildGitCheckoutCommand($pr_branch_name); - if ($exec_in_docker) { - $commands->push(executeInDocker($deployment_uuid, "cd {$baseDir} && git fetch origin {$branch} && $git_checkout_command")); - } else { - $commands->push("cd {$baseDir} && git fetch origin {$branch} && $git_checkout_command"); - } - } - - return [ - 'commands' => $commands->implode(' && '), - 'branch' => $branch, - 'fullRepoUrl' => $fullRepoUrl, - ]; - } - } - if ($this->deploymentType() === 'deploy_key') { - $fullRepoUrl = $customRepository; - $private_key = data_get($this, 'private_key.private_key'); - if (is_null($private_key)) { - throw new RuntimeException('Private key not found. Please add a private key to the application and try again.'); - } - $private_key = base64_encode($private_key); - $git_clone_command_base = "GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" {$git_clone_command} {$customRepository} {$baseDir}"; - if ($only_checkout) { - $git_clone_command = $git_clone_command_base; - } else { - $git_clone_command = $this->setGitImportSettings($deployment_uuid, $git_clone_command_base); - } - if ($exec_in_docker) { - $commands = collect([ - executeInDocker($deployment_uuid, 'mkdir -p /root/.ssh'), - executeInDocker($deployment_uuid, "echo '{$private_key}' | base64 -d | tee /root/.ssh/id_rsa > /dev/null"), - executeInDocker($deployment_uuid, 'chmod 600 /root/.ssh/id_rsa'), - ]); - } else { - $commands = collect([ - 'mkdir -p /root/.ssh', - "echo '{$private_key}' | base64 -d | tee /root/.ssh/id_rsa > /dev/null", - 'chmod 600 /root/.ssh/id_rsa', - ]); - } - if ($pull_request_id !== 0) { - if ($git_type === 'gitlab') { - $branch = "merge-requests/{$pull_request_id}/head:$pr_branch_name"; - if ($exec_in_docker) { - $commands->push(executeInDocker($deployment_uuid, "echo 'Checking out $branch'")); - } else { - $commands->push("echo 'Checking out $branch'"); - } - $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" git fetch origin $branch && ".$this->buildGitCheckoutCommand($pr_branch_name); - } elseif ($git_type === 'github' || $git_type === 'gitea') { - $branch = "pull/{$pull_request_id}/head:$pr_branch_name"; - if ($exec_in_docker) { - $commands->push(executeInDocker($deployment_uuid, "echo 'Checking out $branch'")); - } else { - $commands->push("echo 'Checking out $branch'"); - } - $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" git fetch origin $branch && ".$this->buildGitCheckoutCommand($pr_branch_name); - } elseif ($git_type === 'bitbucket') { - if ($exec_in_docker) { - $commands->push(executeInDocker($deployment_uuid, "echo 'Checking out $branch'")); - } else { - $commands->push("echo 'Checking out $branch'"); - } - $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" ".$this->buildGitCheckoutCommand($commit); - } - } - - if ($exec_in_docker) { - $commands->push(executeInDocker($deployment_uuid, $git_clone_command)); - } else { - $commands->push($git_clone_command); - } - - return [ - 'commands' => $commands->implode(' && '), - 'branch' => $branch, - 'fullRepoUrl' => $fullRepoUrl, - ]; - } - if ($this->deploymentType() === 'other') { - $fullRepoUrl = $customRepository; - $git_clone_command = "{$git_clone_command} {$customRepository} {$baseDir}"; - $git_clone_command = $this->setGitImportSettings($deployment_uuid, $git_clone_command, public: true); - - if ($pull_request_id !== 0) { - if ($git_type === 'gitlab') { - $branch = "merge-requests/{$pull_request_id}/head:$pr_branch_name"; - if ($exec_in_docker) { - $commands->push(executeInDocker($deployment_uuid, "echo 'Checking out $branch'")); - } else { - $commands->push("echo 'Checking out $branch'"); - } - $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" git fetch origin $branch && ".$this->buildGitCheckoutCommand($pr_branch_name); - } elseif ($git_type === 'github' || $git_type === 'gitea') { - $branch = "pull/{$pull_request_id}/head:$pr_branch_name"; - if ($exec_in_docker) { - $commands->push(executeInDocker($deployment_uuid, "echo 'Checking out $branch'")); - } else { - $commands->push("echo 'Checking out $branch'"); - } - $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" git fetch origin $branch && ".$this->buildGitCheckoutCommand($pr_branch_name); - } elseif ($git_type === 'bitbucket') { - if ($exec_in_docker) { - $commands->push(executeInDocker($deployment_uuid, "echo 'Checking out $branch'")); - } else { - $commands->push("echo 'Checking out $branch'"); - } - $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" ".$this->buildGitCheckoutCommand($commit); - } - } - - if ($exec_in_docker) { - $commands->push(executeInDocker($deployment_uuid, $git_clone_command)); - } else { - $commands->push($git_clone_command); - } - - return [ - 'commands' => $commands->implode(' && '), - 'branch' => $branch, - 'fullRepoUrl' => $fullRepoUrl, - ]; - } - } - - public function oldRawParser() - { - try { - $yaml = Yaml::parse($this->docker_compose_raw); - } catch (\Exception $e) { - throw new \Exception($e->getMessage()); - } - $services = data_get($yaml, 'services'); - - $commands = collect([]); - $services = collect($services)->map(function ($service) use ($commands) { - $serviceVolumes = collect(data_get($service, 'volumes', [])); - if ($serviceVolumes->count() > 0) { - foreach ($serviceVolumes as $volume) { - $workdir = $this->workdir(); - $type = null; - $source = null; - if (is_string($volume)) { - $source = str($volume)->before(':'); - if ($source->startsWith('./') || $source->startsWith('/') || $source->startsWith('~')) { - $type = str('bind'); - } - } elseif (is_array($volume)) { - $type = data_get_str($volume, 'type'); - $source = data_get_str($volume, 'source'); - } - if ($type?->value() === 'bind') { - if ($source->value() === '/var/run/docker.sock') { - continue; - } - if ($source->value() === '/tmp' || $source->value() === '/tmp/') { - continue; - } - if ($source->startsWith('.')) { - $source = $source->after('.'); - $source = $workdir.$source; - } - $commands->push("mkdir -p $source > /dev/null 2>&1 || true"); - } - } - } - $labels = collect(data_get($service, 'labels', [])); - if (! $labels->contains('coolify.managed')) { - $labels->push('coolify.managed=true'); - } - if (! $labels->contains('coolify.applicationId')) { - $labels->push('coolify.applicationId='.$this->id); - } - if (! $labels->contains('coolify.type')) { - $labels->push('coolify.type=application'); - } - data_set($service, 'labels', $labels->toArray()); - - return $service; - }); - data_set($yaml, 'services', $services->toArray()); - $this->docker_compose_raw = Yaml::dump($yaml, 10, 2); - - instant_remote_process($commands, $this->destination->server, false); - } - - public function parse(int $pull_request_id = 0, ?int $preview_id = null) - { - if ((int) $this->compose_parsing_version >= 3) { - return newParser($this, $pull_request_id, $preview_id); - } elseif ($this->docker_compose_raw) { - return parseDockerComposeFile(resource: $this, isNew: false, pull_request_id: $pull_request_id, preview_id: $preview_id); - } else { - return collect([]); - } - } - - public function loadComposeFile($isInit = false) - { - $initialDockerComposeLocation = $this->docker_compose_location; - if ($isInit && $this->docker_compose_raw) { - return; - } - $uuid = new Cuid2; - ['commands' => $cloneCommand] = $this->generateGitImportCommands(deployment_uuid: $uuid, only_checkout: true, exec_in_docker: false, custom_base_dir: '.'); - $workdir = rtrim($this->base_directory, '/'); - $composeFile = $this->docker_compose_location; - $fileList = collect([".$workdir$composeFile"]); - $gitRemoteStatus = $this->getGitRemoteStatus(deployment_uuid: $uuid); - if (! $gitRemoteStatus['is_accessible']) { - throw new \RuntimeException("Failed to read Git source:\n\n{$gitRemoteStatus['error']}"); - } - $getGitVersion = instant_remote_process(['git --version'], $this->destination->server, false); - $gitVersion = str($getGitVersion)->explode(' ')->last(); - - if (version_compare($gitVersion, '2.35.1', '<')) { - $fileList = $fileList->map(function ($file) { - $parts = explode('/', trim($file, '.')); - $paths = collect(); - $currentPath = ''; - foreach ($parts as $part) { - $currentPath .= ($currentPath ? '/' : '').$part; - if (str($currentPath)->isNotEmpty()) { - $paths->push($currentPath); - } - } - - return $paths; - })->flatten()->unique()->values(); - $commands = collect([ - "rm -rf /tmp/{$uuid}", - "mkdir -p /tmp/{$uuid}", - "cd /tmp/{$uuid}", - $cloneCommand, - 'git sparse-checkout init', - "git sparse-checkout set {$fileList->implode(' ')}", - 'git read-tree -mu HEAD', - "cat .$workdir$composeFile", - ]); - } else { - $commands = collect([ - "rm -rf /tmp/{$uuid}", - "mkdir -p /tmp/{$uuid}", - "cd /tmp/{$uuid}", - $cloneCommand, - 'git sparse-checkout init --cone', - "git sparse-checkout set {$fileList->implode(' ')}", - 'git read-tree -mu HEAD', - "cat .$workdir$composeFile", - ]); - } - try { - $composeFileContent = instant_remote_process($commands, $this->destination->server); - } catch (\Exception $e) { - if (str($e->getMessage())->contains('No such file')) { - throw new \RuntimeException("Docker Compose file not found at: $workdir$composeFile

Check if you used the right extension (.yaml or .yml) in the compose file name."); - } - if (str($e->getMessage())->contains('fatal: repository') && str($e->getMessage())->contains('does not exist')) { - if ($this->deploymentType() === 'deploy_key') { - throw new \RuntimeException('Your deploy key does not have access to the repository. Please check your deploy key and try again.'); - } - throw new \RuntimeException('Repository does not exist. Please check your repository URL and try again.'); - } - throw new \RuntimeException($e->getMessage()); - } finally { - $this->docker_compose_location = $initialDockerComposeLocation; - $this->save(); - $commands = collect([ - "rm -rf /tmp/{$uuid}", - ]); - instant_remote_process($commands, $this->destination->server, false); - } - if ($composeFileContent) { - $this->docker_compose_raw = $composeFileContent; - $this->save(); - $parsedServices = $this->parse(); - if ($this->docker_compose_domains) { - $json = collect(json_decode($this->docker_compose_domains)); - $names = collect(data_get($parsedServices, 'services'))->keys()->toArray(); - $jsonNames = $json->keys()->toArray(); - $diff = array_diff($jsonNames, $names); - $json = $json->filter(function ($value, $key) use ($diff) { - return ! in_array($key, $diff); - }); - if ($json) { - $this->docker_compose_domains = json_encode($json); - } else { - $this->docker_compose_domains = null; - } - $this->save(); - } - - return [ - 'parsedServices' => $parsedServices, - 'initialDockerComposeLocation' => $this->docker_compose_location, - ]; - } else { - throw new \RuntimeException("Docker Compose file not found at: $workdir$composeFile

Check if you used the right extension (.yaml or .yml) in the compose file name."); - } - } - - public function parseContainerLabels(?ApplicationPreview $preview = null) - { - $customLabels = data_get($this, 'custom_labels'); - if (! $customLabels) { - return; - } - if (base64_encode(base64_decode($customLabels, true)) !== $customLabels) { - $this->custom_labels = str($customLabels)->replace(',', "\n"); - $this->custom_labels = base64_encode($customLabels); - } - $customLabels = base64_decode($this->custom_labels); - if (mb_detect_encoding($customLabels, 'ASCII', true) === false) { - $customLabels = str(implode('|coolify|', generateLabelsApplication($this, $preview)))->replace('|coolify|', "\n"); - } - $this->custom_labels = base64_encode($customLabels); - $this->save(); - - return $customLabels; - } - - public function fqdns(): Attribute - { - return Attribute::make( - get: fn () => is_null($this->fqdn) - ? [] - : explode(',', $this->fqdn), - ); - } - - protected function buildGitCheckoutCommand($target): string - { - $command = "git checkout $target"; - - if ($this->settings->is_git_submodules_enabled) { - $command .= ' && git submodule update --init --recursive'; - } - - return $command; - } - - public function watchPaths(): Attribute - { - return Attribute::make( - set: function ($value) { - if ($value) { - return trim($value); - } - } - ); - } - - public function isWatchPathsTriggered(Collection $modified_files): bool - { - if (is_null($this->watch_paths)) { - return false; - } - $watch_paths = collect(explode("\n", $this->watch_paths)); - $matches = $modified_files->filter(function ($file) use ($watch_paths) { - return $watch_paths->contains(function ($glob) use ($file) { - return fnmatch($glob, $file); - }); - }); - - return $matches->count() > 0; - } - - public function getFilesFromServer(bool $isInit = false) - { - getFilesystemVolumesFromServer($this, $isInit); - } - - public function parseHealthcheckFromDockerfile($dockerfile, bool $isInit = false) - { - if (str($dockerfile)->contains('HEALTHCHECK') && ($this->isHealthcheckDisabled() || $isInit)) { - $healthcheckCommand = null; - $lines = $dockerfile->toArray(); - foreach ($lines as $line) { - $trimmedLine = trim($line); - if (str_starts_with($trimmedLine, 'HEALTHCHECK')) { - $healthcheckCommand .= trim($trimmedLine, '\\ '); - - continue; - } - if (isset($healthcheckCommand) && str_contains($trimmedLine, '\\')) { - $healthcheckCommand .= ' '.trim($trimmedLine, '\\ '); - } - if (isset($healthcheckCommand) && ! str_contains($trimmedLine, '\\') && ! empty($healthcheckCommand)) { - $healthcheckCommand .= ' '.$trimmedLine; - break; - } - } - if (str($healthcheckCommand)->isNotEmpty()) { - $interval = str($healthcheckCommand)->match('/--interval=(\d+)/'); - $timeout = str($healthcheckCommand)->match('/--timeout=(\d+)/'); - $start_period = str($healthcheckCommand)->match('/--start-period=(\d+)/'); - $start_interval = str($healthcheckCommand)->match('/--start-interval=(\d+)/'); - $retries = str($healthcheckCommand)->match('/--retries=(\d+)/'); - if ($interval->isNotEmpty()) { - $this->health_check_interval = $interval->toInteger(); - } - if ($timeout->isNotEmpty()) { - $this->health_check_timeout = $timeout->toInteger(); - } - if ($start_period->isNotEmpty()) { - $this->health_check_start_period = $start_period->toInteger(); - } - // if ($start_interval) { - // $this->health_check_start_interval = $start_interval->value(); - // } - if ($retries->isNotEmpty()) { - $this->health_check_retries = $retries->toInteger(); - } - if ($interval || $timeout || $start_period || $start_interval || $retries) { - $this->custom_healthcheck_found = true; - $this->save(); - } - } - } - } - - public function generate_preview_fqdn(int $pull_request_id) - { - $preview = ApplicationPreview::findPreviewByApplicationAndPullId($this->id, $pull_request_id); - if (is_null(data_get($preview, 'fqdn')) && $this->fqdn) { - if (str($this->fqdn)->contains(',')) { - $url = Url::fromString(str($this->fqdn)->explode(',')[0]); - $preview_fqdn = getFqdnWithoutPort(str($this->fqdn)->explode(',')[0]); - } else { - $url = Url::fromString($this->fqdn); - if (data_get($preview, 'fqdn')) { - $preview_fqdn = getFqdnWithoutPort(data_get($preview, 'fqdn')); - } - } - $template = $this->preview_url_template; - $host = $url->getHost(); - $schema = $url->getScheme(); - $random = new Cuid2; - $preview_fqdn = str_replace('{{random}}', $random, $template); - $preview_fqdn = str_replace('{{domain}}', $host, $preview_fqdn); - $preview_fqdn = str_replace('{{pr_id}}', $pull_request_id, $preview_fqdn); - $preview_fqdn = "$schema://$preview_fqdn"; - $preview->fqdn = $preview_fqdn; - $preview->save(); - } - - return $preview; - } - - public static function getDomainsByUuid(string $uuid): array - { - $application = self::where('uuid', $uuid)->first(); - - if ($application) { - return $application->fqdns; - } - - return []; - } - - public function getCpuMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - if ($server->isMetricsEnabled()) { - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/cpu/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['percent']]; - }); - - return $parsedCollection->toArray(); - } - } - - public function getMemoryMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - if ($server->isMetricsEnabled()) { - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/memory/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['used']]; - }); - - return $parsedCollection->toArray(); - } - } - - public function getLimits(): array - { - return [ - 'limits_memory' => $this->limits_memory, - 'limits_memory_swap' => $this->limits_memory_swap, - 'limits_memory_swappiness' => $this->limits_memory_swappiness, - 'limits_memory_reservation' => $this->limits_memory_reservation, - 'limits_cpus' => $this->limits_cpus, - 'limits_cpuset' => $this->limits_cpuset, - 'limits_cpu_shares' => $this->limits_cpu_shares, - ]; - } - - public function generateConfig($is_json = false) - { - $generator = new ConfigurationGenerator($this); - - if ($is_json) { - return $generator->toJson(); - } - - return $generator->toArray(); - } - - public function setConfig($config) - { - $validator = Validator::make(['config' => $config], [ - 'config' => 'required|json', - ]); - if ($validator->fails()) { - throw new \Exception('Invalid JSON format'); - } - $config = json_decode($config, true); - - $deepValidator = Validator::make(['config' => $config], [ - 'config.build_pack' => 'required|string', - 'config.base_directory' => 'required|string', - 'config.publish_directory' => 'required|string', - 'config.ports_exposes' => 'required|string', - 'config.settings.is_static' => 'required|boolean', - ]); - if ($deepValidator->fails()) { - throw new \Exception('Invalid data'); - } - $config = $deepValidator->validated()['config']; - - try { - $settings = data_get($config, 'settings', []); - data_forget($config, 'settings'); - $this->update($config); - $this->settings()->update($settings); - } catch (\Exception $e) { - throw new \Exception('Failed to update application settings'); - } - } -} diff --git a/app/Models/ApplicationDeploymentQueue.php b/app/Models/ApplicationDeploymentQueue.php deleted file mode 100644 index fd8f1cba2e..0000000000 --- a/app/Models/ApplicationDeploymentQueue.php +++ /dev/null @@ -1,117 +0,0 @@ - ['type' => 'integer'], - 'application_id' => ['type' => 'string'], - 'deployment_uuid' => ['type' => 'string'], - 'pull_request_id' => ['type' => 'integer'], - 'force_rebuild' => ['type' => 'boolean'], - 'commit' => ['type' => 'string'], - 'status' => ['type' => 'string'], - 'is_webhook' => ['type' => 'boolean'], - 'is_api' => ['type' => 'boolean'], - 'created_at' => ['type' => 'string'], - 'updated_at' => ['type' => 'string'], - 'logs' => ['type' => 'string'], - 'current_process_id' => ['type' => 'string'], - 'restart_only' => ['type' => 'boolean'], - 'git_type' => ['type' => 'string'], - 'server_id' => ['type' => 'integer'], - 'application_name' => ['type' => 'string'], - 'server_name' => ['type' => 'string'], - 'deployment_url' => ['type' => 'string'], - 'destination_id' => ['type' => 'string'], - 'only_this_server' => ['type' => 'boolean'], - 'rollback' => ['type' => 'boolean'], - 'commit_message' => ['type' => 'string'], - ], -)] -class ApplicationDeploymentQueue extends Model -{ - protected $guarded = []; - - public function application(): Attribute - { - return Attribute::make( - get: fn () => Application::find($this->application_id), - ); - } - - public function server(): Attribute - { - return Attribute::make( - get: fn () => Server::find($this->server_id), - ); - } - - public function setStatus(string $status) - { - $this->update([ - 'status' => $status, - ]); - } - - public function getOutput($name) - { - if (! $this->logs) { - return null; - } - - return collect(json_decode($this->logs))->where('name', $name)->first()?->output ?? null; - } - - public function getHorizonJobStatus() - { - return getJobStatus($this->horizon_job_id); - } - - public function commitMessage() - { - if (empty($this->commit_message) || is_null($this->commit_message)) { - return null; - } - - return str($this->commit_message)->value(); - } - - public function addLogEntry(string $message, string $type = 'stdout', bool $hidden = false) - { - if ($type === 'error') { - $type = 'stderr'; - } - $message = str($message)->trim(); - if ($message->startsWith('╔')) { - $message = "\n".$message; - } - $newLogEntry = [ - 'command' => null, - 'output' => remove_iip($message), - 'type' => $type, - 'timestamp' => Carbon::now('UTC'), - 'hidden' => $hidden, - 'batch' => 1, - ]; - if ($this->logs) { - $previousLogs = json_decode($this->logs, associative: true, flags: JSON_THROW_ON_ERROR); - $newLogEntry['order'] = count($previousLogs) + 1; - $previousLogs[] = $newLogEntry; - $this->update([ - 'logs' => json_encode($previousLogs, flags: JSON_THROW_ON_ERROR), - ]); - } else { - $this->update([ - 'logs' => json_encode([$newLogEntry], flags: JSON_THROW_ON_ERROR), - ]); - } - } -} diff --git a/app/Models/ApplicationPreview.php b/app/Models/ApplicationPreview.php deleted file mode 100644 index bf2bf05bf1..0000000000 --- a/app/Models/ApplicationPreview.php +++ /dev/null @@ -1,75 +0,0 @@ -application->destination->server; - $composeFile = $preview->application->parse(pull_request_id: $preview->pull_request_id); - $volumes = data_get($composeFile, 'volumes'); - $networks = data_get($composeFile, 'networks'); - $networkKeys = collect($networks)->keys(); - $volumeKeys = collect($volumes)->keys(); - $volumeKeys->each(function ($key) use ($server) { - instant_remote_process(["docker volume rm -f $key"], $server, false); - }); - $networkKeys->each(function ($key) use ($server) { - instant_remote_process(["docker network disconnect $key coolify-proxy"], $server, false); - instant_remote_process(["docker network rm $key"], $server, false); - }); - } - }); - static::saving(function ($preview) { - if ($preview->isDirty('status')) { - $preview->forceFill(['last_online_at' => now()]); - } - }); - } - - public static function findPreviewByApplicationAndPullId(int $application_id, int $pull_request_id) - { - return self::where('application_id', $application_id)->where('pull_request_id', $pull_request_id)->firstOrFail(); - } - - public function isRunning() - { - return (bool) str($this->status)->startsWith('running'); - } - - public function application() - { - return $this->belongsTo(Application::class); - } - - public function generate_preview_fqdn_compose() - { - $domains = collect(json_decode($this->application->docker_compose_domains)) ?? collect(); - foreach ($domains as $service_name => $domain) { - $domain = data_get($domain, 'domain'); - $url = Url::fromString($domain); - $template = $this->application->preview_url_template; - $host = $url->getHost(); - $schema = $url->getScheme(); - $random = new Cuid2; - $preview_fqdn = str_replace('{{random}}', $random, $template); - $preview_fqdn = str_replace('{{domain}}', $host, $preview_fqdn); - $preview_fqdn = str_replace('{{pr_id}}', $this->pull_request_id, $preview_fqdn); - $preview_fqdn = "$schema://$preview_fqdn"; - $docker_compose_domains = data_get($this, 'docker_compose_domains'); - $docker_compose_domains = json_decode($docker_compose_domains, true); - $docker_compose_domains[$service_name]['domain'] = $preview_fqdn; - $docker_compose_domains = json_encode($docker_compose_domains); - $this->docker_compose_domains = $docker_compose_domains; - $this->save(); - } - } -} diff --git a/app/Models/ApplicationSetting.php b/app/Models/ApplicationSetting.php deleted file mode 100644 index c7624fdaa1..0000000000 --- a/app/Models/ApplicationSetting.php +++ /dev/null @@ -1,40 +0,0 @@ - 'boolean', - 'is_auto_deploy_enabled' => 'boolean', - 'is_force_https_enabled' => 'boolean', - 'is_debug_enabled' => 'boolean', - 'is_preview_deployments_enabled' => 'boolean', - 'is_git_submodules_enabled' => 'boolean', - 'is_git_lfs_enabled' => 'boolean', - ]; - - protected $guarded = []; - - public function isStatic(): Attribute - { - return Attribute::make( - set: function ($value) { - if ($value) { - $this->application->ports_exposes = 80; - } - $this->application->save(); - - return $value; - } - ); - } - - public function application() - { - return $this->belongsTo(Application::class); - } -} diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php deleted file mode 100644 index 727abed5fe..0000000000 --- a/app/Models/BaseModel.php +++ /dev/null @@ -1,36 +0,0 @@ -uuid) { - $model->uuid = (string) new Cuid2; - } - }); - } - - public function sanitizedName(): Attribute - { - return new Attribute( - get: fn () => sanitize_string($this->getRawOriginal('name')), - ); - } - - public function image(): Attribute - { - return new Attribute( - get: fn () => sanitize_string($this->getRawOriginal('image')), - ); - } -} diff --git a/app/Models/DiscordNotificationSettings.php b/app/Models/DiscordNotificationSettings.php deleted file mode 100644 index 619393ddc0..0000000000 --- a/app/Models/DiscordNotificationSettings.php +++ /dev/null @@ -1,59 +0,0 @@ - 'boolean', - 'discord_webhook_url' => 'encrypted', - - 'deployment_success_discord_notifications' => 'boolean', - 'deployment_failure_discord_notifications' => 'boolean', - 'status_change_discord_notifications' => 'boolean', - 'backup_success_discord_notifications' => 'boolean', - 'backup_failure_discord_notifications' => 'boolean', - 'scheduled_task_success_discord_notifications' => 'boolean', - 'scheduled_task_failure_discord_notifications' => 'boolean', - 'docker_cleanup_discord_notifications' => 'boolean', - 'server_disk_usage_discord_notifications' => 'boolean', - 'server_reachable_discord_notifications' => 'boolean', - 'server_unreachable_discord_notifications' => 'boolean', - ]; - - public function team() - { - return $this->belongsTo(Team::class); - } - - public function isEnabled() - { - return $this->discord_enabled; - } -} diff --git a/app/Models/DockerCleanupExecution.php b/app/Models/DockerCleanupExecution.php deleted file mode 100644 index 405037e307..0000000000 --- a/app/Models/DockerCleanupExecution.php +++ /dev/null @@ -1,15 +0,0 @@ -belongsTo(Server::class); - } -} diff --git a/app/Models/EmailNotificationSettings.php b/app/Models/EmailNotificationSettings.php deleted file mode 100644 index ae118986fc..0000000000 --- a/app/Models/EmailNotificationSettings.php +++ /dev/null @@ -1,79 +0,0 @@ - 'boolean', - 'smtp_from_address' => 'encrypted', - 'smtp_from_name' => 'encrypted', - 'smtp_recipients' => 'encrypted', - 'smtp_host' => 'encrypted', - 'smtp_port' => 'integer', - 'smtp_username' => 'encrypted', - 'smtp_password' => 'encrypted', - 'smtp_timeout' => 'integer', - - 'resend_enabled' => 'boolean', - 'resend_api_key' => 'encrypted', - - 'use_instance_email_settings' => 'boolean', - - 'deployment_success_email_notifications' => 'boolean', - 'deployment_failure_email_notifications' => 'boolean', - 'status_change_email_notifications' => 'boolean', - 'backup_success_email_notifications' => 'boolean', - 'backup_failure_email_notifications' => 'boolean', - 'scheduled_task_success_email_notifications' => 'boolean', - 'scheduled_task_failure_email_notifications' => 'boolean', - 'server_disk_usage_email_notifications' => 'boolean', - ]; - - public function team() - { - return $this->belongsTo(Team::class); - } - - public function isEnabled() - { - if (isCloud()) { - return true; - } - - return $this->smtp_enabled || $this->resend_enabled || $this->use_instance_email_settings; - } -} diff --git a/app/Models/Environment.php b/app/Models/Environment.php deleted file mode 100644 index b8f1090d8d..0000000000 --- a/app/Models/Environment.php +++ /dev/null @@ -1,128 +0,0 @@ - ['type' => 'integer'], - 'name' => ['type' => 'string'], - 'project_id' => ['type' => 'integer'], - 'created_at' => ['type' => 'string'], - 'updated_at' => ['type' => 'string'], - 'description' => ['type' => 'string'], - ] -)] -class Environment extends BaseModel -{ - protected $guarded = []; - - protected static function booted() - { - static::deleting(function ($environment) { - $shared_variables = $environment->environment_variables(); - foreach ($shared_variables as $shared_variable) { - $shared_variable->delete(); - } - }); - } - - public function isEmpty() - { - return $this->applications()->count() == 0 && - $this->redis()->count() == 0 && - $this->postgresqls()->count() == 0 && - $this->mysqls()->count() == 0 && - $this->keydbs()->count() == 0 && - $this->dragonflies()->count() == 0 && - $this->clickhouses()->count() == 0 && - $this->mariadbs()->count() == 0 && - $this->mongodbs()->count() == 0 && - $this->services()->count() == 0; - } - - public function environment_variables() - { - return $this->hasMany(SharedEnvironmentVariable::class); - } - - public function applications() - { - return $this->hasMany(Application::class); - } - - public function postgresqls() - { - return $this->hasMany(StandalonePostgresql::class); - } - - public function redis() - { - return $this->hasMany(StandaloneRedis::class); - } - - public function mongodbs() - { - return $this->hasMany(StandaloneMongodb::class); - } - - public function mysqls() - { - return $this->hasMany(StandaloneMysql::class); - } - - public function mariadbs() - { - return $this->hasMany(StandaloneMariadb::class); - } - - public function keydbs() - { - return $this->hasMany(StandaloneKeydb::class); - } - - public function dragonflies() - { - return $this->hasMany(StandaloneDragonfly::class); - } - - public function clickhouses() - { - return $this->hasMany(StandaloneClickhouse::class); - } - - public function databases() - { - $postgresqls = $this->postgresqls; - $redis = $this->redis; - $mongodbs = $this->mongodbs; - $mysqls = $this->mysqls; - $mariadbs = $this->mariadbs; - $keydbs = $this->keydbs; - $dragonflies = $this->dragonflies; - $clickhouses = $this->clickhouses; - - return $postgresqls->concat($redis)->concat($mongodbs)->concat($mysqls)->concat($mariadbs)->concat($keydbs)->concat($dragonflies)->concat($clickhouses); - } - - public function project() - { - return $this->belongsTo(Project::class); - } - - public function services() - { - return $this->hasMany(Service::class); - } - - protected function name(): Attribute - { - return Attribute::make( - set: fn (string $value) => str($value)->lower()->trim()->replace('/', '-')->toString(), - ); - } -} diff --git a/app/Models/EnvironmentVariable.php b/app/Models/EnvironmentVariable.php deleted file mode 100644 index 5f686de60d..0000000000 --- a/app/Models/EnvironmentVariable.php +++ /dev/null @@ -1,218 +0,0 @@ - ['type' => 'integer'], - 'uuid' => ['type' => 'string'], - 'resourceable_type' => ['type' => 'string'], - 'resourceable_id' => ['type' => 'integer'], - 'is_build_time' => ['type' => 'boolean'], - 'is_literal' => ['type' => 'boolean'], - 'is_multiline' => ['type' => 'boolean'], - 'is_preview' => ['type' => 'boolean'], - 'is_shared' => ['type' => 'boolean'], - 'is_shown_once' => ['type' => 'boolean'], - 'key' => ['type' => 'string'], - 'value' => ['type' => 'string'], - 'real_value' => ['type' => 'string'], - 'version' => ['type' => 'string'], - 'created_at' => ['type' => 'string'], - 'updated_at' => ['type' => 'string'], - ] -)] -class EnvironmentVariable extends BaseModel -{ - protected $guarded = []; - - protected $casts = [ - 'key' => 'string', - 'value' => 'encrypted', - 'is_build_time' => 'boolean', - 'is_multiline' => 'boolean', - 'is_preview' => 'boolean', - 'version' => 'string', - 'resourceable_type' => 'string', - 'resourceable_id' => 'integer', - ]; - - protected $appends = ['real_value', 'is_shared', 'is_really_required']; - - protected static function booted() - { - static::created(function (EnvironmentVariable $environment_variable) { - if ($environment_variable->resourceable_type === Application::class && ! $environment_variable->is_preview) { - $found = ModelsEnvironmentVariable::where('key', $environment_variable->key) - ->where('resourceable_type', Application::class) - ->where('resourceable_id', $environment_variable->resourceable_id) - ->where('is_preview', true) - ->first(); - - if (! $found) { - $application = Application::find($environment_variable->resourceable_id); - if ($application && $application->build_pack !== 'dockerfile') { - ModelsEnvironmentVariable::create([ - 'key' => $environment_variable->key, - 'value' => $environment_variable->value, - 'is_build_time' => $environment_variable->is_build_time, - 'is_multiline' => $environment_variable->is_multiline ?? false, - 'resourceable_type' => Application::class, - 'resourceable_id' => $environment_variable->resourceable_id, - 'is_preview' => true, - ]); - } - } - } - $environment_variable->update([ - 'version' => config('constants.coolify.version'), - ]); - }); - - static::saving(function (EnvironmentVariable $environmentVariable) { - $environmentVariable->updateIsShared(); - }); - } - - public function service() - { - return $this->belongsTo(Service::class); - } - - protected function value(): Attribute - { - return Attribute::make( - get: fn (?string $value = null) => $this->get_environment_variables($value), - set: fn (?string $value = null) => $this->set_environment_variables($value), - ); - } - - /** - * Get the parent resourceable model. - */ - public function resourceable() - { - return $this->morphTo(); - } - - public function resource() - { - return $this->resourceable; - } - - public function realValue(): Attribute - { - return Attribute::make( - get: function () { - if (! $this->relationLoaded('resourceable')) { - $this->load('resourceable'); - } - $resource = $this->resourceable; - if (! $resource) { - return null; - } - - return $this->get_real_environment_variables($this->value, $resource); - } - ); - } - - protected function isReallyRequired(): Attribute - { - return Attribute::make( - get: fn () => $this->is_required && str($this->real_value)->isEmpty(), - ); - } - - protected function isShared(): Attribute - { - return Attribute::make( - get: function () { - $type = str($this->value)->after('{{')->before('.')->value; - if (str($this->value)->startsWith('{{'.$type) && str($this->value)->endsWith('}}')) { - return true; - } - - return false; - } - ); - } - - private function get_real_environment_variables(?string $environment_variable = null, $resource = null) - { - if ((is_null($environment_variable) && $environment_variable === '') || is_null($resource)) { - return null; - } - $environment_variable = trim($environment_variable); - $sharedEnvsFound = str($environment_variable)->matchAll('/{{(.*?)}}/'); - if ($sharedEnvsFound->isEmpty()) { - return $environment_variable; - } - foreach ($sharedEnvsFound as $sharedEnv) { - $type = str($sharedEnv)->match('/(.*?)\./'); - if (! collect(SHARED_VARIABLE_TYPES)->contains($type)) { - continue; - } - $variable = str($sharedEnv)->match('/\.(.*)/'); - if ($type->value() === 'environment') { - $id = $resource->environment->id; - } elseif ($type->value() === 'project') { - $id = $resource->environment->project->id; - } elseif ($type->value() === 'team') { - $id = $resource->team()->id; - } - if (is_null($id)) { - continue; - } - $environment_variable_found = SharedEnvironmentVariable::where('type', $type)->where('key', $variable)->where('team_id', $resource->team()->id)->where("{$type}_id", $id)->first(); - if ($environment_variable_found) { - $environment_variable = str($environment_variable)->replace("{{{$sharedEnv}}}", $environment_variable_found->value); - } - } - - return str($environment_variable)->value(); - } - - private function get_environment_variables(?string $environment_variable = null): ?string - { - if (! $environment_variable) { - return null; - } - - return trim(decrypt($environment_variable)); - } - - private function set_environment_variables(?string $environment_variable = null): ?string - { - if (is_null($environment_variable) && $environment_variable === '') { - return null; - } - $environment_variable = trim($environment_variable); - $type = str($environment_variable)->after('{{')->before('.')->value; - if (str($environment_variable)->startsWith('{{'.$type) && str($environment_variable)->endsWith('}}')) { - return encrypt((string) str($environment_variable)->replace(' ', '')); - } - - return encrypt($environment_variable); - } - - protected function key(): Attribute - { - return Attribute::make( - set: fn (string $value) => str($value)->trim()->replace(' ', '_')->value, - ); - } - - protected function updateIsShared(): void - { - $type = str($this->value)->after('{{')->before('.')->value; - $isShared = str($this->value)->startsWith('{{'.$type) && str($this->value)->endsWith('}}'); - $this->is_shared = $isShared; - } -} diff --git a/app/Models/GithubApp.php b/app/Models/GithubApp.php deleted file mode 100644 index 5550df81f2..0000000000 --- a/app/Models/GithubApp.php +++ /dev/null @@ -1,87 +0,0 @@ - 'boolean', - 'type' => 'string', - ]; - - protected $hidden = [ - 'client_secret', - 'webhook_secret', - ]; - - protected static function booted(): void - { - static::deleting(function (GithubApp $github_app) { - $applications_count = Application::where('source_id', $github_app->id)->count(); - if ($applications_count > 0) { - throw new \Exception('You cannot delete this GitHub App because it is in use by '.$applications_count.' application(s). Delete them first.'); - } - $github_app->privateKey()->delete(); - }); - } - - public static function ownedByCurrentTeam() - { - return GithubApp::where(function ($query) { - $query->where('team_id', currentTeam()->id) - ->orWhere('is_system_wide', true); - }); - } - - public static function public() - { - return GithubApp::where(function ($query) { - $query->where(function ($q) { - $q->where('team_id', currentTeam()->id) - ->orWhere('is_system_wide', true); - })->where('is_public', true); - })->whereNotNull('app_id')->get(); - } - - public static function private() - { - return GithubApp::where(function ($query) { - $query->where(function ($q) { - $q->where('team_id', currentTeam()->id) - ->orWhere('is_system_wide', true); - })->where('is_public', false); - })->whereNotNull('app_id')->get(); - } - - public function team() - { - return $this->belongsTo(Team::class); - } - - public function applications() - { - return $this->morphMany(Application::class, 'source'); - } - - public function privateKey() - { - return $this->belongsTo(PrivateKey::class); - } - - public function type(): Attribute - { - return Attribute::make( - get: function () { - if ($this->getMorphClass() === \App\Models\GithubApp::class) { - return 'github'; - } - }, - ); - } -} diff --git a/app/Models/GitlabApp.php b/app/Models/GitlabApp.php deleted file mode 100644 index 2112a4a664..0000000000 --- a/app/Models/GitlabApp.php +++ /dev/null @@ -1,26 +0,0 @@ -id); - } - - public function applications() - { - return $this->morphMany(Application::class, 'source'); - } - - public function privateKey() - { - return $this->belongsTo(PrivateKey::class); - } -} diff --git a/app/Models/InstanceSettings.php b/app/Models/InstanceSettings.php deleted file mode 100644 index 5b89bb401c..0000000000 --- a/app/Models/InstanceSettings.php +++ /dev/null @@ -1,127 +0,0 @@ - 'boolean', - 'smtp_from_address' => 'encrypted', - 'smtp_from_name' => 'encrypted', - 'smtp_recipients' => 'encrypted', - 'smtp_host' => 'encrypted', - 'smtp_port' => 'integer', - 'smtp_username' => 'encrypted', - 'smtp_password' => 'encrypted', - 'smtp_timeout' => 'integer', - - 'resend_enabled' => 'boolean', - 'resend_api_key' => 'encrypted', - - 'allowed_ip_ranges' => 'array', - 'is_auto_update_enabled' => 'boolean', - 'auto_update_frequency' => 'string', - 'update_check_frequency' => 'string', - 'sentinel_token' => 'encrypted', - ]; - - protected static function booted(): void - { - static::updated(function ($settings) { - if ($settings->isDirty('helper_version')) { - Server::chunkById(100, function ($servers) { - foreach ($servers as $server) { - PullHelperImageJob::dispatch($server); - } - }); - } - }); - } - - public function fqdn(): Attribute - { - return Attribute::make( - set: function ($value) { - if ($value) { - $url = Url::fromString($value); - $host = $url->getHost(); - - return $url->getScheme().'://'.$host; - } - } - ); - } - - public function updateCheckFrequency(): Attribute - { - return Attribute::make( - set: function ($value) { - return translate_cron_expression($value); - }, - get: function ($value) { - return translate_cron_expression($value); - } - ); - } - - public function autoUpdateFrequency(): Attribute - { - return Attribute::make( - set: function ($value) { - return translate_cron_expression($value); - }, - get: function ($value) { - return translate_cron_expression($value); - } - ); - } - - public static function get() - { - return InstanceSettings::findOrFail(0); - } - - public function getRecipients($notification) - { - $recipients = data_get($notification, 'emails', null); - if (is_null($recipients) || $recipients === '') { - return []; - } - - return explode(',', $recipients); - } - - public function getTitleDisplayName(): string - { - $instanceName = $this->instance_name; - if (! $instanceName) { - return ''; - } - - return "[{$instanceName}]"; - } - - // public function helperVersion(): Attribute - // { - // return Attribute::make( - // get: function ($value) { - // if (isDev()) { - // return 'latest'; - // } - - // return $value; - // } - // ); - // } -} diff --git a/app/Models/Kubernetes.php b/app/Models/Kubernetes.php deleted file mode 100644 index 174cb5bc86..0000000000 --- a/app/Models/Kubernetes.php +++ /dev/null @@ -1,5 +0,0 @@ -load(['service']); - dispatch(new \App\Jobs\ServerStorageSaveJob($fileVolume)); - }); - } - - protected function isBinary(): Attribute - { - return Attribute::make( - get: function () { - return $this->content === '[binary file]'; - } - ); - } - - public function service() - { - return $this->morphTo('resource'); - } - - public function loadStorageOnServer() - { - $this->load(['service']); - $isService = data_get($this->resource, 'service'); - if ($isService) { - $workdir = $this->resource->service->workdir(); - $server = $this->resource->service->server; - } else { - $workdir = $this->resource->workdir(); - $server = $this->resource->destination->server; - } - $commands = collect([]); - $path = data_get_str($this, 'fs_path'); - if ($path->startsWith('.')) { - $path = $path->after('.'); - $path = $workdir.$path; - } - $isFile = instant_remote_process(["test -f $path && echo OK || echo NOK"], $server); - if ($isFile === 'OK') { - $content = instant_remote_process(["cat $path"], $server, false); - // Check if content contains binary data by looking for null bytes or non-printable characters - if (str_contains($content, "\0") || preg_match('/[\x00-\x08\x0B\x0C\x0E-\x1F]/', $content)) { - $content = '[binary file]'; - } - $this->content = $content; - $this->is_directory = false; - $this->save(); - } - } - - public function deleteStorageOnServer() - { - $this->load(['service']); - $isService = data_get($this->resource, 'service'); - if ($isService) { - $workdir = $this->resource->service->workdir(); - $server = $this->resource->service->server; - } else { - $workdir = $this->resource->workdir(); - $server = $this->resource->destination->server; - } - $commands = collect([]); - $path = data_get_str($this, 'fs_path'); - if ($path->startsWith('.')) { - $path = $path->after('.'); - $path = $workdir.$path; - } - $isFile = instant_remote_process(["test -f $path && echo OK || echo NOK"], $server); - $isDir = instant_remote_process(["test -d $path && echo OK || echo NOK"], $server); - if ($path && $path != '/' && $path != '.' && $path != '..') { - if ($isFile === 'OK') { - $commands->push("rm -rf $path > /dev/null 2>&1 || true"); - } elseif ($isDir === 'OK') { - $commands->push("rm -rf $path > /dev/null 2>&1 || true"); - $commands->push("rmdir $path > /dev/null 2>&1 || true"); - } - } - if ($commands->count() > 0) { - return instant_remote_process($commands, $server); - } - } - - public function saveStorageOnServer() - { - $this->load(['service']); - $isService = data_get($this->resource, 'service'); - if ($isService) { - $workdir = $this->resource->service->workdir(); - $server = $this->resource->service->server; - } else { - $workdir = $this->resource->workdir(); - $server = $this->resource->destination->server; - } - $commands = collect([]); - if ($this->is_directory) { - $commands->push("mkdir -p $this->fs_path > /dev/null 2>&1 || true"); - $commands->push("cd $workdir"); - } - if (str($this->fs_path)->startsWith('.') || str($this->fs_path)->startsWith('/') || str($this->fs_path)->startsWith('~')) { - $parent_dir = str($this->fs_path)->beforeLast('/'); - if ($parent_dir != '') { - $commands->push("mkdir -p $parent_dir > /dev/null 2>&1 || true"); - } - } - $path = data_get_str($this, 'fs_path'); - $content = data_get($this, 'content'); - if ($path->startsWith('.')) { - $path = $path->after('.'); - $path = $workdir.$path; - } - $isFile = instant_remote_process(["test -f $path && echo OK || echo NOK"], $server); - $isDir = instant_remote_process(["test -d $path && echo OK || echo NOK"], $server); - if ($isFile === 'OK' && $this->is_directory) { - $content = instant_remote_process(["cat $path"], $server, false); - $this->is_directory = false; - $this->content = $content; - $this->save(); - FileStorageChanged::dispatch(data_get($server, 'team_id')); - throw new \Exception('The following file is a file on the server, but you are trying to mark it as a directory. Please delete the file on the server or mark it as directory.'); - } elseif ($isDir === 'OK' && ! $this->is_directory) { - if ($path === '/' || $path === '.' || $path === '..' || $path === '' || str($path)->isEmpty() || is_null($path)) { - $this->is_directory = true; - $this->save(); - throw new \Exception('The following file is a directory on the server, but you are trying to mark it as a file.

Please delete the directory on the server or mark it as directory.'); - } - instant_remote_process([ - "rm -fr $path", - "touch $path", - ], $server, false); - FileStorageChanged::dispatch(data_get($server, 'team_id')); - } - if ($isDir === 'NOK' && ! $this->is_directory) { - $chmod = data_get($this, 'chmod'); - $chown = data_get($this, 'chown'); - if ($content) { - $content = base64_encode($content); - $commands->push("echo '$content' | base64 -d | tee $path > /dev/null"); - } else { - $commands->push("touch $path"); - } - $commands->push("chmod +x $path"); - if ($chown) { - $commands->push("chown $chown $path"); - } - if ($chmod) { - $commands->push("chmod $chmod $path"); - } - } elseif ($isDir === 'NOK' && $this->is_directory) { - $commands->push("mkdir -p $path > /dev/null 2>&1 || true"); - } - - return instant_remote_process($commands, $server); - } -} diff --git a/app/Models/LocalPersistentVolume.php b/app/Models/LocalPersistentVolume.php deleted file mode 100644 index 68e476365a..0000000000 --- a/app/Models/LocalPersistentVolume.php +++ /dev/null @@ -1,58 +0,0 @@ -morphTo('resource'); - } - - public function service() - { - return $this->morphTo('resource'); - } - - public function database() - { - return $this->morphTo('resource'); - } - - public function standalone_postgresql() - { - return $this->morphTo('resource'); - } - - protected function name(): Attribute - { - return Attribute::make( - set: fn (string $value) => str($value)->trim()->value, - ); - } - - protected function mountPath(): Attribute - { - return Attribute::make( - set: fn (string $value) => str($value)->trim()->start('/')->value - ); - } - - protected function hostPath(): Attribute - { - return Attribute::make( - set: function (?string $value) { - if ($value) { - return str($value)->trim()->start('/')->value; - } else { - return $value; - } - } - ); - } -} diff --git a/app/Models/OauthSetting.php b/app/Models/OauthSetting.php deleted file mode 100644 index 3d82e89f29..0000000000 --- a/app/Models/OauthSetting.php +++ /dev/null @@ -1,35 +0,0 @@ - empty($value) ? null : Crypt::decryptString($value), - set: fn (?string $value) => empty($value) ? null : Crypt::encryptString($value), - ); - } - - public function couldBeEnabled(): bool - { - switch ($this->provider) { - case 'azure': - return filled($this->client_id) && filled($this->client_secret) && filled($this->redirect_uri) && filled($this->tenant); - case 'authentik': - return filled($this->client_id) && filled($this->client_secret) && filled($this->redirect_uri) && filled($this->base_url); - default: - return filled($this->client_id) && filled($this->client_secret) && filled($this->redirect_uri); - } - } -} diff --git a/app/Models/PersonalAccessToken.php b/app/Models/PersonalAccessToken.php deleted file mode 100644 index 398046a7cd..0000000000 --- a/app/Models/PersonalAccessToken.php +++ /dev/null @@ -1,16 +0,0 @@ - ['type' => 'integer'], - 'uuid' => ['type' => 'string'], - 'name' => ['type' => 'string'], - 'description' => ['type' => 'string'], - 'private_key' => ['type' => 'string', 'format' => 'private-key'], - 'is_git_related' => ['type' => 'boolean'], - 'team_id' => ['type' => 'integer'], - 'created_at' => ['type' => 'string'], - 'updated_at' => ['type' => 'string'], - ], -)] -class PrivateKey extends BaseModel -{ - use WithRateLimiting; - - protected $fillable = [ - 'name', - 'description', - 'private_key', - 'is_git_related', - 'team_id', - 'fingerprint', - ]; - - protected $casts = [ - 'private_key' => 'encrypted', - ]; - - protected $appends = ['public_key']; - - protected static function booted() - { - static::saving(function ($key) { - $key->private_key = formatPrivateKey($key->private_key); - - if (! self::validatePrivateKey($key->private_key)) { - throw ValidationException::withMessages([ - 'private_key' => ['The private key is invalid.'], - ]); - } - - $key->fingerprint = self::generateFingerprint($key->private_key); - if (self::fingerprintExists($key->fingerprint, $key->id)) { - throw ValidationException::withMessages([ - 'private_key' => ['This private key already exists.'], - ]); - } - }); - - static::deleted(function ($key) { - self::deleteFromStorage($key); - }); - } - - public function getPublicKeyAttribute() - { - return self::extractPublicKeyFromPrivate($this->private_key) ?? 'Error loading private key'; - } - - public function getPublicKey() - { - return self::extractPublicKeyFromPrivate($this->private_key) ?? 'Error loading private key'; - } - - public static function ownedByCurrentTeam(array $select = ['*']) - { - $selectArray = collect($select)->concat(['id']); - - return self::whereTeamId(currentTeam()->id)->select($selectArray->all()); - } - - public static function validatePrivateKey($privateKey) - { - try { - PublicKeyLoader::load($privateKey); - - return true; - } catch (\Throwable $e) { - return false; - } - } - - public static function createAndStore(array $data) - { - $privateKey = new self($data); - $privateKey->save(); - $privateKey->storeInFileSystem(); - - return $privateKey; - } - - public static function generateNewKeyPair($type = 'rsa') - { - try { - $instance = new self; - $instance->rateLimit(10); - $name = generate_random_name(); - $description = 'Created by Coolify'; - $keyPair = generateSSHKey($type === 'ed25519' ? 'ed25519' : 'rsa'); - - return [ - 'name' => $name, - 'description' => $description, - 'private_key' => $keyPair['private'], - 'public_key' => $keyPair['public'], - ]; - } catch (\Throwable $e) { - throw new \Exception("Failed to generate new {$type} key: ".$e->getMessage()); - } - } - - public static function extractPublicKeyFromPrivate($privateKey) - { - try { - $key = PublicKeyLoader::load($privateKey); - - return $key->getPublicKey()->toString('OpenSSH', ['comment' => '']); - } catch (\Throwable $e) { - return null; - } - } - - public static function validateAndExtractPublicKey($privateKey) - { - $isValid = self::validatePrivateKey($privateKey); - $publicKey = $isValid ? self::extractPublicKeyFromPrivate($privateKey) : ''; - - return [ - 'isValid' => $isValid, - 'publicKey' => $publicKey, - ]; - } - - public function storeInFileSystem() - { - $filename = "ssh_key@{$this->uuid}"; - Storage::disk('ssh-keys')->put($filename, $this->private_key); - - return "/var/www/html/storage/app/ssh/keys/{$filename}"; - } - - public static function deleteFromStorage(self $privateKey) - { - $filename = "ssh_key@{$privateKey->uuid}"; - Storage::disk('ssh-keys')->delete($filename); - } - - public function getKeyLocation() - { - return "/var/www/html/storage/app/ssh/keys/ssh_key@{$this->uuid}"; - } - - public function updatePrivateKey(array $data) - { - $this->update($data); - $this->storeInFileSystem(); - - return $this; - } - - public function servers() - { - return $this->hasMany(Server::class); - } - - public function applications() - { - return $this->hasMany(Application::class); - } - - public function githubApps() - { - return $this->hasMany(GithubApp::class); - } - - public function gitlabApps() - { - return $this->hasMany(GitlabApp::class); - } - - public function isInUse() - { - return $this->servers()->exists() - || $this->applications()->exists() - || $this->githubApps()->exists() - || $this->gitlabApps()->exists(); - } - - public function safeDelete() - { - if (! $this->isInUse()) { - $this->delete(); - - return true; - } - - return false; - } - - public static function generateFingerprint($privateKey) - { - try { - $key = PublicKeyLoader::load($privateKey); - - return $key->getPublicKey()->getFingerprint('sha256'); - } catch (\Throwable $e) { - return null; - } - } - - public static function fingerprintExists($fingerprint, $excludeId = null) - { - $query = self::query() - ->where('fingerprint', $fingerprint) - ->where('id', '!=', $excludeId); - - if (currentTeam()) { - $query->where('team_id', currentTeam()->id); - } - - return $query->exists(); - } - - public static function cleanupUnusedKeys() - { - self::ownedByCurrentTeam()->each(function ($privateKey) { - $privateKey->safeDelete(); - }); - } -} diff --git a/app/Models/Project.php b/app/Models/Project.php deleted file mode 100644 index 2e4d458593..0000000000 --- a/app/Models/Project.php +++ /dev/null @@ -1,155 +0,0 @@ - ['type' => 'integer'], - 'uuid' => ['type' => 'string'], - 'name' => ['type' => 'string'], - 'description' => ['type' => 'string'], - 'environments' => new OA\Property( - property: 'environments', - type: 'array', - items: new OA\Items(ref: '#/components/schemas/Environment'), - description: 'The environments of the project.' - ), - ] -)] -class Project extends BaseModel -{ - protected $guarded = []; - - public static function ownedByCurrentTeam() - { - return Project::whereTeamId(currentTeam()->id)->orderByRaw('LOWER(name)'); - } - - protected static function booted() - { - static::created(function ($project) { - ProjectSetting::create([ - 'project_id' => $project->id, - ]); - Environment::create([ - 'name' => 'production', - 'project_id' => $project->id, - 'uuid' => (string) new Cuid2, - ]); - }); - static::deleting(function ($project) { - $project->environments()->delete(); - $project->settings()->delete(); - $shared_variables = $project->environment_variables(); - foreach ($shared_variables as $shared_variable) { - $shared_variable->delete(); - } - }); - } - - public function environment_variables() - { - return $this->hasMany(SharedEnvironmentVariable::class); - } - - public function environments() - { - return $this->hasMany(Environment::class); - } - - public function settings() - { - return $this->hasOne(ProjectSetting::class); - } - - public function team() - { - return $this->belongsTo(Team::class); - } - - public function services() - { - return $this->hasManyThrough(Service::class, Environment::class); - } - - public function applications() - { - return $this->hasManyThrough(Application::class, Environment::class); - } - - public function postgresqls() - { - return $this->hasManyThrough(StandalonePostgresql::class, Environment::class); - } - - public function redis() - { - return $this->hasManyThrough(StandaloneRedis::class, Environment::class); - } - - public function keydbs() - { - return $this->hasManyThrough(StandaloneKeydb::class, Environment::class); - } - - public function dragonflies() - { - return $this->hasManyThrough(StandaloneDragonfly::class, Environment::class); - } - - public function clickhouses() - { - return $this->hasManyThrough(StandaloneClickhouse::class, Environment::class); - } - - public function mongodbs() - { - return $this->hasManyThrough(StandaloneMongodb::class, Environment::class); - } - - public function mysqls() - { - return $this->hasManyThrough(StandaloneMysql::class, Environment::class); - } - - public function mariadbs() - { - return $this->hasManyThrough(StandaloneMariadb::class, Environment::class); - } - - public function isEmpty() - { - return $this->applications()->count() == 0 && - $this->redis()->count() == 0 && - $this->postgresqls()->count() == 0 && - $this->mysqls()->count() == 0 && - $this->keydbs()->count() == 0 && - $this->dragonflies()->count() == 0 && - $this->clickhouses()->count() == 0 && - $this->mariadbs()->count() == 0 && - $this->mongodbs()->count() == 0 && - $this->services()->count() == 0; - } - - public function databases() - { - return $this->postgresqls()->get()->merge($this->redis()->get())->merge($this->mongodbs()->get())->merge($this->mysqls()->get())->merge($this->mariadbs()->get())->merge($this->keydbs()->get())->merge($this->dragonflies()->get())->merge($this->clickhouses()->get()); - } - - public function navigateTo() - { - if ($this->environments->count() === 1) { - return route('project.resource.index', [ - 'project_uuid' => $this->uuid, - 'environment_uuid' => $this->environments->first()->uuid, - ]); - } - - return route('project.show', ['project_uuid' => $this->uuid]); - } -} diff --git a/app/Models/ProjectSetting.php b/app/Models/ProjectSetting.php deleted file mode 100644 index d93bea05b6..0000000000 --- a/app/Models/ProjectSetting.php +++ /dev/null @@ -1,15 +0,0 @@ -belongsTo(Project::class); - } -} diff --git a/app/Models/PushoverNotificationSettings.php b/app/Models/PushoverNotificationSettings.php deleted file mode 100644 index e3191dcc34..0000000000 --- a/app/Models/PushoverNotificationSettings.php +++ /dev/null @@ -1,61 +0,0 @@ - 'boolean', - 'pushover_user_key' => 'encrypted', - 'pushover_api_token' => 'encrypted', - - 'deployment_success_pushover_notifications' => 'boolean', - 'deployment_failure_pushover_notifications' => 'boolean', - 'status_change_pushover_notifications' => 'boolean', - 'backup_success_pushover_notifications' => 'boolean', - 'backup_failure_pushover_notifications' => 'boolean', - 'scheduled_task_success_pushover_notifications' => 'boolean', - 'scheduled_task_failure_pushover_notifications' => 'boolean', - 'docker_cleanup_pushover_notifications' => 'boolean', - 'server_disk_usage_pushover_notifications' => 'boolean', - 'server_reachable_pushover_notifications' => 'boolean', - 'server_unreachable_pushover_notifications' => 'boolean', - ]; - - public function team() - { - return $this->belongsTo(Team::class); - } - - public function isEnabled() - { - return $this->pushover_enabled; - } -} diff --git a/app/Models/S3Storage.php b/app/Models/S3Storage.php deleted file mode 100644 index e9d6746502..0000000000 --- a/app/Models/S3Storage.php +++ /dev/null @@ -1,87 +0,0 @@ - 'boolean', - 'key' => 'encrypted', - 'secret' => 'encrypted', - ]; - - public static function ownedByCurrentTeam(array $select = ['*']) - { - $selectArray = collect($select)->concat(['id']); - - return S3Storage::whereTeamId(currentTeam()->id)->select($selectArray->all())->orderBy('name'); - } - - public function isUsable() - { - return $this->is_usable; - } - - public function team() - { - return $this->belongsTo(Team::class); - } - - public function awsUrl() - { - return "{$this->endpoint}/{$this->bucket}"; - } - - public function testConnection(bool $shouldSave = false) - { - try { - $disk = Storage::build([ - 'driver' => 's3', - 'region' => $this['region'], - 'key' => $this['key'], - 'secret' => $this['secret'], - 'bucket' => $this['bucket'], - 'endpoint' => $this['endpoint'], - 'use_path_style_endpoint' => true, - ]); - // Test the connection by listing files with ListObjectsV2 (S3) - $disk->files(); - - $this->unusable_email_sent = false; - $this->is_usable = true; - } catch (\Throwable $e) { - $this->is_usable = false; - if ($this->unusable_email_sent === false && is_transactional_emails_enabled()) { - $mail = new MailMessage; - $mail->subject('Coolify: S3 Storage Connection Error'); - $mail->view('emails.s3-connection-error', ['name' => $this->name, 'reason' => $e->getMessage(), 'url' => route('storage.show', ['storage_uuid' => $this->uuid])]); - - // Load the team with its members and their roles explicitly - $team = $this->team()->with(['members' => function ($query) { - $query->withPivot('role'); - }])->first(); - - // Get admins directly from the pivot relationship for this specific team - $users = $team->members()->wherePivotIn('role', ['admin', 'owner'])->get(['users.id', 'users.email']); - foreach ($users as $user) { - send_user_an_email($mail, $user->email); - } - $this->unusable_email_sent = true; - } - - throw $e; - } finally { - if ($shouldSave) { - $this->save(); - } - } - } -} diff --git a/app/Models/ScheduledDatabaseBackup.php b/app/Models/ScheduledDatabaseBackup.php deleted file mode 100644 index 473fc7b4bb..0000000000 --- a/app/Models/ScheduledDatabaseBackup.php +++ /dev/null @@ -1,56 +0,0 @@ -morphTo(); - } - - public function latest_log(): HasOne - { - return $this->hasOne(ScheduledDatabaseBackupExecution::class)->latest(); - } - - public function executions(): HasMany - { - // Last execution first - return $this->hasMany(ScheduledDatabaseBackupExecution::class)->orderBy('created_at', 'desc'); - } - - public function s3() - { - return $this->belongsTo(S3Storage::class, 's3_storage_id'); - } - - public function get_last_days_backup_status($days = 7) - { - return $this->hasMany(ScheduledDatabaseBackupExecution::class)->where('created_at', '>=', now()->subDays($days))->get(); - } - - public function server() - { - if ($this->database) { - if ($this->database instanceof ServiceDatabase) { - $destination = data_get($this->database->service, 'destination'); - $server = data_get($destination, 'server'); - } else { - $destination = data_get($this->database, 'destination'); - $server = data_get($destination, 'server'); - } - if ($server) { - return $server; - } - } - - return null; - } -} diff --git a/app/Models/ScheduledDatabaseBackupExecution.php b/app/Models/ScheduledDatabaseBackupExecution.php deleted file mode 100644 index b06dd5b45d..0000000000 --- a/app/Models/ScheduledDatabaseBackupExecution.php +++ /dev/null @@ -1,15 +0,0 @@ -belongsTo(ScheduledDatabaseBackup::class); - } -} diff --git a/app/Models/ScheduledTask.php b/app/Models/ScheduledTask.php deleted file mode 100644 index 264a04d1f7..0000000000 --- a/app/Models/ScheduledTask.php +++ /dev/null @@ -1,51 +0,0 @@ -belongsTo(Service::class); - } - - public function application() - { - return $this->belongsTo(Application::class); - } - - public function latest_log(): HasOne - { - return $this->hasOne(ScheduledTaskExecution::class)->latest(); - } - - public function executions(): HasMany - { - // Last execution first - return $this->hasMany(ScheduledTaskExecution::class)->orderBy('created_at', 'desc'); - } - - public function server() - { - if ($this->application) { - if ($this->application->destination && $this->application->destination->server) { - return $this->application->destination->server; - } - } elseif ($this->service) { - if ($this->service->destination && $this->service->destination->server) { - return $this->service->destination->server; - } - } elseif ($this->database) { - if ($this->database->destination && $this->database->destination->server) { - return $this->database->destination->server; - } - } - - return null; - } -} diff --git a/app/Models/ScheduledTaskExecution.php b/app/Models/ScheduledTaskExecution.php deleted file mode 100644 index de13fefb05..0000000000 --- a/app/Models/ScheduledTaskExecution.php +++ /dev/null @@ -1,15 +0,0 @@ -belongsTo(ScheduledTask::class); - } -} diff --git a/app/Models/Server.php b/app/Models/Server.php deleted file mode 100644 index 828500c40b..0000000000 --- a/app/Models/Server.php +++ /dev/null @@ -1,1333 +0,0 @@ - ['type' => 'integer', 'description' => 'The server ID.'], - 'uuid' => ['type' => 'string', 'description' => 'The server UUID.'], - 'name' => ['type' => 'string', 'description' => 'The server name.'], - 'description' => ['type' => 'string', 'description' => 'The server description.'], - 'ip' => ['type' => 'string', 'description' => 'The IP address.'], - 'user' => ['type' => 'string', 'description' => 'The user.'], - 'port' => ['type' => 'integer', 'description' => 'The port number.'], - 'proxy' => ['type' => 'object', 'description' => 'The proxy configuration.'], - 'proxy_type' => ['type' => 'string', 'enum' => ['traefik', 'caddy', 'none'], 'description' => 'The proxy type.'], - 'high_disk_usage_notification_sent' => ['type' => 'boolean', 'description' => 'The flag to indicate if the high disk usage notification has been sent.'], - 'unreachable_notification_sent' => ['type' => 'boolean', 'description' => 'The flag to indicate if the unreachable notification has been sent.'], - 'unreachable_count' => ['type' => 'integer', 'description' => 'The unreachable count for your server.'], - 'validation_logs' => ['type' => 'string', 'description' => 'The validation logs.'], - 'log_drain_notification_sent' => ['type' => 'boolean', 'description' => 'The flag to indicate if the log drain notification has been sent.'], - 'swarm_cluster' => ['type' => 'string', 'description' => 'The swarm cluster configuration.'], - 'settings' => ['$ref' => '#/components/schemas/ServerSetting'], - ] -)] - -class Server extends BaseModel -{ - use HasFactory, SchemalessAttributesTrait, SoftDeletes; - - public static $batch_counter = 0; - - protected $appends = ['is_coolify_host']; - - protected static function booted() - { - static::saving(function ($server) { - $payload = []; - if ($server->user) { - $payload['user'] = str($server->user)->trim(); - } - if ($server->ip) { - $payload['ip'] = str($server->ip)->trim(); - } - $server->forceFill($payload); - }); - static::saved(function ($server) { - if ($server->privateKey?->isDirty()) { - refresh_server_connection($server->privateKey); - } - }); - static::created(function ($server) { - ServerSetting::create([ - 'server_id' => $server->id, - ]); - if ($server->id === 0) { - if ($server->isSwarm()) { - SwarmDocker::create([ - 'id' => 0, - 'name' => 'coolify', - 'network' => 'coolify-overlay', - 'server_id' => $server->id, - ]); - } else { - StandaloneDocker::create([ - 'id' => 0, - 'name' => 'coolify', - 'network' => 'coolify', - 'server_id' => $server->id, - ]); - } - } else { - if ($server->isSwarm()) { - SwarmDocker::create([ - 'name' => 'coolify-overlay', - 'network' => 'coolify-overlay', - 'server_id' => $server->id, - ]); - } else { - $standaloneDocker = new StandaloneDocker([ - 'name' => 'coolify', - 'uuid' => (string) new Cuid2, - 'network' => 'coolify', - 'server_id' => $server->id, - ]); - $standaloneDocker->saveQuietly(); - } - } - if (! isset($server->proxy->redirect_enabled)) { - $server->proxy->redirect_enabled = true; - } - }); - static::retrieved(function ($server) { - if (! isset($server->proxy->redirect_enabled)) { - $server->proxy->redirect_enabled = true; - } - }); - - static::forceDeleting(function ($server) { - $server->destinations()->each(function ($destination) { - $destination->delete(); - }); - $server->settings()->delete(); - }); - } - - protected $casts = [ - 'proxy' => SchemalessAttributes::class, - 'logdrain_axiom_api_key' => 'encrypted', - 'logdrain_newrelic_license_key' => 'encrypted', - 'delete_unused_volumes' => 'boolean', - 'delete_unused_networks' => 'boolean', - 'unreachable_notification_sent' => 'boolean', - 'is_build_server' => 'boolean', - 'force_disabled' => 'boolean', - ]; - - protected $schemalessAttributes = [ - 'proxy', - ]; - - protected $fillable = [ - 'name', - 'ip', - 'port', - 'user', - 'description', - 'private_key_id', - 'team_id', - ]; - - protected $guarded = []; - - public function type() - { - return 'server'; - } - - protected function isCoolifyHost(): Attribute - { - return Attribute::make( - get: function () { - return $this->id === 0; - } - ); - } - - public static function isReachable() - { - return Server::ownedByCurrentTeam()->whereRelation('settings', 'is_reachable', true); - } - - public static function ownedByCurrentTeam(array $select = ['*']) - { - $teamId = currentTeam()->id; - $selectArray = collect($select)->concat(['id']); - - return Server::whereTeamId($teamId)->with('settings', 'swarmDockers', 'standaloneDockers')->select($selectArray->all())->orderBy('name'); - } - - public static function isUsable() - { - return Server::ownedByCurrentTeam()->whereRelation('settings', 'is_reachable', true)->whereRelation('settings', 'is_usable', true)->whereRelation('settings', 'is_swarm_worker', false)->whereRelation('settings', 'is_build_server', false)->whereRelation('settings', 'force_disabled', false); - } - - public static function destinationsByServer(string $server_id) - { - $server = Server::ownedByCurrentTeam()->get()->where('id', $server_id)->firstOrFail(); - $standaloneDocker = collect($server->standaloneDockers->all()); - $swarmDocker = collect($server->swarmDockers->all()); - - return $standaloneDocker->concat($swarmDocker); - } - - public function settings() - { - return $this->hasOne(ServerSetting::class); - } - - public function dockerCleanupExecutions() - { - return $this->hasMany(DockerCleanupExecution::class); - } - - public function proxySet() - { - return $this->proxyType() && $this->proxyType() !== 'NONE' && $this->isFunctional() && ! $this->isSwarmWorker() && ! $this->settings->is_build_server; - } - - public function setupDefaultRedirect() - { - $banner = - "# This file is generated by Coolify, do not edit it manually.\n". - "# Disable the default redirect to customize (only if you know what are you doing).\n\n"; - $dynamic_conf_path = $this->proxyPath().'/dynamic'; - $proxy_type = $this->proxyType(); - $redirect_enabled = $this->proxy->redirect_enabled ?? true; - $redirect_url = $this->proxy->redirect_url; - if (isDev()) { - if ($proxy_type === ProxyTypes::CADDY->value) { - $dynamic_conf_path = '/data/coolify/proxy/caddy/dynamic'; - } - } - if ($proxy_type === ProxyTypes::TRAEFIK->value) { - $default_redirect_file = "$dynamic_conf_path/default_redirect_503.yaml"; - } elseif ($proxy_type === ProxyTypes::CADDY->value) { - $default_redirect_file = "$dynamic_conf_path/default_redirect_503.caddy"; - } - - instant_remote_process([ - "mkdir -p $dynamic_conf_path", - "rm -f $dynamic_conf_path/default_redirect_404.yaml", - "rm -f $dynamic_conf_path/default_redirect_404.caddy", - ], $this); - - if ($redirect_enabled === false) { - instant_remote_process(["rm -f $default_redirect_file"], $this); - } else { - if ($proxy_type === ProxyTypes::CADDY->value) { - if (filled($redirect_url)) { - $conf = ":80, :443 { - redir $redirect_url -}"; - } else { - $conf = ':80, :443 { - respond 503 -}'; - } - } elseif ($proxy_type === ProxyTypes::TRAEFIK->value) { - $dynamic_conf = [ - 'http' => [ - 'routers' => [ - 'catchall' => [ - 'entryPoints' => [ - 0 => 'http', - 1 => 'https', - ], - 'service' => 'noop', - 'rule' => 'PathPrefix(`/`)', - 'tls' => [ - 'certResolver' => 'letsencrypt', - ], - 'priority' => -1000, - ], - ], - 'services' => [ - 'noop' => [ - 'loadBalancer' => [ - 'servers' => [], - ], - ], - ], - ], - ]; - if (filled($redirect_url)) { - $dynamic_conf['http']['routers']['catchall']['middlewares'] = [ - 0 => 'redirect-regexp', - ]; - - $dynamic_conf['http']['services']['noop']['loadBalancer']['servers'][0] = [ - 'url' => '', - ]; - $dynamic_conf['http']['middlewares'] = [ - 'redirect-regexp' => [ - 'redirectRegex' => [ - 'regex' => '(.*)', - 'replacement' => $redirect_url, - 'permanent' => false, - ], - ], - ]; - } - $conf = Yaml::dump($dynamic_conf, 12, 2); - } - $conf = $banner.$conf; - $base64 = base64_encode($conf); - instant_remote_process([ - "echo '$base64' | base64 -d | tee $default_redirect_file > /dev/null", - ], $this); - } - - if ($proxy_type === 'CADDY') { - $this->reloadCaddy(); - } - } - - public function setupDynamicProxyConfiguration() - { - $settings = instanceSettings(); - $dynamic_config_path = $this->proxyPath().'/dynamic'; - if ($this->proxyType() === ProxyTypes::TRAEFIK->value) { - $file = "$dynamic_config_path/coolify.yaml"; - if (empty($settings->fqdn) || (isCloud() && $this->id !== 0) || ! $this->isLocalhost()) { - instant_remote_process([ - "rm -f $file", - ], $this); - } else { - $url = Url::fromString($settings->fqdn); - $host = $url->getHost(); - $schema = $url->getScheme(); - $traefik_dynamic_conf = [ - 'http' => [ - 'middlewares' => [ - 'redirect-to-https' => [ - 'redirectscheme' => [ - 'scheme' => 'https', - ], - ], - 'gzip' => [ - 'compress' => true, - ], - ], - 'routers' => [ - 'coolify-http' => [ - 'middlewares' => [ - 0 => 'gzip', - ], - 'entryPoints' => [ - 0 => 'http', - ], - 'service' => 'coolify', - 'rule' => "Host(`{$host}`)", - ], - 'coolify-realtime-ws' => [ - 'entryPoints' => [ - 0 => 'http', - ], - 'service' => 'coolify-realtime', - 'rule' => "Host(`{$host}`) && PathPrefix(`/app`)", - ], - 'coolify-terminal-ws' => [ - 'entryPoints' => [ - 0 => 'http', - ], - 'service' => 'coolify-terminal', - 'rule' => "Host(`{$host}`) && PathPrefix(`/terminal/ws`)", - ], - ], - 'services' => [ - 'coolify' => [ - 'loadBalancer' => [ - 'servers' => [ - 0 => [ - 'url' => 'http://coolify:8080', - ], - ], - ], - ], - 'coolify-realtime' => [ - 'loadBalancer' => [ - 'servers' => [ - 0 => [ - 'url' => 'http://coolify-realtime:6001', - ], - ], - ], - ], - 'coolify-terminal' => [ - 'loadBalancer' => [ - 'servers' => [ - 0 => [ - 'url' => 'http://coolify-realtime:6002', - ], - ], - ], - ], - ], - ], - ]; - - if ($schema === 'https') { - $traefik_dynamic_conf['http']['routers']['coolify-http']['middlewares'] = [ - 0 => 'redirect-to-https', - ]; - - $traefik_dynamic_conf['http']['routers']['coolify-https'] = [ - 'entryPoints' => [ - 0 => 'https', - ], - 'service' => 'coolify', - 'rule' => "Host(`{$host}`)", - 'tls' => [ - 'certresolver' => 'letsencrypt', - ], - ]; - $traefik_dynamic_conf['http']['routers']['coolify-realtime-wss'] = [ - 'entryPoints' => [ - 0 => 'https', - ], - 'service' => 'coolify-realtime', - 'rule' => "Host(`{$host}`) && PathPrefix(`/app`)", - 'tls' => [ - 'certresolver' => 'letsencrypt', - ], - ]; - $traefik_dynamic_conf['http']['routers']['coolify-terminal-wss'] = [ - 'entryPoints' => [ - 0 => 'https', - ], - 'service' => 'coolify-terminal', - 'rule' => "Host(`{$host}`) && PathPrefix(`/terminal/ws`)", - 'tls' => [ - 'certresolver' => 'letsencrypt', - ], - ]; - } - $yaml = Yaml::dump($traefik_dynamic_conf, 12, 2); - $yaml = - "# This file is automatically generated by Coolify.\n". - "# Do not edit it manually (only if you know what are you doing).\n\n". - $yaml; - - $base64 = base64_encode($yaml); - instant_remote_process([ - "mkdir -p $dynamic_config_path", - "echo '$base64' | base64 -d | tee $file > /dev/null", - ], $this); - } - } elseif ($this->proxyType() === 'CADDY') { - $file = "$dynamic_config_path/coolify.caddy"; - if (empty($settings->fqdn) || (isCloud() && $this->id !== 0) || ! $this->isLocalhost()) { - instant_remote_process([ - "rm -f $file", - ], $this); - $this->reloadCaddy(); - } else { - $url = Url::fromString($settings->fqdn); - $host = $url->getHost(); - $schema = $url->getScheme(); - $caddy_file = " -$schema://$host { - handle /app/* { - reverse_proxy coolify-realtime:6001 - } - handle /terminal/ws { - reverse_proxy coolify-realtime:6002 - } - reverse_proxy coolify:8080 -}"; - $base64 = base64_encode($caddy_file); - instant_remote_process([ - "echo '$base64' | base64 -d | tee $file > /dev/null", - ], $this); - $this->reloadCaddy(); - } - } - } - - public function reloadCaddy() - { - return instant_remote_process([ - 'docker exec coolify-proxy caddy reload --config /config/caddy/Caddyfile.autosave', - ], $this); - } - - public function proxyPath() - { - $base_path = config('constants.coolify.base_config_path'); - $proxyType = $this->proxyType(); - $proxy_path = "$base_path/proxy"; - // TODO: should use /traefik for already exisiting configurations? - // Should move everything except /caddy and /nginx to /traefik - // The code needs to be modified as well, so maybe it does not worth it - if ($proxyType === ProxyTypes::TRAEFIK->value) { - // Do nothing - } elseif ($proxyType === ProxyTypes::CADDY->value) { - if (isDev()) { - $proxy_path = '/var/lib/docker/volumes/coolify_dev_coolify_data/_data/proxy/caddy'; - } else { - $proxy_path = $proxy_path.'/caddy'; - } - } elseif ($proxyType === ProxyTypes::NGINX->value) { - if (isDev()) { - $proxy_path = '/var/lib/docker/volumes/coolify_dev_coolify_data/_data/proxy/nginx'; - } else { - $proxy_path = $proxy_path.'/nginx'; - } - } - - return $proxy_path; - } - - public function proxyType() - { - return data_get($this->proxy, 'type'); - } - - public function scopeWithProxy(): Builder - { - return $this->proxy->modelScope(); - } - - public function isLocalhost() - { - return $this->ip === 'host.docker.internal' || $this->id === 0; - } - - public static function buildServers($teamId) - { - return Server::whereTeamId($teamId)->whereRelation('settings', 'is_reachable', true)->whereRelation('settings', 'is_build_server', true); - } - - public function isForceDisabled() - { - return $this->settings->force_disabled; - } - - public function forceEnableServer() - { - $this->settings->force_disabled = false; - $this->settings->save(); - } - - public function forceDisableServer() - { - $this->settings->force_disabled = true; - $this->settings->save(); - $sshKeyFileLocation = "id.root@{$this->uuid}"; - Storage::disk('ssh-keys')->delete($sshKeyFileLocation); - Storage::disk('ssh-mux')->delete($this->muxFilename()); - } - - public function sentinelHeartbeat(bool $isReset = false) - { - $this->sentinel_updated_at = $isReset ? now()->subMinutes(6000) : now(); - $this->save(); - } - - /** - * Get the wait time for Sentinel to push before performing an SSH check. - * - * @return int The wait time in seconds. - */ - public function waitBeforeDoingSshCheck(): int - { - $wait = $this->settings->sentinel_push_interval_seconds * 3; - if ($wait < 120) { - $wait = 120; - } - - return $wait; - } - - public function isSentinelLive() - { - return Carbon::parse($this->sentinel_updated_at)->isAfter(now()->subSeconds($this->waitBeforeDoingSshCheck())); - } - - public function isSentinelEnabled() - { - return ($this->isMetricsEnabled() || $this->isServerApiEnabled()) && ! $this->isBuildServer(); - } - - public function isMetricsEnabled() - { - return $this->settings->is_metrics_enabled; - } - - public function isServerApiEnabled() - { - return $this->settings->is_sentinel_enabled; - } - - public function checkSentinel() - { - CheckAndStartSentinelJob::dispatch($this); - } - - public function getCpuMetrics(int $mins = 5) - { - if ($this->isMetricsEnabled()) { - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $cpu = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$this->settings->sentinel_token}\" http://localhost:8888/api/cpu/history?from=$from'"], $this, false); - if (str($cpu)->contains('error')) { - $error = json_decode($cpu, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $cpu = json_decode($cpu, true); - - return collect($cpu)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['percent']]; - }); - } - } - - public function getMemoryMetrics(int $mins = 5) - { - if ($this->isMetricsEnabled()) { - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $memory = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$this->settings->sentinel_token}\" http://localhost:8888/api/memory/history?from=$from'"], $this, false); - if (str($memory)->contains('error')) { - $error = json_decode($memory, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $memory = json_decode($memory, true); - $parsedCollection = collect($memory)->map(function ($metric) { - $usedPercent = $metric['usedPercent'] ?? 0.0; - - return [(int) $metric['time'], (float) $usedPercent]; - }); - - return $parsedCollection->toArray(); - } - } - - public function getDiskUsage(): ?string - { - return instant_remote_process(['df / --output=pcent | tr -cd 0-9'], $this, false); - // return instant_remote_process(["df /| tail -1 | awk '{ print $5}' | sed 's/%//g'"], $this, false); - } - - public function definedResources() - { - $applications = $this->applications(); - $databases = $this->databases(); - $services = $this->services(); - - return $applications->concat($databases)->concat($services->get()); - } - - public function stopUnmanaged($id) - { - return instant_remote_process(["docker stop -t 0 $id"], $this); - } - - public function restartUnmanaged($id) - { - return instant_remote_process(["docker restart $id"], $this); - } - - public function startUnmanaged($id) - { - return instant_remote_process(["docker start $id"], $this); - } - - public function getContainers() - { - $containers = collect([]); - $containerReplicates = collect([]); - if ($this->isSwarm()) { - $containers = instant_remote_process_with_timeout(["docker service inspect $(docker service ls -q) --format '{{json .}}'"], $this, false); - $containers = format_docker_command_output_to_json($containers); - $containerReplicates = instant_remote_process_with_timeout(["docker service ls --format '{{json .}}'"], $this, false); - if ($containerReplicates) { - $containerReplicates = format_docker_command_output_to_json($containerReplicates); - foreach ($containerReplicates as $containerReplica) { - $name = data_get($containerReplica, 'Name'); - $containers = $containers->map(function ($container) use ($name, $containerReplica) { - if (data_get($container, 'Spec.Name') === $name) { - $replicas = data_get($containerReplica, 'Replicas'); - $running = str($replicas)->explode('/')[0]; - $total = str($replicas)->explode('/')[1]; - if ($running === $total) { - data_set($container, 'State.Status', 'running'); - data_set($container, 'State.Health.Status', 'healthy'); - } else { - data_set($container, 'State.Status', 'starting'); - data_set($container, 'State.Health.Status', 'unhealthy'); - } - } - - return $container; - }); - } - } - } else { - $containers = instant_remote_process_with_timeout(["docker container inspect $(docker container ls -aq) --format '{{json .}}'"], $this, false); - $containers = format_docker_command_output_to_json($containers); - $containerReplicates = collect([]); - } - - return [ - 'containers' => collect($containers) ?? collect([]), - 'containerReplicates' => collect($containerReplicates) ?? collect([]), - ]; - } - - public function loadAllContainers(): Collection - { - if ($this->isFunctional()) { - $containers = instant_remote_process(["docker ps -a --format '{{json .}}'"], $this); - $containers = format_docker_command_output_to_json($containers); - - return collect($containers); - } - - return collect([]); - } - - public function loadUnmanagedContainers(): Collection - { - if ($this->isFunctional()) { - $containers = instant_remote_process(["docker ps -a --format '{{json .}}'"], $this); - $containers = format_docker_command_output_to_json($containers); - $containers = $containers->map(function ($container) { - $labels = data_get($container, 'Labels'); - if (! str($labels)->contains('coolify.managed')) { - return $container; - } - - return null; - }); - $containers = $containers->filter(); - - return collect($containers); - } else { - return collect([]); - } - } - - public function hasDefinedResources() - { - $applications = $this->applications()->count() > 0; - $databases = $this->databases()->count() > 0; - $services = $this->services()->count() > 0; - if ($applications || $databases || $services) { - return true; - } - - return false; - } - - public function databases() - { - return $this->destinations()->map(function ($standaloneDocker) { - $postgresqls = data_get($standaloneDocker, 'postgresqls', collect([])); - $redis = data_get($standaloneDocker, 'redis', collect([])); - $mongodbs = data_get($standaloneDocker, 'mongodbs', collect([])); - $mysqls = data_get($standaloneDocker, 'mysqls', collect([])); - $mariadbs = data_get($standaloneDocker, 'mariadbs', collect([])); - $keydbs = data_get($standaloneDocker, 'keydbs', collect([])); - $dragonflies = data_get($standaloneDocker, 'dragonflies', collect([])); - $clickhouses = data_get($standaloneDocker, 'clickhouses', collect([])); - - return $postgresqls->concat($redis)->concat($mongodbs)->concat($mysqls)->concat($mariadbs)->concat($keydbs)->concat($dragonflies)->concat($clickhouses); - })->flatten()->filter(function ($item) { - return data_get($item, 'name') !== 'coolify-db'; - }); - } - - public function applications() - { - $applications = $this->destinations()->map(function ($standaloneDocker) { - return $standaloneDocker->applications; - })->flatten(); - $additionalApplicationIds = DB::table('additional_destinations')->where('server_id', $this->id)->get('application_id'); - $additionalApplicationIds = collect($additionalApplicationIds)->map(function ($item) { - return $item->application_id; - }); - Application::whereIn('id', $additionalApplicationIds)->get()->each(function ($application) use ($applications) { - $applications->push($application); - }); - - return $applications; - } - - public function dockerComposeBasedApplications() - { - return $this->applications()->filter(function ($application) { - return data_get($application, 'build_pack') === 'dockercompose'; - }); - } - - public function dockerComposeBasedPreviewDeployments() - { - return $this->previews()->filter(function ($preview) { - $applicationId = data_get($preview, 'application_id'); - $application = Application::find($applicationId); - if (! $application) { - return false; - } - - return data_get($application, 'build_pack') === 'dockercompose'; - }); - } - - public function services() - { - return $this->hasMany(Service::class); - } - - public function port(): Attribute - { - return Attribute::make( - get: function ($value) { - return (int) preg_replace('/[^0-9]/', '', $value); - } - ); - } - - public function user(): Attribute - { - return Attribute::make( - get: function ($value) { - return preg_replace('/[^A-Za-z0-9\-_]/', '', $value); - } - ); - } - - public function ip(): Attribute - { - return Attribute::make( - get: function ($value) { - return preg_replace('/[^0-9a-zA-Z.:%-]/', '', $value); - } - ); - } - - public function getIp(): Attribute - { - return Attribute::make( - get: function () { - if (isDev()) { - return '127.0.0.1'; - } - if ($this->isLocalhost()) { - return base_ip(); - } - - return $this->ip; - } - ); - } - - public function previews() - { - return $this->destinations()->map(function ($standaloneDocker) { - return $standaloneDocker->applications->map(function ($application) { - return $application->previews; - })->flatten(); - })->flatten(); - } - - public function destinations() - { - $standalone_docker = $this->hasMany(StandaloneDocker::class)->get(); - $swarm_docker = $this->hasMany(SwarmDocker::class)->get(); - - return $standalone_docker->concat($swarm_docker); - } - - public function standaloneDockers() - { - return $this->hasMany(StandaloneDocker::class); - } - - public function swarmDockers() - { - return $this->hasMany(SwarmDocker::class); - } - - public function privateKey() - { - return $this->belongsTo(PrivateKey::class); - } - - public function muxFilename() - { - return $this->uuid; - } - - public function team() - { - return $this->belongsTo(Team::class); - } - - public function isProxyShouldRun() - { - // TODO: Do we need "|| $this->proxy->force_stop" here? - if ($this->proxyType() === ProxyTypes::NONE->value || $this->isBuildServer()) { - return false; - } - - return true; - } - - public function skipServer() - { - if ($this->ip === '1.2.3.4') { - return true; - } - if ($this->settings->force_disabled === true) { - return true; - } - - return false; - } - - public function isFunctional() - { - $isFunctional = $this->settings->is_reachable && $this->settings->is_usable && $this->settings->force_disabled === false && $this->ip !== '1.2.3.4'; - - if ($isFunctional === false) { - Storage::disk('ssh-mux')->delete($this->muxFilename()); - } - - return $isFunctional; - } - - public function isLogDrainEnabled() - { - return $this->settings->is_logdrain_newrelic_enabled || $this->settings->is_logdrain_highlight_enabled || $this->settings->is_logdrain_axiom_enabled || $this->settings->is_logdrain_custom_enabled; - } - - public function validateOS(): bool|Stringable - { - $os_release = instant_remote_process(['cat /etc/os-release'], $this); - $releaseLines = collect(explode("\n", $os_release)); - $collectedData = collect([]); - foreach ($releaseLines as $line) { - $item = str($line)->trim(); - $collectedData->put($item->before('=')->value(), $item->after('=')->lower()->replace('"', '')->value()); - } - $ID = data_get($collectedData, 'ID'); - // $ID_LIKE = data_get($collectedData, 'ID_LIKE'); - // $VERSION_ID = data_get($collectedData, 'VERSION_ID'); - $supported = collect(SUPPORTED_OS)->filter(function ($supportedOs) use ($ID) { - if (str($supportedOs)->contains($ID)) { - return str($ID); - } - }); - if ($supported->count() === 1) { - return str($supported->first()); - } else { - return false; - } - } - - public function isSwarm() - { - return data_get($this, 'settings.is_swarm_manager') || data_get($this, 'settings.is_swarm_worker'); - } - - public function isSwarmManager() - { - return data_get($this, 'settings.is_swarm_manager'); - } - - public function isSwarmWorker() - { - return data_get($this, 'settings.is_swarm_worker'); - } - - public function serverStatus(): bool - { - if ($this->status() === false) { - return false; - } - if ($this->isFunctional() === false) { - return false; - } - - return true; - } - - public function status(): bool - { - ['uptime' => $uptime] = $this->validateConnection(); - if ($uptime === false) { - foreach ($this->applications() as $application) { - $application->status = 'exited'; - $application->save(); - } - foreach ($this->databases() as $database) { - $database->status = 'exited'; - $database->save(); - } - foreach ($this->services() as $service) { - $apps = $service->applications()->get(); - $dbs = $service->databases()->get(); - foreach ($apps as $app) { - $app->status = 'exited'; - $app->save(); - } - foreach ($dbs as $db) { - $db->status = 'exited'; - $db->save(); - } - } - - return false; - } - - return true; - } - - public function isReachableChanged() - { - $this->refresh(); - $unreachableNotificationSent = (bool) $this->unreachable_notification_sent; - $isReachable = (bool) $this->settings->is_reachable; - - Log::debug('Server reachability check', [ - 'server_id' => $this->id, - 'is_reachable' => $isReachable, - 'notification_sent' => $unreachableNotificationSent, - 'unreachable_count' => $this->unreachable_count, - ]); - - if ($isReachable === true) { - $this->unreachable_count = 0; - $this->save(); - - if ($unreachableNotificationSent === true) { - Log::debug('Server is now reachable, sending notification', [ - 'server_id' => $this->id, - ]); - $this->sendReachableNotification(); - } - - return; - } - - $this->increment('unreachable_count'); - Log::debug('Incremented unreachable count', [ - 'server_id' => $this->id, - 'new_count' => $this->unreachable_count, - ]); - - if ($this->unreachable_count === 1) { - $this->settings->is_reachable = true; - $this->settings->save(); - Log::debug('First unreachable attempt, marking as reachable', [ - 'server_id' => $this->id, - ]); - - return; - } - - if ($this->unreachable_count >= 2 && ! $unreachableNotificationSent) { - $failedChecks = 0; - for ($i = 0; $i < 3; $i++) { - $status = $this->serverStatus(); - Log::debug('Additional reachability check', [ - 'server_id' => $this->id, - 'attempt' => $i + 1, - 'status' => $status, - ]); - sleep(5); - if (! $status) { - $failedChecks++; - } - } - - if ($failedChecks === 3 && ! $unreachableNotificationSent) { - Log::debug('Server confirmed unreachable after 3 attempts, sending notification', [ - 'server_id' => $this->id, - ]); - $this->sendUnreachableNotification(); - } - } - } - - public function sendReachableNotification() - { - $this->unreachable_notification_sent = false; - $this->save(); - $this->refresh(); - $this->team->notify(new Reachable($this)); - } - - public function sendUnreachableNotification() - { - $this->unreachable_notification_sent = true; - $this->save(); - $this->refresh(); - $this->team->notify(new Unreachable($this)); - } - - public function validateConnection(bool $justCheckingNewKey = false) - { - config()->set('constants.ssh.mux_enabled', false); - - if ($this->skipServer()) { - return ['uptime' => false, 'error' => 'Server skipped.']; - } - try { - instant_remote_process(['ls /'], $this); - if ($this->settings->is_reachable === false) { - $this->settings->is_reachable = true; - $this->settings->save(); - ServerReachabilityChanged::dispatch($this); - } - - return ['uptime' => true, 'error' => null]; - } catch (\Throwable $e) { - if ($justCheckingNewKey) { - return ['uptime' => false, 'error' => 'This key is not valid for this server.']; - } - if ($this->settings->is_reachable === true) { - $this->settings->is_reachable = false; - $this->settings->save(); - ServerReachabilityChanged::dispatch($this); - } - - return ['uptime' => false, 'error' => $e->getMessage()]; - } - } - - public function installDocker() - { - return InstallDocker::run($this); - } - - public function validateDockerEngine($throwError = false) - { - $dockerBinary = instant_remote_process(['command -v docker'], $this, false, no_sudo: true); - if (is_null($dockerBinary)) { - $this->settings->is_usable = false; - $this->settings->save(); - if ($throwError) { - throw new \Exception('Server is not usable. Docker Engine is not installed.'); - } - - return false; - } - try { - instant_remote_process(['docker version'], $this); - } catch (\Throwable $e) { - $this->settings->is_usable = false; - $this->settings->save(); - if ($throwError) { - throw new \Exception('Server is not usable. Docker Engine is not running.'); - } - - return false; - } - $this->settings->is_usable = true; - $this->settings->save(); - $this->validateCoolifyNetwork(isSwarm: false, isBuildServer: $this->settings->is_build_server); - - return true; - } - - public function validateDockerCompose($throwError = false) - { - $dockerCompose = instant_remote_process(['docker compose version'], $this, false); - if (is_null($dockerCompose)) { - $this->settings->is_usable = false; - $this->settings->save(); - if ($throwError) { - throw new \Exception('Server is not usable. Docker Compose is not installed.'); - } - - return false; - } - $this->settings->is_usable = true; - $this->settings->save(); - - return true; - } - - public function validateDockerSwarm() - { - $swarmStatus = instant_remote_process(['docker info|grep -i swarm'], $this, false); - $swarmStatus = str($swarmStatus)->trim()->after(':')->trim(); - if ($swarmStatus === 'inactive') { - throw new \Exception('Docker Swarm is not initiated. Please join the server to a swarm before continuing.'); - - return false; - } - $this->settings->is_usable = true; - $this->settings->save(); - $this->validateCoolifyNetwork(isSwarm: true); - - return true; - } - - public function validateDockerEngineVersion() - { - $dockerVersionRaw = instant_remote_process(['docker version --format json'], $this, false); - $dockerVersionJson = json_decode($dockerVersionRaw, true); - $dockerVersion = data_get($dockerVersionJson, 'Server.Version', '0.0.0'); - $dockerVersion = checkMinimumDockerEngineVersion($dockerVersion); - if (is_null($dockerVersion)) { - $this->settings->is_usable = false; - $this->settings->save(); - - return false; - } - $this->settings->is_reachable = true; - $this->settings->is_usable = true; - $this->settings->save(); - ServerReachabilityChanged::dispatch($this); - - return true; - } - - public function validateCoolifyNetwork($isSwarm = false, $isBuildServer = false) - { - if ($isBuildServer) { - return; - } - if ($isSwarm) { - return instant_remote_process(['docker network create --attachable --driver overlay coolify-overlay >/dev/null 2>&1 || true'], $this, false); - } else { - return instant_remote_process(['docker network create coolify --attachable >/dev/null 2>&1 || true'], $this, false); - } - } - - public function isNonRoot() - { - if ($this->user instanceof Stringable) { - return $this->user->value() !== 'root'; - } - - return $this->user !== 'root'; - } - - public function isBuildServer() - { - return $this->settings->is_build_server; - } - - public static function createWithPrivateKey(array $data, PrivateKey $privateKey) - { - $server = new self($data); - $server->privateKey()->associate($privateKey); - $server->save(); - - return $server; - } - - public function updateWithPrivateKey(array $data, ?PrivateKey $privateKey = null) - { - $this->update($data); - if ($privateKey) { - $this->privateKey()->associate($privateKey); - $this->save(); - } - - return $this; - } - - public function storageCheck(): ?string - { - $commands = [ - 'df / --output=pcent | tr -cd 0-9', - ]; - - return instant_remote_process($commands, $this, false); - } - - public function isIpv6(): bool - { - return str($this->ip)->contains(':'); - } - - public function restartSentinel(bool $async = true) - { - try { - if ($async) { - StartSentinel::dispatch($this, true); - } else { - StartSentinel::run($this, true); - } - } catch (\Throwable $e) { - return handleError($e); - } - } - - public function url() - { - return base_url().'/server/'.$this->uuid; - } - - public function restartContainer(string $containerName) - { - return instant_remote_process(['docker restart '.$containerName], $this, false); - } - - public function changeProxy(string $proxyType, bool $async = true) - { - $validProxyTypes = collect(ProxyTypes::cases())->map(function ($proxyType) { - return str($proxyType->value)->lower(); - }); - if ($validProxyTypes->contains(str($proxyType)->lower())) { - $this->proxy->set('type', str($proxyType)->upper()); - $this->proxy->set('status', 'exited'); - $this->save(); - if ($this->proxySet()) { - if ($async) { - StartProxy::dispatch($this); - } else { - StartProxy::run($this); - } - } - } else { - throw new \Exception('Invalid proxy type.'); - } - } - - public function isEmpty() - { - return $this->applications()->count() == 0 && - $this->databases()->count() == 0 && - $this->services()->count() == 0; - } -} diff --git a/app/Models/ServerSetting.php b/app/Models/ServerSetting.php deleted file mode 100644 index f4b776cca0..0000000000 --- a/app/Models/ServerSetting.php +++ /dev/null @@ -1,151 +0,0 @@ - ['type' => 'integer'], - 'concurrent_builds' => ['type' => 'integer'], - 'dynamic_timeout' => ['type' => 'integer'], - 'force_disabled' => ['type' => 'boolean'], - 'force_server_cleanup' => ['type' => 'boolean'], - 'is_build_server' => ['type' => 'boolean'], - 'is_cloudflare_tunnel' => ['type' => 'boolean'], - 'is_jump_server' => ['type' => 'boolean'], - 'is_logdrain_axiom_enabled' => ['type' => 'boolean'], - 'is_logdrain_custom_enabled' => ['type' => 'boolean'], - 'is_logdrain_highlight_enabled' => ['type' => 'boolean'], - 'is_logdrain_newrelic_enabled' => ['type' => 'boolean'], - 'is_metrics_enabled' => ['type' => 'boolean'], - 'is_reachable' => ['type' => 'boolean'], - 'is_sentinel_enabled' => ['type' => 'boolean'], - 'is_swarm_manager' => ['type' => 'boolean'], - 'is_swarm_worker' => ['type' => 'boolean'], - 'is_usable' => ['type' => 'boolean'], - 'logdrain_axiom_api_key' => ['type' => 'string'], - 'logdrain_axiom_dataset_name' => ['type' => 'string'], - 'logdrain_custom_config' => ['type' => 'string'], - 'logdrain_custom_config_parser' => ['type' => 'string'], - 'logdrain_highlight_project_id' => ['type' => 'string'], - 'logdrain_newrelic_base_uri' => ['type' => 'string'], - 'logdrain_newrelic_license_key' => ['type' => 'string'], - 'sentinel_metrics_history_days' => ['type' => 'integer'], - 'sentinel_metrics_refresh_rate_seconds' => ['type' => 'integer'], - 'sentinel_token' => ['type' => 'string'], - 'docker_cleanup_frequency' => ['type' => 'string'], - 'docker_cleanup_threshold' => ['type' => 'integer'], - 'server_id' => ['type' => 'integer'], - 'wildcard_domain' => ['type' => 'string'], - 'created_at' => ['type' => 'string'], - 'updated_at' => ['type' => 'string'], - 'delete_unused_volumes' => ['type' => 'boolean', 'description' => 'The flag to indicate if the unused volumes should be deleted.'], - 'delete_unused_networks' => ['type' => 'boolean', 'description' => 'The flag to indicate if the unused networks should be deleted.'], - ] -)] -class ServerSetting extends Model -{ - protected $guarded = []; - - protected $casts = [ - 'force_docker_cleanup' => 'boolean', - 'docker_cleanup_threshold' => 'integer', - 'sentinel_token' => 'encrypted', - 'is_reachable' => 'boolean', - 'is_usable' => 'boolean', - ]; - - protected static function booted() - { - static::creating(function ($setting) { - try { - if (str($setting->sentinel_token)->isEmpty()) { - $setting->generateSentinelToken(save: false, ignoreEvent: true); - } - if (str($setting->sentinel_custom_url)->isEmpty()) { - $setting->generateSentinelUrl(save: false, ignoreEvent: true); - } - } catch (\Throwable $e) { - Log::error('Error creating server setting: '.$e->getMessage()); - } - }); - static::updated(function ($settings) { - if ( - $settings->isDirty('sentinel_token') || - $settings->isDirty('sentinel_custom_url') || - $settings->isDirty('sentinel_metrics_refresh_rate_seconds') || - $settings->isDirty('sentinel_metrics_history_days') || - $settings->isDirty('sentinel_push_interval_seconds') - ) { - $settings->server->restartSentinel(); - } - }); - } - - public function generateSentinelToken(bool $save = true, bool $ignoreEvent = false) - { - $data = [ - 'server_uuid' => $this->server->uuid, - ]; - $token = json_encode($data); - $encrypted = encrypt($token); - $this->sentinel_token = $encrypted; - if ($save) { - if ($ignoreEvent) { - $this->saveQuietly(); - } else { - $this->save(); - } - } - - return $token; - } - - public function generateSentinelUrl(bool $save = true, bool $ignoreEvent = false) - { - $domain = null; - $settings = InstanceSettings::get(); - if ($this->server->isLocalhost()) { - $domain = 'http://host.docker.internal:8000'; - } elseif ($settings->fqdn) { - $domain = $settings->fqdn; - } elseif ($settings->public_ipv4) { - $domain = 'http://'.$settings->public_ipv4.':8000'; - } elseif ($settings->public_ipv6) { - $domain = 'http://'.$settings->public_ipv6.':8000'; - } - $this->sentinel_custom_url = $domain; - if ($save) { - if ($ignoreEvent) { - $this->saveQuietly(); - } else { - $this->save(); - } - } - - return $domain; - } - - public function server() - { - return $this->belongsTo(Server::class); - } - - public function dockerCleanupFrequency(): Attribute - { - return Attribute::make( - set: function ($value) { - return translate_cron_expression($value); - }, - get: function ($value) { - return translate_cron_expression($value); - } - ); - } -} diff --git a/app/Models/Service.php b/app/Models/Service.php deleted file mode 100644 index 25e6b92ea5..0000000000 --- a/app/Models/Service.php +++ /dev/null @@ -1,1355 +0,0 @@ - ['type' => 'integer', 'description' => 'The unique identifier of the service. Only used for database identification.'], - 'uuid' => ['type' => 'string', 'description' => 'The unique identifier of the service.'], - 'name' => ['type' => 'string', 'description' => 'The name of the service.'], - 'environment_id' => ['type' => 'integer', 'description' => 'The unique identifier of the environment where the service is attached to.'], - 'server_id' => ['type' => 'integer', 'description' => 'The unique identifier of the server where the service is running.'], - 'description' => ['type' => 'string', 'description' => 'The description of the service.'], - 'docker_compose_raw' => ['type' => 'string', 'description' => 'The raw docker-compose.yml file of the service.'], - 'docker_compose' => ['type' => 'string', 'description' => 'The docker-compose.yml file that is parsed and modified by Coolify.'], - 'destination_type' => ['type' => 'string', 'description' => 'Destination type.'], - 'destination_id' => ['type' => 'integer', 'description' => 'The unique identifier of the destination where the service is running.'], - 'connect_to_docker_network' => ['type' => 'boolean', 'description' => 'The flag to connect the service to the predefined Docker network.'], - 'is_container_label_escape_enabled' => ['type' => 'boolean', 'description' => 'The flag to enable the container label escape.'], - 'is_container_label_readonly_enabled' => ['type' => 'boolean', 'description' => 'The flag to enable the container label readonly.'], - 'config_hash' => ['type' => 'string', 'description' => 'The hash of the service configuration.'], - 'service_type' => ['type' => 'string', 'description' => 'The type of the service.'], - 'created_at' => ['type' => 'string', 'description' => 'The date and time when the service was created.'], - 'updated_at' => ['type' => 'string', 'description' => 'The date and time when the service was last updated.'], - 'deleted_at' => ['type' => 'string', 'description' => 'The date and time when the service was deleted.'], - ], -)] -class Service extends BaseModel -{ - use HasFactory, SoftDeletes; - - private static $parserVersion = '4'; - - protected $guarded = []; - - protected $appends = ['server_status', 'status']; - - protected static function booted() - { - static::created(function ($service) { - $service->compose_parsing_version = self::$parserVersion; - $service->save(); - }); - } - - public function isConfigurationChanged(bool $save = false) - { - $domains = $this->applications()->get()->pluck('fqdn')->sort()->toArray(); - $domains = implode(',', $domains); - - $applicationImages = $this->applications()->get()->pluck('image')->sort(); - $databaseImages = $this->databases()->get()->pluck('image')->sort(); - $images = $applicationImages->merge($databaseImages); - $images = implode(',', $images->toArray()); - - $applicationStorages = $this->applications()->get()->pluck('persistentStorages')->flatten()->sortBy('id'); - $databaseStorages = $this->databases()->get()->pluck('persistentStorages')->flatten()->sortBy('id'); - $storages = $applicationStorages->merge($databaseStorages)->implode('updated_at'); - - $newConfigHash = $images.$domains.$images.$storages; - $newConfigHash .= json_encode($this->environment_variables()->get('value')->sort()); - $newConfigHash = md5($newConfigHash); - $oldConfigHash = data_get($this, 'config_hash'); - if ($oldConfigHash === null) { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - if ($oldConfigHash === $newConfigHash) { - return false; - } else { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - } - - protected function serverStatus(): Attribute - { - return Attribute::make( - get: function () { - return $this->server->isFunctional(); - } - ); - } - - public function isRunning() - { - return (bool) str($this->status)->contains('running'); - } - - public function isExited() - { - return (bool) str($this->status)->contains('exited'); - } - - public function type() - { - return 'service'; - } - - public function project() - { - return data_get($this, 'environment.project'); - } - - public function team() - { - return data_get($this, 'environment.project.team'); - } - - public function tags() - { - return $this->morphToMany(Tag::class, 'taggable'); - } - - public static function ownedByCurrentTeam() - { - return Service::whereRelation('environment.project.team', 'id', currentTeam()->id)->orderBy('name'); - } - - public function getContainersToStop(): array - { - $containersToStop = []; - $applications = $this->applications()->get(); - foreach ($applications as $application) { - $containersToStop[] = "{$application->name}-{$this->uuid}"; - } - $dbs = $this->databases()->get(); - foreach ($dbs as $db) { - $containersToStop[] = "{$db->name}-{$this->uuid}"; - } - - return $containersToStop; - } - - public function stopContainers(array $containerNames, $server, int $timeout = 300) - { - $processes = []; - foreach ($containerNames as $containerName) { - $processes[$containerName] = $this->stopContainer($containerName, $timeout); - } - - $startTime = time(); - while (count($processes) > 0) { - $finishedProcesses = array_filter($processes, function ($process) { - return ! $process->running(); - }); - foreach (array_keys($finishedProcesses) as $containerName) { - unset($processes[$containerName]); - $this->removeContainer($containerName, $server); - } - - if (time() - $startTime >= $timeout) { - $this->forceStopRemainingContainers(array_keys($processes), $server); - break; - } - - usleep(100000); - } - } - - public function stopContainer(string $containerName, int $timeout): InvokedProcess - { - return Process::timeout($timeout)->start("docker stop --time=$timeout $containerName"); - } - - public function removeContainer(string $containerName, $server) - { - instant_remote_process(command: ["docker rm -f $containerName"], server: $server, throwError: false); - } - - public function forceStopRemainingContainers(array $containerNames, $server) - { - foreach ($containerNames as $containerName) { - instant_remote_process(command: ["docker kill $containerName"], server: $server, throwError: false); - $this->removeContainer($containerName, $server); - } - } - - public function delete_configurations() - { - $server = data_get($this, 'destination.server'); - $workdir = $this->workdir(); - if (str($workdir)->endsWith($this->uuid)) { - instant_remote_process(['rm -rf '.$this->workdir()], $server, false); - } - } - - public function delete_connected_networks($uuid) - { - $server = data_get($this, 'destination.server'); - instant_remote_process(["docker network disconnect {$uuid} coolify-proxy"], $server, false); - instant_remote_process(["docker network rm {$uuid}"], $server, false); - } - - public function getStatusAttribute() - { - $applications = $this->applications; - $databases = $this->databases; - - $complexStatus = null; - $complexHealth = null; - - foreach ($applications as $application) { - if ($application->exclude_from_status) { - continue; - } - $status = str($application->status)->before('(')->trim(); - $health = str($application->status)->between('(', ')')->trim(); - if ($complexStatus === 'degraded') { - continue; - } - if ($status->startsWith('running')) { - if ($complexStatus === 'exited') { - $complexStatus = 'degraded'; - } else { - $complexStatus = 'running'; - } - } elseif ($status->startsWith('restarting')) { - $complexStatus = 'degraded'; - } elseif ($status->startsWith('exited')) { - $complexStatus = 'exited'; - } - if ($health->value() === 'healthy') { - if ($complexHealth === 'unhealthy') { - continue; - } - $complexHealth = 'healthy'; - } else { - $complexHealth = 'unhealthy'; - } - } - foreach ($databases as $database) { - if ($database->exclude_from_status) { - continue; - } - $status = str($database->status)->before('(')->trim(); - $health = str($database->status)->between('(', ')')->trim(); - if ($complexStatus === 'degraded') { - continue; - } - if ($status->startsWith('running')) { - if ($complexStatus === 'exited') { - $complexStatus = 'degraded'; - } else { - $complexStatus = 'running'; - } - } elseif ($status->startsWith('restarting')) { - $complexStatus = 'degraded'; - } elseif ($status->startsWith('exited')) { - $complexStatus = 'exited'; - } - if ($health->value() === 'healthy') { - if ($complexHealth === 'unhealthy') { - continue; - } - $complexHealth = 'healthy'; - } else { - $complexHealth = 'unhealthy'; - } - } - - return "{$complexStatus}:{$complexHealth}"; - } - - public function extraFields() - { - $fields = collect([]); - $applications = $this->applications()->get(); - foreach ($applications as $application) { - $image = str($application->image)->before(':'); - if ($image->isEmpty()) { - continue; - } - switch ($image) { - case $image->contains('castopod'): - $data = collect([]); - $disable_https = $this->environment_variables()->where('key', 'CP_DISABLE_HTTPS')->first(); - if ($disable_https) { - $data = $data->merge([ - 'Disable HTTPS' => [ - 'key' => 'CP_DISABLE_HTTPS', - 'value' => data_get($disable_https, 'value'), - 'rules' => 'required', - 'customHelper' => 'If you want to use https, set this to 0. Variable name: CP_DISABLE_HTTPS', - ], - ]); - } - $fields->put('Castopod', $data->toArray()); - break; - case $image->contains('label-studio'): - $data = collect([]); - $username = $this->environment_variables()->where('key', 'LABEL_STUDIO_USERNAME')->first(); - $password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_LABELSTUDIO')->first(); - if ($username) { - $data = $data->merge([ - 'Username' => [ - 'key' => 'LABEL_STUDIO_USERNAME', - 'value' => data_get($username, 'value'), - 'rules' => 'required', - ], - ]); - } - if ($password) { - $data = $data->merge([ - 'Password' => [ - 'key' => data_get($password, 'key'), - 'value' => data_get($password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - $fields->put('Label Studio', $data->toArray()); - break; - case $image->contains('litellm'): - $data = collect([]); - $username = $this->environment_variables()->where('key', 'SERVICE_USER_UI')->first(); - $password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_UI')->first(); - if ($username) { - $data = $data->merge([ - 'Username' => [ - 'key' => data_get($username, 'key'), - 'value' => data_get($username, 'value'), - 'rules' => 'required', - ], - ]); - } - if ($password) { - $data = $data->merge([ - 'Password' => [ - 'key' => data_get($password, 'key'), - 'value' => data_get($password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - $fields->put('Litellm', $data->toArray()); - break; - case $image->contains('langfuse'): - $data = collect([]); - $email = $this->environment_variables()->where('key', 'LANGFUSE_INIT_USER_EMAIL')->first(); - if ($email) { - $data = $data->merge([ - 'Admin Email' => [ - 'key' => data_get($email, 'key'), - 'value' => data_get($email, 'value'), - 'rules' => 'required|email', - ], - ]); - } - $password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_LANGFUSE')->first(); - if ($password) { - $data = $data->merge([ - 'Admin Password' => [ - 'key' => data_get($password, 'key'), - 'value' => data_get($password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - $fields->put('Langfuse', $data->toArray()); - break; - case $image->contains('invoiceninja'): - $data = collect([]); - $email = $this->environment_variables()->where('key', 'IN_USER_EMAIL')->first(); - $data = $data->merge([ - 'Email' => [ - 'key' => data_get($email, 'key'), - 'value' => data_get($email, 'value'), - 'rules' => 'required|email', - ], - ]); - $password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_INVOICENINJAUSER')->first(); - $data = $data->merge([ - 'Password' => [ - 'key' => data_get($password, 'key'), - 'value' => data_get($password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - $fields->put('Invoice Ninja', $data->toArray()); - break; - case $image->contains('argilla'): - $data = collect([]); - $api_key = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_APIKEY')->first(); - $data = $data->merge([ - 'API Key' => [ - 'key' => data_get($api_key, 'key'), - 'value' => data_get($api_key, 'value'), - 'isPassword' => true, - 'rules' => 'required', - ], - ]); - $data = $data->merge([ - 'API Key' => [ - 'key' => data_get($api_key, 'key'), - 'value' => data_get($api_key, 'value'), - 'isPassword' => true, - 'rules' => 'required', - ], - ]); - $username = $this->environment_variables()->where('key', 'ARGILLA_USERNAME')->first(); - $data = $data->merge([ - 'Username' => [ - 'key' => data_get($username, 'key'), - 'value' => data_get($username, 'value'), - 'rules' => 'required', - ], - ]); - $password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_ARGILLA')->first(); - $data = $data->merge([ - 'Password' => [ - 'key' => data_get($password, 'key'), - 'value' => data_get($password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - $fields->put('Argilla', $data->toArray()); - break; - case $image->contains('rabbitmq'): - $data = collect([]); - $host_port = $this->environment_variables()->where('key', 'PORT')->first(); - $username = $this->environment_variables()->where('key', 'SERVICE_USER_RABBITMQ')->first(); - $password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_RABBITMQ')->first(); - if ($host_port) { - $data = $data->merge([ - 'Host Port Binding' => [ - 'key' => data_get($host_port, 'key'), - 'value' => data_get($host_port, 'value'), - 'rules' => 'required', - ], - ]); - } - if ($username) { - $data = $data->merge([ - 'Username' => [ - 'key' => data_get($username, 'key'), - 'value' => data_get($username, 'value'), - 'rules' => 'required', - ], - ]); - } - if ($password) { - $data = $data->merge([ - 'Password' => [ - 'key' => data_get($password, 'key'), - 'value' => data_get($password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - $fields->put('RabbitMQ', $data->toArray()); - break; - case $image->contains('tolgee'): - $data = collect([]); - $admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_TOLGEE')->first(); - $data = $data->merge([ - 'Admin User' => [ - 'key' => 'TOLGEE_AUTHENTICATION_INITIAL_USERNAME', - 'value' => 'admin', - 'readonly' => true, - 'rules' => 'required', - ], - ]); - if ($admin_password) { - $data = $data->merge([ - 'Admin Password' => [ - 'key' => data_get($admin_password, 'key'), - 'value' => data_get($admin_password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - $fields->put('Tolgee', $data->toArray()); - break; - case $image->contains('logto'): - $data = collect([]); - $logto_endpoint = $this->environment_variables()->where('key', 'LOGTO_ENDPOINT')->first(); - $logto_admin_endpoint = $this->environment_variables()->where('key', 'LOGTO_ADMIN_ENDPOINT')->first(); - if ($logto_endpoint) { - $data = $data->merge([ - 'Endpoint' => [ - 'key' => data_get($logto_endpoint, 'key'), - 'value' => data_get($logto_endpoint, 'value'), - 'rules' => 'required|url', - ], - ]); - } - if ($logto_admin_endpoint) { - $data = $data->merge([ - 'Admin Endpoint' => [ - 'key' => data_get($logto_admin_endpoint, 'key'), - 'value' => data_get($logto_admin_endpoint, 'value'), - 'rules' => 'required|url', - ], - ]); - } - $fields->put('Logto', $data->toArray()); - break; - case $image->contains('unleash-server'): - $data = collect([]); - $admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_UNLEASH')->first(); - $data = $data->merge([ - 'Admin User' => [ - 'key' => 'SERVICE_USER_UNLEASH', - 'value' => 'admin', - 'readonly' => true, - 'rules' => 'required', - ], - ]); - if ($admin_password) { - $data = $data->merge([ - 'Admin Password' => [ - 'key' => data_get($admin_password, 'key'), - 'value' => data_get($admin_password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - $fields->put('Unleash', $data->toArray()); - break; - case $image->contains('grafana'): - $data = collect([]); - $admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_GRAFANA')->first(); - $data = $data->merge([ - 'Admin User' => [ - 'key' => 'GF_SECURITY_ADMIN_USER', - 'value' => 'admin', - 'readonly' => true, - 'rules' => 'required', - ], - ]); - if ($admin_password) { - $data = $data->merge([ - 'Admin Password' => [ - 'key' => data_get($admin_password, 'key'), - 'value' => data_get($admin_password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - $fields->put('Grafana', $data->toArray()); - break; - case $image->contains('directus'): - $data = collect([]); - $admin_email = $this->environment_variables()->where('key', 'ADMIN_EMAIL')->first(); - $admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_ADMIN')->first(); - - if ($admin_email) { - $data = $data->merge([ - 'Admin Email' => [ - 'key' => data_get($admin_email, 'key'), - 'value' => data_get($admin_email, 'value'), - 'rules' => 'required|email', - ], - ]); - } - if ($admin_password) { - $data = $data->merge([ - 'Admin Password' => [ - 'key' => data_get($admin_password, 'key'), - 'value' => data_get($admin_password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - $fields->put('Directus', $data->toArray()); - break; - case $image->contains('kong'): - $data = collect([]); - $dashboard_user = $this->environment_variables()->where('key', 'SERVICE_USER_ADMIN')->first(); - $dashboard_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_ADMIN')->first(); - if ($dashboard_user) { - $data = $data->merge([ - 'Dashboard User' => [ - 'key' => data_get($dashboard_user, 'key'), - 'value' => data_get($dashboard_user, 'value'), - 'rules' => 'required', - ], - ]); - } - if ($dashboard_password) { - $data = $data->merge([ - 'Dashboard Password' => [ - 'key' => data_get($dashboard_password, 'key'), - 'value' => data_get($dashboard_password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - $fields->put('Supabase', $data->toArray()); - case $image->contains('minio'): - $data = collect([]); - $console_url = $this->environment_variables()->where('key', 'MINIO_BROWSER_REDIRECT_URL')->first(); - $s3_api_url = $this->environment_variables()->where('key', 'MINIO_SERVER_URL')->first(); - $admin_user = $this->environment_variables()->where('key', 'SERVICE_USER_MINIO')->first(); - if (is_null($admin_user)) { - $admin_user = $this->environment_variables()->where('key', 'MINIO_ROOT_USER')->first(); - } - $admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_MINIO')->first(); - if (is_null($admin_password)) { - $admin_password = $this->environment_variables()->where('key', 'MINIO_ROOT_PASSWORD')->first(); - } - - if ($console_url) { - $data = $data->merge([ - 'Console URL' => [ - 'key' => data_get($console_url, 'key'), - 'value' => data_get($console_url, 'value'), - 'rules' => 'required|url', - ], - ]); - } - if ($s3_api_url) { - $data = $data->merge([ - 'S3 API URL' => [ - 'key' => data_get($s3_api_url, 'key'), - 'value' => data_get($s3_api_url, 'value'), - 'rules' => 'required|url', - ], - ]); - } - if ($admin_user) { - $data = $data->merge([ - 'Admin User' => [ - 'key' => data_get($admin_user, 'key'), - 'value' => data_get($admin_user, 'value'), - 'rules' => 'required', - ], - ]); - } - if ($admin_password) { - $data = $data->merge([ - 'Admin Password' => [ - 'key' => data_get($admin_password, 'key'), - 'value' => data_get($admin_password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - - $fields->put('MinIO', $data->toArray()); - break; - case $image->contains('weblate'): - $data = collect([]); - $admin_email = $this->environment_variables()->where('key', 'WEBLATE_ADMIN_EMAIL')->first(); - $admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_WEBLATE')->first(); - - if ($admin_email) { - $data = $data->merge([ - 'Admin Email' => [ - 'key' => data_get($admin_email, 'key'), - 'value' => data_get($admin_email, 'value'), - 'rules' => 'required|email', - ], - ]); - } - if ($admin_password) { - $data = $data->merge([ - 'Admin Password' => [ - 'key' => data_get($admin_password, 'key'), - 'value' => data_get($admin_password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - $fields->put('Weblate', $data->toArray()); - break; - case $image->contains('meilisearch'): - $data = collect([]); - $SERVICE_PASSWORD_MEILISEARCH = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_MEILISEARCH')->first(); - if ($SERVICE_PASSWORD_MEILISEARCH) { - $data = $data->merge([ - 'API Key' => [ - 'key' => data_get($SERVICE_PASSWORD_MEILISEARCH, 'key'), - 'value' => data_get($SERVICE_PASSWORD_MEILISEARCH, 'value'), - 'isPassword' => true, - ], - ]); - } - $fields->put('Meilisearch', $data->toArray()); - break; - case $image->contains('ghost'): - $data = collect([]); - $MAIL_OPTIONS_AUTH_PASS = $this->environment_variables()->where('key', 'MAIL_OPTIONS_AUTH_PASS')->first(); - $MAIL_OPTIONS_AUTH_USER = $this->environment_variables()->where('key', 'MAIL_OPTIONS_AUTH_USER')->first(); - $MAIL_OPTIONS_SECURE = $this->environment_variables()->where('key', 'MAIL_OPTIONS_SECURE')->first(); - $MAIL_OPTIONS_PORT = $this->environment_variables()->where('key', 'MAIL_OPTIONS_PORT')->first(); - $MAIL_OPTIONS_SERVICE = $this->environment_variables()->where('key', 'MAIL_OPTIONS_SERVICE')->first(); - $MAIL_OPTIONS_HOST = $this->environment_variables()->where('key', 'MAIL_OPTIONS_HOST')->first(); - if ($MAIL_OPTIONS_AUTH_PASS) { - $data = $data->merge([ - 'Mail Password' => [ - 'key' => data_get($MAIL_OPTIONS_AUTH_PASS, 'key'), - 'value' => data_get($MAIL_OPTIONS_AUTH_PASS, 'value'), - 'isPassword' => true, - ], - ]); - } - if ($MAIL_OPTIONS_AUTH_USER) { - $data = $data->merge([ - 'Mail User' => [ - 'key' => data_get($MAIL_OPTIONS_AUTH_USER, 'key'), - 'value' => data_get($MAIL_OPTIONS_AUTH_USER, 'value'), - ], - ]); - } - if ($MAIL_OPTIONS_SECURE) { - $data = $data->merge([ - 'Mail Secure' => [ - 'key' => data_get($MAIL_OPTIONS_SECURE, 'key'), - 'value' => data_get($MAIL_OPTIONS_SECURE, 'value'), - ], - ]); - } - if ($MAIL_OPTIONS_PORT) { - $data = $data->merge([ - 'Mail Port' => [ - 'key' => data_get($MAIL_OPTIONS_PORT, 'key'), - 'value' => data_get($MAIL_OPTIONS_PORT, 'value'), - ], - ]); - } - if ($MAIL_OPTIONS_SERVICE) { - $data = $data->merge([ - 'Mail Service' => [ - 'key' => data_get($MAIL_OPTIONS_SERVICE, 'key'), - 'value' => data_get($MAIL_OPTIONS_SERVICE, 'value'), - ], - ]); - } - if ($MAIL_OPTIONS_HOST) { - $data = $data->merge([ - 'Mail Host' => [ - 'key' => data_get($MAIL_OPTIONS_HOST, 'key'), - 'value' => data_get($MAIL_OPTIONS_HOST, 'value'), - ], - ]); - } - - $fields->put('Ghost', $data->toArray()); - break; - - case $image->contains('vaultwarden'): - $data = collect([]); - - $DATABASE_URL = $this->environment_variables()->where('key', 'DATABASE_URL')->first(); - $ADMIN_TOKEN = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_64_ADMIN')->first(); - $SIGNUP_ALLOWED = $this->environment_variables()->where('key', 'SIGNUP_ALLOWED')->first(); - $PUSH_ENABLED = $this->environment_variables()->where('key', 'PUSH_ENABLED')->first(); - $PUSH_INSTALLATION_ID = $this->environment_variables()->where('key', 'PUSH_SERVICE_ID')->first(); - $PUSH_INSTALLATION_KEY = $this->environment_variables()->where('key', 'PUSH_SERVICE_KEY')->first(); - - if ($DATABASE_URL) { - $data = $data->merge([ - 'Database URL' => [ - 'key' => data_get($DATABASE_URL, 'key'), - 'value' => data_get($DATABASE_URL, 'value'), - ], - ]); - } - if ($ADMIN_TOKEN) { - $data = $data->merge([ - 'Admin Password' => [ - 'key' => data_get($ADMIN_TOKEN, 'key'), - 'value' => data_get($ADMIN_TOKEN, 'value'), - 'isPassword' => true, - ], - ]); - } - if ($SIGNUP_ALLOWED) { - $data = $data->merge([ - 'Signup Allowed' => [ - 'key' => data_get($SIGNUP_ALLOWED, 'key'), - 'value' => data_get($SIGNUP_ALLOWED, 'value'), - 'rules' => 'required|string|in:true,false', - ], - ]); - } - - if ($PUSH_ENABLED) { - $data = $data->merge([ - 'Push Enabled' => [ - 'key' => data_get($PUSH_ENABLED, 'key'), - 'value' => data_get($PUSH_ENABLED, 'value'), - 'rules' => 'required|string|in:true,false', - ], - ]); - } - if ($PUSH_INSTALLATION_ID) { - $data = $data->merge([ - 'Push Installation ID' => [ - 'key' => data_get($PUSH_INSTALLATION_ID, 'key'), - 'value' => data_get($PUSH_INSTALLATION_ID, 'value'), - ], - ]); - } - if ($PUSH_INSTALLATION_KEY) { - $data = $data->merge([ - 'Push Installation Key' => [ - 'key' => data_get($PUSH_INSTALLATION_KEY, 'key'), - 'value' => data_get($PUSH_INSTALLATION_KEY, 'value'), - 'isPassword' => true, - ], - ]); - } - - $fields->put('Vaultwarden', $data); - break; - case $image->contains('gitlab/gitlab'): - $password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_GITLAB')->first(); - $data = collect([]); - if ($password) { - $data = $data->merge([ - 'Root Password' => [ - 'key' => data_get($password, 'key'), - 'value' => data_get($password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - $data = $data->merge([ - 'Root User' => [ - 'key' => 'GITLAB_ROOT_USER', - 'value' => 'root', - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - - $fields->put('GitLab', $data->toArray()); - break; - case $image->contains('code-server'): - $data = collect([]); - $password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_64_PASSWORDCODESERVER')->first(); - if ($password) { - $data = $data->merge([ - 'Password' => [ - 'key' => data_get($password, 'key'), - 'value' => data_get($password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - $sudoPassword = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_SUDOCODESERVER')->first(); - if ($sudoPassword) { - $data = $data->merge([ - 'Sudo Password' => [ - 'key' => data_get($sudoPassword, 'key'), - 'value' => data_get($sudoPassword, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - $fields->put('Code Server', $data->toArray()); - break; - case $image->contains('elestio/strapi'): - $data = collect([]); - $license = $this->environment_variables()->where('key', 'STRAPI_LICENSE')->first(); - if ($license) { - $data = $data->merge([ - 'License' => [ - 'key' => data_get($license, 'key'), - 'value' => data_get($license, 'value'), - ], - ]); - } - $nodeEnv = $this->environment_variables()->where('key', 'NODE_ENV')->first(); - if ($nodeEnv) { - $data = $data->merge([ - 'Node Environment' => [ - 'key' => data_get($nodeEnv, 'key'), - 'value' => data_get($nodeEnv, 'value'), - ], - ]); - } - - $fields->put('Strapi', $data->toArray()); - break; - default: - $data = collect([]); - $admin_user = $this->environment_variables()->where('key', 'SERVICE_USER_ADMIN')->first(); - // Chaskiq - $admin_email = $this->environment_variables()->where('key', 'ADMIN_EMAIL')->first(); - - $admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_ADMIN')->first(); - if ($admin_user) { - $data = $data->merge([ - 'User' => [ - 'key' => data_get($admin_user, 'key'), - 'value' => data_get($admin_user, 'value', 'admin'), - 'readonly' => true, - 'rules' => 'required', - ], - ]); - } - if ($admin_password) { - $data = $data->merge([ - 'Password' => [ - 'key' => data_get($admin_password, 'key'), - 'value' => data_get($admin_password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - if ($admin_email) { - $data = $data->merge([ - 'Email' => [ - 'key' => data_get($admin_email, 'key'), - 'value' => data_get($admin_email, 'value'), - 'rules' => 'required|email', - ], - ]); - } - $fields->put('Admin', $data->toArray()); - break; - } - } - $databases = $this->databases()->get(); - - foreach ($databases as $database) { - $image = str($database->image)->before(':'); - if ($image->isEmpty()) { - continue; - } - switch ($image) { - case $image->contains('postgres'): - $userVariables = ['SERVICE_USER_POSTGRES', 'SERVICE_USER_POSTGRESQL']; - $passwordVariables = ['SERVICE_PASSWORD_POSTGRES', 'SERVICE_PASSWORD_POSTGRESQL']; - $dbNameVariables = ['POSTGRESQL_DATABASE', 'POSTGRES_DB']; - $postgres_user = $this->environment_variables()->whereIn('key', $userVariables)->first(); - $postgres_password = $this->environment_variables()->whereIn('key', $passwordVariables)->first(); - $postgres_db_name = $this->environment_variables()->whereIn('key', $dbNameVariables)->first(); - $data = collect([]); - if ($postgres_user) { - $data = $data->merge([ - 'User' => [ - 'key' => data_get($postgres_user, 'key'), - 'value' => data_get($postgres_user, 'value'), - 'rules' => 'required', - ], - ]); - } - if ($postgres_password) { - $data = $data->merge([ - 'Password' => [ - 'key' => data_get($postgres_password, 'key'), - 'value' => data_get($postgres_password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - if ($postgres_db_name) { - $data = $data->merge([ - 'Database Name' => [ - 'key' => data_get($postgres_db_name, 'key'), - 'value' => data_get($postgres_db_name, 'value'), - 'rules' => 'required', - ], - ]); - } - $fields->put('PostgreSQL', $data->toArray()); - break; - case $image->contains('mysql'): - $userVariables = ['SERVICE_USER_MYSQL', 'SERVICE_USER_WORDPRESS', 'MYSQL_USER']; - $passwordVariables = ['SERVICE_PASSWORD_MYSQL', 'SERVICE_PASSWORD_WORDPRESS', 'MYSQL_PASSWORD', 'SERVICE_PASSWORD_64_MYSQL']; - $rootPasswordVariables = ['SERVICE_PASSWORD_MYSQLROOT', 'SERVICE_PASSWORD_ROOT', 'SERVICE_PASSWORD_64_MYSQLROOT']; - $dbNameVariables = ['MYSQL_DATABASE']; - $mysql_user = $this->environment_variables()->whereIn('key', $userVariables)->first(); - $mysql_password = $this->environment_variables()->whereIn('key', $passwordVariables)->first(); - $mysql_root_password = $this->environment_variables()->whereIn('key', $rootPasswordVariables)->first(); - $mysql_db_name = $this->environment_variables()->whereIn('key', $dbNameVariables)->first(); - $data = collect([]); - if ($mysql_user) { - $data = $data->merge([ - 'User' => [ - 'key' => data_get($mysql_user, 'key'), - 'value' => data_get($mysql_user, 'value'), - 'rules' => 'required', - ], - ]); - } - if ($mysql_password) { - $data = $data->merge([ - 'Password' => [ - 'key' => data_get($mysql_password, 'key'), - 'value' => data_get($mysql_password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - if ($mysql_root_password) { - $data = $data->merge([ - 'Root Password' => [ - 'key' => data_get($mysql_root_password, 'key'), - 'value' => data_get($mysql_root_password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - if ($mysql_db_name) { - $data = $data->merge([ - 'Database Name' => [ - 'key' => data_get($mysql_db_name, 'key'), - 'value' => data_get($mysql_db_name, 'value'), - 'rules' => 'required', - ], - ]); - } - $fields->put('MySQL', $data->toArray()); - break; - case $image->contains('mariadb'): - $userVariables = ['SERVICE_USER_MARIADB', 'SERVICE_USER_WORDPRESS', 'SERVICE_USER_MYSQL', 'MYSQL_USER']; - $passwordVariables = ['SERVICE_PASSWORD_MARIADB', 'SERVICE_PASSWORD_WORDPRESS', '_APP_DB_PASS', 'MYSQL_PASSWORD']; - $rootPasswordVariables = ['SERVICE_PASSWORD_MARIADBROOT', 'SERVICE_PASSWORD_ROOT', '_APP_DB_ROOT_PASS', 'MYSQL_ROOT_PASSWORD']; - $dbNameVariables = ['SERVICE_DATABASE_MARIADB', 'SERVICE_DATABASE_WORDPRESS', '_APP_DB_SCHEMA', 'MYSQL_DATABASE']; - - $mariadb_user = $this->environment_variables()->whereIn('key', $userVariables)->first(); - $mariadb_password = $this->environment_variables()->whereIn('key', $passwordVariables)->first(); - $mariadb_root_password = $this->environment_variables()->whereIn('key', $rootPasswordVariables)->first(); - $mariadb_db_name = $this->environment_variables()->whereIn('key', $dbNameVariables)->first(); - $data = collect([]); - - if ($mariadb_user) { - $data = $data->merge([ - 'User' => [ - 'key' => data_get($mariadb_user, 'key'), - 'value' => data_get($mariadb_user, 'value'), - 'rules' => 'required', - ], - ]); - } - if ($mariadb_password) { - $data = $data->merge([ - 'Password' => [ - 'key' => data_get($mariadb_password, 'key'), - 'value' => data_get($mariadb_password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - if ($mariadb_root_password) { - $data = $data->merge([ - 'Root Password' => [ - 'key' => data_get($mariadb_root_password, 'key'), - 'value' => data_get($mariadb_root_password, 'value'), - 'rules' => 'required', - 'isPassword' => true, - ], - ]); - } - if ($mariadb_db_name) { - $data = $data->merge([ - 'Database Name' => [ - 'key' => data_get($mariadb_db_name, 'key'), - 'value' => data_get($mariadb_db_name, 'value'), - 'rules' => 'required', - ], - ]); - } - $fields->put('MariaDB', $data->toArray()); - break; - } - } - $fields = collect($fields)->map(function ($extraFields) { - if (is_array($extraFields)) { - $extraFields = collect($extraFields)->map(function ($field) { - if (filled($field['value']) && str($field['value'])->startsWith('$SERVICE_')) { - $searchValue = str($field['value'])->after('$')->value; - $newValue = $this->environment_variables()->where('key', $searchValue)->first(); - if ($newValue) { - $field['value'] = $newValue->value; - } - } - - return $field; - }); - } - - return $extraFields; - }); - - return $fields; - } - - public function saveExtraFields($fields) - { - foreach ($fields as $field) { - $key = data_get($field, 'key'); - $value = data_get($field, 'value'); - $found = $this->environment_variables()->where('key', $key)->first(); - if ($found) { - $found->value = $value; - $found->save(); - } else { - $this->environment_variables()->create([ - 'key' => $key, - 'value' => $value, - 'is_build_time' => false, - 'resourceable_id' => $this->id, - 'resourceable_type' => $this->getMorphClass(), - 'is_preview' => false, - ]); - } - } - } - - public function link() - { - if (data_get($this, 'environment.project.uuid')) { - return route('project.service.configuration', [ - 'project_uuid' => data_get($this, 'environment.project.uuid'), - 'environment_uuid' => data_get($this, 'environment.uuid'), - 'service_uuid' => data_get($this, 'uuid'), - ]); - } - - return null; - } - - public function taskLink($task_uuid) - { - if (data_get($this, 'environment.project.uuid')) { - $route = route('project.service.scheduled-tasks', [ - 'project_uuid' => data_get($this, 'environment.project.uuid'), - 'environment_uuid' => data_get($this, 'environment.uuid'), - 'service_uuid' => data_get($this, 'uuid'), - 'task_uuid' => $task_uuid, - ]); - $settings = InstanceSettings::get(); - if (data_get($settings, 'fqdn')) { - $url = Url::fromString($route); - $url = $url->withPort(null); - $fqdn = data_get($settings, 'fqdn'); - $fqdn = str_replace(['http://', 'https://'], '', $fqdn); - $url = $url->withHost($fqdn); - - return $url->__toString(); - } - - return $route; - } - - return null; - } - - public function documentation() - { - $services = get_service_templates(); - $service = data_get($services, str($this->name)->beforeLast('-')->value, []); - - return data_get($service, 'documentation', config('constants.urls.docs')); - } - - public function applications() - { - return $this->hasMany(ServiceApplication::class); - } - - public function databases() - { - return $this->hasMany(ServiceDatabase::class); - } - - public function destination() - { - return $this->morphTo(); - } - - public function environment() - { - return $this->belongsTo(Environment::class); - } - - public function server() - { - return $this->belongsTo(Server::class); - } - - public function byUuid(string $uuid) - { - $app = $this->applications()->whereUuid($uuid)->first(); - if ($app) { - return $app; - } - $db = $this->databases()->whereUuid($uuid)->first(); - if ($db) { - return $db; - } - - return null; - } - - public function byName(string $name) - { - $app = $this->applications()->whereName($name)->first(); - if ($app) { - return $app; - } - $db = $this->databases()->whereName($name)->first(); - if ($db) { - return $db; - } - - return null; - } - - public function scheduled_tasks(): HasMany - { - return $this->hasMany(ScheduledTask::class)->orderBy('name', 'asc'); - } - - public function environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->orderBy('key', 'asc'); - } - - public function environment_variables_preview() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->where('is_preview', true) - ->orderByRaw("LOWER(key) LIKE LOWER('SERVICE%') DESC, LOWER(key) ASC"); - } - - public function workdir() - { - return service_configuration_dir()."/{$this->uuid}"; - } - - public function saveComposeConfigs() - { - $workdir = $this->workdir(); - - instant_remote_process([ - "mkdir -p $workdir", - "cd $workdir", - ], $this->server); - - $filename = new Cuid2.'-docker-compose.yml'; - Storage::disk('local')->put("tmp/{$filename}", $this->docker_compose); - $path = Storage::path("tmp/{$filename}"); - instant_scp($path, "{$workdir}/docker-compose.yml", $this->server); - Storage::disk('local')->delete("tmp/{$filename}"); - - $commands[] = "cd $workdir"; - $commands[] = 'rm -f .env || true'; - - $envs_from_coolify = $this->environment_variables()->get(); - $sorted = $envs_from_coolify->sortBy(function ($env) { - if (str($env->key)->startsWith('SERVICE_')) { - return 1; - } - if (str($env->value)->startsWith('$SERVICE_') || str($env->value)->startsWith('${SERVICE_')) { - return 2; - } - - return 3; - }); - foreach ($sorted as $env) { - if (version_compare($env->version, '4.0.0-beta.347', '<=')) { - $commands[] = "echo '{$env->key}={$env->real_value}' >> .env"; - } else { - $real_value = $env->real_value; - if ($env->version === '4.0.0-beta.239') { - $real_value = $env->real_value; - } else { - if ($env->is_literal || $env->is_multiline) { - $real_value = '\''.$real_value.'\''; - } else { - $real_value = escapeEnvVariables($env->real_value); - } - } - $commands[] = "echo \"{$env->key}={$real_value}\" >> .env"; - } - } - if ($sorted->count() === 0) { - $commands[] = 'touch .env'; - } - instant_remote_process($commands, $this->server); - } - - public function parse(bool $isNew = false): Collection - { - if ((int) $this->compose_parsing_version >= 3) { - return newParser($this); - } elseif ($this->docker_compose_raw) { - return parseDockerComposeFile($this, $isNew); - } else { - return collect([]); - } - } - - public function networks() - { - return getTopLevelNetworks($this); - } - - protected function isDeployable(): Attribute - { - return Attribute::make( - get: function () { - $envs = $this->environment_variables()->where('is_required', true)->get(); - foreach ($envs as $env) { - if ($env->is_really_required) { - return false; - } - } - - return true; - } - ); - } -} diff --git a/app/Models/ServiceApplication.php b/app/Models/ServiceApplication.php deleted file mode 100644 index 5cafc90422..0000000000 --- a/app/Models/ServiceApplication.php +++ /dev/null @@ -1,130 +0,0 @@ -update(['fqdn' => null]); - $service->persistentStorages()->delete(); - $service->fileStorages()->delete(); - }); - static::saving(function ($service) { - if ($service->isDirty('status')) { - $service->forceFill(['last_online_at' => now()]); - } - }); - } - - public function restart() - { - $container_id = $this->name.'-'.$this->service->uuid; - instant_remote_process(["docker restart {$container_id}"], $this->service->server); - } - - public static function ownedByCurrentTeamAPI(int $teamId) - { - return ServiceApplication::whereRelation('service.environment.project.team', 'id', $teamId)->orderBy('name'); - } - - public static function ownedByCurrentTeam() - { - return ServiceApplication::whereRelation('service.environment.project.team', 'id', currentTeam()->id)->orderBy('name'); - } - - public function isRunning() - { - return str($this->status)->contains('running'); - } - - public function isExited() - { - return str($this->status)->contains('exited'); - } - - public function isLogDrainEnabled() - { - return data_get($this, 'is_log_drain_enabled', false); - } - - public function isStripprefixEnabled() - { - return data_get($this, 'is_stripprefix_enabled', true); - } - - public function isGzipEnabled() - { - return data_get($this, 'is_gzip_enabled', true); - } - - public function type() - { - return 'service'; - } - - public function team() - { - return data_get($this, 'environment.project.team'); - } - - public function workdir() - { - return service_configuration_dir()."/{$this->service->uuid}"; - } - - public function serviceType() - { - $found = str(collect(SPECIFIC_SERVICES)->filter(function ($service) { - return str($this->image)->before(':')->value() === $service; - })->first()); - if ($found->isNotEmpty()) { - return $found; - } - - return null; - } - - public function service() - { - return $this->belongsTo(Service::class); - } - - public function persistentStorages() - { - return $this->morphMany(LocalPersistentVolume::class, 'resource'); - } - - public function fileStorages() - { - return $this->morphMany(LocalFileVolume::class, 'resource'); - } - - public function fqdns(): Attribute - { - return Attribute::make( - get: fn () => is_null($this->fqdn) - ? [] - : explode(',', $this->fqdn), - ); - } - - public function getFilesFromServer(bool $isInit = false) - { - getFilesystemVolumesFromServer($this, $isInit); - } - - public function isBackupSolutionAvailable() - { - return false; - } -} diff --git a/app/Models/ServiceDatabase.php b/app/Models/ServiceDatabase.php deleted file mode 100644 index c2a0df8cdf..0000000000 --- a/app/Models/ServiceDatabase.php +++ /dev/null @@ -1,146 +0,0 @@ -persistentStorages()->delete(); - $service->fileStorages()->delete(); - }); - static::saving(function ($service) { - if ($service->isDirty('status')) { - $service->forceFill(['last_online_at' => now()]); - } - }); - } - - public static function ownedByCurrentTeamAPI(int $teamId) - { - return ServiceDatabase::whereRelation('service.environment.project.team', 'id', $teamId)->orderBy('name'); - } - - public static function ownedByCurrentTeam() - { - return ServiceDatabase::whereRelation('service.environment.project.team', 'id', currentTeam()->id)->orderBy('name'); - } - - public function restart() - { - $container_id = $this->name.'-'.$this->service->uuid; - remote_process(["docker restart {$container_id}"], $this->service->server); - } - - public function isRunning() - { - return str($this->status)->contains('running'); - } - - public function isExited() - { - return str($this->status)->contains('exited'); - } - - public function isLogDrainEnabled() - { - return data_get($this, 'is_log_drain_enabled', false); - } - - public function isStripprefixEnabled() - { - return data_get($this, 'is_stripprefix_enabled', true); - } - - public function isGzipEnabled() - { - return data_get($this, 'is_gzip_enabled', true); - } - - public function type() - { - return 'service'; - } - - public function serviceType() - { - return null; - } - - public function databaseType() - { - $image = str($this->image)->before(':'); - if ($image->contains('supabase/postgres')) { - $finalImage = 'supabase/postgres'; - } elseif ($image->contains('postgres') || $image->contains('postgis')) { - $finalImage = 'postgresql'; - } else { - $finalImage = $image; - } - - return "standalone-$finalImage"; - } - - public function getServiceDatabaseUrl() - { - $port = $this->public_port; - $realIp = $this->service->server->ip; - if ($this->service->server->isLocalhost() || isDev()) { - $realIp = base_ip(); - } - - return "{$realIp}:{$port}"; - } - - public function team() - { - return data_get($this, 'environment.project.team'); - } - - public function workdir() - { - return service_configuration_dir()."/{$this->service->uuid}"; - } - - public function service() - { - return $this->belongsTo(Service::class); - } - - public function persistentStorages() - { - return $this->morphMany(LocalPersistentVolume::class, 'resource'); - } - - public function fileStorages() - { - return $this->morphMany(LocalFileVolume::class, 'resource'); - } - - public function getFilesFromServer(bool $isInit = false) - { - getFilesystemVolumesFromServer($this, $isInit); - } - - public function scheduledBackups() - { - return $this->morphMany(ScheduledDatabaseBackup::class, 'database'); - } - - public function isBackupSolutionAvailable() - { - return str($this->databaseType())->contains('mysql') || - str($this->databaseType())->contains('postgres') || - str($this->databaseType())->contains('postgis') || - str($this->databaseType())->contains('mariadb') || - str($this->databaseType())->contains('mongodb'); - } -} diff --git a/app/Models/SharedEnvironmentVariable.php b/app/Models/SharedEnvironmentVariable.php deleted file mode 100644 index aab8b87350..0000000000 --- a/app/Models/SharedEnvironmentVariable.php +++ /dev/null @@ -1,15 +0,0 @@ - 'string', - 'value' => 'encrypted', - ]; -} diff --git a/app/Models/SlackNotificationSettings.php b/app/Models/SlackNotificationSettings.php deleted file mode 100644 index 48153f2ea8..0000000000 --- a/app/Models/SlackNotificationSettings.php +++ /dev/null @@ -1,59 +0,0 @@ - 'boolean', - 'slack_webhook_url' => 'encrypted', - - 'deployment_success_slack_notifications' => 'boolean', - 'deployment_failure_slack_notifications' => 'boolean', - 'status_change_slack_notifications' => 'boolean', - 'backup_success_slack_notifications' => 'boolean', - 'backup_failure_slack_notifications' => 'boolean', - 'scheduled_task_success_slack_notifications' => 'boolean', - 'scheduled_task_failure_slack_notifications' => 'boolean', - 'docker_cleanup_slack_notifications' => 'boolean', - 'server_disk_usage_slack_notifications' => 'boolean', - 'server_reachable_slack_notifications' => 'boolean', - 'server_unreachable_slack_notifications' => 'boolean', - ]; - - public function team() - { - return $this->belongsTo(Team::class); - } - - public function isEnabled() - { - return $this->slack_enabled; - } -} diff --git a/app/Models/StandaloneClickhouse.php b/app/Models/StandaloneClickhouse.php deleted file mode 100644 index 60198115da..0000000000 --- a/app/Models/StandaloneClickhouse.php +++ /dev/null @@ -1,322 +0,0 @@ - 'encrypted', - ]; - - protected static function booted() - { - static::created(function ($database) { - LocalPersistentVolume::create([ - 'name' => 'clickhouse-data-'.$database->uuid, - 'mount_path' => '/bitnami/clickhouse', - 'host_path' => null, - 'resource_id' => $database->id, - 'resource_type' => $database->getMorphClass(), - 'is_readonly' => true, - ]); - }); - static::forceDeleting(function ($database) { - $database->persistentStorages()->delete(); - $database->scheduledBackups()->delete(); - $database->environment_variables()->delete(); - $database->tags()->detach(); - }); - static::saving(function ($database) { - if ($database->isDirty('status')) { - $database->forceFill(['last_online_at' => now()]); - } - }); - } - - protected function serverStatus(): Attribute - { - return Attribute::make( - get: function () { - return $this->destination->server->isFunctional(); - } - ); - } - - public function isConfigurationChanged(bool $save = false) - { - $newConfigHash = $this->image.$this->ports_mappings; - $newConfigHash .= json_encode($this->environment_variables()->get('value')->sort()); - $newConfigHash = md5($newConfigHash); - $oldConfigHash = data_get($this, 'config_hash'); - if ($oldConfigHash === null) { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - if ($oldConfigHash === $newConfigHash) { - return false; - } else { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - } - - public function isRunning() - { - return (bool) str($this->status)->contains('running'); - } - - public function isExited() - { - return (bool) str($this->status)->startsWith('exited'); - } - - public function workdir() - { - return database_configuration_dir()."/{$this->uuid}"; - } - - public function delete_configurations() - { - $server = data_get($this, 'destination.server'); - $workdir = $this->workdir(); - if (str($workdir)->endsWith($this->uuid)) { - instant_remote_process(['rm -rf '.$this->workdir()], $server, false); - } - } - - public function delete_volumes(Collection $persistentStorages) - { - if ($persistentStorages->count() === 0) { - return; - } - $server = data_get($this, 'destination.server'); - foreach ($persistentStorages as $storage) { - instant_remote_process(["docker volume rm -f $storage->name"], $server, false); - } - } - - public function realStatus() - { - return $this->getRawOriginal('status'); - } - - public function status(): Attribute - { - return Attribute::make( - set: function ($value) { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - }, - get: function ($value) { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - }, - ); - } - - public function tags() - { - return $this->morphToMany(Tag::class, 'taggable'); - } - - public function project() - { - return data_get($this, 'environment.project'); - } - - public function link() - { - if (data_get($this, 'environment.project.uuid')) { - return route('project.database.configuration', [ - 'project_uuid' => data_get($this, 'environment.project.uuid'), - 'environment_uuid' => data_get($this, 'environment.uuid'), - 'database_uuid' => data_get($this, 'uuid'), - ]); - } - - return null; - } - - public function isLogDrainEnabled() - { - return data_get($this, 'is_log_drain_enabled', false); - } - - public function portsMappings(): Attribute - { - return Attribute::make( - set: fn ($value) => $value === '' ? null : $value, - ); - } - - public function portsMappingsArray(): Attribute - { - return Attribute::make( - get: fn () => is_null($this->ports_mappings) - ? [] - : explode(',', $this->ports_mappings), - - ); - } - - public function team() - { - return data_get($this, 'environment.project.team'); - } - - public function databaseType(): Attribute - { - return new Attribute( - get: fn () => $this->type(), - ); - } - - public function type(): string - { - return 'standalone-clickhouse'; - } - - protected function internalDbUrl(): Attribute - { - return new Attribute( - get: fn () => "clickhouse://{$this->clickhouse_admin_user}:{$this->clickhouse_admin_password}@{$this->uuid}:9000/{$this->clickhouse_db}", - ); - } - - protected function externalDbUrl(): Attribute - { - return new Attribute( - get: function () { - if ($this->is_public && $this->public_port) { - return "clickhouse://{$this->clickhouse_admin_user}:{$this->clickhouse_admin_password}@{$this->destination->server->getIp}:{$this->public_port}/{$this->clickhouse_db}"; - } - - return null; - } - ); - } - - public function environment() - { - return $this->belongsTo(Environment::class); - } - - public function fileStorages() - { - return $this->morphMany(LocalFileVolume::class, 'resource'); - } - - public function destination() - { - return $this->morphTo(); - } - - public function environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->orderBy('key', 'asc'); - } - - public function runtime_environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable'); - } - - public function persistentStorages() - { - return $this->morphMany(LocalPersistentVolume::class, 'resource'); - } - - public function scheduledBackups() - { - return $this->morphMany(ScheduledDatabaseBackup::class, 'database'); - } - - public function getCpuMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/cpu/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['percent']]; - }); - - return $parsedCollection->toArray(); - } - - public function getMemoryMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/memory/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['used']]; - }); - - return $parsedCollection->toArray(); - } - - public function isBackupSolutionAvailable() - { - return false; - } -} diff --git a/app/Models/StandaloneDocker.php b/app/Models/StandaloneDocker.php deleted file mode 100644 index 9db6a2d290..0000000000 --- a/app/Models/StandaloneDocker.php +++ /dev/null @@ -1,92 +0,0 @@ -server; - instant_remote_process([ - "docker network inspect $newStandaloneDocker->network >/dev/null 2>&1 || docker network create --driver overlay --attachable $newStandaloneDocker->network >/dev/null", - ], $server, false); - $connectProxyToDockerNetworks = connectProxyToNetworks($server); - instant_remote_process($connectProxyToDockerNetworks, $server, false); - }); - } - - public function applications() - { - return $this->morphMany(Application::class, 'destination'); - } - - public function postgresqls() - { - return $this->morphMany(StandalonePostgresql::class, 'destination'); - } - - public function redis() - { - return $this->morphMany(StandaloneRedis::class, 'destination'); - } - - public function mongodbs() - { - return $this->morphMany(StandaloneMongodb::class, 'destination'); - } - - public function mysqls() - { - return $this->morphMany(StandaloneMysql::class, 'destination'); - } - - public function mariadbs() - { - return $this->morphMany(StandaloneMariadb::class, 'destination'); - } - - public function keydbs() - { - return $this->morphMany(StandaloneKeydb::class, 'destination'); - } - - public function dragonflies() - { - return $this->morphMany(StandaloneDragonfly::class, 'destination'); - } - - public function clickhouses() - { - return $this->morphMany(StandaloneClickhouse::class, 'destination'); - } - - public function server() - { - return $this->belongsTo(Server::class); - } - - public function services() - { - return $this->morphMany(Service::class, 'destination'); - } - - public function databases() - { - $postgresqls = $this->postgresqls; - $redis = $this->redis; - $mongodbs = $this->mongodbs; - $mysqls = $this->mysqls; - $mariadbs = $this->mariadbs; - - return $postgresqls->concat($redis)->concat($mongodbs)->concat($mysqls)->concat($mariadbs); - } - - public function attachedTo() - { - return $this->applications?->count() > 0 || $this->databases()->count() > 0; - } -} diff --git a/app/Models/StandaloneDragonfly.php b/app/Models/StandaloneDragonfly.php deleted file mode 100644 index 3c1127d8de..0000000000 --- a/app/Models/StandaloneDragonfly.php +++ /dev/null @@ -1,322 +0,0 @@ - 'encrypted', - ]; - - protected static function booted() - { - static::created(function ($database) { - LocalPersistentVolume::create([ - 'name' => 'dragonfly-data-'.$database->uuid, - 'mount_path' => '/data', - 'host_path' => null, - 'resource_id' => $database->id, - 'resource_type' => $database->getMorphClass(), - 'is_readonly' => true, - ]); - }); - static::forceDeleting(function ($database) { - $database->persistentStorages()->delete(); - $database->scheduledBackups()->delete(); - $database->environment_variables()->delete(); - $database->tags()->detach(); - }); - static::saving(function ($database) { - if ($database->isDirty('status')) { - $database->forceFill(['last_online_at' => now()]); - } - }); - } - - protected function serverStatus(): Attribute - { - return Attribute::make( - get: function () { - return $this->destination->server->isFunctional(); - } - ); - } - - public function isConfigurationChanged(bool $save = false) - { - $newConfigHash = $this->image.$this->ports_mappings; - $newConfigHash .= json_encode($this->environment_variables()->get('value')->sort()); - $newConfigHash = md5($newConfigHash); - $oldConfigHash = data_get($this, 'config_hash'); - if ($oldConfigHash === null) { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - if ($oldConfigHash === $newConfigHash) { - return false; - } else { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - } - - public function isRunning() - { - return (bool) str($this->status)->contains('running'); - } - - public function isExited() - { - return (bool) str($this->status)->startsWith('exited'); - } - - public function workdir() - { - return database_configuration_dir()."/{$this->uuid}"; - } - - public function delete_configurations() - { - $server = data_get($this, 'destination.server'); - $workdir = $this->workdir(); - if (str($workdir)->endsWith($this->uuid)) { - instant_remote_process(['rm -rf '.$this->workdir()], $server, false); - } - } - - public function delete_volumes(Collection $persistentStorages) - { - if ($persistentStorages->count() === 0) { - return; - } - $server = data_get($this, 'destination.server'); - foreach ($persistentStorages as $storage) { - instant_remote_process(["docker volume rm -f $storage->name"], $server, false); - } - } - - public function realStatus() - { - return $this->getRawOriginal('status'); - } - - public function status(): Attribute - { - return Attribute::make( - set: function ($value) { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - }, - get: function ($value) { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - }, - ); - } - - public function tags() - { - return $this->morphToMany(Tag::class, 'taggable'); - } - - public function project() - { - return data_get($this, 'environment.project'); - } - - public function team() - { - return data_get($this, 'environment.project.team'); - } - - public function link() - { - if (data_get($this, 'environment.project.uuid')) { - return route('project.database.configuration', [ - 'project_uuid' => data_get($this, 'environment.project.uuid'), - 'environment_uuid' => data_get($this, 'environment.uuid'), - 'database_uuid' => data_get($this, 'uuid'), - ]); - } - - return null; - } - - public function isLogDrainEnabled() - { - return data_get($this, 'is_log_drain_enabled', false); - } - - public function portsMappings(): Attribute - { - return Attribute::make( - set: fn ($value) => $value === '' ? null : $value, - ); - } - - public function portsMappingsArray(): Attribute - { - return Attribute::make( - get: fn () => is_null($this->ports_mappings) - ? [] - : explode(',', $this->ports_mappings), - - ); - } - - public function databaseType(): Attribute - { - return new Attribute( - get: fn () => $this->type(), - ); - } - - public function type(): string - { - return 'standalone-dragonfly'; - } - - protected function internalDbUrl(): Attribute - { - return new Attribute( - get: fn () => "redis://:{$this->dragonfly_password}@{$this->uuid}:6379/0", - ); - } - - protected function externalDbUrl(): Attribute - { - return new Attribute( - get: function () { - if ($this->is_public && $this->public_port) { - return "redis://:{$this->dragonfly_password}@{$this->destination->server->getIp}:{$this->public_port}/0"; - } - - return null; - } - ); - } - - public function environment() - { - return $this->belongsTo(Environment::class); - } - - public function fileStorages() - { - return $this->morphMany(LocalFileVolume::class, 'resource'); - } - - public function destination() - { - return $this->morphTo(); - } - - public function runtime_environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable'); - } - - public function persistentStorages() - { - return $this->morphMany(LocalPersistentVolume::class, 'resource'); - } - - public function scheduledBackups() - { - return $this->morphMany(ScheduledDatabaseBackup::class, 'database'); - } - - public function getCpuMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/cpu/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['percent']]; - }); - - return $parsedCollection->toArray(); - } - - public function getMemoryMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/memory/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['used']]; - }); - - return $parsedCollection->toArray(); - } - - public function isBackupSolutionAvailable() - { - return false; - } - - public function environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->orderBy('key', 'asc'); - } -} diff --git a/app/Models/StandaloneKeydb.php b/app/Models/StandaloneKeydb.php deleted file mode 100644 index ebf1c22e95..0000000000 --- a/app/Models/StandaloneKeydb.php +++ /dev/null @@ -1,322 +0,0 @@ - 'encrypted', - ]; - - protected static function booted() - { - static::created(function ($database) { - LocalPersistentVolume::create([ - 'name' => 'keydb-data-'.$database->uuid, - 'mount_path' => '/data', - 'host_path' => null, - 'resource_id' => $database->id, - 'resource_type' => $database->getMorphClass(), - 'is_readonly' => true, - ]); - }); - static::forceDeleting(function ($database) { - $database->persistentStorages()->delete(); - $database->scheduledBackups()->delete(); - $database->environment_variables()->delete(); - $database->tags()->detach(); - }); - static::saving(function ($database) { - if ($database->isDirty('status')) { - $database->forceFill(['last_online_at' => now()]); - } - }); - } - - protected function serverStatus(): Attribute - { - return Attribute::make( - get: function () { - return $this->destination->server->isFunctional(); - } - ); - } - - public function isConfigurationChanged(bool $save = false) - { - $newConfigHash = $this->image.$this->ports_mappings.$this->keydb_conf; - $newConfigHash .= json_encode($this->environment_variables()->get('value')->sort()); - $newConfigHash = md5($newConfigHash); - $oldConfigHash = data_get($this, 'config_hash'); - if ($oldConfigHash === null) { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - if ($oldConfigHash === $newConfigHash) { - return false; - } else { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - } - - public function isRunning() - { - return (bool) str($this->status)->contains('running'); - } - - public function isExited() - { - return (bool) str($this->status)->startsWith('exited'); - } - - public function workdir() - { - return database_configuration_dir()."/{$this->uuid}"; - } - - public function delete_configurations() - { - $server = data_get($this, 'destination.server'); - $workdir = $this->workdir(); - if (str($workdir)->endsWith($this->uuid)) { - instant_remote_process(['rm -rf '.$this->workdir()], $server, false); - } - } - - public function delete_volumes(Collection $persistentStorages) - { - if ($persistentStorages->count() === 0) { - return; - } - $server = data_get($this, 'destination.server'); - foreach ($persistentStorages as $storage) { - instant_remote_process(["docker volume rm -f $storage->name"], $server, false); - } - } - - public function realStatus() - { - return $this->getRawOriginal('status'); - } - - public function status(): Attribute - { - return Attribute::make( - set: function ($value) { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - }, - get: function ($value) { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - }, - ); - } - - public function tags() - { - return $this->morphToMany(Tag::class, 'taggable'); - } - - public function project() - { - return data_get($this, 'environment.project'); - } - - public function team() - { - return data_get($this, 'environment.project.team'); - } - - public function link() - { - if (data_get($this, 'environment.project.uuid')) { - return route('project.database.configuration', [ - 'project_uuid' => data_get($this, 'environment.project.uuid'), - 'environment_uuid' => data_get($this, 'environment.uuid'), - 'database_uuid' => data_get($this, 'uuid'), - ]); - } - - return null; - } - - public function isLogDrainEnabled() - { - return data_get($this, 'is_log_drain_enabled', false); - } - - public function portsMappings(): Attribute - { - return Attribute::make( - set: fn ($value) => $value === '' ? null : $value, - ); - } - - public function portsMappingsArray(): Attribute - { - return Attribute::make( - get: fn () => is_null($this->ports_mappings) - ? [] - : explode(',', $this->ports_mappings), - - ); - } - - public function databaseType(): Attribute - { - return new Attribute( - get: fn () => $this->type(), - ); - } - - public function type(): string - { - return 'standalone-keydb'; - } - - protected function internalDbUrl(): Attribute - { - return new Attribute( - get: fn () => "redis://:{$this->keydb_password}@{$this->uuid}:6379/0", - ); - } - - protected function externalDbUrl(): Attribute - { - return new Attribute( - get: function () { - if ($this->is_public && $this->public_port) { - return "redis://:{$this->keydb_password}@{$this->destination->server->getIp}:{$this->public_port}/0"; - } - - return null; - } - ); - } - - public function environment() - { - return $this->belongsTo(Environment::class); - } - - public function fileStorages() - { - return $this->morphMany(LocalFileVolume::class, 'resource'); - } - - public function destination() - { - return $this->morphTo(); - } - - public function runtime_environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable'); - } - - public function persistentStorages() - { - return $this->morphMany(LocalPersistentVolume::class, 'resource'); - } - - public function scheduledBackups() - { - return $this->morphMany(ScheduledDatabaseBackup::class, 'database'); - } - - public function getCpuMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/cpu/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['percent']]; - }); - - return $parsedCollection->toArray(); - } - - public function getMemoryMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/memory/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['used']]; - }); - - return $parsedCollection->toArray(); - } - - public function isBackupSolutionAvailable() - { - return false; - } - - public function environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->orderBy('key', 'asc'); - } -} diff --git a/app/Models/StandaloneMariadb.php b/app/Models/StandaloneMariadb.php deleted file mode 100644 index 004ead4d95..0000000000 --- a/app/Models/StandaloneMariadb.php +++ /dev/null @@ -1,322 +0,0 @@ - 'encrypted', - ]; - - protected static function booted() - { - static::created(function ($database) { - LocalPersistentVolume::create([ - 'name' => 'mariadb-data-'.$database->uuid, - 'mount_path' => '/var/lib/mysql', - 'host_path' => null, - 'resource_id' => $database->id, - 'resource_type' => $database->getMorphClass(), - 'is_readonly' => true, - ]); - }); - static::forceDeleting(function ($database) { - $database->persistentStorages()->delete(); - $database->scheduledBackups()->delete(); - $database->environment_variables()->delete(); - $database->tags()->detach(); - }); - static::saving(function ($database) { - if ($database->isDirty('status')) { - $database->forceFill(['last_online_at' => now()]); - } - }); - } - - protected function serverStatus(): Attribute - { - return Attribute::make( - get: function () { - return $this->destination->server->isFunctional(); - } - ); - } - - public function isConfigurationChanged(bool $save = false) - { - $newConfigHash = $this->image.$this->ports_mappings.$this->mariadb_conf; - $newConfigHash .= json_encode($this->environment_variables()->get('value')->sort()); - $newConfigHash = md5($newConfigHash); - $oldConfigHash = data_get($this, 'config_hash'); - if ($oldConfigHash === null) { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - if ($oldConfigHash === $newConfigHash) { - return false; - } else { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - } - - public function isRunning() - { - return (bool) str($this->status)->contains('running'); - } - - public function isExited() - { - return (bool) str($this->status)->startsWith('exited'); - } - - public function workdir() - { - return database_configuration_dir()."/{$this->uuid}"; - } - - public function delete_configurations() - { - $server = data_get($this, 'destination.server'); - $workdir = $this->workdir(); - if (str($workdir)->endsWith($this->uuid)) { - instant_remote_process(['rm -rf '.$this->workdir()], $server, false); - } - } - - public function delete_volumes(Collection $persistentStorages) - { - if ($persistentStorages->count() === 0) { - return; - } - $server = data_get($this, 'destination.server'); - foreach ($persistentStorages as $storage) { - instant_remote_process(["docker volume rm -f $storage->name"], $server, false); - } - } - - public function realStatus() - { - return $this->getRawOriginal('status'); - } - - public function status(): Attribute - { - return Attribute::make( - set: function ($value) { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - }, - get: function ($value) { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - }, - ); - } - - public function tags() - { - return $this->morphToMany(Tag::class, 'taggable'); - } - - public function project() - { - return data_get($this, 'environment.project'); - } - - public function team() - { - return data_get($this, 'environment.project.team'); - } - - public function link() - { - if (data_get($this, 'environment.project.uuid')) { - return route('project.database.configuration', [ - 'project_uuid' => data_get($this, 'environment.project.uuid'), - 'environment_uuid' => data_get($this, 'environment.uuid'), - 'database_uuid' => data_get($this, 'uuid'), - ]); - } - - return null; - } - - public function isLogDrainEnabled() - { - return data_get($this, 'is_log_drain_enabled', false); - } - - public function databaseType(): Attribute - { - return new Attribute( - get: fn () => $this->type(), - ); - } - - public function type(): string - { - return 'standalone-mariadb'; - } - - public function portsMappings(): Attribute - { - return Attribute::make( - set: fn ($value) => $value === '' ? null : $value, - ); - } - - public function portsMappingsArray(): Attribute - { - return Attribute::make( - get: fn () => is_null($this->ports_mappings) - ? [] - : explode(',', $this->ports_mappings), - - ); - } - - protected function internalDbUrl(): Attribute - { - return new Attribute( - get: fn () => "mysql://{$this->mariadb_user}:{$this->mariadb_password}@{$this->uuid}:3306/{$this->mariadb_database}", - ); - } - - protected function externalDbUrl(): Attribute - { - return new Attribute( - get: function () { - if ($this->is_public && $this->public_port) { - return "mysql://{$this->mariadb_user}:{$this->mariadb_password}@{$this->destination->server->getIp}:{$this->public_port}/{$this->mariadb_database}"; - } - - return null; - } - ); - } - - public function environment() - { - return $this->belongsTo(Environment::class); - } - - public function fileStorages() - { - return $this->morphMany(LocalFileVolume::class, 'resource'); - } - - public function destination() - { - return $this->morphTo(); - } - - public function environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->orderBy('key', 'asc'); - } - - public function runtime_environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable'); - } - - public function persistentStorages() - { - return $this->morphMany(LocalPersistentVolume::class, 'resource'); - } - - public function scheduledBackups() - { - return $this->morphMany(ScheduledDatabaseBackup::class, 'database'); - } - - public function getCpuMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/cpu/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['percent']]; - }); - - return $parsedCollection->toArray(); - } - - public function getMemoryMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/memory/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['used']]; - }); - - return $parsedCollection->toArray(); - } - - public function isBackupSolutionAvailable() - { - return true; - } -} diff --git a/app/Models/StandaloneMongodb.php b/app/Models/StandaloneMongodb.php deleted file mode 100644 index aba0f6123e..0000000000 --- a/app/Models/StandaloneMongodb.php +++ /dev/null @@ -1,342 +0,0 @@ - 'mongodb-configdb-'.$database->uuid, - 'mount_path' => '/data/configdb', - 'host_path' => null, - 'resource_id' => $database->id, - 'resource_type' => $database->getMorphClass(), - 'is_readonly' => true, - ]); - LocalPersistentVolume::create([ - 'name' => 'mongodb-db-'.$database->uuid, - 'mount_path' => '/data/db', - 'host_path' => null, - 'resource_id' => $database->id, - 'resource_type' => $database->getMorphClass(), - 'is_readonly' => true, - ]); - }); - static::forceDeleting(function ($database) { - $database->persistentStorages()->delete(); - $database->scheduledBackups()->delete(); - $database->environment_variables()->delete(); - $database->tags()->detach(); - }); - static::saving(function ($database) { - if ($database->isDirty('status')) { - $database->forceFill(['last_online_at' => now()]); - } - }); - } - - protected function serverStatus(): Attribute - { - return Attribute::make( - get: function () { - return $this->destination->server->isFunctional(); - } - ); - } - - public function isConfigurationChanged(bool $save = false) - { - $newConfigHash = $this->image.$this->ports_mappings.$this->mongo_conf; - $newConfigHash .= json_encode($this->environment_variables()->get('value')->sort()); - $newConfigHash = md5($newConfigHash); - $oldConfigHash = data_get($this, 'config_hash'); - if ($oldConfigHash === null) { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - if ($oldConfigHash === $newConfigHash) { - return false; - } else { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - } - - public function isRunning() - { - return (bool) str($this->status)->contains('running'); - } - - public function isExited() - { - return (bool) str($this->status)->startsWith('exited'); - } - - public function workdir() - { - return database_configuration_dir()."/{$this->uuid}"; - } - - public function delete_configurations() - { - $server = data_get($this, 'destination.server'); - $workdir = $this->workdir(); - if (str($workdir)->endsWith($this->uuid)) { - instant_remote_process(['rm -rf '.$this->workdir()], $server, false); - } - } - - public function delete_volumes(Collection $persistentStorages) - { - if ($persistentStorages->count() === 0) { - return; - } - $server = data_get($this, 'destination.server'); - foreach ($persistentStorages as $storage) { - instant_remote_process(["docker volume rm -f $storage->name"], $server, false); - } - } - - public function realStatus() - { - return $this->getRawOriginal('status'); - } - - public function status(): Attribute - { - return Attribute::make( - set: function ($value) { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - }, - get: function ($value) { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - }, - ); - } - - public function tags() - { - return $this->morphToMany(Tag::class, 'taggable'); - } - - public function project() - { - return data_get($this, 'environment.project'); - } - - public function team() - { - return data_get($this, 'environment.project.team'); - } - - public function isLogDrainEnabled() - { - return data_get($this, 'is_log_drain_enabled', false); - } - - public function link() - { - if (data_get($this, 'environment.project.uuid')) { - return route('project.database.configuration', [ - 'project_uuid' => data_get($this, 'environment.project.uuid'), - 'environment_uuid' => data_get($this, 'environment.uuid'), - 'database_uuid' => data_get($this, 'uuid'), - ]); - } - - return null; - } - - public function mongoInitdbRootPassword(): Attribute - { - return Attribute::make( - get: function ($value) { - try { - return decrypt($value); - } catch (\Throwable $th) { - $this->mongo_initdb_root_password = encrypt($value); - $this->save(); - - return $value; - } - } - ); - } - - public function portsMappings(): Attribute - { - return Attribute::make( - set: fn ($value) => $value === '' ? null : $value, - ); - } - - public function portsMappingsArray(): Attribute - { - return Attribute::make( - get: fn () => is_null($this->ports_mappings) - ? [] - : explode(',', $this->ports_mappings), - - ); - } - - public function databaseType(): Attribute - { - return new Attribute( - get: fn () => $this->type(), - ); - } - - public function type(): string - { - return 'standalone-mongodb'; - } - - protected function internalDbUrl(): Attribute - { - return new Attribute( - get: fn () => "mongodb://{$this->mongo_initdb_root_username}:{$this->mongo_initdb_root_password}@{$this->uuid}:27017/?directConnection=true", - ); - } - - protected function externalDbUrl(): Attribute - { - return new Attribute( - get: function () { - if ($this->is_public && $this->public_port) { - return "mongodb://{$this->mongo_initdb_root_username}:{$this->mongo_initdb_root_password}@{$this->destination->server->getIp}:{$this->public_port}/?directConnection=true"; - } - - return null; - } - ); - } - - public function environment() - { - return $this->belongsTo(Environment::class); - } - - public function fileStorages() - { - return $this->morphMany(LocalFileVolume::class, 'resource'); - } - - public function destination() - { - return $this->morphTo(); - } - - public function runtime_environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable'); - } - - public function persistentStorages() - { - return $this->morphMany(LocalPersistentVolume::class, 'resource'); - } - - public function scheduledBackups() - { - return $this->morphMany(ScheduledDatabaseBackup::class, 'database'); - } - - public function getCpuMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/cpu/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['percent']]; - }); - - return $parsedCollection->toArray(); - } - - public function getMemoryMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/memory/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['used']]; - }); - - return $parsedCollection->toArray(); - } - - public function isBackupSolutionAvailable() - { - return true; - } - - public function environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->orderBy('key', 'asc'); - } -} diff --git a/app/Models/StandaloneMysql.php b/app/Models/StandaloneMysql.php deleted file mode 100644 index 9ae0fdcaeb..0000000000 --- a/app/Models/StandaloneMysql.php +++ /dev/null @@ -1,323 +0,0 @@ - 'encrypted', - 'mysql_root_password' => 'encrypted', - ]; - - protected static function booted() - { - static::created(function ($database) { - LocalPersistentVolume::create([ - 'name' => 'mysql-data-'.$database->uuid, - 'mount_path' => '/var/lib/mysql', - 'host_path' => null, - 'resource_id' => $database->id, - 'resource_type' => $database->getMorphClass(), - 'is_readonly' => true, - ]); - }); - static::forceDeleting(function ($database) { - $database->persistentStorages()->delete(); - $database->scheduledBackups()->delete(); - $database->environment_variables()->delete(); - $database->tags()->detach(); - }); - static::saving(function ($database) { - if ($database->isDirty('status')) { - $database->forceFill(['last_online_at' => now()]); - } - }); - } - - protected function serverStatus(): Attribute - { - return Attribute::make( - get: function () { - return $this->destination->server->isFunctional(); - } - ); - } - - public function isConfigurationChanged(bool $save = false) - { - $newConfigHash = $this->image.$this->ports_mappings.$this->mysql_conf; - $newConfigHash .= json_encode($this->environment_variables()->get('value')->sort()); - $newConfigHash = md5($newConfigHash); - $oldConfigHash = data_get($this, 'config_hash'); - if ($oldConfigHash === null) { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - if ($oldConfigHash === $newConfigHash) { - return false; - } else { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - } - - public function isRunning() - { - return (bool) str($this->status)->contains('running'); - } - - public function isExited() - { - return (bool) str($this->status)->startsWith('exited'); - } - - public function workdir() - { - return database_configuration_dir()."/{$this->uuid}"; - } - - public function delete_configurations() - { - $server = data_get($this, 'destination.server'); - $workdir = $this->workdir(); - if (str($workdir)->endsWith($this->uuid)) { - instant_remote_process(['rm -rf '.$this->workdir()], $server, false); - } - } - - public function delete_volumes(Collection $persistentStorages) - { - if ($persistentStorages->count() === 0) { - return; - } - $server = data_get($this, 'destination.server'); - foreach ($persistentStorages as $storage) { - instant_remote_process(["docker volume rm -f $storage->name"], $server, false); - } - } - - public function realStatus() - { - return $this->getRawOriginal('status'); - } - - public function status(): Attribute - { - return Attribute::make( - set: function ($value) { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - }, - get: function ($value) { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - }, - ); - } - - public function tags() - { - return $this->morphToMany(Tag::class, 'taggable'); - } - - public function project() - { - return data_get($this, 'environment.project'); - } - - public function team() - { - return data_get($this, 'environment.project.team'); - } - - public function link() - { - if (data_get($this, 'environment.project.uuid')) { - return route('project.database.configuration', [ - 'project_uuid' => data_get($this, 'environment.project.uuid'), - 'environment_uuid' => data_get($this, 'environment.uuid'), - 'database_uuid' => data_get($this, 'uuid'), - ]); - } - - return null; - } - - public function databaseType(): Attribute - { - return new Attribute( - get: fn () => $this->type(), - ); - } - - public function type(): string - { - return 'standalone-mysql'; - } - - public function isLogDrainEnabled() - { - return data_get($this, 'is_log_drain_enabled', false); - } - - public function portsMappings(): Attribute - { - return Attribute::make( - set: fn ($value) => $value === '' ? null : $value, - ); - } - - public function portsMappingsArray(): Attribute - { - return Attribute::make( - get: fn () => is_null($this->ports_mappings) - ? [] - : explode(',', $this->ports_mappings), - - ); - } - - protected function internalDbUrl(): Attribute - { - return new Attribute( - get: fn () => "mysql://{$this->mysql_user}:{$this->mysql_password}@{$this->uuid}:3306/{$this->mysql_database}", - ); - } - - protected function externalDbUrl(): Attribute - { - return new Attribute( - get: function () { - if ($this->is_public && $this->public_port) { - return "mysql://{$this->mysql_user}:{$this->mysql_password}@{$this->destination->server->getIp}:{$this->public_port}/{$this->mysql_database}"; - } - - return null; - } - ); - } - - public function environment() - { - return $this->belongsTo(Environment::class); - } - - public function fileStorages() - { - return $this->morphMany(LocalFileVolume::class, 'resource'); - } - - public function destination() - { - return $this->morphTo(); - } - - public function runtime_environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable'); - } - - public function persistentStorages() - { - return $this->morphMany(LocalPersistentVolume::class, 'resource'); - } - - public function scheduledBackups() - { - return $this->morphMany(ScheduledDatabaseBackup::class, 'database'); - } - - public function getCpuMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/cpu/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['percent']]; - }); - - return $parsedCollection->toArray(); - } - - public function getMemoryMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/memory/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['used']]; - }); - - return $parsedCollection->toArray(); - } - - public function isBackupSolutionAvailable() - { - return true; - } - - public function environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->orderBy('key', 'asc'); - } -} diff --git a/app/Models/StandalonePostgresql.php b/app/Models/StandalonePostgresql.php deleted file mode 100644 index dd92ae7c91..0000000000 --- a/app/Models/StandalonePostgresql.php +++ /dev/null @@ -1,323 +0,0 @@ - 'array', - 'postgres_password' => 'encrypted', - ]; - - protected static function booted() - { - static::created(function ($database) { - LocalPersistentVolume::create([ - 'name' => 'postgres-data-'.$database->uuid, - 'mount_path' => '/var/lib/postgresql/data', - 'host_path' => null, - 'resource_id' => $database->id, - 'resource_type' => $database->getMorphClass(), - 'is_readonly' => true, - ]); - }); - static::forceDeleting(function ($database) { - $database->persistentStorages()->delete(); - $database->scheduledBackups()->delete(); - $database->environment_variables()->delete(); - $database->tags()->detach(); - }); - static::saving(function ($database) { - if ($database->isDirty('status')) { - $database->forceFill(['last_online_at' => now()]); - } - }); - } - - public function workdir() - { - return database_configuration_dir()."/{$this->uuid}"; - } - - protected function serverStatus(): Attribute - { - return Attribute::make( - get: function () { - return $this->destination->server->isFunctional(); - } - ); - } - - public function delete_configurations() - { - $server = data_get($this, 'destination.server'); - $workdir = $this->workdir(); - if (str($workdir)->endsWith($this->uuid)) { - instant_remote_process(['rm -rf '.$this->workdir()], $server, false); - } - } - - public function delete_volumes(Collection $persistentStorages) - { - if ($persistentStorages->count() === 0) { - return; - } - $server = data_get($this, 'destination.server'); - foreach ($persistentStorages as $storage) { - instant_remote_process(["docker volume rm -f $storage->name"], $server, false); - } - } - - public function isConfigurationChanged(bool $save = false) - { - $newConfigHash = $this->image.$this->ports_mappings.$this->postgres_initdb_args.$this->postgres_host_auth_method; - $newConfigHash .= json_encode($this->environment_variables()->get('value')->sort()); - $newConfigHash = md5($newConfigHash); - $oldConfigHash = data_get($this, 'config_hash'); - if ($oldConfigHash === null) { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - if ($oldConfigHash === $newConfigHash) { - return false; - } else { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - } - - public function isRunning() - { - return (bool) str($this->status)->contains('running'); - } - - public function isExited() - { - return (bool) str($this->status)->startsWith('exited'); - } - - public function realStatus() - { - return $this->getRawOriginal('status'); - } - - public function status(): Attribute - { - return Attribute::make( - set: function ($value) { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - }, - get: function ($value) { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - }, - ); - } - - public function tags() - { - return $this->morphToMany(Tag::class, 'taggable'); - } - - public function project() - { - return data_get($this, 'environment.project'); - } - - public function link() - { - if (data_get($this, 'environment.project.uuid')) { - return route('project.database.configuration', [ - 'project_uuid' => data_get($this, 'environment.project.uuid'), - 'environment_uuid' => data_get($this, 'environment.uuid'), - 'database_uuid' => data_get($this, 'uuid'), - ]); - } - - return null; - } - - public function isLogDrainEnabled() - { - return data_get($this, 'is_log_drain_enabled', false); - } - - public function portsMappings(): Attribute - { - return Attribute::make( - set: fn ($value) => $value === '' ? null : $value, - ); - } - - public function portsMappingsArray(): Attribute - { - return Attribute::make( - get: fn () => is_null($this->ports_mappings) - ? [] - : explode(',', $this->ports_mappings), - - ); - } - - public function team() - { - return data_get($this, 'environment.project.team'); - } - - public function databaseType(): Attribute - { - return new Attribute( - get: fn () => $this->type(), - ); - } - - public function type(): string - { - return 'standalone-postgresql'; - } - - protected function internalDbUrl(): Attribute - { - return new Attribute( - get: fn () => "postgres://{$this->postgres_user}:{$this->postgres_password}@{$this->uuid}:5432/{$this->postgres_db}", - ); - } - - protected function externalDbUrl(): Attribute - { - return new Attribute( - get: function () { - if ($this->is_public && $this->public_port) { - return "postgres://{$this->postgres_user}:{$this->postgres_password}@{$this->destination->server->getIp}:{$this->public_port}/{$this->postgres_db}"; - } - - return null; - } - ); - } - - public function environment() - { - return $this->belongsTo(Environment::class); - } - - public function fileStorages() - { - return $this->morphMany(LocalFileVolume::class, 'resource'); - } - - public function destination() - { - return $this->morphTo(); - } - - public function runtime_environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable'); - } - - public function persistentStorages() - { - return $this->morphMany(LocalPersistentVolume::class, 'resource'); - } - - public function scheduledBackups() - { - return $this->morphMany(ScheduledDatabaseBackup::class, 'database'); - } - - public function isBackupSolutionAvailable() - { - return true; - } - - public function getCpuMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/cpu/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['percent']]; - }); - - return $parsedCollection->toArray(); - } - - public function getMemoryMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/memory/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['used']]; - }); - - return $parsedCollection->toArray(); - } - - public function environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->orderBy('key', 'asc'); - } -} diff --git a/app/Models/StandaloneRedis.php b/app/Models/StandaloneRedis.php deleted file mode 100644 index 6037364fe7..0000000000 --- a/app/Models/StandaloneRedis.php +++ /dev/null @@ -1,373 +0,0 @@ - 'redis-data-'.$database->uuid, - 'mount_path' => '/data', - 'host_path' => null, - 'resource_id' => $database->id, - 'resource_type' => $database->getMorphClass(), - 'is_readonly' => true, - ]); - }); - static::forceDeleting(function ($database) { - $database->persistentStorages()->delete(); - $database->scheduledBackups()->delete(); - $database->environment_variables()->delete(); - $database->tags()->detach(); - }); - static::saving(function ($database) { - if ($database->isDirty('status')) { - $database->forceFill(['last_online_at' => now()]); - } - }); - - static::retrieved(function ($database) { - if (! $database->redis_username) { - $database->redis_username = 'default'; - } - }); - } - - protected function serverStatus(): Attribute - { - return Attribute::make( - get: function () { - return $this->destination->server->isFunctional(); - } - ); - } - - public function isConfigurationChanged(bool $save = false) - { - $newConfigHash = $this->image.$this->ports_mappings.$this->redis_conf; - $newConfigHash .= json_encode($this->environment_variables()->get('value')->sort()); - $newConfigHash = md5($newConfigHash); - $oldConfigHash = data_get($this, 'config_hash'); - if ($oldConfigHash === null) { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - if ($oldConfigHash === $newConfigHash) { - return false; - } else { - if ($save) { - $this->config_hash = $newConfigHash; - $this->save(); - } - - return true; - } - } - - public function isRunning() - { - return (bool) str($this->status)->contains('running'); - } - - public function isExited() - { - return (bool) str($this->status)->startsWith('exited'); - } - - public function workdir() - { - return database_configuration_dir()."/{$this->uuid}"; - } - - public function delete_configurations() - { - $server = data_get($this, 'destination.server'); - $workdir = $this->workdir(); - if (str($workdir)->endsWith($this->uuid)) { - instant_remote_process(['rm -rf '.$this->workdir()], $server, false); - } - } - - public function delete_volumes(Collection $persistentStorages) - { - if ($persistentStorages->count() === 0) { - return; - } - $server = data_get($this, 'destination.server'); - foreach ($persistentStorages as $storage) { - instant_remote_process(["docker volume rm -f $storage->name"], $server, false); - } - } - - public function realStatus() - { - return $this->getRawOriginal('status'); - } - - public function status(): Attribute - { - return Attribute::make( - set: function ($value) { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - }, - get: function ($value) { - if (str($value)->contains('(')) { - $status = str($value)->before('(')->trim()->value(); - $health = str($value)->after('(')->before(')')->trim()->value() ?? 'unhealthy'; - } elseif (str($value)->contains(':')) { - $status = str($value)->before(':')->trim()->value(); - $health = str($value)->after(':')->trim()->value() ?? 'unhealthy'; - } else { - $status = $value; - $health = 'unhealthy'; - } - - return "$status:$health"; - }, - ); - } - - public function tags() - { - return $this->morphToMany(Tag::class, 'taggable'); - } - - public function project() - { - return data_get($this, 'environment.project'); - } - - public function team() - { - return data_get($this, 'environment.project.team'); - } - - public function link() - { - if (data_get($this, 'environment.project.uuid')) { - return route('project.database.configuration', [ - 'project_uuid' => data_get($this, 'environment.project.uuid'), - 'environment_uuid' => data_get($this, 'environment.uuid'), - 'database_uuid' => data_get($this, 'uuid'), - ]); - } - - return null; - } - - public function isLogDrainEnabled() - { - return data_get($this, 'is_log_drain_enabled', false); - } - - public function portsMappings(): Attribute - { - return Attribute::make( - set: fn ($value) => $value === '' ? null : $value, - ); - } - - public function portsMappingsArray(): Attribute - { - return Attribute::make( - get: fn () => is_null($this->ports_mappings) - ? [] - : explode(',', $this->ports_mappings), - - ); - } - - public function type(): string - { - return 'standalone-redis'; - } - - public function databaseType(): Attribute - { - return new Attribute( - get: fn () => $this->type(), - ); - } - - protected function internalDbUrl(): Attribute - { - return new Attribute( - get: function () { - $redis_version = $this->getRedisVersion(); - $username_part = version_compare($redis_version, '6.0', '>=') ? "{$this->redis_username}:" : ''; - - return "redis://{$username_part}{$this->redis_password}@{$this->uuid}:6379/0"; - } - ); - } - - protected function externalDbUrl(): Attribute - { - return new Attribute( - get: function () { - if ($this->is_public && $this->public_port) { - $redis_version = $this->getRedisVersion(); - $username_part = version_compare($redis_version, '6.0', '>=') ? "{$this->redis_username}:" : ''; - - return "redis://{$username_part}{$this->redis_password}@{$this->destination->server->getIp}:{$this->public_port}/0"; - } - - return null; - } - ); - } - - public function getRedisVersion() - { - $image_parts = explode(':', $this->image); - - return $image_parts[1] ?? '0.0'; - } - - public function environment() - { - return $this->belongsTo(Environment::class); - } - - public function fileStorages() - { - return $this->morphMany(LocalFileVolume::class, 'resource'); - } - - public function destination() - { - return $this->morphTo(); - } - - public function runtime_environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable'); - } - - public function persistentStorages() - { - return $this->morphMany(LocalPersistentVolume::class, 'resource'); - } - - public function scheduledBackups() - { - return $this->morphMany(ScheduledDatabaseBackup::class, 'database'); - } - - public function getCpuMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/cpu/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['percent']]; - }); - - return $parsedCollection->toArray(); - } - - public function getMemoryMetrics(int $mins = 5) - { - $server = $this->destination->server; - $container_name = $this->uuid; - $from = now()->subMinutes($mins)->toIso8601ZuluString(); - $metrics = instant_remote_process(["docker exec coolify-sentinel sh -c 'curl -H \"Authorization: Bearer {$server->settings->sentinel_token}\" http://localhost:8888/api/container/{$container_name}/memory/history?from=$from'"], $server, false); - if (str($metrics)->contains('error')) { - $error = json_decode($metrics, true); - $error = data_get($error, 'error', 'Something is not okay, are you okay?'); - if ($error === 'Unauthorized') { - $error = 'Unauthorized, please check your metrics token or restart Sentinel to set a new token.'; - } - throw new \Exception($error); - } - $metrics = json_decode($metrics, true); - $parsedCollection = collect($metrics)->map(function ($metric) { - return [(int) $metric['time'], (float) $metric['used']]; - }); - - return $parsedCollection->toArray(); - } - - public function isBackupSolutionAvailable() - { - return false; - } - - public function redisPassword(): Attribute - { - return new Attribute( - get: function () { - $password = $this->runtime_environment_variables()->where('key', 'REDIS_PASSWORD')->first(); - if (! $password) { - return null; - } - - return $password->value; - }, - - ); - } - - public function redisUsername(): Attribute - { - return new Attribute( - get: function () { - $username = $this->runtime_environment_variables()->where('key', 'REDIS_USERNAME')->first(); - if (! $username) { - $this->runtime_environment_variables()->create([ - 'key' => 'REDIS_USERNAME', - 'value' => 'default', - ]); - - return 'default'; - } - - return $username->value; - } - ); - } - - public function environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->orderBy('key', 'asc'); - } -} diff --git a/app/Models/Subscription.php b/app/Models/Subscription.php deleted file mode 100644 index 1bd84a6647..0000000000 --- a/app/Models/Subscription.php +++ /dev/null @@ -1,48 +0,0 @@ -belongsTo(Team::class); - } - - public function type() - { - if (isStripe()) { - if (! $this->stripe_plan_id) { - return 'zero'; - } - $subscription = Subscription::where('id', $this->id)->first(); - if (! $subscription) { - return null; - } - $subscriptionPlanId = data_get($subscription, 'stripe_plan_id'); - if (! $subscriptionPlanId) { - return null; - } - $subscriptionInvoicePaid = data_get($subscription, 'stripe_invoice_paid'); - if (! $subscriptionInvoicePaid) { - return null; - } - $subscriptionConfigs = collect(config('subscription')); - $stripePlanId = null; - $subscriptionConfigs->map(function ($value, $key) use ($subscriptionPlanId, &$stripePlanId) { - if ($value === $subscriptionPlanId) { - $stripePlanId = $key; - } - })->first(); - if ($stripePlanId) { - return str($stripePlanId)->after('stripe_price_id_')->before('_')->lower(); - } - } - - return 'zero'; - } -} diff --git a/app/Models/SwarmDocker.php b/app/Models/SwarmDocker.php deleted file mode 100644 index e0fe349c71..0000000000 --- a/app/Models/SwarmDocker.php +++ /dev/null @@ -1,82 +0,0 @@ -morphMany(Application::class, 'destination'); - } - - public function postgresqls() - { - return $this->morphMany(StandalonePostgresql::class, 'destination'); - } - - public function redis() - { - return $this->morphMany(StandaloneRedis::class, 'destination'); - } - - public function keydbs() - { - return $this->morphMany(StandaloneKeydb::class, 'destination'); - } - - public function dragonflies() - { - return $this->morphMany(StandaloneDragonfly::class, 'destination'); - } - - public function clickhouses() - { - return $this->morphMany(StandaloneClickhouse::class, 'destination'); - } - - public function mongodbs() - { - return $this->morphMany(StandaloneMongodb::class, 'destination'); - } - - public function mysqls() - { - return $this->morphMany(StandaloneMysql::class, 'destination'); - } - - public function mariadbs() - { - return $this->morphMany(StandaloneMariadb::class, 'destination'); - } - - public function server() - { - return $this->belongsTo(Server::class); - } - - public function services() - { - return $this->morphMany(Service::class, 'destination'); - } - - public function databases() - { - $postgresqls = $this->postgresqls; - $redis = $this->redis; - $mongodbs = $this->mongodbs; - $mysqls = $this->mysqls; - $mariadbs = $this->mariadbs; - $keydbs = $this->keydbs; - $dragonflies = $this->dragonflies; - $clickhouses = $this->clickhouses; - - return $postgresqls->concat($redis)->concat($mongodbs)->concat($mysqls)->concat($mariadbs)->concat($keydbs)->concat($dragonflies)->concat($clickhouses); - } - - public function attachedTo() - { - return $this->applications?->count() > 0 || $this->databases()->count() > 0; - } -} diff --git a/app/Models/Tag.php b/app/Models/Tag.php deleted file mode 100644 index a64c994a3a..0000000000 --- a/app/Models/Tag.php +++ /dev/null @@ -1,33 +0,0 @@ - strtolower($value), - set: fn ($value) => strtolower($value) - ); - } - - public static function ownedByCurrentTeam() - { - return Tag::whereTeamId(currentTeam()->id)->orderBy('name'); - } - - public function applications() - { - return $this->morphedByMany(Application::class, 'taggable'); - } - - public function services() - { - return $this->morphedByMany(Service::class, 'taggable'); - } -} diff --git a/app/Models/Team.php b/app/Models/Team.php deleted file mode 100644 index 6796b22ad7..0000000000 --- a/app/Models/Team.php +++ /dev/null @@ -1,306 +0,0 @@ - ['type' => 'integer', 'description' => 'The unique identifier of the team.'], - 'name' => ['type' => 'string', 'description' => 'The name of the team.'], - 'description' => ['type' => 'string', 'description' => 'The description of the team.'], - 'personal_team' => ['type' => 'boolean', 'description' => 'Whether the team is personal or not.'], - 'created_at' => ['type' => 'string', 'description' => 'The date and time the team was created.'], - 'updated_at' => ['type' => 'string', 'description' => 'The date and time the team was last updated.'], - 'show_boarding' => ['type' => 'boolean', 'description' => 'Whether to show the boarding screen or not.'], - 'custom_server_limit' => ['type' => 'string', 'description' => 'The custom server limit.'], - 'members' => new OA\Property( - property: 'members', - type: 'array', - items: new OA\Items(ref: '#/components/schemas/User'), - description: 'The members of the team.' - ), - ] -)] - -class Team extends Model implements SendsDiscord, SendsEmail, SendsPushover, SendsSlack -{ - use HasNotificationSettings, Notifiable; - - protected $guarded = []; - - protected $casts = [ - 'personal_team' => 'boolean', - ]; - - protected static function booted() - { - static::created(function ($team) { - $team->emailNotificationSettings()->create(); - $team->discordNotificationSettings()->create(); - $team->slackNotificationSettings()->create(); - $team->telegramNotificationSettings()->create(); - $team->pushoverNotificationSettings()->create(); - }); - - static::saving(function ($team) { - if (auth()->user()?->isMember()) { - throw new \Exception('You are not allowed to update this team.'); - } - }); - - static::deleting(function ($team) { - $keys = $team->privateKeys; - foreach ($keys as $key) { - $key->delete(); - } - $sources = $team->sources(); - foreach ($sources as $source) { - $source->delete(); - } - $tags = Tag::whereTeamId($team->id)->get(); - foreach ($tags as $tag) { - $tag->delete(); - } - $shared_variables = $team->environment_variables(); - foreach ($shared_variables as $shared_variable) { - $shared_variable->delete(); - } - $s3s = $team->s3s; - foreach ($s3s as $s3) { - $s3->delete(); - } - }); - } - - public static function serverLimitReached() - { - $serverLimit = Team::serverLimit(); - $team = currentTeam(); - $servers = $team->servers->count(); - - return $servers >= $serverLimit; - } - - public function subscriptionPastOverDue() - { - if (isCloud()) { - return $this->subscription?->stripe_past_due; - } - - return false; - } - - public function serverOverflow() - { - if ($this->serverLimit() < $this->servers->count()) { - return true; - } - - return false; - } - - public static function serverLimit() - { - if (currentTeam()->id === 0 && isDev()) { - return 9999999; - } - $team = Team::find(currentTeam()->id); - if (! $team) { - return 0; - } - - return data_get($team, 'limits', 0); - } - - public function limits(): Attribute - { - return Attribute::make( - get: function () { - if (config('constants.coolify.self_hosted') || $this->id === 0) { - return 999999999999; - } - - return $this->custom_server_limit ?? 2; - } - ); - } - - public function routeNotificationForDiscord() - { - return data_get($this, 'discord_webhook_url', null); - } - - public function routeNotificationForTelegram() - { - return [ - 'token' => data_get($this, 'telegram_token', null), - 'chat_id' => data_get($this, 'telegram_chat_id', null), - ]; - } - - public function routeNotificationForSlack() - { - return data_get($this, 'slack_webhook_url', null); - } - - public function routeNotificationForPushover() - { - return [ - 'user' => data_get($this, 'pushover_user_key', null), - 'token' => data_get($this, 'pushover_api_token', null), - ]; - } - - public function getRecipients($notification) - { - $recipients = data_get($notification, 'emails', null); - if (is_null($recipients)) { - return $this->members()->pluck('email')->toArray(); - } - - return explode(',', $recipients); - } - - public function isAnyNotificationEnabled() - { - if (isCloud()) { - return true; - } - - return $this->getNotificationSettings('email')?->isEnabled() || - $this->getNotificationSettings('discord')?->isEnabled() || - $this->getNotificationSettings('slack')?->isEnabled() || - $this->getNotificationSettings('telegram')?->isEnabled() || - $this->getNotificationSettings('pushover')?->isEnabled(); - } - - public function subscriptionEnded() - { - $this->subscription->update([ - 'stripe_subscription_id' => null, - 'stripe_plan_id' => null, - 'stripe_cancel_at_period_end' => false, - 'stripe_invoice_paid' => false, - 'stripe_trial_already_ended' => false, - 'stripe_past_due' => false, - ]); - foreach ($this->servers as $server) { - $server->settings()->update([ - 'is_usable' => false, - 'is_reachable' => false, - ]); - ServerReachabilityChanged::dispatch($server); - } - } - - public function environment_variables() - { - return $this->hasMany(SharedEnvironmentVariable::class)->whereNull('project_id')->whereNull('environment_id'); - } - - public function members() - { - return $this->belongsToMany(User::class, 'team_user', 'team_id', 'user_id')->withPivot('role'); - } - - public function subscription() - { - return $this->hasOne(Subscription::class); - } - - public function applications() - { - return $this->hasManyThrough(Application::class, Project::class); - } - - public function invitations() - { - return $this->hasMany(TeamInvitation::class); - } - - public function isEmpty() - { - if ($this->projects()->count() === 0 && $this->servers()->count() === 0 && $this->privateKeys()->count() === 0 && $this->sources()->count() === 0) { - return true; - } - - return false; - } - - public function projects() - { - return $this->hasMany(Project::class); - } - - public function servers() - { - return $this->hasMany(Server::class); - } - - public function privateKeys() - { - return $this->hasMany(PrivateKey::class); - } - - public function sources() - { - $sources = collect([]); - $github_apps = GithubApp::where(function ($query) { - $query->where(function ($q) { - $q->where('team_id', $this->id) - ->orWhere('is_system_wide', true); - })->where('is_public', false); - })->get(); - - $gitlab_apps = GitlabApp::where(function ($query) { - $query->where(function ($q) { - $q->where('team_id', $this->id) - ->orWhere('is_system_wide', true); - })->where('is_public', false); - })->get(); - - return $sources->merge($github_apps)->merge($gitlab_apps); - } - - public function s3s() - { - return $this->hasMany(S3Storage::class)->where('is_usable', true); - } - - public function emailNotificationSettings() - { - return $this->hasOne(EmailNotificationSettings::class); - } - - public function discordNotificationSettings() - { - return $this->hasOne(DiscordNotificationSettings::class); - } - - public function telegramNotificationSettings() - { - return $this->hasOne(TelegramNotificationSettings::class); - } - - public function slackNotificationSettings() - { - return $this->hasOne(SlackNotificationSettings::class); - } - - public function pushoverNotificationSettings() - { - return $this->hasOne(PushoverNotificationSettings::class); - } -} diff --git a/app/Models/TeamInvitation.php b/app/Models/TeamInvitation.php deleted file mode 100644 index bc1a90d586..0000000000 --- a/app/Models/TeamInvitation.php +++ /dev/null @@ -1,40 +0,0 @@ -belongsTo(Team::class); - } - - public static function ownedByCurrentTeam() - { - return TeamInvitation::whereTeamId(currentTeam()->id); - } - - public function isValid() - { - $createdAt = $this->created_at; - $diff = $createdAt->diffInDays(now()); - if ($diff <= config('constants.invitation.link.expiration_days')) { - return true; - } else { - $this->delete(); - - return false; - } - } -} diff --git a/app/Models/TelegramNotificationSettings.php b/app/Models/TelegramNotificationSettings.php deleted file mode 100644 index 78bd841bd4..0000000000 --- a/app/Models/TelegramNotificationSettings.php +++ /dev/null @@ -1,85 +0,0 @@ - 'boolean', - 'telegram_token' => 'encrypted', - 'telegram_chat_id' => 'encrypted', - - 'deployment_success_telegram_notifications' => 'boolean', - 'deployment_failure_telegram_notifications' => 'boolean', - 'status_change_telegram_notifications' => 'boolean', - 'backup_success_telegram_notifications' => 'boolean', - 'backup_failure_telegram_notifications' => 'boolean', - 'scheduled_task_success_telegram_notifications' => 'boolean', - 'scheduled_task_failure_telegram_notifications' => 'boolean', - 'docker_cleanup_telegram_notifications' => 'boolean', - 'server_disk_usage_telegram_notifications' => 'boolean', - 'server_reachable_telegram_notifications' => 'boolean', - 'server_unreachable_telegram_notifications' => 'boolean', - - 'telegram_notifications_deployment_success_thread_id' => 'encrypted', - 'telegram_notifications_deployment_failure_thread_id' => 'encrypted', - 'telegram_notifications_status_change_thread_id' => 'encrypted', - 'telegram_notifications_backup_success_thread_id' => 'encrypted', - 'telegram_notifications_backup_failure_thread_id' => 'encrypted', - 'telegram_notifications_scheduled_task_success_thread_id' => 'encrypted', - 'telegram_notifications_scheduled_task_failure_thread_id' => 'encrypted', - 'telegram_notifications_docker_cleanup_thread_id' => 'encrypted', - 'telegram_notifications_server_disk_usage_thread_id' => 'encrypted', - 'telegram_notifications_server_reachable_thread_id' => 'encrypted', - 'telegram_notifications_server_unreachable_thread_id' => 'encrypted', - ]; - - public function team() - { - return $this->belongsTo(Team::class); - } - - public function isEnabled() - { - return $this->telegram_enabled; - } -} diff --git a/app/Models/User.php b/app/Models/User.php deleted file mode 100644 index 7c23631c36..0000000000 --- a/app/Models/User.php +++ /dev/null @@ -1,224 +0,0 @@ - ['type' => 'integer', 'description' => 'The user identifier in the database.'], - 'name' => ['type' => 'string', 'description' => 'The user name.'], - 'email' => ['type' => 'string', 'description' => 'The user email.'], - 'email_verified_at' => ['type' => 'string', 'description' => 'The date when the user email was verified.'], - 'created_at' => ['type' => 'string', 'description' => 'The date when the user was created.'], - 'updated_at' => ['type' => 'string', 'description' => 'The date when the user was updated.'], - 'two_factor_confirmed_at' => ['type' => 'string', 'description' => 'The date when the user two factor was confirmed.'], - 'force_password_reset' => ['type' => 'boolean', 'description' => 'The flag to force the user to reset the password.'], - 'marketing_emails' => ['type' => 'boolean', 'description' => 'The flag to receive marketing emails.'], - ], -)] -class User extends Authenticatable implements SendsEmail -{ - use HasApiTokens, HasFactory, Notifiable, TwoFactorAuthenticatable; - - protected $guarded = []; - - protected $hidden = [ - 'password', - 'remember_token', - 'two_factor_recovery_codes', - 'two_factor_secret', - ]; - - protected $casts = [ - 'email_verified_at' => 'datetime', - 'force_password_reset' => 'boolean', - 'show_boarding' => 'boolean', - ]; - - protected static function boot() - { - parent::boot(); - static::created(function (User $user) { - $team = [ - 'name' => $user->name."'s Team", - 'personal_team' => true, - 'show_boarding' => true, - ]; - if ($user->id === 0) { - $team['id'] = 0; - $team['name'] = 'Root Team'; - } - $new_team = Team::create($team); - $user->teams()->attach($new_team, ['role' => 'owner']); - }); - } - - public function recreate_personal_team() - { - $team = [ - 'name' => $this->name."'s Team", - 'personal_team' => true, - 'show_boarding' => true, - ]; - if ($this->id === 0) { - $team['id'] = 0; - $team['name'] = 'Root Team'; - } - $new_team = Team::create($team); - $this->teams()->attach($new_team, ['role' => 'owner']); - - return $new_team; - } - - public function createToken(string $name, array $abilities = ['*'], ?DateTimeInterface $expiresAt = null) - { - $plainTextToken = sprintf( - '%s%s%s', - config('sanctum.token_prefix', ''), - $tokenEntropy = Str::random(40), - hash('crc32b', $tokenEntropy) - ); - - $token = $this->tokens()->create([ - 'name' => $name, - 'token' => hash('sha256', $plainTextToken), - 'abilities' => $abilities, - 'expires_at' => $expiresAt, - 'team_id' => session('currentTeam')->id, - ]); - - return new NewAccessToken($token, $token->getKey().'|'.$plainTextToken); - } - - public function teams() - { - return $this->belongsToMany(Team::class)->withPivot('role'); - } - - public function getRecipients($notification) - { - return $this->email; - } - - public function sendVerificationEmail() - { - $mail = new MailMessage; - $url = Url::temporarySignedRoute( - 'verify.verify', - Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)), - [ - 'id' => $this->getKey(), - 'hash' => sha1($this->getEmailForVerification()), - ] - ); - $mail->view('emails.email-verification', [ - 'url' => $url, - ]); - $mail->subject('Coolify: Verify your email.'); - send_user_an_email($mail, $this->email); - } - - public function sendPasswordResetNotification($token): void - { - $this?->notify(new TransactionalEmailsResetPassword($token)); - } - - public function isAdmin() - { - return $this->role() === 'admin' || $this->role() === 'owner'; - } - - public function isOwner() - { - return $this->role() === 'owner'; - } - - public function isMember() - { - return $this->role() === 'member'; - } - - public function isAdminFromSession() - { - if (Auth::id() === 0) { - return true; - } - $teams = $this->teams()->get(); - - $is_part_of_root_team = $teams->where('id', 0)->first(); - $is_admin_of_root_team = $is_part_of_root_team && - ($is_part_of_root_team->pivot->role === 'admin' || $is_part_of_root_team->pivot->role === 'owner'); - - if ($is_part_of_root_team && $is_admin_of_root_team) { - return true; - } - $team = $teams->where('id', session('currentTeam')->id)->first(); - $role = data_get($team, 'pivot.role'); - - return $role === 'admin' || $role === 'owner'; - } - - public function isInstanceAdmin() - { - $found_root_team = Auth::user()->teams->filter(function ($team) { - if ($team->id == 0) { - if (! Auth::user()->isAdmin()) { - return false; - } - - return true; - } - - return false; - }); - - return $found_root_team->count() > 0; - } - - public function currentTeam() - { - return Cache::remember('team:'.Auth::id(), 3600, function () { - if (is_null(data_get(session('currentTeam'), 'id')) && Auth::user()->teams->count() > 0) { - return Auth::user()->teams[0]; - } - - return Team::find(session('currentTeam')->id); - }); - } - - public function otherTeams() - { - return Auth::user()->teams->filter(function ($team) { - return $team->id != currentTeam()->id; - }); - } - - public function role() - { - if (data_get($this, 'pivot')) { - return $this->pivot->role; - } - $user = Auth::user()->teams->where('id', currentTeam()->id)->first(); - - return data_get($user, 'pivot.role'); - } -} diff --git a/app/Models/Webhook.php b/app/Models/Webhook.php deleted file mode 100644 index 8e2b629558..0000000000 --- a/app/Models/Webhook.php +++ /dev/null @@ -1,15 +0,0 @@ - 'string', - 'payload' => 'encrypted', - ]; -} diff --git a/app/Notifications/Application/DeploymentFailed.php b/app/Notifications/Application/DeploymentFailed.php deleted file mode 100644 index dec361e782..0000000000 --- a/app/Notifications/Application/DeploymentFailed.php +++ /dev/null @@ -1,188 +0,0 @@ -onQueue('high'); - $this->application = $application; - $this->deployment_uuid = $deployment_uuid; - $this->preview = $preview; - $this->application_name = data_get($application, 'name'); - $this->project_uuid = data_get($application, 'environment.project.uuid'); - $this->environment_uuid = data_get($application, 'environment.uuid'); - $this->environment_name = data_get($application, 'environment.name'); - $this->fqdn = data_get($application, 'fqdn'); - if (str($this->fqdn)->explode(',')->count() > 1) { - $this->fqdn = str($this->fqdn)->explode(',')->first(); - } - $this->deployment_url = base_url()."/project/{$this->project_uuid}/environment/{$this->environment_uuid}/application/{$this->application->uuid}/deployment/{$this->deployment_uuid}"; - } - - public function via(object $notifiable): array - { - return $notifiable->getEnabledChannels('deployment_failure'); - } - - public function toMail(): MailMessage - { - $mail = new MailMessage; - $pull_request_id = data_get($this->preview, 'pull_request_id', 0); - $fqdn = $this->fqdn; - if ($pull_request_id === 0) { - $mail->subject('Coolify: Deployment failed of '.$this->application_name.'.'); - } else { - $fqdn = $this->preview->fqdn; - $mail->subject('Coolify: Deployment failed of pull request #'.$this->preview->pull_request_id.' of '.$this->application_name.'.'); - } - $mail->view('emails.application-deployment-failed', [ - 'name' => $this->application_name, - 'fqdn' => $fqdn, - 'deployment_url' => $this->deployment_url, - 'pull_request_id' => data_get($this->preview, 'pull_request_id', 0), - ]); - - return $mail; - } - - public function toDiscord(): DiscordMessage - { - if ($this->preview) { - $message = new DiscordMessage( - title: ':cross_mark: Deployment failed', - description: 'Pull request: '.$this->preview->pull_request_id, - color: DiscordMessage::errorColor(), - isCritical: true, - ); - - $message->addField('Project', data_get($this->application, 'environment.project.name'), true); - $message->addField('Environment', $this->environment_name, true); - $message->addField('Name', $this->application_name, true); - - $message->addField('Deployment Logs', '[Link]('.$this->deployment_url.')'); - if ($this->fqdn) { - $message->addField('Domain', $this->fqdn, true); - } - } else { - if ($this->fqdn) { - $description = '[Open application]('.$this->fqdn.')'; - } else { - $description = ''; - } - $message = new DiscordMessage( - title: ':cross_mark: Deployment failed', - description: $description, - color: DiscordMessage::errorColor(), - isCritical: true, - ); - - $message->addField('Project', data_get($this->application, 'environment.project.name'), true); - $message->addField('Environment', $this->environment_name, true); - $message->addField('Name', $this->application_name, true); - - $message->addField('Deployment Logs', '[Link]('.$this->deployment_url.')'); - } - - return $message; - } - - public function toTelegram(): array - { - if ($this->preview) { - $message = 'Coolify: Pull request #'.$this->preview->pull_request_id.' of '.$this->application_name.' ('.$this->preview->fqdn.') deployment failed: '; - } else { - $message = 'Coolify: Deployment failed of '.$this->application_name.' ('.$this->fqdn.'): '; - } - $buttons[] = [ - 'text' => 'Deployment logs', - 'url' => $this->deployment_url, - ]; - - return [ - 'message' => $message, - 'buttons' => [ - ...$buttons, - ], - ]; - } - - public function toPushover(): PushoverMessage - { - if ($this->preview) { - $title = "Pull request #{$this->preview->pull_request_id} deployment failed"; - $message = "Pull request deployment failed for {$this->application_name}"; - } else { - $title = 'Deployment failed'; - $message = "Deployment failed for {$this->application_name}"; - } - - $buttons[] = [ - 'text' => 'Deployment logs', - 'url' => $this->deployment_url, - ]; - - return new PushoverMessage( - title: $title, - level: 'error', - message: $message, - buttons: [ - ...$buttons, - ], - ); - } - - public function toSlack(): SlackMessage - { - if ($this->preview) { - $title = "Pull request #{$this->preview->pull_request_id} deployment failed"; - $description = "Pull request deployment failed for {$this->application_name}"; - if ($this->preview->fqdn) { - $description .= "\nPreview URL: {$this->preview->fqdn}"; - } - } else { - $title = 'Deployment failed'; - $description = "Deployment failed for {$this->application_name}"; - if ($this->fqdn) { - $description .= "\nApplication URL: {$this->fqdn}"; - } - } - - $description .= "\n\n*Project:* ".data_get($this->application, 'environment.project.name'); - $description .= "\n*Environment:* {$this->environment_name}"; - $description .= "\n*<{$this->deployment_url}|Deployment Logs>*"; - - return new SlackMessage( - title: $title, - description: $description, - color: SlackMessage::errorColor() - ); - } -} diff --git a/app/Notifications/Application/DeploymentSuccess.php b/app/Notifications/Application/DeploymentSuccess.php deleted file mode 100644 index 9b59d9162a..0000000000 --- a/app/Notifications/Application/DeploymentSuccess.php +++ /dev/null @@ -1,208 +0,0 @@ -onQueue('high'); - $this->application = $application; - $this->deployment_uuid = $deployment_uuid; - $this->preview = $preview; - $this->application_name = data_get($application, 'name'); - $this->project_uuid = data_get($application, 'environment.project.uuid'); - $this->environment_uuid = data_get($application, 'environment.uuid'); - $this->environment_name = data_get($application, 'environment.name'); - $this->fqdn = data_get($application, 'fqdn'); - if (str($this->fqdn)->explode(',')->count() > 1) { - $this->fqdn = str($this->fqdn)->explode(',')->first(); - } - $this->deployment_url = base_url()."/project/{$this->project_uuid}/environment/{$this->environment_uuid}/application/{$this->application->uuid}/deployment/{$this->deployment_uuid}"; - } - - public function via(object $notifiable): array - { - return $notifiable->getEnabledChannels('deployment_success'); - } - - public function toMail(): MailMessage - { - $mail = new MailMessage; - $pull_request_id = data_get($this->preview, 'pull_request_id', 0); - $fqdn = $this->fqdn; - if ($pull_request_id === 0) { - $mail->subject("Coolify: New version is deployed of {$this->application_name}"); - } else { - $fqdn = $this->preview->fqdn; - $mail->subject("Coolify: Pull request #{$pull_request_id} of {$this->application_name} deployed successfully"); - } - $mail->view('emails.application-deployment-success', [ - 'name' => $this->application_name, - 'fqdn' => $fqdn, - 'deployment_url' => $this->deployment_url, - 'pull_request_id' => $pull_request_id, - ]); - - return $mail; - } - - public function toDiscord(): DiscordMessage - { - if ($this->preview) { - $message = new DiscordMessage( - title: ':white_check_mark: Preview deployment successful', - description: 'Pull request: '.$this->preview->pull_request_id, - color: DiscordMessage::successColor(), - ); - - if ($this->preview->fqdn) { - $message->addField('Application', '[Link]('.$this->preview->fqdn.')'); - } - - $message->addField('Project', data_get($this->application, 'environment.project.name'), true); - $message->addField('Environment', $this->environment_name, true); - $message->addField('Name', $this->application_name, true); - $message->addField('Deployment logs', '[Link]('.$this->deployment_url.')'); - } else { - if ($this->fqdn) { - $description = '[Open application]('.$this->fqdn.')'; - } else { - $description = ''; - } - $message = new DiscordMessage( - title: ':white_check_mark: New version successfully deployed', - description: $description, - color: DiscordMessage::successColor(), - ); - $message->addField('Project', data_get($this->application, 'environment.project.name'), true); - $message->addField('Environment', $this->environment_name, true); - $message->addField('Name', $this->application_name, true); - - $message->addField('Deployment logs', '[Link]('.$this->deployment_url.')'); - } - - return $message; - } - - public function toTelegram(): array - { - if ($this->preview) { - $message = 'Coolify: New PR'.$this->preview->pull_request_id.' version successfully deployed of '.$this->application_name.''; - if ($this->preview->fqdn) { - $buttons[] = [ - 'text' => 'Open Application', - 'url' => $this->preview->fqdn, - ]; - } - } else { - $message = '✅ New version successfully deployed of '.$this->application_name.''; - if ($this->fqdn) { - $buttons[] = [ - 'text' => 'Open Application', - 'url' => $this->fqdn, - ]; - } - } - $buttons[] = [ - 'text' => 'Deployment logs', - 'url' => $this->deployment_url, - ]; - - return [ - 'message' => $message, - 'buttons' => [ - ...$buttons, - ], - ]; - } - - public function toPushover(): PushoverMessage - { - if ($this->preview) { - $title = "Pull request #{$this->preview->pull_request_id} successfully deployed"; - $message = 'New PR'.$this->preview->pull_request_id.' version successfully deployed of '.$this->application_name.''; - if ($this->preview->fqdn) { - $buttons[] = [ - 'text' => 'Open Application', - 'url' => $this->preview->fqdn, - ]; - } - } else { - $title = 'New version successfully deployed'; - $message = 'New version successfully deployed of '.$this->application_name.''; - if ($this->fqdn) { - $buttons[] = [ - 'text' => 'Open Application', - 'url' => $this->fqdn, - ]; - } - } - $buttons[] = [ - 'text' => 'Deployment logs', - 'url' => $this->deployment_url, - ]; - - return new PushoverMessage( - title: $title, - level: 'success', - message: $message, - buttons: [ - ...$buttons, - ], - ); - } - - public function toSlack(): SlackMessage - { - if ($this->preview) { - $title = "Pull request #{$this->preview->pull_request_id} successfully deployed"; - $description = "New version successfully deployed for {$this->application_name}"; - if ($this->preview->fqdn) { - $description .= "\nPreview URL: {$this->preview->fqdn}"; - } - } else { - $title = 'New version successfully deployed'; - $description = "New version successfully deployed for {$this->application_name}"; - if ($this->fqdn) { - $description .= "\nApplication URL: {$this->fqdn}"; - } - } - - $description .= "\n\n*Project:* ".data_get($this->application, 'environment.project.name'); - $description .= "\n*Environment:* {$this->environment_name}"; - $description .= "\n*<{$this->deployment_url}|Deployment Logs>*"; - - return new SlackMessage( - title: $title, - description: $description, - color: SlackMessage::successColor() - ); - } -} diff --git a/app/Notifications/Application/StatusChanged.php b/app/Notifications/Application/StatusChanged.php deleted file mode 100644 index fab5487ef4..0000000000 --- a/app/Notifications/Application/StatusChanged.php +++ /dev/null @@ -1,116 +0,0 @@ -onQueue('high'); - $this->resource_name = data_get($resource, 'name'); - $this->project_uuid = data_get($resource, 'environment.project.uuid'); - $this->environment_uuid = data_get($resource, 'environment.uuid'); - $this->environment_name = data_get($resource, 'environment.name'); - $this->fqdn = data_get($resource, 'fqdn', null); - if (str($this->fqdn)->explode(',')->count() > 1) { - $this->fqdn = str($this->fqdn)->explode(',')->first(); - } - $this->resource_url = base_url()."/project/{$this->project_uuid}/environment/{$this->environment_uuid}/application/{$this->resource->uuid}"; - } - - public function via(object $notifiable): array - { - return $notifiable->getEnabledChannels('status_change'); - } - - public function toMail(): MailMessage - { - $mail = new MailMessage; - $fqdn = $this->fqdn; - $mail->subject("Coolify: {$this->resource_name} has been stopped"); - $mail->view('emails.application-status-changes', [ - 'name' => $this->resource_name, - 'fqdn' => $fqdn, - 'resource_url' => $this->resource_url, - ]); - - return $mail; - } - - public function toDiscord(): DiscordMessage - { - return new DiscordMessage( - title: ':cross_mark: Application stopped', - description: '[Open Application in Coolify]('.$this->resource_url.')', - color: DiscordMessage::errorColor(), - isCritical: true, - ); - } - - public function toTelegram(): array - { - $message = 'Coolify: '.$this->resource_name.' has been stopped.'; - - return [ - 'message' => $message, - 'buttons' => [ - [ - 'text' => 'Open Application in Coolify', - 'url' => $this->resource_url, - ], - ], - ]; - } - - public function toPushover(): PushoverMessage - { - $message = $this->resource_name.' has been stopped.'; - - return new PushoverMessage( - title: 'Application stopped', - level: 'error', - message: $message, - buttons: [ - [ - 'text' => 'Open Application in Coolify', - 'url' => $this->resource_url, - ], - ], - ); - } - - public function toSlack(): SlackMessage - { - $title = 'Application stopped'; - $description = "{$this->resource_name} has been stopped"; - - $description .= "\n\n*Project:* ".data_get($this->resource, 'environment.project.name'); - $description .= "\n*Environment:* {$this->environment_name}"; - $description .= "\n*Application URL:* {$this->resource_url}"; - - return new SlackMessage( - title: $title, - description: $description, - color: SlackMessage::errorColor() - ); - } -} diff --git a/app/Notifications/Channels/DiscordChannel.php b/app/Notifications/Channels/DiscordChannel.php deleted file mode 100644 index 362006d8ec..0000000000 --- a/app/Notifications/Channels/DiscordChannel.php +++ /dev/null @@ -1,25 +0,0 @@ -toDiscord(); - - $discordSettings = $notifiable->discordNotificationSettings; - - if (! $discordSettings || ! $discordSettings->isEnabled() || ! $discordSettings->discord_webhook_url) { - return; - } - - SendMessageToDiscordJob::dispatch($message, $discordSettings->discord_webhook_url); - } -} diff --git a/app/Notifications/Channels/EmailChannel.php b/app/Notifications/Channels/EmailChannel.php deleted file mode 100644 index 215fae4ea8..0000000000 --- a/app/Notifications/Channels/EmailChannel.php +++ /dev/null @@ -1,90 +0,0 @@ -bootConfigs($notifiable); - $recipients = $notifiable->getRecipients($notification); - if (count($recipients) === 0) { - throw new Exception('No email recipients found'); - } - - $mailMessage = $notification->toMail($notifiable); - Mail::send( - [], - [], - fn (Message $message) => $message - ->to($recipients) - ->subject($mailMessage->subject) - ->html((string) $mailMessage->render()) - ); - } catch (Exception $e) { - $error = $e->getMessage(); - if ($error === 'No email settings found.') { - throw $e; - } - $message = "EmailChannel error: {$e->getMessage()}. Failed to send email to:"; - if (isset($recipients)) { - $message .= implode(', ', $recipients); - } - if (isset($mailMessage)) { - $message .= " with subject: {$mailMessage->subject}"; - } - send_internal_notification($message); - throw $e; - } - } - - private function bootConfigs($notifiable): void - { - $emailSettings = $notifiable->emailNotificationSettings; - - if ($emailSettings->use_instance_email_settings) { - $type = set_transanctional_email_settings(); - if (blank($type)) { - throw new Exception('No email settings found.'); - } - - return; - } - - config()->set('mail.from.address', $emailSettings->smtp_from_address ?? 'test@example.com'); - config()->set('mail.from.name', $emailSettings->smtp_from_name ?? 'Test'); - - if ($emailSettings->resend_enabled) { - config()->set('mail.default', 'resend'); - config()->set('resend.api_key', $emailSettings->resend_api_key); - } - - if ($emailSettings->smtp_enabled) { - $encryption = match (strtolower($emailSettings->smtp_encryption)) { - 'starttls' => null, - 'tls' => 'tls', - 'none' => null, - default => null, - }; - - config()->set('mail.default', 'smtp'); - config()->set('mail.mailers.smtp', [ - 'transport' => 'smtp', - 'host' => $emailSettings->smtp_host, - 'port' => $emailSettings->smtp_port, - 'encryption' => $encryption, - 'username' => $emailSettings->smtp_username, - 'password' => $emailSettings->smtp_password, - 'timeout' => $emailSettings->smtp_timeout, - 'local_domain' => null, - 'auto_tls' => $emailSettings->smtp_encryption === 'none' ? '0' : '', // If encryption is "none", it will not try to upgrade to TLS via StartTLS to make sure it is unencrypted. - ]); - } - } -} diff --git a/app/Notifications/Channels/PushoverChannel.php b/app/Notifications/Channels/PushoverChannel.php deleted file mode 100644 index 3d3728d01f..0000000000 --- a/app/Notifications/Channels/PushoverChannel.php +++ /dev/null @@ -1,21 +0,0 @@ -toPushover(); - $pushoverSettings = $notifiable->pushoverNotificationSettings; - - if (! $pushoverSettings || ! $pushoverSettings->isEnabled() || ! $pushoverSettings->pushover_user_key || ! $pushoverSettings->pushover_api_token) { - return; - } - - SendMessageToPushoverJob::dispatch($message, $pushoverSettings->pushover_api_token, $pushoverSettings->pushover_user_key); - } -} diff --git a/app/Notifications/Channels/SendsDiscord.php b/app/Notifications/Channels/SendsDiscord.php deleted file mode 100644 index fdaa9fc60e..0000000000 --- a/app/Notifications/Channels/SendsDiscord.php +++ /dev/null @@ -1,8 +0,0 @@ -toSlack(); - $slackSettings = $notifiable->slackNotificationSettings; - - if (! $slackSettings || ! $slackSettings->isEnabled() || ! $slackSettings->slack_webhook_url) { - return; - } - - SendMessageToSlackJob::dispatch($message, $slackSettings->slack_webhook_url); - } -} diff --git a/app/Notifications/Channels/TelegramChannel.php b/app/Notifications/Channels/TelegramChannel.php deleted file mode 100644 index ea4ab71715..0000000000 --- a/app/Notifications/Channels/TelegramChannel.php +++ /dev/null @@ -1,47 +0,0 @@ -toTelegram($notifiable); - $settings = $notifiable->telegramNotificationSettings; - - $message = data_get($data, 'message'); - $buttons = data_get($data, 'buttons', []); - $telegramToken = $settings->telegram_token; - $chatId = $settings->telegram_chat_id; - - $threadId = match (get_class($notification)) { - \App\Notifications\Application\DeploymentSuccess::class => $settings->telegram_notifications_deployment_success_thread_id, - \App\Notifications\Application\DeploymentFailed::class => $settings->telegram_notifications_deployment_failure_thread_id, - \App\Notifications\Application\StatusChanged::class, - \App\Notifications\Container\ContainerRestarted::class, - \App\Notifications\Container\ContainerStopped::class => $settings->telegram_notifications_status_change_thread_id, - - \App\Notifications\Database\BackupSuccess::class => $settings->telegram_notifications_backup_success_thread_id, - \App\Notifications\Database\BackupFailed::class => $settings->telegram_notifications_backup_failure_thread_id, - - \App\Notifications\ScheduledTask\TaskSuccess::class => $settings->telegram_notifications_scheduled_task_success_thread_id, - \App\Notifications\ScheduledTask\TaskFailed::class => $settings->telegram_notifications_scheduled_task_failure_thread_id, - - \App\Notifications\Server\DockerCleanupSuccess::class => $settings->telegram_notifications_docker_cleanup_success_thread_id, - \App\Notifications\Server\DockerCleanupFailed::class => $settings->telegram_notifications_docker_cleanup_failure_thread_id, - \App\Notifications\Server\HighDiskUsage::class => $settings->telegram_notifications_server_disk_usage_thread_id, - \App\Notifications\Server\Unreachable::class => $settings->telegram_notifications_server_unreachable_thread_id, - \App\Notifications\Server\Reachable::class => $settings->telegram_notifications_server_reachable_thread_id, - - default => null, - }; - - if (! $telegramToken || ! $chatId || ! $message) { - return; - } - - SendMessageToTelegramJob::dispatch($message, $buttons, $telegramToken, $chatId, $threadId); - } -} diff --git a/app/Notifications/Channels/TransactionalEmailChannel.php b/app/Notifications/Channels/TransactionalEmailChannel.php deleted file mode 100644 index 114d1f6eda..0000000000 --- a/app/Notifications/Channels/TransactionalEmailChannel.php +++ /dev/null @@ -1,42 +0,0 @@ -email; - if (! $email) { - return; - } - $this->bootConfigs(); - $mailMessage = $notification->toMail($notifiable); - Mail::send( - [], - [], - fn (Message $message) => $message - ->to($email) - ->subject($mailMessage->subject) - ->html((string) $mailMessage->render()) - ); - } - - private function bootConfigs(): void - { - $type = set_transanctional_email_settings(); - if (blank($type)) { - throw new Exception('No email settings found.'); - } - } -} diff --git a/app/Notifications/Container/ContainerRestarted.php b/app/Notifications/Container/ContainerRestarted.php deleted file mode 100644 index f6ae694819..0000000000 --- a/app/Notifications/Container/ContainerRestarted.php +++ /dev/null @@ -1,105 +0,0 @@ -onQueue('high'); - } - - public function via(object $notifiable): array - { - return $notifiable->getEnabledChannels('status_change'); - } - - public function toMail(): MailMessage - { - $mail = new MailMessage; - $mail->subject("Coolify: A resource ({$this->name}) has been restarted automatically on {$this->server->name}"); - $mail->view('emails.container-restarted', [ - 'containerName' => $this->name, - 'serverName' => $this->server->name, - 'url' => $this->url, - ]); - - return $mail; - } - - public function toDiscord(): DiscordMessage - { - $message = new DiscordMessage( - title: ':warning: Resource restarted', - description: "{$this->name} has been restarted automatically on {$this->server->name}.", - color: DiscordMessage::infoColor(), - ); - - if ($this->url) { - $message->addField('Resource', '[Link]('.$this->url.')'); - } - - return $message; - } - - public function toTelegram(): array - { - $message = "Coolify: A resource ({$this->name}) has been restarted automatically on {$this->server->name}"; - $payload = [ - 'message' => $message, - ]; - if ($this->url) { - $payload['buttons'] = [ - [ - [ - 'text' => 'Check Proxy in Coolify', - 'url' => $this->url, - ], - ], - ]; - } - - return $payload; - } - - public function toPushover(): PushoverMessage - { - $buttons = []; - if ($this->url) { - $buttons[] = [ - 'text' => 'Check Proxy in Coolify', - 'url' => $this->url, - ]; - } - - return new PushoverMessage( - title: 'Resource restarted', - level: 'warning', - message: "A resource ({$this->name}) has been restarted automatically on {$this->server->name}", - buttons: $buttons, - ); - } - - public function toSlack(): SlackMessage - { - $title = 'Resource restarted'; - $description = "A resource ({$this->name}) has been restarted automatically on {$this->server->name}"; - - if ($this->url) { - $description .= "\n*Resource URL:* {$this->url}"; - } - - return new SlackMessage( - title: $title, - description: $description, - color: SlackMessage::warningColor() - ); - } -} diff --git a/app/Notifications/Container/ContainerStopped.php b/app/Notifications/Container/ContainerStopped.php deleted file mode 100644 index fc9410a851..0000000000 --- a/app/Notifications/Container/ContainerStopped.php +++ /dev/null @@ -1,105 +0,0 @@ -onQueue('high'); - } - - public function via(object $notifiable): array - { - return $notifiable->getEnabledChannels('status_change'); - } - - public function toMail(): MailMessage - { - $mail = new MailMessage; - $mail->subject("Coolify: A resource has been stopped unexpectedly on {$this->server->name}"); - $mail->view('emails.container-stopped', [ - 'containerName' => $this->name, - 'serverName' => $this->server->name, - 'url' => $this->url, - ]); - - return $mail; - } - - public function toDiscord(): DiscordMessage - { - $message = new DiscordMessage( - title: ':cross_mark: Resource stopped', - description: "{$this->name} has been stopped unexpectedly on {$this->server->name}.", - color: DiscordMessage::errorColor(), - ); - - if ($this->url) { - $message->addField('Resource', '[Link]('.$this->url.')'); - } - - return $message; - } - - public function toTelegram(): array - { - $message = "Coolify: A resource ($this->name) has been stopped unexpectedly on {$this->server->name}"; - $payload = [ - 'message' => $message, - ]; - if ($this->url) { - $payload['buttons'] = [ - [ - [ - 'text' => 'Open Application in Coolify', - 'url' => $this->url, - ], - ], - ]; - } - - return $payload; - } - - public function toPushover(): PushoverMessage - { - $buttons = []; - if ($this->url) { - $buttons[] = [ - 'text' => 'Open Application in Coolify', - 'url' => $this->url, - ]; - } - - return new PushoverMessage( - title: 'Resource stopped', - level: 'error', - message: "A resource ({$this->name}) has been stopped unexpectedly on {$this->server->name}", - buttons: $buttons, - ); - } - - public function toSlack(): SlackMessage - { - $title = 'Resource stopped'; - $description = "A resource ({$this->name}) has been stopped unexpectedly on {$this->server->name}"; - - if ($this->url) { - $description .= "\n*Resource URL:* {$this->url}"; - } - - return new SlackMessage( - title: $title, - description: $description, - color: SlackMessage::errorColor() - ); - } -} diff --git a/app/Notifications/CustomEmailNotification.php b/app/Notifications/CustomEmailNotification.php deleted file mode 100644 index c3c89b30f4..0000000000 --- a/app/Notifications/CustomEmailNotification.php +++ /dev/null @@ -1,18 +0,0 @@ -onQueue('high'); - $this->name = $database->name; - $this->frequency = $backup->frequency; - } - - public function via(object $notifiable): array - { - return $notifiable->getEnabledChannels('backup_failure'); - } - - public function toMail(): MailMessage - { - $mail = new MailMessage; - $mail->subject("Coolify: [ACTION REQUIRED] Database Backup FAILED for {$this->database->name}"); - $mail->view('emails.backup-failed', [ - 'name' => $this->name, - 'database_name' => $this->database_name, - 'frequency' => $this->frequency, - 'output' => $this->output, - ]); - - return $mail; - } - - public function toDiscord(): DiscordMessage - { - $message = new DiscordMessage( - title: ':cross_mark: Database backup failed', - description: "Database backup for {$this->name} (db:{$this->database_name}) has FAILED.", - color: DiscordMessage::errorColor(), - isCritical: true, - ); - - $message->addField('Frequency', $this->frequency, true); - $message->addField('Output', $this->output); - - return $message; - } - - public function toTelegram(): array - { - $message = "Coolify: Database backup for {$this->name} (db:{$this->database_name}) with frequency of {$this->frequency} was FAILED.\n\nReason:\n{$this->output}"; - - return [ - 'message' => $message, - ]; - } - - public function toPushover(): PushoverMessage - { - return new PushoverMessage( - title: 'Database backup failed', - level: 'error', - message: "Database backup for {$this->name} (db:{$this->database_name}) was FAILED

Frequency: {$this->frequency} .
Reason: {$this->output}", - ); - } - - public function toSlack(): SlackMessage - { - $title = 'Database backup failed'; - $description = "Database backup for {$this->name} (db:{$this->database_name}) has FAILED."; - - $description .= "\n\n*Frequency:* {$this->frequency}"; - $description .= "\n\n*Error Output:* {$this->output}"; - - return new SlackMessage( - title: $title, - description: $description, - color: SlackMessage::errorColor() - ); - } -} diff --git a/app/Notifications/Database/BackupSuccess.php b/app/Notifications/Database/BackupSuccess.php deleted file mode 100644 index 78bcfafe35..0000000000 --- a/app/Notifications/Database/BackupSuccess.php +++ /dev/null @@ -1,88 +0,0 @@ -onQueue('high'); - - $this->name = $database->name; - $this->frequency = $backup->frequency; - } - - public function via(object $notifiable): array - { - return $notifiable->getEnabledChannels('backup_success'); - } - - public function toMail(): MailMessage - { - $mail = new MailMessage; - $mail->subject("Coolify: Backup successfully done for {$this->database->name}"); - $mail->view('emails.backup-success', [ - 'name' => $this->name, - 'database_name' => $this->database_name, - 'frequency' => $this->frequency, - ]); - - return $mail; - } - - public function toDiscord(): DiscordMessage - { - $message = new DiscordMessage( - title: ':white_check_mark: Database backup successful', - description: "Database backup for {$this->name} (db:{$this->database_name}) was successful.", - color: DiscordMessage::successColor(), - ); - - $message->addField('Frequency', $this->frequency, true); - - return $message; - } - - public function toTelegram(): array - { - $message = "Coolify: Database backup for {$this->name} (db:{$this->database_name}) with frequency of {$this->frequency} was successful."; - - return [ - 'message' => $message, - ]; - } - - public function toPushover(): PushoverMessage - { - return new PushoverMessage( - title: 'Database backup successful', - level: 'success', - message: "Database backup for {$this->name} (db:{$this->database_name}) was successful.

Frequency: {$this->frequency}.", - ); - } - - public function toSlack(): SlackMessage - { - $title = 'Database backup successful'; - $description = "Database backup for {$this->name} (db:{$this->database_name}) was successful."; - - $description .= "\n\n*Frequency:* {$this->frequency}"; - - return new SlackMessage( - title: $title, - description: $description, - color: SlackMessage::successColor() - ); - } -} diff --git a/app/Notifications/Dto/DiscordMessage.php b/app/Notifications/Dto/DiscordMessage.php deleted file mode 100644 index 278bfd1b69..0000000000 --- a/app/Notifications/Dto/DiscordMessage.php +++ /dev/null @@ -1,83 +0,0 @@ -fields[] = [ - 'name' => $name, - 'value' => $value, - 'inline' => $inline, - ]; - - return $this; - } - - public function toPayload(): array - { - $footerText = 'Coolify v'.config('constants.coolify.version'); - if (isCloud()) { - $footerText = 'Coolify Cloud'; - } - $payload = [ - 'embeds' => [ - [ - 'title' => $this->title, - 'description' => $this->description, - 'color' => $this->color, - 'fields' => $this->addTimestampToFields($this->fields), - 'footer' => [ - 'text' => $footerText, - ], - ], - ], - ]; - if ($this->isCritical) { - $payload['content'] = '@here'; - } - - return $payload; - } - - private function addTimestampToFields(array $fields): array - { - $fields[] = [ - 'name' => 'Time', - 'value' => 'timestamp.':R>', - 'inline' => true, - ]; - - return $fields; - } -} diff --git a/app/Notifications/Dto/PushoverMessage.php b/app/Notifications/Dto/PushoverMessage.php deleted file mode 100644 index abf6f1b7ac..0000000000 --- a/app/Notifications/Dto/PushoverMessage.php +++ /dev/null @@ -1,50 +0,0 @@ -level) { - 'info' => 'ℹ️', - 'error' => '❌', - 'success' => '✅ ', - 'warning' => '⚠️', - }; - } - - public function toPayload(string $token, string $user): array - { - $levelIcon = $this->getLevelIcon(); - $payload = [ - 'token' => $token, - 'user' => $user, - 'title' => "{$levelIcon} {$this->title}", - 'message' => $this->message, - 'html' => 1, - ]; - - foreach ($this->buttons as $button) { - $buttonUrl = data_get($button, 'url'); - $text = data_get($button, 'text', 'Click here'); - if ($buttonUrl && str_contains($buttonUrl, 'http://localhost')) { - $buttonUrl = str_replace('http://localhost', config('app.url'), $buttonUrl); - } - $payload['message'] .= " ".$text.''; - } - - Log::info('Pushover message', $payload); - - return $payload; - } -} diff --git a/app/Notifications/Dto/SlackMessage.php b/app/Notifications/Dto/SlackMessage.php deleted file mode 100644 index 879bf65472..0000000000 --- a/app/Notifications/Dto/SlackMessage.php +++ /dev/null @@ -1,32 +0,0 @@ -onQueue('high'); - } - - public function via(object $notifiable): array - { - return $notifiable->getEnabledChannels('general'); - } - - public function toDiscord(): DiscordMessage - { - return new DiscordMessage( - title: 'Coolify: General Notification', - description: $this->message, - color: DiscordMessage::infoColor(), - ); - } - - public function toTelegram(): array - { - return [ - 'message' => $this->message, - ]; - } - - public function toPushover(): PushoverMessage - { - return new PushoverMessage( - title: 'General Notification', - level: 'info', - message: $this->message, - ); - } - - public function toSlack(): SlackMessage - { - return new SlackMessage( - title: 'Coolify: General Notification', - description: $this->message, - color: SlackMessage::infoColor(), - ); - } -} diff --git a/app/Notifications/ScheduledTask/TaskFailed.php b/app/Notifications/ScheduledTask/TaskFailed.php deleted file mode 100644 index eb4fc7e79f..0000000000 --- a/app/Notifications/ScheduledTask/TaskFailed.php +++ /dev/null @@ -1,117 +0,0 @@ -onQueue('high'); - if ($task->application) { - $this->url = $task->application->taskLink($task->uuid); - } elseif ($task->service) { - $this->url = $task->service->taskLink($task->uuid); - } - } - - public function via(object $notifiable): array - { - return $notifiable->getEnabledChannels('scheduled_task_failure'); - } - - public function toMail(): MailMessage - { - $mail = new MailMessage; - $mail->subject("Coolify: [ACTION REQUIRED] Scheduled task ({$this->task->name}) failed."); - $mail->view('emails.scheduled-task-failed', [ - 'task' => $this->task, - 'url' => $this->url, - 'output' => $this->output, - ]); - - return $mail; - } - - public function toDiscord(): DiscordMessage - { - $message = new DiscordMessage( - title: ':cross_mark: Scheduled task failed', - description: "Scheduled task ({$this->task->name}) failed.", - color: DiscordMessage::errorColor(), - ); - - if ($this->url) { - $message->addField('Scheduled task', '[Link]('.$this->url.')'); - } - - return $message; - } - - public function toTelegram(): array - { - $message = "Coolify: Scheduled task ({$this->task->name}) failed with output: {$this->output}"; - if ($this->url) { - $buttons[] = [ - 'text' => 'Open task in Coolify', - 'url' => (string) $this->url, - ]; - } - - return [ - 'message' => $message, - ]; - } - - public function toPushover(): PushoverMessage - { - $message = "Scheduled task ({$this->task->name}) failed
"; - - if ($this->output) { - $message .= "
Error Output:{$this->output}"; - } - - $buttons = []; - if ($this->url) { - $buttons[] = [ - 'text' => 'Open task in Coolify', - 'url' => (string) $this->url, - ]; - } - - return new PushoverMessage( - title: 'Scheduled task failed', - level: 'error', - message: $message, - buttons: $buttons, - ); - } - - public function toSlack(): SlackMessage - { - $title = 'Scheduled task failed'; - $description = "Scheduled task ({$this->task->name}) failed."; - - if ($this->output) { - $description .= "\n\n*Error Output:* {$this->output}"; - } - - if ($this->url) { - $description .= "\n\n*Task URL:* {$this->url}"; - } - - return new SlackMessage( - title: $title, - description: $description, - color: SlackMessage::errorColor() - ); - } -} diff --git a/app/Notifications/ScheduledTask/TaskSuccess.php b/app/Notifications/ScheduledTask/TaskSuccess.php deleted file mode 100644 index c45784db24..0000000000 --- a/app/Notifications/ScheduledTask/TaskSuccess.php +++ /dev/null @@ -1,108 +0,0 @@ -onQueue('high'); - if ($task->application) { - $this->url = $task->application->taskLink($task->uuid); - } elseif ($task->service) { - $this->url = $task->service->taskLink($task->uuid); - } - } - - public function via(object $notifiable): array - { - return $notifiable->getEnabledChannels('scheduled_task_success'); - } - - public function toMail(): MailMessage - { - $mail = new MailMessage; - $mail->subject("Coolify: Scheduled task ({$this->task->name}) succeeded."); - $mail->view('emails.scheduled-task-success', [ - 'task' => $this->task, - 'url' => $this->url, - 'output' => $this->output, - ]); - - return $mail; - } - - public function toDiscord(): DiscordMessage - { - $message = new DiscordMessage( - title: ':white_check_mark: Scheduled task succeeded', - description: "Scheduled task ({$this->task->name}) succeeded.", - color: DiscordMessage::successColor(), - ); - - if ($this->url) { - $message->addField('Scheduled task', '[Link]('.$this->url.')'); - } - - return $message; - } - - public function toTelegram(): array - { - $message = "Coolify: Scheduled task ({$this->task->name}) succeeded."; - if ($this->url) { - $buttons[] = [ - 'text' => 'Open task in Coolify', - 'url' => (string) $this->url, - ]; - } - - return [ - 'message' => $message, - ]; - } - - public function toPushover(): PushoverMessage - { - $message = "Coolify: Scheduled task ({$this->task->name}) succeeded."; - $buttons = []; - if ($this->url) { - $buttons[] = [ - 'text' => 'Open task in Coolify', - 'url' => (string) $this->url, - ]; - } - - return new PushoverMessage( - title: 'Scheduled task succeeded', - level: 'success', - message: $message, - buttons: $buttons, - ); - } - - public function toSlack(): SlackMessage - { - $title = 'Scheduled task succeeded'; - $description = "Scheduled task ({$this->task->name}) succeeded."; - - if ($this->url) { - $description .= "\n\n*Task URL:* {$this->url}"; - } - - return new SlackMessage( - title: $title, - description: $description, - color: SlackMessage::successColor() - ); - } -} diff --git a/app/Notifications/Server/DockerCleanupFailed.php b/app/Notifications/Server/DockerCleanupFailed.php deleted file mode 100644 index 0291eed19d..0000000000 --- a/app/Notifications/Server/DockerCleanupFailed.php +++ /dev/null @@ -1,69 +0,0 @@ -onQueue('high'); - } - - public function via(object $notifiable): array - { - return $notifiable->getEnabledChannels('docker_cleanup_failure'); - } - - public function toMail(): MailMessage - { - $mail = new MailMessage; - $mail->subject("Coolify: [ACTION REQUIRED] Docker cleanup job failed on {$this->server->name}"); - $mail->view('emails.docker-cleanup-failed', [ - 'name' => $this->server->name, - 'text' => $this->message, - ]); - - return $mail; - } - - public function toDiscord(): DiscordMessage - { - return new DiscordMessage( - title: ':cross_mark: Coolify: [ACTION REQUIRED] Docker cleanup job failed on '.$this->server->name, - description: $this->message, - color: DiscordMessage::errorColor(), - ); - } - - public function toTelegram(): array - { - return [ - 'message' => "Coolify: [ACTION REQUIRED] Docker cleanup job failed on {$this->server->name}!\n\n{$this->message}", - ]; - } - - public function toPushover(): PushoverMessage - { - return new PushoverMessage( - title: 'Docker cleanup job failed', - level: 'error', - message: "[ACTION REQUIRED] Docker cleanup job failed on {$this->server->name}!\n\n{$this->message}", - ); - } - - public function toSlack(): SlackMessage - { - return new SlackMessage( - title: 'Coolify: [ACTION REQUIRED] Docker cleanup job failed', - description: "Docker cleanup job failed on '{$this->server->name}'!\n\n{$this->message}", - color: SlackMessage::errorColor() - ); - } -} diff --git a/app/Notifications/Server/DockerCleanupSuccess.php b/app/Notifications/Server/DockerCleanupSuccess.php deleted file mode 100644 index 1a652d1890..0000000000 --- a/app/Notifications/Server/DockerCleanupSuccess.php +++ /dev/null @@ -1,69 +0,0 @@ -onQueue('high'); - } - - public function via(object $notifiable): array - { - return $notifiable->getEnabledChannels('docker_cleanup_success'); - } - - public function toMail(): MailMessage - { - $mail = new MailMessage; - $mail->subject("Coolify: Docker cleanup job succeeded on {$this->server->name}"); - $mail->view('emails.docker-cleanup-success', [ - 'name' => $this->server->name, - 'text' => $this->message, - ]); - - return $mail; - } - - public function toDiscord(): DiscordMessage - { - return new DiscordMessage( - title: ':white_check_mark: Coolify: Docker cleanup job succeeded on '.$this->server->name, - description: $this->message, - color: DiscordMessage::successColor(), - ); - } - - public function toTelegram(): array - { - return [ - 'message' => "Coolify: Docker cleanup job succeeded on {$this->server->name}!\n\n{$this->message}", - ]; - } - - public function toPushover(): PushoverMessage - { - return new PushoverMessage( - title: 'Docker cleanup job succeeded', - level: 'success', - message: "Docker cleanup job succeeded on {$this->server->name}!\n\n{$this->message}", - ); - } - - public function toSlack(): SlackMessage - { - return new SlackMessage( - title: 'Coolify: Docker cleanup job succeeded', - description: "Docker cleanup job succeeded on '{$this->server->name}'!\n\n{$this->message}", - color: SlackMessage::successColor() - ); - } -} diff --git a/app/Notifications/Server/ForceDisabled.php b/app/Notifications/Server/ForceDisabled.php deleted file mode 100644 index 7a1f7bcbf7..0000000000 --- a/app/Notifications/Server/ForceDisabled.php +++ /dev/null @@ -1,77 +0,0 @@ -onQueue('high'); - } - - public function via(object $notifiable): array - { - return $notifiable->getEnabledChannels('server_force_disabled'); - } - - public function toMail(): MailMessage - { - $mail = new MailMessage; - $mail->subject("Coolify: Server ({$this->server->name}) disabled because it is not paid!"); - $mail->view('emails.server-force-disabled', [ - 'name' => $this->server->name, - ]); - - return $mail; - } - - public function toDiscord(): DiscordMessage - { - $message = new DiscordMessage( - title: ':cross_mark: Server disabled', - description: "Server ({$this->server->name}) disabled because it is not paid!", - color: DiscordMessage::errorColor(), - ); - - $message->addField('Please update your subscription to enable the server again!', '[Link](https://app.coolify.io/subscriptions)'); - - return $message; - } - - public function toTelegram(): array - { - return [ - 'message' => "Coolify: Server ({$this->server->name}) disabled because it is not paid!\n All automations and integrations are stopped.\nPlease update your subscription to enable the server again [here](https://app.coolify.io/subscriptions).", - ]; - } - - public function toPushover(): PushoverMessage - { - return new PushoverMessage( - title: 'Server disabled', - level: 'error', - message: "Server ({$this->server->name}) disabled because it is not paid!\n All automations and integrations are stopped.
Please update your subscription to enable the server again [here](https://app.coolify.io/subscriptions).", - ); - } - - public function toSlack(): SlackMessage - { - $title = 'Server disabled'; - $description = "Server ({$this->server->name}) disabled because it is not paid!\n"; - $description .= "All automations and integrations are stopped.\n\n"; - $description .= 'Please update your subscription to enable the server again: https://app.coolify.io/subscriptions'; - - return new SlackMessage( - title: $title, - description: $description, - color: SlackMessage::errorColor() - ); - } -} diff --git a/app/Notifications/Server/ForceEnabled.php b/app/Notifications/Server/ForceEnabled.php deleted file mode 100644 index 36dad3c60f..0000000000 --- a/app/Notifications/Server/ForceEnabled.php +++ /dev/null @@ -1,68 +0,0 @@ -onQueue('high'); - } - - public function via(object $notifiable): array - { - return $notifiable->getEnabledChannels('server_force_enabled'); - } - - public function toMail(): MailMessage - { - $mail = new MailMessage; - $mail->subject("Coolify: Server ({$this->server->name}) enabled again!"); - $mail->view('emails.server-force-enabled', [ - 'name' => $this->server->name, - ]); - - return $mail; - } - - public function toDiscord(): DiscordMessage - { - return new DiscordMessage( - title: ':white_check_mark: Server enabled', - description: "Server '{$this->server->name}' enabled again!", - color: DiscordMessage::successColor(), - ); - } - - public function toTelegram(): array - { - return [ - 'message' => "Coolify: Server ({$this->server->name}) enabled again!", - ]; - } - - public function toPushover(): PushoverMessage - { - return new PushoverMessage( - title: 'Server enabled', - level: 'success', - message: "Server ({$this->server->name}) enabled again!", - ); - } - - public function toSlack(): SlackMessage - { - return new SlackMessage( - title: 'Server enabled', - description: "Server '{$this->server->name}' enabled again!", - color: SlackMessage::successColor() - ); - } -} diff --git a/app/Notifications/Server/HighDiskUsage.php b/app/Notifications/Server/HighDiskUsage.php deleted file mode 100644 index 983e6d81e7..0000000000 --- a/app/Notifications/Server/HighDiskUsage.php +++ /dev/null @@ -1,91 +0,0 @@ -onQueue('high'); - } - - public function via(object $notifiable): array - { - return $notifiable->getEnabledChannels('server_disk_usage'); - } - - public function toMail(): MailMessage - { - $mail = new MailMessage; - $mail->subject("Coolify: Server ({$this->server->name}) high disk usage detected!"); - $mail->view('emails.high-disk-usage', [ - 'name' => $this->server->name, - 'disk_usage' => $this->disk_usage, - 'threshold' => $this->server_disk_usage_notification_threshold, - ]); - - return $mail; - } - - public function toDiscord(): DiscordMessage - { - $message = new DiscordMessage( - title: ':cross_mark: High disk usage detected', - description: "Server '{$this->server->name}' high disk usage detected!", - color: DiscordMessage::errorColor(), - isCritical: true, - ); - - $message->addField('Disk usage', "{$this->disk_usage}%", true); - $message->addField('Threshold', "{$this->server_disk_usage_notification_threshold}%", true); - $message->addField('What to do?', '[Link](https://coolify.io/docs/knowledge-base/server/automated-cleanup)', true); - $message->addField('Change Settings', '[Threshold]('.base_url().'/server/'.$this->server->uuid.'#advanced) | [Notification]('.base_url().'/notifications/discord)'); - - return $message; - } - - public function toTelegram(): array - { - return [ - 'message' => "Coolify: Server '{$this->server->name}' high disk usage detected!\nDisk usage: {$this->disk_usage}%. Threshold: {$this->server_disk_usage_notification_threshold}%.\nPlease cleanup your disk to prevent data-loss.\nHere are some tips: https://coolify.io/docs/knowledge-base/server/automated-cleanup.", - ]; - } - - public function toPushover(): PushoverMessage - { - return new PushoverMessage( - title: 'High disk usage detected', - level: 'warning', - message: "Server '{$this->server->name}' high disk usage detected!

Disk usage: {$this->disk_usage}%.
Threshold: {$this->server_disk_usage_notification_threshold}%.
Please cleanup your disk to prevent data-loss.", - buttons: [ - 'Change settings' => base_url().'/server/'.$this->server->uuid.'#advanced', - 'Tips for cleanup' => 'https://coolify.io/docs/knowledge-base/server/automated-cleanup', - ], - ); - } - - public function toSlack(): SlackMessage - { - $description = "Server '{$this->server->name}' high disk usage detected!\n"; - $description .= "Disk usage: {$this->disk_usage}%\n"; - $description .= "Threshold: {$this->server_disk_usage_notification_threshold}%\n\n"; - $description .= "Please cleanup your disk to prevent data-loss.\n"; - $description .= "Tips for cleanup: https://coolify.io/docs/knowledge-base/server/automated-cleanup\n"; - $description .= "Change settings:\n"; - $description .= '- Threshold: '.base_url().'/server/'.$this->server->uuid."#advanced\n"; - $description .= '- Notifications: '.base_url().'/notifications/slack'; - - return new SlackMessage( - title: 'High disk usage detected', - description: $description, - color: SlackMessage::errorColor() - ); - } -} diff --git a/app/Notifications/Server/Reachable.php b/app/Notifications/Server/Reachable.php deleted file mode 100644 index e03aef6b79..0000000000 --- a/app/Notifications/Server/Reachable.php +++ /dev/null @@ -1,77 +0,0 @@ -onQueue('high'); - $this->isRateLimited = isEmailRateLimited( - limiterKey: 'server-reachable:'.$this->server->id, - ); - } - - public function via(object $notifiable): array - { - if ($this->isRateLimited) { - return []; - } - - return $notifiable->getEnabledChannels('server_reachable'); - } - - public function toMail(): MailMessage - { - $mail = new MailMessage; - $mail->subject("Coolify: Server ({$this->server->name}) revived."); - $mail->view('emails.server-revived', [ - 'name' => $this->server->name, - ]); - - return $mail; - } - - public function toDiscord(): DiscordMessage - { - return new DiscordMessage( - title: ":white_check_mark: Server '{$this->server->name}' revived", - description: 'All automations & integrations are turned on again!', - color: DiscordMessage::successColor(), - ); - } - - public function toPushover(): PushoverMessage - { - return new PushoverMessage( - title: 'Server revived', - message: "Server '{$this->server->name}' revived. All automations & integrations are turned on again!", - level: 'success', - ); - } - - public function toTelegram(): array - { - return [ - 'message' => "Coolify: Server '{$this->server->name}' revived. All automations & integrations are turned on again!", - ]; - } - - public function toSlack(): SlackMessage - { - return new SlackMessage( - title: 'Server revived', - description: "Server '{$this->server->name}' revived.\nAll automations & integrations are turned on again!", - color: SlackMessage::successColor() - ); - } -} diff --git a/app/Notifications/Server/Unreachable.php b/app/Notifications/Server/Unreachable.php deleted file mode 100644 index fe90cc6105..0000000000 --- a/app/Notifications/Server/Unreachable.php +++ /dev/null @@ -1,85 +0,0 @@ -onQueue('high'); - $this->isRateLimited = isEmailRateLimited( - limiterKey: 'server-unreachable:'.$this->server->id, - ); - } - - public function via(object $notifiable): array - { - if ($this->isRateLimited) { - return []; - } - - return $notifiable->getEnabledChannels('server_unreachable'); - } - - public function toMail(): ?MailMessage - { - $mail = new MailMessage; - $mail->subject("Coolify: Your server ({$this->server->name}) is unreachable."); - $mail->view('emails.server-lost-connection', [ - 'name' => $this->server->name, - ]); - - return $mail; - } - - public function toDiscord(): ?DiscordMessage - { - $message = new DiscordMessage( - title: ':cross_mark: Server unreachable', - description: "Your server '{$this->server->name}' is unreachable.", - color: DiscordMessage::errorColor(), - ); - - $message->addField('IMPORTANT', 'We automatically try to revive your server and turn on all automations & integrations.'); - - return $message; - } - - public function toTelegram(): ?array - { - return [ - 'message' => "Coolify: Your server '{$this->server->name}' is unreachable. All automations & integrations are turned off! Please check your server! IMPORTANT: We automatically try to revive your server and turn on all automations & integrations.", - ]; - } - - public function toPushover(): PushoverMessage - { - return new PushoverMessage( - title: 'Server unreachable', - level: 'error', - message: "Your server '{$this->server->name}' is unreachable.
All automations & integrations are turned off!

IMPORTANT: We automatically try to revive your server and turn on all automations & integrations.", - ); - } - - public function toSlack(): SlackMessage - { - $description = "Your server '{$this->server->name}' is unreachable.\n"; - $description .= "All automations & integrations are turned off!\n\n"; - $description .= '*IMPORTANT:* We automatically try to revive your server and turn on all automations & integrations.'; - - return new SlackMessage( - title: 'Server unreachable', - description: $description, - color: SlackMessage::errorColor() - ); - } -} diff --git a/app/Notifications/Test.php b/app/Notifications/Test.php deleted file mode 100644 index ebb8735f53..0000000000 --- a/app/Notifications/Test.php +++ /dev/null @@ -1,112 +0,0 @@ -onQueue('high'); - } - - public function via(object $notifiable): array - { - if ($this->channel) { - $channels = match ($this->channel) { - 'email' => [EmailChannel::class], - 'discord' => [DiscordChannel::class], - 'telegram' => [TelegramChannel::class], - 'slack' => [SlackChannel::class], - 'pushover' => [PushoverChannel::class], - default => [], - }; - } else { - $channels = $notifiable->getEnabledChannels('test'); - } - - return $channels; - } - - public function middleware(object $notifiable, string $channel) - { - return match ($channel) { - EmailChannel::class => [new RateLimited('email')], - default => [], - }; - } - - public function toMail(): MailMessage - { - $mail = new MailMessage; - $mail->subject('Coolify: Test Email'); - $mail->view('emails.test'); - - return $mail; - } - - public function toDiscord(): DiscordMessage - { - $message = new DiscordMessage( - title: ':white_check_mark: Test Success', - description: 'This is a test Discord notification from Coolify. :cross_mark: :warning: :information_source:', - color: DiscordMessage::successColor(), - ); - - $message->addField(name: 'Dashboard', value: '[Link]('.base_url().')', inline: true); - - return $message; - } - - public function toTelegram(): array - { - return [ - 'message' => 'Coolify: This is a test Telegram notification from Coolify.', - 'buttons' => [ - [ - 'text' => 'Go to your dashboard', - 'url' => base_url(), - ], - ], - ]; - } - - public function toPushover(): PushoverMessage - { - return new PushoverMessage( - title: 'Test Pushover Notification', - message: 'This is a test Pushover notification from Coolify.', - buttons: [ - [ - 'text' => 'Go to your dashboard', - 'url' => base_url(), - ], - ], - ); - } - - public function toSlack(): SlackMessage - { - return new SlackMessage( - title: 'Test Slack Notification', - description: 'This is a test Slack notification from Coolify.' - ); - } -} diff --git a/app/Notifications/TransactionalEmails/InvitationLink.php b/app/Notifications/TransactionalEmails/InvitationLink.php deleted file mode 100644 index 30ace99dcb..0000000000 --- a/app/Notifications/TransactionalEmails/InvitationLink.php +++ /dev/null @@ -1,39 +0,0 @@ -onQueue('high'); - } - - public function toMail(): MailMessage - { - $invitation = TeamInvitation::whereEmail($this->user->email)->first(); - $invitation_team = Team::find($invitation->team->id); - - $mail = new MailMessage; - $mail->subject('Coolify: Invitation for '.$invitation_team->name); - $mail->view('emails.invitation-link', [ - 'team' => $invitation_team->name, - 'email' => $this->user->email, - 'invitation_link' => $invitation->link, - ]); - - return $mail; - } -} diff --git a/app/Notifications/TransactionalEmails/ResetPassword.php b/app/Notifications/TransactionalEmails/ResetPassword.php deleted file mode 100644 index 4593ddb0d2..0000000000 --- a/app/Notifications/TransactionalEmails/ResetPassword.php +++ /dev/null @@ -1,75 +0,0 @@ -settings = instanceSettings(); - $this->token = $token; - } - - public static function createUrlUsing($callback) - { - static::$createUrlCallback = $callback; - } - - public static function toMailUsing($callback) - { - static::$toMailCallback = $callback; - } - - public function via($notifiable) - { - $type = set_transanctional_email_settings(); - if (blank($type)) { - throw new Exception('No email settings found.'); - } - - return ['mail']; - } - - public function toMail($notifiable) - { - if (static::$toMailCallback) { - return call_user_func(static::$toMailCallback, $notifiable, $this->token); - } - - return $this->buildMailMessage($this->resetUrl($notifiable)); - } - - protected function buildMailMessage($url) - { - $mail = new MailMessage; - $mail->subject('Coolify: Reset Password'); - $mail->view('emails.reset-password', ['url' => $url, 'count' => config('auth.passwords.'.config('auth.defaults.passwords').'.expire')]); - - return $mail; - } - - protected function resetUrl($notifiable) - { - if (static::$createUrlCallback) { - return call_user_func(static::$createUrlCallback, $notifiable, $this->token); - } - - return url(route('password.reset', [ - 'token' => $this->token, - 'email' => $notifiable->getEmailForPasswordReset(), - ], false)); - } -} diff --git a/app/Notifications/TransactionalEmails/Test.php b/app/Notifications/TransactionalEmails/Test.php deleted file mode 100644 index eeb32a2545..0000000000 --- a/app/Notifications/TransactionalEmails/Test.php +++ /dev/null @@ -1,29 +0,0 @@ -onQueue('high'); - } - - public function via(): array - { - return [EmailChannel::class]; - } - - public function toMail(): MailMessage - { - $mail = new MailMessage; - $mail->subject('Coolify: Test Email'); - $mail->view('emails.test'); - - return $mail; - } -} diff --git a/app/Policies/ApplicationPolicy.php b/app/Policies/ApplicationPolicy.php deleted file mode 100644 index 05fc289b8b..0000000000 --- a/app/Policies/ApplicationPolicy.php +++ /dev/null @@ -1,69 +0,0 @@ -isAdmin()) { - return true; - } - - return false; - } - - /** - * Determine whether the user can restore the model. - */ - public function restore(User $user, Application $application): bool - { - return true; - } - - /** - * Determine whether the user can permanently delete the model. - */ - public function forceDelete(User $user, Application $application): bool - { - return true; - } -} diff --git a/app/Policies/ServerPolicy.php b/app/Policies/ServerPolicy.php deleted file mode 100644 index ad59b7140d..0000000000 --- a/app/Policies/ServerPolicy.php +++ /dev/null @@ -1,65 +0,0 @@ -teams()->get()->firstWhere('id', $server->team_id) !== null; - } - - /** - * Determine whether the user can create models. - */ - public function create(User $user): bool - { - return true; - } - - /** - * Determine whether the user can update the model. - */ - public function update(User $user, Server $server): bool - { - return $user->teams()->get()->firstWhere('id', $server->team_id) !== null; - } - - /** - * Determine whether the user can delete the model. - */ - public function delete(User $user, Server $server): bool - { - return $user->teams()->get()->firstWhere('id', $server->team_id) !== null; - } - - /** - * Determine whether the user can restore the model. - */ - public function restore(User $user, Server $server): bool - { - return false; - } - - /** - * Determine whether the user can permanently delete the model. - */ - public function forceDelete(User $user, Server $server): bool - { - return false; - } -} diff --git a/app/Policies/ServicePolicy.php b/app/Policies/ServicePolicy.php deleted file mode 100644 index 51a6d81168..0000000000 --- a/app/Policies/ServicePolicy.php +++ /dev/null @@ -1,82 +0,0 @@ -isAdmin()) { - return true; - } - - return false; - } - - /** - * Determine whether the user can restore the model. - */ - public function restore(User $user, Service $service): bool - { - return true; - } - - /** - * Determine whether the user can permanently delete the model. - */ - public function forceDelete(User $user, Service $service): bool - { - if ($user->isAdmin()) { - return true; - } - - return false; - } - - public function stop(User $user, Service $service): bool - { - if ($user->isAdmin()) { - return true; - } - - return false; - } -} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 717daf2a2c..452e6b65b7 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,81 +2,23 @@ namespace App\Providers; -use App\Models\PersonalAccessToken; -use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\App; -use Illuminate\Support\Facades\DB; -use Illuminate\Support\Facades\Http; use Illuminate\Support\ServiceProvider; -use Illuminate\Validation\Rules\Password; -use Laravel\Sanctum\Sanctum; -use Laravel\Telescope\TelescopeServiceProvider; class AppServiceProvider extends ServiceProvider { + /** + * Register any application services. + */ public function register(): void { - if (App::isLocal()) { - $this->app->register(TelescopeServiceProvider::class); - } + // } + /** + * Bootstrap any application services. + */ public function boot(): void { - $this->configureCommands(); - $this->configureModels(); - $this->configurePasswords(); - $this->configureSanctumModel(); - $this->configureGitHubHttp(); - - } - - private function configureCommands(): void - { - if (App::isProduction()) { - DB::prohibitDestructiveCommands(); - } - } - - private function configureModels(): void - { - // Disabled because it's causing issues with the application - // Model::shouldBeStrict(); - } - - private function configurePasswords(): void - { - Password::defaults(function () { - return App::isProduction() - ? Password::min(8) - ->mixedCase() - ->letters() - ->numbers() - ->symbols() - ->uncompromised() - : Password::min(8)->letters(); - }); - } - - private function configureSanctumModel(): void - { - Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class); - } - - private function configureGitHubHttp(): void - { - Http::macro('GitHub', function (string $api_url, ?string $github_access_token = null) { - if ($github_access_token) { - return Http::withHeaders([ - 'X-GitHub-Api-Version' => '2022-11-28', - 'Accept' => 'application/vnd.github.v3+json', - 'Authorization' => "Bearer $github_access_token", - ])->baseUrl($api_url); - } else { - return Http::withHeaders([ - 'Accept' => 'application/vnd.github.v3+json', - ])->baseUrl($api_url); - } - }); + // } } diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php deleted file mode 100644 index dafcbee79f..0000000000 --- a/app/Providers/AuthServiceProvider.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ - protected $policies = [ - // 'App\Models\Model' => 'App\Policies\ModelPolicy', - ]; - - /** - * Register any authentication / authorization services. - */ - public function boot(): void - { - // - } -} diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php deleted file mode 100644 index 2be04f5d9d..0000000000 --- a/app/Providers/BroadcastServiceProvider.php +++ /dev/null @@ -1,19 +0,0 @@ -visit('/login') - ->type('email', 'test@example.com') - ->type('password', 'password') - ->press('Login'); - }); - } -} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php deleted file mode 100644 index d76ec30370..0000000000 --- a/app/Providers/EventServiceProvider.php +++ /dev/null @@ -1,47 +0,0 @@ - [ - MaintenanceModeEnabledNotification::class, - ], - MaintenanceModeDisabled::class => [ - MaintenanceModeDisabledNotification::class, - ], - SocialiteWasCalled::class => [ - AzureExtendSocialite::class.'@handle', - AuthentikExtendSocialite::class.'@handle', - GoogleExtendSocialite::class.'@handle', - InfomaniakExtendSocialite::class.'@handle', - ], - ProxyStarted::class => [ - ProxyStartedNotification::class, - ], - ]; - - public function boot(): void - { - // - } - - public function shouldDiscoverEvents(): bool - { - return false; - } -} diff --git a/app/Providers/FortifyServiceProvider.php b/app/Providers/FortifyServiceProvider.php deleted file mode 100644 index ed27a158a1..0000000000 --- a/app/Providers/FortifyServiceProvider.php +++ /dev/null @@ -1,129 +0,0 @@ -app->instance(RegisterResponse::class, new class implements RegisterResponse - { - public function toResponse($request) - { - // First user (root) will be redirected to /settings instead of / on registration. - if ($request->user()->currentTeam->id === 0) { - return redirect()->route('settings.index'); - } - - return redirect(RouteServiceProvider::HOME); - } - }); - } - - /** - * Bootstrap any application services. - */ - public function boot(): void - { - Fortify::createUsersUsing(CreateNewUser::class); - Fortify::registerView(function () { - $isFirstUser = User::count() === 0; - - $settings = instanceSettings(); - if (! $settings->is_registration_enabled) { - return redirect()->route('login'); - } - - return view('auth.register', [ - 'isFirstUser' => $isFirstUser, - ]); - }); - - Fortify::loginView(function () { - $settings = instanceSettings(); - $enabled_oauth_providers = OauthSetting::where('enabled', true)->get(); - $users = User::count(); - if ($users == 0) { - // If there are no users, redirect to registration - return redirect()->route('register'); - } - - return view('auth.login', [ - 'is_registration_enabled' => $settings->is_registration_enabled, - 'enabled_oauth_providers' => $enabled_oauth_providers, - ]); - }); - - Fortify::authenticateUsing(function (Request $request) { - $email = strtolower($request->email); - $user = User::where('email', $email)->with('teams')->first(); - if ( - $user && - Hash::check($request->password, $user->password) - ) { - $user->updated_at = now(); - $user->save(); - $user->currentTeam = $user->teams->firstWhere('personal_team', true); - if (! $user->currentTeam) { - $user->currentTeam = $user->recreate_personal_team(); - } - session(['currentTeam' => $user->currentTeam]); - - return $user; - } - }); - Fortify::requestPasswordResetLinkView(function () { - return view('auth.forgot-password'); - }); - Fortify::resetPasswordView(function ($request) { - return view('auth.reset-password', ['request' => $request]); - }); - Fortify::resetUserPasswordsUsing(ResetUserPassword::class); - - Fortify::updateUserProfileInformationUsing(UpdateUserProfileInformation::class); - Fortify::updateUserPasswordsUsing(UpdateUserPassword::class); - - Fortify::confirmPasswordView(function () { - return view('auth.confirm-password'); - }); - - Fortify::twoFactorChallengeView(function () { - return view('auth.two-factor-challenge'); - }); - - RateLimiter::for('force-password-reset', function (Request $request) { - return Limit::perMinute(15)->by($request->user()->id); - }); - - RateLimiter::for('forgot-password', function (Request $request) { - return Limit::perMinute(5)->by($request->ip()); - }); - - RateLimiter::for('login', function (Request $request) { - $email = (string) $request->email; - - return Limit::perMinute(5)->by($email.$request->ip()); - }); - - RateLimiter::for('two-factor', function (Request $request) { - return Limit::perMinute(5)->by($request->session()->get('login.id')); - }); - } -} diff --git a/app/Providers/HorizonServiceProvider.php b/app/Providers/HorizonServiceProvider.php deleted file mode 100644 index 0caa3a3a93..0000000000 --- a/app/Providers/HorizonServiceProvider.php +++ /dev/null @@ -1,63 +0,0 @@ -app->singleton(JobRepository::class, CustomJobRepository::class); - $this->app->singleton(CustomJobRepositoryInterface::class, CustomJobRepository::class); - } - - /** - * Bootstrap services. - */ - public function boot(): void - { - parent::boot(); - Event::listen(function (JobReserved $event) { - $payload = $event->payload->decoded; - $jobName = $payload['displayName']; - if ($jobName === 'App\Jobs\ApplicationDeploymentJob') { - $tags = $payload['tags']; - $id = $payload['id']; - $deploymentQueueId = collect($tags)->first(function ($tag) { - return str_contains($tag, 'App\Models\ApplicationDeploymentQueue'); - }); - if (blank($deploymentQueueId)) { - return; - } - $deploymentQueueId = explode(':', $deploymentQueueId)[1]; - $deploymentQueue = ApplicationDeploymentQueue::find($deploymentQueueId); - $deploymentQueue->update([ - 'horizon_job_id' => $id, - ]); - } - }); - } - - protected function gate(): void - { - Gate::define('viewHorizon', function ($user) { - $root_user = User::find(0); - - return in_array($user->email, [ - $root_user->email, - ]); - }); - } -} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php deleted file mode 100644 index c859607464..0000000000 --- a/app/Providers/RouteServiceProvider.php +++ /dev/null @@ -1,58 +0,0 @@ -configureRateLimiting(); - - $this->routes(function () { - Route::middleware('api') - ->prefix('api') - ->group(base_path('routes/api.php')); - - Route::prefix('webhooks') - ->group(base_path('routes/webhooks.php')); - - Route::middleware('web') - ->group(base_path('routes/web.php')); - }); - } - - /** - * Configure the rate limiters for the application. - */ - protected function configureRateLimiting(): void - { - RateLimiter::for('api', function (Request $request) { - if ($request->path() === 'api/health') { - return Limit::perMinute(1000)->by($request->user()?->id ?: $request->ip()); - } - - return Limit::perMinute(200)->by($request->user()?->id ?: $request->ip()); - }); - RateLimiter::for('5', function (Request $request) { - return Limit::perMinute(5)->by($request->user()?->id ?: $request->ip()); - }); - } -} diff --git a/app/Providers/TelescopeServiceProvider.php b/app/Providers/TelescopeServiceProvider.php deleted file mode 100644 index b7a3366314..0000000000 --- a/app/Providers/TelescopeServiceProvider.php +++ /dev/null @@ -1,67 +0,0 @@ -hideSensitiveRequestDetails(); - - $isLocal = $this->app->environment('local'); - - Telescope::filter(function (IncomingEntry $entry) use ($isLocal) { - return $isLocal || - $entry->isReportableException() || - $entry->isFailedRequest() || - $entry->isFailedJob() || - $entry->isScheduledTask() || - $entry->hasMonitoredTag(); - }); - } - - /** - * Prevent sensitive request details from being logged by Telescope. - */ - protected function hideSensitiveRequestDetails(): void - { - if ($this->app->environment('local')) { - return; - } - - Telescope::hideRequestParameters(['_token']); - - Telescope::hideRequestHeaders([ - 'cookie', - 'x-csrf-token', - 'x-xsrf-token', - ]); - } - - /** - * Register the Telescope gate. - * - * This gate determines who can access Telescope in non-local environments. - */ - protected function gate(): void - { - Gate::define('viewTelescope', function ($user) { - $root_user = User::find(0); - - return in_array($user->email, [ - $root_user->email, - ]); - }); - } -} diff --git a/app/Repositories/CustomJobRepository.php b/app/Repositories/CustomJobRepository.php deleted file mode 100644 index 502dd252b7..0000000000 --- a/app/Repositories/CustomJobRepository.php +++ /dev/null @@ -1,51 +0,0 @@ -all(); - } - - public function getReservedJobs(): Collection - { - return $this->getJobsByStatus('reserved'); - } - - public function getJobsByStatus(string $status): Collection - { - $jobs = new Collection; - - $this->getRecent()->each(function ($job) use ($jobs, $status) { - if ($job->status === $status) { - $jobs->push($job); - } - }); - - return $jobs; - } - - public function countJobsByStatus(string $status): int - { - return $this->getJobsByStatus($status)->count(); - } - - public function getQueues(): array - { - $queues = $this->connection()->keys('queue:*'); - $queues = array_map(function ($queue) { - return explode(':', $queue)[2]; - }, $queues); - - return $queues; - } -} diff --git a/app/Services/ConfigurationGenerator.php b/app/Services/ConfigurationGenerator.php deleted file mode 100644 index a7e4b31be7..0000000000 --- a/app/Services/ConfigurationGenerator.php +++ /dev/null @@ -1,194 +0,0 @@ -generateConfig(); - } - - protected function generateConfig(): void - { - if ($this->resource instanceof Application) { - $this->config = [ - 'id' => $this->resource->id, - 'name' => $this->resource->name, - 'uuid' => $this->resource->uuid, - 'description' => $this->resource->description, - 'coolify_details' => [ - 'project_uuid' => $this->resource->project()->uuid, - 'environment_uuid' => $this->resource->environment->uuid, - - 'destination_type' => $this->resource->destination_type, - 'destination_id' => $this->resource->destination_id, - 'source_type' => $this->resource->source_type, - 'source_id' => $this->resource->source_id, - 'private_key_id' => $this->resource->private_key_id, - ], - - 'post_deployment_command' => $this->resource->post_deployment_command, - 'post_deployment_command_container' => $this->resource->post_deployment_command_container, - 'pre_deployment_command' => $this->resource->pre_deployment_command, - 'pre_deployment_command_container' => $this->resource->pre_deployment_command_container, - 'build' => [ - 'type' => $this->resource->build_pack, - 'static_image' => $this->resource->static_image, - 'base_directory' => $this->resource->base_directory, - 'publish_directory' => $this->resource->publish_directory, - 'dockerfile' => $this->resource->dockerfile, - 'dockerfile_location' => $this->resource->dockerfile_location, - 'dockerfile_target_build' => $this->resource->dockerfile_target_build, - 'custom_docker_run_options' => $this->resource->custom_docker_options, - 'compose_parsing_version' => $this->resource->compose_parsing_version, - 'docker_compose' => $this->resource->docker_compose, - 'docker_compose_location' => $this->resource->docker_compose_location, - 'docker_compose_raw' => $this->resource->docker_compose_raw, - 'docker_compose_domains' => $this->resource->docker_compose_domains, - 'docker_compose_custom_start_command' => $this->resource->docker_compose_custom_start_command, - 'docker_compose_custom_build_command' => $this->resource->docker_compose_custom_build_command, - 'install_command' => $this->resource->install_command, - 'build_command' => $this->resource->build_command, - 'start_command' => $this->resource->start_command, - 'watch_paths' => $this->resource->watch_paths, - ], - 'source' => [ - 'git_repository' => $this->resource->git_repository, - 'git_branch' => $this->resource->git_branch, - 'git_commit_sha' => $this->resource->git_commit_sha, - 'repository_project_id' => $this->resource->repository_project_id, - ], - 'docker_registry_image' => $this->getDockerRegistryImage(), - 'domains' => [ - 'fqdn' => $this->resource->fqdn, - 'ports_exposes' => $this->resource->ports_exposes, - 'ports_mappings' => $this->resource->ports_mappings, - 'redirect' => $this->resource->redirect, - 'custom_nginx_configuration' => $this->resource->custom_nginx_configuration, - ], - 'environment_variables' => [ - 'production' => $this->getEnvironmentVariables(), - 'preview' => $this->getPreviewEnvironmentVariables(), - ], - 'settings' => $this->getApplicationSettings(), - 'preview' => $this->getPreview(), - 'limits' => $this->resource->getLimits(), - 'health_check' => [ - 'health_check_path' => $this->resource->health_check_path, - 'health_check_port' => $this->resource->health_check_port, - 'health_check_host' => $this->resource->health_check_host, - 'health_check_method' => $this->resource->health_check_method, - 'health_check_return_code' => $this->resource->health_check_return_code, - 'health_check_scheme' => $this->resource->health_check_scheme, - 'health_check_response_text' => $this->resource->health_check_response_text, - 'health_check_interval' => $this->resource->health_check_interval, - 'health_check_timeout' => $this->resource->health_check_timeout, - 'health_check_retries' => $this->resource->health_check_retries, - 'health_check_start_period' => $this->resource->health_check_start_period, - 'health_check_enabled' => $this->resource->health_check_enabled, - ], - 'webhooks_secrets' => [ - 'manual_webhook_secret_github' => $this->resource->manual_webhook_secret_github, - 'manual_webhook_secret_gitlab' => $this->resource->manual_webhook_secret_gitlab, - 'manual_webhook_secret_bitbucket' => $this->resource->manual_webhook_secret_bitbucket, - 'manual_webhook_secret_gitea' => $this->resource->manual_webhook_secret_gitea, - ], - 'swarm' => [ - 'swarm_replicas' => $this->resource->swarm_replicas, - 'swarm_placement_constraints' => $this->resource->swarm_placement_constraints, - ], - ]; - } - } - - protected function getPreview(): array - { - return [ - 'preview_url_template' => $this->resource->preview_url_template, - ]; - } - - protected function getDockerRegistryImage(): array - { - return [ - 'image' => $this->resource->docker_registry_image_name, - 'tag' => $this->resource->docker_registry_image_tag, - ]; - } - - protected function getEnvironmentVariables(): array - { - $variables = collect([]); - foreach ($this->resource->environment_variables as $env) { - $variables->push([ - 'key' => $env->key, - 'value' => $env->value, - 'is_build_time' => $env->is_build_time, - 'is_preview' => $env->is_preview, - 'is_multiline' => $env->is_multiline, - ]); - } - - return $variables->toArray(); - } - - protected function getPreviewEnvironmentVariables(): array - { - $variables = collect([]); - foreach ($this->resource->environment_variables_preview as $env) { - $variables->push([ - 'key' => $env->key, - 'value' => $env->value, - 'is_build_time' => $env->is_build_time, - 'is_preview' => $env->is_preview, - 'is_multiline' => $env->is_multiline, - ]); - } - - return $variables->toArray(); - } - - protected function getApplicationSettings(): array - { - $removedKeys = ['id', 'application_id', 'created_at', 'updated_at']; - $settings = $this->resource->settings->attributesToArray(); - $settings = collect($settings)->filter(function ($value, $key) use ($removedKeys) { - return ! in_array($key, $removedKeys); - })->sortBy(function ($value, $key) { - return $key; - })->toArray(); - - return $settings; - } - - public function saveJson(string $path): void - { - file_put_contents($path, json_encode($this->config, JSON_PRETTY_PRINT)); - } - - public function saveYaml(string $path): void - { - file_put_contents($path, Yaml::dump($this->config, 6, 2)); - } - - public function toArray(): array - { - return $this->config; - } - - public function toJson(): string - { - return json_encode($this->config, JSON_PRETTY_PRINT); - } - - public function toYaml(): string - { - return Yaml::dump($this->config, 6, 2); - } -} diff --git a/app/Services/DockerImageParser.php b/app/Services/DockerImageParser.php deleted file mode 100644 index 1fd6625b32..0000000000 --- a/app/Services/DockerImageParser.php +++ /dev/null @@ -1,78 +0,0 @@ - strrpos($imageString, '/'))) { - $mainPart = substr($imageString, 0, $lastColon); - $this->tag = substr($imageString, $lastColon + 1); - } else { - $mainPart = $imageString; - $this->tag = 'latest'; - } - - // Split the main part by / to handle registry and image name - $pathParts = explode('/', $mainPart); - - // If we have more than one part and the first part contains a dot or colon - // it's likely a registry URL - if (count($pathParts) > 1 && (str_contains($pathParts[0], '.') || str_contains($pathParts[0], ':'))) { - $this->registryUrl = array_shift($pathParts); - $this->imageName = implode('/', $pathParts); - } else { - $this->imageName = $mainPart; - } - - return $this; - } - - public function getFullImageNameWithoutTag(): string - { - if ($this->registryUrl) { - return $this->registryUrl.'/'.$this->imageName; - } - - return $this->imageName; - } - - public function getRegistryUrl(): string - { - return $this->registryUrl; - } - - public function getImageName(): string - { - return $this->imageName; - } - - public function getTag(): string - { - return $this->tag; - } - - public function toString(): string - { - $parts = []; - if ($this->registryUrl) { - $parts[] = $this->registryUrl; - } - $parts[] = $this->imageName; - - return implode('/', $parts).':'.$this->tag; - } -} diff --git a/app/Traits/ExecuteRemoteCommand.php b/app/Traits/ExecuteRemoteCommand.php deleted file mode 100644 index f8ccee9db7..0000000000 --- a/app/Traits/ExecuteRemoteCommand.php +++ /dev/null @@ -1,96 +0,0 @@ -server instanceof Server === false) { - throw new \RuntimeException('Server is not set or is not an instance of Server model'); - } - $commandsText->each(function ($single_command) { - $command = data_get($single_command, 'command') ?? $single_command[0] ?? null; - if ($command === null) { - throw new \RuntimeException('Command is not set'); - } - $hidden = data_get($single_command, 'hidden', false); - $customType = data_get($single_command, 'type'); - $ignore_errors = data_get($single_command, 'ignore_errors', false); - $append = data_get($single_command, 'append', true); - $this->save = data_get($single_command, 'save'); - if ($this->server->isNonRoot()) { - if (str($command)->startsWith('docker exec')) { - $command = str($command)->replace('docker exec', 'sudo docker exec'); - } else { - $command = parseLineForSudo($command, $this->server); - } - } - $remote_command = SshMultiplexingHelper::generateSshCommand($this->server, $command); - $process = Process::timeout(3600)->idleTimeout(3600)->start($remote_command, function (string $type, string $output) use ($command, $hidden, $customType, $append) { - $output = str($output)->trim(); - if ($output->startsWith('╔')) { - $output = "\n".$output; - } - $new_log_entry = [ - 'command' => remove_iip($command), - 'output' => remove_iip($output), - 'type' => $customType ?? $type === 'err' ? 'stderr' : 'stdout', - 'timestamp' => Carbon::now('UTC'), - 'hidden' => $hidden, - 'batch' => static::$batch_counter, - ]; - if (! $this->application_deployment_queue->logs) { - $new_log_entry['order'] = 1; - } else { - $previous_logs = json_decode($this->application_deployment_queue->logs, associative: true, flags: JSON_THROW_ON_ERROR); - $new_log_entry['order'] = count($previous_logs) + 1; - } - $previous_logs[] = $new_log_entry; - $this->application_deployment_queue->logs = json_encode($previous_logs, flags: JSON_THROW_ON_ERROR); - $this->application_deployment_queue->save(); - - if ($this->save) { - if (data_get($this->saved_outputs, $this->save, null) === null) { - data_set($this->saved_outputs, $this->save, str()); - } - if ($append) { - $this->saved_outputs[$this->save] .= str($output)->trim(); - $this->saved_outputs[$this->save] = str($this->saved_outputs[$this->save]); - } else { - $this->saved_outputs[$this->save] = str($output)->trim(); - } - } - }); - $this->application_deployment_queue->update([ - 'current_process_id' => $process->id(), - ]); - - $process_result = $process->wait(); - if ($process_result->exitCode() !== 0) { - if (! $ignore_errors) { - $this->application_deployment_queue->status = ApplicationDeploymentStatus::FAILED->value; - $this->application_deployment_queue->save(); - throw new \RuntimeException($process_result->errorOutput()); - } - } - }); - } -} diff --git a/app/Traits/HasConfiguration.php b/app/Traits/HasConfiguration.php deleted file mode 100644 index e572c45ea2..0000000000 --- a/app/Traits/HasConfiguration.php +++ /dev/null @@ -1,42 +0,0 @@ -uuid}"; - if (! is_dir($configDir)) { - mkdir($configDir, 0755, true); - } - - $generator->saveJson($configDir.'/coolify.json'); - $generator->saveYaml($configDir.'/coolify.yaml'); - - // Generate a README file with basic information - file_put_contents( - $configDir.'/README.md', - generate_readme_file($this->name, now()->toIso8601String()) - ); - } - - public function getConfigurationAsJson(): string - { - return (new ConfigurationGenerator($this))->toJson(); - } - - public function getConfigurationAsYaml(): string - { - return (new ConfigurationGenerator($this))->toYaml(); - } - - public function getConfigurationAsArray(): array - { - return (new ConfigurationGenerator($this))->toArray(); - } -} diff --git a/app/Traits/HasNotificationSettings.php b/app/Traits/HasNotificationSettings.php deleted file mode 100644 index bb088896a6..0000000000 --- a/app/Traits/HasNotificationSettings.php +++ /dev/null @@ -1,93 +0,0 @@ - $this->emailNotificationSettings, - 'discord' => $this->discordNotificationSettings, - 'telegram' => $this->telegramNotificationSettings, - 'slack' => $this->slackNotificationSettings, - 'pushover' => $this->pushoverNotificationSettings, - default => null, - }; - } - - /** - * Check if a notification channel is enabled - */ - public function isNotificationEnabled(string $channel): bool - { - $settings = $this->getNotificationSettings($channel); - - return $settings?->isEnabled() ?? false; - } - - /** - * Check if a specific notification type is enabled for a channel - */ - public function isNotificationTypeEnabled(string $channel, string $event): bool - { - $settings = $this->getNotificationSettings($channel); - - if (! $settings || ! $this->isNotificationEnabled($channel)) { - return false; - } - - if (in_array($event, $this->alwaysSendEvents)) { - return true; - } - - $settingKey = "{$event}_{$channel}_notifications"; - - return (bool) $settings->$settingKey; - } - - /** - * Get all enabled notification channels for an event - */ - public function getEnabledChannels(string $event): array - { - $channels = []; - - $channelMap = [ - 'email' => EmailChannel::class, - 'discord' => DiscordChannel::class, - 'telegram' => TelegramChannel::class, - 'slack' => SlackChannel::class, - 'pushover' => PushoverChannel::class, - ]; - - if ($event === 'general') { - unset($channelMap['email']); - } - - foreach ($channelMap as $channel => $channelClass) { - if ($this->isNotificationEnabled($channel) && $this->isNotificationTypeEnabled($channel, $event)) { - $channels[] = $channelClass; - } - } - - return $channels; - } -} diff --git a/app/Traits/SaveFromRedirect.php b/app/Traits/SaveFromRedirect.php deleted file mode 100644 index 166c16a4bc..0000000000 --- a/app/Traits/SaveFromRedirect.php +++ /dev/null @@ -1,26 +0,0 @@ -forget('from'); - if (! $parameters || $parameters->count() === 0) { - $parameters = $this->parameters; - } - $parameters = collect($parameters) ?? collect([]); - $queries = collect($this->query) ?? collect([]); - $parameters = $parameters->merge($queries); - session(['from' => [ - 'back' => $this->currentRoute, - 'route' => $route, - 'parameters' => $parameters, - ]]); - - return redirect()->route($route); - } -} diff --git a/app/View/Components/Forms/Button.php b/app/View/Components/Forms/Button.php deleted file mode 100644 index bf88d3f885..0000000000 --- a/app/View/Components/Forms/Button.php +++ /dev/null @@ -1,30 +0,0 @@ -noStyle) { - $this->defaultClass = ''; - } - } - - public function render(): View|Closure|string - { - return view('components.forms.button'); - } -} diff --git a/app/View/Components/Forms/Checkbox.php b/app/View/Components/Forms/Checkbox.php deleted file mode 100644 index e46598e8e9..0000000000 --- a/app/View/Components/Forms/Checkbox.php +++ /dev/null @@ -1,38 +0,0 @@ -disabled) { - $this->defaultClass .= ' opacity-40'; - } - } - - /** - * Get the view / contents that represent the component. - */ - public function render(): View|Closure|string - { - return view('components.forms.checkbox'); - } -} diff --git a/app/View/Components/Forms/Datalist.php b/app/View/Components/Forms/Datalist.php deleted file mode 100644 index 25643753d7..0000000000 --- a/app/View/Components/Forms/Datalist.php +++ /dev/null @@ -1,43 +0,0 @@ -id)) { - $this->id = new Cuid2; - } - if (is_null($this->name)) { - $this->name = $this->id; - } - - $this->label = Str::title($this->label); - - return view('components.forms.datalist'); - } -} diff --git a/app/View/Components/Forms/Input.php b/app/View/Components/Forms/Input.php deleted file mode 100644 index 7283ef20f8..0000000000 --- a/app/View/Components/Forms/Input.php +++ /dev/null @@ -1,45 +0,0 @@ -id)) { - $this->id = new Cuid2; - } - if (is_null($this->name)) { - $this->name = $this->id; - } - if ($this->type === 'password') { - $this->defaultClass = $this->defaultClass.' pr-[2.8rem]'; - } - - // $this->label = Str::title($this->label); - return view('components.forms.input'); - } -} diff --git a/app/View/Components/Forms/Select.php b/app/View/Components/Forms/Select.php deleted file mode 100644 index dd5ba66b7d..0000000000 --- a/app/View/Components/Forms/Select.php +++ /dev/null @@ -1,43 +0,0 @@ -id)) { - $this->id = new Cuid2; - } - if (is_null($this->name)) { - $this->name = $this->id; - } - - $this->label = Str::title($this->label); - - return view('components.forms.select'); - } -} diff --git a/app/View/Components/Forms/Textarea.php b/app/View/Components/Forms/Textarea.php deleted file mode 100644 index 6081c2a8ae..0000000000 --- a/app/View/Components/Forms/Textarea.php +++ /dev/null @@ -1,55 +0,0 @@ -id)) { - $this->id = new Cuid2; - } - if (is_null($this->name)) { - $this->name = $this->id; - } - - // $this->label = Str::title($this->label); - return view('components.forms.textarea'); - } -} diff --git a/app/View/Components/Modal.php b/app/View/Components/Modal.php deleted file mode 100644 index 7e254ebdcd..0000000000 --- a/app/View/Components/Modal.php +++ /dev/null @@ -1,34 +0,0 @@ -links = collect([]); - $service->applications()->get()->map(function ($application) { - $type = $application->serviceType(); - if ($type) { - $links = generateServiceSpecificFqdns($application); - $links = $links->map(function ($link) { - return getFqdnWithoutPort($link); - }); - $this->links = $this->links->merge($links); - } else { - if ($application->fqdn) { - $fqdns = collect(str($application->fqdn)->explode(',')); - $fqdns->map(function ($fqdn) { - $this->links->push(getFqdnWithoutPort($fqdn)); - }); - } - if ($application->ports) { - $portsCollection = collect(str($application->ports)->explode(',')); - $portsCollection->map(function ($port) { - if (str($port)->contains(':')) { - $hostPort = str($port)->before(':'); - } else { - $hostPort = $port; - } - $this->links->push(base_url(withPort: false).":{$hostPort}"); - }); - } - } - }); - } - - /** - * Get the view / contents that represent the component. - */ - public function render(): View|Closure|string - { - return view('components.services.links'); - } -} diff --git a/app/View/Components/Status/Index.php b/app/View/Components/Status/Index.php deleted file mode 100644 index ada9eb6823..0000000000 --- a/app/View/Components/Status/Index.php +++ /dev/null @@ -1,26 +0,0 @@ -complexStatus = $service->status; - } - - /** - * Get the view / contents that represent the component. - */ - public function render(): View|Closure|string - { - return view('components.status.services'); - } -} diff --git a/app/View/Components/services/advanced.php b/app/View/Components/services/advanced.php deleted file mode 100644 index 8104eaad49..0000000000 --- a/app/View/Components/services/advanced.php +++ /dev/null @@ -1,26 +0,0 @@ -make(Illuminate\Contracts\Console\Kernel::class); - -$status = $kernel->handle( - $input = new Symfony\Component\Console\Input\ArgvInput, - new Symfony\Component\Console\Output\ConsoleOutput -); - -/* -|-------------------------------------------------------------------------- -| Shutdown The Application -|-------------------------------------------------------------------------- -| -| Once Artisan has finished running, we will fire off the shutdown events -| so that any final work may be done by the application before we shut -| down the process. This is the last thing to happen to the request. -| -*/ - -$kernel->terminate($input, $status); +$status = $app->handleCommand(new ArgvInput); exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php index 037e17df03..d6e5a1aeca 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -1,55 +1,16 @@ singleton( - Illuminate\Contracts\Http\Kernel::class, - App\Http\Kernel::class -); - -$app->singleton( - Illuminate\Contracts\Console\Kernel::class, - App\Console\Kernel::class -); - -$app->singleton( - Illuminate\Contracts\Debug\ExceptionHandler::class, - App\Exceptions\Handler::class -); - -/* -|-------------------------------------------------------------------------- -| Return The Application -|-------------------------------------------------------------------------- -| -| This script returns the application instance. The instance is given to -| the calling script so we can separate the building of the instances -| from the actual running of the application and sending responses. -| -*/ - -return $app; +return Application::configure(basePath: dirname(__DIR__)) + ->withRouting( + web: __DIR__.'/../routes/web.php', + ) + ->withMiddleware(function (Middleware $middleware) { + // + }) + ->withExceptions(function (Exceptions $exceptions) { + // + })->create(); diff --git a/bootstrap/getHelperVersion.php b/bootstrap/getHelperVersion.php deleted file mode 100644 index 766af8db29..0000000000 --- a/bootstrap/getHelperVersion.php +++ /dev/null @@ -1,10 +0,0 @@ -user()->currentAccessToken(); - - return data_get($token, 'team_id'); -} -function invalidTokenResponse() -{ - return response()->json(['message' => 'Invalid token.', 'docs' => 'https://coolify.io/docs/api-reference/authorization'], 400); -} - -function serializeApiResponse($data) -{ - if ($data instanceof Collection) { - return $data->map(function ($d) { - $d = collect($d)->sortKeys(); - $created_at = data_get($d, 'created_at'); - $updated_at = data_get($d, 'updated_at'); - if ($created_at) { - unset($d['created_at']); - $d['created_at'] = $created_at; - } - if ($updated_at) { - unset($d['updated_at']); - $d['updated_at'] = $updated_at; - } - if (data_get($d, 'name')) { - $d = $d->prepend($d['name'], 'name'); - } - if (data_get($d, 'description')) { - $d = $d->prepend($d['description'], 'description'); - } - if (data_get($d, 'uuid')) { - $d = $d->prepend($d['uuid'], 'uuid'); - } - - if (! is_null(data_get($d, 'id'))) { - $d = $d->prepend($d['id'], 'id'); - } - - return $d; - }); - } else { - $d = collect($data)->sortKeys(); - $created_at = data_get($d, 'created_at'); - $updated_at = data_get($d, 'updated_at'); - if ($created_at) { - unset($d['created_at']); - $d['created_at'] = $created_at; - } - if ($updated_at) { - unset($d['updated_at']); - $d['updated_at'] = $updated_at; - } - if (data_get($d, 'name')) { - $d = $d->prepend($d['name'], 'name'); - } - if (data_get($d, 'description')) { - $d = $d->prepend($d['description'], 'description'); - } - if (data_get($d, 'uuid')) { - $d = $d->prepend($d['uuid'], 'uuid'); - } - - if (! is_null(data_get($d, 'id'))) { - $d = $d->prepend($d['id'], 'id'); - } - - return $d; - } -} - -function sharedDataApplications() -{ - return [ - 'git_repository' => 'string', - 'git_branch' => 'string', - 'build_pack' => Rule::enum(BuildPackTypes::class), - 'is_static' => 'boolean', - 'static_image' => Rule::enum(StaticImageTypes::class), - 'domains' => 'string', - 'redirect' => Rule::enum(RedirectTypes::class), - 'git_commit_sha' => 'string', - 'docker_registry_image_name' => 'string|nullable', - 'docker_registry_image_tag' => 'string|nullable', - 'install_command' => 'string|nullable', - 'build_command' => 'string|nullable', - 'start_command' => 'string|nullable', - 'ports_exposes' => 'string|regex:/^(\d+)(,\d+)*$/', - 'ports_mappings' => 'string|regex:/^(\d+:\d+)(,\d+:\d+)*$/|nullable', - 'base_directory' => 'string|nullable', - 'publish_directory' => 'string|nullable', - 'health_check_enabled' => 'boolean', - 'health_check_path' => 'string', - 'health_check_port' => 'string|nullable', - 'health_check_host' => 'string', - 'health_check_method' => 'string', - 'health_check_return_code' => 'numeric', - 'health_check_scheme' => 'string', - 'health_check_response_text' => 'string|nullable', - 'health_check_interval' => 'numeric', - 'health_check_timeout' => 'numeric', - 'health_check_retries' => 'numeric', - 'health_check_start_period' => 'numeric', - 'limits_memory' => 'string', - 'limits_memory_swap' => 'string', - 'limits_memory_swappiness' => 'numeric', - 'limits_memory_reservation' => 'string', - 'limits_cpus' => 'string', - 'limits_cpuset' => 'string|nullable', - 'limits_cpu_shares' => 'numeric', - 'custom_labels' => 'string|nullable', - 'custom_docker_run_options' => 'string|nullable', - 'post_deployment_command' => 'string|nullable', - 'post_deployment_command_container' => 'string', - 'pre_deployment_command' => 'string|nullable', - 'pre_deployment_command_container' => 'string', - 'manual_webhook_secret_github' => 'string|nullable', - 'manual_webhook_secret_gitlab' => 'string|nullable', - 'manual_webhook_secret_bitbucket' => 'string|nullable', - 'manual_webhook_secret_gitea' => 'string|nullable', - 'docker_compose_location' => 'string', - 'docker_compose' => 'string|nullable', - 'docker_compose_raw' => 'string|nullable', - 'docker_compose_domains' => 'array|nullable', - 'docker_compose_custom_start_command' => 'string|nullable', - 'docker_compose_custom_build_command' => 'string|nullable', - ]; -} - -function validateIncomingRequest(Request $request) -{ - // check if request is json - if (! $request->isJson()) { - return response()->json([ - 'message' => 'Invalid request.', - 'error' => 'Content-Type must be application/json.', - ], 400); - } - // check if request is valid json - if (! json_decode($request->getContent())) { - return response()->json([ - 'message' => 'Invalid request.', - 'error' => 'Invalid JSON.', - ], 400); - } - // check if valid json is empty - if (empty($request->json()->all())) { - return response()->json([ - 'message' => 'Invalid request.', - 'error' => 'Empty JSON.', - ], 400); - } -} - -function removeUnnecessaryFieldsFromRequest(Request $request) -{ - $request->offsetUnset('project_uuid'); - $request->offsetUnset('environment_name'); - $request->offsetUnset('environment_uuid'); - $request->offsetUnset('destination_uuid'); - $request->offsetUnset('server_uuid'); - $request->offsetUnset('type'); - $request->offsetUnset('domains'); - $request->offsetUnset('instant_deploy'); - $request->offsetUnset('github_app_uuid'); - $request->offsetUnset('private_key_uuid'); - $request->offsetUnset('use_build_server'); - $request->offsetUnset('is_static'); -} diff --git a/bootstrap/helpers/applications.php b/bootstrap/helpers/applications.php deleted file mode 100644 index d5283898e8..0000000000 --- a/bootstrap/helpers/applications.php +++ /dev/null @@ -1,122 +0,0 @@ -id; - $deployment_link = Url::fromString($application->link()."/deployment/{$deployment_uuid}"); - $deployment_url = $deployment_link->getPath(); - $server_id = $application->destination->server->id; - $server_name = $application->destination->server->name; - $destination_id = $application->destination->id; - - if ($server) { - $server_id = $server->id; - $server_name = $server->name; - } - if ($destination) { - $destination_id = $destination->id; - } - $deployment = ApplicationDeploymentQueue::create([ - 'application_id' => $application_id, - 'application_name' => $application->name, - 'server_id' => $server_id, - 'server_name' => $server_name, - 'destination_id' => $destination_id, - 'deployment_uuid' => $deployment_uuid, - 'deployment_url' => $deployment_url, - 'pull_request_id' => $pull_request_id, - 'force_rebuild' => $force_rebuild, - 'is_webhook' => $is_webhook, - 'is_api' => $is_api, - 'restart_only' => $restart_only, - 'commit' => $commit, - 'rollback' => $rollback, - 'git_type' => $git_type, - 'only_this_server' => $only_this_server, - ]); - - if ($no_questions_asked) { - ApplicationDeploymentJob::dispatch( - application_deployment_queue_id: $deployment->id, - ); - } elseif (next_queuable($server_id, $application_id)) { - ApplicationDeploymentJob::dispatch( - application_deployment_queue_id: $deployment->id, - ); - } -} -function force_start_deployment(ApplicationDeploymentQueue $deployment) -{ - $deployment->update([ - 'status' => ApplicationDeploymentStatus::IN_PROGRESS->value, - ]); - - ApplicationDeploymentJob::dispatch( - application_deployment_queue_id: $deployment->id, - ); -} -function queue_next_deployment(Application $application) -{ - $server_id = $application->destination->server_id; - $next_found = ApplicationDeploymentQueue::where('server_id', $server_id)->where('status', ApplicationDeploymentStatus::QUEUED)->get()->sortBy('created_at')->first(); - if ($next_found) { - $next_found->update([ - 'status' => ApplicationDeploymentStatus::IN_PROGRESS->value, - ]); - - ApplicationDeploymentJob::dispatch( - application_deployment_queue_id: $next_found->id, - ); - } -} - -function next_queuable(string $server_id, string $application_id): bool -{ - $deployments = ApplicationDeploymentQueue::where('server_id', $server_id)->whereIn('status', ['in_progress', ApplicationDeploymentStatus::QUEUED])->get()->sortByDesc('created_at'); - $same_application_deployments = $deployments->where('application_id', $application_id); - $in_progress = $same_application_deployments->filter(function ($value, $key) { - return $value->status === 'in_progress'; - }); - if ($in_progress->count() > 0) { - return false; - } - $server = Server::find($server_id); - $concurrent_builds = $server->settings->concurrent_builds; - - if ($deployments->count() > $concurrent_builds) { - return false; - } - - return true; -} -function next_after_cancel(?Server $server = null) -{ - if ($server) { - $next_found = ApplicationDeploymentQueue::where('server_id', data_get($server, 'id'))->where('status', ApplicationDeploymentStatus::QUEUED)->get()->sortBy('created_at'); - if ($next_found->count() > 0) { - foreach ($next_found as $next) { - $server = Server::find($next->server_id); - $concurrent_builds = $server->settings->concurrent_builds; - $inprogress_deployments = ApplicationDeploymentQueue::where('server_id', $next->server_id)->whereIn('status', [ApplicationDeploymentStatus::QUEUED])->get()->sortByDesc('created_at'); - if ($inprogress_deployments->count() < $concurrent_builds) { - $next->update([ - 'status' => ApplicationDeploymentStatus::IN_PROGRESS->value, - ]); - - ApplicationDeploymentJob::dispatch( - application_deployment_queue_id: $next->id, - ); - } - break; - } - } - } -} diff --git a/bootstrap/helpers/constants.php b/bootstrap/helpers/constants.php deleted file mode 100644 index b568e090c3..0000000000 --- a/bootstrap/helpers/constants.php +++ /dev/null @@ -1,56 +0,0 @@ -'; -const DATABASE_TYPES = ['postgresql', 'redis', 'mongodb', 'mysql', 'mariadb', 'keydb', 'dragonfly', 'clickhouse']; -const VALID_CRON_STRINGS = [ - 'every_minute' => '* * * * *', - 'hourly' => '0 * * * *', - 'daily' => '0 0 * * *', - 'weekly' => '0 0 * * 0', - 'monthly' => '0 0 1 * *', - 'yearly' => '0 0 1 1 *', - '@hourly' => '0 * * * *', - '@daily' => '0 0 * * *', - '@weekly' => '0 0 * * 0', - '@monthly' => '0 0 1 * *', - '@yearly' => '0 0 1 1 *', -]; -const RESTART_MODE = 'unless-stopped'; - -const DATABASE_DOCKER_IMAGES = [ - 'bitnami/mariadb', - 'bitnami/mongodb', - 'bitnami/redis', - 'mysql', - 'bitnami/mysql', - 'mysql/mysql-server', - 'mariadb', - 'postgis/postgis', - 'postgres', - 'bitnami/postgresql', - 'supabase/postgres', - 'elestio/postgres', - 'mongo', - 'redis', - 'memcached', - 'couchdb', - 'neo4j', - 'influxdb', - 'clickhouse/clickhouse-server', -]; -const SPECIFIC_SERVICES = [ - 'quay.io/minio/minio', - 'minio/minio', - 'svhd/logto', -]; - -// Based on /etc/os-release -const SUPPORTED_OS = [ - 'ubuntu debian raspbian pop', - 'centos fedora rhel ol rocky amzn almalinux', - 'sles opensuse-leap opensuse-tumbleweed', - 'arch', - 'alpine', -]; - -const SHARED_VARIABLE_TYPES = ['team', 'project', 'environment']; diff --git a/bootstrap/helpers/databases.php b/bootstrap/helpers/databases.php deleted file mode 100644 index 2fd85337d4..0000000000 --- a/bootstrap/helpers/databases.php +++ /dev/null @@ -1,433 +0,0 @@ -firstOrFail(); - $database = new StandalonePostgresql; - $database->name = generate_database_name('postgresql'); - $database->image = $databaseImage; - $database->postgres_password = \Illuminate\Support\Str::password(length: 64, symbols: false); - $database->environment_id = $environmentId; - $database->destination_id = $destination->id; - $database->destination_type = $destination->getMorphClass(); - if ($otherData) { - $database->fill($otherData); - } - $database->save(); - - return $database; -} - -function create_standalone_redis($environment_id, $destination_uuid, ?array $otherData = null): StandaloneRedis -{ - $destination = StandaloneDocker::where('uuid', $destination_uuid)->firstOrFail(); - $database = new StandaloneRedis; - $database->name = generate_database_name('redis'); - $redis_password = \Illuminate\Support\Str::password(length: 64, symbols: false); - $database->environment_id = $environment_id; - $database->destination_id = $destination->id; - $database->destination_type = $destination->getMorphClass(); - if ($otherData) { - $database->fill($otherData); - } - $database->save(); - - EnvironmentVariable::create([ - 'key' => 'REDIS_PASSWORD', - 'value' => $redis_password, - 'resourceable_type' => StandaloneRedis::class, - 'resourceable_id' => $database->id, - 'is_shared' => false, - ]); - - EnvironmentVariable::create([ - 'key' => 'REDIS_USERNAME', - 'value' => 'default', - 'resourceable_type' => StandaloneRedis::class, - 'resourceable_id' => $database->id, - 'is_shared' => false, - ]); - - return $database; -} - -function create_standalone_mongodb($environment_id, $destination_uuid, ?array $otherData = null): StandaloneMongodb -{ - $destination = StandaloneDocker::where('uuid', $destination_uuid)->firstOrFail(); - $database = new StandaloneMongodb; - $database->name = generate_database_name('mongodb'); - $database->mongo_initdb_root_password = \Illuminate\Support\Str::password(length: 64, symbols: false); - $database->environment_id = $environment_id; - $database->destination_id = $destination->id; - $database->destination_type = $destination->getMorphClass(); - if ($otherData) { - $database->fill($otherData); - } - $database->save(); - - return $database; -} - -function create_standalone_mysql($environment_id, $destination_uuid, ?array $otherData = null): StandaloneMysql -{ - $destination = StandaloneDocker::where('uuid', $destination_uuid)->firstOrFail(); - $database = new StandaloneMysql; - $database->name = generate_database_name('mysql'); - $database->mysql_root_password = \Illuminate\Support\Str::password(length: 64, symbols: false); - $database->mysql_password = \Illuminate\Support\Str::password(length: 64, symbols: false); - $database->environment_id = $environment_id; - $database->destination_id = $destination->id; - $database->destination_type = $destination->getMorphClass(); - if ($otherData) { - $database->fill($otherData); - } - $database->save(); - - return $database; -} - -function create_standalone_mariadb($environment_id, $destination_uuid, ?array $otherData = null): StandaloneMariadb -{ - $destination = StandaloneDocker::where('uuid', $destination_uuid)->firstOrFail(); - $database = new StandaloneMariadb; - $database->name = generate_database_name('mariadb'); - $database->mariadb_root_password = \Illuminate\Support\Str::password(length: 64, symbols: false); - $database->mariadb_password = \Illuminate\Support\Str::password(length: 64, symbols: false); - $database->environment_id = $environment_id; - $database->destination_id = $destination->id; - $database->destination_type = $destination->getMorphClass(); - if ($otherData) { - $database->fill($otherData); - } - $database->save(); - - return $database; -} - -function create_standalone_keydb($environment_id, $destination_uuid, ?array $otherData = null): StandaloneKeydb -{ - $destination = StandaloneDocker::where('uuid', $destination_uuid)->firstOrFail(); - $database = new StandaloneKeydb; - $database->name = generate_database_name('keydb'); - $database->keydb_password = \Illuminate\Support\Str::password(length: 64, symbols: false); - $database->environment_id = $environment_id; - $database->destination_id = $destination->id; - $database->destination_type = $destination->getMorphClass(); - if ($otherData) { - $database->fill($otherData); - } - $database->save(); - - return $database; -} - -function create_standalone_dragonfly($environment_id, $destination_uuid, ?array $otherData = null): StandaloneDragonfly -{ - $destination = StandaloneDocker::where('uuid', $destination_uuid)->firstOrFail(); - $database = new StandaloneDragonfly; - $database->name = generate_database_name('dragonfly'); - $database->dragonfly_password = \Illuminate\Support\Str::password(length: 64, symbols: false); - $database->environment_id = $environment_id; - $database->destination_id = $destination->id; - $database->destination_type = $destination->getMorphClass(); - if ($otherData) { - $database->fill($otherData); - } - $database->save(); - - return $database; -} - -function create_standalone_clickhouse($environment_id, $destination_uuid, ?array $otherData = null): StandaloneClickhouse -{ - $destination = StandaloneDocker::where('uuid', $destination_uuid)->firstOrFail(); - $database = new StandaloneClickhouse; - $database->name = generate_database_name('clickhouse'); - $database->clickhouse_admin_password = \Illuminate\Support\Str::password(length: 64, symbols: false); - $database->environment_id = $environment_id; - $database->destination_id = $destination->id; - $database->destination_type = $destination->getMorphClass(); - if ($otherData) { - $database->fill($otherData); - } - $database->save(); - - return $database; -} - -function deleteBackupsLocally(string|array|null $filenames, Server $server): void -{ - if (empty($filenames)) { - return; - } - if (is_string($filenames)) { - $filenames = [$filenames]; - } - $quotedFiles = array_map(fn ($file) => "\"$file\"", $filenames); - instant_remote_process(['rm -f '.implode(' ', $quotedFiles)], $server, throwError: false); - - $foldersToCheck = collect($filenames)->map(fn ($file) => dirname($file))->unique(); - $foldersToCheck->each(fn ($folder) => deleteEmptyBackupFolder($folder, $server)); -} - -function deleteBackupsS3(string|array|null $filenames, S3Storage $s3): void -{ - if (empty($filenames) || ! $s3) { - return; - } - if (is_string($filenames)) { - $filenames = [$filenames]; - } - - $disk = Storage::build([ - 'driver' => 's3', - 'key' => $s3->key, - 'secret' => $s3->secret, - 'region' => $s3->region, - 'bucket' => $s3->bucket, - 'endpoint' => $s3->endpoint, - 'use_path_style_endpoint' => true, - 'aws_url' => $s3->awsUrl(), - ]); - - $disk->delete($filenames); -} - -function deleteEmptyBackupFolder($folderPath, Server $server): void -{ - $escapedPath = escapeshellarg($folderPath); - $escapedParentPath = escapeshellarg(dirname($folderPath)); - - $checkEmpty = instant_remote_process(["[ -d $escapedPath ] && [ -z \"$(ls -A $escapedPath)\" ] && echo 'empty' || echo 'not empty'"], $server, throwError: false); - - if (trim($checkEmpty) === 'empty') { - instant_remote_process(["rmdir $escapedPath"], $server, throwError: false); - $checkParentEmpty = instant_remote_process(["[ -d $escapedParentPath ] && [ -z \"$(ls -A $escapedParentPath)\" ] && echo 'empty' || echo 'not empty'"], $server, throwError: false); - if (trim($checkParentEmpty) === 'empty') { - instant_remote_process(["rmdir $escapedParentPath"], $server, throwError: false); - } - } -} - -function removeOldBackups($backup): void -{ - try { - if ($backup->executions) { - $localBackupsToDelete = deleteOldBackupsLocally($backup); - if ($localBackupsToDelete->isNotEmpty()) { - $backup->executions() - ->whereIn('id', $localBackupsToDelete->pluck('id')) - ->update(['local_storage_deleted' => true]); - } - } - - if ($backup->save_s3 && $backup->executions) { - $s3BackupsToDelete = deleteOldBackupsFromS3($backup); - if ($s3BackupsToDelete->isNotEmpty()) { - $backup->executions() - ->whereIn('id', $s3BackupsToDelete->pluck('id')) - ->update(['s3_storage_deleted' => true]); - } - } - - $backup->executions() - ->where('local_storage_deleted', true) - ->where('s3_storage_deleted', true) - ->delete(); - - } catch (\Exception $e) { - throw $e; - } -} - -function deleteOldBackupsLocally($backup): Collection -{ - if (! $backup || ! $backup->executions) { - return collect(); - } - - $successfulBackups = $backup->executions() - ->where('status', 'success') - ->where('local_storage_deleted', false) - ->orderBy('created_at', 'desc') - ->get(); - - if ($successfulBackups->isEmpty()) { - return collect(); - } - - $retentionAmount = $backup->database_backup_retention_amount_locally; - $retentionDays = $backup->database_backup_retention_days_locally; - $maxStorageGB = $backup->database_backup_retention_max_storage_locally; - - if ($retentionAmount === 0 && $retentionDays === 0 && $maxStorageGB === 0) { - return collect(); - } - - $backupsToDelete = collect(); - - if ($retentionAmount > 0) { - $byAmount = $successfulBackups->skip($retentionAmount); - $backupsToDelete = $backupsToDelete->merge($byAmount); - } - - if ($retentionDays > 0) { - $oldestAllowedDate = $successfulBackups->first()->created_at->clone()->utc()->subDays($retentionDays); - $oldBackups = $successfulBackups->filter(fn ($execution) => $execution->created_at->utc() < $oldestAllowedDate); - $backupsToDelete = $backupsToDelete->merge($oldBackups); - } - - if ($maxStorageGB > 0) { - $maxStorageBytes = $maxStorageGB * pow(1024, 3); - $totalSize = 0; - $backupsOverLimit = collect(); - - $backupsToCheck = $successfulBackups->skip(1); - - foreach ($backupsToCheck as $backupExecution) { - $totalSize += (int) $backupExecution->size; - if ($totalSize > $maxStorageBytes) { - $backupsOverLimit = $successfulBackups->filter( - fn ($b) => $b->created_at->utc() <= $backupExecution->created_at->utc() - )->skip(1); - break; - } - } - - $backupsToDelete = $backupsToDelete->merge($backupsOverLimit); - } - - $backupsToDelete = $backupsToDelete->unique('id'); - $processedBackups = collect(); - - $server = null; - if ($backup->database_type === \App\Models\ServiceDatabase::class) { - $server = $backup->database->service->server; - } else { - $server = $backup->database->destination->server; - } - - if (! $server) { - return collect(); - } - - $filesToDelete = $backupsToDelete - ->filter(fn ($execution) => ! empty($execution->filename)) - ->pluck('filename') - ->all(); - - if (! empty($filesToDelete)) { - deleteBackupsLocally($filesToDelete, $server); - $processedBackups = $backupsToDelete; - } - - return $processedBackups; -} - -function deleteOldBackupsFromS3($backup): Collection -{ - if (! $backup || ! $backup->executions || ! $backup->s3) { - return collect(); - } - - $successfulBackups = $backup->executions() - ->where('status', 'success') - ->where('s3_storage_deleted', false) - ->orderBy('created_at', 'desc') - ->get(); - - if ($successfulBackups->isEmpty()) { - return collect(); - } - - $retentionAmount = $backup->database_backup_retention_amount_s3; - $retentionDays = $backup->database_backup_retention_days_s3; - $maxStorageGB = $backup->database_backup_retention_max_storage_s3; - - if ($retentionAmount === 0 && $retentionDays === 0 && $maxStorageGB === 0) { - return collect(); - } - - $backupsToDelete = collect(); - - if ($retentionAmount > 0) { - $byAmount = $successfulBackups->skip($retentionAmount); - $backupsToDelete = $backupsToDelete->merge($byAmount); - } - - if ($retentionDays > 0) { - $oldestAllowedDate = $successfulBackups->first()->created_at->clone()->utc()->subDays($retentionDays); - $oldBackups = $successfulBackups->filter(fn ($execution) => $execution->created_at->utc() < $oldestAllowedDate); - $backupsToDelete = $backupsToDelete->merge($oldBackups); - } - - if ($maxStorageGB > 0) { - $maxStorageBytes = $maxStorageGB * pow(1024, 3); - $totalSize = 0; - $backupsOverLimit = collect(); - - $backupsToCheck = $successfulBackups->skip(1); - - foreach ($backupsToCheck as $backupExecution) { - $totalSize += (int) $backupExecution->size; - if ($totalSize > $maxStorageBytes) { - $backupsOverLimit = $successfulBackups->filter( - fn ($b) => $b->created_at->utc() <= $backupExecution->created_at->utc() - )->skip(1); - break; - } - } - - $backupsToDelete = $backupsToDelete->merge($backupsOverLimit); - } - - $backupsToDelete = $backupsToDelete->unique('id'); - $processedBackups = collect(); - - $filesToDelete = $backupsToDelete - ->filter(fn ($execution) => ! empty($execution->filename)) - ->pluck('filename') - ->all(); - - if (! empty($filesToDelete)) { - deleteBackupsS3($filesToDelete, $backup->s3); - $processedBackups = $backupsToDelete; - } - - return $processedBackups; -} - -function isPublicPortAlreadyUsed(Server $server, int $port, ?string $id = null): bool -{ - if ($id) { - $foundDatabase = $server->databases()->where('public_port', $port)->where('is_public', true)->where('id', '!=', $id)->first(); - } else { - $foundDatabase = $server->databases()->where('public_port', $port)->where('is_public', true)->first(); - } - if ($foundDatabase) { - return true; - } - - return false; -} diff --git a/bootstrap/helpers/docker.php b/bootstrap/helpers/docker.php deleted file mode 100644 index 80e19d80f9..0000000000 --- a/bootstrap/helpers/docker.php +++ /dev/null @@ -1,887 +0,0 @@ -isSwarm()) { - $containers = instant_remote_process(["docker ps -a --filter='label=coolify.applicationId={$id}' --format '{{json .}}' "], $server); - $containers = format_docker_command_output_to_json($containers); - $containers = $containers->map(function ($container) use ($pullRequestId, $includePullrequests) { - $labels = data_get($container, 'Labels'); - if (! str($labels)->contains('coolify.pullRequestId=')) { - data_set($container, 'Labels', $labels.",coolify.pullRequestId={$pullRequestId}"); - - return $container; - } - if ($includePullrequests) { - return $container; - } - if (str($labels)->contains("coolify.pullRequestId=$pullRequestId")) { - return $container; - } - - return null; - }); - - return $containers->filter(); - } - - return $containers; -} - -function getCurrentServiceContainerStatus(Server $server, int $id): Collection -{ - $containers = collect([]); - if (! $server->isSwarm()) { - $containers = instant_remote_process(["docker ps -a --filter='label=coolify.serviceId={$id}' --format '{{json .}}' "], $server); - $containers = format_docker_command_output_to_json($containers); - - return $containers->filter(); - } - - return $containers; -} - -function format_docker_command_output_to_json($rawOutput): Collection -{ - $outputLines = explode(PHP_EOL, $rawOutput); - if (count($outputLines) === 1) { - $outputLines = collect($outputLines[0]); - } else { - $outputLines = collect($outputLines); - } - - try { - return $outputLines - ->reject(fn ($line) => empty($line)) - ->map(fn ($outputLine) => json_decode($outputLine, true, flags: JSON_THROW_ON_ERROR)); - } catch (\Throwable) { - return collect([]); - } -} - -function format_docker_labels_to_json(string|array $rawOutput): Collection -{ - if (is_array($rawOutput)) { - return collect($rawOutput); - } - $outputLines = explode(PHP_EOL, $rawOutput); - - return collect($outputLines) - ->reject(fn ($line) => empty($line)) - ->map(function ($outputLine) { - $outputArray = explode(',', $outputLine); - - return collect($outputArray) - ->map(function ($outputLine) { - return explode('=', $outputLine); - }) - ->mapWithKeys(function ($outputLine) { - return [$outputLine[0] => $outputLine[1]]; - }); - })[0]; -} - -function format_docker_envs_to_json($rawOutput) -{ - try { - $outputLines = json_decode($rawOutput, true, flags: JSON_THROW_ON_ERROR); - - return collect(data_get($outputLines[0], 'Config.Env', []))->mapWithKeys(function ($env) { - $env = explode('=', $env); - - return [$env[0] => $env[1]]; - }); - } catch (\Throwable) { - return collect([]); - } -} -function checkMinimumDockerEngineVersion($dockerVersion) -{ - $majorDockerVersion = str($dockerVersion)->before('.')->value(); - $requiredDockerVersion = str(config('constants.docker.minimum_required_version'))->before('.')->value(); - if ($majorDockerVersion < $requiredDockerVersion) { - $dockerVersion = null; - } - - return $dockerVersion; -} -function executeInDocker(string $containerId, string $command) -{ - return "docker exec {$containerId} bash -c '{$command}'"; - // return "docker exec {$this->deployment_uuid} bash -c '{$command} |& tee -a /proc/1/fd/1; [ \$PIPESTATUS -eq 0 ] || exit \$PIPESTATUS'"; -} - -function getContainerStatus(Server $server, string $container_id, bool $all_data = false, bool $throwError = false) -{ - if ($server->isSwarm()) { - $container = instant_remote_process(["docker service ls --filter 'name={$container_id}' --format '{{json .}}' "], $server, $throwError); - } else { - $container = instant_remote_process(["docker inspect --format '{{json .}}' {$container_id}"], $server, $throwError); - } - if (! $container) { - return 'exited'; - } - $container = format_docker_command_output_to_json($container); - if ($container->isEmpty()) { - return 'exited'; - } - if ($all_data) { - return $container[0]; - } - if ($server->isSwarm()) { - $replicas = data_get($container[0], 'Replicas'); - $replicas = explode('/', $replicas); - $active = (int) $replicas[0]; - $total = (int) $replicas[1]; - if ($active === $total) { - return 'running'; - } else { - return 'starting'; - } - } else { - return data_get($container[0], 'State.Status', 'exited'); - } -} - -function generateApplicationContainerName(Application $application, $pull_request_id = 0) -{ - // TODO: refactor generateApplicationContainerName, we do not need $application and $pull_request_id - - $consistent_container_name = $application->settings->is_consistent_container_name_enabled; - $now = now()->format('Hisu'); - if ($pull_request_id !== 0 && $pull_request_id !== null) { - return $application->uuid.'-pr-'.$pull_request_id; - } else { - if ($consistent_container_name) { - return $application->uuid; - } - - return $application->uuid.'-'.$now; - } -} -function get_port_from_dockerfile($dockerfile): ?int -{ - $dockerfile_array = explode("\n", $dockerfile); - $found_exposed_port = null; - foreach ($dockerfile_array as $line) { - $line_str = str($line)->trim(); - if ($line_str->startsWith('EXPOSE')) { - $found_exposed_port = $line_str->replace('EXPOSE', '')->trim(); - break; - } - } - if ($found_exposed_port) { - return (int) $found_exposed_port->value(); - } - - return null; -} - -function defaultDatabaseLabels($database) -{ - $labels = collect([]); - $labels->push('coolify.managed=true'); - $labels->push('coolify.type=database'); - $labels->push('coolify.databaseId='.$database->id); - $labels->push('coolify.resourceName='.Str::slug($database->name)); - $labels->push('coolify.serviceName='.Str::slug($database->name)); - $labels->push('coolify.projectName='.Str::slug($database->project()->name)); - $labels->push('coolify.environmentName='.Str::slug($database->environment->name)); - $labels->push('coolify.database.subType='.$database->type()); - - return $labels; -} - -function defaultLabels($id, $name, string $projectName, string $resourceName, string $environment, $pull_request_id = 0, string $type = 'application', $subType = null, $subId = null, $subName = null) -{ - $labels = collect([]); - $labels->push('coolify.managed=true'); - $labels->push('coolify.version='.config('constants.coolify.version')); - $labels->push('coolify.'.$type.'Id='.$id); - $labels->push("coolify.type=$type"); - $labels->push('coolify.name='.$name); - $labels->push('coolify.resourceName='.Str::slug($resourceName)); - $labels->push('coolify.projectName='.Str::slug($projectName)); - $labels->push('coolify.serviceName='.Str::slug($subName ?? $resourceName)); - $labels->push('coolify.environmentName='.Str::slug($environment)); - - $labels->push('coolify.pullRequestId='.$pull_request_id); - if ($type === 'service') { - $subId && $labels->push('coolify.service.subId='.$subId); - $subType && $labels->push('coolify.service.subType='.$subType); - $subName && $labels->push('coolify.service.subName='.Str::slug($subName)); - } - - return $labels; -} - -function generateServiceSpecificFqdns(ServiceApplication|Application $resource) -{ - if ($resource->getMorphClass() === \App\Models\ServiceApplication::class) { - $uuid = data_get($resource, 'uuid'); - $server = data_get($resource, 'service.server'); - $environment_variables = data_get($resource, 'service.environment_variables'); - $type = $resource->serviceType(); - } elseif ($resource->getMorphClass() === \App\Models\Application::class) { - $uuid = data_get($resource, 'uuid'); - $server = data_get($resource, 'destination.server'); - $environment_variables = data_get($resource, 'environment_variables'); - $type = $resource->serviceType(); - } - if (is_null($server) || is_null($type)) { - return collect([]); - } - $variables = collect($environment_variables); - $payload = collect([]); - switch ($type) { - case $type?->contains('minio'): - $MINIO_BROWSER_REDIRECT_URL = $variables->where('key', 'MINIO_BROWSER_REDIRECT_URL')->first(); - $MINIO_SERVER_URL = $variables->where('key', 'MINIO_SERVER_URL')->first(); - - if (is_null($MINIO_BROWSER_REDIRECT_URL) || is_null($MINIO_SERVER_URL)) { - return collect([]); - } - - if (str($MINIO_BROWSER_REDIRECT_URL->value ?? '')->isEmpty()) { - $MINIO_BROWSER_REDIRECT_URL->update([ - 'value' => generateFqdn($server, 'console-'.$uuid, true), - ]); - } - if (str($MINIO_SERVER_URL->value ?? '')->isEmpty()) { - $MINIO_SERVER_URL->update([ - 'value' => generateFqdn($server, 'minio-'.$uuid, true), - ]); - } - $payload = collect([ - $MINIO_BROWSER_REDIRECT_URL->value.':9001', - $MINIO_SERVER_URL->value.':9000', - ]); - break; - case $type?->contains('logto'): - $LOGTO_ENDPOINT = $variables->where('key', 'LOGTO_ENDPOINT')->first(); - $LOGTO_ADMIN_ENDPOINT = $variables->where('key', 'LOGTO_ADMIN_ENDPOINT')->first(); - - if (is_null($LOGTO_ENDPOINT) || is_null($LOGTO_ADMIN_ENDPOINT)) { - return collect([]); - } - - if (str($LOGTO_ENDPOINT->value ?? '')->isEmpty()) { - $LOGTO_ENDPOINT->update([ - 'value' => generateFqdn($server, 'logto-'.$uuid), - ]); - } - if (str($LOGTO_ADMIN_ENDPOINT->value ?? '')->isEmpty()) { - $LOGTO_ADMIN_ENDPOINT->update([ - 'value' => generateFqdn($server, 'logto-admin-'.$uuid), - ]); - } - $payload = collect([ - $LOGTO_ENDPOINT->value.':3001', - $LOGTO_ADMIN_ENDPOINT->value.':3002', - ]); - break; - } - - return $payload; -} -function fqdnLabelsForCaddy(string $network, string $uuid, Collection $domains, bool $is_force_https_enabled = false, $onlyPort = null, ?Collection $serviceLabels = null, ?bool $is_gzip_enabled = true, ?bool $is_stripprefix_enabled = true, ?string $service_name = null, ?string $image = null, string $redirect_direction = 'both', ?string $predefinedPort = null) -{ - $labels = collect([]); - if ($serviceLabels) { - $labels->push("caddy_ingress_network={$uuid}"); - } else { - $labels->push("caddy_ingress_network={$network}"); - } - foreach ($domains as $loop => $domain) { - $url = Url::fromString($domain); - $host = $url->getHost(); - $path = $url->getPath(); - $host_without_www = str($host)->replace('www.', ''); - $schema = $url->getScheme(); - $port = $url->getPort(); - $handle = 'handle_path'; - if (! $is_stripprefix_enabled) { - $handle = 'handle'; - } - if (is_null($port) && ! is_null($onlyPort)) { - $port = $onlyPort; - } - if (is_null($port) && $predefinedPort) { - $port = $predefinedPort; - } - $labels->push("caddy_{$loop}={$schema}://{$host}"); - $labels->push("caddy_{$loop}.header=-Server"); - $labels->push("caddy_{$loop}.try_files={path} /index.html /index.php"); - - if ($port) { - $labels->push("caddy_{$loop}.{$handle}.{$loop}_reverse_proxy={{upstreams $port}}"); - } else { - $labels->push("caddy_{$loop}.{$handle}.{$loop}_reverse_proxy={{upstreams}}"); - } - $labels->push("caddy_{$loop}.{$handle}={$path}*"); - if ($is_gzip_enabled) { - $labels->push("caddy_{$loop}.encode=zstd gzip"); - } - if ($redirect_direction === 'www' && ! str($host)->startsWith('www.')) { - $labels->push("caddy_{$loop}.redir={$schema}://www.{$host}{uri}"); - } - if ($redirect_direction === 'non-www' && str($host)->startsWith('www.')) { - $labels->push("caddy_{$loop}.redir={$schema}://{$host_without_www}{uri}"); - } - if (isDev()) { - // $labels->push("caddy_{$loop}.tls=internal"); - } - } - - return $labels->sort(); -} -function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_https_enabled = false, $onlyPort = null, ?Collection $serviceLabels = null, ?bool $is_gzip_enabled = true, ?bool $is_stripprefix_enabled = true, ?string $service_name = null, bool $generate_unique_uuid = false, ?string $image = null, string $redirect_direction = 'both') -{ - $labels = collect([]); - $labels->push('traefik.enable=true'); - $labels->push('traefik.http.middlewares.gzip.compress=true'); - $labels->push('traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https'); - - $middlewares_from_labels = collect([]); - - if ($serviceLabels) { - $middlewares_from_labels = $serviceLabels->map(function ($item) { - if (preg_match('/traefik\.http\.middlewares\.(.*?)(\.|$)/', $item, $matches)) { - return $matches[1]; - } - if (preg_match('/coolify\.traefik\.middlewares=(.*)/', $item, $matches)) { - return explode(',', $matches[1]); - } - - return null; - })->flatten() - ->filter() - ->unique(); - } - foreach ($domains as $loop => $domain) { - try { - if ($generate_unique_uuid) { - $uuid = new Cuid2; - } - - $url = Url::fromString($domain); - $host = $url->getHost(); - $path = $url->getPath(); - $schema = $url->getScheme(); - $port = $url->getPort(); - if (is_null($port) && ! is_null($onlyPort)) { - $port = $onlyPort; - } - $http_label = "http-{$loop}-{$uuid}"; - $https_label = "https-{$loop}-{$uuid}"; - if ($service_name) { - $http_label = "http-{$loop}-{$uuid}-{$service_name}"; - $https_label = "https-{$loop}-{$uuid}-{$service_name}"; - } - if (str($image)->contains('ghost')) { - $labels->push("traefik.http.middlewares.redir-ghost-{$uuid}.redirectregex.regex=^{$path}/(.*)"); - $labels->push("traefik.http.middlewares.redir-ghost-{$uuid}.redirectregex.replacement=/$1"); - $labels->push("caddy_{$loop}.handle_path.{$loop}_redir-ghost-{$uuid}.handler=rewrite"); - $labels->push("caddy_{$loop}.handle_path.{$loop}_redir-ghost-{$uuid}.rewrite.regexp=^{$path}/(.*)"); - $labels->push("caddy_{$loop}.handle_path.{$loop}_redir-ghost-{$uuid}.rewrite.replacement=/$1"); - } - - $to_www_name = "{$loop}-{$uuid}-to-www"; - $to_non_www_name = "{$loop}-{$uuid}-to-non-www"; - $redirect_to_non_www = [ - "traefik.http.middlewares.{$to_non_www_name}.redirectregex.regex=^(http|https)://www\.(.+)", - "traefik.http.middlewares.{$to_non_www_name}.redirectregex.replacement=\${1}://\${2}", - "traefik.http.middlewares.{$to_non_www_name}.redirectregex.permanent=false", - ]; - $redirect_to_www = [ - "traefik.http.middlewares.{$to_www_name}.redirectregex.regex=^(http|https)://(?:www\.)?(.+)", - "traefik.http.middlewares.{$to_www_name}.redirectregex.replacement=\${1}://www.\${2}", - "traefik.http.middlewares.{$to_www_name}.redirectregex.permanent=false", - ]; - if ($schema === 'https') { - // Set labels for https - $labels->push("traefik.http.routers.{$https_label}.rule=Host(`{$host}`) && PathPrefix(`{$path}`)"); - $labels->push("traefik.http.routers.{$https_label}.entryPoints=https"); - if ($port) { - $labels->push("traefik.http.routers.{$https_label}.service={$https_label}"); - $labels->push("traefik.http.services.{$https_label}.loadbalancer.server.port=$port"); - } - if ($path !== '/') { - // Middleware handling - $middlewares = collect([]); - if ($is_stripprefix_enabled && ! str($image)->contains('ghost')) { - $labels->push("traefik.http.middlewares.{$https_label}-stripprefix.stripprefix.prefixes={$path}"); - $middlewares->push("{$https_label}-stripprefix"); - } - if ($is_gzip_enabled) { - $middlewares->push('gzip'); - } - if (str($image)->contains('ghost')) { - $middlewares->push("redir-ghost-{$uuid}"); - } - if ($redirect_direction === 'non-www' && str($host)->startsWith('www.')) { - $labels = $labels->merge($redirect_to_non_www); - $middlewares->push($to_non_www_name); - } - if ($redirect_direction === 'www' && ! str($host)->startsWith('www.')) { - $labels = $labels->merge($redirect_to_www); - $middlewares->push($to_www_name); - } - $middlewares_from_labels->each(function ($middleware_name) use ($middlewares) { - $middlewares->push($middleware_name); - }); - if ($middlewares->isNotEmpty()) { - $middlewares = $middlewares->join(','); - $labels->push("traefik.http.routers.{$https_label}.middlewares={$middlewares}"); - } - } else { - $middlewares = collect([]); - if ($is_gzip_enabled) { - $middlewares->push('gzip'); - } - if (str($image)->contains('ghost')) { - $middlewares->push("redir-ghost-{$uuid}"); - } - if ($redirect_direction === 'non-www' && str($host)->startsWith('www.')) { - $labels = $labels->merge($redirect_to_non_www); - $middlewares->push($to_non_www_name); - } - if ($redirect_direction === 'www' && ! str($host)->startsWith('www.')) { - $labels = $labels->merge($redirect_to_www); - $middlewares->push($to_www_name); - } - $middlewares_from_labels->each(function ($middleware_name) use ($middlewares) { - $middlewares->push($middleware_name); - }); - if ($middlewares->isNotEmpty()) { - $middlewares = $middlewares->join(','); - $labels->push("traefik.http.routers.{$https_label}.middlewares={$middlewares}"); - } - } - $labels->push("traefik.http.routers.{$https_label}.tls=true"); - $labels->push("traefik.http.routers.{$https_label}.tls.certresolver=letsencrypt"); - - // Set labels for http (redirect to https) - $labels->push("traefik.http.routers.{$http_label}.rule=Host(`{$host}`) && PathPrefix(`{$path}`)"); - $labels->push("traefik.http.routers.{$http_label}.entryPoints=http"); - if ($port) { - $labels->push("traefik.http.services.{$http_label}.loadbalancer.server.port=$port"); - $labels->push("traefik.http.routers.{$http_label}.service={$http_label}"); - } - if ($is_force_https_enabled) { - $labels->push("traefik.http.routers.{$http_label}.middlewares=redirect-to-https"); - } - } else { - // Set labels for http - $labels->push("traefik.http.routers.{$http_label}.rule=Host(`{$host}`) && PathPrefix(`{$path}`)"); - $labels->push("traefik.http.routers.{$http_label}.entryPoints=http"); - if ($port) { - $labels->push("traefik.http.services.{$http_label}.loadbalancer.server.port=$port"); - $labels->push("traefik.http.routers.{$http_label}.service={$http_label}"); - } - if ($path !== '/') { - $middlewares = collect([]); - if ($is_stripprefix_enabled && ! str($image)->contains('ghost')) { - $labels->push("traefik.http.middlewares.{$http_label}-stripprefix.stripprefix.prefixes={$path}"); - $middlewares->push("{$http_label}-stripprefix"); - } - if ($is_gzip_enabled) { - $middlewares->push('gzip'); - } - if (str($image)->contains('ghost')) { - $middlewares->push("redir-ghost-{$uuid}"); - } - if ($redirect_direction === 'non-www' && str($host)->startsWith('www.')) { - $labels = $labels->merge($redirect_to_non_www); - $middlewares->push($to_non_www_name); - } - if ($redirect_direction === 'www' && ! str($host)->startsWith('www.')) { - $labels = $labels->merge($redirect_to_www); - $middlewares->push($to_www_name); - } - $middlewares_from_labels->each(function ($middleware_name) use ($middlewares) { - $middlewares->push($middleware_name); - }); - if ($middlewares->isNotEmpty()) { - $middlewares = $middlewares->join(','); - $labels->push("traefik.http.routers.{$http_label}.middlewares={$middlewares}"); - } - } else { - $middlewares = collect([]); - if ($is_gzip_enabled) { - $middlewares->push('gzip'); - } - if (str($image)->contains('ghost')) { - $middlewares->push("redir-ghost-{$uuid}"); - } - if ($redirect_direction === 'non-www' && str($host)->startsWith('www.')) { - $labels = $labels->merge($redirect_to_non_www); - $middlewares->push($to_non_www_name); - } - if ($redirect_direction === 'www' && ! str($host)->startsWith('www.')) { - $labels = $labels->merge($redirect_to_www); - $middlewares->push($to_www_name); - } - $middlewares_from_labels->each(function ($middleware_name) use ($middlewares) { - $middlewares->push($middleware_name); - }); - if ($middlewares->isNotEmpty()) { - $middlewares = $middlewares->join(','); - $labels->push("traefik.http.routers.{$http_label}.middlewares={$middlewares}"); - } - } - } - } catch (\Throwable) { - continue; - } - } - - return $labels->sort(); -} -function generateLabelsApplication(Application $application, ?ApplicationPreview $preview = null): array -{ - $ports = $application->settings->is_static ? [80] : $application->ports_exposes_array; - $onlyPort = null; - if (count($ports) > 0) { - $onlyPort = $ports[0]; - } - $pull_request_id = data_get($preview, 'pull_request_id', 0); - $appUuid = $application->uuid; - if ($pull_request_id !== 0) { - $appUuid = $appUuid.'-pr-'.$pull_request_id; - } - $labels = collect([]); - if ($pull_request_id === 0) { - if ($application->fqdn) { - $domains = str(data_get($application, 'fqdn'))->explode(','); - $shouldGenerateLabelsExactly = $application->destination->server->settings->generate_exact_labels; - if ($shouldGenerateLabelsExactly) { - switch ($application->destination->server->proxyType()) { - case ProxyTypes::TRAEFIK->value: - $labels = $labels->merge(fqdnLabelsForTraefik( - uuid: $appUuid, - domains: $domains, - onlyPort: $onlyPort, - is_force_https_enabled: $application->isForceHttpsEnabled(), - is_gzip_enabled: $application->isGzipEnabled(), - is_stripprefix_enabled: $application->isStripprefixEnabled(), - redirect_direction: $application->redirect - )); - break; - case ProxyTypes::CADDY->value: - $labels = $labels->merge(fqdnLabelsForCaddy( - network: $application->destination->network, - uuid: $appUuid, - domains: $domains, - onlyPort: $onlyPort, - is_force_https_enabled: $application->isForceHttpsEnabled(), - is_gzip_enabled: $application->isGzipEnabled(), - is_stripprefix_enabled: $application->isStripprefixEnabled(), - redirect_direction: $application->redirect - )); - break; - } - } else { - $labels = $labels->merge(fqdnLabelsForTraefik( - uuid: $appUuid, - domains: $domains, - onlyPort: $onlyPort, - is_force_https_enabled: $application->isForceHttpsEnabled(), - is_gzip_enabled: $application->isGzipEnabled(), - is_stripprefix_enabled: $application->isStripprefixEnabled(), - redirect_direction: $application->redirect - )); - $labels = $labels->merge(fqdnLabelsForCaddy( - network: $application->destination->network, - uuid: $appUuid, - domains: $domains, - onlyPort: $onlyPort, - is_force_https_enabled: $application->isForceHttpsEnabled(), - is_gzip_enabled: $application->isGzipEnabled(), - is_stripprefix_enabled: $application->isStripprefixEnabled(), - redirect_direction: $application->redirect - )); - } - } - } else { - if (data_get($preview, 'fqdn')) { - $domains = str(data_get($preview, 'fqdn'))->explode(','); - } else { - $domains = collect([]); - } - $shouldGenerateLabelsExactly = $application->destination->server->settings->generate_exact_labels; - if ($shouldGenerateLabelsExactly) { - switch ($application->destination->server->proxyType()) { - case ProxyTypes::TRAEFIK->value: - $labels = $labels->merge(fqdnLabelsForTraefik( - uuid: $appUuid, - domains: $domains, - onlyPort: $onlyPort, - is_force_https_enabled: $application->isForceHttpsEnabled(), - is_gzip_enabled: $application->isGzipEnabled(), - is_stripprefix_enabled: $application->isStripprefixEnabled() - )); - break; - case ProxyTypes::CADDY->value: - $labels = $labels->merge(fqdnLabelsForCaddy( - network: $application->destination->network, - uuid: $appUuid, - domains: $domains, - onlyPort: $onlyPort, - is_force_https_enabled: $application->isForceHttpsEnabled(), - is_gzip_enabled: $application->isGzipEnabled(), - is_stripprefix_enabled: $application->isStripprefixEnabled() - )); - break; - } - } else { - $labels = $labels->merge(fqdnLabelsForTraefik( - uuid: $appUuid, - domains: $domains, - onlyPort: $onlyPort, - is_force_https_enabled: $application->isForceHttpsEnabled(), - is_gzip_enabled: $application->isGzipEnabled(), - is_stripprefix_enabled: $application->isStripprefixEnabled() - )); - $labels = $labels->merge(fqdnLabelsForCaddy( - network: $application->destination->network, - uuid: $appUuid, - domains: $domains, - onlyPort: $onlyPort, - is_force_https_enabled: $application->isForceHttpsEnabled(), - is_gzip_enabled: $application->isGzipEnabled(), - is_stripprefix_enabled: $application->isStripprefixEnabled() - )); - } - } - - return $labels->all(); -} - -function isDatabaseImage(?string $image = null) -{ - if (is_null($image)) { - return false; - } - $image = str($image); - if ($image->contains(':')) { - $image = str($image); - } else { - $image = str($image)->append(':latest'); - } - $imageName = $image->before(':'); - if (collect(DATABASE_DOCKER_IMAGES)->contains($imageName)) { - return true; - } - - return false; -} - -function convertDockerRunToCompose(?string $custom_docker_run_options = null) -{ - $options = []; - $compose_options = collect([]); - preg_match_all('/(--\w+(?:-\w+)*)(?:\s|=)?([^\s-]+)?/', $custom_docker_run_options, $matches, PREG_SET_ORDER); - $list_options = collect([ - '--cap-add', - '--cap-drop', - '--security-opt', - '--sysctl', - '--ulimit', - '--device', - '--shm-size', - ]); - $mapping = collect([ - '--cap-add' => 'cap_add', - '--cap-drop' => 'cap_drop', - '--security-opt' => 'security_opt', - '--sysctl' => 'sysctls', - '--device' => 'devices', - '--init' => 'init', - '--ulimit' => 'ulimits', - '--privileged' => 'privileged', - '--ip' => 'ip', - '--shm-size' => 'shm_size', - '--gpus' => 'gpus', - ]); - foreach ($matches as $match) { - $option = $match[1]; - if ($option === '--gpus') { - $regexForParsingDeviceIds = '/device=([0-9A-Za-z-,]+)/'; - preg_match($regexForParsingDeviceIds, $custom_docker_run_options, $device_matches); - $value = $device_matches[1] ?? 'all'; - $options[$option][] = $value; - $options[$option] = array_unique($options[$option]); - } - if (isset($match[2]) && $match[2] !== '') { - $value = $match[2]; - $options[$option][] = $value; - $options[$option] = array_unique($options[$option]); - } else { - $value = true; - $options[$option] = $value; - } - } - $options = collect($options); - // Easily get mappings from https://github.com/composerize/composerize/blob/master/packages/composerize/src/mappings.js - foreach ($options as $option => $value) { - if (! data_get($mapping, $option)) { - continue; - } - if ($option === '--ulimit') { - $ulimits = collect([]); - collect($value)->map(function ($ulimit) use ($ulimits) { - $ulimit = explode('=', $ulimit); - $type = $ulimit[0]; - $limits = explode(':', $ulimit[1]); - if (count($limits) == 2) { - $soft_limit = $limits[0]; - $hard_limit = $limits[1]; - $ulimits->put($type, [ - 'soft' => $soft_limit, - 'hard' => $hard_limit, - ]); - } else { - $soft_limit = $ulimit[1]; - $ulimits->put($type, [ - 'soft' => $soft_limit, - ]); - } - }); - $compose_options->put($mapping[$option], $ulimits); - } elseif ($option === '--shm-size') { - if (! is_null($value) && is_array($value) && count($value) > 0) { - $compose_options->put($mapping[$option], $value[0]); - } - } elseif ($option === '--gpus') { - $payload = [ - 'driver' => 'nvidia', - 'capabilities' => ['gpu'], - ]; - if (! is_null($value) && is_array($value) && count($value) > 0) { - if (str($value[0]) != 'all') { - if (str($value[0])->contains(',')) { - $payload['device_ids'] = str($value[0])->explode(',')->toArray(); - } else { - $payload['device_ids'] = [$value[0]]; - } - } - } - $compose_options->put('deploy', [ - 'resources' => [ - 'reservations' => [ - 'devices' => [$payload], - ], - ], - ]); - } else { - if ($list_options->contains($option)) { - if ($compose_options->has($mapping[$option])) { - $compose_options->put($mapping[$option], $options->get($mapping[$option]).','.$value); - } else { - $compose_options->put($mapping[$option], $value); - } - - continue; - } else { - $compose_options->put($mapping[$option], $value); - - continue; - } - $compose_options->forget($option); - } - } - - return $compose_options->toArray(); -} - -function generateCustomDockerRunOptionsForDatabases($docker_run_options, $docker_compose, $container_name, $network) -{ - $ipv4 = data_get($docker_run_options, 'ip.0'); - $ipv6 = data_get($docker_run_options, 'ip6.0'); - data_forget($docker_run_options, 'ip'); - data_forget($docker_run_options, 'ip6'); - if ($ipv4 || $ipv6) { - data_forget($docker_compose['services'][$container_name], 'networks'); - } - if ($ipv4) { - $docker_compose['services'][$container_name]['networks'][$network]['ipv4_address'] = $ipv4; - } - if ($ipv6) { - $docker_compose['services'][$container_name]['networks'][$network]['ipv6_address'] = $ipv6; - } - $docker_compose['services'][$container_name] = array_merge_recursive($docker_compose['services'][$container_name], $docker_run_options); - - return $docker_compose; -} - -function validateComposeFile(string $compose, int $server_id): string|Throwable -{ - $uuid = Str::random(18); - $server = Server::ownedByCurrentTeam()->find($server_id); - try { - if (! $server) { - throw new \Exception('Server not found'); - } - $base64_compose = base64_encode($compose); - instant_remote_process([ - "echo {$base64_compose} | base64 -d | tee /tmp/{$uuid}.yml > /dev/null", - "chmod 600 /tmp/{$uuid}.yml", - "docker compose -f /tmp/{$uuid}.yml config --no-interpolate --no-path-resolution -q", - "rm /tmp/{$uuid}.yml", - ], $server); - - return 'OK'; - } catch (\Throwable $e) { - return $e->getMessage(); - } finally { - if (filled($server)) { - instant_remote_process([ - "rm /tmp/{$uuid}.yml", - ], $server, throwError: false); - } - } -} - -function getContainerLogs(Server $server, string $container_id, int $lines = 100): string -{ - if ($server->isSwarm()) { - $output = instant_remote_process([ - "docker service logs -n {$lines} {$container_id}", - ], $server); - } else { - $output = instant_remote_process([ - "docker logs -n {$lines} {$container_id}", - ], $server); - } - - $output .= removeAnsiColors($output); - - return $output; -} - -function escapeEnvVariables($value) -{ - $search = ['\\', "\r", "\t", "\x0", '"', "'"]; - $replace = ['\\\\', '\\r', '\\t', '\\0', '\"', "\'"]; - - return str_replace($search, $replace, $value); -} -function escapeDollarSign($value) -{ - $search = ['$']; - $replace = ['$$']; - - return str_replace($search, $replace, $value); -} diff --git a/bootstrap/helpers/github.php b/bootstrap/helpers/github.php deleted file mode 100644 index 3a3f6e7b25..0000000000 --- a/bootstrap/helpers/github.php +++ /dev/null @@ -1,131 +0,0 @@ -api_url}/zen"); - $serverTime = CarbonImmutable::now()->setTimezone('UTC'); - $githubTime = Carbon::parse($response->header('date')); - $timeDiff = abs($serverTime->diffInSeconds($githubTime)); - - if ($timeDiff > 50) { - throw new \Exception( - 'System time is out of sync with GitHub API time:
'. - '- System time: '.$serverTime->format('Y-m-d H:i:s').' UTC
'. - '- GitHub time: '.$githubTime->format('Y-m-d H:i:s').' UTC
'. - '- Difference: '.$timeDiff.' seconds
'. - 'Please synchronize your system clock.' - ); - } - - $signingKey = InMemory::plainText($source->privateKey->private_key); - $algorithm = new Sha256; - $tokenBuilder = (new Builder(new JoseEncoder, ChainedFormatter::default())); - $now = CarbonImmutable::now()->setTimezone('UTC'); - $now = $now->setTime($now->format('H'), $now->format('i'), $now->format('s')); - - $jwt = $tokenBuilder - ->issuedBy($source->app_id) - ->issuedAt($now->modify('-1 minute')) - ->expiresAt($now->modify('+8 minutes')) - ->getToken($algorithm, $signingKey) - ->toString(); - - return match ($type) { - 'jwt' => $jwt, - 'installation' => (function () use ($source, $jwt) { - $response = Http::withHeaders([ - 'Authorization' => "Bearer $jwt", - 'Accept' => 'application/vnd.github.machine-man-preview+json', - ])->post("{$source->api_url}/app/installations/{$source->installation_id}/access_tokens"); - - if (! $response->successful()) { - $error = data_get($response->json(), 'message', 'no error message found'); - throw new RuntimeException("Failed to get installation token for {$source->name} with error: ".$error); - } - - return $response->json()['token']; - })(), - default => throw new \InvalidArgumentException("Unsupported token type: {$type}") - }; -} - -function generateGithubInstallationToken(GithubApp $source) -{ - return generateGithubToken($source, 'installation'); -} - -function generateGithubJwt(GithubApp $source) -{ - return generateGithubToken($source, 'jwt'); -} - -function githubApi(GithubApp|GitlabApp|null $source, string $endpoint, string $method = 'get', ?array $data = null, bool $throwError = true) -{ - if (is_null($source)) { - throw new \Exception('Source is required for API calls'); - } - - if ($source->getMorphClass() !== GithubApp::class) { - throw new \InvalidArgumentException("Unsupported source type: {$source->getMorphClass()}"); - } - - if ($source->is_public) { - $response = Http::GitHub($source->api_url)->$method($endpoint); - } else { - $token = generateGithubInstallationToken($source); - if ($data && in_array(strtolower($method), ['post', 'patch', 'put'])) { - $response = Http::GitHub($source->api_url, $token)->$method($endpoint, $data); - } else { - $response = Http::GitHub($source->api_url, $token)->$method($endpoint); - } - } - - if (! $response->successful() && $throwError) { - $resetTime = Carbon::parse((int) $response->header('X-RateLimit-Reset'))->format('Y-m-d H:i:s'); - $errorMessage = data_get($response->json(), 'message', 'no error message found'); - $remainingCalls = $response->header('X-RateLimit-Remaining', '0'); - - throw new \Exception( - 'GitHub API call failed:
'. - "Error: {$errorMessage}
". - 'Rate Limit Status:
'. - "- Remaining Calls: {$remainingCalls}
". - "- Reset Time: {$resetTime} UTC" - ); - } - - return [ - 'rate_limit_remaining' => $response->header('X-RateLimit-Remaining'), - 'rate_limit_reset' => $response->header('X-RateLimit-Reset'), - 'data' => collect($response->json()), - ]; -} - -function getInstallationPath(GithubApp $source) -{ - $github = GithubApp::where('uuid', $source->uuid)->first(); - $name = str(Str::kebab($github->name)); - $installation_path = $github->html_url === 'https://github.com' ? 'apps' : 'github-apps'; - - return "$github->html_url/$installation_path/$name/installations/new"; -} - -function getPermissionsPath(GithubApp $source) -{ - $github = GithubApp::where('uuid', $source->uuid)->first(); - $name = str(Str::kebab($github->name)); - - return "$github->html_url/settings/apps/$name/permissions"; -} diff --git a/bootstrap/helpers/notifications.php b/bootstrap/helpers/notifications.php deleted file mode 100644 index b0345df7ed..0000000000 --- a/bootstrap/helpers/notifications.php +++ /dev/null @@ -1,100 +0,0 @@ -smtp_enabled || $settings->resend_enabled; -} - -function send_internal_notification(string $message): void -{ - try { - $team = Team::find(0); - $team?->notify(new GeneralNotification($message)); - } catch (\Throwable $e) { - ray($e->getMessage()); - } -} - -function send_user_an_email(MailMessage $mail, string $email, ?string $cc = null): void -{ - $settings = instanceSettings(); - $type = set_transanctional_email_settings($settings); - if (blank($type)) { - throw new Exception('No email settings found.'); - } - if ($cc) { - Mail::send( - [], - [], - fn (Message $message) => $message - ->to($email) - ->replyTo($email) - ->cc($cc) - ->subject($mail->subject) - ->html((string) $mail->render()) - ); - } else { - Mail::send( - [], - [], - fn (Message $message) => $message - ->to($email) - ->subject($mail->subject) - ->html((string) $mail->render()) - ); - } -} - -function set_transanctional_email_settings(?InstanceSettings $settings = null): ?string // returns null|resend|smtp and defaults to array based on mail.php config -{ - if (! $settings) { - $settings = instanceSettings(); - } - if (! data_get($settings, 'smtp_enabled') && ! data_get($settings, 'resend_enabled')) { - return null; - } - - if (data_get($settings, 'resend_enabled')) { - config()->set('mail.default', 'resend'); - config()->set('mail.from.address', data_get($settings, 'smtp_from_address')); - config()->set('mail.from.name', data_get($settings, 'smtp_from_name')); - config()->set('resend.api_key', data_get($settings, 'resend_api_key')); - - return 'resend'; - } - - $encryption = match (strtolower(data_get($settings, 'smtp_encryption'))) { - 'starttls' => null, - 'tls' => 'tls', - 'none' => null, - default => null, - }; - - if (data_get($settings, 'smtp_enabled')) { - config()->set('mail.from.address', data_get($settings, 'smtp_from_address')); - config()->set('mail.from.name', data_get($settings, 'smtp_from_name')); - config()->set('mail.default', 'smtp'); - config()->set('mail.mailers.smtp', [ - 'transport' => 'smtp', - 'host' => data_get($settings, 'smtp_host'), - 'port' => data_get($settings, 'smtp_port'), - 'encryption' => $encryption, - 'username' => data_get($settings, 'smtp_username'), - 'password' => data_get($settings, 'smtp_password'), - 'timeout' => data_get($settings, 'smtp_timeout'), - 'local_domain' => null, - 'auto_tls' => data_get($settings, 'smtp_encryption') === 'none' ? '0' : '', // If encryption is "none", it will not try to upgrade to TLS via StartTLS to make sure it is unencrypted. - ]); - - return 'smtp'; - } -} diff --git a/bootstrap/helpers/proxy.php b/bootstrap/helpers/proxy.php deleted file mode 100644 index 714358e37f..0000000000 --- a/bootstrap/helpers/proxy.php +++ /dev/null @@ -1,271 +0,0 @@ -isFunctional()) { - return collect(); - } - $proxyType = $server->proxyType(); - if (is_null($proxyType) || $proxyType === 'NONE') { - return collect(); - } - $networks = instant_remote_process(['docker inspect --format="{{json .NetworkSettings.Networks }}" coolify-proxy'], $server, false); - - return collect($networks)->map(function ($network) { - return collect(json_decode($network))->keys(); - })->flatten()->unique(); -} -function collectDockerNetworksByServer(Server $server) -{ - $allNetworks = collect([]); - if ($server->isSwarm()) { - $networks = collect($server->swarmDockers)->map(function ($docker) { - return $docker['network']; - }); - } else { - // Standalone networks - $networks = collect($server->standaloneDockers)->map(function ($docker) { - return $docker['network']; - }); - } - $allNetworks = $allNetworks->merge($networks); - // Service networks - foreach ($server->services()->get() as $service) { - if ($service->isRunning()) { - $networks->push($service->networks()); - } - $allNetworks->push($service->networks()); - } - // Docker compose based apps - $docker_compose_apps = $server->dockerComposeBasedApplications(); - foreach ($docker_compose_apps as $app) { - if ($app->isRunning()) { - $networks->push($app->uuid); - } - $allNetworks->push($app->uuid); - } - // Docker compose based preview deployments - $docker_compose_previews = $server->dockerComposeBasedPreviewDeployments(); - foreach ($docker_compose_previews as $preview) { - if (! $preview->isRunning()) { - continue; - } - $pullRequestId = $preview->pull_request_id; - $applicationId = $preview->application_id; - $application = Application::find($applicationId); - if (! $application) { - continue; - } - $network = "{$application->uuid}-{$pullRequestId}"; - $networks->push($network); - $allNetworks->push($network); - } - $networks = collect($networks)->flatten()->unique(); - $allNetworks = $allNetworks->flatten()->unique(); - if ($server->isSwarm()) { - if ($networks->count() === 0) { - $networks = collect(['coolify-overlay']); - $allNetworks = collect(['coolify-overlay']); - } - } else { - if ($networks->count() === 0) { - $networks = collect(['coolify']); - $allNetworks = collect(['coolify']); - } - } - - return [ - 'networks' => $networks, - 'allNetworks' => $allNetworks, - ]; -} -function connectProxyToNetworks(Server $server) -{ - ['networks' => $networks] = collectDockerNetworksByServer($server); - if ($server->isSwarm()) { - $commands = $networks->map(function ($network) { - return [ - "echo 'Connecting coolify-proxy to $network network...'", - "docker network ls --format '{{.Name}}' | grep '^$network$' >/dev/null || docker network create --driver overlay --attachable $network >/dev/null", - "docker network connect $network coolify-proxy >/dev/null 2>&1 || true", - "echo 'Successfully connected coolify-proxy to $network network.'", - "echo 'Proxy started and configured successfully!'", - ]; - }); - } else { - $commands = $networks->map(function ($network) { - return [ - "echo 'Connecting coolify-proxy to $network network...'", - "docker network ls --format '{{.Name}}' | grep '^$network$' >/dev/null || docker network create --attachable $network >/dev/null", - "docker network connect $network coolify-proxy >/dev/null 2>&1 || true", - "echo 'Successfully connected coolify-proxy to $network network.'", - "echo 'Proxy started and configured successfully!'", - ]; - }); - } - - return $commands->flatten(); -} -function generate_default_proxy_configuration(Server $server) -{ - $proxy_path = $server->proxyPath(); - $proxy_type = $server->proxyType(); - - if ($server->isSwarm()) { - $networks = collect($server->swarmDockers)->map(function ($docker) { - return $docker['network']; - })->unique(); - if ($networks->count() === 0) { - $networks = collect(['coolify-overlay']); - } - } else { - $networks = collect($server->standaloneDockers)->map(function ($docker) { - return $docker['network']; - })->unique(); - if ($networks->count() === 0) { - $networks = collect(['coolify']); - } - } - - $array_of_networks = collect([]); - $networks->map(function ($network) use ($array_of_networks) { - $array_of_networks[$network] = [ - 'external' => true, - ]; - }); - if ($proxy_type === ProxyTypes::TRAEFIK->value) { - $labels = [ - 'traefik.enable=true', - 'traefik.http.routers.traefik.entrypoints=http', - 'traefik.http.routers.traefik.service=api@internal', - 'traefik.http.services.traefik.loadbalancer.server.port=8080', - 'coolify.managed=true', - 'coolify.proxy=true', - ]; - $config = [ - 'name' => 'coolify-proxy', - 'networks' => $array_of_networks->toArray(), - 'services' => [ - 'traefik' => [ - 'container_name' => 'coolify-proxy', - 'image' => 'traefik:v3.1', - 'restart' => RESTART_MODE, - 'extra_hosts' => [ - 'host.docker.internal:host-gateway', - ], - 'networks' => $networks->toArray(), - 'ports' => [ - '80:80', - '443:443', - '443:443/udp', - '8080:8080', - ], - 'healthcheck' => [ - 'test' => 'wget -qO- http://localhost:80/ping || exit 1', - 'interval' => '4s', - 'timeout' => '2s', - 'retries' => 5, - ], - 'volumes' => [ - '/var/run/docker.sock:/var/run/docker.sock:ro', - - ], - 'command' => [ - '--ping=true', - '--ping.entrypoint=http', - '--api.dashboard=true', - '--entrypoints.http.address=:80', - '--entrypoints.https.address=:443', - '--entrypoints.http.http.encodequerysemicolons=true', - '--entryPoints.http.http2.maxConcurrentStreams=250', - '--entrypoints.https.http.encodequerysemicolons=true', - '--entryPoints.https.http2.maxConcurrentStreams=250', - '--entrypoints.https.http3', - '--providers.file.directory=/traefik/dynamic/', - '--providers.file.watch=true', - '--certificatesresolvers.letsencrypt.acme.httpchallenge=true', - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=http', - '--certificatesresolvers.letsencrypt.acme.storage=/traefik/acme.json', - ], - 'labels' => $labels, - ], - ], - ]; - if (isDev()) { - $config['services']['traefik']['command'][] = '--api.insecure=true'; - $config['services']['traefik']['command'][] = '--log.level=debug'; - $config['services']['traefik']['command'][] = '--accesslog.filepath=/traefik/access.log'; - $config['services']['traefik']['command'][] = '--accesslog.bufferingsize=100'; - $config['services']['traefik']['volumes'][] = '/var/lib/docker/volumes/coolify_dev_coolify_data/_data/proxy/:/traefik'; - } else { - $config['services']['traefik']['command'][] = '--api.insecure=false'; - $config['services']['traefik']['volumes'][] = "{$proxy_path}:/traefik"; - } - if ($server->isSwarm()) { - data_forget($config, 'services.traefik.container_name'); - data_forget($config, 'services.traefik.restart'); - data_forget($config, 'services.traefik.labels'); - - $config['services']['traefik']['command'][] = '--providers.swarm.endpoint=unix:///var/run/docker.sock'; - $config['services']['traefik']['command'][] = '--providers.swarm.exposedbydefault=false'; - $config['services']['traefik']['deploy'] = [ - 'labels' => $labels, - 'placement' => [ - 'constraints' => [ - 'node.role==manager', - ], - ], - ]; - } else { - $config['services']['traefik']['command'][] = '--providers.docker=true'; - $config['services']['traefik']['command'][] = '--providers.docker.exposedbydefault=false'; - } - } elseif ($proxy_type === 'CADDY') { - $config = [ - 'networks' => $array_of_networks->toArray(), - 'services' => [ - 'caddy' => [ - 'container_name' => 'coolify-proxy', - 'image' => 'lucaslorentz/caddy-docker-proxy:2.8-alpine', - 'restart' => RESTART_MODE, - 'extra_hosts' => [ - 'host.docker.internal:host-gateway', - ], - 'environment' => [ - 'CADDY_DOCKER_POLLING_INTERVAL=5s', - 'CADDY_DOCKER_CADDYFILE_PATH=/dynamic/Caddyfile', - ], - 'networks' => $networks->toArray(), - 'ports' => [ - '80:80', - '443:443', - '443:443/udp', - ], - 'labels' => [ - 'coolify.managed=true', - 'coolify.proxy=true', - ], - 'volumes' => [ - '/var/run/docker.sock:/var/run/docker.sock:ro', - "{$proxy_path}/dynamic:/dynamic", - "{$proxy_path}/config:/config", - "{$proxy_path}/data:/data", - ], - ], - ], - ]; - } else { - return null; - } - - $config = Yaml::dump($config, 12, 2); - SaveConfiguration::run($server, $config); - - return $config; -} diff --git a/bootstrap/helpers/remoteProcess.php b/bootstrap/helpers/remoteProcess.php deleted file mode 100644 index d1cb93d9af..0000000000 --- a/bootstrap/helpers/remoteProcess.php +++ /dev/null @@ -1,240 +0,0 @@ -value; - $command = $command instanceof Collection ? $command->toArray() : $command; - - if ($server->isNonRoot()) { - $command = parseCommandsByLineForSudo(collect($command), $server); - } - - $command_string = implode("\n", $command); - - if (Auth::check()) { - $teams = Auth::user()->teams->pluck('id'); - if (! $teams->contains($server->team_id) && ! $teams->contains(0)) { - throw new \Exception('User is not part of the team that owns this server'); - } - } - - SshMultiplexingHelper::ensureMultiplexedConnection($server); - - return resolve(PrepareCoolifyTask::class, [ - 'remoteProcessArgs' => new CoolifyTaskArgs( - server_uuid: $server->uuid, - command: $command_string, - type: $type, - type_uuid: $type_uuid, - model: $model, - ignore_errors: $ignore_errors, - call_event_on_finish: $callEventOnFinish, - call_event_data: $callEventData, - ), - ])(); -} - -function instant_scp(string $source, string $dest, Server $server, $throwError = true) -{ - $scp_command = SshMultiplexingHelper::generateScpCommand($server, $source, $dest); - $process = Process::timeout(config('constants.ssh.command_timeout'))->run($scp_command); - $output = trim($process->output()); - $exitCode = $process->exitCode(); - if ($exitCode !== 0) { - return $throwError ? excludeCertainErrors($process->errorOutput(), $exitCode) : null; - } - - return $output === 'null' ? null : $output; -} - -function instant_remote_process_with_timeout(Collection|array $command, Server $server, bool $throwError = true, bool $no_sudo = false): ?string -{ - $command = $command instanceof Collection ? $command->toArray() : $command; - if ($server->isNonRoot() && ! $no_sudo) { - $command = parseCommandsByLineForSudo(collect($command), $server); - } - $command_string = implode("\n", $command); - - // $start_time = microtime(true); - $sshCommand = SshMultiplexingHelper::generateSshCommand($server, $command_string); - $process = Process::timeout(30)->run($sshCommand); - // $end_time = microtime(true); - - // $execution_time = ($end_time - $start_time) * 1000; // Convert to milliseconds - // ray('SSH command execution time:', $execution_time.' ms')->orange(); - - $output = trim($process->output()); - $exitCode = $process->exitCode(); - - if ($exitCode !== 0) { - return $throwError ? excludeCertainErrors($process->errorOutput(), $exitCode) : null; - } - - return $output === 'null' ? null : $output; -} -function instant_remote_process(Collection|array $command, Server $server, bool $throwError = true, bool $no_sudo = false): ?string -{ - $command = $command instanceof Collection ? $command->toArray() : $command; - if ($server->isNonRoot() && ! $no_sudo) { - $command = parseCommandsByLineForSudo(collect($command), $server); - } - $command_string = implode("\n", $command); - - // $start_time = microtime(true); - $sshCommand = SshMultiplexingHelper::generateSshCommand($server, $command_string); - $process = Process::timeout(config('constants.ssh.command_timeout'))->run($sshCommand); - // $end_time = microtime(true); - - // $execution_time = ($end_time - $start_time) * 1000; // Convert to milliseconds - // ray('SSH command execution time:', $execution_time.' ms')->orange(); - - $output = trim($process->output()); - $exitCode = $process->exitCode(); - - if ($exitCode !== 0) { - return $throwError ? excludeCertainErrors($process->errorOutput(), $exitCode) : null; - } - - return $output === 'null' ? null : $output; -} - -function excludeCertainErrors(string $errorOutput, ?int $exitCode = null) -{ - $ignoredErrors = collect([ - 'Permission denied (publickey', - 'Could not resolve hostname', - ]); - $ignored = $ignoredErrors->contains(fn ($error) => Str::contains($errorOutput, $error)); - if ($ignored) { - // TODO: Create new exception and disable in sentry - throw new \RuntimeException($errorOutput, $exitCode); - } - throw new \RuntimeException($errorOutput, $exitCode); -} - -function decode_remote_command_output(?ApplicationDeploymentQueue $application_deployment_queue = null): Collection -{ - if (is_null($application_deployment_queue)) { - return collect([]); - } - $application = Application::find(data_get($application_deployment_queue, 'application_id')); - $is_debug_enabled = data_get($application, 'settings.is_debug_enabled'); - try { - $decoded = json_decode( - data_get($application_deployment_queue, 'logs'), - associative: true, - flags: JSON_THROW_ON_ERROR - ); - } catch (\JsonException) { - return collect([]); - } - $seenCommands = collect(); - $formatted = collect($decoded); - if (! $is_debug_enabled) { - $formatted = $formatted->filter(fn ($i) => $i['hidden'] === false ?? false); - } - - return $formatted - ->sortBy(fn ($i) => data_get($i, 'order')) - ->map(function ($i) { - data_set($i, 'timestamp', Carbon::parse(data_get($i, 'timestamp'))->format('Y-M-d H:i:s.u')); - - return $i; - }) - ->reduce(function ($deploymentLogLines, $logItem) use ($seenCommands) { - $command = data_get($logItem, 'command'); - $isStderr = data_get($logItem, 'type') === 'stderr'; - $isNewCommand = ! is_null($command) && ! $seenCommands->first(function ($seenCommand) use ($logItem) { - return data_get($seenCommand, 'command') === data_get($logItem, 'command') && data_get($seenCommand, 'batch') === data_get($logItem, 'batch'); - }); - - if ($isNewCommand) { - $deploymentLogLines->push([ - 'line' => $command, - 'timestamp' => data_get($logItem, 'timestamp'), - 'stderr' => $isStderr, - 'hidden' => data_get($logItem, 'hidden'), - 'command' => true, - ]); - - $seenCommands->push([ - 'command' => $command, - 'batch' => data_get($logItem, 'batch'), - ]); - } - - $lines = explode(PHP_EOL, data_get($logItem, 'output')); - - foreach ($lines as $line) { - $deploymentLogLines->push([ - 'line' => $line, - 'timestamp' => data_get($logItem, 'timestamp'), - 'stderr' => $isStderr, - 'hidden' => data_get($logItem, 'hidden'), - ]); - } - - return $deploymentLogLines; - }, collect()); -} - -function remove_iip($text) -{ - $text = preg_replace('/x-access-token:.*?(?=@)/', 'x-access-token:'.REDACTED, $text); - - return preg_replace('/\x1b\[[0-9;]*m/', '', $text); -} - -function refresh_server_connection(?PrivateKey $private_key = null) -{ - if (is_null($private_key)) { - return; - } - foreach ($private_key->servers as $server) { - SshMultiplexingHelper::removeMuxFile($server); - } -} - -function checkRequiredCommands(Server $server) -{ - $commands = collect(['jq', 'jc']); - foreach ($commands as $command) { - $commandFound = instant_remote_process(["docker run --rm --privileged --net=host --pid=host --ipc=host --volume /:/host busybox chroot /host bash -c 'command -v {$command}'"], $server, false); - if ($commandFound) { - continue; - } - try { - instant_remote_process(["docker run --rm --privileged --net=host --pid=host --ipc=host --volume /:/host busybox chroot /host bash -c 'apt update && apt install -y {$command}'"], $server); - } catch (\Throwable) { - break; - } - $commandFound = instant_remote_process(["docker run --rm --privileged --net=host --pid=host --ipc=host --volume /:/host busybox chroot /host bash -c 'command -v {$command}'"], $server, false); - if (! $commandFound) { - break; - } - } -} diff --git a/bootstrap/helpers/services.php b/bootstrap/helpers/services.php deleted file mode 100644 index cd99713a27..0000000000 --- a/bootstrap/helpers/services.php +++ /dev/null @@ -1,280 +0,0 @@ -before('}')->replaceFirst('$', '')->replaceFirst('{', ''); -} - -function getFilesystemVolumesFromServer(ServiceApplication|ServiceDatabase|Application $oneService, bool $isInit = false) -{ - try { - if ($oneService->getMorphClass() === \App\Models\Application::class) { - $workdir = $oneService->workdir(); - $server = $oneService->destination->server; - } else { - $workdir = $oneService->service->workdir(); - $server = $oneService->service->server; - } - $fileVolumes = $oneService->fileStorages()->get(); - $commands = collect([ - "mkdir -p $workdir > /dev/null 2>&1 || true", - "cd $workdir", - ]); - instant_remote_process($commands, $server); - foreach ($fileVolumes as $fileVolume) { - $path = str(data_get($fileVolume, 'fs_path')); - $content = data_get($fileVolume, 'content'); - if ($path->startsWith('.')) { - $path = $path->after('.'); - $fileLocation = $workdir.$path; - } else { - $fileLocation = $path; - } - // Exists and is a file - $isFile = instant_remote_process(["test -f $fileLocation && echo OK || echo NOK"], $server); - // Exists and is a directory - $isDir = instant_remote_process(["test -d $fileLocation && echo OK || echo NOK"], $server); - - if ($isFile === 'OK') { - // If its a file & exists - $filesystemContent = instant_remote_process(["cat $fileLocation"], $server); - if ($fileVolume->is_based_on_git) { - $fileVolume->content = $filesystemContent; - } - $fileVolume->is_directory = false; - $fileVolume->save(); - } elseif ($isDir === 'OK') { - // If its a directory & exists - $fileVolume->content = null; - $fileVolume->is_directory = true; - $fileVolume->save(); - } elseif ($isFile === 'NOK' && $isDir === 'NOK' && ! $fileVolume->is_directory && $isInit && $content) { - // Does not exists (no dir or file), not flagged as directory, is init, has content - $fileVolume->content = $content; - $fileVolume->is_directory = false; - $fileVolume->save(); - $content = base64_encode($content); - $dir = str($fileLocation)->dirname(); - instant_remote_process([ - "mkdir -p $dir", - "echo '$content' | base64 -d | tee $fileLocation", - ], $server); - } elseif ($isFile === 'NOK' && $isDir === 'NOK' && $fileVolume->is_directory && $isInit) { - // Does not exists (no dir or file), flagged as directory, is init - $fileVolume->content = null; - $fileVolume->is_directory = true; - $fileVolume->save(); - instant_remote_process(["mkdir -p $fileLocation"], $server); - } elseif ($isFile === 'NOK' && $isDir === 'NOK' && ! $fileVolume->is_directory && $isInit && is_null($content)) { - // Does not exists (no dir or file), not flagged as directory, is init, has no content => create directory - $fileVolume->content = null; - $fileVolume->is_directory = true; - $fileVolume->save(); - instant_remote_process(["mkdir -p $fileLocation"], $server); - } - } - } catch (\Throwable $e) { - return handleError($e); - } -} -function updateCompose(ServiceApplication|ServiceDatabase $resource) -{ - try { - $name = data_get($resource, 'name'); - $dockerComposeRaw = data_get($resource, 'service.docker_compose_raw'); - if (! $dockerComposeRaw) { - throw new \Exception('No compose file found or not a valid YAML file.'); - } - $dockerCompose = Yaml::parse($dockerComposeRaw); - - // Switch Image - $updatedImage = data_get_str($resource, 'image'); - $currentImage = data_get_str($dockerCompose, "services.{$name}.image"); - if ($currentImage !== $updatedImage) { - data_set($dockerCompose, "services.{$name}.image", $updatedImage->value()); - $dockerComposeRaw = Yaml::dump($dockerCompose, 10, 2); - $resource->service->docker_compose_raw = $dockerComposeRaw; - $resource->service->save(); - $resource->image = $updatedImage; - $resource->save(); - } - if ($resource->fqdn) { - $resourceFqdns = str($resource->fqdn)->explode(','); - if ($resourceFqdns->count() === 1) { - $resourceFqdns = $resourceFqdns->first(); - $variableName = 'SERVICE_FQDN_'.str($resource->name)->upper()->replace('-', ''); - $generatedEnv = EnvironmentVariable::where('resourceable_type', Service::class) - ->where('resourceable_id', $resource->service_id) - ->where('key', $variableName) - ->first(); - $fqdn = Url::fromString($resourceFqdns); - $port = $fqdn->getPort(); - $path = $fqdn->getPath(); - $fqdn = $fqdn->getScheme().'://'.$fqdn->getHost(); - if ($generatedEnv) { - if ($path === '/') { - $generatedEnv->value = $fqdn; - } else { - $generatedEnv->value = $fqdn.$path; - } - $generatedEnv->save(); - } - if ($port) { - $variableName = $variableName."_$port"; - $generatedEnv = EnvironmentVariable::where('resourceable_type', Service::class) - ->where('resourceable_id', $resource->service_id) - ->where('key', $variableName) - ->first(); - if ($generatedEnv) { - if ($path === '/') { - $generatedEnv->value = $fqdn; - } else { - $generatedEnv->value = $fqdn.$path; - } - $generatedEnv->save(); - } - } - $variableName = 'SERVICE_URL_'.str($resource->name)->upper()->replace('-', ''); - $generatedEnv = EnvironmentVariable::where('resourceable_type', Service::class) - ->where('resourceable_id', $resource->service_id) - ->where('key', $variableName) - ->first(); - $url = Url::fromString($fqdn); - $port = $url->getPort(); - $path = $url->getPath(); - $url = $url->getHost(); - if ($generatedEnv) { - $url = str($fqdn)->after('://'); - if ($path === '/') { - $generatedEnv->value = $url; - } else { - $generatedEnv->value = $url.$path; - } - $generatedEnv->save(); - } - if ($port) { - $variableName = $variableName."_$port"; - $generatedEnv = EnvironmentVariable::where('resourceable_type', Service::class) - ->where('resourceable_id', $resource->service_id) - ->where('key', $variableName) - ->first(); - if ($generatedEnv) { - if ($path === '/') { - $generatedEnv->value = $url; - } else { - $generatedEnv->value = $url.$path; - } - $generatedEnv->save(); - } - } - } elseif ($resourceFqdns->count() > 1) { - foreach ($resourceFqdns as $fqdn) { - $host = Url::fromString($fqdn); - $port = $host->getPort(); - $url = $host->getHost(); - $path = $host->getPath(); - $host = $host->getScheme().'://'.$host->getHost(); - if ($port) { - $port_envs = EnvironmentVariable::where('resourceable_type', Service::class) - ->where('resourceable_id', $resource->service_id) - ->where('key', 'like', "SERVICE_FQDN_%_$port") - ->get(); - foreach ($port_envs as $port_env) { - $service_fqdn = str($port_env->key)->beforeLast('_')->after('SERVICE_FQDN_'); - $env = EnvironmentVariable::where('resourceable_type', Service::class) - ->where('resourceable_id', $resource->service_id) - ->where('key', 'SERVICE_FQDN_'.$service_fqdn) - ->first(); - if ($env) { - if ($path === '/') { - $env->value = $host; - } else { - $env->value = $host.$path; - } - $env->save(); - } - if ($path === '/') { - $port_env->value = $host; - } else { - $port_env->value = $host.$path; - } - $port_env->save(); - } - $port_envs_url = EnvironmentVariable::where('resourceable_type', Service::class) - ->where('resourceable_id', $resource->service_id) - ->where('key', 'like', "SERVICE_URL_%_$port") - ->get(); - foreach ($port_envs_url as $port_env_url) { - $service_url = str($port_env_url->key)->beforeLast('_')->after('SERVICE_URL_'); - $env = EnvironmentVariable::where('resourceable_type', Service::class) - ->where('resourceable_id', $resource->service_id) - ->where('key', 'SERVICE_URL_'.$service_url) - ->first(); - if ($env) { - if ($path === '/') { - $env->value = $url; - } else { - $env->value = $url.$path; - } - $env->save(); - } - if ($path === '/') { - $port_env_url->value = $url; - } else { - $port_env_url->value = $url.$path; - } - $port_env_url->save(); - } - } else { - $variableName = 'SERVICE_FQDN_'.str($resource->name)->upper()->replace('-', ''); - $generatedEnv = EnvironmentVariable::where('resourceable_type', Service::class) - ->where('resourceable_id', $resource->service_id) - ->where('key', $variableName) - ->first(); - $fqdn = Url::fromString($fqdn); - $fqdn = $fqdn->getScheme().'://'.$fqdn->getHost().$fqdn->getPath(); - if ($generatedEnv) { - $generatedEnv->value = $fqdn; - $generatedEnv->save(); - } - $variableName = 'SERVICE_URL_'.str($resource->name)->upper()->replace('-', ''); - $generatedEnv = EnvironmentVariable::where('resourceable_type', Service::class) - ->where('resourceable_id', $resource->service_id) - ->where('key', $variableName) - ->first(); - $url = Url::fromString($fqdn); - $url = $url->getHost().$url->getPath(); - if ($generatedEnv) { - $url = str($fqdn)->after('://'); - $generatedEnv->value = $url; - $generatedEnv->save(); - } - } - } - } - } - } catch (\Throwable $e) { - return handleError($e); - } -} -function serviceKeys() -{ - return get_service_templates()->keys(); -} diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php deleted file mode 100644 index db3085649a..0000000000 --- a/bootstrap/helpers/shared.php +++ /dev/null @@ -1,4139 +0,0 @@ -user()?->isInstanceAdmin() ?? false; -} - -function currentTeam() -{ - return Auth::user()?->currentTeam() ?? null; -} - -function showBoarding(): bool -{ - if (Auth::user()?->isMember()) { - return false; - } - - return currentTeam()->show_boarding ?? false; -} -function refreshSession(?Team $team = null): void -{ - if (! $team) { - if (Auth::user()->currentTeam()) { - $team = Team::find(Auth::user()->currentTeam()->id); - } else { - $team = User::find(Auth::id())->teams->first(); - } - } - Cache::forget('team:'.Auth::id()); - Cache::remember('team:'.Auth::id(), 3600, function () use ($team) { - return $team; - }); - session(['currentTeam' => $team]); -} -function handleError(?Throwable $error = null, ?Livewire\Component $livewire = null, ?string $customErrorMessage = null) -{ - if ($error instanceof TooManyRequestsException) { - if (isset($livewire)) { - return $livewire->dispatch('error', "Too many requests. Please try again in {$error->secondsUntilAvailable} seconds."); - } - - return "Too many requests. Please try again in {$error->secondsUntilAvailable} seconds."; - } - if ($error instanceof UniqueConstraintViolationException) { - if (isset($livewire)) { - return $livewire->dispatch('error', 'Duplicate entry found. Please use a different name.'); - } - - return 'Duplicate entry found. Please use a different name.'; - } - - if ($error instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) { - abort(404); - } - - if ($error instanceof Throwable) { - $message = $error->getMessage(); - } else { - $message = null; - } - if ($customErrorMessage) { - $message = $customErrorMessage.' '.$message; - } - - if (isset($livewire)) { - return $livewire->dispatch('error', $message); - } - throw new Exception($message); -} -function get_route_parameters(): array -{ - return Route::current()->parameters(); -} - -function get_latest_sentinel_version(): string -{ - try { - $response = Http::get('https://cdn.coollabs.io/coolify/versions.json'); - $versions = $response->json(); - - return data_get($versions, 'coolify.sentinel.version'); - } catch (\Throwable) { - return '0.0.0'; - } -} -function get_latest_version_of_coolify(): string -{ - try { - $versions = File::get(base_path('versions.json')); - $versions = json_decode($versions, true); - - return data_get($versions, 'coolify.v4.version'); - } catch (\Throwable $e) { - ray($e->getMessage()); - - return '0.0.0'; - } -} - -function generate_random_name(?string $cuid = null): string -{ - $generator = new \Nubs\RandomNameGenerator\All( - [ - new \Nubs\RandomNameGenerator\Alliteration, - ] - ); - if (is_null($cuid)) { - $cuid = new Cuid2; - } - - return Str::kebab("{$generator->getName()}-$cuid"); -} -function generateSSHKey(string $type = 'rsa') -{ - if ($type === 'rsa') { - $key = RSA::createKey(); - - return [ - 'private' => $key->toString('PKCS1'), - 'public' => $key->getPublicKey()->toString('OpenSSH', ['comment' => 'coolify-generated-ssh-key']), - ]; - } elseif ($type === 'ed25519') { - $key = EC::createKey('Ed25519'); - - return [ - 'private' => $key->toString('OpenSSH'), - 'public' => $key->getPublicKey()->toString('OpenSSH', ['comment' => 'coolify-generated-ssh-key']), - ]; - } - throw new Exception('Invalid key type'); -} -function formatPrivateKey(string $privateKey) -{ - $privateKey = trim($privateKey); - if (! str_ends_with($privateKey, "\n")) { - $privateKey .= "\n"; - } - - return $privateKey; -} -function generate_application_name(string $git_repository, string $git_branch, ?string $cuid = null): string -{ - if (is_null($cuid)) { - $cuid = new Cuid2; - } - - return Str::kebab("$git_repository:$git_branch-$cuid"); -} - -function base_ip(): string -{ - if (isDev()) { - return 'localhost'; - } - $settings = instanceSettings(); - if ($settings->public_ipv4) { - return "$settings->public_ipv4"; - } - if ($settings->public_ipv6) { - return "$settings->public_ipv6"; - } - - return 'localhost'; -} -function getFqdnWithoutPort(string $fqdn) -{ - try { - $url = Url::fromString($fqdn); - $host = $url->getHost(); - $scheme = $url->getScheme(); - $path = $url->getPath(); - - return "$scheme://$host$path"; - } catch (\Throwable) { - return $fqdn; - } -} -/** - * If fqdn is set, return it, otherwise return public ip. - */ -function base_url(bool $withPort = true): string -{ - $settings = instanceSettings(); - if ($settings->fqdn) { - return $settings->fqdn; - } - $port = config('app.port'); - if ($settings->public_ipv4) { - if ($withPort) { - if (isDev()) { - return "http://localhost:$port"; - } - - return "http://$settings->public_ipv4:$port"; - } - if (isDev()) { - return 'http://localhost'; - } - - return "http://$settings->public_ipv4"; - } - if ($settings->public_ipv6) { - if ($withPort) { - return "http://$settings->public_ipv6:$port"; - } - - return "http://$settings->public_ipv6"; - } - - return url('/'); -} - -function isSubscribed() -{ - return isSubscriptionActive() || auth()->user()->isInstanceAdmin(); -} - -function isProduction(): bool -{ - return ! isDev(); -} -function isDev(): bool -{ - return config('app.env') === 'local'; -} - -function isCloud(): bool -{ - return ! config('constants.coolify.self_hosted'); -} - -function translate_cron_expression($expression_to_validate): string -{ - if (isset(VALID_CRON_STRINGS[$expression_to_validate])) { - return VALID_CRON_STRINGS[$expression_to_validate]; - } - - return $expression_to_validate; -} -function validate_cron_expression($expression_to_validate): bool -{ - if (empty($expression_to_validate)) { - return false; - } - $isValid = false; - $expression = new CronExpression($expression_to_validate); - $isValid = $expression->isValid(); - - if (isset(VALID_CRON_STRINGS[$expression_to_validate])) { - $isValid = true; - } - - return $isValid; -} - -function validate_timezone(string $timezone): bool -{ - return in_array($timezone, timezone_identifiers_list()); -} - -function parseEnvFormatToArray($env_file_contents) -{ - $env_array = []; - $lines = explode("\n", $env_file_contents); - foreach ($lines as $line) { - if ($line === '' || substr($line, 0, 1) === '#') { - continue; - } - $equals_pos = strpos($line, '='); - if ($equals_pos !== false) { - $key = substr($line, 0, $equals_pos); - $value = substr($line, $equals_pos + 1); - if (substr($value, 0, 1) === '"' && substr($value, -1) === '"') { - $value = substr($value, 1, -1); - } elseif (substr($value, 0, 1) === "'" && substr($value, -1) === "'") { - $value = substr($value, 1, -1); - } - $env_array[$key] = $value; - } - } - - return $env_array; -} - -function data_get_str($data, $key, $default = null): Stringable -{ - $str = data_get($data, $key, $default) ?? $default; - - return str($str); -} - -function generateFqdn(Server $server, string $random, bool $forceHttps = false): string -{ - $wildcard = data_get($server, 'settings.wildcard_domain'); - if (is_null($wildcard) || $wildcard === '') { - $wildcard = sslip($server); - } - $url = Url::fromString($wildcard); - $host = $url->getHost(); - $path = $url->getPath() === '/' ? '' : $url->getPath(); - $scheme = $url->getScheme(); - if ($forceHttps) { - $scheme = 'https'; - } - - return "$scheme://{$random}.$host$path"; -} -function sslip(Server $server) -{ - if (isDev() && $server->id === 0) { - return 'http://127.0.0.1.sslip.io'; - } - if ($server->ip === 'host.docker.internal') { - $baseIp = base_ip(); - - return "http://$baseIp.sslip.io"; - } - // ipv6 - if (str($server->ip)->contains(':')) { - $ipv6 = str($server->ip)->replace(':', '-'); - - return "http://{$ipv6}.sslip.io"; - } - - return "http://{$server->ip}.sslip.io"; -} - -function get_service_templates(bool $force = false): Collection -{ - - if ($force) { - try { - $response = Http::retry(3, 1000)->get(config('constants.services.official')); - if ($response->failed()) { - return collect([]); - } - $services = $response->json(); - - return collect($services); - } catch (\Throwable) { - $services = File::get(base_path('templates/service-templates.json')); - - return collect(json_decode($services))->sortKeys(); - } - } else { - $services = File::get(base_path('templates/service-templates.json')); - - return collect(json_decode($services))->sortKeys(); - } -} - -function getResourceByUuid(string $uuid, ?int $teamId = null) -{ - if (is_null($teamId)) { - return null; - } - $resource = queryResourcesByUuid($uuid); - if (! is_null($resource) && $resource->environment->project->team_id === $teamId) { - return $resource; - } - - return null; -} -function queryDatabaseByUuidWithinTeam(string $uuid, string $teamId) -{ - $postgresql = StandalonePostgresql::whereUuid($uuid)->first(); - if ($postgresql && $postgresql->team()->id == $teamId) { - return $postgresql->unsetRelation('environment')->unsetRelation('destination'); - } - $redis = StandaloneRedis::whereUuid($uuid)->first(); - if ($redis && $redis->team()->id == $teamId) { - return $redis->unsetRelation('environment'); - } - $mongodb = StandaloneMongodb::whereUuid($uuid)->first(); - if ($mongodb && $mongodb->team()->id == $teamId) { - return $mongodb->unsetRelation('environment'); - } - $mysql = StandaloneMysql::whereUuid($uuid)->first(); - if ($mysql && $mysql->team()->id == $teamId) { - return $mysql->unsetRelation('environment'); - } - $mariadb = StandaloneMariadb::whereUuid($uuid)->first(); - if ($mariadb && $mariadb->team()->id == $teamId) { - return $mariadb->unsetRelation('environment'); - } - $keydb = StandaloneKeydb::whereUuid($uuid)->first(); - if ($keydb && $keydb->team()->id == $teamId) { - return $keydb->unsetRelation('environment'); - } - $dragonfly = StandaloneDragonfly::whereUuid($uuid)->first(); - if ($dragonfly && $dragonfly->team()->id == $teamId) { - return $dragonfly->unsetRelation('environment'); - } - $clickhouse = StandaloneClickhouse::whereUuid($uuid)->first(); - if ($clickhouse && $clickhouse->team()->id == $teamId) { - return $clickhouse->unsetRelation('environment'); - } - - return null; -} -function queryResourcesByUuid(string $uuid) -{ - $resource = null; - $application = Application::whereUuid($uuid)->first(); - if ($application) { - return $application; - } - $service = Service::whereUuid($uuid)->first(); - if ($service) { - return $service; - } - $postgresql = StandalonePostgresql::whereUuid($uuid)->first(); - if ($postgresql) { - return $postgresql; - } - $redis = StandaloneRedis::whereUuid($uuid)->first(); - if ($redis) { - return $redis; - } - $mongodb = StandaloneMongodb::whereUuid($uuid)->first(); - if ($mongodb) { - return $mongodb; - } - $mysql = StandaloneMysql::whereUuid($uuid)->first(); - if ($mysql) { - return $mysql; - } - $mariadb = StandaloneMariadb::whereUuid($uuid)->first(); - if ($mariadb) { - return $mariadb; - } - $keydb = StandaloneKeydb::whereUuid($uuid)->first(); - if ($keydb) { - return $keydb; - } - $dragonfly = StandaloneDragonfly::whereUuid($uuid)->first(); - if ($dragonfly) { - return $dragonfly; - } - $clickhouse = StandaloneClickhouse::whereUuid($uuid)->first(); - if ($clickhouse) { - return $clickhouse; - } - - return $resource; -} -function generateTagDeployWebhook($tag_name) -{ - $baseUrl = base_url(); - $api = Url::fromString($baseUrl).'/api/v1'; - $endpoint = "/deploy?tag=$tag_name"; - - return $api.$endpoint; -} -function generateDeployWebhook($resource) -{ - $baseUrl = base_url(); - $api = Url::fromString($baseUrl).'/api/v1'; - $endpoint = '/deploy'; - $uuid = data_get($resource, 'uuid'); - - return $api.$endpoint."?uuid=$uuid&force=false"; -} -function generateGitManualWebhook($resource, $type) -{ - if ($resource->source_id !== 0 && ! is_null($resource->source_id)) { - return null; - } - if ($resource->getMorphClass() === \App\Models\Application::class) { - $baseUrl = base_url(); - - return Url::fromString($baseUrl)."/webhooks/source/$type/events/manual"; - } - - return null; -} -function removeAnsiColors($text) -{ - return preg_replace('/\e[[][A-Za-z0-9];?[0-9]*m?/', '', $text); -} - -function getTopLevelNetworks(Service|Application $resource) -{ - if ($resource->getMorphClass() === \App\Models\Service::class) { - if ($resource->docker_compose_raw) { - try { - $yaml = Yaml::parse($resource->docker_compose_raw); - } catch (\Exception $e) { - throw new \Exception($e->getMessage()); - } - $services = data_get($yaml, 'services'); - $topLevelNetworks = collect(data_get($yaml, 'networks', [])); - $definedNetwork = collect([$resource->uuid]); - $services = collect($services)->map(function ($service, $_) use ($topLevelNetworks, $definedNetwork) { - $serviceNetworks = collect(data_get($service, 'networks', [])); - $hasHostNetworkMode = data_get($service, 'network_mode') === 'host' ? true : false; - - // Only add 'networks' key if 'network_mode' is not 'host' - if (! $hasHostNetworkMode) { - // Collect/create/update networks - if ($serviceNetworks->count() > 0) { - foreach ($serviceNetworks as $networkName => $networkDetails) { - if ($networkName === 'default') { - continue; - } - // ignore alias - if ($networkDetails['aliases'] ?? false) { - continue; - } - $networkExists = $topLevelNetworks->contains(function ($value, $key) use ($networkName) { - return $value == $networkName || $key == $networkName; - }); - if (! $networkExists) { - if (is_string($networkDetails) || is_int($networkDetails)) { - $topLevelNetworks->put($networkDetails, null); - } - } - } - } - - $definedNetworkExists = $topLevelNetworks->contains(function ($value, $_) use ($definedNetwork) { - return $value == $definedNetwork; - }); - if (! $definedNetworkExists) { - foreach ($definedNetwork as $network) { - $topLevelNetworks->put($network, [ - 'name' => $network, - 'external' => true, - ]); - } - } - } - - return $service; - }); - - return $topLevelNetworks->keys(); - } - } elseif ($resource->getMorphClass() === \App\Models\Application::class) { - try { - $yaml = Yaml::parse($resource->docker_compose_raw); - } catch (\Exception $e) { - throw new \Exception($e->getMessage()); - } - $server = $resource->destination->server; - $topLevelNetworks = collect(data_get($yaml, 'networks', [])); - $services = data_get($yaml, 'services'); - $definedNetwork = collect([$resource->uuid]); - $services = collect($services)->map(function ($service, $_) use ($topLevelNetworks, $definedNetwork) { - $serviceNetworks = collect(data_get($service, 'networks', [])); - - // Collect/create/update networks - if ($serviceNetworks->count() > 0) { - foreach ($serviceNetworks as $networkName => $networkDetails) { - if ($networkName === 'default') { - continue; - } - // ignore alias - if ($networkDetails['aliases'] ?? false) { - continue; - } - $networkExists = $topLevelNetworks->contains(function ($value, $key) use ($networkName) { - return $value == $networkName || $key == $networkName; - }); - if (! $networkExists) { - if (is_string($networkDetails) || is_int($networkDetails)) { - $topLevelNetworks->put($networkDetails, null); - } - } - } - } - $definedNetworkExists = $topLevelNetworks->contains(function ($value, $_) use ($definedNetwork) { - return $value == $definedNetwork; - }); - if (! $definedNetworkExists) { - foreach ($definedNetwork as $network) { - $topLevelNetworks->put($network, [ - 'name' => $network, - 'external' => true, - ]); - } - } - - return $service; - }); - - return $topLevelNetworks->keys(); - } -} -function sourceIsLocal(Stringable $source) -{ - if ($source->startsWith('./') || $source->startsWith('/') || $source->startsWith('~') || $source->startsWith('..') || $source->startsWith('~/') || $source->startsWith('../')) { - return true; - } - - return false; -} - -function replaceLocalSource(Stringable $source, Stringable $replacedWith) -{ - if ($source->startsWith('.')) { - $source = $source->replaceFirst('.', $replacedWith->value()); - } - if ($source->startsWith('~')) { - $source = $source->replaceFirst('~', $replacedWith->value()); - } - if ($source->startsWith('..')) { - $source = $source->replaceFirst('..', $replacedWith->value()); - } - if ($source->endsWith('/') && $source->value() !== '/') { - $source = $source->replaceLast('/', ''); - } - - return $source; -} - -function convertToArray($collection) -{ - if ($collection instanceof Collection) { - return $collection->map(function ($item) { - return convertToArray($item); - })->toArray(); - } elseif ($collection instanceof Stringable) { - return (string) $collection; - } elseif (is_array($collection)) { - return array_map(function ($item) { - return convertToArray($item); - }, $collection); - } - - return $collection; -} - -function parseCommandFromMagicEnvVariable(Str|string $key): Stringable -{ - $value = str($key); - $count = substr_count($value->value(), '_'); - $command = null; - if ($count === 2) { - if ($value->startsWith('SERVICE_FQDN') || $value->startsWith('SERVICE_URL')) { - // SERVICE_FQDN_UMAMI - $command = $value->after('SERVICE_')->beforeLast('_'); - } else { - // SERVICE_BASE64_UMAMI - $command = $value->after('SERVICE_')->beforeLast('_'); - } - } - if ($count === 3) { - if ($value->startsWith('SERVICE_FQDN') || $value->startsWith('SERVICE_URL')) { - // SERVICE_FQDN_UMAMI_1000 - $command = $value->after('SERVICE_')->before('_'); - } else { - // SERVICE_BASE64_64_UMAMI - $command = $value->after('SERVICE_')->beforeLast('_'); - } - } - - return str($command); -} -function parseEnvVariable(Str|string $value) -{ - $value = str($value); - $count = substr_count($value->value(), '_'); - $command = null; - $forService = null; - $generatedValue = null; - $port = null; - if ($value->startsWith('SERVICE')) { - if ($count === 2) { - if ($value->startsWith('SERVICE_FQDN') || $value->startsWith('SERVICE_URL')) { - // SERVICE_FQDN_UMAMI - $command = $value->after('SERVICE_')->beforeLast('_'); - $forService = $value->afterLast('_'); - } else { - // SERVICE_BASE64_UMAMI - $command = $value->after('SERVICE_')->beforeLast('_'); - } - } - if ($count === 3) { - if ($value->startsWith('SERVICE_FQDN') || $value->startsWith('SERVICE_URL')) { - // SERVICE_FQDN_UMAMI_1000 - $command = $value->after('SERVICE_')->before('_'); - $forService = $value->after('SERVICE_')->after('_')->before('_'); - $port = $value->afterLast('_'); - if (filter_var($port, FILTER_VALIDATE_INT) === false) { - $port = null; - } - } else { - // SERVICE_BASE64_64_UMAMI - $command = $value->after('SERVICE_')->beforeLast('_'); - } - } - } - - return [ - 'command' => $command, - 'forService' => $forService, - 'generatedValue' => $generatedValue, - 'port' => $port, - ]; -} -function generateEnvValue(string $command, Service|Application|null $service = null) -{ - switch ($command) { - case 'PASSWORD': - $generatedValue = Str::password(symbols: false); - break; - case 'PASSWORD_64': - $generatedValue = Str::password(length: 64, symbols: false); - break; - case 'PASSWORDWITHSYMBOLS': - $generatedValue = Str::password(symbols: true); - break; - case 'PASSWORDWITHSYMBOLS_64': - $generatedValue = Str::password(length: 64, symbols: true); - break; - // This is not base64, it's just a random string - case 'BASE64_64': - $generatedValue = Str::random(64); - break; - case 'BASE64_128': - $generatedValue = Str::random(128); - break; - case 'BASE64': - case 'BASE64_32': - $generatedValue = Str::random(32); - break; - // This is base64, - case 'REALBASE64_64': - $generatedValue = base64_encode(Str::random(64)); - break; - case 'REALBASE64_128': - $generatedValue = base64_encode(Str::random(128)); - break; - case 'REALBASE64': - case 'REALBASE64_32': - $generatedValue = base64_encode(Str::random(32)); - break; - case 'HEX_32': - $generatedValue = bin2hex(Str::random(32)); - break; - case 'HEX_64': - $generatedValue = bin2hex(Str::random(64)); - break; - case 'HEX_128': - $generatedValue = bin2hex(Str::random(128)); - break; - case 'USER': - $generatedValue = Str::random(16); - break; - case 'SUPABASEANON': - $signingKey = $service->environment_variables()->where('key', 'SERVICE_PASSWORD_JWT')->first(); - if (is_null($signingKey)) { - return; - } else { - $signingKey = $signingKey->value; - } - $key = InMemory::plainText($signingKey); - $algorithm = new Sha256; - $tokenBuilder = (new Builder(new JoseEncoder, ChainedFormatter::default())); - $now = CarbonImmutable::now(); - $now = $now->setTime($now->format('H'), $now->format('i')); - $token = $tokenBuilder - ->issuedBy('supabase') - ->issuedAt($now) - ->expiresAt($now->modify('+100 year')) - ->withClaim('role', 'anon') - ->getToken($algorithm, $key); - $generatedValue = $token->toString(); - break; - case 'SUPABASESERVICE': - $signingKey = $service->environment_variables()->where('key', 'SERVICE_PASSWORD_JWT')->first(); - if (is_null($signingKey)) { - return; - } else { - $signingKey = $signingKey->value; - } - $key = InMemory::plainText($signingKey); - $algorithm = new Sha256; - $tokenBuilder = (new Builder(new JoseEncoder, ChainedFormatter::default())); - $now = CarbonImmutable::now(); - $now = $now->setTime($now->format('H'), $now->format('i')); - $token = $tokenBuilder - ->issuedBy('supabase') - ->issuedAt($now) - ->expiresAt($now->modify('+100 year')) - ->withClaim('role', 'service_role') - ->getToken($algorithm, $key); - $generatedValue = $token->toString(); - break; - default: - // $generatedValue = Str::random(16); - $generatedValue = null; - break; - } - - return $generatedValue; -} - -function getRealtime() -{ - $envDefined = config('constants.pusher.port'); - if (empty($envDefined)) { - $url = Url::fromString(Request::getSchemeAndHttpHost()); - $port = $url->getPort(); - if ($port) { - return '6001'; - } else { - return null; - } - } else { - return $envDefined; - } -} - -function validate_dns_entry(string $fqdn, Server $server) -{ - // https://www.cloudflare.com/ips-v4/# - $cloudflare_ips = collect(['173.245.48.0/20', '103.21.244.0/22', '103.22.200.0/22', '103.31.4.0/22', '141.101.64.0/18', '108.162.192.0/18', '190.93.240.0/20', '188.114.96.0/20', '197.234.240.0/22', '198.41.128.0/17', '162.158.0.0/15', '104.16.0.0/13', '172.64.0.0/13', '131.0.72.0/22']); - - $url = Url::fromString($fqdn); - $host = $url->getHost(); - if (str($host)->contains('sslip.io')) { - return true; - } - $settings = instanceSettings(); - $is_dns_validation_enabled = data_get($settings, 'is_dns_validation_enabled'); - if (! $is_dns_validation_enabled) { - return true; - } - $dns_servers = data_get($settings, 'custom_dns_servers'); - $dns_servers = str($dns_servers)->explode(','); - if ($server->id === 0) { - $ip = data_get($settings, 'public_ipv4', data_get($settings, 'public_ipv6', $server->ip)); - } else { - $ip = $server->ip; - } - $found_matching_ip = false; - $type = \PurplePixie\PhpDns\DNSTypes::NAME_A; - foreach ($dns_servers as $dns_server) { - try { - $query = new DNSQuery($dns_server); - $results = $query->query($host, $type); - if ($results === false || $query->hasError()) { - ray('Error: '.$query->getLasterror()); - } else { - foreach ($results as $result) { - if ($result->getType() == $type) { - if (ip_match($result->getData(), $cloudflare_ips->toArray(), $match)) { - $found_matching_ip = true; - break; - } - if ($result->getData() === $ip) { - $found_matching_ip = true; - break; - } - } - } - } - } catch (\Exception) { - } - } - - return $found_matching_ip; -} - -function ip_match($ip, $cidrs, &$match = null) -{ - foreach ((array) $cidrs as $cidr) { - [$subnet, $mask] = explode('/', $cidr); - if (((ip2long($ip) & ($mask = ~((1 << (32 - $mask)) - 1))) == (ip2long($subnet) & $mask))) { - $match = $cidr; - - return true; - } - } - - return false; -} -function checkIfDomainIsAlreadyUsed(Collection|array $domains, ?string $teamId = null, ?string $uuid = null) -{ - if (is_null($teamId)) { - return response()->json(['error' => 'Team ID is required.'], 400); - } - if (is_array($domains)) { - $domains = collect($domains); - } - - $domains = $domains->map(function ($domain) { - if (str($domain)->endsWith('/')) { - $domain = str($domain)->beforeLast('/'); - } - - return str($domain); - }); - $applications = Application::ownedByCurrentTeamAPI($teamId)->get(['fqdn', 'uuid']); - $serviceApplications = ServiceApplication::ownedByCurrentTeamAPI($teamId)->get(['fqdn', 'uuid']); - if ($uuid) { - $applications = $applications->filter(fn ($app) => $app->uuid !== $uuid); - $serviceApplications = $serviceApplications->filter(fn ($app) => $app->uuid !== $uuid); - } - $domainFound = false; - foreach ($applications as $app) { - if (is_null($app->fqdn)) { - continue; - } - $list_of_domains = collect(explode(',', $app->fqdn))->filter(fn ($fqdn) => $fqdn !== ''); - foreach ($list_of_domains as $domain) { - if (str($domain)->endsWith('/')) { - $domain = str($domain)->beforeLast('/'); - } - $naked_domain = str($domain)->value(); - if ($domains->contains($naked_domain)) { - $domainFound = true; - break; - } - } - } - if ($domainFound) { - return true; - } - foreach ($serviceApplications as $app) { - if (str($app->fqdn)->isEmpty()) { - continue; - } - $list_of_domains = collect(explode(',', $app->fqdn))->filter(fn ($fqdn) => $fqdn !== ''); - foreach ($list_of_domains as $domain) { - if (str($domain)->endsWith('/')) { - $domain = str($domain)->beforeLast('/'); - } - $naked_domain = str($domain)->value(); - if ($domains->contains($naked_domain)) { - $domainFound = true; - break; - } - } - } - if ($domainFound) { - return true; - } - $settings = instanceSettings(); - if (data_get($settings, 'fqdn')) { - $domain = data_get($settings, 'fqdn'); - if (str($domain)->endsWith('/')) { - $domain = str($domain)->beforeLast('/'); - } - $naked_domain = str($domain)->value(); - if ($domains->contains($naked_domain)) { - return true; - } - } -} -function check_domain_usage(ServiceApplication|Application|null $resource = null, ?string $domain = null) -{ - if ($resource) { - if ($resource->getMorphClass() === \App\Models\Application::class && $resource->build_pack === 'dockercompose') { - $domains = data_get(json_decode($resource->docker_compose_domains, true), '*.domain'); - $domains = collect($domains); - } else { - $domains = collect($resource->fqdns); - } - } elseif ($domain) { - $domains = collect($domain); - } else { - throw new \RuntimeException('No resource or FQDN provided.'); - } - $domains = $domains->map(function ($domain) { - if (str($domain)->endsWith('/')) { - $domain = str($domain)->beforeLast('/'); - } - - return str($domain); - }); - $apps = Application::all(); - foreach ($apps as $app) { - $list_of_domains = collect(explode(',', $app->fqdn))->filter(fn ($fqdn) => $fqdn !== ''); - foreach ($list_of_domains as $domain) { - if (str($domain)->endsWith('/')) { - $domain = str($domain)->beforeLast('/'); - } - $naked_domain = str($domain)->value(); - if ($domains->contains($naked_domain)) { - if (data_get($resource, 'uuid')) { - if ($resource->uuid !== $app->uuid) { - throw new \RuntimeException("Domain $naked_domain is already in use by another resource:

Link: {$app->name}"); - } - } elseif ($domain) { - throw new \RuntimeException("Domain $naked_domain is already in use by another resource:

Link: {$app->name}"); - } - } - } - } - $apps = ServiceApplication::all(); - foreach ($apps as $app) { - $list_of_domains = collect(explode(',', $app->fqdn))->filter(fn ($fqdn) => $fqdn !== ''); - foreach ($list_of_domains as $domain) { - if (str($domain)->endsWith('/')) { - $domain = str($domain)->beforeLast('/'); - } - $naked_domain = str($domain)->value(); - if ($domains->contains($naked_domain)) { - if (data_get($resource, 'uuid')) { - if ($resource->uuid !== $app->uuid) { - throw new \RuntimeException("Domain $naked_domain is already in use by another resource:

Link: {$app->service->name}"); - } - } elseif ($domain) { - throw new \RuntimeException("Domain $naked_domain is already in use by another resource:

Link: {$app->service->name}"); - } - } - } - } - if ($resource) { - $settings = instanceSettings(); - if (data_get($settings, 'fqdn')) { - $domain = data_get($settings, 'fqdn'); - if (str($domain)->endsWith('/')) { - $domain = str($domain)->beforeLast('/'); - } - $naked_domain = str($domain)->value(); - if ($domains->contains($naked_domain)) { - throw new \RuntimeException("Domain $naked_domain is already in use by this Coolify instance."); - } - } - } -} - -function parseCommandsByLineForSudo(Collection $commands, Server $server): array -{ - $commands = $commands->map(function ($line) { - if ( - ! str(trim($line))->startsWith([ - 'cd', - 'command', - 'echo', - 'true', - 'if', - 'fi', - ]) - ) { - return "sudo $line"; - } - - if (str(trim($line))->startsWith('if')) { - return str_replace('if', 'if sudo', $line); - } - - return $line; - }); - - $commands = $commands->map(function ($line) use ($server) { - if (Str::startsWith($line, 'sudo mkdir -p')) { - return "$line && sudo chown -R $server->user:$server->user ".Str::after($line, 'sudo mkdir -p').' && sudo chmod -R o-rwx '.Str::after($line, 'sudo mkdir -p'); - } - - return $line; - }); - - $commands = $commands->map(function ($line) { - $line = str($line); - if (str($line)->contains('$(')) { - $line = $line->replace('$(', '$(sudo '); - } - if (str($line)->contains('||')) { - $line = $line->replace('||', '|| sudo'); - } - if (str($line)->contains('&&')) { - $line = $line->replace('&&', '&& sudo'); - } - if (str($line)->contains(' | ')) { - $line = $line->replace(' | ', ' | sudo '); - } - - return $line->value(); - }); - - return $commands->toArray(); -} -function parseLineForSudo(string $command, Server $server): string -{ - if (! str($command)->startSwith('cd') && ! str($command)->startSwith('command')) { - $command = "sudo $command"; - } - if (Str::startsWith($command, 'sudo mkdir -p')) { - $command = "$command && sudo chown -R $server->user:$server->user ".Str::after($command, 'sudo mkdir -p').' && sudo chmod -R o-rwx '.Str::after($command, 'sudo mkdir -p'); - } - if (str($command)->contains('$(') || str($command)->contains('`')) { - $command = str($command)->replace('$(', '$(sudo ')->replace('`', '`sudo ')->value(); - } - if (str($command)->contains('||')) { - $command = str($command)->replace('||', '|| sudo ')->value(); - } - if (str($command)->contains('&&')) { - $command = str($command)->replace('&&', '&& sudo ')->value(); - } - - return $command; -} - -function get_public_ips() -{ - try { - [$first, $second] = Process::concurrently(function (Pool $pool) { - $pool->path(__DIR__)->command('curl -4s https://ifconfig.io'); - $pool->path(__DIR__)->command('curl -6s https://ifconfig.io'); - }); - $ipv4 = $first->output(); - if ($ipv4) { - $ipv4 = trim($ipv4); - $validate_ipv4 = filter_var($ipv4, FILTER_VALIDATE_IP); - if ($validate_ipv4 == false) { - echo "Invalid ipv4: $ipv4\n"; - - return; - } - InstanceSettings::get()->update(['public_ipv4' => $ipv4]); - } - } catch (\Exception $e) { - echo "Error: {$e->getMessage()}\n"; - } - try { - $ipv6 = $second->output(); - if ($ipv6) { - $ipv6 = trim($ipv6); - $validate_ipv6 = filter_var($ipv6, FILTER_VALIDATE_IP); - if ($validate_ipv6 == false) { - echo "Invalid ipv6: $ipv6\n"; - - return; - } - InstanceSettings::get()->update(['public_ipv6' => $ipv6]); - } - } catch (\Throwable $e) { - echo "Error: {$e->getMessage()}\n"; - } -} - -function isAnyDeploymentInprogress() -{ - $runningJobs = ApplicationDeploymentQueue::where('horizon_job_worker', gethostname())->where('status', ApplicationDeploymentStatus::IN_PROGRESS->value)->get(); - $horizonJobIds = []; - foreach ($runningJobs as $runningJob) { - $horizonJobStatus = getJobStatus($runningJob->horizon_job_id); - if ($horizonJobStatus === 'unknown') { - return true; - } - $horizonJobIds[] = $runningJob->horizon_job_id; - } - if (count($horizonJobIds) === 0) { - echo "No deployments in progress.\n"; - exit(0); - } - $horizonJobIds = collect($horizonJobIds)->unique()->toArray(); - echo 'There are '.count($horizonJobIds)." deployments in progress.\n"; - exit(1); -} - -function isBase64Encoded($strValue) -{ - return base64_encode(base64_decode($strValue, true)) === $strValue; -} -function customApiValidator(Collection|array $item, array $rules) -{ - if (is_array($item)) { - $item = collect($item); - } - - return Validator::make($item->toArray(), $rules, [ - 'required' => 'This field is required.', - ]); -} - -function parseServiceVolumes($serviceVolumes, $resource, $topLevelVolumes, $pull_request_id = 0) -{ - $serviceVolumes = $serviceVolumes->map(function ($volume) use ($resource, $topLevelVolumes, $pull_request_id) { - $type = null; - $source = null; - $target = null; - $content = null; - $isDirectory = false; - if (is_string($volume)) { - $source = str($volume)->before(':'); - $target = str($volume)->after(':')->beforeLast(':'); - $foundConfig = $resource->fileStorages()->whereMountPath($target)->first(); - if ($source->startsWith('./') || $source->startsWith('/') || $source->startsWith('~')) { - $type = str('bind'); - if ($foundConfig) { - $contentNotNull = data_get($foundConfig, 'content'); - if ($contentNotNull) { - $content = $contentNotNull; - } - $isDirectory = data_get($foundConfig, 'is_directory'); - } else { - // By default, we cannot determine if the bind is a directory or not, so we set it to directory - $isDirectory = true; - } - } else { - $type = str('volume'); - } - } elseif (is_array($volume)) { - $type = data_get_str($volume, 'type'); - $source = data_get_str($volume, 'source'); - $target = data_get_str($volume, 'target'); - $content = data_get($volume, 'content'); - $isDirectory = (bool) data_get($volume, 'isDirectory', null) || (bool) data_get($volume, 'is_directory', null); - $foundConfig = $resource->fileStorages()->whereMountPath($target)->first(); - if ($foundConfig) { - $contentNotNull = data_get($foundConfig, 'content'); - if ($contentNotNull) { - $content = $contentNotNull; - } - $isDirectory = data_get($foundConfig, 'is_directory'); - } else { - $isDirectory = (bool) data_get($volume, 'isDirectory', null) || (bool) data_get($volume, 'is_directory', null); - if ((is_null($isDirectory) || ! $isDirectory) && is_null($content)) { - // if isDirectory is not set (or false) & content is also not set, we assume it is a directory - $isDirectory = true; - } - } - } - if ($type?->value() === 'bind') { - if ($source->value() === '/var/run/docker.sock') { - return $volume; - } - if ($source->value() === '/tmp' || $source->value() === '/tmp/') { - return $volume; - } - if (get_class($resource) === \App\Models\Application::class) { - $dir = base_configuration_dir().'/applications/'.$resource->uuid; - } else { - $dir = base_configuration_dir().'/services/'.$resource->service->uuid; - } - - if ($source->startsWith('.')) { - $source = $source->replaceFirst('.', $dir); - } - if ($source->startsWith('~')) { - $source = $source->replaceFirst('~', $dir); - } - if ($pull_request_id !== 0) { - $source = $source."-pr-$pull_request_id"; - } - if (! $resource?->settings?->is_preserve_repository_enabled || $foundConfig?->is_based_on_git) { - LocalFileVolume::updateOrCreate( - [ - 'mount_path' => $target, - 'resource_id' => $resource->id, - 'resource_type' => get_class($resource), - ], - [ - 'fs_path' => $source, - 'mount_path' => $target, - 'content' => $content, - 'is_directory' => $isDirectory, - 'resource_id' => $resource->id, - 'resource_type' => get_class($resource), - ] - ); - } - } elseif ($type->value() === 'volume') { - if ($topLevelVolumes->has($source->value())) { - $v = $topLevelVolumes->get($source->value()); - if (data_get($v, 'driver_opts.type') === 'cifs') { - return $volume; - } - } - $slugWithoutUuid = Str::slug($source, '-'); - if (get_class($resource) === \App\Models\Application::class) { - $name = "{$resource->uuid}_{$slugWithoutUuid}"; - } else { - $name = "{$resource->service->uuid}_{$slugWithoutUuid}"; - } - if (is_string($volume)) { - $source = str($volume)->before(':'); - $target = str($volume)->after(':')->beforeLast(':'); - $source = $name; - $volume = "$source:$target"; - } elseif (is_array($volume)) { - data_set($volume, 'source', $name); - } - $topLevelVolumes->put($name, [ - 'name' => $name, - ]); - LocalPersistentVolume::updateOrCreate( - [ - 'mount_path' => $target, - 'resource_id' => $resource->id, - 'resource_type' => get_class($resource), - ], - [ - 'name' => $name, - 'mount_path' => $target, - 'resource_id' => $resource->id, - 'resource_type' => get_class($resource), - ] - ); - } - dispatch(new ServerFilesFromServerJob($resource)); - - return $volume; - }); - - return [ - 'serviceVolumes' => $serviceVolumes, - 'topLevelVolumes' => $topLevelVolumes, - ]; -} - -function parseDockerComposeFile(Service|Application $resource, bool $isNew = false, int $pull_request_id = 0, ?int $preview_id = null) -{ - if ($resource->getMorphClass() === \App\Models\Service::class) { - if ($resource->docker_compose_raw) { - try { - $yaml = Yaml::parse($resource->docker_compose_raw); - } catch (\Exception $e) { - throw new \Exception($e->getMessage()); - } - $allServices = get_service_templates(); - $topLevelVolumes = collect(data_get($yaml, 'volumes', [])); - $topLevelNetworks = collect(data_get($yaml, 'networks', [])); - $topLevelConfigs = collect(data_get($yaml, 'configs', [])); - $topLevelSecrets = collect(data_get($yaml, 'secrets', [])); - $services = data_get($yaml, 'services'); - - $generatedServiceFQDNS = collect([]); - if (is_null($resource->destination)) { - $destination = $resource->server->destinations()->first(); - if ($destination) { - $resource->destination()->associate($destination); - $resource->save(); - } - } - $definedNetwork = collect([$resource->uuid]); - if ($topLevelVolumes->count() > 0) { - $tempTopLevelVolumes = collect([]); - foreach ($topLevelVolumes as $volumeName => $volume) { - if (is_null($volume)) { - continue; - } - $tempTopLevelVolumes->put($volumeName, $volume); - } - $topLevelVolumes = collect($tempTopLevelVolumes); - } - $services = collect($services)->map(function ($service, $serviceName) use ($topLevelVolumes, $topLevelNetworks, $definedNetwork, $isNew, $generatedServiceFQDNS, $resource, $allServices) { - // Workarounds for beta users. - if ($serviceName === 'registry') { - $tempServiceName = 'docker-registry'; - } else { - $tempServiceName = $serviceName; - } - if (str(data_get($service, 'image'))->contains('glitchtip')) { - $tempServiceName = 'glitchtip'; - } - if ($serviceName === 'supabase-kong') { - $tempServiceName = 'supabase'; - } - $serviceDefinition = data_get($allServices, $tempServiceName); - $predefinedPort = data_get($serviceDefinition, 'port'); - if ($serviceName === 'plausible') { - $predefinedPort = '8000'; - } - // End of workarounds for beta users. - $serviceVolumes = collect(data_get($service, 'volumes', [])); - $servicePorts = collect(data_get($service, 'ports', [])); - $serviceNetworks = collect(data_get($service, 'networks', [])); - $serviceVariables = collect(data_get($service, 'environment', [])); - $serviceLabels = collect(data_get($service, 'labels', [])); - $hasHostNetworkMode = data_get($service, 'network_mode') === 'host' ? true : false; - if ($serviceLabels->count() > 0) { - $removedLabels = collect([]); - $serviceLabels = $serviceLabels->filter(function ($serviceLabel, $serviceLabelName) use ($removedLabels) { - if (! str($serviceLabel)->contains('=')) { - $removedLabels->put($serviceLabelName, $serviceLabel); - - return false; - } - - return $serviceLabel; - }); - foreach ($removedLabels as $removedLabelName => $removedLabel) { - $serviceLabels->push("$removedLabelName=$removedLabel"); - } - } - $containerName = "$serviceName-{$resource->uuid}"; - - // Decide if the service is a database - $isDatabase = isDatabaseImage(data_get_str($service, 'image')); - $image = data_get_str($service, 'image'); - data_set($service, 'is_database', $isDatabase); - - // Create new serviceApplication or serviceDatabase - if ($isDatabase) { - if ($isNew) { - $savedService = ServiceDatabase::create([ - 'name' => $serviceName, - 'image' => $image, - 'service_id' => $resource->id, - ]); - } else { - $savedService = ServiceDatabase::where([ - 'name' => $serviceName, - 'service_id' => $resource->id, - ])->first(); - } - } else { - if ($isNew) { - $savedService = ServiceApplication::create([ - 'name' => $serviceName, - 'image' => $image, - 'service_id' => $resource->id, - ]); - } else { - $savedService = ServiceApplication::where([ - 'name' => $serviceName, - 'service_id' => $resource->id, - ])->first(); - } - } - if (is_null($savedService)) { - if ($isDatabase) { - $savedService = ServiceDatabase::create([ - 'name' => $serviceName, - 'image' => $image, - 'service_id' => $resource->id, - ]); - } else { - $savedService = ServiceApplication::create([ - 'name' => $serviceName, - 'image' => $image, - 'service_id' => $resource->id, - ]); - } - } - - // Check if image changed - if ($savedService->image !== $image) { - $savedService->image = $image; - $savedService->save(); - } - // Collect/create/update networks - if ($serviceNetworks->count() > 0) { - foreach ($serviceNetworks as $networkName => $networkDetails) { - if ($networkName === 'default') { - continue; - } - // ignore alias - if ($networkDetails['aliases'] ?? false) { - continue; - } - $networkExists = $topLevelNetworks->contains(function ($value, $key) use ($networkName) { - return $value == $networkName || $key == $networkName; - }); - if (! $networkExists) { - if (is_string($networkDetails) || is_int($networkDetails)) { - $topLevelNetworks->put($networkDetails, null); - } - } - } - } - - // Collect/create/update ports - $collectedPorts = collect([]); - if ($servicePorts->count() > 0) { - foreach ($servicePorts as $sport) { - if (is_string($sport) || is_numeric($sport)) { - $collectedPorts->push($sport); - } - if (is_array($sport)) { - $target = data_get($sport, 'target'); - $published = data_get($sport, 'published'); - $protocol = data_get($sport, 'protocol'); - $collectedPorts->push("$target:$published/$protocol"); - } - } - } - $savedService->ports = $collectedPorts->implode(','); - $savedService->save(); - - if (! $hasHostNetworkMode) { - // Add Coolify specific networks - $definedNetworkExists = $topLevelNetworks->contains(function ($value, $_) use ($definedNetwork) { - return $value == $definedNetwork; - }); - if (! $definedNetworkExists) { - foreach ($definedNetwork as $network) { - $topLevelNetworks->put($network, [ - 'name' => $network, - 'external' => true, - ]); - } - } - $networks = collect(); - foreach ($serviceNetworks as $key => $serviceNetwork) { - if (gettype($serviceNetwork) === 'string') { - // networks: - // - appwrite - $networks->put($serviceNetwork, null); - } elseif (gettype($serviceNetwork) === 'array') { - // networks: - // default: - // ipv4_address: 192.168.203.254 - // $networks->put($serviceNetwork, null); - $networks->put($key, $serviceNetwork); - } - } - foreach ($definedNetwork as $key => $network) { - $networks->put($network, null); - } - data_set($service, 'networks', $networks->toArray()); - } - - // Collect/create/update volumes - if ($serviceVolumes->count() > 0) { - $serviceVolumes = $serviceVolumes->map(function ($volume) use ($savedService, $topLevelVolumes) { - $type = null; - $source = null; - $target = null; - $content = null; - $isDirectory = false; - if (is_string($volume)) { - $source = str($volume)->before(':'); - $target = str($volume)->after(':')->beforeLast(':'); - if ($source->startsWith('./') || $source->startsWith('/') || $source->startsWith('~')) { - $type = str('bind'); - // By default, we cannot determine if the bind is a directory or not, so we set it to directory - $isDirectory = true; - } else { - $type = str('volume'); - } - } elseif (is_array($volume)) { - $type = data_get_str($volume, 'type'); - $source = data_get_str($volume, 'source'); - $target = data_get_str($volume, 'target'); - $content = data_get($volume, 'content'); - $isDirectory = (bool) data_get($volume, 'isDirectory', null) || (bool) data_get($volume, 'is_directory', null); - $foundConfig = $savedService->fileStorages()->whereMountPath($target)->first(); - if ($foundConfig) { - $contentNotNull = data_get($foundConfig, 'content'); - if ($contentNotNull) { - $content = $contentNotNull; - } - $isDirectory = (bool) data_get($volume, 'isDirectory', null) || (bool) data_get($volume, 'is_directory', null); - } - if (is_null($isDirectory) && is_null($content)) { - // if isDirectory is not set & content is also not set, we assume it is a directory - $isDirectory = true; - } - } - if ($type?->value() === 'bind') { - if ($source->value() === '/var/run/docker.sock') { - return $volume; - } - if ($source->value() === '/tmp' || $source->value() === '/tmp/') { - return $volume; - } - LocalFileVolume::updateOrCreate( - [ - 'mount_path' => $target, - 'resource_id' => $savedService->id, - 'resource_type' => get_class($savedService), - ], - [ - 'fs_path' => $source, - 'mount_path' => $target, - 'content' => $content, - 'is_directory' => $isDirectory, - 'resource_id' => $savedService->id, - 'resource_type' => get_class($savedService), - ] - ); - } elseif ($type->value() === 'volume') { - if ($topLevelVolumes->has($source->value())) { - $v = $topLevelVolumes->get($source->value()); - if (data_get($v, 'driver_opts.type') === 'cifs') { - return $volume; - } - } - $slugWithoutUuid = Str::slug($source, '-'); - $name = "{$savedService->service->uuid}_{$slugWithoutUuid}"; - if (is_string($volume)) { - $source = str($volume)->before(':'); - $target = str($volume)->after(':')->beforeLast(':'); - $source = $name; - $volume = "$source:$target"; - } elseif (is_array($volume)) { - data_set($volume, 'source', $name); - } - $topLevelVolumes->put($name, [ - 'name' => $name, - ]); - LocalPersistentVolume::updateOrCreate( - [ - 'mount_path' => $target, - 'resource_id' => $savedService->id, - 'resource_type' => get_class($savedService), - ], - [ - 'name' => $name, - 'mount_path' => $target, - 'resource_id' => $savedService->id, - 'resource_type' => get_class($savedService), - ] - ); - } - dispatch(new ServerFilesFromServerJob($savedService)); - - return $volume; - }); - data_set($service, 'volumes', $serviceVolumes->toArray()); - } - - // convert - SESSION_SECRET: 123 to - SESSION_SECRET=123 - $convertedServiceVariables = collect([]); - foreach ($serviceVariables as $variableName => $variable) { - if (is_numeric($variableName)) { - if (is_array($variable)) { - $key = str(collect($variable)->keys()->first()); - $value = str(collect($variable)->values()->first()); - $variable = "$key=$value"; - $convertedServiceVariables->put($variableName, $variable); - } elseif (is_string($variable)) { - $convertedServiceVariables->put($variableName, $variable); - } - } elseif (is_string($variableName)) { - $convertedServiceVariables->put($variableName, $variable); - } - } - $serviceVariables = $convertedServiceVariables; - // Get variables from the service - foreach ($serviceVariables as $variableName => $variable) { - if (is_numeric($variableName)) { - if (is_array($variable)) { - // - SESSION_SECRET: 123 - // - SESSION_SECRET: - $key = str(collect($variable)->keys()->first()); - $value = str(collect($variable)->values()->first()); - } else { - $variable = str($variable); - if ($variable->contains('=')) { - // - SESSION_SECRET=123 - // - SESSION_SECRET= - $key = $variable->before('='); - $value = $variable->after('='); - } else { - // - SESSION_SECRET - $key = $variable; - $value = null; - } - } - } else { - // SESSION_SECRET: 123 - // SESSION_SECRET: - $key = str($variableName); - $value = str($variable); - } - if ($key->startsWith('SERVICE_FQDN')) { - if ($isNew || $savedService->fqdn === null) { - $name = $key->after('SERVICE_FQDN_')->beforeLast('_')->lower(); - $fqdn = generateFqdn($resource->server, "{$name->value()}-{$resource->uuid}"); - if (substr_count($key->value(), '_') === 3) { - // SERVICE_FQDN_UMAMI_1000 - $port = $key->afterLast('_'); - } else { - $last = $key->afterLast('_'); - if (is_numeric($last->value())) { - // SERVICE_FQDN_3001 - $port = $last; - } else { - // SERVICE_FQDN_UMAMI - $port = null; - } - } - if ($port) { - $fqdn = "$fqdn:$port"; - } - if (substr_count($key->value(), '_') >= 2) { - if ($value) { - $path = $value->value(); - } else { - $path = null; - } - if ($generatedServiceFQDNS->count() > 0) { - $alreadyGenerated = $generatedServiceFQDNS->has($key->value()); - if ($alreadyGenerated) { - $fqdn = $generatedServiceFQDNS->get($key->value()); - } else { - $generatedServiceFQDNS->put($key->value(), $fqdn); - } - } else { - $generatedServiceFQDNS->put($key->value(), $fqdn); - } - $fqdn = "$fqdn$path"; - } - - if (! $isDatabase) { - if ($savedService->fqdn) { - data_set($savedService, 'fqdn', $savedService->fqdn.','.$fqdn); - } else { - data_set($savedService, 'fqdn', $fqdn); - } - $savedService->save(); - } - EnvironmentVariable::create([ - 'key' => $key, - 'value' => $fqdn, - 'is_build_time' => false, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - 'is_preview' => false, - ]); - } - // Caddy needs exact port in some cases. - if ($predefinedPort && ! $key->endsWith("_{$predefinedPort}")) { - $fqdns_exploded = str($savedService->fqdn)->explode(','); - if ($fqdns_exploded->count() > 1) { - continue; - } - $env = EnvironmentVariable::where([ - 'key' => $key, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - ])->first(); - if ($env) { - $env_url = Url::fromString($savedService->fqdn); - $env_port = $env_url->getPort(); - if ($env_port !== $predefinedPort) { - $env_url = $env_url->withPort($predefinedPort); - $savedService->fqdn = $env_url->__toString(); - $savedService->save(); - } - } - } - - // data_forget($service, "environment.$variableName"); - // $yaml = data_forget($yaml, "services.$serviceName.environment.$variableName"); - // if (count(data_get($yaml, 'services.' . $serviceName . '.environment')) === 0) { - // $yaml = data_forget($yaml, "services.$serviceName.environment"); - // } - continue; - } - if ($value?->startsWith('$')) { - $foundEnv = EnvironmentVariable::where([ - 'key' => $key, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - ])->first(); - $value = replaceVariables($value); - $key = $value; - if ($value->startsWith('SERVICE_')) { - $foundEnv = EnvironmentVariable::where([ - 'key' => $key, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - ])->first(); - ['command' => $command, 'forService' => $forService, 'generatedValue' => $generatedValue, 'port' => $port] = parseEnvVariable($value); - if (! is_null($command)) { - if ($command?->value() === 'FQDN' || $command?->value() === 'URL') { - if (Str::lower($forService) === $serviceName) { - $fqdn = generateFqdn($resource->server, $containerName); - } else { - $fqdn = generateFqdn($resource->server, Str::lower($forService).'-'.$resource->uuid); - } - if ($port) { - $fqdn = "$fqdn:$port"; - } - if ($foundEnv) { - $fqdn = data_get($foundEnv, 'value'); - // if ($savedService->fqdn) { - // $savedServiceFqdn = Url::fromString($savedService->fqdn); - // $parsedFqdn = Url::fromString($fqdn); - // $savedServicePath = $savedServiceFqdn->getPath(); - // $parsedFqdnPath = $parsedFqdn->getPath(); - // if ($savedServicePath != $parsedFqdnPath) { - // $fqdn = $parsedFqdn->withPath($savedServicePath)->__toString(); - // $foundEnv->value = $fqdn; - // $foundEnv->save(); - // } - // } - } else { - if ($command->value() === 'URL') { - $fqdn = str($fqdn)->after('://')->value(); - } - EnvironmentVariable::create([ - 'key' => $key, - 'value' => $fqdn, - 'is_build_time' => false, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - 'is_preview' => false, - ]); - } - if (! $isDatabase) { - if ($command->value() === 'FQDN' && is_null($savedService->fqdn) && ! $foundEnv) { - $savedService->fqdn = $fqdn; - $savedService->save(); - } - // Caddy needs exact port in some cases. - if ($predefinedPort && ! $key->endsWith("_{$predefinedPort}") && $command?->value() === 'FQDN' && $resource->server->proxyType() === 'CADDY') { - $fqdns_exploded = str($savedService->fqdn)->explode(','); - if ($fqdns_exploded->count() > 1) { - continue; - } - $env = EnvironmentVariable::where([ - 'key' => $key, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - ])->first(); - if ($env) { - $env_url = Url::fromString($env->value); - $env_port = $env_url->getPort(); - if ($env_port !== $predefinedPort) { - $env_url = $env_url->withPort($predefinedPort); - $savedService->fqdn = $env_url->__toString(); - $savedService->save(); - } - } - } - } - } else { - $generatedValue = generateEnvValue($command, $resource); - if (! $foundEnv) { - EnvironmentVariable::create([ - 'key' => $key, - 'value' => $generatedValue, - 'is_build_time' => false, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - 'is_preview' => false, - ]); - } - } - } - } else { - if ($value->contains(':-')) { - $key = $value->before(':'); - $defaultValue = $value->after(':-'); - } elseif ($value->contains('-')) { - $key = $value->before('-'); - $defaultValue = $value->after('-'); - } elseif ($value->contains(':?')) { - $key = $value->before(':'); - $defaultValue = $value->after(':?'); - } elseif ($value->contains('?')) { - $key = $value->before('?'); - $defaultValue = $value->after('?'); - } else { - $key = $value; - $defaultValue = null; - } - $foundEnv = EnvironmentVariable::where([ - 'key' => $key, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - ])->first(); - if ($foundEnv) { - $defaultValue = data_get($foundEnv, 'value'); - } - EnvironmentVariable::updateOrCreate([ - 'key' => $key, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - ], [ - 'value' => $defaultValue, - 'is_build_time' => false, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - 'is_preview' => false, - ]); - } - } - } - // Add labels to the service - if ($savedService->serviceType()) { - $fqdns = generateServiceSpecificFqdns($savedService); - } else { - $fqdns = collect(data_get($savedService, 'fqdns'))->filter(); - } - $defaultLabels = defaultLabels( - id: $resource->id, - name: $containerName, - projectName: $resource->project()->name, - resourceName: $resource->name, - type: 'service', - subType: $isDatabase ? 'database' : 'application', - subId: $savedService->id, - subName: $savedService->name, - environment: $resource->environment->name, - ); - $serviceLabels = $serviceLabels->merge($defaultLabels); - if (! $isDatabase && $fqdns->count() > 0) { - if ($fqdns) { - $shouldGenerateLabelsExactly = $resource->server->settings->generate_exact_labels; - if ($shouldGenerateLabelsExactly) { - switch ($resource->server->proxyType()) { - case ProxyTypes::TRAEFIK->value: - $serviceLabels = $serviceLabels->merge(fqdnLabelsForTraefik( - uuid: $resource->uuid, - domains: $fqdns, - is_force_https_enabled: true, - serviceLabels: $serviceLabels, - is_gzip_enabled: $savedService->isGzipEnabled(), - is_stripprefix_enabled: $savedService->isStripprefixEnabled(), - service_name: $serviceName, - image: data_get($service, 'image') - )); - break; - case ProxyTypes::CADDY->value: - $serviceLabels = $serviceLabels->merge(fqdnLabelsForCaddy( - network: $resource->destination->network, - uuid: $resource->uuid, - domains: $fqdns, - is_force_https_enabled: true, - serviceLabels: $serviceLabels, - is_gzip_enabled: $savedService->isGzipEnabled(), - is_stripprefix_enabled: $savedService->isStripprefixEnabled(), - service_name: $serviceName, - image: data_get($service, 'image') - )); - break; - } - } else { - $serviceLabels = $serviceLabels->merge(fqdnLabelsForTraefik( - uuid: $resource->uuid, - domains: $fqdns, - is_force_https_enabled: true, - serviceLabels: $serviceLabels, - is_gzip_enabled: $savedService->isGzipEnabled(), - is_stripprefix_enabled: $savedService->isStripprefixEnabled(), - service_name: $serviceName, - image: data_get($service, 'image') - )); - $serviceLabels = $serviceLabels->merge(fqdnLabelsForCaddy( - network: $resource->destination->network, - uuid: $resource->uuid, - domains: $fqdns, - is_force_https_enabled: true, - serviceLabels: $serviceLabels, - is_gzip_enabled: $savedService->isGzipEnabled(), - is_stripprefix_enabled: $savedService->isStripprefixEnabled(), - service_name: $serviceName, - image: data_get($service, 'image') - )); - } - } - } - if ($resource->server->isLogDrainEnabled() && $savedService->isLogDrainEnabled()) { - data_set($service, 'logging', generate_fluentd_configuration()); - } - if ($serviceLabels->count() > 0) { - if ($resource->is_container_label_escape_enabled) { - $serviceLabels = $serviceLabels->map(function ($value, $key) { - return escapeDollarSign($value); - }); - } - } - data_set($service, 'labels', $serviceLabels->toArray()); - data_forget($service, 'is_database'); - if (! data_get($service, 'restart')) { - data_set($service, 'restart', RESTART_MODE); - } - if (data_get($service, 'restart') === 'no' || data_get($service, 'exclude_from_hc')) { - $savedService->update(['exclude_from_status' => true]); - } - data_set($service, 'container_name', $containerName); - data_forget($service, 'volumes.*.content'); - data_forget($service, 'volumes.*.isDirectory'); - data_forget($service, 'volumes.*.is_directory'); - data_forget($service, 'exclude_from_hc'); - data_set($service, 'environment', $serviceVariables->toArray()); - updateCompose($savedService); - - return $service; - }); - - $envs_from_coolify = $resource->environment_variables()->get(); - $services = collect($services)->map(function ($service, $serviceName) use ($resource, $envs_from_coolify) { - $serviceVariables = collect(data_get($service, 'environment', [])); - $parsedServiceVariables = collect([]); - foreach ($serviceVariables as $key => $value) { - if (is_numeric($key)) { - $value = str($value); - if ($value->contains('=')) { - $key = $value->before('=')->value(); - $value = $value->after('=')->value(); - } else { - $key = $value->value(); - $value = null; - } - $parsedServiceVariables->put($key, $value); - } else { - $parsedServiceVariables->put($key, $value); - } - } - $parsedServiceVariables->put('COOLIFY_RESOURCE_UUID', "{$resource->uuid}"); - $parsedServiceVariables->put('COOLIFY_CONTAINER_NAME', "$serviceName-{$resource->uuid}"); - - // TODO: move this in a shared function - if (! $parsedServiceVariables->has('COOLIFY_APP_NAME')) { - $parsedServiceVariables->put('COOLIFY_APP_NAME', "\"{$resource->name}\""); - } - if (! $parsedServiceVariables->has('COOLIFY_SERVER_IP')) { - $parsedServiceVariables->put('COOLIFY_SERVER_IP', "\"{$resource->destination->server->ip}\""); - } - if (! $parsedServiceVariables->has('COOLIFY_ENVIRONMENT_NAME')) { - $parsedServiceVariables->put('COOLIFY_ENVIRONMENT_NAME', "\"{$resource->environment->name}\""); - } - if (! $parsedServiceVariables->has('COOLIFY_PROJECT_NAME')) { - $parsedServiceVariables->put('COOLIFY_PROJECT_NAME', "\"{$resource->project()->name}\""); - } - - $parsedServiceVariables = $parsedServiceVariables->map(function ($value, $key) use ($envs_from_coolify) { - if (! str($value)->startsWith('$')) { - $found_env = $envs_from_coolify->where('key', $key)->first(); - if ($found_env) { - return $found_env->value; - } - } - - return $value; - }); - - data_set($service, 'environment', $parsedServiceVariables->toArray()); - - return $service; - }); - $finalServices = [ - 'services' => $services->toArray(), - 'volumes' => $topLevelVolumes->toArray(), - 'networks' => $topLevelNetworks->toArray(), - 'configs' => $topLevelConfigs->toArray(), - 'secrets' => $topLevelSecrets->toArray(), - ]; - $yaml = data_forget($yaml, 'services.*.volumes.*.content'); - $resource->docker_compose_raw = Yaml::dump($yaml, 10, 2); - $resource->docker_compose = Yaml::dump($finalServices, 10, 2); - - $resource->save(); - $resource->saveComposeConfigs(); - - return collect($finalServices); - } else { - return collect([]); - } - } elseif ($resource->getMorphClass() === \App\Models\Application::class) { - try { - $yaml = Yaml::parse($resource->docker_compose_raw); - } catch (\Exception) { - return; - } - $server = $resource->destination->server; - $topLevelVolumes = collect(data_get($yaml, 'volumes', [])); - if ($pull_request_id !== 0) { - $topLevelVolumes = collect([]); - } - - if ($topLevelVolumes->count() > 0) { - $tempTopLevelVolumes = collect([]); - foreach ($topLevelVolumes as $volumeName => $volume) { - if (is_null($volume)) { - continue; - } - $tempTopLevelVolumes->put($volumeName, $volume); - } - $topLevelVolumes = collect($tempTopLevelVolumes); - } - - $topLevelNetworks = collect(data_get($yaml, 'networks', [])); - $topLevelConfigs = collect(data_get($yaml, 'configs', [])); - $topLevelSecrets = collect(data_get($yaml, 'secrets', [])); - $services = data_get($yaml, 'services'); - - $generatedServiceFQDNS = collect([]); - if (is_null($resource->destination)) { - $destination = $server->destinations()->first(); - if ($destination) { - $resource->destination()->associate($destination); - $resource->save(); - } - } - $definedNetwork = collect([$resource->uuid]); - if ($pull_request_id !== 0) { - $definedNetwork = collect(["{$resource->uuid}-$pull_request_id"]); - } - $services = collect($services)->map(function ($service, $serviceName) use ($topLevelVolumes, $topLevelNetworks, $definedNetwork, $isNew, $generatedServiceFQDNS, $resource, $server, $pull_request_id, $preview_id) { - $serviceVolumes = collect(data_get($service, 'volumes', [])); - $servicePorts = collect(data_get($service, 'ports', [])); - $serviceNetworks = collect(data_get($service, 'networks', [])); - $serviceVariables = collect(data_get($service, 'environment', [])); - $serviceDependencies = collect(data_get($service, 'depends_on', [])); - $serviceLabels = collect(data_get($service, 'labels', [])); - $serviceBuildVariables = collect(data_get($service, 'build.args', [])); - $serviceVariables = $serviceVariables->merge($serviceBuildVariables); - if ($serviceLabels->count() > 0) { - $removedLabels = collect([]); - $serviceLabels = $serviceLabels->filter(function ($serviceLabel, $serviceLabelName) use ($removedLabels) { - if (! str($serviceLabel)->contains('=')) { - $removedLabels->put($serviceLabelName, $serviceLabel); - - return false; - } - - return $serviceLabel; - }); - foreach ($removedLabels as $removedLabelName => $removedLabel) { - $serviceLabels->push("$removedLabelName=$removedLabel"); - } - } - - $baseName = generateApplicationContainerName($resource, $pull_request_id); - $containerName = "$serviceName-$baseName"; - if ($resource->compose_parsing_version === '1') { - if (count($serviceVolumes) > 0) { - $serviceVolumes = $serviceVolumes->map(function ($volume) use ($resource, $topLevelVolumes, $pull_request_id) { - if (is_string($volume)) { - $volume = str($volume); - if ($volume->contains(':') && ! $volume->startsWith('/')) { - $name = $volume->before(':'); - $mount = $volume->after(':'); - if ($name->startsWith('.') || $name->startsWith('~')) { - $dir = base_configuration_dir().'/applications/'.$resource->uuid; - if ($name->startsWith('.')) { - $name = $name->replaceFirst('.', $dir); - } - if ($name->startsWith('~')) { - $name = $name->replaceFirst('~', $dir); - } - if ($pull_request_id !== 0) { - $name = $name."-pr-$pull_request_id"; - } - $volume = str("$name:$mount"); - } else { - if ($pull_request_id !== 0) { - $name = $name."-pr-$pull_request_id"; - $volume = str("$name:$mount"); - if ($topLevelVolumes->has($name)) { - $v = $topLevelVolumes->get($name); - if (data_get($v, 'driver_opts.type') === 'cifs') { - // Do nothing - } else { - if (is_null(data_get($v, 'name'))) { - data_set($v, 'name', $name); - data_set($topLevelVolumes, $name, $v); - } - } - } else { - $topLevelVolumes->put($name, [ - 'name' => $name, - ]); - } - } else { - if ($topLevelVolumes->has($name->value())) { - $v = $topLevelVolumes->get($name->value()); - if (data_get($v, 'driver_opts.type') === 'cifs') { - // Do nothing - } else { - if (is_null(data_get($v, 'name'))) { - data_set($topLevelVolumes, $name->value(), $v); - } - } - } else { - $topLevelVolumes->put($name->value(), [ - 'name' => $name->value(), - ]); - } - } - } - } else { - if ($volume->startsWith('/')) { - $name = $volume->before(':'); - $mount = $volume->after(':'); - if ($pull_request_id !== 0) { - $name = $name."-pr-$pull_request_id"; - } - $volume = str("$name:$mount"); - } - } - } elseif (is_array($volume)) { - $source = data_get($volume, 'source'); - $target = data_get($volume, 'target'); - $read_only = data_get($volume, 'read_only'); - if ($source && $target) { - if ((str($source)->startsWith('.') || str($source)->startsWith('~'))) { - $dir = base_configuration_dir().'/applications/'.$resource->uuid; - if (str($source, '.')) { - $source = str($source)->replaceFirst('.', $dir); - } - if (str($source, '~')) { - $source = str($source)->replaceFirst('~', $dir); - } - if ($pull_request_id !== 0) { - $source = $source."-pr-$pull_request_id"; - } - if ($read_only) { - data_set($volume, 'source', $source.':'.$target.':ro'); - } else { - data_set($volume, 'source', $source.':'.$target); - } - } else { - if ($pull_request_id !== 0) { - $source = $source."-pr-$pull_request_id"; - } - if ($read_only) { - data_set($volume, 'source', $source.':'.$target.':ro'); - } else { - data_set($volume, 'source', $source.':'.$target); - } - if (! str($source)->startsWith('/')) { - if ($topLevelVolumes->has($source)) { - $v = $topLevelVolumes->get($source); - if (data_get($v, 'driver_opts.type') === 'cifs') { - // Do nothing - } else { - if (is_null(data_get($v, 'name'))) { - data_set($v, 'name', $source); - data_set($topLevelVolumes, $source, $v); - } - } - } else { - $topLevelVolumes->put($source, [ - 'name' => $source, - ]); - } - } - } - } - } - if (is_array($volume)) { - return data_get($volume, 'source'); - } - - return $volume->value(); - }); - data_set($service, 'volumes', $serviceVolumes->toArray()); - } - } elseif ($resource->compose_parsing_version === '2') { - if (count($serviceVolumes) > 0) { - $serviceVolumes = $serviceVolumes->map(function ($volume) use ($resource, $topLevelVolumes, $pull_request_id) { - if (is_string($volume)) { - $volume = str($volume); - if ($volume->contains(':') && ! $volume->startsWith('/')) { - $name = $volume->before(':'); - $mount = $volume->after(':'); - if ($name->startsWith('.') || $name->startsWith('~')) { - $dir = base_configuration_dir().'/applications/'.$resource->uuid; - if ($name->startsWith('.')) { - $name = $name->replaceFirst('.', $dir); - } - if ($name->startsWith('~')) { - $name = $name->replaceFirst('~', $dir); - } - if ($pull_request_id !== 0) { - $name = $name."-pr-$pull_request_id"; - } - $volume = str("$name:$mount"); - } else { - if ($pull_request_id !== 0) { - $uuid = $resource->uuid; - $name = $uuid."-$name-pr-$pull_request_id"; - $volume = str("$name:$mount"); - if ($topLevelVolumes->has($name)) { - $v = $topLevelVolumes->get($name); - if (data_get($v, 'driver_opts.type') === 'cifs') { - // Do nothing - } else { - if (is_null(data_get($v, 'name'))) { - data_set($v, 'name', $name); - data_set($topLevelVolumes, $name, $v); - } - } - } else { - $topLevelVolumes->put($name, [ - 'name' => $name, - ]); - } - } else { - $uuid = $resource->uuid; - $name = str($uuid."-$name"); - $volume = str("$name:$mount"); - if ($topLevelVolumes->has($name->value())) { - $v = $topLevelVolumes->get($name->value()); - if (data_get($v, 'driver_opts.type') === 'cifs') { - // Do nothing - } else { - if (is_null(data_get($v, 'name'))) { - data_set($topLevelVolumes, $name->value(), $v); - } - } - } else { - $topLevelVolumes->put($name->value(), [ - 'name' => $name->value(), - ]); - } - } - } - } else { - if ($volume->startsWith('/')) { - $name = $volume->before(':'); - $mount = $volume->after(':'); - if ($pull_request_id !== 0) { - $name = $name."-pr-$pull_request_id"; - } - $volume = str("$name:$mount"); - } - } - } elseif (is_array($volume)) { - $source = data_get($volume, 'source'); - $target = data_get($volume, 'target'); - $read_only = data_get($volume, 'read_only'); - if ($source && $target) { - $uuid = $resource->uuid; - if ((str($source)->startsWith('.') || str($source)->startsWith('~') || str($source)->startsWith('/'))) { - $dir = base_configuration_dir().'/applications/'.$resource->uuid; - if (str($source, '.')) { - $source = str($source)->replaceFirst('.', $dir); - } - if (str($source, '~')) { - $source = str($source)->replaceFirst('~', $dir); - } - if ($read_only) { - data_set($volume, 'source', $source.':'.$target.':ro'); - } else { - data_set($volume, 'source', $source.':'.$target); - } - } else { - if ($pull_request_id === 0) { - $source = $uuid."-$source"; - } else { - $source = $uuid."-$source-pr-$pull_request_id"; - } - if ($read_only) { - data_set($volume, 'source', $source.':'.$target.':ro'); - } else { - data_set($volume, 'source', $source.':'.$target); - } - if (! str($source)->startsWith('/')) { - if ($topLevelVolumes->has($source)) { - $v = $topLevelVolumes->get($source); - if (data_get($v, 'driver_opts.type') === 'cifs') { - // Do nothing - } else { - if (is_null(data_get($v, 'name'))) { - data_set($v, 'name', $source); - data_set($topLevelVolumes, $source, $v); - } - } - } else { - $topLevelVolumes->put($source, [ - 'name' => $source, - ]); - } - } - } - } - } - if (is_array($volume)) { - return data_get($volume, 'source'); - } - dispatch(new ServerFilesFromServerJob($resource)); - - return $volume->value(); - }); - data_set($service, 'volumes', $serviceVolumes->toArray()); - } - } - - if ($pull_request_id !== 0 && count($serviceDependencies) > 0) { - $serviceDependencies = $serviceDependencies->map(function ($dependency) use ($pull_request_id) { - return $dependency."-pr-$pull_request_id"; - }); - data_set($service, 'depends_on', $serviceDependencies->toArray()); - } - - // Decide if the service is a database - $isDatabase = isDatabaseImage(data_get_str($service, 'image')); - data_set($service, 'is_database', $isDatabase); - - // Collect/create/update networks - if ($serviceNetworks->count() > 0) { - foreach ($serviceNetworks as $networkName => $networkDetails) { - if ($networkName === 'default') { - continue; - } - // ignore alias - if ($networkDetails['aliases'] ?? false) { - continue; - } - $networkExists = $topLevelNetworks->contains(function ($value, $key) use ($networkName) { - return $value == $networkName || $key == $networkName; - }); - if (! $networkExists) { - if (is_string($networkDetails) || is_int($networkDetails)) { - $topLevelNetworks->put($networkDetails, null); - } - } - } - } - // Collect/create/update ports - $collectedPorts = collect([]); - if ($servicePorts->count() > 0) { - foreach ($servicePorts as $sport) { - if (is_string($sport) || is_numeric($sport)) { - $collectedPorts->push($sport); - } - if (is_array($sport)) { - $target = data_get($sport, 'target'); - $published = data_get($sport, 'published'); - $protocol = data_get($sport, 'protocol'); - $collectedPorts->push("$target:$published/$protocol"); - } - } - } - $definedNetworkExists = $topLevelNetworks->contains(function ($value, $_) use ($definedNetwork) { - return $value == $definedNetwork; - }); - if (! $definedNetworkExists) { - foreach ($definedNetwork as $network) { - if ($pull_request_id !== 0) { - $topLevelNetworks->put($network, [ - 'name' => $network, - 'external' => true, - ]); - } else { - $topLevelNetworks->put($network, [ - 'name' => $network, - 'external' => true, - ]); - } - } - } - $networks = collect(); - foreach ($serviceNetworks as $key => $serviceNetwork) { - if (gettype($serviceNetwork) === 'string') { - // networks: - // - appwrite - $networks->put($serviceNetwork, null); - } elseif (gettype($serviceNetwork) === 'array') { - // networks: - // default: - // ipv4_address: 192.168.203.254 - // $networks->put($serviceNetwork, null); - $networks->put($key, $serviceNetwork); - } - } - foreach ($definedNetwork as $key => $network) { - $networks->put($network, null); - } - if (data_get($resource, 'settings.connect_to_docker_network')) { - $network = $resource->destination->network; - $networks->put($network, null); - $topLevelNetworks->put($network, [ - 'name' => $network, - 'external' => true, - ]); - } - data_set($service, 'networks', $networks->toArray()); - // Get variables from the service - foreach ($serviceVariables as $variableName => $variable) { - if (is_numeric($variableName)) { - if (is_array($variable)) { - // - SESSION_SECRET: 123 - // - SESSION_SECRET: - $key = str(collect($variable)->keys()->first()); - $value = str(collect($variable)->values()->first()); - } else { - $variable = str($variable); - if ($variable->contains('=')) { - // - SESSION_SECRET=123 - // - SESSION_SECRET= - $key = $variable->before('='); - $value = $variable->after('='); - } else { - // - SESSION_SECRET - $key = $variable; - $value = null; - } - } - } else { - // SESSION_SECRET: 123 - // SESSION_SECRET: - $key = str($variableName); - $value = str($variable); - } - if ($key->startsWith('SERVICE_FQDN')) { - if ($isNew) { - $name = $key->after('SERVICE_FQDN_')->beforeLast('_')->lower(); - $fqdn = generateFqdn($server, "{$name->value()}-{$resource->uuid}"); - if (substr_count($key->value(), '_') === 3) { - // SERVICE_FQDN_UMAMI_1000 - $port = $key->afterLast('_'); - } else { - // SERVICE_FQDN_UMAMI - $port = null; - } - if ($port) { - $fqdn = "$fqdn:$port"; - } - if (substr_count($key->value(), '_') >= 2) { - if ($value) { - $path = $value->value(); - } else { - $path = null; - } - if ($generatedServiceFQDNS->count() > 0) { - $alreadyGenerated = $generatedServiceFQDNS->has($key->value()); - if ($alreadyGenerated) { - $fqdn = $generatedServiceFQDNS->get($key->value()); - } else { - $generatedServiceFQDNS->put($key->value(), $fqdn); - } - } else { - $generatedServiceFQDNS->put($key->value(), $fqdn); - } - $fqdn = "$fqdn$path"; - } - } - - continue; - } - if ($value?->startsWith('$')) { - $foundEnv = EnvironmentVariable::where([ - 'key' => $key, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - 'is_preview' => false, - ])->first(); - $value = replaceVariables($value); - $key = $value; - if ($value->startsWith('SERVICE_')) { - $foundEnv = EnvironmentVariable::where([ - 'key' => $key, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - ])->first(); - ['command' => $command, 'forService' => $forService, 'generatedValue' => $generatedValue, 'port' => $port] = parseEnvVariable($value); - if (! is_null($command)) { - if ($command?->value() === 'FQDN' || $command?->value() === 'URL') { - if (Str::lower($forService) === $serviceName) { - $fqdn = generateFqdn($server, $containerName); - } else { - $fqdn = generateFqdn($server, Str::lower($forService).'-'.$resource->uuid); - } - if ($port) { - $fqdn = "$fqdn:$port"; - } - if ($foundEnv) { - $fqdn = data_get($foundEnv, 'value'); - } else { - if ($command?->value() === 'URL') { - $fqdn = str($fqdn)->after('://')->value(); - } - EnvironmentVariable::create([ - 'key' => $key, - 'value' => $fqdn, - 'is_build_time' => false, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - 'is_preview' => false, - ]); - } - } else { - $generatedValue = generateEnvValue($command); - if (! $foundEnv) { - EnvironmentVariable::create([ - 'key' => $key, - 'value' => $generatedValue, - 'is_build_time' => false, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - 'is_preview' => false, - ]); - } - } - } - } else { - if ($value->contains(':-')) { - $key = $value->before(':'); - $defaultValue = $value->after(':-'); - } elseif ($value->contains('-')) { - $key = $value->before('-'); - $defaultValue = $value->after('-'); - } elseif ($value->contains(':?')) { - $key = $value->before(':'); - $defaultValue = $value->after(':?'); - } elseif ($value->contains('?')) { - $key = $value->before('?'); - $defaultValue = $value->after('?'); - } else { - $key = $value; - $defaultValue = null; - } - $foundEnv = EnvironmentVariable::where([ - 'key' => $key, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - 'is_preview' => false, - ])->first(); - if ($foundEnv) { - $defaultValue = data_get($foundEnv, 'value'); - } - $isBuildTime = data_get($foundEnv, 'is_build_time', false); - if ($foundEnv) { - $foundEnv->update([ - 'key' => $key, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - 'is_build_time' => $isBuildTime, - 'value' => $defaultValue, - ]); - } else { - EnvironmentVariable::create([ - 'key' => $key, - 'value' => $defaultValue, - 'is_build_time' => $isBuildTime, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - 'is_preview' => false, - ]); - } - } - } - } - // Add labels to the service - if ($resource->serviceType()) { - $fqdns = generateServiceSpecificFqdns($resource); - } else { - $domains = collect(json_decode($resource->docker_compose_domains)) ?? []; - if ($domains) { - $fqdns = data_get($domains, "$serviceName.domain"); - if ($fqdns) { - $fqdns = str($fqdns)->explode(','); - if ($pull_request_id !== 0) { - $preview = $resource->previews()->find($preview_id); - $docker_compose_domains = collect(json_decode(data_get($preview, 'docker_compose_domains'))); - if ($docker_compose_domains->count() > 0) { - $found_fqdn = data_get($docker_compose_domains, "$serviceName.domain"); - if ($found_fqdn) { - $fqdns = collect($found_fqdn); - } else { - $fqdns = collect([]); - } - } else { - $fqdns = $fqdns->map(function ($fqdn) use ($pull_request_id, $resource) { - $preview = ApplicationPreview::findPreviewByApplicationAndPullId($resource->id, $pull_request_id); - $url = Url::fromString($fqdn); - $template = $resource->preview_url_template; - $host = $url->getHost(); - $schema = $url->getScheme(); - $random = new Cuid2; - $preview_fqdn = str_replace('{{random}}', $random, $template); - $preview_fqdn = str_replace('{{domain}}', $host, $preview_fqdn); - $preview_fqdn = str_replace('{{pr_id}}', $pull_request_id, $preview_fqdn); - $preview_fqdn = "$schema://$preview_fqdn"; - $preview->fqdn = $preview_fqdn; - $preview->save(); - - return $preview_fqdn; - }); - } - } - $shouldGenerateLabelsExactly = $server->settings->generate_exact_labels; - if ($shouldGenerateLabelsExactly) { - switch ($server->proxyType()) { - case ProxyTypes::TRAEFIK->value: - $serviceLabels = $serviceLabels->merge( - fqdnLabelsForTraefik( - uuid: $resource->uuid, - domains: $fqdns, - serviceLabels: $serviceLabels, - generate_unique_uuid: $resource->build_pack === 'dockercompose', - image: data_get($service, 'image'), - is_force_https_enabled: $resource->isForceHttpsEnabled(), - is_gzip_enabled: $resource->isGzipEnabled(), - is_stripprefix_enabled: $resource->isStripprefixEnabled(), - ) - ); - break; - case ProxyTypes::CADDY->value: - $serviceLabels = $serviceLabels->merge( - fqdnLabelsForCaddy( - network: $resource->destination->network, - uuid: $resource->uuid, - domains: $fqdns, - serviceLabels: $serviceLabels, - image: data_get($service, 'image'), - is_force_https_enabled: $resource->isForceHttpsEnabled(), - is_gzip_enabled: $resource->isGzipEnabled(), - is_stripprefix_enabled: $resource->isStripprefixEnabled(), - ) - ); - break; - } - } else { - $serviceLabels = $serviceLabels->merge( - fqdnLabelsForTraefik( - uuid: $resource->uuid, - domains: $fqdns, - serviceLabels: $serviceLabels, - generate_unique_uuid: $resource->build_pack === 'dockercompose', - image: data_get($service, 'image'), - is_force_https_enabled: $resource->isForceHttpsEnabled(), - is_gzip_enabled: $resource->isGzipEnabled(), - is_stripprefix_enabled: $resource->isStripprefixEnabled(), - ) - ); - $serviceLabels = $serviceLabels->merge( - fqdnLabelsForCaddy( - network: $resource->destination->network, - uuid: $resource->uuid, - domains: $fqdns, - serviceLabels: $serviceLabels, - image: data_get($service, 'image'), - is_force_https_enabled: $resource->isForceHttpsEnabled(), - is_gzip_enabled: $resource->isGzipEnabled(), - is_stripprefix_enabled: $resource->isStripprefixEnabled(), - ) - ); - } - } - } - } - - $defaultLabels = defaultLabels( - id: $resource->id, - name: $containerName, - projectName: $resource->project()->name, - resourceName: $resource->name, - environment: $resource->environment->name, - pull_request_id: $pull_request_id, - type: 'application' - ); - $serviceLabels = $serviceLabels->merge($defaultLabels); - - if ($server->isLogDrainEnabled()) { - if ($resource instanceof Application && $resource->isLogDrainEnabled()) { - data_set($service, 'logging', generate_fluentd_configuration()); - } - } - if ($serviceLabels->count() > 0) { - if ($resource->settings->is_container_label_escape_enabled) { - $serviceLabels = $serviceLabels->map(function ($value, $key) { - return escapeDollarSign($value); - }); - } - } - data_set($service, 'labels', $serviceLabels->toArray()); - data_forget($service, 'is_database'); - if (! data_get($service, 'restart')) { - data_set($service, 'restart', RESTART_MODE); - } - data_set($service, 'container_name', $containerName); - data_forget($service, 'volumes.*.content'); - data_forget($service, 'volumes.*.isDirectory'); - data_forget($service, 'volumes.*.is_directory'); - data_forget($service, 'exclude_from_hc'); - data_set($service, 'environment', $serviceVariables->toArray()); - - return $service; - }); - if ($pull_request_id !== 0) { - $services->each(function ($service, $serviceName) use ($pull_request_id, $services) { - $services[$serviceName."-pr-$pull_request_id"] = $service; - data_forget($services, $serviceName); - }); - } - $finalServices = [ - 'services' => $services->toArray(), - 'volumes' => $topLevelVolumes->toArray(), - 'networks' => $topLevelNetworks->toArray(), - 'configs' => $topLevelConfigs->toArray(), - 'secrets' => $topLevelSecrets->toArray(), - ]; - $resource->docker_compose_raw = Yaml::dump($yaml, 10, 2); - $resource->docker_compose = Yaml::dump($finalServices, 10, 2); - data_forget($resource, 'environment_variables'); - data_forget($resource, 'environment_variables_preview'); - $resource->save(); - - return collect($finalServices); - } -} - -function newParser(Application|Service $resource, int $pull_request_id = 0, ?int $preview_id = null): Collection -{ - $isApplication = $resource instanceof Application; - $isService = $resource instanceof Service; - - $uuid = data_get($resource, 'uuid'); - $compose = data_get($resource, 'docker_compose_raw'); - if (! $compose) { - return collect([]); - } - - if ($isApplication) { - $pullRequestId = $pull_request_id; - $isPullRequest = $pullRequestId == 0 ? false : true; - $server = data_get($resource, 'destination.server'); - $fileStorages = $resource->fileStorages(); - } elseif ($isService) { - $server = data_get($resource, 'server'); - $allServices = get_service_templates(); - } else { - return collect([]); - } - - try { - $yaml = Yaml::parse($compose); - } catch (\Exception) { - return collect([]); - } - - $services = data_get($yaml, 'services', collect([])); - $topLevel = collect([ - 'volumes' => collect(data_get($yaml, 'volumes', [])), - 'networks' => collect(data_get($yaml, 'networks', [])), - 'configs' => collect(data_get($yaml, 'configs', [])), - 'secrets' => collect(data_get($yaml, 'secrets', [])), - ]); - // If there are predefined volumes, make sure they are not null - if ($topLevel->get('volumes')->count() > 0) { - $temp = collect([]); - foreach ($topLevel['volumes'] as $volumeName => $volume) { - if (is_null($volume)) { - continue; - } - $temp->put($volumeName, $volume); - } - $topLevel['volumes'] = $temp; - } - // Get the base docker network - $baseNetwork = collect([$uuid]); - if ($isApplication && $isPullRequest) { - $baseNetwork = collect(["{$uuid}-{$pullRequestId}"]); - } - - $parsedServices = collect([]); - - $allMagicEnvironments = collect([]); - foreach ($services as $serviceName => $service) { - $predefinedPort = null; - $magicEnvironments = collect([]); - $image = data_get_str($service, 'image'); - $environment = collect(data_get($service, 'environment', [])); - $buildArgs = collect(data_get($service, 'build.args', [])); - $environment = $environment->merge($buildArgs); - $isDatabase = isDatabaseImage(data_get_str($service, 'image')); - - if ($isService) { - $containerName = "$serviceName-{$resource->uuid}"; - - if ($serviceName === 'registry') { - $tempServiceName = 'docker-registry'; - } else { - $tempServiceName = $serviceName; - } - if (str(data_get($service, 'image'))->contains('glitchtip')) { - $tempServiceName = 'glitchtip'; - } - if ($serviceName === 'supabase-kong') { - $tempServiceName = 'supabase'; - } - $serviceDefinition = data_get($allServices, $tempServiceName); - $predefinedPort = data_get($serviceDefinition, 'port'); - if ($serviceName === 'plausible') { - $predefinedPort = '8000'; - } - if ($isDatabase) { - $applicationFound = ServiceApplication::where('name', $serviceName)->where('image', $image)->where('service_id', $resource->id)->first(); - if ($applicationFound) { - $savedService = $applicationFound; - $savedService = ServiceDatabase::firstOrCreate([ - 'name' => $applicationFound->name, - 'image' => $applicationFound->image, - 'service_id' => $applicationFound->service_id, - ]); - $applicationFound->delete(); - } else { - $savedService = ServiceDatabase::firstOrCreate([ - 'name' => $serviceName, - 'image' => $image, - 'service_id' => $resource->id, - ]); - } - } else { - $savedService = ServiceApplication::firstOrCreate([ - 'name' => $serviceName, - 'image' => $image, - 'service_id' => $resource->id, - ]); - } - $environment = collect(data_get($service, 'environment', [])); - $buildArgs = collect(data_get($service, 'build.args', [])); - $environment = $environment->merge($buildArgs); - - // convert environment variables to one format - $environment = convertToKeyValueCollection($environment); - - // Add Coolify defined environments - $allEnvironments = $resource->environment_variables()->get(['key', 'value']); - - $allEnvironments = $allEnvironments->mapWithKeys(function ($item) { - return [$item['key'] => $item['value']]; - }); - // filter and add magic environments - foreach ($environment as $key => $value) { - // Get all SERVICE_ variables from keys and values - $key = str($key); - $value = str($value); - - $regex = '/\$(\{?([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)\}?)/'; - preg_match_all($regex, $value, $valueMatches); - if (count($valueMatches[1]) > 0) { - foreach ($valueMatches[1] as $match) { - $match = replaceVariables($match); - if ($match->startsWith('SERVICE_')) { - if ($magicEnvironments->has($match->value())) { - continue; - } - $magicEnvironments->put($match->value(), ''); - } - } - } - - // Get magic environments where we need to preset the FQDN - if ($key->startsWith('SERVICE_FQDN_')) { - // SERVICE_FQDN_APP or SERVICE_FQDN_APP_3000 - if (substr_count(str($key)->value(), '_') === 3) { - $fqdnFor = $key->after('SERVICE_FQDN_')->beforeLast('_')->lower()->value(); - $port = $key->afterLast('_')->value(); - } else { - $fqdnFor = $key->after('SERVICE_FQDN_')->lower()->value(); - $port = null; - } - if ($isApplication) { - $fqdn = generateFqdn($server, "{$resource->name}-$uuid"); - } elseif ($isService) { - if ($fqdnFor) { - $fqdn = generateFqdn($server, "$fqdnFor-$uuid"); - } else { - $fqdn = generateFqdn($server, "{$savedService->name}-$uuid"); - } - } - - if ($value && get_class($value) === \Illuminate\Support\Stringable::class && $value->startsWith('/')) { - $path = $value->value(); - if ($path !== '/') { - $fqdn = "$fqdn$path"; - } - } - $fqdnWithPort = $fqdn; - if ($port) { - $fqdnWithPort = "$fqdn:$port"; - } - if ($isApplication && is_null($resource->fqdn)) { - data_forget($resource, 'environment_variables'); - data_forget($resource, 'environment_variables_preview'); - $resource->fqdn = $fqdnWithPort; - $resource->save(); - } elseif ($isService && is_null($savedService->fqdn)) { - $savedService->fqdn = $fqdnWithPort; - $savedService->save(); - } - - if (substr_count(str($key)->value(), '_') === 2) { - $resource->environment_variables()->firstOrCreate([ - 'key' => $key->value(), - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - ], [ - 'value' => $fqdn, - 'is_build_time' => false, - 'is_preview' => false, - ]); - } - if (substr_count(str($key)->value(), '_') === 3) { - $newKey = str($key)->beforeLast('_'); - $resource->environment_variables()->firstOrCreate([ - 'key' => $newKey->value(), - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - ], [ - 'value' => $fqdn, - 'is_build_time' => false, - 'is_preview' => false, - ]); - } - } - } - - $allMagicEnvironments = $allMagicEnvironments->merge($magicEnvironments); - if ($magicEnvironments->count() > 0) { - foreach ($magicEnvironments as $key => $value) { - $key = str($key); - $value = replaceVariables($value); - $command = parseCommandFromMagicEnvVariable($key); - $found = $resource->environment_variables()->where('key', $key->value())->where('resourceable_type', get_class($resource))->where('resourceable_id', $resource->id)->first(); - if ($found) { - continue; - } - if ($command->value() === 'FQDN') { - $fqdnFor = $key->after('SERVICE_FQDN_')->lower()->value(); - if (str($fqdnFor)->contains('_')) { - $fqdnFor = str($fqdnFor)->before('_'); - } - if ($isApplication) { - $fqdn = generateFqdn($server, "{$resource->name}-$uuid"); - } elseif ($isService) { - $fqdn = generateFqdn($server, "$fqdnFor-$uuid"); - } - $resource->environment_variables()->firstOrCreate([ - 'key' => $key->value(), - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - ], [ - 'value' => $fqdn, - 'is_build_time' => false, - 'is_preview' => false, - ]); - } elseif ($command->value() === 'URL') { - $fqdnFor = $key->after('SERVICE_URL_')->lower()->value(); - if (str($fqdnFor)->contains('_')) { - $fqdnFor = str($fqdnFor)->before('_'); - } - if ($isApplication) { - $fqdn = generateFqdn($server, "{$resource->name}-$uuid"); - } elseif ($isService) { - $fqdn = generateFqdn($server, "$fqdnFor-$uuid"); - } - $fqdn = str($fqdn)->replace('http://', '')->replace('https://', ''); - $resource->environment_variables()->firstOrCreate([ - 'key' => $key->value(), - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - ], [ - 'value' => $fqdn, - 'is_build_time' => false, - 'is_preview' => false, - ]); - } else { - $value = generateEnvValue($command, $resource); - $resource->environment_variables()->firstOrCreate([ - 'key' => $key->value(), - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - ], [ - 'value' => $value, - 'is_build_time' => false, - 'is_preview' => false, - ]); - } - } - } - } - } - - // Parse the rest of the services - foreach ($services as $serviceName => $service) { - $image = data_get_str($service, 'image'); - $restart = data_get_str($service, 'restart', RESTART_MODE); - $logging = data_get($service, 'logging'); - - if ($server->isLogDrainEnabled()) { - if ($resource instanceof Application && $resource->isLogDrainEnabled()) { - $logging = generate_fluentd_configuration(); - } - } - $volumes = collect(data_get($service, 'volumes', [])); - $networks = collect(data_get($service, 'networks', [])); - $use_network_mode = data_get($service, 'network_mode') !== null; - $depends_on = collect(data_get($service, 'depends_on', [])); - $labels = collect(data_get($service, 'labels', [])); - $environment = collect(data_get($service, 'environment', [])); - $ports = collect(data_get($service, 'ports', [])); - $buildArgs = collect(data_get($service, 'build.args', [])); - $environment = $environment->merge($buildArgs); - - $environment = convertToKeyValueCollection($environment); - $coolifyEnvironments = collect([]); - - $isDatabase = isDatabaseImage(data_get_str($service, 'image')); - $volumesParsed = collect([]); - - if ($isApplication) { - $baseName = generateApplicationContainerName( - application: $resource, - pull_request_id: $pullRequestId - ); - $containerName = "$serviceName-$baseName"; - $predefinedPort = null; - } elseif ($isService) { - $containerName = "$serviceName-{$resource->uuid}"; - - if ($serviceName === 'registry') { - $tempServiceName = 'docker-registry'; - } else { - $tempServiceName = $serviceName; - } - if (str(data_get($service, 'image'))->contains('glitchtip')) { - $tempServiceName = 'glitchtip'; - } - if ($serviceName === 'supabase-kong') { - $tempServiceName = 'supabase'; - } - $serviceDefinition = data_get($allServices, $tempServiceName); - $predefinedPort = data_get($serviceDefinition, 'port'); - if ($serviceName === 'plausible') { - $predefinedPort = '8000'; - } - - if ($isDatabase) { - $applicationFound = ServiceApplication::where('name', $serviceName)->where('image', $image)->where('service_id', $resource->id)->first(); - if ($applicationFound) { - $savedService = $applicationFound; - $savedService = ServiceDatabase::firstOrCreate([ - 'name' => $applicationFound->name, - 'image' => $applicationFound->image, - 'service_id' => $applicationFound->service_id, - ]); - $applicationFound->delete(); - } else { - $savedService = ServiceDatabase::firstOrCreate([ - 'name' => $serviceName, - 'image' => $image, - 'service_id' => $resource->id, - ]); - } - } else { - $savedService = ServiceApplication::firstOrCreate([ - 'name' => $serviceName, - 'image' => $image, - 'service_id' => $resource->id, - ]); - } - $fileStorages = $savedService->fileStorages(); - if ($savedService->image !== $image) { - $savedService->image = $image; - $savedService->save(); - } - } - - $originalResource = $isApplication ? $resource : $savedService; - - if ($volumes->count() > 0) { - foreach ($volumes as $index => $volume) { - $type = null; - $source = null; - $target = null; - $content = null; - $isDirectory = false; - if (is_string($volume)) { - $source = str($volume)->before(':'); - $target = str($volume)->after(':')->beforeLast(':'); - $foundConfig = $fileStorages->whereMountPath($target)->first(); - if (sourceIsLocal($source)) { - $type = str('bind'); - if ($foundConfig) { - $contentNotNull_temp = data_get($foundConfig, 'content'); - if ($contentNotNull_temp) { - $content = $contentNotNull_temp; - } - $isDirectory = data_get($foundConfig, 'is_directory'); - } else { - // By default, we cannot determine if the bind is a directory or not, so we set it to directory - $isDirectory = true; - } - } else { - $type = str('volume'); - } - } elseif (is_array($volume)) { - $type = data_get_str($volume, 'type'); - $source = data_get_str($volume, 'source'); - $target = data_get_str($volume, 'target'); - $content = data_get($volume, 'content'); - $isDirectory = (bool) data_get($volume, 'isDirectory', null) || (bool) data_get($volume, 'is_directory', null); - - $foundConfig = $fileStorages->whereMountPath($target)->first(); - if ($foundConfig) { - $contentNotNull_temp = data_get($foundConfig, 'content'); - if ($contentNotNull_temp) { - $content = $contentNotNull_temp; - } - $isDirectory = data_get($foundConfig, 'is_directory'); - } else { - // if isDirectory is not set (or false) & content is also not set, we assume it is a directory - if ((is_null($isDirectory) || ! $isDirectory) && is_null($content)) { - $isDirectory = true; - } - } - } - if ($type->value() === 'bind') { - if ($source->value() === '/var/run/docker.sock') { - $volume = $source->value().':'.$target->value(); - } elseif ($source->value() === '/tmp' || $source->value() === '/tmp/') { - $volume = $source->value().':'.$target->value(); - } else { - if ((int) $resource->compose_parsing_version >= 4) { - if ($isApplication) { - $mainDirectory = str(base_configuration_dir().'/applications/'.$uuid); - } elseif ($isService) { - $mainDirectory = str(base_configuration_dir().'/services/'.$uuid); - } - } else { - $mainDirectory = str(base_configuration_dir().'/applications/'.$uuid); - } - $source = replaceLocalSource($source, $mainDirectory); - if ($isApplication && $isPullRequest) { - $source = $source."-pr-$pullRequestId"; - } - LocalFileVolume::updateOrCreate( - [ - 'mount_path' => $target, - 'resource_id' => $originalResource->id, - 'resource_type' => get_class($originalResource), - ], - [ - 'fs_path' => $source, - 'mount_path' => $target, - 'content' => $content, - 'is_directory' => $isDirectory, - 'resource_id' => $originalResource->id, - 'resource_type' => get_class($originalResource), - ] - ); - if (isDev()) { - if ((int) $resource->compose_parsing_version >= 4) { - if ($isApplication) { - $source = $source->replace($mainDirectory, '/var/lib/docker/volumes/coolify_dev_coolify_data/_data/applications/'.$uuid); - } elseif ($isService) { - $source = $source->replace($mainDirectory, '/var/lib/docker/volumes/coolify_dev_coolify_data/_data/services/'.$uuid); - } - } else { - $source = $source->replace($mainDirectory, '/var/lib/docker/volumes/coolify_dev_coolify_data/_data/applications/'.$uuid); - } - } - $volume = "$source:$target"; - } - } elseif ($type->value() === 'volume') { - if ($topLevel->get('volumes')->has($source->value())) { - $temp = $topLevel->get('volumes')->get($source->value()); - if (data_get($temp, 'driver_opts.type') === 'cifs') { - continue; - } - if (data_get($temp, 'driver_opts.type') === 'nfs') { - continue; - } - } - $slugWithoutUuid = Str::slug($source, '-'); - $name = "{$uuid}_{$slugWithoutUuid}"; - - if ($isApplication && $isPullRequest) { - $name = "{$name}-pr-$pullRequestId"; - } - if (is_string($volume)) { - $source = str($volume)->before(':'); - $target = str($volume)->after(':')->beforeLast(':'); - $source = $name; - $volume = "$source:$target"; - } elseif (is_array($volume)) { - data_set($volume, 'source', $name); - } - $topLevel->get('volumes')->put($name, [ - 'name' => $name, - ]); - LocalPersistentVolume::updateOrCreate( - [ - 'name' => $name, - 'resource_id' => $originalResource->id, - 'resource_type' => get_class($originalResource), - ], - [ - 'name' => $name, - 'mount_path' => $target, - 'resource_id' => $originalResource->id, - 'resource_type' => get_class($originalResource), - ] - ); - } - dispatch(new ServerFilesFromServerJob($originalResource)); - $volumesParsed->put($index, $volume); - } - } - - if ($depends_on?->count() > 0) { - if ($isApplication && $isPullRequest) { - $newDependsOn = collect([]); - $depends_on->each(function ($dependency, $condition) use ($pullRequestId, $newDependsOn) { - if (is_numeric($condition)) { - $dependency = "$dependency-pr-$pullRequestId"; - - $newDependsOn->put($condition, $dependency); - } else { - $condition = "$condition-pr-$pullRequestId"; - $newDependsOn->put($condition, $dependency); - } - }); - $depends_on = $newDependsOn; - } - } - if (! $use_network_mode) { - if ($topLevel->get('networks')?->count() > 0) { - foreach ($topLevel->get('networks') as $networkName => $network) { - if ($networkName === 'default') { - continue; - } - // ignore aliases - if ($network['aliases'] ?? false) { - continue; - } - $networkExists = $networks->contains(function ($value, $key) use ($networkName) { - return $value == $networkName || $key == $networkName; - }); - if (! $networkExists) { - $networks->put($networkName, null); - } - } - } - $baseNetworkExists = $networks->contains(function ($value, $_) use ($baseNetwork) { - return $value == $baseNetwork; - }); - if (! $baseNetworkExists) { - foreach ($baseNetwork as $network) { - $topLevel->get('networks')->put($network, [ - 'name' => $network, - 'external' => true, - ]); - } - } - } - - // Collect/create/update ports - $collectedPorts = collect([]); - if ($ports->count() > 0) { - foreach ($ports as $sport) { - if (is_string($sport) || is_numeric($sport)) { - $collectedPorts->push($sport); - } - if (is_array($sport)) { - $target = data_get($sport, 'target'); - $published = data_get($sport, 'published'); - $protocol = data_get($sport, 'protocol'); - $collectedPorts->push("$target:$published/$protocol"); - } - } - } - if ($isService) { - $originalResource->ports = $collectedPorts->implode(','); - $originalResource->save(); - } - - $networks_temp = collect(); - - if (! $use_network_mode) { - foreach ($networks as $key => $network) { - if (gettype($network) === 'string') { - // networks: - // - appwrite - $networks_temp->put($network, null); - } elseif (gettype($network) === 'array') { - // networks: - // default: - // ipv4_address: 192.168.203.254 - $networks_temp->put($key, $network); - } - } - foreach ($baseNetwork as $key => $network) { - $networks_temp->put($network, null); - } - - if ($isApplication) { - if (data_get($resource, 'settings.connect_to_docker_network')) { - $network = $resource->destination->network; - $networks_temp->put($network, null); - $topLevel->get('networks')->put($network, [ - 'name' => $network, - 'external' => true, - ]); - } - } - } - - $normalEnvironments = $environment->diffKeys($allMagicEnvironments); - $normalEnvironments = $normalEnvironments->filter(function ($value, $key) { - return ! str($value)->startsWith('SERVICE_'); - }); - - foreach ($normalEnvironments as $key => $value) { - $key = str($key); - $value = str($value); - $originalValue = $value; - $parsedValue = replaceVariables($value); - if ($value->startsWith('$SERVICE_')) { - $resource->environment_variables()->firstOrCreate([ - 'key' => $key, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - ], [ - 'value' => $value, - 'is_build_time' => false, - 'is_preview' => false, - ]); - - continue; - } - if (! $value->startsWith('$')) { - continue; - } - if ($key->value() === $parsedValue->value()) { - $value = null; - $resource->environment_variables()->firstOrCreate([ - 'key' => $key, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - ], [ - 'value' => $value, - 'is_build_time' => false, - 'is_preview' => false, - ]); - } else { - if ($value->startsWith('$')) { - $isRequired = false; - if ($value->contains(':-')) { - $value = replaceVariables($value); - $key = $value->before(':'); - $value = $value->after(':-'); - } elseif ($value->contains('-')) { - $value = replaceVariables($value); - - $key = $value->before('-'); - $value = $value->after('-'); - } elseif ($value->contains(':?')) { - $value = replaceVariables($value); - - $key = $value->before(':'); - $value = $value->after(':?'); - $isRequired = true; - } elseif ($value->contains('?')) { - $value = replaceVariables($value); - - $key = $value->before('?'); - $value = $value->after('?'); - $isRequired = true; - } - if ($originalValue->value() === $value->value()) { - // This means the variable does not have a default value, so it needs to be created in Coolify - $parsedKeyValue = replaceVariables($value); - $resource->environment_variables()->firstOrCreate([ - 'key' => $parsedKeyValue, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - ], [ - 'is_build_time' => false, - 'is_preview' => false, - 'is_required' => $isRequired, - ]); - // Add the variable to the environment so it will be shown in the deployable compose file - $environment[$parsedKeyValue->value()] = $resource->environment_variables()->where('key', $parsedKeyValue)->where('resourceable_type', get_class($resource))->where('resourceable_id', $resource->id)->first()->value; - - continue; - } - $resource->environment_variables()->firstOrCreate([ - 'key' => $key, - 'resourceable_type' => get_class($resource), - 'resourceable_id' => $resource->id, - ], [ - 'value' => $value, - 'is_build_time' => false, - 'is_preview' => false, - 'is_required' => $isRequired, - ]); - } - } - } - if ($isApplication) { - $branch = $originalResource->git_branch; - if ($pullRequestId !== 0) { - $branch = "pull/{$pullRequestId}/head"; - } - if ($originalResource->environment_variables->where('key', 'COOLIFY_BRANCH')->isEmpty()) { - $coolifyEnvironments->put('COOLIFY_BRANCH', "\"{$branch}\""); - } - } - - // Add COOLIFY_RESOURCE_UUID to environment - if ($resource->environment_variables->where('key', 'COOLIFY_RESOURCE_UUID')->isEmpty()) { - $coolifyEnvironments->put('COOLIFY_RESOURCE_UUID', "{$resource->uuid}"); - } - - // Add COOLIFY_CONTAINER_NAME to environment - if ($resource->environment_variables->where('key', 'COOLIFY_CONTAINER_NAME')->isEmpty()) { - $coolifyEnvironments->put('COOLIFY_CONTAINER_NAME', "{$containerName}"); - } - - if ($isApplication) { - $domains = collect(json_decode($resource->docker_compose_domains)) ?? collect([]); - $fqdns = data_get($domains, "$serviceName.domain"); - if ($fqdns) { - $fqdns = str($fqdns)->explode(','); - if ($isPullRequest) { - $preview = $resource->previews()->find($preview_id); - $docker_compose_domains = collect(json_decode(data_get($preview, 'docker_compose_domains'))); - if ($docker_compose_domains->count() > 0) { - $found_fqdn = data_get($docker_compose_domains, "$serviceName.domain"); - if ($found_fqdn) { - $fqdns = collect($found_fqdn); - } else { - $fqdns = collect([]); - } - } else { - $fqdns = $fqdns->map(function ($fqdn) use ($pullRequestId, $resource) { - $preview = ApplicationPreview::findPreviewByApplicationAndPullId($resource->id, $pullRequestId); - $url = Url::fromString($fqdn); - $template = $resource->preview_url_template; - $host = $url->getHost(); - $schema = $url->getScheme(); - $random = new Cuid2; - $preview_fqdn = str_replace('{{random}}', $random, $template); - $preview_fqdn = str_replace('{{domain}}', $host, $preview_fqdn); - $preview_fqdn = str_replace('{{pr_id}}', $pullRequestId, $preview_fqdn); - $preview_fqdn = "$schema://$preview_fqdn"; - $preview->fqdn = $preview_fqdn; - $preview->save(); - - return $preview_fqdn; - }); - } - } - } - - $defaultLabels = defaultLabels( - id: $resource->id, - name: $containerName, - projectName: $resource->project()->name, - resourceName: $resource->name, - pull_request_id: $pullRequestId, - type: 'application', - environment: $resource->environment->name, - ); - } elseif ($isService) { - if ($savedService->serviceType()) { - $fqdns = generateServiceSpecificFqdns($savedService); - } else { - $fqdns = collect(data_get($savedService, 'fqdns'))->filter(); - } - - $defaultLabels = defaultLabels( - id: $resource->id, - name: $containerName, - projectName: $resource->project()->name, - resourceName: $resource->name, - type: 'service', - subType: $isDatabase ? 'database' : 'application', - subId: $savedService->id, - subName: $savedService->human_name ?? $savedService->name, - environment: $resource->environment->name, - ); - } - // Add COOLIFY_FQDN & COOLIFY_URL to environment - if (! $isDatabase && $fqdns instanceof Collection && $fqdns->count() > 0) { - $coolifyEnvironments->put('COOLIFY_URL', $fqdns->implode(',')); - - $urls = $fqdns->map(function ($fqdn) { - return str($fqdn)->replace('http://', '')->replace('https://', ''); - }); - $coolifyEnvironments->put('COOLIFY_FQDN', $urls->implode(',')); - } - add_coolify_default_environment_variables($resource, $coolifyEnvironments, $resource->environment_variables); - - if ($environment->count() > 0) { - $environment = $environment->filter(function ($value, $key) { - return ! str($key)->startsWith('SERVICE_FQDN_'); - })->map(function ($value, $key) use ($resource) { - // if value is empty, set it to null so if you set the environment variable in the .env file (Coolify's UI), it will used - if (str($value)->isEmpty()) { - if ($resource->environment_variables()->where('key', $key)->exists()) { - $value = $resource->environment_variables()->where('key', $key)->first()->value; - } else { - $value = null; - } - } - - return $value; - }); - } - $serviceLabels = $labels->merge($defaultLabels); - if ($serviceLabels->count() > 0) { - if ($isApplication) { - $isContainerLabelEscapeEnabled = data_get($resource, 'settings.is_container_label_escape_enabled'); - } else { - $isContainerLabelEscapeEnabled = data_get($resource, 'is_container_label_escape_enabled'); - } - if ($isContainerLabelEscapeEnabled) { - $serviceLabels = $serviceLabels->map(function ($value, $key) { - return escapeDollarSign($value); - }); - } - } - if (! $isDatabase && $fqdns instanceof Collection && $fqdns->count() > 0) { - if ($isApplication) { - $shouldGenerateLabelsExactly = $resource->destination->server->settings->generate_exact_labels; - $uuid = $resource->uuid; - $network = data_get($resource, 'destination.network'); - if ($isPullRequest) { - $uuid = "{$resource->uuid}-{$pullRequestId}"; - } - if ($isPullRequest) { - $network = "{$resource->destination->network}-{$pullRequestId}"; - } - } else { - $shouldGenerateLabelsExactly = $resource->server->settings->generate_exact_labels; - $uuid = $resource->uuid; - $network = data_get($resource, 'destination.network'); - } - if ($shouldGenerateLabelsExactly) { - switch ($server->proxyType()) { - case ProxyTypes::TRAEFIK->value: - $serviceLabels = $serviceLabels->merge(fqdnLabelsForTraefik( - uuid: $uuid, - domains: $fqdns, - is_force_https_enabled: true, - serviceLabels: $serviceLabels, - is_gzip_enabled: $originalResource->isGzipEnabled(), - is_stripprefix_enabled: $originalResource->isStripprefixEnabled(), - service_name: $serviceName, - image: $image - )); - break; - case ProxyTypes::CADDY->value: - $serviceLabels = $serviceLabels->merge(fqdnLabelsForCaddy( - network: $network, - uuid: $uuid, - domains: $fqdns, - is_force_https_enabled: true, - serviceLabels: $serviceLabels, - is_gzip_enabled: $originalResource->isGzipEnabled(), - is_stripprefix_enabled: $originalResource->isStripprefixEnabled(), - service_name: $serviceName, - image: $image, - predefinedPort: $predefinedPort - )); - break; - } - } else { - $serviceLabels = $serviceLabels->merge(fqdnLabelsForTraefik( - uuid: $uuid, - domains: $fqdns, - is_force_https_enabled: true, - serviceLabels: $serviceLabels, - is_gzip_enabled: $originalResource->isGzipEnabled(), - is_stripprefix_enabled: $originalResource->isStripprefixEnabled(), - service_name: $serviceName, - image: $image - )); - $serviceLabels = $serviceLabels->merge(fqdnLabelsForCaddy( - network: $network, - uuid: $uuid, - domains: $fqdns, - is_force_https_enabled: true, - serviceLabels: $serviceLabels, - is_gzip_enabled: $originalResource->isGzipEnabled(), - is_stripprefix_enabled: $originalResource->isStripprefixEnabled(), - service_name: $serviceName, - image: $image, - predefinedPort: $predefinedPort - )); - } - } - if ($isService) { - if (data_get($service, 'restart') === 'no' || data_get($service, 'exclude_from_hc')) { - $savedService->update(['exclude_from_status' => true]); - } - } - data_forget($service, 'volumes.*.content'); - data_forget($service, 'volumes.*.isDirectory'); - data_forget($service, 'volumes.*.is_directory'); - data_forget($service, 'exclude_from_hc'); - - $volumesParsed = $volumesParsed->map(function ($volume) { - data_forget($volume, 'content'); - data_forget($volume, 'is_directory'); - data_forget($volume, 'isDirectory'); - - return $volume; - }); - - $payload = collect($service)->merge([ - 'container_name' => $containerName, - 'restart' => $restart->value(), - 'labels' => $serviceLabels, - ]); - if (! $use_network_mode) { - $payload['networks'] = $networks_temp; - } - if ($ports->count() > 0) { - $payload['ports'] = $ports; - } - if ($volumesParsed->count() > 0) { - $payload['volumes'] = $volumesParsed; - } - if ($environment->count() > 0 || $coolifyEnvironments->count() > 0) { - $payload['environment'] = $environment->merge($coolifyEnvironments); - } - if ($logging) { - $payload['logging'] = $logging; - } - if ($depends_on->count() > 0) { - $payload['depends_on'] = $depends_on; - } - if ($isApplication && $isPullRequest) { - $serviceName = "{$serviceName}-pr-{$pullRequestId}"; - } - - $parsedServices->put($serviceName, $payload); - } - $topLevel->put('services', $parsedServices); - - $customOrder = ['services', 'volumes', 'networks', 'configs', 'secrets']; - - $topLevel = $topLevel->sortBy(function ($value, $key) use ($customOrder) { - return array_search($key, $customOrder); - }); - - $resource->docker_compose = Yaml::dump(convertToArray($topLevel), 10, 2); - data_forget($resource, 'environment_variables'); - data_forget($resource, 'environment_variables_preview'); - $resource->save(); - - return $topLevel; -} - -function generate_fluentd_configuration(): array -{ - return [ - 'driver' => 'fluentd', - 'options' => [ - 'fluentd-address' => 'tcp://127.0.0.1:24224', - 'fluentd-async' => 'true', - 'fluentd-sub-second-precision' => 'true', - // env vars are used in the LogDrain configurations - 'env' => 'COOLIFY_APP_NAME,COOLIFY_PROJECT_NAME,COOLIFY_SERVER_IP,COOLIFY_ENVIRONMENT_NAME', - ], - ]; -} - -function isAssociativeArray($array) -{ - if ($array instanceof Collection) { - $array = $array->toArray(); - } - - if (! is_array($array)) { - throw new \InvalidArgumentException('Input must be an array or a Collection.'); - } - - if ($array === []) { - return false; - } - - return array_keys($array) !== range(0, count($array) - 1); -} - -/** - * This method adds the default environment variables to the resource. - * - COOLIFY_APP_NAME - * - COOLIFY_PROJECT_NAME - * - COOLIFY_SERVER_IP - * - COOLIFY_ENVIRONMENT_NAME - * - * Theses variables are added in place to the $where_to_add array. - */ -function add_coolify_default_environment_variables(StandaloneRedis|StandalonePostgresql|StandaloneMongodb|StandaloneMysql|StandaloneMariadb|StandaloneKeydb|StandaloneDragonfly|StandaloneClickhouse|Application|Service $resource, Collection &$where_to_add, ?Collection $where_to_check = null) -{ - // Currently disabled - return; - if ($resource instanceof Service) { - $ip = $resource->server->ip; - } else { - $ip = $resource->destination->server->ip; - } - if (isAssociativeArray($where_to_add)) { - $isAssociativeArray = true; - } else { - $isAssociativeArray = false; - } - if ($where_to_check != null && $where_to_check->where('key', 'COOLIFY_APP_NAME')->isEmpty()) { - if ($isAssociativeArray) { - $where_to_add->put('COOLIFY_APP_NAME', "\"{$resource->name}\""); - } else { - $where_to_add->push("COOLIFY_APP_NAME=\"{$resource->name}\""); - } - } - if ($where_to_check != null && $where_to_check->where('key', 'COOLIFY_SERVER_IP')->isEmpty()) { - if ($isAssociativeArray) { - $where_to_add->put('COOLIFY_SERVER_IP', "\"{$ip}\""); - } else { - $where_to_add->push("COOLIFY_SERVER_IP=\"{$ip}\""); - } - } - if ($where_to_check != null && $where_to_check->where('key', 'COOLIFY_ENVIRONMENT_NAME')->isEmpty()) { - if ($isAssociativeArray) { - $where_to_add->put('COOLIFY_ENVIRONMENT_NAME', "\"{$resource->environment->name}\""); - } else { - $where_to_add->push("COOLIFY_ENVIRONMENT_NAME=\"{$resource->environment->name}\""); - } - } - if ($where_to_check != null && $where_to_check->where('key', 'COOLIFY_PROJECT_NAME')->isEmpty()) { - if ($isAssociativeArray) { - $where_to_add->put('COOLIFY_PROJECT_NAME', "\"{$resource->project()->name}\""); - } else { - $where_to_add->push("COOLIFY_PROJECT_NAME=\"{$resource->project()->name}\""); - } - } -} - -function convertToKeyValueCollection($environment) -{ - $convertedServiceVariables = collect([]); - if (isAssociativeArray($environment)) { - // Example: $environment = ['FOO' => 'bar', 'BAZ' => 'qux']; - if ($environment instanceof Collection) { - $changedEnvironment = collect([]); - $environment->each(function ($value, $key) use ($changedEnvironment) { - if (is_numeric($key)) { - $parts = explode('=', $value, 2); - if (count($parts) === 2) { - $key = $parts[0]; - $realValue = $parts[1] ?? ''; - $changedEnvironment->put($key, $realValue); - } else { - $changedEnvironment->put($key, $value); - } - } else { - $changedEnvironment->put($key, $value); - } - }); - - return $changedEnvironment; - } - $convertedServiceVariables = $environment; - } else { - // Example: $environment = ['FOO=bar', 'BAZ=qux']; - foreach ($environment as $value) { - if (is_string($value)) { - $parts = explode('=', $value, 2); - $key = $parts[0]; - $realValue = $parts[1] ?? ''; - if ($key) { - $convertedServiceVariables->put($key, $realValue); - } - } - } - } - - return $convertedServiceVariables; -} -function instanceSettings() -{ - return InstanceSettings::get(); -} - -function loadConfigFromGit(string $repository, string $branch, string $base_directory, int $server_id, int $team_id) -{ - $server = Server::find($server_id)->where('team_id', $team_id)->first(); - if (! $server) { - return; - } - $uuid = new Cuid2; - $cloneCommand = "git clone --no-checkout -b $branch $repository ."; - $workdir = rtrim($base_directory, '/'); - $fileList = collect([".$workdir/coolify.json"]); - $commands = collect([ - "rm -rf /tmp/{$uuid}", - "mkdir -p /tmp/{$uuid}", - "cd /tmp/{$uuid}", - $cloneCommand, - 'git sparse-checkout init --cone', - "git sparse-checkout set {$fileList->implode(' ')}", - 'git read-tree -mu HEAD', - "cat .$workdir/coolify.json", - 'rm -rf /tmp/{$uuid}', - ]); - try { - return instant_remote_process($commands, $server); - } catch (\Exception) { - // continue - } -} - -function loggy($message = null, array $context = []) -{ - if (! isDev()) { - return; - } - if (function_exists('ray') && config('app.debug')) { - ray($message, $context); - } - if (is_null($message)) { - return app('log'); - } - - return app('log')->debug($message, $context); -} -function sslipDomainWarning(string $domains) -{ - $domains = str($domains)->trim()->explode(','); - $showSslipHttpsWarning = false; - $domains->each(function ($domain) use (&$showSslipHttpsWarning) { - if (str($domain)->contains('https') && str($domain)->contains('sslip')) { - $showSslipHttpsWarning = true; - } - }); - - return $showSslipHttpsWarning; -} - -function isEmailRateLimited(string $limiterKey, int $decaySeconds = 3600, ?callable $callbackOnSuccess = null): bool -{ - if (isDev()) { - $decaySeconds = 120; - } - $rateLimited = false; - $executed = RateLimiter::attempt( - $limiterKey, - $maxAttempts = 0, - function () use (&$rateLimited, &$limiterKey, $callbackOnSuccess) { - isDev() && loggy('Rate limit not reached for '.$limiterKey); - $rateLimited = false; - - if ($callbackOnSuccess) { - $callbackOnSuccess(); - } - }, - $decaySeconds, - ); - if (! $executed) { - isDev() && loggy('Rate limit reached for '.$limiterKey.'. Rate limiter will be disabled for '.$decaySeconds.' seconds.'); - $rateLimited = true; - } - - return $rateLimited; -} - -function defaultNginxConfiguration(): string -{ - return 'server { - location / { - root /usr/share/nginx/html; - index index.html index.htm; - try_files $uri $uri.html $uri/index.html $uri/index.htm $uri/ =404; - } - - # Handle 404 errors - error_page 404 /404.html; - location = /404.html { - root /usr/share/nginx/html; - internal; - } - - # Handle server errors (50x) - error_page 500 502 503 504 /50x.html; - location = /50x.html { - root /usr/share/nginx/html; - internal; - } -}'; -} - -function convertGitUrl(string $gitRepository, string $deploymentType, ?GithubApp $source = null): array -{ - $repository = $gitRepository; - $providerInfo = [ - 'host' => null, - 'user' => 'git', - 'port' => 22, - 'repository' => $gitRepository, - ]; - $sshMatches = []; - $matches = []; - - // Let's try and parse the string to detect if it's a valid SSH string or not - preg_match('/((.*?)\:\/\/)?(.*@.*:.*)/', $gitRepository, $sshMatches); - - if ($deploymentType === 'deploy_key' && empty($sshMatches) && $source) { - // If this happens, the user may have provided an HTTP URL when they needed an SSH one - // Let's try and fix that for known Git providers - switch ($source->getMorphClass()) { - case \App\Models\GithubApp::class: - $providerInfo['host'] = Url::fromString($source->html_url)->getHost(); - $providerInfo['port'] = $source->custom_port; - $providerInfo['user'] = $source->custom_user; - break; - } - if (! empty($providerInfo['host'])) { - // Until we do not support more providers with App (like GithubApp), this will be always true, port will be 22 - if ($providerInfo['port'] === 22) { - $repository = "{$providerInfo['user']}@{$providerInfo['host']}:{$providerInfo['repository']}"; - } else { - $repository = "ssh://{$providerInfo['user']}@{$providerInfo['host']}:{$providerInfo['port']}/{$providerInfo['repository']}"; - } - } - } - - preg_match('/(?<=:)\d+(?=\/)/', $gitRepository, $matches); - - if (count($matches) === 1) { - $providerInfo['port'] = $matches[0]; - $gitHost = str($gitRepository)->before(':'); - $gitRepo = str($gitRepository)->after('/'); - $repository = "$gitHost:$gitRepo"; - } - - return [ - 'repository' => $repository, - 'port' => $providerInfo['port'], - ]; -} - -function getJobStatus(?string $jobId = null) -{ - if (blank($jobId)) { - return 'unknown'; - } - $jobFound = app(JobRepository::class)->getJobs([$jobId]); - if ($jobFound->isEmpty()) { - return 'unknown'; - } - - return $jobFound->first()->status; -} diff --git a/bootstrap/helpers/socialite.php b/bootstrap/helpers/socialite.php deleted file mode 100644 index 16870e33d3..0000000000 --- a/bootstrap/helpers/socialite.php +++ /dev/null @@ -1,61 +0,0 @@ -client_id, - $oauth_setting->client_secret, - $oauth_setting->redirect_uri, - ['tenant' => $oauth_setting->tenant], - ); - - return Socialite::driver('azure')->setConfig($azure_config); - } - - if ($provider == 'authentik') { - $authentik_config = new \SocialiteProviders\Manager\Config( - $oauth_setting->client_id, - $oauth_setting->client_secret, - $oauth_setting->redirect_uri, - ['base_url' => $oauth_setting->base_url], - ); - - return Socialite::driver('authentik')->setConfig($authentik_config); - } - - if ($provider == 'google') { - $google_config = new \SocialiteProviders\Manager\Config( - $oauth_setting->client_id, - $oauth_setting->client_secret, - $oauth_setting->redirect_uri - ); - - return Socialite::driver('google') - ->setConfig($google_config) - ->with(['hd' => $oauth_setting->tenant]); - } - - $config = [ - 'client_id' => $oauth_setting->client_id, - 'client_secret' => $oauth_setting->client_secret, - 'redirect' => $oauth_setting->redirect_uri, - ]; - - $provider_class_map = [ - 'bitbucket' => \Laravel\Socialite\Two\BitbucketProvider::class, - 'github' => \Laravel\Socialite\Two\GithubProvider::class, - 'gitlab' => \Laravel\Socialite\Two\GitlabProvider::class, - 'infomaniak' => \SocialiteProviders\Infomaniak\Provider::class, - ]; - - return Socialite::buildProvider( - $provider_class_map[$provider], - $config - ); -} diff --git a/bootstrap/helpers/subscriptions.php b/bootstrap/helpers/subscriptions.php deleted file mode 100644 index 510516a2f9..0000000000 --- a/bootstrap/helpers/subscriptions.php +++ /dev/null @@ -1,91 +0,0 @@ -subscription; - - if (is_null($subscription)) { - return false; - } - if (isStripe()) { - return $subscription->stripe_invoice_paid === true; - } - - return false; -} -function isSubscriptionOnGracePeriod() -{ - $team = currentTeam(); - if (! $team) { - return false; - } - $subscription = $team?->subscription; - if (! $subscription) { - return false; - } - if (isStripe()) { - return $subscription->stripe_cancel_at_period_end; - } - - return false; -} -function subscriptionProvider() -{ - return config('subscription.provider'); -} -function isStripe() -{ - return config('subscription.provider') === 'stripe'; -} -function getStripeCustomerPortalSession(Team $team) -{ - Stripe::setApiKey(config('subscription.stripe_api_key')); - $return_url = route('subscription.show'); - $stripe_customer_id = data_get($team, 'subscription.stripe_customer_id'); - if (! $stripe_customer_id) { - return null; - } - - return \Stripe\BillingPortal\Session::create([ - 'customer' => $stripe_customer_id, - 'return_url' => $return_url, - ]); -} -function allowedPathsForUnsubscribedAccounts() -{ - return [ - 'subscription/new', - 'login', - 'logout', - 'force-password-reset', - 'livewire/update', - 'admin', - ]; -} -function allowedPathsForBoardingAccounts() -{ - return [ - ...allowedPathsForUnsubscribedAccounts(), - 'onboarding', - 'livewire/update', - ]; -} -function allowedPathsForInvalidAccounts() -{ - return [ - 'logout', - 'verify', - 'force-password-reset', - 'livewire/update', - ]; -} diff --git a/bootstrap/helpers/timezone.php b/bootstrap/helpers/timezone.php deleted file mode 100644 index 96d9ba6cf2..0000000000 --- a/bootstrap/helpers/timezone.php +++ /dev/null @@ -1,42 +0,0 @@ -setTimezone(new \DateTimeZone($serverTimezone)); - } catch (\Exception) { - $dateObj->setTimezone(new \DateTimeZone('UTC')); - } - - return $dateObj->format('Y-m-d H:i:s T'); -} - -function calculateDuration($startDate, $endDate = null) -{ - if (! $endDate) { - return null; - } - - $start = new \DateTime($startDate); - $end = new \DateTime($endDate); - $interval = $start->diff($end); - - if ($interval->days > 0) { - return $interval->format('%dd %Hh %Im %Ss'); - } elseif ($interval->h > 0) { - return $interval->format('%Hh %Im %Ss'); - } else { - return $interval->format('%Im %Ss'); - } -} diff --git a/bootstrap/includeHelpers.php b/bootstrap/includeHelpers.php deleted file mode 100644 index fb6e84e997..0000000000 --- a/bootstrap/includeHelpers.php +++ /dev/null @@ -1,6 +0,0 @@ - -""" -# remove the leading and trailing s -trim = true -# postprocessors -postprocessors = [ - # { pattern = '', replace = "https://github.com/orhun/git-cliff" }, # replace repository URL -] -# render body even when there are no releases to process -# render_always = true -# output file path -# output = "test.md" - -[git] -# parse the commits based on https://www.conventionalcommits.org -conventional_commits = true -# filter out the commits that are not conventional -filter_unconventional = true -# process each line of a commit as an individual commit -split_commits = false -# regex for preprocessing the commit messages -commit_preprocessors = [ - # Replace issue numbers - #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))"}, - # Check spelling of the commit with https://github.com/crate-ci/typos - # If the spelling is incorrect, it will be automatically fixed. - #{ pattern = '.*', replace_command = 'typos --write-changes -' }, -] -# regex for parsing and grouping commits -commit_parsers = [ - { message = "^feat", group = "🚀 Features" }, - { message = "^fix", group = "🐛 Bug Fixes" }, - { message = "^doc", group = "📚 Documentation" }, - { message = "^perf", group = "⚡ Performance" }, - { message = "^refactor", group = "🚜 Refactor" }, - { message = "^style", group = "🎨 Styling" }, - { message = "^test", group = "🧪 Testing" }, - { message = "^chore\\(release\\): prepare for", skip = true }, - { message = "^chore\\(deps.*\\)", skip = true }, - { message = "^chore\\(pr\\)", skip = true }, - { message = "^chore\\(pull\\)", skip = true }, - { message = "^chore|^ci", group = "⚙️ Miscellaneous Tasks" }, - { body = ".*security", group = "🛡️ Security" }, - { message = "^revert", group = "◀️ Revert" }, - { message = ".*", group = "💼 Other" }, -] -# filter out the commits that are not matched by commit parsers -filter_commits = false -# sort the tags topologically -topo_order = false -# sort the commits inside sections by oldest/newest order -sort_commits = "oldest" diff --git a/composer.json b/composer.json index e5aeb61264..88b33c4d45 100644 --- a/composer.json +++ b/composer.json @@ -1,129 +1,74 @@ { - "name": "coollabsio/coolify", - "description": "The Coolify project.", - "license": "Apache-2.0", + "$schema": "https://getcomposer.org/schema.json", + "name": "laravel/laravel", "type": "project", + "description": "The skeleton application for the Laravel framework.", "keywords": [ - "coolify", - "deployment", - "docker", - "self-hosted", - "server" + "laravel", + "framework" ], + "license": "MIT", "require": { - "php": "^8.4", - "3sidedcube/laravel-redoc": "^1.0", - "danharrin/livewire-rate-limiting": "2.0.0", - "doctrine/dbal": "^4.2", - "guzzlehttp/guzzle": "^7.5.0", - "laravel/fortify": "^1.16.0", - "laravel/framework": "^11.0", - "laravel/horizon": "^5.29.1", - "laravel/pail": "^1.1", - "laravel/prompts": "^0.1.18|^0.2.0|^0.3.0", - "laravel/sanctum": "^4.0", - "laravel/socialite": "^5.14.0", - "laravel/tinker": "^2.8.1", - "laravel/ui": "^4.2", - "lcobucci/jwt": "^5.0.0", - "league/flysystem-aws-s3-v3": "^3.0", - "league/flysystem-sftp-v3": "^3.0", - "livewire/livewire": "^3.5", - "log1x/laravel-webfonts": "^1.0", - "lorisleiva/laravel-actions": "^2.8", - "nubs/random-name-generator": "^2.2", - "phpseclib/phpseclib": "^3.0", - "pion/laravel-chunk-upload": "^1.5", - "poliander/cron": "^3.0", - "purplepixie/phpdns": "^2.1", - "pusher/pusher-php-server": "^7.2", - "resend/resend-laravel": "^0.15.0", - "sentry/sentry-laravel": "^4.6", - "socialiteproviders/authentik": "^5.2", - "socialiteproviders/google": "^4.1", - "socialiteproviders/infomaniak": "^4.0", - "socialiteproviders/microsoft-azure": "^5.1", - "spatie/laravel-activitylog": "^4.7.3", - "spatie/laravel-data": "^4.11", - "spatie/laravel-ray": "^1.37", - "spatie/laravel-schemaless-attributes": "^2.4", - "spatie/url": "^2.2", - "stevebauman/purify": "^6.2", - "stripe/stripe-php": "^16.2.0", - "symfony/yaml": "^7.1.6", - "visus/cuid2": "^4.1.0", - "yosymfony/toml": "^1.0", - "zircote/swagger-php": "^5.0" + "php": "^8.2", + "laravel/framework": "^12.0", + "laravel/tinker": "^2.10.1" }, "require-dev": { - "barryvdh/laravel-debugbar": "^3.13", - "driftingly/rector-laravel": "^2.0", - "fakerphp/faker": "^1.21.0", - "laravel/dusk": "^8.0", - "laravel/pint": "^1.16", - "laravel/telescope": "^5.2", - "mockery/mockery": "^1.5.1", - "nunomaduro/collision": "^8.1", - "pestphp/pest": "^3.5", - "phpstan/phpstan": "^2.1", - "phpunit/phpunit": "^11.5", - "rector/rector": "^2.0", - "serversideup/spin": "^3.0", - "spatie/laravel-ignition": "^2.1.0", - "symfony/http-client": "^7.1" + "fakerphp/faker": "^1.23", + "laravel/pail": "^1.2.2", + "laravel/pint": "^1.13", + "laravel/sail": "^1.41", + "mockery/mockery": "^1.6", + "nunomaduro/collision": "^8.6", + "phpunit/phpunit": "^11.5.3" }, - "minimum-stability": "stable", - "prefer-stable": true, "autoload": { "psr-4": { "App\\": "app/", "Database\\Factories\\": "database/factories/", "Database\\Seeders\\": "database/seeders/" - }, - "files": [ - "bootstrap/includeHelpers.php" - ] + } }, "autoload-dev": { "psr-4": { "Tests\\": "tests/" } }, - "config": { - "allow-plugins": { - "pestphp/pest-plugin": true, - "php-http/discovery": true - }, - "optimize-autoloader": true, - "preferred-install": "dist", - "sort-packages": true - }, - "extra": { - "laravel": { - "dont-discover": [ - "laravel/telescope" - ] - } - }, "scripts": { - "post-install-cmd": [ - "cp -r 'hooks/' '.git/hooks/'", - "php -r \"copy('hooks/pre-commit', '.git/hooks/pre-commit');\"", - "php -r \"chmod('.git/hooks/pre-commit', 0777);\"" - ], - "post-update-cmd": [ - "@php artisan vendor:publish --tag=laravel-assets --ansi --force", - "Illuminate\\Foundation\\ComposerScripts::postUpdate" - ], "post-autoload-dump": [ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", "@php artisan package:discover --ansi" ], + "post-update-cmd": [ + "@php artisan vendor:publish --tag=laravel-assets --ansi --force" + ], "post-root-package-install": [ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" ], "post-create-project-cmd": [ - "@php artisan key:generate --ansi" + "@php artisan key:generate --ansi", + "@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"", + "@php artisan migrate --graceful --ansi" + ], + "dev": [ + "Composer\\Config::disableProcessTimeout", + "npx concurrently -c \"#93c5fd,#c4b5fd,#fb7185,#fdba74\" \"php artisan serve\" \"php artisan queue:listen --tries=1\" \"php artisan pail --timeout=0\" \"npm run dev\" --names=server,queue,logs,vite" ] - } -} + }, + "extra": { + "laravel": { + "dont-discover": [] + } + }, + "config": { + "optimize-autoloader": true, + "preferred-install": "dist", + "sort-packages": true, + "allow-plugins": { + "pestphp/pest-plugin": true, + "php-http/discovery": true + } + }, + "minimum-stability": "stable", + "prefer-stable": true +} \ No newline at end of file diff --git a/composer.lock b/composer.lock index 2a3fc1ddb8..0d359facc5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,1079 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "dcf6b2f554372a570628d7f85184df7b", + "content-hash": "88970a0117c062eed55fa8728fc43833", "packages": [ - { - "name": "3sidedcube/laravel-redoc", - "version": "v1.0.1", - "source": { - "type": "git", - "url": "https://github.com/3sidedcube/laravel-redoc.git", - "reference": "c33a563885dcdf1e0f623df5a56c106d130261da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/3sidedcube/laravel-redoc/zipball/c33a563885dcdf1e0f623df5a56c106d130261da", - "reference": "c33a563885dcdf1e0f623df5a56c106d130261da", - "shasum": "" - }, - "require": { - "illuminate/routing": "^8.0|^9.0|^10.0|^11.0", - "illuminate/support": "^8.0|^9.0|^10.0|^11.0", - "php": "^7.4|^8.0|^8.1|^8.2|^8.3" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.3", - "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "ThreeSidedCube\\LaravelRedoc\\RedocServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "ThreeSidedCube\\LaravelRedoc\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ben Sherred", - "role": "Developer" - } - ], - "description": "A lightweight package for rendering API documentation using OpenAPI and Redoc.", - "homepage": "https://github.com/3sidedcube/laravel-redoc", - "keywords": [ - "3sidedcube", - "laravel-redoc" - ], - "support": { - "issues": "https://github.com/3sidedcube/laravel-redoc/issues", - "source": "https://github.com/3sidedcube/laravel-redoc/tree/v1.0.1" - }, - "time": "2024-05-20T11:37:55+00:00" - }, - { - "name": "amphp/amp", - "version": "v3.1.0", - "source": { - "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9", - "reference": "7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "phpunit/phpunit": "^9", - "psalm/phar": "5.23.1" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php", - "src/Future/functions.php", - "src/Internal/functions.php" - ], - "psr-4": { - "Amp\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - } - ], - "description": "A non-blocking concurrency framework for PHP applications.", - "homepage": "https://amphp.org/amp", - "keywords": [ - "async", - "asynchronous", - "awaitable", - "concurrency", - "event", - "event-loop", - "future", - "non-blocking", - "promise" - ], - "support": { - "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v3.1.0" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2025-01-26T16:07:39+00:00" - }, - { - "name": "amphp/byte-stream", - "version": "v2.1.1", - "source": { - "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "daa00f2efdbd71565bf64ffefa89e37542addf93" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/daa00f2efdbd71565bf64ffefa89e37542addf93", - "reference": "daa00f2efdbd71565bf64ffefa89e37542addf93", - "shasum": "" - }, - "require": { - "amphp/amp": "^3", - "amphp/parser": "^1.1", - "amphp/pipeline": "^1", - "amphp/serialization": "^1", - "amphp/sync": "^2", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2.3" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "5.22.1" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php", - "src/Internal/functions.php" - ], - "psr-4": { - "Amp\\ByteStream\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A stream abstraction to make working with non-blocking I/O simple.", - "homepage": "https://amphp.org/byte-stream", - "keywords": [ - "amp", - "amphp", - "async", - "io", - "non-blocking", - "stream" - ], - "support": { - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/v2.1.1" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-02-17T04:49:38+00:00" - }, - { - "name": "amphp/cache", - "version": "v2.0.1", - "source": { - "type": "git", - "url": "https://github.com/amphp/cache.git", - "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/cache/zipball/46912e387e6aa94933b61ea1ead9cf7540b7797c", - "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c", - "shasum": "" - }, - "require": { - "amphp/amp": "^3", - "amphp/serialization": "^1", - "amphp/sync": "^2", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Amp\\Cache\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - } - ], - "description": "A fiber-aware cache API based on Amp and Revolt.", - "homepage": "https://amphp.org/cache", - "support": { - "issues": "https://github.com/amphp/cache/issues", - "source": "https://github.com/amphp/cache/tree/v2.0.1" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-04-19T03:38:06+00:00" - }, - { - "name": "amphp/dns", - "version": "v2.4.0", - "source": { - "type": "git", - "url": "https://github.com/amphp/dns.git", - "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/dns/zipball/78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", - "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", - "shasum": "" - }, - "require": { - "amphp/amp": "^3", - "amphp/byte-stream": "^2", - "amphp/cache": "^2", - "amphp/parser": "^1", - "amphp/process": "^2", - "daverandom/libdns": "^2.0.2", - "ext-filter": "*", - "ext-json": "*", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "5.20" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Amp\\Dns\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Wright", - "email": "addr@daverandom.com" - }, - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - } - ], - "description": "Async DNS resolution for Amp.", - "homepage": "https://github.com/amphp/dns", - "keywords": [ - "amp", - "amphp", - "async", - "client", - "dns", - "resolve" - ], - "support": { - "issues": "https://github.com/amphp/dns/issues", - "source": "https://github.com/amphp/dns/tree/v2.4.0" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2025-01-19T15:43:40+00:00" - }, - { - "name": "amphp/parallel", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/amphp/parallel.git", - "reference": "5113111de02796a782f5d90767455e7391cca190" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/parallel/zipball/5113111de02796a782f5d90767455e7391cca190", - "reference": "5113111de02796a782f5d90767455e7391cca190", - "shasum": "" - }, - "require": { - "amphp/amp": "^3", - "amphp/byte-stream": "^2", - "amphp/cache": "^2", - "amphp/parser": "^1", - "amphp/pipeline": "^1", - "amphp/process": "^2", - "amphp/serialization": "^1", - "amphp/socket": "^2", - "amphp/sync": "^2", - "php": ">=8.1", - "revolt/event-loop": "^1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.18" - }, - "type": "library", - "autoload": { - "files": [ - "src/Context/functions.php", - "src/Context/Internal/functions.php", - "src/Ipc/functions.php", - "src/Worker/functions.php" - ], - "psr-4": { - "Amp\\Parallel\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Stephen Coakley", - "email": "me@stephencoakley.com" - } - ], - "description": "Parallel processing component for Amp.", - "homepage": "https://github.com/amphp/parallel", - "keywords": [ - "async", - "asynchronous", - "concurrent", - "multi-processing", - "multi-threading" - ], - "support": { - "issues": "https://github.com/amphp/parallel/issues", - "source": "https://github.com/amphp/parallel/tree/v2.3.1" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-12-21T01:56:09+00:00" - }, - { - "name": "amphp/parser", - "version": "v1.1.1", - "source": { - "type": "git", - "url": "https://github.com/amphp/parser.git", - "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7", - "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7", - "shasum": "" - }, - "require": { - "php": ">=7.4" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Amp\\Parser\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A generator parser to make streaming parsers simple.", - "homepage": "https://github.com/amphp/parser", - "keywords": [ - "async", - "non-blocking", - "parser", - "stream" - ], - "support": { - "issues": "https://github.com/amphp/parser/issues", - "source": "https://github.com/amphp/parser/tree/v1.1.1" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-03-21T19:16:53+00:00" - }, - { - "name": "amphp/pipeline", - "version": "v1.2.2", - "source": { - "type": "git", - "url": "https://github.com/amphp/pipeline.git", - "reference": "97cbf289f4d8877acfe58dd90ed5a4370a43caa4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/pipeline/zipball/97cbf289f4d8877acfe58dd90ed5a4370a43caa4", - "reference": "97cbf289f4d8877acfe58dd90ed5a4370a43caa4", - "shasum": "" - }, - "require": { - "amphp/amp": "^3", - "php": ">=8.1", - "revolt/event-loop": "^1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.18" - }, - "type": "library", - "autoload": { - "psr-4": { - "Amp\\Pipeline\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Asynchronous iterators and operators.", - "homepage": "https://amphp.org/pipeline", - "keywords": [ - "amp", - "amphp", - "async", - "io", - "iterator", - "non-blocking" - ], - "support": { - "issues": "https://github.com/amphp/pipeline/issues", - "source": "https://github.com/amphp/pipeline/tree/v1.2.2" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2025-01-19T15:42:46+00:00" - }, - { - "name": "amphp/process", - "version": "v2.0.3", - "source": { - "type": "git", - "url": "https://github.com/amphp/process.git", - "reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/process/zipball/52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d", - "reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d", - "shasum": "" - }, - "require": { - "amphp/amp": "^3", - "amphp/byte-stream": "^2", - "amphp/sync": "^2", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.4" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Amp\\Process\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A fiber-aware process manager based on Amp and Revolt.", - "homepage": "https://amphp.org/process", - "support": { - "issues": "https://github.com/amphp/process/issues", - "source": "https://github.com/amphp/process/tree/v2.0.3" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-04-19T03:13:44+00:00" - }, - { - "name": "amphp/serialization", - "version": "v1.0.0", - "source": { - "type": "git", - "url": "https://github.com/amphp/serialization.git", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "phpunit/phpunit": "^9 || ^8 || ^7" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Amp\\Serialization\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Serialization tools for IPC and data storage in PHP.", - "homepage": "https://github.com/amphp/serialization", - "keywords": [ - "async", - "asynchronous", - "serialization", - "serialize" - ], - "support": { - "issues": "https://github.com/amphp/serialization/issues", - "source": "https://github.com/amphp/serialization/tree/master" - }, - "time": "2020-03-25T21:39:07+00:00" - }, - { - "name": "amphp/socket", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/amphp/socket.git", - "reference": "58e0422221825b79681b72c50c47a930be7bf1e1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/socket/zipball/58e0422221825b79681b72c50c47a930be7bf1e1", - "reference": "58e0422221825b79681b72c50c47a930be7bf1e1", - "shasum": "" - }, - "require": { - "amphp/amp": "^3", - "amphp/byte-stream": "^2", - "amphp/dns": "^2", - "ext-openssl": "*", - "kelunik/certificate": "^1.1", - "league/uri": "^6.5 | ^7", - "league/uri-interfaces": "^2.3 | ^7", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "amphp/process": "^2", - "phpunit/phpunit": "^9", - "psalm/phar": "5.20" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php", - "src/Internal/functions.php", - "src/SocketAddress/functions.php" - ], - "psr-4": { - "Amp\\Socket\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@gmail.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Non-blocking socket connection / server implementations based on Amp and Revolt.", - "homepage": "https://github.com/amphp/socket", - "keywords": [ - "amp", - "async", - "encryption", - "non-blocking", - "sockets", - "tcp", - "tls" - ], - "support": { - "issues": "https://github.com/amphp/socket/issues", - "source": "https://github.com/amphp/socket/tree/v2.3.1" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-04-21T14:33:03+00:00" - }, - { - "name": "amphp/sync", - "version": "v2.3.0", - "source": { - "type": "git", - "url": "https://github.com/amphp/sync.git", - "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/sync/zipball/217097b785130d77cfcc58ff583cf26cd1770bf1", - "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1", - "shasum": "" - }, - "require": { - "amphp/amp": "^3", - "amphp/pipeline": "^1", - "amphp/serialization": "^1", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "5.23" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Amp\\Sync\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Stephen Coakley", - "email": "me@stephencoakley.com" - } - ], - "description": "Non-blocking synchronization primitives for PHP based on Amp and Revolt.", - "homepage": "https://github.com/amphp/sync", - "keywords": [ - "async", - "asynchronous", - "mutex", - "semaphore", - "synchronization" - ], - "support": { - "issues": "https://github.com/amphp/sync/issues", - "source": "https://github.com/amphp/sync/tree/v2.3.0" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-08-03T19:31:26+00:00" - }, - { - "name": "aws/aws-crt-php", - "version": "v1.2.7", - "source": { - "type": "git", - "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/d71d9906c7bb63a28295447ba12e74723bd3730e", - "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35||^5.6.3||^9.5", - "yoast/phpunit-polyfills": "^1.0" - }, - "suggest": { - "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality." - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "AWS SDK Common Runtime Team", - "email": "aws-sdk-common-runtime@amazon.com" - } - ], - "description": "AWS Common Runtime for PHP", - "homepage": "https://github.com/awslabs/aws-crt-php", - "keywords": [ - "amazon", - "aws", - "crt", - "sdk" - ], - "support": { - "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.7" - }, - "time": "2024-10-18T22:15:13+00:00" - }, - { - "name": "aws/aws-sdk-php", - "version": "3.339.19", - "source": { - "type": "git", - "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "18f05efe983860ad899082e04c13f06ec9fd6e41" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/18f05efe983860ad899082e04c13f06ec9fd6e41", - "reference": "18f05efe983860ad899082e04c13f06ec9fd6e41", - "shasum": "" - }, - "require": { - "aws/aws-crt-php": "^1.2.3", - "ext-json": "*", - "ext-pcre": "*", - "ext-simplexml": "*", - "guzzlehttp/guzzle": "^7.4.5", - "guzzlehttp/promises": "^2.0", - "guzzlehttp/psr7": "^2.4.5", - "mtdowling/jmespath.php": "^2.8.0", - "php": ">=8.1", - "psr/http-message": "^2.0" - }, - "require-dev": { - "andrewsville/php-token-reflection": "^1.4", - "aws/aws-php-sns-message-validator": "~1.0", - "behat/behat": "~3.0", - "composer/composer": "^2.7.8", - "dms/phpunit-arraysubset-asserts": "^0.4.0", - "doctrine/cache": "~1.4", - "ext-dom": "*", - "ext-openssl": "*", - "ext-pcntl": "*", - "ext-sockets": "*", - "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", - "psr/cache": "^2.0 || ^3.0", - "psr/simple-cache": "^2.0 || ^3.0", - "sebastian/comparator": "^1.2.3 || ^4.0 || ^5.0", - "symfony/filesystem": "^v6.4.0 || ^v7.1.0", - "yoast/phpunit-polyfills": "^2.0" - }, - "suggest": { - "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", - "doctrine/cache": "To use the DoctrineCacheAdapter", - "ext-curl": "To send requests using cURL", - "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", - "ext-sockets": "To use client-side monitoring" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Aws\\": "src/" - }, - "exclude-from-classmap": [ - "src/data/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Amazon Web Services", - "homepage": "http://aws.amazon.com" - } - ], - "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", - "homepage": "http://aws.amazon.com/sdkforphp", - "keywords": [ - "amazon", - "aws", - "cloud", - "dynamodb", - "ec2", - "glacier", - "s3", - "sdk" - ], - "support": { - "forum": "https://github.com/aws/aws-sdk-php/discussions", - "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.339.19" - }, - "time": "2025-02-21T19:13:15+00:00" - }, - { - "name": "bacon/bacon-qr-code", - "version": "v3.0.1", - "source": { - "type": "git", - "url": "https://github.com/Bacon/BaconQrCode.git", - "reference": "f9cc1f52b5a463062251d666761178dbdb6b544f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/f9cc1f52b5a463062251d666761178dbdb6b544f", - "reference": "f9cc1f52b5a463062251d666761178dbdb6b544f", - "shasum": "" - }, - "require": { - "dasprid/enum": "^1.0.3", - "ext-iconv": "*", - "php": "^8.1" - }, - "require-dev": { - "phly/keep-a-changelog": "^2.12", - "phpunit/phpunit": "^10.5.11 || 11.0.4", - "spatie/phpunit-snapshot-assertions": "^5.1.5", - "squizlabs/php_codesniffer": "^3.9" - }, - "suggest": { - "ext-imagick": "to generate QR code images" - }, - "type": "library", - "autoload": { - "psr-4": { - "BaconQrCode\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Ben Scholzen 'DASPRiD'", - "email": "mail@dasprids.de", - "homepage": "https://dasprids.de/", - "role": "Developer" - } - ], - "description": "BaconQrCode is a QR code generator for PHP.", - "homepage": "https://github.com/Bacon/BaconQrCode", - "support": { - "issues": "https://github.com/Bacon/BaconQrCode/issues", - "source": "https://github.com/Bacon/BaconQrCode/tree/v3.0.1" - }, - "time": "2024-10-01T13:55:55+00:00" - }, { "name": "brick/math", "version": "0.12.3", @@ -1206,154 +135,6 @@ ], "time": "2024-02-09T16:56:22+00:00" }, - { - "name": "danharrin/livewire-rate-limiting", - "version": "v2.0.0", - "source": { - "type": "git", - "url": "https://github.com/danharrin/livewire-rate-limiting.git", - "reference": "0d9c1890174b3d1857dba6ce76de7c178fe20283" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/danharrin/livewire-rate-limiting/zipball/0d9c1890174b3d1857dba6ce76de7c178fe20283", - "reference": "0d9c1890174b3d1857dba6ce76de7c178fe20283", - "shasum": "" - }, - "require": { - "illuminate/support": "^9.0|^10.0|^11.0", - "php": "^8.0" - }, - "require-dev": { - "livewire/livewire": "^3.0", - "livewire/volt": "^1.3", - "orchestra/testbench": "^7.0|^8.0|^9.0", - "phpunit/phpunit": "^9.0|^10.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "DanHarrin\\LivewireRateLimiting\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Dan Harrin", - "email": "dan@danharrin.com" - } - ], - "description": "Apply rate limiters to Laravel Livewire actions.", - "homepage": "https://github.com/danharrin/livewire-rate-limiting", - "support": { - "issues": "https://github.com/danharrin/livewire-rate-limiting/issues", - "source": "https://github.com/danharrin/livewire-rate-limiting" - }, - "funding": [ - { - "url": "https://github.com/danharrin", - "type": "github" - } - ], - "time": "2024-11-24T16:57:47+00:00" - }, - { - "name": "dasprid/enum", - "version": "1.0.6", - "source": { - "type": "git", - "url": "https://github.com/DASPRiD/Enum.git", - "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/8dfd07c6d2cf31c8da90c53b83c026c7696dda90", - "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90", - "shasum": "" - }, - "require": { - "php": ">=7.1 <9.0" - }, - "require-dev": { - "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", - "squizlabs/php_codesniffer": "*" - }, - "type": "library", - "autoload": { - "psr-4": { - "DASPRiD\\Enum\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Ben Scholzen 'DASPRiD'", - "email": "mail@dasprids.de", - "homepage": "https://dasprids.de/", - "role": "Developer" - } - ], - "description": "PHP 7.1 enum implementation", - "keywords": [ - "enum", - "map" - ], - "support": { - "issues": "https://github.com/DASPRiD/Enum/issues", - "source": "https://github.com/DASPRiD/Enum/tree/1.0.6" - }, - "time": "2024-08-09T14:30:48+00:00" - }, - { - "name": "daverandom/libdns", - "version": "v2.1.0", - "source": { - "type": "git", - "url": "https://github.com/DaveRandom/LibDNS.git", - "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/DaveRandom/LibDNS/zipball/b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", - "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "Required for IDN support" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "LibDNS\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "DNS protocol implementation written in pure PHP", - "keywords": [ - "dns" - ], - "support": { - "issues": "https://github.com/DaveRandom/LibDNS/issues", - "source": "https://github.com/DaveRandom/LibDNS/tree/v2.1.0" - }, - "time": "2024-04-12T12:12:48+00:00" - }, { "name": "dflydev/dot-access-data", "version": "v3.0.3", @@ -1429,157 +210,6 @@ }, "time": "2024-07-08T12:26:09+00:00" }, - { - "name": "doctrine/dbal", - "version": "4.2.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "19a2b7deb5fe8c2df0ff817ecea305e50acb62ec" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/19a2b7deb5fe8c2df0ff817ecea305e50acb62ec", - "reference": "19a2b7deb5fe8c2df0ff817ecea305e50acb62ec", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^0.5.3|^1", - "php": "^8.1", - "psr/cache": "^1|^2|^3", - "psr/log": "^1|^2|^3" - }, - "require-dev": { - "doctrine/coding-standard": "12.0.0", - "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2023.2", - "phpstan/phpstan": "2.1.1", - "phpstan/phpstan-phpunit": "2.0.3", - "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "10.5.39", - "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.10.2", - "symfony/cache": "^6.3.8|^7.0", - "symfony/console": "^5.4|^6.3|^7.0" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\DBAL\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", - "homepage": "https://www.doctrine-project.org/projects/dbal.html", - "keywords": [ - "abstraction", - "database", - "db2", - "dbal", - "mariadb", - "mssql", - "mysql", - "oci8", - "oracle", - "pdo", - "pgsql", - "postgresql", - "queryobject", - "sasql", - "sql", - "sqlite", - "sqlserver", - "sqlsrv" - ], - "support": { - "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.2.2" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", - "type": "tidelift" - } - ], - "time": "2025-01-16T08:40:56+00:00" - }, - { - "name": "doctrine/deprecations", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9", - "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9 || ^12", - "phpstan/phpstan": "1.4.10 || 2.0.3", - "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psr/log": "^1 || ^2 || ^3" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", - "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.4" - }, - "time": "2024-12-07T21:18:45+00:00" - }, { "name": "doctrine/inflector", "version": "2.0.10", @@ -1880,130 +510,6 @@ ], "time": "2024-12-27T00:36:43+00:00" }, - { - "name": "ezyang/htmlpurifier", - "version": "v4.18.0", - "source": { - "type": "git", - "url": "https://github.com/ezyang/htmlpurifier.git", - "reference": "cb56001e54359df7ae76dc522d08845dc741621b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/cb56001e54359df7ae76dc522d08845dc741621b", - "reference": "cb56001e54359df7ae76dc522d08845dc741621b", - "shasum": "" - }, - "require": { - "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" - }, - "require-dev": { - "cerdic/css-tidy": "^1.7 || ^2.0", - "simpletest/simpletest": "dev-master" - }, - "suggest": { - "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", - "ext-bcmath": "Used for unit conversion and imagecrash protection", - "ext-iconv": "Converts text to and from non-UTF-8 encodings", - "ext-tidy": "Used for pretty-printing HTML" - }, - "type": "library", - "autoload": { - "files": [ - "library/HTMLPurifier.composer.php" - ], - "psr-0": { - "HTMLPurifier": "library/" - }, - "exclude-from-classmap": [ - "/library/HTMLPurifier/Language/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-or-later" - ], - "authors": [ - { - "name": "Edward Z. Yang", - "email": "admin@htmlpurifier.org", - "homepage": "http://ezyang.com" - } - ], - "description": "Standards compliant HTML filter written in PHP", - "homepage": "http://htmlpurifier.org/", - "keywords": [ - "html" - ], - "support": { - "issues": "https://github.com/ezyang/htmlpurifier/issues", - "source": "https://github.com/ezyang/htmlpurifier/tree/v4.18.0" - }, - "time": "2024-11-01T03:51:45+00:00" - }, - { - "name": "firebase/php-jwt", - "version": "v6.11.0", - "source": { - "type": "git", - "url": "https://github.com/firebase/php-jwt.git", - "reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/8f718f4dfc9c5d5f0c994cdfd103921b43592712", - "reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712", - "shasum": "" - }, - "require": { - "php": "^8.0" - }, - "require-dev": { - "guzzlehttp/guzzle": "^7.4", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.5", - "psr/cache": "^2.0||^3.0", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0" - }, - "suggest": { - "ext-sodium": "Support EdDSA (Ed25519) signatures", - "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" - }, - "type": "library", - "autoload": { - "psr-4": { - "Firebase\\JWT\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Neuman Vong", - "email": "neuman+pear@twilio.com", - "role": "Developer" - }, - { - "name": "Anant Narayanan", - "email": "anant@php.net", - "role": "Developer" - } - ], - "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", - "homepage": "https://github.com/firebase/php-jwt", - "keywords": [ - "jwt", - "php" - ], - "support": { - "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.11.0" - }, - "time": "2025-01-23T05:11:06+00:00" - }, { "name": "fruitcake/php-cors", "version": "v1.3.0", @@ -2548,204 +1054,22 @@ ], "time": "2025-02-03T10:55:03+00:00" }, - { - "name": "jean85/pretty-package-versions", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", - "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.1.0", - "php": "^7.4|^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.2", - "jean85/composer-provided-replaced-stub-package": "^1.0", - "phpstan/phpstan": "^1.4", - "phpunit/phpunit": "^7.5|^8.5|^9.6", - "vimeo/psalm": "^4.3 || ^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Jean85\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alessandro Lai", - "email": "alessandro.lai85@gmail.com" - } - ], - "description": "A library to get pretty versions strings of installed dependencies", - "keywords": [ - "composer", - "package", - "release", - "versions" - ], - "support": { - "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.0" - }, - "time": "2024-11-18T16:19:46+00:00" - }, - { - "name": "kelunik/certificate", - "version": "v1.1.3", - "source": { - "type": "git", - "url": "https://github.com/kelunik/certificate.git", - "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kelunik/certificate/zipball/7e00d498c264d5eb4f78c69f41c8bd6719c0199e", - "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e", - "shasum": "" - }, - "require": { - "ext-openssl": "*", - "php": ">=7.0" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "phpunit/phpunit": "^6 | 7 | ^8 | ^9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Kelunik\\Certificate\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Access certificate details and transform between different formats.", - "keywords": [ - "DER", - "certificate", - "certificates", - "openssl", - "pem", - "x509" - ], - "support": { - "issues": "https://github.com/kelunik/certificate/issues", - "source": "https://github.com/kelunik/certificate/tree/v1.1.3" - }, - "time": "2023-02-03T21:26:53+00:00" - }, - { - "name": "laravel/fortify", - "version": "v1.25.4", - "source": { - "type": "git", - "url": "https://github.com/laravel/fortify.git", - "reference": "f185600e2d3a861834ad00ee3b7863f26ac25d3f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/fortify/zipball/f185600e2d3a861834ad00ee3b7863f26ac25d3f", - "reference": "f185600e2d3a861834ad00ee3b7863f26ac25d3f", - "shasum": "" - }, - "require": { - "bacon/bacon-qr-code": "^3.0", - "ext-json": "*", - "illuminate/support": "^10.0|^11.0|^12.0", - "php": "^8.1", - "pragmarx/google2fa": "^8.0", - "symfony/console": "^6.0|^7.0" - }, - "require-dev": { - "mockery/mockery": "^1.0", - "orchestra/testbench": "^8.16|^9.0|^10.0", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.4|^11.3" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Laravel\\Fortify\\FortifyServiceProvider" - ] - }, - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Laravel\\Fortify\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "Backend controllers and scaffolding for Laravel authentication.", - "keywords": [ - "auth", - "laravel" - ], - "support": { - "issues": "https://github.com/laravel/fortify/issues", - "source": "https://github.com/laravel/fortify" - }, - "time": "2025-01-26T19:34:46+00:00" - }, { "name": "laravel/framework", - "version": "v11.44.1", + "version": "v12.2.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "0883d4175f4e2b5c299e7087ad3c74f2ce195c6d" + "reference": "2fb06941bc69ea92f28b2888535ab144ee006889" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/0883d4175f4e2b5c299e7087ad3c74f2ce195c6d", - "reference": "0883d4175f4e2b5c299e7087ad3c74f2ce195c6d", + "url": "https://api.github.com/repos/laravel/framework/zipball/2fb06941bc69ea92f28b2888535ab144ee006889", + "reference": "2fb06941bc69ea92f28b2888535ab144ee006889", "shasum": "" }, "require": { - "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", + "brick/math": "^0.11|^0.12", "composer-runtime-api": "^2.2", "doctrine/inflector": "^2.0.5", "dragonmantank/cron-expression": "^3.4", @@ -2760,32 +1084,32 @@ "fruitcake/php-cors": "^1.3", "guzzlehttp/guzzle": "^7.8.2", "guzzlehttp/uri-template": "^1.0", - "laravel/prompts": "^0.1.18|^0.2.0|^0.3.0", + "laravel/prompts": "^0.3.0", "laravel/serializable-closure": "^1.3|^2.0", "league/commonmark": "^2.6", "league/flysystem": "^3.25.1", "league/flysystem-local": "^3.25.1", "league/uri": "^7.5.1", "monolog/monolog": "^3.0", - "nesbot/carbon": "^2.72.6|^3.8.4", + "nesbot/carbon": "^3.8.4", "nunomaduro/termwind": "^2.0", "php": "^8.2", "psr/container": "^1.1.1|^2.0.1", "psr/log": "^1.0|^2.0|^3.0", "psr/simple-cache": "^1.0|^2.0|^3.0", "ramsey/uuid": "^4.7", - "symfony/console": "^7.0.3", - "symfony/error-handler": "^7.0.3", - "symfony/finder": "^7.0.3", + "symfony/console": "^7.2.0", + "symfony/error-handler": "^7.2.0", + "symfony/finder": "^7.2.0", "symfony/http-foundation": "^7.2.0", - "symfony/http-kernel": "^7.0.3", - "symfony/mailer": "^7.0.3", - "symfony/mime": "^7.0.3", + "symfony/http-kernel": "^7.2.0", + "symfony/mailer": "^7.2.0", + "symfony/mime": "^7.2.0", "symfony/polyfill-php83": "^1.31", - "symfony/process": "^7.0.3", - "symfony/routing": "^7.0.3", - "symfony/uid": "^7.0.3", - "symfony/var-dumper": "^7.0.3", + "symfony/process": "^7.2.0", + "symfony/routing": "^7.2.0", + "symfony/uid": "^7.2.0", + "symfony/var-dumper": "^7.2.0", "tijsverkoyen/css-to-inline-styles": "^2.2.5", "vlucas/phpdotenv": "^5.6.1", "voku/portable-ascii": "^2.0.2" @@ -2849,17 +1173,17 @@ "league/flysystem-read-only": "^3.25.1", "league/flysystem-sftp-v3": "^3.25.1", "mockery/mockery": "^1.6.10", - "orchestra/testbench-core": "^9.11.2", + "orchestra/testbench-core": "^10.0.0", "pda/pheanstalk": "^5.0.6", "php-http/discovery": "^1.15", "phpstan/phpstan": "^2.0", - "phpunit/phpunit": "^10.5.35|^11.3.6|^12.0.1", + "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", "predis/predis": "^2.3", "resend/resend-php": "^0.10.0", - "symfony/cache": "^7.0.3", - "symfony/http-client": "^7.0.3", - "symfony/psr-http-message-bridge": "^7.0.3", - "symfony/translation": "^7.0.3" + "symfony/cache": "^7.2.0", + "symfony/http-client": "^7.2.0", + "symfony/psr-http-message-bridge": "^7.2.0", + "symfony/translation": "^7.2.0" }, "suggest": { "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", @@ -2885,22 +1209,22 @@ "mockery/mockery": "Required to use mocking (^1.6).", "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", - "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.3.6|^12.0.1).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).", "predis/predis": "Required to use the predis connector (^2.3).", "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^7.0).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^7.0).", - "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.0).", - "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.0).", - "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.0).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.0)." + "symfony/cache": "Required to PSR-6 cache bridge (^7.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.2)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "12.x-dev" } }, "autoload": { @@ -2943,165 +1267,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-03-05T15:34:10+00:00" - }, - { - "name": "laravel/horizon", - "version": "v5.30.3", - "source": { - "type": "git", - "url": "https://github.com/laravel/horizon.git", - "reference": "7b9ee870bf0e425b956fd0433f616f98fe951f72" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/horizon/zipball/7b9ee870bf0e425b956fd0433f616f98fe951f72", - "reference": "7b9ee870bf0e425b956fd0433f616f98fe951f72", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-pcntl": "*", - "ext-posix": "*", - "illuminate/contracts": "^9.21|^10.0|^11.0|^12.0", - "illuminate/queue": "^9.21|^10.0|^11.0|^12.0", - "illuminate/support": "^9.21|^10.0|^11.0|^12.0", - "nesbot/carbon": "^2.17|^3.0", - "php": "^8.0", - "ramsey/uuid": "^4.0", - "symfony/console": "^6.0|^7.0", - "symfony/error-handler": "^6.0|^7.0", - "symfony/polyfill-php83": "^1.28", - "symfony/process": "^6.0|^7.0" - }, - "require-dev": { - "mockery/mockery": "^1.0", - "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9.0|^10.4|^11.5", - "predis/predis": "^1.1|^2.0" - }, - "suggest": { - "ext-redis": "Required to use the Redis PHP driver.", - "predis/predis": "Required when not using the Redis PHP driver (^1.1|^2.0)." - }, - "type": "library", - "extra": { - "laravel": { - "aliases": { - "Horizon": "Laravel\\Horizon\\Horizon" - }, - "providers": [ - "Laravel\\Horizon\\HorizonServiceProvider" - ] - }, - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "Laravel\\Horizon\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "Dashboard and code-driven configuration for Laravel queues.", - "keywords": [ - "laravel", - "queue" - ], - "support": { - "issues": "https://github.com/laravel/horizon/issues", - "source": "https://github.com/laravel/horizon/tree/v5.30.3" - }, - "time": "2025-02-11T13:52:50+00:00" - }, - { - "name": "laravel/pail", - "version": "v1.2.2", - "source": { - "type": "git", - "url": "https://github.com/laravel/pail.git", - "reference": "f31f4980f52be17c4667f3eafe034e6826787db2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/pail/zipball/f31f4980f52be17c4667f3eafe034e6826787db2", - "reference": "f31f4980f52be17c4667f3eafe034e6826787db2", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "illuminate/console": "^10.24|^11.0|^12.0", - "illuminate/contracts": "^10.24|^11.0|^12.0", - "illuminate/log": "^10.24|^11.0|^12.0", - "illuminate/process": "^10.24|^11.0|^12.0", - "illuminate/support": "^10.24|^11.0|^12.0", - "nunomaduro/termwind": "^1.15|^2.0", - "php": "^8.2", - "symfony/console": "^6.0|^7.0" - }, - "require-dev": { - "laravel/framework": "^10.24|^11.0|^12.0", - "laravel/pint": "^1.13", - "orchestra/testbench-core": "^8.13|^9.0|^10.0", - "pestphp/pest": "^2.20|^3.0", - "pestphp/pest-plugin-type-coverage": "^2.3|^3.0", - "phpstan/phpstan": "^1.10", - "symfony/var-dumper": "^6.3|^7.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Laravel\\Pail\\PailServiceProvider" - ] - }, - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Laravel\\Pail\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - }, - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "Easily delve into your Laravel application's log files directly from the command line.", - "homepage": "https://github.com/laravel/pail", - "keywords": [ - "laravel", - "logs", - "php", - "tail" - ], - "support": { - "issues": "https://github.com/laravel/pail/issues", - "source": "https://github.com/laravel/pail" - }, - "time": "2025-01-28T15:15:15+00:00" + "time": "2025-03-12T14:38:20+00:00" }, { "name": "laravel/prompts", @@ -3162,70 +1328,6 @@ }, "time": "2025-02-11T13:34:40+00:00" }, - { - "name": "laravel/sanctum", - "version": "v4.0.8", - "source": { - "type": "git", - "url": "https://github.com/laravel/sanctum.git", - "reference": "ec1dd9ddb2ab370f79dfe724a101856e0963f43c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/sanctum/zipball/ec1dd9ddb2ab370f79dfe724a101856e0963f43c", - "reference": "ec1dd9ddb2ab370f79dfe724a101856e0963f43c", - "shasum": "" - }, - "require": { - "ext-json": "*", - "illuminate/console": "^11.0|^12.0", - "illuminate/contracts": "^11.0|^12.0", - "illuminate/database": "^11.0|^12.0", - "illuminate/support": "^11.0|^12.0", - "php": "^8.2", - "symfony/console": "^7.0" - }, - "require-dev": { - "mockery/mockery": "^1.6", - "orchestra/testbench": "^9.0|^10.0", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^11.3" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Laravel\\Sanctum\\SanctumServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Laravel\\Sanctum\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", - "keywords": [ - "auth", - "laravel", - "sanctum" - ], - "support": { - "issues": "https://github.com/laravel/sanctum/issues", - "source": "https://github.com/laravel/sanctum" - }, - "time": "2025-01-26T19:34:36+00:00" - }, { "name": "laravel/serializable-closure", "version": "v2.0.3", @@ -3287,78 +1389,6 @@ }, "time": "2025-02-11T15:03:05+00:00" }, - { - "name": "laravel/socialite", - "version": "v5.18.0", - "source": { - "type": "git", - "url": "https://github.com/laravel/socialite.git", - "reference": "7809dc71250e074cd42970f0f803f2cddc04c5de" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/7809dc71250e074cd42970f0f803f2cddc04c5de", - "reference": "7809dc71250e074cd42970f0f803f2cddc04c5de", - "shasum": "" - }, - "require": { - "ext-json": "*", - "firebase/php-jwt": "^6.4", - "guzzlehttp/guzzle": "^6.0|^7.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "league/oauth1-client": "^1.11", - "php": "^7.2|^8.0", - "phpseclib/phpseclib": "^3.0" - }, - "require-dev": { - "mockery/mockery": "^1.0", - "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0|^8.0|^9.0|^10.0", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^8.0|^9.3|^10.4|^11.5" - }, - "type": "library", - "extra": { - "laravel": { - "aliases": { - "Socialite": "Laravel\\Socialite\\Facades\\Socialite" - }, - "providers": [ - "Laravel\\Socialite\\SocialiteServiceProvider" - ] - }, - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "Laravel\\Socialite\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "Laravel wrapper around OAuth 1 & OAuth 2 libraries.", - "homepage": "https://laravel.com", - "keywords": [ - "laravel", - "oauth" - ], - "support": { - "issues": "https://github.com/laravel/socialite/issues", - "source": "https://github.com/laravel/socialite" - }, - "time": "2025-02-11T13:38:19+00:00" - }, { "name": "laravel/tinker", "version": "v2.10.1", @@ -3425,142 +1455,6 @@ }, "time": "2025-01-27T14:24:01+00:00" }, - { - "name": "laravel/ui", - "version": "v4.6.1", - "source": { - "type": "git", - "url": "https://github.com/laravel/ui.git", - "reference": "7d6ffa38d79f19c9b3e70a751a9af845e8f41d88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/ui/zipball/7d6ffa38d79f19c9b3e70a751a9af845e8f41d88", - "reference": "7d6ffa38d79f19c9b3e70a751a9af845e8f41d88", - "shasum": "" - }, - "require": { - "illuminate/console": "^9.21|^10.0|^11.0|^12.0", - "illuminate/filesystem": "^9.21|^10.0|^11.0|^12.0", - "illuminate/support": "^9.21|^10.0|^11.0|^12.0", - "illuminate/validation": "^9.21|^10.0|^11.0|^12.0", - "php": "^8.0", - "symfony/console": "^6.0|^7.0" - }, - "require-dev": { - "orchestra/testbench": "^7.35|^8.15|^9.0|^10.0", - "phpunit/phpunit": "^9.3|^10.4|^11.5" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Laravel\\Ui\\UiServiceProvider" - ] - }, - "branch-alias": { - "dev-master": "4.x-dev" - } - }, - "autoload": { - "psr-4": { - "Laravel\\Ui\\": "src/", - "Illuminate\\Foundation\\Auth\\": "auth-backend/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "Laravel UI utilities and presets.", - "keywords": [ - "laravel", - "ui" - ], - "support": { - "source": "https://github.com/laravel/ui/tree/v4.6.1" - }, - "time": "2025-01-28T15:15:29+00:00" - }, - { - "name": "lcobucci/jwt", - "version": "5.5.0", - "source": { - "type": "git", - "url": "https://github.com/lcobucci/jwt.git", - "reference": "a835af59b030d3f2967725697cf88300f579088e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/a835af59b030d3f2967725697cf88300f579088e", - "reference": "a835af59b030d3f2967725697cf88300f579088e", - "shasum": "" - }, - "require": { - "ext-openssl": "*", - "ext-sodium": "*", - "php": "~8.2.0 || ~8.3.0 || ~8.4.0", - "psr/clock": "^1.0" - }, - "require-dev": { - "infection/infection": "^0.29", - "lcobucci/clock": "^3.2", - "lcobucci/coding-standard": "^11.0", - "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.2", - "phpstan/phpstan": "^1.10.7", - "phpstan/phpstan-deprecation-rules": "^1.1.3", - "phpstan/phpstan-phpunit": "^1.3.10", - "phpstan/phpstan-strict-rules": "^1.5.0", - "phpunit/phpunit": "^11.1" - }, - "suggest": { - "lcobucci/clock": ">= 3.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Lcobucci\\JWT\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Luís Cobucci", - "email": "lcobucci@gmail.com", - "role": "Developer" - } - ], - "description": "A simple library to work with JSON Web Token and JSON Web Signature", - "keywords": [ - "JWS", - "jwt" - ], - "support": { - "issues": "https://github.com/lcobucci/jwt/issues", - "source": "https://github.com/lcobucci/jwt/tree/5.5.0" - }, - "funding": [ - { - "url": "https://github.com/lcobucci", - "type": "github" - }, - { - "url": "https://www.patreon.com/lcobucci", - "type": "patreon" - } - ], - "time": "2025-01-26T21:29:45+00:00" - }, { "name": "league/commonmark", "version": "2.6.1", @@ -3833,61 +1727,6 @@ }, "time": "2024-10-08T08:58:34+00:00" }, - { - "name": "league/flysystem-aws-s3-v3", - "version": "3.29.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", - "reference": "c6ff6d4606e48249b63f269eba7fabdb584e76a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/c6ff6d4606e48249b63f269eba7fabdb584e76a9", - "reference": "c6ff6d4606e48249b63f269eba7fabdb584e76a9", - "shasum": "" - }, - "require": { - "aws/aws-sdk-php": "^3.295.10", - "league/flysystem": "^3.10.0", - "league/mime-type-detection": "^1.0.0", - "php": "^8.0.2" - }, - "conflict": { - "guzzlehttp/guzzle": "<7.0", - "guzzlehttp/ringphp": "<1.1.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\Flysystem\\AwsS3V3\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "AWS S3 filesystem adapter for Flysystem.", - "keywords": [ - "Flysystem", - "aws", - "file", - "files", - "filesystem", - "s3", - "storage" - ], - "support": { - "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.29.0" - }, - "time": "2024-08-17T13:10:48+00:00" - }, { "name": "league/flysystem-local", "version": "3.29.0", @@ -3937,55 +1776,6 @@ }, "time": "2024-08-09T21:24:39+00:00" }, - { - "name": "league/flysystem-sftp-v3", - "version": "3.29.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem-sftp-v3.git", - "reference": "ce9b209e2fbe33122c755ffc18eb4d5bd256f252" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-sftp-v3/zipball/ce9b209e2fbe33122c755ffc18eb4d5bd256f252", - "reference": "ce9b209e2fbe33122c755ffc18eb4d5bd256f252", - "shasum": "" - }, - "require": { - "league/flysystem": "^3.0.14", - "league/mime-type-detection": "^1.0.0", - "php": "^8.0.2", - "phpseclib/phpseclib": "^3.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\Flysystem\\PhpseclibV3\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "SFTP filesystem adapter for Flysystem.", - "keywords": [ - "Flysystem", - "file", - "files", - "filesystem", - "sftp" - ], - "support": { - "source": "https://github.com/thephpleague/flysystem-sftp-v3/tree/3.29.0" - }, - "time": "2024-08-14T19:35:54+00:00" - }, { "name": "league/mime-type-detection", "version": "1.16.0", @@ -4042,82 +1832,6 @@ ], "time": "2024-09-21T08:32:55+00:00" }, - { - "name": "league/oauth1-client", - "version": "v1.11.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/oauth1-client.git", - "reference": "f9c94b088837eb1aae1ad7c4f23eb65cc6993055" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/f9c94b088837eb1aae1ad7c4f23eb65cc6993055", - "reference": "f9c94b088837eb1aae1ad7c4f23eb65cc6993055", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-openssl": "*", - "guzzlehttp/guzzle": "^6.0|^7.0", - "guzzlehttp/psr7": "^1.7|^2.0", - "php": ">=7.1||>=8.0" - }, - "require-dev": { - "ext-simplexml": "*", - "friendsofphp/php-cs-fixer": "^2.17", - "mockery/mockery": "^1.3.3", - "phpstan/phpstan": "^0.12.42", - "phpunit/phpunit": "^7.5||9.5" - }, - "suggest": { - "ext-simplexml": "For decoding XML-based responses." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev", - "dev-develop": "2.0-dev" - } - }, - "autoload": { - "psr-4": { - "League\\OAuth1\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ben Corlett", - "email": "bencorlett@me.com", - "homepage": "http://www.webcomm.com.au", - "role": "Developer" - } - ], - "description": "OAuth 1.0 Client Library", - "keywords": [ - "Authentication", - "SSO", - "authorization", - "bitbucket", - "identity", - "idp", - "oauth", - "oauth1", - "single sign on", - "trello", - "tumblr", - "twitter" - ], - "support": { - "issues": "https://github.com/thephpleague/oauth1-client/issues", - "source": "https://github.com/thephpleague/oauth1-client/tree/v1.11.0" - }, - "time": "2024-12-10T19:59:05+00:00" - }, { "name": "league/uri", "version": "7.5.1", @@ -4292,292 +2006,6 @@ ], "time": "2024-12-08T08:18:47+00:00" }, - { - "name": "livewire/livewire", - "version": "v3.5.20", - "source": { - "type": "git", - "url": "https://github.com/livewire/livewire.git", - "reference": "509f2258c51741f6d06deb65d4437654520694e6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/509f2258c51741f6d06deb65d4437654520694e6", - "reference": "509f2258c51741f6d06deb65d4437654520694e6", - "shasum": "" - }, - "require": { - "illuminate/database": "^10.0|^11.0|^12.0", - "illuminate/routing": "^10.0|^11.0|^12.0", - "illuminate/support": "^10.0|^11.0|^12.0", - "illuminate/validation": "^10.0|^11.0|^12.0", - "laravel/prompts": "^0.1.24|^0.2|^0.3", - "league/mime-type-detection": "^1.9", - "php": "^8.1", - "symfony/console": "^6.0|^7.0", - "symfony/http-kernel": "^6.2|^7.0" - }, - "require-dev": { - "calebporzio/sushi": "^2.1", - "laravel/framework": "^10.15.0|^11.0|^12.0", - "mockery/mockery": "^1.3.1", - "orchestra/testbench": "^8.21.0|^9.0|^10.0", - "orchestra/testbench-dusk": "^8.24|^9.1|^10.0", - "phpunit/phpunit": "^10.4|^11.5", - "psy/psysh": "^0.11.22|^0.12" - }, - "type": "library", - "extra": { - "laravel": { - "aliases": { - "Livewire": "Livewire\\Livewire" - }, - "providers": [ - "Livewire\\LivewireServiceProvider" - ] - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Livewire\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Caleb Porzio", - "email": "calebporzio@gmail.com" - } - ], - "description": "A front-end framework for Laravel.", - "support": { - "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v3.5.20" - }, - "funding": [ - { - "url": "https://github.com/livewire", - "type": "github" - } - ], - "time": "2025-02-13T21:05:24+00:00" - }, - { - "name": "log1x/laravel-webfonts", - "version": "v1.0.2", - "source": { - "type": "git", - "url": "https://github.com/Log1x/laravel-webfonts.git", - "reference": "128a20af26f02db84df21abc6524e5a069cf20a4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Log1x/laravel-webfonts/zipball/128a20af26f02db84df21abc6524e5a069cf20a4", - "reference": "128a20af26f02db84df21abc6524e5a069cf20a4", - "shasum": "" - }, - "require": { - "guzzlehttp/guzzle": "^7.8", - "laravel/prompts": "^0.1|^0.2|^0.3", - "php": ">=8.1" - }, - "require-dev": { - "illuminate/console": "^10.0|^11.0", - "illuminate/http": "^10.0|^11.0", - "illuminate/support": "^10.0|^11.0", - "laravel/pint": "^1.13" - }, - "type": "package", - "extra": { - "laravel": { - "providers": [ - "Log1x\\LaravelWebfonts\\WebfontsServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Log1x\\LaravelWebfonts\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brandon Nifong", - "email": "brandon@tendency.me", - "homepage": "https://github.com/log1x" - } - ], - "description": "Download, install, and preload over 1500 Google fonts locally in your Laravel project", - "support": { - "issues": "https://github.com/Log1x/laravel-webfonts/issues", - "source": "https://github.com/Log1x/laravel-webfonts/tree/v1.0.2" - }, - "funding": [ - { - "url": "https://github.com/Log1x", - "type": "github" - } - ], - "time": "2024-11-12T19:00:31+00:00" - }, - { - "name": "lorisleiva/laravel-actions", - "version": "v2.8.6", - "source": { - "type": "git", - "url": "https://github.com/lorisleiva/laravel-actions.git", - "reference": "4647523599bee13cfd6b9bc9acdaf4503d4801ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/lorisleiva/laravel-actions/zipball/4647523599bee13cfd6b9bc9acdaf4503d4801ce", - "reference": "4647523599bee13cfd6b9bc9acdaf4503d4801ce", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^10.0|^11.0", - "lorisleiva/lody": "^0.5", - "php": "^8.1" - }, - "require-dev": { - "orchestra/testbench": "^8.0|^9.0", - "pestphp/pest": "^1.23|^2.34", - "phpunit/phpunit": "^9.6|^10.0" - }, - "type": "library", - "extra": { - "laravel": { - "aliases": { - "Action": "Lorisleiva\\Actions\\Facades\\Actions" - }, - "providers": [ - "Lorisleiva\\Actions\\ActionServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Lorisleiva\\Actions\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Loris Leiva", - "email": "loris.leiva@gmail.com", - "homepage": "https://lorisleiva.com", - "role": "Developer" - } - ], - "description": "Laravel components that take care of one specific task", - "homepage": "https://github.com/lorisleiva/laravel-actions", - "keywords": [ - "action", - "command", - "component", - "controller", - "job", - "laravel", - "listener", - "object" - ], - "support": { - "issues": "https://github.com/lorisleiva/laravel-actions/issues", - "source": "https://github.com/lorisleiva/laravel-actions/tree/v2.8.6" - }, - "funding": [ - { - "url": "https://github.com/sponsors/lorisleiva", - "type": "github" - } - ], - "time": "2025-02-04T08:36:29+00:00" - }, - { - "name": "lorisleiva/lody", - "version": "v0.5.0", - "source": { - "type": "git", - "url": "https://github.com/lorisleiva/lody.git", - "reference": "c2f51b070e99f3a240d66cf68ef1f232036917fe" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/lorisleiva/lody/zipball/c2f51b070e99f3a240d66cf68ef1f232036917fe", - "reference": "c2f51b070e99f3a240d66cf68ef1f232036917fe", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^9.0|^10.0|^11.0", - "php": "^8.0" - }, - "require-dev": { - "orchestra/testbench": "^9.0", - "pestphp/pest": "^1.20|^2.34", - "phpunit/phpunit": "^9.5.10|^10.5" - }, - "type": "library", - "extra": { - "laravel": { - "aliases": { - "Lody": "Lorisleiva\\Lody\\Lody" - }, - "providers": [ - "Lorisleiva\\Lody\\LodyServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Lorisleiva\\Lody\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Loris Leiva", - "email": "loris.leiva@gmail.com", - "homepage": "https://lorisleiva.com", - "role": "Developer" - } - ], - "description": "Load files and classes as lazy collections in Laravel.", - "homepage": "https://github.com/lorisleiva/lody", - "keywords": [ - "classes", - "collection", - "files", - "laravel", - "load" - ], - "support": { - "issues": "https://github.com/lorisleiva/lody/issues", - "source": "https://github.com/lorisleiva/lody/tree/v0.5.0" - }, - "funding": [ - { - "url": "https://github.com/sponsors/lorisleiva", - "type": "github" - } - ], - "time": "2024-03-13T12:08:59+00:00" - }, { "name": "monolog/monolog", "version": "3.8.1", @@ -4681,72 +2109,6 @@ ], "time": "2024-12-05T17:15:07+00:00" }, - { - "name": "mtdowling/jmespath.php", - "version": "2.8.0", - "source": { - "type": "git", - "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/a2a865e05d5f420b50cc2f85bb78d565db12a6bc", - "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "symfony/polyfill-mbstring": "^1.17" - }, - "require-dev": { - "composer/xdebug-handler": "^3.0.3", - "phpunit/phpunit": "^8.5.33" - }, - "bin": [ - "bin/jp.php" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "files": [ - "src/JmesPath.php" - ], - "psr-4": { - "JmesPath\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Declaratively specify how to extract elements from a JSON document", - "keywords": [ - "json", - "jsonpath" - ], - "support": { - "issues": "https://github.com/jmespath/jmespath.php/issues", - "source": "https://github.com/jmespath/jmespath.php/tree/2.8.0" - }, - "time": "2024-09-04T18:46:31+00:00" - }, { "name": "nesbot/carbon", "version": "3.8.6", @@ -5059,59 +2421,6 @@ }, "time": "2024-12-30T11:07:19+00:00" }, - { - "name": "nubs/random-name-generator", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/nubs/random-name-generator.git", - "reference": "50abf24519badc5795a43c831f1d2a1faa45cb77" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nubs/random-name-generator/zipball/50abf24519badc5795a43c831f1d2a1faa45cb77", - "reference": "50abf24519badc5795a43c831f1d2a1faa45cb77", - "shasum": "" - }, - "require": { - "php": "~5.6 || ~7.0 || ~8.0" - }, - "require-dev": { - "cinam/randomizer": ">=1.1.1,<2.0", - "php-coveralls/php-coveralls": "~2.4", - "phpunit/phpunit": "^5.0 || ^6.5 || ^7.0 || ^9.0", - "squizlabs/php_codesniffer": "~2.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Nubs\\RandomNameGenerator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Spencer Rinehart", - "email": "anubis@overthemonkey.com", - "role": "Developer" - } - ], - "description": "A library to create interesting, sometimes entertaining, random names.", - "keywords": [ - "alliteration", - "generator", - "random", - "video game" - ], - "support": { - "issues": "https://github.com/nubs/random-name-generator/issues", - "source": "https://github.com/nubs/random-name-generator/tree/v2.2.0" - }, - "time": "2021-01-12T13:46:08+00:00" - }, { "name": "nunomaduro/termwind", "version": "v2.3.0", @@ -5199,662 +2508,6 @@ ], "time": "2024-11-21T10:39:51+00:00" }, - { - "name": "nyholm/psr7", - "version": "1.8.2", - "source": { - "type": "git", - "url": "https://github.com/Nyholm/psr7.git", - "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", - "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", - "shasum": "" - }, - "require": { - "php": ">=7.2", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0" - }, - "provide": { - "php-http/message-factory-implementation": "1.0", - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "http-interop/http-factory-tests": "^0.9", - "php-http/message-factory": "^1.0", - "php-http/psr7-integration-tests": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", - "symfony/error-handler": "^4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.8-dev" - } - }, - "autoload": { - "psr-4": { - "Nyholm\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com" - }, - { - "name": "Martijn van der Ven", - "email": "martijn@vanderven.se" - } - ], - "description": "A fast PHP7 implementation of PSR-7", - "homepage": "https://tnyholm.se", - "keywords": [ - "psr-17", - "psr-7" - ], - "support": { - "issues": "https://github.com/Nyholm/psr7/issues", - "source": "https://github.com/Nyholm/psr7/tree/1.8.2" - }, - "funding": [ - { - "url": "https://github.com/Zegnat", - "type": "github" - }, - { - "url": "https://github.com/nyholm", - "type": "github" - } - ], - "time": "2024-09-09T07:06:30+00:00" - }, - { - "name": "paragonie/constant_time_encoding", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "df1e7fde177501eee2037dd159cf04f5f301a512" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512", - "reference": "df1e7fde177501eee2037dd159cf04f5f301a512", - "shasum": "" - }, - "require": { - "php": "^8" - }, - "require-dev": { - "phpunit/phpunit": "^9", - "vimeo/psalm": "^4|^5" - }, - "type": "library", - "autoload": { - "psr-4": { - "ParagonIE\\ConstantTime\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com", - "role": "Maintainer" - }, - { - "name": "Steve 'Sc00bz' Thomas", - "email": "steve@tobtu.com", - "homepage": "https://www.tobtu.com", - "role": "Original Developer" - } - ], - "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", - "keywords": [ - "base16", - "base32", - "base32_decode", - "base32_encode", - "base64", - "base64_decode", - "base64_encode", - "bin2hex", - "encoding", - "hex", - "hex2bin", - "rfc4648" - ], - "support": { - "email": "info@paragonie.com", - "issues": "https://github.com/paragonie/constant_time_encoding/issues", - "source": "https://github.com/paragonie/constant_time_encoding" - }, - "time": "2024-05-08T12:36:18+00:00" - }, - { - "name": "paragonie/random_compat", - "version": "v9.99.100", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", - "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", - "shasum": "" - }, - "require": { - "php": ">= 7" - }, - "require-dev": { - "phpunit/phpunit": "4.*|5.*", - "vimeo/psalm": "^1" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" - } - ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" - ], - "support": { - "email": "info@paragonie.com", - "issues": "https://github.com/paragonie/random_compat/issues", - "source": "https://github.com/paragonie/random_compat" - }, - "time": "2020-10-15T08:29:30+00:00" - }, - { - "name": "paragonie/sodium_compat", - "version": "v2.1.0", - "source": { - "type": "git", - "url": "https://github.com/paragonie/sodium_compat.git", - "reference": "a673d5f310477027cead2e2f2b6db5d8368157cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/a673d5f310477027cead2e2f2b6db5d8368157cb", - "reference": "a673d5f310477027cead2e2f2b6db5d8368157cb", - "shasum": "" - }, - "require": { - "php": "^8.1", - "php-64bit": "*" - }, - "require-dev": { - "phpunit/phpunit": "^7|^8|^9", - "vimeo/psalm": "^4|^5" - }, - "suggest": { - "ext-sodium": "Better performance, password hashing (Argon2i), secure memory management (memzero), and better security." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "files": [ - "autoload.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com" - }, - { - "name": "Frank Denis", - "email": "jedisct1@pureftpd.org" - } - ], - "description": "Pure PHP implementation of libsodium; uses the PHP extension if it exists", - "keywords": [ - "Authentication", - "BLAKE2b", - "ChaCha20", - "ChaCha20-Poly1305", - "Chapoly", - "Curve25519", - "Ed25519", - "EdDSA", - "Edwards-curve Digital Signature Algorithm", - "Elliptic Curve Diffie-Hellman", - "Poly1305", - "Pure-PHP cryptography", - "RFC 7748", - "RFC 8032", - "Salpoly", - "Salsa20", - "X25519", - "XChaCha20-Poly1305", - "XSalsa20-Poly1305", - "Xchacha20", - "Xsalsa20", - "aead", - "cryptography", - "ecdh", - "elliptic curve", - "elliptic curve cryptography", - "encryption", - "libsodium", - "php", - "public-key cryptography", - "secret-key cryptography", - "side-channel resistant" - ], - "support": { - "issues": "https://github.com/paragonie/sodium_compat/issues", - "source": "https://github.com/paragonie/sodium_compat/tree/v2.1.0" - }, - "time": "2024-09-04T12:51:01+00:00" - }, - { - "name": "php-di/invoker", - "version": "2.3.6", - "source": { - "type": "git", - "url": "https://github.com/PHP-DI/Invoker.git", - "reference": "59f15608528d8a8838d69b422a919fd6b16aa576" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/59f15608528d8a8838d69b422a919fd6b16aa576", - "reference": "59f15608528d8a8838d69b422a919fd6b16aa576", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "psr/container": "^1.0|^2.0" - }, - "require-dev": { - "athletic/athletic": "~0.1.8", - "mnapoli/hard-mode": "~0.3.0", - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Invoker\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Generic and extensible callable invoker", - "homepage": "https://github.com/PHP-DI/Invoker", - "keywords": [ - "callable", - "dependency", - "dependency-injection", - "injection", - "invoke", - "invoker" - ], - "support": { - "issues": "https://github.com/PHP-DI/Invoker/issues", - "source": "https://github.com/PHP-DI/Invoker/tree/2.3.6" - }, - "funding": [ - { - "url": "https://github.com/mnapoli", - "type": "github" - } - ], - "time": "2025-01-17T12:49:27+00:00" - }, - { - "name": "php-di/php-di", - "version": "7.0.8", - "source": { - "type": "git", - "url": "https://github.com/PHP-DI/PHP-DI.git", - "reference": "98ddc81f8f768a2ad39e4cbe737285eaeabe577a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/98ddc81f8f768a2ad39e4cbe737285eaeabe577a", - "reference": "98ddc81f8f768a2ad39e4cbe737285eaeabe577a", - "shasum": "" - }, - "require": { - "laravel/serializable-closure": "^1.0 || ^2.0", - "php": ">=8.0", - "php-di/invoker": "^2.0", - "psr/container": "^1.1 || ^2.0" - }, - "provide": { - "psr/container-implementation": "^1.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3", - "friendsofphp/proxy-manager-lts": "^1", - "mnapoli/phpunit-easymock": "^1.3", - "phpunit/phpunit": "^9.6", - "vimeo/psalm": "^4.6" - }, - "suggest": { - "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "DI\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "The dependency injection container for humans", - "homepage": "https://php-di.org/", - "keywords": [ - "PSR-11", - "container", - "container-interop", - "dependency injection", - "di", - "ioc", - "psr11" - ], - "support": { - "issues": "https://github.com/PHP-DI/PHP-DI/issues", - "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.8" - }, - "funding": [ - { - "url": "https://github.com/mnapoli", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/php-di/php-di", - "type": "tidelift" - } - ], - "time": "2025-01-28T21:02:46+00:00" - }, - { - "name": "phpdocumentor/reflection", - "version": "6.1.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/Reflection.git", - "reference": "bb4dea805a645553d6d989b23dad9f8041f39502" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/bb4dea805a645553d6d989b23dad9f8041f39502", - "reference": "bb4dea805a645553d6d989b23dad9f8041f39502", - "shasum": "" - }, - "require": { - "nikic/php-parser": "~4.18 || ^5.0", - "php": "8.1.*|8.2.*|8.3.*|8.4.*", - "phpdocumentor/reflection-common": "^2.1", - "phpdocumentor/reflection-docblock": "^5", - "phpdocumentor/type-resolver": "^1.2", - "symfony/polyfill-php80": "^1.28", - "webmozart/assert": "^1.7" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0", - "doctrine/coding-standard": "^12.0", - "mikey179/vfsstream": "~1.2", - "mockery/mockery": "~1.6.0", - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-webmozart-assert": "^1.2", - "phpunit/phpunit": "^10.0", - "psalm/phar": "^5.24", - "rector/rector": "^1.0.0", - "squizlabs/php_codesniffer": "^3.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-5.x": "5.3.x-dev", - "dev-6.x": "6.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\": "src/phpDocumentor" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Reflection library to do Static Analysis for PHP Projects", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/Reflection/issues", - "source": "https://github.com/phpDocumentor/Reflection/tree/6.1.0" - }, - "time": "2024-11-22T15:11:54+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.6.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", - "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.1", - "ext-filter": "*", - "php": "^7.4 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.7", - "phpstan/phpdoc-parser": "^1.7|^2.0", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.5 || ~1.6.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-webmozart-assert": "^1.2", - "phpunit/phpunit": "^9.5", - "psalm/phar": "^5.26" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.1" - }, - "time": "2024-12-07T09:39:29+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", - "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.3 || ^8.0", - "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.18|^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^9.5", - "rector/rector": "^0.13.9", - "vimeo/psalm": "^4.25" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" - }, - "time": "2024-11-09T15:12:26+00:00" - }, { "name": "phpoption/phpoption", "version": "1.9.3", @@ -5930,374 +2583,6 @@ ], "time": "2024-07-20T21:41:07+00:00" }, - { - "name": "phpseclib/phpseclib", - "version": "3.0.43", - "source": { - "type": "git", - "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "709ec107af3cb2f385b9617be72af8cf62441d02" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/709ec107af3cb2f385b9617be72af8cf62441d02", - "reference": "709ec107af3cb2f385b9617be72af8cf62441d02", - "shasum": "" - }, - "require": { - "paragonie/constant_time_encoding": "^1|^2|^3", - "paragonie/random_compat": "^1.4|^2.0|^9.99.99", - "php": ">=5.6.1" - }, - "require-dev": { - "phpunit/phpunit": "*" - }, - "suggest": { - "ext-dom": "Install the DOM extension to load XML formatted public keys.", - "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", - "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", - "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." - }, - "type": "library", - "autoload": { - "files": [ - "phpseclib/bootstrap.php" - ], - "psr-4": { - "phpseclib3\\": "phpseclib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "role": "Lead Developer" - }, - { - "name": "Patrick Monnerat", - "email": "pm@datasphere.ch", - "role": "Developer" - }, - { - "name": "Andreas Fischer", - "email": "bantu@phpbb.com", - "role": "Developer" - }, - { - "name": "Hans-Jürgen Petrich", - "email": "petrich@tronic-media.com", - "role": "Developer" - }, - { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "role": "Developer" - } - ], - "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", - "homepage": "http://phpseclib.sourceforge.net", - "keywords": [ - "BigInteger", - "aes", - "asn.1", - "asn1", - "blowfish", - "crypto", - "cryptography", - "encryption", - "rsa", - "security", - "sftp", - "signature", - "signing", - "ssh", - "twofish", - "x.509", - "x509" - ], - "support": { - "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.43" - }, - "funding": [ - { - "url": "https://github.com/terrafrost", - "type": "github" - }, - { - "url": "https://www.patreon.com/phpseclib", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", - "type": "tidelift" - } - ], - "time": "2024-12-14T21:12:59+00:00" - }, - { - "name": "phpstan/phpdoc-parser", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "doctrine/annotations": "^2.0", - "nikic/php-parser": "^5.3.0", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^2.0", - "phpstan/phpstan-phpunit": "^2.0", - "phpstan/phpstan-strict-rules": "^2.0", - "phpunit/phpunit": "^9.6", - "symfony/process": "^5.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", - "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0" - }, - "time": "2025-02-19T13:28:12+00:00" - }, - { - "name": "pion/laravel-chunk-upload", - "version": "v1.5.4", - "source": { - "type": "git", - "url": "https://github.com/pionl/laravel-chunk-upload.git", - "reference": "cfbc4292ddcace51308a4f2f446d310aa04e6133" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pionl/laravel-chunk-upload/zipball/cfbc4292ddcace51308a4f2f446d310aa04e6133", - "reference": "cfbc4292ddcace51308a4f2f446d310aa04e6133", - "shasum": "" - }, - "require": { - "illuminate/console": "5.2 - 5.8 | ^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0", - "illuminate/filesystem": "5.2 - 5.8 | ^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0", - "illuminate/http": "5.2 - 5.8 | ^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0", - "illuminate/support": "5.2 - 5.8 | ^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.16.0 | ^3.52.0", - "mockery/mockery": "^1.1.0 | ^1.3.0 | ^1.6.0", - "overtrue/phplint": "^1.1 | ^2.0 | ^9.1", - "phpunit/phpunit": "5.7 | 6.0 | 7.0 | 7.5 | 8.4 | ^8.5 | ^9.3 | ^10.0 | ^11.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Pion\\Laravel\\ChunkUpload\\Providers\\ChunkUploadServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Pion\\Laravel\\ChunkUpload\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Martin Kluska", - "email": "martin@kluska.cz" - } - ], - "description": "Service for chunked upload with several js providers", - "support": { - "issues": "https://github.com/pionl/laravel-chunk-upload/issues", - "source": "https://github.com/pionl/laravel-chunk-upload/tree/v1.5.4" - }, - "funding": [ - { - "url": "https://revolut.me/martinpv7n", - "type": "custom" - }, - { - "url": "https://github.com/pionl", - "type": "github" - } - ], - "time": "2024-03-25T15:50:07+00:00" - }, - { - "name": "poliander/cron", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/poliander/cron.git", - "reference": "68baf899189d0a68611b9575fc62642144877d80" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/poliander/cron/zipball/68baf899189d0a68611b9575fc62642144877d80", - "reference": "68baf899189d0a68611b9575fc62642144877d80", - "shasum": "" - }, - "require": { - "php": "8.2.* || 8.3.* || 8.4.*" - }, - "require-dev": { - "phpunit/phpunit": "~11.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Poliander\\Cron\\": "src/Cron/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-3.0-or-later" - ], - "authors": [ - { - "name": "René Pollesch", - "role": "Developer" - } - ], - "description": "Standard (V7) compliant crontab expression parser/validator with support for time zones", - "homepage": "https://github.com/poliander/cron", - "support": { - "issues": "https://github.com/poliander/cron/issues", - "source": "https://github.com/poliander/cron/tree/3.2.1" - }, - "time": "2024-12-21T05:57:05+00:00" - }, - { - "name": "pragmarx/google2fa", - "version": "v8.0.3", - "source": { - "type": "git", - "url": "https://github.com/antonioribeiro/google2fa.git", - "reference": "6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad", - "reference": "6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad", - "shasum": "" - }, - "require": { - "paragonie/constant_time_encoding": "^1.0|^2.0|^3.0", - "php": "^7.1|^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.9", - "phpunit/phpunit": "^7.5.15|^8.5|^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "PragmaRX\\Google2FA\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Antonio Carlos Ribeiro", - "email": "acr@antoniocarlosribeiro.com", - "role": "Creator & Designer" - } - ], - "description": "A One Time Password Authentication package, compatible with Google Authenticator.", - "keywords": [ - "2fa", - "Authentication", - "Two Factor Authentication", - "google2fa" - ], - "support": { - "issues": "https://github.com/antonioribeiro/google2fa/issues", - "source": "https://github.com/antonioribeiro/google2fa/tree/v8.0.3" - }, - "time": "2024-09-05T11:56:40+00:00" - }, - { - "name": "psr/cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" - }, - "time": "2021-02-03T23:26:27+00:00" - }, { "name": "psr/clock", "version": "1.0.0", @@ -6712,16 +2997,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.7", + "version": "v0.12.8", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c" + "reference": "85057ceedee50c49d4f6ecaff73ee96adb3b3625" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", - "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/85057ceedee50c49d4f6ecaff73ee96adb3b3625", + "reference": "85057ceedee50c49d4f6ecaff73ee96adb3b3625", "shasum": "" }, "require": { @@ -6785,118 +3070,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.7" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.8" }, - "time": "2024-12-10T01:58:33+00:00" - }, - { - "name": "purplepixie/phpdns", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/purplepixie/phpdns.git", - "reference": "2b77de5bb218bc4e5d9c4a4a12bd18fe80a6ab4d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/purplepixie/phpdns/zipball/2b77de5bb218bc4e5d9c4a4a12bd18fe80a6ab4d", - "reference": "2b77de5bb218bc4e5d9c4a4a12bd18fe80a6ab4d", - "shasum": "" - }, - "require": { - "php": ">=7.4" - }, - "require-dev": { - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "psr-0": { - "PurplePixie": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Cutting", - "email": "dcutting@purplepixie.org" - } - ], - "description": "PHP DNS Direct Query Module", - "support": { - "issues": "https://github.com/purplepixie/phpdns/issues", - "source": "https://github.com/purplepixie/phpdns/tree/2.2.0" - }, - "time": "2024-09-26T14:39:58+00:00" - }, - { - "name": "pusher/pusher-php-server", - "version": "7.2.7", - "source": { - "type": "git", - "url": "https://github.com/pusher/pusher-http-php.git", - "reference": "148b0b5100d000ed57195acdf548a2b1b38ee3f7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pusher/pusher-http-php/zipball/148b0b5100d000ed57195acdf548a2b1b38ee3f7", - "reference": "148b0b5100d000ed57195acdf548a2b1b38ee3f7", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-json": "*", - "guzzlehttp/guzzle": "^7.2", - "paragonie/sodium_compat": "^1.6|^2.0", - "php": "^7.3|^8.0", - "psr/log": "^1.0|^2.0|^3.0" - }, - "require-dev": { - "overtrue/phplint": "^2.3", - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "Pusher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Library for interacting with the Pusher REST API", - "keywords": [ - "events", - "messaging", - "php-pusher-server", - "publish", - "push", - "pusher", - "real time", - "real-time", - "realtime", - "rest", - "trigger" - ], - "support": { - "issues": "https://github.com/pusher/pusher-http-php/issues", - "source": "https://github.com/pusher/pusher-http-php/tree/7.2.7" - }, - "time": "2025-01-06T10:56:20+00:00" + "time": "2025-03-16T03:05:19+00:00" }, { "name": "ralouphie/getallheaders", @@ -7110,1510 +3286,6 @@ ], "time": "2024-04-27T21:32:50+00:00" }, - { - "name": "resend/resend-laravel", - "version": "v0.15.0", - "source": { - "type": "git", - "url": "https://github.com/resend/resend-laravel.git", - "reference": "af914817abc6abaa4522b5cfb177f3519493fd6e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/resend/resend-laravel/zipball/af914817abc6abaa4522b5cfb177f3519493fd6e", - "reference": "af914817abc6abaa4522b5cfb177f3519493fd6e", - "shasum": "" - }, - "require": { - "illuminate/http": "^10.0|^11.0", - "illuminate/support": "^10.0|^11.0", - "php": "^8.1", - "resend/resend-php": "^0.14.0", - "symfony/mailer": "^6.2|^7.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.14", - "mockery/mockery": "^1.5", - "orchestra/testbench": "^8.17|^9.0", - "pestphp/pest": "^2.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Resend\\Laravel\\ResendServiceProvider" - ] - }, - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Resend\\Laravel\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Resend and contributors", - "homepage": "https://github.com/resend/resend-laravel/contributors" - } - ], - "description": "Resend for Laravel", - "homepage": "https://resend.com/", - "keywords": [ - "api", - "client", - "laravel", - "php", - "resend", - "sdk" - ], - "support": { - "issues": "https://github.com/resend/resend-laravel/issues", - "source": "https://github.com/resend/resend-laravel/tree/v0.15.0" - }, - "time": "2024-11-04T18:34:08+00:00" - }, - { - "name": "resend/resend-php", - "version": "v0.14.0", - "source": { - "type": "git", - "url": "https://github.com/resend/resend-php.git", - "reference": "d7900752bb9839421d40d9e66362bffb3ec07aac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/resend/resend-php/zipball/d7900752bb9839421d40d9e66362bffb3ec07aac", - "reference": "d7900752bb9839421d40d9e66362bffb3ec07aac", - "shasum": "" - }, - "require": { - "guzzlehttp/guzzle": "^7.5", - "php": "^8.1.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.13", - "mockery/mockery": "^1.6", - "pestphp/pest": "^2.0" - }, - "type": "library", - "autoload": { - "files": [ - "src/Resend.php" - ], - "psr-4": { - "Resend\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Resend and contributors", - "homepage": "https://github.com/resend/resend-php/contributors" - } - ], - "description": "Resend PHP library.", - "homepage": "https://resend.com/", - "keywords": [ - "api", - "client", - "php", - "resend", - "sdk" - ], - "support": { - "issues": "https://github.com/resend/resend-php/issues", - "source": "https://github.com/resend/resend-php/tree/v0.14.0" - }, - "time": "2024-11-01T02:00:44+00:00" - }, - { - "name": "revolt/event-loop", - "version": "v1.0.7", - "source": { - "type": "git", - "url": "https://github.com/revoltphp/event-loop.git", - "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/09bf1bf7f7f574453efe43044b06fafe12216eb3", - "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.15" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Revolt\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "ceesjank@gmail.com" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Rock-solid event loop for concurrent PHP applications.", - "keywords": [ - "async", - "asynchronous", - "concurrency", - "event", - "event-loop", - "non-blocking", - "scheduler" - ], - "support": { - "issues": "https://github.com/revoltphp/event-loop/issues", - "source": "https://github.com/revoltphp/event-loop/tree/v1.0.7" - }, - "time": "2025-01-25T19:27:39+00:00" - }, - { - "name": "sentry/sentry", - "version": "4.10.0", - "source": { - "type": "git", - "url": "https://github.com/getsentry/sentry-php.git", - "reference": "2af937d47d8aadb8dab0b1d7b9557e495dd12856" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/2af937d47d8aadb8dab0b1d7b9557e495dd12856", - "reference": "2af937d47d8aadb8dab0b1d7b9557e495dd12856", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "guzzlehttp/psr7": "^1.8.4|^2.1.1", - "jean85/pretty-package-versions": "^1.5|^2.0.4", - "php": "^7.2|^8.0", - "psr/log": "^1.0|^2.0|^3.0", - "symfony/options-resolver": "^4.4.30|^5.0.11|^6.0|^7.0" - }, - "conflict": { - "raven/raven": "*" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.4", - "guzzlehttp/promises": "^2.0.3", - "guzzlehttp/psr7": "^1.8.4|^2.1.1", - "monolog/monolog": "^1.6|^2.0|^3.0", - "phpbench/phpbench": "^1.0", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^8.5|^9.6", - "symfony/phpunit-bridge": "^5.2|^6.0|^7.0", - "vimeo/psalm": "^4.17" - }, - "suggest": { - "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Sentry\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sentry", - "email": "accounts@sentry.io" - } - ], - "description": "PHP SDK for Sentry (http://sentry.io)", - "homepage": "http://sentry.io", - "keywords": [ - "crash-reporting", - "crash-reports", - "error-handler", - "error-monitoring", - "log", - "logging", - "profiling", - "sentry", - "tracing" - ], - "support": { - "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/4.10.0" - }, - "funding": [ - { - "url": "https://sentry.io/", - "type": "custom" - }, - { - "url": "https://sentry.io/pricing/", - "type": "custom" - } - ], - "time": "2024-11-06T07:44:19+00:00" - }, - { - "name": "sentry/sentry-laravel", - "version": "4.13.0", - "source": { - "type": "git", - "url": "https://github.com/getsentry/sentry-laravel.git", - "reference": "d232ac494258e0d50a77c575a5af5f1a426d3f87" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/d232ac494258e0d50a77c575a5af5f1a426d3f87", - "reference": "d232ac494258e0d50a77c575a5af5f1a426d3f87", - "shasum": "" - }, - "require": { - "illuminate/support": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0 | ^12.0", - "nyholm/psr7": "^1.0", - "php": "^7.2 | ^8.0", - "sentry/sentry": "^4.10", - "symfony/psr-http-message-bridge": "^1.0 | ^2.0 | ^6.0 | ^7.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.11", - "guzzlehttp/guzzle": "^7.2", - "laravel/folio": "^1.1", - "laravel/framework": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0 | ^12.0", - "livewire/livewire": "^2.0 | ^3.0", - "mockery/mockery": "^1.3", - "orchestra/testbench": "^4.7 | ^5.1 | ^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^8.4 | ^9.3 | ^10.4 | ^11.5" - }, - "type": "library", - "extra": { - "laravel": { - "aliases": { - "Sentry": "Sentry\\Laravel\\Facade" - }, - "providers": [ - "Sentry\\Laravel\\ServiceProvider", - "Sentry\\Laravel\\Tracing\\ServiceProvider" - ] - } - }, - "autoload": { - "psr-0": { - "Sentry\\Laravel\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sentry", - "email": "accounts@sentry.io" - } - ], - "description": "Laravel SDK for Sentry (https://sentry.io)", - "homepage": "https://sentry.io", - "keywords": [ - "crash-reporting", - "crash-reports", - "error-handler", - "error-monitoring", - "laravel", - "log", - "logging", - "profiling", - "sentry", - "tracing" - ], - "support": { - "issues": "https://github.com/getsentry/sentry-laravel/issues", - "source": "https://github.com/getsentry/sentry-laravel/tree/4.13.0" - }, - "funding": [ - { - "url": "https://sentry.io/", - "type": "custom" - }, - { - "url": "https://sentry.io/pricing/", - "type": "custom" - } - ], - "time": "2025-02-18T10:09:29+00:00" - }, - { - "name": "socialiteproviders/authentik", - "version": "5.2.0", - "source": { - "type": "git", - "url": "https://github.com/SocialiteProviders/Authentik.git", - "reference": "4cf129cf04728a38e0531c54454464b162f0fa66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Authentik/zipball/4cf129cf04728a38e0531c54454464b162f0fa66", - "reference": "4cf129cf04728a38e0531c54454464b162f0fa66", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^8.0", - "socialiteproviders/manager": "^4.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "SocialiteProviders\\Authentik\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "rf152", - "email": "git@rf152.co.uk" - } - ], - "description": "Authentik OAuth2 Provider for Laravel Socialite", - "keywords": [ - "authentik", - "laravel", - "oauth", - "provider", - "socialite" - ], - "support": { - "docs": "https://socialiteproviders.com/authentik", - "issues": "https://github.com/socialiteproviders/providers/issues", - "source": "https://github.com/socialiteproviders/providers" - }, - "time": "2023-11-07T22:21:16+00:00" - }, - { - "name": "socialiteproviders/google", - "version": "4.1.0", - "source": { - "type": "git", - "url": "https://github.com/SocialiteProviders/Google-Plus.git", - "reference": "1cb8f6fb2c0dd0fc8b34e95f69865663fdf0b401" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Google-Plus/zipball/1cb8f6fb2c0dd0fc8b34e95f69865663fdf0b401", - "reference": "1cb8f6fb2c0dd0fc8b34e95f69865663fdf0b401", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^7.2 || ^8.0", - "socialiteproviders/manager": "~4.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "SocialiteProviders\\Google\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "xstoop", - "email": "myenglishnameisx@gmail.com" - } - ], - "description": "Google OAuth2 Provider for Laravel Socialite", - "support": { - "source": "https://github.com/SocialiteProviders/Google-Plus/tree/4.1.0" - }, - "time": "2020-12-01T23:10:59+00:00" - }, - { - "name": "socialiteproviders/infomaniak", - "version": "4.0.0", - "source": { - "type": "git", - "url": "https://github.com/SocialiteProviders/Infomaniak.git", - "reference": "9796ad686204443bfdf3ff19a6c409e8771667e1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Infomaniak/zipball/9796ad686204443bfdf3ff19a6c409e8771667e1", - "reference": "9796ad686204443bfdf3ff19a6c409e8771667e1", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^8.0", - "socialiteproviders/manager": "^4.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "SocialiteProviders\\Infomaniak\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Leopold Jacquot", - "email": "leopold.jacquot@infomaniak.com" - } - ], - "description": "Infomaniak OAuth2 Provider for Laravel Socialite", - "keywords": [ - "infomaniak", - "laravel", - "oauth", - "oauth2", - "provider", - "socialite" - ], - "support": { - "docs": "https://socialiteproviders.com/qq", - "issues": "https://github.com/socialiteproviders/providers/issues", - "source": "https://github.com/socialiteproviders/providers" - }, - "time": "2024-11-20T05:42:36+00:00" - }, - { - "name": "socialiteproviders/manager", - "version": "v4.8.0", - "source": { - "type": "git", - "url": "https://github.com/SocialiteProviders/Manager.git", - "reference": "e93acc38f8464cc775a2b8bf09df311d1fdfefcb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/e93acc38f8464cc775a2b8bf09df311d1fdfefcb", - "reference": "e93acc38f8464cc775a2b8bf09df311d1fdfefcb", - "shasum": "" - }, - "require": { - "illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0", - "laravel/socialite": "^5.5", - "php": "^8.1" - }, - "require-dev": { - "mockery/mockery": "^1.2", - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "SocialiteProviders\\Manager\\ServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "SocialiteProviders\\Manager\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Andy Wendt", - "email": "andy@awendt.com" - }, - { - "name": "Anton Komarev", - "email": "a.komarev@cybercog.su" - }, - { - "name": "Miguel Piedrafita", - "email": "soy@miguelpiedrafita.com" - }, - { - "name": "atymic", - "email": "atymicq@gmail.com", - "homepage": "https://atymic.dev" - } - ], - "description": "Easily add new or override built-in providers in Laravel Socialite.", - "homepage": "https://socialiteproviders.com", - "keywords": [ - "laravel", - "manager", - "oauth", - "providers", - "socialite" - ], - "support": { - "issues": "https://github.com/socialiteproviders/manager/issues", - "source": "https://github.com/socialiteproviders/manager" - }, - "time": "2025-01-03T09:40:37+00:00" - }, - { - "name": "socialiteproviders/microsoft-azure", - "version": "5.2.0", - "source": { - "type": "git", - "url": "https://github.com/SocialiteProviders/Microsoft-Azure.git", - "reference": "453d62c9d7e3b3b76e94c913fb46e68a33347b16" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Microsoft-Azure/zipball/453d62c9d7e3b3b76e94c913fb46e68a33347b16", - "reference": "453d62c9d7e3b3b76e94c913fb46e68a33347b16", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^8.0", - "socialiteproviders/manager": "^4.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "SocialiteProviders\\Azure\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Hemmings", - "email": "chris@hemmin.gs" - } - ], - "description": "Microsoft Azure OAuth2 Provider for Laravel Socialite", - "keywords": [ - "azure", - "laravel", - "microsoft", - "oauth", - "provider", - "socialite" - ], - "support": { - "docs": "https://socialiteproviders.com/microsoft-azure", - "issues": "https://github.com/socialiteproviders/providers/issues", - "source": "https://github.com/socialiteproviders/providers" - }, - "time": "2024-03-15T03:02:10+00:00" - }, - { - "name": "spatie/backtrace", - "version": "1.7.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/backtrace.git", - "reference": "0f2477c520e3729de58e061b8192f161c99f770b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/backtrace/zipball/0f2477c520e3729de58e061b8192f161c99f770b", - "reference": "0f2477c520e3729de58e061b8192f161c99f770b", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "ext-json": "*", - "laravel/serializable-closure": "^1.3 || ^2.0", - "phpunit/phpunit": "^9.3 || ^11.4.3", - "spatie/phpunit-snapshot-assertions": "^4.2 || ^5.1.6", - "symfony/var-dumper": "^5.1 || ^6.0 || ^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\Backtrace\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van de Herten", - "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "A better backtrace", - "homepage": "https://github.com/spatie/backtrace", - "keywords": [ - "Backtrace", - "spatie" - ], - "support": { - "source": "https://github.com/spatie/backtrace/tree/1.7.1" - }, - "funding": [ - { - "url": "https://github.com/sponsors/spatie", - "type": "github" - }, - { - "url": "https://spatie.be/open-source/support-us", - "type": "other" - } - ], - "time": "2024-12-02T13:28:15+00:00" - }, - { - "name": "spatie/laravel-activitylog", - "version": "4.10.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/laravel-activitylog.git", - "reference": "466f30f7245fe3a6e328ad5e6812bd43b4bddea5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/466f30f7245fe3a6e328ad5e6812bd43b4bddea5", - "reference": "466f30f7245fe3a6e328ad5e6812bd43b4bddea5", - "shasum": "" - }, - "require": { - "illuminate/config": "^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0", - "illuminate/database": "^8.69 || ^9.27 || ^10.0 || ^11.0 || ^12.0", - "illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.6.3" - }, - "require-dev": { - "ext-json": "*", - "orchestra/testbench": "^6.23 || ^7.0 || ^8.0 || ^9.0 || ^10.0", - "pestphp/pest": "^1.20 || ^2.0 || ^3.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Spatie\\Activitylog\\ActivitylogServiceProvider" - ] - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Spatie\\Activitylog\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - }, - { - "name": "Sebastian De Deyne", - "email": "sebastian@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - }, - { - "name": "Tom Witkowski", - "email": "dev.gummibeer@gmail.com", - "homepage": "https://gummibeer.de", - "role": "Developer" - } - ], - "description": "A very simple activity logger to monitor the users of your website or application", - "homepage": "https://github.com/spatie/activitylog", - "keywords": [ - "activity", - "laravel", - "log", - "spatie", - "user" - ], - "support": { - "issues": "https://github.com/spatie/laravel-activitylog/issues", - "source": "https://github.com/spatie/laravel-activitylog/tree/4.10.1" - }, - "funding": [ - { - "url": "https://spatie.be/open-source/support-us", - "type": "custom" - }, - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2025-02-10T15:38:25+00:00" - }, - { - "name": "spatie/laravel-data", - "version": "4.13.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/laravel-data.git", - "reference": "14252330397cf84647cc086324ea1a30dbe5f7cc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-data/zipball/14252330397cf84647cc086324ea1a30dbe5f7cc", - "reference": "14252330397cf84647cc086324ea1a30dbe5f7cc", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^10.0|^11.0|^12.0", - "php": "^8.1", - "phpdocumentor/reflection": "^6.0", - "spatie/laravel-package-tools": "^1.9.0", - "spatie/php-structure-discoverer": "^2.0" - }, - "require-dev": { - "fakerphp/faker": "^1.14", - "friendsofphp/php-cs-fixer": "^3.0", - "livewire/livewire": "^3.0", - "mockery/mockery": "^1.6", - "nesbot/carbon": "^2.63|^3.0", - "orchestra/testbench": "^8.0|^9.0|^10.0", - "pestphp/pest": "^2.31|^3.0", - "pestphp/pest-plugin-laravel": "^2.0|^3.0", - "pestphp/pest-plugin-livewire": "^2.1|^3.0", - "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.1", - "phpunit/phpunit": "^10.0|^11.0|^12.0", - "spatie/invade": "^1.0", - "spatie/laravel-typescript-transformer": "^2.5", - "spatie/pest-plugin-snapshots": "^2.1", - "spatie/test-time": "^1.2" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Spatie\\LaravelData\\LaravelDataServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Spatie\\LaravelData\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ruben Van Assche", - "email": "ruben@spatie.be", - "role": "Developer" - } - ], - "description": "Create unified resources and data transfer objects", - "homepage": "https://github.com/spatie/laravel-data", - "keywords": [ - "laravel", - "laravel-data", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/laravel-data/issues", - "source": "https://github.com/spatie/laravel-data/tree/4.13.1" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2025-02-14T14:29:16+00:00" - }, - { - "name": "spatie/laravel-package-tools", - "version": "1.19.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "1c9c30ac6a6576b8d15c6c37b6cf23d748df2faa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/1c9c30ac6a6576b8d15c6c37b6cf23d748df2faa", - "reference": "1c9c30ac6a6576b8d15c6c37b6cf23d748df2faa", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^9.28|^10.0|^11.0|^12.0", - "php": "^8.0" - }, - "require-dev": { - "mockery/mockery": "^1.5", - "orchestra/testbench": "^7.7|^8.0|^9.0|^10.0", - "pestphp/pest": "^1.23|^2.1|^3.1", - "phpunit/phpunit": "^9.5.24|^10.5|^11.5", - "spatie/pest-plugin-test-time": "^1.1|^2.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\LaravelPackageTools\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "role": "Developer" - } - ], - "description": "Tools for creating Laravel packages", - "homepage": "https://github.com/spatie/laravel-package-tools", - "keywords": [ - "laravel-package-tools", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.19.0" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2025-02-06T14:58:20+00:00" - }, - { - "name": "spatie/laravel-ray", - "version": "1.39.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/laravel-ray.git", - "reference": "0d890fa2cd2c0b6175cf54c56b9321d81047571d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/0d890fa2cd2c0b6175cf54c56b9321d81047571d", - "reference": "0d890fa2cd2c0b6175cf54c56b9321d81047571d", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.2", - "ext-json": "*", - "illuminate/contracts": "^7.20 || ^8.19 || ^9.0 || ^10.0 || ^11.0 || ^12.0", - "illuminate/database": "^7.20 || ^8.19 || ^9.0 || ^10.0 || ^11.0 || ^12.0", - "illuminate/queue": "^7.20 || ^8.19 || ^9.0 || ^10.0 || ^11.0 || ^12.0", - "illuminate/support": "^7.20 || ^8.19 || ^9.0 || ^10.0 || ^11.0 || ^12.0", - "php": "^7.4 || ^8.0", - "spatie/backtrace": "^1.7.1", - "spatie/ray": "^1.41.3", - "symfony/stopwatch": "4.2 || ^5.1 || ^6.0 || ^7.0", - "zbateson/mail-mime-parser": "^1.3.1 || ^2.0 || ^3.0" - }, - "require-dev": { - "guzzlehttp/guzzle": "^7.3", - "laravel/framework": "^7.20 || ^8.19 || ^9.0 || ^10.0 || ^11.0 || ^12.0", - "orchestra/testbench-core": "^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0", - "pestphp/pest": "^1.22 || ^2.0 || ^3.0", - "phpstan/phpstan": "^1.10.57 || ^2.0.2", - "phpunit/phpunit": "^9.3 || ^10.1 || ^11.0.10", - "rector/rector": "^0.19.2 || ^1.0.1 || ^2.0.0", - "spatie/pest-plugin-snapshots": "^1.1 || ^2.0", - "symfony/var-dumper": "^4.2 || ^5.1 || ^6.0 || ^7.0.3" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Spatie\\LaravelRay\\RayServiceProvider" - ] - }, - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Spatie\\LaravelRay\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "Easily debug Laravel apps", - "homepage": "https://github.com/spatie/laravel-ray", - "keywords": [ - "laravel-ray", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/laravel-ray/issues", - "source": "https://github.com/spatie/laravel-ray/tree/1.39.1" - }, - "funding": [ - { - "url": "https://github.com/sponsors/spatie", - "type": "github" - }, - { - "url": "https://spatie.be/open-source/support-us", - "type": "other" - } - ], - "time": "2025-02-05T08:16:15+00:00" - }, - { - "name": "spatie/laravel-schemaless-attributes", - "version": "2.5.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/laravel-schemaless-attributes.git", - "reference": "3561875fb6886ae55e5378f20ba5ac87f20b265a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-schemaless-attributes/zipball/3561875fb6886ae55e5378f20ba5ac87f20b265a", - "reference": "3561875fb6886ae55e5378f20ba5ac87f20b265a", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/database": "^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/support": "^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "php": "^8.0", - "spatie/laravel-package-tools": "^1.4.3" - }, - "require-dev": { - "brianium/paratest": "^6.2|^7.4", - "mockery/mockery": "^1.4", - "nunomaduro/collision": "^5.3|^6.0|^8.0", - "orchestra/testbench": "^6.15|^7.0|^8.0|^9.0|^10.0", - "pestphp/pest-plugin-laravel": "^1.3|^2.1|^3.1", - "phpunit/phpunit": "^9.6|^10.5|^11.5|^12.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Spatie\\SchemalessAttributes\\SchemalessAttributesServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Spatie\\SchemalessAttributes\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "Add schemaless attributes to Eloquent models", - "homepage": "https://github.com/spatie/laravel-schemaless-attributes", - "keywords": [ - "laravel-schemaless-attributes", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/laravel-schemaless-attributes/issues", - "source": "https://github.com/spatie/laravel-schemaless-attributes/tree/2.5.1" - }, - "funding": [ - { - "url": "https://spatie.be/open-source/support-us", - "type": "custom" - }, - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2025-02-10T09:28:22+00:00" - }, - { - "name": "spatie/macroable", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/macroable.git", - "reference": "ec2c320f932e730607aff8052c44183cf3ecb072" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/macroable/zipball/ec2c320f932e730607aff8052c44183cf3ecb072", - "reference": "ec2c320f932e730607aff8052c44183cf3ecb072", - "shasum": "" - }, - "require": { - "php": "^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^8.0|^9.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\Macroable\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "A trait to dynamically add methods to a class", - "homepage": "https://github.com/spatie/macroable", - "keywords": [ - "macroable", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/macroable/issues", - "source": "https://github.com/spatie/macroable/tree/2.0.0" - }, - "time": "2021-03-26T22:39:02+00:00" - }, - { - "name": "spatie/php-structure-discoverer", - "version": "2.3.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/php-structure-discoverer.git", - "reference": "42f4d731d3dd4b3b85732e05a8c1928fcfa2f4bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/php-structure-discoverer/zipball/42f4d731d3dd4b3b85732e05a8c1928fcfa2f4bc", - "reference": "42f4d731d3dd4b3b85732e05a8c1928fcfa2f4bc", - "shasum": "" - }, - "require": { - "amphp/amp": "^v3.0", - "amphp/parallel": "^2.2", - "illuminate/collections": "^10.0|^11.0|^12.0", - "php": "^8.1", - "spatie/laravel-package-tools": "^1.4.3", - "symfony/finder": "^6.0|^7.0" - }, - "require-dev": { - "illuminate/console": "^10.0|^11.0|^12.0", - "laravel/pint": "^1.0", - "nunomaduro/collision": "^7.0|^8.0", - "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", - "pestphp/pest": "^2.0|^3.0", - "pestphp/pest-plugin-laravel": "^2.0|^3.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^9.5|^10.0|^11.5.3", - "spatie/laravel-ray": "^1.26" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Spatie\\StructureDiscoverer\\StructureDiscovererServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Spatie\\StructureDiscoverer\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ruben Van Assche", - "email": "ruben@spatie.be", - "role": "Developer" - } - ], - "description": "Automatically discover structures within your PHP application", - "homepage": "https://github.com/spatie/php-structure-discoverer", - "keywords": [ - "discover", - "laravel", - "php", - "php-structure-discoverer" - ], - "support": { - "issues": "https://github.com/spatie/php-structure-discoverer/issues", - "source": "https://github.com/spatie/php-structure-discoverer/tree/2.3.1" - }, - "funding": [ - { - "url": "https://github.com/LaravelAutoDiscoverer", - "type": "github" - } - ], - "time": "2025-02-14T10:18:38+00:00" - }, - { - "name": "spatie/ray", - "version": "1.41.5", - "source": { - "type": "git", - "url": "https://github.com/spatie/ray.git", - "reference": "9d078f04ffa32ad543a20716844ec343fdd7d856" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/ray/zipball/9d078f04ffa32ad543a20716844ec343fdd7d856", - "reference": "9d078f04ffa32ad543a20716844ec343fdd7d856", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-json": "*", - "php": "^7.4 || ^8.0", - "ramsey/uuid": "^3.0 || ^4.1", - "spatie/backtrace": "^1.7.1", - "spatie/macroable": "^1.0 || ^2.0", - "symfony/stopwatch": "^4.2 || ^5.1 || ^6.0 || ^7.0", - "symfony/var-dumper": "^4.2 || ^5.1 || ^6.0 || ^7.0.3" - }, - "require-dev": { - "illuminate/support": "^7.20 || ^8.18 || ^9.0 || ^10.0 || ^11.0 || ^12.0", - "nesbot/carbon": "^2.63 || ^3.8.4", - "pestphp/pest": "^1.22", - "phpstan/phpstan": "^1.10.57 || ^2.0.3", - "phpunit/phpunit": "^9.5", - "rector/rector": "^0.19.2 || ^1.0.1 || ^2.0.0", - "spatie/phpunit-snapshot-assertions": "^4.2", - "spatie/test-time": "^1.2" - }, - "bin": [ - "bin/remove-ray.sh" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Spatie\\Ray\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "Debug with Ray to fix problems faster", - "homepage": "https://github.com/spatie/ray", - "keywords": [ - "ray", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/ray/issues", - "source": "https://github.com/spatie/ray/tree/1.41.5" - }, - "funding": [ - { - "url": "https://github.com/sponsors/spatie", - "type": "github" - }, - { - "url": "https://spatie.be/open-source/support-us", - "type": "other" - } - ], - "time": "2025-02-14T12:51:43+00:00" - }, - { - "name": "spatie/url", - "version": "2.4.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/url.git", - "reference": "93a51db743cdec22b081c64593e193887c9cd395" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/url/zipball/93a51db743cdec22b081c64593e193887c9cd395", - "reference": "93a51db743cdec22b081c64593e193887c9cd395", - "shasum": "" - }, - "require": { - "php": "^8.0", - "psr/http-message": "^1.0 || ^2.0", - "spatie/macroable": "^1.0 || ^2.0" - }, - "require-dev": { - "pestphp/pest": "^1.21" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\Url\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sebastian De Deyne", - "email": "sebastian@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "Parse, build and manipulate URL's", - "homepage": "https://github.com/spatie/url", - "keywords": [ - "spatie", - "url" - ], - "support": { - "issues": "https://github.com/spatie/url/issues", - "source": "https://github.com/spatie/url/tree/2.4.0" - }, - "funding": [ - { - "url": "https://spatie.be/open-source/support-us", - "type": "custom" - }, - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2024-03-08T11:35:19+00:00" - }, - { - "name": "stevebauman/purify", - "version": "v6.3.0", - "source": { - "type": "git", - "url": "https://github.com/stevebauman/purify.git", - "reference": "2e5e6e1bfe072189b6056c6ad4a8c68ba57f3ba1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/stevebauman/purify/zipball/2e5e6e1bfe072189b6056c6ad4a8c68ba57f3ba1", - "reference": "2e5e6e1bfe072189b6056c6ad4a8c68ba57f3ba1", - "shasum": "" - }, - "require": { - "ezyang/htmlpurifier": "^4.17", - "illuminate/contracts": "^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/support": "^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "php": ">=7.4" - }, - "require-dev": { - "orchestra/testbench": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0", - "phpunit/phpunit": "^8.0|^9.0|^10.0|^11.5.3" - }, - "type": "library", - "extra": { - "laravel": { - "aliases": { - "Purify": "Stevebauman\\Purify\\Facades\\Purify" - }, - "providers": [ - "Stevebauman\\Purify\\PurifyServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Stevebauman\\Purify\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Steve Bauman", - "email": "steven_bauman@outlook.com" - } - ], - "description": "An HTML Purifier / Sanitizer for Laravel", - "keywords": [ - "Purifier", - "clean", - "cleaner", - "html", - "laravel", - "purification", - "purify" - ], - "support": { - "issues": "https://github.com/stevebauman/purify/issues", - "source": "https://github.com/stevebauman/purify/tree/v6.3.0" - }, - "time": "2025-02-18T23:08:15+00:00" - }, - { - "name": "stripe/stripe-php", - "version": "v16.5.1", - "source": { - "type": "git", - "url": "https://github.com/stripe/stripe-php.git", - "reference": "05c7c3a8a15b1bc396f09d17c88539c0db3d3255" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/stripe/stripe-php/zipball/05c7c3a8a15b1bc396f09d17c88539c0db3d3255", - "reference": "05c7c3a8a15b1bc396f09d17c88539c0db3d3255", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "php": ">=5.6.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "3.5.0", - "phpstan/phpstan": "^1.2", - "phpunit/phpunit": "^5.7 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "psr-4": { - "Stripe\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Stripe and contributors", - "homepage": "https://github.com/stripe/stripe-php/contributors" - } - ], - "description": "Stripe PHP Library", - "homepage": "https://stripe.com/", - "keywords": [ - "api", - "payment processing", - "stripe" - ], - "support": { - "issues": "https://github.com/stripe/stripe-php/issues", - "source": "https://github.com/stripe/stripe-php/tree/v16.5.1" - }, - "time": "2025-02-07T21:24:29+00:00" - }, { "name": "symfony/clock", "version": "v7.2.0", @@ -9564,73 +4236,6 @@ ], "time": "2025-02-19T08:51:20+00:00" }, - { - "name": "symfony/options-resolver", - "version": "v7.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50", - "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an improved replacement for the array_replace PHP function", - "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], - "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.2.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-11-20T11:17:29+00:00" - }, { "name": "symfony/polyfill-ctype", "version": "v1.31.0", @@ -9710,86 +4315,6 @@ ], "time": "2024-09-09T11:45:10+00:00" }, - { - "name": "symfony/polyfill-iconv", - "version": "v1.31.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "48becf00c920479ca2e910c22a5a39e5d47ca956" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/48becf00c920479ca2e910c22a5a39e5d47ca956", - "reference": "48becf00c920479ca2e910c22a5a39e5d47ca956", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "provide": { - "ext-iconv": "*" - }, - "suggest": { - "ext-iconv": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Iconv\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Iconv extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "iconv", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.31.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-09T11:45:10+00:00" - }, { "name": "symfony/polyfill-intl-grapheme", "version": "v1.31.0", @@ -10408,89 +4933,6 @@ ], "time": "2025-02-05T08:33:46+00:00" }, - { - "name": "symfony/psr-http-message-bridge", - "version": "v7.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "03f2f72319e7acaf2a9f6fcbe30ef17eec51594f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/03f2f72319e7acaf2a9f6fcbe30ef17eec51594f", - "reference": "03f2f72319e7acaf2a9f6fcbe30ef17eec51594f", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "psr/http-message": "^1.0|^2.0", - "symfony/http-foundation": "^6.4|^7.0" - }, - "conflict": { - "php-http/discovery": "<1.15", - "symfony/http-kernel": "<6.4" - }, - "require-dev": { - "nyholm/psr7": "^1.1", - "php-http/discovery": "^1.15", - "psr/log": "^1.1.4|^2|^3", - "symfony/browser-kit": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/framework-bundle": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0" - }, - "type": "symfony-bridge", - "autoload": { - "psr-4": { - "Symfony\\Bridge\\PsrHttpMessage\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "PSR HTTP message bridge", - "homepage": "https://symfony.com", - "keywords": [ - "http", - "http-message", - "psr-17", - "psr-7" - ], - "support": { - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.2.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-26T08:57:56+00:00" - }, { "name": "symfony/routing", "version": "v7.2.3", @@ -10655,68 +5097,6 @@ ], "time": "2024-09-25T14:20:29+00:00" }, - { - "name": "symfony/stopwatch", - "version": "v7.2.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/e46690d5b9d7164a6d061cab1e8d46141b9f49df", - "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/service-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides a way to profile code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.2.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-12-18T14:28:33+00:00" - }, { "name": "symfony/string", "version": "v7.2.0", @@ -11134,78 +5514,6 @@ ], "time": "2025-01-17T11:39:41+00:00" }, - { - "name": "symfony/yaml", - "version": "v7.2.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/ac238f173df0c9c1120f862d0f599e17535a87ec", - "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<6.4" - }, - "require-dev": { - "symfony/console": "^6.4|^7.0" - }, - "bin": [ - "Resources/bin/yaml-lint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v7.2.3" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-01-07T12:55:42+00:00" - }, { "name": "tijsverkoyen/css-to-inline-styles", "version": "v2.3.0", @@ -11261,64 +5569,6 @@ }, "time": "2024-12-21T16:25:41+00:00" }, - { - "name": "visus/cuid2", - "version": "4.1.0", - "source": { - "type": "git", - "url": "https://github.com/visus-io/php-cuid2.git", - "reference": "17c9b3098d556bb2556a084c948211333cc19c79" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/visus-io/php-cuid2/zipball/17c9b3098d556bb2556a084c948211333cc19c79", - "reference": "17c9b3098d556bb2556a084c948211333cc19c79", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "ergebnis/composer-normalize": "^2.29", - "ext-ctype": "*", - "phpstan/phpstan": "^1.9", - "phpunit/phpunit": "^10.0", - "squizlabs/php_codesniffer": "^3.7", - "vimeo/psalm": "^5.4" - }, - "suggest": { - "ext-gmp": "*" - }, - "type": "library", - "autoload": { - "files": [ - "src/compat.php" - ], - "psr-4": { - "Visus\\Cuid2\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alan Brault", - "email": "alan.brault@visus.io" - } - ], - "description": "A PHP library for generating collision-resistant ids (CUIDs).", - "keywords": [ - "cuid", - "identifier" - ], - "support": { - "issues": "https://github.com/visus-io/php-cuid2/issues", - "source": "https://github.com/visus-io/php-cuid2/tree/4.1.0" - }, - "time": "2024-05-14T13:23:35+00:00" - }, { "name": "vlucas/phpdotenv", "version": "v5.6.1", @@ -11534,629 +5784,9 @@ "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, "time": "2022-06-03T18:03:27+00:00" - }, - { - "name": "yosymfony/parser-utils", - "version": "v2.0.0", - "source": { - "type": "git", - "url": "https://github.com/yosymfony/parser-utils.git", - "reference": "00bec9a12722b21f2baf7f9db35f127e90c162c9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yosymfony/parser-utils/zipball/00bec9a12722b21f2baf7f9db35f127e90c162c9", - "reference": "00bec9a12722b21f2baf7f9db35f127e90c162c9", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "^6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "psr-4": { - "Yosymfony\\ParserUtils\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Victor Puertas", - "email": "vpgugr@gmail.com", - "homepage": "http://yosymfony.com" - } - ], - "description": "Parser utilities", - "homepage": "http://github.com/yosymfony/toml", - "keywords": [ - "lexer", - "parser" - ], - "support": { - "issues": "https://github.com/yosymfony/parser-utils/issues", - "source": "https://github.com/yosymfony/parser-utils/tree/master" - }, - "time": "2018-06-29T15:31:11+00:00" - }, - { - "name": "yosymfony/toml", - "version": "v1.0.4", - "source": { - "type": "git", - "url": "https://github.com/yosymfony/toml.git", - "reference": "bdab92ad920d0e36810a3a3e4a998d23f3498f8e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yosymfony/toml/zipball/bdab92ad920d0e36810a3a3e4a998d23f3498f8e", - "reference": "bdab92ad920d0e36810a3a3e4a998d23f3498f8e", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "yosymfony/parser-utils": "^2.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "Yosymfony\\Toml\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Victor Puertas", - "email": "vpgugr@gmail.com", - "homepage": "http://yosymfony.com" - } - ], - "description": "A PHP parser for TOML compatible with specification 0.4.0", - "homepage": "http://github.com/yosymfony/toml", - "keywords": [ - "mojombo", - "parser", - "toml" - ], - "support": { - "issues": "https://github.com/yosymfony/toml/issues", - "source": "https://github.com/yosymfony/toml/tree/master" - }, - "time": "2018-08-08T15:08:14+00:00" - }, - { - "name": "zbateson/mail-mime-parser", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/zbateson/mail-mime-parser.git", - "reference": "e0d4423fe27850c9dd301190767dbc421acc2f19" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/e0d4423fe27850c9dd301190767dbc421acc2f19", - "reference": "e0d4423fe27850c9dd301190767dbc421acc2f19", - "shasum": "" - }, - "require": { - "guzzlehttp/psr7": "^2.5", - "php": ">=8.0", - "php-di/php-di": "^6.0|^7.0", - "psr/log": "^1|^2|^3", - "zbateson/mb-wrapper": "^2.0", - "zbateson/stream-decorators": "^2.1" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "*", - "monolog/monolog": "^2|^3", - "phpstan/phpstan": "*", - "phpunit/phpunit": "^9.6" - }, - "suggest": { - "ext-iconv": "For best support/performance", - "ext-mbstring": "For best support/performance" - }, - "type": "library", - "autoload": { - "psr-4": { - "ZBateson\\MailMimeParser\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Zaahid Bateson" - }, - { - "name": "Contributors", - "homepage": "https://github.com/zbateson/mail-mime-parser/graphs/contributors" - } - ], - "description": "MIME email message parser", - "homepage": "https://mail-mime-parser.org", - "keywords": [ - "MimeMailParser", - "email", - "mail", - "mailparse", - "mime", - "mimeparse", - "parser", - "php-imap" - ], - "support": { - "docs": "https://mail-mime-parser.org/#usage-guide", - "issues": "https://github.com/zbateson/mail-mime-parser/issues", - "source": "https://github.com/zbateson/mail-mime-parser" - }, - "funding": [ - { - "url": "https://github.com/zbateson", - "type": "github" - } - ], - "time": "2024-08-10T18:44:09+00:00" - }, - { - "name": "zbateson/mb-wrapper", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/zbateson/mb-wrapper.git", - "reference": "50a14c0c9537f978a61cde9fdc192a0267cc9cff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/50a14c0c9537f978a61cde9fdc192a0267cc9cff", - "reference": "50a14c0c9537f978a61cde9fdc192a0267cc9cff", - "shasum": "" - }, - "require": { - "php": ">=8.0", - "symfony/polyfill-iconv": "^1.9", - "symfony/polyfill-mbstring": "^1.9" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "*", - "phpstan/phpstan": "*", - "phpunit/phpunit": "^9.6|^10.0" - }, - "suggest": { - "ext-iconv": "For best support/performance", - "ext-mbstring": "For best support/performance" - }, - "type": "library", - "autoload": { - "psr-4": { - "ZBateson\\MbWrapper\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Zaahid Bateson" - } - ], - "description": "Wrapper for mbstring with fallback to iconv for encoding conversion and string manipulation", - "keywords": [ - "charset", - "encoding", - "http", - "iconv", - "mail", - "mb", - "mb_convert_encoding", - "mbstring", - "mime", - "multibyte", - "string" - ], - "support": { - "issues": "https://github.com/zbateson/mb-wrapper/issues", - "source": "https://github.com/zbateson/mb-wrapper/tree/2.0.1" - }, - "funding": [ - { - "url": "https://github.com/zbateson", - "type": "github" - } - ], - "time": "2024-12-20T22:05:33+00:00" - }, - { - "name": "zbateson/stream-decorators", - "version": "2.1.1", - "source": { - "type": "git", - "url": "https://github.com/zbateson/stream-decorators.git", - "reference": "32a2a62fb0f26313395c996ebd658d33c3f9c4e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/32a2a62fb0f26313395c996ebd658d33c3f9c4e5", - "reference": "32a2a62fb0f26313395c996ebd658d33c3f9c4e5", - "shasum": "" - }, - "require": { - "guzzlehttp/psr7": "^2.5", - "php": ">=8.0", - "zbateson/mb-wrapper": "^2.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "*", - "phpstan/phpstan": "*", - "phpunit/phpunit": "^9.6|^10.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "ZBateson\\StreamDecorators\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Zaahid Bateson" - } - ], - "description": "PHP psr7 stream decorators for mime message part streams", - "keywords": [ - "base64", - "charset", - "decorators", - "mail", - "mime", - "psr7", - "quoted-printable", - "stream", - "uuencode" - ], - "support": { - "issues": "https://github.com/zbateson/stream-decorators/issues", - "source": "https://github.com/zbateson/stream-decorators/tree/2.1.1" - }, - "funding": [ - { - "url": "https://github.com/zbateson", - "type": "github" - } - ], - "time": "2024-04-29T21:42:39+00:00" - }, - { - "name": "zircote/swagger-php", - "version": "5.0.5", - "source": { - "type": "git", - "url": "https://github.com/zircote/swagger-php.git", - "reference": "2eb4005840058d8844a0bcc14403932331331068" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zircote/swagger-php/zipball/2eb4005840058d8844a0bcc14403932331331068", - "reference": "2eb4005840058d8844a0bcc14403932331331068", - "shasum": "" - }, - "require": { - "ext-json": "*", - "nikic/php-parser": "^4.19 || ^5.0", - "php": ">=7.4", - "psr/log": "^1.1 || ^2.0 || ^3.0", - "symfony/deprecation-contracts": "^2 || ^3", - "symfony/finder": "^5.0 || ^6.0 || ^7.0", - "symfony/yaml": "^5.0 || ^6.0 || ^7.0" - }, - "conflict": { - "symfony/process": ">=6, <6.4.14" - }, - "require-dev": { - "composer/package-versions-deprecated": "^1.11", - "doctrine/annotations": "^2.0", - "friendsofphp/php-cs-fixer": "^3.62.0", - "phpstan/phpstan": "^1.6 || ^2.0", - "phpunit/phpunit": "^9.0", - "rector/rector": "^1.0 || ^2.0", - "vimeo/psalm": "^4.30 || ^5.0" - }, - "suggest": { - "doctrine/annotations": "^2.0" - }, - "bin": [ - "bin/openapi" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "OpenApi\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Robert Allen", - "email": "zircote@gmail.com" - }, - { - "name": "Bob Fanger", - "email": "bfanger@gmail.com", - "homepage": "https://bfanger.nl" - }, - { - "name": "Martin Rademacher", - "email": "mano@radebatz.net", - "homepage": "https://radebatz.net" - } - ], - "description": "swagger-php - Generate interactive documentation for your RESTful API using phpdoc annotations", - "homepage": "https://github.com/zircote/swagger-php/", - "keywords": [ - "api", - "json", - "rest", - "service discovery" - ], - "support": { - "issues": "https://github.com/zircote/swagger-php/issues", - "source": "https://github.com/zircote/swagger-php/tree/5.0.5" - }, - "time": "2025-02-24T00:48:00+00:00" } ], "packages-dev": [ - { - "name": "barryvdh/laravel-debugbar", - "version": "v3.15.1", - "source": { - "type": "git", - "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "62b222166a9505926d54fadf7663bb4a26ed9014" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/62b222166a9505926d54fadf7663bb4a26ed9014", - "reference": "62b222166a9505926d54fadf7663bb4a26ed9014", - "shasum": "" - }, - "require": { - "illuminate/routing": "^9|^10|^11|^12", - "illuminate/session": "^9|^10|^11|^12", - "illuminate/support": "^9|^10|^11|^12", - "php": "^8.1", - "php-debugbar/php-debugbar": "~2.1.1", - "symfony/finder": "^6|^7" - }, - "conflict": { - "maximebf/debugbar": "*" - }, - "require-dev": { - "mockery/mockery": "^1.3.3", - "orchestra/testbench-dusk": "^7|^8|^9|^10", - "phpunit/phpunit": "^9.5.10|^10|^11", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "extra": { - "laravel": { - "aliases": { - "Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar" - }, - "providers": [ - "Barryvdh\\Debugbar\\ServiceProvider" - ] - }, - "branch-alias": { - "dev-master": "3.15-dev" - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Barryvdh\\Debugbar\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "PHP Debugbar integration for Laravel", - "keywords": [ - "debug", - "debugbar", - "dev", - "laravel", - "profiler", - "webprofiler" - ], - "support": { - "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.15.1" - }, - "funding": [ - { - "url": "https://fruitcake.nl", - "type": "custom" - }, - { - "url": "https://github.com/barryvdh", - "type": "github" - } - ], - "time": "2025-02-24T10:48:28+00:00" - }, - { - "name": "brianium/paratest", - "version": "v7.7.0", - "source": { - "type": "git", - "url": "https://github.com/paratestphp/paratest.git", - "reference": "4fb3f73bc5a4c3146bac2850af7dc72435a32daf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/4fb3f73bc5a4c3146bac2850af7dc72435a32daf", - "reference": "4fb3f73bc5a4c3146bac2850af7dc72435a32daf", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-simplexml": "*", - "fidry/cpu-core-counter": "^1.2.0", - "jean85/pretty-package-versions": "^2.1.0", - "php": "~8.2.0 || ~8.3.0 || ~8.4.0", - "phpunit/php-code-coverage": "^11.0.8", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-timer": "^7.0.1", - "phpunit/phpunit": "^11.5.1", - "sebastian/environment": "^7.2.0", - "symfony/console": "^6.4.14 || ^7.2.1", - "symfony/process": "^6.4.14 || ^7.2.0" - }, - "require-dev": { - "doctrine/coding-standard": "^12.0.0", - "ext-pcov": "*", - "ext-posix": "*", - "phpstan/phpstan": "^2.0.3", - "phpstan/phpstan-deprecation-rules": "^2.0.1", - "phpstan/phpstan-phpunit": "^2.0.1", - "phpstan/phpstan-strict-rules": "^2", - "squizlabs/php_codesniffer": "^3.11.1", - "symfony/filesystem": "^6.4.13 || ^7.2.0" - }, - "bin": [ - "bin/paratest", - "bin/paratest_for_phpstorm" - ], - "type": "library", - "autoload": { - "psr-4": { - "ParaTest\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brian Scaturro", - "email": "scaturrob@gmail.com", - "role": "Developer" - }, - { - "name": "Filippo Tessarotto", - "email": "zoeslam@gmail.com", - "role": "Developer" - } - ], - "description": "Parallel testing for PHP", - "homepage": "https://github.com/paratestphp/paratest", - "keywords": [ - "concurrent", - "parallel", - "phpunit", - "testing" - ], - "support": { - "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.7.0" - }, - "funding": [ - { - "url": "https://github.com/sponsors/Slamdunk", - "type": "github" - }, - { - "url": "https://paypal.me/filippotessarotto", - "type": "paypal" - } - ], - "time": "2024-12-11T14:50:44+00:00" - }, - { - "name": "driftingly/rector-laravel", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/driftingly/rector-laravel.git", - "reference": "f0e3a9e2c92ff760730d1af34fbdc43f51f3b868" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/driftingly/rector-laravel/zipball/f0e3a9e2c92ff760730d1af34fbdc43f51f3b868", - "reference": "f0e3a9e2c92ff760730d1af34fbdc43f51f3b868", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "rector/rector": "^2.0" - }, - "type": "rector-extension", - "autoload": { - "psr-4": { - "RectorLaravel\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Rector upgrades rules for Laravel Framework", - "support": { - "issues": "https://github.com/driftingly/rector-laravel/issues", - "source": "https://github.com/driftingly/rector-laravel/tree/2.0.2" - }, - "time": "2025-01-17T18:07:03+00:00" - }, { "name": "fakerphp/faker", "version": "v1.24.1", @@ -12220,79 +5850,18 @@ }, "time": "2024-11-21T13:46:39+00:00" }, - { - "name": "fidry/cpu-core-counter", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "8520451a140d3f46ac33042715115e290cf5785f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", - "reference": "8520451a140d3f46ac33042715115e290cf5785f", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "fidry/makefile": "^0.2.0", - "fidry/php-cs-fixer-config": "^1.1.2", - "phpstan/extension-installer": "^1.2.0", - "phpstan/phpstan": "^1.9.2", - "phpstan/phpstan-deprecation-rules": "^1.0.0", - "phpstan/phpstan-phpunit": "^1.2.2", - "phpstan/phpstan-strict-rules": "^1.4.4", - "phpunit/phpunit": "^8.5.31 || ^9.5.26", - "webmozarts/strict-phpunit": "^7.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Fidry\\CpuCoreCounter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Théo FIDRY", - "email": "theo.fidry@gmail.com" - } - ], - "description": "Tiny utility to get the number of CPU cores.", - "keywords": [ - "CPU", - "core" - ], - "support": { - "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" - }, - "funding": [ - { - "url": "https://github.com/theofidry", - "type": "github" - } - ], - "time": "2024-08-06T10:04:20+00:00" - }, { "name": "filp/whoops", - "version": "2.17.0", + "version": "2.18.0", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "075bc0c26631110584175de6523ab3f1652eb28e" + "reference": "a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/075bc0c26631110584175de6523ab3f1652eb28e", - "reference": "075bc0c26631110584175de6523ab3f1652eb28e", + "url": "https://api.github.com/repos/filp/whoops/zipball/a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e", + "reference": "a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e", "shasum": "" }, "require": { @@ -12342,7 +5911,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.17.0" + "source": "https://github.com/filp/whoops/tree/2.18.0" }, "funding": [ { @@ -12350,7 +5919,7 @@ "type": "github" } ], - "time": "2025-01-25T12:00:00+00:00" + "time": "2025-03-15T12:00:00+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -12404,55 +5973,53 @@ "time": "2020-07-09T08:09:16+00:00" }, { - "name": "laravel/dusk", - "version": "v8.3.1", + "name": "laravel/pail", + "version": "v1.2.2", "source": { "type": "git", - "url": "https://github.com/laravel/dusk.git", - "reference": "541ca2d2004ae4ed04446b9e712b68180fca158c" + "url": "https://github.com/laravel/pail.git", + "reference": "f31f4980f52be17c4667f3eafe034e6826787db2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/dusk/zipball/541ca2d2004ae4ed04446b9e712b68180fca158c", - "reference": "541ca2d2004ae4ed04446b9e712b68180fca158c", + "url": "https://api.github.com/repos/laravel/pail/zipball/f31f4980f52be17c4667f3eafe034e6826787db2", + "reference": "f31f4980f52be17c4667f3eafe034e6826787db2", "shasum": "" }, "require": { - "ext-json": "*", - "ext-zip": "*", - "guzzlehttp/guzzle": "^7.5", - "illuminate/console": "^10.0|^11.0|^12.0", - "illuminate/support": "^10.0|^11.0|^12.0", - "php": "^8.1", - "php-webdriver/webdriver": "^1.15.2", - "symfony/console": "^6.2|^7.0", - "symfony/finder": "^6.2|^7.0", - "symfony/process": "^6.2|^7.0", - "vlucas/phpdotenv": "^5.2" + "ext-mbstring": "*", + "illuminate/console": "^10.24|^11.0|^12.0", + "illuminate/contracts": "^10.24|^11.0|^12.0", + "illuminate/log": "^10.24|^11.0|^12.0", + "illuminate/process": "^10.24|^11.0|^12.0", + "illuminate/support": "^10.24|^11.0|^12.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0" }, "require-dev": { - "laravel/framework": "^10.0|^11.0|^12.0", - "mockery/mockery": "^1.6", - "orchestra/testbench-core": "^8.19|^9.0|^10.0", + "laravel/framework": "^10.24|^11.0|^12.0", + "laravel/pint": "^1.13", + "orchestra/testbench-core": "^8.13|^9.0|^10.0", + "pestphp/pest": "^2.20|^3.0", + "pestphp/pest-plugin-type-coverage": "^2.3|^3.0", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.1|^11.0|^12.0.1", - "psy/psysh": "^0.11.12|^0.12", - "symfony/yaml": "^6.2|^7.0" - }, - "suggest": { - "ext-pcntl": "Used to gracefully terminate Dusk when tests are running." + "symfony/var-dumper": "^6.3|^7.0" }, "type": "library", "extra": { "laravel": { "providers": [ - "Laravel\\Dusk\\DuskServiceProvider" + "Laravel\\Pail\\PailServiceProvider" ] + }, + "branch-alias": { + "dev-main": "1.x-dev" } }, "autoload": { "psr-4": { - "Laravel\\Dusk\\": "src/" + "Laravel\\Pail\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -12463,32 +6030,38 @@ { "name": "Taylor Otwell", "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" } ], - "description": "Laravel Dusk provides simple end-to-end testing and browser automation.", + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", "keywords": [ "laravel", - "testing", - "webdriver" + "logs", + "php", + "tail" ], "support": { - "issues": "https://github.com/laravel/dusk/issues", - "source": "https://github.com/laravel/dusk/tree/v8.3.1" + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" }, - "time": "2025-02-12T16:14:51+00:00" + "time": "2025-01-28T15:15:15+00:00" }, { "name": "laravel/pint", - "version": "v1.21.0", + "version": "v1.21.2", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "531fa0871fbde719c51b12afa3a443b8f4e4b425" + "reference": "370772e7d9e9da087678a0edf2b11b6960e40558" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/531fa0871fbde719c51b12afa3a443b8f4e4b425", - "reference": "531fa0871fbde719c51b12afa3a443b8f4e4b425", + "url": "https://api.github.com/repos/laravel/pint/zipball/370772e7d9e9da087678a0edf2b11b6960e40558", + "reference": "370772e7d9e9da087678a0edf2b11b6960e40558", "shasum": "" }, "require": { @@ -12499,9 +6072,9 @@ "php": "^8.2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.68.5", - "illuminate/view": "^11.42.0", - "larastan/larastan": "^3.0.4", + "friendsofphp/php-cs-fixer": "^3.72.0", + "illuminate/view": "^11.44.2", + "larastan/larastan": "^3.2.0", "laravel-zero/framework": "^11.36.1", "mockery/mockery": "^1.6.12", "nunomaduro/termwind": "^2.3", @@ -12541,49 +6114,48 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2025-02-18T03:18:57+00:00" + "time": "2025-03-14T22:31:42+00:00" }, { - "name": "laravel/telescope", - "version": "v5.5.0", + "name": "laravel/sail", + "version": "v1.41.0", "source": { "type": "git", - "url": "https://github.com/laravel/telescope.git", - "reference": "2594b20b946155ba767002d8af971e33e1095637" + "url": "https://github.com/laravel/sail.git", + "reference": "fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/telescope/zipball/2594b20b946155ba767002d8af971e33e1095637", - "reference": "2594b20b946155ba767002d8af971e33e1095637", + "url": "https://api.github.com/repos/laravel/sail/zipball/fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec", + "reference": "fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec", "shasum": "" }, "require": { - "ext-json": "*", - "laravel/framework": "^8.37|^9.0|^10.0|^11.0|^12.0", + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0", "php": "^8.0", - "symfony/console": "^5.3|^6.0|^7.0", - "symfony/var-dumper": "^5.0|^6.0|^7.0" + "symfony/console": "^6.0|^7.0", + "symfony/yaml": "^6.0|^7.0" }, "require-dev": { - "ext-gd": "*", - "guzzlehttp/guzzle": "^6.0|^7.0", - "laravel/octane": "^1.4|^2.0|dev-develop", - "orchestra/testbench": "^6.40|^7.37|^8.17|^9.0|^10.0", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9.0|^10.5|^11.5" + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", + "phpstan/phpstan": "^1.10" }, + "bin": [ + "bin/sail" + ], "type": "library", "extra": { "laravel": { "providers": [ - "Laravel\\Telescope\\TelescopeServiceProvider" + "Laravel\\Sail\\SailServiceProvider" ] } }, "autoload": { "psr-4": { - "Laravel\\Telescope\\": "src/", - "Laravel\\Telescope\\Database\\Factories\\": "database/factories/" + "Laravel\\Sail\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -12594,23 +6166,18 @@ { "name": "Taylor Otwell", "email": "taylor@laravel.com" - }, - { - "name": "Mohamed Said", - "email": "mohamed@laravel.com" } ], - "description": "An elegant debug assistant for the Laravel framework.", + "description": "Docker files for running a basic Laravel application.", "keywords": [ - "debugging", - "laravel", - "monitoring" + "docker", + "laravel" ], "support": { - "issues": "https://github.com/laravel/telescope/issues", - "source": "https://github.com/laravel/telescope/tree/v5.5.0" + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" }, - "time": "2025-02-11T15:01:27+00:00" + "time": "2025-01-24T15:45:36+00:00" }, { "name": "mockery/mockery", @@ -12757,20 +6324,20 @@ }, { "name": "nunomaduro/collision", - "version": "v8.6.1", + "version": "v8.7.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "86f003c132143d5a2ab214e19933946409e0cae7" + "reference": "586cb8181a257a2152b6a855ca8d9598878a1a26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/86f003c132143d5a2ab214e19933946409e0cae7", - "reference": "86f003c132143d5a2ab214e19933946409e0cae7", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/586cb8181a257a2152b6a855ca8d9598878a1a26", + "reference": "586cb8181a257a2152b6a855ca8d9598878a1a26", "shasum": "" }, "require": { - "filp/whoops": "^2.16.0", + "filp/whoops": "^2.17.0", "nunomaduro/termwind": "^2.3.0", "php": "^8.2.0", "symfony/console": "^7.2.1" @@ -12780,14 +6347,14 @@ "phpunit/phpunit": "<11.5.3 || >=12.0.0" }, "require-dev": { - "larastan/larastan": "^2.9.12", - "laravel/framework": "^11.39.1", - "laravel/pint": "^1.20.0", - "laravel/sail": "^1.40.0", - "laravel/sanctum": "^4.0.7", - "laravel/tinker": "^2.10.0", - "orchestra/testbench-core": "^9.9.2", - "pestphp/pest": "^3.7.3", + "larastan/larastan": "^2.10.0", + "laravel/framework": "^11.44.2", + "laravel/pint": "^1.21.2", + "laravel/sail": "^1.41.0", + "laravel/sanctum": "^4.0.8", + "laravel/tinker": "^2.10.1", + "orchestra/testbench-core": "^9.12.0", + "pestphp/pest": "^3.7.4", "sebastian/environment": "^6.1.0 || ^7.2.0" }, "type": "library", @@ -12851,331 +6418,7 @@ "type": "patreon" } ], - "time": "2025-01-23T13:41:43+00:00" - }, - { - "name": "pestphp/pest", - "version": "v3.7.4", - "source": { - "type": "git", - "url": "https://github.com/pestphp/pest.git", - "reference": "4a987d3d5c4e3ba36c76fecbf56113baac2d1b2b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/4a987d3d5c4e3ba36c76fecbf56113baac2d1b2b", - "reference": "4a987d3d5c4e3ba36c76fecbf56113baac2d1b2b", - "shasum": "" - }, - "require": { - "brianium/paratest": "^7.7.0", - "nunomaduro/collision": "^8.6.1", - "nunomaduro/termwind": "^2.3.0", - "pestphp/pest-plugin": "^3.0.0", - "pestphp/pest-plugin-arch": "^3.0.0", - "pestphp/pest-plugin-mutate": "^3.0.5", - "php": "^8.2.0", - "phpunit/phpunit": "^11.5.3" - }, - "conflict": { - "filp/whoops": "<2.16.0", - "phpunit/phpunit": ">11.5.3", - "sebastian/exporter": "<6.0.0", - "webmozart/assert": "<1.11.0" - }, - "require-dev": { - "pestphp/pest-dev-tools": "^3.3.0", - "pestphp/pest-plugin-type-coverage": "^3.2.3", - "symfony/process": "^7.2.0" - }, - "bin": [ - "bin/pest" - ], - "type": "library", - "extra": { - "pest": { - "plugins": [ - "Pest\\Mutate\\Plugins\\Mutate", - "Pest\\Plugins\\Configuration", - "Pest\\Plugins\\Bail", - "Pest\\Plugins\\Cache", - "Pest\\Plugins\\Coverage", - "Pest\\Plugins\\Init", - "Pest\\Plugins\\Environment", - "Pest\\Plugins\\Help", - "Pest\\Plugins\\Memory", - "Pest\\Plugins\\Only", - "Pest\\Plugins\\Printer", - "Pest\\Plugins\\ProcessIsolation", - "Pest\\Plugins\\Profile", - "Pest\\Plugins\\Retry", - "Pest\\Plugins\\Snapshot", - "Pest\\Plugins\\Verbose", - "Pest\\Plugins\\Version", - "Pest\\Plugins\\Parallel" - ] - }, - "phpstan": { - "includes": [ - "extension.neon" - ] - } - }, - "autoload": { - "files": [ - "src/Functions.php", - "src/Pest.php" - ], - "psr-4": { - "Pest\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "The elegant PHP Testing Framework.", - "keywords": [ - "framework", - "pest", - "php", - "test", - "testing", - "unit" - ], - "support": { - "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v3.7.4" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - } - ], - "time": "2025-01-23T14:03:29+00:00" - }, - { - "name": "pestphp/pest-plugin", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/pestphp/pest-plugin.git", - "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/e79b26c65bc11c41093b10150c1341cc5cdbea83", - "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^2.0.0", - "composer-runtime-api": "^2.2.2", - "php": "^8.2" - }, - "conflict": { - "pestphp/pest": "<3.0.0" - }, - "require-dev": { - "composer/composer": "^2.7.9", - "pestphp/pest": "^3.0.0", - "pestphp/pest-dev-tools": "^3.0.0" - }, - "type": "composer-plugin", - "extra": { - "class": "Pest\\Plugin\\Manager" - }, - "autoload": { - "psr-4": { - "Pest\\Plugin\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "The Pest plugin manager", - "keywords": [ - "framework", - "manager", - "pest", - "php", - "plugin", - "test", - "testing", - "unit" - ], - "support": { - "source": "https://github.com/pestphp/pest-plugin/tree/v3.0.0" - }, - "funding": [ - { - "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://www.patreon.com/nunomaduro", - "type": "patreon" - } - ], - "time": "2024-09-08T23:21:41+00:00" - }, - { - "name": "pestphp/pest-plugin-arch", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/pestphp/pest-plugin-arch.git", - "reference": "0a27e55a270cfe73d8cb70551b91002ee2cb64b0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/0a27e55a270cfe73d8cb70551b91002ee2cb64b0", - "reference": "0a27e55a270cfe73d8cb70551b91002ee2cb64b0", - "shasum": "" - }, - "require": { - "pestphp/pest-plugin": "^3.0.0", - "php": "^8.2", - "ta-tikoma/phpunit-architecture-test": "^0.8.4" - }, - "require-dev": { - "pestphp/pest": "^3.0.0", - "pestphp/pest-dev-tools": "^3.0.0" - }, - "type": "library", - "extra": { - "pest": { - "plugins": [ - "Pest\\Arch\\Plugin" - ] - } - }, - "autoload": { - "files": [ - "src/Autoload.php" - ], - "psr-4": { - "Pest\\Arch\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "The Arch plugin for Pest PHP.", - "keywords": [ - "arch", - "architecture", - "framework", - "pest", - "php", - "plugin", - "test", - "testing", - "unit" - ], - "support": { - "source": "https://github.com/pestphp/pest-plugin-arch/tree/v3.0.0" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - } - ], - "time": "2024-09-08T23:23:55+00:00" - }, - { - "name": "pestphp/pest-plugin-mutate", - "version": "v3.0.5", - "source": { - "type": "git", - "url": "https://github.com/pestphp/pest-plugin-mutate.git", - "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-mutate/zipball/e10dbdc98c9e2f3890095b4fe2144f63a5717e08", - "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^5.2.0", - "pestphp/pest-plugin": "^3.0.0", - "php": "^8.2", - "psr/simple-cache": "^3.0.0" - }, - "require-dev": { - "pestphp/pest": "^3.0.8", - "pestphp/pest-dev-tools": "^3.0.0", - "pestphp/pest-plugin-type-coverage": "^3.0.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Pest\\Mutate\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sandro Gehri", - "email": "sandrogehri@gmail.com" - } - ], - "description": "Mutates your code to find untested cases", - "keywords": [ - "framework", - "mutate", - "mutation", - "pest", - "php", - "plugin", - "test", - "testing", - "unit" - ], - "support": { - "source": "https://github.com/pestphp/pest-plugin-mutate/tree/v3.0.5" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/gehrisandro", - "type": "github" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - } - ], - "time": "2024-09-22T07:54:40+00:00" + "time": "2025-03-14T22:37:40+00:00" }, { "name": "phar-io/manifest", @@ -13295,219 +6538,25 @@ }, "time": "2022-02-21T01:04:05+00:00" }, - { - "name": "php-debugbar/php-debugbar", - "version": "v2.1.6", - "source": { - "type": "git", - "url": "https://github.com/php-debugbar/php-debugbar.git", - "reference": "16fa68da5617220594aa5e33fa9de415f94784a0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/16fa68da5617220594aa5e33fa9de415f94784a0", - "reference": "16fa68da5617220594aa5e33fa9de415f94784a0", - "shasum": "" - }, - "require": { - "php": "^8", - "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^4|^5|^6|^7" - }, - "require-dev": { - "dbrekelmans/bdi": "^1", - "phpunit/phpunit": "^8|^9", - "symfony/panther": "^1|^2.1", - "twig/twig": "^1.38|^2.7|^3.0" - }, - "suggest": { - "kriswallsmith/assetic": "The best way to manage assets", - "monolog/monolog": "Log using Monolog", - "predis/predis": "Redis storage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "psr-4": { - "DebugBar\\": "src/DebugBar/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Maxime Bouroumeau-Fuseau", - "email": "maxime.bouroumeau@gmail.com", - "homepage": "http://maximebf.com" - }, - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "Debug bar in the browser for php application", - "homepage": "https://github.com/php-debugbar/php-debugbar", - "keywords": [ - "debug", - "debug bar", - "debugbar", - "dev" - ], - "support": { - "issues": "https://github.com/php-debugbar/php-debugbar/issues", - "source": "https://github.com/php-debugbar/php-debugbar/tree/v2.1.6" - }, - "time": "2025-02-21T17:47:03+00:00" - }, - { - "name": "php-webdriver/webdriver", - "version": "1.15.2", - "source": { - "type": "git", - "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "998e499b786805568deaf8cbf06f4044f05d91bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/998e499b786805568deaf8cbf06f4044f05d91bf", - "reference": "998e499b786805568deaf8cbf06f4044f05d91bf", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-zip": "*", - "php": "^7.3 || ^8.0", - "symfony/polyfill-mbstring": "^1.12", - "symfony/process": "^5.0 || ^6.0 || ^7.0" - }, - "replace": { - "facebook/webdriver": "*" - }, - "require-dev": { - "ergebnis/composer-normalize": "^2.20.0", - "ondram/ci-detector": "^4.0", - "php-coveralls/php-coveralls": "^2.4", - "php-mock/php-mock-phpunit": "^2.0", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpunit/phpunit": "^9.3", - "squizlabs/php_codesniffer": "^3.5", - "symfony/var-dumper": "^5.0 || ^6.0 || ^7.0" - }, - "suggest": { - "ext-SimpleXML": "For Firefox profile creation" - }, - "type": "library", - "autoload": { - "files": [ - "lib/Exception/TimeoutException.php" - ], - "psr-4": { - "Facebook\\WebDriver\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A PHP client for Selenium WebDriver. Previously facebook/webdriver.", - "homepage": "https://github.com/php-webdriver/php-webdriver", - "keywords": [ - "Chromedriver", - "geckodriver", - "php", - "selenium", - "webdriver" - ], - "support": { - "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.15.2" - }, - "time": "2024-11-21T15:12:59+00:00" - }, - { - "name": "phpstan/phpstan", - "version": "2.1.6", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "6eaec7c6c9e90dcfe46ad1e1ffa5171e2dab641c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/6eaec7c6c9e90dcfe46ad1e1ffa5171e2dab641c", - "reference": "6eaec7c6c9e90dcfe46ad1e1ffa5171e2dab641c", - "shasum": "" - }, - "require": { - "php": "^7.4|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" - }, - "bin": [ - "phpstan", - "phpstan.phar" - ], - "type": "library", - "autoload": { - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPStan - PHP Static Analysis Tool", - "keywords": [ - "dev", - "static analysis" - ], - "support": { - "docs": "https://phpstan.org/user-guide/getting-started", - "forum": "https://github.com/phpstan/phpstan/discussions", - "issues": "https://github.com/phpstan/phpstan/issues", - "security": "https://github.com/phpstan/phpstan/security/policy", - "source": "https://github.com/phpstan/phpstan-src" - }, - "funding": [ - { - "url": "https://github.com/ondrejmirtes", - "type": "github" - }, - { - "url": "https://github.com/phpstan", - "type": "github" - } - ], - "time": "2025-02-19T15:46:42+00:00" - }, { "name": "phpunit/php-code-coverage", - "version": "11.0.8", + "version": "11.0.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "418c59fd080954f8c4aa5631d9502ecda2387118" + "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/418c59fd080954f8c4aa5631d9502ecda2387118", - "reference": "418c59fd080954f8c4aa5631d9502ecda2387118", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/14d63fbcca18457e49c6f8bebaa91a87e8e188d7", + "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^5.3.1", + "nikic/php-parser": "^5.4.0", "php": ">=8.2", "phpunit/php-file-iterator": "^5.1.0", "phpunit/php-text-template": "^4.0.1", @@ -13519,7 +6568,7 @@ "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^11.5.0" + "phpunit/phpunit": "^11.5.2" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -13557,7 +6606,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.8" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.9" }, "funding": [ { @@ -13565,7 +6614,7 @@ "type": "github" } ], - "time": "2024-12-11T12:34:27+00:00" + "time": "2025-02-25T13:26:39+00:00" }, { "name": "phpunit/php-file-iterator", @@ -13814,16 +6863,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.5.3", + "version": "11.5.12", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "30e319e578a7b5da3543073e30002bf82042f701" + "reference": "d42785840519401ed2113292263795eb4c0f95da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/30e319e578a7b5da3543073e30002bf82042f701", - "reference": "30e319e578a7b5da3543073e30002bf82042f701", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d42785840519401ed2113292263795eb4c0f95da", + "reference": "d42785840519401ed2113292263795eb4c0f95da", "shasum": "" }, "require": { @@ -13833,18 +6882,18 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.1", + "myclabs/deep-copy": "^1.13.0", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.8", + "phpunit/php-code-coverage": "^11.0.9", "phpunit/php-file-iterator": "^5.1.0", "phpunit/php-invoker": "^5.0.1", "phpunit/php-text-template": "^4.0.1", "phpunit/php-timer": "^7.0.1", "sebastian/cli-parser": "^3.0.2", "sebastian/code-unit": "^3.0.2", - "sebastian/comparator": "^6.3.0", + "sebastian/comparator": "^6.3.1", "sebastian/diff": "^6.0.2", "sebastian/environment": "^7.2.0", "sebastian/exporter": "^6.3.0", @@ -13895,7 +6944,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.3" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.12" }, "funding": [ { @@ -13911,66 +6960,7 @@ "type": "tidelift" } ], - "time": "2025-01-13T09:36:00+00:00" - }, - { - "name": "rector/rector", - "version": "2.0.9", - "source": { - "type": "git", - "url": "https://github.com/rectorphp/rector.git", - "reference": "4393230e478c0006795770fe74c223b5c64ed68c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/4393230e478c0006795770fe74c223b5c64ed68c", - "reference": "4393230e478c0006795770fe74c223b5c64ed68c", - "shasum": "" - }, - "require": { - "php": "^7.4|^8.0", - "phpstan/phpstan": "^2.1.3" - }, - "conflict": { - "rector/rector-doctrine": "*", - "rector/rector-downgrade-php": "*", - "rector/rector-phpunit": "*", - "rector/rector-symfony": "*" - }, - "suggest": { - "ext-dom": "To manipulate phpunit.xml via the custom-rule command" - }, - "bin": [ - "bin/rector" - ], - "type": "library", - "autoload": { - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Instant Upgrade and Automated Refactoring of any PHP code", - "keywords": [ - "automation", - "dev", - "migration", - "refactoring" - ], - "support": { - "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.0.9" - }, - "funding": [ - { - "url": "https://github.com/tomasvotruba", - "type": "github" - } - ], - "time": "2025-02-10T08:14:01+00:00" + "time": "2025-03-07T07:31:03+00:00" }, { "name": "sebastian/cli-parser", @@ -14144,16 +7134,16 @@ }, { "name": "sebastian/comparator", - "version": "6.3.0", + "version": "6.3.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "d4e47a769525c4dd38cea90e5dcd435ddbbc7115" + "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/d4e47a769525c4dd38cea90e5dcd435ddbbc7115", - "reference": "d4e47a769525c4dd38cea90e5dcd435ddbbc7115", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/24b8fbc2c8e201bb1308e7b05148d6ab393b6959", + "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959", "shasum": "" }, "require": { @@ -14172,7 +7162,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.2-dev" + "dev-main": "6.3-dev" } }, "autoload": { @@ -14212,7 +7202,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.0" + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.1" }, "funding": [ { @@ -14220,7 +7210,7 @@ "type": "github" } ], - "time": "2025-01-06T10:28:19+00:00" + "time": "2025-03-07T06:57:01+00:00" }, { "name": "sebastian/complexity", @@ -14898,368 +7888,6 @@ ], "time": "2024-10-09T05:16:32+00:00" }, - { - "name": "serversideup/spin", - "version": "v3.0.2", - "source": { - "type": "git", - "url": "https://github.com/serversideup/spin.git", - "reference": "f0e9c78dad8fd86db6030871a9f143fd6ab918e3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/serversideup/spin/zipball/f0e9c78dad8fd86db6030871a9f143fd6ab918e3", - "reference": "f0e9c78dad8fd86db6030871a9f143fd6ab918e3", - "shasum": "" - }, - "bin": [ - "bin/spin" - ], - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-3.0-or-later" - ], - "authors": [ - { - "name": "Dan Pastori", - "homepage": "https://twitter.com/danpastori" - }, - { - "name": "Jay Rogers", - "homepage": "https://twitter.com/jaydrogers" - } - ], - "description": "Replicate your production environment locally using Docker. Just run \"spin up\". It's really that easy.", - "support": { - "issues": "https://github.com/serversideup/spin/issues", - "source": "https://github.com/serversideup/spin/tree/v3.0.2" - }, - "funding": [ - { - "url": "https://github.com/serversideup", - "type": "github" - } - ], - "time": "2025-01-14T19:02:40+00:00" - }, - { - "name": "spatie/error-solutions", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/spatie/error-solutions.git", - "reference": "e495d7178ca524f2dd0fe6a1d99a1e608e1c9936" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/error-solutions/zipball/e495d7178ca524f2dd0fe6a1d99a1e608e1c9936", - "reference": "e495d7178ca524f2dd0fe6a1d99a1e608e1c9936", - "shasum": "" - }, - "require": { - "php": "^8.0" - }, - "require-dev": { - "illuminate/broadcasting": "^10.0|^11.0|^12.0", - "illuminate/cache": "^10.0|^11.0|^12.0", - "illuminate/support": "^10.0|^11.0|^12.0", - "livewire/livewire": "^2.11|^3.5.20", - "openai-php/client": "^0.10.1", - "orchestra/testbench": "8.22.3|^9.0|^10.0", - "pestphp/pest": "^2.20|^3.0", - "phpstan/phpstan": "^2.1", - "psr/simple-cache": "^3.0", - "psr/simple-cache-implementation": "^3.0", - "spatie/ray": "^1.28", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "vlucas/phpdotenv": "^5.5" - }, - "suggest": { - "openai-php/client": "Require get solutions from OpenAI", - "simple-cache-implementation": "To cache solutions from OpenAI" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\Ignition\\": "legacy/ignition", - "Spatie\\ErrorSolutions\\": "src", - "Spatie\\LaravelIgnition\\": "legacy/laravel-ignition" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ruben Van Assche", - "email": "ruben@spatie.be", - "role": "Developer" - } - ], - "description": "This is my package error-solutions", - "homepage": "https://github.com/spatie/error-solutions", - "keywords": [ - "error-solutions", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/error-solutions/issues", - "source": "https://github.com/spatie/error-solutions/tree/1.1.3" - }, - "funding": [ - { - "url": "https://github.com/Spatie", - "type": "github" - } - ], - "time": "2025-02-14T12:29:50+00:00" - }, - { - "name": "spatie/flare-client-php", - "version": "1.10.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/flare-client-php.git", - "reference": "bf1716eb98bd689451b071548ae9e70738dce62f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/bf1716eb98bd689451b071548ae9e70738dce62f", - "reference": "bf1716eb98bd689451b071548ae9e70738dce62f", - "shasum": "" - }, - "require": { - "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0|^12.0", - "php": "^8.0", - "spatie/backtrace": "^1.6.1", - "symfony/http-foundation": "^5.2|^6.0|^7.0", - "symfony/mime": "^5.2|^6.0|^7.0", - "symfony/process": "^5.2|^6.0|^7.0", - "symfony/var-dumper": "^5.2|^6.0|^7.0" - }, - "require-dev": { - "dms/phpunit-arraysubset-asserts": "^0.5.0", - "pestphp/pest": "^1.20|^2.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "spatie/pest-plugin-snapshots": "^1.0|^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.3.x-dev" - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Spatie\\FlareClient\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Send PHP errors to Flare", - "homepage": "https://github.com/spatie/flare-client-php", - "keywords": [ - "exception", - "flare", - "reporting", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.10.1" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2025-02-14T13:42:06+00:00" - }, - { - "name": "spatie/ignition", - "version": "1.15.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/ignition.git", - "reference": "31f314153020aee5af3537e507fef892ffbf8c85" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/31f314153020aee5af3537e507fef892ffbf8c85", - "reference": "31f314153020aee5af3537e507fef892ffbf8c85", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "php": "^8.0", - "spatie/error-solutions": "^1.0", - "spatie/flare-client-php": "^1.7", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "require-dev": { - "illuminate/cache": "^9.52|^10.0|^11.0|^12.0", - "mockery/mockery": "^1.4", - "pestphp/pest": "^1.20|^2.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "psr/simple-cache-implementation": "*", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "vlucas/phpdotenv": "^5.5" - }, - "suggest": { - "openai-php/client": "Require get solutions from OpenAI", - "simple-cache-implementation": "To cache solutions from OpenAI" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.5.x-dev" - } - }, - "autoload": { - "psr-4": { - "Spatie\\Ignition\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Spatie", - "email": "info@spatie.be", - "role": "Developer" - } - ], - "description": "A beautiful error page for PHP applications.", - "homepage": "https://flareapp.io/ignition", - "keywords": [ - "error", - "flare", - "laravel", - "page" - ], - "support": { - "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", - "forum": "https://twitter.com/flareappio", - "issues": "https://github.com/spatie/ignition/issues", - "source": "https://github.com/spatie/ignition" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2025-02-21T14:31:39+00:00" - }, - { - "name": "spatie/laravel-ignition", - "version": "2.9.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "1baee07216d6748ebd3a65ba97381b051838707a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/1baee07216d6748ebd3a65ba97381b051838707a", - "reference": "1baee07216d6748ebd3a65ba97381b051838707a", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "illuminate/support": "^10.0|^11.0|^12.0", - "php": "^8.1", - "spatie/ignition": "^1.15", - "symfony/console": "^6.2.3|^7.0", - "symfony/var-dumper": "^6.2.3|^7.0" - }, - "require-dev": { - "livewire/livewire": "^2.11|^3.3.5", - "mockery/mockery": "^1.5.1", - "openai-php/client": "^0.8.1|^0.10", - "orchestra/testbench": "8.22.3|^9.0|^10.0", - "pestphp/pest": "^2.34|^3.7", - "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan-deprecation-rules": "^1.1.1|^2.0", - "phpstan/phpstan-phpunit": "^1.3.16|^2.0", - "vlucas/phpdotenv": "^5.5" - }, - "suggest": { - "openai-php/client": "Require get solutions from OpenAI", - "psr/simple-cache-implementation": "Needed to cache solutions from OpenAI" - }, - "type": "library", - "extra": { - "laravel": { - "aliases": { - "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" - }, - "providers": [ - "Spatie\\LaravelIgnition\\IgnitionServiceProvider" - ] - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Spatie\\LaravelIgnition\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Spatie", - "email": "info@spatie.be", - "role": "Developer" - } - ], - "description": "A beautiful error page for Laravel applications.", - "homepage": "https://flareapp.io/ignition", - "keywords": [ - "error", - "flare", - "laravel", - "page" - ], - "support": { - "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", - "forum": "https://twitter.com/flareappio", - "issues": "https://github.com/spatie/laravel-ignition/issues", - "source": "https://github.com/spatie/laravel-ignition" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2025-02-20T13:13:55+00:00" - }, { "name": "staabm/side-effects-detector", "version": "1.0.5", @@ -15313,57 +7941,37 @@ "time": "2024-10-20T05:08:20+00:00" }, { - "name": "symfony/http-client", + "name": "symfony/yaml", "version": "v7.2.3", "source": { "type": "git", - "url": "https://github.com/symfony/http-client.git", - "reference": "7ce6078c79a4a7afff931c413d2959d3bffbfb8d" + "url": "https://github.com/symfony/yaml.git", + "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/7ce6078c79a4a7afff931c413d2959d3bffbfb8d", - "reference": "7ce6078c79a4a7afff931c413d2959d3bffbfb8d", + "url": "https://api.github.com/repos/symfony/yaml/zipball/ac238f173df0c9c1120f862d0f599e17535a87ec", + "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec", "shasum": "" }, "require": { "php": ">=8.2", - "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-client-contracts": "~3.4.4|^3.5.2", - "symfony/service-contracts": "^2.5|^3" + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "amphp/amp": "<2.5", - "php-http/discovery": "<1.15", - "symfony/http-foundation": "<6.4" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "1.0", - "symfony/http-client-implementation": "3.0" + "symfony/console": "<6.4" }, "require-dev": { - "amphp/http-client": "^4.2.1|^5.0", - "amphp/http-tunnel": "^1.0|^2.0", - "amphp/socket": "^1.1", - "guzzlehttp/promises": "^1.4|^2.0", - "nyholm/psr7": "^1.0", - "php-http/httplug": "^1.0|^2.0", - "psr/http-client": "^1.0", - "symfony/amphp-http-client-meta": "^1.0|^2.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/rate-limiter": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0" + "symfony/console": "^6.4|^7.0" }, + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\HttpClient\\": "" + "Symfony\\Component\\Yaml\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -15375,21 +7983,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", - "keywords": [ - "http" - ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.2.3" + "source": "https://github.com/symfony/yaml/tree/v7.2.3" }, "funding": [ { @@ -15405,144 +8010,7 @@ "type": "tidelift" } ], - "time": "2025-01-28T15:51:35+00:00" - }, - { - "name": "symfony/http-client-contracts", - "version": "v3.5.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ee8d807ab20fcb51267fdace50fbe3494c31e645", - "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.5-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to HTTP clients", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-12-07T08:49:48+00:00" - }, - { - "name": "ta-tikoma/phpunit-architecture-test", - "version": "0.8.4", - "source": { - "type": "git", - "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", - "reference": "89f0dea1cb0f0d5744d3ec1764a286af5e006636" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/89f0dea1cb0f0d5744d3ec1764a286af5e006636", - "reference": "89f0dea1cb0f0d5744d3ec1764a286af5e006636", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18.0 || ^5.0.0", - "php": "^8.1.0", - "phpdocumentor/reflection-docblock": "^5.3.0", - "phpunit/phpunit": "^10.5.5 || ^11.0.0", - "symfony/finder": "^6.4.0 || ^7.0.0" - }, - "require-dev": { - "laravel/pint": "^1.13.7", - "phpstan/phpstan": "^1.10.52" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPUnit\\Architecture\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ni Shi", - "email": "futik0ma011@gmail.com" - }, - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "Methods for testing application architecture", - "keywords": [ - "architecture", - "phpunit", - "stucture", - "test", - "testing" - ], - "support": { - "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", - "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.4" - }, - "time": "2024-01-05T14:10:56+00:00" + "time": "2025-01-07T12:55:42+00:00" }, { "name": "theseer/tokenizer", @@ -15597,12 +8065,12 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.4" + "php": "^8.2" }, - "platform-dev": [], - "plugin-api-version": "2.3.0" + "platform-dev": {}, + "plugin-api-version": "2.6.0" } diff --git a/config/app.php b/config/app.php index 371ac44ecc..324b513a27 100644 --- a/config/app.php +++ b/config/app.php @@ -1,23 +1,19 @@ env('APP_ID'), - 'port' => env('APP_PORT', 8000), /* |-------------------------------------------------------------------------- | Application Name |-------------------------------------------------------------------------- | - | This value is the name of your application. This value is used when the + | This value is the name of your application, which will be used when the | framework needs to place the application's name in a notification or - | any other location as required by the application or its packages. + | other UI elements where an application name needs to be displayed. | */ - 'name' => env('APP_NAME', 'Coolify'), + 'name' => env('APP_NAME', 'Laravel'), /* |-------------------------------------------------------------------------- @@ -52,22 +48,20 @@ return [ | | This URL is used by the console to properly generate URLs when using | the Artisan command line tool. You should set this to the root of - | your application so that it is used when running Artisan tasks. + | the application so that it's available within Artisan commands. | */ 'url' => env('APP_URL', 'http://localhost'), - 'asset_url' => env('ASSET_URL'), - /* |-------------------------------------------------------------------------- | Application Timezone |-------------------------------------------------------------------------- | | Here you may specify the default timezone for your application, which - | will be used by the PHP date and date-time functions. We have gone - | ahead and set this to a sensible default for you out of the box. + | will be used by the PHP date and date-time functions. The timezone + | is set to "UTC" by default as it is suitable for most use cases. | */ @@ -79,53 +73,37 @@ return [ |-------------------------------------------------------------------------- | | The application locale determines the default locale that will be used - | by the translation service provider. You are free to set this value - | to any of the locales which will be supported by the application. + | by Laravel's translation / localization methods. This option can be + | set to any locale for which you plan to have translation strings. | */ - 'locale' => 'en', + 'locale' => env('APP_LOCALE', 'en'), - /* - |-------------------------------------------------------------------------- - | Application Fallback Locale - |-------------------------------------------------------------------------- - | - | The fallback locale determines the locale to use when the current one - | is not available. You may change the value to correspond to any of - | the language folders that are provided through your application. - | - */ + 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), - 'fallback_locale' => 'en', - - /* - |-------------------------------------------------------------------------- - | Faker Locale - |-------------------------------------------------------------------------- - | - | This locale will be used by the Faker PHP library when generating fake - | data for your database seeds. For example, this will be used to get - | localized telephone numbers, street address information and more. - | - */ - - 'faker_locale' => 'en_US', + 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), /* |-------------------------------------------------------------------------- | Encryption Key |-------------------------------------------------------------------------- | - | This key is used by the Illuminate encrypter service and should be set - | to a random, 32 character string, otherwise these encrypted strings - | will not be safe. Please do this before deploying an application! + | This key is utilized by Laravel's encryption services and should be set + | to a random, 32 character string to ensure that all encrypted values + | are secure. You should do this prior to deploying the application. | */ + 'cipher' => 'AES-256-CBC', + 'key' => env('APP_KEY'), - 'cipher' => 'AES-256-CBC', + 'previous_keys' => [ + ...array_filter( + explode(',', env('APP_PREVIOUS_KEYS', '')) + ), + ], /* |-------------------------------------------------------------------------- @@ -141,79 +119,8 @@ return [ */ 'maintenance' => [ - 'driver' => 'cache', - 'store' => 'redis', + 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), + 'store' => env('APP_MAINTENANCE_STORE', 'database'), ], - /* - |-------------------------------------------------------------------------- - | Autoloaded Service Providers - |-------------------------------------------------------------------------- - | - | The service providers listed here will be automatically loaded on the - | request to your application. Feel free to add your own services to - | this array to grant expanded functionality to your applications. - | - */ - - 'providers' => [ - - /* - * Laravel Framework Service Providers... - */ - Illuminate\Auth\AuthServiceProvider::class, - Illuminate\Broadcasting\BroadcastServiceProvider::class, - Illuminate\Bus\BusServiceProvider::class, - Illuminate\Cache\CacheServiceProvider::class, - Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, - Illuminate\Cookie\CookieServiceProvider::class, - Illuminate\Database\DatabaseServiceProvider::class, - Illuminate\Encryption\EncryptionServiceProvider::class, - Illuminate\Filesystem\FilesystemServiceProvider::class, - Illuminate\Foundation\Providers\FoundationServiceProvider::class, - Illuminate\Hashing\HashServiceProvider::class, - Illuminate\Mail\MailServiceProvider::class, - Illuminate\Notifications\NotificationServiceProvider::class, - Illuminate\Pagination\PaginationServiceProvider::class, - Illuminate\Pipeline\PipelineServiceProvider::class, - Illuminate\Queue\QueueServiceProvider::class, - Illuminate\Redis\RedisServiceProvider::class, - Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, - Illuminate\Session\SessionServiceProvider::class, - Illuminate\Translation\TranslationServiceProvider::class, - Illuminate\Validation\ValidationServiceProvider::class, - Illuminate\View\ViewServiceProvider::class, - - /* - * Package Service Providers... - */ - \SocialiteProviders\Manager\ServiceProvider::class, - - /* - * Application Service Providers... - */ - App\Providers\AppServiceProvider::class, - App\Providers\FortifyServiceProvider::class, - App\Providers\AuthServiceProvider::class, - App\Providers\BroadcastServiceProvider::class, - App\Providers\EventServiceProvider::class, - App\Providers\HorizonServiceProvider::class, - App\Providers\RouteServiceProvider::class, - ], - - /* - |-------------------------------------------------------------------------- - | Class Aliases - |-------------------------------------------------------------------------- - | - | This array of class aliases will be registered when this application - | is started. However, feel free to register as many as you wish as - | the aliases are "lazy" loaded so they don't hinder performance. - | - */ - - 'aliases' => Facade::defaultAliases()->merge([ - // 'ExampleClass' => App\Example\ExampleClass::class, - ])->toArray(), - ]; diff --git a/config/auth.php b/config/auth.php index 83c36c0d3a..0ba5d5d8f1 100644 --- a/config/auth.php +++ b/config/auth.php @@ -7,15 +7,15 @@ return [ | Authentication Defaults |-------------------------------------------------------------------------- | - | This option controls the default authentication "guard" and password - | reset options for your application. You may change these defaults + | This option defines the default authentication "guard" and password + | reset "broker" for your application. You may change these values | as required, but they're a perfect start for most applications. | */ 'defaults' => [ - 'guard' => 'web', - 'passwords' => 'users', + 'guard' => env('AUTH_GUARD', 'web'), + 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), ], /* @@ -25,11 +25,11 @@ return [ | | Next, you may define every authentication guard for your application. | Of course, a great default configuration has been defined for you - | here which uses session storage and the Eloquent user provider. + | which utilizes session storage plus the Eloquent user provider. | - | All authentication drivers have a user provider. This defines how the + | All authentication guards have a user provider, which defines how the | users are actually retrieved out of your database or other storage - | mechanisms used by this application to persist your user's data. + | system used by the application. Typically, Eloquent is utilized. | | Supported: "session" | @@ -47,12 +47,12 @@ return [ | User Providers |-------------------------------------------------------------------------- | - | All authentication drivers have a user provider. This defines how the + | All authentication guards have a user provider, which defines how the | users are actually retrieved out of your database or other storage - | mechanisms used by this application to persist your user's data. + | system used by the application. Typically, Eloquent is utilized. | | If you have multiple user tables or models you may configure multiple - | sources which represent each model / table. These sources may then + | providers to represent the model / table. These providers may then | be assigned to any extra authentication guards you have defined. | | Supported: "database", "eloquent" @@ -62,7 +62,7 @@ return [ 'providers' => [ 'users' => [ 'driver' => 'eloquent', - 'model' => App\Models\User::class, + 'model' => env('AUTH_MODEL', App\Models\User::class), ], // 'users' => [ @@ -76,9 +76,9 @@ return [ | Resetting Passwords |-------------------------------------------------------------------------- | - | You may specify multiple password reset configurations if you have more - | than one user table or model in the application and you want to have - | separate password reset settings based on the specific user types. + | These configuration options specify the behavior of Laravel's password + | reset functionality, including the table utilized for token storage + | and the user provider that is invoked to actually retrieve users. | | The expiry time is the number of minutes that each reset token will be | considered valid. This security feature keeps tokens short-lived so @@ -93,8 +93,8 @@ return [ 'passwords' => [ 'users' => [ 'provider' => 'users', - 'table' => 'password_reset_tokens', - 'expire' => 10, + 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), + 'expire' => 60, 'throttle' => 60, ], ], @@ -105,11 +105,11 @@ return [ |-------------------------------------------------------------------------- | | Here you may define the amount of seconds before a password confirmation - | times out and the user is prompted to re-enter their password via the + | window expires and users are asked to re-enter their password via the | confirmation screen. By default, the timeout lasts for three hours. | */ - 'password_timeout' => 10800, + 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), ]; diff --git a/config/broadcasting.php b/config/broadcasting.php deleted file mode 100644 index 5509b00730..0000000000 --- a/config/broadcasting.php +++ /dev/null @@ -1,70 +0,0 @@ - env('BROADCAST_DRIVER', 'pusher'), - - /* - |-------------------------------------------------------------------------- - | Broadcast Connections - |-------------------------------------------------------------------------- - | - | Here you may define all of the broadcast connections that will be used - | to broadcast events to other systems or over websockets. Samples of - | each available type of connection are provided inside this array. - | - */ - - 'connections' => [ - - 'pusher' => [ - 'driver' => 'pusher', - 'key' => env('PUSHER_APP_KEY', 'coolify'), - 'secret' => env('PUSHER_APP_SECRET', 'coolify'), - 'app_id' => env('PUSHER_APP_ID', 'coolify'), - 'options' => [ - 'host' => env('PUSHER_BACKEND_HOST', 'coolify-realtime'), - 'port' => env('PUSHER_BACKEND_PORT', 6001), - 'scheme' => env('PUSHER_SCHEME', 'http'), - 'encrypted' => true, - 'useTLS' => env('PUSHER_SCHEME', 'https') === 'https', - ], - 'client_options' => [ - // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html - ], - ], - - 'ably' => [ - 'driver' => 'ably', - 'key' => env('ABLY_KEY'), - ], - - 'redis' => [ - 'driver' => 'redis', - 'connection' => 'default', - ], - - 'log' => [ - 'driver' => 'log', - ], - - 'null' => [ - 'driver' => 'null', - ], - - ], - -]; diff --git a/config/cache.php b/config/cache.php index b82efddc6b..925f7d2ee8 100644 --- a/config/cache.php +++ b/config/cache.php @@ -9,13 +9,13 @@ return [ | Default Cache Store |-------------------------------------------------------------------------- | - | This option controls the default cache connection that gets used while - | using this caching library. This connection is used when another is - | not explicitly specified when executing a given caching function. + | This option controls the default cache store that will be used by the + | framework. This connection is utilized if another isn't explicitly + | specified when running a cache operation inside the application. | */ - 'default' => env('CACHE_DRIVER', 'redis'), + 'default' => env('CACHE_STORE', 'database'), /* |-------------------------------------------------------------------------- @@ -26,17 +26,13 @@ return [ | well as their drivers. You may even define multiple stores for the | same cache driver to group types of items stored in your caches. | - | Supported drivers: "apc", "array", "database", "file", - | "memcached", "redis", "dynamodb", "octane", "null" + | Supported drivers: "array", "database", "file", "memcached", + | "redis", "dynamodb", "octane", "null" | */ 'stores' => [ - 'apc' => [ - 'driver' => 'apc', - ], - 'array' => [ 'driver' => 'array', 'serialize' => false, @@ -44,14 +40,16 @@ return [ 'database' => [ 'driver' => 'database', - 'table' => 'cache', - 'connection' => null, - 'lock_connection' => null, + 'connection' => env('DB_CACHE_CONNECTION'), + 'table' => env('DB_CACHE_TABLE', 'cache'), + 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), + 'lock_table' => env('DB_CACHE_LOCK_TABLE'), ], 'file' => [ 'driver' => 'file', 'path' => storage_path('framework/cache/data'), + 'lock_path' => storage_path('framework/cache/data'), ], 'memcached' => [ @@ -75,8 +73,8 @@ return [ 'redis' => [ 'driver' => 'redis', - 'connection' => 'cache', - 'lock_connection' => 'default', + 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), + 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), ], 'dynamodb' => [ @@ -99,8 +97,8 @@ return [ | Cache Key Prefix |-------------------------------------------------------------------------- | - | When utilizing the APC, database, memcached, Redis, or DynamoDB cache - | stores there might be other applications using the same cache. For + | When utilizing the APC, database, memcached, Redis, and DynamoDB cache + | stores, there might be other applications using the same cache. For | that reason, you may prefix every cache key to avoid collisions. | */ diff --git a/config/chunk-upload.php b/config/chunk-upload.php deleted file mode 100644 index e577eb858c..0000000000 --- a/config/chunk-upload.php +++ /dev/null @@ -1,45 +0,0 @@ - [ - /* - * Returns the folder name of the chunks. The location is in storage/app/{folder_name} - */ - 'chunks' => 'chunks', - 'disk' => 'local', - ], - 'clear' => [ - /* - * How old chunks we should delete - */ - 'timestamp' => '-1 HOURS', - 'schedule' => [ - 'enabled' => false, - 'cron' => '25 * * * *', // run every hour on the 25th minute - ], - ], - 'chunk' => [ - // setup for the chunk naming setup to ensure same name upload at same time - 'name' => [ - 'use' => [ - 'session' => true, // should the chunk name use the session id? The uploader must send cookie!, - 'browser' => false, // instead of session we can use the ip and browser? - ], - ], - ], - 'handlers' => [ - // A list of handlers/providers that will be appended to existing list of handlers - 'custom' => [], - // Overrides the list of handlers - use only what you really want - 'override' => [ - // \Pion\Laravel\ChunkUpload\Handler\DropZoneUploadHandler::class - ], - ], -]; diff --git a/config/constants.php b/config/constants.php deleted file mode 100644 index 9d15da1da1..0000000000 --- a/config/constants.php +++ /dev/null @@ -1,83 +0,0 @@ - [ - 'version' => '4.0.0-beta.399', - 'helper_version' => '1.0.7', - 'realtime_version' => '1.0.6', - 'self_hosted' => env('SELF_HOSTED', true), - 'autoupdate' => env('AUTOUPDATE'), - 'base_config_path' => env('BASE_CONFIG_PATH', '/data/coolify'), - 'helper_image' => env('HELPER_IMAGE', 'ghcr.io/coollabsio/coolify-helper'), - 'is_windows_docker_desktop' => env('IS_WINDOWS_DOCKER_DESKTOP', false), - ], - - 'urls' => [ - 'docs' => 'https://coolify.io/docs', - 'contact' => 'https://coolify.io/docs/contact', - ], - - 'services' => [ - // Temporary disabled until cache is implemented - // 'official' => 'https://cdn.coollabs.io/coolify/service-templates.json', - 'official' => 'https://raw.githubusercontent.com/coollabsio/coolify/main/templates/service-templates.json', - ], - - 'terminal' => [ - 'protocol' => env('TERMINAL_PROTOCOL'), - 'host' => env('TERMINAL_HOST'), - 'port' => env('TERMINAL_PORT'), - ], - - 'pusher' => [ - 'host' => env('PUSHER_HOST'), - 'port' => env('PUSHER_PORT'), - 'app_key' => env('PUSHER_APP_KEY'), - ], - - 'migration' => [ - 'is_migration_enabled' => env('MIGRATION_ENABLED', true), - ], - - 'seeder' => [ - 'is_seeder_enabled' => env('SEEDER_ENABLED', true), - ], - - 'horizon' => [ - 'is_horizon_enabled' => env('HORIZON_ENABLED', true), - 'is_scheduler_enabled' => env('SCHEDULER_ENABLED', true), - ], - - 'docker' => [ - 'minimum_required_version' => '24.0', - ], - - 'ssh' => [ - 'mux_enabled' => env('MUX_ENABLED', env('SSH_MUX_ENABLED', true)), - 'mux_persist_time' => env('SSH_MUX_PERSIST_TIME', 3600), - 'connection_timeout' => 10, - 'server_interval' => 20, - 'command_timeout' => 7200, - ], - - 'invitation' => [ - 'link' => [ - 'base_url' => '/invitations/', - 'expiration_days' => 3, - ], - ], - - 'sentry' => [ - 'sentry_dsn' => env('SENTRY_DSN'), - ], - - 'webhooks' => [ - 'feedback_discord_webhook' => env('FEEDBACK_DISCORD_WEBHOOK'), - 'dev_webhook' => env('SERVEO_URL'), - ], - - 'bunny' => [ - 'storage_api_key' => env('BUNNY_STORAGE_API_KEY'), - 'api_key' => env('BUNNY_API_KEY'), - ], -]; diff --git a/config/cors.php b/config/cors.php deleted file mode 100644 index 8a39e6daa6..0000000000 --- a/config/cors.php +++ /dev/null @@ -1,34 +0,0 @@ - ['api/*', 'sanctum/csrf-cookie'], - - 'allowed_methods' => ['*'], - - 'allowed_origins' => ['*'], - - 'allowed_origins_patterns' => [], - - 'allowed_headers' => ['*'], - - 'exposed_headers' => [], - - 'max_age' => 0, - - 'supports_credentials' => false, - -]; diff --git a/config/database.php b/config/database.php index a40987de8a..8910562d61 100644 --- a/config/database.php +++ b/config/database.php @@ -10,59 +10,106 @@ return [ |-------------------------------------------------------------------------- | | Here you may specify which of the database connections below you wish - | to use as your default connection for all database work. Of course - | you may use many connections at once using the Database library. + | to use as your default connection for database operations. This is + | the connection which will be utilized unless another connection + | is explicitly specified when you execute a query / statement. | */ - 'default' => env('DB_CONNECTION', 'pgsql'), + 'default' => env('DB_CONNECTION', 'sqlite'), /* |-------------------------------------------------------------------------- | Database Connections |-------------------------------------------------------------------------- | - | Here are each of the database connections setup for your application. - | Of course, examples of configuring each database platform that is - | supported by Laravel is shown below to make development simple. - | - | - | All database work in Laravel is done through the PHP PDO facilities - | so make sure you have the driver for your particular database of - | choice installed on your machine before you begin development. + | Below are all of the database connections defined for your application. + | An example configuration is provided for each database system which + | is supported by Laravel. You're free to add / remove connections. | */ 'connections' => [ + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DB_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + 'busy_timeout' => null, + 'journal_mode' => null, + 'synchronous' => null, + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'mariadb' => [ + 'driver' => 'mariadb', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + 'pgsql' => [ 'driver' => 'pgsql', - 'url' => env('DATABASE_URL'), - 'host' => env('DB_HOST', 'coolify-db'), + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '5432'), - 'database' => env('DB_DATABASE', 'coolify'), - 'username' => env('DB_USERNAME', 'coolify'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', + 'charset' => env('DB_CHARSET', 'utf8'), 'prefix' => '', 'prefix_indexes' => true, 'search_path' => 'public', 'sslmode' => 'prefer', ], - 'testing' => [ - 'driver' => 'pgsql', - 'url' => env('DATABASE_TEST_URL'), - 'host' => env('DB_TEST_HOST', 'postgres'), - 'port' => env('DB_TEST_PORT', '5432'), - 'database' => env('DB_TEST_DATABASE', 'coolify_test'), - 'username' => env('DB_TEST_USERNAME', 'coolify'), - 'password' => env('DB_TEST_PASSWORD', 'password'), - 'charset' => 'utf8', + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), 'prefix' => '', 'prefix_indexes' => true, - 'search_path' => 'public', - 'sslmode' => 'prefer', + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), ], ], @@ -74,11 +121,14 @@ return [ | | This table keeps track of all the migrations that have already run for | your application. Using this information, we can determine which of - | the migrations on disk haven't actually been run in the database. + | the migrations on disk haven't actually been run on the database. | */ - 'migrations' => 'migrations', + 'migrations' => [ + 'table' => 'migrations', + 'update_date_on_publish' => true, + ], /* |-------------------------------------------------------------------------- @@ -87,7 +137,7 @@ return [ | | Redis is an open source, fast, and advanced key-value store that also | provides a richer body of commands than a typical key-value system - | such as APC or Memcached. Laravel makes it easy to dig right in. + | such as Memcached. You may define your connection settings here. | */ @@ -98,11 +148,12 @@ return [ 'options' => [ 'cluster' => env('REDIS_CLUSTER', 'redis'), 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), + 'persistent' => env('REDIS_PERSISTENT', false), ], 'default' => [ 'url' => env('REDIS_URL'), - 'host' => env('REDIS_HOST', 'coolify-redis'), + 'host' => env('REDIS_HOST', '127.0.0.1'), 'username' => env('REDIS_USERNAME'), 'password' => env('REDIS_PASSWORD'), 'port' => env('REDIS_PORT', '6379'), @@ -111,7 +162,7 @@ return [ 'cache' => [ 'url' => env('REDIS_URL'), - 'host' => env('REDIS_HOST', 'coolify-redis'), + 'host' => env('REDIS_HOST', '127.0.0.1'), 'username' => env('REDIS_USERNAME'), 'password' => env('REDIS_PASSWORD'), 'port' => env('REDIS_PORT', '6379'), diff --git a/config/debugbar.php b/config/debugbar.php deleted file mode 100644 index 4bc660fff6..0000000000 --- a/config/debugbar.php +++ /dev/null @@ -1,326 +0,0 @@ - env('DEBUGBAR_ENABLED', null), - 'except' => [ - 'telescope*', - 'horizon*', - 'api*', - ], - - /* - |-------------------------------------------------------------------------- - | Storage settings - |-------------------------------------------------------------------------- - | - | DebugBar stores data for session/ajax requests. - | You can disable this, so the debugbar stores data in headers/session, - | but this can cause problems with large data collectors. - | By default, file storage (in the storage folder) is used. Redis and PDO - | can also be used. For PDO, run the package migrations first. - | - | Warning: Enabling storage.open will allow everyone to access previous - | request, do not enable open storage in publicly available environments! - | Specify a callback if you want to limit based on IP or authentication. - | Leaving it to null will allow localhost only. - */ - 'storage' => [ - 'enabled' => true, - 'open' => env('DEBUGBAR_OPEN_STORAGE'), // bool/callback. - 'driver' => 'file', // redis, file, pdo, socket, custom - 'path' => storage_path('debugbar'), // For file driver - 'connection' => null, // Leave null for default connection (Redis/PDO) - 'provider' => '', // Instance of StorageInterface for custom driver - 'hostname' => '127.0.0.1', // Hostname to use with the "socket" driver - 'port' => 2304, // Port to use with the "socket" driver - ], - - /* - |-------------------------------------------------------------------------- - | Editor - |-------------------------------------------------------------------------- - | - | Choose your preferred editor to use when clicking file name. - | - | Supported: "phpstorm", "vscode", "vscode-insiders", "vscode-remote", - | "vscode-insiders-remote", "vscodium", "textmate", "emacs", - | "sublime", "atom", "nova", "macvim", "idea", "netbeans", - | "xdebug", "espresso" - | - */ - - 'editor' => env('DEBUGBAR_EDITOR') ?: env('IGNITION_EDITOR', 'phpstorm'), - - /* - |-------------------------------------------------------------------------- - | Remote Path Mapping - |-------------------------------------------------------------------------- - | - | If you are using a remote dev server, like Laravel Homestead, Docker, or - | even a remote VPS, it will be necessary to specify your path mapping. - | - | Leaving one, or both of these, empty or null will not trigger the remote - | URL changes and Debugbar will treat your editor links as local files. - | - | "remote_sites_path" is an absolute base path for your sites or projects - | in Homestead, Vagrant, Docker, or another remote development server. - | - | Example value: "/home/vagrant/Code" - | - | "local_sites_path" is an absolute base path for your sites or projects - | on your local computer where your IDE or code editor is running on. - | - | Example values: "/Users//Code", "C:\Users\\Documents\Code" - | - */ - - 'remote_sites_path' => env('DEBUGBAR_REMOTE_SITES_PATH'), - 'local_sites_path' => env('DEBUGBAR_LOCAL_SITES_PATH', env('IGNITION_LOCAL_SITES_PATH')), - - /* - |-------------------------------------------------------------------------- - | Vendors - |-------------------------------------------------------------------------- - | - | Vendor files are included by default, but can be set to false. - | This can also be set to 'js' or 'css', to only include javascript or css vendor files. - | Vendor files are for css: font-awesome (including fonts) and highlight.js (css files) - | and for js: jquery and highlight.js - | So if you want syntax highlighting, set it to true. - | jQuery is set to not conflict with existing jQuery scripts. - | - */ - - 'include_vendors' => true, - - /* - |-------------------------------------------------------------------------- - | Capture Ajax Requests - |-------------------------------------------------------------------------- - | - | The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors), - | you can use this option to disable sending the data through the headers. - | - | Optionally, you can also send ServerTiming headers on ajax requests for the Chrome DevTools. - | - | Note for your request to be identified as ajax requests they must either send the header - | X-Requested-With with the value XMLHttpRequest (most JS libraries send this), or have application/json as a Accept header. - | - | By default `ajax_handler_auto_show` is set to true allowing ajax requests to be shown automatically in the Debugbar. - | Changing `ajax_handler_auto_show` to false will prevent the Debugbar from reloading. - */ - - 'capture_ajax' => true, - 'add_ajax_timing' => false, - 'ajax_handler_auto_show' => true, - 'ajax_handler_enable_tab' => true, - - /* - |-------------------------------------------------------------------------- - | Custom Error Handler for Deprecated warnings - |-------------------------------------------------------------------------- - | - | When enabled, the Debugbar shows deprecated warnings for Symfony components - | in the Messages tab. - | - */ - 'error_handler' => false, - - /* - |-------------------------------------------------------------------------- - | Clockwork integration - |-------------------------------------------------------------------------- - | - | The Debugbar can emulate the Clockwork headers, so you can use the Chrome - | Extension, without the server-side code. It uses Debugbar collectors instead. - | - */ - 'clockwork' => false, - - /* - |-------------------------------------------------------------------------- - | DataCollectors - |-------------------------------------------------------------------------- - | - | Enable/disable DataCollectors - | - */ - - 'collectors' => [ - 'phpinfo' => true, // Php version - 'messages' => true, // Messages - 'time' => true, // Time Datalogger - 'memory' => true, // Memory usage - 'exceptions' => true, // Exception displayer - 'log' => true, // Logs from Monolog (merged in messages if enabled) - 'db' => true, // Show database (PDO) queries and bindings - 'views' => true, // Views with their data - 'route' => true, // Current route information - 'auth' => false, // Display Laravel authentication status - 'gate' => true, // Display Laravel Gate checks - 'session' => true, // Display session data - 'symfony_request' => true, // Only one can be enabled.. - 'mail' => true, // Catch mail messages - 'laravel' => false, // Laravel version and environment - 'events' => false, // All events fired - 'default_request' => false, // Regular or special Symfony request logger - 'logs' => false, // Add the latest log messages - 'files' => false, // Show the included files - 'config' => false, // Display config settings - 'cache' => false, // Display cache events - 'models' => true, // Display models - 'livewire' => true, // Display Livewire (when available) - 'jobs' => false, // Display dispatched jobs - ], - - /* - |-------------------------------------------------------------------------- - | Extra options - |-------------------------------------------------------------------------- - | - | Configure some DataCollectors - | - */ - - 'options' => [ - 'time' => [ - 'memory_usage' => false, // Calculated by subtracting memory start and end, it may be inaccurate - ], - 'messages' => [ - 'trace' => true, // Trace the origin of the debug message - ], - 'memory' => [ - 'reset_peak' => false, // run memory_reset_peak_usage before collecting - 'with_baseline' => false, // Set boot memory usage as memory peak baseline - 'precision' => 0, // Memory rounding precision - ], - 'auth' => [ - 'show_name' => true, // Also show the users name/email in the debugbar - 'show_guards' => true, // Show the guards that are used - ], - 'db' => [ - 'with_params' => true, // Render SQL with the parameters substituted - 'backtrace' => true, // Use a backtrace to find the origin of the query in your files. - 'backtrace_exclude_paths' => [], // Paths to exclude from backtrace. (in addition to defaults) - 'timeline' => false, // Add the queries to the timeline - 'duration_background' => true, // Show shaded background on each query relative to how long it took to execute. - 'explain' => [ // Show EXPLAIN output on queries - 'enabled' => false, - 'types' => ['SELECT'], // Deprecated setting, is always only SELECT - ], - 'hints' => false, // Show hints for common mistakes - 'show_copy' => false, // Show copy button next to the query, - 'slow_threshold' => false, // Only track queries that last longer than this time in ms - 'memory_usage' => false, // Show queries memory usage - 'soft_limit' => 100, // After the soft limit, no parameters/backtrace are captured - 'hard_limit' => 500, // After the hard limit, queries are ignored - ], - 'mail' => [ - 'timeline' => false, // Add mails to the timeline - 'show_body' => true, - ], - 'views' => [ - 'timeline' => false, // Add the views to the timeline (Experimental) - 'data' => false, // true for all data, 'keys' for only names, false for no parameters. - 'group' => 50, // Group duplicate views. Pass value to auto-group, or true/false to force - 'exclude_paths' => [ // Add the paths which you don't want to appear in the views - 'vendor/filament', // Exclude Filament components by default - ], - ], - 'route' => [ - 'label' => true, // show complete route on bar - ], - 'session' => [ - 'hiddens' => [], // hides sensitive values using array paths - ], - 'symfony_request' => [ - 'hiddens' => [], // hides sensitive values using array paths, example: request_request.password - ], - 'events' => [ - 'data' => false, // collect events data, listeners - ], - 'logs' => [ - 'file' => null, - ], - 'cache' => [ - 'values' => true, // collect cache values - ], - ], - - /* - |-------------------------------------------------------------------------- - | Inject Debugbar in Response - |-------------------------------------------------------------------------- - | - | Usually, the debugbar is added just before , by listening to the - | Response after the App is done. If you disable this, you have to add them - | in your template yourself. See http://phpdebugbar.com/docs/rendering.html - | - */ - - 'inject' => true, - - /* - |-------------------------------------------------------------------------- - | DebugBar route prefix - |-------------------------------------------------------------------------- - | - | Sometimes you want to set route prefix to be used by DebugBar to load - | its resources from. Usually the need comes from misconfigured web server or - | from trying to overcome bugs like this: http://trac.nginx.org/nginx/ticket/97 - | - */ - 'route_prefix' => '_debugbar', - - /* - |-------------------------------------------------------------------------- - | DebugBar route middleware - |-------------------------------------------------------------------------- - | - | Additional middleware to run on the Debugbar routes - */ - 'route_middleware' => [], - - /* - |-------------------------------------------------------------------------- - | DebugBar route domain - |-------------------------------------------------------------------------- - | - | By default DebugBar route served from the same domain that request served. - | To override default domain, specify it as a non-empty value. - */ - 'route_domain' => null, - - /* - |-------------------------------------------------------------------------- - | DebugBar theme - |-------------------------------------------------------------------------- - | - | Switches between light and dark theme. If set to auto it will respect system preferences - | Possible values: auto, light, dark - */ - 'theme' => env('DEBUGBAR_THEME', 'auto'), - - /* - |-------------------------------------------------------------------------- - | Backtrace stack limit - |-------------------------------------------------------------------------- - | - | By default, the DebugBar limits the number of frames returned by the 'debug_backtrace()' function. - | If you need larger stacktraces, you can increase this number. Setting it to 0 will result in no limit. - */ - 'debug_backtrace_limit' => 50, -]; diff --git a/config/filesystems.php b/config/filesystems.php index c2df26c84c..3d671bd910 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -9,7 +9,7 @@ return [ | | Here you may specify the default filesystem disk that should be used | by the framework. The "local" disk, as well as a variety of cloud - | based disks are available to your application. Just store away! + | based disks are available to your application for file storage. | */ @@ -20,26 +20,22 @@ return [ | Filesystem Disks |-------------------------------------------------------------------------- | - | Here you may configure as many filesystem "disks" as you wish, and you - | may even configure multiple disks of the same driver. Defaults have - | been set up for each driver as an example of the required values. + | Below you may configure as many filesystem disks as necessary, and you + | may even configure multiple disks for the same driver. Examples for + | most supported storage drivers are configured here for reference. | - | Supported Drivers: "local", "ftp", "sftp", "s3" + | Supported drivers: "local", "ftp", "sftp", "s3" | */ 'disks' => [ + 'local' => [ 'driver' => 'local', - 'root' => storage_path('app'), - 'throw' => false, - ], - - 'webhooks-during-maintenance' => [ - 'driver' => 'local', - 'root' => storage_path('app/webhooks-during-maintenance'), - 'visibility' => 'private', + 'root' => storage_path('app/private'), + 'serve' => true, 'throw' => false, + 'report' => false, ], 'public' => [ @@ -48,32 +44,7 @@ return [ 'url' => env('APP_URL').'/storage', 'visibility' => 'public', 'throw' => false, - ], - - 'ssh-mux' => [ - 'driver' => 'local', - 'root' => storage_path('app/ssh/mux'), - 'visibility' => 'private', - 'throw' => false, - ], - 'ssh-keys' => [ - 'driver' => 'local', - 'root' => storage_path('app/ssh/keys'), - 'visibility' => 'private', - 'throw' => false, - ], - - 'deployments' => [ - 'driver' => 'local', - 'root' => storage_path('app/deployments'), - 'visibility' => 'private', - 'throw' => false, - ], - 'backups' => [ - 'driver' => 'local', - 'root' => storage_path('app/backups'), - 'visibility' => 'private', - 'throw' => false, + 'report' => false, ], 's3' => [ @@ -86,6 +57,7 @@ return [ 'endpoint' => env('AWS_ENDPOINT'), 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), 'throw' => false, + 'report' => false, ], ], diff --git a/config/fortify.php b/config/fortify.php deleted file mode 100644 index 6b78c1c65f..0000000000 --- a/config/fortify.php +++ /dev/null @@ -1,148 +0,0 @@ - 'web', - - /* - |-------------------------------------------------------------------------- - | Fortify Password Broker - |-------------------------------------------------------------------------- - | - | Here you may specify which password broker Fortify can use when a user - | is resetting their password. This configured value should match one - | of your password brokers setup in your "auth" configuration file. - | - */ - - 'passwords' => 'users', - - /* - |-------------------------------------------------------------------------- - | Username / Email - |-------------------------------------------------------------------------- - | - | This value defines which model attribute should be considered as your - | application's "username" field. Typically, this might be the email - | address of the users but you are free to change this value here. - | - | Out of the box, Fortify expects forgot password and reset password - | requests to have a field named 'email'. If the application uses - | another name for the field you may define it below as needed. - | - */ - - 'username' => 'email', - - 'email' => 'email', - - /* - |-------------------------------------------------------------------------- - | Home Path - |-------------------------------------------------------------------------- - | - | Here you may configure the path where users will get redirected during - | authentication or password reset when the operations are successful - | and the user is authenticated. You are free to change this value. - | - */ - - 'home' => RouteServiceProvider::HOME, - - /* - |-------------------------------------------------------------------------- - | Fortify Routes Prefix / Subdomain - |-------------------------------------------------------------------------- - | - | Here you may specify which prefix Fortify will assign to all the routes - | that it registers with the application. If necessary, you may change - | subdomain under which all of the Fortify routes will be available. - | - */ - - 'prefix' => '', - - 'domain' => null, - - /* - |-------------------------------------------------------------------------- - | Fortify Routes Middleware - |-------------------------------------------------------------------------- - | - | Here you may specify which middleware Fortify will assign to the routes - | that it registers with the application. If necessary, you may change - | these middleware but typically this provided default is preferred. - | - */ - - 'middleware' => ['web'], - - /* - |-------------------------------------------------------------------------- - | Rate Limiting - |-------------------------------------------------------------------------- - | - | By default, Fortify will throttle logins to five requests per minute for - | every email and IP address combination. However, if you would like to - | specify a custom rate limiter to call then you may specify it here. - | - */ - - 'limiters' => [ - 'login' => 'login', - 'two-factor' => 'two-factor', - 'forgot-password' => 'forgot-password', - ], - - /* - |-------------------------------------------------------------------------- - | Register View Routes - |-------------------------------------------------------------------------- - | - | Here you may specify if the routes returning views should be disabled as - | you may not need them when building your own application. This may be - | especially true if you're writing a custom single-page application. - | - */ - - 'views' => true, - - /* - |-------------------------------------------------------------------------- - | Features - |-------------------------------------------------------------------------- - | - | Some of the Fortify features are optional. You may disable the features - | by removing them from this array. You're free to only remove some of - | these features or you can even remove all of these if you need to. - | - */ - - 'features' => [ - Features::registration(), - Features::resetPasswords(), - // Features::emailVerification(), - Features::updateProfileInformation(), - Features::updatePasswords(), - Features::twoFactorAuthentication([ - 'confirm' => true, - 'confirmPassword' => true, - // 'window' => 0, - ]), - ], - -]; diff --git a/config/hashing.php b/config/hashing.php deleted file mode 100644 index bcd3be4c28..0000000000 --- a/config/hashing.php +++ /dev/null @@ -1,52 +0,0 @@ - 'bcrypt', - - /* - |-------------------------------------------------------------------------- - | Bcrypt Options - |-------------------------------------------------------------------------- - | - | Here you may specify the configuration options that should be used when - | passwords are hashed using the Bcrypt algorithm. This will allow you - | to control the amount of time it takes to hash the given password. - | - */ - - 'bcrypt' => [ - 'rounds' => env('BCRYPT_ROUNDS', 10), - ], - - /* - |-------------------------------------------------------------------------- - | Argon Options - |-------------------------------------------------------------------------- - | - | Here you may specify the configuration options that should be used when - | passwords are hashed using the Argon algorithm. These will allow you - | to control the amount of time it takes to hash the given password. - | - */ - - 'argon' => [ - 'memory' => 65536, - 'threads' => 1, - 'time' => 4, - ], - -]; diff --git a/config/horizon.php b/config/horizon.php deleted file mode 100644 index 6086b30dad..0000000000 --- a/config/horizon.php +++ /dev/null @@ -1,217 +0,0 @@ - env('HORIZON_DOMAIN'), - - /* - |-------------------------------------------------------------------------- - | Horizon Path - |-------------------------------------------------------------------------- - | - | This is the URI path where Horizon will be accessible from. Feel free - | to change this path to anything you like. Note that the URI will not - | affect the paths of its internal API that aren't exposed to users. - | - */ - - 'path' => env('HORIZON_PATH', 'horizon'), - - /* - |-------------------------------------------------------------------------- - | Horizon Redis Connection - |-------------------------------------------------------------------------- - | - | This is the name of the Redis connection where Horizon will store the - | meta information required for it to function. It includes the list - | of supervisors, failed jobs, job metrics, and other information. - | - */ - - 'use' => 'default', - - /* - |-------------------------------------------------------------------------- - | Horizon Redis Prefix - |-------------------------------------------------------------------------- - | - | This prefix will be used when storing all Horizon data in Redis. You - | may modify the prefix when you are running multiple installations - | of Horizon on the same server so that they don't have problems. - | - */ - - 'prefix' => env( - 'HORIZON_PREFIX', - Str::slug(env('APP_NAME', 'laravel'), '_').'_horizon:' - ), - - /* - |-------------------------------------------------------------------------- - | Horizon Route Middleware - |-------------------------------------------------------------------------- - | - | These middleware will get attached onto each Horizon route, giving you - | the chance to add your own middleware to this list or change any of - | the existing middleware. Or, you can simply stick with this list. - | - */ - - 'middleware' => ['web'], - - /* - |-------------------------------------------------------------------------- - | Queue Wait Time Thresholds - |-------------------------------------------------------------------------- - | - | This option allows you to configure when the LongWaitDetected event - | will be fired. Every connection / queue combination may have its - | own, unique threshold (in seconds) before this event is fired. - | - */ - - 'waits' => [ - 'redis:default' => 60, - ], - - /* - |-------------------------------------------------------------------------- - | Job Trimming Times - |-------------------------------------------------------------------------- - | - | Here you can configure for how long (in minutes) you desire Horizon to - | persist the recent and failed jobs. Typically, recent jobs are kept - | for one hour while all failed jobs are stored for an entire week. - | - */ - - 'trim' => [ - 'recent' => 60, - 'pending' => 60, - 'completed' => 60, - 'recent_failed' => 10080, - 'failed' => 10080, - 'monitored' => 10080, - ], - - /* - |-------------------------------------------------------------------------- - | Silenced Jobs - |-------------------------------------------------------------------------- - | - | Silencing a job will instruct Horizon to not place the job in the list - | of completed jobs within the Horizon dashboard. This setting may be - | used to fully remove any noisy jobs from the completed jobs list. - | - */ - - 'silenced' => [ - // App\Jobs\ExampleJob::class, - ], - - /* - |-------------------------------------------------------------------------- - | Metrics - |-------------------------------------------------------------------------- - | - | Here you can configure how many snapshots should be kept to display in - | the metrics graph. This will get used in combination with Horizon's - | `horizon:snapshot` schedule to define how long to retain metrics. - | - */ - - 'metrics' => [ - 'trim_snapshots' => [ - 'job' => 24, - 'queue' => 24, - ], - ], - - /* - |-------------------------------------------------------------------------- - | Fast Termination - |-------------------------------------------------------------------------- - | - | When this option is enabled, Horizon's "terminate" command will not - | wait on all of the workers to terminate unless the --wait option - | is provided. Fast termination can shorten deployment delay by - | allowing a new instance of Horizon to start while the last - | instance will continue to terminate each of its workers. - | - */ - - 'fast_termination' => false, - - /* - |-------------------------------------------------------------------------- - | Memory Limit (MB) - |-------------------------------------------------------------------------- - | - | This value describes the maximum amount of memory the Horizon master - | supervisor may consume before it is terminated and restarted. For - | configuring these limits on your workers, see the next section. - | - */ - - 'memory_limit' => 64, - - /* - |-------------------------------------------------------------------------- - | Queue Worker Configuration - |-------------------------------------------------------------------------- - | - | Here you may define the queue worker settings used by your application - | in all environments. These supervisors and settings handle all your - | queued jobs and will be provisioned by Horizon during deployment. - | - */ - - 'defaults' => [ - 's6' => [ - 'connection' => 'redis', - 'queue' => ['high', 'default'], - 'balance' => env('HORIZON_BALANCE', 'auto'), - 'maxTime' => 0, - 'maxJobs' => 0, - 'memory' => 128, - 'tries' => 1, - 'timeout' => 3560, - 'nice' => 0, - ], - ], - - 'environments' => [ - 'production' => [ - 's6' => [ - 'autoScalingStrategy' => 'size', - 'minProcesses' => env('HORIZON_MIN_PROCESSES', 1), - 'maxProcesses' => env('HORIZON_MAX_PROCESSES', 6), - 'balanceMaxShift' => env('HORIZON_BALANCE_MAX_SHIFT', 1), - 'balanceCooldown' => env('HORIZON_BALANCE_COOLDOWN', 1), - ], - - ], - 'local' => [ - 's6' => [ - 'autoScalingStrategy' => 'size', - 'minProcesses' => env('HORIZON_MIN_PROCESSES', 1), - 'maxProcesses' => env('HORIZON_MAX_PROCESSES', 6), - 'balanceMaxShift' => env('HORIZON_BALANCE_MAX_SHIFT', 1), - 'balanceCooldown' => env('HORIZON_BALANCE_COOLDOWN', 1), - ], - ], - ], -]; diff --git a/config/livewire.php b/config/livewire.php deleted file mode 100644 index 02725e9443..0000000000 --- a/config/livewire.php +++ /dev/null @@ -1,150 +0,0 @@ - 'App\\Livewire', - - /* - |--------------------------------------------------------------------------- - | View Path - |--------------------------------------------------------------------------- - | - | This value is used to specify where Livewire component Blade templates are - | stored when running file creation commands like `artisan make:livewire`. - | It is also used if you choose to omit a component's render() method. - | - */ - - 'view_path' => resource_path('views/livewire'), - - /* - |--------------------------------------------------------------------------- - | Layout - |--------------------------------------------------------------------------- - | The view that will be used as the layout when rendering a single component - | as an entire page via `Route::get('/post/create', CreatePost::class);`. - | In this case, the view returned by CreatePost will render into $slot. - | - */ - - 'layout' => 'components.layout', - - /* - |--------------------------------------------------------------------------- - | Temporary File Uploads - |--------------------------------------------------------------------------- - | - | Livewire handles file uploads by storing uploads in a temporary directory - | before the file is stored permanently. All file uploads are directed to - | a global endpoint for temporary storage. You may configure this below: - | - */ - - 'temporary_file_upload' => [ - 'disk' => null, // Example: 'local', 's3' | Default: 'default' - 'rules' => [ // Example: ['file', 'mimes:png,jpg'] | Default: ['required', 'file', 'max:12288'] (12MB) - 'file', 'max:256000', - ], - 'directory' => null, // Example: 'tmp' | Default: 'livewire-tmp' - 'middleware' => null, // Example: 'throttle:5,1' | Default: 'throttle:60,1' - 'preview_mimes' => [ // Supported file types for temporary pre-signed file URLs... - 'png', 'gif', 'bmp', 'svg', 'wav', 'mp4', - 'mov', 'avi', 'wmv', 'mp3', 'm4a', - 'jpg', 'jpeg', 'mpga', 'webp', 'wma', - ], - 'max_upload_time' => 5, // Max duration (in minutes) before an upload is invalidated... - ], - - /* - |--------------------------------------------------------------------------- - | Render On Redirect - |--------------------------------------------------------------------------- - | - | This value determines if Livewire will run a component's `render()` method - | after a redirect has been triggered using something like `redirect(...)` - | Setting this to true will render the view once more before redirecting - | - */ - - 'render_on_redirect' => false, - - /* - |--------------------------------------------------------------------------- - | Eloquent Model Binding - |--------------------------------------------------------------------------- - | - | Previous versions of Livewire supported binding directly to eloquent model - | properties using wire:model by default. However, this behavior has been - | deemed too "magical" and has therefore been put under a feature flag. - | - */ - - 'legacy_model_binding' => true, - - /* - |--------------------------------------------------------------------------- - | Auto-inject Frontend Assets - |--------------------------------------------------------------------------- - | - | By default, Livewire automatically injects its JavaScript and CSS into the - | and of pages containing Livewire components. By disabling - | this behavior, you need to use @livewireStyles and @livewireScripts. - | - */ - - 'inject_assets' => true, - - /* - |--------------------------------------------------------------------------- - | Navigate (SPA mode) - |--------------------------------------------------------------------------- - | - | By adding `` to links in your Livewire application, Livewire - | will prevent the default link handling and instead request those pages - | via AJAX, creating an SPA-like effect. Configure this behavior here. - | - */ - - 'navigate' => [ - 'show_progress_bar' => true, - 'progress_bar_color' => '#ffff00', - ], - - /* - |--------------------------------------------------------------------------- - | HTML Morph Markers - |--------------------------------------------------------------------------- - | - | Livewire intelligently "morphs" existing HTML into the newly rendered HTML - | after each update. To make this process more reliable, Livewire injects - | "markers" into the rendered Blade surrounding @if, @class & @foreach. - | - */ - - 'inject_morph_markers' => true, - - /* - |--------------------------------------------------------------------------- - | Pagination Theme - |--------------------------------------------------------------------------- - | - | When enabling Livewire's pagination feature by using the `WithPagination` - | trait, Livewire will use Tailwind templates to render pagination views - | on the page. If you want Bootstrap CSS, you can specify: "bootstrap" - | - */ - - 'pagination_theme' => 'tailwind', - 'lazy_placeholder' => 'components.page-loading', -]; diff --git a/config/logging.php b/config/logging.php index 4c3df4ce14..8d94292b29 100644 --- a/config/logging.php +++ b/config/logging.php @@ -3,6 +3,7 @@ use Monolog\Handler\NullHandler; use Monolog\Handler\StreamHandler; use Monolog\Handler\SyslogUdpHandler; +use Monolog\Processor\PsrLogMessageProcessor; return [ @@ -11,9 +12,9 @@ return [ | Default Log Channel |-------------------------------------------------------------------------- | - | This option defines the default log channel that gets used when writing - | messages to the logs. The name specified in this option should match - | one of the channels defined in the "channels" configuration array. + | This option defines the default log channel that is utilized to write + | messages to your logs. The value provided here should match one of + | the channels present in the list of "channels" configured below. | */ @@ -32,7 +33,7 @@ return [ 'deprecations' => [ 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), - 'trace' => false, + 'trace' => env('LOG_DEPRECATIONS_TRACE', false), ], /* @@ -40,20 +41,20 @@ return [ | Log Channels |-------------------------------------------------------------------------- | - | Here you may configure the log channels for your application. Out of - | the box, Laravel uses the Monolog PHP logging library. This gives - | you a variety of powerful log handlers / formatters to utilize. + | Here you may configure the log channels for your application. Laravel + | utilizes the Monolog PHP logging library, which includes a variety + | of powerful log handlers and formatters that you're free to use. | - | Available Drivers: "single", "daily", "slack", "syslog", - | "errorlog", "monolog", - | "custom", "stack" + | Available drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", "custom", "stack" | */ 'channels' => [ + 'stack' => [ 'driver' => 'stack', - 'channels' => ['single'], + 'channels' => explode(',', env('LOG_STACK', 'single')), 'ignore_exceptions' => false, ], @@ -61,21 +62,24 @@ return [ 'driver' => 'single', 'path' => storage_path('logs/laravel.log'), 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, ], 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => env('LOG_LEVEL', 'debug'), - 'days' => 14, + 'days' => env('LOG_DAILY_DAYS', 14), + 'replace_placeholders' => true, ], 'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHOOK_URL'), - 'username' => 'Laravel Log', - 'emoji' => ':boom:', + 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), + 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, ], 'papertrail' => [ @@ -87,6 +91,7 @@ return [ 'port' => env('PAPERTRAIL_PORT'), 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), ], + 'processors' => [PsrLogMessageProcessor::class], ], 'stderr' => [ @@ -97,17 +102,20 @@ return [ 'with' => [ 'stream' => 'php://stderr', ], + 'processors' => [PsrLogMessageProcessor::class], ], 'syslog' => [ 'driver' => 'syslog', 'level' => env('LOG_LEVEL', 'debug'), - 'facility' => LOG_USER, + 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), + 'replace_placeholders' => true, ], 'errorlog' => [ 'driver' => 'errorlog', 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, ], 'null' => [ @@ -118,6 +126,7 @@ return [ 'emergency' => [ 'path' => storage_path('logs/laravel.log'), ], + ], ]; diff --git a/config/mail.php b/config/mail.php index 5b647944b3..756305b3c7 100644 --- a/config/mail.php +++ b/config/mail.php @@ -7,13 +7,14 @@ return [ | Default Mailer |-------------------------------------------------------------------------- | - | This option controls the default mailer that is used to send any email - | messages sent by your application. Alternative mailers may be setup - | and used as needed; however, this mailer will be used by default. + | This option controls the default mailer that is used to send all email + | messages unless another mailer is explicitly specified when sending + | the message. All additional mailers can be configured within the + | "mailers" array. Examples of each type of mailer are provided. | */ - 'default' => env('MAIL_MAILER', 'array'), + 'default' => env('MAIL_MAILER', 'log'), /* |-------------------------------------------------------------------------- @@ -24,45 +25,44 @@ return [ | their respective settings. Several examples have been configured for | you and you are free to add your own as your application requires. | - | Laravel supports a variety of mail "transport" drivers to be used while - | sending an e-mail. You will specify which one you are using for your - | mailers below. You are free to add additional mailers as required. + | Laravel supports a variety of mail "transport" drivers that can be used + | when delivering an email. You may specify which one you're using for + | your mailers below. You may also add additional mailers if needed. | | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", - | "postmark", "log", "array", "failover" + | "postmark", "resend", "log", "array", + | "failover", "roundrobin" | */ 'mailers' => [ + 'smtp' => [ 'transport' => 'smtp', - 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), - 'port' => env('MAIL_PORT', 587), - 'encryption' => env('MAIL_ENCRYPTION', 'tls'), + 'scheme' => env('MAIL_SCHEME'), + 'url' => env('MAIL_URL'), + 'host' => env('MAIL_HOST', '127.0.0.1'), + 'port' => env('MAIL_PORT', 2525), 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), 'timeout' => null, - 'local_domain' => env('MAIL_EHLO_DOMAIN'), - ], - 'resend' => [ - 'transport' => 'resend', + 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url(env('APP_URL', 'http://localhost'), PHP_URL_HOST)), ], + 'ses' => [ 'transport' => 'ses', ], - 'mailgun' => [ - 'transport' => 'mailgun', + 'postmark' => [ + 'transport' => 'postmark', + // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), // 'client' => [ // 'timeout' => 5, // ], ], - 'postmark' => [ - 'transport' => 'postmark', - // 'client' => [ - // 'timeout' => 5, - // ], + 'resend' => [ + 'transport' => 'resend', ], 'sendmail' => [ @@ -86,6 +86,15 @@ return [ 'log', ], ], + + 'roundrobin' => [ + 'transport' => 'roundrobin', + 'mailers' => [ + 'ses', + 'postmark', + ], + ], + ], /* @@ -93,9 +102,9 @@ return [ | Global "From" Address |-------------------------------------------------------------------------- | - | You may wish for all e-mails sent by your application to be sent from - | the same address. Here, you may specify a name and address that is - | used globally for all e-mails that are sent by your application. + | You may wish for all emails sent by your application to be sent from + | the same address. Here you may specify a name and address that is + | used globally for all emails that are sent by your application. | */ @@ -104,23 +113,4 @@ return [ 'name' => env('MAIL_FROM_NAME', 'Example'), ], - /* - |-------------------------------------------------------------------------- - | Markdown Mail Settings - |-------------------------------------------------------------------------- - | - | If you are using Markdown based email rendering, you may configure your - | theme and component paths here, allowing you to customize the design - | of the emails. Or, you may simply stick with the Laravel defaults! - | - */ - - 'markdown' => [ - 'theme' => 'default', - - 'paths' => [ - resource_path('views/vendor/mail'), - ], - ], - ]; diff --git a/config/purify.php b/config/purify.php deleted file mode 100644 index 66dbbb5683..0000000000 --- a/config/purify.php +++ /dev/null @@ -1,115 +0,0 @@ - 'default', - - /* - |-------------------------------------------------------------------------- - | Config sets - |-------------------------------------------------------------------------- - | - | Here you may configure various sets of configuration for differentiated use of HTMLPurifier. - | A specific set of configuration can be applied by calling the "config($name)" method on - | a Purify instance. Feel free to add/remove/customize these attributes as you wish. - | - | Documentation: http://htmlpurifier.org/live/configdoc/plain.html - | - | Core.Encoding The encoding to convert input to. - | HTML.Doctype Doctype to use during filtering. - | HTML.Allowed The allowed HTML Elements with their allowed attributes. - | HTML.ForbiddenElements The forbidden HTML elements. Elements that are listed in this - | string will be removed, however their content will remain. - | CSS.AllowedProperties The Allowed CSS properties. - | AutoFormat.AutoParagraph Newlines are converted in to paragraphs whenever possible. - | AutoFormat.RemoveEmpty Remove empty elements that contribute no semantic information to the document. - | - */ - - 'configs' => [ - - 'default' => [ - 'Core.Encoding' => 'utf-8', - 'HTML.Doctype' => 'HTML 4.01 Transitional', - 'HTML.Allowed' => 'h1,h2,h3,h4,h5,h6,b,u,strong,i,em,s,del,a[href|title],ul,ol,li,p[style],br,span,img[width|height|alt|src],blockquote', - 'HTML.ForbiddenElements' => '', - 'CSS.AllowedProperties' => 'font,font-size,font-weight,font-style,font-family,text-decoration,padding-left,color,background-color,text-align', - 'AutoFormat.AutoParagraph' => false, - 'AutoFormat.RemoveEmpty' => false, - ], - - ], - - /* - |-------------------------------------------------------------------------- - | HTMLPurifier definitions - |-------------------------------------------------------------------------- - | - | Here you may specify a class that augments the HTML definitions used by - | HTMLPurifier. Additional HTML5 definitions are provided out of the box. - | When specifying a custom class, make sure it implements the interface: - | - | \Stevebauman\Purify\Definitions\Definition - | - | Note that these definitions are applied to every Purifier instance. - | - | Documentation: http://htmlpurifier.org/docs/enduser-customize.html - | - */ - - 'definitions' => Html5Definition::class, - - /* - |-------------------------------------------------------------------------- - | HTMLPurifier CSS definitions - |-------------------------------------------------------------------------- - | - | Here you may specify a class that augments the CSS definitions used by - | HTMLPurifier. When specifying a custom class, make sure it implements - | the interface: - | - | \Stevebauman\Purify\Definitions\CssDefinition - | - | Note that these definitions are applied to every Purifier instance. - | - | CSS should be extending $definition->info['css-attribute'] = values - | See HTMLPurifier_CSSDefinition for further explanation - | - */ - - 'css-definitions' => null, - - /* - |-------------------------------------------------------------------------- - | Serializer - |-------------------------------------------------------------------------- - | - | The storage implementation where HTMLPurifier can store its serializer files. - | If the filesystem cache is in use, the path must be writable through the - | storage disk by the web server, otherwise an exception will be thrown. - | - */ - - 'serializer' => [ - 'driver' => env('CACHE_STORE', env('CACHE_DRIVER', 'file')), - 'cache' => \Stevebauman\Purify\Cache\CacheDefinitionCache::class, - ], - - // 'serializer' => [ - // 'disk' => env('FILESYSTEM_DISK', 'local'), - // 'path' => 'purify', - // 'cache' => \Stevebauman\Purify\Cache\FilesystemDefinitionCache::class, - // ], - -]; diff --git a/config/queue.php b/config/queue.php index a46085a9f9..116bd8d002 100644 --- a/config/queue.php +++ b/config/queue.php @@ -7,22 +7,22 @@ return [ | Default Queue Connection Name |-------------------------------------------------------------------------- | - | Laravel's queue API supports an assortment of back-ends via a single - | API, giving you convenient access to each back-end using the same - | syntax for every one. Here you may define a default connection. + | Laravel's queue supports a variety of backends via a single, unified + | API, giving you convenient access to each backend using identical + | syntax for each. The default queue connection is defined below. | */ - 'default' => env('QUEUE_CONNECTION', 'redis'), + 'default' => env('QUEUE_CONNECTION', 'database'), /* |-------------------------------------------------------------------------- | Queue Connections |-------------------------------------------------------------------------- | - | Here you may configure the connection information for each server that - | is used by your application. A default configuration has been added - | for each back-end shipped with Laravel. You are free to add more. + | Here you may configure the connection options for every queue backend + | used by your application. An example configuration is provided for + | each backend supported by Laravel. You're also free to add more. | | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" | @@ -33,19 +33,21 @@ return [ 'sync' => [ 'driver' => 'sync', ], + 'database' => [ 'driver' => 'database', - 'table' => 'jobs', - 'queue' => 'default', - 'retry_after' => 90, + 'connection' => env('DB_QUEUE_CONNECTION'), + 'table' => env('DB_QUEUE_TABLE', 'jobs'), + 'queue' => env('DB_QUEUE', 'default'), + 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), 'after_commit' => false, ], 'beanstalkd' => [ 'driver' => 'beanstalkd', - 'host' => 'localhost', - 'queue' => 'default', - 'retry_after' => 90, + 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), + 'queue' => env('BEANSTALKD_QUEUE', 'default'), + 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), 'block_for' => 0, 'after_commit' => false, ], @@ -63,29 +65,47 @@ return [ 'redis' => [ 'driver' => 'redis', - 'connection' => 'default', + 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), 'queue' => env('REDIS_QUEUE', 'default'), - 'retry_after' => 86400, + 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), 'block_for' => null, - 'after_commit' => true, + 'after_commit' => false, ], ], + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'job_batches', + ], + /* |-------------------------------------------------------------------------- | Failed Queue Jobs |-------------------------------------------------------------------------- | | These options configure the behavior of failed queue job logging so you - | can control which database and table are used to store the jobs that - | have failed. You may change them to any database / table you wish. + | can control how and where failed jobs are stored. Laravel ships with + | support for storing failed jobs in a simple file or in a database. + | + | Supported drivers: "database-uuids", "dynamodb", "file", "null" | */ 'failed' => [ 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), - 'database' => env('DB_CONNECTION', 'pgsql'), + 'database' => env('DB_CONNECTION', 'sqlite'), 'table' => 'failed_jobs', ], diff --git a/config/ray.php b/config/ray.php deleted file mode 100644 index 08598c4e8c..0000000000 --- a/config/ray.php +++ /dev/null @@ -1,108 +0,0 @@ - env('RAY_ENABLED', true), - - /* - * When enabled, all cache events will automatically be sent to Ray. - */ - 'send_cache_to_ray' => env('SEND_CACHE_TO_RAY', false), - - /* - * When enabled, all things passed to `dump` or `dd` - * will be sent to Ray as well. - */ - 'send_dumps_to_ray' => env('SEND_DUMPS_TO_RAY', true), - - /* - * When enabled all job events will automatically be sent to Ray. - */ - 'send_jobs_to_ray' => env('SEND_JOBS_TO_RAY', false), - - /* - * When enabled, all things logged to the application log - * will be sent to Ray as well. - */ - 'send_log_calls_to_ray' => env('SEND_LOG_CALLS_TO_RAY', true), - - /* - * When enabled, all queries will automatically be sent to Ray. - */ - 'send_queries_to_ray' => env('SEND_QUERIES_TO_RAY', false), - - /** - * When enabled, all duplicate queries will automatically be sent to Ray. - */ - 'send_duplicate_queries_to_ray' => env('SEND_DUPLICATE_QUERIES_TO_RAY', false), - - /* - * When enabled, slow queries will automatically be sent to Ray. - */ - 'send_slow_queries_to_ray' => env('SEND_SLOW_QUERIES_TO_RAY', false), - - /** - * Queries that are longer than this number of milliseconds will be regarded as slow. - */ - 'slow_query_threshold_in_ms' => env('RAY_SLOW_QUERY_THRESHOLD_IN_MS', 500), - - /* - * When enabled, all requests made to this app will automatically be sent to Ray. - */ - 'send_requests_to_ray' => env('SEND_REQUESTS_TO_RAY', false), - - /** - * When enabled, all Http Client requests made by this app will be automatically sent to Ray. - */ - 'send_http_client_requests_to_ray' => env('SEND_HTTP_CLIENT_REQUESTS_TO_RAY', false), - - /* - * When enabled, all views that are rendered automatically be sent to Ray. - */ - 'send_views_to_ray' => env('SEND_VIEWS_TO_RAY', false), - - /* - * When enabled, all exceptions will be automatically sent to Ray. - */ - 'send_exceptions_to_ray' => env('SEND_EXCEPTIONS_TO_RAY', true), - - /* - * When enabled, all deprecation notices will be automatically sent to Ray. - */ - 'send_deprecated_notices_to_ray' => env('SEND_DEPRECATED_NOTICES_TO_RAY', false), - - /* - * The host used to communicate with the Ray app. - * When using Docker on Mac or Windows, you can replace localhost with 'host.docker.internal' - * When using Docker on Linux, you can replace localhost with '172.17.0.1' - * When using Homestead with the VirtualBox provider, you can replace localhost with '10.0.2.2' - * When using Homestead with the Parallels provider, you can replace localhost with '10.211.55.2' - */ - 'host' => env('RAY_HOST', 'host.docker.internal'), - - /* - * The port number used to communicate with the Ray app. - */ - 'port' => env('RAY_PORT', 23517), - - /* - * Absolute base path for your sites or projects in Homestead, - * Vagrant, Docker, or another remote development server. - */ - 'remote_path' => env('RAY_REMOTE_PATH', null), - - /* - * Absolute base path for your sites or projects on your local - * computer where your IDE or code editor is running on. - */ - 'local_path' => env('RAY_LOCAL_PATH', null), - - /* - * When this setting is enabled, the package will not try to format values sent to Ray. - */ - 'always_send_raw_values' => false, -]; diff --git a/config/redoc.php b/config/redoc.php deleted file mode 100644 index 439e93e7b6..0000000000 --- a/config/redoc.php +++ /dev/null @@ -1,28 +0,0 @@ - '', - - /* - |-------------------------------------------------------------------------- - | Variables - |-------------------------------------------------------------------------- - | - | You can automatically replace variables in your OpenAPI definitions by - | adding a key value pair to the array below. This will replace any - | instances of :key with the given value. - | - */ - - 'variables' => [], - -]; diff --git a/config/sanctum.php b/config/sanctum.php deleted file mode 100644 index f1e5fc0e51..0000000000 --- a/config/sanctum.php +++ /dev/null @@ -1,68 +0,0 @@ - explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( - '%s%s', - 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', - Sanctum::currentApplicationUrlWithPort() - ))), - - /* - |-------------------------------------------------------------------------- - | Sanctum Guards - |-------------------------------------------------------------------------- - | - | This array contains the authentication guards that will be checked when - | Sanctum is trying to authenticate a request. If none of these guards - | are able to authenticate the request, Sanctum will use the bearer - | token that's present on an incoming request for authentication. - | - */ - - 'guard' => ['web'], - - /* - |-------------------------------------------------------------------------- - | Expiration Minutes - |-------------------------------------------------------------------------- - | - | This value controls the number of minutes until an issued token will be - | considered expired. If this value is null, personal access tokens do - | not expire. This won't tweak the lifetime of first-party sessions. - | - */ - - 'expiration' => null, - - /* - |-------------------------------------------------------------------------- - | Sanctum Middleware - |-------------------------------------------------------------------------- - | - | When authenticating your first-party SPA with Sanctum you may need to - | customize some of the middleware Sanctum uses while processing the - | request. You may change the middleware listed below as required. - | - */ - - 'middleware' => [ - 'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class, - 'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class, - 'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class, - ], - -]; diff --git a/config/sentry.php b/config/sentry.php deleted file mode 100644 index 0efb4a0e2b..0000000000 --- a/config/sentry.php +++ /dev/null @@ -1,85 +0,0 @@ - config('constants.sentry.sentry_dsn'), - - // The release version of your application - // Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD')) - 'release' => config('constants.coolify.version'), - - // When left empty or `null` the Laravel environment will be used - 'environment' => config('app.env'), - - 'breadcrumbs' => [ - // Capture Laravel logs in breadcrumbs - 'logs' => true, - - // Capture Laravel cache events in breadcrumbs - 'cache' => true, - - // Capture Livewire components in breadcrumbs - 'livewire' => true, - - // Capture SQL queries in breadcrumbs - 'sql_queries' => true, - - // Capture bindings on SQL queries logged in breadcrumbs - 'sql_bindings' => true, - - // Capture queue job information in breadcrumbs - 'queue_info' => true, - - // Capture command information in breadcrumbs - 'command_info' => true, - - // Capture HTTP client requests information in breadcrumbs - 'http_client_requests' => true, - ], - - 'tracing' => [ - // Trace queue jobs as their own transactions - 'queue_job_transactions' => env('SENTRY_TRACE_QUEUE_ENABLED', false), - - // Capture queue jobs as spans when executed on the sync driver - 'queue_jobs' => true, - - // Capture SQL queries as spans - 'sql_queries' => true, - - // Try to find out where the SQL query originated from and add it to the query spans - 'sql_origin' => true, - - // Capture views as spans - 'views' => true, - - // Capture Livewire components as spans - 'livewire' => true, - - // Capture HTTP client requests as spans - 'http_client_requests' => true, - - // Capture Redis operations as spans (this enables Redis events in Laravel) - 'redis_commands' => env('SENTRY_TRACE_REDIS_COMMANDS', false), - - // Try to find out where the Redis command originated from and add it to the command spans - 'redis_origin' => true, - - // Indicates if the tracing integrations supplied by Sentry should be loaded - 'default_integrations' => true, - - // Indicates that requests without a matching route should be traced - 'missing_routes' => false, - ], - - // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#send-default-pii - 'send_default_pii' => env('SENTRY_SEND_DEFAULT_PII', false), - - // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#traces-sample-rate - 'enable_tracing' => env('SENTRY_ENABLE_TRACING', false), - 'traces_sample_rate' => 0.2, - - 'profiles_sample_rate' => env('SENTRY_PROFILES_SAMPLE_RATE') === null ? null : (float) env('SENTRY_PROFILES_SAMPLE_RATE'), - -]; diff --git a/config/services.php b/config/services.php index d1c4a36995..27a36175f8 100644 --- a/config/services.php +++ b/config/services.php @@ -14,13 +14,6 @@ return [ | */ - 'mailgun' => [ - 'domain' => env('MAILGUN_DOMAIN'), - 'secret' => env('MAILGUN_SECRET'), - 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), - 'scheme' => 'https', - ], - 'postmark' => [ 'token' => env('POSTMARK_TOKEN'), ], @@ -31,26 +24,15 @@ return [ 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), ], - 'azure' => [ - 'client_id' => env('AZURE_CLIENT_ID'), - 'client_secret' => env('AZURE_CLIENT_SECRET'), - 'redirect' => env('AZURE_REDIRECT_URI'), - 'tenant' => env('AZURE_TENANT_ID'), - 'proxy' => env('AZURE_PROXY'), + 'resend' => [ + 'key' => env('RESEND_KEY'), ], - 'authentik' => [ - 'base_url' => env('AUTHENTIK_BASE_URL'), - 'client_id' => env('AUTHENTIK_CLIENT_ID'), - 'client_secret' => env('AUTHENTIK_CLIENT_SECRET'), - 'redirect' => env('AUTHENTIK_REDIRECT_URI'), - ], - - 'google' => [ - 'client_id' => env('GOOGLE_CLIENT_ID'), - 'client_secret' => env('GOOGLE_CLIENT_SECRET'), - 'redirect' => env('GOOGLE_REDIRECT_URI'), - 'tenant' => env('GOOGLE_TENANT'), + 'slack' => [ + 'notifications' => [ + 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), + 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), + ], ], ]; diff --git a/config/session.php b/config/session.php index 44ca7ded90..ba0aa60b07 100644 --- a/config/session.php +++ b/config/session.php @@ -9,9 +9,9 @@ return [ | Default Session Driver |-------------------------------------------------------------------------- | - | This option controls the default session "driver" that will be used on - | requests. By default, we will use the lightweight native driver but - | you may specify any of the other wonderful drivers provided here. + | This option determines the default session driver that is utilized for + | incoming requests. Laravel supports a variety of storage options to + | persist session data. Database storage is a great default choice. | | Supported: "file", "cookie", "database", "apc", | "memcached", "redis", "dynamodb", "array" @@ -27,13 +27,14 @@ return [ | | Here you may specify the number of minutes that you wish the session | to be allowed to remain idle before it expires. If you want them - | to immediately expire on the browser closing, set that option. + | to expire immediately when the browser is closed then you may + | indicate that via the expire_on_close configuration option. | */ - 'lifetime' => env('SESSION_LIFETIME', 10080), + 'lifetime' => (int) env('SESSION_LIFETIME', 120), - 'expire_on_close' => false, + 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), /* |-------------------------------------------------------------------------- @@ -41,21 +42,21 @@ return [ |-------------------------------------------------------------------------- | | This option allows you to easily specify that all of your session data - | should be encrypted before it is stored. All encryption will be run - | automatically by Laravel and you can use the Session like normal. + | should be encrypted before it's stored. All encryption is performed + | automatically by Laravel and you may use the session like normal. | */ - 'encrypt' => true, + 'encrypt' => env('SESSION_ENCRYPT', false), /* |-------------------------------------------------------------------------- | Session File Location |-------------------------------------------------------------------------- | - | When using the native session driver, we need a location where session - | files may be stored. A default has been set for you but a different - | location may be specified. This is only needed for file sessions. + | When utilizing the "file" session driver, the session files are placed + | on disk. The default storage location is defined here; however, you + | are free to provide another location where they should be stored. | */ @@ -79,22 +80,22 @@ return [ | Session Database Table |-------------------------------------------------------------------------- | - | When using the "database" session driver, you may specify the table we - | should use to manage the sessions. Of course, a sensible default is - | provided for you; however, you are free to change this as needed. + | When using the "database" session driver, you may specify the table to + | be used to store sessions. Of course, a sensible default is defined + | for you; however, you're welcome to change this to another table. | */ - 'table' => 'sessions', + 'table' => env('SESSION_TABLE', 'sessions'), /* |-------------------------------------------------------------------------- | Session Cache Store |-------------------------------------------------------------------------- | - | While using one of the framework's cache driven session backends you may - | list a cache store that should be used for these sessions. This value - | must match with one of the application's configured cache "stores". + | When using one of the framework's cache driven session backends, you may + | define the cache store which should be used to store the session data + | between requests. This must match one of your defined cache stores. | | Affects: "apc", "dynamodb", "memcached", "redis" | @@ -120,9 +121,9 @@ return [ | Session Cookie Name |-------------------------------------------------------------------------- | - | Here you may change the name of the cookie used to identify a session - | instance by ID. The name specified here will get used every time a - | new session cookie is created by the framework for every driver. + | Here you may change the name of the session cookie that is created by + | the framework. Typically, you should not need to change this value + | since doing so does not grant a meaningful security improvement. | */ @@ -138,20 +139,20 @@ return [ | | The session cookie path determines the path for which the cookie will | be regarded as available. Typically, this will be the root path of - | your application but you are free to change this when necessary. + | your application, but you're free to change this when necessary. | */ - 'path' => '/', + 'path' => env('SESSION_PATH', '/'), /* |-------------------------------------------------------------------------- | Session Cookie Domain |-------------------------------------------------------------------------- | - | Here you may change the domain of the cookie used to identify a session - | in your application. This will determine which domains the cookie is - | available to in your application. A sensible default has been set. + | This value determines the domain and subdomains the session cookie is + | available to. By default, the cookie will be available to the root + | domain and all subdomains. Typically, this shouldn't be changed. | */ @@ -177,11 +178,11 @@ return [ | | Setting this value to true will prevent JavaScript from accessing the | value of the cookie and the cookie will only be accessible through - | the HTTP protocol. You are free to modify this option if needed. + | the HTTP protocol. It's unlikely you should disable this option. | */ - 'http_only' => true, + 'http_only' => env('SESSION_HTTP_ONLY', true), /* |-------------------------------------------------------------------------- @@ -190,12 +191,27 @@ return [ | | This option determines how your cookies behave when cross-site requests | take place, and can be used to mitigate CSRF attacks. By default, we - | will set this value to "lax" since this is a secure default value. + | will set this value to "lax" to permit secure cross-site requests. + | + | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value | | Supported: "lax", "strict", "none", null | */ - 'same_site' => 'lax', + 'same_site' => env('SESSION_SAME_SITE', 'lax'), + + /* + |-------------------------------------------------------------------------- + | Partitioned Cookies + |-------------------------------------------------------------------------- + | + | Setting this value to true will tie the cookie to the top-level site for + | a cross-site context. Partitioned cookies are accepted by the browser + | when flagged "secure" and the Same-Site attribute is set to "none". + | + */ + + 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), ]; diff --git a/config/subscription.php b/config/subscription.php deleted file mode 100644 index a033862d26..0000000000 --- a/config/subscription.php +++ /dev/null @@ -1,12 +0,0 @@ - env('SUBSCRIPTION_PROVIDER', null), // stripe - - // Stripe - 'stripe_api_key' => env('STRIPE_API_KEY', null), - 'stripe_webhook_secret' => env('STRIPE_WEBHOOK_SECRET', null), - 'stripe_excluded_plans' => env('STRIPE_EXCLUDED_PLANS', null), - 'stripe_price_id_dynamic_monthly' => env('STRIPE_PRICE_ID_DYNAMIC_MONTHLY', null), - 'stripe_price_id_dynamic_yearly' => env('STRIPE_PRICE_ID_DYNAMIC_YEARLY', null), -]; diff --git a/config/telescope.php b/config/telescope.php deleted file mode 100644 index c940bec8a8..0000000000 --- a/config/telescope.php +++ /dev/null @@ -1,205 +0,0 @@ - env('TELESCOPE_ENABLED', false), - - /* - |-------------------------------------------------------------------------- - | Telescope Domain - |-------------------------------------------------------------------------- - | - | This is the subdomain where Telescope will be accessible from. If the - | setting is null, Telescope will reside under the same domain as the - | application. Otherwise, this value will be used as the subdomain. - | - */ - - 'domain' => env('TELESCOPE_DOMAIN'), - - /* - |-------------------------------------------------------------------------- - | Telescope Path - |-------------------------------------------------------------------------- - | - | This is the URI path where Telescope will be accessible from. Feel free - | to change this path to anything you like. Note that the URI will not - | affect the paths of its internal API that aren't exposed to users. - | - */ - - 'path' => env('TELESCOPE_PATH', 'telescope'), - - /* - |-------------------------------------------------------------------------- - | Telescope Storage Driver - |-------------------------------------------------------------------------- - | - | This configuration options determines the storage driver that will - | be used to store Telescope's data. In addition, you may set any - | custom options as needed by the particular driver you choose. - | - */ - - 'driver' => env('TELESCOPE_DRIVER', 'database'), - - 'storage' => [ - 'database' => [ - 'connection' => env('DB_CONNECTION', 'pgsql'), - 'chunk' => 1000, - ], - ], - - /* - |-------------------------------------------------------------------------- - | Telescope Queue - |-------------------------------------------------------------------------- - | - | This configuration options determines the queue connection and queue - | which will be used to process ProcessPendingUpdate jobs. This can - | be changed if you would prefer to use a non-default connection. - | - */ - - 'queue' => [ - 'connection' => env('TELESCOPE_QUEUE_CONNECTION', 'redis'), - 'queue' => env('TELESCOPE_QUEUE', 'default'), - ], - - /* - |-------------------------------------------------------------------------- - | Telescope Route Middleware - |-------------------------------------------------------------------------- - | - | These middleware will be assigned to every Telescope route, giving you - | the chance to add your own middleware to this list or change any of - | the existing middleware. Or, you can simply stick with this list. - | - */ - - 'middleware' => [ - 'web', - Authorize::class, - ], - - /* - |-------------------------------------------------------------------------- - | Allowed / Ignored Paths & Commands - |-------------------------------------------------------------------------- - | - | The following array lists the URI paths and Artisan commands that will - | not be watched by Telescope. In addition to this list, some Laravel - | commands, like migrations and queue commands, are always ignored. - | - */ - - 'only_paths' => [ - // 'api/*' - ], - - 'ignore_paths' => [ - 'livewire*', - 'nova-api*', - 'pulse*', - ], - - 'ignore_commands' => [ - // - ], - - /* - |-------------------------------------------------------------------------- - | Telescope Watchers - |-------------------------------------------------------------------------- - | - | The following array lists the "watchers" that will be registered with - | Telescope. The watchers gather the application's profile data when - | a request or task is executed. Feel free to customize this list. - | - */ - - 'watchers' => [ - Watchers\BatchWatcher::class => env('TELESCOPE_BATCH_WATCHER', true), - - Watchers\CacheWatcher::class => [ - 'enabled' => env('TELESCOPE_CACHE_WATCHER', true), - 'hidden' => [], - ], - - Watchers\ClientRequestWatcher::class => env('TELESCOPE_CLIENT_REQUEST_WATCHER', true), - - Watchers\CommandWatcher::class => [ - 'enabled' => env('TELESCOPE_COMMAND_WATCHER', true), - 'ignore' => [], - ], - - Watchers\DumpWatcher::class => [ - 'enabled' => env('TELESCOPE_DUMP_WATCHER', true), - 'always' => env('TELESCOPE_DUMP_WATCHER_ALWAYS', false), - ], - - Watchers\EventWatcher::class => [ - 'enabled' => env('TELESCOPE_EVENT_WATCHER', true), - 'ignore' => [], - ], - - Watchers\ExceptionWatcher::class => env('TELESCOPE_EXCEPTION_WATCHER', true), - - Watchers\GateWatcher::class => [ - 'enabled' => env('TELESCOPE_GATE_WATCHER', true), - 'ignore_abilities' => [], - 'ignore_packages' => true, - 'ignore_paths' => [], - ], - - Watchers\JobWatcher::class => env('TELESCOPE_JOB_WATCHER', true), - - Watchers\LogWatcher::class => [ - 'enabled' => env('TELESCOPE_LOG_WATCHER', true), - 'level' => 'error', - ], - - Watchers\MailWatcher::class => env('TELESCOPE_MAIL_WATCHER', true), - - Watchers\ModelWatcher::class => [ - 'enabled' => env('TELESCOPE_MODEL_WATCHER', true), - 'events' => ['eloquent.*'], - 'hydrations' => true, - ], - - Watchers\NotificationWatcher::class => env('TELESCOPE_NOTIFICATION_WATCHER', true), - - Watchers\QueryWatcher::class => [ - 'enabled' => env('TELESCOPE_QUERY_WATCHER', true), - 'ignore_packages' => true, - 'ignore_paths' => [], - 'slow' => 100, - ], - - Watchers\RedisWatcher::class => env('TELESCOPE_REDIS_WATCHER', true), - - Watchers\RequestWatcher::class => [ - 'enabled' => env('TELESCOPE_REQUEST_WATCHER', true), - 'size_limit' => env('TELESCOPE_RESPONSE_SIZE_LIMIT', 64), - 'ignore_http_methods' => [], - 'ignore_status_codes' => [], - ], - - Watchers\ScheduleWatcher::class => env('TELESCOPE_SCHEDULE_WATCHER', true), - Watchers\ViewWatcher::class => env('TELESCOPE_VIEW_WATCHER', true), - ], -]; diff --git a/config/testing.php b/config/testing.php deleted file mode 100644 index 41b8eadf01..0000000000 --- a/config/testing.php +++ /dev/null @@ -1,6 +0,0 @@ - env('DUSK_TEST_EMAIL', 'test@example.com'), - 'dusk_test_password' => env('DUSK_TEST_PASSWORD', 'password'), -]; diff --git a/config/view.php b/config/view.php deleted file mode 100644 index 22b8a18d32..0000000000 --- a/config/view.php +++ /dev/null @@ -1,36 +0,0 @@ - [ - resource_path('views'), - ], - - /* - |-------------------------------------------------------------------------- - | Compiled View Path - |-------------------------------------------------------------------------- - | - | This option determines where all the compiled Blade templates will be - | stored for your application. Typically, this is within the storage - | directory. However, as usual, you are free to change this value. - | - */ - - 'compiled' => env( - 'VIEW_COMPILED_PATH', - realpath(storage_path('framework/views')) - ), - -]; diff --git a/database/.gitignore b/database/.gitignore deleted file mode 100644 index 9b19b93c9f..0000000000 --- a/database/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.sqlite* diff --git a/database/factories/ApplicationFactory.php b/database/factories/ApplicationFactory.php deleted file mode 100644 index ded507c56d..0000000000 --- a/database/factories/ApplicationFactory.php +++ /dev/null @@ -1,22 +0,0 @@ - fake()->unique()->name(), - 'destination_id' => 1, - 'git_repository' => fake()->url(), - 'git_branch' => fake()->word(), - 'build_pack' => 'nixpacks', - 'ports_exposes' => '3000', - 'environment_id' => 1, - 'destination_id' => 1, - ]; - } -} diff --git a/database/factories/ServerFactory.php b/database/factories/ServerFactory.php deleted file mode 100644 index 29546bf565..0000000000 --- a/database/factories/ServerFactory.php +++ /dev/null @@ -1,17 +0,0 @@ - fake()->unique()->name(), - 'ip' => fake()->unique()->ipv4(), - 'private_key_id' => 1, - ]; - } -} diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php deleted file mode 100644 index 31ddf87205..0000000000 --- a/database/factories/UserFactory.php +++ /dev/null @@ -1,37 +0,0 @@ - - */ -class UserFactory extends Factory -{ - /** - * Define the model's default state. - * - * @return array - */ - public function definition(): array - { - return [ - 'email' => fake()->unique()->safeEmail(), - 'email_verified_at' => now(), - 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password - 'remember_token' => Str::random(10), - ]; - } - - /** - * Indicate that the model's email address should be unverified. - */ - public function unverified(): static - { - return $this->state(fn (array $attributes) => [ - 'email_verified_at' => null, - ]); - } -} diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php deleted file mode 100644 index 321128a8f4..0000000000 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ /dev/null @@ -1,32 +0,0 @@ -id(); - $table->string('name')->default('Anonymous'); - $table->string('email')->unique(); - $table->timestamp('email_verified_at')->nullable(); - $table->string('password'); - $table->rememberToken(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('users'); - } -}; diff --git a/database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php b/database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php deleted file mode 100644 index 81a7229b08..0000000000 --- a/database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php +++ /dev/null @@ -1,28 +0,0 @@ -string('email')->primary(); - $table->string('token'); - $table->timestamp('created_at')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('password_reset_tokens'); - } -}; diff --git a/database/migrations/2014_10_12_200000_add_two_factor_columns_to_users_table.php b/database/migrations/2014_10_12_200000_add_two_factor_columns_to_users_table.php deleted file mode 100644 index b490e24f5a..0000000000 --- a/database/migrations/2014_10_12_200000_add_two_factor_columns_to_users_table.php +++ /dev/null @@ -1,46 +0,0 @@ -text('two_factor_secret') - ->after('password') - ->nullable(); - - $table->text('two_factor_recovery_codes') - ->after('two_factor_secret') - ->nullable(); - - if (Fortify::confirmsTwoFactorAuthentication()) { - $table->timestamp('two_factor_confirmed_at') - ->after('two_factor_recovery_codes') - ->nullable(); - } - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('users', function (Blueprint $table) { - $table->dropColumn(array_merge([ - 'two_factor_secret', - 'two_factor_recovery_codes', - ], Fortify::confirmsTwoFactorAuthentication() ? [ - 'two_factor_confirmed_at', - ] : [])); - }); - } -}; diff --git a/database/migrations/2018_08_08_100000_create_telescope_entries_table.php b/database/migrations/2018_08_08_100000_create_telescope_entries_table.php deleted file mode 100644 index 700a83f095..0000000000 --- a/database/migrations/2018_08_08_100000_create_telescope_entries_table.php +++ /dev/null @@ -1,70 +0,0 @@ -getConnection()); - - $schema->create('telescope_entries', function (Blueprint $table) { - $table->bigIncrements('sequence'); - $table->uuid('uuid'); - $table->uuid('batch_id'); - $table->string('family_hash')->nullable(); - $table->boolean('should_display_on_index')->default(true); - $table->string('type', 20); - $table->longText('content'); - $table->dateTime('created_at')->nullable(); - - $table->unique('uuid'); - $table->index('batch_id'); - $table->index('family_hash'); - $table->index('created_at'); - $table->index(['type', 'should_display_on_index']); - }); - - $schema->create('telescope_entries_tags', function (Blueprint $table) { - $table->uuid('entry_uuid'); - $table->string('tag'); - - $table->primary(['entry_uuid', 'tag']); - $table->index('tag'); - - $table->foreign('entry_uuid') - ->references('uuid') - ->on('telescope_entries') - ->onDelete('cascade'); - }); - - $schema->create('telescope_monitoring', function (Blueprint $table) { - $table->string('tag')->primary(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - $schema = Schema::connection($this->getConnection()); - - $schema->dropIfExists('telescope_entries_tags'); - $schema->dropIfExists('telescope_entries'); - $schema->dropIfExists('telescope_monitoring'); - } -}; diff --git a/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php b/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php deleted file mode 100644 index 954f7518f5..0000000000 --- a/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php +++ /dev/null @@ -1,34 +0,0 @@ -id(); - $table->morphs('tokenable'); - $table->string('name'); - $table->string('token', 64)->unique(); - $table->string('team_id'); - $table->text('abilities')->nullable(); - $table->timestamp('last_used_at')->nullable(); - $table->timestamp('expires_at')->nullable(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('personal_access_tokens'); - } -}; diff --git a/database/migrations/2023_03_20_112410_create_activity_log_table.php b/database/migrations/2023_03_20_112410_create_activity_log_table.php deleted file mode 100755 index c94274b315..0000000000 --- a/database/migrations/2023_03_20_112410_create_activity_log_table.php +++ /dev/null @@ -1,27 +0,0 @@ -create(config('activitylog.table_name'), function (Blueprint $table) { - $table->id(); - $table->string('log_name')->nullable(); - $table->text('description'); - $table->nullableMorphs('subject', 'subject'); - $table->nullableMorphs('causer', 'causer'); - $table->json('properties')->nullable(); - $table->timestamps(); - $table->index('log_name'); - }); - } - - public function down() - { - Schema::connection(config('activitylog.database_connection'))->dropIfExists(config('activitylog.table_name')); - } -} diff --git a/database/migrations/2023_03_20_112411_add_event_column_to_activity_log_table.php b/database/migrations/2023_03_20_112411_add_event_column_to_activity_log_table.php deleted file mode 100755 index 78d9a0e0ae..0000000000 --- a/database/migrations/2023_03_20_112411_add_event_column_to_activity_log_table.php +++ /dev/null @@ -1,22 +0,0 @@ -table(config('activitylog.table_name'), function (Blueprint $table) { - $table->string('event')->nullable()->after('subject_type'); - }); - } - - public function down() - { - Schema::connection(config('activitylog.database_connection'))->table(config('activitylog.table_name'), function (Blueprint $table) { - $table->dropColumn('event'); - }); - } -} diff --git a/database/migrations/2023_03_20_112412_add_batch_uuid_column_to_activity_log_table.php b/database/migrations/2023_03_20_112412_add_batch_uuid_column_to_activity_log_table.php deleted file mode 100755 index 320ef5ccec..0000000000 --- a/database/migrations/2023_03_20_112412_add_batch_uuid_column_to_activity_log_table.php +++ /dev/null @@ -1,22 +0,0 @@ -table(config('activitylog.table_name'), function (Blueprint $table) { - $table->uuid('batch_uuid')->nullable()->after('properties'); - }); - } - - public function down() - { - Schema::connection(config('activitylog.database_connection'))->table(config('activitylog.table_name'), function (Blueprint $table) { - $table->dropColumn('batch_uuid'); - }); - } -} diff --git a/database/migrations/2023_03_20_112809_create_sessions_table.php b/database/migrations/2023_03_20_112809_create_sessions_table.php deleted file mode 100644 index f60625bb57..0000000000 --- a/database/migrations/2023_03_20_112809_create_sessions_table.php +++ /dev/null @@ -1,31 +0,0 @@ -string('id')->primary(); - $table->foreignId('user_id')->nullable()->index(); - $table->string('ip_address', 45)->nullable(); - $table->text('user_agent')->nullable(); - $table->longText('payload'); - $table->integer('last_activity')->index(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('sessions'); - } -}; diff --git a/database/migrations/2023_03_20_112811_create_teams_table.php b/database/migrations/2023_03_20_112811_create_teams_table.php deleted file mode 100644 index 0f41c5e95d..0000000000 --- a/database/migrations/2023_03_20_112811_create_teams_table.php +++ /dev/null @@ -1,34 +0,0 @@ -id(); - $table->string('name'); - $table->string('description')->nullable(); - $table->boolean('personal_team')->default(false); - $table->schemalessAttributes('smtp'); - $table->schemalessAttributes('smtp_notifications'); - $table->schemalessAttributes('discord'); - $table->schemalessAttributes('discord_notifications'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('teams'); - } -}; diff --git a/database/migrations/2023_03_20_112812_create_team_user_table.php b/database/migrations/2023_03_20_112812_create_team_user_table.php deleted file mode 100644 index 9eeeb4b31b..0000000000 --- a/database/migrations/2023_03_20_112812_create_team_user_table.php +++ /dev/null @@ -1,32 +0,0 @@ -id(); - $table->foreignId('team_id'); - $table->foreignId('user_id'); - $table->string('role')->default('member'); - $table->timestamps(); - - $table->unique(['team_id', 'user_id']); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('team_user'); - } -}; diff --git a/database/migrations/2023_03_20_112813_create_team_invitations_table.php b/database/migrations/2023_03_20_112813_create_team_invitations_table.php deleted file mode 100644 index 9bce2be922..0000000000 --- a/database/migrations/2023_03_20_112813_create_team_invitations_table.php +++ /dev/null @@ -1,35 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->foreignId('team_id')->constrained()->cascadeOnDelete(); - $table->string('email'); - $table->string('role')->default('member'); - $table->string('link'); - $table->string('via')->default('link'); - $table->timestamps(); - - $table->unique(['team_id', 'email']); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('team_invitations'); - } -}; diff --git a/database/migrations/2023_03_20_112814_create_instance_settings_table.php b/database/migrations/2023_03_20_112814_create_instance_settings_table.php deleted file mode 100644 index 51b156ccbf..0000000000 --- a/database/migrations/2023_03_20_112814_create_instance_settings_table.php +++ /dev/null @@ -1,38 +0,0 @@ -id(); - $table->string('public_ipv4')->nullable(); - $table->string('public_ipv6')->nullable(); - $table->string('fqdn')->nullable(); - $table->string('wildcard_domain')->nullable(); - $table->string('default_redirect_404')->nullable(); - $table->integer('public_port_min')->default(9000); - $table->integer('public_port_max')->default(9100); - $table->boolean('do_not_track')->default(false); - $table->boolean('is_auto_update_enabled')->default(true); - $table->boolean('is_registration_enabled')->default(true); - $table->schemalessAttributes('smtp'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('instance_settings'); - } -}; diff --git a/database/migrations/2023_03_24_140711_create_servers_table.php b/database/migrations/2023_03_24_140711_create_servers_table.php deleted file mode 100644 index 0f3bf7419c..0000000000 --- a/database/migrations/2023_03_24_140711_create_servers_table.php +++ /dev/null @@ -1,36 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name'); - $table->string('description')->nullable(); - $table->string('ip'); - $table->integer('port')->default(22); - $table->string('user')->default('root'); - $table->foreignId('team_id'); - $table->foreignId('private_key_id'); - $table->schemalessAttributes('proxy'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('servers'); - } -}; diff --git a/database/migrations/2023_03_24_140712_create_server_settings_table.php b/database/migrations/2023_03_24_140712_create_server_settings_table.php deleted file mode 100644 index a3b1c8b44e..0000000000 --- a/database/migrations/2023_03_24_140712_create_server_settings_table.php +++ /dev/null @@ -1,33 +0,0 @@ -id(); - $table->boolean('is_part_of_swarm')->default(false); - $table->boolean('is_jump_server')->default(false); - $table->boolean('is_build_server')->default(false); - $table->boolean('is_reachable')->default(false); - $table->boolean('is_usable')->default(false); - $table->foreignId('server_id'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('server_settings'); - } -}; diff --git a/database/migrations/2023_03_24_140853_create_private_keys_table.php b/database/migrations/2023_03_24_140853_create_private_keys_table.php deleted file mode 100644 index 21acf7d058..0000000000 --- a/database/migrations/2023_03_24_140853_create_private_keys_table.php +++ /dev/null @@ -1,33 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name'); - $table->string('description')->nullable(); - $table->longText('private_key'); - $table->boolean('is_git_related')->default(false); - $table->foreignId('team_id'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('private_keys'); - } -}; diff --git a/database/migrations/2023_03_27_075351_create_projects_table.php b/database/migrations/2023_03_27_075351_create_projects_table.php deleted file mode 100644 index 432496268e..0000000000 --- a/database/migrations/2023_03_27_075351_create_projects_table.php +++ /dev/null @@ -1,33 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name'); - $table->string('description')->nullable(); - - $table->foreignId('team_id'); - - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('projects'); - } -}; diff --git a/database/migrations/2023_03_27_075443_create_project_settings_table.php b/database/migrations/2023_03_27_075443_create_project_settings_table.php deleted file mode 100644 index 35f691ea83..0000000000 --- a/database/migrations/2023_03_27_075443_create_project_settings_table.php +++ /dev/null @@ -1,29 +0,0 @@ -id(); - $table->string('wildcard_domain')->nullable(); - $table->foreignId('project_id'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('project_settings'); - } -}; diff --git a/database/migrations/2023_03_27_075444_create_environments_table.php b/database/migrations/2023_03_27_075444_create_environments_table.php deleted file mode 100644 index f9514dcce3..0000000000 --- a/database/migrations/2023_03_27_075444_create_environments_table.php +++ /dev/null @@ -1,30 +0,0 @@ -id(); - $table->string('name'); - $table->foreignId('project_id'); - $table->timestamps(); - $table->unique(['name', 'project_id']); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('environments'); - } -}; diff --git a/database/migrations/2023_03_27_081716_create_applications_table.php b/database/migrations/2023_03_27_081716_create_applications_table.php deleted file mode 100644 index 3a41a26b20..0000000000 --- a/database/migrations/2023_03_27_081716_create_applications_table.php +++ /dev/null @@ -1,85 +0,0 @@ -id(); - $table->integer('repository_project_id')->nullable(); - $table->string('uuid')->unique(); - $table->string('name'); - - $table->string('fqdn')->unique()->nullable(); - $table->string('config_hash')->nullable(); - - $table->string('git_repository'); - $table->string('git_branch'); - $table->string('git_commit_sha')->default('HEAD'); - // TODO: remove this column, it is not used - $table->string('git_full_url')->nullable(); - - $table->string('docker_registry_image_name')->nullable(); - $table->string('docker_registry_image_tag')->nullable(); - - $table->string('build_pack'); - $table->string('static_image')->default('nginx:alpine'); - - $table->string('install_command')->nullable(); - $table->string('build_command')->nullable(); - $table->string('start_command')->nullable(); - - $table->string('ports_exposes'); - $table->string('ports_mappings')->nullable(); - - $table->string('base_directory')->default('/'); - $table->string('publish_directory')->nullable(); - - $table->string('health_check_path')->default('/'); - $table->string('health_check_port')->nullable(); - $table->string('health_check_host')->default('localhost'); - $table->string('health_check_method')->default('GET'); - $table->integer('health_check_return_code')->default(200); - $table->string('health_check_scheme')->default('http'); - $table->string('health_check_response_text')->nullable(); - $table->integer('health_check_interval')->default(5); - $table->integer('health_check_timeout')->default(5); - $table->integer('health_check_retries')->default(10); - $table->integer('health_check_start_period')->default(5); - - $table->string('limits_memory')->default('0'); - $table->string('limits_memory_swap')->default('0'); - $table->integer('limits_memory_swappiness')->default(60); - $table->string('limits_memory_reservation')->default('0'); - - $table->string('limits_cpus')->default('0'); - $table->string('limits_cpuset')->nullable()->default('0'); - $table->integer('limits_cpu_shares')->default(1024); - - $table->string('status')->default('exited'); - $table->string('preview_url_template')->default('{{pr_id}}.{{domain}}'); - - $table->nullableMorphs('destination'); - $table->nullableMorphs('source'); - - $table->foreignId('private_key_id')->nullable(); - $table->foreignId('environment_id'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('applications'); - } -}; diff --git a/database/migrations/2023_03_27_081717_create_application_settings_table.php b/database/migrations/2023_03_27_081717_create_application_settings_table.php deleted file mode 100644 index e13f7f3666..0000000000 --- a/database/migrations/2023_03_27_081717_create_application_settings_table.php +++ /dev/null @@ -1,38 +0,0 @@ -id(); - $table->boolean('is_static')->default(false); - $table->boolean('is_git_submodules_enabled')->default(true); - $table->boolean('is_git_lfs_enabled')->default(true); - $table->boolean('is_auto_deploy_enabled')->default(true); - $table->boolean('is_force_https_enabled')->default(true); - $table->boolean('is_debug_enabled')->default(false); - $table->boolean('is_preview_deployments_enabled')->default(false); - // $table->boolean('is_dual_cert')->default(false); - // $table->boolean('is_custom_ssl')->default(false); - // $table->boolean('is_http2')->default(false); - $table->foreignId('application_id'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('application_settings'); - } -}; diff --git a/database/migrations/2023_03_27_081718_create_application_previews_table.php b/database/migrations/2023_03_27_081718_create_application_previews_table.php deleted file mode 100644 index 66211eee46..0000000000 --- a/database/migrations/2023_03_27_081718_create_application_previews_table.php +++ /dev/null @@ -1,36 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->integer('pull_request_id'); - $table->string('pull_request_html_url'); - $table->integer('pull_request_issue_comment_id')->nullable(); - - $table->string('fqdn')->unique()->nullable(); - $table->string('status')->default('exited'); - - $table->foreignId('application_id'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('application_previews'); - } -}; diff --git a/database/migrations/2023_03_27_083621_create_services_table.php b/database/migrations/2023_03_27_083621_create_services_table.php deleted file mode 100644 index 12bb77b1ba..0000000000 --- a/database/migrations/2023_03_27_083621_create_services_table.php +++ /dev/null @@ -1,33 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name'); - - $table->morphs('destination'); - - $table->foreignId('environment_id'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('services'); - } -}; diff --git a/database/migrations/2023_03_27_085020_create_standalone_dockers_table.php b/database/migrations/2023_03_27_085020_create_standalone_dockers_table.php deleted file mode 100644 index f7f4300994..0000000000 --- a/database/migrations/2023_03_27_085020_create_standalone_dockers_table.php +++ /dev/null @@ -1,33 +0,0 @@ -id(); - $table->string('name'); - $table->string('uuid')->unique(); - $table->string('network'); - - $table->foreignId('server_id'); - $table->unique(['server_id', 'network']); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('standalone_dockers'); - } -}; diff --git a/database/migrations/2023_03_27_085022_create_swarm_dockers_table.php b/database/migrations/2023_03_27_085022_create_swarm_dockers_table.php deleted file mode 100644 index ea85640baa..0000000000 --- a/database/migrations/2023_03_27_085022_create_swarm_dockers_table.php +++ /dev/null @@ -1,31 +0,0 @@ -id(); - $table->string('name'); - $table->string('uuid')->unique(); - - $table->foreignId('server_id'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('swarm_dockers'); - } -}; diff --git a/database/migrations/2023_03_28_062150_create_kubernetes_table.php b/database/migrations/2023_03_28_062150_create_kubernetes_table.php deleted file mode 100644 index 365380e1fc..0000000000 --- a/database/migrations/2023_03_28_062150_create_kubernetes_table.php +++ /dev/null @@ -1,29 +0,0 @@ -id(); - $table->string('uuid')->unique(); - - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('kubernetes'); - } -}; diff --git a/database/migrations/2023_03_28_083723_create_github_apps_table.php b/database/migrations/2023_03_28_083723_create_github_apps_table.php deleted file mode 100644 index 27f1939125..0000000000 --- a/database/migrations/2023_03_28_083723_create_github_apps_table.php +++ /dev/null @@ -1,47 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name'); - - $table->string('organization')->nullable(); - $table->string('api_url'); - $table->string('html_url'); - $table->string('custom_user')->default('git'); - $table->integer('custom_port')->default(22); - - $table->integer('app_id')->nullable(); - $table->integer('installation_id')->nullable(); - $table->string('client_id')->nullable(); - $table->longText('client_secret')->nullable(); - $table->longText('webhook_secret')->nullable(); - - $table->boolean('is_system_wide')->default(false); - $table->boolean('is_public')->default(false); - - $table->foreignId('private_key_id')->nullable(); - $table->foreignId('team_id'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('github_apps'); - } -}; diff --git a/database/migrations/2023_03_28_083726_create_gitlab_apps_table.php b/database/migrations/2023_03_28_083726_create_gitlab_apps_table.php deleted file mode 100644 index 24db88d863..0000000000 --- a/database/migrations/2023_03_28_083726_create_gitlab_apps_table.php +++ /dev/null @@ -1,49 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name'); - - $table->string('organization')->nullable(); - $table->string('api_url'); - $table->string('html_url'); - $table->integer('custom_port')->default(22); - $table->string('custom_user')->default('git'); - $table->boolean('is_system_wide')->default(false); - $table->boolean('is_public')->default(false); - - $table->integer('app_id')->nullable(); - $table->string('app_secret')->nullable(); - $table->integer('oauth_id')->nullable(); - $table->string('group_name')->nullable(); - $table->longText('public_key')->nullable(); - $table->longText('webhook_token')->nullable(); - $table->integer('deploy_key_id')->nullable(); - - $table->foreignId('private_key_id')->nullable(); - $table->foreignId('team_id'); - - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('gitlab_apps'); - } -}; diff --git a/database/migrations/2023_04_03_111012_create_local_persistent_volumes_table.php b/database/migrations/2023_04_03_111012_create_local_persistent_volumes_table.php deleted file mode 100644 index c3f2a976a9..0000000000 --- a/database/migrations/2023_04_03_111012_create_local_persistent_volumes_table.php +++ /dev/null @@ -1,35 +0,0 @@ -id(); - $table->string('name'); - $table->string('mount_path'); - $table->string('host_path')->nullable(); - $table->string('container_id')->nullable(); - - $table->nullableMorphs('resource'); - - $table->unique(['name', 'resource_id', 'resource_type']); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('local_persistent_volumes'); - } -}; diff --git a/database/migrations/2023_05_04_194548_create_environment_variables_table.php b/database/migrations/2023_05_04_194548_create_environment_variables_table.php deleted file mode 100644 index 4a03ead55a..0000000000 --- a/database/migrations/2023_05_04_194548_create_environment_variables_table.php +++ /dev/null @@ -1,40 +0,0 @@ -id(); - - $table->string('key'); - $table->string('value')->nullable(); - $table->boolean('is_build_time')->default(false); - $table->boolean('is_preview')->default(false); - - $table->foreignId('application_id')->nullable(); - $table->foreignId('service_id')->nullable(); - $table->foreignId('database_id')->nullable(); - - $table->unique(['key', 'application_id', 'is_build_time', 'is_preview']); - $table->unique(['key', 'service_id', 'is_build_time', 'is_preview']); - $table->unique(['key', 'database_id', 'is_build_time', 'is_preview']); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('environment_variables'); - } -}; diff --git a/database/migrations/2023_05_17_104039_create_failed_jobs_table.php b/database/migrations/2023_05_17_104039_create_failed_jobs_table.php deleted file mode 100644 index 249da8171a..0000000000 --- a/database/migrations/2023_05_17_104039_create_failed_jobs_table.php +++ /dev/null @@ -1,32 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->text('connection'); - $table->text('queue'); - $table->longText('payload'); - $table->longText('exception'); - $table->timestamp('failed_at')->useCurrent(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('failed_jobs'); - } -}; diff --git a/database/migrations/2023_05_24_083426_create_application_deployment_queues_table.php b/database/migrations/2023_05_24_083426_create_application_deployment_queues_table.php deleted file mode 100644 index 9573b9735e..0000000000 --- a/database/migrations/2023_05_24_083426_create_application_deployment_queues_table.php +++ /dev/null @@ -1,34 +0,0 @@ -id(); - $table->string('application_id'); - $table->string('deployment_uuid')->unique(); - $table->integer('pull_request_id')->default(0); - $table->boolean('force_rebuild')->default(false); - $table->string('commit')->default('HEAD'); - $table->string('status')->default('queued'); - $table->boolean('is_webhook')->default(false); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('application_deployment_queues'); - } -}; diff --git a/database/migrations/2023_06_22_131459_move_wildcard_to_server.php b/database/migrations/2023_06_22_131459_move_wildcard_to_server.php deleted file mode 100644 index cd258fbea1..0000000000 --- a/database/migrations/2023_06_22_131459_move_wildcard_to_server.php +++ /dev/null @@ -1,34 +0,0 @@ -dropColumn('wildcard_domain'); - }); - Schema::table('server_settings', function (Blueprint $table) { - $table->string('wildcard_domain')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('project_settings', function (Blueprint $table) { - $table->string('wildcard_domain')->nullable(); - }); - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('wildcard_domain'); - }); - } -}; diff --git a/database/migrations/2023_06_23_084605_remove_wildcard_domain_from_instancesettings.php b/database/migrations/2023_06_23_084605_remove_wildcard_domain_from_instancesettings.php deleted file mode 100644 index a4260ce1d2..0000000000 --- a/database/migrations/2023_06_23_084605_remove_wildcard_domain_from_instancesettings.php +++ /dev/null @@ -1,28 +0,0 @@ -dropColumn('wildcard_domain'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('instance_settings', function (Blueprint $table) { - $table->string('wildcard_domain')->nullable(); - }); - } -}; diff --git a/database/migrations/2023_06_23_110548_next_channel_updates.php b/database/migrations/2023_06_23_110548_next_channel_updates.php deleted file mode 100644 index 83c4dacf3d..0000000000 --- a/database/migrations/2023_06_23_110548_next_channel_updates.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('next_channel')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('instance_settings', function (Blueprint $table) { - $table->dropColumn('next_channel'); - }); - } -}; diff --git a/database/migrations/2023_06_23_114131_change_env_var_value_length.php b/database/migrations/2023_06_23_114131_change_env_var_value_length.php deleted file mode 100644 index ca8bd1e0ce..0000000000 --- a/database/migrations/2023_06_23_114131_change_env_var_value_length.php +++ /dev/null @@ -1,28 +0,0 @@ -text('value')->nullable()->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('environment_variables', function (Blueprint $table) { - $table->string('value')->nullable()->change(); - }); - } -}; diff --git a/database/migrations/2023_06_23_114132_remove_default_redirect_from_instance_settings.php b/database/migrations/2023_06_23_114132_remove_default_redirect_from_instance_settings.php deleted file mode 100644 index 9c14b7c398..0000000000 --- a/database/migrations/2023_06_23_114132_remove_default_redirect_from_instance_settings.php +++ /dev/null @@ -1,28 +0,0 @@ -dropColumn('default_redirect_404'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('instance_settings', function (Blueprint $table) { - $table->string('default_redirect_404')->nullable(); - }); - } -}; diff --git a/database/migrations/2023_06_23_114133_use_application_deployment_queues_as_activity.php b/database/migrations/2023_06_23_114133_use_application_deployment_queues_as_activity.php deleted file mode 100644 index 36623ee7bc..0000000000 --- a/database/migrations/2023_06_23_114133_use_application_deployment_queues_as_activity.php +++ /dev/null @@ -1,30 +0,0 @@ -text('logs')->default(null)->nullable(); - $table->string('current_process_id')->default(null)->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_deployment_queues', function (Blueprint $table) { - $table->dropColumn('logs'); - $table->dropColumn('current_process_id'); - }); - } -}; diff --git a/database/migrations/2023_06_23_114134_add_disk_usage_percentage_to_servers.php b/database/migrations/2023_06_23_114134_add_disk_usage_percentage_to_servers.php deleted file mode 100644 index 79846bb0a3..0000000000 --- a/database/migrations/2023_06_23_114134_add_disk_usage_percentage_to_servers.php +++ /dev/null @@ -1,28 +0,0 @@ -integer('cleanup_after_percentage')->default(80); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('cleanup_after_percentage'); - }); - } -}; diff --git a/database/migrations/2023_07_13_115117_create_subscriptions_table.php b/database/migrations/2023_07_13_115117_create_subscriptions_table.php deleted file mode 100644 index e24e56555e..0000000000 --- a/database/migrations/2023_07_13_115117_create_subscriptions_table.php +++ /dev/null @@ -1,39 +0,0 @@ -id(); - $table->string('lemon_subscription_id'); - $table->string('lemon_order_id'); - $table->string('lemon_product_id'); - $table->string('lemon_variant_id'); - $table->string('lemon_variant_name'); - $table->string('lemon_customer_id'); - $table->string('lemon_status'); - $table->string('lemon_trial_ends_at')->nullable(); - $table->string('lemon_renews_at'); - $table->string('lemon_ends_at')->nullable(); - $table->string('lemon_update_payment_menthod_url'); - $table->foreignId('team_id'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('subscriptions'); - } -}; diff --git a/database/migrations/2023_07_13_120719_create_webhooks_table.php b/database/migrations/2023_07_13_120719_create_webhooks_table.php deleted file mode 100644 index 9376a10c92..0000000000 --- a/database/migrations/2023_07_13_120719_create_webhooks_table.php +++ /dev/null @@ -1,31 +0,0 @@ -id(); - $table->enum('status', ['pending', 'success', 'failed'])->default('pending'); - $table->enum('type', ['github', 'gitlab', 'bitbucket', 'lemonsqueezy']); - $table->longText('payload'); - $table->longText('failure_reason')->nullable(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('webhooks'); - } -}; diff --git a/database/migrations/2023_07_13_120721_add_license_to_instance_settings.php b/database/migrations/2023_07_13_120721_add_license_to_instance_settings.php deleted file mode 100644 index c32cd0f9a5..0000000000 --- a/database/migrations/2023_07_13_120721_add_license_to_instance_settings.php +++ /dev/null @@ -1,30 +0,0 @@ -boolean('is_resale_license_active')->default(false); - $table->longText('resale_license')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('instance_settings', function (Blueprint $table) { - $table->dropColumn('is_resale_license_active'); - $table->dropColumn('resale_license'); - }); - } -}; diff --git a/database/migrations/2023_07_27_182013_smtp_discord_schemaless_to_normal.php b/database/migrations/2023_07_27_182013_smtp_discord_schemaless_to_normal.php deleted file mode 100644 index 3e3a90b6d8..0000000000 --- a/database/migrations/2023_07_27_182013_smtp_discord_schemaless_to_normal.php +++ /dev/null @@ -1,193 +0,0 @@ -boolean('smtp_enabled')->default(false); - $table->string('smtp_from_address')->nullable(); - $table->string('smtp_from_name')->nullable(); - $table->string('smtp_recipients')->nullable(); - $table->string('smtp_host')->nullable(); - $table->integer('smtp_port')->nullable(); - $table->string('smtp_encryption')->nullable(); - $table->text('smtp_username')->nullable(); - $table->text('smtp_password')->nullable(); - $table->integer('smtp_timeout')->nullable(); - $table->boolean('smtp_notifications_test')->default(true); - $table->boolean('smtp_notifications_deployments')->default(false); - $table->boolean('smtp_notifications_status_changes')->default(false); - - $table->boolean('discord_enabled')->default(false); - $table->string('discord_webhook_url')->nullable(); - $table->boolean('discord_notifications_test')->default(true); - $table->boolean('discord_notifications_deployments')->default(true); - $table->boolean('discord_notifications_status_changes')->default(true); - }); - $teams = Team::all(); - foreach ($teams as $team) { - $team->smtp_enabled = data_get($team, 'smtp.enabled', false); - $team->smtp_from_address = data_get($team, 'smtp.from_address'); - $team->smtp_from_name = data_get($team, 'smtp.from_name'); - $team->smtp_recipients = data_get($team, 'smtp.recipients'); - $team->smtp_host = data_get($team, 'smtp.host'); - $team->smtp_port = data_get($team, 'smtp.port'); - $team->smtp_encryption = data_get($team, 'smtp.encryption'); - $team->smtp_username = data_get($team, 'smtp.username'); - $team->smtp_password = data_get($team, 'smtp.password'); - $team->smtp_timeout = data_get($team, 'smtp.timeout'); - $team->smtp_notifications_test = data_get($team, 'smtp_notifications.test', true); - $team->smtp_notifications_deployments = data_get($team, 'smtp_notifications.deployments', false); - $team->smtp_notifications_status_changes = data_get($team, 'smtp_notifications.status_changes', false); - - $team->discord_enabled = data_get($team, 'discord.enabled', false); - $team->discord_webhook_url = data_get($team, 'discord.webhook_url'); - $team->discord_notifications_test = data_get($team, 'discord_notifications.test', true); - $team->discord_notifications_deployments = data_get($team, 'discord_notifications.deployments', true); - $team->discord_notifications_status_changes = data_get($team, 'discord_notifications.status_changes', true); - - $team->save(); - } - Schema::table('teams', function (Blueprint $table) { - $table->dropColumn('smtp'); - $table->dropColumn('smtp_notifications'); - $table->dropColumn('discord'); - $table->dropColumn('discord_notifications'); - }); - - Schema::table('instance_settings', function (Blueprint $table) { - $table->boolean('smtp_enabled')->default(false); - $table->string('smtp_from_address')->nullable(); - $table->string('smtp_from_name')->nullable(); - $table->text('smtp_recipients')->nullable(); - $table->string('smtp_host')->nullable(); - $table->integer('smtp_port')->nullable(); - $table->string('smtp_encryption')->nullable(); - $table->text('smtp_username')->nullable(); - $table->text('smtp_password')->nullable(); - $table->integer('smtp_timeout')->nullable(); - }); - $instance_settings = InstanceSettings::all(); - foreach ($instance_settings as $instance_setting) { - $instance_setting->smtp_enabled = data_get($instance_setting, 'smtp.enabled', false); - $instance_setting->smtp_from_address = data_get($instance_setting, 'smtp.from_address'); - $instance_setting->smtp_from_name = data_get($instance_setting, 'smtp.from_name'); - $instance_setting->smtp_recipients = data_get($instance_setting, 'smtp.recipients'); - $instance_setting->smtp_host = data_get($instance_setting, 'smtp.host'); - $instance_setting->smtp_port = data_get($instance_setting, 'smtp.port'); - $instance_setting->smtp_encryption = data_get($instance_setting, 'smtp.encryption'); - $instance_setting->smtp_username = data_get($instance_setting, 'smtp.username'); - $instance_setting->smtp_password = data_get($instance_setting, 'smtp.password'); - $instance_setting->smtp_timeout = data_get($instance_setting, 'smtp.timeout'); - $instance_setting->save(); - } - Schema::table('instance_settings', function (Blueprint $table) { - $table->dropColumn('smtp'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('teams', function (Blueprint $table) { - $table->schemalessAttributes('smtp'); - $table->schemalessAttributes('smtp_notifications'); - $table->schemalessAttributes('discord'); - $table->schemalessAttributes('discord_notifications'); - }); - $teams = Team::all(); - foreach ($teams as $team) { - $team->smtp = [ - 'enabled' => $team->smtp_enabled, - 'from_address' => $team->smtp_from_address, - 'from_name' => $team->smtp_from_name, - 'recipients' => $team->smtp_recipients, - 'host' => $team->smtp_host, - 'port' => $team->smtp_port, - 'encryption' => $team->smtp_encryption, - 'username' => $team->smtp_username, - 'password' => $team->smtp_password, - 'timeout' => $team->smtp_timeout, - ]; - $team->smtp_notifications = [ - 'test' => $team->smtp_notifications_test, - 'deployments' => $team->smtp_notifications_deployments, - 'status_changes' => $team->smtp_notifications_status_changes, - ]; - $team->discord = [ - 'enabled' => $team->discord_enabled, - 'webhook_url' => $team->discord_webhook_url, - ]; - $team->discord_notifications = [ - 'test' => $team->discord_notifications_test, - 'deployments' => $team->discord_notifications_deployments, - 'status_changes' => $team->discord_notifications_status_changes, - ]; - $team->save(); - } - Schema::table('teams', function (Blueprint $table) { - $table->dropColumn('smtp_enabled'); - $table->dropColumn('smtp_from_address'); - $table->dropColumn('smtp_from_name'); - $table->dropColumn('smtp_recipients'); - $table->dropColumn('smtp_host'); - $table->dropColumn('smtp_port'); - $table->dropColumn('smtp_encryption'); - $table->dropColumn('smtp_username'); - $table->dropColumn('smtp_password'); - $table->dropColumn('smtp_timeout'); - $table->dropColumn('smtp_notifications_test'); - $table->dropColumn('smtp_notifications_deployments'); - $table->dropColumn('smtp_notifications_status_changes'); - - $table->dropColumn('discord_enabled'); - $table->dropColumn('discord_webhook_url'); - $table->dropColumn('discord_notifications_test'); - $table->dropColumn('discord_notifications_deployments'); - $table->dropColumn('discord_notifications_status_changes'); - }); - - Schema::table('instance_settings', function (Blueprint $table) { - $table->schemalessAttributes('smtp'); - }); - - $instance_setting = instanceSettings(); - $instance_setting->smtp = [ - 'enabled' => $instance_setting->smtp_enabled, - 'from_address' => $instance_setting->smtp_from_address, - 'from_name' => $instance_setting->smtp_from_name, - 'recipients' => $instance_setting->smtp_recipients, - 'host' => $instance_setting->smtp_host, - 'port' => $instance_setting->smtp_port, - 'encryption' => $instance_setting->smtp_encryption, - 'username' => $instance_setting->smtp_username, - 'password' => $instance_setting->smtp_password, - 'timeout' => $instance_setting->smtp_timeout, - ]; - $instance_setting->save(); - Schema::table('instance_settings', function (Blueprint $table) { - $table->dropColumn('smtp_enabled'); - $table->dropColumn('smtp_from_address'); - $table->dropColumn('smtp_from_name'); - $table->dropColumn('smtp_recipients'); - $table->dropColumn('smtp_host'); - $table->dropColumn('smtp_port'); - $table->dropColumn('smtp_encryption'); - $table->dropColumn('smtp_username'); - $table->dropColumn('smtp_password'); - $table->dropColumn('smtp_timeout'); - }); - } -}; diff --git a/database/migrations/2023_08_06_142951_add_description_field_to_applications_table.php b/database/migrations/2023_08_06_142951_add_description_field_to_applications_table.php deleted file mode 100644 index 5be2f2959c..0000000000 --- a/database/migrations/2023_08_06_142951_add_description_field_to_applications_table.php +++ /dev/null @@ -1,28 +0,0 @@ -string('description')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('description'); - }); - } -}; diff --git a/database/migrations/2023_08_06_142952_remove_foreignId_environment_variables.php b/database/migrations/2023_08_06_142952_remove_foreignId_environment_variables.php deleted file mode 100644 index d24dbb4464..0000000000 --- a/database/migrations/2023_08_06_142952_remove_foreignId_environment_variables.php +++ /dev/null @@ -1,32 +0,0 @@ -dropColumn('service_id'); - $table->dropColumn('database_id'); - $table->foreignId('standalone_postgresql_id')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('environment_variables', function (Blueprint $table) { - $table->foreignId('service_id')->nullable(); - $table->foreignId('database_id')->nullable(); - $table->dropColumn('standalone_postgresql_id'); - }); - } -}; diff --git a/database/migrations/2023_08_06_142954_add_readonly_localpersistentvolumes.php b/database/migrations/2023_08_06_142954_add_readonly_localpersistentvolumes.php deleted file mode 100644 index f0bce760d7..0000000000 --- a/database/migrations/2023_08_06_142954_add_readonly_localpersistentvolumes.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_readonly')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('local_persistent_volumes', function (Blueprint $table) { - $table->dropColumn('is_readonly'); - }); - } -}; diff --git a/database/migrations/2023_08_07_073651_create_s3_storages_table.php b/database/migrations/2023_08_07_073651_create_s3_storages_table.php deleted file mode 100644 index 0eded30242..0000000000 --- a/database/migrations/2023_08_07_073651_create_s3_storages_table.php +++ /dev/null @@ -1,37 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name'); - $table->longText('description')->nullable(); - $table->string('region')->default('us-east-1'); - $table->longText('key'); - $table->longText('secret'); - $table->longText('bucket'); - $table->longText('endpoint')->nullable(); - - $table->foreignId('team_id'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('s3_storages'); - } -}; diff --git a/database/migrations/2023_08_07_142950_create_standalone_postgresqls_table.php b/database/migrations/2023_08_07_142950_create_standalone_postgresqls_table.php deleted file mode 100644 index fc33acaef2..0000000000 --- a/database/migrations/2023_08_07_142950_create_standalone_postgresqls_table.php +++ /dev/null @@ -1,58 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name'); - $table->string('description')->nullable(); - - $table->string('postgres_user')->default('postgres'); - $table->text('postgres_password'); - $table->string('postgres_db')->default('postgres'); - $table->string('postgres_initdb_args')->nullable(); - $table->string('postgres_host_auth_method')->nullable(); - $table->json('init_scripts')->nullable(); - - $table->string('status')->default('exited'); - - $table->string('image')->default('postgres:15-alpine'); - $table->boolean('is_public')->default(false); - $table->integer('public_port')->nullable(); - $table->text('ports_mappings')->nullable(); - - $table->string('limits_memory')->default('0'); - $table->string('limits_memory_swap')->default('0'); - $table->integer('limits_memory_swappiness')->default(60); - $table->string('limits_memory_reservation')->default('0'); - - $table->string('limits_cpus')->default('0'); - $table->string('limits_cpuset')->nullable()->default('0'); - $table->integer('limits_cpu_shares')->default(1024); - - $table->timestamp('started_at')->nullable(); - $table->morphs('destination'); - - $table->foreignId('environment_id')->nullable(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('standalone_postgresqls'); - } -}; diff --git a/database/migrations/2023_08_08_150103_create_scheduled_database_backups_table.php b/database/migrations/2023_08_08_150103_create_scheduled_database_backups_table.php deleted file mode 100644 index cc6726f362..0000000000 --- a/database/migrations/2023_08_08_150103_create_scheduled_database_backups_table.php +++ /dev/null @@ -1,30 +0,0 @@ -id(); - $table->text('description')->nullable(); - $table->string('uuid')->unique(); - $table->boolean('enabled')->default(true); - $table->boolean('save_s3')->default(true); - $table->string('frequency'); - $table->integer('number_of_backups_locally')->default(7); - $table->morphs('database'); - $table->foreignId('s3_storage_id')->nullable(); - $table->foreignId('team_id'); - $table->timestamps(); - }); - } - - public function down(): void - { - Schema::dropIfExists('scheduled_database_backups'); - } -}; diff --git a/database/migrations/2023_08_10_113306_create_scheduled_database_backup_executions_table.php b/database/migrations/2023_08_10_113306_create_scheduled_database_backup_executions_table.php deleted file mode 100644 index a7ecc37963..0000000000 --- a/database/migrations/2023_08_10_113306_create_scheduled_database_backup_executions_table.php +++ /dev/null @@ -1,27 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->enum('status', ['success', 'failed', 'running'])->default('running'); - $table->longText('message')->nullable(); - $table->text('size')->nullable(); - $table->text('filename')->nullable(); - $table->foreignId('scheduled_database_backup_id'); - $table->timestamps(); - }); - } - - public function down(): void - { - Schema::dropIfExists('scheduled_database_backup_executions'); - } -}; diff --git a/database/migrations/2023_08_10_201311_add_backup_notifications_to_teams.php b/database/migrations/2023_08_10_201311_add_backup_notifications_to_teams.php deleted file mode 100644 index 128aa5b250..0000000000 --- a/database/migrations/2023_08_10_201311_add_backup_notifications_to_teams.php +++ /dev/null @@ -1,24 +0,0 @@ -boolean('smtp_notifications_database_backups')->default(true)->after('smtp_notifications_status_changes'); - $table->boolean('discord_notifications_database_backups')->default(true)->after('discord_notifications_status_changes'); - }); - } - - public function down(): void - { - Schema::table('teams', function (Blueprint $table) { - $table->dropColumn('smtp_notifications_database_backups'); - $table->dropColumn('discord_notifications_database_backups'); - }); - } -}; diff --git a/database/migrations/2023_08_11_190528_add_dockerfile_to_applications_table.php b/database/migrations/2023_08_11_190528_add_dockerfile_to_applications_table.php deleted file mode 100644 index f2ee106408..0000000000 --- a/database/migrations/2023_08_11_190528_add_dockerfile_to_applications_table.php +++ /dev/null @@ -1,25 +0,0 @@ -longText('dockerfile')->nullable(); - }); - } - - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('dockerfile'); - }); - } -}; diff --git a/database/migrations/2023_08_15_095902_create_waitlists_table.php b/database/migrations/2023_08_15_095902_create_waitlists_table.php deleted file mode 100644 index 641d152d19..0000000000 --- a/database/migrations/2023_08_15_095902_create_waitlists_table.php +++ /dev/null @@ -1,31 +0,0 @@ -id(); - $table->string('uuid'); - $table->string('type'); - $table->string('email')->unique(); - $table->boolean('verified')->default(false); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('waitlists'); - } -}; diff --git a/database/migrations/2023_08_15_111125_update_users_table.php b/database/migrations/2023_08_15_111125_update_users_table.php deleted file mode 100644 index 4453d39d49..0000000000 --- a/database/migrations/2023_08_15_111125_update_users_table.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('force_password_reset')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('users', function (Blueprint $table) { - $table->dropColumn('force_password_reset'); - }); - } -}; diff --git a/database/migrations/2023_08_15_111126_update_servers_add_unreachable_count_table.php b/database/migrations/2023_08_15_111126_update_servers_add_unreachable_count_table.php deleted file mode 100644 index b6a0d710ad..0000000000 --- a/database/migrations/2023_08_15_111126_update_servers_add_unreachable_count_table.php +++ /dev/null @@ -1,28 +0,0 @@ -integer('unreachable_count')->default(0); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('servers', function (Blueprint $table) { - $table->dropColumn('unreachable_count'); - }); - } -}; diff --git a/database/migrations/2023_08_22_071048_add_boarding_to_teams.php b/database/migrations/2023_08_22_071048_add_boarding_to_teams.php deleted file mode 100644 index 0fe2062e38..0000000000 --- a/database/migrations/2023_08_22_071048_add_boarding_to_teams.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('show_boarding')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('teams', function (Blueprint $table) { - $table->dropColumn('show_boarding'); - }); - } -}; diff --git a/database/migrations/2023_08_22_071049_update_webhooks_type.php b/database/migrations/2023_08_22_071049_update_webhooks_type.php deleted file mode 100644 index 13f0276f9a..0000000000 --- a/database/migrations/2023_08_22_071049_update_webhooks_type.php +++ /dev/null @@ -1,29 +0,0 @@ -string('type')->change(); - }); - DB::statement('ALTER TABLE webhooks DROP CONSTRAINT webhooks_type_check'); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('webhooks', function (Blueprint $table) { - $table->string('type')->change(); - }); - } -}; diff --git a/database/migrations/2023_08_22_071050_update_subscriptions_stripe.php b/database/migrations/2023_08_22_071050_update_subscriptions_stripe.php deleted file mode 100644 index 70462fe208..0000000000 --- a/database/migrations/2023_08_22_071050_update_subscriptions_stripe.php +++ /dev/null @@ -1,52 +0,0 @@ -boolean('stripe_invoice_paid')->default(false); - $table->string('stripe_subscription_id')->nullable(); - $table->string('stripe_customer_id')->nullable(); - $table->boolean('stripe_cancel_at_period_end')->default(false); - $table->string('lemon_subscription_id')->nullable()->change(); - $table->string('lemon_order_id')->nullable()->change(); - $table->string('lemon_product_id')->nullable()->change(); - $table->string('lemon_variant_id')->nullable()->change(); - $table->string('lemon_variant_name')->nullable()->change(); - $table->string('lemon_customer_id')->nullable()->change(); - $table->string('lemon_status')->nullable()->change(); - $table->string('lemon_renews_at')->nullable()->change(); - $table->string('lemon_update_payment_menthod_url')->nullable()->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('subscriptions', function (Blueprint $table) { - $table->dropColumn('stripe_invoice_paid'); - $table->dropColumn('stripe_subscription_id'); - $table->dropColumn('stripe_customer_id'); - $table->dropColumn('stripe_cancel_at_period_end'); - $table->string('lemon_subscription_id')->change(); - $table->string('lemon_order_id')->change(); - $table->string('lemon_product_id')->change(); - $table->string('lemon_variant_id')->change(); - $table->string('lemon_variant_name')->change(); - $table->string('lemon_customer_id')->change(); - $table->string('lemon_status')->change(); - $table->string('lemon_renews_at')->change(); - $table->string('lemon_update_payment_menthod_url')->change(); - }); - } -}; diff --git a/database/migrations/2023_08_22_071051_add_stripe_plan_to_subscriptions.php b/database/migrations/2023_08_22_071051_add_stripe_plan_to_subscriptions.php deleted file mode 100644 index a04eaf9836..0000000000 --- a/database/migrations/2023_08_22_071051_add_stripe_plan_to_subscriptions.php +++ /dev/null @@ -1,28 +0,0 @@ -string('stripe_plan_id')->nullable()->after('stripe_cancel_at_period_end'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('subscriptions', function (Blueprint $table) { - $table->dropColumn('stripe_plan_id'); - }); - } -}; diff --git a/database/migrations/2023_08_22_071052_add_resend_as_email.php b/database/migrations/2023_08_22_071052_add_resend_as_email.php deleted file mode 100644 index fd7368bfe0..0000000000 --- a/database/migrations/2023_08_22_071052_add_resend_as_email.php +++ /dev/null @@ -1,30 +0,0 @@ -boolean('resend_enabled')->default(false); - $table->text('resend_api_key')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('instance_settings', function (Blueprint $table) { - $table->dropColumn('resend_enabled'); - $table->dropColumn('resend_api_key'); - }); - } -}; diff --git a/database/migrations/2023_08_22_071053_add_resend_as_email_to_teams.php b/database/migrations/2023_08_22_071053_add_resend_as_email_to_teams.php deleted file mode 100644 index 72be88b2cb..0000000000 --- a/database/migrations/2023_08_22_071053_add_resend_as_email_to_teams.php +++ /dev/null @@ -1,32 +0,0 @@ -boolean('resend_enabled')->default(false); - $table->text('resend_api_key')->nullable(); - $table->boolean('use_instance_email_settings')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('teams', function (Blueprint $table) { - $table->dropColumn('resend_enabled'); - $table->dropColumn('resend_api_key'); - $table->dropColumn('use_instance_email_settings'); - }); - } -}; diff --git a/database/migrations/2023_08_22_071054_add_stripe_reasons.php b/database/migrations/2023_08_22_071054_add_stripe_reasons.php deleted file mode 100644 index 6ffe37e982..0000000000 --- a/database/migrations/2023_08_22_071054_add_stripe_reasons.php +++ /dev/null @@ -1,30 +0,0 @@ -string('stripe_feedback')->nullable()->after('stripe_cancel_at_period_end'); - $table->string('stripe_comment')->nullable()->after('stripe_feedback'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('subscriptions', function (Blueprint $table) { - $table->dropColumn('stripe_feedback'); - $table->dropColumn('stripe_comment'); - }); - } -}; diff --git a/database/migrations/2023_08_22_071055_add_discord_notifications_to_teams.php b/database/migrations/2023_08_22_071055_add_discord_notifications_to_teams.php deleted file mode 100644 index 0439cae540..0000000000 --- a/database/migrations/2023_08_22_071055_add_discord_notifications_to_teams.php +++ /dev/null @@ -1,34 +0,0 @@ -boolean('telegram_enabled')->default(false); - $table->text('telegram_token')->nullable(); - $table->text('telegram_chat_id')->nullable(); - $table->boolean('telegram_notifications_test')->default(true); - $table->boolean('telegram_notifications_deployments')->default(true); - $table->boolean('telegram_notifications_status_changes')->default(true); - $table->boolean('telegram_notifications_database_backups')->default(true); - }); - } - - public function down(): void - { - Schema::table('teams', function (Blueprint $table) { - $table->dropColumn('telegram_enabled'); - $table->dropColumn('telegram_token'); - $table->dropColumn('telegram_chat_id'); - $table->dropColumn('telegram_notifications_test'); - $table->dropColumn('telegram_notifications_deployments'); - $table->dropColumn('telegram_notifications_status_changes'); - $table->dropColumn('telegram_notifications_database_backups'); - }); - } -}; diff --git a/database/migrations/2023_08_22_071056_update_telegram_notifications.php b/database/migrations/2023_08_22_071056_update_telegram_notifications.php deleted file mode 100644 index 6e1da18e3d..0000000000 --- a/database/migrations/2023_08_22_071056_update_telegram_notifications.php +++ /dev/null @@ -1,29 +0,0 @@ -text('telegram_notifications_test_message_thread_id')->nullable(); - $table->text('telegram_notifications_deployments_message_thread_id')->nullable(); - $table->text('telegram_notifications_status_changes_message_thread_id')->nullable(); - $table->text('telegram_notifications_database_backups_message_thread_id')->nullable(); - }); - } - - public function down(): void - { - Schema::table('teams', function (Blueprint $table) { - $table->dropColumn('telegram_message_thread_id'); - $table->dropColumn('telegram_notifications_test_message_thread_id'); - $table->dropColumn('telegram_notifications_deployments_message_thread_id'); - $table->dropColumn('telegram_notifications_status_changes_message_thread_id'); - $table->dropColumn('telegram_notifications_database_backups_message_thread_id'); - }); - } -}; diff --git a/database/migrations/2023_08_22_071057_add_nixpkgsarchive_to_applications.php b/database/migrations/2023_08_22_071057_add_nixpkgsarchive_to_applications.php deleted file mode 100644 index 4c3b283db2..0000000000 --- a/database/migrations/2023_08_22_071057_add_nixpkgsarchive_to_applications.php +++ /dev/null @@ -1,22 +0,0 @@ -string('nixpkgsarchive')->nullable(); - }); - } - - public function down(): void - { - Schema::table('teams', function (Blueprint $table) { - $table->dropColumn('nixpkgsarchive'); - }); - } -}; diff --git a/database/migrations/2023_08_22_071058_add_nixpkgsarchive_to_applications_remove.php b/database/migrations/2023_08_22_071058_add_nixpkgsarchive_to_applications_remove.php deleted file mode 100644 index 69845d4d02..0000000000 --- a/database/migrations/2023_08_22_071058_add_nixpkgsarchive_to_applications_remove.php +++ /dev/null @@ -1,22 +0,0 @@ -dropColumn('nixpkgsarchive'); - }); - } - - public function down(): void - { - Schema::table('teams', function (Blueprint $table) { - $table->string('nixpkgsarchive')->nullable(); - }); - } -}; diff --git a/database/migrations/2023_08_22_071059_add_stripe_trial_ended.php b/database/migrations/2023_08_22_071059_add_stripe_trial_ended.php deleted file mode 100644 index 61fcbda6b3..0000000000 --- a/database/migrations/2023_08_22_071059_add_stripe_trial_ended.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('stripe_trial_already_ended')->default(false)->after('stripe_cancel_at_period_end'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('subscriptions', function (Blueprint $table) { - $table->dropColumn('stripe_trial_already_ended'); - }); - } -}; diff --git a/database/migrations/2023_08_22_071060_change_invitation_link_length.php b/database/migrations/2023_08_22_071060_change_invitation_link_length.php deleted file mode 100644 index 9d14c3f265..0000000000 --- a/database/migrations/2023_08_22_071060_change_invitation_link_length.php +++ /dev/null @@ -1,28 +0,0 @@ -text('link')->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('team_invitations', function (Blueprint $table) { - $table->string('link')->change(); - }); - } -}; diff --git a/database/migrations/2023_09_20_082541_update_services_table.php b/database/migrations/2023_09_20_082541_update_services_table.php deleted file mode 100644 index c70cd28f7c..0000000000 --- a/database/migrations/2023_09_20_082541_update_services_table.php +++ /dev/null @@ -1,34 +0,0 @@ -foreignId('server_id')->nullable(); - $table->longText('description')->nullable(); - $table->longText('docker_compose_raw'); - $table->longText('docker_compose')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('services', function (Blueprint $table) { - $table->dropColumn('server_id'); - $table->dropColumn('description'); - $table->dropColumn('docker_compose_raw'); - $table->dropColumn('docker_compose'); - }); - } -}; diff --git a/database/migrations/2023_09_20_082733_create_service_databases_table.php b/database/migrations/2023_09_20_082733_create_service_databases_table.php deleted file mode 100644 index c76a7bb8f0..0000000000 --- a/database/migrations/2023_09_20_082733_create_service_databases_table.php +++ /dev/null @@ -1,38 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name'); - $table->string('human_name')->nullable(); - $table->longText('description')->nullable(); - - $table->longText('ports')->nullable(); - $table->longText('exposes')->nullable(); - - $table->string('status')->default('exited'); - - $table->foreignId('service_id'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('service_databases'); - } -}; diff --git a/database/migrations/2023_09_20_082737_create_service_applications_table.php b/database/migrations/2023_09_20_082737_create_service_applications_table.php deleted file mode 100644 index 50a0d55b1e..0000000000 --- a/database/migrations/2023_09_20_082737_create_service_applications_table.php +++ /dev/null @@ -1,39 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name'); - $table->string('human_name')->nullable(); - $table->longText('description')->nullable(); - - $table->string('fqdn')->unique()->nullable(); - $table->longText('ports')->nullable(); - $table->longText('exposes')->nullable(); - - $table->string('status')->default('exited'); - - $table->foreignId('service_id'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('service_applications'); - } -}; diff --git a/database/migrations/2023_09_20_083549_update_environment_variables_table.php b/database/migrations/2023_09_20_083549_update_environment_variables_table.php deleted file mode 100644 index a96d096bbf..0000000000 --- a/database/migrations/2023_09_20_083549_update_environment_variables_table.php +++ /dev/null @@ -1,28 +0,0 @@ -foreignId('service_id')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('environment_variables', function (Blueprint $table) { - $table->dropColumn('service_id'); - }); - } -}; diff --git a/database/migrations/2023_09_22_185356_create_local_file_volumes_table.php b/database/migrations/2023_09_22_185356_create_local_file_volumes_table.php deleted file mode 100644 index 9dc6e13bb0..0000000000 --- a/database/migrations/2023_09_22_185356_create_local_file_volumes_table.php +++ /dev/null @@ -1,34 +0,0 @@ -id(); - $table->string('uuid'); - $table->mediumText('fs_path'); - $table->string('mount_path'); - $table->mediumText('content')->nullable(); - $table->nullableMorphs('resource'); - - $table->unique(['mount_path', 'resource_id', 'resource_type']); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('local_file_volumes'); - } -}; diff --git a/database/migrations/2023_09_23_111808_update_servers_with_cloudflared.php b/database/migrations/2023_09_23_111808_update_servers_with_cloudflared.php deleted file mode 100644 index c2609d4142..0000000000 --- a/database/migrations/2023_09_23_111808_update_servers_with_cloudflared.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_cloudflare_tunnel')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('is_cloudflare_tunnel'); - }); - } -}; diff --git a/database/migrations/2023_09_23_111809_remove_destination_from_services_table.php b/database/migrations/2023_09_23_111809_remove_destination_from_services_table.php deleted file mode 100644 index 729146a4ad..0000000000 --- a/database/migrations/2023_09_23_111809_remove_destination_from_services_table.php +++ /dev/null @@ -1,29 +0,0 @@ -dropColumn('destination_type'); - $table->dropColumn('destination_id'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('services', function (Blueprint $table) { - $table->morphs('destination'); - }); - } -}; diff --git a/database/migrations/2023_09_23_111811_update_service_applications_table.php b/database/migrations/2023_09_23_111811_update_service_applications_table.php deleted file mode 100644 index 7e3e5984b9..0000000000 --- a/database/migrations/2023_09_23_111811_update_service_applications_table.php +++ /dev/null @@ -1,32 +0,0 @@ -boolean('exclude_from_status')->default(false); - $table->boolean('required_fqdn')->default(false); - $table->string('image')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('service_applications', function (Blueprint $table) { - $table->dropColumn('exclude_from_status'); - $table->dropColumn('required_fqdn'); - $table->dropColumn('image'); - }); - } -}; diff --git a/database/migrations/2023_09_23_111812_update_service_databases_table.php b/database/migrations/2023_09_23_111812_update_service_databases_table.php deleted file mode 100644 index 2f02b5afe7..0000000000 --- a/database/migrations/2023_09_23_111812_update_service_databases_table.php +++ /dev/null @@ -1,30 +0,0 @@ -boolean('exclude_from_status')->default(false); - $table->string('image')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('service_databases', function (Blueprint $table) { - $table->dropColumn('exclude_from_status'); - $table->dropColumn('image'); - }); - } -}; diff --git a/database/migrations/2023_09_23_111813_update_users_databases_table.php b/database/migrations/2023_09_23_111813_update_users_databases_table.php deleted file mode 100644 index d79b9471c1..0000000000 --- a/database/migrations/2023_09_23_111813_update_users_databases_table.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('marketing_emails')->default(true); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('users', function (Blueprint $table) { - $table->dropColumn('marketing_emails'); - }); - } -}; diff --git a/database/migrations/2023_09_23_111814_update_local_file_volumes_table.php b/database/migrations/2023_09_23_111814_update_local_file_volumes_table.php deleted file mode 100644 index c1ccd80247..0000000000 --- a/database/migrations/2023_09_23_111814_update_local_file_volumes_table.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_directory')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('local_file_volumes', function (Blueprint $table) { - $table->dropColumn('is_directory'); - }); - } -}; diff --git a/database/migrations/2023_09_23_111815_add_healthcheck_disable_to_apps_table.php b/database/migrations/2023_09_23_111815_add_healthcheck_disable_to_apps_table.php deleted file mode 100644 index 4b8eeea08d..0000000000 --- a/database/migrations/2023_09_23_111815_add_healthcheck_disable_to_apps_table.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('health_check_enabled')->default(true); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('health_check_enabled'); - }); - } -}; diff --git a/database/migrations/2023_09_23_111816_add_destination_to_services_table.php b/database/migrations/2023_09_23_111816_add_destination_to_services_table.php deleted file mode 100644 index 2ec71bfdbe..0000000000 --- a/database/migrations/2023_09_23_111816_add_destination_to_services_table.php +++ /dev/null @@ -1,28 +0,0 @@ -nullableMorphs('destination'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('services', function (Blueprint $table) { - $table->dropMorphs('destination'); - }); - } -}; diff --git a/database/migrations/2023_09_23_111817_use_instance_email_settings_by_default.php b/database/migrations/2023_09_23_111817_use_instance_email_settings_by_default.php deleted file mode 100644 index 86a77c22dc..0000000000 --- a/database/migrations/2023_09_23_111817_use_instance_email_settings_by_default.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('use_instance_email_settings')->default(true)->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('teams', function (Blueprint $table) { - $table->boolean('use_instance_email_settings')->default(false)->change(); - }); - } -}; diff --git a/database/migrations/2023_09_23_111818_set_notifications_on_by_default.php b/database/migrations/2023_09_23_111818_set_notifications_on_by_default.php deleted file mode 100644 index a7edc7860a..0000000000 --- a/database/migrations/2023_09_23_111818_set_notifications_on_by_default.php +++ /dev/null @@ -1,30 +0,0 @@ -boolean('smtp_notifications_deployments')->default(true)->change(); - $table->boolean('smtp_notifications_status_changes')->default(true)->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('teams', function (Blueprint $table) { - $table->boolean('smtp_notifications_deployments')->default(false)->change(); - $table->boolean('smtp_notifications_status_changes')->default(false)->change(); - }); - } -}; diff --git a/database/migrations/2023_09_23_111819_add_server_emails.php b/database/migrations/2023_09_23_111819_add_server_emails.php deleted file mode 100644 index 775e820108..0000000000 --- a/database/migrations/2023_09_23_111819_add_server_emails.php +++ /dev/null @@ -1,30 +0,0 @@ -boolean('unreachable_email_sent')->default(false); - $table->dropColumn('unreachable_count'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('servers', function (Blueprint $table) { - $table->dropColumn('unreachable_email_sent'); - $table->integer('unreachable_count')->default(0); - }); - } -}; diff --git a/database/migrations/2023_10_08_111819_add_server_unreachable_count.php b/database/migrations/2023_10_08_111819_add_server_unreachable_count.php deleted file mode 100644 index b6a0d710ad..0000000000 --- a/database/migrations/2023_10_08_111819_add_server_unreachable_count.php +++ /dev/null @@ -1,28 +0,0 @@ -integer('unreachable_count')->default(0); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('servers', function (Blueprint $table) { - $table->dropColumn('unreachable_count'); - }); - } -}; diff --git a/database/migrations/2023_10_10_100320_update_s3_storages_table.php b/database/migrations/2023_10_10_100320_update_s3_storages_table.php deleted file mode 100644 index b9c482c829..0000000000 --- a/database/migrations/2023_10_10_100320_update_s3_storages_table.php +++ /dev/null @@ -1,30 +0,0 @@ -boolean('is_usable')->default(false); - $table->boolean('unusable_email_sent')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('s3_storages', function (Blueprint $table) { - $table->dropColumn('is_usable'); - $table->dropColumn('unusable_email_sent'); - }); - } -}; diff --git a/database/migrations/2023_10_10_113144_add_dockerfile_location_applications_table.php b/database/migrations/2023_10_10_113144_add_dockerfile_location_applications_table.php deleted file mode 100644 index 39956a9edb..0000000000 --- a/database/migrations/2023_10_10_113144_add_dockerfile_location_applications_table.php +++ /dev/null @@ -1,28 +0,0 @@ -string('dockerfile_location')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('dockerfile_location'); - }); - } -}; diff --git a/database/migrations/2023_10_12_132430_create_standalone_redis_table.php b/database/migrations/2023_10_12_132430_create_standalone_redis_table.php deleted file mode 100644 index 772ee7cfd9..0000000000 --- a/database/migrations/2023_10_12_132430_create_standalone_redis_table.php +++ /dev/null @@ -1,54 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name'); - $table->string('description')->nullable(); - - $table->text('redis_password'); - $table->longText('redis_conf')->nullable(); - - $table->string('status')->default('exited'); - - $table->string('image')->default('redis:7.2'); - - $table->boolean('is_public')->default(false); - $table->integer('public_port')->nullable(); - $table->text('ports_mappings')->nullable(); - - $table->string('limits_memory')->default('0'); - $table->string('limits_memory_swap')->default('0'); - $table->integer('limits_memory_swappiness')->default(60); - $table->string('limits_memory_reservation')->default('0'); - - $table->string('limits_cpus')->default('0'); - $table->string('limits_cpuset')->nullable()->default('0'); - $table->integer('limits_cpu_shares')->default(1024); - - $table->timestamp('started_at')->nullable(); - $table->morphs('destination'); - $table->foreignId('environment_id')->nullable(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('standalone_redis'); - } -}; diff --git a/database/migrations/2023_10_12_132431_add_standalone_redis_to_environment_variables_table.php b/database/migrations/2023_10_12_132431_add_standalone_redis_to_environment_variables_table.php deleted file mode 100644 index 2fdacc9e5f..0000000000 --- a/database/migrations/2023_10_12_132431_add_standalone_redis_to_environment_variables_table.php +++ /dev/null @@ -1,28 +0,0 @@ -foreignId('standalone_redis_id')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('environment_variables', function (Blueprint $table) { - $table->dropColumn('standalone_redis_id'); - }); - } -}; diff --git a/database/migrations/2023_10_12_132432_add_database_selection_to_backups.php b/database/migrations/2023_10_12_132432_add_database_selection_to_backups.php deleted file mode 100644 index 40ade57e82..0000000000 --- a/database/migrations/2023_10_12_132432_add_database_selection_to_backups.php +++ /dev/null @@ -1,34 +0,0 @@ -text('databases_to_backup')->nullable(); - }); - Schema::table('scheduled_database_backup_executions', function (Blueprint $table) { - $table->string('database_name')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('scheduled_database_backups', function (Blueprint $table) { - $table->dropColumn('databases_to_backup'); - }); - Schema::table('scheduled_database_backup_executions', function (Blueprint $table) { - $table->dropColumn('database_name'); - }); - } -}; diff --git a/database/migrations/2023_10_18_072519_add_custom_labels_applications_table.php b/database/migrations/2023_10_18_072519_add_custom_labels_applications_table.php deleted file mode 100644 index f993e35eed..0000000000 --- a/database/migrations/2023_10_18_072519_add_custom_labels_applications_table.php +++ /dev/null @@ -1,28 +0,0 @@ -text('custom_labels')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('custom_labels'); - }); - } -}; diff --git a/database/migrations/2023_10_19_101331_create_standalone_mongodbs_table.php b/database/migrations/2023_10_19_101331_create_standalone_mongodbs_table.php deleted file mode 100644 index 26173ffc01..0000000000 --- a/database/migrations/2023_10_19_101331_create_standalone_mongodbs_table.php +++ /dev/null @@ -1,56 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name'); - $table->string('description')->nullable(); - - $table->text('mongo_conf')->nullable(); - $table->text('mongo_initdb_root_username')->default('root'); - $table->text('mongo_initdb_root_password'); - $table->text('mongo_initdb_database')->default('default'); - - $table->string('status')->default('exited'); - - $table->string('image')->default('mongo:7'); - - $table->boolean('is_public')->default(false); - $table->integer('public_port')->nullable(); - $table->text('ports_mappings')->nullable(); - - $table->string('limits_memory')->default('0'); - $table->string('limits_memory_swap')->default('0'); - $table->integer('limits_memory_swappiness')->default(60); - $table->string('limits_memory_reservation')->default('0'); - - $table->string('limits_cpus')->default('0'); - $table->string('limits_cpuset')->nullable()->default('0'); - $table->integer('limits_cpu_shares')->default(1024); - - $table->timestamp('started_at')->nullable(); - $table->morphs('destination'); - $table->foreignId('environment_id')->nullable(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('standalone_mongodbs'); - } -}; diff --git a/database/migrations/2023_10_19_101332_add_standalone_mongodb_to_environment_variables_table.php b/database/migrations/2023_10_19_101332_add_standalone_mongodb_to_environment_variables_table.php deleted file mode 100644 index b67c226371..0000000000 --- a/database/migrations/2023_10_19_101332_add_standalone_mongodb_to_environment_variables_table.php +++ /dev/null @@ -1,28 +0,0 @@ -foreignId('standalone_mongodb_id')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('environment_variables', function (Blueprint $table) { - $table->dropColumn('standalone_mongodb_id'); - }); - } -}; diff --git a/database/migrations/2023_10_24_103548_create_standalone_mysqls_table.php b/database/migrations/2023_10_24_103548_create_standalone_mysqls_table.php deleted file mode 100644 index f27d4690e2..0000000000 --- a/database/migrations/2023_10_24_103548_create_standalone_mysqls_table.php +++ /dev/null @@ -1,57 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name'); - $table->string('description')->nullable(); - - $table->text('mysql_root_password'); - $table->string('mysql_user')->default('mysql'); - $table->text('mysql_password'); - $table->string('mysql_database')->default('default'); - $table->longText('mysql_conf')->nullable(); - - $table->string('status')->default('exited'); - - $table->string('image')->default('mysql:8'); - $table->boolean('is_public')->default(false); - $table->integer('public_port')->nullable(); - $table->text('ports_mappings')->nullable(); - - $table->string('limits_memory')->default('0'); - $table->string('limits_memory_swap')->default('0'); - $table->integer('limits_memory_swappiness')->default(60); - $table->string('limits_memory_reservation')->default('0'); - - $table->string('limits_cpus')->default('0'); - $table->string('limits_cpuset')->nullable()->default('0'); - $table->integer('limits_cpu_shares')->default(1024); - - $table->timestamp('started_at')->nullable(); - $table->morphs('destination'); - - $table->foreignId('environment_id')->nullable(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('standalone_mysqls'); - } -}; diff --git a/database/migrations/2023_10_24_120523_create_standalone_mariadbs_table.php b/database/migrations/2023_10_24_120523_create_standalone_mariadbs_table.php deleted file mode 100644 index a0350bcdea..0000000000 --- a/database/migrations/2023_10_24_120523_create_standalone_mariadbs_table.php +++ /dev/null @@ -1,57 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name'); - $table->string('description')->nullable(); - - $table->text('mariadb_root_password'); - $table->string('mariadb_user')->default('mariadb'); - $table->text('mariadb_password'); - $table->string('mariadb_database')->default('default'); - $table->longText('mariadb_conf')->nullable(); - - $table->string('status')->default('exited'); - - $table->string('image')->default('mariadb:11'); - $table->boolean('is_public')->default(false); - $table->integer('public_port')->nullable(); - $table->text('ports_mappings')->nullable(); - - $table->string('limits_memory')->default('0'); - $table->string('limits_memory_swap')->default('0'); - $table->integer('limits_memory_swappiness')->default(60); - $table->string('limits_memory_reservation')->default('0'); - - $table->string('limits_cpus')->default('0'); - $table->string('limits_cpuset')->nullable()->default('0'); - $table->integer('limits_cpu_shares')->default(1024); - - $table->timestamp('started_at')->nullable(); - $table->morphs('destination'); - - $table->foreignId('environment_id')->nullable(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('standalone_mariadbs'); - } -}; diff --git a/database/migrations/2023_10_24_120524_add_standalone_mysql_to_environment_variables_table.php b/database/migrations/2023_10_24_120524_add_standalone_mysql_to_environment_variables_table.php deleted file mode 100644 index a511e9b21c..0000000000 --- a/database/migrations/2023_10_24_120524_add_standalone_mysql_to_environment_variables_table.php +++ /dev/null @@ -1,30 +0,0 @@ -foreignId('standalone_mysql_id')->nullable(); - $table->foreignId('standalone_mariadb_id')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('environment_variables', function (Blueprint $table) { - $table->dropColumn('standalone_mysql_id'); - $table->dropColumn('standalone_mariadb_id'); - }); - } -}; diff --git a/database/migrations/2023_10_24_124934_add_is_shown_once_to_environment_variables_table.php b/database/migrations/2023_10_24_124934_add_is_shown_once_to_environment_variables_table.php deleted file mode 100644 index e0df21186c..0000000000 --- a/database/migrations/2023_10_24_124934_add_is_shown_once_to_environment_variables_table.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_shown_once')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('environment_variables', function (Blueprint $table) { - $table->dropColumn('is_shown_once'); - }); - } -}; diff --git a/database/migrations/2023_11_01_100437_add_restart_to_deployment_queue.php b/database/migrations/2023_11_01_100437_add_restart_to_deployment_queue.php deleted file mode 100644 index 608fdd9241..0000000000 --- a/database/migrations/2023_11_01_100437_add_restart_to_deployment_queue.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('restart_only')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_deployment_queues', function (Blueprint $table) { - $table->dropColumn('restart_only'); - }); - } -}; diff --git a/database/migrations/2023_11_07_123731_add_target_build_dockerfile.php b/database/migrations/2023_11_07_123731_add_target_build_dockerfile.php deleted file mode 100644 index 26f43e9252..0000000000 --- a/database/migrations/2023_11_07_123731_add_target_build_dockerfile.php +++ /dev/null @@ -1,28 +0,0 @@ -string('dockerfile_target_build')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('dockerfile_target_build'); - }); - } -}; diff --git a/database/migrations/2023_11_08_112815_add_custom_config_standalone_postgresql.php b/database/migrations/2023_11_08_112815_add_custom_config_standalone_postgresql.php deleted file mode 100644 index c583fb3ff7..0000000000 --- a/database/migrations/2023_11_08_112815_add_custom_config_standalone_postgresql.php +++ /dev/null @@ -1,30 +0,0 @@ -longText('postgres_conf')->nullable(); - $table->string('image')->default('postgres:16-alpine')->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('standalone_postgresqls', function (Blueprint $table) { - $table->dropColumn('postgres_conf'); - $table->string('image')->default('postgres:15-alpine')->change(); - }); - } -}; diff --git a/database/migrations/2023_11_09_133332_add_public_port_to_service_databases.php b/database/migrations/2023_11_09_133332_add_public_port_to_service_databases.php deleted file mode 100644 index 1a01d0ab22..0000000000 --- a/database/migrations/2023_11_09_133332_add_public_port_to_service_databases.php +++ /dev/null @@ -1,30 +0,0 @@ -integer('public_port')->nullable(); - $table->boolean('is_public')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('service_databases', function (Blueprint $table) { - $table->dropColumn('public_port'); - $table->dropColumn('is_public'); - }); - } -}; diff --git a/database/migrations/2023_11_12_180605_change_fqdn_to_longer_field.php b/database/migrations/2023_11_12_180605_change_fqdn_to_longer_field.php deleted file mode 100644 index f10d5207ff..0000000000 --- a/database/migrations/2023_11_12_180605_change_fqdn_to_longer_field.php +++ /dev/null @@ -1,40 +0,0 @@ -longText('fqdn')->nullable()->change(); - }); - Schema::table('application_previews', function (Blueprint $table) { - $table->longText('fqdn')->nullable()->change(); - }); - Schema::table('service_applications', function (Blueprint $table) { - $table->longText('fqdn')->nullable()->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->string('fqdn')->nullable()->change(); - }); - Schema::table('application_previews', function (Blueprint $table) { - $table->string('fqdn')->nullable()->change(); - }); - Schema::table('service_applications', function (Blueprint $table) { - $table->string('fqdn')->nullable()->change(); - }); - } -}; diff --git a/database/migrations/2023_11_13_133059_add_sponsorship_disable.php b/database/migrations/2023_11_13_133059_add_sponsorship_disable.php deleted file mode 100644 index 6fe42b3904..0000000000 --- a/database/migrations/2023_11_13_133059_add_sponsorship_disable.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_notification_sponsorship_enabled')->default(true); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('users', function (Blueprint $table) { - $table->dropColumn('is_notification_sponsorship_enabled'); - }); - } -}; diff --git a/database/migrations/2023_11_14_103450_add_manual_webhook_secret.php b/database/migrations/2023_11_14_103450_add_manual_webhook_secret.php deleted file mode 100644 index 3d1f37d383..0000000000 --- a/database/migrations/2023_11_14_103450_add_manual_webhook_secret.php +++ /dev/null @@ -1,30 +0,0 @@ -string('manual_webhook_secret_github')->nullable(); - $table->string('manual_webhook_secret_gitlab')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('manual_webhook_secret_github'); - $table->dropColumn('manual_webhook_secret_gitlab'); - }); - } -}; diff --git a/database/migrations/2023_11_14_121416_add_git_type.php b/database/migrations/2023_11_14_121416_add_git_type.php deleted file mode 100644 index 1e2a307fe8..0000000000 --- a/database/migrations/2023_11_14_121416_add_git_type.php +++ /dev/null @@ -1,34 +0,0 @@ -string('git_type')->nullable(); - }); - Schema::table('application_deployment_queues', function (Blueprint $table) { - $table->string('git_type')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_previews', function (Blueprint $table) { - $table->dropColumn('git_type'); - }); - Schema::table('application_deployment_queues', function (Blueprint $table) { - $table->dropColumn('git_type'); - }); - } -}; diff --git a/database/migrations/2023_11_16_101819_add_high_disk_usage_notification.php b/database/migrations/2023_11_16_101819_add_high_disk_usage_notification.php deleted file mode 100644 index 67d8d3e470..0000000000 --- a/database/migrations/2023_11_16_101819_add_high_disk_usage_notification.php +++ /dev/null @@ -1,30 +0,0 @@ -boolean('high_disk_usage_notification_sent')->default(false); - $table->renameColumn('unreachable_email_sent', 'unreachable_notification_sent'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('servers', function (Blueprint $table) { - $table->dropColumn('high_disk_usage_notification_sent'); - $table->renameColumn('unreachable_notification_sent', 'unreachable_email_sent'); - }); - } -}; diff --git a/database/migrations/2023_11_16_220647_add_log_drains.php b/database/migrations/2023_11_16_220647_add_log_drains.php deleted file mode 100644 index f5161b3d7f..0000000000 --- a/database/migrations/2023_11_16_220647_add_log_drains.php +++ /dev/null @@ -1,46 +0,0 @@ -boolean('is_logdrain_newrelic_enabled')->default(false); - $table->string('logdrain_newrelic_license_key')->nullable(); - $table->string('logdrain_newrelic_base_uri')->nullable(); - - $table->boolean('is_logdrain_highlight_enabled')->default(false); - $table->string('logdrain_highlight_project_id')->nullable(); - - $table->boolean('is_logdrain_axiom_enabled')->default(false); - $table->string('logdrain_axiom_dataset_name')->nullable(); - $table->string('logdrain_axiom_api_key')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('is_logdrain_newrelic_enabled'); - $table->dropColumn('logdrain_newrelic_license_key'); - $table->dropColumn('logdrain_newrelic_base_uri'); - - $table->dropColumn('is_logdrain_highlight_enabled'); - $table->dropColumn('logdrain_highlight_project_id'); - - $table->dropColumn('is_logdrain_axiom_enabled'); - $table->dropColumn('logdrain_axiom_dataset_name'); - $table->dropColumn('logdrain_axiom_api_key'); - }); - } -}; diff --git a/database/migrations/2023_11_17_160437_add_drain_log_enable_by_service.php b/database/migrations/2023_11_17_160437_add_drain_log_enable_by_service.php deleted file mode 100644 index 8d0853be30..0000000000 --- a/database/migrations/2023_11_17_160437_add_drain_log_enable_by_service.php +++ /dev/null @@ -1,76 +0,0 @@ -boolean('is_log_drain_enabled')->default(false); - }); - Schema::table('standalone_redis', function (Blueprint $table) { - $table->boolean('is_log_drain_enabled')->default(false); - }); - Schema::table('standalone_mysqls', function (Blueprint $table) { - $table->boolean('is_log_drain_enabled')->default(false); - }); - Schema::table('standalone_mariadbs', function (Blueprint $table) { - $table->boolean('is_log_drain_enabled')->default(false); - }); - Schema::table('standalone_postgresqls', function (Blueprint $table) { - $table->boolean('is_log_drain_enabled')->default(false); - }); - Schema::table('standalone_mongodbs', function (Blueprint $table) { - $table->boolean('is_log_drain_enabled')->default(false); - }); - Schema::table('service_applications', function (Blueprint $table) { - $table->boolean('is_log_drain_enabled')->default(false); - }); - Schema::table('service_databases', function (Blueprint $table) { - $table->boolean('is_log_drain_enabled')->default(false); - }); - Schema::table('servers', function (Blueprint $table) { - $table->boolean('log_drain_notification_sent')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_settings', function (Blueprint $table) { - $table->dropColumn('is_log_drain_enabled'); - }); - Schema::table('standalone_redis', function (Blueprint $table) { - $table->dropColumn('is_log_drain_enabled'); - }); - Schema::table('standalone_mysqls', function (Blueprint $table) { - $table->dropColumn('is_log_drain_enabled'); - }); - Schema::table('standalone_mariadbs', function (Blueprint $table) { - $table->dropColumn('is_log_drain_enabled'); - }); - Schema::table('standalone_postgresqls', function (Blueprint $table) { - $table->dropColumn('is_log_drain_enabled'); - }); - Schema::table('standalone_mongodbs', function (Blueprint $table) { - $table->dropColumn('is_log_drain_enabled'); - }); - Schema::table('service_applications', function (Blueprint $table) { - $table->dropColumn('is_log_drain_enabled'); - }); - Schema::table('service_databases', function (Blueprint $table) { - $table->dropColumn('is_log_drain_enabled'); - }); - Schema::table('servers', function (Blueprint $table) { - $table->dropColumn('log_drain_notification_sent'); - }); - } -}; diff --git a/database/migrations/2023_11_20_094628_add_gpu_settings.php b/database/migrations/2023_11_20_094628_add_gpu_settings.php deleted file mode 100644 index 9aeb255d98..0000000000 --- a/database/migrations/2023_11_20_094628_add_gpu_settings.php +++ /dev/null @@ -1,36 +0,0 @@ -boolean('is_gpu_enabled')->default(false); - $table->string('gpu_driver')->default('nvidia'); - $table->string('gpu_count')->nullable(); - $table->string('gpu_device_ids')->nullable(); - $table->longText('gpu_options')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_settings', function (Blueprint $table) { - $table->dropColumn('is_gpu_enabled'); - $table->dropColumn('gpu_driver'); - $table->dropColumn('gpu_count'); - $table->dropColumn('gpu_device_ids'); - $table->dropColumn('gpu_options'); - }); - } -}; diff --git a/database/migrations/2023_11_21_121920_add_additional_destinations_to_apps.php b/database/migrations/2023_11_21_121920_add_additional_destinations_to_apps.php deleted file mode 100644 index 4852007b49..0000000000 --- a/database/migrations/2023_11_21_121920_add_additional_destinations_to_apps.php +++ /dev/null @@ -1,28 +0,0 @@ -string('additional_destinations')->nullable()->after('destination'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('additional_destinations'); - }); - } -}; diff --git a/database/migrations/2023_11_24_080341_add_docker_compose_location.php b/database/migrations/2023_11_24_080341_add_docker_compose_location.php deleted file mode 100644 index 8508181a39..0000000000 --- a/database/migrations/2023_11_24_080341_add_docker_compose_location.php +++ /dev/null @@ -1,42 +0,0 @@ -string('docker_compose_location')->nullable()->default('/docker-compose.yaml')->after('dockerfile_location'); - $table->string('docker_compose_pr_location')->nullable()->default('/docker-compose.yaml')->after('docker_compose_location'); - - $table->longText('docker_compose')->nullable()->after('docker_compose_location'); - $table->longText('docker_compose_pr')->nullable()->after('docker_compose_location'); - $table->longText('docker_compose_raw')->nullable()->after('docker_compose'); - $table->longText('docker_compose_pr_raw')->nullable()->after('docker_compose'); - - $table->text('docker_compose_domains')->nullable()->after('docker_compose_raw'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('docker_compose_location'); - $table->dropColumn('docker_compose_pr_location'); - $table->dropColumn('docker_compose'); - $table->dropColumn('docker_compose_pr'); - $table->dropColumn('docker_compose_raw'); - $table->dropColumn('docker_compose_pr_raw'); - $table->dropColumn('docker_compose_domains'); - }); - } -}; diff --git a/database/migrations/2023_11_28_143533_add_fields_to_swarm_dockers.php b/database/migrations/2023_11_28_143533_add_fields_to_swarm_dockers.php deleted file mode 100644 index 7ca398b90a..0000000000 --- a/database/migrations/2023_11_28_143533_add_fields_to_swarm_dockers.php +++ /dev/null @@ -1,30 +0,0 @@ -string('network'); - - $table->unique(['server_id', 'network']); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('swarm_dockers', function (Blueprint $table) { - $table->dropColumn('network'); - }); - } -}; diff --git a/database/migrations/2023_11_29_075937_change_swarm_properties.php b/database/migrations/2023_11_29_075937_change_swarm_properties.php deleted file mode 100644 index 6c0edc432e..0000000000 --- a/database/migrations/2023_11_29_075937_change_swarm_properties.php +++ /dev/null @@ -1,30 +0,0 @@ -renameColumn('is_part_of_swarm', 'is_swarm_manager'); - $table->boolean('is_swarm_worker')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('server_settings', function (Blueprint $table) { - $table->renameColumn('is_swarm_manager', 'is_part_of_swarm'); - $table->dropColumn('is_swarm_worker'); - }); - } -}; diff --git a/database/migrations/2023_12_01_091723_save_logs_view_settings.php b/database/migrations/2023_12_01_091723_save_logs_view_settings.php deleted file mode 100644 index a435644549..0000000000 --- a/database/migrations/2023_12_01_091723_save_logs_view_settings.php +++ /dev/null @@ -1,64 +0,0 @@ -boolean('is_include_timestamps')->default(false); - }); - Schema::table('service_applications', function (Blueprint $table) { - $table->boolean('is_include_timestamps')->default(false); - }); - Schema::table('service_databases', function (Blueprint $table) { - $table->boolean('is_include_timestamps')->default(false); - }); - Schema::table('standalone_mysqls', function (Blueprint $table) { - $table->boolean('is_include_timestamps')->default(false); - }); - Schema::table('standalone_postgresqls', function (Blueprint $table) { - $table->boolean('is_include_timestamps')->default(false); - }); - Schema::table('standalone_redis', function (Blueprint $table) { - $table->boolean('is_include_timestamps')->default(false); - }); - Schema::table('standalone_mongodbs', function (Blueprint $table) { - $table->boolean('is_include_timestamps')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_settings', function (Blueprint $table) { - $table->dropColumn('is_include_timestamps'); - }); - Schema::table('service_applications', function (Blueprint $table) { - $table->dropColumn('is_include_timestamps'); - }); - Schema::table('service_databases', function (Blueprint $table) { - $table->dropColumn('is_include_timestamps'); - }); - Schema::table('standalone_mysqls', function (Blueprint $table) { - $table->dropColumn('is_include_timestamps'); - }); - Schema::table('standalone_postgresqls', function (Blueprint $table) { - $table->dropColumn('is_include_timestamps'); - }); - Schema::table('standalone_redis', function (Blueprint $table) { - $table->dropColumn('is_include_timestamps'); - }); - Schema::table('standalone_mongodbs', function (Blueprint $table) { - $table->dropColumn('is_include_timestamps'); - }); - } -}; diff --git a/database/migrations/2023_12_01_095356_add_custom_fluentd_config_for_logdrains.php b/database/migrations/2023_12_01_095356_add_custom_fluentd_config_for_logdrains.php deleted file mode 100644 index ff100b484d..0000000000 --- a/database/migrations/2023_12_01_095356_add_custom_fluentd_config_for_logdrains.php +++ /dev/null @@ -1,32 +0,0 @@ -boolean('is_logdrain_custom_enabled')->default(false); - $table->text('logdrain_custom_config')->nullable(); - $table->text('logdrain_custom_config_parser')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('is_logdrain_custom_enabled'); - $table->dropColumn('logdrain_custom_config'); - $table->dropColumn('logdrain_custom_config_parser'); - }); - } -}; diff --git a/database/migrations/2023_12_08_162228_add_soft_delete_services.php b/database/migrations/2023_12_08_162228_add_soft_delete_services.php deleted file mode 100644 index c45ecf5bf1..0000000000 --- a/database/migrations/2023_12_08_162228_add_soft_delete_services.php +++ /dev/null @@ -1,28 +0,0 @@ -softDeletes(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('services', function (Blueprint $table) { - $table->dropSoftDeletes(); - }); - } -}; diff --git a/database/migrations/2023_12_11_103611_add_realtime_connection_problem.php b/database/migrations/2023_12_11_103611_add_realtime_connection_problem.php deleted file mode 100644 index 285e2f4574..0000000000 --- a/database/migrations/2023_12_11_103611_add_realtime_connection_problem.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_notification_realtime_enabled')->default(true); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('users', function (Blueprint $table) { - $table->dropColumn('is_notification_realtime_enabled'); - }); - } -}; diff --git a/database/migrations/2023_12_13_110214_add_soft_deletes.php b/database/migrations/2023_12_13_110214_add_soft_deletes.php deleted file mode 100644 index 72350b77fb..0000000000 --- a/database/migrations/2023_12_13_110214_add_soft_deletes.php +++ /dev/null @@ -1,70 +0,0 @@ -softDeletes(); - }); - Schema::table('standalone_postgresqls', function (Blueprint $table) { - $table->softDeletes(); - }); - Schema::table('standalone_redis', function (Blueprint $table) { - $table->softDeletes(); - }); - Schema::table('standalone_mongodbs', function (Blueprint $table) { - $table->softDeletes(); - }); - Schema::table('standalone_mysqls', function (Blueprint $table) { - $table->softDeletes(); - }); - Schema::table('standalone_mariadbs', function (Blueprint $table) { - $table->softDeletes(); - }); - Schema::table('service_applications', function (Blueprint $table) { - $table->softDeletes(); - }); - Schema::table('service_databases', function (Blueprint $table) { - $table->softDeletes(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropSoftDeletes(); - }); - Schema::table('standalone_postgresqls', function (Blueprint $table) { - $table->dropSoftDeletes(); - }); - Schema::table('standalone_redis', function (Blueprint $table) { - $table->dropSoftDeletes(); - }); - Schema::table('standalone_mongodbs', function (Blueprint $table) { - $table->dropSoftDeletes(); - }); - Schema::table('standalone_mysqls', function (Blueprint $table) { - $table->dropSoftDeletes(); - }); - Schema::table('standalone_mariadbs', function (Blueprint $table) { - $table->dropSoftDeletes(); - }); - Schema::table('service_applications', function (Blueprint $table) { - $table->dropSoftDeletes(); - }); - Schema::table('service_databases', function (Blueprint $table) { - $table->dropSoftDeletes(); - }); - } -}; diff --git a/database/migrations/2023_12_17_155616_add_custom_docker_compose_start_command.php b/database/migrations/2023_12_17_155616_add_custom_docker_compose_start_command.php deleted file mode 100644 index f28b2670e3..0000000000 --- a/database/migrations/2023_12_17_155616_add_custom_docker_compose_start_command.php +++ /dev/null @@ -1,30 +0,0 @@ -string('docker_compose_custom_start_command')->nullable(); - $table->string('docker_compose_custom_build_command')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('docker_compose_custom_start_command'); - $table->dropColumn('docker_compose_custom_build_command'); - }); - } -}; diff --git a/database/migrations/2023_12_18_093514_add_swarm_related_things.php b/database/migrations/2023_12_18_093514_add_swarm_related_things.php deleted file mode 100644 index 0f44f35ec4..0000000000 --- a/database/migrations/2023_12_18_093514_add_swarm_related_things.php +++ /dev/null @@ -1,36 +0,0 @@ -integer('swarm_replicas')->default(1); - $table->text('swarm_placement_constraints')->nullable(); - }); - Schema::table('application_settings', function (Blueprint $table) { - $table->boolean('is_swarm_only_worker_nodes')->default(true); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('swarm_replicas'); - $table->dropColumn('swarm_placement_constraints'); - }); - Schema::table('application_settings', function (Blueprint $table) { - $table->dropColumn('is_swarm_only_worker_nodes'); - }); - } -}; diff --git a/database/migrations/2023_12_19_124111_add_swarm_cluster_grouping.php b/database/migrations/2023_12_19_124111_add_swarm_cluster_grouping.php deleted file mode 100644 index 668acb6fed..0000000000 --- a/database/migrations/2023_12_19_124111_add_swarm_cluster_grouping.php +++ /dev/null @@ -1,28 +0,0 @@ -integer('swarm_cluster')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('servers', function (Blueprint $table) { - $table->dropColumn('swarm_cluster'); - }); - } -}; diff --git a/database/migrations/2023_12_30_134507_add_description_to_environments.php b/database/migrations/2023_12_30_134507_add_description_to_environments.php deleted file mode 100644 index 0e8f4fec38..0000000000 --- a/database/migrations/2023_12_30_134507_add_description_to_environments.php +++ /dev/null @@ -1,28 +0,0 @@ -string('description')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('environments', function (Blueprint $table) { - $table->dropColumn('description'); - }); - } -}; diff --git a/database/migrations/2023_12_31_173041_create_scheduled_tasks_table.php b/database/migrations/2023_12_31_173041_create_scheduled_tasks_table.php deleted file mode 100644 index c3c2e2f488..0000000000 --- a/database/migrations/2023_12_31_173041_create_scheduled_tasks_table.php +++ /dev/null @@ -1,37 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->boolean('enabled')->default(true); - $table->string('name'); - $table->string('command'); - $table->string('frequency'); - $table->string('container')->nullable(); - $table->timestamps(); - - $table->foreignId('application_id')->nullable(); - $table->foreignId('service_id')->nullable(); - $table->foreignId('team_id'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('scheduled_tasks'); - } -}; diff --git a/database/migrations/2024_01_01_231053_create_scheduled_task_executions_table.php b/database/migrations/2024_01_01_231053_create_scheduled_task_executions_table.php deleted file mode 100644 index 27ace08d4c..0000000000 --- a/database/migrations/2024_01_01_231053_create_scheduled_task_executions_table.php +++ /dev/null @@ -1,31 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->enum('status', ['success', 'failed', 'running'])->default('running'); - $table->longText('message')->nullable(); - $table->foreignId('scheduled_task_id'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('scheduled_task_executions'); - } -}; diff --git a/database/migrations/2024_01_02_113855_add_raw_compose_deployment.php b/database/migrations/2024_01_02_113855_add_raw_compose_deployment.php deleted file mode 100644 index 6f99bdc4b8..0000000000 --- a/database/migrations/2024_01_02_113855_add_raw_compose_deployment.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_raw_compose_deployment_enabled')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_settings', function (Blueprint $table) { - $table->dropColumn('is_raw_compose_deployment_enabled'); - }); - } -}; diff --git a/database/migrations/2024_01_12_123422_update_cpuset_limits.php b/database/migrations/2024_01_12_123422_update_cpuset_limits.php deleted file mode 100644 index d1956eb9ff..0000000000 --- a/database/migrations/2024_01_12_123422_update_cpuset_limits.php +++ /dev/null @@ -1,76 +0,0 @@ -string('limits_cpuset')->nullable()->default(null)->change(); - }); - Schema::table('standalone_postgresqls', function (Blueprint $table) { - $table->string('limits_cpuset')->nullable()->default(null)->change(); - }); - Schema::table('standalone_redis', function (Blueprint $table) { - $table->string('limits_cpuset')->nullable()->default(null)->change(); - }); - Schema::table('standalone_mariadbs', function (Blueprint $table) { - $table->string('limits_cpuset')->nullable()->default(null)->change(); - }); - Schema::table('standalone_mysqls', function (Blueprint $table) { - $table->string('limits_cpuset')->nullable()->default(null)->change(); - }); - Schema::table('standalone_mongodbs', function (Blueprint $table) { - $table->string('limits_cpuset')->nullable()->default(null)->change(); - }); - Application::where('limits_cpuset', '0')->update(['limits_cpuset' => null]); - StandalonePostgresql::where('limits_cpuset', '0')->update(['limits_cpuset' => null]); - StandaloneRedis::where('limits_cpuset', '0')->update(['limits_cpuset' => null]); - StandaloneMariadb::where('limits_cpuset', '0')->update(['limits_cpuset' => null]); - StandaloneMysql::where('limits_cpuset', '0')->update(['limits_cpuset' => null]); - StandaloneMongodb::where('limits_cpuset', '0')->update(['limits_cpuset' => null]); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->string('limits_cpuset')->nullable()->default('0')->change(); - }); - Schema::table('standalone_postgresqls', function (Blueprint $table) { - $table->string('limits_cpuset')->nullable()->default('0')->change(); - }); - Schema::table('standalone_redis', function (Blueprint $table) { - $table->string('limits_cpuset')->nullable()->default('0')->change(); - }); - Schema::table('standalone_mariadbs', function (Blueprint $table) { - $table->string('limits_cpuset')->nullable()->default('0')->change(); - }); - Schema::table('standalone_mysqls', function (Blueprint $table) { - $table->string('limits_cpuset')->nullable()->default('0')->change(); - }); - Schema::table('standalone_mongodbs', function (Blueprint $table) { - $table->string('limits_cpuset')->nullable()->default('0')->change(); - }); - Application::where('limits_cpuset', null)->update(['limits_cpuset' => '0']); - StandalonePostgresql::where('limits_cpuset', null)->update(['limits_cpuset' => '0']); - StandaloneRedis::where('limits_cpuset', null)->update(['limits_cpuset' => '0']); - StandaloneMariadb::where('limits_cpuset', null)->update(['limits_cpuset' => '0']); - StandaloneMysql::where('limits_cpuset', null)->update(['limits_cpuset' => '0']); - StandaloneMongodb::where('limits_cpuset', null)->update(['limits_cpuset' => '0']); - } -}; diff --git a/database/migrations/2024_01_15_084609_add_custom_dns_server.php b/database/migrations/2024_01_15_084609_add_custom_dns_server.php deleted file mode 100644 index 24d288d020..0000000000 --- a/database/migrations/2024_01_15_084609_add_custom_dns_server.php +++ /dev/null @@ -1,30 +0,0 @@ -boolean('is_dns_validation_enabled')->default(true); - $table->string('custom_dns_servers')->nullable()->default('1.1.1.1'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('instance_settings', function (Blueprint $table) { - $table->dropColumn('is_dns_validation_enabled'); - $table->dropColumn('custom_dns_servers'); - }); - } -}; diff --git a/database/migrations/2024_01_16_115005_add_build_server_enable.php b/database/migrations/2024_01_16_115005_add_build_server_enable.php deleted file mode 100644 index 771c0e4ee2..0000000000 --- a/database/migrations/2024_01_16_115005_add_build_server_enable.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_build_server_enabled')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_settings', function (Blueprint $table) { - $table->dropColumn('is_build_server_enabled'); - }); - } -}; diff --git a/database/migrations/2024_01_21_130328_add_docker_network_to_services.php b/database/migrations/2024_01_21_130328_add_docker_network_to_services.php deleted file mode 100644 index 78ea10e3a8..0000000000 --- a/database/migrations/2024_01_21_130328_add_docker_network_to_services.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('connect_to_docker_network')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('services', function (Blueprint $table) { - $table->dropColumn('connect_to_docker_network'); - }); - } -}; diff --git a/database/migrations/2024_01_23_095832_add_manual_webhook_secret_bitbucket.php b/database/migrations/2024_01_23_095832_add_manual_webhook_secret_bitbucket.php deleted file mode 100755 index 74917a049a..0000000000 --- a/database/migrations/2024_01_23_095832_add_manual_webhook_secret_bitbucket.php +++ /dev/null @@ -1,28 +0,0 @@ -string('manual_webhook_secret_bitbucket')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('manual_webhook_secret_bitbucket'); - }); - } -}; diff --git a/database/migrations/2024_01_23_113129_create_shared_environment_variables_table.php b/database/migrations/2024_01_23_113129_create_shared_environment_variables_table.php deleted file mode 100644 index 994a02a407..0000000000 --- a/database/migrations/2024_01_23_113129_create_shared_environment_variables_table.php +++ /dev/null @@ -1,37 +0,0 @@ -id(); - $table->string('key'); - $table->string('value')->nullable(); - $table->boolean('is_shown_once')->default(false); - $table->enum('type', ['team', 'project', 'environment'])->default('team'); - - $table->foreignId('team_id')->constrained()->onDelete('cascade'); - $table->foreignId('project_id')->nullable()->constrained()->onDelete('cascade'); - $table->foreignId('environment_id')->nullable()->constrained()->onDelete('cascade'); - $table->unique(['key', 'project_id', 'team_id']); - $table->unique(['key', 'environment_id', 'team_id']); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('shared_environment_variables'); - } -}; diff --git a/database/migrations/2024_01_24_095449_add_concurrent_number_of_builds_per_server.php b/database/migrations/2024_01_24_095449_add_concurrent_number_of_builds_per_server.php deleted file mode 100644 index f5d87d13df..0000000000 --- a/database/migrations/2024_01_24_095449_add_concurrent_number_of_builds_per_server.php +++ /dev/null @@ -1,28 +0,0 @@ -integer('concurrent_builds')->default(2); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('concurrent_builds'); - }); - } -}; diff --git a/database/migrations/2024_01_25_073212_add_server_id_to_queues.php b/database/migrations/2024_01_25_073212_add_server_id_to_queues.php deleted file mode 100644 index 1441ad19fd..0000000000 --- a/database/migrations/2024_01_25_073212_add_server_id_to_queues.php +++ /dev/null @@ -1,28 +0,0 @@ -integer('server_id')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_deployment_queues', function (Blueprint $table) { - $table->dropColumn('server_id'); - }); - } -}; diff --git a/database/migrations/2024_01_27_164724_add_application_name_and_deployment_url_to_queue.php b/database/migrations/2024_01_27_164724_add_application_name_and_deployment_url_to_queue.php deleted file mode 100644 index 9d4f24a327..0000000000 --- a/database/migrations/2024_01_27_164724_add_application_name_and_deployment_url_to_queue.php +++ /dev/null @@ -1,32 +0,0 @@ -string('application_name')->nullable(); - $table->string('server_name')->nullable(); - $table->string('deployment_url')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_deployment_queues', function (Blueprint $table) { - $table->dropColumn('application_name'); - $table->dropColumn('server_name'); - $table->dropColumn('deployment_url'); - }); - } -}; diff --git a/database/migrations/2024_01_29_072322_change_env_variable_length.php b/database/migrations/2024_01_29_072322_change_env_variable_length.php deleted file mode 100644 index 65194954fc..0000000000 --- a/database/migrations/2024_01_29_072322_change_env_variable_length.php +++ /dev/null @@ -1,28 +0,0 @@ -text('value')->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('shared_environment_variables', function (Blueprint $table) { - $table->string('value')->change(); - }); - } -}; diff --git a/database/migrations/2024_01_29_145200_add_custom_docker_run_options.php b/database/migrations/2024_01_29_145200_add_custom_docker_run_options.php deleted file mode 100644 index 30949ea808..0000000000 --- a/database/migrations/2024_01_29_145200_add_custom_docker_run_options.php +++ /dev/null @@ -1,28 +0,0 @@ -string('custom_docker_run_options')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('custom_docker_run_options'); - }); - } -}; diff --git a/database/migrations/2024_02_01_111228_create_tags_table.php b/database/migrations/2024_02_01_111228_create_tags_table.php deleted file mode 100644 index 259a0c30db..0000000000 --- a/database/migrations/2024_02_01_111228_create_tags_table.php +++ /dev/null @@ -1,38 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name')->unique(); - $table->foreignId('team_id')->nullable()->constrained()->onDelete('cascade'); - $table->timestamps(); - }); - Schema::create('taggables', function (Blueprint $table) { - $table->unsignedBigInteger('tag_id'); - $table->unsignedBigInteger('taggable_id'); - $table->string('taggable_type'); - $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); - $table->unique(['tag_id', 'taggable_id', 'taggable_type'], 'taggable_unique'); // Composite unique index - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('taggables'); - Schema::dropIfExists('tags'); - } -}; diff --git a/database/migrations/2024_02_05_105215_add_destination_to_app_deployments.php b/database/migrations/2024_02_05_105215_add_destination_to_app_deployments.php deleted file mode 100644 index 29f43dd3fc..0000000000 --- a/database/migrations/2024_02_05_105215_add_destination_to_app_deployments.php +++ /dev/null @@ -1,28 +0,0 @@ -string('destination_id')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_deployment_queues', function (Blueprint $table) { - $table->dropColumn('destination_id'); - }); - } -}; diff --git a/database/migrations/2024_02_06_132748_add_additional_destinations.php b/database/migrations/2024_02_06_132748_add_additional_destinations.php deleted file mode 100644 index 32e7f5b188..0000000000 --- a/database/migrations/2024_02_06_132748_add_additional_destinations.php +++ /dev/null @@ -1,37 +0,0 @@ -id(); - $table->foreignId('application_id')->constrained()->onDelete('cascade'); - $table->foreignId('server_id')->constrained()->onDelete('cascade'); - $table->string('status')->default('exited'); - $table->foreignId('standalone_docker_id')->constrained()->onDelete('cascade'); - $table->timestamps(); - }); - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('additional_destinations'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('additional_destinations'); - Schema::table('applications', function (Blueprint $table) { - $table->string('additional_destinations')->nullable()->after('destination'); - }); - } -}; diff --git a/database/migrations/2024_02_08_075523_add_post_deployment_to_applications.php b/database/migrations/2024_02_08_075523_add_post_deployment_to_applications.php deleted file mode 100644 index 6d3a748969..0000000000 --- a/database/migrations/2024_02_08_075523_add_post_deployment_to_applications.php +++ /dev/null @@ -1,34 +0,0 @@ -string('post_deployment_command')->nullable(); - $table->string('post_deployment_command_container')->nullable(); - $table->string('pre_deployment_command')->nullable(); - $table->string('pre_deployment_command_container')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('post_deployment_command'); - $table->dropColumn('post_deployment_command_container'); - $table->dropColumn('pre_deployment_command'); - $table->dropColumn('pre_deployment_command_container'); - }); - } -}; diff --git a/database/migrations/2024_02_08_112304_add_dynamic_timeout_for_deployments.php b/database/migrations/2024_02_08_112304_add_dynamic_timeout_for_deployments.php deleted file mode 100644 index f45bd7a2a4..0000000000 --- a/database/migrations/2024_02_08_112304_add_dynamic_timeout_for_deployments.php +++ /dev/null @@ -1,28 +0,0 @@ -integer('dynamic_timeout')->default(3600); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('dynamic_timeout'); - }); - } -}; diff --git a/database/migrations/2024_02_15_101921_add_consistent_application_container_name.php b/database/migrations/2024_02_15_101921_add_consistent_application_container_name.php deleted file mode 100644 index 827b4c426d..0000000000 --- a/database/migrations/2024_02_15_101921_add_consistent_application_container_name.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_consistent_container_name_enabled')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_settings', function (Blueprint $table) { - $table->dropColumn('is_consistent_container_name_enabled'); - }); - } -}; diff --git a/database/migrations/2024_02_15_192025_add_is_gzip_enabled_to_services.php b/database/migrations/2024_02_15_192025_add_is_gzip_enabled_to_services.php deleted file mode 100644 index 5f724e5cea..0000000000 --- a/database/migrations/2024_02_15_192025_add_is_gzip_enabled_to_services.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_gzip_enabled')->default(true); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('service_applications', function (Blueprint $table) { - $table->dropColumn('is_gzip_enabled'); - }); - } -}; diff --git a/database/migrations/2024_02_20_165045_add_permissions_to_github_app.php b/database/migrations/2024_02_20_165045_add_permissions_to_github_app.php deleted file mode 100644 index fedb7395f3..0000000000 --- a/database/migrations/2024_02_20_165045_add_permissions_to_github_app.php +++ /dev/null @@ -1,34 +0,0 @@ -string('contents')->nullable(); - $table->string('metadata')->nullable(); - $table->string('pull_requests')->nullable(); - $table->string('administration')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('github_apps', function (Blueprint $table) { - $table->dropColumn('contents'); - $table->dropColumn('metadata'); - $table->dropColumn('pull_requests'); - $table->dropColumn('administration'); - }); - } -}; diff --git a/database/migrations/2024_02_22_090900_add_only_this_server_deployment.php b/database/migrations/2024_02_22_090900_add_only_this_server_deployment.php deleted file mode 100644 index 8dd9e10313..0000000000 --- a/database/migrations/2024_02_22_090900_add_only_this_server_deployment.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('only_this_server')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_deployment_queues', function (Blueprint $table) { - $table->dropColumn('only_this_server'); - }); - } -}; diff --git a/database/migrations/2024_02_23_143119_add_custom_server_limits_to_teams_ultimate.php b/database/migrations/2024_02_23_143119_add_custom_server_limits_to_teams_ultimate.php deleted file mode 100644 index 7e1fe67f51..0000000000 --- a/database/migrations/2024_02_23_143119_add_custom_server_limits_to_teams_ultimate.php +++ /dev/null @@ -1,28 +0,0 @@ -integer('custom_server_limit')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('teams', function (Blueprint $table) { - $table->dropColumn('custom_server_limit'); - }); - } -}; diff --git a/database/migrations/2024_02_25_222150_add_server_force_disabled_field.php b/database/migrations/2024_02_25_222150_add_server_force_disabled_field.php deleted file mode 100644 index 8509a99098..0000000000 --- a/database/migrations/2024_02_25_222150_add_server_force_disabled_field.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('force_disabled')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('force_disabled'); - }); - } -}; diff --git a/database/migrations/2024_03_04_092244_add_gzip_enabled_and_stripprefix_settings.php b/database/migrations/2024_03_04_092244_add_gzip_enabled_and_stripprefix_settings.php deleted file mode 100644 index 5d23da60e8..0000000000 --- a/database/migrations/2024_03_04_092244_add_gzip_enabled_and_stripprefix_settings.php +++ /dev/null @@ -1,44 +0,0 @@ -boolean('is_gzip_enabled')->default(true); - $table->boolean('is_stripprefix_enabled')->default(true); - }); - Schema::table('service_applications', function (Blueprint $table) { - $table->boolean('is_stripprefix_enabled')->default(true); - }); - Schema::table('service_databases', function (Blueprint $table) { - $table->boolean('is_gzip_enabled')->default(true); - $table->boolean('is_stripprefix_enabled')->default(true); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_settings', function (Blueprint $table) { - $table->dropColumn('is_gzip_enabled'); - $table->dropColumn('is_stripprefix_enabled'); - }); - Schema::table('service_applications', function (Blueprint $table) { - $table->dropColumn('is_stripprefix_enabled'); - }); - Schema::table('service_databases', function (Blueprint $table) { - $table->dropColumn('is_gzip_enabled'); - $table->dropColumn('is_stripprefix_enabled'); - }); - } -}; diff --git a/database/migrations/2024_03_07_115054_add_notifications_notification_disable.php b/database/migrations/2024_03_07_115054_add_notifications_notification_disable.php deleted file mode 100644 index 8633b971ef..0000000000 --- a/database/migrations/2024_03_07_115054_add_notifications_notification_disable.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_notification_notifications_enabled')->default(true); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('users', function (Blueprint $table) { - $table->dropColumn('is_notification_notifications_enabled'); - }); - } -}; diff --git a/database/migrations/2024_03_08_180457_nullable_password.php b/database/migrations/2024_03_08_180457_nullable_password.php deleted file mode 100644 index 3bd91b0bea..0000000000 --- a/database/migrations/2024_03_08_180457_nullable_password.php +++ /dev/null @@ -1,28 +0,0 @@ -string('password')->nullable()->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('users', function (Blueprint $table) { - $table->string('password')->nullable(false)->change(); - }); - } -}; diff --git a/database/migrations/2024_03_11_150013_create_oauth_settings.php b/database/migrations/2024_03_11_150013_create_oauth_settings.php deleted file mode 100644 index c2178426d7..0000000000 --- a/database/migrations/2024_03_11_150013_create_oauth_settings.php +++ /dev/null @@ -1,33 +0,0 @@ -id(); - $table->string('provider')->unique(); - $table->boolean('enabled')->default(false); - $table->string('client_id')->nullable(); - $table->text('client_secret')->nullable(); - $table->string('redirect_uri')->nullable(); - $table->string('tenant')->nullable(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('oauth_settings'); - } -}; diff --git a/database/migrations/2024_03_14_214402_add_multiline_envs.php b/database/migrations/2024_03_14_214402_add_multiline_envs.php deleted file mode 100644 index b3e869bc37..0000000000 --- a/database/migrations/2024_03_14_214402_add_multiline_envs.php +++ /dev/null @@ -1,34 +0,0 @@ -boolean('is_multiline')->default(false); - }); - Schema::table('shared_environment_variables', function (Blueprint $table) { - $table->boolean('is_multiline')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('environment_variables', function (Blueprint $table) { - $table->dropColumn('is_multiline'); - }); - Schema::table('shared_environment_variables', function (Blueprint $table) { - $table->dropColumn('is_multiline'); - }); - } -}; diff --git a/database/migrations/2024_03_18_101440_add_version_of_envs.php b/database/migrations/2024_03_18_101440_add_version_of_envs.php deleted file mode 100644 index 9973f88bd0..0000000000 --- a/database/migrations/2024_03_18_101440_add_version_of_envs.php +++ /dev/null @@ -1,34 +0,0 @@ -string('version')->default('4.0.0-beta.239'); - }); - Schema::table('shared_environment_variables', function (Blueprint $table) { - $table->string('version')->default('4.0.0-beta.239'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('environment_variables', function (Blueprint $table) { - $table->dropColumn('version'); - }); - Schema::table('shared_environment_variables', function (Blueprint $table) { - $table->dropColumn('version'); - }); - } -}; diff --git a/database/migrations/2024_03_22_080914_remove_popup_notifications.php b/database/migrations/2024_03_22_080914_remove_popup_notifications.php deleted file mode 100644 index ccb270093f..0000000000 --- a/database/migrations/2024_03_22_080914_remove_popup_notifications.php +++ /dev/null @@ -1,30 +0,0 @@ -dropColumn('is_notification_sponsorship_enabled'); - $table->dropColumn('is_notification_notifications_enabled'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('users', function (Blueprint $table) { - $table->boolean('is_notification_sponsorship_enabled')->default(true); - $table->boolean('is_notification_notifications_enabled')->default(true); - }); - } -}; diff --git a/database/migrations/2024_03_26_122110_remove_realtime_notifications.php b/database/migrations/2024_03_26_122110_remove_realtime_notifications.php deleted file mode 100644 index 6d5d0e0413..0000000000 --- a/database/migrations/2024_03_26_122110_remove_realtime_notifications.php +++ /dev/null @@ -1,28 +0,0 @@ -dropColumn('is_notification_realtime_enabled'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('users', function (Blueprint $table) { - $table->boolean('is_notification_realtime_enabled')->default(true); - }); - } -}; diff --git a/database/migrations/2024_03_28_114620_add_watch_paths_to_apps.php b/database/migrations/2024_03_28_114620_add_watch_paths_to_apps.php deleted file mode 100644 index d58adcd623..0000000000 --- a/database/migrations/2024_03_28_114620_add_watch_paths_to_apps.php +++ /dev/null @@ -1,28 +0,0 @@ -longText('watch_paths')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('watch_paths'); - }); - } -}; diff --git a/database/migrations/2024_04_09_095517_make_custom_docker_commands_longer.php b/database/migrations/2024_04_09_095517_make_custom_docker_commands_longer.php deleted file mode 100644 index b3f2c1920c..0000000000 --- a/database/migrations/2024_04_09_095517_make_custom_docker_commands_longer.php +++ /dev/null @@ -1,28 +0,0 @@ -text('custom_docker_run_options')->nullable()->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->string('custom_docker_run_options')->nullable()->change(); - }); - } -}; diff --git a/database/migrations/2024_04_10_071920_create_standalone_keydbs_table.php b/database/migrations/2024_04_10_071920_create_standalone_keydbs_table.php deleted file mode 100644 index 4cea931218..0000000000 --- a/database/migrations/2024_04_10_071920_create_standalone_keydbs_table.php +++ /dev/null @@ -1,64 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name'); - $table->string('description')->nullable(); - - $table->text('keydb_password'); - $table->longText('keydb_conf')->nullable(); - - $table->boolean('is_log_drain_enabled')->default(false); - $table->boolean('is_include_timestamps')->default(false); - $table->softDeletes(); - - $table->string('status')->default('exited'); - - $table->string('image')->default('eqalpha/keydb:latest'); - - $table->boolean('is_public')->default(false); - $table->integer('public_port')->nullable(); - $table->text('ports_mappings')->nullable(); - - $table->string('limits_memory')->default('0'); - $table->string('limits_memory_swap')->default('0'); - $table->integer('limits_memory_swappiness')->default(60); - $table->string('limits_memory_reservation')->default('0'); - - $table->string('limits_cpus')->default('0'); - $table->string('limits_cpuset')->nullable()->default(null); - $table->integer('limits_cpu_shares')->default(1024); - - $table->timestamp('started_at')->nullable(); - $table->morphs('destination'); - $table->foreignId('environment_id')->nullable(); - $table->timestamps(); - }); - Schema::table('environment_variables', function (Blueprint $table) { - $table->foreignId('standalone_keydb_id')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('standalone_keydbs'); - Schema::table('environment_variables', function (Blueprint $table) { - $table->dropColumn('standalone_keydb_id'); - }); - } -}; diff --git a/database/migrations/2024_04_10_082220_create_standalone_dragonflies_table.php b/database/migrations/2024_04_10_082220_create_standalone_dragonflies_table.php deleted file mode 100644 index 84bd6ea6f5..0000000000 --- a/database/migrations/2024_04_10_082220_create_standalone_dragonflies_table.php +++ /dev/null @@ -1,63 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name'); - $table->string('description')->nullable(); - - $table->text('dragonfly_password'); - - $table->boolean('is_log_drain_enabled')->default(false); - $table->boolean('is_include_timestamps')->default(false); - $table->softDeletes(); - - $table->string('status')->default('exited'); - - $table->string('image')->default('docker.dragonflydb.io/dragonflydb/dragonfly'); - - $table->boolean('is_public')->default(false); - $table->integer('public_port')->nullable(); - $table->text('ports_mappings')->nullable(); - - $table->string('limits_memory')->default('0'); - $table->string('limits_memory_swap')->default('0'); - $table->integer('limits_memory_swappiness')->default(60); - $table->string('limits_memory_reservation')->default('0'); - - $table->string('limits_cpus')->default('0'); - $table->string('limits_cpuset')->nullable()->default(null); - $table->integer('limits_cpu_shares')->default(1024); - - $table->timestamp('started_at')->nullable(); - $table->morphs('destination'); - $table->foreignId('environment_id')->nullable(); - $table->timestamps(); - }); - Schema::table('environment_variables', function (Blueprint $table) { - $table->foreignId('standalone_dragonfly_id')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('standalone_dragonflies'); - Schema::table('environment_variables', function (Blueprint $table) { - $table->dropColumn('standalone_dragonfly_id'); - }); - } -}; diff --git a/database/migrations/2024_04_10_091519_create_standalone_clickhouses_table.php b/database/migrations/2024_04_10_091519_create_standalone_clickhouses_table.php deleted file mode 100644 index 7433948b99..0000000000 --- a/database/migrations/2024_04_10_091519_create_standalone_clickhouses_table.php +++ /dev/null @@ -1,64 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->string('name'); - $table->string('description')->nullable(); - - $table->string('clickhouse_admin_user')->default('default'); - $table->text('clickhouse_admin_password'); - - $table->boolean('is_log_drain_enabled')->default(false); - $table->boolean('is_include_timestamps')->default(false); - $table->softDeletes(); - - $table->string('status')->default('exited'); - - $table->string('image')->default('bitnami/clickhouse'); - - $table->boolean('is_public')->default(false); - $table->integer('public_port')->nullable(); - $table->text('ports_mappings')->nullable(); - - $table->string('limits_memory')->default('0'); - $table->string('limits_memory_swap')->default('0'); - $table->integer('limits_memory_swappiness')->default(60); - $table->string('limits_memory_reservation')->default('0'); - - $table->string('limits_cpus')->default('0'); - $table->string('limits_cpuset')->nullable()->default(null); - $table->integer('limits_cpu_shares')->default(1024); - - $table->timestamp('started_at')->nullable(); - $table->morphs('destination'); - $table->foreignId('environment_id')->nullable(); - $table->timestamps(); - }); - Schema::table('environment_variables', function (Blueprint $table) { - $table->foreignId('standalone_clickhouse_id')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('standalone_clickhouses'); - Schema::table('environment_variables', function (Blueprint $table) { - $table->dropColumn('standalone_clickhouse_id'); - }); - } -}; diff --git a/database/migrations/2024_04_10_124015_add_permission_local_file_volumes.php b/database/migrations/2024_04_10_124015_add_permission_local_file_volumes.php deleted file mode 100644 index a2487ccd6c..0000000000 --- a/database/migrations/2024_04_10_124015_add_permission_local_file_volumes.php +++ /dev/null @@ -1,30 +0,0 @@ -string('chown')->nullable(); - $table->string('chmod')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('local_file_volumes', function (Blueprint $table) { - $table->dropColumn('chown'); - $table->dropColumn('chmod'); - }); - } -}; diff --git a/database/migrations/2024_04_12_092337_add_config_hash_to_other_resources.php b/database/migrations/2024_04_12_092337_add_config_hash_to_other_resources.php deleted file mode 100644 index 83365f69e5..0000000000 --- a/database/migrations/2024_04_12_092337_add_config_hash_to_other_resources.php +++ /dev/null @@ -1,76 +0,0 @@ -string('config_hash')->nullable(); - }); - Schema::table('standalone_redis', function (Blueprint $table) { - $table->string('config_hash')->nullable(); - }); - Schema::table('standalone_mysqls', function (Blueprint $table) { - $table->string('config_hash')->nullable(); - }); - Schema::table('standalone_mariadbs', function (Blueprint $table) { - $table->string('config_hash')->nullable(); - }); - Schema::table('standalone_mongodbs', function (Blueprint $table) { - $table->string('config_hash')->nullable(); - }); - Schema::table('standalone_keydbs', function (Blueprint $table) { - $table->string('config_hash')->nullable(); - }); - Schema::table('standalone_dragonflies', function (Blueprint $table) { - $table->string('config_hash')->nullable(); - }); - Schema::table('standalone_clickhouses', function (Blueprint $table) { - $table->string('config_hash')->nullable(); - }); - Schema::table('services', function (Blueprint $table) { - $table->string('config_hash')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('standalone_postgresqls', function (Blueprint $table) { - $table->dropColumn('config_hash'); - }); - Schema::table('standalone_redis', function (Blueprint $table) { - $table->dropColumn('config_hash'); - }); - Schema::table('standalone_mysqls', function (Blueprint $table) { - $table->dropColumn('config_hash'); - }); - Schema::table('standalone_mariadbs', function (Blueprint $table) { - $table->dropColumn('config_hash'); - }); - Schema::table('standalone_mongodbs', function (Blueprint $table) { - $table->dropColumn('config_hash'); - }); - Schema::table('standalone_keydbs', function (Blueprint $table) { - $table->dropColumn('config_hash'); - }); - Schema::table('standalone_dragonflies', function (Blueprint $table) { - $table->dropColumn('config_hash'); - }); - Schema::table('standalone_clickhouses', function (Blueprint $table) { - $table->dropColumn('config_hash'); - }); - Schema::table('services', function (Blueprint $table) { - $table->dropColumn('config_hash'); - }); - } -}; diff --git a/database/migrations/2024_04_15_094703_add_literal_variables.php b/database/migrations/2024_04_15_094703_add_literal_variables.php deleted file mode 100644 index c03194975c..0000000000 --- a/database/migrations/2024_04_15_094703_add_literal_variables.php +++ /dev/null @@ -1,34 +0,0 @@ -boolean('is_literal')->default(false); - }); - Schema::table('shared_environment_variables', function (Blueprint $table) { - $table->boolean('is_literal')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('environment_variables', function (Blueprint $table) { - $table->dropColumn('is_literal'); - }); - Schema::table('shared_environment_variables', function (Blueprint $table) { - $table->dropColumn('is_literal'); - }); - } -}; diff --git a/database/migrations/2024_04_16_083919_add_service_type_on_creation.php b/database/migrations/2024_04_16_083919_add_service_type_on_creation.php deleted file mode 100644 index ce91bddbb5..0000000000 --- a/database/migrations/2024_04_16_083919_add_service_type_on_creation.php +++ /dev/null @@ -1,28 +0,0 @@ -string('service_type')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('services', function (Blueprint $table) { - $table->dropColumn('service_type'); - }); - } -}; diff --git a/database/migrations/2024_04_17_132541_add_rollback_queues.php b/database/migrations/2024_04_17_132541_add_rollback_queues.php deleted file mode 100644 index 27865cf0db..0000000000 --- a/database/migrations/2024_04_17_132541_add_rollback_queues.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('rollback')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_deployment_queues', function (Blueprint $table) { - $table->dropColumn('rollback'); - }); - } -}; diff --git a/database/migrations/2024_04_25_073615_add_docker_network_to_application_settings.php b/database/migrations/2024_04_25_073615_add_docker_network_to_application_settings.php deleted file mode 100644 index bea410eab1..0000000000 --- a/database/migrations/2024_04_25_073615_add_docker_network_to_application_settings.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('connect_to_docker_network')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_settings', function (Blueprint $table) { - $table->dropColumn('connect_to_docker_network'); - }); - } -}; diff --git a/database/migrations/2024_04_29_111956_add_custom_hc_indicator_apps.php b/database/migrations/2024_04_29_111956_add_custom_hc_indicator_apps.php deleted file mode 100644 index b5a97f0ebd..0000000000 --- a/database/migrations/2024_04_29_111956_add_custom_hc_indicator_apps.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('custom_healthcheck_found')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('custom_healthcheck_found'); - }); - } -}; diff --git a/database/migrations/2024_05_06_093236_add_custom_name_to_application_settings.php b/database/migrations/2024_05_06_093236_add_custom_name_to_application_settings.php deleted file mode 100644 index e2d68d2401..0000000000 --- a/database/migrations/2024_05_06_093236_add_custom_name_to_application_settings.php +++ /dev/null @@ -1,28 +0,0 @@ -string('custom_internal_name')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_settings', function (Blueprint $table) { - $table->dropColumn('custom_internal_name'); - }); - } -}; diff --git a/database/migrations/2024_05_07_124019_add_server_metrics.php b/database/migrations/2024_05_07_124019_add_server_metrics.php deleted file mode 100644 index 40c74850bb..0000000000 --- a/database/migrations/2024_05_07_124019_add_server_metrics.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_metrics_enabled')->default(true); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('servers', function (Blueprint $table) { - $table->dropColumn('is_metrics_enabled'); - }); - } -}; diff --git a/database/migrations/2024_05_10_085215_make_stripe_comment_longer.php b/database/migrations/2024_05_10_085215_make_stripe_comment_longer.php deleted file mode 100644 index a51896f42d..0000000000 --- a/database/migrations/2024_05_10_085215_make_stripe_comment_longer.php +++ /dev/null @@ -1,28 +0,0 @@ -longText('stripe_comment')->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('subscriptions', function (Blueprint $table) { - $table->string('stripe_comment')->change(); - }); - } -}; diff --git a/database/migrations/2024_05_15_091757_add_commit_message_to_app_deployment_queue.php b/database/migrations/2024_05_15_091757_add_commit_message_to_app_deployment_queue.php deleted file mode 100644 index 78608f5038..0000000000 --- a/database/migrations/2024_05_15_091757_add_commit_message_to_app_deployment_queue.php +++ /dev/null @@ -1,28 +0,0 @@ -string('commit_message', 50)->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_deployment_queues', function (Blueprint $table) { - $table->dropColumn('commit_message'); - }); - } -}; diff --git a/database/migrations/2024_05_15_151236_add_container_escape_toggle.php b/database/migrations/2024_05_15_151236_add_container_escape_toggle.php deleted file mode 100644 index aa1384518b..0000000000 --- a/database/migrations/2024_05_15_151236_add_container_escape_toggle.php +++ /dev/null @@ -1,34 +0,0 @@ -boolean('is_container_label_escape_enabled')->default(true); - }); - Schema::table('services', function (Blueprint $table) { - $table->boolean('is_container_label_escape_enabled')->default(true); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_settings', function (Blueprint $table) { - $table->dropColumn('is_container_label_escape_enabled'); - }); - Schema::table('services', function (Blueprint $table) { - $table->dropColumn('is_container_label_escape_enabled'); - }); - } -}; diff --git a/database/migrations/2024_05_17_082012_add_env_sorting_toggle.php b/database/migrations/2024_05_17_082012_add_env_sorting_toggle.php deleted file mode 100644 index d4e120e2b4..0000000000 --- a/database/migrations/2024_05_17_082012_add_env_sorting_toggle.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_env_sorting_enabled')->default(true); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_settings', function (Blueprint $table) { - $table->dropColumn('is_env_sorting_enabled'); - }); - } -}; diff --git a/database/migrations/2024_05_21_125739_add_scheduled_tasks_notification_to_teams.php b/database/migrations/2024_05_21_125739_add_scheduled_tasks_notification_to_teams.php deleted file mode 100644 index 0fcbb06550..0000000000 --- a/database/migrations/2024_05_21_125739_add_scheduled_tasks_notification_to_teams.php +++ /dev/null @@ -1,34 +0,0 @@ -boolean('telegram_notifications_scheduled_tasks')->default(true); - $table->boolean('smtp_notifications_scheduled_tasks')->default(false)->after('smtp_notifications_status_changes'); - $table->boolean('discord_notifications_scheduled_tasks')->default(true)->after('discord_notifications_status_changes'); - $table->text('telegram_notifications_scheduled_tasks_thread_id')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('teams', function (Blueprint $table) { - $table->dropColumn('telegram_notifications_scheduled_tasks'); - $table->dropColumn('smtp_notifications_scheduled_tasks'); - $table->dropColumn('discord_notifications_scheduled_tasks'); - $table->dropColumn('telegram_notifications_scheduled_tasks_thread_id'); - }); - } -}; diff --git a/database/migrations/2024_05_22_103942_change_pre_post_deployment_commands_length_in_applications.php b/database/migrations/2024_05_22_103942_change_pre_post_deployment_commands_length_in_applications.php deleted file mode 100644 index 0803c97788..0000000000 --- a/database/migrations/2024_05_22_103942_change_pre_post_deployment_commands_length_in_applications.php +++ /dev/null @@ -1,30 +0,0 @@ -text('post_deployment_command')->nullable()->change(); - $table->text('pre_deployment_command')->nullable()->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->string('post_deployment_command')->nullable()->change(); - $table->string('pre_deployment_command')->nullable()->change(); - }); - } -}; diff --git a/database/migrations/2024_05_23_091713_add_gitea_webhook_to_applications.php b/database/migrations/2024_05_23_091713_add_gitea_webhook_to_applications.php deleted file mode 100644 index b46a072033..0000000000 --- a/database/migrations/2024_05_23_091713_add_gitea_webhook_to_applications.php +++ /dev/null @@ -1,28 +0,0 @@ -string('manual_webhook_secret_gitea')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('manual_webhook_secret_gitea'); - }); - } -}; diff --git a/database/migrations/2024_06_05_101019_add_docker_compose_pr_domains.php b/database/migrations/2024_06_05_101019_add_docker_compose_pr_domains.php deleted file mode 100644 index a4b8ea35b8..0000000000 --- a/database/migrations/2024_06_05_101019_add_docker_compose_pr_domains.php +++ /dev/null @@ -1,28 +0,0 @@ -text('docker_compose_domains')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_previews', function (Blueprint $table) { - $table->dropColumn('docker_compose_domains'); - }); - } -}; diff --git a/database/migrations/2024_06_06_103938_change_pr_issue_commend_id_type.php b/database/migrations/2024_06_06_103938_change_pr_issue_commend_id_type.php deleted file mode 100644 index c7d71203b8..0000000000 --- a/database/migrations/2024_06_06_103938_change_pr_issue_commend_id_type.php +++ /dev/null @@ -1,28 +0,0 @@ -string('pull_request_issue_comment_id')->nullable()->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_previews', function (Blueprint $table) { - $table->integer('pull_request_issue_comment_id')->nullable()->change(); - }); - } -}; diff --git a/database/migrations/2024_06_11_081614_add_www_non_www_redirect.php b/database/migrations/2024_06_11_081614_add_www_non_www_redirect.php deleted file mode 100644 index 231c09ceba..0000000000 --- a/database/migrations/2024_06_11_081614_add_www_non_www_redirect.php +++ /dev/null @@ -1,28 +0,0 @@ -enum('redirect', ['www', 'non-www', 'both'])->default('both')->after('domain'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('redirect'); - }); - } -}; diff --git a/database/migrations/2024_06_18_105948_move_server_metrics.php b/database/migrations/2024_06_18_105948_move_server_metrics.php deleted file mode 100644 index a6bccd16a1..0000000000 --- a/database/migrations/2024_06_18_105948_move_server_metrics.php +++ /dev/null @@ -1,40 +0,0 @@ -dropColumn('is_metrics_enabled'); - }); - Schema::table('server_settings', function (Blueprint $table) { - $table->boolean('is_metrics_enabled')->default(false); - $table->integer('metrics_refresh_rate_seconds')->default(5); - $table->integer('metrics_history_days')->default(30); - $table->string('metrics_token')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('servers', function (Blueprint $table) { - $table->boolean('is_metrics_enabled')->default(true); - }); - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('is_metrics_enabled'); - $table->dropColumn('metrics_refresh_rate_seconds'); - $table->dropColumn('metrics_history_days'); - $table->dropColumn('metrics_token'); - }); - } -}; diff --git a/database/migrations/2024_06_20_102551_add_server_api_sentinel.php b/database/migrations/2024_06_20_102551_add_server_api_sentinel.php deleted file mode 100644 index b840195af6..0000000000 --- a/database/migrations/2024_06_20_102551_add_server_api_sentinel.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_server_api_enabled')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('is_server_api_enabled'); - }); - } -}; diff --git a/database/migrations/2024_06_21_143358_add_api_deployment_type.php b/database/migrations/2024_06_21_143358_add_api_deployment_type.php deleted file mode 100644 index 03f4d47963..0000000000 --- a/database/migrations/2024_06_21_143358_add_api_deployment_type.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_api')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_deployment_queues', function (Blueprint $table) { - $table->dropColumn('is_api'); - }); - } -}; diff --git a/database/migrations/2024_06_22_081140_alter_instance_settings_add_instance_name.php b/database/migrations/2024_06_22_081140_alter_instance_settings_add_instance_name.php deleted file mode 100644 index 1687e047c0..0000000000 --- a/database/migrations/2024_06_22_081140_alter_instance_settings_add_instance_name.php +++ /dev/null @@ -1,28 +0,0 @@ -string('instance_name')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('instance_settings', function (Blueprint $table) { - $table->dropColumn('instance_name'); - }); - } -}; diff --git a/database/migrations/2024_06_25_184323_update_db.php b/database/migrations/2024_06_25_184323_update_db.php deleted file mode 100644 index d9cddb15f9..0000000000 --- a/database/migrations/2024_06_25_184323_update_db.php +++ /dev/null @@ -1,95 +0,0 @@ -dropColumn('docker_compose_pr_location'); - $table->dropColumn('docker_compose_pr'); - $table->dropColumn('docker_compose_pr_raw'); - }); - Schema::table('subscriptions', function (Blueprint $table) { - $table->dropColumn('lemon_subscription_id'); - $table->dropColumn('lemon_order_id'); - $table->dropColumn('lemon_product_id'); - $table->dropColumn('lemon_variant_id'); - $table->dropColumn('lemon_variant_name'); - $table->dropColumn('lemon_customer_id'); - $table->dropColumn('lemon_status'); - $table->dropColumn('lemon_renews_at'); - $table->dropColumn('lemon_update_payment_menthod_url'); - $table->dropColumn('lemon_trial_ends_at'); - $table->dropColumn('lemon_ends_at'); - }); - Schema::table('environment_variables', function (Blueprint $table) { - $table->string('uuid')->nullable()->after('id'); - }); - - EnvironmentVariable::all()->each(function (EnvironmentVariable $environmentVariable) { - $environmentVariable->update([ - 'uuid' => (string) new Cuid2, - ]); - }); - Schema::table('environment_variables', function (Blueprint $table) { - $table->string('uuid')->nullable(false)->change(); - }); - Schema::table('server_settings', function (Blueprint $table) { - $table->integer('metrics_history_days')->default(7)->change(); - }); - - DB::table('server_settings')->update(['metrics_history_days' => 7]); - } catch (\Exception $e) { - Log::error('Error updating db: '.$e->getMessage()); - } - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->string('docker_compose_pr_location')->nullable()->default('/docker-compose.yaml')->after('docker_compose_location'); - $table->longText('docker_compose_pr')->nullable()->after('docker_compose_location'); - $table->longText('docker_compose_pr_raw')->nullable()->after('docker_compose'); - }); - Schema::table('subscriptions', function (Blueprint $table) { - $table->string('lemon_subscription_id')->nullable()->after('stripe_subscription_id'); - $table->string('lemon_order_id')->nullable()->after('lemon_subscription_id'); - $table->string('lemon_product_id')->nullable()->after('lemon_order_id'); - $table->string('lemon_variant_id')->nullable()->after('lemon_product_id'); - $table->string('lemon_variant_name')->nullable()->after('lemon_variant_id'); - $table->string('lemon_customer_id')->nullable()->after('lemon_variant_name'); - $table->string('lemon_status')->nullable()->after('lemon_customer_id'); - $table->timestamp('lemon_renews_at')->nullable()->after('lemon_status'); - $table->string('lemon_update_payment_menthod_url')->nullable()->after('lemon_renews_at'); - $table->timestamp('lemon_trial_ends_at')->nullable()->after('lemon_update_payment_menthod_url'); - $table->timestamp('lemon_ends_at')->nullable()->after('lemon_trial_ends_at'); - }); - Schema::table('environment_variables', function (Blueprint $table) { - $table->dropColumn('uuid'); - }); - Schema::table('server_settings', function (Blueprint $table) { - $table->integer('metrics_history_days')->default(30)->change(); - }); - Server::all()->each(function (Server $server) { - $server->settings->update([ - 'metrics_history_days' => 30, - ]); - }); - } -}; diff --git a/database/migrations/2024_07_01_115528_add_is_api_allowed_and_iplist.php b/database/migrations/2024_07_01_115528_add_is_api_allowed_and_iplist.php deleted file mode 100644 index b319adb70e..0000000000 --- a/database/migrations/2024_07_01_115528_add_is_api_allowed_and_iplist.php +++ /dev/null @@ -1,24 +0,0 @@ -boolean('is_api_enabled')->default(true); - $table->text('allowed_ips')->nullable(); - }); - } - - public function down(): void - { - Schema::table('instance_settings', function (Blueprint $table) { - $table->dropColumn('is_api_enabled'); - $table->dropColumn('allowed_ips'); - }); - } -}; diff --git a/database/migrations/2024_07_05_120217_remove_unique_from_tag_names.php b/database/migrations/2024_07_05_120217_remove_unique_from_tag_names.php deleted file mode 100644 index 301de814bc..0000000000 --- a/database/migrations/2024_07_05_120217_remove_unique_from_tag_names.php +++ /dev/null @@ -1,28 +0,0 @@ -dropUnique(['name']); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('tags', function (Blueprint $table) { - $table->unique(['name']); - }); - } -}; diff --git a/database/migrations/2024_07_11_083719_application_compose_versions.php b/database/migrations/2024_07_11_083719_application_compose_versions.php deleted file mode 100644 index 9cdbb98d70..0000000000 --- a/database/migrations/2024_07_11_083719_application_compose_versions.php +++ /dev/null @@ -1,28 +0,0 @@ -string('compose_parsing_version')->default('1'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('compose_parsing_version'); - }); - } -}; diff --git a/database/migrations/2024_07_17_123828_add_is_container_labels_readonly.php b/database/migrations/2024_07_17_123828_add_is_container_labels_readonly.php deleted file mode 100644 index eb36946a48..0000000000 --- a/database/migrations/2024_07_17_123828_add_is_container_labels_readonly.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_container_label_readonly_enabled')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_settings', function (Blueprint $table) { - $table->dropColumn('is_container_label_readonly_enabled'); - }); - } -}; diff --git a/database/migrations/2024_07_18_110424_create_application_settings_is_preserve_repository_enabled.php b/database/migrations/2024_07_18_110424_create_application_settings_is_preserve_repository_enabled.php deleted file mode 100644 index 25dd0ef162..0000000000 --- a/database/migrations/2024_07_18_110424_create_application_settings_is_preserve_repository_enabled.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_preserve_repository_enabled')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_settings', function (Blueprint $table) { - $table->dropColumn('is_preserve_repository_enabled'); - }); - } -}; diff --git a/database/migrations/2024_07_18_123458_add_force_cleanup_server.php b/database/migrations/2024_07_18_123458_add_force_cleanup_server.php deleted file mode 100644 index ea3695b3f5..0000000000 --- a/database/migrations/2024_07_18_123458_add_force_cleanup_server.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_force_cleanup_enabled')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('is_force_cleanup_enabled'); - }); - } -}; diff --git a/database/migrations/2024_07_19_132617_disable_healtcheck_by_default.php b/database/migrations/2024_07_19_132617_disable_healtcheck_by_default.php deleted file mode 100644 index 5de50de0c1..0000000000 --- a/database/migrations/2024_07_19_132617_disable_healtcheck_by_default.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('health_check_enabled')->default(false)->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->boolean('health_check_enabled')->default(true)->change(); - }); - } -}; diff --git a/database/migrations/2024_07_23_112710_add_validation_logs_to_servers.php b/database/migrations/2024_07_23_112710_add_validation_logs_to_servers.php deleted file mode 100644 index d3293620ba..0000000000 --- a/database/migrations/2024_07_23_112710_add_validation_logs_to_servers.php +++ /dev/null @@ -1,28 +0,0 @@ -text('validation_logs')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('servers', function (Blueprint $table) { - $table->dropColumn('validation_logs'); - }); - } -}; diff --git a/database/migrations/2024_08_05_142659_add_update_frequency_settings.php b/database/migrations/2024_08_05_142659_add_update_frequency_settings.php deleted file mode 100644 index 0060b8d1d8..0000000000 --- a/database/migrations/2024_08_05_142659_add_update_frequency_settings.php +++ /dev/null @@ -1,32 +0,0 @@ -string('auto_update_frequency')->default('0 0 * * *'); - $table->string('update_check_frequency')->default('0 * * * *'); - $table->boolean('new_version_available')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('instance_settings', function (Blueprint $table) { - $table->dropColumn('update_check_frequency'); - $table->dropColumn('auto_update_frequency'); - $table->dropColumn('new_version_available'); - }); - } -}; diff --git a/database/migrations/2024_08_07_155324_add_proxy_label_chooser.php b/database/migrations/2024_08_07_155324_add_proxy_label_chooser.php deleted file mode 100644 index 7bc8a06572..0000000000 --- a/database/migrations/2024_08_07_155324_add_proxy_label_chooser.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('generate_exact_labels')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('generate_exact_labels'); - }); - } -}; diff --git a/database/migrations/2024_08_09_215659_add_server_cleanup_fields_to_server_settings_table.php b/database/migrations/2024_08_09_215659_add_server_cleanup_fields_to_server_settings_table.php deleted file mode 100644 index e3bdc68c60..0000000000 --- a/database/migrations/2024_08_09_215659_add_server_cleanup_fields_to_server_settings_table.php +++ /dev/null @@ -1,59 +0,0 @@ -boolean('force_docker_cleanup')->default(false); - $table->string('docker_cleanup_frequency')->default('*/10 * * * *'); - $table->integer('docker_cleanup_threshold')->default(80); - - // Remove old columns - $table->dropColumn('cleanup_after_percentage'); - $table->dropColumn('is_force_cleanup_enabled'); - }); - foreach ($serverSettings as $serverSetting) { - $serverSetting->force_docker_cleanup = $serverSetting->is_force_cleanup_enabled; - $serverSetting->docker_cleanup_threshold = $serverSetting->cleanup_after_percentage; - $serverSetting->save(); - } - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - $serverSettings = ServerSetting::all(); - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('force_docker_cleanup'); - $table->dropColumn('docker_cleanup_frequency'); - $table->dropColumn('docker_cleanup_threshold'); - - // Add back old columns - $table->integer('cleanup_after_percentage')->default(80); - $table->boolean('force_server_cleanup')->default(false); - $table->boolean('is_force_cleanup_enabled')->default(false); - }); - foreach ($serverSettings as $serverSetting) { - $serverSetting->is_force_cleanup_enabled = $serverSetting->force_docker_cleanup; - $serverSetting->cleanup_after_percentage = $serverSetting->docker_cleanup_threshold; - $serverSetting->save(); - } - } -} diff --git a/database/migrations/2024_08_12_131659_add_local_file_volume_based_on_git.php b/database/migrations/2024_08_12_131659_add_local_file_volume_based_on_git.php deleted file mode 100644 index d180c7ec23..0000000000 --- a/database/migrations/2024_08_12_131659_add_local_file_volume_based_on_git.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_based_on_git')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('local_file_volumes', function (Blueprint $table) { - $table->dropColumn('is_based_on_git'); - }); - } -}; diff --git a/database/migrations/2024_08_12_155023_add_timezone_to_server_and_instance_settings.php b/database/migrations/2024_08_12_155023_add_timezone_to_server_and_instance_settings.php deleted file mode 100644 index 5bc73a54ee..0000000000 --- a/database/migrations/2024_08_12_155023_add_timezone_to_server_and_instance_settings.php +++ /dev/null @@ -1,30 +0,0 @@ -string('server_timezone')->default(''); - }); - - Schema::table('instance_settings', function (Blueprint $table) { - $table->string('instance_timezone')->default('UTC'); - }); - } - - public function down() - { - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('server_timezone'); - }); - - Schema::table('instance_settings', function (Blueprint $table) { - $table->dropColumn('instance_timezone'); - }); - } -} diff --git a/database/migrations/2024_08_14_183120_add_order_to_environment_variables_table.php b/database/migrations/2024_08_14_183120_add_order_to_environment_variables_table.php deleted file mode 100644 index 5275358275..0000000000 --- a/database/migrations/2024_08_14_183120_add_order_to_environment_variables_table.php +++ /dev/null @@ -1,28 +0,0 @@ -integer('order')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('environment_variables', function (Blueprint $table) { - $table->dropColumn('order'); - }); - } -}; diff --git a/database/migrations/2024_08_15_115907_add_build_server_id_to_deployment_queue.php b/database/migrations/2024_08_15_115907_add_build_server_id_to_deployment_queue.php deleted file mode 100644 index da5f065a6b..0000000000 --- a/database/migrations/2024_08_15_115907_add_build_server_id_to_deployment_queue.php +++ /dev/null @@ -1,28 +0,0 @@ -integer('build_server_id')->nullable()->after('server_id'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_deployment_queues', function (Blueprint $table) { - $table->dropColumn('build_server_id'); - }); - } -}; diff --git a/database/migrations/2024_08_16_105649_add_custom_docker_options_to_dbs.php b/database/migrations/2024_08_16_105649_add_custom_docker_options_to_dbs.php deleted file mode 100644 index dbca8c10ab..0000000000 --- a/database/migrations/2024_08_16_105649_add_custom_docker_options_to_dbs.php +++ /dev/null @@ -1,70 +0,0 @@ -text('custom_docker_run_options')->nullable(); - }); - Schema::table('standalone_mysqls', function (Blueprint $table) { - $table->text('custom_docker_run_options')->nullable(); - }); - Schema::table('standalone_mariadbs', function (Blueprint $table) { - $table->text('custom_docker_run_options')->nullable(); - }); - Schema::table('standalone_redis', function (Blueprint $table) { - $table->text('custom_docker_run_options')->nullable(); - }); - Schema::table('standalone_clickhouses', function (Blueprint $table) { - $table->text('custom_docker_run_options')->nullable(); - }); - Schema::table('standalone_dragonflies', function (Blueprint $table) { - $table->text('custom_docker_run_options')->nullable(); - }); - Schema::table('standalone_keydbs', function (Blueprint $table) { - $table->text('custom_docker_run_options')->nullable(); - }); - Schema::table('standalone_mongodbs', function (Blueprint $table) { - $table->text('custom_docker_run_options')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('standalone_postgresqls', function (Blueprint $table) { - $table->dropColumn('custom_docker_run_options'); - }); - Schema::table('standalone_mysqls', function (Blueprint $table) { - $table->dropColumn('custom_docker_run_options'); - }); - Schema::table('standalone_mariadbs', function (Blueprint $table) { - $table->dropColumn('custom_docker_run_options'); - }); - Schema::table('standalone_redis', function (Blueprint $table) { - $table->dropColumn('custom_docker_run_options'); - }); - Schema::table('standalone_clickhouses', function (Blueprint $table) { - $table->dropColumn('custom_docker_run_options'); - }); - Schema::table('standalone_dragonflies', function (Blueprint $table) { - $table->dropColumn('custom_docker_run_options'); - }); - Schema::table('standalone_keydbs', function (Blueprint $table) { - $table->dropColumn('custom_docker_run_options'); - }); - Schema::table('standalone_mongodbs', function (Blueprint $table) { - $table->dropColumn('custom_docker_run_options'); - }); - } -}; diff --git a/database/migrations/2024_08_27_090528_add_compose_parsing_version_to_services.php b/database/migrations/2024_08_27_090528_add_compose_parsing_version_to_services.php deleted file mode 100644 index e8c0474d22..0000000000 --- a/database/migrations/2024_08_27_090528_add_compose_parsing_version_to_services.php +++ /dev/null @@ -1,28 +0,0 @@ -string('compose_parsing_version')->default('2'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('services', function (Blueprint $table) { - $table->dropColumn('compose_parsing_version'); - }); - } -}; diff --git a/database/migrations/2024_09_05_085700_add_helper_version_to_instance_settings.php b/database/migrations/2024_09_05_085700_add_helper_version_to_instance_settings.php deleted file mode 100644 index 53ecce0f1d..0000000000 --- a/database/migrations/2024_09_05_085700_add_helper_version_to_instance_settings.php +++ /dev/null @@ -1,28 +0,0 @@ -string('helper_version')->default('1.0.0'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('instance_settings', function (Blueprint $table) { - $table->dropColumn('helper_version'); - }); - } -}; diff --git a/database/migrations/2024_09_06_062534_change_server_cleanup_to_forced.php b/database/migrations/2024_09_06_062534_change_server_cleanup_to_forced.php deleted file mode 100644 index ad6e5bd9e3..0000000000 --- a/database/migrations/2024_09_06_062534_change_server_cleanup_to_forced.php +++ /dev/null @@ -1,37 +0,0 @@ -boolean('force_docker_cleanup')->default(true)->change(); - }); - $serverSettings = ServerSetting::all(); - foreach ($serverSettings as $serverSetting) { - if ($serverSetting->force_docker_cleanup === false) { - $serverSetting->force_docker_cleanup = true; - $serverSetting->docker_cleanup_frequency = '*/10 * * * *'; - $serverSetting->save(); - } - } - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('server_settings', function (Blueprint $table) { - $table->boolean('force_docker_cleanup')->default(false)->change(); - }); - } -}; diff --git a/database/migrations/2024_09_07_185402_change_cleanup_schedule.php b/database/migrations/2024_09_07_185402_change_cleanup_schedule.php deleted file mode 100644 index ea8861f9b5..0000000000 --- a/database/migrations/2024_09_07_185402_change_cleanup_schedule.php +++ /dev/null @@ -1,37 +0,0 @@ -string('docker_cleanup_frequency')->default('0 0 * * *')->change(); - }); - - $serverSettings = ServerSetting::all(); - foreach ($serverSettings as $serverSetting) { - if ($serverSetting->force_docker_cleanup && $serverSetting->docker_cleanup_frequency === '*/10 * * * *') { - $serverSetting->docker_cleanup_frequency = '0 0 * * *'; - $serverSetting->save(); - } - } - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('server_settings', function (Blueprint $table) { - $table->string('docker_cleanup_frequency')->default('*/10 * * * *')->change(); - }); - } -}; diff --git a/database/migrations/2024_09_08_130756_update_server_settings_default_timezone.php b/database/migrations/2024_09_08_130756_update_server_settings_default_timezone.php deleted file mode 100644 index 109bc40ef1..0000000000 --- a/database/migrations/2024_09_08_130756_update_server_settings_default_timezone.php +++ /dev/null @@ -1,28 +0,0 @@ -string('server_timezone')->default('UTC')->change(); - }); - - DB::table('server_settings') - ->whereNull('server_timezone') - ->orWhere('server_timezone', '') - ->update(['server_timezone' => 'UTC']); - } - - public function down() - { - Schema::table('server_settings', function (Blueprint $table) { - $table->string('server_timezone')->default('')->change(); - }); - } -} diff --git a/database/migrations/2024_09_16_111428_encrypt_existing_private_keys.php b/database/migrations/2024_09_16_111428_encrypt_existing_private_keys.php deleted file mode 100644 index e16181ac7e..0000000000 --- a/database/migrations/2024_09_16_111428_encrypt_existing_private_keys.php +++ /dev/null @@ -1,24 +0,0 @@ -chunkById(100, function ($keys) { - foreach ($keys as $key) { - DB::table('private_keys') - ->where('id', $key->id) - ->update(['private_key' => Crypt::encryptString($key->private_key)]); - } - }); - } catch (\Exception $e) { - echo 'Encrypting private keys failed.'; - echo $e->getMessage(); - } - } -} diff --git a/database/migrations/2024_09_17_111226_add_ssh_key_fingerprint_to_private_keys_table.php b/database/migrations/2024_09_17_111226_add_ssh_key_fingerprint_to_private_keys_table.php deleted file mode 100644 index dfce5682a4..0000000000 --- a/database/migrations/2024_09_17_111226_add_ssh_key_fingerprint_to_private_keys_table.php +++ /dev/null @@ -1,39 +0,0 @@ -string('fingerprint')->after('private_key')->nullable(); - }); - - try { - DB::table('private_keys')->chunkById(100, function ($keys) { - foreach ($keys as $key) { - $fingerprint = PrivateKey::generateFingerprint($key->private_key); - if ($fingerprint) { - $key->fingerprint = $fingerprint; - $key->save(); - } - } - }); - } catch (\Exception $e) { - echo 'Generating fingerprints failed.'; - echo $e->getMessage(); - } - } - - public function down() - { - Schema::table('private_keys', function (Blueprint $table) { - $table->dropColumn('fingerprint'); - }); - } -} diff --git a/database/migrations/2024_09_22_165240_add_advanced_options_to_cleanup_options_to_servers_settings_table.php b/database/migrations/2024_09_22_165240_add_advanced_options_to_cleanup_options_to_servers_settings_table.php deleted file mode 100644 index b3c58afe33..0000000000 --- a/database/migrations/2024_09_22_165240_add_advanced_options_to_cleanup_options_to_servers_settings_table.php +++ /dev/null @@ -1,24 +0,0 @@ -boolean('delete_unused_volumes')->default(false); - $table->boolean('delete_unused_networks')->default(false); - }); - } - - public function down() - { - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('delete_unused_volumes'); - $table->dropColumn('delete_unused_networks'); - }); - } -}; diff --git a/database/migrations/2024_09_26_083441_disable_api_by_default.php b/database/migrations/2024_09_26_083441_disable_api_by_default.php deleted file mode 100644 index d0803f751d..0000000000 --- a/database/migrations/2024_09_26_083441_disable_api_by_default.php +++ /dev/null @@ -1,18 +0,0 @@ -boolean('is_api_enabled')->default(false)->change(); - }); - } -}; diff --git a/database/migrations/2024_10_03_095427_add_dump_all_to_standalone_postgresqls.php b/database/migrations/2024_10_03_095427_add_dump_all_to_standalone_postgresqls.php deleted file mode 100644 index b1f301bd38..0000000000 --- a/database/migrations/2024_10_03_095427_add_dump_all_to_standalone_postgresqls.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('dump_all')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('scheduled_database_backups', function (Blueprint $table) { - $table->dropColumn('dump_all'); - }); - } -}; diff --git a/database/migrations/2024_10_10_081444_remove_constraint_from_service_applications_fqdn.php b/database/migrations/2024_10_10_081444_remove_constraint_from_service_applications_fqdn.php deleted file mode 100644 index feb144de68..0000000000 --- a/database/migrations/2024_10_10_081444_remove_constraint_from_service_applications_fqdn.php +++ /dev/null @@ -1,34 +0,0 @@ -dropUnique(['fqdn']); - }); - Schema::table('applications', function (Blueprint $table) { - $table->dropUnique(['fqdn']); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('service_applications', function (Blueprint $table) { - $table->unique('fqdn'); - }); - Schema::table('applications', function (Blueprint $table) { - $table->unique('fqdn'); - }); - } -}; diff --git a/database/migrations/2024_10_11_114331_add_required_env_variables.php b/database/migrations/2024_10_11_114331_add_required_env_variables.php deleted file mode 100644 index 4fde0c2bbf..0000000000 --- a/database/migrations/2024_10_11_114331_add_required_env_variables.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_required')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('environment_variables', function (Blueprint $table) { - $table->dropColumn('is_required'); - }); - } -}; diff --git a/database/migrations/2024_10_14_090416_update_metrics_token_in_server_settings.php b/database/migrations/2024_10_14_090416_update_metrics_token_in_server_settings.php deleted file mode 100644 index d5c38501f1..0000000000 --- a/database/migrations/2024_10_14_090416_update_metrics_token_in_server_settings.php +++ /dev/null @@ -1,54 +0,0 @@ -dropColumn('metrics_token'); - $table->dropColumn('metrics_refresh_rate_seconds'); - $table->dropColumn('metrics_history_days'); - $table->dropColumn('is_server_api_enabled'); - - $table->boolean('is_sentinel_enabled')->default(false); - $table->text('sentinel_token')->nullable(); - $table->integer('sentinel_metrics_refresh_rate_seconds')->default(10); - $table->integer('sentinel_metrics_history_days')->default(7); - $table->integer('sentinel_push_interval_seconds')->default(60); - $table->string('sentinel_custom_url')->nullable(); - }); - Schema::table('servers', function (Blueprint $table) { - $table->dateTime('sentinel_updated_at')->default(now()); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('server_settings', function (Blueprint $table) { - $table->string('metrics_token')->nullable(); - $table->integer('metrics_refresh_rate_seconds')->default(5); - $table->integer('metrics_history_days')->default(30); - $table->boolean('is_server_api_enabled')->default(false); - - $table->dropColumn('is_sentinel_enabled'); - $table->dropColumn('sentinel_token'); - $table->dropColumn('sentinel_metrics_refresh_rate_seconds'); - $table->dropColumn('sentinel_metrics_history_days'); - $table->dropColumn('sentinel_push_interval_seconds'); - $table->dropColumn('sentinel_custom_url'); - }); - Schema::table('servers', function (Blueprint $table) { - $table->dropColumn('sentinel_updated_at'); - }); - } -}; diff --git a/database/migrations/2024_10_15_172139_add_is_shared_to_environment_variables.php b/database/migrations/2024_10_15_172139_add_is_shared_to_environment_variables.php deleted file mode 100644 index eb878e2f6b..0000000000 --- a/database/migrations/2024_10_15_172139_add_is_shared_to_environment_variables.php +++ /dev/null @@ -1,22 +0,0 @@ -boolean('is_shared')->default(false); - }); - } - - public function down() - { - Schema::table('environment_variables', function (Blueprint $table) { - $table->dropColumn('is_shared'); - }); - } -} diff --git a/database/migrations/2024_10_16_120026_move_redis_password_to_envs.php b/database/migrations/2024_10_16_120026_move_redis_password_to_envs.php deleted file mode 100644 index fa01e8e85b..0000000000 --- a/database/migrations/2024_10_16_120026_move_redis_password_to_envs.php +++ /dev/null @@ -1,41 +0,0 @@ -where('id', $redis->id)->value('redis_password'); - EnvironmentVariable::create([ - 'standalone_redis_id' => $redis->id, - 'key' => 'REDIS_PASSWORD', - 'value' => $redis_password, - ]); - EnvironmentVariable::create([ - 'standalone_redis_id' => $redis->id, - 'key' => 'REDIS_USERNAME', - 'value' => 'default', - ]); - } - }); - Schema::table('standalone_redis', function (Blueprint $table) { - $table->dropColumn('redis_password'); - }); - } catch (\Exception $e) { - echo 'Moving Redis passwords to envs failed.'; - echo $e->getMessage(); - } - } -} diff --git a/database/migrations/2024_10_16_192133_add_confirmation_settings_to_instance_settings_table.php b/database/migrations/2024_10_16_192133_add_confirmation_settings_to_instance_settings_table.php deleted file mode 100644 index 7040daf44a..0000000000 --- a/database/migrations/2024_10_16_192133_add_confirmation_settings_to_instance_settings_table.php +++ /dev/null @@ -1,22 +0,0 @@ -boolean('disable_two_step_confirmation')->default(false); - }); - } - - public function down() - { - Schema::table('instance_settings', function (Blueprint $table) { - $table->dropColumn('disable_two_step_confirmation'); - }); - } -}; diff --git a/database/migrations/2024_10_17_093722_add_soft_delete_to_servers.php b/database/migrations/2024_10_17_093722_add_soft_delete_to_servers.php deleted file mode 100644 index 7a7f28e249..0000000000 --- a/database/migrations/2024_10_17_093722_add_soft_delete_to_servers.php +++ /dev/null @@ -1,28 +0,0 @@ -softDeletes(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('servers', function (Blueprint $table) { - $table->dropSoftDeletes(); - }); - } -}; diff --git a/database/migrations/2024_10_22_105745_add_server_disk_usage_threshold.php b/database/migrations/2024_10_22_105745_add_server_disk_usage_threshold.php deleted file mode 100644 index 76ccd13529..0000000000 --- a/database/migrations/2024_10_22_105745_add_server_disk_usage_threshold.php +++ /dev/null @@ -1,28 +0,0 @@ -integer('server_disk_usage_notification_threshold')->default(80)->after('docker_cleanup_threshold'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('server_disk_usage_notification_threshold'); - }); - } -}; diff --git a/database/migrations/2024_10_22_121223_add_server_disk_usage_notification.php b/database/migrations/2024_10_22_121223_add_server_disk_usage_notification.php deleted file mode 100644 index a2aa381b7e..0000000000 --- a/database/migrations/2024_10_22_121223_add_server_disk_usage_notification.php +++ /dev/null @@ -1,32 +0,0 @@ -boolean('discord_notifications_server_disk_usage')->default(true)->after('discord_enabled'); - $table->boolean('smtp_notifications_server_disk_usage')->default(true)->after('smtp_enabled'); - $table->boolean('telegram_notifications_server_disk_usage')->default(true)->after('telegram_enabled'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('teams', function (Blueprint $table) { - $table->dropColumn('discord_notifications_server_disk_usage'); - $table->dropColumn('smtp_notifications_server_disk_usage'); - $table->dropColumn('telegram_notifications_server_disk_usage'); - }); - } -}; diff --git a/database/migrations/2024_10_29_093927_add_is_sentinel_debug_enabled_to_server_settings.php b/database/migrations/2024_10_29_093927_add_is_sentinel_debug_enabled_to_server_settings.php deleted file mode 100644 index d8ab1313bf..0000000000 --- a/database/migrations/2024_10_29_093927_add_is_sentinel_debug_enabled_to_server_settings.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('is_sentinel_debug_enabled')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('is_sentinel_debug_enabled'); - }); - } -}; diff --git a/database/migrations/2024_10_30_074601_rename_token_permissions.php b/database/migrations/2024_10_30_074601_rename_token_permissions.php deleted file mode 100644 index 69d774d7f7..0000000000 --- a/database/migrations/2024_10_30_074601_rename_token_permissions.php +++ /dev/null @@ -1,60 +0,0 @@ -abilities)) { - $abilities->push('root'); - } - if (in_array('read-only', $token->abilities)) { - $abilities->push('read'); - } - if (in_array('view:sensitive', $token->abilities)) { - $abilities->push('read', 'read:sensitive'); - } - $token->abilities = $abilities->unique()->values()->all(); - $token->save(); - } - } catch (\Exception $e) { - \Log::error('Error renaming token permissions: '.$e->getMessage()); - } - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - try { - $tokens = PersonalAccessToken::all(); - foreach ($tokens as $token) { - $abilities = collect(); - if (in_array('root', $token->abilities)) { - $abilities->push('*'); - } else { - if (in_array('read', $token->abilities)) { - $abilities->push('read-only'); - } - if (in_array('read:sensitive', $token->abilities)) { - $abilities->push('view:sensitive'); - } - } - $token->abilities = $abilities->unique()->values()->all(); - $token->save(); - } - } catch (\Exception $e) { - \Log::error('Error renaming token permissions: '.$e->getMessage()); - } - } -}; diff --git a/database/migrations/2024_11_02_213214_add_last_online_at_to_resources.php b/database/migrations/2024_11_02_213214_add_last_online_at_to_resources.php deleted file mode 100644 index 51b8fb3ba8..0000000000 --- a/database/migrations/2024_11_02_213214_add_last_online_at_to_resources.php +++ /dev/null @@ -1,96 +0,0 @@ -timestamp('last_online_at')->default(now())->after('updated_at'); - }); - Schema::table('application_previews', function (Blueprint $table) { - $table->timestamp('last_online_at')->default(now())->after('updated_at'); - }); - Schema::table('service_applications', function (Blueprint $table) { - $table->timestamp('last_online_at')->default(now())->after('updated_at'); - }); - Schema::table('service_databases', function (Blueprint $table) { - $table->timestamp('last_online_at')->default(now())->after('updated_at'); - }); - Schema::table('standalone_postgresqls', function (Blueprint $table) { - $table->timestamp('last_online_at')->default(now())->after('updated_at'); - }); - Schema::table('standalone_redis', function (Blueprint $table) { - $table->timestamp('last_online_at')->default(now())->after('updated_at'); - }); - Schema::table('standalone_mongodbs', function (Blueprint $table) { - $table->timestamp('last_online_at')->default(now())->after('updated_at'); - }); - Schema::table('standalone_mysqls', function (Blueprint $table) { - $table->timestamp('last_online_at')->default(now())->after('updated_at'); - }); - Schema::table('standalone_mariadbs', function (Blueprint $table) { - $table->timestamp('last_online_at')->default(now())->after('updated_at'); - }); - Schema::table('standalone_keydbs', function (Blueprint $table) { - $table->timestamp('last_online_at')->default(now())->after('updated_at'); - }); - Schema::table('standalone_dragonflies', function (Blueprint $table) { - $table->timestamp('last_online_at')->default(now())->after('updated_at'); - }); - Schema::table('standalone_clickhouses', function (Blueprint $table) { - $table->timestamp('last_online_at')->default(now())->after('updated_at'); - }); - - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('last_online_at'); - }); - Schema::table('application_previews', function (Blueprint $table) { - $table->dropColumn('last_online_at'); - }); - Schema::table('service_applications', function (Blueprint $table) { - $table->dropColumn('last_online_at'); - }); - Schema::table('service_databases', function (Blueprint $table) { - $table->dropColumn('last_online_at'); - }); - Schema::table('standalone_postgresqls', function (Blueprint $table) { - $table->dropColumn('last_online_at'); - }); - Schema::table('standalone_redis', function (Blueprint $table) { - $table->dropColumn('last_online_at'); - }); - Schema::table('standalone_mongodbs', function (Blueprint $table) { - $table->dropColumn('last_online_at'); - }); - Schema::table('standalone_mysqls', function (Blueprint $table) { - $table->dropColumn('last_online_at'); - }); - Schema::table('standalone_mariadbs', function (Blueprint $table) { - $table->dropColumn('last_online_at'); - }); - Schema::table('standalone_keydbs', function (Blueprint $table) { - $table->dropColumn('last_online_at'); - }); - Schema::table('standalone_dragonflies', function (Blueprint $table) { - $table->dropColumn('last_online_at'); - }); - Schema::table('standalone_clickhouses', function (Blueprint $table) { - $table->dropColumn('last_online_at'); - }); - - } -}; diff --git a/database/migrations/2024_11_11_125335_add_custom_nginx_configuration_to_static.php b/database/migrations/2024_11_11_125335_add_custom_nginx_configuration_to_static.php deleted file mode 100644 index 1c6e2daa02..0000000000 --- a/database/migrations/2024_11_11_125335_add_custom_nginx_configuration_to_static.php +++ /dev/null @@ -1,28 +0,0 @@ -longText('custom_nginx_configuration')->nullable()->after('static_image'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('custom_nginx_configuration'); - }); - } -}; diff --git a/database/migrations/2024_11_11_125366_add_index_to_activity_log.php b/database/migrations/2024_11_11_125366_add_index_to_activity_log.php deleted file mode 100644 index 0c281ff402..0000000000 --- a/database/migrations/2024_11_11_125366_add_index_to_activity_log.php +++ /dev/null @@ -1,28 +0,0 @@ -getMessage()); - } - } - - public function down() - { - try { - DB::statement('DROP INDEX IF EXISTS idx_activity_type_uuid'); - DB::statement('ALTER TABLE activity_log ALTER COLUMN properties TYPE json USING properties::json'); - } catch (\Exception $e) { - Log::error('Error dropping index from activity_log: '.$e->getMessage()); - } - } -} diff --git a/database/migrations/2024_11_22_124742_add_uuid_to_environments_table.php b/database/migrations/2024_11_22_124742_add_uuid_to_environments_table.php deleted file mode 100644 index b106427afe..0000000000 --- a/database/migrations/2024_11_22_124742_add_uuid_to_environments_table.php +++ /dev/null @@ -1,38 +0,0 @@ -string('uuid')->after('id')->nullable()->unique(); - }); - - DB::table('environments') - ->whereNull('uuid') - ->chunkById(100, function ($environments) { - foreach ($environments as $environment) { - DB::table('environments') - ->where('id', $environment->id) - ->update(['uuid' => (string) new Cuid2]); - } - }); - - Schema::table('environments', function (Blueprint $table) { - $table->string('uuid')->nullable(false)->change(); - }); - } - - public function down(): void - { - Schema::table('environments', function (Blueprint $table) { - $table->dropColumn('uuid'); - }); - } -}; diff --git a/database/migrations/2024_12_05_091823_add_disable_build_cache_advanced_option.php b/database/migrations/2024_12_05_091823_add_disable_build_cache_advanced_option.php deleted file mode 100644 index 751342302d..0000000000 --- a/database/migrations/2024_12_05_091823_add_disable_build_cache_advanced_option.php +++ /dev/null @@ -1,22 +0,0 @@ -boolean('disable_build_cache')->default(false); - }); - } - - public function down(): void - { - Schema::table('application_settings', function (Blueprint $table) { - $table->dropColumn('disable_build_cache'); - }); - } -}; diff --git a/database/migrations/2024_12_05_212355_create_email_notification_settings_table.php b/database/migrations/2024_12_05_212355_create_email_notification_settings_table.php deleted file mode 100644 index 7338a8d0d2..0000000000 --- a/database/migrations/2024_12_05_212355_create_email_notification_settings_table.php +++ /dev/null @@ -1,58 +0,0 @@ -id(); - $table->foreignId('team_id')->constrained()->cascadeOnDelete(); - - $table->boolean('smtp_enabled')->default(false); - $table->text('smtp_from_address')->nullable(); - $table->text('smtp_from_name')->nullable(); - $table->text('smtp_recipients')->nullable(); - $table->text('smtp_host')->nullable(); - $table->integer('smtp_port')->nullable(); - $table->string('smtp_encryption')->nullable(); - $table->text('smtp_username')->nullable(); - $table->text('smtp_password')->nullable(); - $table->integer('smtp_timeout')->nullable(); - - $table->boolean('resend_enabled')->default(false); - $table->text('resend_api_key')->nullable(); - - $table->boolean('use_instance_email_settings')->default(false); - - $table->boolean('deployment_success_email_notifications')->default(false); - $table->boolean('deployment_failure_email_notifications')->default(true); - $table->boolean('status_change_email_notifications')->default(false); - $table->boolean('backup_success_email_notifications')->default(false); - $table->boolean('backup_failure_email_notifications')->default(true); - $table->boolean('scheduled_task_success_email_notifications')->default(false); - $table->boolean('scheduled_task_failure_email_notifications')->default(true); - $table->boolean('docker_cleanup_success_email_notifications')->default(false); - $table->boolean('docker_cleanup_failure_email_notifications')->default(true); - $table->boolean('server_disk_usage_email_notifications')->default(true); - $table->boolean('server_reachable_email_notifications')->default(false); - $table->boolean('server_unreachable_email_notifications')->default(true); - - $table->unique(['team_id']); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('email_notification_settings'); - } -}; diff --git a/database/migrations/2024_12_05_212416_create_discord_notification_settings_table.php b/database/migrations/2024_12_05_212416_create_discord_notification_settings_table.php deleted file mode 100644 index 0f2ced67f0..0000000000 --- a/database/migrations/2024_12_05_212416_create_discord_notification_settings_table.php +++ /dev/null @@ -1,45 +0,0 @@ -id(); - $table->foreignId('team_id')->constrained()->cascadeOnDelete(); - - $table->boolean('discord_enabled')->default(false); - $table->text('discord_webhook_url')->nullable(); - - $table->boolean('deployment_success_discord_notifications')->default(false); - $table->boolean('deployment_failure_discord_notifications')->default(true); - $table->boolean('status_change_discord_notifications')->default(false); - $table->boolean('backup_success_discord_notifications')->default(false); - $table->boolean('backup_failure_discord_notifications')->default(true); - $table->boolean('scheduled_task_success_discord_notifications')->default(false); - $table->boolean('scheduled_task_failure_discord_notifications')->default(true); - $table->boolean('docker_cleanup_success_discord_notifications')->default(false); - $table->boolean('docker_cleanup_failure_discord_notifications')->default(true); - $table->boolean('server_disk_usage_discord_notifications')->default(true); - $table->boolean('server_reachable_discord_notifications')->default(false); - $table->boolean('server_unreachable_discord_notifications')->default(true); - - $table->unique(['team_id']); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('discord_notification_settings'); - } -}; diff --git a/database/migrations/2024_12_05_212440_create_telegram_notification_settings_table.php b/database/migrations/2024_12_05_212440_create_telegram_notification_settings_table.php deleted file mode 100644 index db4d998e37..0000000000 --- a/database/migrations/2024_12_05_212440_create_telegram_notification_settings_table.php +++ /dev/null @@ -1,59 +0,0 @@ -id(); - $table->foreignId('team_id')->constrained()->cascadeOnDelete(); - - $table->boolean('telegram_enabled')->default(false); - $table->text('telegram_token')->nullable(); - $table->text('telegram_chat_id')->nullable(); - - $table->boolean('deployment_success_telegram_notifications')->default(false); - $table->boolean('deployment_failure_telegram_notifications')->default(true); - $table->boolean('status_change_telegram_notifications')->default(false); - $table->boolean('backup_success_telegram_notifications')->default(false); - $table->boolean('backup_failure_telegram_notifications')->default(true); - $table->boolean('scheduled_task_success_telegram_notifications')->default(false); - $table->boolean('scheduled_task_failure_telegram_notifications')->default(true); - $table->boolean('docker_cleanup_success_telegram_notifications')->default(false); - $table->boolean('docker_cleanup_failure_telegram_notifications')->default(true); - $table->boolean('server_disk_usage_telegram_notifications')->default(true); - $table->boolean('server_reachable_telegram_notifications')->default(false); - $table->boolean('server_unreachable_telegram_notifications')->default(true); - - $table->text('telegram_notifications_deployment_success_thread_id')->nullable(); - $table->text('telegram_notifications_deployment_failure_thread_id')->nullable(); - $table->text('telegram_notifications_status_change_thread_id')->nullable(); - $table->text('telegram_notifications_backup_success_thread_id')->nullable(); - $table->text('telegram_notifications_backup_failure_thread_id')->nullable(); - $table->text('telegram_notifications_scheduled_task_success_thread_id')->nullable(); - $table->text('telegram_notifications_scheduled_task_failure_thread_id')->nullable(); - $table->text('telegram_notifications_docker_cleanup_success_thread_id')->nullable(); - $table->text('telegram_notifications_docker_cleanup_failure_thread_id')->nullable(); - $table->text('telegram_notifications_server_disk_usage_thread_id')->nullable(); - $table->text('telegram_notifications_server_reachable_thread_id')->nullable(); - $table->text('telegram_notifications_server_unreachable_thread_id')->nullable(); - - $table->unique(['team_id']); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('telegram_notification_settings'); - } -}; diff --git a/database/migrations/2024_12_05_212546_migrate_email_notification_settings_from_teams_table.php b/database/migrations/2024_12_05_212546_migrate_email_notification_settings_from_teams_table.php deleted file mode 100644 index 384f62f065..0000000000 --- a/database/migrations/2024_12_05_212546_migrate_email_notification_settings_from_teams_table.php +++ /dev/null @@ -1,135 +0,0 @@ -get(); - - foreach ($teams as $team) { - try { - DB::table('email_notification_settings')->updateOrInsert( - ['team_id' => $team->id], - [ - 'smtp_enabled' => $team->smtp_enabled ?? false, - 'smtp_from_address' => $team->smtp_from_address ? Crypt::encryptString($team->smtp_from_address) : null, - 'smtp_from_name' => $team->smtp_from_name ? Crypt::encryptString($team->smtp_from_name) : null, - 'smtp_recipients' => $team->smtp_recipients ? Crypt::encryptString($team->smtp_recipients) : null, - 'smtp_host' => $team->smtp_host ? Crypt::encryptString($team->smtp_host) : null, - 'smtp_port' => $team->smtp_port, - 'smtp_encryption' => $team->smtp_encryption, - 'smtp_username' => $team->smtp_username ? Crypt::encryptString($team->smtp_username) : null, - 'smtp_password' => $team->smtp_password, - 'smtp_timeout' => $team->smtp_timeout, - - 'use_instance_email_settings' => $team->use_instance_email_settings ?? false, - - 'resend_enabled' => $team->resend_enabled ?? false, - 'resend_api_key' => $team->resend_api_key, - - 'deployment_success_email_notifications' => $team->smtp_notifications_deployments ?? false, - 'deployment_failure_email_notifications' => $team->smtp_notifications_deployments ?? true, - 'backup_success_email_notifications' => $team->smtp_notifications_database_backups ?? false, - 'backup_failure_email_notifications' => $team->smtp_notifications_database_backups ?? true, - 'scheduled_task_success_email_notifications' => $team->smtp_notifications_scheduled_tasks ?? false, - 'scheduled_task_failure_email_notifications' => $team->smtp_notifications_scheduled_tasks ?? true, - 'status_change_email_notifications' => $team->smtp_notifications_status_changes ?? false, - 'server_disk_usage_email_notifications' => $team->smtp_notifications_server_disk_usage ?? true, - ] - ); - } catch (Exception $e) { - \Log::error('Error migrating email notification settings from teams table: '.$e->getMessage()); - } - } - - Schema::table('teams', function (Blueprint $table) { - $table->dropColumn([ - 'smtp_enabled', - 'smtp_from_address', - 'smtp_from_name', - 'smtp_recipients', - 'smtp_host', - 'smtp_port', - 'smtp_encryption', - 'smtp_username', - 'smtp_password', - 'smtp_timeout', - 'use_instance_email_settings', - 'resend_enabled', - 'resend_api_key', - 'smtp_notifications_test', - 'smtp_notifications_deployments', - 'smtp_notifications_database_backups', - 'smtp_notifications_scheduled_tasks', - 'smtp_notifications_status_changes', - 'smtp_notifications_server_disk_usage', - ]); - }); - } - - public function down(): void - { - Schema::table('teams', function (Blueprint $table) { - $table->boolean('smtp_enabled')->default(false); - $table->string('smtp_from_address')->nullable(); - $table->string('smtp_from_name')->nullable(); - $table->string('smtp_recipients')->nullable(); - $table->string('smtp_host')->nullable(); - $table->integer('smtp_port')->nullable(); - $table->string('smtp_encryption')->nullable(); - $table->text('smtp_username')->nullable(); - $table->text('smtp_password')->nullable(); - $table->integer('smtp_timeout')->nullable(); - - $table->boolean('use_instance_email_settings')->default(false); - $table->boolean('resend_enabled')->default(false); - - $table->text('resend_api_key')->nullable(); - - $table->boolean('smtp_notifications_test')->default(false); - $table->boolean('smtp_notifications_deployments')->default(false); - $table->boolean('smtp_notifications_database_backups')->default(true); - $table->boolean('smtp_notifications_scheduled_tasks')->default(false); - $table->boolean('smtp_notifications_status_changes')->default(false); - $table->boolean('smtp_notifications_server_disk_usage')->default(true); - }); - - $settings = DB::table('email_notification_settings')->get(); - foreach ($settings as $setting) { - try { - DB::table('teams') - ->where('id', $setting->team_id) - ->update([ - 'smtp_enabled' => $setting->smtp_enabled, - 'smtp_from_address' => $setting->smtp_from_address ? Crypt::decryptString($setting->smtp_from_address) : null, - 'smtp_from_name' => $setting->smtp_from_name ? Crypt::decryptString($setting->smtp_from_name) : null, - 'smtp_recipients' => $setting->smtp_recipients ? Crypt::decryptString($setting->smtp_recipients) : null, - 'smtp_host' => $setting->smtp_host ? Crypt::decryptString($setting->smtp_host) : null, - 'smtp_port' => $setting->smtp_port, - 'smtp_encryption' => $setting->smtp_encryption, - 'smtp_username' => $setting->smtp_username ? Crypt::decryptString($setting->smtp_username) : null, - 'smtp_password' => $setting->smtp_password, - 'smtp_timeout' => $setting->smtp_timeout, - - 'use_instance_email_settings' => $setting->use_instance_email_settings, - - 'resend_enabled' => $setting->resend_enabled, - 'resend_api_key' => $setting->resend_api_key, - - 'smtp_notifications_deployments' => $setting->deployment_success_email_notifications || $setting->deployment_failure_email_notifications, - 'smtp_notifications_database_backups' => $setting->backup_success_email_notifications || $setting->backup_failure_email_notifications, - 'smtp_notifications_scheduled_tasks' => $setting->scheduled_task_success_email_notifications || $setting->scheduled_task_failure_email_notifications, - 'smtp_notifications_status_changes' => $setting->status_change_email_notifications, - ]); - } catch (Exception $e) { - \Log::error('Error migrating email notification settings from teams table: '.$e->getMessage()); - } - } - } -}; diff --git a/database/migrations/2024_12_05_212631_migrate_discord_notification_settings_from_teams_table.php b/database/migrations/2024_12_05_212631_migrate_discord_notification_settings_from_teams_table.php deleted file mode 100644 index ed9e9af82a..0000000000 --- a/database/migrations/2024_12_05_212631_migrate_discord_notification_settings_from_teams_table.php +++ /dev/null @@ -1,92 +0,0 @@ -get(); - - foreach ($teams as $team) { - try { - DB::table('discord_notification_settings')->updateOrInsert( - ['team_id' => $team->id], - [ - 'discord_enabled' => $team->discord_enabled ?? false, - 'discord_webhook_url' => $team->discord_webhook_url ? Crypt::encryptString($team->discord_webhook_url) : null, - - 'deployment_success_discord_notifications' => $team->discord_notifications_deployments ?? false, - 'deployment_failure_discord_notifications' => $team->discord_notifications_deployments ?? true, - 'backup_success_discord_notifications' => $team->discord_notifications_database_backups ?? false, - 'backup_failure_discord_notifications' => $team->discord_notifications_database_backups ?? true, - 'scheduled_task_success_discord_notifications' => $team->discord_notifications_scheduled_tasks ?? false, - 'scheduled_task_failure_discord_notifications' => $team->discord_notifications_scheduled_tasks ?? true, - 'status_change_discord_notifications' => $team->discord_notifications_status_changes ?? false, - 'server_disk_usage_discord_notifications' => $team->discord_notifications_server_disk_usage ?? true, - ] - ); - } catch (Exception $e) { - \Log::error('Error migrating discord notification settings from teams table: '.$e->getMessage()); - } - } - - Schema::table('teams', function (Blueprint $table) { - $table->dropColumn([ - 'discord_enabled', - 'discord_webhook_url', - 'discord_notifications_test', - 'discord_notifications_deployments', - 'discord_notifications_status_changes', - 'discord_notifications_database_backups', - 'discord_notifications_scheduled_tasks', - 'discord_notifications_server_disk_usage', - ]); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('teams', function (Blueprint $table) { - $table->boolean('discord_enabled')->default(false); - $table->string('discord_webhook_url')->nullable(); - - $table->boolean('discord_notifications_test')->default(true); - $table->boolean('discord_notifications_deployments')->default(true); - $table->boolean('discord_notifications_status_changes')->default(true); - $table->boolean('discord_notifications_database_backups')->default(true); - $table->boolean('discord_notifications_scheduled_tasks')->default(true); - $table->boolean('discord_notifications_server_disk_usage')->default(true); - }); - - $settings = DB::table('discord_notification_settings')->get(); - foreach ($settings as $setting) { - try { - DB::table('teams') - ->where('id', $setting->team_id) - ->update([ - 'discord_enabled' => $setting->discord_enabled, - 'discord_webhook_url' => Crypt::decryptString($setting->discord_webhook_url), - - 'discord_notifications_deployments' => $setting->deployment_success_discord_notifications || $setting->deployment_failure_discord_notifications, - 'discord_notifications_status_changes' => $setting->status_change_discord_notifications, - 'discord_notifications_database_backups' => $setting->backup_success_discord_notifications || $setting->backup_failure_discord_notifications, - 'discord_notifications_scheduled_tasks' => $setting->scheduled_task_success_discord_notifications || $setting->scheduled_task_failure_discord_notifications, - 'discord_notifications_server_disk_usage' => $setting->server_disk_usage_discord_notifications, - ]); - } catch (Exception $e) { - \Log::error('Error migrating discord notification settings from teams table: '.$e->getMessage()); - } - } - } -}; diff --git a/database/migrations/2024_12_05_212705_migrate_telegram_notification_settings_from_teams_table.php b/database/migrations/2024_12_05_212705_migrate_telegram_notification_settings_from_teams_table.php deleted file mode 100644 index df120e2733..0000000000 --- a/database/migrations/2024_12_05_212705_migrate_telegram_notification_settings_from_teams_table.php +++ /dev/null @@ -1,115 +0,0 @@ -get(); - - foreach ($teams as $team) { - try { - DB::table('telegram_notification_settings')->updateOrInsert( - ['team_id' => $team->id], - [ - 'telegram_enabled' => $team->telegram_enabled ?? false, - 'telegram_token' => $team->telegram_token ? Crypt::encryptString($team->telegram_token) : null, - 'telegram_chat_id' => $team->telegram_chat_id ? Crypt::encryptString($team->telegram_chat_id) : null, - - 'deployment_success_telegram_notifications' => $team->telegram_notifications_deployments ?? false, - 'deployment_failure_telegram_notifications' => $team->telegram_notifications_deployments ?? true, - 'backup_success_telegram_notifications' => $team->telegram_notifications_database_backups ?? false, - 'backup_failure_telegram_notifications' => $team->telegram_notifications_database_backups ?? true, - 'scheduled_task_success_telegram_notifications' => $team->telegram_notifications_scheduled_tasks ?? false, - 'scheduled_task_failure_telegram_notifications' => $team->telegram_notifications_scheduled_tasks ?? true, - 'status_change_telegram_notifications' => $team->telegram_notifications_status_changes ?? false, - 'server_disk_usage_telegram_notifications' => $team->telegram_notifications_server_disk_usage ?? true, - - 'telegram_notifications_deployment_success_thread_id' => $team->telegram_notifications_deployments_message_thread_id ? Crypt::encryptString($team->telegram_notifications_deployments_message_thread_id) : null, - 'telegram_notifications_deployment_failure_thread_id' => $team->telegram_notifications_deployments_message_thread_id ? Crypt::encryptString($team->telegram_notifications_deployments_message_thread_id) : null, - 'telegram_notifications_backup_success_thread_id' => $team->telegram_notifications_database_backups_message_thread_id ? Crypt::encryptString($team->telegram_notifications_database_backups_message_thread_id) : null, - 'telegram_notifications_backup_failure_thread_id' => $team->telegram_notifications_database_backups_message_thread_id ? Crypt::encryptString($team->telegram_notifications_database_backups_message_thread_id) : null, - 'telegram_notifications_scheduled_task_success_thread_id' => $team->telegram_notifications_scheduled_tasks_thread_id ? Crypt::encryptString($team->telegram_notifications_scheduled_tasks_thread_id) : null, - 'telegram_notifications_scheduled_task_failure_thread_id' => $team->telegram_notifications_scheduled_tasks_thread_id ? Crypt::encryptString($team->telegram_notifications_scheduled_tasks_thread_id) : null, - 'telegram_notifications_status_change_thread_id' => $team->telegram_notifications_status_changes_message_thread_id ? Crypt::encryptString($team->telegram_notifications_status_changes_message_thread_id) : null, - ] - ); - } catch (Exception $e) { - Log::error('Error migrating telegram notification settings from teams table: '.$e->getMessage()); - } - } - - Schema::table('teams', function (Blueprint $table) { - $table->dropColumn([ - 'telegram_enabled', - 'telegram_token', - 'telegram_chat_id', - 'telegram_notifications_test', - 'telegram_notifications_deployments', - 'telegram_notifications_status_changes', - 'telegram_notifications_database_backups', - 'telegram_notifications_scheduled_tasks', - 'telegram_notifications_server_disk_usage', - 'telegram_notifications_test_message_thread_id', - 'telegram_notifications_deployments_message_thread_id', - 'telegram_notifications_status_changes_message_thread_id', - 'telegram_notifications_database_backups_message_thread_id', - 'telegram_notifications_scheduled_tasks_thread_id', - ]); - }); - } - - public function down(): void - { - Schema::table('teams', function (Blueprint $table) { - $table->boolean('telegram_enabled')->default(false); - $table->text('telegram_token')->nullable(); - $table->text('telegram_chat_id')->nullable(); - - $table->boolean('telegram_notifications_test')->default(true); - $table->boolean('telegram_notifications_deployments')->default(true); - $table->boolean('telegram_notifications_status_changes')->default(true); - $table->boolean('telegram_notifications_database_backups')->default(true); - $table->boolean('telegram_notifications_scheduled_tasks')->default(true); - $table->boolean('telegram_notifications_server_disk_usage')->default(true); - - $table->text('telegram_notifications_test_message_thread_id')->nullable(); - $table->text('telegram_notifications_deployments_message_thread_id')->nullable(); - $table->text('telegram_notifications_status_changes_message_thread_id')->nullable(); - $table->text('telegram_notifications_database_backups_message_thread_id')->nullable(); - $table->text('telegram_notifications_scheduled_tasks_thread_id')->nullable(); - }); - - $settings = DB::table('telegram_notification_settings')->get(); - foreach ($settings as $setting) { - try { - DB::table('teams') - ->where('id', $setting->team_id) - ->update([ - 'telegram_enabled' => $setting->telegram_enabled, - 'telegram_token' => $setting->telegram_token ? Crypt::decryptString($setting->telegram_token) : null, - 'telegram_chat_id' => $setting->telegram_chat_id ? Crypt::decryptString($setting->telegram_chat_id) : null, - - 'telegram_notifications_deployments' => $setting->deployment_success_telegram_notifications || $setting->deployment_failure_telegram_notifications, - 'telegram_notifications_status_changes' => $setting->status_change_telegram_notifications, - 'telegram_notifications_database_backups' => $setting->backup_success_telegram_notifications || $setting->backup_failure_telegram_notifications, - 'telegram_notifications_scheduled_tasks' => $setting->scheduled_task_success_telegram_notifications || $setting->scheduled_task_failure_telegram_notifications, - 'telegram_notifications_server_disk_usage' => $setting->server_disk_usage_telegram_notifications, - - 'telegram_notifications_deployments_message_thread_id' => $setting->telegram_notifications_deployment_success_thread_id ? Crypt::decryptString($setting->telegram_notifications_deployment_success_thread_id) : null, - 'telegram_notifications_status_changes_message_thread_id' => $setting->telegram_notifications_status_change_thread_id ? Crypt::decryptString($setting->telegram_notifications_status_change_thread_id) : null, - 'telegram_notifications_database_backups_message_thread_id' => $setting->telegram_notifications_backup_success_thread_id ? Crypt::decryptString($setting->telegram_notifications_backup_success_thread_id) : null, - 'telegram_notifications_scheduled_tasks_thread_id' => $setting->telegram_notifications_scheduled_task_success_thread_id ? Crypt::decryptString($setting->telegram_notifications_scheduled_task_success_thread_id) : null, - ]); - } catch (Exception $e) { - Log::error('Error migrating telegram notification settings from teams table: '.$e->getMessage()); - } - } - } -}; diff --git a/database/migrations/2024_12_06_142014_create_slack_notification_settings_table.php b/database/migrations/2024_12_06_142014_create_slack_notification_settings_table.php deleted file mode 100644 index 8aee40d87f..0000000000 --- a/database/migrations/2024_12_06_142014_create_slack_notification_settings_table.php +++ /dev/null @@ -1,58 +0,0 @@ -id(); - $table->foreignId('team_id')->constrained()->cascadeOnDelete(); - - $table->boolean('slack_enabled')->default(false); - $table->text('slack_webhook_url')->nullable(); - - $table->boolean('deployment_success_slack_notifications')->default(false); - $table->boolean('deployment_failure_slack_notifications')->default(true); - $table->boolean('status_change_slack_notifications')->default(false); - $table->boolean('backup_success_slack_notifications')->default(false); - $table->boolean('backup_failure_slack_notifications')->default(true); - $table->boolean('scheduled_task_success_slack_notifications')->default(false); - $table->boolean('scheduled_task_failure_slack_notifications')->default(true); - $table->boolean('docker_cleanup_success_slack_notifications')->default(false); - $table->boolean('docker_cleanup_failure_slack_notifications')->default(true); - $table->boolean('server_disk_usage_slack_notifications')->default(true); - $table->boolean('server_reachable_slack_notifications')->default(false); - $table->boolean('server_unreachable_slack_notifications')->default(true); - - $table->unique(['team_id']); - }); - $teams = DB::table('teams')->get(); - - foreach ($teams as $team) { - try { - DB::table('slack_notification_settings')->insert([ - 'team_id' => $team->id, - ]); - } catch (\Throwable $e) { - Log::error('Error creating slack notification settings for existing teams: '.$e->getMessage()); - } - } - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('slack_notification_settings'); - } -}; diff --git a/database/migrations/2024_12_09_105711_drop_waitlists_table.php b/database/migrations/2024_12_09_105711_drop_waitlists_table.php deleted file mode 100644 index 0e319369d0..0000000000 --- a/database/migrations/2024_12_09_105711_drop_waitlists_table.php +++ /dev/null @@ -1,31 +0,0 @@ -id(); - $table->string('uuid'); - $table->string('type'); - $table->string('email')->unique(); - $table->boolean('verified')->default(false); - $table->timestamps(); - }); - } -}; diff --git a/database/migrations/2024_12_10_122142_encrypt_instance_settings_email_columns.php b/database/migrations/2024_12_10_122142_encrypt_instance_settings_email_columns.php deleted file mode 100644 index 83540ca3ce..0000000000 --- a/database/migrations/2024_12_10_122142_encrypt_instance_settings_email_columns.php +++ /dev/null @@ -1,72 +0,0 @@ -text('smtp_from_address')->nullable()->change(); - $table->text('smtp_from_name')->nullable()->change(); - $table->text('smtp_recipients')->nullable()->change(); - $table->text('smtp_host')->nullable()->change(); - $table->text('smtp_username')->nullable()->change(); - }); - - if (DB::table('instance_settings')->exists()) { - $settings = DB::table('instance_settings')->get(); - foreach ($settings as $setting) { - try { - DB::table('instance_settings')->where('id', $setting->id)->update([ - 'smtp_from_address' => $setting->smtp_from_address ? Crypt::encryptString($setting->smtp_from_address) : null, - 'smtp_from_name' => $setting->smtp_from_name ? Crypt::encryptString($setting->smtp_from_name) : null, - 'smtp_recipients' => $setting->smtp_recipients ? Crypt::encryptString($setting->smtp_recipients) : null, - 'smtp_host' => $setting->smtp_host ? Crypt::encryptString($setting->smtp_host) : null, - 'smtp_username' => $setting->smtp_username ? Crypt::encryptString($setting->smtp_username) : null, - ]); - } catch (Exception $e) { - \Log::error('Error encrypting instance settings email columns: '.$e->getMessage()); - } - } - } - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('instance_settings', function (Blueprint $table) { - $table->string('smtp_from_address')->nullable()->change(); - $table->string('smtp_from_name')->nullable()->change(); - $table->string('smtp_recipients')->nullable()->change(); - $table->string('smtp_host')->nullable()->change(); - $table->string('smtp_username')->nullable()->change(); - }); - - if (DB::table('instance_settings')->exists()) { - $settings = DB::table('instance_settings')->get(); - foreach ($settings as $setting) { - try { - DB::table('instance_settings')->where('id', $setting->id)->update([ - 'smtp_from_address' => $setting->smtp_from_address ? Crypt::decryptString($setting->smtp_from_address) : null, - 'smtp_from_name' => $setting->smtp_from_name ? Crypt::decryptString($setting->smtp_from_name) : null, - 'smtp_recipients' => $setting->smtp_recipients ? Crypt::decryptString($setting->smtp_recipients) : null, - 'smtp_host' => $setting->smtp_host ? Crypt::decryptString($setting->smtp_host) : null, - 'smtp_username' => $setting->smtp_username ? Crypt::decryptString($setting->smtp_username) : null, - ]); - } catch (Exception $e) { - \Log::error('Error decrypting instance settings email columns: '.$e->getMessage()); - } - } - } - } -}; diff --git a/database/migrations/2024_12_10_122143_drop_resale_license.php b/database/migrations/2024_12_10_122143_drop_resale_license.php deleted file mode 100644 index aaf498c3bd..0000000000 --- a/database/migrations/2024_12_10_122143_drop_resale_license.php +++ /dev/null @@ -1,30 +0,0 @@ -dropColumn('is_resale_license_active'); - $table->dropColumn('resale_license'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('instance_settings', function (Blueprint $table) { - $table->boolean('is_resale_license_active')->default(false); - $table->longText('resale_license')->nullable(); - }); - } -}; diff --git a/database/migrations/2024_12_11_135026_create_pushover_notification_settings_table.php b/database/migrations/2024_12_11_135026_create_pushover_notification_settings_table.php deleted file mode 100644 index ad4215a075..0000000000 --- a/database/migrations/2024_12_11_135026_create_pushover_notification_settings_table.php +++ /dev/null @@ -1,59 +0,0 @@ -id(); - $table->foreignId('team_id')->constrained()->cascadeOnDelete(); - - $table->boolean('pushover_enabled')->default(false); - $table->text('pushover_user_key')->nullable(); - $table->text('pushover_api_token')->nullable(); - - $table->boolean('deployment_success_pushover_notifications')->default(false); - $table->boolean('deployment_failure_pushover_notifications')->default(true); - $table->boolean('status_change_pushover_notifications')->default(false); - $table->boolean('backup_success_pushover_notifications')->default(false); - $table->boolean('backup_failure_pushover_notifications')->default(true); - $table->boolean('scheduled_task_success_pushover_notifications')->default(false); - $table->boolean('scheduled_task_failure_pushover_notifications')->default(true); - $table->boolean('docker_cleanup_success_pushover_notifications')->default(false); - $table->boolean('docker_cleanup_failure_pushover_notifications')->default(true); - $table->boolean('server_disk_usage_pushover_notifications')->default(true); - $table->boolean('server_reachable_pushover_notifications')->default(false); - $table->boolean('server_unreachable_pushover_notifications')->default(true); - - $table->unique(['team_id']); - }); - $teams = DB::table('teams')->get(); - - foreach ($teams as $team) { - try { - DB::table('pushover_notification_settings')->insert([ - 'team_id' => $team->id, - ]); - } catch (\Throwable $e) { - Log::error('Error creating pushover notification settings for existing teams: '.$e->getMessage()); - } - } - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('pushover_notification_settings'); - } -}; diff --git a/database/migrations/2024_12_11_161418_add_authentik_base_url_to_oauth_settings_table.php b/database/migrations/2024_12_11_161418_add_authentik_base_url_to_oauth_settings_table.php deleted file mode 100644 index 44ecb0cde3..0000000000 --- a/database/migrations/2024_12_11_161418_add_authentik_base_url_to_oauth_settings_table.php +++ /dev/null @@ -1,28 +0,0 @@ -string('base_url')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('oauth_settings', function (Blueprint $table) { - $table->dropColumn('base_url'); - }); - } -}; diff --git a/database/migrations/2024_12_13_103007_encrypt_resend_api_key_in_instance_settings.php b/database/migrations/2024_12_13_103007_encrypt_resend_api_key_in_instance_settings.php deleted file mode 100644 index ab9b3416a5..0000000000 --- a/database/migrations/2024_12_13_103007_encrypt_resend_api_key_in_instance_settings.php +++ /dev/null @@ -1,46 +0,0 @@ -exists()) { - $settings = DB::table('instance_settings')->get(); - foreach ($settings as $setting) { - try { - DB::table('instance_settings')->where('id', $setting->id)->update([ - 'resend_api_key' => $setting->resend_api_key ? Crypt::encryptString($setting->resend_api_key) : null, - ]); - } catch (Exception $e) { - \Log::error('Error encrypting resend_api_key: '.$e->getMessage()); - } - } - } - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - if (DB::table('instance_settings')->exists()) { - $settings = DB::table('instance_settings')->get(); - foreach ($settings as $setting) { - try { - DB::table('instance_settings')->where('id', $setting->id)->update([ - 'resend_api_key' => $setting->resend_api_key ? Crypt::decryptString($setting->resend_api_key) : null, - ]); - } catch (Exception $e) { - \Log::error('Error decrypting resend_api_key: '.$e->getMessage()); - } - } - } - } -}; diff --git a/database/migrations/2024_12_16_134437_add_resourceable_columns_to_environment_variables_table.php b/database/migrations/2024_12_16_134437_add_resourceable_columns_to_environment_variables_table.php deleted file mode 100644 index c4b7186380..0000000000 --- a/database/migrations/2024_12_16_134437_add_resourceable_columns_to_environment_variables_table.php +++ /dev/null @@ -1,165 +0,0 @@ -string('resourceable_type')->nullable(); - $table->unsignedBigInteger('resourceable_id')->nullable(); - $table->index(['resourceable_type', 'resourceable_id']); - }); - - // Populate the new columns - DB::table('environment_variables')->whereNotNull('application_id') - ->update([ - 'resourceable_type' => 'App\\Models\\Application', - 'resourceable_id' => DB::raw('application_id'), - ]); - - DB::table('environment_variables')->whereNotNull('service_id') - ->update([ - 'resourceable_type' => 'App\\Models\\Service', - 'resourceable_id' => DB::raw('service_id'), - ]); - - DB::table('environment_variables')->whereNotNull('standalone_postgresql_id') - ->update([ - 'resourceable_type' => 'App\\Models\\StandalonePostgresql', - 'resourceable_id' => DB::raw('standalone_postgresql_id'), - ]); - - DB::table('environment_variables')->whereNotNull('standalone_redis_id') - ->update([ - 'resourceable_type' => 'App\\Models\\StandaloneRedis', - 'resourceable_id' => DB::raw('standalone_redis_id'), - ]); - - DB::table('environment_variables')->whereNotNull('standalone_mongodb_id') - ->update([ - 'resourceable_type' => 'App\\Models\\StandaloneMongodb', - 'resourceable_id' => DB::raw('standalone_mongodb_id'), - ]); - - DB::table('environment_variables')->whereNotNull('standalone_mysql_id') - ->update([ - 'resourceable_type' => 'App\\Models\\StandaloneMysql', - 'resourceable_id' => DB::raw('standalone_mysql_id'), - ]); - - DB::table('environment_variables')->whereNotNull('standalone_mariadb_id') - ->update([ - 'resourceable_type' => 'App\\Models\\StandaloneMariadb', - 'resourceable_id' => DB::raw('standalone_mariadb_id'), - ]); - - DB::table('environment_variables')->whereNotNull('standalone_keydb_id') - ->update([ - 'resourceable_type' => 'App\\Models\\StandaloneKeydb', - 'resourceable_id' => DB::raw('standalone_keydb_id'), - ]); - - DB::table('environment_variables')->whereNotNull('standalone_dragonfly_id') - ->update([ - 'resourceable_type' => 'App\\Models\\StandaloneDragonfly', - 'resourceable_id' => DB::raw('standalone_dragonfly_id'), - ]); - - DB::table('environment_variables')->whereNotNull('standalone_clickhouse_id') - ->update([ - 'resourceable_type' => 'App\\Models\\StandaloneClickhouse', - 'resourceable_id' => DB::raw('standalone_clickhouse_id'), - ]); - - // After successful migration, we can drop the old foreign key columns - Schema::table('environment_variables', function (Blueprint $table) { - $table->dropColumn([ - 'application_id', - 'service_id', - 'standalone_postgresql_id', - 'standalone_redis_id', - 'standalone_mongodb_id', - 'standalone_mysql_id', - 'standalone_mariadb_id', - 'standalone_keydb_id', - 'standalone_dragonfly_id', - 'standalone_clickhouse_id', - ]); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('environment_variables', function (Blueprint $table) { - // Restore the old columns - $table->unsignedBigInteger('application_id')->nullable(); - $table->unsignedBigInteger('service_id')->nullable(); - $table->unsignedBigInteger('standalone_postgresql_id')->nullable(); - $table->unsignedBigInteger('standalone_redis_id')->nullable(); - $table->unsignedBigInteger('standalone_mongodb_id')->nullable(); - $table->unsignedBigInteger('standalone_mysql_id')->nullable(); - $table->unsignedBigInteger('standalone_mariadb_id')->nullable(); - $table->unsignedBigInteger('standalone_keydb_id')->nullable(); - $table->unsignedBigInteger('standalone_dragonfly_id')->nullable(); - $table->unsignedBigInteger('standalone_clickhouse_id')->nullable(); - }); - - Schema::table('environment_variables', function (Blueprint $table) { - // Restore data from polymorphic relationship - DB::table('environment_variables') - ->where('resourceable_type', 'App\\Models\\Application') - ->update(['application_id' => DB::raw('resourceable_id')]); - - DB::table('environment_variables') - ->where('resourceable_type', 'App\\Models\\Service') - ->update(['service_id' => DB::raw('resourceable_id')]); - - DB::table('environment_variables') - ->where('resourceable_type', 'App\\Models\\StandalonePostgresql') - ->update(['standalone_postgresql_id' => DB::raw('resourceable_id')]); - - DB::table('environment_variables') - ->where('resourceable_type', 'App\\Models\\StandaloneRedis') - ->update(['standalone_redis_id' => DB::raw('resourceable_id')]); - - DB::table('environment_variables') - ->where('resourceable_type', 'App\\Models\\StandaloneMongodb') - ->update(['standalone_mongodb_id' => DB::raw('resourceable_id')]); - - DB::table('environment_variables') - ->where('resourceable_type', 'App\\Models\\StandaloneMysql') - ->update(['standalone_mysql_id' => DB::raw('resourceable_id')]); - - DB::table('environment_variables') - ->where('resourceable_type', 'App\\Models\\StandaloneMariadb') - ->update(['standalone_mariadb_id' => DB::raw('resourceable_id')]); - - DB::table('environment_variables') - ->where('resourceable_type', 'App\\Models\\StandaloneKeydb') - ->update(['standalone_keydb_id' => DB::raw('resourceable_id')]); - - DB::table('environment_variables') - ->where('resourceable_type', 'App\\Models\\StandaloneDragonfly') - ->update(['standalone_dragonfly_id' => DB::raw('resourceable_id')]); - - DB::table('environment_variables') - ->where('resourceable_type', 'App\\Models\\StandaloneClickhouse') - ->update(['standalone_clickhouse_id' => DB::raw('resourceable_id')]); - - // Drop the polymorphic columns - $table->dropIndex(['resourceable_type', 'resourceable_id']); - $table->dropColumn(['resourceable_type', 'resourceable_id']); - }); - } -}; diff --git a/database/migrations/2024_12_17_140637_add_server_disk_usage_check_frequency_to_server_settings_table.php b/database/migrations/2024_12_17_140637_add_server_disk_usage_check_frequency_to_server_settings_table.php deleted file mode 100644 index be0f4bc0f4..0000000000 --- a/database/migrations/2024_12_17_140637_add_server_disk_usage_check_frequency_to_server_settings_table.php +++ /dev/null @@ -1,28 +0,0 @@ -string('server_disk_usage_check_frequency')->default('0 23 * * *'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('server_disk_usage_check_frequency'); - }); - } -}; diff --git a/database/migrations/2024_12_23_142402_update_email_encryption_values.php b/database/migrations/2024_12_23_142402_update_email_encryption_values.php deleted file mode 100644 index dfb5b4a7c6..0000000000 --- a/database/migrations/2024_12_23_142402_update_email_encryption_values.php +++ /dev/null @@ -1,114 +0,0 @@ - 'starttls', - 'ssl' => 'tls', - '' => 'none', - ]; - - /** - * Run the migrations. - */ - public function up(): void - { - try { - DB::beginTransaction(); - - $instanceSettings = DB::table('instance_settings')->get(); - foreach ($instanceSettings as $setting) { - try { - if (array_key_exists($setting->smtp_encryption, $this->encryptionMappings)) { - DB::table('instance_settings') - ->where('id', $setting->id) - ->update([ - 'smtp_encryption' => $this->encryptionMappings[$setting->smtp_encryption], - ]); - } - } catch (\Exception $e) { - \Log::error('Failed to update instance settings: '.$e->getMessage()); - } - } - - $emailSettings = DB::table('email_notification_settings')->get(); - foreach ($emailSettings as $setting) { - try { - if (array_key_exists($setting->smtp_encryption, $this->encryptionMappings)) { - DB::table('email_notification_settings') - ->where('id', $setting->id) - ->update([ - 'smtp_encryption' => $this->encryptionMappings[$setting->smtp_encryption], - ]); - } - } catch (\Exception $e) { - \Log::error('Failed to update email settings: '.$e->getMessage()); - } - } - - DB::commit(); - } catch (\Exception $e) { - DB::rollBack(); - \Log::error('Failed to update email encryption: '.$e->getMessage()); - throw $e; - } - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - try { - DB::beginTransaction(); - - $reverseMapping = [ - 'starttls' => 'tls', - 'tls' => 'ssl', - 'none' => '', - ]; - - $instanceSettings = DB::table('instance_settings')->get(); - foreach ($instanceSettings as $setting) { - try { - if (array_key_exists($setting->smtp_encryption, $reverseMapping)) { - DB::table('instance_settings') - ->where('id', $setting->id) - ->update([ - 'smtp_encryption' => $reverseMapping[$setting->smtp_encryption], - ]); - } - } catch (\Exception $e) { - \Log::error('Failed to reverse instance settings: '.$e->getMessage()); - } - } - - $emailSettings = DB::table('email_notification_settings')->get(); - foreach ($emailSettings as $setting) { - try { - if (array_key_exists($setting->smtp_encryption, $reverseMapping)) { - DB::table('email_notification_settings') - ->where('id', $setting->id) - ->update([ - 'smtp_encryption' => $reverseMapping[$setting->smtp_encryption], - ]); - } - } catch (\Exception $e) { - \Log::error('Failed to reverse email settings: '.$e->getMessage()); - } - } - - DB::commit(); - } catch (\Exception $e) { - DB::rollBack(); - \Log::error('Failed to reverse email encryption: '.$e->getMessage()); - throw $e; - } - } -} diff --git a/database/migrations/2025_01_08_154008_switch_up_readonly_labels.php b/database/migrations/2025_01_08_154008_switch_up_readonly_labels.php deleted file mode 100644 index aae089d9e5..0000000000 --- a/database/migrations/2025_01_08_154008_switch_up_readonly_labels.php +++ /dev/null @@ -1,39 +0,0 @@ -update([ - 'is_container_label_readonly_enabled' => DB::raw('NOT is_container_label_readonly_enabled'), - ]); - - Schema::table('application_settings', function (Blueprint $table) { - $table->boolean('is_container_label_readonly_enabled')->default(true)->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - DB::table('application_settings') - ->update([ - 'is_container_label_readonly_enabled' => DB::raw('NOT is_container_label_readonly_enabled'), - ]); - - Schema::table('application_settings', function (Blueprint $table) { - $table->boolean('is_container_label_readonly_enabled')->default(false)->change(); - }); - } -}; diff --git a/database/migrations/2025_01_10_135244_add_horizon_job_details_to_queue.php b/database/migrations/2025_01_10_135244_add_horizon_job_details_to_queue.php deleted file mode 100644 index 8ce5821efe..0000000000 --- a/database/migrations/2025_01_10_135244_add_horizon_job_details_to_queue.php +++ /dev/null @@ -1,30 +0,0 @@ -string('horizon_job_id')->nullable(); - $table->string('horizon_job_worker')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_deployment_queues', function (Blueprint $table) { - $table->dropColumn('horizon_job_id'); - $table->dropColumn('horizon_job_worker'); - }); - } -}; diff --git a/database/migrations/2025_01_13_130238_add_backup_retention_fields_to_scheduled_database_backups_table.php b/database/migrations/2025_01_13_130238_add_backup_retention_fields_to_scheduled_database_backups_table.php deleted file mode 100644 index f06bc367eb..0000000000 --- a/database/migrations/2025_01_13_130238_add_backup_retention_fields_to_scheduled_database_backups_table.php +++ /dev/null @@ -1,36 +0,0 @@ -renameColumn('number_of_backups_locally', 'database_backup_retention_amount_locally'); - $table->integer('database_backup_retention_amount_locally')->default(0)->nullable(false)->change(); - $table->integer('database_backup_retention_days_locally')->default(0)->nullable(false); - $table->decimal('database_backup_retention_max_storage_locally', 17, 7)->default(0)->nullable(false); - - $table->integer('database_backup_retention_amount_s3')->default(0)->nullable(false); - $table->integer('database_backup_retention_days_s3')->default(0)->nullable(false); - $table->decimal('database_backup_retention_max_storage_s3', 17, 7)->default(0)->nullable(false); - }); - } - - public function down() - { - Schema::table('scheduled_database_backups', function (Blueprint $table) { - $table->renameColumn('database_backup_retention_amount_locally', 'number_of_backups_locally')->nullable(true)->change(); - $table->dropColumn([ - 'database_backup_retention_days_locally', - 'database_backup_retention_max_storage_locally', - 'database_backup_retention_amount_s3', - 'database_backup_retention_days_s3', - 'database_backup_retention_max_storage_s3', - ]); - }); - } -}; diff --git a/database/migrations/2025_01_15_130416_create_docker_cleanup_executions_table.php b/database/migrations/2025_01_15_130416_create_docker_cleanup_executions_table.php deleted file mode 100644 index c962131254..0000000000 --- a/database/migrations/2025_01_15_130416_create_docker_cleanup_executions_table.php +++ /dev/null @@ -1,33 +0,0 @@ -id(); - $table->string('uuid')->unique(); - $table->enum('status', ['success', 'failed', 'running'])->default('running'); - $table->text('message')->nullable(); - $table->json('cleanup_log')->nullable(); - $table->foreignId('server_id'); - $table->timestamps(); - $table->timestamp('finished_at')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('docker_cleanup_executions'); - } -}; diff --git a/database/migrations/2025_01_16_110406_change_commit_message_to_text_in_application_deployment_queues.php b/database/migrations/2025_01_16_110406_change_commit_message_to_text_in_application_deployment_queues.php deleted file mode 100644 index 6c64bf38d4..0000000000 --- a/database/migrations/2025_01_16_110406_change_commit_message_to_text_in_application_deployment_queues.php +++ /dev/null @@ -1,28 +0,0 @@ -text('commit_message')->nullable()->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('application_deployment_queues', function (Blueprint $table) { - $table->string('commit_message', 50)->nullable()->change(); - }); - } -}; diff --git a/database/migrations/2025_01_16_130238_add_finished_at_to_executions_tables.php b/database/migrations/2025_01_16_130238_add_finished_at_to_executions_tables.php deleted file mode 100644 index 0b78c89982..0000000000 --- a/database/migrations/2025_01_16_130238_add_finished_at_to_executions_tables.php +++ /dev/null @@ -1,38 +0,0 @@ -timestamp('finished_at')->nullable(); - }); - Schema::table('scheduled_database_backup_executions', function (Blueprint $table) { - $table->timestamp('finished_at')->nullable(); - }); - - Schema::table('scheduled_task_executions', function (Blueprint $table) { - $table->timestamp('finished_at')->nullable(); - }); - - } - - public function down() - { - Schema::table('application_deployment_queues', function (Blueprint $table) { - $table->dropColumn('finished_at'); - }); - - Schema::table('scheduled_database_backup_executions', function (Blueprint $table) { - $table->dropColumn('finished_at'); - }); - - Schema::table('scheduled_task_executions', function (Blueprint $table) { - $table->dropColumn('finished_at'); - }); - } -}; diff --git a/database/migrations/2025_01_21_125205_update_finished_at_timestamps_if_not_set.php b/database/migrations/2025_01_21_125205_update_finished_at_timestamps_if_not_set.php deleted file mode 100644 index 050e8f1ae6..0000000000 --- a/database/migrations/2025_01_21_125205_update_finished_at_timestamps_if_not_set.php +++ /dev/null @@ -1,37 +0,0 @@ -whereNull('finished_at') - ->update(['finished_at' => DB::raw('updated_at')]); - } catch (\Exception $e) { - \Log::error('Failed to update not set finished_at timestamps for application_deployment_queues: '.$e->getMessage()); - } - - try { - DB::table('scheduled_database_backup_executions') - ->whereNull('finished_at') - ->update(['finished_at' => DB::raw('updated_at')]); - } catch (\Exception $e) { - \Log::error('Failed to update not set finished_at timestamps for scheduled_database_backup_executions: '.$e->getMessage()); - } - - try { - DB::table('scheduled_task_executions') - ->whereNull('finished_at') - ->update(['finished_at' => DB::raw('updated_at')]); - } catch (\Exception $e) { - \Log::error('Failed to update not set finished_at timestamps for scheduled_task_executions: '.$e->getMessage()); - } - } -}; diff --git a/database/migrations/2025_01_22_101105_remove_wrongly_created_envs.php b/database/migrations/2025_01_22_101105_remove_wrongly_created_envs.php deleted file mode 100644 index cb1b3cbe6d..0000000000 --- a/database/migrations/2025_01_22_101105_remove_wrongly_created_envs.php +++ /dev/null @@ -1,19 +0,0 @@ -each(function (EnvironmentVariable $environmentVariable) { - $environmentVariable->delete(); - }); - } catch (\Exception $e) { - Log::error('Failed to delete wrongly created environment variables: '.$e->getMessage()); - } - } -}; diff --git a/database/migrations/2025_02_27_125249_add_index_to_scheduled_task_executions.php b/database/migrations/2025_02_27_125249_add_index_to_scheduled_task_executions.php deleted file mode 100644 index 45c6b581d6..0000000000 --- a/database/migrations/2025_02_27_125249_add_index_to_scheduled_task_executions.php +++ /dev/null @@ -1,38 +0,0 @@ -index(['scheduled_task_id', 'created_at'], 'scheduled_task_executions_task_id_created_at_index'); - }); - - Schema::table('scheduled_database_backup_executions', function (Blueprint $table) { - $table->index( - ['scheduled_database_backup_id', 'created_at'], - 'scheduled_db_backup_executions_backup_id_created_at_index' - ); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('scheduled_task_executions', function (Blueprint $table) { - $table->dropIndex('scheduled_task_executions_task_id_created_at_index'); - }); - Schema::table('scheduled_database_backup_executions', function (Blueprint $table) { - $table->dropIndex('scheduled_db_backup_executions_backup_id_created_at_index'); - }); - } -}; diff --git a/database/migrations/2025_03_01_112617_add_stripe_past_due.php b/database/migrations/2025_03_01_112617_add_stripe_past_due.php deleted file mode 100644 index 6edb4f698b..0000000000 --- a/database/migrations/2025_03_01_112617_add_stripe_past_due.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('stripe_past_due')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('subscriptions', function (Blueprint $table) { - $table->dropColumn('stripe_past_due'); - }); - } -}; diff --git a/database/migrations/2025_03_14_140150_add_storage_deletion_tracking_to_backup_executions.php b/database/migrations/2025_03_14_140150_add_storage_deletion_tracking_to_backup_executions.php deleted file mode 100644 index c6af6fc490..0000000000 --- a/database/migrations/2025_03_14_140150_add_storage_deletion_tracking_to_backup_executions.php +++ /dev/null @@ -1,19 +0,0 @@ -boolean('local_storage_deleted')->default(false); - $table->boolean('s3_storage_deleted')->default(false); - }); - } -}; diff --git a/database/seeders/ApplicationSeeder.php b/database/seeders/ApplicationSeeder.php deleted file mode 100644 index f75400ce90..0000000000 --- a/database/seeders/ApplicationSeeder.php +++ /dev/null @@ -1,66 +0,0 @@ - 'NodeJS Fastify Example', - 'fqdn' => 'http://nodejs.127.0.0.1.sslip.io', - 'repository_project_id' => 603035348, - 'git_repository' => 'coollabsio/coolify-examples', - 'git_branch' => 'main', - 'base_directory' => '/nodejs', - 'build_pack' => 'nixpacks', - 'ports_exposes' => '3000', - 'environment_id' => 1, - 'destination_id' => 0, - 'destination_type' => StandaloneDocker::class, - 'source_id' => 1, - 'source_type' => GithubApp::class, - ]); - Application::create([ - 'name' => 'Dockerfile Example', - 'fqdn' => 'http://dockerfile.127.0.0.1.sslip.io', - 'repository_project_id' => 603035348, - 'git_repository' => 'coollabsio/coolify-examples', - 'git_branch' => 'main', - 'base_directory' => '/dockerfile', - 'build_pack' => 'dockerfile', - 'ports_exposes' => '80', - 'environment_id' => 1, - 'destination_id' => 0, - 'destination_type' => StandaloneDocker::class, - 'source_id' => 0, - 'source_type' => GithubApp::class, - ]); - Application::create([ - 'name' => 'Pure Dockerfile Example', - 'fqdn' => 'http://pure-dockerfile.127.0.0.1.sslip.io', - 'git_repository' => 'coollabsio/coolify', - 'git_branch' => 'main', - 'git_commit_sha' => 'HEAD', - 'build_pack' => 'dockerfile', - 'ports_exposes' => '80', - 'environment_id' => 1, - 'destination_id' => 0, - 'destination_type' => StandaloneDocker::class, - 'source_id' => 0, - 'source_type' => GithubApp::class, - 'dockerfile' => 'FROM nginx -EXPOSE 80 -CMD ["nginx", "-g", "daemon off;"] -', - ]); - } -} diff --git a/database/seeders/ApplicationSettingsSeeder.php b/database/seeders/ApplicationSettingsSeeder.php deleted file mode 100644 index 8e439fd169..0000000000 --- a/database/seeders/ApplicationSettingsSeeder.php +++ /dev/null @@ -1,19 +0,0 @@ -load(['settings']); - $application_1->settings->is_debug_enabled = false; - $application_1->settings->save(); - } -} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php deleted file mode 100644 index 6e66c64f4a..0000000000 --- a/database/seeders/DatabaseSeeder.php +++ /dev/null @@ -1,33 +0,0 @@ -call([ - InstanceSettingsSeeder::class, - UserSeeder::class, - TeamSeeder::class, - PrivateKeySeeder::class, - PopulateSshKeysDirectorySeeder::class, - ServerSeeder::class, - ServerSettingSeeder::class, - ProjectSeeder::class, - StandaloneDockerSeeder::class, - GithubAppSeeder::class, - GitlabAppSeeder::class, - ApplicationSeeder::class, - ApplicationSettingsSeeder::class, - LocalPersistentVolumeSeeder::class, - S3StorageSeeder::class, - StandalonePostgresqlSeeder::class, - OauthSettingSeeder::class, - DisableTwoStepConfirmationSeeder::class, - SentinelSeeder::class, - ]); - } -} diff --git a/database/seeders/DisableTwoStepConfirmationSeeder.php b/database/seeders/DisableTwoStepConfirmationSeeder.php deleted file mode 100644 index c43bf1b015..0000000000 --- a/database/seeders/DisableTwoStepConfirmationSeeder.php +++ /dev/null @@ -1,20 +0,0 @@ -updateOrInsert( - [], - ['disable_two_step_confirmation' => true] - ); - } -} diff --git a/database/seeders/GithubAppSeeder.php b/database/seeders/GithubAppSeeder.php deleted file mode 100644 index b34c004736..0000000000 --- a/database/seeders/GithubAppSeeder.php +++ /dev/null @@ -1,39 +0,0 @@ - 0, - 'name' => 'Public GitHub', - 'api_url' => 'https://api.github.com', - 'html_url' => 'https://github.com', - 'is_public' => true, - 'team_id' => 0, - ]); - GithubApp::create([ - 'name' => 'coolify-laravel-dev-public', - 'uuid' => '69420', - 'organization' => 'coollabsio', - 'api_url' => 'https://api.github.com', - 'html_url' => 'https://github.com', - 'is_public' => false, - 'app_id' => 292941, - 'installation_id' => 37267016, - 'client_id' => 'Iv1.220e564d2b0abd8c', - 'client_secret' => '116d1d80289f378410dd70ab4e4b81dd8d2c52b6', - 'webhook_secret' => '326a47b49054f03288f800d81247ec9414d0abf3', - 'private_key_id' => 2, - 'team_id' => 0, - ]); - } -} diff --git a/database/seeders/GitlabAppSeeder.php b/database/seeders/GitlabAppSeeder.php deleted file mode 100644 index ec2b7ec5e1..0000000000 --- a/database/seeders/GitlabAppSeeder.php +++ /dev/null @@ -1,24 +0,0 @@ - 1, - 'name' => 'Public GitLab', - 'api_url' => 'https://gitlab.com/api/v4', - 'html_url' => 'https://gitlab.com', - 'is_public' => true, - 'team_id' => 0, - ]); - } -} diff --git a/database/seeders/InstanceSettingsSeeder.php b/database/seeders/InstanceSettingsSeeder.php deleted file mode 100644 index 7f2deb3a6b..0000000000 --- a/database/seeders/InstanceSettingsSeeder.php +++ /dev/null @@ -1,44 +0,0 @@ - 0, - 'is_registration_enabled' => true, - 'smtp_enabled' => true, - 'smtp_host' => 'coolify-mail', - 'smtp_port' => 1025, - 'smtp_from_address' => 'hi@localhost.com', - 'smtp_from_name' => 'Coolify', - ]); - try { - $ipv4 = Process::run('curl -4s https://ifconfig.io')->output(); - $ipv4 = trim($ipv4); - $ipv4 = filter_var($ipv4, FILTER_VALIDATE_IP); - $settings = instanceSettings(); - if (is_null($settings->public_ipv4) && $ipv4) { - $settings->update(['public_ipv4' => $ipv4]); - } - $ipv6 = Process::run('curl -6s https://ifconfig.io')->output(); - $ipv6 = trim($ipv6); - $ipv6 = filter_var($ipv6, FILTER_VALIDATE_IP); - $settings = instanceSettings(); - if (is_null($settings->public_ipv6) && $ipv6) { - $settings->update(['public_ipv6' => $ipv6]); - } - } catch (\Throwable $e) { - echo "Error: {$e->getMessage()}\n"; - } - } -} diff --git a/database/seeders/LocalPersistentVolumeSeeder.php b/database/seeders/LocalPersistentVolumeSeeder.php deleted file mode 100644 index 79c105ed36..0000000000 --- a/database/seeders/LocalPersistentVolumeSeeder.php +++ /dev/null @@ -1,23 +0,0 @@ - 'test-pv', - 'mount_path' => '/data', - 'resource_id' => 1, - 'resource_type' => Application::class, - ]); - } -} diff --git a/database/seeders/OauthSettingSeeder.php b/database/seeders/OauthSettingSeeder.php deleted file mode 100644 index fa692d2dc6..0000000000 --- a/database/seeders/OauthSettingSeeder.php +++ /dev/null @@ -1,66 +0,0 @@ - 0; - - // We changed how providers are defined in the database, so we authentik does not exists, we need to recreate all of the auth providers - // Before authentik was a provider, providers started with 0 id - - $isOauthAuthentik = OauthSetting::where('provider', 'authentik')->exists(); - if (! $isOauthSeeded || $isOauthAuthentik) { - foreach ($providers as $provider) { - OauthSetting::updateOrCreate([ - 'provider' => $provider, - ]); - } - - return; - } - - $allProviders = OauthSetting::all(); - $notFoundProviders = $providers->diff($allProviders->pluck('provider')); - - $allProviders->each(function ($provider) { - $provider->delete(); - }); - $allProviders->each(function ($provider) { - $provider = new OauthSetting; - $provider->provider = $provider->provider; - unset($provider->id); - $provider->save(); - }); - - foreach ($notFoundProviders as $provider) { - OauthSetting::create([ - 'provider' => $provider, - ]); - } - - } catch (\Exception $e) { - Log::error($e->getMessage()); - } - } -} diff --git a/database/seeders/PopulateSshKeysDirectorySeeder.php b/database/seeders/PopulateSshKeysDirectorySeeder.php deleted file mode 100644 index 87984769ca..0000000000 --- a/database/seeders/PopulateSshKeysDirectorySeeder.php +++ /dev/null @@ -1,37 +0,0 @@ -deleteDirectory(''); - Storage::disk('ssh-keys')->makeDirectory(''); - Storage::disk('ssh-mux')->deleteDirectory(''); - Storage::disk('ssh-mux')->makeDirectory(''); - - PrivateKey::chunk(100, function ($keys) { - foreach ($keys as $key) { - $key->storeInFileSystem(); - } - }); - - if (isDev()) { - Process::run('chown -R 9999:9999 '.storage_path('app/ssh/keys')); - Process::run('chown -R 9999:9999 '.storage_path('app/ssh/mux')); - } else { - Process::run('chown -R 9999:root '.storage_path('app/ssh/keys')); - Process::run('chown -R 9999:root '.storage_path('app/ssh/mux')); - } - } catch (\Throwable $e) { - echo "Error: {$e->getMessage()}\n"; - } - } -} diff --git a/database/seeders/PrivateKeySeeder.php b/database/seeders/PrivateKeySeeder.php deleted file mode 100644 index 6b44d0867d..0000000000 --- a/database/seeders/PrivateKeySeeder.php +++ /dev/null @@ -1,63 +0,0 @@ - 0, - 'name' => 'Testing Host Key', - 'description' => 'This is a test docker container', - 'private_key' => '-----BEGIN OPENSSH PRIVATE KEY----- -b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW -QyNTUxOQAAACBbhpqHhqv6aI67Mj9abM3DVbmcfYhZAhC7ca4d9UCevAAAAJi/QySHv0Mk -hwAAAAtzc2gtZWQyNTUxOQAAACBbhpqHhqv6aI67Mj9abM3DVbmcfYhZAhC7ca4d9UCevA -AAAECBQw4jg1WRT2IGHMncCiZhURCts2s24HoDS0thHnnRKVuGmoeGq/pojrsyP1pszcNV -uZx9iFkCELtxrh31QJ68AAAAEXNhaWxANzZmZjY2ZDJlMmRkAQIDBA== ------END OPENSSH PRIVATE KEY----- -', - ]); - - PrivateKey::create([ - 'team_id' => 0, - 'name' => 'development-github-app', - 'description' => 'This is the key for using the development GitHub app', - 'private_key' => '-----BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEAstJo/SfYh3tquc2BA29a1X3pdPpXazRgtKsb5fHOwQs1rE04 -VyJYW6QCToSH4WS1oKt6iI4ma4uivn8rnkZFdw3mpcLp2ofcoeV3YPKX6pN/RiJC -if+g8gCaFywOxy2pjXOLPZeFJSXFqc4UOymbhESUyDnMfk4/RvnubMiv3jINo4Ow -4Tv7tRzAdMlMrx3hEhi142oQuyl1kc4WQOM9cAV0bd+62ga3EYSnsWTnC9AaFtWk -eGC5w/7knHJ5QZ9tKApkG3/29vJXY7WwCRUROEHqkvQhRDP0uqRPBdR48iG87Dwq -ePa6TodkFaVfyHS/OUZzRiTn6MOSyQQFg0QIIwIDAQABAoIBAQCsmGebSJU2lwl4 -0oAeZ6E9hG0LagFsSL66QpkHxO9w5bflWRbzCwRLVy6eyE46XzDrJfd7y/ALR1hK -E4ZvGpY7heBDx7BdK1rprAggO6YjVD+42qJsfZ3DVo9jpDOTTWBkVcxkI1Xwd9ej -wHNIcy1WabdM1nSoyC9M+ziEKOOOShXc5Q6e+zEzSBbwjc1fvvXZOH4VXZZ1DllE -xGu0jFS23TLnXATxh8SdfYgnvfZgB5n72P9m/lj3FmkuJq57DLZhBwN3Zd4wom03 -K7/J4K2Ssnjdv/HjVgrRgpMv7oMxfclN/Aiq878Ue4Mav6LjnLENyHbyR0WxQjY6 -lZ7UMEeJAoGBAOCGepk3rCMFa3a6GagN6lYzAkLxB5y0PsefiDo6w+PeEj1tUvSd -aQkiP7uvUC7a5GNp9yE8W79/O1jJXYJq15kMBpUshzfgdzyzDDCj+qvm6nbTWtP9 -rP30h81R+NGdOStgs0OVZSjMWnIoii3Rv3UV4+iQXZd67+wd/kbTWtWVAoGBAMvj -xv4wjt7OwtK/6oAhcNd2V9EUQp6PPpMkUyPicWdsLsoNOcuTpWvEc0AomdIGGjgI -AIor1ggCxjEhbCDaZucOFUghciUup+PjyQyQT+3bjvCWuUmi0Vt51G7RE0jjZjQt -2+W9V4yDcJ5R5ow6veYvT0ZOjVTScDYowTBulgjXAoGBALFxVl7UotQiqmVwempY -ZQSu13C0MIHl6V+2cuEiJEJn9R5a0h7EcIhpatkXmlUNZUY0Lr0ziIb1NJ/ctGwn -qDAqUuF+CXddjJ6KGm4uiiNlIZO7QaMcbqVdph3cVLrEeLQRfltBLGtr5WcnJt1D -UP5lyHK59V2MKSUAJz8uNjFpAoGAL5fR4Y/wKa5V5+AImzQzJPho81MpYd3KG4rF -JYE8O4oTOfLwZMboPEm1JWrUzSPDhwTHK3mkEmajYOCOXvTcRF8TNK0p+ef0JMwN -KDOflMRFj39/bOLmv9Wmct+3ArKiLtftlqkmAJTF+w7fJCiqH0s31A+OChi9PMcy -oV2PBC0CgYAXOm08kFOQA+bPBdLAte8Ga89frh6asH/Z8ucfsz9/zMMG/hhq5nF3 -7TItY9Pblc2Fp805J13G96zWLX4YGyLwXXkYs+Ae7QoqjonTw7/mUDARY1Zxs9m/ -a1C8EDKapCw5hAhizEFOUQKOygL8Ipn+tmEUkORYdZ8Q8cWFCv9nIw== ------END RSA PRIVATE KEY-----', - 'is_git_related' => true, - ]); - } -} diff --git a/database/seeders/ProductionSeeder.php b/database/seeders/ProductionSeeder.php deleted file mode 100644 index bbb9fcb752..0000000000 --- a/database/seeders/ProductionSeeder.php +++ /dev/null @@ -1,197 +0,0 @@ -where('user_id', 0)->first() === null) { - DB::table('team_user')->insert([ - 'user_id' => 0, - 'team_id' => 0, - 'role' => 'owner', - 'created_at' => now(), - 'updated_at' => now(), - ]); - } - } - - if (InstanceSettings::find(0) == null) { - InstanceSettings::create([ - 'id' => 0, - ]); - } - - if (GithubApp::find(0) == null) { - GithubApp::create([ - 'id' => 0, - 'name' => 'Public GitHub', - 'api_url' => 'https://api.github.com', - 'html_url' => 'https://github.com', - 'is_public' => true, - 'team_id' => 0, - ]); - } - - if (GitlabApp::find(0) == null) { - GitlabApp::create([ - 'id' => 0, - 'name' => 'Public GitLab', - 'api_url' => 'https://gitlab.com/api/v4', - 'html_url' => 'https://gitlab.com', - 'is_public' => true, - 'team_id' => 0, - ]); - } - - if (! isCloud() && config('constants.coolify.is_windows_docker_desktop') == false) { - $coolify_key_name = '@host.docker.internal'; - $ssh_keys_directory = Storage::disk('ssh-keys')->files(); - $coolify_key = collect($ssh_keys_directory)->firstWhere(fn ($item) => str($item)->contains($coolify_key_name)); - - $private_key_found = PrivateKey::find(0); - if (! $private_key_found) { - if ($coolify_key) { - $user = str($coolify_key)->before('@')->after('id.'); - $coolify_key = Storage::disk('ssh-keys')->get($coolify_key); - PrivateKey::create([ - 'id' => 0, - 'team_id' => 0, - 'name' => 'localhost\'s key', - 'description' => 'The private key for the Coolify host machine (localhost).', - 'private_key' => $coolify_key, - ]); - echo "SSH key found for the Coolify host machine (localhost).\n"; - } else { - echo "No SSH key found for the Coolify host machine (localhost).\n"; - echo "Please read the following documentation (point 3) to fix it: https://coolify. - io/docs/knowledge-base/server/openssh/\n"; - echo "Your localhost connection won't work until then."; - } - } - } - - if (! isCloud()) { - if (Server::find(0) == null) { - $server_details = [ - 'id' => 0, - 'name' => 'localhost', - 'description' => "This is the server where Coolify is running on. Don't delete this!", - 'user' => $user, - 'ip' => 'host.docker.internal', - 'team_id' => 0, - 'private_key_id' => 0, - ]; - $server_details['proxy'] = ServerMetadata::from([ - 'type' => ProxyTypes::TRAEFIK->value, - 'status' => ProxyStatus::EXITED->value, - ]); - $server = Server::create($server_details); - $server->settings->is_reachable = true; - $server->settings->is_usable = true; - $server->settings->save(); - } else { - $server = Server::find(0); - $server->settings->is_reachable = true; - $server->settings->is_usable = true; - $server->settings->save(); - } - - if (StandaloneDocker::find(0) == null) { - StandaloneDocker::create([ - 'id' => 0, - 'name' => 'localhost-coolify', - 'network' => 'coolify', - 'server_id' => 0, - ]); - } - } - - if (config('constants.coolify.is_windows_docker_desktop')) { - PrivateKey::updateOrCreate( - [ - 'id' => 0, - 'team_id' => 0, - ], - [ - 'name' => 'Testing-host', - 'description' => 'This is a a docker container with SSH access', - 'private_key' => '-----BEGIN OPENSSH PRIVATE KEY----- -b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW -QyNTUxOQAAACBbhpqHhqv6aI67Mj9abM3DVbmcfYhZAhC7ca4d9UCevAAAAJi/QySHv0Mk -hwAAAAtzc2gtZWQyNTUxOQAAACBbhpqHhqv6aI67Mj9abM3DVbmcfYhZAhC7ca4d9UCevA -AAAECBQw4jg1WRT2IGHMncCiZhURCts2s24HoDS0thHnnRKVuGmoeGq/pojrsyP1pszcNV -uZx9iFkCELtxrh31QJ68AAAAEXNhaWxANzZmZjY2ZDJlMmRkAQIDBA== ------END OPENSSH PRIVATE KEY----- -', - ] - ); - if (Server::find(0) == null) { - $server_details = [ - 'id' => 0, - 'uuid' => 'coolify-testing-host', - 'name' => 'localhost', - 'description' => "This is the server where Coolify is running on. Don't delete this!", - 'user' => 'root', - 'ip' => 'coolify-testing-host', - 'team_id' => 0, - 'private_key_id' => 0, - ]; - $server_details['proxy'] = ServerMetadata::from([ - 'type' => ProxyTypes::TRAEFIK->value, - 'status' => ProxyStatus::EXITED->value, - ]); - $server = Server::create($server_details); - $server->settings->is_reachable = true; - $server->settings->is_usable = true; - $server->settings->save(); - } else { - $server = Server::find(0); - $server->settings->is_reachable = true; - $server->settings->is_usable = true; - $server->settings->save(); - } - - if (StandaloneDocker::find(0) == null) { - StandaloneDocker::create([ - 'id' => 0, - 'name' => 'localhost-coolify', - 'network' => 'coolify', - 'server_id' => 0, - ]); - } - } - - get_public_ips(); - - $this->call(OauthSettingSeeder::class); - $this->call(PopulateSshKeysDirectorySeeder::class); - $this->call(SentinelSeeder::class); - $this->call(RootUserSeeder::class); - } -} diff --git a/database/seeders/ProjectSeeder.php b/database/seeders/ProjectSeeder.php deleted file mode 100644 index 33cd8cd06f..0000000000 --- a/database/seeders/ProjectSeeder.php +++ /dev/null @@ -1,18 +0,0 @@ - 'My first project', - 'description' => 'This is a test project in development', - 'team_id' => 0, - ]); - } -} diff --git a/database/seeders/RootUserSeeder.php b/database/seeders/RootUserSeeder.php deleted file mode 100644 index e3968a1c9c..0000000000 --- a/database/seeders/RootUserSeeder.php +++ /dev/null @@ -1,74 +0,0 @@ -exists()) { - echo "\n INFO Root user already exists. Skipping creation.\n\n"; - - return; - } - - if (! env('ROOT_USER_EMAIL') || ! env('ROOT_USER_PASSWORD')) { - return; - } - - $validator = Validator::make([ - 'email' => env('ROOT_USER_EMAIL'), - 'username' => env('ROOT_USERNAME', 'Root User'), - 'password' => env('ROOT_USER_PASSWORD'), - ], [ - 'email' => ['required', 'email:rfc,dns', 'max:255'], - 'username' => ['required', 'string', 'min:3', 'max:255', 'regex:/^[\w\s-]+$/'], - 'password' => ['required', 'string', 'min:8', Password::min(8)->mixedCase()->letters()->numbers()->symbols()->uncompromised()], - ]); - - if ($validator->fails()) { - echo "\n ERROR Invalid Root User Environment Variables\n"; - foreach ($validator->errors()->all() as $error) { - echo " → {$error}\n"; - } - echo "\n"; - - return; - } - - try { - User::create([ - 'id' => 0, - 'name' => env('ROOT_USERNAME', 'Root User'), - 'email' => env('ROOT_USER_EMAIL'), - 'password' => Hash::make(env('ROOT_USER_PASSWORD')), - ]); - echo "\n SUCCESS Root user created successfully.\n\n"; - } catch (\Exception $e) { - echo "\n ERROR Failed to create root user: {$e->getMessage()}\n\n"; - - return; - } - - try { - InstanceSettings::updateOrCreate( - ['id' => 0], - ['is_registration_enabled' => false] - ); - echo "\n SUCCESS Registration has been disabled successfully.\n\n"; - } catch (\Exception $e) { - echo "\n ERROR Failed to update instance settings: {$e->getMessage()}\n\n"; - } - } catch (\Exception $e) { - echo "\n ERROR An unexpected error occurred: {$e->getMessage()}\n\n"; - } - } -} diff --git a/database/seeders/S3StorageSeeder.php b/database/seeders/S3StorageSeeder.php deleted file mode 100644 index de7cef6dc5..0000000000 --- a/database/seeders/S3StorageSeeder.php +++ /dev/null @@ -1,25 +0,0 @@ - 'Local MinIO', - 'description' => 'Local MinIO S3 Storage', - 'key' => 'minioadmin', - 'secret' => 'minioadmin', - 'bucket' => 'local', - 'endpoint' => 'http://coolify-minio:9000', - 'team_id' => 0, - ]); - } -} diff --git a/database/seeders/SentinelSeeder.php b/database/seeders/SentinelSeeder.php deleted file mode 100644 index 3cf9139333..0000000000 --- a/database/seeders/SentinelSeeder.php +++ /dev/null @@ -1,32 +0,0 @@ -settings->sentinel_token)->isEmpty()) { - $server->settings->generateSentinelToken(ignoreEvent: true); - } - if (str($server->settings->sentinel_custom_url)->isEmpty()) { - $url = $server->settings->generateSentinelUrl(ignoreEvent: true); - if (str($url)->isEmpty()) { - $server->settings->is_sentinel_enabled = false; - $server->settings->save(); - } - } - } catch (\Throwable $e) { - Log::error('Error seeding sentinel: '.$e->getMessage()); - } - } - }); - } -} diff --git a/database/seeders/ServerSeeder.php b/database/seeders/ServerSeeder.php deleted file mode 100644 index d328431071..0000000000 --- a/database/seeders/ServerSeeder.php +++ /dev/null @@ -1,27 +0,0 @@ - 0, - 'name' => 'localhost', - 'description' => 'This is a test docker container in development mode', - 'ip' => 'coolify-testing-host', - 'team_id' => 0, - 'private_key_id' => 1, - 'proxy' => [ - 'type' => ProxyTypes::TRAEFIK->value, - 'status' => ProxyStatus::EXITED->value, - ], - ]); - } -} diff --git a/database/seeders/ServerSettingSeeder.php b/database/seeders/ServerSettingSeeder.php deleted file mode 100644 index af4a2694b6..0000000000 --- a/database/seeders/ServerSettingSeeder.php +++ /dev/null @@ -1,22 +0,0 @@ -load(['settings']); - $server_2->settings->wildcard_domain = 'http://127.0.0.1.sslip.io'; - $server_2->settings->is_build_server = false; - $server_2->settings->is_usable = true; - $server_2->settings->is_reachable = true; - $server_2->settings->save(); - } -} diff --git a/database/seeders/SharedEnvironmentVariableSeeder.php b/database/seeders/SharedEnvironmentVariableSeeder.php deleted file mode 100644 index 54643fe3b9..0000000000 --- a/database/seeders/SharedEnvironmentVariableSeeder.php +++ /dev/null @@ -1,36 +0,0 @@ - 'NODE_ENV', - 'value' => 'team_env', - 'type' => 'team', - 'team_id' => 0, - ]); - SharedEnvironmentVariable::create([ - 'key' => 'NODE_ENV', - 'value' => 'env_env', - 'type' => 'environment', - 'environment_id' => 1, - 'team_id' => 0, - ]); - SharedEnvironmentVariable::create([ - 'key' => 'NODE_ENV', - 'value' => 'project_env', - 'type' => 'project', - 'project_id' => 1, - 'team_id' => 0, - ]); - } -} diff --git a/database/seeders/StandaloneDockerSeeder.php b/database/seeders/StandaloneDockerSeeder.php deleted file mode 100644 index a466de56bb..0000000000 --- a/database/seeders/StandaloneDockerSeeder.php +++ /dev/null @@ -1,24 +0,0 @@ - 0, - 'name' => 'Standalone Docker 1', - 'network' => 'coolify', - 'server_id' => 0, - ]); - } - } -} diff --git a/database/seeders/StandalonePostgresqlSeeder.php b/database/seeders/StandalonePostgresqlSeeder.php deleted file mode 100644 index 1fc96a610a..0000000000 --- a/database/seeders/StandalonePostgresqlSeeder.php +++ /dev/null @@ -1,22 +0,0 @@ - 'Local PostgreSQL', - 'description' => 'Local PostgreSQL for testing', - 'postgres_password' => 'postgres', - 'environment_id' => 1, - 'destination_id' => 0, - 'destination_type' => StandaloneDocker::class, - ]); - } -} diff --git a/database/seeders/StandaloneRedisSeeder.php b/database/seeders/StandaloneRedisSeeder.php deleted file mode 100644 index e7bf3373eb..0000000000 --- a/database/seeders/StandaloneRedisSeeder.php +++ /dev/null @@ -1,22 +0,0 @@ - 'Local PostgreSQL', - 'description' => 'Local PostgreSQL for testing', - 'redis_password' => 'redis', - 'environment_id' => 1, - 'destination_id' => 0, - 'destination_type' => StandaloneDocker::class, - ]); - } -} diff --git a/database/seeders/TeamSeeder.php b/database/seeders/TeamSeeder.php deleted file mode 100644 index 67c5ec4897..0000000000 --- a/database/seeders/TeamSeeder.php +++ /dev/null @@ -1,23 +0,0 @@ -description = 'The root team'; - $root_user_personal_team->save(); - - $normal_user_in_root_team->teams()->attach($root_user_personal_team); - $normal_user_not_in_root_team = User::find(2); - $normal_user_in_root_team_personal_team = Team::find(1); - $normal_user_not_in_root_team->teams()->attach($normal_user_in_root_team_personal_team, ['role' => 'admin']); - } -} diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php deleted file mode 100644 index 2ac615cc01..0000000000 --- a/database/seeders/UserSeeder.php +++ /dev/null @@ -1,28 +0,0 @@ -create([ - 'id' => 0, - 'name' => 'Root User', - 'email' => 'test@example.com', - ]); - User::factory()->create([ - 'id' => 1, - 'name' => 'Normal User (but in root team)', - 'email' => 'test2@example.com', - ]); - User::factory()->create([ - 'id' => 2, - 'name' => 'Normal User (not in root team)', - 'email' => 'test3@example.com', - ]); - } -} diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml deleted file mode 100644 index 3fadd914c1..0000000000 --- a/docker-compose.dev.yml +++ /dev/null @@ -1,125 +0,0 @@ -services: - coolify: - build: - context: . - dockerfile: ./docker/development/Dockerfile - args: - - USER_ID=${USERID:-1000} - - GROUP_ID=${GROUPID:-1000} - ports: - - "${APP_PORT:-8000}:8080" - environment: - AUTORUN_ENABLED: false - PUSHER_HOST: "${PUSHER_HOST}" - PUSHER_PORT: "${PUSHER_PORT}" - PUSHER_SCHEME: "${PUSHER_SCHEME:-http}" - PUSHER_APP_ID: "${PUSHER_APP_ID:-coolify}" - PUSHER_APP_KEY: "${PUSHER_APP_KEY:-coolify}" - PUSHER_APP_SECRET: "${PUSHER_APP_SECRET:-coolify}" - volumes: - - .:/var/www/html/:cached - - dev_backups_data:/var/www/html/storage/app/backups - postgres: - pull_policy: always - ports: - - "${FORWARD_DB_PORT:-5432}:5432" - env_file: - - .env - environment: - POSTGRES_USER: "${DB_USERNAME:-coolify}" - POSTGRES_PASSWORD: "${DB_PASSWORD:-password}" - POSTGRES_DB: "${DB_DATABASE:-coolify}" - POSTGRES_HOST_AUTH_METHOD: "trust" - volumes: - - dev_postgres_data:/var/lib/postgresql/data - redis: - pull_policy: always - ports: - - "${FORWARD_REDIS_PORT:-6379}:6379" - env_file: - - .env - volumes: - - dev_redis_data:/data - soketi: - build: - context: . - dockerfile: ./docker/coolify-realtime/Dockerfile - env_file: - - .env - ports: - - "${FORWARD_SOKETI_PORT:-6001}:6001" - - "6002:6002" - volumes: - - ./storage:/var/www/html/storage - - ./docker/coolify-realtime/terminal-server.js:/terminal/terminal-server.js - environment: - SOKETI_DEBUG: "false" - SOKETI_DEFAULT_APP_ID: "${PUSHER_APP_ID:-coolify}" - SOKETI_DEFAULT_APP_KEY: "${PUSHER_APP_KEY:-coolify}" - SOKETI_DEFAULT_APP_SECRET: "${PUSHER_APP_SECRET:-coolify}" - entrypoint: ["/bin/sh", "/soketi-entrypoint.sh"] - vite: - image: node:20-alpine - pull_policy: always - working_dir: /var/www/html - environment: - VITE_HOST: "${VITE_HOST:-localhost}" - VITE_PORT: "${VITE_PORT:-5173}" - ports: - - "${VITE_PORT:-5173}:${VITE_PORT:-5173}" - volumes: - - .:/var/www/html/:cached - command: sh -c "npm install && npm run dev" - networks: - - coolify - testing-host: - build: - context: . - dockerfile: ./docker/testing-host/Dockerfile - init: true - container_name: coolify-testing-host - volumes: - - /var/run/docker.sock:/var/run/docker.sock - - dev_coolify_data:/data/coolify - - dev_backups_data:/data/coolify/backups - - dev_postgres_data:/data/coolify/_volumes/database - - dev_redis_data:/data/coolify/_volumes/redis - - dev_minio_data:/data/coolify/_volumes/minio - networks: - - coolify - mailpit: - image: axllent/mailpit:latest - pull_policy: always - container_name: coolify-mail - ports: - - "${FORWARD_MAILPIT_PORT:-1025}:1025" - - "${FORWARD_MAILPIT_DASHBOARD_PORT:-8025}:8025" - networks: - - coolify - minio: - image: minio/minio:latest - pull_policy: always - container_name: coolify-minio - command: server /data --console-address ":9001" - ports: - - "${FORWARD_MINIO_PORT:-9000}:9000" - - "${FORWARD_MINIO_PORT_CONSOLE:-9001}:9001" - environment: - MINIO_ACCESS_KEY: "${MINIO_ACCESS_KEY:-minioadmin}" - MINIO_SECRET_KEY: "${MINIO_SECRET_KEY:-minioadmin}" - volumes: - - dev_minio_data:/data - networks: - - coolify - -volumes: - dev_backups_data: - dev_postgres_data: - dev_redis_data: - dev_coolify_data: - dev_minio_data: - -networks: - coolify: - name: coolify - external: false diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml deleted file mode 100644 index 23a65cca66..0000000000 --- a/docker-compose.prod.yml +++ /dev/null @@ -1,90 +0,0 @@ -services: - coolify: - image: "ghcr.io/coollabsio/coolify:${LATEST_IMAGE:-latest}" - volumes: - - type: bind - source: /data/coolify/source/.env - target: /var/www/html/.env - read_only: true - - /data/coolify/ssh:/var/www/html/storage/app/ssh - - /data/coolify/applications:/var/www/html/storage/app/applications - - /data/coolify/databases:/var/www/html/storage/app/databases - - /data/coolify/services:/var/www/html/storage/app/services - - /data/coolify/backups:/var/www/html/storage/app/backups - - /data/coolify/webhooks-during-maintenance:/var/www/html/storage/app/webhooks-during-maintenance - environment: - - APP_ENV=${APP_ENV:-production} - - PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-256M} - - PHP_FPM_PM_CONTROL=${PHP_FPM_PM_CONTROL:-dynamic} - - PHP_FPM_PM_START_SERVERS=${PHP_FPM_PM_START_SERVERS:-1} - - PHP_FPM_PM_MIN_SPARE_SERVERS=${PHP_FPM_PM_MIN_SPARE_SERVERS:-1} - - PHP_FPM_PM_MAX_SPARE_SERVERS=${PHP_FPM_PM_MAX_SPARE_SERVERS:-10} - env_file: - - /data/coolify/source/.env - ports: - - "${APP_PORT:-8000}:8080" - expose: - - "${APP_PORT:-8000}" - healthcheck: - test: curl --fail http://127.0.0.1:8080/api/health || exit 1 - interval: 5s - retries: 10 - timeout: 2s - depends_on: - postgres: - condition: service_healthy - redis: - condition: service_healthy - soketi: - condition: service_healthy - postgres: - volumes: - - coolify-db:/var/lib/postgresql/data - environment: - POSTGRES_USER: "${DB_USERNAME}" - POSTGRES_PASSWORD: "${DB_PASSWORD}" - POSTGRES_DB: "${DB_DATABASE:-coolify}" - healthcheck: - test: [ "CMD-SHELL", "pg_isready -U ${DB_USERNAME}", "-d", "${DB_DATABASE:-coolify}" ] - interval: 5s - retries: 10 - timeout: 2s - redis: - command: redis-server --save 20 1 --loglevel warning --requirepass ${REDIS_PASSWORD} - environment: - REDIS_PASSWORD: "${REDIS_PASSWORD}" - volumes: - - coolify-redis:/data - healthcheck: - test: redis-cli ping - interval: 5s - retries: 10 - timeout: 2s - soketi: - image: 'ghcr.io/coollabsio/coolify-realtime:1.0.6' - ports: - - "${SOKETI_PORT:-6001}:6001" - - "6002:6002" - volumes: - - /data/coolify/ssh:/var/www/html/storage/app/ssh - environment: - APP_NAME: "${APP_NAME:-Coolify}" - SOKETI_DEBUG: "${SOKETI_DEBUG:-false}" - SOKETI_DEFAULT_APP_ID: "${PUSHER_APP_ID}" - SOKETI_DEFAULT_APP_KEY: "${PUSHER_APP_KEY}" - SOKETI_DEFAULT_APP_SECRET: "${PUSHER_APP_SECRET}" - healthcheck: - test: [ "CMD-SHELL", "wget -qO- http://127.0.0.1:6001/ready && wget -qO- http://127.0.0.1:6002/ready || exit 1" ] - interval: 5s - retries: 10 - timeout: 2s - -volumes: - coolify-db: - name: coolify-db - coolify-redis: - name: coolify-redis - -networks: - coolify: - external: true diff --git a/docker-compose.windows.yml b/docker-compose.windows.yml deleted file mode 100644 index 519309e394..0000000000 --- a/docker-compose.windows.yml +++ /dev/null @@ -1,133 +0,0 @@ -services: - coolify-testing-host: - init: true - image: "ghcr.io/coollabsio/coolify-testing-host:latest" - pull_policy: always - container_name: coolify-testing-host - volumes: - - //var/run/docker.sock://var/run/docker.sock - - ./:/data/coolify - coolify: - image: "ghcr.io/coollabsio/coolify:latest" - pull_policy: always - container_name: coolify - restart: always - working_dir: /var/www/html - extra_hosts: - - 'host.docker.internal:host-gateway' - volumes: - - type: bind - source: .env - target: /var/www/html/.env - read_only: true - - ./ssh:/var/www/html/storage/app/ssh - - ./applications:/var/www/html/storage/app/applications - - ./databases:/var/www/html/storage/app/databases - - ./services:/var/www/html/storage/app/services - - ./backups:/var/www/html/storage/app/backups - - ./webhooks-during-maintenance:/var/www/html/storage/app/webhooks-during-maintenance - env_file: - - .env - environment: - - APP_ID - - APP_ENV=production - - APP_NAME - - APP_KEY - - DB_PASSWORD - - REDIS_PASSWORD - - SSL_MODE=off - - PHP_PM_CONTROL=dynamic - - PHP_PM_START_SERVERS=1 - - PHP_PM_MIN_SPARE_SERVERS=1 - - PHP_PM_MAX_SPARE_SERVERS=10 - - PUSHER_APP_ID - - PUSHER_APP_KEY - - PUSHER_APP_SECRET - - AUTOUPDATE=true - - SELF_HOSTED=true - - SSH_MUX_ENABLED=false - - IS_WINDOWS_DOCKER_DESKTOP=true - ports: - - "${APP_PORT:-8000}:8080" - expose: - - "${APP_PORT:-8000}" - healthcheck: - test: curl --fail http://localhost:8080/api/health || exit 1 - interval: 5s - retries: 10 - timeout: 2s - depends_on: - postgres: - condition: service_healthy - redis: - condition: service_healthy - postgres: - image: postgres:15-alpine - pull_policy: always - container_name: coolify-db - restart: always - env_file: - - .env - volumes: - - coolify-db:/var/lib/postgresql/data - environment: - POSTGRES_USER: "${DB_USERNAME}" - POSTGRES_PASSWORD: "${DB_PASSWORD}" - POSTGRES_DB: "${DB_DATABASE:-coolify}" - healthcheck: - test: - [ - "CMD-SHELL", - "pg_isready -U ${DB_USERNAME}", - "-d", - "${DB_DATABASE:-coolify}" - ] - interval: 5s - retries: 10 - timeout: 2s - redis: - image: redis:7-alpine - pull_policy: always - container_name: coolify-redis - restart: always - command: redis-server --save 20 1 --loglevel warning --requirepass ${REDIS_PASSWORD} - env_file: - - .env - environment: - REDIS_PASSWORD: "${REDIS_PASSWORD}" - volumes: - - coolify-redis:/data - healthcheck: - test: redis-cli ping - interval: 5s - retries: 10 - timeout: 2s - soketi: - image: 'ghcr.io/coollabsio/coolify-realtime:1.0.6' - pull_policy: always - container_name: coolify-realtime - restart: always - env_file: - - .env - ports: - - "${SOKETI_PORT:-6001}:6001" - - "6002:6002" - volumes: - - ./ssh:/var/www/html/storage/app/ssh - environment: - APP_NAME: "${APP_NAME:-Coolify}" - SOKETI_DEBUG: "${SOKETI_DEBUG:-false}" - SOKETI_DEFAULT_APP_ID: "${PUSHER_APP_ID}" - SOKETI_DEFAULT_APP_KEY: "${PUSHER_APP_KEY}" - SOKETI_DEFAULT_APP_SECRET: "${PUSHER_APP_SECRET}" - healthcheck: - test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:6001/ready && wget -qO- http://127.0.0.1:6002/ready || exit 1"] - interval: 5s - retries: 10 - timeout: 2s - -volumes: - coolify-db: - name: coolify-db - coolify-redis: - name: coolify-redis diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 0fd3dda070..0000000000 --- a/docker-compose.yml +++ /dev/null @@ -1,37 +0,0 @@ -services: - coolify: - container_name: coolify - restart: always - working_dir: /var/www/html - extra_hosts: - - host.docker.internal:host-gateway - networks: - - coolify - depends_on: - - postgres - - redis - - soketi - postgres: - image: postgres:15-alpine - container_name: coolify-db - restart: always - networks: - - coolify - redis: - image: redis:7-alpine - container_name: coolify-redis - restart: always - networks: - - coolify - soketi: - container_name: coolify-realtime - extra_hosts: - - host.docker.internal:host-gateway - restart: always - networks: - - coolify -networks: - coolify: - name: coolify - driver: bridge - external: false diff --git a/docker/coolify-helper/Dockerfile b/docker/coolify-helper/Dockerfile deleted file mode 100644 index 6576100147..0000000000 --- a/docker/coolify-helper/Dockerfile +++ /dev/null @@ -1,54 +0,0 @@ -# Versions -# https://hub.docker.com/_/alpine -ARG BASE_IMAGE=alpine:3.21 -# https://download.docker.com/linux/static/stable/ -ARG DOCKER_VERSION=28.0.0 -# https://github.com/docker/compose/releases -ARG DOCKER_COMPOSE_VERSION=2.33.1 -# https://github.com/docker/buildx/releases -ARG DOCKER_BUILDX_VERSION=0.21.1 -# https://github.com/buildpacks/pack/releases -ARG PACK_VERSION=0.36.4 -# https://github.com/railwayapp/nixpacks/releases -ARG NIXPACKS_VERSION=1.33.0 -# https://github.com/minio/mc/releases -ARG MINIO_VERSION=RELEASE.2025-02-15T10-36-16Z - -FROM minio/mc:${MINIO_VERSION} AS minio-client - -FROM ${BASE_IMAGE} AS base - -ARG TARGETPLATFORM -ARG DOCKER_VERSION -ARG DOCKER_COMPOSE_VERSION -ARG DOCKER_BUILDX_VERSION -ARG PACK_VERSION -ARG NIXPACKS_VERSION - -USER root -WORKDIR /artifacts -RUN apk add --no-cache bash curl git git-lfs openssh-client tar tini -RUN mkdir -p ~/.docker/cli-plugins -RUN if [[ ${TARGETPLATFORM} == 'linux/amd64' ]]; then \ - curl -sSL https://github.com/docker/buildx/releases/download/v${DOCKER_BUILDX_VERSION}/buildx-v${DOCKER_BUILDX_VERSION}.linux-amd64 -o ~/.docker/cli-plugins/docker-buildx && \ - curl -sSL https://github.com/docker/compose/releases/download/v${DOCKER_COMPOSE_VERSION}/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose && \ - (curl -sSL https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz | tar -C /usr/bin/ --no-same-owner -xzv --strip-components=1 docker/docker) && \ - (curl -sSL https://github.com/buildpacks/pack/releases/download/v${PACK_VERSION}/pack-v${PACK_VERSION}-linux.tgz | tar -C /usr/local/bin/ --no-same-owner -xzv pack) && \ - curl -sSL https://nixpacks.com/install.sh | bash && \ - chmod +x ~/.docker/cli-plugins/docker-compose /usr/bin/docker /usr/local/bin/pack /root/.docker/cli-plugins/docker-buildx \ - ;fi - -RUN if [[ ${TARGETPLATFORM} == 'linux/arm64' ]]; then \ - curl -sSL https://github.com/docker/buildx/releases/download/v${DOCKER_BUILDX_VERSION}/buildx-v${DOCKER_BUILDX_VERSION}.linux-arm64 -o ~/.docker/cli-plugins/docker-buildx && \ - curl -sSL https://github.com/docker/compose/releases/download/v${DOCKER_COMPOSE_VERSION}/docker-compose-linux-aarch64 -o ~/.docker/cli-plugins/docker-compose && \ - (curl -sSL https://download.docker.com/linux/static/stable/aarch64/docker-${DOCKER_VERSION}.tgz | tar -C /usr/bin/ --no-same-owner -xzv --strip-components=1 docker/docker) && \ - (curl -sSL https://github.com/buildpacks/pack/releases/download/v${PACK_VERSION}/pack-v${PACK_VERSION}-linux-arm64.tgz | tar -C /usr/local/bin/ --no-same-owner -xzv pack) && \ - curl -sSL https://nixpacks.com/install.sh | bash && \ - chmod +x ~/.docker/cli-plugins/docker-compose /usr/bin/docker /usr/local/bin/pack /root/.docker/cli-plugins/docker-buildx \ - ;fi - -COPY --from=minio-client /usr/bin/mc /usr/bin/mc -RUN chmod +x /usr/bin/mc - -ENTRYPOINT ["/sbin/tini", "--"] -CMD ["tail", "-f", "/dev/null"] diff --git a/docker/coolify-realtime/Dockerfile b/docker/coolify-realtime/Dockerfile deleted file mode 100644 index 3a53da4906..0000000000 --- a/docker/coolify-realtime/Dockerfile +++ /dev/null @@ -1,28 +0,0 @@ -# Versions -# https://github.com/soketi/soketi/releases -ARG SOKETI_VERSION=1.6-16-alpine -# https://github.com/cloudflare/cloudflared/releases -ARG CLOUDFLARED_VERSION=2025.2.0 - -FROM quay.io/soketi/soketi:${SOKETI_VERSION} - -ARG TARGETPLATFORM -ARG CLOUDFLARED_VERSION - -WORKDIR /terminal -RUN apk add --no-cache openssh-client make g++ python3 curl -COPY docker/coolify-realtime/package.json ./ -RUN npm i -RUN npm rebuild node-pty --update-binary -COPY docker/coolify-realtime/soketi-entrypoint.sh /soketi-entrypoint.sh -COPY docker/coolify-realtime/terminal-server.js /terminal/terminal-server.js - -# Install Cloudflared based on architecture -RUN if [ "${TARGETPLATFORM}" = "linux/amd64" ]; then \ - curl -sSL "https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-amd64" -o /usr/local/bin/cloudflared; \ - elif [ "${TARGETPLATFORM}" = "linux/arm64" ]; then \ - curl -sSL "https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-arm64" -o /usr/local/bin/cloudflared; \ - fi && \ - chmod +x /usr/local/bin/cloudflared - -ENTRYPOINT ["/bin/sh", "/soketi-entrypoint.sh"] diff --git a/docker/coolify-realtime/package-lock.json b/docker/coolify-realtime/package-lock.json deleted file mode 100644 index aea3952c03..0000000000 --- a/docker/coolify-realtime/package-lock.json +++ /dev/null @@ -1,369 +0,0 @@ -{ - "name": "coolify-realtime", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "@xterm/addon-fit": "0.10.0", - "@xterm/xterm": "5.5.0", - "axios": "1.7.9", - "cookie": "1.0.2", - "dotenv": "16.4.7", - "node-pty": "1.0.0", - "ws": "8.18.1" - } - }, - "node_modules/@xterm/addon-fit": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.10.0.tgz", - "integrity": "sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ==", - "license": "MIT", - "peerDependencies": { - "@xterm/xterm": "^5.0.0" - } - }, - "node_modules/@xterm/xterm": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz", - "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==", - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/nan": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.1.tgz", - "integrity": "sha512-pfRR4ZcNTSm2ZFHaztuvbICf+hyiG6ecA06SfAxoPmuHjvMu0KUIae7Y8GyVkbBqeEIidsmXeYooWIX9+qjfRQ==", - "license": "MIT" - }, - "node_modules/node-pty": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-1.0.0.tgz", - "integrity": "sha512-wtBMWWS7dFZm/VgqElrTvtfMq4GzJ6+edFI0Y0zyzygUSZMgZdraDUMUhCIvkjhJjme15qWmbyJbtAx4ot4uZA==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "nan": "^2.17.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - } - } -} diff --git a/docker/coolify-realtime/package.json b/docker/coolify-realtime/package.json deleted file mode 100644 index 0a9b80cb52..0000000000 --- a/docker/coolify-realtime/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "private": true, - "type": "module", - "dependencies": { - "@xterm/addon-fit": "0.10.0", - "@xterm/xterm": "5.5.0", - "cookie": "1.0.2", - "axios": "1.7.9", - "dotenv": "16.4.7", - "node-pty": "1.0.0", - "ws": "8.18.1" - } -} diff --git a/docker/coolify-realtime/soketi-entrypoint.sh b/docker/coolify-realtime/soketi-entrypoint.sh deleted file mode 100644 index 3bb85bdeb9..0000000000 --- a/docker/coolify-realtime/soketi-entrypoint.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh -# Function to timestamp logs - -# Check if the first argument is 'watch' -if [ "$1" = "watch" ]; then - WATCH_MODE="--watch" -else - WATCH_MODE="" -fi - -timestamp() { - date "+%Y-%m-%d %H:%M:%S" -} - -# Start the terminal server in the background with logging -node $WATCH_MODE /terminal/terminal-server.js > >(while read line; do echo "$(timestamp) [TERMINAL] $line"; done) 2>&1 & -TERMINAL_PID=$! - -# Start the Soketi process in the background with logging -node /app/bin/server.js start > >(while read line; do echo "$(timestamp) [SOKETI] $line"; done) 2>&1 & -SOKETI_PID=$! - -# Function to forward signals to child processes -forward_signal() { - kill -$1 $TERMINAL_PID $SOKETI_PID -} - -# Forward SIGTERM to child processes -trap 'forward_signal TERM' TERM - -# Wait for any process to exit -wait -n - -# Exit with status of process that exited first -exit $? diff --git a/docker/coolify-realtime/terminal-server.js b/docker/coolify-realtime/terminal-server.js deleted file mode 100755 index 6649f866cd..0000000000 --- a/docker/coolify-realtime/terminal-server.js +++ /dev/null @@ -1,239 +0,0 @@ -import { WebSocketServer } from 'ws'; -import http from 'http'; -import pty from 'node-pty'; -import axios from 'axios'; -import cookie from 'cookie'; -import 'dotenv/config' - -const server = http.createServer((req, res) => { - if (req.url === '/ready') { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end('OK'); - } else { - res.writeHead(404, { 'Content-Type': 'text/plain' }); - res.end('Not Found'); - } -}); - -const verifyClient = async (info, callback) => { - const cookies = cookie.parse(info.req.headers.cookie || ''); - // const origin = new URL(info.origin); - // const protocol = origin.protocol; - const xsrfToken = cookies['XSRF-TOKEN']; - - // Generate session cookie name based on APP_NAME - const appName = process.env.APP_NAME || 'laravel'; - const sessionCookieName = `${appName.replace(/[^a-zA-Z0-9]/g, '_').toLowerCase()}_session`; - const laravelSession = cookies[sessionCookieName]; - - // Verify presence of required tokens - if (!laravelSession || !xsrfToken) { - return callback(false, 401, 'Unauthorized: Missing required tokens'); - } - - try { - // Authenticate with Laravel backend - const response = await axios.post(`http://coolify:8080/terminal/auth`, null, { - headers: { - 'Cookie': `${sessionCookieName}=${laravelSession}`, - 'X-XSRF-TOKEN': xsrfToken - }, - }); - - if (response.status === 200) { - // Authentication successful - callback(true); - } else { - callback(false, 401, 'Unauthorized: Invalid credentials'); - } - } catch (error) { - console.error('Authentication error:', error.message); - callback(false, 500, 'Internal Server Error'); - } -}; - - -const wss = new WebSocketServer({ server, path: '/terminal/ws', verifyClient: verifyClient }); -const userSessions = new Map(); - -wss.on('connection', (ws) => { - const userId = generateUserId(); - const userSession = { ws, userId, ptyProcess: null, isActive: false }; - userSessions.set(userId, userSession); - - ws.on('message', (message) => { - handleMessage(userSession, message); - - }); - ws.on('error', (err) => handleError(err, userId)); - ws.on('close', () => handleClose(userId)); - -}); - -const messageHandlers = { - message: (session, data) => session.ptyProcess.write(data), - resize: (session, { cols, rows }) => { - cols = cols > 0 ? cols : 80; - rows = rows > 0 ? rows : 30; - session.ptyProcess.resize(cols, rows) - }, - pause: (session) => session.ptyProcess.pause(), - resume: (session) => session.ptyProcess.resume(), - checkActive: (session, data) => { - if (data === 'force' && session.isActive) { - killPtyProcess(session.userId); - } else { - session.ws.send(session.isActive); - } - }, - command: (session, data) => handleCommand(session.ws, data, session.userId) -}; - -function handleMessage(userSession, message) { - const parsed = parseMessage(message); - if (!parsed) return; - - Object.entries(parsed).forEach(([key, value]) => { - const handler = messageHandlers[key]; - if (handler && (userSession.isActive || key === 'checkActive' || key === 'command')) { - handler(userSession, value); - } - }); -} - -function parseMessage(message) { - try { - return JSON.parse(message); - } catch (e) { - console.error('Failed to parse message:', e); - return null; - } -} - -async function handleCommand(ws, command, userId) { - const userSession = userSessions.get(userId); - if (userSession && userSession.isActive) { - const result = await killPtyProcess(userId); - if (!result) { - // if terminal is still active, even after we tried to kill it, dont continue and show error - ws.send('unprocessable'); - return; - } - } - - const commandString = command[0].split('\n').join(' '); - const timeout = extractTimeout(commandString); - const sshArgs = extractSshArgs(commandString); - const hereDocContent = extractHereDocContent(commandString); - const options = { - name: 'xterm-color', - cols: 80, - rows: 30, - cwd: process.env.HOME, - env: {}, - }; - - // NOTE: - Initiates a process within the Terminal container - // Establishes an SSH connection to root@coolify with RequestTTY enabled - // Executes the 'docker exec' command to connect to a specific container - const ptyProcess = pty.spawn('ssh', sshArgs.concat([hereDocContent]), options); - - userSession.ptyProcess = ptyProcess; - userSession.isActive = true; - - ws.send('pty-ready'); - - ptyProcess.onData((data) => { - ws.send(data); - }); - - // when parent closes - ptyProcess.onExit(({ exitCode, signal }) => { - console.error(`Process exited with code ${exitCode} and signal ${signal}`); - ws.send('pty-exited'); - userSession.isActive = false; - - }); - - if (timeout) { - setTimeout(async () => { - await killPtyProcess(userId); - }, timeout * 1000); - } -} - -async function handleError(err, userId) { - console.error('WebSocket error:', err); - await killPtyProcess(userId); -} - -async function handleClose(userId) { - await killPtyProcess(userId); - userSessions.delete(userId); -} - -async function killPtyProcess(userId) { - const session = userSessions.get(userId); - if (!session?.ptyProcess) return false; - - return new Promise((resolve) => { - // Loop to ensure terminal is killed before continuing - let killAttempts = 0; - const maxAttempts = 5; - - const attemptKill = () => { - killAttempts++; - - // session.ptyProcess.kill() wont work here because of https://github.com/moby/moby/issues/9098 - // patch with https://github.com/moby/moby/issues/9098#issuecomment-189743947 - session.ptyProcess.write('set +o history\nkill -TERM -$$ && exit\nset -o history\n'); - - setTimeout(() => { - if (!session.isActive || !session.ptyProcess) { - resolve(true); - return; - } - - if (killAttempts < maxAttempts) { - attemptKill(); - } else { - resolve(false); - } - }, 500); - }; - - attemptKill(); - }); -} - -function generateUserId() { - return Math.random().toString(36).substring(2, 11); -} - -function extractTimeout(commandString) { - const timeoutMatch = commandString.match(/timeout (\d+)/); - return timeoutMatch ? parseInt(timeoutMatch[1], 10) : null; -} - -function extractSshArgs(commandString) { - const sshCommandMatch = commandString.match(/ssh (.+?) 'bash -se'/); - let sshArgs = sshCommandMatch ? sshCommandMatch[1].split(' ') : []; - sshArgs = sshArgs.map(arg => arg === 'RequestTTY=no' ? 'RequestTTY=yes' : arg); - if (!sshArgs.includes('RequestTTY=yes')) { - sshArgs.push('-o', 'RequestTTY=yes'); - } - return sshArgs; -} - -function extractHereDocContent(commandString) { - const delimiterMatch = commandString.match(/<< (\S+)/); - const delimiter = delimiterMatch ? delimiterMatch[1] : null; - const escapedDelimiter = delimiter.slice(1).trim().replace(/[/\-\\^$*+?.()|[\]{}]/g, '\\$&'); - const hereDocRegex = new RegExp(`<< \\\\${escapedDelimiter}([\\s\\S\\.]*?)${escapedDelimiter}`); - const hereDocMatch = commandString.match(hereDocRegex); - return hereDocMatch ? hereDocMatch[1] : ''; -} - -server.listen(6002, () => { - console.log('Coolify realtime terminal server listening on port 6002. Let the hacking begin!'); -}); diff --git a/docker/development/Dockerfile b/docker/development/Dockerfile deleted file mode 100644 index 0946004555..0000000000 --- a/docker/development/Dockerfile +++ /dev/null @@ -1,81 +0,0 @@ -# Versions -# https://hub.docker.com/r/serversideup/php/tags?name=8.4-fpm-nginx-alpine -ARG SERVERSIDEUP_PHP_VERSION=8.4-fpm-nginx-alpine -# https://github.com/minio/mc/releases -ARG MINIO_VERSION=RELEASE.2025-02-15T10-36-16Z -# https://github.com/cloudflare/cloudflared/releases -ARG CLOUDFLARED_VERSION=2025.2.0 -# https://www.postgresql.org/support/versioning/ -ARG POSTGRES_VERSION=15 - -# ================================================================= -# Get MinIO client -# ================================================================= -FROM minio/mc:${MINIO_VERSION} AS minio-client - -# ================================================================= -# Final Stage: Production image -# ================================================================= -FROM serversideup/php:${SERVERSIDEUP_PHP_VERSION} - -ARG USER_ID -ARG GROUP_ID -ARG TARGETPLATFORM -ARG POSTGRES_VERSION -ARG CLOUDFLARED_VERSION - -WORKDIR /var/www/html - -USER root - -RUN docker-php-serversideup-set-id www-data $USER_ID:$GROUP_ID && \ - docker-php-serversideup-set-file-permissions --owner $USER_ID:$GROUP_ID --service nginx - -# Install PostgreSQL repository and keys -RUN apk add --no-cache gnupg && \ - mkdir -p /usr/share/keyrings && \ - curl -fSsL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor > /usr/share/keyrings/postgresql.gpg - -# Install system dependencies -RUN apk add --no-cache \ - postgresql${POSTGRES_VERSION}-client \ - openssh-client \ - git \ - git-lfs \ - jq \ - lsof \ - vim - -# Configure shell aliases -RUN echo "alias ll='ls -al'" >> /etc/profile && \ - echo "alias a='php artisan'" >> /etc/profile && \ - echo "alias logs='tail -f storage/logs/laravel.log'" >> /etc/profile - -# Install Cloudflared based on architecture -RUN mkdir -p /usr/local/bin && \ - if [ "${TARGETPLATFORM}" = "linux/amd64" ]; then \ - curl -sSL "https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-amd64" -o /usr/local/bin/cloudflared; \ - elif [ "${TARGETPLATFORM}" = "linux/arm64" ]; then \ - curl -sSL "https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-arm64" -o /usr/local/bin/cloudflared; \ - fi && \ - chmod +x /usr/local/bin/cloudflared - -# Configure PHP -COPY docker/development/etc/php/conf.d/zzz-custom-php.ini /usr/local/etc/php/conf.d/zzz-custom-php.ini -ENV PHP_OPCACHE_ENABLE=0 - -# Configure Nginx and S6 overlay -COPY docker/development/etc/nginx/conf.d/custom.conf /etc/nginx/conf.d/custom.conf -COPY docker/development/etc/nginx/site-opts.d/http.conf /etc/nginx/site-opts.d/http.conf -COPY --chmod=755 docker/development/etc/s6-overlay/ /etc/s6-overlay/ - -RUN mkdir -p /etc/nginx/conf.d && \ - chown -R www-data:www-data /etc/nginx && \ - chmod -R 755 /etc/nginx - -# Install MinIO client -COPY --from=minio-client /usr/bin/mc /usr/bin/mc -RUN chmod +x /usr/bin/mc - -# Switch to non-root user -USER www-data diff --git a/docker/development/etc/nginx/conf.d/custom.conf b/docker/development/etc/nginx/conf.d/custom.conf deleted file mode 100644 index f26dc30495..0000000000 --- a/docker/development/etc/nginx/conf.d/custom.conf +++ /dev/null @@ -1,4 +0,0 @@ -# Custom nginx configuration - -# Disable access logs -access_log off; diff --git a/docker/development/etc/nginx/site-opts.d/http.conf b/docker/development/etc/nginx/site-opts.d/http.conf deleted file mode 100644 index a5bbd78a3a..0000000000 --- a/docker/development/etc/nginx/site-opts.d/http.conf +++ /dev/null @@ -1,43 +0,0 @@ -listen 8080 default_server; -listen [::]:8080 default_server; - -root /var/www/html/public; - -# Set allowed "index" files -index index.html index.htm index.php; - -server_name _; - -charset utf-8; - -# Set max upload to 2048M -client_max_body_size 2048M; - -# Healthchecks: Set /healthcheck to be the healthcheck URL -location /healthcheck { - access_log off; - - # set max 5 seconds for healthcheck - fastcgi_read_timeout 5s; - - include fastcgi_params; - fastcgi_param SCRIPT_NAME /healthcheck; - fastcgi_param SCRIPT_FILENAME /healthcheck; - fastcgi_pass 127.0.0.1:9000; -} - -# Have NGINX try searching for PHP files as well -location / { - try_files $uri $uri/ /index.php?$query_string; -} - -# Pass "*.php" files to PHP-FPM -location ~ \.php$ { - fastcgi_pass 127.0.0.1:9000; - fastcgi_index index.php; - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - include fastcgi_params; - fastcgi_buffers 16 16k; - fastcgi_buffer_size 32k; - fastcgi_read_timeout 99; -} diff --git a/docker/development/etc/php/conf.d/zzz-custom-php.ini b/docker/development/etc/php/conf.d/zzz-custom-php.ini deleted file mode 100644 index e09eda5386..0000000000 --- a/docker/development/etc/php/conf.d/zzz-custom-php.ini +++ /dev/null @@ -1,10 +0,0 @@ -error_reporting = E_ERROR -error_log = /dev/stderr -log_errors = On -log_errors_max_len = 8192 -ignore_repeated_errors = On -ignore_repeated_source = On - -upload_max_filesize = 256M -post_max_size = 256M -memory_limit = ${PHP_MEMORY_LIMIT:-512M} diff --git a/docker/development/etc/s6-overlay/s6-rc.d/horizon/run b/docker/development/etc/s6-overlay/s6-rc.d/horizon/run deleted file mode 100644 index ada19b3a30..0000000000 --- a/docker/development/etc/s6-overlay/s6-rc.d/horizon/run +++ /dev/null @@ -1,12 +0,0 @@ -#!/command/execlineb -P - -# Use with-contenv to ensure environment variables are available -with-contenv -cd /var/www/html - -foreground { - php - artisan - start:horizon -} - diff --git a/docker/development/etc/s6-overlay/s6-rc.d/horizon/type b/docker/development/etc/s6-overlay/s6-rc.d/horizon/type deleted file mode 100644 index 5883cff0cd..0000000000 --- a/docker/development/etc/s6-overlay/s6-rc.d/horizon/type +++ /dev/null @@ -1 +0,0 @@ -longrun diff --git a/docker/development/etc/s6-overlay/s6-rc.d/init-setup/type b/docker/development/etc/s6-overlay/s6-rc.d/init-setup/type deleted file mode 100644 index 3d92b15f2d..0000000000 --- a/docker/development/etc/s6-overlay/s6-rc.d/init-setup/type +++ /dev/null @@ -1 +0,0 @@ -oneshot \ No newline at end of file diff --git a/docker/development/etc/s6-overlay/s6-rc.d/init-setup/up b/docker/development/etc/s6-overlay/s6-rc.d/init-setup/up deleted file mode 100644 index 67e0f5c1a7..0000000000 --- a/docker/development/etc/s6-overlay/s6-rc.d/init-setup/up +++ /dev/null @@ -1,22 +0,0 @@ -#!/command/execlineb -P - -# Use with-contenv to ensure environment variables are available -with-contenv -cd /var/www/html -foreground { - composer - install -} -foreground { - php - artisan - migrate - --step -} -foreground { - php - artisan - dev - --init -} - diff --git a/docker/development/etc/s6-overlay/s6-rc.d/scheduler-worker/dependencies.d/init-setup b/docker/development/etc/s6-overlay/s6-rc.d/scheduler-worker/dependencies.d/init-setup deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docker/development/etc/s6-overlay/s6-rc.d/scheduler-worker/run b/docker/development/etc/s6-overlay/s6-rc.d/scheduler-worker/run deleted file mode 100644 index b81a448338..0000000000 --- a/docker/development/etc/s6-overlay/s6-rc.d/scheduler-worker/run +++ /dev/null @@ -1,13 +0,0 @@ -#!/command/execlineb -P - -# Use with-contenv to ensure environment variables are available -with-contenv -cd /var/www/html - -foreground { - php - artisan - start:scheduler -} - - diff --git a/docker/development/etc/s6-overlay/s6-rc.d/scheduler-worker/type b/docker/development/etc/s6-overlay/s6-rc.d/scheduler-worker/type deleted file mode 100644 index 5883cff0cd..0000000000 --- a/docker/development/etc/s6-overlay/s6-rc.d/scheduler-worker/type +++ /dev/null @@ -1 +0,0 @@ -longrun diff --git a/docker/development/etc/s6-overlay/s6-rc.d/user/contents.d/horizon b/docker/development/etc/s6-overlay/s6-rc.d/user/contents.d/horizon deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docker/development/etc/s6-overlay/s6-rc.d/user/contents.d/init-setup b/docker/development/etc/s6-overlay/s6-rc.d/user/contents.d/init-setup deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docker/development/etc/s6-overlay/s6-rc.d/user/contents.d/scheduler-worker b/docker/development/etc/s6-overlay/s6-rc.d/user/contents.d/scheduler-worker deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docker/production/Dockerfile b/docker/production/Dockerfile deleted file mode 100644 index 86fae4a13b..0000000000 --- a/docker/production/Dockerfile +++ /dev/null @@ -1,140 +0,0 @@ -# Versions -# https://hub.docker.com/r/serversideup/php/tags?name=8.4-fpm-nginx-alpine -ARG SERVERSIDEUP_PHP_VERSION=8.4-fpm-nginx-alpine -# https://github.com/minio/mc/releases -ARG MINIO_VERSION=RELEASE.2025-02-15T10-36-16Z -# https://github.com/cloudflare/cloudflared/releases -ARG CLOUDFLARED_VERSION=2025.2.0 -# https://www.postgresql.org/support/versioning/ -ARG POSTGRES_VERSION=15 - -# Add user/group -ARG USER_ID=9999 -ARG GROUP_ID=9999 - -# ================================================================= -# Stage 1: Composer dependencies -# ================================================================= -FROM serversideup/php:${SERVERSIDEUP_PHP_VERSION} AS base - -USER root - -ARG USER_ID -ARG GROUP_ID - -RUN docker-php-serversideup-set-id www-data $USER_ID:$GROUP_ID && \ - docker-php-serversideup-set-file-permissions --owner $USER_ID:$GROUP_ID --service nginx - -WORKDIR /var/www/html -COPY --chown=www-data:www-data composer.json composer.lock ./ -RUN composer install --no-dev --no-interaction --no-plugins --no-scripts --prefer-dist - -USER www-data - -# ================================================================= -# Stage 2: Frontend assets compilation -# ================================================================= -FROM node:20-alpine AS static-assets - -WORKDIR /app -COPY package*.json vite.config.js tailwind.config.js postcss.config.cjs ./ -RUN npm ci -COPY . . -RUN npm run build - -# ================================================================= -# Stage 3: Get MinIO client -# ================================================================= -FROM minio/mc:${MINIO_VERSION} AS minio-client - -# ================================================================= -# Final Stage: Production image -# ================================================================= -FROM serversideup/php:${SERVERSIDEUP_PHP_VERSION} - -ARG USER_ID -ARG GROUP_ID -ARG TARGETPLATFORM -ARG POSTGRES_VERSION -ARG CLOUDFLARED_VERSION -ARG CI=true - -WORKDIR /var/www/html - -USER root - -RUN docker-php-serversideup-set-id www-data $USER_ID:$GROUP_ID && \ - docker-php-serversideup-set-file-permissions --owner $USER_ID:$GROUP_ID --service nginx - -# Install PostgreSQL repository and keys -RUN apk add --no-cache gnupg && \ - mkdir -p /usr/share/keyrings && \ - curl -fSsL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor > /usr/share/keyrings/postgresql.gpg - -# Install system dependencies -RUN apk add --no-cache \ - postgresql${POSTGRES_VERSION}-client \ - openssh-client \ - git \ - git-lfs \ - jq \ - lsof \ - vim - -# Configure shell aliases -RUN echo "alias ll='ls -al'" >> /etc/profile && \ - echo "alias a='php artisan'" >> /etc/profile && \ - echo "alias logs='tail -f storage/logs/laravel.log'" >> /etc/profile - -# Install Cloudflared based on architecture -RUN mkdir -p /usr/local/bin && \ - if [ "${TARGETPLATFORM}" = "linux/amd64" ]; then \ - curl -sSL "https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-amd64" -o /usr/local/bin/cloudflared; \ - elif [ "${TARGETPLATFORM}" = "linux/arm64" ]; then \ - curl -sSL "https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-arm64" -o /usr/local/bin/cloudflared; \ - fi && \ - chmod +x /usr/local/bin/cloudflared - -# Configure PHP -COPY docker/production/etc/php/conf.d/zzz-custom-php.ini /usr/local/etc/php/conf.d/zzz-custom-php.ini -ENV PHP_OPCACHE_ENABLE=1 - -# Configure entrypoint -COPY --chmod=755 docker/production/entrypoint.d/ /etc/entrypoint.d - -# Copy application files from previous stages -COPY --from=base --chown=www-data:www-data /var/www/html/vendor ./vendor -COPY --from=static-assets --chown=www-data:www-data /app/public/build ./public/build - -# Copy application source code -COPY --chown=www-data:www-data composer.json composer.lock ./ -COPY --chown=www-data:www-data app ./app -COPY --chown=www-data:www-data bootstrap ./bootstrap -COPY --chown=www-data:www-data config ./config -COPY --chown=www-data:www-data database ./database -COPY --chown=www-data:www-data lang ./lang -COPY --chown=www-data:www-data public ./public -COPY --chown=www-data:www-data routes ./routes -COPY --chown=www-data:www-data storage ./storage -COPY --chown=www-data:www-data templates ./templates -COPY --chown=www-data:www-data resources/views ./resources/views -COPY --chown=www-data:www-data artisan artisan -COPY --chown=www-data:www-data openapi.yaml ./openapi.yaml - -RUN composer dump-autoload - -# Configure Nginx and S6 overlay -COPY docker/production/etc/nginx/conf.d/custom.conf /etc/nginx/conf.d/custom.conf -COPY docker/production/etc/nginx/site-opts.d/http.conf /etc/nginx/site-opts.d/http.conf -COPY --chmod=755 docker/production/etc/s6-overlay/ /etc/s6-overlay/ - -RUN mkdir -p /etc/nginx/conf.d && \ - chown -R www-data:www-data /etc/nginx && \ - chmod -R 755 /etc/nginx - -# Install MinIO client -COPY --from=minio-client /usr/bin/mc /usr/bin/mc -RUN chmod +x /usr/bin/mc - -# Switch to non-root user -USER www-data diff --git a/docker/production/entrypoint.d/99-debug-mode.sh b/docker/production/entrypoint.d/99-debug-mode.sh deleted file mode 100644 index e0a1813735..0000000000 --- a/docker/production/entrypoint.d/99-debug-mode.sh +++ /dev/null @@ -1,8 +0,0 @@ -# Debug mode -if [ "$APP_DEBUG" = "true" ]; then - echo "Debug mode is enabled" - echo "Installing development dependencies..." - composer install --dev --no-scripts - echo "Clearing optimized classes..." - php artisan optimize:clear -fi diff --git a/docker/production/etc/nginx/conf.d/custom.conf b/docker/production/etc/nginx/conf.d/custom.conf deleted file mode 100644 index f26dc30495..0000000000 --- a/docker/production/etc/nginx/conf.d/custom.conf +++ /dev/null @@ -1,4 +0,0 @@ -# Custom nginx configuration - -# Disable access logs -access_log off; diff --git a/docker/production/etc/nginx/site-opts.d/http.conf b/docker/production/etc/nginx/site-opts.d/http.conf deleted file mode 100644 index a5bbd78a3a..0000000000 --- a/docker/production/etc/nginx/site-opts.d/http.conf +++ /dev/null @@ -1,43 +0,0 @@ -listen 8080 default_server; -listen [::]:8080 default_server; - -root /var/www/html/public; - -# Set allowed "index" files -index index.html index.htm index.php; - -server_name _; - -charset utf-8; - -# Set max upload to 2048M -client_max_body_size 2048M; - -# Healthchecks: Set /healthcheck to be the healthcheck URL -location /healthcheck { - access_log off; - - # set max 5 seconds for healthcheck - fastcgi_read_timeout 5s; - - include fastcgi_params; - fastcgi_param SCRIPT_NAME /healthcheck; - fastcgi_param SCRIPT_FILENAME /healthcheck; - fastcgi_pass 127.0.0.1:9000; -} - -# Have NGINX try searching for PHP files as well -location / { - try_files $uri $uri/ /index.php?$query_string; -} - -# Pass "*.php" files to PHP-FPM -location ~ \.php$ { - fastcgi_pass 127.0.0.1:9000; - fastcgi_index index.php; - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - include fastcgi_params; - fastcgi_buffers 16 16k; - fastcgi_buffer_size 32k; - fastcgi_read_timeout 99; -} diff --git a/docker/production/etc/php/conf.d/zzz-custom-php.ini b/docker/production/etc/php/conf.d/zzz-custom-php.ini deleted file mode 100644 index 4002b8f166..0000000000 --- a/docker/production/etc/php/conf.d/zzz-custom-php.ini +++ /dev/null @@ -1,10 +0,0 @@ -error_reporting = E_ERROR -error_log = /var/www/html/storage/logs/php-error.log -log_errors = Off -log_errors_max_len = 8192 -ignore_repeated_errors = On -ignore_repeated_source = On - -upload_max_filesize = 256M -post_max_size = 256M -memory_limit = ${PHP_MEMORY_LIMIT:-512M} diff --git a/docker/production/etc/s6-overlay/s6-rc.d/db-migration/type b/docker/production/etc/s6-overlay/s6-rc.d/db-migration/type deleted file mode 100644 index bdd22a1850..0000000000 --- a/docker/production/etc/s6-overlay/s6-rc.d/db-migration/type +++ /dev/null @@ -1 +0,0 @@ -oneshot diff --git a/docker/production/etc/s6-overlay/s6-rc.d/db-migration/up b/docker/production/etc/s6-overlay/s6-rc.d/db-migration/up deleted file mode 100644 index c2548d1360..0000000000 --- a/docker/production/etc/s6-overlay/s6-rc.d/db-migration/up +++ /dev/null @@ -1,11 +0,0 @@ -#!/command/execlineb -P - -# Use with-contenv to ensure environment variables are available -with-contenv -cd /var/www/html -foreground { - php - artisan - start:migration -} - diff --git a/docker/production/etc/s6-overlay/s6-rc.d/horizon/dependencies.d/init-script b/docker/production/etc/s6-overlay/s6-rc.d/horizon/dependencies.d/init-script deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docker/production/etc/s6-overlay/s6-rc.d/horizon/run b/docker/production/etc/s6-overlay/s6-rc.d/horizon/run deleted file mode 100644 index be66476079..0000000000 --- a/docker/production/etc/s6-overlay/s6-rc.d/horizon/run +++ /dev/null @@ -1,11 +0,0 @@ -#!/command/execlineb -P - -# Use with-contenv to ensure environment variables are available -with-contenv -cd /var/www/html -foreground { - php - artisan - start:horizon -} - diff --git a/docker/production/etc/s6-overlay/s6-rc.d/horizon/type b/docker/production/etc/s6-overlay/s6-rc.d/horizon/type deleted file mode 100644 index 5883cff0cd..0000000000 --- a/docker/production/etc/s6-overlay/s6-rc.d/horizon/type +++ /dev/null @@ -1 +0,0 @@ -longrun diff --git a/docker/production/etc/s6-overlay/s6-rc.d/init-script/dependencies.d/init-seeder b/docker/production/etc/s6-overlay/s6-rc.d/init-script/dependencies.d/init-seeder deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docker/production/etc/s6-overlay/s6-rc.d/init-script/type b/docker/production/etc/s6-overlay/s6-rc.d/init-script/type deleted file mode 100644 index bdd22a1850..0000000000 --- a/docker/production/etc/s6-overlay/s6-rc.d/init-script/type +++ /dev/null @@ -1 +0,0 @@ -oneshot diff --git a/docker/production/etc/s6-overlay/s6-rc.d/init-script/up b/docker/production/etc/s6-overlay/s6-rc.d/init-script/up deleted file mode 100644 index 3fad5f2c5f..0000000000 --- a/docker/production/etc/s6-overlay/s6-rc.d/init-script/up +++ /dev/null @@ -1,12 +0,0 @@ -#!/command/execlineb -P - -# Use with-contenv to ensure environment variables are available -with-contenv -cd /var/www/html -foreground { - php - artisan - app:init -} - - diff --git a/docker/production/etc/s6-overlay/s6-rc.d/init-seeder/dependencies.d/db-migration b/docker/production/etc/s6-overlay/s6-rc.d/init-seeder/dependencies.d/db-migration deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docker/production/etc/s6-overlay/s6-rc.d/init-seeder/type b/docker/production/etc/s6-overlay/s6-rc.d/init-seeder/type deleted file mode 100644 index bdd22a1850..0000000000 --- a/docker/production/etc/s6-overlay/s6-rc.d/init-seeder/type +++ /dev/null @@ -1 +0,0 @@ -oneshot diff --git a/docker/production/etc/s6-overlay/s6-rc.d/init-seeder/up b/docker/production/etc/s6-overlay/s6-rc.d/init-seeder/up deleted file mode 100644 index 007f4233e5..0000000000 --- a/docker/production/etc/s6-overlay/s6-rc.d/init-seeder/up +++ /dev/null @@ -1,12 +0,0 @@ -#!/command/execlineb -P - -# Use with-contenv to ensure environment variables are available -with-contenv -cd /var/www/html -foreground { - php - artisan - start:seeder -} - - diff --git a/docker/production/etc/s6-overlay/s6-rc.d/scheduler-worker/dependencies.d/init-script b/docker/production/etc/s6-overlay/s6-rc.d/scheduler-worker/dependencies.d/init-script deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docker/production/etc/s6-overlay/s6-rc.d/scheduler-worker/run b/docker/production/etc/s6-overlay/s6-rc.d/scheduler-worker/run deleted file mode 100644 index a2ecb0a73c..0000000000 --- a/docker/production/etc/s6-overlay/s6-rc.d/scheduler-worker/run +++ /dev/null @@ -1,10 +0,0 @@ -#!/command/execlineb -P - -# Use with-contenv to ensure environment variables are available -with-contenv -cd /var/www/html -foreground { - php - artisan - start:scheduler -} diff --git a/docker/production/etc/s6-overlay/s6-rc.d/scheduler-worker/type b/docker/production/etc/s6-overlay/s6-rc.d/scheduler-worker/type deleted file mode 100644 index 5883cff0cd..0000000000 --- a/docker/production/etc/s6-overlay/s6-rc.d/scheduler-worker/type +++ /dev/null @@ -1 +0,0 @@ -longrun diff --git a/docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/db-migration b/docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/db-migration deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/horizon b/docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/horizon deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/init-script b/docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/init-script deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/init-seeder b/docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/init-seeder deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/scheduler-worker b/docker/production/etc/s6-overlay/s6-rc.d/user/contents.d/scheduler-worker deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docker/testing-host/Dockerfile b/docker/testing-host/Dockerfile deleted file mode 100644 index c6f5d800e3..0000000000 --- a/docker/testing-host/Dockerfile +++ /dev/null @@ -1,36 +0,0 @@ -# Versions -# https://download.docker.com/linux/static/stable/ -ARG DOCKER_VERSION=28.0.0 -# https://github.com/docker/compose/releases -ARG DOCKER_COMPOSE_VERSION=2.33.1 -# https://github.com/docker/buildx/releases -ARG DOCKER_BUILDX_VERSION=0.21.1 - - -FROM debian:12-slim - -ARG TARGETPLATFORM -ARG DOCKER_VERSION -ARG DOCKER_COMPOSE_VERSION -ARG DOCKER_BUILDX_VERSION - -USER root -WORKDIR /root -ENV PATH="/host/usr/local/sbin:/host/usr/local/bin:/host/usr/sbin:/host/usr/bin:/host/sbin:/host/bin:$PATH" - -RUN apt update && apt -y install openssh-client openssh-server curl wget git jq jc -RUN mkdir -p ~/.docker/cli-plugins -RUN curl -sSL https://github.com/docker/buildx/releases/download/v${DOCKER_BUILDX_VERSION}/buildx-v${DOCKER_BUILDX_VERSION}.linux-amd64 -o ~/.docker/cli-plugins/docker-buildx -RUN curl -sSL https://github.com/docker/compose/releases/download/v${DOCKER_COMPOSE_VERSION}/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose -RUN (curl -sSL https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz | tar -C /usr/bin/ --no-same-owner -xzv --strip-components=1 docker/docker) -RUN chmod +x ~/.docker/cli-plugins/docker-compose /usr/bin/docker /root/.docker/cli-plugins/docker-buildx - - -# Setup sshd -RUN ssh-keygen -A -RUN mkdir -p /run/sshd -RUN mkdir -p ~/.ssh -RUN echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFuGmoeGq/pojrsyP1pszcNVuZx9iFkCELtxrh31QJ68 coolify@coolify-instance" >> ~/.ssh/authorized_keys - -EXPOSE 22 -CMD ["/usr/sbin/sshd", "-D", "-o", "ListenAddress=0.0.0.0", "-o", "Port=22"] diff --git a/hooks/pre-commit b/hooks/pre-commit deleted file mode 100644 index 69a5a9d416..0000000000 --- a/hooks/pre-commit +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh -# Detect whether /dev/tty is available & functional -if sh -c ": >/dev/tty" >/dev/null 2>/dev/null; then - exec < /dev/tty -fi - -# Get list of stashed PHP files -stashed_files=$(git diff --cached --name-only --diff-filter=ACM -- '*.php') - -# If there are no stashed PHP files, exit early -if [ -z "$stashed_files" ]; then - exit 0 -fi - -# Set files variable to only include stashed PHP files -files="$stashed_files" - -$(pwd)/vendor/bin/pint $files -q -if [ $? -eq 0 ]; then - git add $files -fi diff --git a/lang/ar.json b/lang/ar.json deleted file mode 100644 index 9befd1e4a1..0000000000 --- a/lang/ar.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "auth.login": "تسجيل الدخول", - "auth.login.authentik": "تسجيل الدخول باستخدام Authentik", - "auth.login.azure": "تسجيل الدخول باستخدام Microsoft", - "auth.login.bitbucket": "تسجيل الدخول باستخدام Bitbucket", - "auth.login.github": "تسجيل الدخول باستخدام GitHub", - "auth.login.gitlab": "تسجيل الدخول باستخدام Gitlab", - "auth.login.google": "تسجيل الدخول باستخدام Google", - "auth.login.infomaniak": "تسجيل الدخول باستخدام Infomaniak", - "auth.already_registered": "هل سبق لك التسجيل؟", - "auth.confirm_password": "تأكيد كلمة المرور", - "auth.forgot_password": "نسيت كلمة المرور", - "auth.forgot_password_send_email": "إرسال بريد إلكتروني لإعادة تعيين كلمة المرور", - "auth.register_now": "تسجيل", - "auth.logout": "تسجيل الخروج", - "auth.register": "تسجيل", - "auth.registration_disabled": "تم تعطيل التسجيل. يرجى التواصل مع المسؤول.", - "auth.reset_password": "إعادة تعيين كلمة المرور", - "auth.failed": "هذه البيانات لا تتطابق مع سجلاتنا.", - "auth.failed.callback": "فشل في معالجة استدعاء من مزود تسجيل الدخول.", - "auth.failed.password": "كلمة المرور المقدمة غير صحيحة.", - "auth.failed.email": "لا يمكننا العثور على مستخدم بهذا البريد الإلكتروني.", - "auth.throttle": "عدد محاولات تسجيل الدخول كثيرة جدًا. يرجى المحاولة مرة أخرى في :seconds ثانية.", - "input.name": "الاسم", - "input.email": "البريد الإلكتروني", - "input.password": "كلمة المرور", - "input.password.again": "كلمة المرور مرة أخرى", - "input.code": "الرمز لمرة واحدة", - "input.recovery_code": "رمز الاسترداد", - "button.save": "حفظ", - "repository.url": "أمثلة
للمستودعات العامة، استخدم https://....
للمستودعات الخاصة، استخدم git@....

سيتم تحديد الفرع main لـ https://github.com/coollabsio/coolify-examples
سيتم تحديد الفرع nodejs-fastify لـ https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify
سيتم تحديد الفرع main لـ https://gitea.com/sedlav/expressjs.git
سيتم تحديد الفرع main لـ https://gitlab.com/andrasbacsai/nodejs-example.git.", - "service.stop": "سيتم إيقاف هذه الخدمة.", - "resource.docker_cleanup": "قم بتشغيل Docker Cleanup (قم بإزالة الصور غير المستخدمة وذاكرة التخزين المؤقت للمنشئ).", - "resource.non_persistent": "سيتم حذف جميع البيانات غير الدائمة.", - "resource.delete_volumes": "حذف جميع المجلدات والملفات المرتبطة بهذا المورد بشكل دائم.", - "resource.delete_connected_networks": "حذف جميع الشبكات غير المحددة مسبقًا والمرتبطة بهذا المورد بشكل دائم.", - "resource.delete_configurations": "حذف جميع ملفات التعريف من الخادم بشكل دائم.", - "database.delete_backups_locally": "حذف كافة النسخ الاحتياطية نهائيًا من التخزين المحلي.", - "warning.sslipdomain": "تم حفظ ملفات التعريف الخاصة بك، ولكن استخدام نطاق sslip مع https غير مستحسن، لأن خوادم Let's Encrypt مع هذا النطاق العام محدودة المعدل (ستفشل عملية التحقق من شهادة SSL).

استخدم نطاقك الخاص بدلاً من ذلك." -} diff --git a/lang/cs.json b/lang/cs.json deleted file mode 100644 index 270fd272ba..0000000000 --- a/lang/cs.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "auth.login": "Přihlásit se", - "auth.login.azure": "Přihlásit se pomocí Microsoftu", - "auth.login.bitbucket": "Přihlásit se pomocí Bitbucketu", - "auth.login.github": "Přihlásit se pomocí GitHubu", - "auth.login.gitlab": "Přihlásit se pomocí Gitlabu", - "auth.login.google": "Přihlásit se pomocí Google", - "auth.login.infomaniak": "Přihlásit se pomocí Infomaniak", - "auth.already_registered": "Již jste registrováni?", - "auth.confirm_password": "Potvrďte heslo", - "auth.forgot_password": "Zapomněli jste heslo", - "auth.forgot_password_send_email": "Poslat e-mail pro resetování hesla", - "auth.register_now": "Registrovat se", - "auth.logout": "Odhlásit se", - "auth.register": "Registrovat se", - "auth.registration_disabled": "Registrace je zakázána. Kontaktujte prosím administrátora.", - "auth.reset_password": "Obnovit heslo", - "auth.failed": "Tyto údaje neodpovídají našim záznamům.", - "auth.failed.callback": "Nepodařilo se zpracovat zpětné volání od poskytovatele přihlášení.", - "auth.failed.password": "Zadané heslo je nesprávné.", - "auth.failed.email": "Nemůžeme najít uživatele s touto e-mailovou adresou.", - "auth.throttle": "Příliš mnoho pokusů o přihlášení. Zkuste to prosím znovu za :seconds sekund.", - "input.name": "Jméno", - "input.email": "E-mail", - "input.password": "Heslo", - "input.password.again": "Heslo znovu", - "input.code": "Jednorázový kód", - "input.recovery_code": "Obnovovací kód", - "button.save": "Uložit", - "repository.url": "Příklady
Pro veřejné repozitáře, použijte https://....
Pro soukromé repozitáře, použijte git@....

https://github.com/coollabsio/coolify-examples main branch bude zvolena
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify branch bude vybrána.
https://gitea.com/sedlav/expressjs.git main branch vybrána.
https://gitlab.com/andrasbacsai/nodejs-example.git main branch bude vybrána." -} diff --git a/lang/de.json b/lang/de.json deleted file mode 100644 index c5644e3a7a..0000000000 --- a/lang/de.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "auth.login": "Anmelden", - "auth.login.azure": "Mit Microsoft anmelden", - "auth.login.bitbucket": "Mit Bitbucket anmelden", - "auth.login.github": "Mit GitHub anmelden", - "auth.login.gitlab": "Mit GitLab anmelden", - "auth.login.google": "Mit Google anmelden", - "auth.login.infomaniak": "Mit Infomaniak anmelden", - "auth.already_registered": "Bereits registriert?", - "auth.confirm_password": "Passwort bestätigen", - "auth.forgot_password": "Passwort vergessen", - "auth.forgot_password_send_email": "Passwort zurücksetzen E-Mail senden", - "auth.register_now": "Registrieren", - "auth.logout": "Abmelden", - "auth.register": "Registrieren", - "auth.registration_disabled": "Registrierung ist deaktiviert. Bitte kontaktiere einen Administrator.", - "auth.reset_password": "Passwort zurücksetzen", - "auth.failed": "Diese Anmeldedaten wurden nicht gefunden.", - "auth.failed.callback": "Fehlerhafte Verarbeitung der Antwort des Anmeldeanbieters.", - "auth.failed.password": "Das angegebene Passwort ist inkorrekt.", - "auth.failed.email": "Wir können keinen Benutzer mit dieser E-Mail Adresse finden.", - "auth.throttle": "Zu viele Anmeldeversuche. Bitte versuche es in :seconds Sekunden erneut.", - "input.name": "Name", - "input.email": "E-Mail", - "input.password": "Passwort", - "input.password.again": "Passwort wiederholen", - "input.code": "Einmalcode", - "input.recovery_code": "Wiederherstellungscode", - "button.save": "Speichern", - "repository.url": "Beispiele
Für öffentliche Repositories benutze https://....
Für private Repositories benutze git@....

https://github.com/coollabsio/coolify-examples main Branch wird ausgewählt
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify Branch wird ausgewählt.
https://gitea.com/sedlav/expressjs.git main Branch wird ausgewählt.
https://gitlab.com/andrasbacsai/nodejs-example.git main Branch wird ausgewählt." -} diff --git a/lang/en.json b/lang/en.json deleted file mode 100644 index cdca686013..0000000000 --- a/lang/en.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "auth.login": "Login", - "auth.login.authentik": "Login with Authentik", - "auth.login.azure": "Login with Microsoft", - "auth.login.bitbucket": "Login with Bitbucket", - "auth.login.github": "Login with GitHub", - "auth.login.gitlab": "Login with Gitlab", - "auth.login.google": "Login with Google", - "auth.login.infomaniak": "Login with Infomaniak", - "auth.already_registered": "Already registered?", - "auth.confirm_password": "Confirm password", - "auth.forgot_password": "Forgot password", - "auth.forgot_password_send_email": "Send password reset email", - "auth.register_now": "Register", - "auth.logout": "Logout", - "auth.register": "Register", - "auth.registration_disabled": "Registration is disabled. Please contact the administrator.", - "auth.reset_password": "Reset password", - "auth.failed": "These credentials do not match our records.", - "auth.failed.callback": "Failed to process callback from login provider.", - "auth.failed.password": "The provided password is incorrect.", - "auth.failed.email": "We can't find a user with that e-mail address.", - "auth.throttle": "Too many login attempts. Please try again in :seconds seconds.", - "input.name": "Name", - "input.email": "Email", - "input.password": "Password", - "input.password.again": "Password again", - "input.code": "One-time code", - "input.recovery_code": "Recovery code", - "button.save": "Save", - "repository.url": "Examples
For Public repositories, use https://....
For Private repositories, use git@....

https://github.com/coollabsio/coolify-examples main branch will be selected
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify branch will be selected.
https://gitea.com/sedlav/expressjs.git main branch will be selected.
https://gitlab.com/andrasbacsai/nodejs-example.git main branch will be selected.", - "service.stop": "This service will be stopped.", - "resource.docker_cleanup": "Run Docker Cleanup (remove unused images and builder cache).", - "resource.non_persistent": "All non-persistent data will be deleted.", - "resource.delete_volumes": "Permanently delete all volumes associated with this resource.", - "resource.delete_connected_networks": "Permanently delete all non-predefined networks associated with this resource.", - "resource.delete_configurations": "Permanently delete all configuration files from the server.", - "database.delete_backups_locally": "All backups will be permanently deleted from local storage.", - "warning.sslipdomain": "Your configuration is saved, but sslip domain with https is NOT recommended, because Let's Encrypt servers with this public domain are rate limited (SSL certificate validation will fail).

Use your own domain instead." -} diff --git a/lang/es.json b/lang/es.json deleted file mode 100644 index aceacd4625..0000000000 --- a/lang/es.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "auth.login": "Iniciar Sesión", - "auth.login.azure": "Acceder con Microsoft", - "auth.login.bitbucket": "Acceder con Bitbucket", - "auth.login.github": "Acceder con GitHub", - "auth.login.gitlab": "Acceder con Gitlab", - "auth.login.google": "Acceder con Google", - "auth.login.infomaniak": "Acceder con Infomaniak", - "auth.already_registered": "¿Ya estás registrado?", - "auth.confirm_password": "Confirmar contraseña", - "auth.forgot_password": "¿Olvidaste tu contraseña?", - "auth.forgot_password_send_email": "Enviar correo de recuperación de contraseña", - "auth.register_now": "Registrar", - "auth.logout": "Cerrar sesión", - "auth.register": "Registrar", - "auth.registration_disabled": "El registro está desactivado. Por favor contacta con el administrador.", - "auth.reset_password": "Cambiar contraseña", - "auth.failed": "Las credenciales no coinciden con nuestro registro..", - "auth.failed.callback": "Falló el proceso de inicio de sesión con el proveedor.", - "auth.failed.password": "La contraseña es incorrecta.", - "auth.failed.email": "No encontramos un usuario con ese correo.", - "auth.throttle": "Demasiados intentos. Por favor inténtalo en :seconds segundos.", - "input.name": "Nombre", - "input.email": "Correo", - "input.password": "Contraseña", - "input.password.again": "Escribe la contraseña otra vez", - "input.code": "Código de único uso", - "input.recovery_code": "Código de recuperación", - "button.save": "Guardar", - "repository.url": "Examples
Para repositorios públicos, usar https://....
Para repositorios privados, usar git@....

https://github.com/coollabsio/coolify-examples main la rama 'main' será seleccionada.
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify la rama 'nodejs-fastify' será seleccionada.
https://gitea.com/sedlav/expressjs.git main la rama 'main' será seleccionada.
https://gitlab.com/andrasbacsai/nodejs-example.git main la rama 'main' será seleccionada." -} diff --git a/lang/fa.json b/lang/fa.json deleted file mode 100644 index 7a714e6266..0000000000 --- a/lang/fa.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "auth.login": "ورود", - "auth.login.azure": "ورود با مایکروسافت", - "auth.login.bitbucket": "ورود با Bitbucket", - "auth.login.github": "ورود با گیت هاب", - "auth.login.gitlab": "ورود با گیت لب", - "auth.login.google": "ورود با گوگل", - "auth.login.infomaniak": "ورود با Infomaniak", - "auth.already_registered": "قبلاً ثبت نام کرده‌اید؟", - "auth.confirm_password": "تایید رمز عبور", - "auth.forgot_password": "فراموشی رمز عبور", - "auth.forgot_password_send_email": "ارسال ایمیل بازیابی رمز عبور", - "auth.register_now": "ثبت نام", - "auth.logout": "خروج", - "auth.register": "ثبت نام", - "auth.registration_disabled": "ثبت نام غیر فعال است. لطفا با ادمین تماس بگیرید.", - "auth.reset_password": "بازیابی رمز عبور", - "auth.failed": "این اطلاعات با سوابق ما مطابقت ندارد.", - "auth.failed.callback": "پردازش بازگشت از ارائه‌دهنده ورود با شکست مواجه شد.", - "auth.failed.password": "رمز عبور ارائه شده نادرست است.", - "auth.failed.email": "ما نمی توانیم کاربر با آدرس ایمیل مورد نظر را پیدا کنیم.", - "auth.throttle": "تعداد تلاش‌های ورود بیش از حد است. لطفاً در :seconds ثانیه دوباره تلاش کنید.", - "input.name": "نام", - "input.email": "ایمیل", - "input.password": "رمز عبور", - "input.password.again": "تکرار رمز عبور", - "input.code": "کد یک‌ بار مصرف", - "input.recovery_code": "کد بازیابی", - "button.save": "ذخیره", - "repository.url": "مثال‌ها
برای مخازن عمومی، از https://... استفاده کنید.
برای مخازن خصوصی، از git@... استفاده کنید.

شاخه main انتخاب خواهد شد.
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify شاخه nodejs-fastify انتخاب خواهد شد.
https://gitea.com/sedlav/expressjs.git شاخه main انتخاب خواهد شد.
https://gitlab.com/andrasbacsai/nodejs-example.git شاخه main انتخاب خواهد شد." -} diff --git a/lang/fr.json b/lang/fr.json deleted file mode 100644 index 68763d5e00..0000000000 --- a/lang/fr.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "auth.login": "Connexion", - "auth.login.authentik": "Connexion avec Authentik", - "auth.login.azure": "Connexion avec Microsoft", - "auth.login.bitbucket": "Connexion avec Bitbucket", - "auth.login.github": "Connexion avec GitHub", - "auth.login.gitlab": "Connexion avec Gitlab", - "auth.login.google": "Connexion avec Google", - "auth.login.infomaniak": "Connexion avec Infomaniak", - "auth.already_registered": "Déjà enregistré ?", - "auth.confirm_password": "Confirmer le mot de passe", - "auth.forgot_password": "Mot de passe oublié", - "auth.forgot_password_send_email": "Envoyer l'email de réinitialisation de mot de passe", - "auth.register_now": "S'enregistrer", - "auth.logout": "Déconnexion", - "auth.register": "S'enregistrer", - "auth.registration_disabled": "L'enregistrement est désactivé. Merci de contacter l'administrateur.", - "auth.reset_password": "Réinitialiser le mot de passe", - "auth.failed": "Aucune correspondance n'a été trouvée pour les informations d'identification renseignées.", - "auth.failed.callback": "Erreur lors du processus de retour de la plateforme de connexion.", - "auth.failed.password": "Le mot de passe renseigné est incorrect.", - "auth.failed.email": "Aucun utilisateur avec cette adresse email n'a été trouvé.", - "auth.throttle": "Trop de tentatives de connexion. Merci de réessayer dans :seconds secondes.", - "input.name": "Nom", - "input.email": "Email", - "input.password": "Mot de passe", - "input.password.again": "Mot de passe identique", - "input.code": "Code à usage unique", - "input.recovery_code": "Code de récupération", - "button.save": "Sauvegarder", - "repository.url": "Exemples
Pour les dépôts publiques, utilisez https://....
Pour les dépôts privés, utilisez git@....

https://github.com/coollabsio/coolify-examples main sera la branche selectionnée
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify sera la branche selectionnée.
https://gitea.com/sedlav/expressjs.git main sera la branche selectionnée.
https://gitlab.com/andrasbacsai/nodejs-example.git main sera la branche selectionnée.", - "service.stop": "Ce service sera arrêté.", - "resource.docker_cleanup": "Exécuter le nettoyage Docker (supprimer les images inutilisées et le cache du builder).", - "resource.non_persistent": "Toutes les données non persistantes seront supprimées.", - "resource.delete_volumes": "Supprimer définitivement tous les volumes associés à cette ressource.", - "resource.delete_connected_networks": "Supprimer définitivement tous les réseaux non-prédéfinis associés à cette ressource.", - "resource.delete_configurations": "Supprimer définitivement tous les fichiers de configuration du serveur.", - "database.delete_backups_locally": "Toutes les sauvegardes seront définitivement supprimées du stockage local.", - "warning.sslipdomain": "Votre configuration est enregistrée, mais l'utilisation du domaine sslip avec https N'EST PAS recommandée, car les serveurs Let's Encrypt avec ce domaine public sont limités en taux (la validation du certificat SSL échouera).

Utilisez plutôt votre propre domaine." -} diff --git a/lang/it.json b/lang/it.json deleted file mode 100644 index 1923251a5e..0000000000 --- a/lang/it.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "auth.login": "Accedi", - "auth.login.authentik": "Accedi con Authentik", - "auth.login.azure": "Accedi con Microsoft", - "auth.login.bitbucket": "Accedi con Bitbucket", - "auth.login.github": "Accedi con GitHub", - "auth.login.gitlab": "Accedi con Gitlab", - "auth.login.google": "Accedi con Google", - "auth.login.infomaniak": "Accedi con Infomaniak", - "auth.already_registered": "Già registrato?", - "auth.confirm_password": "Conferma password", - "auth.forgot_password": "Password dimenticata", - "auth.forgot_password_send_email": "Invia email per reimpostare la password", - "auth.register_now": "Registrati", - "auth.logout": "Esci", - "auth.register": "Registrati", - "auth.registration_disabled": "La registrazione è disabilitata. Si prega di contattare l'amministratore.", - "auth.reset_password": "Reimposta password", - "auth.failed": "Queste credenziali non corrispondono ai nostri record.", - "auth.failed.callback": "Errore durante l'elaborazione del callback dal provider di accesso.", - "auth.failed.password": "La password fornita non è corretta.", - "auth.failed.email": "Non possiamo trovare un utente con questo indirizzo email.", - "auth.throttle": "Troppi tentativi di accesso. Per favore riprova tra :seconds secondi.", - "input.name": "Nome", - "input.email": "Email", - "input.password": "Password", - "input.password.again": "Ripeti password", - "input.code": "Codice monouso", - "input.recovery_code": "Codice di recupero", - "button.save": "Salva", - "repository.url": "Esempi
Per i repository pubblici, utilizza https://....
Per i repository privati, utilizza git@....

https://github.com/coollabsio/coolify-examples verrà selezionato il branch main
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify verrà selezionato il branch nodejs-fastify.
https://gitea.com/sedlav/expressjs.git verrà selezionato il branch main.
https://gitlab.com/andrasbacsai/nodejs-example.git verrà selezionato il branch main.", - "service.stop": "Questo servizio verrà arrestato.", - "resource.docker_cleanup": "Esegui pulizia Docker (rimuove immagini non utilizzate e cache del builder).", - "resource.non_persistent": "Tutti i dati non persistenti verranno eliminati.", - "resource.delete_volumes": "Elimina definitivamente tutti i volumi associati a questa risorsa.", - "resource.delete_connected_networks": "Elimina definitivamente tutte le reti non predefinite associate a questa risorsa.", - "resource.delete_configurations": "Elimina definitivamente tutti i file di configurazione dal server.", - "database.delete_backups_locally": "Tutti i backup verranno eliminati definitivamente dall'archiviazione locale.", - "warning.sslipdomain": "La tua configurazione è stata salvata, ma il dominio sslip con https NON è raccomandato, poiché i server di Let's Encrypt con questo dominio pubblico hanno limitazioni di frequenza (la convalida del certificato SSL fallirà).

Utilizza invece il tuo dominio personale." -} diff --git a/lang/ja.json b/lang/ja.json deleted file mode 100644 index 4d45899001..0000000000 --- a/lang/ja.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "auth.login": "ログイン", - "auth.login.azure": "Microsoftでログイン", - "auth.login.bitbucket": "Bitbucketでログイン", - "auth.login.github": "GitHubでログイン", - "auth.login.gitlab": "Gitlabでログイン", - "auth.login.google": "Googleでログイン", - "auth.login.infomaniak": "Infomaniakでログイン", - "auth.already_registered": "すでに登録済みですか?", - "auth.confirm_password": "パスワードを確認", - "auth.forgot_password": "パスワードを忘れた", - "auth.forgot_password_send_email": "パスワードリセットメールを送信", - "auth.register_now": "今すぐ登録", - "auth.logout": "ログアウト", - "auth.register": "登録", - "auth.registration_disabled": "登録は無効です。管理者に連絡してください。", - "auth.reset_password": "パスワードをリセット", - "auth.failed": "これらの資格情報は記録と一致しません。", - "auth.failed.callback": "ログインプロバイダーからのコールバックの処理に失敗しました。", - "auth.failed.password": "提供されたパスワードが正しくありません。", - "auth.failed.email": "そのメールアドレスのユーザーが見つかりません。", - "auth.throttle": "ログイン試行回数が多すぎます。:seconds秒後にもう一度お試しください。", - "input.name": "名前", - "input.email": "メール", - "input.password": "パスワード", - "input.password.again": "パスワード再入力", - "input.code": "ワンタイムコード", - "input.recovery_code": "リカバリーコード", - "button.save": "保存", - "repository.url": "
公開リポジトリの場合はhttps://...を使用してください。
プライベートリポジトリの場合はgit@...を使用してください。

https://github.com/coollabsio/coolify-examples mainブランチが選択されます
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastifyブランチが選択されます。
https://gitea.com/sedlav/expressjs.git mainブランチが選択されます。
https://gitlab.com/andrasbacsai/nodejs-example.git mainブランチが選択されます。" -} diff --git a/lang/pt.json b/lang/pt.json deleted file mode 100644 index c5f393e65c..0000000000 --- a/lang/pt.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "auth.login": "Entrar", - "auth.login.azure": "Entrar com Microsoft", - "auth.login.bitbucket": "Entrar com Bitbucket", - "auth.login.github": "Entrar com GitHub", - "auth.login.gitlab": "Entrar com Gitlab", - "auth.login.google": "Entrar com Google", - "auth.login.infomaniak": "Entrar com Infomaniak", - "auth.already_registered": "Já tem uma conta?", - "auth.confirm_password": "Confirmar senha", - "auth.forgot_password": "Esqueceu a senha?", - "auth.forgot_password_send_email": "Enviar e-mail de redefinição de senha", - "auth.register_now": "Cadastrar-se", - "auth.logout": "Sair", - "auth.register": "Cadastrar", - "auth.registration_disabled": "Cadastro desativado. Por favor, entre em contato com o administrador.", - "auth.reset_password": "Redefinir senha", - "auth.failed": "Essas credenciais não correspondem aos nossos registros.", - "auth.failed.callback": "Falha ao processar o callback do provedor de login.", - "auth.failed.password": "A senha fornecida está incorreta.", - "auth.failed.email": "Não encontramos um usuário com esse endereço de e-mail.", - "auth.throttle": "Muitas tentativas de login. Por favor, tente novamente em :seconds segundos.", - "input.name": "Nome", - "input.email": "E-mail", - "input.password": "Senha", - "input.password.again": "Repetir senha", - "input.code": "Código único", - "input.recovery_code": "Código de recuperação", - "button.save": "Salvar", - "repository.url": "Exemplos
Para repositórios públicos, use https://....
Para repositórios privados, use git@....

https://github.com/coollabsio/coolify-examples a branch main será selecionada
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify a branch nodejs-fastify será selecionada.
https://gitea.com/sedlav/expressjs.git a branch main será selecionada.
https://gitlab.com/andrasbacsai/nodejs-example.git a branch main será selecionada." -} diff --git a/lang/ro.json b/lang/ro.json deleted file mode 100644 index 4c7968cfa2..0000000000 --- a/lang/ro.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "auth.login": "Autentificare", - "auth.login.azure": "Autentificare prin Microsoft", - "auth.login.bitbucket": "Autentificare prin Bitbucket", - "auth.login.github": "Autentificare prin GitHub", - "auth.login.gitlab": "Autentificare prin Gitlab", - "auth.login.google": "Autentificare prin Google", - "auth.login.infomaniak": "Autentificare prin Infomaniak", - "auth.already_registered": "Sunteți deja înregistrat?", - "auth.confirm_password": "Confirmați parola", - "auth.forgot_password": "Ați uitat parola", - "auth.forgot_password_send_email": "Trimiteți e-mail-ul pentru resetarea parolei", - "auth.register_now": "Înregistrare", - "auth.logout": "Deconectare", - "auth.register": "Înregistrare", - "auth.registration_disabled": "Înregistrarea este dezactivată. Vă rugăm să contactați administratorul site-ului.", - "auth.reset_password": "Resetare parolă", - "auth.failed": "Autentificare nereușită. Vă rugăm să verificați datele introduse.", - "auth.failed.callback": "A apărut o eroare în timpul autentificării cu furnizorul extern.", - "auth.failed.password": "Parola furnizată este incorectă.", - "auth.failed.email": "Nu putem găsi un utilizator cu această adresă de e-mail.", - "auth.throttle": "Prea multe încercări de autentificare. Vă rugăm să încercați din nou în :seconds secunde.", - "input.name": "Nume", - "input.email": "E-mail", - "input.password": "Parolă", - "input.password.again": "Repetați parola", - "input.code": "Cod de unică folosință", - "input.recovery_code": "Cod de recuperare", - "button.save": "Salvare", - "repository.url": "Exemple
Pentru depozite publice, utilizați https://....
Pentru depozite private, utilizați git@....

https://github.com/coollabsio/coolify-examples va fi selectată ramura main
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify va fi selectată ramura nodejs-fastify.
https://gitea.com/sedlav/expressjs.git va fi selectată ramura main.
https://gitlab.com/andrasbacsai/nodejs-example.git va fi selectată ramura main.", - "service.stop": "Acest serviciu va fi oprit.", - "resource.docker_cleanup": "Executați curățarea Docker (eliminați imaginile neutilizate și memoria cache a constructorului).", - "resource.non_persistent": "Toate datele nepersistente vor fi șterse.", - "resource.delete_volumes": "Ștergeți definitiv toate volumele asociate cu această resursă.", - "resource.delete_connected_networks": "Ștergeți definitiv toate rețelele non-predefinite asociate cu această resursă.", - "resource.delete_configurations": "Ștergeți definitiv toate fișierele de configurare de pe server.", - "database.delete_backups_locally": "Toate copiile de rezervă vor fi șterse definitiv din stocarea locală." -} diff --git a/lang/tr.json b/lang/tr.json deleted file mode 100644 index 3cbcee4098..0000000000 --- a/lang/tr.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "auth.login": "Giriş", - "auth.login.azure": "Microsoft ile Giriş Yap", - "auth.login.bitbucket": "Bitbucket ile Giriş Yap", - "auth.login.github": "GitHub ile Giriş Yap", - "auth.login.gitlab": "GitLab ile Giriş Yap", - "auth.login.google": "Google ile Giriş Yap", - "auth.login.infomaniak": "Infomaniak ile Giriş Yap", - "auth.already_registered": "Zaten kayıtlı mısınız?", - "auth.confirm_password": "Şifreyi Onayla", - "auth.forgot_password": "Şifremi Unuttum", - "auth.forgot_password_send_email": "Şifre sıfırlama e-postası gönder", - "auth.register_now": "Kayıt Ol", - "auth.logout": "Çıkış Yap", - "auth.register": "Kayıt Ol", - "auth.registration_disabled": "Kayıt devre dışı bırakıldı. Lütfen yöneticiyle iletişime geçin.", - "auth.reset_password": "Şifreyi Sıfırla", - "auth.failed": "Bu kimlik bilgileri kayıtlarımızla eşleşmiyor.", - "auth.failed.callback": "Giriş sağlayıcıdan gelen istek işlenemedi.", - "auth.failed.password": "Sağlanan şifre yanlış.", - "auth.failed.email": "Bu e-posta adresiyle bir kullanıcı bulamıyoruz.", - "auth.throttle": "Çok fazla giriş denemesi. Lütfen :seconds saniye sonra tekrar deneyin.", - "input.name": "İsim", - "input.email": "E-posta", - "input.password": "Şifre", - "input.password.again": "Şifreyi Tekrar Girin", - "input.code": "Tek Kullanımlık Kod", - "input.recovery_code": "Kurtarma Kodu", - "button.save": "Kaydet", - "repository.url": "Örnekler
Halka açık depolar için https://... kullanın.
Özel depolar için git@... kullanın.

https://github.com/coollabsio/coolify-examples main dalı seçilecek
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify dalı seçilecek.
https://gitea.com/sedlav/expressjs.git main dalı seçilecek.
https://gitlab.com/andrasbacsai/nodejs-example.git main dalı seçilecek." -} diff --git a/lang/vi.json b/lang/vi.json deleted file mode 100644 index bb43fd34d4..0000000000 --- a/lang/vi.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "auth.login": "Đăng Nhập", - "auth.login.azure": "Đăng Nhập Bằng Microsoft", - "auth.login.bitbucket": "Đăng Nhập Bằng Bitbucket", - "auth.login.github": "Đăng Nhập Bằng GitHub", - "auth.login.gitlab": "Đăng Nhập Bằng Gitlab", - "auth.login.google": "Đăng Nhập Bằng Google", - "auth.login.infomaniak": "Đăng Nhập Bằng Infomaniak", - "auth.already_registered": "Đã đăng ký?", - "auth.confirm_password": "Nhập lại mật khẩu", - "auth.forgot_password": "Quên mật khẩu", - "auth.forgot_password_send_email": "Gửi email đặt lại mật khẩu", - "auth.register_now": "Đăng ký ngay", - "auth.logout": "Đăng xuất", - "auth.register": "Đăng ký", - "auth.registration_disabled": "Đăng ký không khả dụng. Vui lòng liên hệ quản trị viên.", - "auth.reset_password": "Đặt lại mật khẩu", - "auth.failed": "Thông tin đăng nhập không khớp với bất kỳ tài khoản nào.", - "auth.failed.callback": "Xử lý thông tin từ nhà cung cấp đăng nhập thất bại.", - "auth.failed.password": "Mật khẩu bạn cung cấp không chính xác.", - "auth.failed.email": "Không có người dùng nào đã đăng ký với email đó.", - "auth.throttle": "Quá nhiều lần đăng nhập thất bại. Vui lòng thử lại sau :seconds giây.", - "input.name": "Tên", - "input.email": "Email", - "input.password": "Mật khẩu", - "input.password.again": "Mật khẩu lần nữa", - "input.code": "One-time code", - "input.recovery_code": "Mã khôi phục", - "button.save": "Lưu", - "repository.url": "Ví dụ
Với repo công khai, sử dụng https://....
Với repo riêng tư, sử dụng git@....

https://github.com/coollabsio/coolify-examples nhánh chính sẽ được chọn
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nhánh nodejs-fastify sẽ được chọn.
https://gitea.com/sedlav/expressjs.git nhánh chính sẽ được chọn.
https://gitlab.com/andrasbacsai/nodejs-example.git nhánh chính sẽ được chọn." -} diff --git a/lang/zh-cn.json b/lang/zh-cn.json deleted file mode 100644 index 944887a5fc..0000000000 --- a/lang/zh-cn.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "auth.login": "登录", - "auth.login.azure": "使用 Microsoft 登录", - "auth.login.bitbucket": "使用 Bitbucket 登录", - "auth.login.github": "使用 GitHub 登录", - "auth.login.gitlab": "使用 Gitlab 登录", - "auth.login.google": "使用 Google 登录", - "auth.login.infomaniak": "使用 Infomaniak 登录", - "auth.already_registered": "已经注册?", - "auth.confirm_password": "确认密码", - "auth.forgot_password": "忘记密码", - "auth.forgot_password_send_email": "发送密码重置邮件", - "auth.register_now": "注册", - "auth.logout": "退出登录", - "auth.register": "注册", - "auth.registration_disabled": "注册已禁用,请联系管理员", - "auth.reset_password": "重置密码", - "auth.failed": "这些凭据与我们的记录不符", - "auth.failed.callback": "处理第三方登录的回调时出错", - "auth.failed.password": "密码错误", - "auth.failed.email": "该账户未注册", - "auth.throttle": "登录次数过多,请在 :seconds 秒后重试", - "input.name": "用户名", - "input.email": "邮箱", - "input.password": "密码", - "input.password.again": "确认密码", - "input.code": "验证码", - "input.recovery_code": "恢复码", - "button.save": "保存", - "repository.url": "示例
对于公共代码仓库,请使用 https://...
对于私有代码仓库,请使用 git@...

https://github.com/coollabsio/coolify-examples main 分支将被选择
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify 分支将被选择。
https://gitea.com/sedlav/expressjs.git main 分支将被选择。
https://gitlab.com/andrasbacsai/nodejs-example.git main 分支将被选择" -} diff --git a/lang/zh-tw.json b/lang/zh-tw.json deleted file mode 100644 index c42ebb33e3..0000000000 --- a/lang/zh-tw.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "auth.login": "登入", - "auth.login.azure": "使用 Microsoft 登入", - "auth.login.bitbucket": "使用 Bitbucket 登入", - "auth.login.github": "使用 GitHub 登入", - "auth.login.gitlab": "使用 Gitlab 登入", - "auth.login.google": "使用 Google 登入", - "auth.login.infomaniak": "使用 Infomaniak 登入", - "auth.already_registered": "已經註冊?", - "auth.confirm_password": "確認密碼", - "auth.forgot_password": "忘記密碼", - "auth.forgot_password_send_email": "發送重設密碼電郵", - "auth.register_now": "註冊", - "auth.logout": "登出", - "auth.register": "註冊", - "auth.registration_disabled": "註冊已停用,請聯絡管理員。", - "auth.reset_password": "重設密碼", - "auth.failed": "這些憑證與我們的記錄不符。", - "auth.failed.callback": "無法處理來自登入提供者的回呼。", - "auth.failed.password": "密碼錯誤。", - "auth.failed.email": "找不到該電子郵件地址的使用者。", - "auth.throttle": "登入嘗試次數太多。請在 :seconds 秒後重試。", - "input.name": "名稱", - "input.email": "電子郵件", - "input.password": "密碼", - "input.password.again": "再次輸入密碼", - "input.code": "一次性代碼", - "input.recovery_code": "恢復碼", - "button.save": "儲存", - "repository.url": "例子
對於公共代碼倉庫,請使用 https://...
對於私有代碼倉庫,請使用 git@...

https://github.com/coollabsio/coolify-examples main 分支將被選擇
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify 分支將被選擇。
https://gitea.com/sedlav/expressjs.git main 分支將被選擇。
https://gitlab.com/andrasbacsai/nodejs-example.git main 分支將被選擇。" -} diff --git a/openapi.json b/openapi.json deleted file mode 100644 index 819f229cce..0000000000 --- a/openapi.json +++ /dev/null @@ -1,7988 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "Coolify", - "version": "0.1" - }, - "servers": [ - { - "url": "https:\/\/app.coolify.io\/api\/v1", - "description": "Coolify Cloud API. Change the host to your own instance if you are self-hosting." - } - ], - "paths": { - "\/applications": { - "get": { - "tags": [ - "Applications" - ], - "summary": "List", - "description": "List all applications.", - "operationId": "list-applications", - "responses": { - "200": { - "description": "Get all applications.", - "content": { - "application\/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#\/components\/schemas\/Application" - } - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/applications\/public": { - "post": { - "tags": [ - "Applications" - ], - "summary": "Create (Public)", - "description": "Create new application based on a public git repository.", - "operationId": "create-public-application", - "requestBody": { - "description": "Application object that needs to be created.", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "project_uuid", - "server_uuid", - "environment_name", - "environment_uuid", - "git_repository", - "git_branch", - "build_pack", - "ports_exposes" - ], - "properties": { - "project_uuid": { - "type": "string", - "description": "The project UUID." - }, - "server_uuid": { - "type": "string", - "description": "The server UUID." - }, - "environment_name": { - "type": "string", - "description": "The environment name. You need to provide at least one of environment_name or environment_uuid." - }, - "environment_uuid": { - "type": "string", - "description": "The environment UUID. You need to provide at least one of environment_name or environment_uuid." - }, - "git_repository": { - "type": "string", - "description": "The git repository URL." - }, - "git_branch": { - "type": "string", - "description": "The git branch." - }, - "build_pack": { - "type": "string", - "enum": [ - "nixpacks", - "static", - "dockerfile", - "dockercompose" - ], - "description": "The build pack type." - }, - "ports_exposes": { - "type": "string", - "description": "The ports to expose." - }, - "destination_uuid": { - "type": "string", - "description": "The destination UUID." - }, - "name": { - "type": "string", - "description": "The application name." - }, - "description": { - "type": "string", - "description": "The application description." - }, - "domains": { - "type": "string", - "description": "The application domains." - }, - "git_commit_sha": { - "type": "string", - "description": "The git commit SHA." - }, - "docker_registry_image_name": { - "type": "string", - "description": "The docker registry image name." - }, - "docker_registry_image_tag": { - "type": "string", - "description": "The docker registry image tag." - }, - "is_static": { - "type": "boolean", - "description": "The flag to indicate if the application is static." - }, - "static_image": { - "type": "string", - "enum": [ - "nginx:alpine" - ], - "description": "The static image." - }, - "install_command": { - "type": "string", - "description": "The install command." - }, - "build_command": { - "type": "string", - "description": "The build command." - }, - "start_command": { - "type": "string", - "description": "The start command." - }, - "ports_mappings": { - "type": "string", - "description": "The ports mappings." - }, - "base_directory": { - "type": "string", - "description": "The base directory for all commands." - }, - "publish_directory": { - "type": "string", - "description": "The publish directory." - }, - "health_check_enabled": { - "type": "boolean", - "description": "Health check enabled." - }, - "health_check_path": { - "type": "string", - "description": "Health check path." - }, - "health_check_port": { - "type": "string", - "nullable": true, - "description": "Health check port." - }, - "health_check_host": { - "type": "string", - "nullable": true, - "description": "Health check host." - }, - "health_check_method": { - "type": "string", - "description": "Health check method." - }, - "health_check_return_code": { - "type": "integer", - "description": "Health check return code." - }, - "health_check_scheme": { - "type": "string", - "description": "Health check scheme." - }, - "health_check_response_text": { - "type": "string", - "nullable": true, - "description": "Health check response text." - }, - "health_check_interval": { - "type": "integer", - "description": "Health check interval in seconds." - }, - "health_check_timeout": { - "type": "integer", - "description": "Health check timeout in seconds." - }, - "health_check_retries": { - "type": "integer", - "description": "Health check retries count." - }, - "health_check_start_period": { - "type": "integer", - "description": "Health check start period in seconds." - }, - "limits_memory": { - "type": "string", - "description": "Memory limit." - }, - "limits_memory_swap": { - "type": "string", - "description": "Memory swap limit." - }, - "limits_memory_swappiness": { - "type": "integer", - "description": "Memory swappiness." - }, - "limits_memory_reservation": { - "type": "string", - "description": "Memory reservation." - }, - "limits_cpus": { - "type": "string", - "description": "CPU limit." - }, - "limits_cpuset": { - "type": "string", - "nullable": true, - "description": "CPU set." - }, - "limits_cpu_shares": { - "type": "integer", - "description": "CPU shares." - }, - "custom_labels": { - "type": "string", - "description": "Custom labels." - }, - "custom_docker_run_options": { - "type": "string", - "description": "Custom docker run options." - }, - "post_deployment_command": { - "type": "string", - "description": "Post deployment command." - }, - "post_deployment_command_container": { - "type": "string", - "description": "Post deployment command container." - }, - "pre_deployment_command": { - "type": "string", - "description": "Pre deployment command." - }, - "pre_deployment_command_container": { - "type": "string", - "description": "Pre deployment command container." - }, - "manual_webhook_secret_github": { - "type": "string", - "description": "Manual webhook secret for Github." - }, - "manual_webhook_secret_gitlab": { - "type": "string", - "description": "Manual webhook secret for Gitlab." - }, - "manual_webhook_secret_bitbucket": { - "type": "string", - "description": "Manual webhook secret for Bitbucket." - }, - "manual_webhook_secret_gitea": { - "type": "string", - "description": "Manual webhook secret for Gitea." - }, - "redirect": { - "type": "string", - "nullable": true, - "description": "How to set redirect with Traefik \/ Caddy. www<->non-www.", - "enum": [ - "www", - "non-www", - "both" - ] - }, - "instant_deploy": { - "type": "boolean", - "description": "The flag to indicate if the application should be deployed instantly." - }, - "dockerfile": { - "type": "string", - "description": "The Dockerfile content." - }, - "docker_compose_location": { - "type": "string", - "description": "The Docker Compose location." - }, - "docker_compose_raw": { - "type": "string", - "description": "The Docker Compose raw content." - }, - "docker_compose_custom_start_command": { - "type": "string", - "description": "The Docker Compose custom start command." - }, - "docker_compose_custom_build_command": { - "type": "string", - "description": "The Docker Compose custom build command." - }, - "docker_compose_domains": { - "type": "array", - "description": "The Docker Compose domains." - }, - "watch_paths": { - "type": "string", - "description": "The watch paths." - }, - "use_build_server": { - "type": "boolean", - "nullable": true, - "description": "Use build server." - } - }, - "type": "object" - } - } - } - }, - "responses": { - "201": { - "description": "Application created successfully.", - "content": { - "application\/json": { - "schema": { - "properties": { - "uuid": { - "type": "string" - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/applications\/private-github-app": { - "post": { - "tags": [ - "Applications" - ], - "summary": "Create (Private - GH App)", - "description": "Create new application based on a private repository through a Github App.", - "operationId": "create-private-github-app-application", - "requestBody": { - "description": "Application object that needs to be created.", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "project_uuid", - "server_uuid", - "environment_name", - "environment_uuid", - "github_app_uuid", - "git_repository", - "git_branch", - "build_pack", - "ports_exposes" - ], - "properties": { - "project_uuid": { - "type": "string", - "description": "The project UUID." - }, - "server_uuid": { - "type": "string", - "description": "The server UUID." - }, - "environment_name": { - "type": "string", - "description": "The environment name. You need to provide at least one of environment_name or environment_uuid." - }, - "environment_uuid": { - "type": "string", - "description": "The environment UUID. You need to provide at least one of environment_name or environment_uuid." - }, - "github_app_uuid": { - "type": "string", - "description": "The Github App UUID." - }, - "git_repository": { - "type": "string", - "description": "The git repository URL." - }, - "git_branch": { - "type": "string", - "description": "The git branch." - }, - "ports_exposes": { - "type": "string", - "description": "The ports to expose." - }, - "destination_uuid": { - "type": "string", - "description": "The destination UUID." - }, - "build_pack": { - "type": "string", - "enum": [ - "nixpacks", - "static", - "dockerfile", - "dockercompose" - ], - "description": "The build pack type." - }, - "name": { - "type": "string", - "description": "The application name." - }, - "description": { - "type": "string", - "description": "The application description." - }, - "domains": { - "type": "string", - "description": "The application domains." - }, - "git_commit_sha": { - "type": "string", - "description": "The git commit SHA." - }, - "docker_registry_image_name": { - "type": "string", - "description": "The docker registry image name." - }, - "docker_registry_image_tag": { - "type": "string", - "description": "The docker registry image tag." - }, - "is_static": { - "type": "boolean", - "description": "The flag to indicate if the application is static." - }, - "static_image": { - "type": "string", - "enum": [ - "nginx:alpine" - ], - "description": "The static image." - }, - "install_command": { - "type": "string", - "description": "The install command." - }, - "build_command": { - "type": "string", - "description": "The build command." - }, - "start_command": { - "type": "string", - "description": "The start command." - }, - "ports_mappings": { - "type": "string", - "description": "The ports mappings." - }, - "base_directory": { - "type": "string", - "description": "The base directory for all commands." - }, - "publish_directory": { - "type": "string", - "description": "The publish directory." - }, - "health_check_enabled": { - "type": "boolean", - "description": "Health check enabled." - }, - "health_check_path": { - "type": "string", - "description": "Health check path." - }, - "health_check_port": { - "type": "string", - "nullable": true, - "description": "Health check port." - }, - "health_check_host": { - "type": "string", - "nullable": true, - "description": "Health check host." - }, - "health_check_method": { - "type": "string", - "description": "Health check method." - }, - "health_check_return_code": { - "type": "integer", - "description": "Health check return code." - }, - "health_check_scheme": { - "type": "string", - "description": "Health check scheme." - }, - "health_check_response_text": { - "type": "string", - "nullable": true, - "description": "Health check response text." - }, - "health_check_interval": { - "type": "integer", - "description": "Health check interval in seconds." - }, - "health_check_timeout": { - "type": "integer", - "description": "Health check timeout in seconds." - }, - "health_check_retries": { - "type": "integer", - "description": "Health check retries count." - }, - "health_check_start_period": { - "type": "integer", - "description": "Health check start period in seconds." - }, - "limits_memory": { - "type": "string", - "description": "Memory limit." - }, - "limits_memory_swap": { - "type": "string", - "description": "Memory swap limit." - }, - "limits_memory_swappiness": { - "type": "integer", - "description": "Memory swappiness." - }, - "limits_memory_reservation": { - "type": "string", - "description": "Memory reservation." - }, - "limits_cpus": { - "type": "string", - "description": "CPU limit." - }, - "limits_cpuset": { - "type": "string", - "nullable": true, - "description": "CPU set." - }, - "limits_cpu_shares": { - "type": "integer", - "description": "CPU shares." - }, - "custom_labels": { - "type": "string", - "description": "Custom labels." - }, - "custom_docker_run_options": { - "type": "string", - "description": "Custom docker run options." - }, - "post_deployment_command": { - "type": "string", - "description": "Post deployment command." - }, - "post_deployment_command_container": { - "type": "string", - "description": "Post deployment command container." - }, - "pre_deployment_command": { - "type": "string", - "description": "Pre deployment command." - }, - "pre_deployment_command_container": { - "type": "string", - "description": "Pre deployment command container." - }, - "manual_webhook_secret_github": { - "type": "string", - "description": "Manual webhook secret for Github." - }, - "manual_webhook_secret_gitlab": { - "type": "string", - "description": "Manual webhook secret for Gitlab." - }, - "manual_webhook_secret_bitbucket": { - "type": "string", - "description": "Manual webhook secret for Bitbucket." - }, - "manual_webhook_secret_gitea": { - "type": "string", - "description": "Manual webhook secret for Gitea." - }, - "redirect": { - "type": "string", - "nullable": true, - "description": "How to set redirect with Traefik \/ Caddy. www<->non-www.", - "enum": [ - "www", - "non-www", - "both" - ] - }, - "instant_deploy": { - "type": "boolean", - "description": "The flag to indicate if the application should be deployed instantly." - }, - "dockerfile": { - "type": "string", - "description": "The Dockerfile content." - }, - "docker_compose_location": { - "type": "string", - "description": "The Docker Compose location." - }, - "docker_compose_raw": { - "type": "string", - "description": "The Docker Compose raw content." - }, - "docker_compose_custom_start_command": { - "type": "string", - "description": "The Docker Compose custom start command." - }, - "docker_compose_custom_build_command": { - "type": "string", - "description": "The Docker Compose custom build command." - }, - "docker_compose_domains": { - "type": "array", - "description": "The Docker Compose domains." - }, - "watch_paths": { - "type": "string", - "description": "The watch paths." - }, - "use_build_server": { - "type": "boolean", - "nullable": true, - "description": "Use build server." - } - }, - "type": "object" - } - } - } - }, - "responses": { - "201": { - "description": "Application created successfully.", - "content": { - "application\/json": { - "schema": { - "properties": { - "uuid": { - "type": "string" - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/applications\/private-deploy-key": { - "post": { - "tags": [ - "Applications" - ], - "summary": "Create (Private - Deploy Key)", - "description": "Create new application based on a private repository through a Deploy Key.", - "operationId": "create-private-deploy-key-application", - "requestBody": { - "description": "Application object that needs to be created.", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "project_uuid", - "server_uuid", - "environment_name", - "environment_uuid", - "private_key_uuid", - "git_repository", - "git_branch", - "build_pack", - "ports_exposes" - ], - "properties": { - "project_uuid": { - "type": "string", - "description": "The project UUID." - }, - "server_uuid": { - "type": "string", - "description": "The server UUID." - }, - "environment_name": { - "type": "string", - "description": "The environment name. You need to provide at least one of environment_name or environment_uuid." - }, - "environment_uuid": { - "type": "string", - "description": "The environment UUID. You need to provide at least one of environment_name or environment_uuid." - }, - "private_key_uuid": { - "type": "string", - "description": "The private key UUID." - }, - "git_repository": { - "type": "string", - "description": "The git repository URL." - }, - "git_branch": { - "type": "string", - "description": "The git branch." - }, - "ports_exposes": { - "type": "string", - "description": "The ports to expose." - }, - "destination_uuid": { - "type": "string", - "description": "The destination UUID." - }, - "build_pack": { - "type": "string", - "enum": [ - "nixpacks", - "static", - "dockerfile", - "dockercompose" - ], - "description": "The build pack type." - }, - "name": { - "type": "string", - "description": "The application name." - }, - "description": { - "type": "string", - "description": "The application description." - }, - "domains": { - "type": "string", - "description": "The application domains." - }, - "git_commit_sha": { - "type": "string", - "description": "The git commit SHA." - }, - "docker_registry_image_name": { - "type": "string", - "description": "The docker registry image name." - }, - "docker_registry_image_tag": { - "type": "string", - "description": "The docker registry image tag." - }, - "is_static": { - "type": "boolean", - "description": "The flag to indicate if the application is static." - }, - "static_image": { - "type": "string", - "enum": [ - "nginx:alpine" - ], - "description": "The static image." - }, - "install_command": { - "type": "string", - "description": "The install command." - }, - "build_command": { - "type": "string", - "description": "The build command." - }, - "start_command": { - "type": "string", - "description": "The start command." - }, - "ports_mappings": { - "type": "string", - "description": "The ports mappings." - }, - "base_directory": { - "type": "string", - "description": "The base directory for all commands." - }, - "publish_directory": { - "type": "string", - "description": "The publish directory." - }, - "health_check_enabled": { - "type": "boolean", - "description": "Health check enabled." - }, - "health_check_path": { - "type": "string", - "description": "Health check path." - }, - "health_check_port": { - "type": "string", - "nullable": true, - "description": "Health check port." - }, - "health_check_host": { - "type": "string", - "nullable": true, - "description": "Health check host." - }, - "health_check_method": { - "type": "string", - "description": "Health check method." - }, - "health_check_return_code": { - "type": "integer", - "description": "Health check return code." - }, - "health_check_scheme": { - "type": "string", - "description": "Health check scheme." - }, - "health_check_response_text": { - "type": "string", - "nullable": true, - "description": "Health check response text." - }, - "health_check_interval": { - "type": "integer", - "description": "Health check interval in seconds." - }, - "health_check_timeout": { - "type": "integer", - "description": "Health check timeout in seconds." - }, - "health_check_retries": { - "type": "integer", - "description": "Health check retries count." - }, - "health_check_start_period": { - "type": "integer", - "description": "Health check start period in seconds." - }, - "limits_memory": { - "type": "string", - "description": "Memory limit." - }, - "limits_memory_swap": { - "type": "string", - "description": "Memory swap limit." - }, - "limits_memory_swappiness": { - "type": "integer", - "description": "Memory swappiness." - }, - "limits_memory_reservation": { - "type": "string", - "description": "Memory reservation." - }, - "limits_cpus": { - "type": "string", - "description": "CPU limit." - }, - "limits_cpuset": { - "type": "string", - "nullable": true, - "description": "CPU set." - }, - "limits_cpu_shares": { - "type": "integer", - "description": "CPU shares." - }, - "custom_labels": { - "type": "string", - "description": "Custom labels." - }, - "custom_docker_run_options": { - "type": "string", - "description": "Custom docker run options." - }, - "post_deployment_command": { - "type": "string", - "description": "Post deployment command." - }, - "post_deployment_command_container": { - "type": "string", - "description": "Post deployment command container." - }, - "pre_deployment_command": { - "type": "string", - "description": "Pre deployment command." - }, - "pre_deployment_command_container": { - "type": "string", - "description": "Pre deployment command container." - }, - "manual_webhook_secret_github": { - "type": "string", - "description": "Manual webhook secret for Github." - }, - "manual_webhook_secret_gitlab": { - "type": "string", - "description": "Manual webhook secret for Gitlab." - }, - "manual_webhook_secret_bitbucket": { - "type": "string", - "description": "Manual webhook secret for Bitbucket." - }, - "manual_webhook_secret_gitea": { - "type": "string", - "description": "Manual webhook secret for Gitea." - }, - "redirect": { - "type": "string", - "nullable": true, - "description": "How to set redirect with Traefik \/ Caddy. www<->non-www.", - "enum": [ - "www", - "non-www", - "both" - ] - }, - "instant_deploy": { - "type": "boolean", - "description": "The flag to indicate if the application should be deployed instantly." - }, - "dockerfile": { - "type": "string", - "description": "The Dockerfile content." - }, - "docker_compose_location": { - "type": "string", - "description": "The Docker Compose location." - }, - "docker_compose_raw": { - "type": "string", - "description": "The Docker Compose raw content." - }, - "docker_compose_custom_start_command": { - "type": "string", - "description": "The Docker Compose custom start command." - }, - "docker_compose_custom_build_command": { - "type": "string", - "description": "The Docker Compose custom build command." - }, - "docker_compose_domains": { - "type": "array", - "description": "The Docker Compose domains." - }, - "watch_paths": { - "type": "string", - "description": "The watch paths." - }, - "use_build_server": { - "type": "boolean", - "nullable": true, - "description": "Use build server." - } - }, - "type": "object" - } - } - } - }, - "responses": { - "201": { - "description": "Application created successfully.", - "content": { - "application\/json": { - "schema": { - "properties": { - "uuid": { - "type": "string" - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/applications\/dockerfile": { - "post": { - "tags": [ - "Applications" - ], - "summary": "Create (Dockerfile)", - "description": "Create new application based on a simple Dockerfile.", - "operationId": "create-dockerfile-application", - "requestBody": { - "description": "Application object that needs to be created.", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "project_uuid", - "server_uuid", - "environment_name", - "environment_uuid", - "dockerfile" - ], - "properties": { - "project_uuid": { - "type": "string", - "description": "The project UUID." - }, - "server_uuid": { - "type": "string", - "description": "The server UUID." - }, - "environment_name": { - "type": "string", - "description": "The environment name. You need to provide at least one of environment_name or environment_uuid." - }, - "environment_uuid": { - "type": "string", - "description": "The environment UUID. You need to provide at least one of environment_name or environment_uuid." - }, - "dockerfile": { - "type": "string", - "description": "The Dockerfile content." - }, - "build_pack": { - "type": "string", - "enum": [ - "nixpacks", - "static", - "dockerfile", - "dockercompose" - ], - "description": "The build pack type." - }, - "ports_exposes": { - "type": "string", - "description": "The ports to expose." - }, - "destination_uuid": { - "type": "string", - "description": "The destination UUID." - }, - "name": { - "type": "string", - "description": "The application name." - }, - "description": { - "type": "string", - "description": "The application description." - }, - "domains": { - "type": "string", - "description": "The application domains." - }, - "docker_registry_image_name": { - "type": "string", - "description": "The docker registry image name." - }, - "docker_registry_image_tag": { - "type": "string", - "description": "The docker registry image tag." - }, - "ports_mappings": { - "type": "string", - "description": "The ports mappings." - }, - "base_directory": { - "type": "string", - "description": "The base directory for all commands." - }, - "health_check_enabled": { - "type": "boolean", - "description": "Health check enabled." - }, - "health_check_path": { - "type": "string", - "description": "Health check path." - }, - "health_check_port": { - "type": "string", - "nullable": true, - "description": "Health check port." - }, - "health_check_host": { - "type": "string", - "nullable": true, - "description": "Health check host." - }, - "health_check_method": { - "type": "string", - "description": "Health check method." - }, - "health_check_return_code": { - "type": "integer", - "description": "Health check return code." - }, - "health_check_scheme": { - "type": "string", - "description": "Health check scheme." - }, - "health_check_response_text": { - "type": "string", - "nullable": true, - "description": "Health check response text." - }, - "health_check_interval": { - "type": "integer", - "description": "Health check interval in seconds." - }, - "health_check_timeout": { - "type": "integer", - "description": "Health check timeout in seconds." - }, - "health_check_retries": { - "type": "integer", - "description": "Health check retries count." - }, - "health_check_start_period": { - "type": "integer", - "description": "Health check start period in seconds." - }, - "limits_memory": { - "type": "string", - "description": "Memory limit." - }, - "limits_memory_swap": { - "type": "string", - "description": "Memory swap limit." - }, - "limits_memory_swappiness": { - "type": "integer", - "description": "Memory swappiness." - }, - "limits_memory_reservation": { - "type": "string", - "description": "Memory reservation." - }, - "limits_cpus": { - "type": "string", - "description": "CPU limit." - }, - "limits_cpuset": { - "type": "string", - "nullable": true, - "description": "CPU set." - }, - "limits_cpu_shares": { - "type": "integer", - "description": "CPU shares." - }, - "custom_labels": { - "type": "string", - "description": "Custom labels." - }, - "custom_docker_run_options": { - "type": "string", - "description": "Custom docker run options." - }, - "post_deployment_command": { - "type": "string", - "description": "Post deployment command." - }, - "post_deployment_command_container": { - "type": "string", - "description": "Post deployment command container." - }, - "pre_deployment_command": { - "type": "string", - "description": "Pre deployment command." - }, - "pre_deployment_command_container": { - "type": "string", - "description": "Pre deployment command container." - }, - "manual_webhook_secret_github": { - "type": "string", - "description": "Manual webhook secret for Github." - }, - "manual_webhook_secret_gitlab": { - "type": "string", - "description": "Manual webhook secret for Gitlab." - }, - "manual_webhook_secret_bitbucket": { - "type": "string", - "description": "Manual webhook secret for Bitbucket." - }, - "manual_webhook_secret_gitea": { - "type": "string", - "description": "Manual webhook secret for Gitea." - }, - "redirect": { - "type": "string", - "nullable": true, - "description": "How to set redirect with Traefik \/ Caddy. www<->non-www.", - "enum": [ - "www", - "non-www", - "both" - ] - }, - "instant_deploy": { - "type": "boolean", - "description": "The flag to indicate if the application should be deployed instantly." - }, - "use_build_server": { - "type": "boolean", - "nullable": true, - "description": "Use build server." - } - }, - "type": "object" - } - } - } - }, - "responses": { - "201": { - "description": "Application created successfully.", - "content": { - "application\/json": { - "schema": { - "properties": { - "uuid": { - "type": "string" - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/applications\/dockerimage": { - "post": { - "tags": [ - "Applications" - ], - "summary": "Create (Docker Image)", - "description": "Create new application based on a prebuilt docker image", - "operationId": "create-dockerimage-application", - "requestBody": { - "description": "Application object that needs to be created.", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "project_uuid", - "server_uuid", - "environment_name", - "environment_uuid", - "docker_registry_image_name", - "ports_exposes" - ], - "properties": { - "project_uuid": { - "type": "string", - "description": "The project UUID." - }, - "server_uuid": { - "type": "string", - "description": "The server UUID." - }, - "environment_name": { - "type": "string", - "description": "The environment name. You need to provide at least one of environment_name or environment_uuid." - }, - "environment_uuid": { - "type": "string", - "description": "The environment UUID. You need to provide at least one of environment_name or environment_uuid." - }, - "docker_registry_image_name": { - "type": "string", - "description": "The docker registry image name." - }, - "docker_registry_image_tag": { - "type": "string", - "description": "The docker registry image tag." - }, - "ports_exposes": { - "type": "string", - "description": "The ports to expose." - }, - "destination_uuid": { - "type": "string", - "description": "The destination UUID." - }, - "name": { - "type": "string", - "description": "The application name." - }, - "description": { - "type": "string", - "description": "The application description." - }, - "domains": { - "type": "string", - "description": "The application domains." - }, - "ports_mappings": { - "type": "string", - "description": "The ports mappings." - }, - "health_check_enabled": { - "type": "boolean", - "description": "Health check enabled." - }, - "health_check_path": { - "type": "string", - "description": "Health check path." - }, - "health_check_port": { - "type": "string", - "nullable": true, - "description": "Health check port." - }, - "health_check_host": { - "type": "string", - "nullable": true, - "description": "Health check host." - }, - "health_check_method": { - "type": "string", - "description": "Health check method." - }, - "health_check_return_code": { - "type": "integer", - "description": "Health check return code." - }, - "health_check_scheme": { - "type": "string", - "description": "Health check scheme." - }, - "health_check_response_text": { - "type": "string", - "nullable": true, - "description": "Health check response text." - }, - "health_check_interval": { - "type": "integer", - "description": "Health check interval in seconds." - }, - "health_check_timeout": { - "type": "integer", - "description": "Health check timeout in seconds." - }, - "health_check_retries": { - "type": "integer", - "description": "Health check retries count." - }, - "health_check_start_period": { - "type": "integer", - "description": "Health check start period in seconds." - }, - "limits_memory": { - "type": "string", - "description": "Memory limit." - }, - "limits_memory_swap": { - "type": "string", - "description": "Memory swap limit." - }, - "limits_memory_swappiness": { - "type": "integer", - "description": "Memory swappiness." - }, - "limits_memory_reservation": { - "type": "string", - "description": "Memory reservation." - }, - "limits_cpus": { - "type": "string", - "description": "CPU limit." - }, - "limits_cpuset": { - "type": "string", - "nullable": true, - "description": "CPU set." - }, - "limits_cpu_shares": { - "type": "integer", - "description": "CPU shares." - }, - "custom_labels": { - "type": "string", - "description": "Custom labels." - }, - "custom_docker_run_options": { - "type": "string", - "description": "Custom docker run options." - }, - "post_deployment_command": { - "type": "string", - "description": "Post deployment command." - }, - "post_deployment_command_container": { - "type": "string", - "description": "Post deployment command container." - }, - "pre_deployment_command": { - "type": "string", - "description": "Pre deployment command." - }, - "pre_deployment_command_container": { - "type": "string", - "description": "Pre deployment command container." - }, - "manual_webhook_secret_github": { - "type": "string", - "description": "Manual webhook secret for Github." - }, - "manual_webhook_secret_gitlab": { - "type": "string", - "description": "Manual webhook secret for Gitlab." - }, - "manual_webhook_secret_bitbucket": { - "type": "string", - "description": "Manual webhook secret for Bitbucket." - }, - "manual_webhook_secret_gitea": { - "type": "string", - "description": "Manual webhook secret for Gitea." - }, - "redirect": { - "type": "string", - "nullable": true, - "description": "How to set redirect with Traefik \/ Caddy. www<->non-www.", - "enum": [ - "www", - "non-www", - "both" - ] - }, - "instant_deploy": { - "type": "boolean", - "description": "The flag to indicate if the application should be deployed instantly." - }, - "use_build_server": { - "type": "boolean", - "nullable": true, - "description": "Use build server." - } - }, - "type": "object" - } - } - } - }, - "responses": { - "201": { - "description": "Application created successfully.", - "content": { - "application\/json": { - "schema": { - "properties": { - "uuid": { - "type": "string" - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/applications\/dockercompose": { - "post": { - "tags": [ - "Applications" - ], - "summary": "Create (Docker Compose)", - "description": "Create new application based on a docker-compose file.", - "operationId": "create-dockercompose-application", - "requestBody": { - "description": "Application object that needs to be created.", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "project_uuid", - "server_uuid", - "environment_name", - "environment_uuid", - "docker_compose_raw" - ], - "properties": { - "project_uuid": { - "type": "string", - "description": "The project UUID." - }, - "server_uuid": { - "type": "string", - "description": "The server UUID." - }, - "environment_name": { - "type": "string", - "description": "The environment name. You need to provide at least one of environment_name or environment_uuid." - }, - "environment_uuid": { - "type": "string", - "description": "The environment UUID. You need to provide at least one of environment_name or environment_uuid." - }, - "docker_compose_raw": { - "type": "string", - "description": "The Docker Compose raw content." - }, - "destination_uuid": { - "type": "string", - "description": "The destination UUID if the server has more than one destinations." - }, - "name": { - "type": "string", - "description": "The application name." - }, - "description": { - "type": "string", - "description": "The application description." - }, - "instant_deploy": { - "type": "boolean", - "description": "The flag to indicate if the application should be deployed instantly." - }, - "use_build_server": { - "type": "boolean", - "nullable": true, - "description": "Use build server." - } - }, - "type": "object" - } - } - } - }, - "responses": { - "201": { - "description": "Application created successfully.", - "content": { - "application\/json": { - "schema": { - "properties": { - "uuid": { - "type": "string" - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/applications\/{uuid}": { - "get": { - "tags": [ - "Applications" - ], - "summary": "Get", - "description": "Get application by UUID.", - "operationId": "get-application-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the application.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "Get application by UUID.", - "content": { - "application\/json": { - "schema": { - "$ref": "#\/components\/schemas\/Application" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "delete": { - "tags": [ - "Applications" - ], - "summary": "Delete", - "description": "Delete application by UUID.", - "operationId": "delete-application-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the application.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "delete_configurations", - "in": "query", - "description": "Delete configurations.", - "required": false, - "schema": { - "type": "boolean", - "default": true - } - }, - { - "name": "delete_volumes", - "in": "query", - "description": "Delete volumes.", - "required": false, - "schema": { - "type": "boolean", - "default": true - } - }, - { - "name": "docker_cleanup", - "in": "query", - "description": "Run docker cleanup.", - "required": false, - "schema": { - "type": "boolean", - "default": true - } - }, - { - "name": "delete_connected_networks", - "in": "query", - "description": "Delete connected networks.", - "required": false, - "schema": { - "type": "boolean", - "default": true - } - } - ], - "responses": { - "200": { - "description": "Application deleted.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Application deleted." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "patch": { - "tags": [ - "Applications" - ], - "summary": "Update", - "description": "Update application by UUID.", - "operationId": "update-application-by-uuid", - "requestBody": { - "description": "Application updated.", - "required": true, - "content": { - "application\/json": { - "schema": { - "properties": { - "project_uuid": { - "type": "string", - "description": "The project UUID." - }, - "server_uuid": { - "type": "string", - "description": "The server UUID." - }, - "environment_name": { - "type": "string", - "description": "The environment name." - }, - "github_app_uuid": { - "type": "string", - "description": "The Github App UUID." - }, - "git_repository": { - "type": "string", - "description": "The git repository URL." - }, - "git_branch": { - "type": "string", - "description": "The git branch." - }, - "ports_exposes": { - "type": "string", - "description": "The ports to expose." - }, - "destination_uuid": { - "type": "string", - "description": "The destination UUID." - }, - "build_pack": { - "type": "string", - "enum": [ - "nixpacks", - "static", - "dockerfile", - "dockercompose" - ], - "description": "The build pack type." - }, - "name": { - "type": "string", - "description": "The application name." - }, - "description": { - "type": "string", - "description": "The application description." - }, - "domains": { - "type": "string", - "description": "The application domains." - }, - "git_commit_sha": { - "type": "string", - "description": "The git commit SHA." - }, - "docker_registry_image_name": { - "type": "string", - "description": "The docker registry image name." - }, - "docker_registry_image_tag": { - "type": "string", - "description": "The docker registry image tag." - }, - "is_static": { - "type": "boolean", - "description": "The flag to indicate if the application is static." - }, - "install_command": { - "type": "string", - "description": "The install command." - }, - "build_command": { - "type": "string", - "description": "The build command." - }, - "start_command": { - "type": "string", - "description": "The start command." - }, - "ports_mappings": { - "type": "string", - "description": "The ports mappings." - }, - "base_directory": { - "type": "string", - "description": "The base directory for all commands." - }, - "publish_directory": { - "type": "string", - "description": "The publish directory." - }, - "health_check_enabled": { - "type": "boolean", - "description": "Health check enabled." - }, - "health_check_path": { - "type": "string", - "description": "Health check path." - }, - "health_check_port": { - "type": "string", - "nullable": true, - "description": "Health check port." - }, - "health_check_host": { - "type": "string", - "nullable": true, - "description": "Health check host." - }, - "health_check_method": { - "type": "string", - "description": "Health check method." - }, - "health_check_return_code": { - "type": "integer", - "description": "Health check return code." - }, - "health_check_scheme": { - "type": "string", - "description": "Health check scheme." - }, - "health_check_response_text": { - "type": "string", - "nullable": true, - "description": "Health check response text." - }, - "health_check_interval": { - "type": "integer", - "description": "Health check interval in seconds." - }, - "health_check_timeout": { - "type": "integer", - "description": "Health check timeout in seconds." - }, - "health_check_retries": { - "type": "integer", - "description": "Health check retries count." - }, - "health_check_start_period": { - "type": "integer", - "description": "Health check start period in seconds." - }, - "limits_memory": { - "type": "string", - "description": "Memory limit." - }, - "limits_memory_swap": { - "type": "string", - "description": "Memory swap limit." - }, - "limits_memory_swappiness": { - "type": "integer", - "description": "Memory swappiness." - }, - "limits_memory_reservation": { - "type": "string", - "description": "Memory reservation." - }, - "limits_cpus": { - "type": "string", - "description": "CPU limit." - }, - "limits_cpuset": { - "type": "string", - "nullable": true, - "description": "CPU set." - }, - "limits_cpu_shares": { - "type": "integer", - "description": "CPU shares." - }, - "custom_labels": { - "type": "string", - "description": "Custom labels." - }, - "custom_docker_run_options": { - "type": "string", - "description": "Custom docker run options." - }, - "post_deployment_command": { - "type": "string", - "description": "Post deployment command." - }, - "post_deployment_command_container": { - "type": "string", - "description": "Post deployment command container." - }, - "pre_deployment_command": { - "type": "string", - "description": "Pre deployment command." - }, - "pre_deployment_command_container": { - "type": "string", - "description": "Pre deployment command container." - }, - "manual_webhook_secret_github": { - "type": "string", - "description": "Manual webhook secret for Github." - }, - "manual_webhook_secret_gitlab": { - "type": "string", - "description": "Manual webhook secret for Gitlab." - }, - "manual_webhook_secret_bitbucket": { - "type": "string", - "description": "Manual webhook secret for Bitbucket." - }, - "manual_webhook_secret_gitea": { - "type": "string", - "description": "Manual webhook secret for Gitea." - }, - "redirect": { - "type": "string", - "nullable": true, - "description": "How to set redirect with Traefik \/ Caddy. www<->non-www.", - "enum": [ - "www", - "non-www", - "both" - ] - }, - "instant_deploy": { - "type": "boolean", - "description": "The flag to indicate if the application should be deployed instantly." - }, - "dockerfile": { - "type": "string", - "description": "The Dockerfile content." - }, - "docker_compose_location": { - "type": "string", - "description": "The Docker Compose location." - }, - "docker_compose_raw": { - "type": "string", - "description": "The Docker Compose raw content." - }, - "docker_compose_custom_start_command": { - "type": "string", - "description": "The Docker Compose custom start command." - }, - "docker_compose_custom_build_command": { - "type": "string", - "description": "The Docker Compose custom build command." - }, - "docker_compose_domains": { - "type": "array", - "description": "The Docker Compose domains." - }, - "watch_paths": { - "type": "string", - "description": "The watch paths." - }, - "use_build_server": { - "type": "boolean", - "nullable": true, - "description": "Use build server." - } - }, - "type": "object" - } - } - } - }, - "responses": { - "200": { - "description": "Application updated.", - "content": { - "application\/json": { - "schema": { - "properties": { - "uuid": { - "type": "string" - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/applications\/{uuid}\/envs": { - "get": { - "tags": [ - "Applications" - ], - "summary": "List Envs", - "description": "List all envs by application UUID.", - "operationId": "list-envs-by-application-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the application.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "All environment variables by application UUID.", - "content": { - "application\/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#\/components\/schemas\/EnvironmentVariable" - } - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "post": { - "tags": [ - "Applications" - ], - "summary": "Create Env", - "description": "Create env by application UUID.", - "operationId": "create-env-by-application-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the application.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "description": "Env created.", - "required": true, - "content": { - "application\/json": { - "schema": { - "properties": { - "key": { - "type": "string", - "description": "The key of the environment variable." - }, - "value": { - "type": "string", - "description": "The value of the environment variable." - }, - "is_preview": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is used in preview deployments." - }, - "is_build_time": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is used in build time." - }, - "is_literal": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is a literal, nothing espaced." - }, - "is_multiline": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is multiline." - }, - "is_shown_once": { - "type": "boolean", - "description": "The flag to indicate if the environment variable's value is shown on the UI." - } - }, - "type": "object" - } - } - } - }, - "responses": { - "201": { - "description": "Environment variable created.", - "content": { - "application\/json": { - "schema": { - "properties": { - "uuid": { - "type": "string", - "example": "nc0k04gk8g0cgsk440g0koko" - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "patch": { - "tags": [ - "Applications" - ], - "summary": "Update Env", - "description": "Update env by application UUID.", - "operationId": "update-env-by-application-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the application.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "description": "Env updated.", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "key", - "value" - ], - "properties": { - "key": { - "type": "string", - "description": "The key of the environment variable." - }, - "value": { - "type": "string", - "description": "The value of the environment variable." - }, - "is_preview": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is used in preview deployments." - }, - "is_build_time": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is used in build time." - }, - "is_literal": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is a literal, nothing espaced." - }, - "is_multiline": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is multiline." - }, - "is_shown_once": { - "type": "boolean", - "description": "The flag to indicate if the environment variable's value is shown on the UI." - } - }, - "type": "object" - } - } - } - }, - "responses": { - "201": { - "description": "Environment variable updated.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Environment variable updated." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/applications\/{uuid}\/envs\/bulk": { - "patch": { - "tags": [ - "Applications" - ], - "summary": "Update Envs (Bulk)", - "description": "Update multiple envs by application UUID.", - "operationId": "update-envs-by-application-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the application.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "description": "Bulk envs updated.", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "data" - ], - "properties": { - "data": { - "type": "array", - "items": { - "properties": { - "key": { - "type": "string", - "description": "The key of the environment variable." - }, - "value": { - "type": "string", - "description": "The value of the environment variable." - }, - "is_preview": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is used in preview deployments." - }, - "is_build_time": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is used in build time." - }, - "is_literal": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is a literal, nothing espaced." - }, - "is_multiline": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is multiline." - }, - "is_shown_once": { - "type": "boolean", - "description": "The flag to indicate if the environment variable's value is shown on the UI." - } - }, - "type": "object" - } - } - }, - "type": "object" - } - } - } - }, - "responses": { - "201": { - "description": "Environment variables updated.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Environment variables updated." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/applications\/{uuid}\/envs\/{env_uuid}": { - "delete": { - "tags": [ - "Applications" - ], - "summary": "Delete Env", - "description": "Delete env by UUID.", - "operationId": "delete-env-by-application-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the application.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "env_uuid", - "in": "path", - "description": "UUID of the environment variable.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "Environment variable deleted.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Environment variable deleted." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/applications\/{uuid}\/start": { - "get": { - "tags": [ - "Applications" - ], - "summary": "Start", - "description": "Start application. `Post` request is also accepted.", - "operationId": "start-application-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the application.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "force", - "in": "query", - "description": "Force rebuild.", - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "instant_deploy", - "in": "query", - "description": "Instant deploy (skip queuing).", - "schema": { - "type": "boolean", - "default": false - } - } - ], - "responses": { - "200": { - "description": "Start application.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Deployment request queued.", - "description": "Message." - }, - "deployment_uuid": { - "type": "string", - "example": "doogksw", - "description": "UUID of the deployment." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/applications\/{uuid}\/stop": { - "get": { - "tags": [ - "Applications" - ], - "summary": "Stop", - "description": "Stop application. `Post` request is also accepted.", - "operationId": "stop-application-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the application.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "Stop application.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Application stopping request queued." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/applications\/{uuid}\/restart": { - "get": { - "tags": [ - "Applications" - ], - "summary": "Restart", - "description": "Restart application. `Post` request is also accepted.", - "operationId": "restart-application-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the application.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "Restart application.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Restart request queued." - }, - "deployment_uuid": { - "type": "string", - "example": "doogksw", - "description": "UUID of the deployment." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/applications\/{uuid}\/execute": { - "post": { - "tags": [ - "Applications" - ], - "summary": "Execute Command", - "description": "Execute a command on the application's current container.", - "operationId": "execute-command-application", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the application.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "description": "Command to execute.", - "required": true, - "content": { - "application\/json": { - "schema": { - "properties": { - "command": { - "type": "string", - "description": "Command to execute." - } - }, - "type": "object" - } - } - } - }, - "responses": { - "200": { - "description": "Execute a command on the application's current container.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Command executed." - }, - "response": { - "type": "string" - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/databases": { - "get": { - "tags": [ - "Databases" - ], - "summary": "List", - "description": "List all databases.", - "operationId": "list-databases", - "responses": { - "200": { - "description": "Get all databases", - "content": { - "application\/json": { - "schema": { - "type": "string" - }, - "example": "Content is very complex. Will be implemented later." - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/databases\/{uuid}": { - "get": { - "tags": [ - "Databases" - ], - "summary": "Get", - "description": "Get database by UUID.", - "operationId": "get-database-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the database.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "Get all databases", - "content": { - "application\/json": { - "schema": { - "type": "string" - }, - "example": "Content is very complex. Will be implemented later." - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "delete": { - "tags": [ - "Databases" - ], - "summary": "Delete", - "description": "Delete database by UUID.", - "operationId": "delete-database-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the database.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "delete_configurations", - "in": "query", - "description": "Delete configurations.", - "required": false, - "schema": { - "type": "boolean", - "default": true - } - }, - { - "name": "delete_volumes", - "in": "query", - "description": "Delete volumes.", - "required": false, - "schema": { - "type": "boolean", - "default": true - } - }, - { - "name": "docker_cleanup", - "in": "query", - "description": "Run docker cleanup.", - "required": false, - "schema": { - "type": "boolean", - "default": true - } - }, - { - "name": "delete_connected_networks", - "in": "query", - "description": "Delete connected networks.", - "required": false, - "schema": { - "type": "boolean", - "default": true - } - } - ], - "responses": { - "200": { - "description": "Database deleted.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Database deleted." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "patch": { - "tags": [ - "Databases" - ], - "summary": "Update", - "description": "Update database by UUID.", - "operationId": "update-database-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the database.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "description": "Database data", - "required": true, - "content": { - "application\/json": { - "schema": { - "properties": { - "name": { - "type": "string", - "description": "Name of the database" - }, - "description": { - "type": "string", - "description": "Description of the database" - }, - "image": { - "type": "string", - "description": "Docker Image of the database" - }, - "is_public": { - "type": "boolean", - "description": "Is the database public?" - }, - "public_port": { - "type": "integer", - "description": "Public port of the database" - }, - "limits_memory": { - "type": "string", - "description": "Memory limit of the database" - }, - "limits_memory_swap": { - "type": "string", - "description": "Memory swap limit of the database" - }, - "limits_memory_swappiness": { - "type": "integer", - "description": "Memory swappiness of the database" - }, - "limits_memory_reservation": { - "type": "string", - "description": "Memory reservation of the database" - }, - "limits_cpus": { - "type": "string", - "description": "CPU limit of the database" - }, - "limits_cpuset": { - "type": "string", - "description": "CPU set of the database" - }, - "limits_cpu_shares": { - "type": "integer", - "description": "CPU shares of the database" - }, - "postgres_user": { - "type": "string", - "description": "PostgreSQL user" - }, - "postgres_password": { - "type": "string", - "description": "PostgreSQL password" - }, - "postgres_db": { - "type": "string", - "description": "PostgreSQL database" - }, - "postgres_initdb_args": { - "type": "string", - "description": "PostgreSQL initdb args" - }, - "postgres_host_auth_method": { - "type": "string", - "description": "PostgreSQL host auth method" - }, - "postgres_conf": { - "type": "string", - "description": "PostgreSQL conf" - }, - "clickhouse_admin_user": { - "type": "string", - "description": "Clickhouse admin user" - }, - "clickhouse_admin_password": { - "type": "string", - "description": "Clickhouse admin password" - }, - "dragonfly_password": { - "type": "string", - "description": "DragonFly password" - }, - "redis_password": { - "type": "string", - "description": "Redis password" - }, - "redis_conf": { - "type": "string", - "description": "Redis conf" - }, - "keydb_password": { - "type": "string", - "description": "KeyDB password" - }, - "keydb_conf": { - "type": "string", - "description": "KeyDB conf" - }, - "mariadb_conf": { - "type": "string", - "description": "MariaDB conf" - }, - "mariadb_root_password": { - "type": "string", - "description": "MariaDB root password" - }, - "mariadb_user": { - "type": "string", - "description": "MariaDB user" - }, - "mariadb_password": { - "type": "string", - "description": "MariaDB password" - }, - "mariadb_database": { - "type": "string", - "description": "MariaDB database" - }, - "mongo_conf": { - "type": "string", - "description": "Mongo conf" - }, - "mongo_initdb_root_username": { - "type": "string", - "description": "Mongo initdb root username" - }, - "mongo_initdb_root_password": { - "type": "string", - "description": "Mongo initdb root password" - }, - "mongo_initdb_database": { - "type": "string", - "description": "Mongo initdb init database" - }, - "mysql_root_password": { - "type": "string", - "description": "MySQL root password" - }, - "mysql_password": { - "type": "string", - "description": "MySQL password" - }, - "mysql_user": { - "type": "string", - "description": "MySQL user" - }, - "mysql_database": { - "type": "string", - "description": "MySQL database" - }, - "mysql_conf": { - "type": "string", - "description": "MySQL conf" - } - }, - "type": "object" - } - } - } - }, - "responses": { - "200": { - "description": "Database updated" - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/databases\/postgresql": { - "post": { - "tags": [ - "Databases" - ], - "summary": "Create (PostgreSQL)", - "description": "Create a new PostgreSQL database.", - "operationId": "create-database-postgresql", - "requestBody": { - "description": "Database data", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "server_uuid", - "project_uuid", - "environment_name", - "environment_uuid" - ], - "properties": { - "server_uuid": { - "type": "string", - "description": "UUID of the server" - }, - "project_uuid": { - "type": "string", - "description": "UUID of the project" - }, - "environment_name": { - "type": "string", - "description": "Name of the environment. You need to provide at least one of environment_name or environment_uuid." - }, - "environment_uuid": { - "type": "string", - "description": "UUID of the environment. You need to provide at least one of environment_name or environment_uuid." - }, - "postgres_user": { - "type": "string", - "description": "PostgreSQL user" - }, - "postgres_password": { - "type": "string", - "description": "PostgreSQL password" - }, - "postgres_db": { - "type": "string", - "description": "PostgreSQL database" - }, - "postgres_initdb_args": { - "type": "string", - "description": "PostgreSQL initdb args" - }, - "postgres_host_auth_method": { - "type": "string", - "description": "PostgreSQL host auth method" - }, - "postgres_conf": { - "type": "string", - "description": "PostgreSQL conf" - }, - "destination_uuid": { - "type": "string", - "description": "UUID of the destination if the server has multiple destinations" - }, - "name": { - "type": "string", - "description": "Name of the database" - }, - "description": { - "type": "string", - "description": "Description of the database" - }, - "image": { - "type": "string", - "description": "Docker Image of the database" - }, - "is_public": { - "type": "boolean", - "description": "Is the database public?" - }, - "public_port": { - "type": "integer", - "description": "Public port of the database" - }, - "limits_memory": { - "type": "string", - "description": "Memory limit of the database" - }, - "limits_memory_swap": { - "type": "string", - "description": "Memory swap limit of the database" - }, - "limits_memory_swappiness": { - "type": "integer", - "description": "Memory swappiness of the database" - }, - "limits_memory_reservation": { - "type": "string", - "description": "Memory reservation of the database" - }, - "limits_cpus": { - "type": "string", - "description": "CPU limit of the database" - }, - "limits_cpuset": { - "type": "string", - "description": "CPU set of the database" - }, - "limits_cpu_shares": { - "type": "integer", - "description": "CPU shares of the database" - }, - "instant_deploy": { - "type": "boolean", - "description": "Instant deploy the database" - } - }, - "type": "object" - } - } - } - }, - "responses": { - "200": { - "description": "Database updated" - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/databases\/clickhouse": { - "post": { - "tags": [ - "Databases" - ], - "summary": "Create (Clickhouse)", - "description": "Create a new Clickhouse database.", - "operationId": "create-database-clickhouse", - "requestBody": { - "description": "Database data", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "server_uuid", - "project_uuid", - "environment_name", - "environment_uuid" - ], - "properties": { - "server_uuid": { - "type": "string", - "description": "UUID of the server" - }, - "project_uuid": { - "type": "string", - "description": "UUID of the project" - }, - "environment_name": { - "type": "string", - "description": "Name of the environment. You need to provide at least one of environment_name or environment_uuid." - }, - "environment_uuid": { - "type": "string", - "description": "UUID of the environment. You need to provide at least one of environment_name or environment_uuid." - }, - "destination_uuid": { - "type": "string", - "description": "UUID of the destination if the server has multiple destinations" - }, - "clickhouse_admin_user": { - "type": "string", - "description": "Clickhouse admin user" - }, - "clickhouse_admin_password": { - "type": "string", - "description": "Clickhouse admin password" - }, - "name": { - "type": "string", - "description": "Name of the database" - }, - "description": { - "type": "string", - "description": "Description of the database" - }, - "image": { - "type": "string", - "description": "Docker Image of the database" - }, - "is_public": { - "type": "boolean", - "description": "Is the database public?" - }, - "public_port": { - "type": "integer", - "description": "Public port of the database" - }, - "limits_memory": { - "type": "string", - "description": "Memory limit of the database" - }, - "limits_memory_swap": { - "type": "string", - "description": "Memory swap limit of the database" - }, - "limits_memory_swappiness": { - "type": "integer", - "description": "Memory swappiness of the database" - }, - "limits_memory_reservation": { - "type": "string", - "description": "Memory reservation of the database" - }, - "limits_cpus": { - "type": "string", - "description": "CPU limit of the database" - }, - "limits_cpuset": { - "type": "string", - "description": "CPU set of the database" - }, - "limits_cpu_shares": { - "type": "integer", - "description": "CPU shares of the database" - }, - "instant_deploy": { - "type": "boolean", - "description": "Instant deploy the database" - } - }, - "type": "object" - } - } - } - }, - "responses": { - "200": { - "description": "Database updated" - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/databases\/dragonfly": { - "post": { - "tags": [ - "Databases" - ], - "summary": "Create (DragonFly)", - "description": "Create a new DragonFly database.", - "operationId": "create-database-dragonfly", - "requestBody": { - "description": "Database data", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "server_uuid", - "project_uuid", - "environment_name", - "environment_uuid" - ], - "properties": { - "server_uuid": { - "type": "string", - "description": "UUID of the server" - }, - "project_uuid": { - "type": "string", - "description": "UUID of the project" - }, - "environment_name": { - "type": "string", - "description": "Name of the environment. You need to provide at least one of environment_name or environment_uuid." - }, - "environment_uuid": { - "type": "string", - "description": "UUID of the environment. You need to provide at least one of environment_name or environment_uuid." - }, - "destination_uuid": { - "type": "string", - "description": "UUID of the destination if the server has multiple destinations" - }, - "dragonfly_password": { - "type": "string", - "description": "DragonFly password" - }, - "name": { - "type": "string", - "description": "Name of the database" - }, - "description": { - "type": "string", - "description": "Description of the database" - }, - "image": { - "type": "string", - "description": "Docker Image of the database" - }, - "is_public": { - "type": "boolean", - "description": "Is the database public?" - }, - "public_port": { - "type": "integer", - "description": "Public port of the database" - }, - "limits_memory": { - "type": "string", - "description": "Memory limit of the database" - }, - "limits_memory_swap": { - "type": "string", - "description": "Memory swap limit of the database" - }, - "limits_memory_swappiness": { - "type": "integer", - "description": "Memory swappiness of the database" - }, - "limits_memory_reservation": { - "type": "string", - "description": "Memory reservation of the database" - }, - "limits_cpus": { - "type": "string", - "description": "CPU limit of the database" - }, - "limits_cpuset": { - "type": "string", - "description": "CPU set of the database" - }, - "limits_cpu_shares": { - "type": "integer", - "description": "CPU shares of the database" - }, - "instant_deploy": { - "type": "boolean", - "description": "Instant deploy the database" - } - }, - "type": "object" - } - } - } - }, - "responses": { - "200": { - "description": "Database updated" - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/databases\/redis": { - "post": { - "tags": [ - "Databases" - ], - "summary": "Create (Redis)", - "description": "Create a new Redis database.", - "operationId": "create-database-redis", - "requestBody": { - "description": "Database data", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "server_uuid", - "project_uuid", - "environment_name", - "environment_uuid" - ], - "properties": { - "server_uuid": { - "type": "string", - "description": "UUID of the server" - }, - "project_uuid": { - "type": "string", - "description": "UUID of the project" - }, - "environment_name": { - "type": "string", - "description": "Name of the environment. You need to provide at least one of environment_name or environment_uuid." - }, - "environment_uuid": { - "type": "string", - "description": "UUID of the environment. You need to provide at least one of environment_name or environment_uuid." - }, - "destination_uuid": { - "type": "string", - "description": "UUID of the destination if the server has multiple destinations" - }, - "redis_password": { - "type": "string", - "description": "Redis password" - }, - "redis_conf": { - "type": "string", - "description": "Redis conf" - }, - "name": { - "type": "string", - "description": "Name of the database" - }, - "description": { - "type": "string", - "description": "Description of the database" - }, - "image": { - "type": "string", - "description": "Docker Image of the database" - }, - "is_public": { - "type": "boolean", - "description": "Is the database public?" - }, - "public_port": { - "type": "integer", - "description": "Public port of the database" - }, - "limits_memory": { - "type": "string", - "description": "Memory limit of the database" - }, - "limits_memory_swap": { - "type": "string", - "description": "Memory swap limit of the database" - }, - "limits_memory_swappiness": { - "type": "integer", - "description": "Memory swappiness of the database" - }, - "limits_memory_reservation": { - "type": "string", - "description": "Memory reservation of the database" - }, - "limits_cpus": { - "type": "string", - "description": "CPU limit of the database" - }, - "limits_cpuset": { - "type": "string", - "description": "CPU set of the database" - }, - "limits_cpu_shares": { - "type": "integer", - "description": "CPU shares of the database" - }, - "instant_deploy": { - "type": "boolean", - "description": "Instant deploy the database" - } - }, - "type": "object" - } - } - } - }, - "responses": { - "200": { - "description": "Database updated" - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/databases\/keydb": { - "post": { - "tags": [ - "Databases" - ], - "summary": "Create (KeyDB)", - "description": "Create a new KeyDB database.", - "operationId": "create-database-keydb", - "requestBody": { - "description": "Database data", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "server_uuid", - "project_uuid", - "environment_name", - "environment_uuid" - ], - "properties": { - "server_uuid": { - "type": "string", - "description": "UUID of the server" - }, - "project_uuid": { - "type": "string", - "description": "UUID of the project" - }, - "environment_name": { - "type": "string", - "description": "Name of the environment. You need to provide at least one of environment_name or environment_uuid." - }, - "environment_uuid": { - "type": "string", - "description": "UUID of the environment. You need to provide at least one of environment_name or environment_uuid." - }, - "destination_uuid": { - "type": "string", - "description": "UUID of the destination if the server has multiple destinations" - }, - "keydb_password": { - "type": "string", - "description": "KeyDB password" - }, - "keydb_conf": { - "type": "string", - "description": "KeyDB conf" - }, - "name": { - "type": "string", - "description": "Name of the database" - }, - "description": { - "type": "string", - "description": "Description of the database" - }, - "image": { - "type": "string", - "description": "Docker Image of the database" - }, - "is_public": { - "type": "boolean", - "description": "Is the database public?" - }, - "public_port": { - "type": "integer", - "description": "Public port of the database" - }, - "limits_memory": { - "type": "string", - "description": "Memory limit of the database" - }, - "limits_memory_swap": { - "type": "string", - "description": "Memory swap limit of the database" - }, - "limits_memory_swappiness": { - "type": "integer", - "description": "Memory swappiness of the database" - }, - "limits_memory_reservation": { - "type": "string", - "description": "Memory reservation of the database" - }, - "limits_cpus": { - "type": "string", - "description": "CPU limit of the database" - }, - "limits_cpuset": { - "type": "string", - "description": "CPU set of the database" - }, - "limits_cpu_shares": { - "type": "integer", - "description": "CPU shares of the database" - }, - "instant_deploy": { - "type": "boolean", - "description": "Instant deploy the database" - } - }, - "type": "object" - } - } - } - }, - "responses": { - "200": { - "description": "Database updated" - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/databases\/mariadb": { - "post": { - "tags": [ - "Databases" - ], - "summary": "Create (MariaDB)", - "description": "Create a new MariaDB database.", - "operationId": "create-database-mariadb", - "requestBody": { - "description": "Database data", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "server_uuid", - "project_uuid", - "environment_name", - "environment_uuid" - ], - "properties": { - "server_uuid": { - "type": "string", - "description": "UUID of the server" - }, - "project_uuid": { - "type": "string", - "description": "UUID of the project" - }, - "environment_name": { - "type": "string", - "description": "Name of the environment. You need to provide at least one of environment_name or environment_uuid." - }, - "environment_uuid": { - "type": "string", - "description": "UUID of the environment. You need to provide at least one of environment_name or environment_uuid." - }, - "destination_uuid": { - "type": "string", - "description": "UUID of the destination if the server has multiple destinations" - }, - "mariadb_conf": { - "type": "string", - "description": "MariaDB conf" - }, - "mariadb_root_password": { - "type": "string", - "description": "MariaDB root password" - }, - "mariadb_user": { - "type": "string", - "description": "MariaDB user" - }, - "mariadb_password": { - "type": "string", - "description": "MariaDB password" - }, - "mariadb_database": { - "type": "string", - "description": "MariaDB database" - }, - "name": { - "type": "string", - "description": "Name of the database" - }, - "description": { - "type": "string", - "description": "Description of the database" - }, - "image": { - "type": "string", - "description": "Docker Image of the database" - }, - "is_public": { - "type": "boolean", - "description": "Is the database public?" - }, - "public_port": { - "type": "integer", - "description": "Public port of the database" - }, - "limits_memory": { - "type": "string", - "description": "Memory limit of the database" - }, - "limits_memory_swap": { - "type": "string", - "description": "Memory swap limit of the database" - }, - "limits_memory_swappiness": { - "type": "integer", - "description": "Memory swappiness of the database" - }, - "limits_memory_reservation": { - "type": "string", - "description": "Memory reservation of the database" - }, - "limits_cpus": { - "type": "string", - "description": "CPU limit of the database" - }, - "limits_cpuset": { - "type": "string", - "description": "CPU set of the database" - }, - "limits_cpu_shares": { - "type": "integer", - "description": "CPU shares of the database" - }, - "instant_deploy": { - "type": "boolean", - "description": "Instant deploy the database" - } - }, - "type": "object" - } - } - } - }, - "responses": { - "200": { - "description": "Database updated" - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/databases\/mysql": { - "post": { - "tags": [ - "Databases" - ], - "summary": "Create (MySQL)", - "description": "Create a new MySQL database.", - "operationId": "create-database-mysql", - "requestBody": { - "description": "Database data", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "server_uuid", - "project_uuid", - "environment_name", - "environment_uuid" - ], - "properties": { - "server_uuid": { - "type": "string", - "description": "UUID of the server" - }, - "project_uuid": { - "type": "string", - "description": "UUID of the project" - }, - "environment_name": { - "type": "string", - "description": "Name of the environment. You need to provide at least one of environment_name or environment_uuid." - }, - "environment_uuid": { - "type": "string", - "description": "UUID of the environment. You need to provide at least one of environment_name or environment_uuid." - }, - "destination_uuid": { - "type": "string", - "description": "UUID of the destination if the server has multiple destinations" - }, - "mysql_root_password": { - "type": "string", - "description": "MySQL root password" - }, - "mysql_password": { - "type": "string", - "description": "MySQL password" - }, - "mysql_user": { - "type": "string", - "description": "MySQL user" - }, - "mysql_database": { - "type": "string", - "description": "MySQL database" - }, - "mysql_conf": { - "type": "string", - "description": "MySQL conf" - }, - "name": { - "type": "string", - "description": "Name of the database" - }, - "description": { - "type": "string", - "description": "Description of the database" - }, - "image": { - "type": "string", - "description": "Docker Image of the database" - }, - "is_public": { - "type": "boolean", - "description": "Is the database public?" - }, - "public_port": { - "type": "integer", - "description": "Public port of the database" - }, - "limits_memory": { - "type": "string", - "description": "Memory limit of the database" - }, - "limits_memory_swap": { - "type": "string", - "description": "Memory swap limit of the database" - }, - "limits_memory_swappiness": { - "type": "integer", - "description": "Memory swappiness of the database" - }, - "limits_memory_reservation": { - "type": "string", - "description": "Memory reservation of the database" - }, - "limits_cpus": { - "type": "string", - "description": "CPU limit of the database" - }, - "limits_cpuset": { - "type": "string", - "description": "CPU set of the database" - }, - "limits_cpu_shares": { - "type": "integer", - "description": "CPU shares of the database" - }, - "instant_deploy": { - "type": "boolean", - "description": "Instant deploy the database" - } - }, - "type": "object" - } - } - } - }, - "responses": { - "200": { - "description": "Database updated" - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/databases\/mongodb": { - "post": { - "tags": [ - "Databases" - ], - "summary": "Create (MongoDB)", - "description": "Create a new MongoDB database.", - "operationId": "create-database-mongodb", - "requestBody": { - "description": "Database data", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "server_uuid", - "project_uuid", - "environment_name", - "environment_uuid" - ], - "properties": { - "server_uuid": { - "type": "string", - "description": "UUID of the server" - }, - "project_uuid": { - "type": "string", - "description": "UUID of the project" - }, - "environment_name": { - "type": "string", - "description": "Name of the environment. You need to provide at least one of environment_name or environment_uuid." - }, - "environment_uuid": { - "type": "string", - "description": "UUID of the environment. You need to provide at least one of environment_name or environment_uuid." - }, - "destination_uuid": { - "type": "string", - "description": "UUID of the destination if the server has multiple destinations" - }, - "mongo_conf": { - "type": "string", - "description": "MongoDB conf" - }, - "mongo_initdb_root_username": { - "type": "string", - "description": "MongoDB initdb root username" - }, - "name": { - "type": "string", - "description": "Name of the database" - }, - "description": { - "type": "string", - "description": "Description of the database" - }, - "image": { - "type": "string", - "description": "Docker Image of the database" - }, - "is_public": { - "type": "boolean", - "description": "Is the database public?" - }, - "public_port": { - "type": "integer", - "description": "Public port of the database" - }, - "limits_memory": { - "type": "string", - "description": "Memory limit of the database" - }, - "limits_memory_swap": { - "type": "string", - "description": "Memory swap limit of the database" - }, - "limits_memory_swappiness": { - "type": "integer", - "description": "Memory swappiness of the database" - }, - "limits_memory_reservation": { - "type": "string", - "description": "Memory reservation of the database" - }, - "limits_cpus": { - "type": "string", - "description": "CPU limit of the database" - }, - "limits_cpuset": { - "type": "string", - "description": "CPU set of the database" - }, - "limits_cpu_shares": { - "type": "integer", - "description": "CPU shares of the database" - }, - "instant_deploy": { - "type": "boolean", - "description": "Instant deploy the database" - } - }, - "type": "object" - } - } - } - }, - "responses": { - "200": { - "description": "Database updated" - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/databases\/{uuid}\/start": { - "get": { - "tags": [ - "Databases" - ], - "summary": "Start", - "description": "Start database. `Post` request is also accepted.", - "operationId": "start-database-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the database.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "Start database.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Database starting request queued." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/databases\/{uuid}\/stop": { - "get": { - "tags": [ - "Databases" - ], - "summary": "Stop", - "description": "Stop database. `Post` request is also accepted.", - "operationId": "stop-database-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the database.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "Stop database.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Database stopping request queued." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/databases\/{uuid}\/restart": { - "get": { - "tags": [ - "Databases" - ], - "summary": "Restart", - "description": "Restart database. `Post` request is also accepted.", - "operationId": "restart-database-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the database.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "Restart database.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Database restaring request queued." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/deployments": { - "get": { - "tags": [ - "Deployments" - ], - "summary": "List", - "description": "List currently running deployments", - "operationId": "list-deployments", - "responses": { - "200": { - "description": "Get all currently running deployments.", - "content": { - "application\/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#\/components\/schemas\/ApplicationDeploymentQueue" - } - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/deployments\/{uuid}": { - "get": { - "tags": [ - "Deployments" - ], - "summary": "Get", - "description": "Get deployment by UUID.", - "operationId": "get-deployment-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "Deployment UUID", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Get deployment by UUID.", - "content": { - "application\/json": { - "schema": { - "$ref": "#\/components\/schemas\/ApplicationDeploymentQueue" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/deploy": { - "get": { - "tags": [ - "Deployments" - ], - "summary": "Deploy", - "description": "Deploy by tag or uuid. `Post` request also accepted.", - "operationId": "deploy-by-tag-or-uuid", - "parameters": [ - { - "name": "tag", - "in": "query", - "description": "Tag name(s). Comma separated list is also accepted.", - "schema": { - "type": "string" - } - }, - { - "name": "uuid", - "in": "query", - "description": "Resource UUID(s). Comma separated list is also accepted.", - "schema": { - "type": "string" - } - }, - { - "name": "force", - "in": "query", - "description": "Force rebuild (without cache)", - "schema": { - "type": "boolean" - } - } - ], - "responses": { - "200": { - "description": "Get deployment(s) UUID's", - "content": { - "application\/json": { - "schema": { - "properties": { - "deployments": { - "type": "array", - "items": { - "properties": { - "message": { - "type": "string" - }, - "resource_uuid": { - "type": "string" - }, - "deployment_uuid": { - "type": "string" - } - }, - "type": "object" - } - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/version": { - "get": { - "summary": "Version", - "description": "Get Coolify version.", - "operationId": "version", - "responses": { - "200": { - "description": "Returns the version of the application", - "content": { - "application\/json": { - "schema": { - "type": "string" - }, - "example": "v4.0.0" - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/enable": { - "get": { - "summary": "Enable API", - "description": "Enable API (only with root permissions).", - "operationId": "enable-api", - "responses": { - "200": { - "description": "Enable API.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "API enabled." - } - }, - "type": "object" - } - } - } - }, - "403": { - "description": "You are not allowed to enable the API.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "You are not allowed to enable the API." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/disable": { - "get": { - "summary": "Disable API", - "description": "Disable API (only with root permissions).", - "operationId": "disable-api", - "responses": { - "200": { - "description": "Disable API.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "API disabled." - } - }, - "type": "object" - } - } - } - }, - "403": { - "description": "You are not allowed to disable the API.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "You are not allowed to disable the API." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/health": { - "get": { - "summary": "Healthcheck", - "description": "Healthcheck endpoint.", - "operationId": "healthcheck", - "responses": { - "200": { - "description": "Healthcheck endpoint.", - "content": { - "application\/json": { - "schema": { - "type": "string" - }, - "example": "OK" - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - } - } - }, - "\/projects": { - "get": { - "tags": [ - "Projects" - ], - "summary": "List", - "description": "List projects.", - "operationId": "list-projects", - "responses": { - "200": { - "description": "Get all projects.", - "content": { - "application\/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#\/components\/schemas\/Project" - } - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "post": { - "tags": [ - "Projects" - ], - "summary": "Create", - "description": "Create Project.", - "operationId": "create-project", - "requestBody": { - "description": "Project created.", - "required": true, - "content": { - "application\/json": { - "schema": { - "properties": { - "name": { - "type": "string", - "description": "The name of the project." - }, - "description": { - "type": "string", - "description": "The description of the project." - } - }, - "type": "object" - } - } - } - }, - "responses": { - "201": { - "description": "Project created.", - "content": { - "application\/json": { - "schema": { - "properties": { - "uuid": { - "type": "string", - "example": "og888os", - "description": "The UUID of the project." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/projects\/{uuid}": { - "get": { - "tags": [ - "Projects" - ], - "summary": "Get", - "description": "Get project by UUID.", - "operationId": "get-project-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "Project UUID", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Project details", - "content": { - "application\/json": { - "schema": { - "$ref": "#\/components\/schemas\/Project" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "description": "Project not found." - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "delete": { - "tags": [ - "Projects" - ], - "summary": "Delete", - "description": "Delete project by UUID.", - "operationId": "delete-project-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the application.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "Project deleted.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Project deleted." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "patch": { - "tags": [ - "Projects" - ], - "summary": "Update", - "description": "Update Project.", - "operationId": "update-project-by-uuid", - "requestBody": { - "description": "Project updated.", - "required": true, - "content": { - "application\/json": { - "schema": { - "properties": { - "name": { - "type": "string", - "description": "The name of the project." - }, - "description": { - "type": "string", - "description": "The description of the project." - } - }, - "type": "object" - } - } - } - }, - "responses": { - "201": { - "description": "Project updated.", - "content": { - "application\/json": { - "schema": { - "properties": { - "uuid": { - "type": "string", - "example": "og888os" - }, - "name": { - "type": "string", - "example": "Project Name" - }, - "description": { - "type": "string", - "example": "Project Description" - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/projects\/{uuid}\/{environment_name_or_uuid}": { - "get": { - "tags": [ - "Projects" - ], - "summary": "Environment", - "description": "Get environment by name or UUID.", - "operationId": "get-environment-by-name-or-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "Project UUID", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "environment_name_or_uuid", - "in": "path", - "description": "Environment name or UUID", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Environment details", - "content": { - "application\/json": { - "schema": { - "$ref": "#\/components\/schemas\/Environment" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/resources": { - "get": { - "tags": [ - "Resources" - ], - "summary": "List", - "description": "Get all resources.", - "operationId": "list-resources", - "responses": { - "200": { - "description": "Get all resources", - "content": { - "application\/json": { - "schema": { - "type": "string" - }, - "example": "Content is very complex. Will be implemented later." - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/security\/keys": { - "get": { - "tags": [ - "Private Keys" - ], - "summary": "List", - "description": "List all private keys.", - "operationId": "list-private-keys", - "responses": { - "200": { - "description": "Get all private keys.", - "content": { - "application\/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#\/components\/schemas\/PrivateKey" - } - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "post": { - "tags": [ - "Private Keys" - ], - "summary": "Create", - "description": "Create a new private key.", - "operationId": "create-private-key", - "requestBody": { - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "private_key" - ], - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "private_key": { - "type": "string" - } - }, - "type": "object", - "additionalProperties": false - } - } - } - }, - "responses": { - "201": { - "description": "The created private key's UUID.", - "content": { - "application\/json": { - "schema": { - "properties": { - "uuid": { - "type": "string" - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "patch": { - "tags": [ - "Private Keys" - ], - "summary": "Update", - "description": "Update a private key.", - "operationId": "update-private-key", - "requestBody": { - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "private_key" - ], - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "private_key": { - "type": "string" - } - }, - "type": "object", - "additionalProperties": false - } - } - } - }, - "responses": { - "201": { - "description": "The updated private key's UUID.", - "content": { - "application\/json": { - "schema": { - "properties": { - "uuid": { - "type": "string" - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/security\/keys\/{uuid}": { - "get": { - "tags": [ - "Private Keys" - ], - "summary": "Get", - "description": "Get key by UUID.", - "operationId": "get-private-key-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "Private Key UUID", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Get all private keys.", - "content": { - "application\/json": { - "schema": { - "$ref": "#\/components\/schemas\/PrivateKey" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "description": "Private Key not found." - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "delete": { - "tags": [ - "Private Keys" - ], - "summary": "Delete", - "description": "Delete a private key.", - "operationId": "delete-private-key-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "Private Key UUID", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Private Key deleted.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Private Key deleted." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "description": "Private Key not found." - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/servers": { - "get": { - "tags": [ - "Servers" - ], - "summary": "List", - "description": "List all servers.", - "operationId": "list-servers", - "responses": { - "200": { - "description": "Get all servers.", - "content": { - "application\/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#\/components\/schemas\/Server" - } - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "post": { - "tags": [ - "Servers" - ], - "summary": "Create", - "description": "Create Server.", - "operationId": "create-server", - "requestBody": { - "description": "Server created.", - "required": true, - "content": { - "application\/json": { - "schema": { - "properties": { - "name": { - "type": "string", - "example": "My Server", - "description": "The name of the server." - }, - "description": { - "type": "string", - "example": "My Server Description", - "description": "The description of the server." - }, - "ip": { - "type": "string", - "example": "127.0.0.1", - "description": "The IP of the server." - }, - "port": { - "type": "integer", - "example": 22, - "description": "The port of the server." - }, - "user": { - "type": "string", - "example": "root", - "description": "The user of the server." - }, - "private_key_uuid": { - "type": "string", - "example": "og888os", - "description": "The UUID of the private key." - }, - "is_build_server": { - "type": "boolean", - "example": false, - "description": "Is build server." - }, - "instant_validate": { - "type": "boolean", - "example": false, - "description": "Instant validate." - }, - "proxy_type": { - "type": "string", - "enum": [ - "traefik", - "caddy", - "none" - ], - "example": "traefik", - "description": "The proxy type." - } - }, - "type": "object" - } - } - } - }, - "responses": { - "201": { - "description": "Server created.", - "content": { - "application\/json": { - "schema": { - "properties": { - "uuid": { - "type": "string", - "example": "og888os", - "description": "The UUID of the server." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/servers\/{uuid}": { - "get": { - "tags": [ - "Servers" - ], - "summary": "Get", - "description": "Get server by UUID.", - "operationId": "get-server-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "Server's UUID", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Get server by UUID", - "content": { - "application\/json": { - "schema": { - "$ref": "#\/components\/schemas\/Server" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "delete": { - "tags": [ - "Servers" - ], - "summary": "Delete", - "description": "Delete server by UUID.", - "operationId": "delete-server-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the server.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "Server deleted.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Server deleted." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "patch": { - "tags": [ - "Servers" - ], - "summary": "Update", - "description": "Update Server.", - "operationId": "update-server-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "Server UUID", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "description": "Server updated.", - "required": true, - "content": { - "application\/json": { - "schema": { - "properties": { - "name": { - "type": "string", - "description": "The name of the server." - }, - "description": { - "type": "string", - "description": "The description of the server." - }, - "ip": { - "type": "string", - "description": "The IP of the server." - }, - "port": { - "type": "integer", - "description": "The port of the server." - }, - "user": { - "type": "string", - "description": "The user of the server." - }, - "private_key_uuid": { - "type": "string", - "description": "The UUID of the private key." - }, - "is_build_server": { - "type": "boolean", - "description": "Is build server." - }, - "instant_validate": { - "type": "boolean", - "description": "Instant validate." - }, - "proxy_type": { - "type": "string", - "enum": [ - "traefik", - "caddy", - "none" - ], - "description": "The proxy type." - } - }, - "type": "object" - } - } - } - }, - "responses": { - "201": { - "description": "Server updated.", - "content": { - "application\/json": { - "schema": { - "$ref": "#\/components\/schemas\/Server" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/servers\/{uuid}\/resources": { - "get": { - "tags": [ - "Servers" - ], - "summary": "Resources", - "description": "Get resources by server.", - "operationId": "get-resources-by-server-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "Server's UUID", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Get resources by server", - "content": { - "application\/json": { - "schema": { - "type": "array", - "items": { - "properties": { - "id": { - "type": "integer" - }, - "uuid": { - "type": "string" - }, - "name": { - "type": "string" - }, - "type": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "status": { - "type": "string" - } - }, - "type": "object" - } - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/servers\/{uuid}\/domains": { - "get": { - "tags": [ - "Servers" - ], - "summary": "Domains", - "description": "Get domains by server.", - "operationId": "get-domains-by-server-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "Server's UUID", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Get domains by server", - "content": { - "application\/json": { - "schema": { - "type": "array", - "items": { - "properties": { - "ip": { - "type": "string" - }, - "domains": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "type": "object" - } - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/servers\/{uuid}\/validate": { - "get": { - "tags": [ - "Servers" - ], - "summary": "Validate", - "description": "Validate server by UUID.", - "operationId": "validate-server-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "Server UUID", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "201": { - "description": "Server validation started.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Validation started." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/services": { - "get": { - "tags": [ - "Services" - ], - "summary": "List", - "description": "List all services.", - "operationId": "list-services", - "responses": { - "200": { - "description": "Get all services", - "content": { - "application\/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#\/components\/schemas\/Service" - } - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "post": { - "tags": [ - "Services" - ], - "summary": "Create", - "description": "Create a one-click service", - "operationId": "create-service", - "requestBody": { - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "server_uuid", - "project_uuid", - "environment_name", - "environment_uuid", - "type" - ], - "properties": { - "type": { - "description": "The one-click service type", - "type": "string", - "enum": [ - "activepieces", - "appsmith", - "appwrite", - "authentik", - "babybuddy", - "budge", - "changedetection", - "chatwoot", - "classicpress-with-mariadb", - "classicpress-with-mysql", - "classicpress-without-database", - "cloudflared", - "code-server", - "dashboard", - "directus", - "directus-with-postgresql", - "docker-registry", - "docuseal", - "docuseal-with-postgres", - "dokuwiki", - "duplicati", - "emby", - "embystat", - "fider", - "filebrowser", - "firefly", - "formbricks", - "ghost", - "gitea", - "gitea-with-mariadb", - "gitea-with-mysql", - "gitea-with-postgresql", - "glance", - "glances", - "glitchtip", - "grafana", - "grafana-with-postgresql", - "grocy", - "heimdall", - "homepage", - "jellyfin", - "kuzzle", - "listmonk", - "logto", - "mediawiki", - "meilisearch", - "metabase", - "metube", - "minio", - "moodle", - "n8n", - "n8n-with-postgresql", - "next-image-transformation", - "nextcloud", - "nocodb", - "odoo", - "openblocks", - "pairdrop", - "penpot", - "phpmyadmin", - "pocketbase", - "posthog", - "reactive-resume", - "rocketchat", - "shlink", - "slash", - "snapdrop", - "statusnook", - "stirling-pdf", - "supabase", - "syncthing", - "tolgee", - "trigger", - "trigger-with-external-database", - "twenty", - "umami", - "unleash-with-postgresql", - "unleash-without-database", - "uptime-kuma", - "vaultwarden", - "vikunja", - "weblate", - "whoogle", - "wordpress-with-mariadb", - "wordpress-with-mysql", - "wordpress-without-database" - ] - }, - "name": { - "type": "string", - "maxLength": 255, - "description": "Name of the service." - }, - "description": { - "type": "string", - "nullable": true, - "description": "Description of the service." - }, - "project_uuid": { - "type": "string", - "description": "Project UUID." - }, - "environment_name": { - "type": "string", - "description": "Environment name. You need to provide at least one of environment_name or environment_uuid." - }, - "environment_uuid": { - "type": "string", - "description": "Environment UUID. You need to provide at least one of environment_name or environment_uuid." - }, - "server_uuid": { - "type": "string", - "description": "Server UUID." - }, - "destination_uuid": { - "type": "string", - "description": "Destination UUID. Required if server has multiple destinations." - }, - "instant_deploy": { - "type": "boolean", - "default": false, - "description": "Start the service immediately after creation." - } - }, - "type": "object" - } - } - } - }, - "responses": { - "201": { - "description": "Create a service.", - "content": { - "application\/json": { - "schema": { - "properties": { - "uuid": { - "type": "string", - "description": "Service UUID." - }, - "domains": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Service domains." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/services\/{uuid}": { - "get": { - "tags": [ - "Services" - ], - "summary": "Get", - "description": "Get service by UUID.", - "operationId": "get-service-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "Service UUID", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Get a service by UUID.", - "content": { - "application\/json": { - "schema": { - "$ref": "#\/components\/schemas\/Service" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "delete": { - "tags": [ - "Services" - ], - "summary": "Delete", - "description": "Delete service by UUID.", - "operationId": "delete-service-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "Service UUID", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "delete_configurations", - "in": "query", - "description": "Delete configurations.", - "required": false, - "schema": { - "type": "boolean", - "default": true - } - }, - { - "name": "delete_volumes", - "in": "query", - "description": "Delete volumes.", - "required": false, - "schema": { - "type": "boolean", - "default": true - } - }, - { - "name": "docker_cleanup", - "in": "query", - "description": "Run docker cleanup.", - "required": false, - "schema": { - "type": "boolean", - "default": true - } - }, - { - "name": "delete_connected_networks", - "in": "query", - "description": "Delete connected networks.", - "required": false, - "schema": { - "type": "boolean", - "default": true - } - } - ], - "responses": { - "200": { - "description": "Delete a service by UUID", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Service deletion request queued." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/services\/{uuid}\/envs": { - "get": { - "tags": [ - "Services" - ], - "summary": "List Envs", - "description": "List all envs by service UUID.", - "operationId": "list-envs-by-service-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the service.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "All environment variables by service UUID.", - "content": { - "application\/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#\/components\/schemas\/EnvironmentVariable" - } - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "post": { - "tags": [ - "Services" - ], - "summary": "Create Env", - "description": "Create env by service UUID.", - "operationId": "create-env-by-service-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the service.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "description": "Env created.", - "required": true, - "content": { - "application\/json": { - "schema": { - "properties": { - "key": { - "type": "string", - "description": "The key of the environment variable." - }, - "value": { - "type": "string", - "description": "The value of the environment variable." - }, - "is_preview": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is used in preview deployments." - }, - "is_build_time": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is used in build time." - }, - "is_literal": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is a literal, nothing espaced." - }, - "is_multiline": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is multiline." - }, - "is_shown_once": { - "type": "boolean", - "description": "The flag to indicate if the environment variable's value is shown on the UI." - } - }, - "type": "object" - } - } - } - }, - "responses": { - "201": { - "description": "Environment variable created.", - "content": { - "application\/json": { - "schema": { - "properties": { - "uuid": { - "type": "string", - "example": "nc0k04gk8g0cgsk440g0koko" - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - }, - "patch": { - "tags": [ - "Services" - ], - "summary": "Update Env", - "description": "Update env by service UUID.", - "operationId": "update-env-by-service-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the service.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "description": "Env updated.", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "key", - "value" - ], - "properties": { - "key": { - "type": "string", - "description": "The key of the environment variable." - }, - "value": { - "type": "string", - "description": "The value of the environment variable." - }, - "is_preview": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is used in preview deployments." - }, - "is_build_time": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is used in build time." - }, - "is_literal": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is a literal, nothing espaced." - }, - "is_multiline": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is multiline." - }, - "is_shown_once": { - "type": "boolean", - "description": "The flag to indicate if the environment variable's value is shown on the UI." - } - }, - "type": "object" - } - } - } - }, - "responses": { - "201": { - "description": "Environment variable updated.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Environment variable updated." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/services\/{uuid}\/envs\/bulk": { - "patch": { - "tags": [ - "Services" - ], - "summary": "Update Envs (Bulk)", - "description": "Update multiple envs by service UUID.", - "operationId": "update-envs-by-service-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the service.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "description": "Bulk envs updated.", - "required": true, - "content": { - "application\/json": { - "schema": { - "required": [ - "data" - ], - "properties": { - "data": { - "type": "array", - "items": { - "properties": { - "key": { - "type": "string", - "description": "The key of the environment variable." - }, - "value": { - "type": "string", - "description": "The value of the environment variable." - }, - "is_preview": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is used in preview deployments." - }, - "is_build_time": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is used in build time." - }, - "is_literal": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is a literal, nothing espaced." - }, - "is_multiline": { - "type": "boolean", - "description": "The flag to indicate if the environment variable is multiline." - }, - "is_shown_once": { - "type": "boolean", - "description": "The flag to indicate if the environment variable's value is shown on the UI." - } - }, - "type": "object" - } - } - }, - "type": "object" - } - } - } - }, - "responses": { - "201": { - "description": "Environment variables updated.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Environment variables updated." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/services\/{uuid}\/envs\/{env_uuid}": { - "delete": { - "tags": [ - "Services" - ], - "summary": "Delete Env", - "description": "Delete env by UUID.", - "operationId": "delete-env-by-service-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the service.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "env_uuid", - "in": "path", - "description": "UUID of the environment variable.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "Environment variable deleted.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Environment variable deleted." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/services\/{uuid}\/start": { - "get": { - "tags": [ - "Services" - ], - "summary": "Start", - "description": "Start service. `Post` request is also accepted.", - "operationId": "start-service-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the service.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "Start service.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Service starting request queued." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/services\/{uuid}\/stop": { - "get": { - "tags": [ - "Services" - ], - "summary": "Stop", - "description": "Stop service. `Post` request is also accepted.", - "operationId": "stop-service-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the service.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "Stop service.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Service stopping request queued." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/services\/{uuid}\/restart": { - "get": { - "tags": [ - "Services" - ], - "summary": "Restart", - "description": "Restart service. `Post` request is also accepted.", - "operationId": "restart-service-by-uuid", - "parameters": [ - { - "name": "uuid", - "in": "path", - "description": "UUID of the service.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "Restart service.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Service restaring request queued." - } - }, - "type": "object" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/teams": { - "get": { - "tags": [ - "Teams" - ], - "summary": "List", - "description": "Get all teams.", - "operationId": "list-teams", - "responses": { - "200": { - "description": "List of teams.", - "content": { - "application\/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#\/components\/schemas\/Team" - } - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/teams\/{id}": { - "get": { - "tags": [ - "Teams" - ], - "summary": "Get", - "description": "Get team by TeamId.", - "operationId": "get-team-by-id", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Team ID", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "List of teams.", - "content": { - "application\/json": { - "schema": { - "$ref": "#\/components\/schemas\/Team" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/teams\/{id}\/members": { - "get": { - "tags": [ - "Teams" - ], - "summary": "Members", - "description": "Get members by TeamId.", - "operationId": "get-members-by-team-id", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Team ID", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "List of members.", - "content": { - "application\/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#\/components\/schemas\/User" - } - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - }, - "404": { - "$ref": "#\/components\/responses\/404" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/teams\/current": { - "get": { - "tags": [ - "Teams" - ], - "summary": "Authenticated Team", - "description": "Get currently authenticated team.", - "operationId": "get-current-team", - "responses": { - "200": { - "description": "Current Team.", - "content": { - "application\/json": { - "schema": { - "$ref": "#\/components\/schemas\/Team" - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - }, - "\/teams\/current\/members": { - "get": { - "tags": [ - "Teams" - ], - "summary": "Authenticated Team Members", - "description": "Get currently authenticated team members.", - "operationId": "get-current-team-members", - "responses": { - "200": { - "description": "Currently authenticated team members.", - "content": { - "application\/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#\/components\/schemas\/User" - } - } - } - } - }, - "401": { - "$ref": "#\/components\/responses\/401" - }, - "400": { - "$ref": "#\/components\/responses\/400" - } - }, - "security": [ - { - "bearerAuth": [] - } - ] - } - } - }, - "components": { - "schemas": { - "Application": { - "description": "Application model", - "properties": { - "id": { - "type": "integer", - "description": "The application identifier in the database." - }, - "description": { - "type": "string", - "nullable": true, - "description": "The application description." - }, - "repository_project_id": { - "type": "integer", - "nullable": true, - "description": "The repository project identifier." - }, - "uuid": { - "type": "string", - "description": "The application UUID." - }, - "name": { - "type": "string", - "description": "The application name." - }, - "fqdn": { - "type": "string", - "nullable": true, - "description": "The application domains." - }, - "config_hash": { - "type": "string", - "description": "Configuration hash." - }, - "git_repository": { - "type": "string", - "description": "Git repository URL." - }, - "git_branch": { - "type": "string", - "description": "Git branch." - }, - "git_commit_sha": { - "type": "string", - "description": "Git commit SHA." - }, - "git_full_url": { - "type": "string", - "nullable": true, - "description": "Git full URL." - }, - "docker_registry_image_name": { - "type": "string", - "nullable": true, - "description": "Docker registry image name." - }, - "docker_registry_image_tag": { - "type": "string", - "nullable": true, - "description": "Docker registry image tag." - }, - "build_pack": { - "type": "string", - "description": "Build pack.", - "enum": [ - "nixpacks", - "static", - "dockerfile", - "dockercompose" - ] - }, - "static_image": { - "type": "string", - "description": "Static image used when static site is deployed." - }, - "install_command": { - "type": "string", - "description": "Install command." - }, - "build_command": { - "type": "string", - "description": "Build command." - }, - "start_command": { - "type": "string", - "description": "Start command." - }, - "ports_exposes": { - "type": "string", - "description": "Ports exposes." - }, - "ports_mappings": { - "type": "string", - "nullable": true, - "description": "Ports mappings." - }, - "base_directory": { - "type": "string", - "description": "Base directory for all commands." - }, - "publish_directory": { - "type": "string", - "description": "Publish directory." - }, - "health_check_enabled": { - "type": "boolean", - "description": "Health check enabled." - }, - "health_check_path": { - "type": "string", - "description": "Health check path." - }, - "health_check_port": { - "type": "string", - "nullable": true, - "description": "Health check port." - }, - "health_check_host": { - "type": "string", - "nullable": true, - "description": "Health check host." - }, - "health_check_method": { - "type": "string", - "description": "Health check method." - }, - "health_check_return_code": { - "type": "integer", - "description": "Health check return code." - }, - "health_check_scheme": { - "type": "string", - "description": "Health check scheme." - }, - "health_check_response_text": { - "type": "string", - "nullable": true, - "description": "Health check response text." - }, - "health_check_interval": { - "type": "integer", - "description": "Health check interval in seconds." - }, - "health_check_timeout": { - "type": "integer", - "description": "Health check timeout in seconds." - }, - "health_check_retries": { - "type": "integer", - "description": "Health check retries count." - }, - "health_check_start_period": { - "type": "integer", - "description": "Health check start period in seconds." - }, - "limits_memory": { - "type": "string", - "description": "Memory limit." - }, - "limits_memory_swap": { - "type": "string", - "description": "Memory swap limit." - }, - "limits_memory_swappiness": { - "type": "integer", - "description": "Memory swappiness." - }, - "limits_memory_reservation": { - "type": "string", - "description": "Memory reservation." - }, - "limits_cpus": { - "type": "string", - "description": "CPU limit." - }, - "limits_cpuset": { - "type": "string", - "nullable": true, - "description": "CPU set." - }, - "limits_cpu_shares": { - "type": "integer", - "description": "CPU shares." - }, - "status": { - "type": "string", - "description": "Application status." - }, - "preview_url_template": { - "type": "string", - "description": "Preview URL template." - }, - "destination_type": { - "type": "string", - "description": "Destination type." - }, - "destination_id": { - "type": "integer", - "description": "Destination identifier." - }, - "source_id": { - "type": "integer", - "nullable": true, - "description": "Source identifier." - }, - "private_key_id": { - "type": "integer", - "nullable": true, - "description": "Private key identifier." - }, - "environment_id": { - "type": "integer", - "description": "Environment identifier." - }, - "dockerfile": { - "type": "string", - "nullable": true, - "description": "Dockerfile content. Used for dockerfile build pack." - }, - "dockerfile_location": { - "type": "string", - "description": "Dockerfile location." - }, - "custom_labels": { - "type": "string", - "nullable": true, - "description": "Custom labels." - }, - "dockerfile_target_build": { - "type": "string", - "nullable": true, - "description": "Dockerfile target build." - }, - "manual_webhook_secret_github": { - "type": "string", - "nullable": true, - "description": "Manual webhook secret for GitHub." - }, - "manual_webhook_secret_gitlab": { - "type": "string", - "nullable": true, - "description": "Manual webhook secret for GitLab." - }, - "manual_webhook_secret_bitbucket": { - "type": "string", - "nullable": true, - "description": "Manual webhook secret for Bitbucket." - }, - "manual_webhook_secret_gitea": { - "type": "string", - "nullable": true, - "description": "Manual webhook secret for Gitea." - }, - "docker_compose_location": { - "type": "string", - "description": "Docker compose location." - }, - "docker_compose": { - "type": "string", - "nullable": true, - "description": "Docker compose content. Used for docker compose build pack." - }, - "docker_compose_raw": { - "type": "string", - "nullable": true, - "description": "Docker compose raw content." - }, - "docker_compose_domains": { - "type": "string", - "nullable": true, - "description": "Docker compose domains." - }, - "docker_compose_custom_start_command": { - "type": "string", - "nullable": true, - "description": "Docker compose custom start command." - }, - "docker_compose_custom_build_command": { - "type": "string", - "nullable": true, - "description": "Docker compose custom build command." - }, - "swarm_replicas": { - "type": "integer", - "nullable": true, - "description": "Swarm replicas. Only used for swarm deployments." - }, - "swarm_placement_constraints": { - "type": "string", - "nullable": true, - "description": "Swarm placement constraints. Only used for swarm deployments." - }, - "custom_docker_run_options": { - "type": "string", - "nullable": true, - "description": "Custom docker run options." - }, - "post_deployment_command": { - "type": "string", - "nullable": true, - "description": "Post deployment command." - }, - "post_deployment_command_container": { - "type": "string", - "nullable": true, - "description": "Post deployment command container." - }, - "pre_deployment_command": { - "type": "string", - "nullable": true, - "description": "Pre deployment command." - }, - "pre_deployment_command_container": { - "type": "string", - "nullable": true, - "description": "Pre deployment command container." - }, - "watch_paths": { - "type": "string", - "nullable": true, - "description": "Watch paths." - }, - "custom_healthcheck_found": { - "type": "boolean", - "description": "Custom healthcheck found." - }, - "redirect": { - "type": "string", - "nullable": true, - "description": "How to set redirect with Traefik \/ Caddy. www<->non-www.", - "enum": [ - "www", - "non-www", - "both" - ] - }, - "created_at": { - "type": "string", - "format": "date-time", - "description": "The date and time when the application was created." - }, - "updated_at": { - "type": "string", - "format": "date-time", - "description": "The date and time when the application was last updated." - }, - "deleted_at": { - "type": "string", - "format": "date-time", - "nullable": true, - "description": "The date and time when the application was deleted." - }, - "compose_parsing_version": { - "type": "string", - "description": "How Coolify parse the compose file." - }, - "custom_nginx_configuration": { - "type": "string", - "nullable": true, - "description": "Custom Nginx configuration base64 encoded." - } - }, - "type": "object" - }, - "ApplicationDeploymentQueue": { - "description": "Project model", - "properties": { - "id": { - "type": "integer" - }, - "application_id": { - "type": "string" - }, - "deployment_uuid": { - "type": "string" - }, - "pull_request_id": { - "type": "integer" - }, - "force_rebuild": { - "type": "boolean" - }, - "commit": { - "type": "string" - }, - "status": { - "type": "string" - }, - "is_webhook": { - "type": "boolean" - }, - "is_api": { - "type": "boolean" - }, - "created_at": { - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "logs": { - "type": "string" - }, - "current_process_id": { - "type": "string" - }, - "restart_only": { - "type": "boolean" - }, - "git_type": { - "type": "string" - }, - "server_id": { - "type": "integer" - }, - "application_name": { - "type": "string" - }, - "server_name": { - "type": "string" - }, - "deployment_url": { - "type": "string" - }, - "destination_id": { - "type": "string" - }, - "only_this_server": { - "type": "boolean" - }, - "rollback": { - "type": "boolean" - }, - "commit_message": { - "type": "string" - } - }, - "type": "object" - }, - "Environment": { - "description": "Environment model", - "properties": { - "id": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "project_id": { - "type": "integer" - }, - "created_at": { - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "type": "object" - }, - "EnvironmentVariable": { - "description": "Environment Variable model", - "properties": { - "id": { - "type": "integer" - }, - "uuid": { - "type": "string" - }, - "resourceable_type": { - "type": "string" - }, - "resourceable_id": { - "type": "integer" - }, - "is_build_time": { - "type": "boolean" - }, - "is_literal": { - "type": "boolean" - }, - "is_multiline": { - "type": "boolean" - }, - "is_preview": { - "type": "boolean" - }, - "is_shared": { - "type": "boolean" - }, - "is_shown_once": { - "type": "boolean" - }, - "key": { - "type": "string" - }, - "value": { - "type": "string" - }, - "real_value": { - "type": "string" - }, - "version": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "updated_at": { - "type": "string" - } - }, - "type": "object" - }, - "PrivateKey": { - "description": "Private Key model", - "properties": { - "id": { - "type": "integer" - }, - "uuid": { - "type": "string" - }, - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "private_key": { - "type": "string", - "format": "private-key" - }, - "is_git_related": { - "type": "boolean" - }, - "team_id": { - "type": "integer" - }, - "created_at": { - "type": "string" - }, - "updated_at": { - "type": "string" - } - }, - "type": "object" - }, - "Project": { - "description": "Project model", - "properties": { - "id": { - "type": "integer" - }, - "uuid": { - "type": "string" - }, - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "environments": { - "description": "The environments of the project.", - "type": "array", - "items": { - "$ref": "#\/components\/schemas\/Environment" - } - } - }, - "type": "object" - }, - "Server": { - "description": "Server model", - "properties": { - "id": { - "type": "integer", - "description": "The server ID." - }, - "uuid": { - "type": "string", - "description": "The server UUID." - }, - "name": { - "type": "string", - "description": "The server name." - }, - "description": { - "type": "string", - "description": "The server description." - }, - "ip": { - "type": "string", - "description": "The IP address." - }, - "user": { - "type": "string", - "description": "The user." - }, - "port": { - "type": "integer", - "description": "The port number." - }, - "proxy": { - "type": "object", - "description": "The proxy configuration." - }, - "proxy_type": { - "type": "string", - "enum": [ - "traefik", - "caddy", - "none" - ], - "description": "The proxy type." - }, - "high_disk_usage_notification_sent": { - "type": "boolean", - "description": "The flag to indicate if the high disk usage notification has been sent." - }, - "unreachable_notification_sent": { - "type": "boolean", - "description": "The flag to indicate if the unreachable notification has been sent." - }, - "unreachable_count": { - "type": "integer", - "description": "The unreachable count for your server." - }, - "validation_logs": { - "type": "string", - "description": "The validation logs." - }, - "log_drain_notification_sent": { - "type": "boolean", - "description": "The flag to indicate if the log drain notification has been sent." - }, - "swarm_cluster": { - "type": "string", - "description": "The swarm cluster configuration." - }, - "settings": { - "$ref": "#\/components\/schemas\/ServerSetting" - } - }, - "type": "object" - }, - "ServerSetting": { - "description": "Server Settings model", - "properties": { - "id": { - "type": "integer" - }, - "concurrent_builds": { - "type": "integer" - }, - "dynamic_timeout": { - "type": "integer" - }, - "force_disabled": { - "type": "boolean" - }, - "force_server_cleanup": { - "type": "boolean" - }, - "is_build_server": { - "type": "boolean" - }, - "is_cloudflare_tunnel": { - "type": "boolean" - }, - "is_jump_server": { - "type": "boolean" - }, - "is_logdrain_axiom_enabled": { - "type": "boolean" - }, - "is_logdrain_custom_enabled": { - "type": "boolean" - }, - "is_logdrain_highlight_enabled": { - "type": "boolean" - }, - "is_logdrain_newrelic_enabled": { - "type": "boolean" - }, - "is_metrics_enabled": { - "type": "boolean" - }, - "is_reachable": { - "type": "boolean" - }, - "is_sentinel_enabled": { - "type": "boolean" - }, - "is_swarm_manager": { - "type": "boolean" - }, - "is_swarm_worker": { - "type": "boolean" - }, - "is_usable": { - "type": "boolean" - }, - "logdrain_axiom_api_key": { - "type": "string" - }, - "logdrain_axiom_dataset_name": { - "type": "string" - }, - "logdrain_custom_config": { - "type": "string" - }, - "logdrain_custom_config_parser": { - "type": "string" - }, - "logdrain_highlight_project_id": { - "type": "string" - }, - "logdrain_newrelic_base_uri": { - "type": "string" - }, - "logdrain_newrelic_license_key": { - "type": "string" - }, - "sentinel_metrics_history_days": { - "type": "integer" - }, - "sentinel_metrics_refresh_rate_seconds": { - "type": "integer" - }, - "sentinel_token": { - "type": "string" - }, - "docker_cleanup_frequency": { - "type": "string" - }, - "docker_cleanup_threshold": { - "type": "integer" - }, - "server_id": { - "type": "integer" - }, - "wildcard_domain": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "delete_unused_volumes": { - "type": "boolean", - "description": "The flag to indicate if the unused volumes should be deleted." - }, - "delete_unused_networks": { - "type": "boolean", - "description": "The flag to indicate if the unused networks should be deleted." - } - }, - "type": "object" - }, - "Service": { - "description": "Service model", - "properties": { - "id": { - "type": "integer", - "description": "The unique identifier of the service. Only used for database identification." - }, - "uuid": { - "type": "string", - "description": "The unique identifier of the service." - }, - "name": { - "type": "string", - "description": "The name of the service." - }, - "environment_id": { - "type": "integer", - "description": "The unique identifier of the environment where the service is attached to." - }, - "server_id": { - "type": "integer", - "description": "The unique identifier of the server where the service is running." - }, - "description": { - "type": "string", - "description": "The description of the service." - }, - "docker_compose_raw": { - "type": "string", - "description": "The raw docker-compose.yml file of the service." - }, - "docker_compose": { - "type": "string", - "description": "The docker-compose.yml file that is parsed and modified by Coolify." - }, - "destination_type": { - "type": "string", - "description": "Destination type." - }, - "destination_id": { - "type": "integer", - "description": "The unique identifier of the destination where the service is running." - }, - "connect_to_docker_network": { - "type": "boolean", - "description": "The flag to connect the service to the predefined Docker network." - }, - "is_container_label_escape_enabled": { - "type": "boolean", - "description": "The flag to enable the container label escape." - }, - "is_container_label_readonly_enabled": { - "type": "boolean", - "description": "The flag to enable the container label readonly." - }, - "config_hash": { - "type": "string", - "description": "The hash of the service configuration." - }, - "service_type": { - "type": "string", - "description": "The type of the service." - }, - "created_at": { - "type": "string", - "description": "The date and time when the service was created." - }, - "updated_at": { - "type": "string", - "description": "The date and time when the service was last updated." - }, - "deleted_at": { - "type": "string", - "description": "The date and time when the service was deleted." - } - }, - "type": "object" - }, - "Team": { - "description": "Team model", - "properties": { - "id": { - "type": "integer", - "description": "The unique identifier of the team." - }, - "name": { - "type": "string", - "description": "The name of the team." - }, - "description": { - "type": "string", - "description": "The description of the team." - }, - "personal_team": { - "type": "boolean", - "description": "Whether the team is personal or not." - }, - "created_at": { - "type": "string", - "description": "The date and time the team was created." - }, - "updated_at": { - "type": "string", - "description": "The date and time the team was last updated." - }, - "show_boarding": { - "type": "boolean", - "description": "Whether to show the boarding screen or not." - }, - "custom_server_limit": { - "type": "string", - "description": "The custom server limit." - }, - "members": { - "description": "The members of the team.", - "type": "array", - "items": { - "$ref": "#\/components\/schemas\/User" - } - } - }, - "type": "object" - }, - "User": { - "description": "User model", - "properties": { - "id": { - "type": "integer", - "description": "The user identifier in the database." - }, - "name": { - "type": "string", - "description": "The user name." - }, - "email": { - "type": "string", - "description": "The user email." - }, - "email_verified_at": { - "type": "string", - "description": "The date when the user email was verified." - }, - "created_at": { - "type": "string", - "description": "The date when the user was created." - }, - "updated_at": { - "type": "string", - "description": "The date when the user was updated." - }, - "two_factor_confirmed_at": { - "type": "string", - "description": "The date when the user two factor was confirmed." - }, - "force_password_reset": { - "type": "boolean", - "description": "The flag to force the user to reset the password." - }, - "marketing_emails": { - "type": "boolean", - "description": "The flag to receive marketing emails." - } - }, - "type": "object" - } - }, - "responses": { - "400": { - "description": "Invalid token.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Invalid token." - } - }, - "type": "object" - } - } - } - }, - "401": { - "description": "Unauthenticated.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Unauthenticated." - } - }, - "type": "object" - } - } - } - }, - "404": { - "description": "Resource not found.", - "content": { - "application\/json": { - "schema": { - "properties": { - "message": { - "type": "string", - "example": "Resource not found." - } - }, - "type": "object" - } - } - } - } - }, - "securitySchemes": { - "bearerAuth": { - "type": "http", - "description": "Go to `Keys & Tokens` \/ `API tokens` and create a new token. Use the token as the bearer token.", - "scheme": "bearer" - } - } - }, - "tags": [ - { - "name": "Applications", - "description": "Applications" - }, - { - "name": "Databases", - "description": "Databases" - }, - { - "name": "Deployments", - "description": "Deployments" - }, - { - "name": "Projects", - "description": "Projects" - }, - { - "name": "Resources", - "description": "Resources" - }, - { - "name": "Private Keys", - "description": "Private Keys" - }, - { - "name": "Servers", - "description": "Servers" - }, - { - "name": "Services", - "description": "Services" - }, - { - "name": "Teams", - "description": "Teams" - } - ] -} \ No newline at end of file diff --git a/openapi.yaml b/openapi.yaml deleted file mode 100644 index 2d18031133..0000000000 --- a/openapi.yaml +++ /dev/null @@ -1,5342 +0,0 @@ -openapi: 3.1.0 -info: - title: Coolify - version: '0.1' -servers: - - - url: 'https://app.coolify.io/api/v1' - description: 'Coolify Cloud API. Change the host to your own instance if you are self-hosting.' -paths: - /applications: - get: - tags: - - Applications - summary: List - description: 'List all applications.' - operationId: list-applications - responses: - '200': - description: 'Get all applications.' - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/Application' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /applications/public: - post: - tags: - - Applications - summary: 'Create (Public)' - description: 'Create new application based on a public git repository.' - operationId: create-public-application - requestBody: - description: 'Application object that needs to be created.' - required: true - content: - application/json: - schema: - required: - - project_uuid - - server_uuid - - environment_name - - environment_uuid - - git_repository - - git_branch - - build_pack - - ports_exposes - properties: - project_uuid: - type: string - description: 'The project UUID.' - server_uuid: - type: string - description: 'The server UUID.' - environment_name: - type: string - description: 'The environment name. You need to provide at least one of environment_name or environment_uuid.' - environment_uuid: - type: string - description: 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.' - git_repository: - type: string - description: 'The git repository URL.' - git_branch: - type: string - description: 'The git branch.' - build_pack: - type: string - enum: [nixpacks, static, dockerfile, dockercompose] - description: 'The build pack type.' - ports_exposes: - type: string - description: 'The ports to expose.' - destination_uuid: - type: string - description: 'The destination UUID.' - name: - type: string - description: 'The application name.' - description: - type: string - description: 'The application description.' - domains: - type: string - description: 'The application domains.' - git_commit_sha: - type: string - description: 'The git commit SHA.' - docker_registry_image_name: - type: string - description: 'The docker registry image name.' - docker_registry_image_tag: - type: string - description: 'The docker registry image tag.' - is_static: - type: boolean - description: 'The flag to indicate if the application is static.' - static_image: - type: string - enum: ['nginx:alpine'] - description: 'The static image.' - install_command: - type: string - description: 'The install command.' - build_command: - type: string - description: 'The build command.' - start_command: - type: string - description: 'The start command.' - ports_mappings: - type: string - description: 'The ports mappings.' - base_directory: - type: string - description: 'The base directory for all commands.' - publish_directory: - type: string - description: 'The publish directory.' - health_check_enabled: - type: boolean - description: 'Health check enabled.' - health_check_path: - type: string - description: 'Health check path.' - health_check_port: - type: string - nullable: true - description: 'Health check port.' - health_check_host: - type: string - nullable: true - description: 'Health check host.' - health_check_method: - type: string - description: 'Health check method.' - health_check_return_code: - type: integer - description: 'Health check return code.' - health_check_scheme: - type: string - description: 'Health check scheme.' - health_check_response_text: - type: string - nullable: true - description: 'Health check response text.' - health_check_interval: - type: integer - description: 'Health check interval in seconds.' - health_check_timeout: - type: integer - description: 'Health check timeout in seconds.' - health_check_retries: - type: integer - description: 'Health check retries count.' - health_check_start_period: - type: integer - description: 'Health check start period in seconds.' - limits_memory: - type: string - description: 'Memory limit.' - limits_memory_swap: - type: string - description: 'Memory swap limit.' - limits_memory_swappiness: - type: integer - description: 'Memory swappiness.' - limits_memory_reservation: - type: string - description: 'Memory reservation.' - limits_cpus: - type: string - description: 'CPU limit.' - limits_cpuset: - type: string - nullable: true - description: 'CPU set.' - limits_cpu_shares: - type: integer - description: 'CPU shares.' - custom_labels: - type: string - description: 'Custom labels.' - custom_docker_run_options: - type: string - description: 'Custom docker run options.' - post_deployment_command: - type: string - description: 'Post deployment command.' - post_deployment_command_container: - type: string - description: 'Post deployment command container.' - pre_deployment_command: - type: string - description: 'Pre deployment command.' - pre_deployment_command_container: - type: string - description: 'Pre deployment command container.' - manual_webhook_secret_github: - type: string - description: 'Manual webhook secret for Github.' - manual_webhook_secret_gitlab: - type: string - description: 'Manual webhook secret for Gitlab.' - manual_webhook_secret_bitbucket: - type: string - description: 'Manual webhook secret for Bitbucket.' - manual_webhook_secret_gitea: - type: string - description: 'Manual webhook secret for Gitea.' - redirect: - type: string - nullable: true - description: 'How to set redirect with Traefik / Caddy. www<->non-www.' - enum: [www, non-www, both] - instant_deploy: - type: boolean - description: 'The flag to indicate if the application should be deployed instantly.' - dockerfile: - type: string - description: 'The Dockerfile content.' - docker_compose_location: - type: string - description: 'The Docker Compose location.' - docker_compose_raw: - type: string - description: 'The Docker Compose raw content.' - docker_compose_custom_start_command: - type: string - description: 'The Docker Compose custom start command.' - docker_compose_custom_build_command: - type: string - description: 'The Docker Compose custom build command.' - docker_compose_domains: - type: array - description: 'The Docker Compose domains.' - watch_paths: - type: string - description: 'The watch paths.' - use_build_server: - type: boolean - nullable: true - description: 'Use build server.' - type: object - responses: - '201': - description: 'Application created successfully.' - content: - application/json: - schema: - properties: - uuid: { type: string } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /applications/private-github-app: - post: - tags: - - Applications - summary: 'Create (Private - GH App)' - description: 'Create new application based on a private repository through a Github App.' - operationId: create-private-github-app-application - requestBody: - description: 'Application object that needs to be created.' - required: true - content: - application/json: - schema: - required: - - project_uuid - - server_uuid - - environment_name - - environment_uuid - - github_app_uuid - - git_repository - - git_branch - - build_pack - - ports_exposes - properties: - project_uuid: - type: string - description: 'The project UUID.' - server_uuid: - type: string - description: 'The server UUID.' - environment_name: - type: string - description: 'The environment name. You need to provide at least one of environment_name or environment_uuid.' - environment_uuid: - type: string - description: 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.' - github_app_uuid: - type: string - description: 'The Github App UUID.' - git_repository: - type: string - description: 'The git repository URL.' - git_branch: - type: string - description: 'The git branch.' - ports_exposes: - type: string - description: 'The ports to expose.' - destination_uuid: - type: string - description: 'The destination UUID.' - build_pack: - type: string - enum: [nixpacks, static, dockerfile, dockercompose] - description: 'The build pack type.' - name: - type: string - description: 'The application name.' - description: - type: string - description: 'The application description.' - domains: - type: string - description: 'The application domains.' - git_commit_sha: - type: string - description: 'The git commit SHA.' - docker_registry_image_name: - type: string - description: 'The docker registry image name.' - docker_registry_image_tag: - type: string - description: 'The docker registry image tag.' - is_static: - type: boolean - description: 'The flag to indicate if the application is static.' - static_image: - type: string - enum: ['nginx:alpine'] - description: 'The static image.' - install_command: - type: string - description: 'The install command.' - build_command: - type: string - description: 'The build command.' - start_command: - type: string - description: 'The start command.' - ports_mappings: - type: string - description: 'The ports mappings.' - base_directory: - type: string - description: 'The base directory for all commands.' - publish_directory: - type: string - description: 'The publish directory.' - health_check_enabled: - type: boolean - description: 'Health check enabled.' - health_check_path: - type: string - description: 'Health check path.' - health_check_port: - type: string - nullable: true - description: 'Health check port.' - health_check_host: - type: string - nullable: true - description: 'Health check host.' - health_check_method: - type: string - description: 'Health check method.' - health_check_return_code: - type: integer - description: 'Health check return code.' - health_check_scheme: - type: string - description: 'Health check scheme.' - health_check_response_text: - type: string - nullable: true - description: 'Health check response text.' - health_check_interval: - type: integer - description: 'Health check interval in seconds.' - health_check_timeout: - type: integer - description: 'Health check timeout in seconds.' - health_check_retries: - type: integer - description: 'Health check retries count.' - health_check_start_period: - type: integer - description: 'Health check start period in seconds.' - limits_memory: - type: string - description: 'Memory limit.' - limits_memory_swap: - type: string - description: 'Memory swap limit.' - limits_memory_swappiness: - type: integer - description: 'Memory swappiness.' - limits_memory_reservation: - type: string - description: 'Memory reservation.' - limits_cpus: - type: string - description: 'CPU limit.' - limits_cpuset: - type: string - nullable: true - description: 'CPU set.' - limits_cpu_shares: - type: integer - description: 'CPU shares.' - custom_labels: - type: string - description: 'Custom labels.' - custom_docker_run_options: - type: string - description: 'Custom docker run options.' - post_deployment_command: - type: string - description: 'Post deployment command.' - post_deployment_command_container: - type: string - description: 'Post deployment command container.' - pre_deployment_command: - type: string - description: 'Pre deployment command.' - pre_deployment_command_container: - type: string - description: 'Pre deployment command container.' - manual_webhook_secret_github: - type: string - description: 'Manual webhook secret for Github.' - manual_webhook_secret_gitlab: - type: string - description: 'Manual webhook secret for Gitlab.' - manual_webhook_secret_bitbucket: - type: string - description: 'Manual webhook secret for Bitbucket.' - manual_webhook_secret_gitea: - type: string - description: 'Manual webhook secret for Gitea.' - redirect: - type: string - nullable: true - description: 'How to set redirect with Traefik / Caddy. www<->non-www.' - enum: [www, non-www, both] - instant_deploy: - type: boolean - description: 'The flag to indicate if the application should be deployed instantly.' - dockerfile: - type: string - description: 'The Dockerfile content.' - docker_compose_location: - type: string - description: 'The Docker Compose location.' - docker_compose_raw: - type: string - description: 'The Docker Compose raw content.' - docker_compose_custom_start_command: - type: string - description: 'The Docker Compose custom start command.' - docker_compose_custom_build_command: - type: string - description: 'The Docker Compose custom build command.' - docker_compose_domains: - type: array - description: 'The Docker Compose domains.' - watch_paths: - type: string - description: 'The watch paths.' - use_build_server: - type: boolean - nullable: true - description: 'Use build server.' - type: object - responses: - '201': - description: 'Application created successfully.' - content: - application/json: - schema: - properties: - uuid: { type: string } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /applications/private-deploy-key: - post: - tags: - - Applications - summary: 'Create (Private - Deploy Key)' - description: 'Create new application based on a private repository through a Deploy Key.' - operationId: create-private-deploy-key-application - requestBody: - description: 'Application object that needs to be created.' - required: true - content: - application/json: - schema: - required: - - project_uuid - - server_uuid - - environment_name - - environment_uuid - - private_key_uuid - - git_repository - - git_branch - - build_pack - - ports_exposes - properties: - project_uuid: - type: string - description: 'The project UUID.' - server_uuid: - type: string - description: 'The server UUID.' - environment_name: - type: string - description: 'The environment name. You need to provide at least one of environment_name or environment_uuid.' - environment_uuid: - type: string - description: 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.' - private_key_uuid: - type: string - description: 'The private key UUID.' - git_repository: - type: string - description: 'The git repository URL.' - git_branch: - type: string - description: 'The git branch.' - ports_exposes: - type: string - description: 'The ports to expose.' - destination_uuid: - type: string - description: 'The destination UUID.' - build_pack: - type: string - enum: [nixpacks, static, dockerfile, dockercompose] - description: 'The build pack type.' - name: - type: string - description: 'The application name.' - description: - type: string - description: 'The application description.' - domains: - type: string - description: 'The application domains.' - git_commit_sha: - type: string - description: 'The git commit SHA.' - docker_registry_image_name: - type: string - description: 'The docker registry image name.' - docker_registry_image_tag: - type: string - description: 'The docker registry image tag.' - is_static: - type: boolean - description: 'The flag to indicate if the application is static.' - static_image: - type: string - enum: ['nginx:alpine'] - description: 'The static image.' - install_command: - type: string - description: 'The install command.' - build_command: - type: string - description: 'The build command.' - start_command: - type: string - description: 'The start command.' - ports_mappings: - type: string - description: 'The ports mappings.' - base_directory: - type: string - description: 'The base directory for all commands.' - publish_directory: - type: string - description: 'The publish directory.' - health_check_enabled: - type: boolean - description: 'Health check enabled.' - health_check_path: - type: string - description: 'Health check path.' - health_check_port: - type: string - nullable: true - description: 'Health check port.' - health_check_host: - type: string - nullable: true - description: 'Health check host.' - health_check_method: - type: string - description: 'Health check method.' - health_check_return_code: - type: integer - description: 'Health check return code.' - health_check_scheme: - type: string - description: 'Health check scheme.' - health_check_response_text: - type: string - nullable: true - description: 'Health check response text.' - health_check_interval: - type: integer - description: 'Health check interval in seconds.' - health_check_timeout: - type: integer - description: 'Health check timeout in seconds.' - health_check_retries: - type: integer - description: 'Health check retries count.' - health_check_start_period: - type: integer - description: 'Health check start period in seconds.' - limits_memory: - type: string - description: 'Memory limit.' - limits_memory_swap: - type: string - description: 'Memory swap limit.' - limits_memory_swappiness: - type: integer - description: 'Memory swappiness.' - limits_memory_reservation: - type: string - description: 'Memory reservation.' - limits_cpus: - type: string - description: 'CPU limit.' - limits_cpuset: - type: string - nullable: true - description: 'CPU set.' - limits_cpu_shares: - type: integer - description: 'CPU shares.' - custom_labels: - type: string - description: 'Custom labels.' - custom_docker_run_options: - type: string - description: 'Custom docker run options.' - post_deployment_command: - type: string - description: 'Post deployment command.' - post_deployment_command_container: - type: string - description: 'Post deployment command container.' - pre_deployment_command: - type: string - description: 'Pre deployment command.' - pre_deployment_command_container: - type: string - description: 'Pre deployment command container.' - manual_webhook_secret_github: - type: string - description: 'Manual webhook secret for Github.' - manual_webhook_secret_gitlab: - type: string - description: 'Manual webhook secret for Gitlab.' - manual_webhook_secret_bitbucket: - type: string - description: 'Manual webhook secret for Bitbucket.' - manual_webhook_secret_gitea: - type: string - description: 'Manual webhook secret for Gitea.' - redirect: - type: string - nullable: true - description: 'How to set redirect with Traefik / Caddy. www<->non-www.' - enum: [www, non-www, both] - instant_deploy: - type: boolean - description: 'The flag to indicate if the application should be deployed instantly.' - dockerfile: - type: string - description: 'The Dockerfile content.' - docker_compose_location: - type: string - description: 'The Docker Compose location.' - docker_compose_raw: - type: string - description: 'The Docker Compose raw content.' - docker_compose_custom_start_command: - type: string - description: 'The Docker Compose custom start command.' - docker_compose_custom_build_command: - type: string - description: 'The Docker Compose custom build command.' - docker_compose_domains: - type: array - description: 'The Docker Compose domains.' - watch_paths: - type: string - description: 'The watch paths.' - use_build_server: - type: boolean - nullable: true - description: 'Use build server.' - type: object - responses: - '201': - description: 'Application created successfully.' - content: - application/json: - schema: - properties: - uuid: { type: string } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /applications/dockerfile: - post: - tags: - - Applications - summary: 'Create (Dockerfile)' - description: 'Create new application based on a simple Dockerfile.' - operationId: create-dockerfile-application - requestBody: - description: 'Application object that needs to be created.' - required: true - content: - application/json: - schema: - required: - - project_uuid - - server_uuid - - environment_name - - environment_uuid - - dockerfile - properties: - project_uuid: - type: string - description: 'The project UUID.' - server_uuid: - type: string - description: 'The server UUID.' - environment_name: - type: string - description: 'The environment name. You need to provide at least one of environment_name or environment_uuid.' - environment_uuid: - type: string - description: 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.' - dockerfile: - type: string - description: 'The Dockerfile content.' - build_pack: - type: string - enum: [nixpacks, static, dockerfile, dockercompose] - description: 'The build pack type.' - ports_exposes: - type: string - description: 'The ports to expose.' - destination_uuid: - type: string - description: 'The destination UUID.' - name: - type: string - description: 'The application name.' - description: - type: string - description: 'The application description.' - domains: - type: string - description: 'The application domains.' - docker_registry_image_name: - type: string - description: 'The docker registry image name.' - docker_registry_image_tag: - type: string - description: 'The docker registry image tag.' - ports_mappings: - type: string - description: 'The ports mappings.' - base_directory: - type: string - description: 'The base directory for all commands.' - health_check_enabled: - type: boolean - description: 'Health check enabled.' - health_check_path: - type: string - description: 'Health check path.' - health_check_port: - type: string - nullable: true - description: 'Health check port.' - health_check_host: - type: string - nullable: true - description: 'Health check host.' - health_check_method: - type: string - description: 'Health check method.' - health_check_return_code: - type: integer - description: 'Health check return code.' - health_check_scheme: - type: string - description: 'Health check scheme.' - health_check_response_text: - type: string - nullable: true - description: 'Health check response text.' - health_check_interval: - type: integer - description: 'Health check interval in seconds.' - health_check_timeout: - type: integer - description: 'Health check timeout in seconds.' - health_check_retries: - type: integer - description: 'Health check retries count.' - health_check_start_period: - type: integer - description: 'Health check start period in seconds.' - limits_memory: - type: string - description: 'Memory limit.' - limits_memory_swap: - type: string - description: 'Memory swap limit.' - limits_memory_swappiness: - type: integer - description: 'Memory swappiness.' - limits_memory_reservation: - type: string - description: 'Memory reservation.' - limits_cpus: - type: string - description: 'CPU limit.' - limits_cpuset: - type: string - nullable: true - description: 'CPU set.' - limits_cpu_shares: - type: integer - description: 'CPU shares.' - custom_labels: - type: string - description: 'Custom labels.' - custom_docker_run_options: - type: string - description: 'Custom docker run options.' - post_deployment_command: - type: string - description: 'Post deployment command.' - post_deployment_command_container: - type: string - description: 'Post deployment command container.' - pre_deployment_command: - type: string - description: 'Pre deployment command.' - pre_deployment_command_container: - type: string - description: 'Pre deployment command container.' - manual_webhook_secret_github: - type: string - description: 'Manual webhook secret for Github.' - manual_webhook_secret_gitlab: - type: string - description: 'Manual webhook secret for Gitlab.' - manual_webhook_secret_bitbucket: - type: string - description: 'Manual webhook secret for Bitbucket.' - manual_webhook_secret_gitea: - type: string - description: 'Manual webhook secret for Gitea.' - redirect: - type: string - nullable: true - description: 'How to set redirect with Traefik / Caddy. www<->non-www.' - enum: [www, non-www, both] - instant_deploy: - type: boolean - description: 'The flag to indicate if the application should be deployed instantly.' - use_build_server: - type: boolean - nullable: true - description: 'Use build server.' - type: object - responses: - '201': - description: 'Application created successfully.' - content: - application/json: - schema: - properties: - uuid: { type: string } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /applications/dockerimage: - post: - tags: - - Applications - summary: 'Create (Docker Image)' - description: 'Create new application based on a prebuilt docker image' - operationId: create-dockerimage-application - requestBody: - description: 'Application object that needs to be created.' - required: true - content: - application/json: - schema: - required: - - project_uuid - - server_uuid - - environment_name - - environment_uuid - - docker_registry_image_name - - ports_exposes - properties: - project_uuid: - type: string - description: 'The project UUID.' - server_uuid: - type: string - description: 'The server UUID.' - environment_name: - type: string - description: 'The environment name. You need to provide at least one of environment_name or environment_uuid.' - environment_uuid: - type: string - description: 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.' - docker_registry_image_name: - type: string - description: 'The docker registry image name.' - docker_registry_image_tag: - type: string - description: 'The docker registry image tag.' - ports_exposes: - type: string - description: 'The ports to expose.' - destination_uuid: - type: string - description: 'The destination UUID.' - name: - type: string - description: 'The application name.' - description: - type: string - description: 'The application description.' - domains: - type: string - description: 'The application domains.' - ports_mappings: - type: string - description: 'The ports mappings.' - health_check_enabled: - type: boolean - description: 'Health check enabled.' - health_check_path: - type: string - description: 'Health check path.' - health_check_port: - type: string - nullable: true - description: 'Health check port.' - health_check_host: - type: string - nullable: true - description: 'Health check host.' - health_check_method: - type: string - description: 'Health check method.' - health_check_return_code: - type: integer - description: 'Health check return code.' - health_check_scheme: - type: string - description: 'Health check scheme.' - health_check_response_text: - type: string - nullable: true - description: 'Health check response text.' - health_check_interval: - type: integer - description: 'Health check interval in seconds.' - health_check_timeout: - type: integer - description: 'Health check timeout in seconds.' - health_check_retries: - type: integer - description: 'Health check retries count.' - health_check_start_period: - type: integer - description: 'Health check start period in seconds.' - limits_memory: - type: string - description: 'Memory limit.' - limits_memory_swap: - type: string - description: 'Memory swap limit.' - limits_memory_swappiness: - type: integer - description: 'Memory swappiness.' - limits_memory_reservation: - type: string - description: 'Memory reservation.' - limits_cpus: - type: string - description: 'CPU limit.' - limits_cpuset: - type: string - nullable: true - description: 'CPU set.' - limits_cpu_shares: - type: integer - description: 'CPU shares.' - custom_labels: - type: string - description: 'Custom labels.' - custom_docker_run_options: - type: string - description: 'Custom docker run options.' - post_deployment_command: - type: string - description: 'Post deployment command.' - post_deployment_command_container: - type: string - description: 'Post deployment command container.' - pre_deployment_command: - type: string - description: 'Pre deployment command.' - pre_deployment_command_container: - type: string - description: 'Pre deployment command container.' - manual_webhook_secret_github: - type: string - description: 'Manual webhook secret for Github.' - manual_webhook_secret_gitlab: - type: string - description: 'Manual webhook secret for Gitlab.' - manual_webhook_secret_bitbucket: - type: string - description: 'Manual webhook secret for Bitbucket.' - manual_webhook_secret_gitea: - type: string - description: 'Manual webhook secret for Gitea.' - redirect: - type: string - nullable: true - description: 'How to set redirect with Traefik / Caddy. www<->non-www.' - enum: [www, non-www, both] - instant_deploy: - type: boolean - description: 'The flag to indicate if the application should be deployed instantly.' - use_build_server: - type: boolean - nullable: true - description: 'Use build server.' - type: object - responses: - '201': - description: 'Application created successfully.' - content: - application/json: - schema: - properties: - uuid: { type: string } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /applications/dockercompose: - post: - tags: - - Applications - summary: 'Create (Docker Compose)' - description: 'Create new application based on a docker-compose file.' - operationId: create-dockercompose-application - requestBody: - description: 'Application object that needs to be created.' - required: true - content: - application/json: - schema: - required: - - project_uuid - - server_uuid - - environment_name - - environment_uuid - - docker_compose_raw - properties: - project_uuid: - type: string - description: 'The project UUID.' - server_uuid: - type: string - description: 'The server UUID.' - environment_name: - type: string - description: 'The environment name. You need to provide at least one of environment_name or environment_uuid.' - environment_uuid: - type: string - description: 'The environment UUID. You need to provide at least one of environment_name or environment_uuid.' - docker_compose_raw: - type: string - description: 'The Docker Compose raw content.' - destination_uuid: - type: string - description: 'The destination UUID if the server has more than one destinations.' - name: - type: string - description: 'The application name.' - description: - type: string - description: 'The application description.' - instant_deploy: - type: boolean - description: 'The flag to indicate if the application should be deployed instantly.' - use_build_server: - type: boolean - nullable: true - description: 'Use build server.' - type: object - responses: - '201': - description: 'Application created successfully.' - content: - application/json: - schema: - properties: - uuid: { type: string } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - '/applications/{uuid}': - get: - tags: - - Applications - summary: Get - description: 'Get application by UUID.' - operationId: get-application-by-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the application.' - required: true - schema: - type: string - format: uuid - responses: - '200': - description: 'Get application by UUID.' - content: - application/json: - schema: - $ref: '#/components/schemas/Application' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - delete: - tags: - - Applications - summary: Delete - description: 'Delete application by UUID.' - operationId: delete-application-by-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the application.' - required: true - schema: - type: string - format: uuid - - - name: delete_configurations - in: query - description: 'Delete configurations.' - required: false - schema: - type: boolean - default: true - - - name: delete_volumes - in: query - description: 'Delete volumes.' - required: false - schema: - type: boolean - default: true - - - name: docker_cleanup - in: query - description: 'Run docker cleanup.' - required: false - schema: - type: boolean - default: true - - - name: delete_connected_networks - in: query - description: 'Delete connected networks.' - required: false - schema: - type: boolean - default: true - responses: - '200': - description: 'Application deleted.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Application deleted.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - patch: - tags: - - Applications - summary: Update - description: 'Update application by UUID.' - operationId: update-application-by-uuid - requestBody: - description: 'Application updated.' - required: true - content: - application/json: - schema: - properties: - project_uuid: - type: string - description: 'The project UUID.' - server_uuid: - type: string - description: 'The server UUID.' - environment_name: - type: string - description: 'The environment name.' - github_app_uuid: - type: string - description: 'The Github App UUID.' - git_repository: - type: string - description: 'The git repository URL.' - git_branch: - type: string - description: 'The git branch.' - ports_exposes: - type: string - description: 'The ports to expose.' - destination_uuid: - type: string - description: 'The destination UUID.' - build_pack: - type: string - enum: [nixpacks, static, dockerfile, dockercompose] - description: 'The build pack type.' - name: - type: string - description: 'The application name.' - description: - type: string - description: 'The application description.' - domains: - type: string - description: 'The application domains.' - git_commit_sha: - type: string - description: 'The git commit SHA.' - docker_registry_image_name: - type: string - description: 'The docker registry image name.' - docker_registry_image_tag: - type: string - description: 'The docker registry image tag.' - is_static: - type: boolean - description: 'The flag to indicate if the application is static.' - install_command: - type: string - description: 'The install command.' - build_command: - type: string - description: 'The build command.' - start_command: - type: string - description: 'The start command.' - ports_mappings: - type: string - description: 'The ports mappings.' - base_directory: - type: string - description: 'The base directory for all commands.' - publish_directory: - type: string - description: 'The publish directory.' - health_check_enabled: - type: boolean - description: 'Health check enabled.' - health_check_path: - type: string - description: 'Health check path.' - health_check_port: - type: string - nullable: true - description: 'Health check port.' - health_check_host: - type: string - nullable: true - description: 'Health check host.' - health_check_method: - type: string - description: 'Health check method.' - health_check_return_code: - type: integer - description: 'Health check return code.' - health_check_scheme: - type: string - description: 'Health check scheme.' - health_check_response_text: - type: string - nullable: true - description: 'Health check response text.' - health_check_interval: - type: integer - description: 'Health check interval in seconds.' - health_check_timeout: - type: integer - description: 'Health check timeout in seconds.' - health_check_retries: - type: integer - description: 'Health check retries count.' - health_check_start_period: - type: integer - description: 'Health check start period in seconds.' - limits_memory: - type: string - description: 'Memory limit.' - limits_memory_swap: - type: string - description: 'Memory swap limit.' - limits_memory_swappiness: - type: integer - description: 'Memory swappiness.' - limits_memory_reservation: - type: string - description: 'Memory reservation.' - limits_cpus: - type: string - description: 'CPU limit.' - limits_cpuset: - type: string - nullable: true - description: 'CPU set.' - limits_cpu_shares: - type: integer - description: 'CPU shares.' - custom_labels: - type: string - description: 'Custom labels.' - custom_docker_run_options: - type: string - description: 'Custom docker run options.' - post_deployment_command: - type: string - description: 'Post deployment command.' - post_deployment_command_container: - type: string - description: 'Post deployment command container.' - pre_deployment_command: - type: string - description: 'Pre deployment command.' - pre_deployment_command_container: - type: string - description: 'Pre deployment command container.' - manual_webhook_secret_github: - type: string - description: 'Manual webhook secret for Github.' - manual_webhook_secret_gitlab: - type: string - description: 'Manual webhook secret for Gitlab.' - manual_webhook_secret_bitbucket: - type: string - description: 'Manual webhook secret for Bitbucket.' - manual_webhook_secret_gitea: - type: string - description: 'Manual webhook secret for Gitea.' - redirect: - type: string - nullable: true - description: 'How to set redirect with Traefik / Caddy. www<->non-www.' - enum: [www, non-www, both] - instant_deploy: - type: boolean - description: 'The flag to indicate if the application should be deployed instantly.' - dockerfile: - type: string - description: 'The Dockerfile content.' - docker_compose_location: - type: string - description: 'The Docker Compose location.' - docker_compose_raw: - type: string - description: 'The Docker Compose raw content.' - docker_compose_custom_start_command: - type: string - description: 'The Docker Compose custom start command.' - docker_compose_custom_build_command: - type: string - description: 'The Docker Compose custom build command.' - docker_compose_domains: - type: array - description: 'The Docker Compose domains.' - watch_paths: - type: string - description: 'The watch paths.' - use_build_server: - type: boolean - nullable: true - description: 'Use build server.' - type: object - responses: - '200': - description: 'Application updated.' - content: - application/json: - schema: - properties: - uuid: { type: string } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/applications/{uuid}/envs': - get: - tags: - - Applications - summary: 'List Envs' - description: 'List all envs by application UUID.' - operationId: list-envs-by-application-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the application.' - required: true - schema: - type: string - format: uuid - responses: - '200': - description: 'All environment variables by application UUID.' - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/EnvironmentVariable' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - post: - tags: - - Applications - summary: 'Create Env' - description: 'Create env by application UUID.' - operationId: create-env-by-application-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the application.' - required: true - schema: - type: string - format: uuid - requestBody: - description: 'Env created.' - required: true - content: - application/json: - schema: - properties: - key: - type: string - description: 'The key of the environment variable.' - value: - type: string - description: 'The value of the environment variable.' - is_preview: - type: boolean - description: 'The flag to indicate if the environment variable is used in preview deployments.' - is_build_time: - type: boolean - description: 'The flag to indicate if the environment variable is used in build time.' - is_literal: - type: boolean - description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' - is_multiline: - type: boolean - description: 'The flag to indicate if the environment variable is multiline.' - is_shown_once: - type: boolean - description: "The flag to indicate if the environment variable's value is shown on the UI." - type: object - responses: - '201': - description: 'Environment variable created.' - content: - application/json: - schema: - properties: - uuid: { type: string, example: nc0k04gk8g0cgsk440g0koko } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - patch: - tags: - - Applications - summary: 'Update Env' - description: 'Update env by application UUID.' - operationId: update-env-by-application-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the application.' - required: true - schema: - type: string - format: uuid - requestBody: - description: 'Env updated.' - required: true - content: - application/json: - schema: - required: - - key - - value - properties: - key: - type: string - description: 'The key of the environment variable.' - value: - type: string - description: 'The value of the environment variable.' - is_preview: - type: boolean - description: 'The flag to indicate if the environment variable is used in preview deployments.' - is_build_time: - type: boolean - description: 'The flag to indicate if the environment variable is used in build time.' - is_literal: - type: boolean - description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' - is_multiline: - type: boolean - description: 'The flag to indicate if the environment variable is multiline.' - is_shown_once: - type: boolean - description: "The flag to indicate if the environment variable's value is shown on the UI." - type: object - responses: - '201': - description: 'Environment variable updated.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Environment variable updated.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/applications/{uuid}/envs/bulk': - patch: - tags: - - Applications - summary: 'Update Envs (Bulk)' - description: 'Update multiple envs by application UUID.' - operationId: update-envs-by-application-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the application.' - required: true - schema: - type: string - format: uuid - requestBody: - description: 'Bulk envs updated.' - required: true - content: - application/json: - schema: - required: - - data - properties: - data: - type: array - items: { properties: { key: { type: string, description: 'The key of the environment variable.' }, value: { type: string, description: 'The value of the environment variable.' }, is_preview: { type: boolean, description: 'The flag to indicate if the environment variable is used in preview deployments.' }, is_build_time: { type: boolean, description: 'The flag to indicate if the environment variable is used in build time.' }, is_literal: { type: boolean, description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' }, is_multiline: { type: boolean, description: 'The flag to indicate if the environment variable is multiline.' }, is_shown_once: { type: boolean, description: "The flag to indicate if the environment variable's value is shown on the UI." } }, type: object } - type: object - responses: - '201': - description: 'Environment variables updated.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Environment variables updated.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/applications/{uuid}/envs/{env_uuid}': - delete: - tags: - - Applications - summary: 'Delete Env' - description: 'Delete env by UUID.' - operationId: delete-env-by-application-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the application.' - required: true - schema: - type: string - format: uuid - - - name: env_uuid - in: path - description: 'UUID of the environment variable.' - required: true - schema: - type: string - format: uuid - responses: - '200': - description: 'Environment variable deleted.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Environment variable deleted.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/applications/{uuid}/start': - get: - tags: - - Applications - summary: Start - description: 'Start application. `Post` request is also accepted.' - operationId: start-application-by-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the application.' - required: true - schema: - type: string - format: uuid - - - name: force - in: query - description: 'Force rebuild.' - schema: - type: boolean - default: false - - - name: instant_deploy - in: query - description: 'Instant deploy (skip queuing).' - schema: - type: boolean - default: false - responses: - '200': - description: 'Start application.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Deployment request queued.', description: Message. } - deployment_uuid: { type: string, example: doogksw, description: 'UUID of the deployment.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/applications/{uuid}/stop': - get: - tags: - - Applications - summary: Stop - description: 'Stop application. `Post` request is also accepted.' - operationId: stop-application-by-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the application.' - required: true - schema: - type: string - format: uuid - responses: - '200': - description: 'Stop application.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Application stopping request queued.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/applications/{uuid}/restart': - get: - tags: - - Applications - summary: Restart - description: 'Restart application. `Post` request is also accepted.' - operationId: restart-application-by-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the application.' - required: true - schema: - type: string - format: uuid - responses: - '200': - description: 'Restart application.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Restart request queued.' } - deployment_uuid: { type: string, example: doogksw, description: 'UUID of the deployment.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/applications/{uuid}/execute': - post: - tags: - - Applications - summary: 'Execute Command' - description: "Execute a command on the application's current container." - operationId: execute-command-application - parameters: - - - name: uuid - in: path - description: 'UUID of the application.' - required: true - schema: - type: string - format: uuid - requestBody: - description: 'Command to execute.' - required: true - content: - application/json: - schema: - properties: - command: - type: string - description: 'Command to execute.' - type: object - responses: - '200': - description: "Execute a command on the application's current container." - content: - application/json: - schema: - properties: - message: { type: string, example: 'Command executed.' } - response: { type: string } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - /databases: - get: - tags: - - Databases - summary: List - description: 'List all databases.' - operationId: list-databases - responses: - '200': - description: 'Get all databases' - content: - application/json: - schema: - type: string - example: 'Content is very complex. Will be implemented later.' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - '/databases/{uuid}': - get: - tags: - - Databases - summary: Get - description: 'Get database by UUID.' - operationId: get-database-by-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the database.' - required: true - schema: - type: string - format: uuid - responses: - '200': - description: 'Get all databases' - content: - application/json: - schema: - type: string - example: 'Content is very complex. Will be implemented later.' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - delete: - tags: - - Databases - summary: Delete - description: 'Delete database by UUID.' - operationId: delete-database-by-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the database.' - required: true - schema: - type: string - format: uuid - - - name: delete_configurations - in: query - description: 'Delete configurations.' - required: false - schema: - type: boolean - default: true - - - name: delete_volumes - in: query - description: 'Delete volumes.' - required: false - schema: - type: boolean - default: true - - - name: docker_cleanup - in: query - description: 'Run docker cleanup.' - required: false - schema: - type: boolean - default: true - - - name: delete_connected_networks - in: query - description: 'Delete connected networks.' - required: false - schema: - type: boolean - default: true - responses: - '200': - description: 'Database deleted.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Database deleted.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - patch: - tags: - - Databases - summary: Update - description: 'Update database by UUID.' - operationId: update-database-by-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the database.' - required: true - schema: - type: string - format: uuid - requestBody: - description: 'Database data' - required: true - content: - application/json: - schema: - properties: - name: - type: string - description: 'Name of the database' - description: - type: string - description: 'Description of the database' - image: - type: string - description: 'Docker Image of the database' - is_public: - type: boolean - description: 'Is the database public?' - public_port: - type: integer - description: 'Public port of the database' - limits_memory: - type: string - description: 'Memory limit of the database' - limits_memory_swap: - type: string - description: 'Memory swap limit of the database' - limits_memory_swappiness: - type: integer - description: 'Memory swappiness of the database' - limits_memory_reservation: - type: string - description: 'Memory reservation of the database' - limits_cpus: - type: string - description: 'CPU limit of the database' - limits_cpuset: - type: string - description: 'CPU set of the database' - limits_cpu_shares: - type: integer - description: 'CPU shares of the database' - postgres_user: - type: string - description: 'PostgreSQL user' - postgres_password: - type: string - description: 'PostgreSQL password' - postgres_db: - type: string - description: 'PostgreSQL database' - postgres_initdb_args: - type: string - description: 'PostgreSQL initdb args' - postgres_host_auth_method: - type: string - description: 'PostgreSQL host auth method' - postgres_conf: - type: string - description: 'PostgreSQL conf' - clickhouse_admin_user: - type: string - description: 'Clickhouse admin user' - clickhouse_admin_password: - type: string - description: 'Clickhouse admin password' - dragonfly_password: - type: string - description: 'DragonFly password' - redis_password: - type: string - description: 'Redis password' - redis_conf: - type: string - description: 'Redis conf' - keydb_password: - type: string - description: 'KeyDB password' - keydb_conf: - type: string - description: 'KeyDB conf' - mariadb_conf: - type: string - description: 'MariaDB conf' - mariadb_root_password: - type: string - description: 'MariaDB root password' - mariadb_user: - type: string - description: 'MariaDB user' - mariadb_password: - type: string - description: 'MariaDB password' - mariadb_database: - type: string - description: 'MariaDB database' - mongo_conf: - type: string - description: 'Mongo conf' - mongo_initdb_root_username: - type: string - description: 'Mongo initdb root username' - mongo_initdb_root_password: - type: string - description: 'Mongo initdb root password' - mongo_initdb_database: - type: string - description: 'Mongo initdb init database' - mysql_root_password: - type: string - description: 'MySQL root password' - mysql_password: - type: string - description: 'MySQL password' - mysql_user: - type: string - description: 'MySQL user' - mysql_database: - type: string - description: 'MySQL database' - mysql_conf: - type: string - description: 'MySQL conf' - type: object - responses: - '200': - description: 'Database updated' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - /databases/postgresql: - post: - tags: - - Databases - summary: 'Create (PostgreSQL)' - description: 'Create a new PostgreSQL database.' - operationId: create-database-postgresql - requestBody: - description: 'Database data' - required: true - content: - application/json: - schema: - required: - - server_uuid - - project_uuid - - environment_name - - environment_uuid - properties: - server_uuid: - type: string - description: 'UUID of the server' - project_uuid: - type: string - description: 'UUID of the project' - environment_name: - type: string - description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.' - environment_uuid: - type: string - description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.' - postgres_user: - type: string - description: 'PostgreSQL user' - postgres_password: - type: string - description: 'PostgreSQL password' - postgres_db: - type: string - description: 'PostgreSQL database' - postgres_initdb_args: - type: string - description: 'PostgreSQL initdb args' - postgres_host_auth_method: - type: string - description: 'PostgreSQL host auth method' - postgres_conf: - type: string - description: 'PostgreSQL conf' - destination_uuid: - type: string - description: 'UUID of the destination if the server has multiple destinations' - name: - type: string - description: 'Name of the database' - description: - type: string - description: 'Description of the database' - image: - type: string - description: 'Docker Image of the database' - is_public: - type: boolean - description: 'Is the database public?' - public_port: - type: integer - description: 'Public port of the database' - limits_memory: - type: string - description: 'Memory limit of the database' - limits_memory_swap: - type: string - description: 'Memory swap limit of the database' - limits_memory_swappiness: - type: integer - description: 'Memory swappiness of the database' - limits_memory_reservation: - type: string - description: 'Memory reservation of the database' - limits_cpus: - type: string - description: 'CPU limit of the database' - limits_cpuset: - type: string - description: 'CPU set of the database' - limits_cpu_shares: - type: integer - description: 'CPU shares of the database' - instant_deploy: - type: boolean - description: 'Instant deploy the database' - type: object - responses: - '200': - description: 'Database updated' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /databases/clickhouse: - post: - tags: - - Databases - summary: 'Create (Clickhouse)' - description: 'Create a new Clickhouse database.' - operationId: create-database-clickhouse - requestBody: - description: 'Database data' - required: true - content: - application/json: - schema: - required: - - server_uuid - - project_uuid - - environment_name - - environment_uuid - properties: - server_uuid: - type: string - description: 'UUID of the server' - project_uuid: - type: string - description: 'UUID of the project' - environment_name: - type: string - description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.' - environment_uuid: - type: string - description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.' - destination_uuid: - type: string - description: 'UUID of the destination if the server has multiple destinations' - clickhouse_admin_user: - type: string - description: 'Clickhouse admin user' - clickhouse_admin_password: - type: string - description: 'Clickhouse admin password' - name: - type: string - description: 'Name of the database' - description: - type: string - description: 'Description of the database' - image: - type: string - description: 'Docker Image of the database' - is_public: - type: boolean - description: 'Is the database public?' - public_port: - type: integer - description: 'Public port of the database' - limits_memory: - type: string - description: 'Memory limit of the database' - limits_memory_swap: - type: string - description: 'Memory swap limit of the database' - limits_memory_swappiness: - type: integer - description: 'Memory swappiness of the database' - limits_memory_reservation: - type: string - description: 'Memory reservation of the database' - limits_cpus: - type: string - description: 'CPU limit of the database' - limits_cpuset: - type: string - description: 'CPU set of the database' - limits_cpu_shares: - type: integer - description: 'CPU shares of the database' - instant_deploy: - type: boolean - description: 'Instant deploy the database' - type: object - responses: - '200': - description: 'Database updated' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /databases/dragonfly: - post: - tags: - - Databases - summary: 'Create (DragonFly)' - description: 'Create a new DragonFly database.' - operationId: create-database-dragonfly - requestBody: - description: 'Database data' - required: true - content: - application/json: - schema: - required: - - server_uuid - - project_uuid - - environment_name - - environment_uuid - properties: - server_uuid: - type: string - description: 'UUID of the server' - project_uuid: - type: string - description: 'UUID of the project' - environment_name: - type: string - description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.' - environment_uuid: - type: string - description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.' - destination_uuid: - type: string - description: 'UUID of the destination if the server has multiple destinations' - dragonfly_password: - type: string - description: 'DragonFly password' - name: - type: string - description: 'Name of the database' - description: - type: string - description: 'Description of the database' - image: - type: string - description: 'Docker Image of the database' - is_public: - type: boolean - description: 'Is the database public?' - public_port: - type: integer - description: 'Public port of the database' - limits_memory: - type: string - description: 'Memory limit of the database' - limits_memory_swap: - type: string - description: 'Memory swap limit of the database' - limits_memory_swappiness: - type: integer - description: 'Memory swappiness of the database' - limits_memory_reservation: - type: string - description: 'Memory reservation of the database' - limits_cpus: - type: string - description: 'CPU limit of the database' - limits_cpuset: - type: string - description: 'CPU set of the database' - limits_cpu_shares: - type: integer - description: 'CPU shares of the database' - instant_deploy: - type: boolean - description: 'Instant deploy the database' - type: object - responses: - '200': - description: 'Database updated' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /databases/redis: - post: - tags: - - Databases - summary: 'Create (Redis)' - description: 'Create a new Redis database.' - operationId: create-database-redis - requestBody: - description: 'Database data' - required: true - content: - application/json: - schema: - required: - - server_uuid - - project_uuid - - environment_name - - environment_uuid - properties: - server_uuid: - type: string - description: 'UUID of the server' - project_uuid: - type: string - description: 'UUID of the project' - environment_name: - type: string - description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.' - environment_uuid: - type: string - description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.' - destination_uuid: - type: string - description: 'UUID of the destination if the server has multiple destinations' - redis_password: - type: string - description: 'Redis password' - redis_conf: - type: string - description: 'Redis conf' - name: - type: string - description: 'Name of the database' - description: - type: string - description: 'Description of the database' - image: - type: string - description: 'Docker Image of the database' - is_public: - type: boolean - description: 'Is the database public?' - public_port: - type: integer - description: 'Public port of the database' - limits_memory: - type: string - description: 'Memory limit of the database' - limits_memory_swap: - type: string - description: 'Memory swap limit of the database' - limits_memory_swappiness: - type: integer - description: 'Memory swappiness of the database' - limits_memory_reservation: - type: string - description: 'Memory reservation of the database' - limits_cpus: - type: string - description: 'CPU limit of the database' - limits_cpuset: - type: string - description: 'CPU set of the database' - limits_cpu_shares: - type: integer - description: 'CPU shares of the database' - instant_deploy: - type: boolean - description: 'Instant deploy the database' - type: object - responses: - '200': - description: 'Database updated' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /databases/keydb: - post: - tags: - - Databases - summary: 'Create (KeyDB)' - description: 'Create a new KeyDB database.' - operationId: create-database-keydb - requestBody: - description: 'Database data' - required: true - content: - application/json: - schema: - required: - - server_uuid - - project_uuid - - environment_name - - environment_uuid - properties: - server_uuid: - type: string - description: 'UUID of the server' - project_uuid: - type: string - description: 'UUID of the project' - environment_name: - type: string - description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.' - environment_uuid: - type: string - description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.' - destination_uuid: - type: string - description: 'UUID of the destination if the server has multiple destinations' - keydb_password: - type: string - description: 'KeyDB password' - keydb_conf: - type: string - description: 'KeyDB conf' - name: - type: string - description: 'Name of the database' - description: - type: string - description: 'Description of the database' - image: - type: string - description: 'Docker Image of the database' - is_public: - type: boolean - description: 'Is the database public?' - public_port: - type: integer - description: 'Public port of the database' - limits_memory: - type: string - description: 'Memory limit of the database' - limits_memory_swap: - type: string - description: 'Memory swap limit of the database' - limits_memory_swappiness: - type: integer - description: 'Memory swappiness of the database' - limits_memory_reservation: - type: string - description: 'Memory reservation of the database' - limits_cpus: - type: string - description: 'CPU limit of the database' - limits_cpuset: - type: string - description: 'CPU set of the database' - limits_cpu_shares: - type: integer - description: 'CPU shares of the database' - instant_deploy: - type: boolean - description: 'Instant deploy the database' - type: object - responses: - '200': - description: 'Database updated' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /databases/mariadb: - post: - tags: - - Databases - summary: 'Create (MariaDB)' - description: 'Create a new MariaDB database.' - operationId: create-database-mariadb - requestBody: - description: 'Database data' - required: true - content: - application/json: - schema: - required: - - server_uuid - - project_uuid - - environment_name - - environment_uuid - properties: - server_uuid: - type: string - description: 'UUID of the server' - project_uuid: - type: string - description: 'UUID of the project' - environment_name: - type: string - description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.' - environment_uuid: - type: string - description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.' - destination_uuid: - type: string - description: 'UUID of the destination if the server has multiple destinations' - mariadb_conf: - type: string - description: 'MariaDB conf' - mariadb_root_password: - type: string - description: 'MariaDB root password' - mariadb_user: - type: string - description: 'MariaDB user' - mariadb_password: - type: string - description: 'MariaDB password' - mariadb_database: - type: string - description: 'MariaDB database' - name: - type: string - description: 'Name of the database' - description: - type: string - description: 'Description of the database' - image: - type: string - description: 'Docker Image of the database' - is_public: - type: boolean - description: 'Is the database public?' - public_port: - type: integer - description: 'Public port of the database' - limits_memory: - type: string - description: 'Memory limit of the database' - limits_memory_swap: - type: string - description: 'Memory swap limit of the database' - limits_memory_swappiness: - type: integer - description: 'Memory swappiness of the database' - limits_memory_reservation: - type: string - description: 'Memory reservation of the database' - limits_cpus: - type: string - description: 'CPU limit of the database' - limits_cpuset: - type: string - description: 'CPU set of the database' - limits_cpu_shares: - type: integer - description: 'CPU shares of the database' - instant_deploy: - type: boolean - description: 'Instant deploy the database' - type: object - responses: - '200': - description: 'Database updated' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /databases/mysql: - post: - tags: - - Databases - summary: 'Create (MySQL)' - description: 'Create a new MySQL database.' - operationId: create-database-mysql - requestBody: - description: 'Database data' - required: true - content: - application/json: - schema: - required: - - server_uuid - - project_uuid - - environment_name - - environment_uuid - properties: - server_uuid: - type: string - description: 'UUID of the server' - project_uuid: - type: string - description: 'UUID of the project' - environment_name: - type: string - description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.' - environment_uuid: - type: string - description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.' - destination_uuid: - type: string - description: 'UUID of the destination if the server has multiple destinations' - mysql_root_password: - type: string - description: 'MySQL root password' - mysql_password: - type: string - description: 'MySQL password' - mysql_user: - type: string - description: 'MySQL user' - mysql_database: - type: string - description: 'MySQL database' - mysql_conf: - type: string - description: 'MySQL conf' - name: - type: string - description: 'Name of the database' - description: - type: string - description: 'Description of the database' - image: - type: string - description: 'Docker Image of the database' - is_public: - type: boolean - description: 'Is the database public?' - public_port: - type: integer - description: 'Public port of the database' - limits_memory: - type: string - description: 'Memory limit of the database' - limits_memory_swap: - type: string - description: 'Memory swap limit of the database' - limits_memory_swappiness: - type: integer - description: 'Memory swappiness of the database' - limits_memory_reservation: - type: string - description: 'Memory reservation of the database' - limits_cpus: - type: string - description: 'CPU limit of the database' - limits_cpuset: - type: string - description: 'CPU set of the database' - limits_cpu_shares: - type: integer - description: 'CPU shares of the database' - instant_deploy: - type: boolean - description: 'Instant deploy the database' - type: object - responses: - '200': - description: 'Database updated' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /databases/mongodb: - post: - tags: - - Databases - summary: 'Create (MongoDB)' - description: 'Create a new MongoDB database.' - operationId: create-database-mongodb - requestBody: - description: 'Database data' - required: true - content: - application/json: - schema: - required: - - server_uuid - - project_uuid - - environment_name - - environment_uuid - properties: - server_uuid: - type: string - description: 'UUID of the server' - project_uuid: - type: string - description: 'UUID of the project' - environment_name: - type: string - description: 'Name of the environment. You need to provide at least one of environment_name or environment_uuid.' - environment_uuid: - type: string - description: 'UUID of the environment. You need to provide at least one of environment_name or environment_uuid.' - destination_uuid: - type: string - description: 'UUID of the destination if the server has multiple destinations' - mongo_conf: - type: string - description: 'MongoDB conf' - mongo_initdb_root_username: - type: string - description: 'MongoDB initdb root username' - name: - type: string - description: 'Name of the database' - description: - type: string - description: 'Description of the database' - image: - type: string - description: 'Docker Image of the database' - is_public: - type: boolean - description: 'Is the database public?' - public_port: - type: integer - description: 'Public port of the database' - limits_memory: - type: string - description: 'Memory limit of the database' - limits_memory_swap: - type: string - description: 'Memory swap limit of the database' - limits_memory_swappiness: - type: integer - description: 'Memory swappiness of the database' - limits_memory_reservation: - type: string - description: 'Memory reservation of the database' - limits_cpus: - type: string - description: 'CPU limit of the database' - limits_cpuset: - type: string - description: 'CPU set of the database' - limits_cpu_shares: - type: integer - description: 'CPU shares of the database' - instant_deploy: - type: boolean - description: 'Instant deploy the database' - type: object - responses: - '200': - description: 'Database updated' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - '/databases/{uuid}/start': - get: - tags: - - Databases - summary: Start - description: 'Start database. `Post` request is also accepted.' - operationId: start-database-by-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the database.' - required: true - schema: - type: string - format: uuid - responses: - '200': - description: 'Start database.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Database starting request queued.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/databases/{uuid}/stop': - get: - tags: - - Databases - summary: Stop - description: 'Stop database. `Post` request is also accepted.' - operationId: stop-database-by-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the database.' - required: true - schema: - type: string - format: uuid - responses: - '200': - description: 'Stop database.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Database stopping request queued.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/databases/{uuid}/restart': - get: - tags: - - Databases - summary: Restart - description: 'Restart database. `Post` request is also accepted.' - operationId: restart-database-by-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the database.' - required: true - schema: - type: string - format: uuid - responses: - '200': - description: 'Restart database.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Database restaring request queued.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - /deployments: - get: - tags: - - Deployments - summary: List - description: 'List currently running deployments' - operationId: list-deployments - responses: - '200': - description: 'Get all currently running deployments.' - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/ApplicationDeploymentQueue' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - '/deployments/{uuid}': - get: - tags: - - Deployments - summary: Get - description: 'Get deployment by UUID.' - operationId: get-deployment-by-uuid - parameters: - - - name: uuid - in: path - description: 'Deployment UUID' - required: true - schema: - type: string - responses: - '200': - description: 'Get deployment by UUID.' - content: - application/json: - schema: - $ref: '#/components/schemas/ApplicationDeploymentQueue' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - /deploy: - get: - tags: - - Deployments - summary: Deploy - description: 'Deploy by tag or uuid. `Post` request also accepted.' - operationId: deploy-by-tag-or-uuid - parameters: - - - name: tag - in: query - description: 'Tag name(s). Comma separated list is also accepted.' - schema: - type: string - - - name: uuid - in: query - description: 'Resource UUID(s). Comma separated list is also accepted.' - schema: - type: string - - - name: force - in: query - description: 'Force rebuild (without cache)' - schema: - type: boolean - responses: - '200': - description: "Get deployment(s) UUID's" - content: - application/json: - schema: - properties: - deployments: { type: array, items: { properties: { message: { type: string }, resource_uuid: { type: string }, deployment_uuid: { type: string } }, type: object } } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /version: - get: - summary: Version - description: 'Get Coolify version.' - operationId: version - responses: - '200': - description: 'Returns the version of the application' - content: - application/json: - schema: - type: string - example: v4.0.0 - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /enable: - get: - summary: 'Enable API' - description: 'Enable API (only with root permissions).' - operationId: enable-api - responses: - '200': - description: 'Enable API.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'API enabled.' } - type: object - '403': - description: 'You are not allowed to enable the API.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'You are not allowed to enable the API.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /disable: - get: - summary: 'Disable API' - description: 'Disable API (only with root permissions).' - operationId: disable-api - responses: - '200': - description: 'Disable API.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'API disabled.' } - type: object - '403': - description: 'You are not allowed to disable the API.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'You are not allowed to disable the API.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /health: - get: - summary: Healthcheck - description: 'Healthcheck endpoint.' - operationId: healthcheck - responses: - '200': - description: 'Healthcheck endpoint.' - content: - application/json: - schema: - type: string - example: OK - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - /projects: - get: - tags: - - Projects - summary: List - description: 'List projects.' - operationId: list-projects - responses: - '200': - description: 'Get all projects.' - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/Project' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - post: - tags: - - Projects - summary: Create - description: 'Create Project.' - operationId: create-project - requestBody: - description: 'Project created.' - required: true - content: - application/json: - schema: - properties: - name: - type: string - description: 'The name of the project.' - description: - type: string - description: 'The description of the project.' - type: object - responses: - '201': - description: 'Project created.' - content: - application/json: - schema: - properties: - uuid: { type: string, example: og888os, description: 'The UUID of the project.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/projects/{uuid}': - get: - tags: - - Projects - summary: Get - description: 'Get project by UUID.' - operationId: get-project-by-uuid - parameters: - - - name: uuid - in: path - description: 'Project UUID' - required: true - schema: - type: string - responses: - '200': - description: 'Project details' - content: - application/json: - schema: - $ref: '#/components/schemas/Project' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - description: 'Project not found.' - security: - - - bearerAuth: [] - delete: - tags: - - Projects - summary: Delete - description: 'Delete project by UUID.' - operationId: delete-project-by-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the application.' - required: true - schema: - type: string - format: uuid - responses: - '200': - description: 'Project deleted.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Project deleted.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - patch: - tags: - - Projects - summary: Update - description: 'Update Project.' - operationId: update-project-by-uuid - requestBody: - description: 'Project updated.' - required: true - content: - application/json: - schema: - properties: - name: - type: string - description: 'The name of the project.' - description: - type: string - description: 'The description of the project.' - type: object - responses: - '201': - description: 'Project updated.' - content: - application/json: - schema: - properties: - uuid: { type: string, example: og888os } - name: { type: string, example: 'Project Name' } - description: { type: string, example: 'Project Description' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/projects/{uuid}/{environment_name_or_uuid}': - get: - tags: - - Projects - summary: Environment - description: 'Get environment by name or UUID.' - operationId: get-environment-by-name-or-uuid - parameters: - - - name: uuid - in: path - description: 'Project UUID' - required: true - schema: - type: string - - - name: environment_name_or_uuid - in: path - description: 'Environment name or UUID' - required: true - schema: - type: string - responses: - '200': - description: 'Environment details' - content: - application/json: - schema: - $ref: '#/components/schemas/Environment' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - /resources: - get: - tags: - - Resources - summary: List - description: 'Get all resources.' - operationId: list-resources - responses: - '200': - description: 'Get all resources' - content: - application/json: - schema: - type: string - example: 'Content is very complex. Will be implemented later.' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /security/keys: - get: - tags: - - 'Private Keys' - summary: List - description: 'List all private keys.' - operationId: list-private-keys - responses: - '200': - description: 'Get all private keys.' - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/PrivateKey' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - post: - tags: - - 'Private Keys' - summary: Create - description: 'Create a new private key.' - operationId: create-private-key - requestBody: - required: true - content: - application/json: - schema: - required: - - private_key - properties: - name: - type: string - description: - type: string - private_key: - type: string - type: object - additionalProperties: false - responses: - '201': - description: "The created private key's UUID." - content: - application/json: - schema: - properties: - uuid: { type: string } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - patch: - tags: - - 'Private Keys' - summary: Update - description: 'Update a private key.' - operationId: update-private-key - requestBody: - required: true - content: - application/json: - schema: - required: - - private_key - properties: - name: - type: string - description: - type: string - private_key: - type: string - type: object - additionalProperties: false - responses: - '201': - description: "The updated private key's UUID." - content: - application/json: - schema: - properties: - uuid: { type: string } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - '/security/keys/{uuid}': - get: - tags: - - 'Private Keys' - summary: Get - description: 'Get key by UUID.' - operationId: get-private-key-by-uuid - parameters: - - - name: uuid - in: path - description: 'Private Key UUID' - required: true - schema: - type: string - responses: - '200': - description: 'Get all private keys.' - content: - application/json: - schema: - $ref: '#/components/schemas/PrivateKey' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - description: 'Private Key not found.' - security: - - - bearerAuth: [] - delete: - tags: - - 'Private Keys' - summary: Delete - description: 'Delete a private key.' - operationId: delete-private-key-by-uuid - parameters: - - - name: uuid - in: path - description: 'Private Key UUID' - required: true - schema: - type: string - responses: - '200': - description: 'Private Key deleted.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Private Key deleted.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - description: 'Private Key not found.' - security: - - - bearerAuth: [] - /servers: - get: - tags: - - Servers - summary: List - description: 'List all servers.' - operationId: list-servers - responses: - '200': - description: 'Get all servers.' - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/Server' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - post: - tags: - - Servers - summary: Create - description: 'Create Server.' - operationId: create-server - requestBody: - description: 'Server created.' - required: true - content: - application/json: - schema: - properties: - name: - type: string - example: 'My Server' - description: 'The name of the server.' - description: - type: string - example: 'My Server Description' - description: 'The description of the server.' - ip: - type: string - example: 127.0.0.1 - description: 'The IP of the server.' - port: - type: integer - example: 22 - description: 'The port of the server.' - user: - type: string - example: root - description: 'The user of the server.' - private_key_uuid: - type: string - example: og888os - description: 'The UUID of the private key.' - is_build_server: - type: boolean - example: false - description: 'Is build server.' - instant_validate: - type: boolean - example: false - description: 'Instant validate.' - proxy_type: - type: string - enum: [traefik, caddy, none] - example: traefik - description: 'The proxy type.' - type: object - responses: - '201': - description: 'Server created.' - content: - application/json: - schema: - properties: - uuid: { type: string, example: og888os, description: 'The UUID of the server.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/servers/{uuid}': - get: - tags: - - Servers - summary: Get - description: 'Get server by UUID.' - operationId: get-server-by-uuid - parameters: - - - name: uuid - in: path - description: "Server's UUID" - required: true - schema: - type: string - responses: - '200': - description: 'Get server by UUID' - content: - application/json: - schema: - $ref: '#/components/schemas/Server' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - delete: - tags: - - Servers - summary: Delete - description: 'Delete server by UUID.' - operationId: delete-server-by-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the server.' - required: true - schema: - type: string - format: uuid - responses: - '200': - description: 'Server deleted.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Server deleted.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - patch: - tags: - - Servers - summary: Update - description: 'Update Server.' - operationId: update-server-by-uuid - parameters: - - - name: uuid - in: path - description: 'Server UUID' - required: true - schema: - type: string - requestBody: - description: 'Server updated.' - required: true - content: - application/json: - schema: - properties: - name: - type: string - description: 'The name of the server.' - description: - type: string - description: 'The description of the server.' - ip: - type: string - description: 'The IP of the server.' - port: - type: integer - description: 'The port of the server.' - user: - type: string - description: 'The user of the server.' - private_key_uuid: - type: string - description: 'The UUID of the private key.' - is_build_server: - type: boolean - description: 'Is build server.' - instant_validate: - type: boolean - description: 'Instant validate.' - proxy_type: - type: string - enum: [traefik, caddy, none] - description: 'The proxy type.' - type: object - responses: - '201': - description: 'Server updated.' - content: - application/json: - schema: - $ref: '#/components/schemas/Server' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/servers/{uuid}/resources': - get: - tags: - - Servers - summary: Resources - description: 'Get resources by server.' - operationId: get-resources-by-server-uuid - parameters: - - - name: uuid - in: path - description: "Server's UUID" - required: true - schema: - type: string - responses: - '200': - description: 'Get resources by server' - content: - application/json: - schema: - type: array - items: - properties: { id: { type: integer }, uuid: { type: string }, name: { type: string }, type: { type: string }, created_at: { type: string }, updated_at: { type: string }, status: { type: string } } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - '/servers/{uuid}/domains': - get: - tags: - - Servers - summary: Domains - description: 'Get domains by server.' - operationId: get-domains-by-server-uuid - parameters: - - - name: uuid - in: path - description: "Server's UUID" - required: true - schema: - type: string - responses: - '200': - description: 'Get domains by server' - content: - application/json: - schema: - type: array - items: - properties: { ip: { type: string }, domains: { type: array, items: { type: string } } } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - '/servers/{uuid}/validate': - get: - tags: - - Servers - summary: Validate - description: 'Validate server by UUID.' - operationId: validate-server-by-uuid - parameters: - - - name: uuid - in: path - description: 'Server UUID' - required: true - schema: - type: string - responses: - '201': - description: 'Server validation started.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Validation started.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - /services: - get: - tags: - - Services - summary: List - description: 'List all services.' - operationId: list-services - responses: - '200': - description: 'Get all services' - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/Service' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - post: - tags: - - Services - summary: Create - description: 'Create a one-click service' - operationId: create-service - requestBody: - required: true - content: - application/json: - schema: - required: - - server_uuid - - project_uuid - - environment_name - - environment_uuid - - type - properties: - type: - description: 'The one-click service type' - type: string - enum: [activepieces, appsmith, appwrite, authentik, babybuddy, budge, changedetection, chatwoot, classicpress-with-mariadb, classicpress-with-mysql, classicpress-without-database, cloudflared, code-server, dashboard, directus, directus-with-postgresql, docker-registry, docuseal, docuseal-with-postgres, dokuwiki, duplicati, emby, embystat, fider, filebrowser, firefly, formbricks, ghost, gitea, gitea-with-mariadb, gitea-with-mysql, gitea-with-postgresql, glance, glances, glitchtip, grafana, grafana-with-postgresql, grocy, heimdall, homepage, jellyfin, kuzzle, listmonk, logto, mediawiki, meilisearch, metabase, metube, minio, moodle, n8n, n8n-with-postgresql, next-image-transformation, nextcloud, nocodb, odoo, openblocks, pairdrop, penpot, phpmyadmin, pocketbase, posthog, reactive-resume, rocketchat, shlink, slash, snapdrop, statusnook, stirling-pdf, supabase, syncthing, tolgee, trigger, trigger-with-external-database, twenty, umami, unleash-with-postgresql, unleash-without-database, uptime-kuma, vaultwarden, vikunja, weblate, whoogle, wordpress-with-mariadb, wordpress-with-mysql, wordpress-without-database] - name: - type: string - maxLength: 255 - description: 'Name of the service.' - description: - type: string - nullable: true - description: 'Description of the service.' - project_uuid: - type: string - description: 'Project UUID.' - environment_name: - type: string - description: 'Environment name. You need to provide at least one of environment_name or environment_uuid.' - environment_uuid: - type: string - description: 'Environment UUID. You need to provide at least one of environment_name or environment_uuid.' - server_uuid: - type: string - description: 'Server UUID.' - destination_uuid: - type: string - description: 'Destination UUID. Required if server has multiple destinations.' - instant_deploy: - type: boolean - default: false - description: 'Start the service immediately after creation.' - type: object - responses: - '201': - description: 'Create a service.' - content: - application/json: - schema: - properties: - uuid: { type: string, description: 'Service UUID.' } - domains: { type: array, items: { type: string }, description: 'Service domains.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - '/services/{uuid}': - get: - tags: - - Services - summary: Get - description: 'Get service by UUID.' - operationId: get-service-by-uuid - parameters: - - - name: uuid - in: path - description: 'Service UUID' - required: true - schema: - type: string - responses: - '200': - description: 'Get a service by UUID.' - content: - application/json: - schema: - $ref: '#/components/schemas/Service' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - delete: - tags: - - Services - summary: Delete - description: 'Delete service by UUID.' - operationId: delete-service-by-uuid - parameters: - - - name: uuid - in: path - description: 'Service UUID' - required: true - schema: - type: string - - - name: delete_configurations - in: query - description: 'Delete configurations.' - required: false - schema: - type: boolean - default: true - - - name: delete_volumes - in: query - description: 'Delete volumes.' - required: false - schema: - type: boolean - default: true - - - name: docker_cleanup - in: query - description: 'Run docker cleanup.' - required: false - schema: - type: boolean - default: true - - - name: delete_connected_networks - in: query - description: 'Delete connected networks.' - required: false - schema: - type: boolean - default: true - responses: - '200': - description: 'Delete a service by UUID' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Service deletion request queued.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/services/{uuid}/envs': - get: - tags: - - Services - summary: 'List Envs' - description: 'List all envs by service UUID.' - operationId: list-envs-by-service-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the service.' - required: true - schema: - type: string - format: uuid - responses: - '200': - description: 'All environment variables by service UUID.' - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/EnvironmentVariable' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - post: - tags: - - Services - summary: 'Create Env' - description: 'Create env by service UUID.' - operationId: create-env-by-service-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the service.' - required: true - schema: - type: string - format: uuid - requestBody: - description: 'Env created.' - required: true - content: - application/json: - schema: - properties: - key: - type: string - description: 'The key of the environment variable.' - value: - type: string - description: 'The value of the environment variable.' - is_preview: - type: boolean - description: 'The flag to indicate if the environment variable is used in preview deployments.' - is_build_time: - type: boolean - description: 'The flag to indicate if the environment variable is used in build time.' - is_literal: - type: boolean - description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' - is_multiline: - type: boolean - description: 'The flag to indicate if the environment variable is multiline.' - is_shown_once: - type: boolean - description: "The flag to indicate if the environment variable's value is shown on the UI." - type: object - responses: - '201': - description: 'Environment variable created.' - content: - application/json: - schema: - properties: - uuid: { type: string, example: nc0k04gk8g0cgsk440g0koko } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - patch: - tags: - - Services - summary: 'Update Env' - description: 'Update env by service UUID.' - operationId: update-env-by-service-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the service.' - required: true - schema: - type: string - format: uuid - requestBody: - description: 'Env updated.' - required: true - content: - application/json: - schema: - required: - - key - - value - properties: - key: - type: string - description: 'The key of the environment variable.' - value: - type: string - description: 'The value of the environment variable.' - is_preview: - type: boolean - description: 'The flag to indicate if the environment variable is used in preview deployments.' - is_build_time: - type: boolean - description: 'The flag to indicate if the environment variable is used in build time.' - is_literal: - type: boolean - description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' - is_multiline: - type: boolean - description: 'The flag to indicate if the environment variable is multiline.' - is_shown_once: - type: boolean - description: "The flag to indicate if the environment variable's value is shown on the UI." - type: object - responses: - '201': - description: 'Environment variable updated.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Environment variable updated.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/services/{uuid}/envs/bulk': - patch: - tags: - - Services - summary: 'Update Envs (Bulk)' - description: 'Update multiple envs by service UUID.' - operationId: update-envs-by-service-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the service.' - required: true - schema: - type: string - format: uuid - requestBody: - description: 'Bulk envs updated.' - required: true - content: - application/json: - schema: - required: - - data - properties: - data: - type: array - items: { properties: { key: { type: string, description: 'The key of the environment variable.' }, value: { type: string, description: 'The value of the environment variable.' }, is_preview: { type: boolean, description: 'The flag to indicate if the environment variable is used in preview deployments.' }, is_build_time: { type: boolean, description: 'The flag to indicate if the environment variable is used in build time.' }, is_literal: { type: boolean, description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' }, is_multiline: { type: boolean, description: 'The flag to indicate if the environment variable is multiline.' }, is_shown_once: { type: boolean, description: "The flag to indicate if the environment variable's value is shown on the UI." } }, type: object } - type: object - responses: - '201': - description: 'Environment variables updated.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Environment variables updated.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/services/{uuid}/envs/{env_uuid}': - delete: - tags: - - Services - summary: 'Delete Env' - description: 'Delete env by UUID.' - operationId: delete-env-by-service-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the service.' - required: true - schema: - type: string - format: uuid - - - name: env_uuid - in: path - description: 'UUID of the environment variable.' - required: true - schema: - type: string - format: uuid - responses: - '200': - description: 'Environment variable deleted.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Environment variable deleted.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/services/{uuid}/start': - get: - tags: - - Services - summary: Start - description: 'Start service. `Post` request is also accepted.' - operationId: start-service-by-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the service.' - required: true - schema: - type: string - format: uuid - responses: - '200': - description: 'Start service.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Service starting request queued.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/services/{uuid}/stop': - get: - tags: - - Services - summary: Stop - description: 'Stop service. `Post` request is also accepted.' - operationId: stop-service-by-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the service.' - required: true - schema: - type: string - format: uuid - responses: - '200': - description: 'Stop service.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Service stopping request queued.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/services/{uuid}/restart': - get: - tags: - - Services - summary: Restart - description: 'Restart service. `Post` request is also accepted.' - operationId: restart-service-by-uuid - parameters: - - - name: uuid - in: path - description: 'UUID of the service.' - required: true - schema: - type: string - format: uuid - responses: - '200': - description: 'Restart service.' - content: - application/json: - schema: - properties: - message: { type: string, example: 'Service restaring request queued.' } - type: object - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - /teams: - get: - tags: - - Teams - summary: List - description: 'Get all teams.' - operationId: list-teams - responses: - '200': - description: 'List of teams.' - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/Team' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - '/teams/{id}': - get: - tags: - - Teams - summary: Get - description: 'Get team by TeamId.' - operationId: get-team-by-id - parameters: - - - name: id - in: path - description: 'Team ID' - required: true - schema: - type: integer - responses: - '200': - description: 'List of teams.' - content: - application/json: - schema: - $ref: '#/components/schemas/Team' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - '/teams/{id}/members': - get: - tags: - - Teams - summary: Members - description: 'Get members by TeamId.' - operationId: get-members-by-team-id - parameters: - - - name: id - in: path - description: 'Team ID' - required: true - schema: - type: integer - responses: - '200': - description: 'List of members.' - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/User' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - '404': - $ref: '#/components/responses/404' - security: - - - bearerAuth: [] - /teams/current: - get: - tags: - - Teams - summary: 'Authenticated Team' - description: 'Get currently authenticated team.' - operationId: get-current-team - responses: - '200': - description: 'Current Team.' - content: - application/json: - schema: - $ref: '#/components/schemas/Team' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] - /teams/current/members: - get: - tags: - - Teams - summary: 'Authenticated Team Members' - description: 'Get currently authenticated team members.' - operationId: get-current-team-members - responses: - '200': - description: 'Currently authenticated team members.' - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/User' - '401': - $ref: '#/components/responses/401' - '400': - $ref: '#/components/responses/400' - security: - - - bearerAuth: [] -components: - schemas: - Application: - description: 'Application model' - properties: - id: - type: integer - description: 'The application identifier in the database.' - description: - type: string - nullable: true - description: 'The application description.' - repository_project_id: - type: integer - nullable: true - description: 'The repository project identifier.' - uuid: - type: string - description: 'The application UUID.' - name: - type: string - description: 'The application name.' - fqdn: - type: string - nullable: true - description: 'The application domains.' - config_hash: - type: string - description: 'Configuration hash.' - git_repository: - type: string - description: 'Git repository URL.' - git_branch: - type: string - description: 'Git branch.' - git_commit_sha: - type: string - description: 'Git commit SHA.' - git_full_url: - type: string - nullable: true - description: 'Git full URL.' - docker_registry_image_name: - type: string - nullable: true - description: 'Docker registry image name.' - docker_registry_image_tag: - type: string - nullable: true - description: 'Docker registry image tag.' - build_pack: - type: string - description: 'Build pack.' - enum: - - nixpacks - - static - - dockerfile - - dockercompose - static_image: - type: string - description: 'Static image used when static site is deployed.' - install_command: - type: string - description: 'Install command.' - build_command: - type: string - description: 'Build command.' - start_command: - type: string - description: 'Start command.' - ports_exposes: - type: string - description: 'Ports exposes.' - ports_mappings: - type: string - nullable: true - description: 'Ports mappings.' - base_directory: - type: string - description: 'Base directory for all commands.' - publish_directory: - type: string - description: 'Publish directory.' - health_check_enabled: - type: boolean - description: 'Health check enabled.' - health_check_path: - type: string - description: 'Health check path.' - health_check_port: - type: string - nullable: true - description: 'Health check port.' - health_check_host: - type: string - nullable: true - description: 'Health check host.' - health_check_method: - type: string - description: 'Health check method.' - health_check_return_code: - type: integer - description: 'Health check return code.' - health_check_scheme: - type: string - description: 'Health check scheme.' - health_check_response_text: - type: string - nullable: true - description: 'Health check response text.' - health_check_interval: - type: integer - description: 'Health check interval in seconds.' - health_check_timeout: - type: integer - description: 'Health check timeout in seconds.' - health_check_retries: - type: integer - description: 'Health check retries count.' - health_check_start_period: - type: integer - description: 'Health check start period in seconds.' - limits_memory: - type: string - description: 'Memory limit.' - limits_memory_swap: - type: string - description: 'Memory swap limit.' - limits_memory_swappiness: - type: integer - description: 'Memory swappiness.' - limits_memory_reservation: - type: string - description: 'Memory reservation.' - limits_cpus: - type: string - description: 'CPU limit.' - limits_cpuset: - type: string - nullable: true - description: 'CPU set.' - limits_cpu_shares: - type: integer - description: 'CPU shares.' - status: - type: string - description: 'Application status.' - preview_url_template: - type: string - description: 'Preview URL template.' - destination_type: - type: string - description: 'Destination type.' - destination_id: - type: integer - description: 'Destination identifier.' - source_id: - type: integer - nullable: true - description: 'Source identifier.' - private_key_id: - type: integer - nullable: true - description: 'Private key identifier.' - environment_id: - type: integer - description: 'Environment identifier.' - dockerfile: - type: string - nullable: true - description: 'Dockerfile content. Used for dockerfile build pack.' - dockerfile_location: - type: string - description: 'Dockerfile location.' - custom_labels: - type: string - nullable: true - description: 'Custom labels.' - dockerfile_target_build: - type: string - nullable: true - description: 'Dockerfile target build.' - manual_webhook_secret_github: - type: string - nullable: true - description: 'Manual webhook secret for GitHub.' - manual_webhook_secret_gitlab: - type: string - nullable: true - description: 'Manual webhook secret for GitLab.' - manual_webhook_secret_bitbucket: - type: string - nullable: true - description: 'Manual webhook secret for Bitbucket.' - manual_webhook_secret_gitea: - type: string - nullable: true - description: 'Manual webhook secret for Gitea.' - docker_compose_location: - type: string - description: 'Docker compose location.' - docker_compose: - type: string - nullable: true - description: 'Docker compose content. Used for docker compose build pack.' - docker_compose_raw: - type: string - nullable: true - description: 'Docker compose raw content.' - docker_compose_domains: - type: string - nullable: true - description: 'Docker compose domains.' - docker_compose_custom_start_command: - type: string - nullable: true - description: 'Docker compose custom start command.' - docker_compose_custom_build_command: - type: string - nullable: true - description: 'Docker compose custom build command.' - swarm_replicas: - type: integer - nullable: true - description: 'Swarm replicas. Only used for swarm deployments.' - swarm_placement_constraints: - type: string - nullable: true - description: 'Swarm placement constraints. Only used for swarm deployments.' - custom_docker_run_options: - type: string - nullable: true - description: 'Custom docker run options.' - post_deployment_command: - type: string - nullable: true - description: 'Post deployment command.' - post_deployment_command_container: - type: string - nullable: true - description: 'Post deployment command container.' - pre_deployment_command: - type: string - nullable: true - description: 'Pre deployment command.' - pre_deployment_command_container: - type: string - nullable: true - description: 'Pre deployment command container.' - watch_paths: - type: string - nullable: true - description: 'Watch paths.' - custom_healthcheck_found: - type: boolean - description: 'Custom healthcheck found.' - redirect: - type: string - nullable: true - description: 'How to set redirect with Traefik / Caddy. www<->non-www.' - enum: - - www - - non-www - - both - created_at: - type: string - format: date-time - description: 'The date and time when the application was created.' - updated_at: - type: string - format: date-time - description: 'The date and time when the application was last updated.' - deleted_at: - type: string - format: date-time - nullable: true - description: 'The date and time when the application was deleted.' - compose_parsing_version: - type: string - description: 'How Coolify parse the compose file.' - custom_nginx_configuration: - type: string - nullable: true - description: 'Custom Nginx configuration base64 encoded.' - type: object - ApplicationDeploymentQueue: - description: 'Project model' - properties: - id: - type: integer - application_id: - type: string - deployment_uuid: - type: string - pull_request_id: - type: integer - force_rebuild: - type: boolean - commit: - type: string - status: - type: string - is_webhook: - type: boolean - is_api: - type: boolean - created_at: - type: string - updated_at: - type: string - logs: - type: string - current_process_id: - type: string - restart_only: - type: boolean - git_type: - type: string - server_id: - type: integer - application_name: - type: string - server_name: - type: string - deployment_url: - type: string - destination_id: - type: string - only_this_server: - type: boolean - rollback: - type: boolean - commit_message: - type: string - type: object - Environment: - description: 'Environment model' - properties: - id: - type: integer - name: - type: string - project_id: - type: integer - created_at: - type: string - updated_at: - type: string - description: - type: string - type: object - EnvironmentVariable: - description: 'Environment Variable model' - properties: - id: - type: integer - uuid: - type: string - resourceable_type: - type: string - resourceable_id: - type: integer - is_build_time: - type: boolean - is_literal: - type: boolean - is_multiline: - type: boolean - is_preview: - type: boolean - is_shared: - type: boolean - is_shown_once: - type: boolean - key: - type: string - value: - type: string - real_value: - type: string - version: - type: string - created_at: - type: string - updated_at: - type: string - type: object - PrivateKey: - description: 'Private Key model' - properties: - id: - type: integer - uuid: - type: string - name: - type: string - description: - type: string - private_key: - type: string - format: private-key - is_git_related: - type: boolean - team_id: - type: integer - created_at: - type: string - updated_at: - type: string - type: object - Project: - description: 'Project model' - properties: - id: - type: integer - uuid: - type: string - name: - type: string - description: - type: string - environments: - description: 'The environments of the project.' - type: array - items: - $ref: '#/components/schemas/Environment' - type: object - Server: - description: 'Server model' - properties: - id: - type: integer - description: 'The server ID.' - uuid: - type: string - description: 'The server UUID.' - name: - type: string - description: 'The server name.' - description: - type: string - description: 'The server description.' - ip: - type: string - description: 'The IP address.' - user: - type: string - description: 'The user.' - port: - type: integer - description: 'The port number.' - proxy: - type: object - description: 'The proxy configuration.' - proxy_type: - type: string - enum: - - traefik - - caddy - - none - description: 'The proxy type.' - high_disk_usage_notification_sent: - type: boolean - description: 'The flag to indicate if the high disk usage notification has been sent.' - unreachable_notification_sent: - type: boolean - description: 'The flag to indicate if the unreachable notification has been sent.' - unreachable_count: - type: integer - description: 'The unreachable count for your server.' - validation_logs: - type: string - description: 'The validation logs.' - log_drain_notification_sent: - type: boolean - description: 'The flag to indicate if the log drain notification has been sent.' - swarm_cluster: - type: string - description: 'The swarm cluster configuration.' - settings: - $ref: '#/components/schemas/ServerSetting' - type: object - ServerSetting: - description: 'Server Settings model' - properties: - id: - type: integer - concurrent_builds: - type: integer - dynamic_timeout: - type: integer - force_disabled: - type: boolean - force_server_cleanup: - type: boolean - is_build_server: - type: boolean - is_cloudflare_tunnel: - type: boolean - is_jump_server: - type: boolean - is_logdrain_axiom_enabled: - type: boolean - is_logdrain_custom_enabled: - type: boolean - is_logdrain_highlight_enabled: - type: boolean - is_logdrain_newrelic_enabled: - type: boolean - is_metrics_enabled: - type: boolean - is_reachable: - type: boolean - is_sentinel_enabled: - type: boolean - is_swarm_manager: - type: boolean - is_swarm_worker: - type: boolean - is_usable: - type: boolean - logdrain_axiom_api_key: - type: string - logdrain_axiom_dataset_name: - type: string - logdrain_custom_config: - type: string - logdrain_custom_config_parser: - type: string - logdrain_highlight_project_id: - type: string - logdrain_newrelic_base_uri: - type: string - logdrain_newrelic_license_key: - type: string - sentinel_metrics_history_days: - type: integer - sentinel_metrics_refresh_rate_seconds: - type: integer - sentinel_token: - type: string - docker_cleanup_frequency: - type: string - docker_cleanup_threshold: - type: integer - server_id: - type: integer - wildcard_domain: - type: string - created_at: - type: string - updated_at: - type: string - delete_unused_volumes: - type: boolean - description: 'The flag to indicate if the unused volumes should be deleted.' - delete_unused_networks: - type: boolean - description: 'The flag to indicate if the unused networks should be deleted.' - type: object - Service: - description: 'Service model' - properties: - id: - type: integer - description: 'The unique identifier of the service. Only used for database identification.' - uuid: - type: string - description: 'The unique identifier of the service.' - name: - type: string - description: 'The name of the service.' - environment_id: - type: integer - description: 'The unique identifier of the environment where the service is attached to.' - server_id: - type: integer - description: 'The unique identifier of the server where the service is running.' - description: - type: string - description: 'The description of the service.' - docker_compose_raw: - type: string - description: 'The raw docker-compose.yml file of the service.' - docker_compose: - type: string - description: 'The docker-compose.yml file that is parsed and modified by Coolify.' - destination_type: - type: string - description: 'Destination type.' - destination_id: - type: integer - description: 'The unique identifier of the destination where the service is running.' - connect_to_docker_network: - type: boolean - description: 'The flag to connect the service to the predefined Docker network.' - is_container_label_escape_enabled: - type: boolean - description: 'The flag to enable the container label escape.' - is_container_label_readonly_enabled: - type: boolean - description: 'The flag to enable the container label readonly.' - config_hash: - type: string - description: 'The hash of the service configuration.' - service_type: - type: string - description: 'The type of the service.' - created_at: - type: string - description: 'The date and time when the service was created.' - updated_at: - type: string - description: 'The date and time when the service was last updated.' - deleted_at: - type: string - description: 'The date and time when the service was deleted.' - type: object - Team: - description: 'Team model' - properties: - id: - type: integer - description: 'The unique identifier of the team.' - name: - type: string - description: 'The name of the team.' - description: - type: string - description: 'The description of the team.' - personal_team: - type: boolean - description: 'Whether the team is personal or not.' - created_at: - type: string - description: 'The date and time the team was created.' - updated_at: - type: string - description: 'The date and time the team was last updated.' - show_boarding: - type: boolean - description: 'Whether to show the boarding screen or not.' - custom_server_limit: - type: string - description: 'The custom server limit.' - members: - description: 'The members of the team.' - type: array - items: - $ref: '#/components/schemas/User' - type: object - User: - description: 'User model' - properties: - id: - type: integer - description: 'The user identifier in the database.' - name: - type: string - description: 'The user name.' - email: - type: string - description: 'The user email.' - email_verified_at: - type: string - description: 'The date when the user email was verified.' - created_at: - type: string - description: 'The date when the user was created.' - updated_at: - type: string - description: 'The date when the user was updated.' - two_factor_confirmed_at: - type: string - description: 'The date when the user two factor was confirmed.' - force_password_reset: - type: boolean - description: 'The flag to force the user to reset the password.' - marketing_emails: - type: boolean - description: 'The flag to receive marketing emails.' - type: object - responses: - '400': - description: 'Invalid token.' - content: - application/json: - schema: - properties: - message: - type: string - example: 'Invalid token.' - type: object - '401': - description: Unauthenticated. - content: - application/json: - schema: - properties: - message: - type: string - example: Unauthenticated. - type: object - '404': - description: 'Resource not found.' - content: - application/json: - schema: - properties: - message: - type: string - example: 'Resource not found.' - type: object - securitySchemes: - bearerAuth: - type: http - description: 'Go to `Keys & Tokens` / `API tokens` and create a new token. Use the token as the bearer token.' - scheme: bearer -tags: - - - name: Applications - description: Applications - - - name: Databases - description: Databases - - - name: Deployments - description: Deployments - - - name: Projects - description: Projects - - - name: Resources - description: Resources - - - name: 'Private Keys' - description: 'Private Keys' - - - name: Servers - description: Servers - - - name: Services - description: Services - - - name: Teams - description: Teams diff --git a/other/logos/advin.png b/other/logos/advin.png deleted file mode 100644 index 155408b9cb..0000000000 Binary files a/other/logos/advin.png and /dev/null differ diff --git a/other/logos/appwrite.svg b/other/logos/appwrite.svg deleted file mode 100644 index b5b8e4ab70..0000000000 --- a/other/logos/appwrite.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - diff --git a/other/logos/arcjet.svg b/other/logos/arcjet.svg deleted file mode 100644 index 0586403c27..0000000000 --- a/other/logos/arcjet.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/other/logos/bc.png b/other/logos/bc.png deleted file mode 100644 index ddb5ef07af..0000000000 Binary files a/other/logos/bc.png and /dev/null differ diff --git a/other/logos/blacksmith.svg b/other/logos/blacksmith.svg deleted file mode 100644 index d8fbf04419..0000000000 --- a/other/logos/blacksmith.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/other/logos/branddev.png b/other/logos/branddev.png deleted file mode 100644 index ef259ff2ef..0000000000 Binary files a/other/logos/branddev.png and /dev/null differ diff --git a/other/logos/ccc-logo.webp b/other/logos/ccc-logo.webp deleted file mode 100644 index e7066e3014..0000000000 Binary files a/other/logos/ccc-logo.webp and /dev/null differ diff --git a/other/logos/codext.jpg b/other/logos/codext.jpg deleted file mode 100644 index 8abf63972b..0000000000 Binary files a/other/logos/codext.jpg and /dev/null differ diff --git a/other/logos/fractal.png b/other/logos/fractal.png deleted file mode 100644 index c4d39c1f1d..0000000000 Binary files a/other/logos/fractal.png and /dev/null differ diff --git a/other/logos/fractal.svg b/other/logos/fractal.svg deleted file mode 100644 index cd2ee41343..0000000000 --- a/other/logos/fractal.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - Networks - Fractal - - - - - - - \ No newline at end of file diff --git a/other/logos/glueops.webp b/other/logos/glueops.webp deleted file mode 100644 index d5acda999b..0000000000 Binary files a/other/logos/glueops.webp and /dev/null differ diff --git a/other/logos/hetzner.jpg b/other/logos/hetzner.jpg deleted file mode 100644 index 9825cbd7a1..0000000000 Binary files a/other/logos/hetzner.jpg and /dev/null differ diff --git a/other/logos/hostinger.svg b/other/logos/hostinger.svg deleted file mode 100644 index 42ec702ab2..0000000000 --- a/other/logos/hostinger.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/other/logos/internetgarden.ico b/other/logos/internetgarden.ico deleted file mode 100644 index e555984be3..0000000000 Binary files a/other/logos/internetgarden.ico and /dev/null differ diff --git a/other/logos/jobscollider.svg b/other/logos/jobscollider.svg deleted file mode 100644 index a57492f41c..0000000000 --- a/other/logos/jobscollider.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/other/logos/juxtdigital.png b/other/logos/juxtdigital.png deleted file mode 100644 index 92257bd351..0000000000 Binary files a/other/logos/juxtdigital.png and /dev/null differ diff --git a/other/logos/latitude.svg b/other/logos/latitude.svg deleted file mode 100644 index 489d9ebc7a..0000000000 --- a/other/logos/latitude.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/other/logos/logto.webp b/other/logos/logto.webp deleted file mode 100644 index b507917921..0000000000 Binary files a/other/logos/logto.webp and /dev/null differ diff --git a/other/logos/massivegrid.svg b/other/logos/massivegrid.svg deleted file mode 100644 index 09f7ba00f1..0000000000 --- a/other/logos/massivegrid.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/other/logos/quant.svg b/other/logos/quant.svg deleted file mode 100644 index b7386b1b48..0000000000 --- a/other/logos/quant.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/other/logos/saasykit.png b/other/logos/saasykit.png deleted file mode 100644 index 27013eadde..0000000000 Binary files a/other/logos/saasykit.png and /dev/null differ diff --git a/other/logos/saasykit.webp b/other/logos/saasykit.webp deleted file mode 100644 index 0d1085e6c6..0000000000 Binary files a/other/logos/saasykit.webp and /dev/null differ diff --git a/other/logos/supaguide.png b/other/logos/supaguide.png deleted file mode 100644 index 195f3ce92a..0000000000 Binary files a/other/logos/supaguide.png and /dev/null differ diff --git a/other/logos/tigris.svg b/other/logos/tigris.svg deleted file mode 100644 index 367c59f2d6..0000000000 --- a/other/logos/tigris.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/other/logos/trieve_bg.png b/other/logos/trieve_bg.png deleted file mode 100644 index 5425fbd73b..0000000000 Binary files a/other/logos/trieve_bg.png and /dev/null differ diff --git a/other/logos/ubicloud.svg b/other/logos/ubicloud.svg deleted file mode 100644 index 3613858cae..0000000000 --- a/other/logos/ubicloud.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/other/nightly/.env.production b/other/nightly/.env.production deleted file mode 100644 index 96833c2533..0000000000 --- a/other/nightly/.env.production +++ /dev/null @@ -1,16 +0,0 @@ -APP_ID= -APP_NAME=Coolify -APP_KEY= - -DB_USERNAME=coolify -DB_PASSWORD= - -REDIS_PASSWORD= - -PUSHER_APP_ID= -PUSHER_APP_KEY= -PUSHER_APP_SECRET= - -ROOT_USERNAME= -ROOT_USER_EMAIL= -ROOT_USER_PASSWORD= diff --git a/other/nightly/docker-compose.prod.yml b/other/nightly/docker-compose.prod.yml deleted file mode 100644 index 23a65cca66..0000000000 --- a/other/nightly/docker-compose.prod.yml +++ /dev/null @@ -1,90 +0,0 @@ -services: - coolify: - image: "ghcr.io/coollabsio/coolify:${LATEST_IMAGE:-latest}" - volumes: - - type: bind - source: /data/coolify/source/.env - target: /var/www/html/.env - read_only: true - - /data/coolify/ssh:/var/www/html/storage/app/ssh - - /data/coolify/applications:/var/www/html/storage/app/applications - - /data/coolify/databases:/var/www/html/storage/app/databases - - /data/coolify/services:/var/www/html/storage/app/services - - /data/coolify/backups:/var/www/html/storage/app/backups - - /data/coolify/webhooks-during-maintenance:/var/www/html/storage/app/webhooks-during-maintenance - environment: - - APP_ENV=${APP_ENV:-production} - - PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT:-256M} - - PHP_FPM_PM_CONTROL=${PHP_FPM_PM_CONTROL:-dynamic} - - PHP_FPM_PM_START_SERVERS=${PHP_FPM_PM_START_SERVERS:-1} - - PHP_FPM_PM_MIN_SPARE_SERVERS=${PHP_FPM_PM_MIN_SPARE_SERVERS:-1} - - PHP_FPM_PM_MAX_SPARE_SERVERS=${PHP_FPM_PM_MAX_SPARE_SERVERS:-10} - env_file: - - /data/coolify/source/.env - ports: - - "${APP_PORT:-8000}:8080" - expose: - - "${APP_PORT:-8000}" - healthcheck: - test: curl --fail http://127.0.0.1:8080/api/health || exit 1 - interval: 5s - retries: 10 - timeout: 2s - depends_on: - postgres: - condition: service_healthy - redis: - condition: service_healthy - soketi: - condition: service_healthy - postgres: - volumes: - - coolify-db:/var/lib/postgresql/data - environment: - POSTGRES_USER: "${DB_USERNAME}" - POSTGRES_PASSWORD: "${DB_PASSWORD}" - POSTGRES_DB: "${DB_DATABASE:-coolify}" - healthcheck: - test: [ "CMD-SHELL", "pg_isready -U ${DB_USERNAME}", "-d", "${DB_DATABASE:-coolify}" ] - interval: 5s - retries: 10 - timeout: 2s - redis: - command: redis-server --save 20 1 --loglevel warning --requirepass ${REDIS_PASSWORD} - environment: - REDIS_PASSWORD: "${REDIS_PASSWORD}" - volumes: - - coolify-redis:/data - healthcheck: - test: redis-cli ping - interval: 5s - retries: 10 - timeout: 2s - soketi: - image: 'ghcr.io/coollabsio/coolify-realtime:1.0.6' - ports: - - "${SOKETI_PORT:-6001}:6001" - - "6002:6002" - volumes: - - /data/coolify/ssh:/var/www/html/storage/app/ssh - environment: - APP_NAME: "${APP_NAME:-Coolify}" - SOKETI_DEBUG: "${SOKETI_DEBUG:-false}" - SOKETI_DEFAULT_APP_ID: "${PUSHER_APP_ID}" - SOKETI_DEFAULT_APP_KEY: "${PUSHER_APP_KEY}" - SOKETI_DEFAULT_APP_SECRET: "${PUSHER_APP_SECRET}" - healthcheck: - test: [ "CMD-SHELL", "wget -qO- http://127.0.0.1:6001/ready && wget -qO- http://127.0.0.1:6002/ready || exit 1" ] - interval: 5s - retries: 10 - timeout: 2s - -volumes: - coolify-db: - name: coolify-db - coolify-redis: - name: coolify-redis - -networks: - coolify: - external: true diff --git a/other/nightly/docker-compose.windows.yml b/other/nightly/docker-compose.windows.yml deleted file mode 100644 index e19ec961f6..0000000000 --- a/other/nightly/docker-compose.windows.yml +++ /dev/null @@ -1,133 +0,0 @@ -services: - coolify-testing-host: - init: true - image: "ghcr.io/coollabsio/coolify-testing-host:latest" - pull_policy: always - container_name: coolify-testing-host - volumes: - - //var/run/docker.sock://var/run/docker.sock - - ./:/data/coolify - coolify: - image: "ghcr.io/coollabsio/coolify:latest" - pull_policy: always - container_name: coolify - restart: always - working_dir: /var/www/html - extra_hosts: - - 'host.docker.internal:host-gateway' - volumes: - - type: bind - source: .env - target: /var/www/html/.env - read_only: true - - ./ssh:/var/www/html/storage/app/ssh - - ./applications:/var/www/html/storage/app/applications - - ./databases:/var/www/html/storage/app/databases - - ./services:/var/www/html/storage/app/services - - ./backups:/var/www/html/storage/app/backups - - ./webhooks-during-maintenance:/var/www/html/storage/app/webhooks-during-maintenance - env_file: - - .env - environment: - - APP_ID - - APP_ENV=production - - APP_NAME - - APP_KEY - - DB_PASSWORD - - REDIS_PASSWORD - - SSL_MODE=off - - PHP_PM_CONTROL=dynamic - - PHP_PM_START_SERVERS=1 - - PHP_PM_MIN_SPARE_SERVERS=1 - - PHP_PM_MAX_SPARE_SERVERS=10 - - PUSHER_APP_ID - - PUSHER_APP_KEY - - PUSHER_APP_SECRET - - AUTOUPDATE=true - - SELF_HOSTED=true - - SSH_MUX_ENABLED=false - - IS_WINDOWS_DOCKER_DESKTOP=true - ports: - - "${APP_PORT:-8000}:8080" - expose: - - "${APP_PORT:-8000}" - healthcheck: - test: curl --fail http://localhost:8080/api/health || exit 1 - interval: 5s - retries: 10 - timeout: 2s - depends_on: - postgres: - condition: service_healthy - redis: - condition: service_healthy - postgres: - image: postgres:15-alpine - pull_policy: always - container_name: coolify-db - restart: always - env_file: - - .env - volumes: - - coolify-db:/var/lib/postgresql/data - environment: - POSTGRES_USER: "${DB_USERNAME}" - POSTGRES_PASSWORD: "${DB_PASSWORD}" - POSTGRES_DB: "${DB_DATABASE:-coolify}" - healthcheck: - test: - [ - "CMD-SHELL", - "pg_isready -U ${DB_USERNAME}", - "-d", - "${DB_DATABASE:-coolify}" - ] - interval: 5s - retries: 10 - timeout: 2s - redis: - image: redis:alpine - pull_policy: always - container_name: coolify-redis - restart: always - command: redis-server --save 20 1 --loglevel warning --requirepass ${REDIS_PASSWORD} - env_file: - - .env - environment: - REDIS_PASSWORD: "${REDIS_PASSWORD}" - volumes: - - coolify-redis:/data - healthcheck: - test: redis-cli ping - interval: 5s - retries: 10 - timeout: 2s - soketi: - image: 'ghcr.io/coollabsio/coolify-realtime:1.0.0' - pull_policy: always - container_name: coolify-realtime - restart: always - env_file: - - .env - ports: - - "${SOKETI_PORT:-6001}:6001" - - "6002:6002" - volumes: - - ./ssh:/var/www/html/storage/app/ssh - environment: - APP_NAME: "${APP_NAME:-Coolify}" - SOKETI_DEBUG: "${SOKETI_DEBUG:-false}" - SOKETI_DEFAULT_APP_ID: "${PUSHER_APP_ID}" - SOKETI_DEFAULT_APP_KEY: "${PUSHER_APP_KEY}" - SOKETI_DEFAULT_APP_SECRET: "${PUSHER_APP_SECRET}" - healthcheck: - test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:6001/ready && wget -qO- http://127.0.0.1:6002/ready || exit 1"] - interval: 5s - retries: 10 - timeout: 2s - -volumes: - coolify-db: - name: coolify-db - coolify-redis: - name: coolify-redis diff --git a/other/nightly/docker-compose.yml b/other/nightly/docker-compose.yml deleted file mode 100644 index 68d0f0744e..0000000000 --- a/other/nightly/docker-compose.yml +++ /dev/null @@ -1,37 +0,0 @@ -services: - coolify: - container_name: coolify - restart: always - working_dir: /var/www/html - extra_hosts: - - 'host.docker.internal:host-gateway' - networks: - - coolify - depends_on: - - postgres - - redis - - soketi - postgres: - image: postgres:15-alpine - container_name: coolify-db - restart: always - networks: - - coolify - redis: - image: redis:alpine - container_name: coolify-redis - restart: always - networks: - - coolify - soketi: - container_name: coolify-realtime - extra_hosts: - - 'host.docker.internal:host-gateway' - restart: always - networks: - - coolify -networks: - coolify: - name: coolify - driver: bridge - external: false diff --git a/other/nightly/install.sh b/other/nightly/install.sh deleted file mode 100755 index 944012f86a..0000000000 --- a/other/nightly/install.sh +++ /dev/null @@ -1,814 +0,0 @@ -#!/bin/bash -## Do not modify this file. You will lose the ability to install and auto-update! - -## Environment variables that can be set: -## ROOT_USERNAME - Predefined root username -## ROOT_USER_EMAIL - Predefined root user email -## ROOT_USER_PASSWORD - Predefined root user password -## DOCKER_ADDRESS_POOL_BASE - Custom Docker address pool base (default: 10.0.0.0/8) -## DOCKER_ADDRESS_POOL_SIZE - Custom Docker address pool size (default: 24) -## DOCKER_POOL_FORCE_OVERRIDE - Force override Docker address pool configuration (default: false) -## AUTOUPDATE - Set to "false" to disable auto-updates - -set -e # Exit immediately if a command exits with a non-zero status -## $1 could be empty, so we need to disable this check -#set -u # Treat unset variables as an error and exit -set -o pipefail # Cause a pipeline to return the status of the last command that exited with a non-zero status -CDN="https://cdn.coollabs.io/coolify-nightly" -DATE=$(date +"%Y%m%d-%H%M%S") - -VERSION="1.8" -DOCKER_VERSION="27.0" -# TODO: Ask for a user -CURRENT_USER=$USER - -if [ $EUID != 0 ]; then - echo "Please run this script as root or with sudo" - exit -fi - -echo -e "Welcome to Coolify Installer!" -echo -e "This script will install everything for you. Sit back and relax." -echo -e "Source code: https://github.com/coollabsio/coolify/blob/main/scripts/install.sh\n" - -# Predefined root user -ROOT_USERNAME=${ROOT_USERNAME:-} -ROOT_USER_EMAIL=${ROOT_USER_EMAIL:-} -ROOT_USER_PASSWORD=${ROOT_USER_PASSWORD:-} - -# Docker address pool configuration defaults -DOCKER_ADDRESS_POOL_BASE_DEFAULT="10.0.0.0/8" -DOCKER_ADDRESS_POOL_SIZE_DEFAULT=24 - -# Check if environment variables were explicitly provided -DOCKER_POOL_BASE_PROVIDED=false -DOCKER_POOL_SIZE_PROVIDED=false -DOCKER_POOL_FORCE_OVERRIDE=${DOCKER_POOL_FORCE_OVERRIDE:-false} - -if [ -n "${DOCKER_ADDRESS_POOL_BASE+x}" ]; then - DOCKER_POOL_BASE_PROVIDED=true -fi - -if [ -n "${DOCKER_ADDRESS_POOL_SIZE+x}" ]; then - DOCKER_POOL_SIZE_PROVIDED=true -fi - -restart_docker_service() { - # Check if systemctl is available - if command -v systemctl >/dev/null 2>&1; then - systemctl restart docker - if [ $? -eq 0 ]; then - echo " - Docker daemon restarted successfully" - else - echo " - Failed to restart Docker daemon" - return 1 - fi - # Check if service command is available - elif command -v service >/dev/null 2>&1; then - service docker restart - if [ $? -eq 0 ]; then - echo " - Docker daemon restarted successfully" - else - echo " - Failed to restart Docker daemon" - return 1 - fi - # If neither systemctl nor service is available - else - echo " - Error: No service management system found" - return 1 - fi -} - -# Function to compare address pools -compare_address_pools() { - local base1="$1" - local size1="$2" - local base2="$3" - local size2="$4" - - # Normalize CIDR notation for comparison - local ip1=$(echo "$base1" | cut -d'/' -f1) - local prefix1=$(echo "$base1" | cut -d'/' -f2) - local ip2=$(echo "$base2" | cut -d'/' -f1) - local prefix2=$(echo "$base2" | cut -d'/' -f2) - - # Compare IPs and prefixes - if [ "$ip1" = "$ip2" ] && [ "$prefix1" = "$prefix2" ] && [ "$size1" = "$size2" ]; then - return 0 # Pools are the same - else - return 1 # Pools are different - fi -} - -# Docker address pool configuration -DOCKER_ADDRESS_POOL_BASE=${DOCKER_ADDRESS_POOL_BASE:-"$DOCKER_ADDRESS_POOL_BASE_DEFAULT"} -DOCKER_ADDRESS_POOL_SIZE=${DOCKER_ADDRESS_POOL_SIZE:-$DOCKER_ADDRESS_POOL_SIZE_DEFAULT} - -# Load Docker address pool configuration from .env file if it exists and environment variables were not provided -if [ -f "/data/coolify/source/.env" ] && [ "$DOCKER_POOL_BASE_PROVIDED" = false ] && [ "$DOCKER_POOL_SIZE_PROVIDED" = false ]; then - ENV_DOCKER_ADDRESS_POOL_BASE=$(grep -E "^DOCKER_ADDRESS_POOL_BASE=" /data/coolify/source/.env | cut -d '=' -f2 || true) - ENV_DOCKER_ADDRESS_POOL_SIZE=$(grep -E "^DOCKER_ADDRESS_POOL_SIZE=" /data/coolify/source/.env | cut -d '=' -f2 || true) - - if [ -n "$ENV_DOCKER_ADDRESS_POOL_BASE" ]; then - DOCKER_ADDRESS_POOL_BASE="$ENV_DOCKER_ADDRESS_POOL_BASE" - fi - - if [ -n "$ENV_DOCKER_ADDRESS_POOL_SIZE" ]; then - DOCKER_ADDRESS_POOL_SIZE="$ENV_DOCKER_ADDRESS_POOL_SIZE" - fi -fi - -# Check if daemon.json exists and extract existing address pool configuration -EXISTING_POOL_CONFIGURED=false -if [ -f /etc/docker/daemon.json ]; then - if jq -e '.["default-address-pools"]' /etc/docker/daemon.json >/dev/null 2>&1; then - EXISTING_POOL_BASE=$(jq -r '.["default-address-pools"][0].base' /etc/docker/daemon.json 2>/dev/null || true) - EXISTING_POOL_SIZE=$(jq -r '.["default-address-pools"][0].size' /etc/docker/daemon.json 2>/dev/null || true) - - if [ -n "$EXISTING_POOL_BASE" ] && [ -n "$EXISTING_POOL_SIZE" ] && [ "$EXISTING_POOL_BASE" != "null" ] && [ "$EXISTING_POOL_SIZE" != "null" ]; then - echo "Found existing Docker network pool: $EXISTING_POOL_BASE/$EXISTING_POOL_SIZE" - EXISTING_POOL_CONFIGURED=true - - # Check if environment variables were explicitly provided - if [ "$DOCKER_POOL_BASE_PROVIDED" = false ] && [ "$DOCKER_POOL_SIZE_PROVIDED" = false ]; then - DOCKER_ADDRESS_POOL_BASE="$EXISTING_POOL_BASE" - DOCKER_ADDRESS_POOL_SIZE="$EXISTING_POOL_SIZE" - else - # Check if force override is enabled - if [ "$DOCKER_POOL_FORCE_OVERRIDE" = true ]; then - echo "Force override enabled - network pool will be updated with $DOCKER_ADDRESS_POOL_BASE/$DOCKER_ADDRESS_POOL_SIZE." - else - echo "Custom pool provided but force override not enabled - using existing configuration." - echo "To force override, set DOCKER_POOL_FORCE_OVERRIDE=true" - echo "This won't change the existing docker networks, only the pool configuration for the newly created networks." - DOCKER_ADDRESS_POOL_BASE="$EXISTING_POOL_BASE" - DOCKER_ADDRESS_POOL_SIZE="$EXISTING_POOL_SIZE" - DOCKER_POOL_BASE_PROVIDED=false - DOCKER_POOL_SIZE_PROVIDED=false - fi - fi - fi - fi -fi - -# Validate Docker address pool configuration -if ! [[ $DOCKER_ADDRESS_POOL_BASE =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+$ ]]; then - echo "Warning: Invalid network pool base format: $DOCKER_ADDRESS_POOL_BASE" - if [ "$EXISTING_POOL_CONFIGURED" = true ]; then - echo "Using existing configuration: $EXISTING_POOL_BASE" - DOCKER_ADDRESS_POOL_BASE="$EXISTING_POOL_BASE" - else - echo "Using default configuration: $DOCKER_ADDRESS_POOL_BASE_DEFAULT" - DOCKER_ADDRESS_POOL_BASE="$DOCKER_ADDRESS_POOL_BASE_DEFAULT" - fi -fi - -if ! [[ $DOCKER_ADDRESS_POOL_SIZE =~ ^[0-9]+$ ]] || [ "$DOCKER_ADDRESS_POOL_SIZE" -lt 16 ] || [ "$DOCKER_ADDRESS_POOL_SIZE" -gt 28 ]; then - echo "Warning: Invalid network pool size: $DOCKER_ADDRESS_POOL_SIZE (must be 16-28)" - if [ "$EXISTING_POOL_CONFIGURED" = true ]; then - echo "Using existing configuration: $EXISTING_POOL_SIZE" - DOCKER_ADDRESS_POOL_SIZE="$EXISTING_POOL_SIZE" - else - echo "Using default configuration: $DOCKER_ADDRESS_POOL_SIZE_DEFAULT" - DOCKER_ADDRESS_POOL_SIZE=$DOCKER_ADDRESS_POOL_SIZE_DEFAULT - fi -fi - -TOTAL_SPACE=$(df -BG / | awk 'NR==2 {print $2}' | sed 's/G//') -AVAILABLE_SPACE=$(df -BG / | awk 'NR==2 {print $4}' | sed 's/G//') -REQUIRED_TOTAL_SPACE=30 -REQUIRED_AVAILABLE_SPACE=20 -WARNING_SPACE=false - -if [ "$TOTAL_SPACE" -lt "$REQUIRED_TOTAL_SPACE" ]; then - WARNING_SPACE=true - cat < >(tee -a $INSTALLATION_LOG_WITH_DATE) 2>&1 - -getAJoke() { - JOKES=$(curl -s --max-time 2 "https://v2.jokeapi.dev/joke/Programming?blacklistFlags=nsfw,religious,political,racist,sexist,explicit&format=txt&type=single" || true) - if [ "$JOKES" != "" ]; then - echo -e " - Until then, here's a joke for you:\n" - echo -e "$JOKES\n" - fi -} -OS_TYPE=$(grep -w "ID" /etc/os-release | cut -d "=" -f 2 | tr -d '"') -ENV_FILE="/data/coolify/source/.env" - -# Check if the OS is manjaro, if so, change it to arch -if [ "$OS_TYPE" = "manjaro" ] || [ "$OS_TYPE" = "manjaro-arm" ]; then - OS_TYPE="arch" -fi - -# Check if the OS is Endeavour OS, if so, change it to arch -if [ "$OS_TYPE" = "endeavouros" ]; then - OS_TYPE="arch" -fi - -# Check if the OS is Asahi Linux, if so, change it to fedora -if [ "$OS_TYPE" = "fedora-asahi-remix" ]; then - OS_TYPE="fedora" -fi - -# Check if the OS is popOS, if so, change it to ubuntu -if [ "$OS_TYPE" = "pop" ]; then - OS_TYPE="ubuntu" -fi - -# Check if the OS is linuxmint, if so, change it to ubuntu -if [ "$OS_TYPE" = "linuxmint" ]; then - OS_TYPE="ubuntu" -fi - -#Check if the OS is zorin, if so, change it to ubuntu -if [ "$OS_TYPE" = "zorin" ]; then - OS_TYPE="ubuntu" -fi - -if [ "$OS_TYPE" = "arch" ] || [ "$OS_TYPE" = "archarm" ]; then - OS_VERSION="rolling" -else - OS_VERSION=$(grep -w "VERSION_ID" /etc/os-release | cut -d "=" -f 2 | tr -d '"') -fi - -# Install xargs on Amazon Linux 2023 - lol -if [ "$OS_TYPE" = 'amzn' ]; then - dnf install -y findutils >/dev/null -fi - -LATEST_VERSION=$(curl --silent $CDN/versions.json | grep -i version | xargs | awk '{print $2}' | tr -d ',') -LATEST_HELPER_VERSION=$(curl --silent $CDN/versions.json | grep -i version | xargs | awk '{print $6}' | tr -d ',') -LATEST_REALTIME_VERSION=$(curl --silent $CDN/versions.json | grep -i version | xargs | awk '{print $8}' | tr -d ',') - -if [ -z "$LATEST_HELPER_VERSION" ]; then - LATEST_HELPER_VERSION=latest -fi - -if [ -z "$LATEST_REALTIME_VERSION" ]; then - LATEST_REALTIME_VERSION=latest -fi - -case "$OS_TYPE" in -arch | ubuntu | debian | raspbian | centos | fedora | rhel | ol | rocky | sles | opensuse-leap | opensuse-tumbleweed | almalinux | amzn | alpine) ;; -*) - echo "This script only supports Debian, Redhat, Arch Linux, Alpine Linux, or SLES based operating systems for now." - exit - ;; -esac - -# Overwrite LATEST_VERSION if user pass a version number -if [ "$1" != "" ]; then - LATEST_VERSION=$1 - LATEST_VERSION="${LATEST_VERSION,,}" - LATEST_VERSION="${LATEST_VERSION#v}" -fi - -echo -e "---------------------------------------------" -echo "| Operating System | $OS_TYPE $OS_VERSION" -echo "| Docker | $DOCKER_VERSION" -echo "| Coolify | $LATEST_VERSION" -echo "| Helper | $LATEST_HELPER_VERSION" -echo "| Realtime | $LATEST_REALTIME_VERSION" -echo "| Docker Pool | $DOCKER_ADDRESS_POOL_BASE (size $DOCKER_ADDRESS_POOL_SIZE)" -echo -e "---------------------------------------------\n" -echo -e "1. Installing required packages (curl, wget, git, jq, openssl). " - -case "$OS_TYPE" in -arch) - pacman -Sy --noconfirm --needed curl wget git jq openssl >/dev/null || true - ;; -alpine) - sed -i '/^#.*\/community/s/^#//' /etc/apk/repositories - apk update >/dev/null - apk add curl wget git jq openssl >/dev/null - ;; -ubuntu | debian | raspbian) - apt-get update -y >/dev/null - apt-get install -y curl wget git jq openssl >/dev/null - ;; -centos | fedora | rhel | ol | rocky | almalinux | amzn) - if [ "$OS_TYPE" = "amzn" ]; then - dnf install -y wget git jq openssl >/dev/null - else - if ! command -v dnf >/dev/null; then - yum install -y dnf >/dev/null - fi - if ! command -v curl >/dev/null; then - dnf install -y curl >/dev/null - fi - dnf install -y wget git jq openssl >/dev/null - fi - ;; -sles | opensuse-leap | opensuse-tumbleweed) - zypper refresh >/dev/null - zypper install -y curl wget git jq openssl >/dev/null - ;; -*) - echo "This script only supports Debian, Redhat, Arch Linux, or SLES based operating systems for now." - exit - ;; -esac - -echo -e "2. Check OpenSSH server configuration. " - -# Detect OpenSSH server -SSH_DETECTED=false -if [ -x "$(command -v systemctl)" ]; then - if systemctl status sshd >/dev/null 2>&1; then - echo " - OpenSSH server is installed." - SSH_DETECTED=true - elif systemctl status ssh >/dev/null 2>&1; then - echo " - OpenSSH server is installed." - SSH_DETECTED=true - fi -elif [ -x "$(command -v service)" ]; then - if service sshd status >/dev/null 2>&1; then - echo " - OpenSSH server is installed." - SSH_DETECTED=true - elif service ssh status >/dev/null 2>&1; then - echo " - OpenSSH server is installed." - SSH_DETECTED=true - fi -fi - -if [ "$SSH_DETECTED" = "false" ]; then - echo " - OpenSSH server not detected. Installing OpenSSH server." - case "$OS_TYPE" in - arch) - pacman -Sy --noconfirm openssh >/dev/null - systemctl enable sshd >/dev/null 2>&1 - systemctl start sshd >/dev/null 2>&1 - ;; - alpine) - apk add openssh >/dev/null - rc-update add sshd default >/dev/null 2>&1 - service sshd start >/dev/null 2>&1 - ;; - ubuntu | debian | raspbian) - apt-get update -y >/dev/null - apt-get install -y openssh-server >/dev/null - systemctl enable ssh >/dev/null 2>&1 - systemctl start ssh >/dev/null 2>&1 - ;; - centos | fedora | rhel | ol | rocky | almalinux | amzn) - if [ "$OS_TYPE" = "amzn" ]; then - dnf install -y openssh-server >/dev/null - else - dnf install -y openssh-server >/dev/null - fi - systemctl enable sshd >/dev/null 2>&1 - systemctl start sshd >/dev/null 2>&1 - ;; - sles | opensuse-leap | opensuse-tumbleweed) - zypper install -y openssh >/dev/null - systemctl enable sshd >/dev/null 2>&1 - systemctl start sshd >/dev/null 2>&1 - ;; - *) - echo "###############################################################################" - echo "WARNING: Could not detect and install OpenSSH server - this does not mean that it is not installed or not running, just that we could not detect it." - echo -e "Please make sure it is installed and running, otherwise Coolify cannot connect to the host system. \n" - echo "###############################################################################" - exit 1 - ;; - esac - echo " - OpenSSH server installed successfully." - SSH_DETECTED=true -fi - -# Detect SSH PermitRootLogin -SSH_PERMIT_ROOT_LOGIN=$(sshd -T | grep -i "permitrootlogin" | awk '{print $2}') || true -if [ "$SSH_PERMIT_ROOT_LOGIN" = "yes" ] || [ "$SSH_PERMIT_ROOT_LOGIN" = "without-password" ] || [ "$SSH_PERMIT_ROOT_LOGIN" = "prohibit-password" ]; then - echo " - SSH PermitRootLogin is enabled." -else - echo " - SSH PermitRootLogin is disabled." - echo " If you have problems with SSH, please read this: https://coolify.io/docs/knowledge-base/server/openssh" -fi - -# Detect if docker is installed via snap -if [ -x "$(command -v snap)" ]; then - SNAP_DOCKER_INSTALLED=$(snap list docker >/dev/null 2>&1 && echo "true" || echo "false") - if [ "$SNAP_DOCKER_INSTALLED" = "true" ]; then - echo " - Docker is installed via snap." - echo " Please note that Coolify does not support Docker installed via snap." - echo " Please remove Docker with snap (snap remove docker) and reexecute this script." - exit 1 - fi -fi - -install_docker() { - curl -s https://releases.rancher.com/install-docker/${DOCKER_VERSION}.sh | sh 2>&1 - if ! [ -x "$(command -v docker)" ]; then - curl -s https://get.docker.com | sh -s -- --version ${DOCKER_VERSION} 2>&1 - if ! [ -x "$(command -v docker)" ]; then - echo " - Docker installation failed." - echo " Maybe your OS is not supported?" - echo " - Please visit https://docs.docker.com/engine/install/ and install Docker manually to continue." - exit 1 - fi - fi -} -echo -e "3. Check Docker Installation. " -if ! [ -x "$(command -v docker)" ]; then - echo " - Docker is not installed. Installing Docker. It may take a while." - getAJoke - case "$OS_TYPE" in - "almalinux") - dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo >/dev/null 2>&1 - dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin >/dev/null 2>&1 - if ! [ -x "$(command -v docker)" ]; then - echo " - Docker could not be installed automatically. Please visit https://docs.docker.com/engine/install/ and install Docker manually to continue." - exit 1 - fi - systemctl start docker >/dev/null 2>&1 - systemctl enable docker >/dev/null 2>&1 - ;; - "alpine") - apk add docker docker-cli-compose >/dev/null 2>&1 - rc-update add docker default >/dev/null 2>&1 - service docker start >/dev/null 2>&1 - if ! [ -x "$(command -v docker)" ]; then - echo " - Failed to install Docker with apk. Try to install it manually." - echo " Please visit https://wiki.alpinelinux.org/wiki/Docker for more information." - exit 1 - fi - ;; - "arch") - pacman -Sy docker docker-compose --noconfirm >/dev/null 2>&1 - systemctl enable docker.service >/dev/null 2>&1 - if ! [ -x "$(command -v docker)" ]; then - echo " - Failed to install Docker with pacman. Try to install it manually." - echo " Please visit https://wiki.archlinux.org/title/docker for more information." - exit 1 - fi - ;; - "amzn") - dnf install docker -y >/dev/null 2>&1 - DOCKER_CONFIG=${DOCKER_CONFIG:-/usr/local/lib/docker} - mkdir -p $DOCKER_CONFIG/cli-plugins >/dev/null 2>&1 - curl -sL https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o $DOCKER_CONFIG/cli-plugins/docker-compose >/dev/null 2>&1 - chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose >/dev/null 2>&1 - systemctl start docker >/dev/null 2>&1 - systemctl enable docker >/dev/null 2>&1 - if ! [ -x "$(command -v docker)" ]; then - echo " - Failed to install Docker with dnf. Try to install it manually." - echo " Please visit https://www.cyberciti.biz/faq/how-to-install-docker-on-amazon-linux-2/ for more information." - exit 1 - fi - ;; - "centos" | "fedora" | "rhel") - if [ -x "$(command -v dnf5)" ]; then - # dnf5 is available - dnf config-manager addrepo --from-repofile=https://download.docker.com/linux/$OS_TYPE/docker-ce.repo --overwrite >/dev/null 2>&1 - else - # dnf5 is not available, use dnf - dnf config-manager --add-repo=https://download.docker.com/linux/$OS_TYPE/docker-ce.repo >/dev/null 2>&1 - fi - dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin >/dev/null 2>&1 - if ! [ -x "$(command -v docker)" ]; then - echo " - Docker could not be installed automatically. Please visit https://docs.docker.com/engine/install/ and install Docker manually to continue." - exit 1 - fi - systemctl start docker >/dev/null 2>&1 - systemctl enable docker >/dev/null 2>&1 - ;; - "ubuntu" | "debian" | "raspbian") - if [ "$OS_TYPE" = "ubuntu" ] && [ "$OS_VERSION" = "24.10" ]; then - echo " - Installing Docker for Ubuntu 24.10..." - apt-get update >/dev/null - apt-get install -y ca-certificates curl >/dev/null - install -m 0755 -d /etc/apt/keyrings - curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc - chmod a+r /etc/apt/keyrings/docker.asc - - # Add the repository to Apt sources - echo \ - "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ - $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | - tee /etc/apt/sources.list.d/docker.list >/dev/null - apt-get update >/dev/null - apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin >/dev/null - - if ! [ -x "$(command -v docker)" ]; then - echo " - Docker installation failed." - echo " Please visit https://docs.docker.com/engine/install/ubuntu/ and install Docker manually to continue." - exit 1 - fi - echo " - Docker installed successfully for Ubuntu 24.10." - else - install_docker - fi - ;; - *) - install_docker - ;; - esac - echo " - Docker installed successfully." -else - echo " - Docker is installed." -fi - -echo -e "4. Check Docker Configuration. " - -echo " - Network pool configuration: ${DOCKER_ADDRESS_POOL_BASE}/${DOCKER_ADDRESS_POOL_SIZE}" -echo " - To override existing configuration: DOCKER_POOL_FORCE_OVERRIDE=true" - -mkdir -p /etc/docker - -# Backup original daemon.json if it exists -if [ -f /etc/docker/daemon.json ]; then - cp /etc/docker/daemon.json /etc/docker/daemon.json.original-"$DATE" -fi - -# Create coolify configuration with or without address pools based on whether they were explicitly provided -if [ "$DOCKER_POOL_FORCE_OVERRIDE" = true ] || [ "$EXISTING_POOL_CONFIGURED" = false ]; then - # First check if the configuration would actually change anything - if [ -f /etc/docker/daemon.json ]; then - CURRENT_POOL_BASE=$(jq -r '.["default-address-pools"][0].base' /etc/docker/daemon.json 2>/dev/null) - CURRENT_POOL_SIZE=$(jq -r '.["default-address-pools"][0].size' /etc/docker/daemon.json 2>/dev/null) - - if [ "$CURRENT_POOL_BASE" = "$DOCKER_ADDRESS_POOL_BASE" ] && [ "$CURRENT_POOL_SIZE" = "$DOCKER_ADDRESS_POOL_SIZE" ]; then - echo " - Network pool configuration unchanged, skipping update" - NEED_MERGE=false - else - # If force override is enabled or no existing configuration exists, - # create a new configuration with the specified address pools - echo " - Creating new Docker configuration with network pool: ${DOCKER_ADDRESS_POOL_BASE}/${DOCKER_ADDRESS_POOL_SIZE}" - cat >/etc/docker/daemon.json </etc/docker/daemon.json </dev/null 2>&1; then - echo " - Log configuration is up to date" - NEED_MERGE=false - else - # Create a configuration without address pools to preserve existing ones - cat >/etc/docker/daemon.json.coolify </etc/docker/daemon.json <$ENV_FILE - -if [ "$AUTOUPDATE" = "false" ]; then - if ! grep -q "AUTOUPDATE=" /data/coolify/source/.env; then - echo "AUTOUPDATE=false" >>/data/coolify/source/.env - else - sed -i "s|AUTOUPDATE=.*|AUTOUPDATE=false|g" /data/coolify/source/.env - fi -fi - -# Save Docker address pool configuration to .env file -if ! grep -q "DOCKER_ADDRESS_POOL_BASE=" /data/coolify/source/.env; then - echo "DOCKER_ADDRESS_POOL_BASE=$DOCKER_ADDRESS_POOL_BASE" >>/data/coolify/source/.env -else - # Only update if explicitly provided - if [ "$DOCKER_POOL_BASE_PROVIDED" = true ]; then - sed -i "s|DOCKER_ADDRESS_POOL_BASE=.*|DOCKER_ADDRESS_POOL_BASE=$DOCKER_ADDRESS_POOL_BASE|g" /data/coolify/source/.env - fi -fi - -if ! grep -q "DOCKER_ADDRESS_POOL_SIZE=" /data/coolify/source/.env; then - echo "DOCKER_ADDRESS_POOL_SIZE=$DOCKER_ADDRESS_POOL_SIZE" >>/data/coolify/source/.env -else - # Only update if explicitly provided - if [ "$DOCKER_POOL_SIZE_PROVIDED" = true ]; then - sed -i "s|DOCKER_ADDRESS_POOL_SIZE=.*|DOCKER_ADDRESS_POOL_SIZE=$DOCKER_ADDRESS_POOL_SIZE|g" /data/coolify/source/.env - fi -fi - -echo -e "8. Checking for SSH key for localhost access." -if [ ! -f ~/.ssh/authorized_keys ]; then - mkdir -p ~/.ssh - chmod 700 ~/.ssh - touch ~/.ssh/authorized_keys - chmod 600 ~/.ssh/authorized_keys -fi - -set +e -IS_COOLIFY_VOLUME_EXISTS=$(docker volume ls | grep coolify-db | wc -l) -set -e - -if [ "$IS_COOLIFY_VOLUME_EXISTS" -eq 0 ]; then - echo " - Generating SSH key." - ssh-keygen -t ed25519 -a 100 -f /data/coolify/ssh/keys/id.$CURRENT_USER@host.docker.internal -q -N "" -C coolify - chown 9999 /data/coolify/ssh/keys/id.$CURRENT_USER@host.docker.internal - sed -i "/coolify/d" ~/.ssh/authorized_keys - cat /data/coolify/ssh/keys/id.$CURRENT_USER@host.docker.internal.pub >>~/.ssh/authorized_keys - rm -f /data/coolify/ssh/keys/id.$CURRENT_USER@host.docker.internal.pub -fi - -chown -R 9999:root /data/coolify -chmod -R 700 /data/coolify - -echo -e "9. Installing Coolify ($LATEST_VERSION)" -echo -e " - It could take a while based on your server's performance, network speed, stars, etc." -echo -e " - Please wait." -getAJoke - -bash /data/coolify/source/upgrade.sh "${LATEST_VERSION:-latest}" "${LATEST_HELPER_VERSION:-latest}" -echo " - Coolify installed successfully." -rm -f $ENV_FILE-$DATE - -echo " - Waiting for 20 seconds for Coolify (database migrations) to be ready." -getAJoke - -sleep 20 -echo -e "\033[0;35m - ____ _ _ _ _ _ - / ___|___ _ __ __ _ _ __ __ _| |_ _ _| | __ _| |_(_) ___ _ __ ___| | - | | / _ \| '_ \ / _\` | '__/ _\` | __| | | | |/ _\` | __| |/ _ \| '_ \/ __| | - | |__| (_) | | | | (_| | | | (_| | |_| |_| | | (_| | |_| | (_) | | | \__ \_| - \____\___/|_| |_|\__, |_| \__,_|\__|\__,_|_|\__,_|\__|_|\___/|_| |_|___(_) - |___/ -\033[0m" -echo -e "\nYour instance is ready to use!\n" -echo -e "You can access Coolify through your Public IP: http://$(curl -4s https://ifconfig.io):8000" - -set +e -DEFAULT_PRIVATE_IP=$(ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p') -PRIVATE_IPS=$(hostname -I 2>/dev/null || ip -o addr show scope global | awk '{print $4}' | cut -d/ -f1) -set -e - -if [ -n "$PRIVATE_IPS" ]; then - echo -e "\nIf your Public IP is not accessible, you can use the following Private IPs:\n" - for IP in $PRIVATE_IPS; do - if [ "$IP" != "$DEFAULT_PRIVATE_IP" ]; then - echo -e "http://$IP:8000" - fi - done -fi -echo -e "\nWARNING: It is highly recommended to backup your Environment variables file (/data/coolify/source/.env) to a safe location, outside of this server (e.g. into a Password Manager).\n" -cp /data/coolify/source/.env /data/coolify/source/.env.backup diff --git a/other/nightly/upgrade.sh b/other/nightly/upgrade.sh deleted file mode 100644 index 670072b12f..0000000000 --- a/other/nightly/upgrade.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash -## Do not modify this file. You will lose the ability to autoupdate! - -VERSION="13" -CDN="https://cdn.coollabs.io/coolify-nightly" -LATEST_IMAGE=${1:-latest} -LATEST_HELPER_VERSION=${2:-latest} - -DATE=$(date +%Y-%m-%d-%H-%M-%S) -LOGFILE="/data/coolify/source/upgrade-${DATE}.log" - -curl -fsSL $CDN/docker-compose.yml -o /data/coolify/source/docker-compose.yml -curl -fsSL $CDN/docker-compose.prod.yml -o /data/coolify/source/docker-compose.prod.yml -curl -fsSL $CDN/.env.production -o /data/coolify/source/.env.production - -# Merge .env and .env.production. New values will be added to .env -awk -F '=' '!seen[$1]++' /data/coolify/source/.env /data/coolify/source/.env.production > /data/coolify/source/.env.tmp && mv /data/coolify/source/.env.tmp /data/coolify/source/.env -# Check if PUSHER_APP_ID or PUSHER_APP_KEY or PUSHER_APP_SECRET is empty in /data/coolify/source/.env -if grep -q "PUSHER_APP_ID=$" /data/coolify/source/.env; then - sed -i "s|PUSHER_APP_ID=.*|PUSHER_APP_ID=$(openssl rand -hex 32)|g" /data/coolify/source/.env -fi - -if grep -q "PUSHER_APP_KEY=$" /data/coolify/source/.env; then - sed -i "s|PUSHER_APP_KEY=.*|PUSHER_APP_KEY=$(openssl rand -hex 32)|g" /data/coolify/source/.env -fi - -if grep -q "PUSHER_APP_SECRET=$" /data/coolify/source/.env; then - sed -i "s|PUSHER_APP_SECRET=.*|PUSHER_APP_SECRET=$(openssl rand -hex 32)|g" /data/coolify/source/.env -fi - -# Make sure coolify network exists -# It is created when starting Coolify with docker compose -docker network create --attachable coolify 2>/dev/null -# docker network create --attachable --driver=overlay coolify-overlay 2>/dev/null - -if [ -f /data/coolify/source/docker-compose.custom.yml ]; then - echo "docker-compose.custom.yml detected." >> $LOGFILE - docker run -v /data/coolify/source:/data/coolify/source -v /var/run/docker.sock:/var/run/docker.sock --rm ghcr.io/coollabsio/coolify-helper:${LATEST_HELPER_VERSION} bash -c "LATEST_IMAGE=${LATEST_IMAGE} docker compose --env-file /data/coolify/source/.env -f /data/coolify/source/docker-compose.yml -f /data/coolify/source/docker-compose.prod.yml -f /data/coolify/source/docker-compose.custom.yml up -d --remove-orphans --force-recreate --wait --wait-timeout 60" >> $LOGFILE 2>&1 -else - docker run -v /data/coolify/source:/data/coolify/source -v /var/run/docker.sock:/var/run/docker.sock --rm ghcr.io/coollabsio/coolify-helper:${LATEST_HELPER_VERSION} bash -c "LATEST_IMAGE=${LATEST_IMAGE} docker compose --env-file /data/coolify/source/.env -f /data/coolify/source/docker-compose.yml -f /data/coolify/source/docker-compose.prod.yml up -d --remove-orphans --force-recreate --wait --wait-timeout 60" >> $LOGFILE 2>&1 -fi diff --git a/other/nightly/versions.json b/other/nightly/versions.json deleted file mode 100644 index 8d1c914337..0000000000 --- a/other/nightly/versions.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "coolify": { - "v4": { - "version": "4.0.0-beta.397" - }, - "nightly": { - "version": "4.0.0-beta.398" - }, - "helper": { - "version": "1.0.7" - }, - "realtime": { - "version": "1.0.6" - }, - "sentinel": { - "version": "0.0.15" - } - } -} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 0fb1d210af..0000000000 --- a/package-lock.json +++ /dev/null @@ -1,3035 +0,0 @@ -{ - "name": "coolify", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "coolify", - "dependencies": { - "@tailwindcss/forms": "0.5.10", - "@tailwindcss/typography": "0.5.16", - "@xterm/addon-fit": "^0.10.0", - "@xterm/xterm": "^5.5.0", - "ioredis": "5.5.0" - }, - "devDependencies": { - "@vitejs/plugin-vue": "5.2.1", - "autoprefixer": "10.4.20", - "axios": "1.7.9", - "laravel-echo": "2.0.2", - "laravel-vite-plugin": "^1.2.0", - "postcss": "8.5.3", - "pusher-js": "8.4.0", - "tailwind-scrollbar": "^3.1.0", - "tailwindcss": "3.4.17", - "vite": "^6.1.1", - "vue": "3.5.13" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.26.3" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@ioredis/commands": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", - "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", - "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", - "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", - "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", - "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", - "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", - "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", - "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", - "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", - "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", - "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", - "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", - "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", - "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", - "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", - "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", - "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", - "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", - "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", - "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==", - "license": "MIT", - "dependencies": { - "mini-svg-data-uri": "^1.2.3" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" - } - }, - "node_modules/@tailwindcss/typography": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz", - "integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==", - "license": "MIT", - "dependencies": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "postcss-selector-parser": "6.0.10" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" - } - }, - "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", - "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", - "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.13", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-core/node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", - "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/compiler-dom/node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", - "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.13", - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.11", - "postcss": "^8.4.48", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-sfc/node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", - "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/compiler-ssr/node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", - "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/runtime-core/node_modules/@vue/reactivity": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", - "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/runtime-core/node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", - "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/runtime-core": "3.5.13", - "@vue/shared": "3.5.13", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/runtime-dom/node_modules/@vue/reactivity": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", - "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/runtime-dom/node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", - "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13" - }, - "peerDependencies": { - "vue": "3.5.13" - } - }, - "node_modules/@vue/server-renderer/node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@xterm/addon-fit": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.10.0.tgz", - "integrity": "sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ==", - "peerDependencies": { - "@xterm/xterm": "^5.0.0" - } - }, - "node_modules/@xterm/xterm": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz", - "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==" - }, - "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001700", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", - "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "license": "Apache-2.0" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "license": "MIT" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.103", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.103.tgz", - "integrity": "sha512-P6+XzIkfndgsrjROJWfSvVEgNHtPgbhVyTkwLjUM2HU/h7pZRORgaTlHqfAikqxKmdJMLW8fftrdGWbd/Ds0FA==", - "dev": true, - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/esbuild": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fastq": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", - "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ioredis": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.5.0.tgz", - "integrity": "sha512-7CutT89g23FfSa8MDoIFs2GYYa0PaNiW/OrT+nRyjRXHDZd17HmIgy+reOQ/yhh72NznNjGuS8kbCAcA4Ro4mw==", - "license": "MIT", - "dependencies": { - "@ioredis/commands": "^1.1.1", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.1.0", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/laravel-echo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/laravel-echo/-/laravel-echo-2.0.2.tgz", - "integrity": "sha512-Ciai6hA7r35MFqNRb8G034cvm9WiveSTFQQKRGJhWtZGbng7C8BBa5QvqDxk/Mw5GeJ+q19jrEwQhf7r1b1lcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/laravel-vite-plugin": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.2.0.tgz", - "integrity": "sha512-R0pJ+IcTVeqEMoKz/B2Ij57QVq3sFTABiFmb06gAwFdivbOgsUtuhX6N2MGLEArajrS3U5JbberzwOe7uXHMHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "vite-plugin-full-reload": "^1.1.0" - }, - "bin": { - "clean-orphaned-assets": "bin/clean.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/lodash.castarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", - "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/magic-string": { - "version": "0.30.15", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.15.tgz", - "integrity": "sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "bin": { - "mini-svg-data-uri": "cli.js" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/pusher-js": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/pusher-js/-/pusher-js-8.4.0.tgz", - "integrity": "sha512-wp3HqIIUc1GRyu1XrP6m2dgyE9MoCsXVsWNlohj0rjSkLf+a0jLvEyVubdg58oMk7bhjBWnFClgp8jfAa6Ak4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "tweetnacl": "^1.0.3" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", - "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.34.8", - "@rollup/rollup-android-arm64": "4.34.8", - "@rollup/rollup-darwin-arm64": "4.34.8", - "@rollup/rollup-darwin-x64": "4.34.8", - "@rollup/rollup-freebsd-arm64": "4.34.8", - "@rollup/rollup-freebsd-x64": "4.34.8", - "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", - "@rollup/rollup-linux-arm-musleabihf": "4.34.8", - "@rollup/rollup-linux-arm64-gnu": "4.34.8", - "@rollup/rollup-linux-arm64-musl": "4.34.8", - "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", - "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", - "@rollup/rollup-linux-riscv64-gnu": "4.34.8", - "@rollup/rollup-linux-s390x-gnu": "4.34.8", - "@rollup/rollup-linux-x64-gnu": "4.34.8", - "@rollup/rollup-linux-x64-musl": "4.34.8", - "@rollup/rollup-win32-arm64-msvc": "4.34.8", - "@rollup/rollup-win32-ia32-msvc": "4.34.8", - "@rollup/rollup-win32-x64-msvc": "4.34.8", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwind-scrollbar": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-3.1.0.tgz", - "integrity": "sha512-pmrtDIZeHyu2idTejfV59SbaJyvp1VRjYxAjZBH0jnyrPRo6HL1kD5Glz8VPagasqr6oAx6M05+Tuw429Z8jxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "tailwindcss": "3.x" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.6", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "license": "Apache-2.0" - }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true - }, - "node_modules/update-browserslist-db": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", - "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/vite": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz", - "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.24.2", - "postcss": "^8.5.2", - "rollup": "^4.30.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-plugin-full-reload": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", - "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "picomatch": "^2.3.1" - } - }, - "node_modules/vue": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", - "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-sfc": "3.5.13", - "@vue/runtime-dom": "3.5.13", - "@vue/server-renderer": "3.5.13", - "@vue/shared": "3.5.13" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue/node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - } - } -} diff --git a/package.json b/package.json index 0060a11990..a047e2684c 100644 --- a/package.json +++ b/package.json @@ -1,29 +1,16 @@ { - "name": "coolify", "private": true, "type": "module", "scripts": { - "dev": "vite", - "build": "vite build" + "build": "vite build", + "dev": "vite" }, "devDependencies": { - "@vitejs/plugin-vue": "5.2.1", - "autoprefixer": "10.4.20", - "axios": "1.7.9", - "laravel-echo": "2.0.2", + "@tailwindcss/vite": "^4.0.0", + "axios": "^1.7.4", + "concurrently": "^9.0.1", "laravel-vite-plugin": "^1.2.0", - "postcss": "8.5.3", - "pusher-js": "8.4.0", - "tailwind-scrollbar": "^3.1.0", - "tailwindcss": "3.4.17", - "vite": "^6.1.1", - "vue": "3.5.13" - }, - "dependencies": { - "@tailwindcss/forms": "0.5.10", - "@tailwindcss/typography": "0.5.16", - "@xterm/addon-fit": "^0.10.0", - "@xterm/xterm": "^5.5.0", - "ioredis": "5.5.0" + "tailwindcss": "^4.0.0", + "vite": "^6.0.11" } } diff --git a/phpunit.dusk.xml b/phpunit.dusk.xml deleted file mode 100644 index 24fbe4597e..0000000000 --- a/phpunit.dusk.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - ./tests/Browser - - - diff --git a/phpunit.xml b/phpunit.xml index f1c2be92d0..506b9a38ec 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,28 +1,33 @@ - - - - ./tests/Unit - - - ./tests/Feature - - - - - - - - - - - - - - - - - ./app - - + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + + + diff --git a/pint.json b/pint.json deleted file mode 100644 index 93061b6bdc..0000000000 --- a/pint.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "preset": "laravel" -} diff --git a/postcss.config.cjs b/postcss.config.cjs deleted file mode 100644 index 33ad091d26..0000000000 --- a/postcss.config.cjs +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/public/coolify-logo-dev-transparent.png b/public/coolify-logo-dev-transparent.png deleted file mode 100644 index 9beeb9ba3f..0000000000 Binary files a/public/coolify-logo-dev-transparent.png and /dev/null differ diff --git a/public/coolify-logo.svg b/public/coolify-logo.svg deleted file mode 100644 index 6f4f641f59..0000000000 --- a/public/coolify-logo.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/public/coolify-transparent.png b/public/coolify-transparent.png deleted file mode 100644 index 96fc0db36d..0000000000 Binary files a/public/coolify-transparent.png and /dev/null differ diff --git a/docker/development/etc/s6-overlay/s6-rc.d/horizon/dependencies.d/init-setup b/public/favicon.ico similarity index 100% rename from docker/development/etc/s6-overlay/s6-rc.d/horizon/dependencies.d/init-setup rename to public/favicon.ico diff --git a/public/index.php b/public/index.php index 1d69f3a289..ee8f07e993 100644 --- a/public/index.php +++ b/public/index.php @@ -1,55 +1,20 @@ make(Kernel::class); - -$response = $kernel->handle( - $request = Request::capture() -)->send(); - -$kernel->terminate($request, $response); +$app->handleRequest(Request::capture()); diff --git a/public/js/apexcharts.js b/public/js/apexcharts.js deleted file mode 100644 index c1353e834c..0000000000 --- a/public/js/apexcharts.js +++ /dev/null @@ -1,16 +0,0 @@ -/*! - * ApexCharts v3.49.1 - * (c) 2018-2024 ApexCharts - * Released under the MIT License. - */ -!function (t, e) { "object" == typeof exports && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).ApexCharts = e() }(this, (function () { - "use strict"; function t(t, e) { var i = Object.keys(t); if (Object.getOwnPropertySymbols) { var a = Object.getOwnPropertySymbols(t); e && (a = a.filter((function (e) { return Object.getOwnPropertyDescriptor(t, e).enumerable }))), i.push.apply(i, a) } return i } function e(e) { for (var i = 1; i < arguments.length; i++) { var a = null != arguments[i] ? arguments[i] : {}; i % 2 ? t(Object(a), !0).forEach((function (t) { o(e, t, a[t]) })) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(a)) : t(Object(a)).forEach((function (t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(a, t)) })) } return e } function i(t) { return i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, i(t) } function a(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function s(t, e) { for (var i = 0; i < e.length; i++) { var a = e[i]; a.enumerable = a.enumerable || !1, a.configurable = !0, "value" in a && (a.writable = !0), Object.defineProperty(t, a.key, a) } } function r(t, e, i) { return e && s(t.prototype, e), i && s(t, i), t } function o(t, e, i) { return e in t ? Object.defineProperty(t, e, { value: i, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = i, t } function n(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), e && h(t, e) } function l(t) { return l = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { return t.__proto__ || Object.getPrototypeOf(t) }, l(t) } function h(t, e) { return h = Object.setPrototypeOf || function (t, e) { return t.__proto__ = e, t }, h(t, e) } function c(t) { if (void 0 === t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return t } function d(t) { var e = function () { 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 (t) { return !1 } }(); return function () { var i, a = l(t); if (e) { var s = l(this).constructor; i = Reflect.construct(a, arguments, s) } else i = a.apply(this, arguments); return function (t, e) { if (e && ("object" == typeof e || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return c(t) }(this, i) } } function g(t, e) { return function (t) { if (Array.isArray(t)) return t }(t) || function (t, e) { var i = null == t ? null : "undefined" != typeof Symbol && t[Symbol.iterator] || t["@@iterator"]; if (null == i) return; var a, s, r = [], o = !0, n = !1; try { for (i = i.call(t); !(o = (a = i.next()).done) && (r.push(a.value), !e || r.length !== e); o = !0); } catch (t) { n = !0, s = t } finally { try { o || null == i.return || i.return() } finally { if (n) throw s } } return r }(t, e) || p(t, e) || function () { 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 u(t) { return function (t) { if (Array.isArray(t)) return f(t) }(t) || function (t) { if ("undefined" != typeof Symbol && null != t[Symbol.iterator] || null != t["@@iterator"]) return Array.from(t) }(t) || p(t) || function () { 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 p(t, e) { if (t) { if ("string" == typeof t) return f(t, e); var i = Object.prototype.toString.call(t).slice(8, -1); return "Object" === i && t.constructor && (i = t.constructor.name), "Map" === i || "Set" === i ? Array.from(t) : "Arguments" === i || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i) ? f(t, e) : void 0 } } function f(t, e) { (null == e || e > t.length) && (e = t.length); for (var i = 0, a = new Array(e); i < e; i++)a[i] = t[i]; return a } var x = function () { function t() { a(this, t) } return r(t, [{ key: "shadeRGBColor", value: function (t, e) { var i = e.split(","), a = t < 0 ? 0 : 255, s = t < 0 ? -1 * t : t, r = parseInt(i[0].slice(4), 10), o = parseInt(i[1], 10), n = parseInt(i[2], 10); return "rgb(" + (Math.round((a - r) * s) + r) + "," + (Math.round((a - o) * s) + o) + "," + (Math.round((a - n) * s) + n) + ")" } }, { key: "shadeHexColor", value: function (t, e) { var i = parseInt(e.slice(1), 16), a = t < 0 ? 0 : 255, s = t < 0 ? -1 * t : t, r = i >> 16, o = i >> 8 & 255, n = 255 & i; return "#" + (16777216 + 65536 * (Math.round((a - r) * s) + r) + 256 * (Math.round((a - o) * s) + o) + (Math.round((a - n) * s) + n)).toString(16).slice(1) } }, { key: "shadeColor", value: function (e, i) { return t.isColorHex(i) ? this.shadeHexColor(e, i) : this.shadeRGBColor(e, i) } }], [{ key: "bind", value: function (t, e) { return function () { return t.apply(e, arguments) } } }, { key: "isObject", value: function (t) { return t && "object" === i(t) && !Array.isArray(t) && null != t } }, { key: "is", value: function (t, e) { return Object.prototype.toString.call(e) === "[object " + t + "]" } }, { key: "listToArray", value: function (t) { var e, i = []; for (e = 0; e < t.length; e++)i[e] = t[e]; return i } }, { key: "extend", value: function (t, e) { var i = this; "function" != typeof Object.assign && (Object.assign = function (t) { if (null == t) throw new TypeError("Cannot convert undefined or null to object"); for (var e = Object(t), i = 1; i < arguments.length; i++) { var a = arguments[i]; if (null != a) for (var s in a) a.hasOwnProperty(s) && (e[s] = a[s]) } return e }); var a = Object.assign({}, t); return this.isObject(t) && this.isObject(e) && Object.keys(e).forEach((function (s) { i.isObject(e[s]) && s in t ? a[s] = i.extend(t[s], e[s]) : Object.assign(a, o({}, s, e[s])) })), a } }, { key: "extendArray", value: function (e, i) { var a = []; return e.map((function (e) { a.push(t.extend(i, e)) })), e = a } }, { key: "monthMod", value: function (t) { return t % 12 } }, { key: "clone", value: function (e) { if (t.is("Array", e)) { for (var a = [], s = 0; s < e.length; s++)a[s] = this.clone(e[s]); return a } if (t.is("Null", e)) return null; if (t.is("Date", e)) return e; if ("object" === i(e)) { var r = {}; for (var o in e) e.hasOwnProperty(o) && (r[o] = this.clone(e[o])); return r } return e } }, { key: "log10", value: function (t) { return Math.log(t) / Math.LN10 } }, { key: "roundToBase10", value: function (t) { return Math.pow(10, Math.floor(Math.log10(t))) } }, { key: "roundToBase", value: function (t, e) { return Math.pow(e, Math.floor(Math.log(t) / Math.log(e))) } }, { key: "parseNumber", value: function (t) { return null === t ? t : parseFloat(t) } }, { key: "stripNumber", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 2; return Number.isInteger(t) ? t : parseFloat(t.toPrecision(e)) } }, { key: "randomId", value: function () { return (Math.random() + 1).toString(36).substring(4) } }, { key: "noExponents", value: function (t) { var e = String(t).split(/[eE]/); if (1 === e.length) return e[0]; var i = "", a = t < 0 ? "-" : "", s = e[0].replace(".", ""), r = Number(e[1]) + 1; if (r < 0) { for (i = a + "0."; r++;)i += "0"; return i + s.replace(/^-/, "") } for (r -= s.length; r--;)i += "0"; return s + i } }, { key: "getDimensions", value: function (t) { var e = getComputedStyle(t, null), i = t.clientHeight, a = t.clientWidth; return i -= parseFloat(e.paddingTop) + parseFloat(e.paddingBottom), [a -= parseFloat(e.paddingLeft) + parseFloat(e.paddingRight), i] } }, { key: "getBoundingClientRect", value: function (t) { var e = t.getBoundingClientRect(); return { top: e.top, right: e.right, bottom: e.bottom, left: e.left, width: t.clientWidth, height: t.clientHeight, x: e.left, y: e.top } } }, { key: "getLargestStringFromArr", value: function (t) { return t.reduce((function (t, e) { return Array.isArray(e) && (e = e.reduce((function (t, e) { return t.length > e.length ? t : e }))), t.length > e.length ? t : e }), 0) } }, { key: "hexToRgba", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "#999999", e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : .6; "#" !== t.substring(0, 1) && (t = "#999999"); var i = t.replace("#", ""); i = i.match(new RegExp("(.{" + i.length / 3 + "})", "g")); for (var a = 0; a < i.length; a++)i[a] = parseInt(1 === i[a].length ? i[a] + i[a] : i[a], 16); return void 0 !== e && i.push(e), "rgba(" + i.join(",") + ")" } }, { key: "getOpacityFromRGBA", value: function (t) { return parseFloat(t.replace(/^.*,(.+)\)/, "$1")) } }, { key: "rgb2hex", value: function (t) { return (t = t.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i)) && 4 === t.length ? "#" + ("0" + parseInt(t[1], 10).toString(16)).slice(-2) + ("0" + parseInt(t[2], 10).toString(16)).slice(-2) + ("0" + parseInt(t[3], 10).toString(16)).slice(-2) : "" } }, { key: "isColorHex", value: function (t) { return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)|(^#[0-9A-F]{8}$)/i.test(t) } }, { key: "getPolygonPos", value: function (t, e) { for (var i = [], a = 2 * Math.PI / e, s = 0; s < e; s++) { var r = {}; r.x = t * Math.sin(s * a), r.y = -t * Math.cos(s * a), i.push(r) } return i } }, { key: "polarToCartesian", value: function (t, e, i, a) { var s = (a - 90) * Math.PI / 180; return { x: t + i * Math.cos(s), y: e + i * Math.sin(s) } } }, { key: "escapeString", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "x", i = t.toString().slice(); return i = i.replace(/[` ~!@#$%^&*()|+\=?;:'",.<>{}[\]\\/]/gi, e) } }, { key: "negToZero", value: function (t) { return t < 0 ? 0 : t } }, { key: "moveIndexInArray", value: function (t, e, i) { if (i >= t.length) for (var a = i - t.length + 1; a--;)t.push(void 0); return t.splice(i, 0, t.splice(e, 1)[0]), t } }, { key: "extractNumber", value: function (t) { return parseFloat(t.replace(/[^\d.]*/g, "")) } }, { key: "findAncestor", value: function (t, e) { for (; (t = t.parentElement) && !t.classList.contains(e);); return t } }, { key: "setELstyles", value: function (t, e) { for (var i in e) e.hasOwnProperty(i) && (t.style.key = e[i]) } }, { key: "isNumber", value: function (t) { return !isNaN(t) && parseFloat(Number(t)) === t && !isNaN(parseInt(t, 10)) } }, { key: "isFloat", value: function (t) { return Number(t) === t && t % 1 != 0 } }, { key: "isSafari", value: function () { return /^((?!chrome|android).)*safari/i.test(navigator.userAgent) } }, { key: "isFirefox", value: function () { return navigator.userAgent.toLowerCase().indexOf("firefox") > -1 } }, { key: "isIE11", value: function () { if (-1 !== window.navigator.userAgent.indexOf("MSIE") || window.navigator.appVersion.indexOf("Trident/") > -1) return !0 } }, { key: "isIE", value: function () { var t = window.navigator.userAgent, e = t.indexOf("MSIE "); if (e > 0) return parseInt(t.substring(e + 5, t.indexOf(".", e)), 10); if (t.indexOf("Trident/") > 0) { var i = t.indexOf("rv:"); return parseInt(t.substring(i + 3, t.indexOf(".", i)), 10) } var a = t.indexOf("Edge/"); return a > 0 && parseInt(t.substring(a + 5, t.indexOf(".", a)), 10) } }, { key: "getGCD", value: function (t, e) { var i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 7, a = Math.pow(10, i - Math.floor(Math.log10(Math.max(t, e)))); for (t = Math.round(Math.abs(t) * a), e = Math.round(Math.abs(e) * a); e;) { var s = e; e = t % e, t = s } return t / a } }, { key: "getPrimeFactors", value: function (t) { for (var e = [], i = 2; t >= 2;)t % i == 0 ? (e.push(i), t /= i) : i++; return e } }, { key: "mod", value: function (t, e) { var i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 7, a = Math.pow(10, i - Math.floor(Math.log10(Math.max(t, e)))); return (t = Math.round(Math.abs(t) * a)) % (e = Math.round(Math.abs(e) * a)) / a } }]), t }(), b = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w, this.setEasingFunctions() } return r(t, [{ key: "setEasingFunctions", value: function () { var t; if (!this.w.globals.easing) { switch (this.w.config.chart.animations.easing) { case "linear": t = "-"; break; case "easein": t = "<"; break; case "easeout": t = ">"; break; case "easeinout": default: t = "<>"; break; case "swing": t = function (t) { var e = 1.70158; return (t -= 1) * t * ((e + 1) * t + e) + 1 }; break; case "bounce": t = function (t) { return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375 }; break; case "elastic": t = function (t) { return t === !!t ? t : Math.pow(2, -10 * t) * Math.sin((t - .075) * (2 * Math.PI) / .3) + 1 } }this.w.globals.easing = t } } }, { key: "animateLine", value: function (t, e, i, a) { t.attr(e).animate(a).attr(i) } }, { key: "animateMarker", value: function (t, e, i, a, s, r) { e || (e = 0), t.attr({ r: e, width: e, height: e }).animate(a, s).attr({ r: i, width: i.width, height: i.height }).afterAll((function () { r() })) } }, { key: "animateCircle", value: function (t, e, i, a, s) { t.attr({ r: e.r, cx: e.cx, cy: e.cy }).animate(a, s).attr({ r: i.r, cx: i.cx, cy: i.cy }) } }, { key: "animateRect", value: function (t, e, i, a, s) { t.attr(e).animate(a).attr(i).afterAll((function () { return s() })) } }, { key: "animatePathsGradually", value: function (t) { var e = t.el, i = t.realIndex, a = t.j, s = t.fill, r = t.pathFrom, o = t.pathTo, n = t.speed, l = t.delay, h = this.w, c = 0; h.config.chart.animations.animateGradually.enabled && (c = h.config.chart.animations.animateGradually.delay), h.config.chart.animations.dynamicAnimation.enabled && h.globals.dataChanged && "bar" !== h.config.chart.type && (c = 0), this.morphSVG(e, i, a, "line" !== h.config.chart.type || h.globals.comboCharts ? s : "stroke", r, o, n, l * c) } }, { key: "showDelayedElements", value: function () { this.w.globals.delayedElements.forEach((function (t) { var e = t.el; e.classList.remove("apexcharts-element-hidden"), e.classList.add("apexcharts-hidden-element-shown") })) } }, { key: "animationCompleted", value: function (t) { var e = this.w; e.globals.animationEnded || (e.globals.animationEnded = !0, this.showDelayedElements(), "function" == typeof e.config.chart.events.animationEnd && e.config.chart.events.animationEnd(this.ctx, { el: t, w: e })) } }, { key: "morphSVG", value: function (t, e, i, a, s, r, o, n) { var l = this, h = this.w; s || (s = t.attr("pathFrom")), r || (r = t.attr("pathTo")); var c = function (t) { return "radar" === h.config.chart.type && (o = 1), "M 0 ".concat(h.globals.gridHeight) }; (!s || s.indexOf("undefined") > -1 || s.indexOf("NaN") > -1) && (s = c()), (!r || r.indexOf("undefined") > -1 || r.indexOf("NaN") > -1) && (r = c()), h.globals.shouldAnimate || (o = 1), t.plot(s).animate(1, h.globals.easing, n).plot(s).animate(o, h.globals.easing, n).plot(r).afterAll((function () { x.isNumber(i) ? i === h.globals.series[h.globals.maxValsInArrayIndex].length - 2 && h.globals.shouldAnimate && l.animationCompleted(t) : "none" !== a && h.globals.shouldAnimate && (!h.globals.comboCharts && e === h.globals.series.length - 1 || h.globals.comboCharts) && l.animationCompleted(t), l.showDelayedElements() })) } }]), t }(), v = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "getDefaultFilter", value: function (t, e) { var i = this.w; t.unfilter(!0), (new window.SVG.Filter).size("120%", "180%", "-5%", "-40%"), "none" !== i.config.states.normal.filter ? this.applyFilter(t, e, i.config.states.normal.filter.type, i.config.states.normal.filter.value) : i.config.chart.dropShadow.enabled && this.dropShadow(t, i.config.chart.dropShadow, e) } }, { key: "addNormalFilter", value: function (t, e) { var i = this.w; i.config.chart.dropShadow.enabled && !t.node.classList.contains("apexcharts-marker") && this.dropShadow(t, i.config.chart.dropShadow, e) } }, { key: "addLightenFilter", value: function (t, e, i) { var a = this, s = this.w, r = i.intensity; t.unfilter(!0); new window.SVG.Filter; t.filter((function (t) { var i = s.config.chart.dropShadow; (i.enabled ? a.addShadow(t, e, i) : t).componentTransfer({ rgb: { type: "linear", slope: 1.5, intercept: r } }) })), t.filterer.node.setAttribute("filterUnits", "userSpaceOnUse"), this._scaleFilterSize(t.filterer.node) } }, { key: "addDarkenFilter", value: function (t, e, i) { var a = this, s = this.w, r = i.intensity; t.unfilter(!0); new window.SVG.Filter; t.filter((function (t) { var i = s.config.chart.dropShadow; (i.enabled ? a.addShadow(t, e, i) : t).componentTransfer({ rgb: { type: "linear", slope: r } }) })), t.filterer.node.setAttribute("filterUnits", "userSpaceOnUse"), this._scaleFilterSize(t.filterer.node) } }, { key: "applyFilter", value: function (t, e, i) { var a = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : .5; switch (i) { case "none": this.addNormalFilter(t, e); break; case "lighten": this.addLightenFilter(t, e, { intensity: a }); break; case "darken": this.addDarkenFilter(t, e, { intensity: a }) } } }, { key: "addShadow", value: function (t, e, i) { var a, s = this.w, r = i.blur, o = i.top, n = i.left, l = i.color, h = i.opacity; if ((null === (a = s.config.chart.dropShadow.enabledOnSeries) || void 0 === a ? void 0 : a.length) > 0 && -1 === s.config.chart.dropShadow.enabledOnSeries.indexOf(e)) return t; var c = t.flood(Array.isArray(l) ? l[e] : l, h).composite(t.sourceAlpha, "in").offset(n, o).gaussianBlur(r).merge(t.source); return t.blend(t.source, c) } }, { key: "dropShadow", value: function (t, e) { var i, a, s = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 0, r = e.top, o = e.left, n = e.blur, l = e.color, h = e.opacity, c = e.noUserSpaceOnUse, d = this.w; if (t.unfilter(!0), x.isIE() && "radialBar" === d.config.chart.type) return t; if ((null === (i = d.config.chart.dropShadow.enabledOnSeries) || void 0 === i ? void 0 : i.length) > 0 && -1 === (null === (a = d.config.chart.dropShadow.enabledOnSeries) || void 0 === a ? void 0 : a.indexOf(s))) return t; return l = Array.isArray(l) ? l[s] : l, t.filter((function (t) { var e = null; e = x.isSafari() || x.isFirefox() || x.isIE() ? t.flood(l, h).composite(t.sourceAlpha, "in").offset(o, r).gaussianBlur(n) : t.flood(l, h).composite(t.sourceAlpha, "in").offset(o, r).gaussianBlur(n).merge(t.source), t.blend(t.source, e) })), c || t.filterer.node.setAttribute("filterUnits", "userSpaceOnUse"), this._scaleFilterSize(t.filterer.node), t } }, { key: "setSelectionFilter", value: function (t, e, i) { var a = this.w; if (void 0 !== a.globals.selectedDataPoints[e] && a.globals.selectedDataPoints[e].indexOf(i) > -1) { t.node.setAttribute("selected", !0); var s = a.config.states.active.filter; "none" !== s && this.applyFilter(t, e, s.type, s.value) } } }, { key: "_scaleFilterSize", value: function (t) { !function (e) { for (var i in e) e.hasOwnProperty(i) && t.setAttribute(i, e[i]) }({ width: "200%", height: "200%", x: "-50%", y: "-50%" }) } }]), t }(), m = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "roundPathCorners", value: function (t, e) { function i(t, e, i) { var s = e.x - t.x, r = e.y - t.y, o = Math.sqrt(s * s + r * r); return a(t, e, Math.min(1, i / o)) } function a(t, e, i) { return { x: t.x + (e.x - t.x) * i, y: t.y + (e.y - t.y) * i } } function s(t, e) { t.length > 2 && (t[t.length - 2] = e.x, t[t.length - 1] = e.y) } function r(t) { return { x: parseFloat(t[t.length - 2]), y: parseFloat(t[t.length - 1]) } } t.indexOf("NaN") > -1 && (t = ""); var o = t.split(/[,\s]/).reduce((function (t, e) { var i = e.match("([a-zA-Z])(.+)"); return i ? (t.push(i[1]), t.push(i[2])) : t.push(e), t }), []).reduce((function (t, e) { return parseFloat(e) == e && t.length ? t[t.length - 1].push(e) : t.push([e]), t }), []), n = []; if (o.length > 1) { var l = r(o[0]), h = null; "Z" == o[o.length - 1][0] && o[0].length > 2 && (h = ["L", l.x, l.y], o[o.length - 1] = h), n.push(o[0]); for (var c = 1; c < o.length; c++) { var d = n[n.length - 1], g = o[c], u = g == h ? o[1] : o[c + 1]; if (u && d && d.length > 2 && "L" == g[0] && u.length > 2 && "L" == u[0]) { var p, f, x = r(d), b = r(g), v = r(u); p = i(b, x, e), f = i(b, v, e), s(g, p), g.origPoint = b, n.push(g); var m = a(p, b, .5), y = a(b, f, .5), w = ["C", m.x, m.y, y.x, y.y, f.x, f.y]; w.origPoint = b, n.push(w) } else n.push(g) } if (h) { var k = r(n[n.length - 1]); n.push(["Z"]), s(n[0], k) } } else n = o; return n.reduce((function (t, e) { return t + e.join(" ") + " " }), "") } }, { key: "drawLine", value: function (t, e, i, a) { var s = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : "#a8a8a8", r = arguments.length > 5 && void 0 !== arguments[5] ? arguments[5] : 0, o = arguments.length > 6 && void 0 !== arguments[6] ? arguments[6] : null, n = arguments.length > 7 && void 0 !== arguments[7] ? arguments[7] : "butt"; return this.w.globals.dom.Paper.line().attr({ x1: t, y1: e, x2: i, y2: a, stroke: s, "stroke-dasharray": r, "stroke-width": o, "stroke-linecap": n }) } }, { key: "drawRect", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 0, a = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : 0, s = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : 0, r = arguments.length > 5 && void 0 !== arguments[5] ? arguments[5] : "#fefefe", o = arguments.length > 6 && void 0 !== arguments[6] ? arguments[6] : 1, n = arguments.length > 7 && void 0 !== arguments[7] ? arguments[7] : null, l = arguments.length > 8 && void 0 !== arguments[8] ? arguments[8] : null, h = arguments.length > 9 && void 0 !== arguments[9] ? arguments[9] : 0, c = this.w.globals.dom.Paper.rect(); return c.attr({ x: t, y: e, width: i > 0 ? i : 0, height: a > 0 ? a : 0, rx: s, ry: s, opacity: o, "stroke-width": null !== n ? n : 0, stroke: null !== l ? l : "none", "stroke-dasharray": h }), c.node.setAttribute("fill", r), c } }, { key: "drawPolygon", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "#e1e1e1", i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 1, a = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : "none"; return this.w.globals.dom.Paper.polygon(t).attr({ fill: a, stroke: e, "stroke-width": i }) } }, { key: "drawCircle", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null; t < 0 && (t = 0); var i = this.w.globals.dom.Paper.circle(2 * t); return null !== e && i.attr(e), i } }, { key: "drawPath", value: function (t) { var e = t.d, i = void 0 === e ? "" : e, a = t.stroke, s = void 0 === a ? "#a8a8a8" : a, r = t.strokeWidth, o = void 0 === r ? 1 : r, n = t.fill, l = t.fillOpacity, h = void 0 === l ? 1 : l, c = t.strokeOpacity, d = void 0 === c ? 1 : c, g = t.classes, u = t.strokeLinecap, p = void 0 === u ? null : u, f = t.strokeDashArray, x = void 0 === f ? 0 : f, b = this.w; return null === p && (p = b.config.stroke.lineCap), (i.indexOf("undefined") > -1 || i.indexOf("NaN") > -1) && (i = "M 0 ".concat(b.globals.gridHeight)), b.globals.dom.Paper.path(i).attr({ fill: n, "fill-opacity": h, stroke: s, "stroke-opacity": d, "stroke-linecap": p, "stroke-width": o, "stroke-dasharray": x, class: g }) } }, { key: "group", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null, e = this.w.globals.dom.Paper.group(); return null !== t && e.attr(t), e } }, { key: "move", value: function (t, e) { var i = ["M", t, e].join(" "); return i } }, { key: "line", value: function (t, e) { var i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : null, a = null; return null === i ? a = [" L", t, e].join(" ") : "H" === i ? a = [" H", t].join(" ") : "V" === i && (a = [" V", e].join(" ")), a } }, { key: "curve", value: function (t, e, i, a, s, r) { var o = ["C", t, e, i, a, s, r].join(" "); return o } }, { key: "quadraticCurve", value: function (t, e, i, a) { return ["Q", t, e, i, a].join(" ") } }, { key: "arc", value: function (t, e, i, a, s, r, o) { var n = "A"; arguments.length > 7 && void 0 !== arguments[7] && arguments[7] && (n = "a"); var l = [n, t, e, i, a, s, r, o].join(" "); return l } }, { key: "renderPaths", value: function (t) { var i, a = t.j, s = t.realIndex, r = t.pathFrom, o = t.pathTo, n = t.stroke, l = t.strokeWidth, h = t.strokeLinecap, c = t.fill, d = t.animationDelay, g = t.initialSpeed, u = t.dataChangeSpeed, p = t.className, f = t.shouldClipToGrid, x = void 0 === f || f, m = t.bindEventsOnPaths, y = void 0 === m || m, w = t.drawShadow, k = void 0 === w || w, A = this.w, S = new v(this.ctx), C = new b(this.ctx), L = this.w.config.chart.animations.enabled, P = L && this.w.config.chart.animations.dynamicAnimation.enabled, M = !!(L && !A.globals.resized || P && A.globals.dataChanged && A.globals.shouldAnimate); M ? i = r : (i = o, A.globals.animationEnded = !0); var I = A.config.stroke.dashArray, T = 0; T = Array.isArray(I) ? I[s] : A.config.stroke.dashArray; var z = this.drawPath({ d: i, stroke: n, strokeWidth: l, fill: c, fillOpacity: 1, classes: p, strokeLinecap: h, strokeDashArray: T }); if (z.attr("index", s), x && z.attr({ "clip-path": "url(#gridRectMask".concat(A.globals.cuid, ")") }), "none" !== A.config.states.normal.filter.type) S.getDefaultFilter(z, s); else if (A.config.chart.dropShadow.enabled && k) { var X = A.config.chart.dropShadow; S.dropShadow(z, X, s) } y && (z.node.addEventListener("mouseenter", this.pathMouseEnter.bind(this, z)), z.node.addEventListener("mouseleave", this.pathMouseLeave.bind(this, z)), z.node.addEventListener("mousedown", this.pathMouseDown.bind(this, z))), z.attr({ pathTo: o, pathFrom: r }); var E = { el: z, j: a, realIndex: s, pathFrom: r, pathTo: o, fill: c, strokeWidth: l, delay: d }; return !L || A.globals.resized || A.globals.dataChanged ? !A.globals.resized && A.globals.dataChanged || C.showDelayedElements() : C.animatePathsGradually(e(e({}, E), {}, { speed: g })), A.globals.dataChanged && P && M && C.animatePathsGradually(e(e({}, E), {}, { speed: u })), z } }, { key: "drawPattern", value: function (t, e, i) { var a = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : "#a8a8a8", s = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : 0; return this.w.globals.dom.Paper.pattern(e, i, (function (r) { "horizontalLines" === t ? r.line(0, 0, i, 0).stroke({ color: a, width: s + 1 }) : "verticalLines" === t ? r.line(0, 0, 0, e).stroke({ color: a, width: s + 1 }) : "slantedLines" === t ? r.line(0, 0, e, i).stroke({ color: a, width: s }) : "squares" === t ? r.rect(e, i).fill("none").stroke({ color: a, width: s }) : "circles" === t && r.circle(e).fill("none").stroke({ color: a, width: s }) })) } }, { key: "drawGradient", value: function (t, e, i, a, s) { var r, o = arguments.length > 5 && void 0 !== arguments[5] ? arguments[5] : null, n = arguments.length > 6 && void 0 !== arguments[6] ? arguments[6] : null, l = arguments.length > 7 && void 0 !== arguments[7] ? arguments[7] : null, h = arguments.length > 8 && void 0 !== arguments[8] ? arguments[8] : 0, c = this.w; e.length < 9 && 0 === e.indexOf("#") && (e = x.hexToRgba(e, a)), i.length < 9 && 0 === i.indexOf("#") && (i = x.hexToRgba(i, s)); var d = 0, g = 1, u = 1, p = null; null !== n && (d = void 0 !== n[0] ? n[0] / 100 : 0, g = void 0 !== n[1] ? n[1] / 100 : 1, u = void 0 !== n[2] ? n[2] / 100 : 1, p = void 0 !== n[3] ? n[3] / 100 : null); var f = !("donut" !== c.config.chart.type && "pie" !== c.config.chart.type && "polarArea" !== c.config.chart.type && "bubble" !== c.config.chart.type); if (r = null === l || 0 === l.length ? c.globals.dom.Paper.gradient(f ? "radial" : "linear", (function (t) { t.at(d, e, a), t.at(g, i, s), t.at(u, i, s), null !== p && t.at(p, e, a) })) : c.globals.dom.Paper.gradient(f ? "radial" : "linear", (function (t) { (Array.isArray(l[h]) ? l[h] : l).forEach((function (e) { t.at(e.offset / 100, e.color, e.opacity) })) })), f) { var b = c.globals.gridWidth / 2, v = c.globals.gridHeight / 2; "bubble" !== c.config.chart.type ? r.attr({ gradientUnits: "userSpaceOnUse", cx: b, cy: v, r: o }) : r.attr({ cx: .5, cy: .5, r: .8, fx: .2, fy: .2 }) } else "vertical" === t ? r.from(0, 0).to(0, 1) : "diagonal" === t ? r.from(0, 0).to(1, 1) : "horizontal" === t ? r.from(0, 1).to(1, 1) : "diagonal2" === t && r.from(1, 0).to(0, 1); return r } }, { key: "getTextBasedOnMaxWidth", value: function (t) { var e = t.text, i = t.maxWidth, a = t.fontSize, s = t.fontFamily, r = this.getTextRects(e, a, s), o = r.width / e.length, n = Math.floor(i / o); return i < r.width ? e.slice(0, n - 3) + "..." : e } }, { key: "drawText", value: function (t) { var i = this, a = t.x, s = t.y, r = t.text, o = t.textAnchor, n = t.fontSize, l = t.fontFamily, h = t.fontWeight, c = t.foreColor, d = t.opacity, g = t.maxWidth, u = t.cssClass, p = void 0 === u ? "" : u, f = t.isPlainText, x = void 0 === f || f, b = t.dominantBaseline, v = void 0 === b ? "auto" : b, m = this.w; void 0 === r && (r = ""); var y = r; o || (o = "start"), c && c.length || (c = m.config.chart.foreColor), l = l || m.config.chart.fontFamily, h = h || "regular"; var w, k = { maxWidth: g, fontSize: n = n || "11px", fontFamily: l }; return Array.isArray(r) ? w = m.globals.dom.Paper.text((function (t) { for (var a = 0; a < r.length; a++)y = r[a], g && (y = i.getTextBasedOnMaxWidth(e({ text: r[a] }, k))), 0 === a ? t.tspan(y) : t.tspan(y).newLine() })) : (g && (y = this.getTextBasedOnMaxWidth(e({ text: r }, k))), w = x ? m.globals.dom.Paper.plain(r) : m.globals.dom.Paper.text((function (t) { return t.tspan(y) }))), w.attr({ x: a, y: s, "text-anchor": o, "dominant-baseline": v, "font-size": n, "font-family": l, "font-weight": h, fill: c, class: "apexcharts-text " + p }), w.node.style.fontFamily = l, w.node.style.opacity = d, w } }, { key: "createGroupWithAttributes", value: function (t, e, i, a) { var s = this.group(); return i.forEach((function (t) { return s.add(t) })), s.attr({ class: a.class ? a.class : "", cy: e, cx: t }), s } }, { key: "drawPlus", value: function (t, e, i, a) { var s = i / 2, r = this.drawLine(t, e - s, t, e + s, a.pointStrokeColor, a.pointStrokeDashArray, a.pointStrokeWidth, a.pointStrokeLineCap), o = this.drawLine(t - s, e, t + s, e, a.pointStrokeColor, a.pointStrokeDashArray, a.pointStrokeWidth, a.pointStrokeLineCap); return this.createGroupWithAttributes(t, e, [r, o], a) } }, { key: "drawX", value: function (t, e, i, a) { var s = i / 2, r = this.drawLine(t - s, e - s, t + s, e + s, a.pointStrokeColor, a.pointStrokeDashArray, a.pointStrokeWidth, a.pointStrokeLineCap), o = this.drawLine(t - s, e + s, t + s, e - s, a.pointStrokeColor, a.pointStrokeDashArray, a.pointStrokeWidth, a.pointStrokeLineCap); return this.createGroupWithAttributes(t, e, [r, o], a) } }, { key: "drawMarker", value: function (t, e, i) { t = t || 0; var a = i.pSize || 0, s = null; if ("X" === (null == i ? void 0 : i.shape) || "x" === (null == i ? void 0 : i.shape)) s = this.drawX(t, e, a, i); else if ("plus" === (null == i ? void 0 : i.shape) || "+" === (null == i ? void 0 : i.shape)) s = this.drawPlus(t, e, a, i); else if ("square" === i.shape || "rect" === i.shape) { var r = void 0 === i.pRadius ? a / 2 : i.pRadius; null !== e && a || (a = 0, r = 0); var o = 1.2 * a + r, n = this.drawRect(o, o, o, o, r); n.attr({ x: t - o / 2, y: e - o / 2, cx: t, cy: e, class: i.class ? i.class : "", fill: i.pointFillColor, "fill-opacity": i.pointFillOpacity ? i.pointFillOpacity : 1, stroke: i.pointStrokeColor, "stroke-width": i.pointStrokeWidth ? i.pointStrokeWidth : 0, "stroke-opacity": i.pointStrokeOpacity ? i.pointStrokeOpacity : 1 }), s = n } else "circle" !== i.shape && i.shape || (x.isNumber(e) || (a = 0, e = 0), s = this.drawCircle(a, { cx: t, cy: e, class: i.class ? i.class : "", stroke: i.pointStrokeColor, fill: i.pointFillColor, "fill-opacity": i.pointFillOpacity ? i.pointFillOpacity : 1, "stroke-width": i.pointStrokeWidth ? i.pointStrokeWidth : 0, "stroke-opacity": i.pointStrokeOpacity ? i.pointStrokeOpacity : 1 })); return s } }, { key: "pathMouseEnter", value: function (t, e) { var i = this.w, a = new v(this.ctx), s = parseInt(t.node.getAttribute("index"), 10), r = parseInt(t.node.getAttribute("j"), 10); if ("function" == typeof i.config.chart.events.dataPointMouseEnter && i.config.chart.events.dataPointMouseEnter(e, this.ctx, { seriesIndex: s, dataPointIndex: r, w: i }), this.ctx.events.fireEvent("dataPointMouseEnter", [e, this.ctx, { seriesIndex: s, dataPointIndex: r, w: i }]), ("none" === i.config.states.active.filter.type || "true" !== t.node.getAttribute("selected")) && "none" !== i.config.states.hover.filter.type && !i.globals.isTouchDevice) { var o = i.config.states.hover.filter; a.applyFilter(t, s, o.type, o.value) } } }, { key: "pathMouseLeave", value: function (t, e) { var i = this.w, a = new v(this.ctx), s = parseInt(t.node.getAttribute("index"), 10), r = parseInt(t.node.getAttribute("j"), 10); "function" == typeof i.config.chart.events.dataPointMouseLeave && i.config.chart.events.dataPointMouseLeave(e, this.ctx, { seriesIndex: s, dataPointIndex: r, w: i }), this.ctx.events.fireEvent("dataPointMouseLeave", [e, this.ctx, { seriesIndex: s, dataPointIndex: r, w: i }]), "none" !== i.config.states.active.filter.type && "true" === t.node.getAttribute("selected") || "none" !== i.config.states.hover.filter.type && a.getDefaultFilter(t, s) } }, { key: "pathMouseDown", value: function (t, e) { var i = this.w, a = new v(this.ctx), s = parseInt(t.node.getAttribute("index"), 10), r = parseInt(t.node.getAttribute("j"), 10), o = "false"; if ("true" === t.node.getAttribute("selected")) { if (t.node.setAttribute("selected", "false"), i.globals.selectedDataPoints[s].indexOf(r) > -1) { var n = i.globals.selectedDataPoints[s].indexOf(r); i.globals.selectedDataPoints[s].splice(n, 1) } } else { if (!i.config.states.active.allowMultipleDataPointsSelection && i.globals.selectedDataPoints.length > 0) { i.globals.selectedDataPoints = []; var l = i.globals.dom.Paper.select(".apexcharts-series path").members, h = i.globals.dom.Paper.select(".apexcharts-series circle, .apexcharts-series rect").members, c = function (t) { Array.prototype.forEach.call(t, (function (t) { t.node.setAttribute("selected", "false"), a.getDefaultFilter(t, s) })) }; c(l), c(h) } t.node.setAttribute("selected", "true"), o = "true", void 0 === i.globals.selectedDataPoints[s] && (i.globals.selectedDataPoints[s] = []), i.globals.selectedDataPoints[s].push(r) } if ("true" === o) { var d = i.config.states.active.filter; if ("none" !== d) a.applyFilter(t, s, d.type, d.value); else if ("none" !== i.config.states.hover.filter && !i.globals.isTouchDevice) { var g = i.config.states.hover.filter; a.applyFilter(t, s, g.type, g.value) } } else if ("none" !== i.config.states.active.filter.type) if ("none" === i.config.states.hover.filter.type || i.globals.isTouchDevice) a.getDefaultFilter(t, s); else { g = i.config.states.hover.filter; a.applyFilter(t, s, g.type, g.value) } "function" == typeof i.config.chart.events.dataPointSelection && i.config.chart.events.dataPointSelection(e, this.ctx, { selectedDataPoints: i.globals.selectedDataPoints, seriesIndex: s, dataPointIndex: r, w: i }), e && this.ctx.events.fireEvent("dataPointSelection", [e, this.ctx, { selectedDataPoints: i.globals.selectedDataPoints, seriesIndex: s, dataPointIndex: r, w: i }]) } }, { key: "rotateAroundCenter", value: function (t) { var e = {}; return t && "function" == typeof t.getBBox && (e = t.getBBox()), { x: e.x + e.width / 2, y: e.y + e.height / 2 } } }, { key: "getTextRects", value: function (t, e, i, a) { var s = !(arguments.length > 4 && void 0 !== arguments[4]) || arguments[4], r = this.w, o = this.drawText({ x: -200, y: -200, text: t, textAnchor: "start", fontSize: e, fontFamily: i, foreColor: "#fff", opacity: 0 }); a && o.attr("transform", a), r.globals.dom.Paper.add(o); var n = o.bbox(); return s || (n = o.node.getBoundingClientRect()), o.remove(), { width: n.width, height: n.height } } }, { key: "placeTextWithEllipsis", value: function (t, e, i) { if ("function" == typeof t.getComputedTextLength && (t.textContent = e, e.length > 0 && t.getComputedTextLength() >= i / 1.1)) { for (var a = e.length - 3; a > 0; a -= 3)if (t.getSubStringLength(0, a) <= i / 1.1) return void (t.textContent = e.substring(0, a) + "..."); t.textContent = "." } } }], [{ key: "setAttrs", value: function (t, e) { for (var i in e) e.hasOwnProperty(i) && t.setAttribute(i, e[i]) } }]), t }(), y = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "getStackedSeriesTotals", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [], e = this.w, i = []; if (0 === e.globals.series.length) return i; for (var a = 0; a < e.globals.series[e.globals.maxValsInArrayIndex].length; a++) { for (var s = 0, r = 0; r < e.globals.series.length; r++)void 0 !== e.globals.series[r][a] && -1 === t.indexOf(r) && (s += e.globals.series[r][a]); i.push(s) } return i } }, { key: "getSeriesTotalByIndex", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null; return null === t ? this.w.config.series.reduce((function (t, e) { return t + e }), 0) : this.w.globals.series[t].reduce((function (t, e) { return t + e }), 0) } }, { key: "getStackedSeriesTotalsByGroups", value: function () { var t = this, e = this.w, i = []; return e.globals.seriesGroups.forEach((function (a) { var s = []; e.config.series.forEach((function (t, i) { a.indexOf(e.globals.seriesNames[i]) > -1 && s.push(i) })); var r = e.globals.series.map((function (t, e) { return -1 === s.indexOf(e) ? e : -1 })).filter((function (t) { return -1 !== t })); i.push(t.getStackedSeriesTotals(r)) })), i } }, { key: "setSeriesYAxisMappings", value: function () { var t = this.w.globals, e = this.w.config, i = [], a = [], s = [], r = t.series.length > e.yaxis.length || e.yaxis.some((function (t) { return Array.isArray(t.seriesName) })); e.series.forEach((function (t, e) { s.push(e), a.push(null) })), e.yaxis.forEach((function (t, e) { i[e] = [] })); var o = []; e.yaxis.forEach((function (t, a) { var n = !1; if (t.seriesName) { var l = []; Array.isArray(t.seriesName) ? l = t.seriesName : l.push(t.seriesName), l.forEach((function (t) { e.series.forEach((function (e, o) { if (e.name === t) { var l = o; a === o || r ? !r || s.indexOf(o) > -1 ? i[a].push([a, o]) : console.warn("Series '" + e.name + "' referenced more than once in what looks like the new style. That is, when using either seriesName: [], or when there are more series than yaxes.") : (i[o].push([o, a]), l = a), n = !0, -1 !== (l = s.indexOf(l)) && s.splice(l, 1) } })) })) } n || o.push(a) })), i = i.map((function (t, e) { var i = []; return t.forEach((function (t) { a[t[1]] = t[0], i.push(t[1]) })), i })); for (var n = e.yaxis.length - 1, l = 0; l < o.length && (n = o[l], i[n] = [], s); l++) { var h = s[0]; s.shift(), i[n].push(h), a[h] = n } s.forEach((function (t) { i[n].push(t), a[t] = n })), t.seriesYAxisMap = i.map((function (t) { return t })), t.seriesYAxisReverseMap = a.map((function (t) { return t })), t.seriesYAxisMap.forEach((function (t, i) { t.forEach((function (t) { e.series[t] && void 0 === e.series[t].group && (e.series[t].group = "apexcharts-axis-".concat(i.toString())) })) })) } }, { key: "isSeriesNull", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null; return 0 === (null === t ? this.w.config.series.filter((function (t) { return null !== t })) : this.w.config.series[t].data.filter((function (t) { return null !== t }))).length } }, { key: "seriesHaveSameValues", value: function (t) { return this.w.globals.series[t].every((function (t, e, i) { return t === i[0] })) } }, { key: "getCategoryLabels", value: function (t) { var e = this.w, i = t.slice(); return e.config.xaxis.convertedCatToNumeric && (i = t.map((function (t, i) { return e.config.xaxis.labels.formatter(t - e.globals.minX + 1) }))), i } }, { key: "getLargestSeries", value: function () { var t = this.w; t.globals.maxValsInArrayIndex = t.globals.series.map((function (t) { return t.length })).indexOf(Math.max.apply(Math, t.globals.series.map((function (t) { return t.length })))) } }, { key: "getLargestMarkerSize", value: function () { var t = this.w, e = 0; return t.globals.markers.size.forEach((function (t) { e = Math.max(e, t) })), t.config.markers.discrete && t.config.markers.discrete.length && t.config.markers.discrete.forEach((function (t) { e = Math.max(e, t.size) })), e > 0 && (e += t.config.markers.hover.sizeOffset + 1), t.globals.markers.largestSize = e, e } }, { key: "getSeriesTotals", value: function () { var t = this.w; t.globals.seriesTotals = t.globals.series.map((function (t, e) { var i = 0; if (Array.isArray(t)) for (var a = 0; a < t.length; a++)i += t[a]; else i += t; return i })) } }, { key: "getSeriesTotalsXRange", value: function (t, e) { var i = this.w; return i.globals.series.map((function (a, s) { for (var r = 0, o = 0; o < a.length; o++)i.globals.seriesX[s][o] > t && i.globals.seriesX[s][o] < e && (r += a[o]); return r })) } }, { key: "getPercentSeries", value: function () { var t = this.w; t.globals.seriesPercent = t.globals.series.map((function (e, i) { var a = []; if (Array.isArray(e)) for (var s = 0; s < e.length; s++) { var r = t.globals.stackedSeriesTotals[s], o = 0; r && (o = 100 * e[s] / r), a.push(o) } else { var n = 100 * e / t.globals.seriesTotals.reduce((function (t, e) { return t + e }), 0); a.push(n) } return a })) } }, { key: "getCalculatedRatios", value: function () { var t, e, i, a = this, s = this.w, r = s.globals, o = [], n = 0, l = [], h = .1, c = 0; if (r.yRange = [], r.isMultipleYAxis) for (var d = 0; d < r.minYArr.length; d++)r.yRange.push(Math.abs(r.minYArr[d] - r.maxYArr[d])), l.push(0); else r.yRange.push(Math.abs(r.minY - r.maxY)); r.xRange = Math.abs(r.maxX - r.minX), r.zRange = Math.abs(r.maxZ - r.minZ); for (var g = 0; g < r.yRange.length; g++)o.push(r.yRange[g] / r.gridHeight); if (e = r.xRange / r.gridWidth, t = r.yRange / r.gridWidth, i = r.xRange / r.gridHeight, (n = r.zRange / r.gridHeight * 16) || (n = 1), r.minY !== Number.MIN_VALUE && 0 !== Math.abs(r.minY) && (r.hasNegs = !0), s.globals.seriesYAxisReverseMap.length > 0) { var u = function (t, e) { var i = s.config.yaxis[s.globals.seriesYAxisReverseMap[e]], r = t < 0 ? -1 : 1; return t = Math.abs(t), i.logarithmic && (t = a.getBaseLog(i.logBase, t)), -r * t / o[e] }; if (r.isMultipleYAxis) { l = []; for (var p = 0; p < o.length; p++)l.push(u(r.minYArr[p], p)) } else (l = []).push(u(r.minY, 0)), r.minY !== Number.MIN_VALUE && 0 !== Math.abs(r.minY) && (h = -r.minY / t, c = r.minX / e) } else (l = []).push(0), h = 0, c = 0; return { yRatio: o, invertedYRatio: t, zRatio: n, xRatio: e, invertedXRatio: i, baseLineInvertedY: h, baseLineY: l, baseLineX: c } } }, { key: "getLogSeries", value: function (t) { var e = this, i = this.w; return i.globals.seriesLog = t.map((function (t, a) { var s = i.globals.seriesYAxisReverseMap[a]; return i.config.yaxis[s] && i.config.yaxis[s].logarithmic ? t.map((function (t) { return null === t ? null : e.getLogVal(i.config.yaxis[s].logBase, t, a) })) : t })), i.globals.invalidLogScale ? t : i.globals.seriesLog } }, { key: "getBaseLog", value: function (t, e) { return Math.log(e) / Math.log(t) } }, { key: "getLogVal", value: function (t, e, i) { if (e <= 0) return 0; var a = this.w, s = 0 === a.globals.minYArr[i] ? -1 : this.getBaseLog(t, a.globals.minYArr[i]), r = (0 === a.globals.maxYArr[i] ? 0 : this.getBaseLog(t, a.globals.maxYArr[i])) - s; return e < 1 ? e / r : (this.getBaseLog(t, e) - s) / r } }, { key: "getLogYRatios", value: function (t) { var e = this, i = this.w, a = this.w.globals; return a.yLogRatio = t.slice(), a.logYRange = a.yRange.map((function (t, s) { var r = i.globals.seriesYAxisReverseMap[s]; if (i.config.yaxis[r] && e.w.config.yaxis[r].logarithmic) { var o, n = -Number.MAX_VALUE, l = Number.MIN_VALUE; return a.seriesLog.forEach((function (t, e) { t.forEach((function (t) { i.config.yaxis[e] && i.config.yaxis[e].logarithmic && (n = Math.max(t, n), l = Math.min(t, l)) })) })), o = Math.pow(a.yRange[s], Math.abs(l - n) / a.yRange[s]), a.yLogRatio[s] = o / a.gridHeight, o } })), a.invalidLogScale ? t.slice() : a.yLogRatio } }, { key: "drawSeriesByGroup", value: function (t, e, i, a) { var s = this.w, r = []; return t.series.length > 0 && e.forEach((function (e) { var o = [], n = []; t.i.forEach((function (i, a) { s.config.series[i].group === e && (o.push(t.series[a]), n.push(i)) })), o.length > 0 && r.push(a.draw(o, i, n)) })), r } }], [{ key: "checkComboSeries", value: function (t, e) { var i = !1, a = 0, s = 0; return void 0 === e && (e = "line"), t.length && void 0 !== t[0].type && t.forEach((function (t) { "bar" !== t.type && "column" !== t.type && "candlestick" !== t.type && "boxPlot" !== t.type || a++, void 0 !== t.type && t.type !== e && s++ })), s > 0 && (i = !0), { comboBarCount: a, comboCharts: i } } }, { key: "extendArrayProps", value: function (t, e, i) { var a, s, r, o, n, l; (null !== (a = e) && void 0 !== a && a.yaxis && (e = t.extendYAxis(e, i)), null !== (s = e) && void 0 !== s && s.annotations) && (e.annotations.yaxis && (e = t.extendYAxisAnnotations(e)), null !== (r = e) && void 0 !== r && null !== (o = r.annotations) && void 0 !== o && o.xaxis && (e = t.extendXAxisAnnotations(e)), null !== (n = e) && void 0 !== n && null !== (l = n.annotations) && void 0 !== l && l.points && (e = t.extendPointAnnotations(e))); return e } }]), t }(), w = function () { function t(e) { a(this, t), this.w = e.w, this.annoCtx = e } return r(t, [{ key: "setOrientations", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null, i = this.w; if ("vertical" === t.label.orientation) { var a = null !== e ? e : 0, s = i.globals.dom.baseEl.querySelector(".apexcharts-xaxis-annotations .apexcharts-xaxis-annotation-label[rel='".concat(a, "']")); if (null !== s) { var r = s.getBoundingClientRect(); s.setAttribute("x", parseFloat(s.getAttribute("x")) - r.height + 4), "top" === t.label.position ? s.setAttribute("y", parseFloat(s.getAttribute("y")) + r.width) : s.setAttribute("y", parseFloat(s.getAttribute("y")) - r.width); var o = this.annoCtx.graphics.rotateAroundCenter(s), n = o.x, l = o.y; s.setAttribute("transform", "rotate(-90 ".concat(n, " ").concat(l, ")")) } } } }, { key: "addBackgroundToAnno", value: function (t, e) { var i = this.w; if (!t || void 0 === e.label.text || void 0 !== e.label.text && !String(e.label.text).trim()) return null; var a = i.globals.dom.baseEl.querySelector(".apexcharts-grid").getBoundingClientRect(), s = t.getBoundingClientRect(), r = e.label.style.padding.left, o = e.label.style.padding.right, n = e.label.style.padding.top, l = e.label.style.padding.bottom; "vertical" === e.label.orientation && (n = e.label.style.padding.left, l = e.label.style.padding.right, r = e.label.style.padding.top, o = e.label.style.padding.bottom); var h = s.left - a.left - r, c = s.top - a.top - n, d = this.annoCtx.graphics.drawRect(h - i.globals.barPadForNumericAxis, c, s.width + r + o, s.height + n + l, e.label.borderRadius, e.label.style.background, 1, e.label.borderWidth, e.label.borderColor, 0); return e.id && d.node.classList.add(e.id), d } }, { key: "annotationsBackground", value: function () { var t = this, e = this.w, i = function (i, a, s) { var r = e.globals.dom.baseEl.querySelector(".apexcharts-".concat(s, "-annotations .apexcharts-").concat(s, "-annotation-label[rel='").concat(a, "']")); if (r) { var o = r.parentNode, n = t.addBackgroundToAnno(r, i); n && (o.insertBefore(n.node, r), i.label.mouseEnter && n.node.addEventListener("mouseenter", i.label.mouseEnter.bind(t, i)), i.label.mouseLeave && n.node.addEventListener("mouseleave", i.label.mouseLeave.bind(t, i)), i.label.click && n.node.addEventListener("click", i.label.click.bind(t, i))) } }; e.config.annotations.xaxis.map((function (t, e) { i(t, e, "xaxis") })), e.config.annotations.yaxis.map((function (t, e) { i(t, e, "yaxis") })), e.config.annotations.points.map((function (t, e) { i(t, e, "point") })) } }, { key: "getY1Y2", value: function (t, e) { var i, a = "y1" === t ? e.y : e.y2, s = !1, r = this.w; if (this.annoCtx.invertAxis) { var o = r.globals.labels; r.config.xaxis.convertedCatToNumeric && (o = r.globals.categoryLabels); var n = o.indexOf(a), l = r.globals.dom.baseEl.querySelector(".apexcharts-yaxis-texts-g text:nth-child(" + (n + 1) + ")"); i = l ? parseFloat(l.getAttribute("y")) : (r.globals.gridHeight / o.length - 1) * (n + 1) - r.globals.barHeight, void 0 !== e.seriesIndex && r.globals.barHeight && (i = i - r.globals.barHeight / 2 * (r.globals.series.length - 1) + r.globals.barHeight * e.seriesIndex) } else { var h, c = r.globals.seriesYAxisMap[e.yAxisIndex][0]; if (r.config.yaxis[e.yAxisIndex].logarithmic) h = (a = new y(this.annoCtx.ctx).getLogVal(r.config.yaxis[e.yAxisIndex].logBase, a, c)) / r.globals.yLogRatio[c]; else h = (a - r.globals.minYArr[c]) / (r.globals.yRange[c] / r.globals.gridHeight); h > r.globals.gridHeight ? (h = r.globals.gridHeight, s = !0) : h < 0 && (h = 0, s = !0), i = r.globals.gridHeight - h, !e.marker || void 0 !== e.y && null !== e.y || (i = 0), r.config.yaxis[e.yAxisIndex] && r.config.yaxis[e.yAxisIndex].reversed && (i = h) } return "string" == typeof a && a.indexOf("px") > -1 && (i = parseFloat(a)), { yP: i, clipped: s } } }, { key: "getX1X2", value: function (t, e) { var i, a = "x1" === t ? e.x : e.x2, s = this.w, r = this.annoCtx.invertAxis ? s.globals.minY : s.globals.minX, o = this.annoCtx.invertAxis ? s.globals.maxY : s.globals.maxX, n = this.annoCtx.invertAxis ? s.globals.yRange[0] : s.globals.xRange, l = !1; return i = this.annoCtx.inversedReversedAxis ? (o - a) / (n / s.globals.gridWidth) : (a - r) / (n / s.globals.gridWidth), "category" !== s.config.xaxis.type && !s.config.xaxis.convertedCatToNumeric || this.annoCtx.invertAxis || s.globals.dataFormatXNumeric || s.config.chart.sparkline.enabled || (i = this.getStringX(a)), "string" == typeof a && a.indexOf("px") > -1 && (i = parseFloat(a)), null == a && e.marker && (i = s.globals.gridWidth), void 0 !== e.seriesIndex && s.globals.barWidth && !this.annoCtx.invertAxis && (i = i - s.globals.barWidth / 2 * (s.globals.series.length - 1) + s.globals.barWidth * e.seriesIndex), i > s.globals.gridWidth ? (i = s.globals.gridWidth, l = !0) : i < 0 && (i = 0, l = !0), { x: i, clipped: l } } }, { key: "getStringX", value: function (t) { var e = this.w, i = t; e.config.xaxis.convertedCatToNumeric && e.globals.categoryLabels.length && (t = e.globals.categoryLabels.indexOf(t) + 1); var a = e.globals.labels.indexOf(t), s = e.globals.dom.baseEl.querySelector(".apexcharts-xaxis-texts-g text:nth-child(" + (a + 1) + ")"); return s && (i = parseFloat(s.getAttribute("x"))), i } }]), t }(), k = function () { function t(e) { a(this, t), this.w = e.w, this.annoCtx = e, this.invertAxis = this.annoCtx.invertAxis, this.helpers = new w(this.annoCtx) } return r(t, [{ key: "addXaxisAnnotation", value: function (t, e, i) { var a, s = this.w, r = this.helpers.getX1X2("x1", t), o = r.x, n = r.clipped, l = !0, h = t.label.text, c = t.strokeDashArray; if (x.isNumber(o)) { if (null === t.x2 || void 0 === t.x2) { if (!n) { var d = this.annoCtx.graphics.drawLine(o + t.offsetX, 0 + t.offsetY, o + t.offsetX, s.globals.gridHeight + t.offsetY, t.borderColor, c, t.borderWidth); e.appendChild(d.node), t.id && d.node.classList.add(t.id) } } else { var g = this.helpers.getX1X2("x2", t); if (a = g.x, l = g.clipped, !n || !l) { if (a < o) { var u = o; o = a, a = u } var p = this.annoCtx.graphics.drawRect(o + t.offsetX, 0 + t.offsetY, a - o, s.globals.gridHeight + t.offsetY, 0, t.fillColor, t.opacity, 1, t.borderColor, c); p.node.classList.add("apexcharts-annotation-rect"), p.attr("clip-path", "url(#gridRectMask".concat(s.globals.cuid, ")")), e.appendChild(p.node), t.id && p.node.classList.add(t.id) } } if (!n || !l) { var f = this.annoCtx.graphics.getTextRects(h, parseFloat(t.label.style.fontSize)), b = "top" === t.label.position ? 4 : "center" === t.label.position ? s.globals.gridHeight / 2 + ("vertical" === t.label.orientation ? f.width / 2 : 0) : s.globals.gridHeight, v = this.annoCtx.graphics.drawText({ x: o + t.label.offsetX, y: b + t.label.offsetY - ("vertical" === t.label.orientation ? "top" === t.label.position ? f.width / 2 - 12 : -f.width / 2 : 0), text: h, textAnchor: t.label.textAnchor, fontSize: t.label.style.fontSize, fontFamily: t.label.style.fontFamily, fontWeight: t.label.style.fontWeight, foreColor: t.label.style.color, cssClass: "apexcharts-xaxis-annotation-label ".concat(t.label.style.cssClass, " ").concat(t.id ? t.id : "") }); v.attr({ rel: i }), e.appendChild(v.node), this.annoCtx.helpers.setOrientations(t, i) } } } }, { key: "drawXAxisAnnotations", value: function () { var t = this, e = this.w, i = this.annoCtx.graphics.group({ class: "apexcharts-xaxis-annotations" }); return e.config.annotations.xaxis.map((function (e, a) { t.addXaxisAnnotation(e, i.node, a) })), i } }]), t }(), A = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w, this.months31 = [1, 3, 5, 7, 8, 10, 12], this.months30 = [2, 4, 6, 9, 11], this.daysCntOfYear = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334] } return r(t, [{ key: "isValidDate", value: function (t) { return "number" != typeof t && !isNaN(this.parseDate(t)) } }, { key: "getTimeStamp", value: function (t) { return Date.parse(t) ? this.w.config.xaxis.labels.datetimeUTC ? new Date(new Date(t).toISOString().substr(0, 25)).getTime() : new Date(t).getTime() : t } }, { key: "getDate", value: function (t) { return this.w.config.xaxis.labels.datetimeUTC ? new Date(new Date(t).toUTCString()) : new Date(t) } }, { key: "parseDate", value: function (t) { var e = Date.parse(t); if (!isNaN(e)) return this.getTimeStamp(t); var i = Date.parse(t.replace(/-/g, "/").replace(/[a-z]+/gi, " ")); return i = this.getTimeStamp(i) } }, { key: "parseDateWithTimezone", value: function (t) { return Date.parse(t.replace(/-/g, "/").replace(/[a-z]+/gi, " ")) } }, { key: "formatDate", value: function (t, e) { var i = this.w.globals.locale, a = this.w.config.xaxis.labels.datetimeUTC, s = ["\0"].concat(u(i.months)), r = ["\x01"].concat(u(i.shortMonths)), o = ["\x02"].concat(u(i.days)), n = ["\x03"].concat(u(i.shortDays)); function l(t, e) { var i = t + ""; for (e = e || 2; i.length < e;)i = "0" + i; return i } var h = a ? t.getUTCFullYear() : t.getFullYear(); e = (e = (e = e.replace(/(^|[^\\])yyyy+/g, "$1" + h)).replace(/(^|[^\\])yy/g, "$1" + h.toString().substr(2, 2))).replace(/(^|[^\\])y/g, "$1" + h); var c = (a ? t.getUTCMonth() : t.getMonth()) + 1; e = (e = (e = (e = e.replace(/(^|[^\\])MMMM+/g, "$1" + s[0])).replace(/(^|[^\\])MMM/g, "$1" + r[0])).replace(/(^|[^\\])MM/g, "$1" + l(c))).replace(/(^|[^\\])M/g, "$1" + c); var d = a ? t.getUTCDate() : t.getDate(); e = (e = (e = (e = e.replace(/(^|[^\\])dddd+/g, "$1" + o[0])).replace(/(^|[^\\])ddd/g, "$1" + n[0])).replace(/(^|[^\\])dd/g, "$1" + l(d))).replace(/(^|[^\\])d/g, "$1" + d); var g = a ? t.getUTCHours() : t.getHours(), p = g > 12 ? g - 12 : 0 === g ? 12 : g; e = (e = (e = (e = e.replace(/(^|[^\\])HH+/g, "$1" + l(g))).replace(/(^|[^\\])H/g, "$1" + g)).replace(/(^|[^\\])hh+/g, "$1" + l(p))).replace(/(^|[^\\])h/g, "$1" + p); var f = a ? t.getUTCMinutes() : t.getMinutes(); e = (e = e.replace(/(^|[^\\])mm+/g, "$1" + l(f))).replace(/(^|[^\\])m/g, "$1" + f); var x = a ? t.getUTCSeconds() : t.getSeconds(); e = (e = e.replace(/(^|[^\\])ss+/g, "$1" + l(x))).replace(/(^|[^\\])s/g, "$1" + x); var b = a ? t.getUTCMilliseconds() : t.getMilliseconds(); e = e.replace(/(^|[^\\])fff+/g, "$1" + l(b, 3)), b = Math.round(b / 10), e = e.replace(/(^|[^\\])ff/g, "$1" + l(b)), b = Math.round(b / 10); var v = g < 12 ? "AM" : "PM"; e = (e = (e = e.replace(/(^|[^\\])f/g, "$1" + b)).replace(/(^|[^\\])TT+/g, "$1" + v)).replace(/(^|[^\\])T/g, "$1" + v.charAt(0)); var m = v.toLowerCase(); e = (e = e.replace(/(^|[^\\])tt+/g, "$1" + m)).replace(/(^|[^\\])t/g, "$1" + m.charAt(0)); var y = -t.getTimezoneOffset(), w = a || !y ? "Z" : y > 0 ? "+" : "-"; if (!a) { var k = (y = Math.abs(y)) % 60; w += l(Math.floor(y / 60)) + ":" + l(k) } e = e.replace(/(^|[^\\])K/g, "$1" + w); var A = (a ? t.getUTCDay() : t.getDay()) + 1; return e = (e = (e = (e = (e = e.replace(new RegExp(o[0], "g"), o[A])).replace(new RegExp(n[0], "g"), n[A])).replace(new RegExp(s[0], "g"), s[c])).replace(new RegExp(r[0], "g"), r[c])).replace(/\\(.)/g, "$1") } }, { key: "getTimeUnitsfromTimestamp", value: function (t, e, i) { var a = this.w; void 0 !== a.config.xaxis.min && (t = a.config.xaxis.min), void 0 !== a.config.xaxis.max && (e = a.config.xaxis.max); var s = this.getDate(t), r = this.getDate(e), o = this.formatDate(s, "yyyy MM dd HH mm ss fff").split(" "), n = this.formatDate(r, "yyyy MM dd HH mm ss fff").split(" "); return { minMillisecond: parseInt(o[6], 10), maxMillisecond: parseInt(n[6], 10), minSecond: parseInt(o[5], 10), maxSecond: parseInt(n[5], 10), minMinute: parseInt(o[4], 10), maxMinute: parseInt(n[4], 10), minHour: parseInt(o[3], 10), maxHour: parseInt(n[3], 10), minDate: parseInt(o[2], 10), maxDate: parseInt(n[2], 10), minMonth: parseInt(o[1], 10) - 1, maxMonth: parseInt(n[1], 10) - 1, minYear: parseInt(o[0], 10), maxYear: parseInt(n[0], 10) } } }, { key: "isLeapYear", value: function (t) { return t % 4 == 0 && t % 100 != 0 || t % 400 == 0 } }, { key: "calculcateLastDaysOfMonth", value: function (t, e, i) { return this.determineDaysOfMonths(t, e) - i } }, { key: "determineDaysOfYear", value: function (t) { var e = 365; return this.isLeapYear(t) && (e = 366), e } }, { key: "determineRemainingDaysOfYear", value: function (t, e, i) { var a = this.daysCntOfYear[e] + i; return e > 1 && this.isLeapYear() && a++, a } }, { key: "determineDaysOfMonths", value: function (t, e) { var i = 30; switch (t = x.monthMod(t), !0) { case this.months30.indexOf(t) > -1: 2 === t && (i = this.isLeapYear(e) ? 29 : 28); break; case this.months31.indexOf(t) > -1: default: i = 31 }return i } }]), t }(), S = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w, this.tooltipKeyFormat = "dd MMM" } return r(t, [{ key: "xLabelFormat", value: function (t, e, i, a) { var s = this.w; if ("datetime" === s.config.xaxis.type && void 0 === s.config.xaxis.labels.formatter && void 0 === s.config.tooltip.x.formatter) { var r = new A(this.ctx); return r.formatDate(r.getDate(e), s.config.tooltip.x.format) } return t(e, i, a) } }, { key: "defaultGeneralFormatter", value: function (t) { return Array.isArray(t) ? t.map((function (t) { return t })) : t } }, { key: "defaultYFormatter", value: function (t, e, i) { var a = this.w; if (x.isNumber(t)) if (0 !== a.globals.yValueDecimal) t = t.toFixed(void 0 !== e.decimalsInFloat ? e.decimalsInFloat : a.globals.yValueDecimal); else { var s = t.toFixed(0); t = t == s ? s : t.toFixed(1) } return t } }, { key: "setLabelFormatters", value: function () { var t = this, e = this.w; return e.globals.xaxisTooltipFormatter = function (e) { return t.defaultGeneralFormatter(e) }, e.globals.ttKeyFormatter = function (e) { return t.defaultGeneralFormatter(e) }, e.globals.ttZFormatter = function (t) { return t }, e.globals.legendFormatter = function (e) { return t.defaultGeneralFormatter(e) }, void 0 !== e.config.xaxis.labels.formatter ? e.globals.xLabelFormatter = e.config.xaxis.labels.formatter : e.globals.xLabelFormatter = function (t) { if (x.isNumber(t)) { if (!e.config.xaxis.convertedCatToNumeric && "numeric" === e.config.xaxis.type) { if (x.isNumber(e.config.xaxis.decimalsInFloat)) return t.toFixed(e.config.xaxis.decimalsInFloat); var i = e.globals.maxX - e.globals.minX; return i > 0 && i < 100 ? t.toFixed(1) : t.toFixed(0) } if (e.globals.isBarHorizontal) if (e.globals.maxY - e.globals.minYArr < 4) return t.toFixed(1); return t.toFixed(0) } return t }, "function" == typeof e.config.tooltip.x.formatter ? e.globals.ttKeyFormatter = e.config.tooltip.x.formatter : e.globals.ttKeyFormatter = e.globals.xLabelFormatter, "function" == typeof e.config.xaxis.tooltip.formatter && (e.globals.xaxisTooltipFormatter = e.config.xaxis.tooltip.formatter), (Array.isArray(e.config.tooltip.y) || void 0 !== e.config.tooltip.y.formatter) && (e.globals.ttVal = e.config.tooltip.y), void 0 !== e.config.tooltip.z.formatter && (e.globals.ttZFormatter = e.config.tooltip.z.formatter), void 0 !== e.config.legend.formatter && (e.globals.legendFormatter = e.config.legend.formatter), e.config.yaxis.forEach((function (i, a) { void 0 !== i.labels.formatter ? e.globals.yLabelFormatters[a] = i.labels.formatter : e.globals.yLabelFormatters[a] = function (s) { return e.globals.xyCharts ? Array.isArray(s) ? s.map((function (e) { return t.defaultYFormatter(e, i, a) })) : t.defaultYFormatter(s, i, a) : s } })), e.globals } }, { key: "heatmapLabelFormatters", value: function () { var t = this.w; if ("heatmap" === t.config.chart.type) { t.globals.yAxisScale[0].result = t.globals.seriesNames.slice(); var e = t.globals.seriesNames.reduce((function (t, e) { return t.length > e.length ? t : e }), 0); t.globals.yAxisScale[0].niceMax = e, t.globals.yAxisScale[0].niceMin = e } } }]), t }(), C = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "getLabel", value: function (t, e, i, a) { var s = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : [], r = arguments.length > 5 && void 0 !== arguments[5] ? arguments[5] : "12px", o = !(arguments.length > 6 && void 0 !== arguments[6]) || arguments[6], n = this.w, l = void 0 === t[a] ? "" : t[a], h = l, c = n.globals.xLabelFormatter, d = n.config.xaxis.labels.formatter, g = !1, u = new S(this.ctx), p = l; o && (h = u.xLabelFormat(c, l, p, { i: a, dateFormatter: new A(this.ctx).formatDate, w: n }), void 0 !== d && (h = d(l, t[a], { i: a, dateFormatter: new A(this.ctx).formatDate, w: n }))); var f, x; e.length > 0 ? (f = e[a].unit, x = null, e.forEach((function (t) { "month" === t.unit ? x = "year" : "day" === t.unit ? x = "month" : "hour" === t.unit ? x = "day" : "minute" === t.unit && (x = "hour") })), g = x === f, i = e[a].position, h = e[a].value) : "datetime" === n.config.xaxis.type && void 0 === d && (h = ""), void 0 === h && (h = ""), h = Array.isArray(h) ? h : h.toString(); var b = new m(this.ctx), v = {}; v = n.globals.rotateXLabels && o ? b.getTextRects(h, parseInt(r, 10), null, "rotate(".concat(n.config.xaxis.labels.rotate, " 0 0)"), !1) : b.getTextRects(h, parseInt(r, 10)); var y = !n.config.xaxis.labels.showDuplicates && this.ctx.timeScale; return !Array.isArray(h) && ("NaN" === String(h) || s.indexOf(h) >= 0 && y) && (h = ""), { x: i, text: h, textRect: v, isBold: g } } }, { key: "checkLabelBasedOnTickamount", value: function (t, e, i) { var a = this.w, s = a.config.xaxis.tickAmount; return "dataPoints" === s && (s = Math.round(a.globals.gridWidth / 120)), s > i || t % Math.round(i / (s + 1)) == 0 || (e.text = ""), e } }, { key: "checkForOverflowingLabels", value: function (t, e, i, a, s) { var r = this.w; if (0 === t && r.globals.skipFirstTimelinelabel && (e.text = ""), t === i - 1 && r.globals.skipLastTimelinelabel && (e.text = ""), r.config.xaxis.labels.hideOverlappingLabels && a.length > 0) { var o = s[s.length - 1]; e.x < o.textRect.width / (r.globals.rotateXLabels ? Math.abs(r.config.xaxis.labels.rotate) / 12 : 1.01) + o.x && (e.text = "") } return e } }, { key: "checkForReversedLabels", value: function (t, e) { var i = this.w; return i.config.yaxis[t] && i.config.yaxis[t].reversed && e.reverse(), e } }, { key: "yAxisAllSeriesCollapsed", value: function (t) { var e = this.w.globals; return !e.seriesYAxisMap[t].some((function (t) { return -1 === e.collapsedSeriesIndices.indexOf(t) })) } }, { key: "translateYAxisIndex", value: function (t) { var e = this.w, i = e.globals, a = e.config.yaxis; return i.series.length > a.length || a.some((function (t) { return Array.isArray(t.seriesName) })) ? t : i.seriesYAxisReverseMap[t] } }, { key: "isYAxisHidden", value: function (t) { var e = this.w, i = e.config.yaxis[t]; if (!i.show || this.yAxisAllSeriesCollapsed(t)) return !0; if (!i.showForNullSeries) { var a = e.globals.seriesYAxisMap[t], s = new y(this.ctx); return a.every((function (t) { return s.isSeriesNull(t) })) } return !1 } }, { key: "getYAxisForeColor", value: function (t, e) { var i = this.w; return Array.isArray(t) && i.globals.yAxisScale[e] && this.ctx.theme.pushExtraColors(t, i.globals.yAxisScale[e].result.length, !1), t } }, { key: "drawYAxisTicks", value: function (t, e, i, a, s, r, o) { var n = this.w, l = new m(this.ctx), h = n.globals.translateY + n.config.yaxis[s].labels.offsetY; if (n.globals.isBarHorizontal ? h = 0 : "heatmap" === n.config.chart.type && (h += r / 2), a.show && e > 0) { !0 === n.config.yaxis[s].opposite && (t += a.width); for (var c = e; c >= 0; c--) { var d = l.drawLine(t + i.offsetX - a.width + a.offsetX, h + a.offsetY, t + i.offsetX + a.offsetX, h + a.offsetY, a.color); o.add(d), h += r } } } }]), t }(), L = function () { function t(e) { a(this, t), this.w = e.w, this.annoCtx = e, this.helpers = new w(this.annoCtx), this.axesUtils = new C(this.annoCtx) } return r(t, [{ key: "addYaxisAnnotation", value: function (t, e, i) { var a, s = this.w, r = t.strokeDashArray, o = this.helpers.getY1Y2("y1", t), n = o.yP, l = o.clipped, h = !0, c = !1, d = t.label.text; if (null === t.y2 || void 0 === t.y2) { if (!l) { c = !0; var g = this.annoCtx.graphics.drawLine(0 + t.offsetX, n + t.offsetY, this._getYAxisAnnotationWidth(t), n + t.offsetY, t.borderColor, r, t.borderWidth); e.appendChild(g.node), t.id && g.node.classList.add(t.id) } } else { if (a = (o = this.helpers.getY1Y2("y2", t)).yP, h = o.clipped, a > n) { var u = n; n = a, a = u } if (!l || !h) { c = !0; var p = this.annoCtx.graphics.drawRect(0 + t.offsetX, a + t.offsetY, this._getYAxisAnnotationWidth(t), n - a, 0, t.fillColor, t.opacity, 1, t.borderColor, r); p.node.classList.add("apexcharts-annotation-rect"), p.attr("clip-path", "url(#gridRectMask".concat(s.globals.cuid, ")")), e.appendChild(p.node), t.id && p.node.classList.add(t.id) } } if (c) { var f = "right" === t.label.position ? s.globals.gridWidth : "center" === t.label.position ? s.globals.gridWidth / 2 : 0, x = this.annoCtx.graphics.drawText({ x: f + t.label.offsetX, y: (null != a ? a : n) + t.label.offsetY - 3, text: d, textAnchor: t.label.textAnchor, fontSize: t.label.style.fontSize, fontFamily: t.label.style.fontFamily, fontWeight: t.label.style.fontWeight, foreColor: t.label.style.color, cssClass: "apexcharts-yaxis-annotation-label ".concat(t.label.style.cssClass, " ").concat(t.id ? t.id : "") }); x.attr({ rel: i }), e.appendChild(x.node) } } }, { key: "_getYAxisAnnotationWidth", value: function (t) { var e = this.w; e.globals.gridWidth; return (t.width.indexOf("%") > -1 ? e.globals.gridWidth * parseInt(t.width, 10) / 100 : parseInt(t.width, 10)) + t.offsetX } }, { key: "drawYAxisAnnotations", value: function () { var t = this, e = this.w, i = this.annoCtx.graphics.group({ class: "apexcharts-yaxis-annotations" }); return e.config.annotations.yaxis.forEach((function (e, a) { e.yAxisIndex = t.axesUtils.translateYAxisIndex(e.yAxisIndex), t.axesUtils.isYAxisHidden(e.yAxisIndex) && t.axesUtils.yAxisAllSeriesCollapsed(e.yAxisIndex) || t.addYaxisAnnotation(e, i.node, a) })), i } }]), t }(), P = function () { function t(e) { a(this, t), this.w = e.w, this.annoCtx = e, this.helpers = new w(this.annoCtx) } return r(t, [{ key: "addPointAnnotation", value: function (t, e, i) { if (!(this.w.globals.collapsedSeriesIndices.indexOf(t.seriesIndex) > -1)) { var a = this.helpers.getX1X2("x1", t), s = a.x, r = a.clipped, o = (a = this.helpers.getY1Y2("y1", t)).yP, n = a.clipped; if (x.isNumber(s) && !n && !r) { var l = { pSize: t.marker.size, pointStrokeWidth: t.marker.strokeWidth, pointFillColor: t.marker.fillColor, pointStrokeColor: t.marker.strokeColor, shape: t.marker.shape, pRadius: t.marker.radius, class: "apexcharts-point-annotation-marker ".concat(t.marker.cssClass, " ").concat(t.id ? t.id : "") }, h = this.annoCtx.graphics.drawMarker(s + t.marker.offsetX, o + t.marker.offsetY, l); e.appendChild(h.node); var c = t.label.text ? t.label.text : "", d = this.annoCtx.graphics.drawText({ x: s + t.label.offsetX, y: o + t.label.offsetY - t.marker.size - parseFloat(t.label.style.fontSize) / 1.6, text: c, textAnchor: t.label.textAnchor, fontSize: t.label.style.fontSize, fontFamily: t.label.style.fontFamily, fontWeight: t.label.style.fontWeight, foreColor: t.label.style.color, cssClass: "apexcharts-point-annotation-label ".concat(t.label.style.cssClass, " ").concat(t.id ? t.id : "") }); if (d.attr({ rel: i }), e.appendChild(d.node), t.customSVG.SVG) { var g = this.annoCtx.graphics.group({ class: "apexcharts-point-annotations-custom-svg " + t.customSVG.cssClass }); g.attr({ transform: "translate(".concat(s + t.customSVG.offsetX, ", ").concat(o + t.customSVG.offsetY, ")") }), g.node.innerHTML = t.customSVG.SVG, e.appendChild(g.node) } if (t.image.path) { var u = t.image.width ? t.image.width : 20, p = t.image.height ? t.image.height : 20; h = this.annoCtx.addImage({ x: s + t.image.offsetX - u / 2, y: o + t.image.offsetY - p / 2, width: u, height: p, path: t.image.path, appendTo: ".apexcharts-point-annotations" }) } t.mouseEnter && h.node.addEventListener("mouseenter", t.mouseEnter.bind(this, t)), t.mouseLeave && h.node.addEventListener("mouseleave", t.mouseLeave.bind(this, t)), t.click && h.node.addEventListener("click", t.click.bind(this, t)) } } } }, { key: "drawPointAnnotations", value: function () { var t = this, e = this.w, i = this.annoCtx.graphics.group({ class: "apexcharts-point-annotations" }); return e.config.annotations.points.map((function (e, a) { t.addPointAnnotation(e, i.node, a) })), i } }]), t }(); var M = { name: "en", options: { months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], toolbar: { exportToSVG: "Download SVG", exportToPNG: "Download PNG", exportToCSV: "Download CSV", menu: "Menu", selection: "Selection", selectionZoom: "Selection Zoom", zoomIn: "Zoom In", zoomOut: "Zoom Out", pan: "Panning", reset: "Reset Zoom" } } }, I = function () { function t() { a(this, t), this.yAxis = { show: !0, showAlways: !1, showForNullSeries: !0, seriesName: void 0, opposite: !1, reversed: !1, logarithmic: !1, logBase: 10, tickAmount: void 0, stepSize: void 0, forceNiceScale: !1, max: void 0, min: void 0, floating: !1, decimalsInFloat: void 0, labels: { show: !0, minWidth: 0, maxWidth: 160, offsetX: 0, offsetY: 0, align: void 0, rotate: 0, padding: 20, style: { colors: [], fontSize: "11px", fontWeight: 400, fontFamily: void 0, cssClass: "" }, formatter: void 0 }, axisBorder: { show: !1, color: "#e0e0e0", width: 1, offsetX: 0, offsetY: 0 }, axisTicks: { show: !1, color: "#e0e0e0", width: 6, offsetX: 0, offsetY: 0 }, title: { text: void 0, rotate: -90, offsetY: 0, offsetX: 0, style: { color: void 0, fontSize: "11px", fontWeight: 900, fontFamily: void 0, cssClass: "" } }, tooltip: { enabled: !1, offsetX: 0 }, crosshairs: { show: !0, position: "front", stroke: { color: "#b6b6b6", width: 1, dashArray: 0 } } }, this.pointAnnotation = { id: void 0, x: 0, y: null, yAxisIndex: 0, seriesIndex: void 0, mouseEnter: void 0, mouseLeave: void 0, click: void 0, marker: { size: 4, fillColor: "#fff", strokeWidth: 2, strokeColor: "#333", shape: "circle", offsetX: 0, offsetY: 0, radius: 2, cssClass: "" }, label: { borderColor: "#c2c2c2", borderWidth: 1, borderRadius: 2, text: void 0, textAnchor: "middle", offsetX: 0, offsetY: 0, mouseEnter: void 0, mouseLeave: void 0, click: void 0, style: { background: "#fff", color: void 0, fontSize: "11px", fontFamily: void 0, fontWeight: 400, cssClass: "", padding: { left: 5, right: 5, top: 2, bottom: 2 } } }, customSVG: { SVG: void 0, cssClass: void 0, offsetX: 0, offsetY: 0 }, image: { path: void 0, width: 20, height: 20, offsetX: 0, offsetY: 0 } }, this.yAxisAnnotation = { id: void 0, y: 0, y2: null, strokeDashArray: 1, fillColor: "#c2c2c2", borderColor: "#c2c2c2", borderWidth: 1, opacity: .3, offsetX: 0, offsetY: 0, width: "100%", yAxisIndex: 0, label: { borderColor: "#c2c2c2", borderWidth: 1, borderRadius: 2, text: void 0, textAnchor: "end", position: "right", offsetX: 0, offsetY: -3, mouseEnter: void 0, mouseLeave: void 0, click: void 0, style: { background: "#fff", color: void 0, fontSize: "11px", fontFamily: void 0, fontWeight: 400, cssClass: "", padding: { left: 5, right: 5, top: 2, bottom: 2 } } } }, this.xAxisAnnotation = { id: void 0, x: 0, x2: null, strokeDashArray: 1, fillColor: "#c2c2c2", borderColor: "#c2c2c2", borderWidth: 1, opacity: .3, offsetX: 0, offsetY: 0, label: { borderColor: "#c2c2c2", borderWidth: 1, borderRadius: 2, text: void 0, textAnchor: "middle", orientation: "vertical", position: "top", offsetX: 0, offsetY: 0, mouseEnter: void 0, mouseLeave: void 0, click: void 0, style: { background: "#fff", color: void 0, fontSize: "11px", fontFamily: void 0, fontWeight: 400, cssClass: "", padding: { left: 5, right: 5, top: 2, bottom: 2 } } } }, this.text = { x: 0, y: 0, text: "", textAnchor: "start", foreColor: void 0, fontSize: "13px", fontFamily: void 0, fontWeight: 400, appendTo: ".apexcharts-annotations", backgroundColor: "transparent", borderColor: "#c2c2c2", borderRadius: 0, borderWidth: 0, paddingLeft: 4, paddingRight: 4, paddingTop: 2, paddingBottom: 2 } } return r(t, [{ key: "init", value: function () { return { annotations: { yaxis: [this.yAxisAnnotation], xaxis: [this.xAxisAnnotation], points: [this.pointAnnotation], texts: [], images: [], shapes: [] }, chart: { animations: { enabled: !0, easing: "easeinout", speed: 800, animateGradually: { delay: 150, enabled: !0 }, dynamicAnimation: { enabled: !0, speed: 350 } }, background: "transparent", locales: [M], defaultLocale: "en", dropShadow: { enabled: !1, enabledOnSeries: void 0, top: 2, left: 2, blur: 4, color: "#000", opacity: .35 }, events: { animationEnd: void 0, beforeMount: void 0, mounted: void 0, updated: void 0, click: void 0, mouseMove: void 0, mouseLeave: void 0, xAxisLabelClick: void 0, legendClick: void 0, markerClick: void 0, selection: void 0, dataPointSelection: void 0, dataPointMouseEnter: void 0, dataPointMouseLeave: void 0, beforeZoom: void 0, beforeResetZoom: void 0, zoomed: void 0, scrolled: void 0, brushScrolled: void 0 }, foreColor: "#373d3f", fontFamily: "Helvetica, Arial, sans-serif", height: "auto", parentHeightOffset: 15, redrawOnParentResize: !0, redrawOnWindowResize: !0, id: void 0, group: void 0, nonce: void 0, offsetX: 0, offsetY: 0, selection: { enabled: !1, type: "x", fill: { color: "#24292e", opacity: .1 }, stroke: { width: 1, color: "#24292e", opacity: .4, dashArray: 3 }, xaxis: { min: void 0, max: void 0 }, yaxis: { min: void 0, max: void 0 } }, sparkline: { enabled: !1 }, brush: { enabled: !1, autoScaleYaxis: !0, target: void 0, targets: void 0 }, stacked: !1, stackOnlyBar: !0, stackType: "normal", toolbar: { show: !0, offsetX: 0, offsetY: 0, tools: { download: !0, selection: !0, zoom: !0, zoomin: !0, zoomout: !0, pan: !0, reset: !0, customIcons: [] }, export: { csv: { filename: void 0, columnDelimiter: ",", headerCategory: "category", headerValue: "value", dateFormatter: function (t) { return new Date(t).toDateString() } }, png: { filename: void 0 }, svg: { filename: void 0 } }, autoSelected: "zoom" }, type: "line", width: "100%", zoom: { enabled: !0, type: "x", autoScaleYaxis: !1, zoomedArea: { fill: { color: "#90CAF9", opacity: .4 }, stroke: { color: "#0D47A1", opacity: .4, width: 1 } } } }, plotOptions: { line: { isSlopeChart: !1 }, area: { fillTo: "origin" }, bar: { horizontal: !1, columnWidth: "70%", barHeight: "70%", distributed: !1, borderRadius: 0, borderRadiusApplication: "around", borderRadiusWhenStacked: "last", rangeBarOverlap: !0, rangeBarGroupRows: !1, hideZeroBarsWhenGrouped: !1, isDumbbell: !1, dumbbellColors: void 0, isFunnel: !1, isFunnel3d: !0, colors: { ranges: [], backgroundBarColors: [], backgroundBarOpacity: 1, backgroundBarRadius: 0 }, dataLabels: { position: "top", maxItems: 100, hideOverflowingLabels: !0, orientation: "horizontal", total: { enabled: !1, formatter: void 0, offsetX: 0, offsetY: 0, style: { color: "#373d3f", fontSize: "12px", fontFamily: void 0, fontWeight: 600 } } } }, bubble: { zScaling: !0, minBubbleRadius: void 0, maxBubbleRadius: void 0 }, candlestick: { colors: { upward: "#00B746", downward: "#EF403C" }, wick: { useFillColor: !0 } }, boxPlot: { colors: { upper: "#00E396", lower: "#008FFB" } }, heatmap: { radius: 2, enableShades: !0, shadeIntensity: .5, reverseNegativeShade: !1, distributed: !1, useFillColorAsStroke: !1, colorScale: { inverse: !1, ranges: [], min: void 0, max: void 0 } }, treemap: { enableShades: !0, shadeIntensity: .5, distributed: !1, reverseNegativeShade: !1, useFillColorAsStroke: !1, borderRadius: 4, dataLabels: { format: "scale" }, colorScale: { inverse: !1, ranges: [], min: void 0, max: void 0 } }, radialBar: { inverseOrder: !1, startAngle: 0, endAngle: 360, offsetX: 0, offsetY: 0, hollow: { margin: 5, size: "50%", background: "transparent", image: void 0, imageWidth: 150, imageHeight: 150, imageOffsetX: 0, imageOffsetY: 0, imageClipped: !0, position: "front", dropShadow: { enabled: !1, top: 0, left: 0, blur: 3, color: "#000", opacity: .5 } }, track: { show: !0, startAngle: void 0, endAngle: void 0, background: "#f2f2f2", strokeWidth: "97%", opacity: 1, margin: 5, dropShadow: { enabled: !1, top: 0, left: 0, blur: 3, color: "#000", opacity: .5 } }, dataLabels: { show: !0, name: { show: !0, fontSize: "16px", fontFamily: void 0, fontWeight: 600, color: void 0, offsetY: 0, formatter: function (t) { return t } }, value: { show: !0, fontSize: "14px", fontFamily: void 0, fontWeight: 400, color: void 0, offsetY: 16, formatter: function (t) { return t + "%" } }, total: { show: !1, label: "Total", fontSize: "16px", fontWeight: 600, fontFamily: void 0, color: void 0, formatter: function (t) { return t.globals.seriesTotals.reduce((function (t, e) { return t + e }), 0) / t.globals.series.length + "%" } } }, barLabels: { enabled: !1, margin: 5, useSeriesColors: !0, fontFamily: void 0, fontWeight: 600, fontSize: "16px", formatter: function (t) { return t }, onClick: void 0 } }, pie: { customScale: 1, offsetX: 0, offsetY: 0, startAngle: 0, endAngle: 360, expandOnClick: !0, dataLabels: { offset: 0, minAngleToShowLabel: 10 }, donut: { size: "65%", background: "transparent", labels: { show: !1, name: { show: !0, fontSize: "16px", fontFamily: void 0, fontWeight: 600, color: void 0, offsetY: -10, formatter: function (t) { return t } }, value: { show: !0, fontSize: "20px", fontFamily: void 0, fontWeight: 400, color: void 0, offsetY: 10, formatter: function (t) { return t } }, total: { show: !1, showAlways: !1, label: "Total", fontSize: "16px", fontWeight: 400, fontFamily: void 0, color: void 0, formatter: function (t) { return t.globals.seriesTotals.reduce((function (t, e) { return t + e }), 0) } } } } }, polarArea: { rings: { strokeWidth: 1, strokeColor: "#e8e8e8" }, spokes: { strokeWidth: 1, connectorColors: "#e8e8e8" } }, radar: { size: void 0, offsetX: 0, offsetY: 0, polygons: { strokeWidth: 1, strokeColors: "#e8e8e8", connectorColors: "#e8e8e8", fill: { colors: void 0 } } } }, colors: void 0, dataLabels: { enabled: !0, enabledOnSeries: void 0, formatter: function (t) { return null !== t ? t : "" }, textAnchor: "middle", distributed: !1, offsetX: 0, offsetY: 0, style: { fontSize: "12px", fontFamily: void 0, fontWeight: 600, colors: void 0 }, background: { enabled: !0, foreColor: "#fff", borderRadius: 2, padding: 4, opacity: .9, borderWidth: 1, borderColor: "#fff", dropShadow: { enabled: !1, top: 1, left: 1, blur: 1, color: "#000", opacity: .45 } }, dropShadow: { enabled: !1, top: 1, left: 1, blur: 1, color: "#000", opacity: .45 } }, fill: { type: "solid", colors: void 0, opacity: .85, gradient: { shade: "dark", type: "horizontal", shadeIntensity: .5, gradientToColors: void 0, inverseColors: !0, opacityFrom: 1, opacityTo: 1, stops: [0, 50, 100], colorStops: [] }, image: { src: [], width: void 0, height: void 0 }, pattern: { style: "squares", width: 6, height: 6, strokeWidth: 2 } }, forecastDataPoints: { count: 0, fillOpacity: .5, strokeWidth: void 0, dashArray: 4 }, grid: { show: !0, borderColor: "#e0e0e0", strokeDashArray: 0, position: "back", xaxis: { lines: { show: !1 } }, yaxis: { lines: { show: !0 } }, row: { colors: void 0, opacity: .5 }, column: { colors: void 0, opacity: .5 }, padding: { top: 0, right: 10, bottom: 0, left: 12 } }, labels: [], legend: { show: !0, showForSingleSeries: !1, showForNullSeries: !0, showForZeroSeries: !0, floating: !1, position: "bottom", horizontalAlign: "center", inverseOrder: !1, fontSize: "12px", fontFamily: void 0, fontWeight: 400, width: void 0, height: void 0, formatter: void 0, tooltipHoverFormatter: void 0, offsetX: -20, offsetY: 4, customLegendItems: [], labels: { colors: void 0, useSeriesColors: !1 }, markers: { width: 12, height: 12, strokeWidth: 0, fillColors: void 0, strokeColor: "#fff", radius: 12, customHTML: void 0, offsetX: 0, offsetY: 0, onClick: void 0 }, itemMargin: { horizontal: 5, vertical: 2 }, onItemClick: { toggleDataSeries: !0 }, onItemHover: { highlightDataSeries: !0 } }, markers: { discrete: [], size: 0, colors: void 0, strokeColors: "#fff", strokeWidth: 2, strokeOpacity: .9, strokeDashArray: 0, fillOpacity: 1, shape: "circle", width: 8, height: 8, radius: 2, offsetX: 0, offsetY: 0, onClick: void 0, onDblClick: void 0, showNullDataPoints: !0, hover: { size: void 0, sizeOffset: 3 } }, noData: { text: void 0, align: "center", verticalAlign: "middle", offsetX: 0, offsetY: 0, style: { color: void 0, fontSize: "14px", fontFamily: void 0 } }, responsive: [], series: void 0, states: { normal: { filter: { type: "none", value: 0 } }, hover: { filter: { type: "lighten", value: .1 } }, active: { allowMultipleDataPointsSelection: !1, filter: { type: "darken", value: .5 } } }, title: { text: void 0, align: "left", margin: 5, offsetX: 0, offsetY: 0, floating: !1, style: { fontSize: "14px", fontWeight: 900, fontFamily: void 0, color: void 0 } }, subtitle: { text: void 0, align: "left", margin: 5, offsetX: 0, offsetY: 30, floating: !1, style: { fontSize: "12px", fontWeight: 400, fontFamily: void 0, color: void 0 } }, stroke: { show: !0, curve: "smooth", lineCap: "butt", width: 2, colors: void 0, dashArray: 0, fill: { type: "solid", colors: void 0, opacity: .85, gradient: { shade: "dark", type: "horizontal", shadeIntensity: .5, gradientToColors: void 0, inverseColors: !0, opacityFrom: 1, opacityTo: 1, stops: [0, 50, 100], colorStops: [] } } }, tooltip: { enabled: !0, enabledOnSeries: void 0, shared: !0, hideEmptySeries: !1, followCursor: !1, intersect: !1, inverseOrder: !1, custom: void 0, fillSeriesColor: !1, theme: "light", cssClass: "", style: { fontSize: "12px", fontFamily: void 0 }, onDatasetHover: { highlightDataSeries: !1 }, x: { show: !0, format: "dd MMM", formatter: void 0 }, y: { formatter: void 0, title: { formatter: function (t) { return t ? t + ": " : "" } } }, z: { formatter: void 0, title: "Size: " }, marker: { show: !0, fillColors: void 0 }, items: { display: "flex" }, fixed: { enabled: !1, position: "topRight", offsetX: 0, offsetY: 0 } }, xaxis: { type: "category", categories: [], convertedCatToNumeric: !1, offsetX: 0, offsetY: 0, overwriteCategories: void 0, labels: { show: !0, rotate: -45, rotateAlways: !1, hideOverlappingLabels: !0, trim: !1, minHeight: void 0, maxHeight: 120, showDuplicates: !0, style: { colors: [], fontSize: "12px", fontWeight: 400, fontFamily: void 0, cssClass: "" }, offsetX: 0, offsetY: 0, format: void 0, formatter: void 0, datetimeUTC: !0, datetimeFormatter: { year: "yyyy", month: "MMM 'yy", day: "dd MMM", hour: "HH:mm", minute: "HH:mm:ss", second: "HH:mm:ss" } }, group: { groups: [], style: { colors: [], fontSize: "12px", fontWeight: 400, fontFamily: void 0, cssClass: "" } }, axisBorder: { show: !0, color: "#e0e0e0", width: "100%", height: 1, offsetX: 0, offsetY: 0 }, axisTicks: { show: !0, color: "#e0e0e0", height: 6, offsetX: 0, offsetY: 0 }, stepSize: void 0, tickAmount: void 0, tickPlacement: "on", min: void 0, max: void 0, range: void 0, floating: !1, decimalsInFloat: void 0, position: "bottom", title: { text: void 0, offsetX: 0, offsetY: 0, style: { color: void 0, fontSize: "12px", fontWeight: 900, fontFamily: void 0, cssClass: "" } }, crosshairs: { show: !0, width: 1, position: "back", opacity: .9, stroke: { color: "#b6b6b6", width: 1, dashArray: 3 }, fill: { type: "solid", color: "#B1B9C4", gradient: { colorFrom: "#D8E3F0", colorTo: "#BED1E6", stops: [0, 100], opacityFrom: .4, opacityTo: .5 } }, dropShadow: { enabled: !1, left: 0, top: 0, blur: 1, opacity: .4 } }, tooltip: { enabled: !0, offsetY: 0, formatter: void 0, style: { fontSize: "12px", fontFamily: void 0 } } }, yaxis: this.yAxis, theme: { mode: "light", palette: "palette1", monochrome: { enabled: !1, color: "#008FFB", shadeTo: "light", shadeIntensity: .65 } } } } }]), t }(), T = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w, this.graphics = new m(this.ctx), this.w.globals.isBarHorizontal && (this.invertAxis = !0), this.helpers = new w(this), this.xAxisAnnotations = new k(this), this.yAxisAnnotations = new L(this), this.pointsAnnotations = new P(this), this.w.globals.isBarHorizontal && this.w.config.yaxis[0].reversed && (this.inversedReversedAxis = !0), this.xDivision = this.w.globals.gridWidth / this.w.globals.dataPoints } return r(t, [{ key: "drawAxesAnnotations", value: function () { var t = this.w; if (t.globals.axisCharts) { for (var e = this.yAxisAnnotations.drawYAxisAnnotations(), i = this.xAxisAnnotations.drawXAxisAnnotations(), a = this.pointsAnnotations.drawPointAnnotations(), s = t.config.chart.animations.enabled, r = [e, i, a], o = [i.node, e.node, a.node], n = 0; n < 3; n++)t.globals.dom.elGraphical.add(r[n]), !s || t.globals.resized || t.globals.dataChanged || "scatter" !== t.config.chart.type && "bubble" !== t.config.chart.type && t.globals.dataPoints > 1 && o[n].classList.add("apexcharts-element-hidden"), t.globals.delayedElements.push({ el: o[n], index: 0 }); this.helpers.annotationsBackground() } } }, { key: "drawImageAnnos", value: function () { var t = this; this.w.config.annotations.images.map((function (e, i) { t.addImage(e, i) })) } }, { key: "drawTextAnnos", value: function () { var t = this; this.w.config.annotations.texts.map((function (e, i) { t.addText(e, i) })) } }, { key: "addXaxisAnnotation", value: function (t, e, i) { this.xAxisAnnotations.addXaxisAnnotation(t, e, i) } }, { key: "addYaxisAnnotation", value: function (t, e, i) { this.yAxisAnnotations.addYaxisAnnotation(t, e, i) } }, { key: "addPointAnnotation", value: function (t, e, i) { this.pointsAnnotations.addPointAnnotation(t, e, i) } }, { key: "addText", value: function (t, e) { var i = t.x, a = t.y, s = t.text, r = t.textAnchor, o = t.foreColor, n = t.fontSize, l = t.fontFamily, h = t.fontWeight, c = t.cssClass, d = t.backgroundColor, g = t.borderWidth, u = t.strokeDashArray, p = t.borderRadius, f = t.borderColor, x = t.appendTo, b = void 0 === x ? ".apexcharts-svg" : x, v = t.paddingLeft, m = void 0 === v ? 4 : v, y = t.paddingRight, w = void 0 === y ? 4 : y, k = t.paddingBottom, A = void 0 === k ? 2 : k, S = t.paddingTop, C = void 0 === S ? 2 : S, L = this.w, P = this.graphics.drawText({ x: i, y: a, text: s, textAnchor: r || "start", fontSize: n || "12px", fontWeight: h || "regular", fontFamily: l || L.config.chart.fontFamily, foreColor: o || L.config.chart.foreColor, cssClass: c }), M = L.globals.dom.baseEl.querySelector(b); M && M.appendChild(P.node); var I = P.bbox(); if (s) { var T = this.graphics.drawRect(I.x - m, I.y - C, I.width + m + w, I.height + A + C, p, d || "transparent", 1, g, f, u); M.insertBefore(T.node, P.node) } } }, { key: "addImage", value: function (t, e) { var i = this.w, a = t.path, s = t.x, r = void 0 === s ? 0 : s, o = t.y, n = void 0 === o ? 0 : o, l = t.width, h = void 0 === l ? 20 : l, c = t.height, d = void 0 === c ? 20 : c, g = t.appendTo, u = void 0 === g ? ".apexcharts-svg" : g, p = i.globals.dom.Paper.image(a); p.size(h, d).move(r, n); var f = i.globals.dom.baseEl.querySelector(u); return f && f.appendChild(p.node), p } }, { key: "addXaxisAnnotationExternal", value: function (t, e, i) { return this.addAnnotationExternal({ params: t, pushToMemory: e, context: i, type: "xaxis", contextMethod: i.addXaxisAnnotation }), i } }, { key: "addYaxisAnnotationExternal", value: function (t, e, i) { return this.addAnnotationExternal({ params: t, pushToMemory: e, context: i, type: "yaxis", contextMethod: i.addYaxisAnnotation }), i } }, { key: "addPointAnnotationExternal", value: function (t, e, i) { return void 0 === this.invertAxis && (this.invertAxis = i.w.globals.isBarHorizontal), this.addAnnotationExternal({ params: t, pushToMemory: e, context: i, type: "point", contextMethod: i.addPointAnnotation }), i } }, { key: "addAnnotationExternal", value: function (t) { var e = t.params, i = t.pushToMemory, a = t.context, s = t.type, r = t.contextMethod, o = a, n = o.w, l = n.globals.dom.baseEl.querySelector(".apexcharts-".concat(s, "-annotations")), h = l.childNodes.length + 1, c = new I, d = Object.assign({}, "xaxis" === s ? c.xAxisAnnotation : "yaxis" === s ? c.yAxisAnnotation : c.pointAnnotation), g = x.extend(d, e); switch (s) { case "xaxis": this.addXaxisAnnotation(g, l, h); break; case "yaxis": this.addYaxisAnnotation(g, l, h); break; case "point": this.addPointAnnotation(g, l, h) }var u = n.globals.dom.baseEl.querySelector(".apexcharts-".concat(s, "-annotations .apexcharts-").concat(s, "-annotation-label[rel='").concat(h, "']")), p = this.helpers.addBackgroundToAnno(u, g); return p && l.insertBefore(p.node, u), i && n.globals.memory.methodsToExec.push({ context: o, id: g.id ? g.id : x.randomId(), method: r, label: "addAnnotation", params: e }), a } }, { key: "clearAnnotations", value: function (t) { var e = t.w, i = e.globals.dom.baseEl.querySelectorAll(".apexcharts-yaxis-annotations, .apexcharts-xaxis-annotations, .apexcharts-point-annotations"); e.globals.memory.methodsToExec.map((function (t, i) { "addText" !== t.label && "addAnnotation" !== t.label || e.globals.memory.methodsToExec.splice(i, 1) })), i = x.listToArray(i), Array.prototype.forEach.call(i, (function (t) { for (; t.firstChild;)t.removeChild(t.firstChild) })) } }, { key: "removeAnnotation", value: function (t, e) { var i = t.w, a = i.globals.dom.baseEl.querySelectorAll(".".concat(e)); a && (i.globals.memory.methodsToExec.map((function (t, a) { t.id === e && i.globals.memory.methodsToExec.splice(a, 1) })), Array.prototype.forEach.call(a, (function (t) { t.parentElement.removeChild(t) }))) } }]), t }(), z = function (t) { var e, i = t.isTimeline, a = t.ctx, s = t.seriesIndex, r = t.dataPointIndex, o = t.y1, n = t.y2, l = t.w, h = l.globals.seriesRangeStart[s][r], c = l.globals.seriesRangeEnd[s][r], d = l.globals.labels[r], g = l.config.series[s].name ? l.config.series[s].name : "", u = l.globals.ttKeyFormatter, p = l.config.tooltip.y.title.formatter, f = { w: l, seriesIndex: s, dataPointIndex: r, start: h, end: c }; ("function" == typeof p && (g = p(g, f)), null !== (e = l.config.series[s].data[r]) && void 0 !== e && e.x && (d = l.config.series[s].data[r].x), i) || "datetime" === l.config.xaxis.type && (d = new S(a).xLabelFormat(l.globals.ttKeyFormatter, d, d, { i: void 0, dateFormatter: new A(a).formatDate, w: l })); "function" == typeof u && (d = u(d, f)), Number.isFinite(o) && Number.isFinite(n) && (h = o, c = n); var x = "", b = "", v = l.globals.colors[s]; if (void 0 === l.config.tooltip.x.formatter) if ("datetime" === l.config.xaxis.type) { var m = new A(a); x = m.formatDate(m.getDate(h), l.config.tooltip.x.format), b = m.formatDate(m.getDate(c), l.config.tooltip.x.format) } else x = h, b = c; else x = l.config.tooltip.x.formatter(h), b = l.config.tooltip.x.formatter(c); return { start: h, end: c, startVal: x, endVal: b, ylabel: d, color: v, seriesName: g } }, X = function (t) { var e = t.color, i = t.seriesName, a = t.ylabel, s = t.start, r = t.end, o = t.seriesIndex, n = t.dataPointIndex, l = t.ctx.tooltip.tooltipLabels.getFormatters(o); s = l.yLbFormatter(s), r = l.yLbFormatter(r); var h = l.yLbFormatter(t.w.globals.series[o][n]), c = '\n '.concat(s, '\n - \n ').concat(r, "\n "); return '
' + (i || "") + '
' + a + ": " + (t.w.globals.comboCharts ? "rangeArea" === t.w.config.series[o].type || "rangeBar" === t.w.config.series[o].type ? c : "".concat(h, "") : c) + "
" }, E = function () { function t(e) { a(this, t), this.opts = e } return r(t, [{ key: "hideYAxis", value: function () { this.opts.yaxis[0].show = !1, this.opts.yaxis[0].title.text = "", this.opts.yaxis[0].axisBorder.show = !1, this.opts.yaxis[0].axisTicks.show = !1, this.opts.yaxis[0].floating = !0 } }, { key: "line", value: function () { return { chart: { animations: { easing: "swing" } }, dataLabels: { enabled: !1 }, stroke: { width: 5, curve: "straight" }, markers: { size: 0, hover: { sizeOffset: 6 } }, xaxis: { crosshairs: { width: 1 } } } } }, { key: "sparkline", value: function (t) { this.hideYAxis(); return x.extend(t, { grid: { show: !1, padding: { left: 0, right: 0, top: 0, bottom: 0 } }, legend: { show: !1 }, xaxis: { labels: { show: !1 }, tooltip: { enabled: !1 }, axisBorder: { show: !1 }, axisTicks: { show: !1 } }, chart: { toolbar: { show: !1 }, zoom: { enabled: !1 } }, dataLabels: { enabled: !1 } }) } }, { key: "slope", value: function () { return this.hideYAxis(), { chart: { toolbar: { show: !1 }, zoom: { enabled: !1 } }, dataLabels: { enabled: !0, formatter: function (t, e) { var i = e.w.config.series[e.seriesIndex].name; return null !== t ? i + ": " + t : "" }, background: { enabled: !1 }, offsetX: -5 }, grid: { xaxis: { lines: { show: !0 } }, yaxis: { lines: { show: !1 } } }, xaxis: { position: "top", labels: { style: { fontSize: 14, fontWeight: 900 } }, tooltip: { enabled: !1 }, crosshairs: { show: !1 } }, markers: { size: 8, hover: { sizeOffset: 1 } }, legend: { show: !1 }, tooltip: { shared: !1, intersect: !0, followCursor: !0 }, stroke: { width: 5, curve: "straight" } } } }, { key: "bar", value: function () { return { chart: { stacked: !1, animations: { easing: "swing" } }, plotOptions: { bar: { dataLabels: { position: "center" } } }, dataLabels: { style: { colors: ["#fff"] }, background: { enabled: !1 } }, stroke: { width: 0, lineCap: "round" }, fill: { opacity: .85 }, legend: { markers: { shape: "square", radius: 2, size: 8 } }, tooltip: { shared: !1, intersect: !0 }, xaxis: { tooltip: { enabled: !1 }, tickPlacement: "between", crosshairs: { width: "barWidth", position: "back", fill: { type: "gradient" }, dropShadow: { enabled: !1 }, stroke: { width: 0 } } } } } }, { key: "funnel", value: function () { return this.hideYAxis(), e(e({}, this.bar()), {}, { chart: { animations: { easing: "linear", speed: 800, animateGradually: { enabled: !1 } } }, plotOptions: { bar: { horizontal: !0, borderRadiusApplication: "around", borderRadius: 0, dataLabels: { position: "center" } } }, grid: { show: !1, padding: { left: 0, right: 0 } }, xaxis: { labels: { show: !1 }, tooltip: { enabled: !1 }, axisBorder: { show: !1 }, axisTicks: { show: !1 } } }) } }, { key: "candlestick", value: function () { var t = this; return { stroke: { width: 1, colors: ["#333"] }, fill: { opacity: 1 }, dataLabels: { enabled: !1 }, tooltip: { shared: !0, custom: function (e) { var i = e.seriesIndex, a = e.dataPointIndex, s = e.w; return t._getBoxTooltip(s, i, a, ["Open", "High", "", "Low", "Close"], "candlestick") } }, states: { active: { filter: { type: "none" } } }, xaxis: { crosshairs: { width: 1 } } } } }, { key: "boxPlot", value: function () { var t = this; return { chart: { animations: { dynamicAnimation: { enabled: !1 } } }, stroke: { width: 1, colors: ["#24292e"] }, dataLabels: { enabled: !1 }, tooltip: { shared: !0, custom: function (e) { var i = e.seriesIndex, a = e.dataPointIndex, s = e.w; return t._getBoxTooltip(s, i, a, ["Minimum", "Q1", "Median", "Q3", "Maximum"], "boxPlot") } }, markers: { size: 5, strokeWidth: 1, strokeColors: "#111" }, xaxis: { crosshairs: { width: 1 } } } } }, { key: "rangeBar", value: function () { return { chart: { animations: { animateGradually: !1 } }, stroke: { width: 0, lineCap: "square" }, plotOptions: { bar: { borderRadius: 0, dataLabels: { position: "center" } } }, dataLabels: { enabled: !1, formatter: function (t, e) { e.ctx; var i = e.seriesIndex, a = e.dataPointIndex, s = e.w, r = function () { var t = s.globals.seriesRangeStart[i][a]; return s.globals.seriesRangeEnd[i][a] - t }; return s.globals.comboCharts ? "rangeBar" === s.config.series[i].type || "rangeArea" === s.config.series[i].type ? r() : t : r() }, background: { enabled: !1 }, style: { colors: ["#fff"] } }, markers: { size: 10 }, tooltip: { shared: !1, followCursor: !0, custom: function (t) { return t.w.config.plotOptions && t.w.config.plotOptions.bar && t.w.config.plotOptions.bar.horizontal ? function (t) { var i = z(e(e({}, t), {}, { isTimeline: !0 })), a = i.color, s = i.seriesName, r = i.ylabel, o = i.startVal, n = i.endVal; return X(e(e({}, t), {}, { color: a, seriesName: s, ylabel: r, start: o, end: n })) }(t) : function (t) { var i = z(t), a = i.color, s = i.seriesName, r = i.ylabel, o = i.start, n = i.end; return X(e(e({}, t), {}, { color: a, seriesName: s, ylabel: r, start: o, end: n })) }(t) } }, xaxis: { tickPlacement: "between", tooltip: { enabled: !1 }, crosshairs: { stroke: { width: 0 } } } } } }, { key: "dumbbell", value: function (t) { var e, i; return null !== (e = t.plotOptions.bar) && void 0 !== e && e.barHeight || (t.plotOptions.bar.barHeight = 2), null !== (i = t.plotOptions.bar) && void 0 !== i && i.columnWidth || (t.plotOptions.bar.columnWidth = 2), t } }, { key: "area", value: function () { return { stroke: { width: 4, fill: { type: "solid", gradient: { inverseColors: !1, shade: "light", type: "vertical", opacityFrom: .65, opacityTo: .5, stops: [0, 100, 100] } } }, fill: { type: "gradient", gradient: { inverseColors: !1, shade: "light", type: "vertical", opacityFrom: .65, opacityTo: .5, stops: [0, 100, 100] } }, markers: { size: 0, hover: { sizeOffset: 6 } }, tooltip: { followCursor: !1 } } } }, { key: "rangeArea", value: function () { return { stroke: { curve: "straight", width: 0 }, fill: { type: "solid", opacity: .6 }, markers: { size: 0 }, states: { hover: { filter: { type: "none" } }, active: { filter: { type: "none" } } }, tooltip: { intersect: !1, shared: !0, followCursor: !0, custom: function (t) { return function (t) { var i = z(t), a = i.color, s = i.seriesName, r = i.ylabel, o = i.start, n = i.end; return X(e(e({}, t), {}, { color: a, seriesName: s, ylabel: r, start: o, end: n })) }(t) } } } } }, { key: "brush", value: function (t) { return x.extend(t, { chart: { toolbar: { autoSelected: "selection", show: !1 }, zoom: { enabled: !1 } }, dataLabels: { enabled: !1 }, stroke: { width: 1 }, tooltip: { enabled: !1 }, xaxis: { tooltip: { enabled: !1 } } }) } }, { key: "stacked100", value: function (t) { t.dataLabels = t.dataLabels || {}, t.dataLabels.formatter = t.dataLabels.formatter || void 0; var e = t.dataLabels.formatter; return t.yaxis.forEach((function (e, i) { t.yaxis[i].min = 0, t.yaxis[i].max = 100 })), "bar" === t.chart.type && (t.dataLabels.formatter = e || function (t) { return "number" == typeof t && t ? t.toFixed(0) + "%" : t }), t } }, { key: "stackedBars", value: function () { var t = this.bar(); return e(e({}, t), {}, { plotOptions: e(e({}, t.plotOptions), {}, { bar: e(e({}, t.plotOptions.bar), {}, { borderRadiusApplication: "end", borderRadiusWhenStacked: "last" }) }) }) } }, { key: "convertCatToNumeric", value: function (t) { return t.xaxis.convertedCatToNumeric = !0, t } }, { key: "convertCatToNumericXaxis", value: function (t, e, i) { t.xaxis.type = "numeric", t.xaxis.labels = t.xaxis.labels || {}, t.xaxis.labels.formatter = t.xaxis.labels.formatter || function (t) { return x.isNumber(t) ? Math.floor(t) : t }; var a = t.xaxis.labels.formatter, s = t.xaxis.categories && t.xaxis.categories.length ? t.xaxis.categories : t.labels; return i && i.length && (s = i.map((function (t) { return Array.isArray(t) ? t : String(t) }))), s && s.length && (t.xaxis.labels.formatter = function (t) { return x.isNumber(t) ? a(s[Math.floor(t) - 1]) : a(t) }), t.xaxis.categories = [], t.labels = [], t.xaxis.tickAmount = t.xaxis.tickAmount || "dataPoints", t } }, { key: "bubble", value: function () { return { dataLabels: { style: { colors: ["#fff"] } }, tooltip: { shared: !1, intersect: !0 }, xaxis: { crosshairs: { width: 0 } }, fill: { type: "solid", gradient: { shade: "light", inverse: !0, shadeIntensity: .55, opacityFrom: .4, opacityTo: .8 } } } } }, { key: "scatter", value: function () { return { dataLabels: { enabled: !1 }, tooltip: { shared: !1, intersect: !0 }, markers: { size: 6, strokeWidth: 1, hover: { sizeOffset: 2 } } } } }, { key: "heatmap", value: function () { return { chart: { stacked: !1 }, fill: { opacity: 1 }, dataLabels: { style: { colors: ["#fff"] } }, stroke: { colors: ["#fff"] }, tooltip: { followCursor: !0, marker: { show: !1 }, x: { show: !1 } }, legend: { position: "top", markers: { shape: "square", size: 10, offsetY: 2 } }, grid: { padding: { right: 20 } } } } }, { key: "treemap", value: function () { return { chart: { zoom: { enabled: !1 } }, dataLabels: { style: { fontSize: 14, fontWeight: 600, colors: ["#fff"] } }, stroke: { show: !0, width: 2, colors: ["#fff"] }, legend: { show: !1 }, fill: { gradient: { stops: [0, 100] } }, tooltip: { followCursor: !0, x: { show: !1 } }, grid: { padding: { left: 0, right: 0 } }, xaxis: { crosshairs: { show: !1 }, tooltip: { enabled: !1 } } } } }, { key: "pie", value: function () { return { chart: { toolbar: { show: !1 } }, plotOptions: { pie: { donut: { labels: { show: !1 } } } }, dataLabels: { formatter: function (t) { return t.toFixed(1) + "%" }, style: { colors: ["#fff"] }, background: { enabled: !1 }, dropShadow: { enabled: !0 } }, stroke: { colors: ["#fff"] }, fill: { opacity: 1, gradient: { shade: "light", stops: [0, 100] } }, tooltip: { theme: "dark", fillSeriesColor: !0 }, legend: { position: "right" } } } }, { key: "donut", value: function () { return { chart: { toolbar: { show: !1 } }, dataLabels: { formatter: function (t) { return t.toFixed(1) + "%" }, style: { colors: ["#fff"] }, background: { enabled: !1 }, dropShadow: { enabled: !0 } }, stroke: { colors: ["#fff"] }, fill: { opacity: 1, gradient: { shade: "light", shadeIntensity: .35, stops: [80, 100], opacityFrom: 1, opacityTo: 1 } }, tooltip: { theme: "dark", fillSeriesColor: !0 }, legend: { position: "right" } } } }, { key: "polarArea", value: function () { return { chart: { toolbar: { show: !1 } }, dataLabels: { formatter: function (t) { return t.toFixed(1) + "%" }, enabled: !1 }, stroke: { show: !0, width: 2 }, fill: { opacity: .7 }, tooltip: { theme: "dark", fillSeriesColor: !0 }, legend: { position: "right" } } } }, { key: "radar", value: function () { return this.opts.yaxis[0].labels.offsetY = this.opts.yaxis[0].labels.offsetY ? this.opts.yaxis[0].labels.offsetY : 6, { dataLabels: { enabled: !1, style: { fontSize: "11px" } }, stroke: { width: 2 }, markers: { size: 3, strokeWidth: 1, strokeOpacity: 1 }, fill: { opacity: .2 }, tooltip: { shared: !1, intersect: !0, followCursor: !0 }, grid: { show: !1 }, xaxis: { labels: { formatter: function (t) { return t }, style: { colors: ["#a8a8a8"], fontSize: "11px" } }, tooltip: { enabled: !1 }, crosshairs: { show: !1 } } } } }, { key: "radialBar", value: function () { return { chart: { animations: { dynamicAnimation: { enabled: !0, speed: 800 } }, toolbar: { show: !1 } }, fill: { gradient: { shade: "dark", shadeIntensity: .4, inverseColors: !1, type: "diagonal2", opacityFrom: 1, opacityTo: 1, stops: [70, 98, 100] } }, legend: { show: !1, position: "right" }, tooltip: { enabled: !1, fillSeriesColor: !0 } } } }, { key: "_getBoxTooltip", value: function (t, e, i, a, s) { var r = t.globals.seriesCandleO[e][i], o = t.globals.seriesCandleH[e][i], n = t.globals.seriesCandleM[e][i], l = t.globals.seriesCandleL[e][i], h = t.globals.seriesCandleC[e][i]; return t.config.series[e].type && t.config.series[e].type !== s ? '
\n '.concat(t.config.series[e].name ? t.config.series[e].name : "series-" + (e + 1), ": ").concat(t.globals.series[e][i], "\n
") : '
') + "
".concat(a[0], ': ') + r + "
" + "
".concat(a[1], ': ') + o + "
" + (n ? "
".concat(a[2], ': ') + n + "
" : "") + "
".concat(a[3], ': ') + l + "
" + "
".concat(a[4], ': ') + h + "
" } }]), t }(), Y = function () { function t(e) { a(this, t), this.opts = e } return r(t, [{ key: "init", value: function (t) { var e = t.responsiveOverride, a = this.opts, s = new I, r = new E(a); this.chartType = a.chart.type, a = this.extendYAxis(a), a = this.extendAnnotations(a); var o = s.init(), n = {}; if (a && "object" === i(a)) { var l, h, c, d, g, u, p, f, b, v, m = {}; m = -1 !== ["line", "area", "bar", "candlestick", "boxPlot", "rangeBar", "rangeArea", "bubble", "scatter", "heatmap", "treemap", "pie", "polarArea", "donut", "radar", "radialBar"].indexOf(a.chart.type) ? r[a.chart.type]() : r.line(), null !== (l = a.plotOptions) && void 0 !== l && null !== (h = l.bar) && void 0 !== h && h.isFunnel && (m = r.funnel()), a.chart.stacked && "bar" === a.chart.type && (m = r.stackedBars()), null !== (c = a.chart.brush) && void 0 !== c && c.enabled && (m = r.brush(m)), null !== (d = a.plotOptions) && void 0 !== d && null !== (g = d.line) && void 0 !== g && g.isSlopeChart && (m = r.slope()), a.chart.stacked && "100%" === a.chart.stackType && (a = r.stacked100(a)), null !== (u = a.plotOptions) && void 0 !== u && null !== (p = u.bar) && void 0 !== p && p.isDumbbell && (a = r.dumbbell(a)), this.checkForDarkTheme(window.Apex), this.checkForDarkTheme(a), a.xaxis = a.xaxis || window.Apex.xaxis || {}, e || (a.xaxis.convertedCatToNumeric = !1), (null !== (f = (a = this.checkForCatToNumericXAxis(this.chartType, m, a)).chart.sparkline) && void 0 !== f && f.enabled || null !== (b = window.Apex.chart) && void 0 !== b && null !== (v = b.sparkline) && void 0 !== v && v.enabled) && (m = r.sparkline(m)), n = x.extend(o, m) } var y = x.extend(n, window.Apex); return o = x.extend(y, a), o = this.handleUserInputErrors(o) } }, { key: "checkForCatToNumericXAxis", value: function (t, e, i) { var a, s, r = new E(i), o = ("bar" === t || "boxPlot" === t) && (null === (a = i.plotOptions) || void 0 === a || null === (s = a.bar) || void 0 === s ? void 0 : s.horizontal), n = "pie" === t || "polarArea" === t || "donut" === t || "radar" === t || "radialBar" === t || "heatmap" === t, l = "datetime" !== i.xaxis.type && "numeric" !== i.xaxis.type, h = i.xaxis.tickPlacement ? i.xaxis.tickPlacement : e.xaxis && e.xaxis.tickPlacement; return o || n || !l || "between" === h || (i = r.convertCatToNumeric(i)), i } }, { key: "extendYAxis", value: function (t, e) { var i = new I; (void 0 === t.yaxis || !t.yaxis || Array.isArray(t.yaxis) && 0 === t.yaxis.length) && (t.yaxis = {}), t.yaxis.constructor !== Array && window.Apex.yaxis && window.Apex.yaxis.constructor !== Array && (t.yaxis = x.extend(t.yaxis, window.Apex.yaxis)), t.yaxis.constructor !== Array ? t.yaxis = [x.extend(i.yAxis, t.yaxis)] : t.yaxis = x.extendArray(t.yaxis, i.yAxis); var a = !1; t.yaxis.forEach((function (t) { t.logarithmic && (a = !0) })); var s = t.series; return e && !s && (s = e.config.series), a && s.length !== t.yaxis.length && s.length && (t.yaxis = s.map((function (e, a) { if (e.name || (s[a].name = "series-".concat(a + 1)), t.yaxis[a]) return t.yaxis[a].seriesName = s[a].name, t.yaxis[a]; var r = x.extend(i.yAxis, t.yaxis[0]); return r.show = !1, r }))), a && s.length > 1 && s.length !== t.yaxis.length && console.warn("A multi-series logarithmic chart should have equal number of series and y-axes"), t } }, { key: "extendAnnotations", value: function (t) { return void 0 === t.annotations && (t.annotations = {}, t.annotations.yaxis = [], t.annotations.xaxis = [], t.annotations.points = []), t = this.extendYAxisAnnotations(t), t = this.extendXAxisAnnotations(t), t = this.extendPointAnnotations(t) } }, { key: "extendYAxisAnnotations", value: function (t) { var e = new I; return t.annotations.yaxis = x.extendArray(void 0 !== t.annotations.yaxis ? t.annotations.yaxis : [], e.yAxisAnnotation), t } }, { key: "extendXAxisAnnotations", value: function (t) { var e = new I; return t.annotations.xaxis = x.extendArray(void 0 !== t.annotations.xaxis ? t.annotations.xaxis : [], e.xAxisAnnotation), t } }, { key: "extendPointAnnotations", value: function (t) { var e = new I; return t.annotations.points = x.extendArray(void 0 !== t.annotations.points ? t.annotations.points : [], e.pointAnnotation), t } }, { key: "checkForDarkTheme", value: function (t) { t.theme && "dark" === t.theme.mode && (t.tooltip || (t.tooltip = {}), "light" !== t.tooltip.theme && (t.tooltip.theme = "dark"), t.chart.foreColor || (t.chart.foreColor = "#f6f7f8"), t.chart.background || (t.chart.background = "#424242"), t.theme.palette || (t.theme.palette = "palette4")) } }, { key: "handleUserInputErrors", value: function (t) { var e = t; if (e.tooltip.shared && e.tooltip.intersect) throw new Error("tooltip.shared cannot be enabled when tooltip.intersect is true. Turn off any other option by setting it to false."); if ("bar" === e.chart.type && e.plotOptions.bar.horizontal) { if (e.yaxis.length > 1) throw new Error("Multiple Y Axis for bars are not supported. Switch to column chart by setting plotOptions.bar.horizontal=false"); e.yaxis[0].reversed && (e.yaxis[0].opposite = !0), e.xaxis.tooltip.enabled = !1, e.yaxis[0].tooltip.enabled = !1, e.chart.zoom.enabled = !1 } return "bar" !== e.chart.type && "rangeBar" !== e.chart.type || e.tooltip.shared && "barWidth" === e.xaxis.crosshairs.width && e.series.length > 1 && (e.xaxis.crosshairs.width = "tickWidth"), "candlestick" !== e.chart.type && "boxPlot" !== e.chart.type || e.yaxis[0].reversed && (console.warn("Reversed y-axis in ".concat(e.chart.type, " chart is not supported.")), e.yaxis[0].reversed = !1), e } }]), t }(), F = function () { function t() { a(this, t) } return r(t, [{ key: "initGlobalVars", value: function (t) { t.series = [], t.seriesCandleO = [], t.seriesCandleH = [], t.seriesCandleM = [], t.seriesCandleL = [], t.seriesCandleC = [], t.seriesRangeStart = [], t.seriesRangeEnd = [], t.seriesRange = [], t.seriesPercent = [], t.seriesGoals = [], t.seriesX = [], t.seriesZ = [], t.seriesNames = [], t.seriesTotals = [], t.seriesLog = [], t.seriesColors = [], t.stackedSeriesTotals = [], t.seriesXvalues = [], t.seriesYvalues = [], t.labels = [], t.hasXaxisGroups = !1, t.groups = [], t.barGroups = [], t.lineGroups = [], t.areaGroups = [], t.hasSeriesGroups = !1, t.seriesGroups = [], t.categoryLabels = [], t.timescaleLabels = [], t.noLabelsProvided = !1, t.resizeTimer = null, t.selectionResizeTimer = null, t.delayedElements = [], t.pointsArray = [], t.dataLabelsRects = [], t.isXNumeric = !1, t.skipLastTimelinelabel = !1, t.skipFirstTimelinelabel = !1, t.isDataXYZ = !1, t.isMultiLineX = !1, t.isMultipleYAxis = !1, t.maxY = -Number.MAX_VALUE, t.minY = Number.MIN_VALUE, t.minYArr = [], t.maxYArr = [], t.maxX = -Number.MAX_VALUE, t.minX = Number.MAX_VALUE, t.initialMaxX = -Number.MAX_VALUE, t.initialMinX = Number.MAX_VALUE, t.maxDate = 0, t.minDate = Number.MAX_VALUE, t.minZ = Number.MAX_VALUE, t.maxZ = -Number.MAX_VALUE, t.minXDiff = Number.MAX_VALUE, t.yAxisScale = [], t.xAxisScale = null, t.xAxisTicksPositions = [], t.yLabelsCoords = [], t.yTitleCoords = [], t.barPadForNumericAxis = 0, t.padHorizontal = 0, t.xRange = 0, t.yRange = [], t.zRange = 0, t.dataPoints = 0, t.xTickAmount = 0, t.multiAxisTickAmount = 0 } }, { key: "globalVars", value: function (t) { return { chartID: null, cuid: null, events: { beforeMount: [], mounted: [], updated: [], clicked: [], selection: [], dataPointSelection: [], zoomed: [], scrolled: [] }, colors: [], clientX: null, clientY: null, fill: { colors: [] }, stroke: { colors: [] }, dataLabels: { style: { colors: [] } }, radarPolygons: { fill: { colors: [] } }, markers: { colors: [], size: t.markers.size, largestSize: 0 }, animationEnded: !1, isTouchDevice: "ontouchstart" in window || navigator.msMaxTouchPoints, isDirty: !1, isExecCalled: !1, initialConfig: null, initialSeries: [], lastXAxis: [], lastYAxis: [], columnSeries: null, labels: [], timescaleLabels: [], noLabelsProvided: !1, allSeriesCollapsed: !1, collapsedSeries: [], collapsedSeriesIndices: [], ancillaryCollapsedSeries: [], ancillaryCollapsedSeriesIndices: [], risingSeries: [], dataFormatXNumeric: !1, capturedSeriesIndex: -1, capturedDataPointIndex: -1, selectedDataPoints: [], goldenPadding: 35, invalidLogScale: !1, ignoreYAxisIndexes: [], maxValsInArrayIndex: 0, radialSize: 0, selection: void 0, zoomEnabled: "zoom" === t.chart.toolbar.autoSelected && t.chart.toolbar.tools.zoom && t.chart.zoom.enabled, panEnabled: "pan" === t.chart.toolbar.autoSelected && t.chart.toolbar.tools.pan, selectionEnabled: "selection" === t.chart.toolbar.autoSelected && t.chart.toolbar.tools.selection, yaxis: null, mousedown: !1, lastClientPosition: {}, visibleXRange: void 0, yValueDecimal: 0, total: 0, SVGNS: "http://www.w3.org/2000/svg", svgWidth: 0, svgHeight: 0, noData: !1, locale: {}, dom: {}, memory: { methodsToExec: [] }, shouldAnimate: !0, skipLastTimelinelabel: !1, skipFirstTimelinelabel: !1, delayedElements: [], axisCharts: !0, isDataXYZ: !1, isSlopeChart: t.plotOptions.line.isSlopeChart, resized: !1, resizeTimer: null, comboCharts: !1, dataChanged: !1, previousPaths: [], allSeriesHasEqualX: !0, pointsArray: [], dataLabelsRects: [], lastDrawnDataLabelsIndexes: [], hasNullValues: !1, easing: null, zoomed: !1, gridWidth: 0, gridHeight: 0, rotateXLabels: !1, defaultLabels: !1, xLabelFormatter: void 0, yLabelFormatters: [], xaxisTooltipFormatter: void 0, ttKeyFormatter: void 0, ttVal: void 0, ttZFormatter: void 0, LINE_HEIGHT_RATIO: 1.618, xAxisLabelsHeight: 0, xAxisGroupLabelsHeight: 0, xAxisLabelsWidth: 0, yAxisLabelsWidth: 0, scaleX: 1, scaleY: 1, translateX: 0, translateY: 0, translateYAxisX: [], yAxisWidths: [], translateXAxisY: 0, translateXAxisX: 0, tooltip: null, niceScaleAllowedMagMsd: [[1, 1, 2, 5, 5, 5, 10, 10, 10, 10, 10], [1, 1, 2, 5, 5, 5, 10, 10, 10, 10, 10]], niceScaleDefaultTicks: [1, 2, 4, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 12, 12, 12, 12, 12, 24], seriesYAxisMap: [], seriesYAxisReverseMap: [] } } }, { key: "init", value: function (t) { var e = this.globalVars(t); return this.initGlobalVars(e), e.initialConfig = x.extend({}, t), e.initialSeries = x.clone(t.series), e.lastXAxis = x.clone(e.initialConfig.xaxis), e.lastYAxis = x.clone(e.initialConfig.yaxis), e } }]), t }(), R = function () { function t(e) { a(this, t), this.opts = e } return r(t, [{ key: "init", value: function () { var t = new Y(this.opts).init({ responsiveOverride: !1 }); return { config: t, globals: (new F).init(t) } } }]), t }(), H = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w, this.opts = null, this.seriesIndex = 0 } return r(t, [{ key: "clippedImgArea", value: function (t) { var e = this.w, i = e.config, a = parseInt(e.globals.gridWidth, 10), s = parseInt(e.globals.gridHeight, 10), r = a > s ? a : s, o = t.image, n = 0, l = 0; void 0 === t.width && void 0 === t.height ? void 0 !== i.fill.image.width && void 0 !== i.fill.image.height ? (n = i.fill.image.width + 1, l = i.fill.image.height) : (n = r + 1, l = r) : (n = t.width, l = t.height); var h = document.createElementNS(e.globals.SVGNS, "pattern"); m.setAttrs(h, { id: t.patternID, patternUnits: t.patternUnits ? t.patternUnits : "userSpaceOnUse", width: n + "px", height: l + "px" }); var c = document.createElementNS(e.globals.SVGNS, "image"); h.appendChild(c), c.setAttributeNS(window.SVG.xlink, "href", o), m.setAttrs(c, { x: 0, y: 0, preserveAspectRatio: "none", width: n + "px", height: l + "px" }), c.style.opacity = t.opacity, e.globals.dom.elDefs.node.appendChild(h) } }, { key: "getSeriesIndex", value: function (t) { var e = this.w, i = e.config.chart.type; return ("bar" === i || "rangeBar" === i) && e.config.plotOptions.bar.distributed || "heatmap" === i || "treemap" === i ? this.seriesIndex = t.seriesNumber : this.seriesIndex = t.seriesNumber % e.globals.series.length, this.seriesIndex } }, { key: "fillPath", value: function (t) { var e = this.w; this.opts = t; var i, a, s, r = this.w.config; this.seriesIndex = this.getSeriesIndex(t); var o = this.getFillColors()[this.seriesIndex]; void 0 !== e.globals.seriesColors[this.seriesIndex] && (o = e.globals.seriesColors[this.seriesIndex]), "function" == typeof o && (o = o({ seriesIndex: this.seriesIndex, dataPointIndex: t.dataPointIndex, value: t.value, w: e })); var n = t.fillType ? t.fillType : this.getFillType(this.seriesIndex), l = Array.isArray(r.fill.opacity) ? r.fill.opacity[this.seriesIndex] : r.fill.opacity; t.color && (o = t.color), o || (o = "#fff", console.warn("undefined color - ApexCharts")); var h = o; if (-1 === o.indexOf("rgb") ? o.length < 9 && (h = x.hexToRgba(o, l)) : o.indexOf("rgba") > -1 && (l = x.getOpacityFromRGBA(o)), t.opacity && (l = t.opacity), "pattern" === n && (a = this.handlePatternFill({ fillConfig: t.fillConfig, patternFill: a, fillColor: o, fillOpacity: l, defaultColor: h })), "gradient" === n && (s = this.handleGradientFill({ fillConfig: t.fillConfig, fillColor: o, fillOpacity: l, i: this.seriesIndex })), "image" === n) { var c = r.fill.image.src, d = t.patternID ? t.patternID : ""; this.clippedImgArea({ opacity: l, image: Array.isArray(c) ? t.seriesNumber < c.length ? c[t.seriesNumber] : c[0] : c, width: t.width ? t.width : void 0, height: t.height ? t.height : void 0, patternUnits: t.patternUnits, patternID: "pattern".concat(e.globals.cuid).concat(t.seriesNumber + 1).concat(d) }), i = "url(#pattern".concat(e.globals.cuid).concat(t.seriesNumber + 1).concat(d, ")") } else i = "gradient" === n ? s : "pattern" === n ? a : h; return t.solid && (i = h), i } }, { key: "getFillType", value: function (t) { var e = this.w; return Array.isArray(e.config.fill.type) ? e.config.fill.type[t] : e.config.fill.type } }, { key: "getFillColors", value: function () { var t = this.w, e = t.config, i = this.opts, a = []; return t.globals.comboCharts ? "line" === t.config.series[this.seriesIndex].type ? Array.isArray(t.globals.stroke.colors) ? a = t.globals.stroke.colors : a.push(t.globals.stroke.colors) : Array.isArray(t.globals.fill.colors) ? a = t.globals.fill.colors : a.push(t.globals.fill.colors) : "line" === e.chart.type ? Array.isArray(t.globals.stroke.colors) ? a = t.globals.stroke.colors : a.push(t.globals.stroke.colors) : Array.isArray(t.globals.fill.colors) ? a = t.globals.fill.colors : a.push(t.globals.fill.colors), void 0 !== i.fillColors && (a = [], Array.isArray(i.fillColors) ? a = i.fillColors.slice() : a.push(i.fillColors)), a } }, { key: "handlePatternFill", value: function (t) { var e = t.fillConfig, i = t.patternFill, a = t.fillColor, s = t.fillOpacity, r = t.defaultColor, o = this.w.config.fill; e && (o = e); var n = this.opts, l = new m(this.ctx), h = Array.isArray(o.pattern.strokeWidth) ? o.pattern.strokeWidth[this.seriesIndex] : o.pattern.strokeWidth, c = a; Array.isArray(o.pattern.style) ? i = void 0 !== o.pattern.style[n.seriesNumber] ? l.drawPattern(o.pattern.style[n.seriesNumber], o.pattern.width, o.pattern.height, c, h, s) : r : i = l.drawPattern(o.pattern.style, o.pattern.width, o.pattern.height, c, h, s); return i } }, { key: "handleGradientFill", value: function (t) { var i = t.fillColor, a = t.fillOpacity, s = t.fillConfig, r = t.i, o = this.w.config.fill; s && (o = e(e({}, o), s)); var n, l = this.opts, h = new m(this.ctx), c = new x, d = o.gradient.type, g = i, u = void 0 === o.gradient.opacityFrom ? a : Array.isArray(o.gradient.opacityFrom) ? o.gradient.opacityFrom[r] : o.gradient.opacityFrom; g.indexOf("rgba") > -1 && (u = x.getOpacityFromRGBA(g)); var p = void 0 === o.gradient.opacityTo ? a : Array.isArray(o.gradient.opacityTo) ? o.gradient.opacityTo[r] : o.gradient.opacityTo; if (void 0 === o.gradient.gradientToColors || 0 === o.gradient.gradientToColors.length) n = "dark" === o.gradient.shade ? c.shadeColor(-1 * parseFloat(o.gradient.shadeIntensity), i.indexOf("rgb") > -1 ? x.rgb2hex(i) : i) : c.shadeColor(parseFloat(o.gradient.shadeIntensity), i.indexOf("rgb") > -1 ? x.rgb2hex(i) : i); else if (o.gradient.gradientToColors[l.seriesNumber]) { var f = o.gradient.gradientToColors[l.seriesNumber]; n = f, f.indexOf("rgba") > -1 && (p = x.getOpacityFromRGBA(f)) } else n = i; if (o.gradient.gradientFrom && (g = o.gradient.gradientFrom), o.gradient.gradientTo && (n = o.gradient.gradientTo), o.gradient.inverseColors) { var b = g; g = n, n = b } return g.indexOf("rgb") > -1 && (g = x.rgb2hex(g)), n.indexOf("rgb") > -1 && (n = x.rgb2hex(n)), h.drawGradient(d, g, n, u, p, l.size, o.gradient.stops, o.gradient.colorStops, r) } }]), t }(), D = function () { function t(e, i) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "setGlobalMarkerSize", value: function () { var t = this.w; if (t.globals.markers.size = Array.isArray(t.config.markers.size) ? t.config.markers.size : [t.config.markers.size], t.globals.markers.size.length > 0) { if (t.globals.markers.size.length < t.globals.series.length + 1) for (var e = 0; e <= t.globals.series.length; e++)void 0 === t.globals.markers.size[e] && t.globals.markers.size.push(t.globals.markers.size[0]) } else t.globals.markers.size = t.config.series.map((function (e) { return t.config.markers.size })) } }, { key: "plotChartMarkers", value: function (t, e, i, a) { var s, r = arguments.length > 4 && void 0 !== arguments[4] && arguments[4], o = this.w, n = e, l = t, h = null, c = new m(this.ctx), d = o.config.markers.discrete && o.config.markers.discrete.length; if ((o.globals.markers.size[e] > 0 || r || d) && (h = c.group({ class: r || d ? "" : "apexcharts-series-markers" })).attr("clip-path", "url(#gridRectMarkerMask".concat(o.globals.cuid, ")")), Array.isArray(l.x)) for (var g = 0; g < l.x.length; g++) { var u = i; 1 === i && 0 === g && (u = 0), 1 === i && 1 === g && (u = 1); var p = "apexcharts-marker"; if ("line" !== o.config.chart.type && "area" !== o.config.chart.type || o.globals.comboCharts || o.config.tooltip.intersect || (p += " no-pointer-events"), (Array.isArray(o.config.markers.size) ? o.globals.markers.size[e] > 0 : o.config.markers.size > 0) || r || d) { x.isNumber(l.y[g]) ? p += " w".concat(x.randomId()) : p = "apexcharts-nullpoint"; var f = this.getMarkerConfig({ cssClass: p, seriesIndex: e, dataPointIndex: u }); o.config.series[n].data[u] && (o.config.series[n].data[u].fillColor && (f.pointFillColor = o.config.series[n].data[u].fillColor), o.config.series[n].data[u].strokeColor && (f.pointStrokeColor = o.config.series[n].data[u].strokeColor)), a && (f.pSize = a), (l.x[g] < -o.globals.markers.largestSize || l.x[g] > o.globals.gridWidth + o.globals.markers.largestSize || l.y[g] < -o.globals.markers.largestSize || l.y[g] > o.globals.gridHeight + o.globals.markers.largestSize) && (f.pSize = 0), (s = c.drawMarker(l.x[g], l.y[g], f)).attr("rel", u), s.attr("j", u), s.attr("index", e), s.node.setAttribute("default-marker-size", f.pSize), new v(this.ctx).setSelectionFilter(s, e, u), this.addEvents(s), h && h.add(s) } else void 0 === o.globals.pointsArray[e] && (o.globals.pointsArray[e] = []), o.globals.pointsArray[e].push([l.x[g], l.y[g]]) } return h } }, { key: "getMarkerConfig", value: function (t) { var e = t.cssClass, i = t.seriesIndex, a = t.dataPointIndex, s = void 0 === a ? null : a, r = t.finishRadius, o = void 0 === r ? null : r, n = this.w, l = this.getMarkerStyle(i), h = n.globals.markers.size[i], c = n.config.markers; return null !== s && c.discrete.length && c.discrete.map((function (t) { t.seriesIndex === i && t.dataPointIndex === s && (l.pointStrokeColor = t.strokeColor, l.pointFillColor = t.fillColor, h = t.size, l.pointShape = t.shape) })), { pSize: null === o ? h : o, pRadius: c.radius, width: Array.isArray(c.width) ? c.width[i] : c.width, height: Array.isArray(c.height) ? c.height[i] : c.height, pointStrokeWidth: Array.isArray(c.strokeWidth) ? c.strokeWidth[i] : c.strokeWidth, pointStrokeColor: l.pointStrokeColor, pointFillColor: l.pointFillColor, shape: l.pointShape || (Array.isArray(c.shape) ? c.shape[i] : c.shape), class: e, pointStrokeOpacity: Array.isArray(c.strokeOpacity) ? c.strokeOpacity[i] : c.strokeOpacity, pointStrokeDashArray: Array.isArray(c.strokeDashArray) ? c.strokeDashArray[i] : c.strokeDashArray, pointFillOpacity: Array.isArray(c.fillOpacity) ? c.fillOpacity[i] : c.fillOpacity, seriesIndex: i } } }, { key: "addEvents", value: function (t) { var e = this.w, i = new m(this.ctx); t.node.addEventListener("mouseenter", i.pathMouseEnter.bind(this.ctx, t)), t.node.addEventListener("mouseleave", i.pathMouseLeave.bind(this.ctx, t)), t.node.addEventListener("mousedown", i.pathMouseDown.bind(this.ctx, t)), t.node.addEventListener("click", e.config.markers.onClick), t.node.addEventListener("dblclick", e.config.markers.onDblClick), t.node.addEventListener("touchstart", i.pathMouseDown.bind(this.ctx, t), { passive: !0 }) } }, { key: "getMarkerStyle", value: function (t) { var e = this.w, i = e.globals.markers.colors, a = e.config.markers.strokeColor || e.config.markers.strokeColors; return { pointStrokeColor: Array.isArray(a) ? a[t] : a, pointFillColor: Array.isArray(i) ? i[t] : i } } }]), t }(), O = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w, this.initialAnim = this.w.config.chart.animations.enabled, this.dynamicAnim = this.initialAnim && this.w.config.chart.animations.dynamicAnimation.enabled } return r(t, [{ key: "draw", value: function (t, e, i) { var a = this.w, s = new m(this.ctx), r = i.realIndex, o = i.pointsPos, n = i.zRatio, l = i.elParent, h = s.group({ class: "apexcharts-series-markers apexcharts-series-".concat(a.config.chart.type) }); if (h.attr("clip-path", "url(#gridRectMarkerMask".concat(a.globals.cuid, ")")), Array.isArray(o.x)) for (var c = 0; c < o.x.length; c++) { var d = e + 1, g = !0; 0 === e && 0 === c && (d = 0), 0 === e && 1 === c && (d = 1); var u = 0, p = a.globals.markers.size[r]; if (n !== 1 / 0) { var f = a.config.plotOptions.bubble; p = a.globals.seriesZ[r][d], f.zScaling && (p /= n), f.minBubbleRadius && p < f.minBubbleRadius && (p = f.minBubbleRadius), f.maxBubbleRadius && p > f.maxBubbleRadius && (p = f.maxBubbleRadius) } a.config.chart.animations.enabled || (u = p); var x = o.x[c], b = o.y[c]; if (u = u || 0, null !== b && void 0 !== a.globals.series[r][d] || (g = !1), g) { var v = this.drawPoint(x, b, u, p, r, d, e); h.add(v) } l.add(h) } } }, { key: "drawPoint", value: function (t, e, i, a, s, r, o) { var n = this.w, l = s, h = new b(this.ctx), c = new v(this.ctx), d = new H(this.ctx), g = new D(this.ctx), u = new m(this.ctx), p = g.getMarkerConfig({ cssClass: "apexcharts-marker", seriesIndex: l, dataPointIndex: r, finishRadius: "bubble" === n.config.chart.type || n.globals.comboCharts && n.config.series[s] && "bubble" === n.config.series[s].type ? a : null }); a = p.pSize; var f, x = d.fillPath({ seriesNumber: s, dataPointIndex: r, color: p.pointFillColor, patternUnits: "objectBoundingBox", value: n.globals.series[s][o] }); if ("circle" === p.shape ? f = u.drawCircle(i) : "square" !== p.shape && "rect" !== p.shape || (f = u.drawRect(0, 0, p.width - p.pointStrokeWidth / 2, p.height - p.pointStrokeWidth / 2, p.pRadius)), n.config.series[l].data[r] && n.config.series[l].data[r].fillColor && (x = n.config.series[l].data[r].fillColor), f.attr({ x: t - p.width / 2 - p.pointStrokeWidth / 2, y: e - p.height / 2 - p.pointStrokeWidth / 2, cx: t, cy: e, fill: x, "fill-opacity": p.pointFillOpacity, stroke: p.pointStrokeColor, r: a, "stroke-width": p.pointStrokeWidth, "stroke-dasharray": p.pointStrokeDashArray, "stroke-opacity": p.pointStrokeOpacity }), n.config.chart.dropShadow.enabled) { var y = n.config.chart.dropShadow; c.dropShadow(f, y, s) } if (!this.initialAnim || n.globals.dataChanged || n.globals.resized) n.globals.animationEnded = !0; else { var w = n.config.chart.animations.speed; h.animateMarker(f, 0, "circle" === p.shape ? a : { width: p.width, height: p.height }, w, n.globals.easing, (function () { window.setTimeout((function () { h.animationCompleted(f) }), 100) })) } if (n.globals.dataChanged && "circle" === p.shape) if (this.dynamicAnim) { var k, A, S, C, L = n.config.chart.animations.dynamicAnimation.speed; null != (C = n.globals.previousPaths[s] && n.globals.previousPaths[s][o]) && (k = C.x, A = C.y, S = void 0 !== C.r ? C.r : a); for (var P = 0; P < n.globals.collapsedSeries.length; P++)n.globals.collapsedSeries[P].index === s && (L = 1, a = 0); 0 === t && 0 === e && (a = 0), h.animateCircle(f, { cx: k, cy: A, r: S }, { cx: t, cy: e, r: a }, L, n.globals.easing) } else f.attr({ r: a }); return f.attr({ rel: r, j: r, index: s, "default-marker-size": a }), c.setSelectionFilter(f, s, r), g.addEvents(f), f.node.classList.add("apexcharts-marker"), f } }, { key: "centerTextInBubble", value: function (t) { var e = this.w; return { y: t += parseInt(e.config.dataLabels.style.fontSize, 10) / 4 } } }]), t }(), N = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "dataLabelsCorrection", value: function (t, e, i, a, s, r, o) { var n = this.w, l = !1, h = new m(this.ctx).getTextRects(i, o), c = h.width, d = h.height; e < 0 && (e = 0), e > n.globals.gridHeight + d && (e = n.globals.gridHeight + d / 2), void 0 === n.globals.dataLabelsRects[a] && (n.globals.dataLabelsRects[a] = []), n.globals.dataLabelsRects[a].push({ x: t, y: e, width: c, height: d }); var g = n.globals.dataLabelsRects[a].length - 2, u = void 0 !== n.globals.lastDrawnDataLabelsIndexes[a] ? n.globals.lastDrawnDataLabelsIndexes[a][n.globals.lastDrawnDataLabelsIndexes[a].length - 1] : 0; if (void 0 !== n.globals.dataLabelsRects[a][g]) { var p = n.globals.dataLabelsRects[a][u]; (t > p.x + p.width || e > p.y + p.height || e + d < p.y || t + c < p.x) && (l = !0) } return (0 === s || r) && (l = !0), { x: t, y: e, textRects: h, drawnextLabel: l } } }, { key: "drawDataLabel", value: function (t) { var e = this, i = t.type, a = t.pos, s = t.i, r = t.j, o = t.isRangeStart, n = t.strokeWidth, l = void 0 === n ? 2 : n, h = this.w, c = new m(this.ctx), d = h.config.dataLabels, g = 0, u = 0, p = r, f = null; if (-1 !== h.globals.collapsedSeriesIndices.indexOf(s) || !d.enabled || !Array.isArray(a.x)) return f; f = c.group({ class: "apexcharts-data-labels" }); for (var x = 0; x < a.x.length; x++)if (g = a.x[x] + d.offsetX, u = a.y[x] + d.offsetY + l, !isNaN(g)) { 1 === r && 0 === x && (p = 0), 1 === r && 1 === x && (p = 1); var b = h.globals.series[s][p]; "rangeArea" === i && (b = o ? h.globals.seriesRangeStart[s][p] : h.globals.seriesRangeEnd[s][p]); var v = "", y = function (t) { return h.config.dataLabels.formatter(t, { ctx: e.ctx, seriesIndex: s, dataPointIndex: p, w: h }) }; if ("bubble" === h.config.chart.type) v = y(b = h.globals.seriesZ[s][p]), u = a.y[x], u = new O(this.ctx).centerTextInBubble(u, s, p).y; else void 0 !== b && (v = y(b)); var w = h.config.dataLabels.textAnchor; h.globals.isSlopeChart && (w = 0 === p ? "end" : p === h.config.series[s].data.length - 1 ? "start" : "middle"), this.plotDataLabelsText({ x: g, y: u, text: v, i: s, j: p, parent: f, offsetCorrection: !0, dataLabelsConfig: h.config.dataLabels, textAnchor: w }) } return f } }, { key: "plotDataLabelsText", value: function (t) { var e = this.w, i = new m(this.ctx), a = t.x, s = t.y, r = t.i, o = t.j, n = t.text, l = t.textAnchor, h = t.fontSize, c = t.parent, d = t.dataLabelsConfig, g = t.color, u = t.alwaysDrawDataLabel, p = t.offsetCorrection; if (!(Array.isArray(e.config.dataLabels.enabledOnSeries) && e.config.dataLabels.enabledOnSeries.indexOf(r) < 0)) { var f = { x: a, y: s, drawnextLabel: !0, textRects: null }; p && (f = this.dataLabelsCorrection(a, s, n, r, o, u, parseInt(d.style.fontSize, 10))), e.globals.zoomed || (a = f.x, s = f.y), f.textRects && (a < -20 - f.textRects.width || a > e.globals.gridWidth + f.textRects.width + 30) && (n = ""); var x = e.globals.dataLabels.style.colors[r]; (("bar" === e.config.chart.type || "rangeBar" === e.config.chart.type) && e.config.plotOptions.bar.distributed || e.config.dataLabels.distributed) && (x = e.globals.dataLabels.style.colors[o]), "function" == typeof x && (x = x({ series: e.globals.series, seriesIndex: r, dataPointIndex: o, w: e })), g && (x = g); var b = d.offsetX, y = d.offsetY; if ("bar" !== e.config.chart.type && "rangeBar" !== e.config.chart.type || (b = 0, y = 0), e.globals.isSlopeChart && (0 !== o && (b = -2 * d.offsetX + 5), 0 !== o && o !== e.config.series[r].data.length - 1 && (b = 0)), f.drawnextLabel) { var w = i.drawText({ width: 100, height: parseInt(d.style.fontSize, 10), x: a + b, y: s + y, foreColor: x, textAnchor: l || d.textAnchor, text: n, fontSize: h || d.style.fontSize, fontFamily: d.style.fontFamily, fontWeight: d.style.fontWeight || "normal" }); if (w.attr({ class: "apexcharts-datalabel", cx: a, cy: s }), d.dropShadow.enabled) { var k = d.dropShadow; new v(this.ctx).dropShadow(w, k) } c.add(w), void 0 === e.globals.lastDrawnDataLabelsIndexes[r] && (e.globals.lastDrawnDataLabelsIndexes[r] = []), e.globals.lastDrawnDataLabelsIndexes[r].push(o) } } } }, { key: "addBackgroundToDataLabel", value: function (t, e) { var i = this.w, a = i.config.dataLabels.background, s = a.padding, r = a.padding / 2, o = e.width, n = e.height, l = new m(this.ctx).drawRect(e.x - s, e.y - r / 2, o + 2 * s, n + r, a.borderRadius, "transparent" === i.config.chart.background ? "#fff" : i.config.chart.background, a.opacity, a.borderWidth, a.borderColor); a.dropShadow.enabled && new v(this.ctx).dropShadow(l, a.dropShadow); return l } }, { key: "dataLabelsBackground", value: function () { var t = this.w; if ("bubble" !== t.config.chart.type) for (var e = t.globals.dom.baseEl.querySelectorAll(".apexcharts-datalabels text"), i = 0; i < e.length; i++) { var a = e[i], s = a.getBBox(), r = null; if (s.width && s.height && (r = this.addBackgroundToDataLabel(a, s)), r) { a.parentNode.insertBefore(r.node, a); var o = a.getAttribute("fill"); t.config.chart.animations.enabled && !t.globals.resized && !t.globals.dataChanged ? r.animate().attr({ fill: o }) : r.attr({ fill: o }), a.setAttribute("fill", t.config.dataLabels.background.foreColor) } } } }, { key: "bringForward", value: function () { for (var t = this.w, e = t.globals.dom.baseEl.querySelectorAll(".apexcharts-datalabels"), i = t.globals.dom.baseEl.querySelector(".apexcharts-plot-series:last-child"), a = 0; a < e.length; a++)i && i.insertBefore(e[a], i.nextSibling) } }]), t }(), W = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w, this.legendInactiveClass = "legend-mouseover-inactive" } return r(t, [{ key: "getAllSeriesEls", value: function () { return this.w.globals.dom.baseEl.getElementsByClassName("apexcharts-series") } }, { key: "getSeriesByName", value: function (t) { return this.w.globals.dom.baseEl.querySelector(".apexcharts-inner .apexcharts-series[seriesName='".concat(x.escapeString(t), "']")) } }, { key: "isSeriesHidden", value: function (t) { var e = this.getSeriesByName(t), i = parseInt(e.getAttribute("data:realIndex"), 10); return { isHidden: e.classList.contains("apexcharts-series-collapsed"), realIndex: i } } }, { key: "addCollapsedClassToSeries", value: function (t, e) { var i = this.w; function a(i) { for (var a = 0; a < i.length; a++)i[a].index === e && t.node.classList.add("apexcharts-series-collapsed") } a(i.globals.collapsedSeries), a(i.globals.ancillaryCollapsedSeries) } }, { key: "toggleSeries", value: function (t) { var e = this.isSeriesHidden(t); return this.ctx.legend.legendHelpers.toggleDataSeries(e.realIndex, e.isHidden), e.isHidden } }, { key: "showSeries", value: function (t) { var e = this.isSeriesHidden(t); e.isHidden && this.ctx.legend.legendHelpers.toggleDataSeries(e.realIndex, !0) } }, { key: "hideSeries", value: function (t) { var e = this.isSeriesHidden(t); e.isHidden || this.ctx.legend.legendHelpers.toggleDataSeries(e.realIndex, !1) } }, { key: "resetSeries", value: function () { var t = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0], e = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1], i = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], a = this.w, s = x.clone(a.globals.initialSeries); a.globals.previousPaths = [], i ? (a.globals.collapsedSeries = [], a.globals.ancillaryCollapsedSeries = [], a.globals.collapsedSeriesIndices = [], a.globals.ancillaryCollapsedSeriesIndices = []) : s = this.emptyCollapsedSeries(s), a.config.series = s, t && (e && (a.globals.zoomed = !1, this.ctx.updateHelpers.revertDefaultAxisMinMax()), this.ctx.updateHelpers._updateSeries(s, a.config.chart.animations.dynamicAnimation.enabled)) } }, { key: "emptyCollapsedSeries", value: function (t) { for (var e = this.w, i = 0; i < t.length; i++)e.globals.collapsedSeriesIndices.indexOf(i) > -1 && (t[i].data = []); return t } }, { key: "toggleSeriesOnHover", value: function (t, e) { var i = this.w; e || (e = t.target); var a = i.globals.dom.baseEl.querySelectorAll(".apexcharts-series, .apexcharts-datalabels, .apexcharts-yaxis"); if ("mousemove" === t.type) { var s = parseInt(e.getAttribute("rel"), 10) - 1, r = null, o = null, n = null; if (i.globals.axisCharts || "radialBar" === i.config.chart.type) if (i.globals.axisCharts) { r = i.globals.dom.baseEl.querySelector(".apexcharts-series[data\\:realIndex='".concat(s, "']")), o = i.globals.dom.baseEl.querySelector(".apexcharts-datalabels[data\\:realIndex='".concat(s, "']")); var l = i.globals.seriesYAxisReverseMap[s]; n = i.globals.dom.baseEl.querySelector(".apexcharts-yaxis[rel='".concat(l, "']")) } else r = i.globals.dom.baseEl.querySelector(".apexcharts-series[rel='".concat(s + 1, "']")); else r = i.globals.dom.baseEl.querySelector(".apexcharts-series[rel='".concat(s + 1, "'] path")); for (var h = 0; h < a.length; h++)a[h].classList.add(this.legendInactiveClass); null !== r && (i.globals.axisCharts || r.parentNode.classList.remove(this.legendInactiveClass), r.classList.remove(this.legendInactiveClass), null !== o && o.classList.remove(this.legendInactiveClass), null !== n && n.classList.remove(this.legendInactiveClass)) } else if ("mouseout" === t.type) for (var c = 0; c < a.length; c++)a[c].classList.remove(this.legendInactiveClass) } }, { key: "highlightRangeInSeries", value: function (t, e) { var i = this, a = this.w, s = a.globals.dom.baseEl.getElementsByClassName("apexcharts-heatmap-rect"), r = function (t) { for (var e = 0; e < s.length; e++)s[e].classList[t](i.legendInactiveClass) }; if ("mousemove" === t.type) { var o = parseInt(e.getAttribute("rel"), 10) - 1; r("add"), function (t) { for (var e = 0; e < s.length; e++) { var a = parseInt(s[e].getAttribute("val"), 10); a >= t.from && a <= t.to && s[e].classList.remove(i.legendInactiveClass) } }(a.config.plotOptions.heatmap.colorScale.ranges[o]) } else "mouseout" === t.type && r("remove") } }, { key: "getActiveConfigSeriesIndex", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "asc", e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : [], i = this.w, a = 0; if (i.config.series.length > 1) for (var s = i.config.series.map((function (t, a) { return t.data && t.data.length > 0 && -1 === i.globals.collapsedSeriesIndices.indexOf(a) && (!i.globals.comboCharts || 0 === e.length || e.length && e.indexOf(i.config.series[a].type) > -1) ? a : -1 })), r = "asc" === t ? 0 : s.length - 1; "asc" === t ? r < s.length : r >= 0; "asc" === t ? r++ : r--)if (-1 !== s[r]) { a = s[r]; break } return a } }, { key: "getBarSeriesIndices", value: function () { return this.w.globals.comboCharts ? this.w.config.series.map((function (t, e) { return "bar" === t.type || "column" === t.type ? e : -1 })).filter((function (t) { return -1 !== t })) : this.w.config.series.map((function (t, e) { return e })) } }, { key: "getPreviousPaths", value: function () { var t = this.w; function e(e, i, a) { for (var s = e[i].childNodes, r = { type: a, paths: [], realIndex: e[i].getAttribute("data:realIndex") }, o = 0; o < s.length; o++)if (s[o].hasAttribute("pathTo")) { var n = s[o].getAttribute("pathTo"); r.paths.push({ d: n }) } t.globals.previousPaths.push(r) } t.globals.previousPaths = [];["line", "area", "bar", "rangebar", "rangeArea", "candlestick", "radar"].forEach((function (i) { for (var a, s = (a = i, t.globals.dom.baseEl.querySelectorAll(".apexcharts-".concat(a, "-series .apexcharts-series"))), r = 0; r < s.length; r++)e(s, r, i) })), this.handlePrevBubbleScatterPaths("bubble"), this.handlePrevBubbleScatterPaths("scatter"); var i = t.globals.dom.baseEl.querySelectorAll(".apexcharts-".concat(t.config.chart.type, " .apexcharts-series")); if (i.length > 0) for (var a = function (e) { for (var i = t.globals.dom.baseEl.querySelectorAll(".apexcharts-".concat(t.config.chart.type, " .apexcharts-series[data\\:realIndex='").concat(e, "'] rect")), a = [], s = function (t) { var e = function (e) { return i[t].getAttribute(e) }, s = { x: parseFloat(e("x")), y: parseFloat(e("y")), width: parseFloat(e("width")), height: parseFloat(e("height")) }; a.push({ rect: s, color: i[t].getAttribute("color") }) }, r = 0; r < i.length; r++)s(r); t.globals.previousPaths.push(a) }, s = 0; s < i.length; s++)a(s); t.globals.axisCharts || (t.globals.previousPaths = t.globals.series) } }, { key: "handlePrevBubbleScatterPaths", value: function (t) { var e = this.w, i = e.globals.dom.baseEl.querySelectorAll(".apexcharts-".concat(t, "-series .apexcharts-series")); if (i.length > 0) for (var a = 0; a < i.length; a++) { for (var s = e.globals.dom.baseEl.querySelectorAll(".apexcharts-".concat(t, "-series .apexcharts-series[data\\:realIndex='").concat(a, "'] circle")), r = [], o = 0; o < s.length; o++)r.push({ x: s[o].getAttribute("cx"), y: s[o].getAttribute("cy"), r: s[o].getAttribute("r") }); e.globals.previousPaths.push(r) } } }, { key: "clearPreviousPaths", value: function () { var t = this.w; t.globals.previousPaths = [], t.globals.allSeriesCollapsed = !1 } }, { key: "handleNoData", value: function () { var t = this.w, e = t.config.noData, i = new m(this.ctx), a = t.globals.svgWidth / 2, s = t.globals.svgHeight / 2, r = "middle"; if (t.globals.noData = !0, t.globals.animationEnded = !0, "left" === e.align ? (a = 10, r = "start") : "right" === e.align && (a = t.globals.svgWidth - 10, r = "end"), "top" === e.verticalAlign ? s = 50 : "bottom" === e.verticalAlign && (s = t.globals.svgHeight - 50), a += e.offsetX, s = s + parseInt(e.style.fontSize, 10) + 2 + e.offsetY, void 0 !== e.text && "" !== e.text) { var o = i.drawText({ x: a, y: s, text: e.text, textAnchor: r, fontSize: e.style.fontSize, fontFamily: e.style.fontFamily, foreColor: e.style.color, opacity: 1, class: "apexcharts-text-nodata" }); t.globals.dom.Paper.add(o) } } }, { key: "setNullSeriesToZeroValues", value: function (t) { for (var e = this.w, i = 0; i < t.length; i++)if (0 === t[i].length) for (var a = 0; a < t[e.globals.maxValsInArrayIndex].length; a++)t[i].push(0); return t } }, { key: "hasAllSeriesEqualX", value: function () { for (var t = !0, e = this.w, i = this.filteredSeriesX(), a = 0; a < i.length - 1; a++)if (i[a][0] !== i[a + 1][0]) { t = !1; break } return e.globals.allSeriesHasEqualX = t, t } }, { key: "filteredSeriesX", value: function () { var t = this.w.globals.seriesX.map((function (t) { return t.length > 0 ? t : [] })); return t } }]), t }(), B = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w, this.twoDSeries = [], this.threeDSeries = [], this.twoDSeriesX = [], this.seriesGoals = [], this.coreUtils = new y(this.ctx) } return r(t, [{ key: "isMultiFormat", value: function () { return this.isFormatXY() || this.isFormat2DArray() } }, { key: "isFormatXY", value: function () { var t = this.w.config.series.slice(), e = new W(this.ctx); if (this.activeSeriesIndex = e.getActiveConfigSeriesIndex(), void 0 !== t[this.activeSeriesIndex].data && t[this.activeSeriesIndex].data.length > 0 && null !== t[this.activeSeriesIndex].data[0] && void 0 !== t[this.activeSeriesIndex].data[0].x && null !== t[this.activeSeriesIndex].data[0]) return !0 } }, { key: "isFormat2DArray", value: function () { var t = this.w.config.series.slice(), e = new W(this.ctx); if (this.activeSeriesIndex = e.getActiveConfigSeriesIndex(), void 0 !== t[this.activeSeriesIndex].data && t[this.activeSeriesIndex].data.length > 0 && void 0 !== t[this.activeSeriesIndex].data[0] && null !== t[this.activeSeriesIndex].data[0] && t[this.activeSeriesIndex].data[0].constructor === Array) return !0 } }, { key: "handleFormat2DArray", value: function (t, e) { for (var i = this.w.config, a = this.w.globals, s = "boxPlot" === i.chart.type || "boxPlot" === i.series[e].type, r = 0; r < t[e].data.length; r++)if (void 0 !== t[e].data[r][1] && (Array.isArray(t[e].data[r][1]) && 4 === t[e].data[r][1].length && !s ? this.twoDSeries.push(x.parseNumber(t[e].data[r][1][3])) : t[e].data[r].length >= 5 ? this.twoDSeries.push(x.parseNumber(t[e].data[r][4])) : this.twoDSeries.push(x.parseNumber(t[e].data[r][1])), a.dataFormatXNumeric = !0), "datetime" === i.xaxis.type) { var o = new Date(t[e].data[r][0]); o = new Date(o).getTime(), this.twoDSeriesX.push(o) } else this.twoDSeriesX.push(t[e].data[r][0]); for (var n = 0; n < t[e].data.length; n++)void 0 !== t[e].data[n][2] && (this.threeDSeries.push(t[e].data[n][2]), a.isDataXYZ = !0) } }, { key: "handleFormatXY", value: function (t, e) { var i = this.w.config, a = this.w.globals, s = new A(this.ctx), r = e; a.collapsedSeriesIndices.indexOf(e) > -1 && (r = this.activeSeriesIndex); for (var o = 0; o < t[e].data.length; o++)void 0 !== t[e].data[o].y && (Array.isArray(t[e].data[o].y) ? this.twoDSeries.push(x.parseNumber(t[e].data[o].y[t[e].data[o].y.length - 1])) : this.twoDSeries.push(x.parseNumber(t[e].data[o].y))), void 0 !== t[e].data[o].goals && Array.isArray(t[e].data[o].goals) ? (void 0 === this.seriesGoals[e] && (this.seriesGoals[e] = []), this.seriesGoals[e].push(t[e].data[o].goals)) : (void 0 === this.seriesGoals[e] && (this.seriesGoals[e] = []), this.seriesGoals[e].push(null)); for (var n = 0; n < t[r].data.length; n++) { var l = "string" == typeof t[r].data[n].x, h = Array.isArray(t[r].data[n].x), c = !h && !!s.isValidDate(t[r].data[n].x); if (l || c) if (l || i.xaxis.convertedCatToNumeric) { var d = a.isBarHorizontal && a.isRangeData; "datetime" !== i.xaxis.type || d ? (this.fallbackToCategory = !0, this.twoDSeriesX.push(t[r].data[n].x), isNaN(t[r].data[n].x) || "category" === this.w.config.xaxis.type || "string" == typeof t[r].data[n].x || (a.isXNumeric = !0)) : this.twoDSeriesX.push(s.parseDate(t[r].data[n].x)) } else "datetime" === i.xaxis.type ? this.twoDSeriesX.push(s.parseDate(t[r].data[n].x.toString())) : (a.dataFormatXNumeric = !0, a.isXNumeric = !0, this.twoDSeriesX.push(parseFloat(t[r].data[n].x))); else h ? (this.fallbackToCategory = !0, this.twoDSeriesX.push(t[r].data[n].x)) : (a.isXNumeric = !0, a.dataFormatXNumeric = !0, this.twoDSeriesX.push(t[r].data[n].x)) } if (t[e].data[0] && void 0 !== t[e].data[0].z) { for (var g = 0; g < t[e].data.length; g++)this.threeDSeries.push(t[e].data[g].z); a.isDataXYZ = !0 } } }, { key: "handleRangeData", value: function (t, e) { var i = this.w.globals, a = {}; return this.isFormat2DArray() ? a = this.handleRangeDataFormat("array", t, e) : this.isFormatXY() && (a = this.handleRangeDataFormat("xy", t, e)), i.seriesRangeStart.push(void 0 === a.start ? [] : a.start), i.seriesRangeEnd.push(void 0 === a.end ? [] : a.end), i.seriesRange.push(a.rangeUniques), i.seriesRange.forEach((function (t, e) { t && t.forEach((function (t, e) { t.y.forEach((function (e, i) { for (var a = 0; a < t.y.length; a++)if (i !== a) { var s = e.y1, r = e.y2, o = t.y[a].y1; s <= t.y[a].y2 && o <= r && (t.overlaps.indexOf(e.rangeName) < 0 && t.overlaps.push(e.rangeName), t.overlaps.indexOf(t.y[a].rangeName) < 0 && t.overlaps.push(t.y[a].rangeName)) } })) })) })), a } }, { key: "handleCandleStickBoxData", value: function (t, e) { var i = this.w.globals, a = {}; return this.isFormat2DArray() ? a = this.handleCandleStickBoxDataFormat("array", t, e) : this.isFormatXY() && (a = this.handleCandleStickBoxDataFormat("xy", t, e)), i.seriesCandleO[e] = a.o, i.seriesCandleH[e] = a.h, i.seriesCandleM[e] = a.m, i.seriesCandleL[e] = a.l, i.seriesCandleC[e] = a.c, a } }, { key: "handleRangeDataFormat", value: function (t, e, i) { var a = [], s = [], r = e[i].data.filter((function (t, e, i) { return e === i.findIndex((function (e) { return e.x === t.x })) })).map((function (t, e) { return { x: t.x, overlaps: [], y: [] } })); if ("array" === t) for (var o = 0; o < e[i].data.length; o++)Array.isArray(e[i].data[o]) ? (a.push(e[i].data[o][1][0]), s.push(e[i].data[o][1][1])) : (a.push(e[i].data[o]), s.push(e[i].data[o])); else if ("xy" === t) for (var n = function (t) { var o = Array.isArray(e[i].data[t].y), n = x.randomId(), l = e[i].data[t].x, h = { y1: o ? e[i].data[t].y[0] : e[i].data[t].y, y2: o ? e[i].data[t].y[1] : e[i].data[t].y, rangeName: n }; e[i].data[t].rangeName = n; var c = r.findIndex((function (t) { return t.x === l })); r[c].y.push(h), a.push(h.y1), s.push(h.y2) }, l = 0; l < e[i].data.length; l++)n(l); return { start: a, end: s, rangeUniques: r } } }, { key: "handleCandleStickBoxDataFormat", value: function (t, e, i) { var a = this.w, s = "boxPlot" === a.config.chart.type || "boxPlot" === a.config.series[i].type, r = [], o = [], n = [], l = [], h = []; if ("array" === t) if (s && 6 === e[i].data[0].length || !s && 5 === e[i].data[0].length) for (var c = 0; c < e[i].data.length; c++)r.push(e[i].data[c][1]), o.push(e[i].data[c][2]), s ? (n.push(e[i].data[c][3]), l.push(e[i].data[c][4]), h.push(e[i].data[c][5])) : (l.push(e[i].data[c][3]), h.push(e[i].data[c][4])); else for (var d = 0; d < e[i].data.length; d++)Array.isArray(e[i].data[d][1]) && (r.push(e[i].data[d][1][0]), o.push(e[i].data[d][1][1]), s ? (n.push(e[i].data[d][1][2]), l.push(e[i].data[d][1][3]), h.push(e[i].data[d][1][4])) : (l.push(e[i].data[d][1][2]), h.push(e[i].data[d][1][3]))); else if ("xy" === t) for (var g = 0; g < e[i].data.length; g++)Array.isArray(e[i].data[g].y) && (r.push(e[i].data[g].y[0]), o.push(e[i].data[g].y[1]), s ? (n.push(e[i].data[g].y[2]), l.push(e[i].data[g].y[3]), h.push(e[i].data[g].y[4])) : (l.push(e[i].data[g].y[2]), h.push(e[i].data[g].y[3]))); return { o: r, h: o, m: n, l: l, c: h } } }, { key: "parseDataAxisCharts", value: function (t) { var e = this, i = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.ctx, a = this.w.config, s = this.w.globals, r = new A(i), o = a.labels.length > 0 ? a.labels.slice() : a.xaxis.categories.slice(); s.isRangeBar = "rangeBar" === a.chart.type && s.isBarHorizontal, s.hasXaxisGroups = "category" === a.xaxis.type && a.xaxis.group.groups.length > 0, s.hasXaxisGroups && (s.groups = a.xaxis.group.groups), t.forEach((function (t, e) { void 0 !== t.name ? s.seriesNames.push(t.name) : s.seriesNames.push("series-" + parseInt(e + 1, 10)) })), this.coreUtils.setSeriesYAxisMappings(); var n = [], l = u(new Set(a.series.map((function (t) { return t.group })))); a.series.forEach((function (t, e) { var i = l.indexOf(t.group); n[i] || (n[i] = []), n[i].push(s.seriesNames[e]) })), s.seriesGroups = n; for (var h = function () { for (var t = 0; t < o.length; t++)if ("string" == typeof o[t]) { if (!r.isValidDate(o[t])) throw new Error("You have provided invalid Date format. Please provide a valid JavaScript Date"); e.twoDSeriesX.push(r.parseDate(o[t])) } else e.twoDSeriesX.push(o[t]) }, c = 0; c < t.length; c++) { if (this.twoDSeries = [], this.twoDSeriesX = [], this.threeDSeries = [], void 0 === t[c].data) return void console.error("It is a possibility that you may have not included 'data' property in series."); if ("rangeBar" !== a.chart.type && "rangeArea" !== a.chart.type && "rangeBar" !== t[c].type && "rangeArea" !== t[c].type || (s.isRangeData = !0, "rangeBar" !== a.chart.type && "rangeArea" !== a.chart.type || this.handleRangeData(t, c)), this.isMultiFormat()) this.isFormat2DArray() ? this.handleFormat2DArray(t, c) : this.isFormatXY() && this.handleFormatXY(t, c), "candlestick" !== a.chart.type && "candlestick" !== t[c].type && "boxPlot" !== a.chart.type && "boxPlot" !== t[c].type || this.handleCandleStickBoxData(t, c), s.series.push(this.twoDSeries), s.labels.push(this.twoDSeriesX), s.seriesX.push(this.twoDSeriesX), s.seriesGoals = this.seriesGoals, c !== this.activeSeriesIndex || this.fallbackToCategory || (s.isXNumeric = !0); else { "datetime" === a.xaxis.type ? (s.isXNumeric = !0, h(), s.seriesX.push(this.twoDSeriesX)) : "numeric" === a.xaxis.type && (s.isXNumeric = !0, o.length > 0 && (this.twoDSeriesX = o, s.seriesX.push(this.twoDSeriesX))), s.labels.push(this.twoDSeriesX); var d = t[c].data.map((function (t) { return x.parseNumber(t) })); s.series.push(d) } s.seriesZ.push(this.threeDSeries), void 0 !== t[c].color ? s.seriesColors.push(t[c].color) : s.seriesColors.push(void 0) } return this.w } }, { key: "parseDataNonAxisCharts", value: function (t) { var e = this.w.globals, i = this.w.config; e.series = t.slice(), e.seriesNames = i.labels.slice(); for (var a = 0; a < e.series.length; a++)void 0 === e.seriesNames[a] && e.seriesNames.push("series-" + (a + 1)); return this.w } }, { key: "handleExternalLabelsData", value: function (t) { var e = this.w.config, i = this.w.globals; if (e.xaxis.categories.length > 0) i.labels = e.xaxis.categories; else if (e.labels.length > 0) i.labels = e.labels.slice(); else if (this.fallbackToCategory) { if (i.labels = i.labels[0], i.seriesRange.length && (i.seriesRange.map((function (t) { t.forEach((function (t) { i.labels.indexOf(t.x) < 0 && t.x && i.labels.push(t.x) })) })), i.labels = Array.from(new Set(i.labels.map(JSON.stringify)), JSON.parse)), e.xaxis.convertedCatToNumeric) new E(e).convertCatToNumericXaxis(e, this.ctx, i.seriesX[0]), this._generateExternalLabels(t) } else this._generateExternalLabels(t) } }, { key: "_generateExternalLabels", value: function (t) { var e = this.w.globals, i = this.w.config, a = []; if (e.axisCharts) { if (e.series.length > 0) if (this.isFormatXY()) for (var s = i.series.map((function (t, e) { return t.data.filter((function (t, e, i) { return i.findIndex((function (e) { return e.x === t.x })) === e })) })), r = s.reduce((function (t, e, i, a) { return a[t].length > e.length ? t : i }), 0), o = 0; o < s[r].length; o++)a.push(o + 1); else for (var n = 0; n < e.series[e.maxValsInArrayIndex].length; n++)a.push(n + 1); e.seriesX = []; for (var l = 0; l < t.length; l++)e.seriesX.push(a); this.w.globals.isBarHorizontal || (e.isXNumeric = !0) } if (0 === a.length) { a = e.axisCharts ? [] : e.series.map((function (t, e) { return e + 1 })); for (var h = 0; h < t.length; h++)e.seriesX.push(a) } e.labels = a, i.xaxis.convertedCatToNumeric && (e.categoryLabels = a.map((function (t) { return i.xaxis.labels.formatter(t) }))), e.noLabelsProvided = !0 } }, { key: "parseData", value: function (t) { var e = this.w, i = e.config, a = e.globals; if (this.excludeCollapsedSeriesInYAxis(), this.fallbackToCategory = !1, this.ctx.core.resetGlobals(), this.ctx.core.isMultipleY(), a.axisCharts ? (this.parseDataAxisCharts(t), this.coreUtils.getLargestSeries()) : this.parseDataNonAxisCharts(t), i.chart.stacked) { var s = new W(this.ctx); a.series = s.setNullSeriesToZeroValues(a.series) } this.coreUtils.getSeriesTotals(), a.axisCharts && (a.stackedSeriesTotals = this.coreUtils.getStackedSeriesTotals(), a.stackedSeriesTotalsByGroups = this.coreUtils.getStackedSeriesTotalsByGroups()), this.coreUtils.getPercentSeries(), a.dataFormatXNumeric || a.isXNumeric && ("numeric" !== i.xaxis.type || 0 !== i.labels.length || 0 !== i.xaxis.categories.length) || this.handleExternalLabelsData(t); for (var r = this.coreUtils.getCategoryLabels(a.labels), o = 0; o < r.length; o++)if (Array.isArray(r[o])) { a.isMultiLineX = !0; break } } }, { key: "excludeCollapsedSeriesInYAxis", value: function () { var t = this.w, e = []; t.globals.seriesYAxisMap.forEach((function (i, a) { var s = 0; i.forEach((function (e) { -1 !== t.globals.collapsedSeriesIndices.indexOf(e) && s++ })), s > 0 && s == i.length && e.push(a) })), t.globals.ignoreYAxisIndexes = e.map((function (t) { return t })) } }]), t }(), G = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "scaleSvgNode", value: function (t, e) { var i = parseFloat(t.getAttributeNS(null, "width")), a = parseFloat(t.getAttributeNS(null, "height")); t.setAttributeNS(null, "width", i * e), t.setAttributeNS(null, "height", a * e), t.setAttributeNS(null, "viewBox", "0 0 " + i + " " + a) } }, { key: "fixSvgStringForIe11", value: function (t) { if (!x.isIE11()) return t.replace(/ /g, " "); var e = 0, i = t.replace(/xmlns="http:\/\/www.w3.org\/2000\/svg"/g, (function (t) { return 2 === ++e ? 'xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev"' : t })); return i = (i = i.replace(/xmlns:NS\d+=""/g, "")).replace(/NS\d+:(\w+:\w+=")/g, "$1") } }, { key: "getSvgString", value: function (t) { null == t && (t = 1); var e = this.w.globals.dom.Paper.svg(); if (1 !== t) { var i = this.w.globals.dom.Paper.node.cloneNode(!0); this.scaleSvgNode(i, t), e = (new XMLSerializer).serializeToString(i) } return this.fixSvgStringForIe11(e) } }, { key: "cleanup", value: function () { var t = this.w, e = t.globals.dom.baseEl.getElementsByClassName("apexcharts-xcrosshairs"), i = t.globals.dom.baseEl.getElementsByClassName("apexcharts-ycrosshairs"), a = t.globals.dom.baseEl.querySelectorAll(".apexcharts-zoom-rect, .apexcharts-selection-rect"); Array.prototype.forEach.call(a, (function (t) { t.setAttribute("width", 0) })), e && e[0] && (e[0].setAttribute("x", -500), e[0].setAttribute("x1", -500), e[0].setAttribute("x2", -500)), i && i[0] && (i[0].setAttribute("y", -100), i[0].setAttribute("y1", -100), i[0].setAttribute("y2", -100)) } }, { key: "svgUrl", value: function () { this.cleanup(); var t = this.getSvgString(), e = new Blob([t], { type: "image/svg+xml;charset=utf-8" }); return URL.createObjectURL(e) } }, { key: "dataURI", value: function (t) { var e = this; return new Promise((function (i) { var a = e.w, s = t ? t.scale || t.width / a.globals.svgWidth : 1; e.cleanup(); var r = document.createElement("canvas"); r.width = a.globals.svgWidth * s, r.height = parseInt(a.globals.dom.elWrap.style.height, 10) * s; var o = "transparent" === a.config.chart.background ? "#fff" : a.config.chart.background, n = r.getContext("2d"); n.fillStyle = o, n.fillRect(0, 0, r.width * s, r.height * s); var l = e.getSvgString(s); if (window.canvg && x.isIE11()) { var h = window.canvg.Canvg.fromString(n, l, { ignoreClear: !0, ignoreDimensions: !0 }); h.start(); var c = r.msToBlob(); h.stop(), i({ blob: c }) } else { var d = "data:image/svg+xml," + encodeURIComponent(l), g = new Image; g.crossOrigin = "anonymous", g.onload = function () { if (n.drawImage(g, 0, 0), r.msToBlob) { var t = r.msToBlob(); i({ blob: t }) } else { var e = r.toDataURL("image/png"); i({ imgURI: e }) } }, g.src = d } })) } }, { key: "exportToSVG", value: function () { this.triggerDownload(this.svgUrl(), this.w.config.chart.toolbar.export.svg.filename, ".svg") } }, { key: "exportToPng", value: function () { var t = this; this.dataURI().then((function (e) { var i = e.imgURI, a = e.blob; a ? navigator.msSaveOrOpenBlob(a, t.w.globals.chartID + ".png") : t.triggerDownload(i, t.w.config.chart.toolbar.export.png.filename, ".png") })) } }, { key: "exportToCSV", value: function (t) { var e = this, i = t.series, a = t.fileName, s = t.columnDelimiter, r = void 0 === s ? "," : s, o = t.lineDelimiter, n = void 0 === o ? "\n" : o, l = this.w; i || (i = l.config.series); var h, c, d = [], g = [], p = "", f = l.globals.series.map((function (t, e) { return -1 === l.globals.collapsedSeriesIndices.indexOf(e) ? t : [] })), b = function (t) { return "datetime" === l.config.xaxis.type && String(t).length >= 10 }, v = Math.max.apply(Math, u(i.map((function (t) { return t.data ? t.data.length : 0 })))), m = new B(this.ctx), y = new C(this.ctx), w = function (t) { var i = ""; if (l.globals.axisCharts) { if ("category" === l.config.xaxis.type || l.config.xaxis.convertedCatToNumeric) if (l.globals.isBarHorizontal) { var a = l.globals.yLabelFormatters[0], s = new W(e.ctx).getActiveConfigSeriesIndex(); i = a(l.globals.labels[t], { seriesIndex: s, dataPointIndex: t, w: l }) } else i = y.getLabel(l.globals.labels, l.globals.timescaleLabels, 0, t).text; "datetime" === l.config.xaxis.type && (l.config.xaxis.categories.length ? i = l.config.xaxis.categories[t] : l.config.labels.length && (i = l.config.labels[t])) } else i = l.config.labels[t]; return null === i ? "nullvalue" : (Array.isArray(i) && (i = i.join(" ")), x.isNumber(i) ? i : i.split(r).join("")) }, k = function (t, e) { if (d.length && 0 === e && g.push(d.join(r)), t.data) { t.data = t.data.length && t.data || u(Array(v)).map((function () { return "" })); for (var a = 0; a < t.data.length; a++) { d = []; var s = w(a); if ("nullvalue" !== s) { if (s || (m.isFormatXY() ? s = i[e].data[a].x : m.isFormat2DArray() && (s = i[e].data[a] ? i[e].data[a][0] : "")), 0 === e) { d.push(b(s) ? l.config.chart.toolbar.export.csv.dateFormatter(s) : x.isNumber(s) ? s : s.split(r).join("")); for (var o = 0; o < l.globals.series.length; o++) { var n; if (m.isFormatXY()) d.push(null === (n = i[o].data[a]) || void 0 === n ? void 0 : n.y); else d.push(f[o][a]) } } ("candlestick" === l.config.chart.type || t.type && "candlestick" === t.type) && (d.pop(), d.push(l.globals.seriesCandleO[e][a]), d.push(l.globals.seriesCandleH[e][a]), d.push(l.globals.seriesCandleL[e][a]), d.push(l.globals.seriesCandleC[e][a])), ("boxPlot" === l.config.chart.type || t.type && "boxPlot" === t.type) && (d.pop(), d.push(l.globals.seriesCandleO[e][a]), d.push(l.globals.seriesCandleH[e][a]), d.push(l.globals.seriesCandleM[e][a]), d.push(l.globals.seriesCandleL[e][a]), d.push(l.globals.seriesCandleC[e][a])), "rangeBar" === l.config.chart.type && (d.pop(), d.push(l.globals.seriesRangeStart[e][a]), d.push(l.globals.seriesRangeEnd[e][a])), d.length && g.push(d.join(r)) } } } }; d.push(l.config.chart.toolbar.export.csv.headerCategory), "boxPlot" === l.config.chart.type ? (d.push("minimum"), d.push("q1"), d.push("median"), d.push("q3"), d.push("maximum")) : "candlestick" === l.config.chart.type ? (d.push("open"), d.push("high"), d.push("low"), d.push("close")) : "rangeBar" === l.config.chart.type ? (d.push("minimum"), d.push("maximum")) : i.map((function (t, e) { var i = (t.name ? t.name : "series-".concat(e)) + ""; l.globals.axisCharts && d.push(i.split(r).join("") ? i.split(r).join("") : "series-".concat(e)) })), l.globals.axisCharts || (d.push(l.config.chart.toolbar.export.csv.headerValue), g.push(d.join(r))), l.globals.allSeriesHasEqualX || !l.globals.axisCharts || l.config.xaxis.categories.length || l.config.labels.length ? i.map((function (t, e) { l.globals.axisCharts ? k(t, e) : ((d = []).push(l.globals.labels[e].split(r).join("")), d.push(f[e]), g.push(d.join(r))) })) : (h = new Set, c = {}, i.forEach((function (t, e) { null == t || t.data.forEach((function (t) { var a, s; if (m.isFormatXY()) a = t.x, s = t.y; else { if (!m.isFormat2DArray()) return; a = t[0], s = t[1] } c[a] || (c[a] = Array(i.length).fill("")), c[a][e] = s, h.add(a) })) })), d.length && g.push(d.join(r)), Array.from(h).sort().forEach((function (t) { g.push([b(t) && "datetime" === l.config.xaxis.type ? l.config.chart.toolbar.export.csv.dateFormatter(t) : x.isNumber(t) ? t : t.split(r).join(""), c[t].join(r)]) }))), p += g.join(n), this.triggerDownload("data:text/csv; charset=utf-8," + encodeURIComponent("\ufeff" + p), a || l.config.chart.toolbar.export.csv.filename, ".csv") } }, { key: "triggerDownload", value: function (t, e, i) { var a = document.createElement("a"); a.href = t, a.download = (e || this.w.globals.chartID) + i, document.body.appendChild(a), a.click(), document.body.removeChild(a) } }]), t }(), V = function () { function t(e, i) { a(this, t), this.ctx = e, this.elgrid = i, this.w = e.w; var s = this.w; this.axesUtils = new C(e), this.xaxisLabels = s.globals.labels.slice(), s.globals.timescaleLabels.length > 0 && !s.globals.isBarHorizontal && (this.xaxisLabels = s.globals.timescaleLabels.slice()), s.config.xaxis.overwriteCategories && (this.xaxisLabels = s.config.xaxis.overwriteCategories), this.drawnLabels = [], this.drawnLabelsRects = [], "top" === s.config.xaxis.position ? this.offY = 0 : this.offY = s.globals.gridHeight, this.offY = this.offY + s.config.xaxis.axisBorder.offsetY, this.isCategoryBarHorizontal = "bar" === s.config.chart.type && s.config.plotOptions.bar.horizontal, this.xaxisFontSize = s.config.xaxis.labels.style.fontSize, this.xaxisFontFamily = s.config.xaxis.labels.style.fontFamily, this.xaxisForeColors = s.config.xaxis.labels.style.colors, this.xaxisBorderWidth = s.config.xaxis.axisBorder.width, this.isCategoryBarHorizontal && (this.xaxisBorderWidth = s.config.yaxis[0].axisBorder.width.toString()), this.xaxisBorderWidth.indexOf("%") > -1 ? this.xaxisBorderWidth = s.globals.gridWidth * parseInt(this.xaxisBorderWidth, 10) / 100 : this.xaxisBorderWidth = parseInt(this.xaxisBorderWidth, 10), this.xaxisBorderHeight = s.config.xaxis.axisBorder.height, this.yaxis = s.config.yaxis[0] } return r(t, [{ key: "drawXaxis", value: function () { var t = this.w, e = new m(this.ctx), i = e.group({ class: "apexcharts-xaxis", transform: "translate(".concat(t.config.xaxis.offsetX, ", ").concat(t.config.xaxis.offsetY, ")") }), a = e.group({ class: "apexcharts-xaxis-texts-g", transform: "translate(".concat(t.globals.translateXAxisX, ", ").concat(t.globals.translateXAxisY, ")") }); i.add(a); for (var s = [], r = 0; r < this.xaxisLabels.length; r++)s.push(this.xaxisLabels[r]); if (this.drawXAxisLabelAndGroup(!0, e, a, s, t.globals.isXNumeric, (function (t, e) { return e })), t.globals.hasXaxisGroups) { var o = t.globals.groups; s = []; for (var n = 0; n < o.length; n++)s.push(o[n].title); var l = {}; t.config.xaxis.group.style && (l.xaxisFontSize = t.config.xaxis.group.style.fontSize, l.xaxisFontFamily = t.config.xaxis.group.style.fontFamily, l.xaxisForeColors = t.config.xaxis.group.style.colors, l.fontWeight = t.config.xaxis.group.style.fontWeight, l.cssClass = t.config.xaxis.group.style.cssClass), this.drawXAxisLabelAndGroup(!1, e, a, s, !1, (function (t, e) { return o[t].cols * e }), l) } if (void 0 !== t.config.xaxis.title.text) { var h = e.group({ class: "apexcharts-xaxis-title" }), c = e.drawText({ x: t.globals.gridWidth / 2 + t.config.xaxis.title.offsetX, y: this.offY + parseFloat(this.xaxisFontSize) + ("bottom" === t.config.xaxis.position ? t.globals.xAxisLabelsHeight : -t.globals.xAxisLabelsHeight - 10) + t.config.xaxis.title.offsetY, text: t.config.xaxis.title.text, textAnchor: "middle", fontSize: t.config.xaxis.title.style.fontSize, fontFamily: t.config.xaxis.title.style.fontFamily, fontWeight: t.config.xaxis.title.style.fontWeight, foreColor: t.config.xaxis.title.style.color, cssClass: "apexcharts-xaxis-title-text " + t.config.xaxis.title.style.cssClass }); h.add(c), i.add(h) } if (t.config.xaxis.axisBorder.show) { var d = t.globals.barPadForNumericAxis, g = e.drawLine(t.globals.padHorizontal + t.config.xaxis.axisBorder.offsetX - d, this.offY, this.xaxisBorderWidth + d, this.offY, t.config.xaxis.axisBorder.color, 0, this.xaxisBorderHeight); this.elgrid && this.elgrid.elGridBorders && t.config.grid.show ? this.elgrid.elGridBorders.add(g) : i.add(g) } return i } }, { key: "drawXAxisLabelAndGroup", value: function (t, e, i, a, s, r) { var o, n = this, l = arguments.length > 6 && void 0 !== arguments[6] ? arguments[6] : {}, h = [], c = [], d = this.w, g = l.xaxisFontSize || this.xaxisFontSize, u = l.xaxisFontFamily || this.xaxisFontFamily, p = l.xaxisForeColors || this.xaxisForeColors, f = l.fontWeight || d.config.xaxis.labels.style.fontWeight, x = l.cssClass || d.config.xaxis.labels.style.cssClass, b = d.globals.padHorizontal, v = a.length, m = "category" === d.config.xaxis.type ? d.globals.dataPoints : v; if (0 === m && v > m && (m = v), s) { var y = m > 1 ? m - 1 : m; o = d.globals.gridWidth / Math.min(y, v - 1), b = b + r(0, o) / 2 + d.config.xaxis.labels.offsetX } else o = d.globals.gridWidth / m, b = b + r(0, o) + d.config.xaxis.labels.offsetX; for (var w = function (s) { var l = b - r(s, o) / 2 + d.config.xaxis.labels.offsetX; 0 === s && 1 === v && o / 2 === b && 1 === m && (l = d.globals.gridWidth / 2); var y = n.axesUtils.getLabel(a, d.globals.timescaleLabels, l, s, h, g, t), w = 28; d.globals.rotateXLabels && t && (w = 22), d.config.xaxis.title.text && "top" === d.config.xaxis.position && (w += parseFloat(d.config.xaxis.title.style.fontSize) + 2), t || (w = w + parseFloat(g) + (d.globals.xAxisLabelsHeight - d.globals.xAxisGroupLabelsHeight) + (d.globals.rotateXLabels ? 10 : 0)), y = void 0 !== d.config.xaxis.tickAmount && "dataPoints" !== d.config.xaxis.tickAmount && "datetime" !== d.config.xaxis.type ? n.axesUtils.checkLabelBasedOnTickamount(s, y, v) : n.axesUtils.checkForOverflowingLabels(s, y, v, h, c); if (d.config.xaxis.labels.show) { var k = e.drawText({ x: y.x, y: n.offY + d.config.xaxis.labels.offsetY + w - ("top" === d.config.xaxis.position ? d.globals.xAxisHeight + d.config.xaxis.axisTicks.height - 2 : 0), text: y.text, textAnchor: "middle", fontWeight: y.isBold ? 600 : f, fontSize: g, fontFamily: u, foreColor: Array.isArray(p) ? t && d.config.xaxis.convertedCatToNumeric ? p[d.globals.minX + s - 1] : p[s] : p, isPlainText: !1, cssClass: (t ? "apexcharts-xaxis-label " : "apexcharts-xaxis-group-label ") + x }); if (i.add(k), k.on("click", (function (t) { if ("function" == typeof d.config.chart.events.xAxisLabelClick) { var e = Object.assign({}, d, { labelIndex: s }); d.config.chart.events.xAxisLabelClick(t, n.ctx, e) } })), t) { var A = document.createElementNS(d.globals.SVGNS, "title"); A.textContent = Array.isArray(y.text) ? y.text.join(" ") : y.text, k.node.appendChild(A), "" !== y.text && (h.push(y.text), c.push(y)) } } s < v - 1 && (b += r(s + 1, o)) }, k = 0; k <= v - 1; k++)w(k) } }, { key: "drawXaxisInversed", value: function (t) { var e, i, a = this, s = this.w, r = new m(this.ctx), o = s.config.yaxis[0].opposite ? s.globals.translateYAxisX[t] : 0, n = r.group({ class: "apexcharts-yaxis apexcharts-xaxis-inversed", rel: t }), l = r.group({ class: "apexcharts-yaxis-texts-g apexcharts-xaxis-inversed-texts-g", transform: "translate(" + o + ", 0)" }); n.add(l); var h = []; if (s.config.yaxis[t].show) for (var c = 0; c < this.xaxisLabels.length; c++)h.push(this.xaxisLabels[c]); e = s.globals.gridHeight / h.length, i = -e / 2.2; var d = s.globals.yLabelFormatters[0], g = s.config.yaxis[0].labels; if (g.show) for (var u = function (o) { var n = void 0 === h[o] ? "" : h[o]; n = d(n, { seriesIndex: t, dataPointIndex: o, w: s }); var c = a.axesUtils.getYAxisForeColor(g.style.colors, t), u = 0; Array.isArray(n) && (u = n.length / 2 * parseInt(g.style.fontSize, 10)); var p = g.offsetX - 15, f = "end"; a.yaxis.opposite && (f = "start"), "left" === s.config.yaxis[0].labels.align ? (p = g.offsetX, f = "start") : "center" === s.config.yaxis[0].labels.align ? (p = g.offsetX, f = "middle") : "right" === s.config.yaxis[0].labels.align && (f = "end"); var x = r.drawText({ x: p, y: i + e + g.offsetY - u, text: n, textAnchor: f, foreColor: Array.isArray(c) ? c[o] : c, fontSize: g.style.fontSize, fontFamily: g.style.fontFamily, fontWeight: g.style.fontWeight, isPlainText: !1, cssClass: "apexcharts-yaxis-label " + g.style.cssClass, maxWidth: g.maxWidth }); l.add(x), x.on("click", (function (t) { if ("function" == typeof s.config.chart.events.xAxisLabelClick) { var e = Object.assign({}, s, { labelIndex: o }); s.config.chart.events.xAxisLabelClick(t, a.ctx, e) } })); var b = document.createElementNS(s.globals.SVGNS, "title"); if (b.textContent = Array.isArray(n) ? n.join(" ") : n, x.node.appendChild(b), 0 !== s.config.yaxis[t].labels.rotate) { var v = r.rotateAroundCenter(x.node); x.node.setAttribute("transform", "rotate(".concat(s.config.yaxis[t].labels.rotate, " 0 ").concat(v.y, ")")) } i += e }, p = 0; p <= h.length - 1; p++)u(p); if (void 0 !== s.config.yaxis[0].title.text) { var f = r.group({ class: "apexcharts-yaxis-title apexcharts-xaxis-title-inversed", transform: "translate(" + o + ", 0)" }), x = r.drawText({ x: s.config.yaxis[0].title.offsetX, y: s.globals.gridHeight / 2 + s.config.yaxis[0].title.offsetY, text: s.config.yaxis[0].title.text, textAnchor: "middle", foreColor: s.config.yaxis[0].title.style.color, fontSize: s.config.yaxis[0].title.style.fontSize, fontWeight: s.config.yaxis[0].title.style.fontWeight, fontFamily: s.config.yaxis[0].title.style.fontFamily, cssClass: "apexcharts-yaxis-title-text " + s.config.yaxis[0].title.style.cssClass }); f.add(x), n.add(f) } var b = 0; this.isCategoryBarHorizontal && s.config.yaxis[0].opposite && (b = s.globals.gridWidth); var v = s.config.xaxis.axisBorder; if (v.show) { var y = r.drawLine(s.globals.padHorizontal + v.offsetX + b, 1 + v.offsetY, s.globals.padHorizontal + v.offsetX + b, s.globals.gridHeight + v.offsetY, v.color, 0); this.elgrid && this.elgrid.elGridBorders && s.config.grid.show ? this.elgrid.elGridBorders.add(y) : n.add(y) } return s.config.yaxis[0].axisTicks.show && this.axesUtils.drawYAxisTicks(b, h.length, s.config.yaxis[0].axisBorder, s.config.yaxis[0].axisTicks, 0, e, n), n } }, { key: "drawXaxisTicks", value: function (t, e, i) { var a = this.w, s = t; if (!(t < 0 || t - 2 > a.globals.gridWidth)) { var r = this.offY + a.config.xaxis.axisTicks.offsetY; if (e = e + r + a.config.xaxis.axisTicks.height, "top" === a.config.xaxis.position && (e = r - a.config.xaxis.axisTicks.height), a.config.xaxis.axisTicks.show) { var o = new m(this.ctx).drawLine(t + a.config.xaxis.axisTicks.offsetX, r + a.config.xaxis.offsetY, s + a.config.xaxis.axisTicks.offsetX, e + a.config.xaxis.offsetY, a.config.xaxis.axisTicks.color); i.add(o), o.node.classList.add("apexcharts-xaxis-tick") } } } }, { key: "getXAxisTicksPositions", value: function () { var t = this.w, e = [], i = this.xaxisLabels.length, a = t.globals.padHorizontal; if (t.globals.timescaleLabels.length > 0) for (var s = 0; s < i; s++)a = this.xaxisLabels[s].position, e.push(a); else for (var r = i, o = 0; o < r; o++) { var n = r; t.globals.isXNumeric && "bar" !== t.config.chart.type && (n -= 1), a += t.globals.gridWidth / n, e.push(a) } return e } }, { key: "xAxisLabelCorrections", value: function () { var t = this.w, e = new m(this.ctx), i = t.globals.dom.baseEl.querySelector(".apexcharts-xaxis-texts-g"), a = t.globals.dom.baseEl.querySelectorAll(".apexcharts-xaxis-texts-g text:not(.apexcharts-xaxis-group-label)"), s = t.globals.dom.baseEl.querySelectorAll(".apexcharts-yaxis-inversed text"), r = t.globals.dom.baseEl.querySelectorAll(".apexcharts-xaxis-inversed-texts-g text tspan"); if (t.globals.rotateXLabels || t.config.xaxis.labels.rotateAlways) for (var o = 0; o < a.length; o++) { var n = e.rotateAroundCenter(a[o]); n.y = n.y - 1, n.x = n.x + 1, a[o].setAttribute("transform", "rotate(".concat(t.config.xaxis.labels.rotate, " ").concat(n.x, " ").concat(n.y, ")")), a[o].setAttribute("text-anchor", "end"); i.setAttribute("transform", "translate(0, ".concat(-10, ")")); var l = a[o].childNodes; t.config.xaxis.labels.trim && Array.prototype.forEach.call(l, (function (i) { e.placeTextWithEllipsis(i, i.textContent, t.globals.xAxisLabelsHeight - ("bottom" === t.config.legend.position ? 20 : 10)) })) } else !function () { for (var i = t.globals.gridWidth / (t.globals.labels.length + 1), s = 0; s < a.length; s++) { var r = a[s].childNodes; t.config.xaxis.labels.trim && "datetime" !== t.config.xaxis.type && Array.prototype.forEach.call(r, (function (t) { e.placeTextWithEllipsis(t, t.textContent, i) })) } }(); if (s.length > 0) { var h = s[s.length - 1].getBBox(), c = s[0].getBBox(); h.x < -20 && s[s.length - 1].parentNode.removeChild(s[s.length - 1]), c.x + c.width > t.globals.gridWidth && !t.globals.isBarHorizontal && s[0].parentNode.removeChild(s[0]); for (var d = 0; d < r.length; d++)e.placeTextWithEllipsis(r[d], r[d].textContent, t.config.yaxis[0].labels.maxWidth - (t.config.yaxis[0].title.text ? 2 * parseFloat(t.config.yaxis[0].title.style.fontSize) : 0) - 15) } } }]), t }(), j = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w; var i = this.w; this.xaxisLabels = i.globals.labels.slice(), this.axesUtils = new C(e), this.isRangeBar = i.globals.seriesRange.length && i.globals.isBarHorizontal, i.globals.timescaleLabels.length > 0 && (this.xaxisLabels = i.globals.timescaleLabels.slice()) } return r(t, [{ key: "drawGridArea", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null, e = this.w, i = new m(this.ctx); null === t && (t = i.group({ class: "apexcharts-grid" })); var a = i.drawLine(e.globals.padHorizontal, 1, e.globals.padHorizontal, e.globals.gridHeight, "transparent"), s = i.drawLine(e.globals.padHorizontal, e.globals.gridHeight, e.globals.gridWidth, e.globals.gridHeight, "transparent"); return t.add(s), t.add(a), t } }, { key: "drawGrid", value: function () { var t = null; return this.w.globals.axisCharts && (t = this.renderGrid(), this.drawGridArea(t.el)), t } }, { key: "createGridMask", value: function () { var t = this.w, e = t.globals, i = new m(this.ctx), a = Array.isArray(t.config.stroke.width) ? 0 : t.config.stroke.width; if (Array.isArray(t.config.stroke.width)) { var s = 0; t.config.stroke.width.forEach((function (t) { s = Math.max(s, t) })), a = s } e.dom.elGridRectMask = document.createElementNS(e.SVGNS, "clipPath"), e.dom.elGridRectMask.setAttribute("id", "gridRectMask".concat(e.cuid)), e.dom.elGridRectMarkerMask = document.createElementNS(e.SVGNS, "clipPath"), e.dom.elGridRectMarkerMask.setAttribute("id", "gridRectMarkerMask".concat(e.cuid)), e.dom.elForecastMask = document.createElementNS(e.SVGNS, "clipPath"), e.dom.elForecastMask.setAttribute("id", "forecastMask".concat(e.cuid)), e.dom.elNonForecastMask = document.createElementNS(e.SVGNS, "clipPath"), e.dom.elNonForecastMask.setAttribute("id", "nonForecastMask".concat(e.cuid)); var r = t.config.chart.type, o = 0, n = 0; ("bar" === r || "rangeBar" === r || "candlestick" === r || "boxPlot" === r || t.globals.comboBarCount > 0) && t.globals.isXNumeric && !t.globals.isBarHorizontal && (o = t.config.grid.padding.left, n = t.config.grid.padding.right, e.barPadForNumericAxis > o && (o = e.barPadForNumericAxis, n = e.barPadForNumericAxis)), e.dom.elGridRect = i.drawRect(-a / 2 - o - 2, -a / 2 - 2, e.gridWidth + a + n + o + 4, e.gridHeight + a + 4, 0, "#fff"); var l = t.globals.markers.largestSize + 1; e.dom.elGridRectMarker = i.drawRect(2 * -l, 2 * -l, e.gridWidth + 4 * l, e.gridHeight + 4 * l, 0, "#fff"), e.dom.elGridRectMask.appendChild(e.dom.elGridRect.node), e.dom.elGridRectMarkerMask.appendChild(e.dom.elGridRectMarker.node); var h = e.dom.baseEl.querySelector("defs"); h.appendChild(e.dom.elGridRectMask), h.appendChild(e.dom.elForecastMask), h.appendChild(e.dom.elNonForecastMask), h.appendChild(e.dom.elGridRectMarkerMask) } }, { key: "_drawGridLines", value: function (t) { var e = t.i, i = t.x1, a = t.y1, s = t.x2, r = t.y2, o = t.xCount, n = t.parent, l = this.w; if (!(0 === e && l.globals.skipFirstTimelinelabel || e === o - 1 && l.globals.skipLastTimelinelabel && !l.config.xaxis.labels.formatter || "radar" === l.config.chart.type)) { l.config.grid.xaxis.lines.show && this._drawGridLine({ i: e, x1: i, y1: a, x2: s, y2: r, xCount: o, parent: n }); var h = 0; if (l.globals.hasXaxisGroups && "between" === l.config.xaxis.tickPlacement) { var c = l.globals.groups; if (c) { for (var d = 0, g = 0; d < e && g < c.length; g++)d += c[g].cols; d === e && (h = .6 * l.globals.xAxisLabelsHeight) } } new V(this.ctx).drawXaxisTicks(i, h, l.globals.dom.elGraphical) } } }, { key: "_drawGridLine", value: function (t) { var e = t.i, i = t.x1, a = t.y1, s = t.x2, r = t.y2, o = t.xCount, n = t.parent, l = this.w, h = !1, c = n.node.classList.contains("apexcharts-gridlines-horizontal"), d = l.config.grid.strokeDashArray, g = l.globals.barPadForNumericAxis; (0 === a && 0 === r || 0 === i && 0 === s) && (h = !0), a === l.globals.gridHeight && r === l.globals.gridHeight && (h = !0), !l.globals.isBarHorizontal || 0 !== e && e !== o - 1 || (h = !0); var u = new m(this).drawLine(i - (c ? g : 0), a, s + (c ? g : 0), r, l.config.grid.borderColor, d); u.node.classList.add("apexcharts-gridline"), h && l.config.grid.show ? this.elGridBorders.add(u) : n.add(u) } }, { key: "_drawGridBandRect", value: function (t) { var e = t.c, i = t.x1, a = t.y1, s = t.x2, r = t.y2, o = t.type, n = this.w, l = new m(this.ctx), h = n.globals.barPadForNumericAxis; if ("column" !== o || "datetime" !== n.config.xaxis.type) { var c = n.config.grid[o].colors[e], d = l.drawRect(i - ("row" === o ? h : 0), a, s + ("row" === o ? 2 * h : 0), r, 0, c, n.config.grid[o].opacity); this.elg.add(d), d.attr("clip-path", "url(#gridRectMask".concat(n.globals.cuid, ")")), d.node.classList.add("apexcharts-grid-".concat(o)) } } }, { key: "_drawXYLines", value: function (t) { var e = this, i = t.xCount, a = t.tickAmount, s = this.w; if (s.config.grid.xaxis.lines.show || s.config.xaxis.axisTicks.show) { var r, o = s.globals.padHorizontal, n = s.globals.gridHeight; s.globals.timescaleLabels.length ? function (t) { for (var a = t.xC, s = t.x1, r = t.y1, o = t.x2, n = t.y2, l = 0; l < a; l++)s = e.xaxisLabels[l].position, o = e.xaxisLabels[l].position, e._drawGridLines({ i: l, x1: s, y1: r, x2: o, y2: n, xCount: i, parent: e.elgridLinesV }) }({ xC: i, x1: o, y1: 0, x2: r, y2: n }) : (s.globals.isXNumeric && (i = s.globals.xAxisScale.result.length), function (t) { for (var a = t.xC, r = t.x1, o = t.y1, n = t.x2, l = t.y2, h = 0; h < a + (s.globals.isXNumeric ? 0 : 1); h++)0 === h && 1 === a && 1 === s.globals.dataPoints && (n = r = s.globals.gridWidth / 2), e._drawGridLines({ i: h, x1: r, y1: o, x2: n, y2: l, xCount: i, parent: e.elgridLinesV }), n = r += s.globals.gridWidth / (s.globals.isXNumeric ? a - 1 : a) }({ xC: i, x1: o, y1: 0, x2: r, y2: n })) } if (s.config.grid.yaxis.lines.show) { var l = 0, h = 0, c = s.globals.gridWidth, d = a + 1; this.isRangeBar && (d = s.globals.labels.length); for (var g = 0; g < d + (this.isRangeBar ? 1 : 0); g++)this._drawGridLine({ i: g, xCount: d + (this.isRangeBar ? 1 : 0), x1: 0, y1: l, x2: c, y2: h, parent: this.elgridLinesH }), h = l += s.globals.gridHeight / (this.isRangeBar ? d : a) } } }, { key: "_drawInvertedXYLines", value: function (t) { var e = t.xCount, i = this.w; if (i.config.grid.xaxis.lines.show || i.config.xaxis.axisTicks.show) for (var a, s = i.globals.padHorizontal, r = i.globals.gridHeight, o = 0; o < e + 1; o++) { i.config.grid.xaxis.lines.show && this._drawGridLine({ i: o, xCount: e + 1, x1: s, y1: 0, x2: a, y2: r, parent: this.elgridLinesV }), new V(this.ctx).drawXaxisTicks(s, 0, i.globals.dom.elGraphical), a = s += i.globals.gridWidth / e } if (i.config.grid.yaxis.lines.show) for (var n = 0, l = 0, h = i.globals.gridWidth, c = 0; c < i.globals.dataPoints + 1; c++)this._drawGridLine({ i: c, xCount: i.globals.dataPoints + 1, x1: 0, y1: n, x2: h, y2: l, parent: this.elgridLinesH }), l = n += i.globals.gridHeight / i.globals.dataPoints } }, { key: "renderGrid", value: function () { var t = this.w, e = t.globals, i = new m(this.ctx); this.elg = i.group({ class: "apexcharts-grid" }), this.elgridLinesH = i.group({ class: "apexcharts-gridlines-horizontal" }), this.elgridLinesV = i.group({ class: "apexcharts-gridlines-vertical" }), this.elGridBorders = i.group({ class: "apexcharts-grid-borders" }), this.elg.add(this.elgridLinesH), this.elg.add(this.elgridLinesV), t.config.grid.show || (this.elgridLinesV.hide(), this.elgridLinesH.hide(), this.elGridBorders.hide()); for (var a = 0; a < e.seriesYAxisMap.length && -1 !== e.ignoreYAxisIndexes.indexOf(a);)a++; a === e.seriesYAxisMap.length && (a = 0); var s, r = e.yAxisScale[a].result.length - 1; if (!e.isBarHorizontal || this.isRangeBar) { var o, n, l; if (s = this.xaxisLabels.length, this.isRangeBar) r = e.labels.length, t.config.xaxis.tickAmount && t.config.xaxis.labels.formatter && (s = t.config.xaxis.tickAmount), (null === (o = e.yAxisScale) || void 0 === o || null === (n = o[a]) || void 0 === n || null === (l = n.result) || void 0 === l ? void 0 : l.length) > 0 && "datetime" !== t.config.xaxis.type && (s = e.yAxisScale[a].result.length - 1); this._drawXYLines({ xCount: s, tickAmount: r }) } else s = r, r = e.xTickAmount, this._drawInvertedXYLines({ xCount: s, tickAmount: r }); return this.drawGridBands(s, r), { el: this.elg, elGridBorders: this.elGridBorders, xAxisTickWidth: e.gridWidth / s } } }, { key: "drawGridBands", value: function (t, e) { var i = this.w; if (void 0 !== i.config.grid.row.colors && i.config.grid.row.colors.length > 0) for (var a = 0, s = i.globals.gridHeight / e, r = i.globals.gridWidth, o = 0, n = 0; o < e; o++, n++)n >= i.config.grid.row.colors.length && (n = 0), this._drawGridBandRect({ c: n, x1: 0, y1: a, x2: r, y2: s, type: "row" }), a += i.globals.gridHeight / e; if (void 0 !== i.config.grid.column.colors && i.config.grid.column.colors.length > 0) for (var l = i.globals.isBarHorizontal || "on" !== i.config.xaxis.tickPlacement || "category" !== i.config.xaxis.type && !i.config.xaxis.convertedCatToNumeric ? t : t - 1, h = i.globals.padHorizontal, c = i.globals.padHorizontal + i.globals.gridWidth / l, d = i.globals.gridHeight, g = 0, u = 0; g < t; g++, u++)u >= i.config.grid.column.colors.length && (u = 0), this._drawGridBandRect({ c: u, x1: h, y1: 0, x2: c, y2: d, type: "column" }), h += i.globals.gridWidth / l } }]), t }(), _ = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "niceScale", value: function (t, e) { var i, a, s, r, o = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 0, n = 1e-11, l = this.w, h = l.globals; h.isBarHorizontal ? (i = l.config.xaxis, a = Math.max((h.svgWidth - 100) / 25, 2)) : (i = l.config.yaxis[o], a = Math.max((h.svgHeight - 100) / 15, 2)), s = void 0 !== i.min && null !== i.min, r = void 0 !== i.max && null !== i.min; var c = void 0 !== i.stepSize && null !== i.stepSize, d = void 0 !== i.tickAmount && null !== i.tickAmount, g = d ? i.tickAmount : i.forceNiceScale ? h.niceScaleDefaultTicks[Math.min(Math.round(a / 2), h.niceScaleDefaultTicks.length - 1)] : 10; if (h.isMultipleYAxis && !d && h.multiAxisTickAmount > 0 && (g = h.multiAxisTickAmount, d = !0), g = "dataPoints" === g ? h.dataPoints - 1 : Math.abs(Math.round(g)), (t === Number.MIN_VALUE && 0 === e || !x.isNumber(t) && !x.isNumber(e) || t === Number.MIN_VALUE && e === -Number.MAX_VALUE) && (t = x.isNumber(i.min) ? i.min : 0, e = x.isNumber(i.max) ? i.max : t + g, h.allSeriesCollapsed = !1), t > e) { console.warn("axis.min cannot be greater than axis.max: swapping min and max"); var u = e; e = t, t = u } else t === e && (t = 0 === t ? 0 : t - 1, e = 0 === e ? 2 : e + 1); var p = []; g < 1 && (g = 1); var f = g, b = Math.abs(e - t); if (i.forceNiceScale) { !s && t > 0 && t / b < .15 && (t = 0, s = !0), !r && e < 0 && -e / b < .15 && (e = 0, r = !0), b = Math.abs(e - t) } var v = b / f, m = v, y = Math.floor(Math.log10(m)), w = Math.pow(10, y), k = Math.ceil(m / w); if (v = m = (k = h.niceScaleAllowedMagMsd[0 === h.yValueDecimal ? 0 : 1][k]) * w, h.isBarHorizontal && i.stepSize && "datetime" !== i.type ? (v = i.stepSize, c = !0) : c && (v = i.stepSize), c && i.forceNiceScale) { var A = Math.floor(Math.log10(v)); v *= Math.pow(10, y - A) } if (s && r) { var S = b / f; if (d) if (c) if (0 != x.mod(b, v)) { var C = x.getGCD(v, S); v = S / C < 10 ? C : S } else 0 == x.mod(v, S) ? v = S : (S = v, d = !1); else v = S; else if (c) 0 == x.mod(b, v) ? S = v : v = S; else if (0 == x.mod(b, v)) S = v; else { S = b / (f = Math.ceil(b / v)); var L = x.getGCD(b, v); b / L < a && (S = L), v = S } f = Math.round(b / v) } else { if (s || r) { if (r) if (d) t = e - v * f; else { var P = t; t = v * Math.floor(t / v), Math.abs(e - t) / x.getGCD(b, v) > a && (t = e - v * g, t += v * Math.floor((P - t) / v)) } else if (s) if (d) e = t + v * f; else { var M = e; e = v * Math.ceil(e / v), Math.abs(e - t) / x.getGCD(b, v) > a && (e = t + v * g, e += v * Math.ceil((M - e) / v)) } } else if (d) { var I = v / (e - t > e ? 1 : 2), T = I * Math.floor(t / I); Math.abs(T - t) <= I / 2 ? e = (t = T) + v * f : t = (e = I * Math.ceil(e / I)) - v * f } else t = v * Math.floor(t / v), e = v * Math.ceil(e / v); b = Math.abs(e - t), v = x.getGCD(b, v), f = Math.round(b / v) } if (d || s || r || (f = Math.ceil((b - n) / (v + n))) > 16 && x.getPrimeFactors(f).length < 2 && f++, !d && i.forceNiceScale && 0 === h.yValueDecimal && f > b && (f = b, v = Math.round(b / f)), f > a && (!d && !c || i.forceNiceScale)) { var z = x.getPrimeFactors(f), X = z.length - 1, E = f; t: for (var Y = 0; Y < X; Y++)for (var F = 0; F <= X - Y; F++) { for (var R = Math.min(F + Y, X), H = E, D = 1, O = F; O <= R; O++)D *= z[O]; if ((H /= D) < a) { E = H; break t } } v = E === f ? b : b / E, f = Math.round(b / v) } h.isMultipleYAxis && 0 == h.multiAxisTickAmount && h.ignoreYAxisIndexes.indexOf(o) < 0 && (h.multiAxisTickAmount = f); var N = t - v, W = v * n; do { N += v, p.push(x.stripNumber(N, 7)) } while (e - N > W); return { result: p, niceMin: p[0], niceMax: p[p.length - 1] } } }, { key: "linearScale", value: function (t, e) { var i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 10, a = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : 0, s = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : void 0, r = Math.abs(e - t); "dataPoints" === (i = this._adjustTicksForSmallRange(i, a, r)) && (i = this.w.globals.dataPoints - 1), s || (s = r / i), i === Number.MAX_VALUE && (i = 5, s = 1); for (var o = [], n = t; i >= 0;)o.push(n), n += s, i -= 1; return { result: o, niceMin: o[0], niceMax: o[o.length - 1] } } }, { key: "logarithmicScaleNice", value: function (t, e, i) { e <= 0 && (e = Math.max(t, i)), t <= 0 && (t = Math.min(e, i)); for (var a = [], s = Math.ceil(Math.log(e) / Math.log(i) + 1), r = Math.floor(Math.log(t) / Math.log(i)); r < s; r++)a.push(Math.pow(i, r)); return { result: a, niceMin: a[0], niceMax: a[a.length - 1] } } }, { key: "logarithmicScale", value: function (t, e, i) { e <= 0 && (e = Math.max(t, i)), t <= 0 && (t = Math.min(e, i)); for (var a = [], s = Math.log(e) / Math.log(i), r = Math.log(t) / Math.log(i), o = s - r, n = Math.round(o), l = o / n, h = 0, c = r; h < n; h++, c += l)a.push(Math.pow(i, c)); return a.push(Math.pow(i, s)), { result: a, niceMin: t, niceMax: e } } }, { key: "_adjustTicksForSmallRange", value: function (t, e, i) { var a = t; if (void 0 !== e && this.w.config.yaxis[e].labels.formatter && void 0 === this.w.config.yaxis[e].tickAmount) { var s = Number(this.w.config.yaxis[e].labels.formatter(1)); x.isNumber(s) && 0 === this.w.globals.yValueDecimal && (a = Math.ceil(i)) } return a < t ? a : t } }, { key: "setYScaleForIndex", value: function (t, e, i) { var a = this.w.globals, s = this.w.config, r = a.isBarHorizontal ? s.xaxis : s.yaxis[t]; void 0 === a.yAxisScale[t] && (a.yAxisScale[t] = []); var o = Math.abs(i - e); r.logarithmic && o <= 5 && (a.invalidLogScale = !0), r.logarithmic && o > 5 ? (a.allSeriesCollapsed = !1, a.yAxisScale[t] = r.forceNiceScale ? this.logarithmicScaleNice(e, i, r.logBase) : this.logarithmicScale(e, i, r.logBase)) : i !== -Number.MAX_VALUE && x.isNumber(i) && e !== Number.MAX_VALUE && x.isNumber(e) ? (a.allSeriesCollapsed = !1, a.yAxisScale[t] = this.niceScale(e, i, t)) : a.yAxisScale[t] = this.niceScale(Number.MIN_VALUE, 0, t) } }, { key: "setXScale", value: function (t, e) { var i = this.w, a = i.globals, s = Math.abs(e - t); return e !== -Number.MAX_VALUE && x.isNumber(e) ? a.xAxisScale = this.linearScale(t, e, i.config.xaxis.tickAmount ? i.config.xaxis.tickAmount : s < 10 && s > 1 ? s + 1 : 10, 0, i.config.xaxis.stepSize) : a.xAxisScale = this.linearScale(0, 10, 10), a.xAxisScale } }, { key: "setSeriesYAxisMappings", value: function () { var t = this.w.globals, e = this.w.config; t.minYArr, t.maxYArr; var i = [], a = [], s = [], r = t.series.length > e.yaxis.length || e.yaxis.some((function (t) { return Array.isArray(t.seriesName) })); e.series.forEach((function (t, e) { s.push(e), a.push(null) })), e.yaxis.forEach((function (t, e) { i[e] = [] })); var o = []; e.yaxis.forEach((function (t, a) { var n = !1; if (t.seriesName) { var l = []; Array.isArray(t.seriesName) ? l = t.seriesName : l.push(t.seriesName), l.forEach((function (t) { e.series.forEach((function (e, o) { if (e.name === t) { var l = o; a === o || r ? !r || s.indexOf(o) > -1 ? i[a].push([a, o]) : console.warn("Series '" + e.name + "' referenced more than once in what looks like the new style. That is, when using either seriesName: [], or when there are more series than yaxes.") : (i[o].push([o, a]), l = a), n = !0, -1 !== (l = s.indexOf(l)) && s.splice(l, 1) } })) })) } n || o.push(a) })), i = i.map((function (t, e) { var i = []; return t.forEach((function (t) { a[t[1]] = t[0], i.push(t[1]) })), i })); for (var n = e.yaxis.length - 1, l = 0; l < o.length && (n = o[l], i[n] = [], s); l++) { var h = s[0]; s.shift(), i[n].push(h), a[h] = n } s.forEach((function (t) { i[n].push(t), a[t] = n })), t.seriesYAxisMap = i.map((function (t) { return t })), t.seriesYAxisReverseMap = a.map((function (t) { return t })) } }, { key: "scaleMultipleYAxes", value: function () { var t = this, e = this.w.config, i = this.w.globals; this.setSeriesYAxisMappings(); var a = i.seriesYAxisMap, s = i.minYArr, r = i.maxYArr; i.allSeriesCollapsed = !0, i.barGroups = [], a.forEach((function (a, o) { var n = []; a.forEach((function (t) { var i = e.series[t].group; n.indexOf(i) < 0 && n.push(i) })), a.length > 0 ? function () { var l, h, c = Number.MAX_VALUE, d = -Number.MAX_VALUE, g = c, u = d; if (e.chart.stacked) !function () { var t = i.seriesX[a[0]], s = [], r = [], p = []; n.forEach((function () { s.push(t.map((function () { return Number.MIN_VALUE }))), r.push(t.map((function () { return Number.MIN_VALUE }))), p.push(t.map((function () { return Number.MIN_VALUE }))) })); for (var f = function (t) { !l && e.series[a[t]].type && (l = e.series[a[t]].type); var c = a[t]; h = e.series[c].group ? e.series[c].group : "axis-".concat(o), !(i.collapsedSeriesIndices.indexOf(c) < 0 && i.ancillaryCollapsedSeriesIndices.indexOf(c) < 0) || (i.allSeriesCollapsed = !1, n.forEach((function (t, a) { if (e.series[c].group === t) for (var o = 0; o < i.series[c].length; o++) { var n = i.series[c][o]; n >= 0 ? r[a][o] += n : p[a][o] += n, s[a][o] += n, g = Math.min(g, n), u = Math.max(u, n) } }))), "bar" !== l && "column" !== l || i.barGroups.push(h) }, x = 0; x < a.length; x++)f(x); l || (l = e.chart.type), "bar" === l || "column" === l ? n.forEach((function (t, e) { c = Math.min(c, Math.min.apply(null, p[e])), d = Math.max(d, Math.max.apply(null, r[e])) })) : (n.forEach((function (t, e) { g = Math.min(g, Math.min.apply(null, s[e])), u = Math.max(u, Math.max.apply(null, s[e])) })), c = g, d = u), c === Number.MIN_VALUE && d === Number.MIN_VALUE && (d = -Number.MAX_VALUE) }(); else for (var p = 0; p < a.length; p++) { var f = a[p]; c = Math.min(c, s[f]), d = Math.max(d, r[f]), !(i.collapsedSeriesIndices.indexOf(f) < 0 && i.ancillaryCollapsedSeriesIndices.indexOf(f) < 0) || (i.allSeriesCollapsed = !1) } void 0 !== e.yaxis[o].min && (c = "function" == typeof e.yaxis[o].min ? e.yaxis[o].min(c) : e.yaxis[o].min), void 0 !== e.yaxis[o].max && (d = "function" == typeof e.yaxis[o].max ? e.yaxis[o].max(d) : e.yaxis[o].max), i.barGroups = i.barGroups.filter((function (t, e, i) { return i.indexOf(t) === e })), t.setYScaleForIndex(o, c, d), a.forEach((function (t) { s[t] = i.yAxisScale[o].niceMin, r[t] = i.yAxisScale[o].niceMax })) }() : t.setYScaleForIndex(o, 0, -Number.MAX_VALUE) })) } }]), t }(), U = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w, this.scales = new _(e) } return r(t, [{ key: "init", value: function () { this.setYRange(), this.setXRange(), this.setZRange() } }, { key: "getMinYMaxY", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : Number.MAX_VALUE, i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : -Number.MAX_VALUE, a = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : null, s = this.w.config, r = this.w.globals, o = -Number.MAX_VALUE, n = Number.MIN_VALUE; null === a && (a = t + 1); var l = 0, h = 0, c = void 0; if (r.seriesX.length >= a) { var d, g; l = 0, h = (c = u(new Set((d = []).concat.apply(d, u(r.seriesX.slice(t, a)))))).length - 1; var p = null === (g = r.brushSource) || void 0 === g ? void 0 : g.w.config.chart.brush; if (s.chart.zoom.enabled && s.chart.zoom.autoScaleYaxis || null != p && p.enabled && null != p && p.autoScaleYaxis) { if (s.xaxis.min) for (l = 0; l < h && c[l] < s.xaxis.min; l++); if (s.xaxis.max) for (; h > l && c[h] > s.xaxis.max; h--); } } var f = r.series, b = f, v = f; "candlestick" === s.chart.type ? (b = r.seriesCandleL, v = r.seriesCandleH) : "boxPlot" === s.chart.type ? (b = r.seriesCandleO, v = r.seriesCandleC) : r.isRangeData && (b = r.seriesRangeStart, v = r.seriesRangeEnd); for (var m = t; m < a; m++) { r.dataPoints = Math.max(r.dataPoints, f[m].length); var y = s.series[m].type; r.categoryLabels.length && (r.dataPoints = r.categoryLabels.filter((function (t) { return void 0 !== t })).length), r.labels.length && "datetime" !== s.xaxis.type && 0 !== r.series.reduce((function (t, e) { return t + e.length }), 0) && (r.dataPoints = Math.max(r.dataPoints, r.labels.length)), c || (l = 0, h = r.series[m].length); for (var w = l; w <= h && w < r.series[m].length; w++) { var k = f[m][w]; if (null !== k && x.isNumber(k)) { switch (void 0 !== v[m][w] && (o = Math.max(o, v[m][w]), e = Math.min(e, v[m][w])), void 0 !== b[m][w] && (e = Math.min(e, b[m][w]), i = Math.max(i, b[m][w])), y) { case "candlestick": void 0 !== r.seriesCandleC[m][w] && (o = Math.max(o, r.seriesCandleH[m][w]), e = Math.min(e, r.seriesCandleL[m][w])); break; case "boxPlot": void 0 !== r.seriesCandleC[m][w] && (o = Math.max(o, r.seriesCandleC[m][w]), e = Math.min(e, r.seriesCandleO[m][w])) }y && "candlestick" !== y && "boxPlot" !== y && "rangeArea" !== y && "rangeBar" !== y && (o = Math.max(o, r.series[m][w]), e = Math.min(e, r.series[m][w])), i = o, r.seriesGoals[m] && r.seriesGoals[m][w] && Array.isArray(r.seriesGoals[m][w]) && r.seriesGoals[m][w].forEach((function (t) { n !== Number.MIN_VALUE && (n = Math.min(n, t.value), e = n), o = Math.max(o, t.value), i = o })), x.isFloat(k) && (k = x.noExponents(k), r.yValueDecimal = Math.max(r.yValueDecimal, k.toString().split(".")[1].length)), n > b[m][w] && b[m][w] < 0 && (n = b[m][w]) } else r.hasNullValues = !0 } "bar" !== y && "column" !== y || (n < 0 && o < 0 && (o = 0, i = Math.max(i, 0)), n === Number.MIN_VALUE && (n = 0, e = Math.min(e, 0))) } return "rangeBar" === s.chart.type && r.seriesRangeStart.length && r.isBarHorizontal && (n = e), "bar" === s.chart.type && (n < 0 && o < 0 && (o = 0), n === Number.MIN_VALUE && (n = 0)), { minY: n, maxY: o, lowestY: e, highestY: i } } }, { key: "setYRange", value: function () { var t = this.w.globals, e = this.w.config; t.maxY = -Number.MAX_VALUE, t.minY = Number.MIN_VALUE; var i, a = Number.MAX_VALUE; if (t.isMultipleYAxis) { a = Number.MAX_VALUE; for (var s = 0; s < t.series.length; s++)i = this.getMinYMaxY(s), t.minYArr[s] = i.lowestY, t.maxYArr[s] = i.highestY, a = Math.min(a, i.lowestY) } if (i = this.getMinYMaxY(0, a, null, t.series.length), "bar" === e.chart.type ? (t.minY = i.minY, t.maxY = i.maxY) : (t.minY = i.lowestY, t.maxY = i.highestY), a = i.lowestY, e.chart.stacked && this._setStackedMinMax(), "line" === e.chart.type || "area" === e.chart.type || "scatter" === e.chart.type || "candlestick" === e.chart.type || "boxPlot" === e.chart.type || "rangeBar" === e.chart.type && !t.isBarHorizontal ? t.minY === Number.MIN_VALUE && a !== -Number.MAX_VALUE && a !== t.maxY && (t.minY = a) : t.minY = i.minY, e.yaxis.forEach((function (e, i) { void 0 !== e.max && ("number" == typeof e.max ? t.maxYArr[i] = e.max : "function" == typeof e.max && (t.maxYArr[i] = e.max(t.isMultipleYAxis ? t.maxYArr[i] : t.maxY)), t.maxY = t.maxYArr[i]), void 0 !== e.min && ("number" == typeof e.min ? t.minYArr[i] = e.min : "function" == typeof e.min && (t.minYArr[i] = e.min(t.isMultipleYAxis ? t.minYArr[i] === Number.MIN_VALUE ? 0 : t.minYArr[i] : t.minY)), t.minY = t.minYArr[i]) })), t.isBarHorizontal) { ["min", "max"].forEach((function (i) { void 0 !== e.xaxis[i] && "number" == typeof e.xaxis[i] && ("min" === i ? t.minY = e.xaxis[i] : t.maxY = e.xaxis[i]) })) } return t.isMultipleYAxis ? (this.scales.scaleMultipleYAxes(), t.minY = a) : (this.scales.setYScaleForIndex(0, t.minY, t.maxY), t.minY = t.yAxisScale[0].niceMin, t.maxY = t.yAxisScale[0].niceMax, t.minYArr[0] = t.minY, t.maxYArr[0] = t.maxY), t.barGroups = [], t.lineGroups = [], t.areaGroups = [], e.series.forEach((function (i) { switch (i.type || e.chart.type) { case "bar": case "column": t.barGroups.push(i.group); break; case "line": t.lineGroups.push(i.group); break; case "area": t.areaGroups.push(i.group) } })), t.barGroups = t.barGroups.filter((function (t, e, i) { return i.indexOf(t) === e })), t.lineGroups = t.lineGroups.filter((function (t, e, i) { return i.indexOf(t) === e })), t.areaGroups = t.areaGroups.filter((function (t, e, i) { return i.indexOf(t) === e })), { minY: t.minY, maxY: t.maxY, minYArr: t.minYArr, maxYArr: t.maxYArr, yAxisScale: t.yAxisScale } } }, { key: "setXRange", value: function () { var t = this.w.globals, e = this.w.config, i = "numeric" === e.xaxis.type || "datetime" === e.xaxis.type || "category" === e.xaxis.type && !t.noLabelsProvided || t.noLabelsProvided || t.isXNumeric; if (t.isXNumeric && function () { for (var e = 0; e < t.series.length; e++)if (t.labels[e]) for (var i = 0; i < t.labels[e].length; i++)null !== t.labels[e][i] && x.isNumber(t.labels[e][i]) && (t.maxX = Math.max(t.maxX, t.labels[e][i]), t.initialMaxX = Math.max(t.maxX, t.labels[e][i]), t.minX = Math.min(t.minX, t.labels[e][i]), t.initialMinX = Math.min(t.minX, t.labels[e][i])) }(), t.noLabelsProvided && 0 === e.xaxis.categories.length && (t.maxX = t.labels[t.labels.length - 1], t.initialMaxX = t.labels[t.labels.length - 1], t.minX = 1, t.initialMinX = 1), t.isXNumeric || t.noLabelsProvided || t.dataFormatXNumeric) { var a; if (void 0 === e.xaxis.tickAmount ? (a = Math.round(t.svgWidth / 150), "numeric" === e.xaxis.type && t.dataPoints < 30 && (a = t.dataPoints - 1), a > t.dataPoints && 0 !== t.dataPoints && (a = t.dataPoints - 1)) : "dataPoints" === e.xaxis.tickAmount ? (t.series.length > 1 && (a = t.series[t.maxValsInArrayIndex].length - 1), t.isXNumeric && (a = t.maxX - t.minX - 1)) : a = e.xaxis.tickAmount, t.xTickAmount = a, void 0 !== e.xaxis.max && "number" == typeof e.xaxis.max && (t.maxX = e.xaxis.max), void 0 !== e.xaxis.min && "number" == typeof e.xaxis.min && (t.minX = e.xaxis.min), void 0 !== e.xaxis.range && (t.minX = t.maxX - e.xaxis.range), t.minX !== Number.MAX_VALUE && t.maxX !== -Number.MAX_VALUE) if (e.xaxis.convertedCatToNumeric && !t.dataFormatXNumeric) { for (var s = [], r = t.minX - 1; r < t.maxX; r++)s.push(r + 1); t.xAxisScale = { result: s, niceMin: s[0], niceMax: s[s.length - 1] } } else t.xAxisScale = this.scales.setXScale(t.minX, t.maxX); else t.xAxisScale = this.scales.linearScale(0, a, a, 0, e.xaxis.stepSize), t.noLabelsProvided && t.labels.length > 0 && (t.xAxisScale = this.scales.linearScale(1, t.labels.length, a - 1, 0, e.xaxis.stepSize), t.seriesX = t.labels.slice()); i && (t.labels = t.xAxisScale.result.slice()) } return t.isBarHorizontal && t.labels.length && (t.xTickAmount = t.labels.length), this._handleSingleDataPoint(), this._getMinXDiff(), { minX: t.minX, maxX: t.maxX } } }, { key: "setZRange", value: function () { var t = this.w.globals; if (t.isDataXYZ) for (var e = 0; e < t.series.length; e++)if (void 0 !== t.seriesZ[e]) for (var i = 0; i < t.seriesZ[e].length; i++)null !== t.seriesZ[e][i] && x.isNumber(t.seriesZ[e][i]) && (t.maxZ = Math.max(t.maxZ, t.seriesZ[e][i]), t.minZ = Math.min(t.minZ, t.seriesZ[e][i])) } }, { key: "_handleSingleDataPoint", value: function () { var t = this.w.globals, e = this.w.config; if (t.minX === t.maxX) { var i = new A(this.ctx); if ("datetime" === e.xaxis.type) { var a = i.getDate(t.minX); e.xaxis.labels.datetimeUTC ? a.setUTCDate(a.getUTCDate() - 2) : a.setDate(a.getDate() - 2), t.minX = new Date(a).getTime(); var s = i.getDate(t.maxX); e.xaxis.labels.datetimeUTC ? s.setUTCDate(s.getUTCDate() + 2) : s.setDate(s.getDate() + 2), t.maxX = new Date(s).getTime() } else ("numeric" === e.xaxis.type || "category" === e.xaxis.type && !t.noLabelsProvided) && (t.minX = t.minX - 2, t.initialMinX = t.minX, t.maxX = t.maxX + 2, t.initialMaxX = t.maxX) } } }, { key: "_getMinXDiff", value: function () { var t = this.w.globals; t.isXNumeric && t.seriesX.forEach((function (e, i) { 1 === e.length && e.push(t.seriesX[t.maxValsInArrayIndex][t.seriesX[t.maxValsInArrayIndex].length - 1]); var a = e.slice(); a.sort((function (t, e) { return t - e })), a.forEach((function (e, i) { if (i > 0) { var s = e - a[i - 1]; s > 0 && (t.minXDiff = Math.min(s, t.minXDiff)) } })), 1 !== t.dataPoints && t.minXDiff !== Number.MAX_VALUE || (t.minXDiff = .5) })) } }, { key: "_setStackedMinMax", value: function () { var t = this, e = this.w.globals; if (e.series.length) { var i = e.seriesGroups; i.length || (i = [this.w.globals.seriesNames.map((function (t) { return t }))]); var a = {}, s = {}; i.forEach((function (i) { a[i] = [], s[i] = [], t.w.config.series.map((function (t, a) { return i.indexOf(e.seriesNames[a]) > -1 ? a : null })).filter((function (t) { return null !== t })).forEach((function (r) { for (var o = 0; o < e.series[e.maxValsInArrayIndex].length; o++) { var n, l, h, c; void 0 === a[i][o] && (a[i][o] = 0, s[i][o] = 0), (t.w.config.chart.stacked && !e.comboCharts || t.w.config.chart.stacked && e.comboCharts && (!t.w.config.chart.stackOnlyBar || "bar" === (null === (n = t.w.config.series) || void 0 === n || null === (l = n[r]) || void 0 === l ? void 0 : l.type) || "column" === (null === (h = t.w.config.series) || void 0 === h || null === (c = h[r]) || void 0 === c ? void 0 : c.type))) && null !== e.series[r][o] && x.isNumber(e.series[r][o]) && (e.series[r][o] > 0 ? a[i][o] += parseFloat(e.series[r][o]) + 1e-4 : s[i][o] += parseFloat(e.series[r][o])) } })) })), Object.entries(a).forEach((function (t) { var i = g(t, 1)[0]; a[i].forEach((function (t, r) { e.maxY = Math.max(e.maxY, a[i][r]), e.minY = Math.min(e.minY, s[i][r]) })) })) } } }]), t }(), q = function () { function t(e, i) { a(this, t), this.ctx = e, this.elgrid = i, this.w = e.w; var s = this.w; this.xaxisFontSize = s.config.xaxis.labels.style.fontSize, this.axisFontFamily = s.config.xaxis.labels.style.fontFamily, this.xaxisForeColors = s.config.xaxis.labels.style.colors, this.isCategoryBarHorizontal = "bar" === s.config.chart.type && s.config.plotOptions.bar.horizontal, this.xAxisoffX = 0, "bottom" === s.config.xaxis.position && (this.xAxisoffX = s.globals.gridHeight), this.drawnLabels = [], this.axesUtils = new C(e) } return r(t, [{ key: "drawYaxis", value: function (t) { var e = this, i = this.w, a = new m(this.ctx), s = i.config.yaxis[t].labels.style, r = s.fontSize, o = s.fontFamily, n = s.fontWeight, l = a.group({ class: "apexcharts-yaxis", rel: t, transform: "translate(" + i.globals.translateYAxisX[t] + ", 0)" }); if (this.axesUtils.isYAxisHidden(t)) return l; var h = a.group({ class: "apexcharts-yaxis-texts-g" }); l.add(h); var c = i.globals.yAxisScale[t].result.length - 1, d = i.globals.gridHeight / c, g = i.globals.yLabelFormatters[t], u = i.globals.yAxisScale[t].result.slice(); u = this.axesUtils.checkForReversedLabels(t, u); var p = ""; if (i.config.yaxis[t].labels.show) { var f = i.globals.translateY + i.config.yaxis[t].labels.offsetY; i.globals.isBarHorizontal ? f = 0 : "heatmap" === i.config.chart.type && (f -= d / 2), f += parseInt(i.config.yaxis[t].labels.style.fontSize, 10) / 3; for (var x = function (l) { var x = u[l]; x = g(x, l, i); var b = i.config.yaxis[t].labels.padding; i.config.yaxis[t].opposite && 0 !== i.config.yaxis.length && (b *= -1); var v = "end"; i.config.yaxis[t].opposite && (v = "start"), "left" === i.config.yaxis[t].labels.align ? v = "start" : "center" === i.config.yaxis[t].labels.align ? v = "middle" : "right" === i.config.yaxis[t].labels.align && (v = "end"); var m = e.axesUtils.getYAxisForeColor(s.colors, t), y = a.drawText({ x: b, y: f, text: x, textAnchor: v, fontSize: r, fontFamily: o, fontWeight: n, maxWidth: i.config.yaxis[t].labels.maxWidth, foreColor: Array.isArray(m) ? m[l] : m, isPlainText: !1, cssClass: "apexcharts-yaxis-label " + s.cssClass }); l === c && (p = y), h.add(y); var w = document.createElementNS(i.globals.SVGNS, "title"); if (w.textContent = Array.isArray(x) ? x.join(" ") : x, y.node.appendChild(w), 0 !== i.config.yaxis[t].labels.rotate) { var k = a.rotateAroundCenter(p.node), A = a.rotateAroundCenter(y.node); y.node.setAttribute("transform", "rotate(".concat(i.config.yaxis[t].labels.rotate, " ").concat(k.x, " ").concat(A.y, ")")) } f += d }, b = c; b >= 0; b--)x(b) } if (void 0 !== i.config.yaxis[t].title.text) { var v = a.group({ class: "apexcharts-yaxis-title" }), y = 0; i.config.yaxis[t].opposite && (y = i.globals.translateYAxisX[t]); var w = a.drawText({ x: y, y: i.globals.gridHeight / 2 + i.globals.translateY + i.config.yaxis[t].title.offsetY, text: i.config.yaxis[t].title.text, textAnchor: "end", foreColor: i.config.yaxis[t].title.style.color, fontSize: i.config.yaxis[t].title.style.fontSize, fontWeight: i.config.yaxis[t].title.style.fontWeight, fontFamily: i.config.yaxis[t].title.style.fontFamily, cssClass: "apexcharts-yaxis-title-text " + i.config.yaxis[t].title.style.cssClass }); v.add(w), l.add(v) } var k = i.config.yaxis[t].axisBorder, A = 31 + k.offsetX; if (i.config.yaxis[t].opposite && (A = -31 - k.offsetX), k.show) { var S = a.drawLine(A, i.globals.translateY + k.offsetY - 2, A, i.globals.gridHeight + i.globals.translateY + k.offsetY + 2, k.color, 0, k.width); l.add(S) } return i.config.yaxis[t].axisTicks.show && this.axesUtils.drawYAxisTicks(A, c, k, i.config.yaxis[t].axisTicks, t, d, l), l } }, { key: "drawYaxisInversed", value: function (t) { var e = this.w, i = new m(this.ctx), a = i.group({ class: "apexcharts-xaxis apexcharts-yaxis-inversed" }), s = i.group({ class: "apexcharts-xaxis-texts-g", transform: "translate(".concat(e.globals.translateXAxisX, ", ").concat(e.globals.translateXAxisY, ")") }); a.add(s); var r = e.globals.yAxisScale[t].result.length - 1, o = e.globals.gridWidth / r + .1, n = o + e.config.xaxis.labels.offsetX, l = e.globals.xLabelFormatter, h = e.globals.yAxisScale[t].result.slice(), c = e.globals.timescaleLabels; c.length > 0 && (this.xaxisLabels = c.slice(), r = (h = c.slice()).length), h = this.axesUtils.checkForReversedLabels(t, h); var d = c.length; if (e.config.xaxis.labels.show) for (var g = d ? 0 : r; d ? g < d : g >= 0; d ? g++ : g--) { var u = h[g]; u = l(u, g, e); var p = e.globals.gridWidth + e.globals.padHorizontal - (n - o + e.config.xaxis.labels.offsetX); if (c.length) { var f = this.axesUtils.getLabel(h, c, p, g, this.drawnLabels, this.xaxisFontSize); p = f.x, u = f.text, this.drawnLabels.push(f.text), 0 === g && e.globals.skipFirstTimelinelabel && (u = ""), g === h.length - 1 && e.globals.skipLastTimelinelabel && (u = "") } var x = i.drawText({ x: p, y: this.xAxisoffX + e.config.xaxis.labels.offsetY + 30 - ("top" === e.config.xaxis.position ? e.globals.xAxisHeight + e.config.xaxis.axisTicks.height - 2 : 0), text: u, textAnchor: "middle", foreColor: Array.isArray(this.xaxisForeColors) ? this.xaxisForeColors[t] : this.xaxisForeColors, fontSize: this.xaxisFontSize, fontFamily: this.xaxisFontFamily, fontWeight: e.config.xaxis.labels.style.fontWeight, isPlainText: !1, cssClass: "apexcharts-xaxis-label " + e.config.xaxis.labels.style.cssClass }); s.add(x), x.tspan(u); var b = document.createElementNS(e.globals.SVGNS, "title"); b.textContent = u, x.node.appendChild(b), n += o } return this.inversedYAxisTitleText(a), this.inversedYAxisBorder(a), a } }, { key: "inversedYAxisBorder", value: function (t) { var e = this.w, i = new m(this.ctx), a = e.config.xaxis.axisBorder; if (a.show) { var s = 0; "bar" === e.config.chart.type && e.globals.isXNumeric && (s -= 15); var r = i.drawLine(e.globals.padHorizontal + s + a.offsetX, this.xAxisoffX, e.globals.gridWidth, this.xAxisoffX, a.color, 0, a.height); this.elgrid && this.elgrid.elGridBorders && e.config.grid.show ? this.elgrid.elGridBorders.add(r) : t.add(r) } } }, { key: "inversedYAxisTitleText", value: function (t) { var e = this.w, i = new m(this.ctx); if (void 0 !== e.config.xaxis.title.text) { var a = i.group({ class: "apexcharts-xaxis-title apexcharts-yaxis-title-inversed" }), s = i.drawText({ x: e.globals.gridWidth / 2 + e.config.xaxis.title.offsetX, y: this.xAxisoffX + parseFloat(this.xaxisFontSize) + parseFloat(e.config.xaxis.title.style.fontSize) + e.config.xaxis.title.offsetY + 20, text: e.config.xaxis.title.text, textAnchor: "middle", fontSize: e.config.xaxis.title.style.fontSize, fontFamily: e.config.xaxis.title.style.fontFamily, fontWeight: e.config.xaxis.title.style.fontWeight, foreColor: e.config.xaxis.title.style.color, cssClass: "apexcharts-xaxis-title-text " + e.config.xaxis.title.style.cssClass }); a.add(s), t.add(a) } } }, { key: "yAxisTitleRotate", value: function (t, e) { var i = this.w, a = new m(this.ctx), s = { width: 0, height: 0 }, r = { width: 0, height: 0 }, o = i.globals.dom.baseEl.querySelector(" .apexcharts-yaxis[rel='".concat(t, "'] .apexcharts-yaxis-texts-g")); null !== o && (s = o.getBoundingClientRect()); var n = i.globals.dom.baseEl.querySelector(".apexcharts-yaxis[rel='".concat(t, "'] .apexcharts-yaxis-title text")); if (null !== n && (r = n.getBoundingClientRect()), null !== n) { var l = this.xPaddingForYAxisTitle(t, s, r, e); n.setAttribute("x", l.xPos - (e ? 10 : 0)) } if (null !== n) { var h = a.rotateAroundCenter(n); n.setAttribute("transform", "rotate(".concat(e ? -1 * i.config.yaxis[t].title.rotate : i.config.yaxis[t].title.rotate, " ").concat(h.x, " ").concat(h.y, ")")) } } }, { key: "xPaddingForYAxisTitle", value: function (t, e, i, a) { var s = this.w, r = 0, o = 0, n = 10; return void 0 === s.config.yaxis[t].title.text || t < 0 ? { xPos: o, padd: 0 } : (a ? (o = e.width + s.config.yaxis[t].title.offsetX + i.width / 2 + n / 2, 0 === (r += 1) && (o -= n / 2)) : (o = -1 * e.width + s.config.yaxis[t].title.offsetX + n / 2 + i.width / 2, s.globals.isBarHorizontal && (n = 25, o = -1 * e.width - s.config.yaxis[t].title.offsetX - n)), { xPos: o, padd: n }) } }, { key: "setYAxisXPosition", value: function (t, e) { var i = this.w, a = 0, s = 0, r = 18, o = 1; i.config.yaxis.length > 1 && (this.multipleYs = !0), i.config.yaxis.map((function (n, l) { var h = i.globals.ignoreYAxisIndexes.indexOf(l) > -1 || !n.show || n.floating || 0 === t[l].width, c = t[l].width + e[l].width; n.opposite ? i.globals.isBarHorizontal ? (s = i.globals.gridWidth + i.globals.translateX - 1, i.globals.translateYAxisX[l] = s - n.labels.offsetX) : (s = i.globals.gridWidth + i.globals.translateX + o, h || (o = o + c + 20), i.globals.translateYAxisX[l] = s - n.labels.offsetX + 20) : (a = i.globals.translateX - r, h || (r = r + c + 20), i.globals.translateYAxisX[l] = a + n.labels.offsetX) })) } }, { key: "setYAxisTextAlignments", value: function () { var t = this.w, e = t.globals.dom.baseEl.getElementsByClassName("apexcharts-yaxis"); (e = x.listToArray(e)).forEach((function (e, i) { var a = t.config.yaxis[i]; if (a && !a.floating && void 0 !== a.labels.align) { var s = t.globals.dom.baseEl.querySelector(".apexcharts-yaxis[rel='".concat(i, "'] .apexcharts-yaxis-texts-g")), r = t.globals.dom.baseEl.querySelectorAll(".apexcharts-yaxis[rel='".concat(i, "'] .apexcharts-yaxis-label")); r = x.listToArray(r); var o = s.getBoundingClientRect(); "left" === a.labels.align ? (r.forEach((function (t, e) { t.setAttribute("text-anchor", "start") })), a.opposite || s.setAttribute("transform", "translate(-".concat(o.width, ", 0)"))) : "center" === a.labels.align ? (r.forEach((function (t, e) { t.setAttribute("text-anchor", "middle") })), s.setAttribute("transform", "translate(".concat(o.width / 2 * (a.opposite ? 1 : -1), ", 0)"))) : "right" === a.labels.align && (r.forEach((function (t, e) { t.setAttribute("text-anchor", "end") })), a.opposite && s.setAttribute("transform", "translate(".concat(o.width, ", 0)"))) } })) } }]), t }(), Z = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w, this.documentEvent = x.bind(this.documentEvent, this) } return r(t, [{ key: "addEventListener", value: function (t, e) { var i = this.w; i.globals.events.hasOwnProperty(t) ? i.globals.events[t].push(e) : i.globals.events[t] = [e] } }, { key: "removeEventListener", value: function (t, e) { var i = this.w; if (i.globals.events.hasOwnProperty(t)) { var a = i.globals.events[t].indexOf(e); -1 !== a && i.globals.events[t].splice(a, 1) } } }, { key: "fireEvent", value: function (t, e) { var i = this.w; if (i.globals.events.hasOwnProperty(t)) { e && e.length || (e = []); for (var a = i.globals.events[t], s = a.length, r = 0; r < s; r++)a[r].apply(null, e) } } }, { key: "setupEventHandlers", value: function () { var t = this, e = this.w, i = this.ctx, a = e.globals.dom.baseEl.querySelector(e.globals.chartClass); this.ctx.eventList.forEach((function (t) { a.addEventListener(t, (function (t) { var a = Object.assign({}, e, { seriesIndex: e.globals.axisCharts ? e.globals.capturedSeriesIndex : 0, dataPointIndex: e.globals.capturedDataPointIndex }); "mousemove" === t.type || "touchmove" === t.type ? "function" == typeof e.config.chart.events.mouseMove && e.config.chart.events.mouseMove(t, i, a) : "mouseleave" === t.type || "touchleave" === t.type ? "function" == typeof e.config.chart.events.mouseLeave && e.config.chart.events.mouseLeave(t, i, a) : ("mouseup" === t.type && 1 === t.which || "touchend" === t.type) && ("function" == typeof e.config.chart.events.click && e.config.chart.events.click(t, i, a), i.ctx.events.fireEvent("click", [t, i, a])) }), { capture: !1, passive: !0 }) })), this.ctx.eventList.forEach((function (i) { e.globals.dom.baseEl.addEventListener(i, t.documentEvent, { passive: !0 }) })), this.ctx.core.setupBrushHandler() } }, { key: "documentEvent", value: function (t) { var e = this.w, i = t.target.className; if ("click" === t.type) { var a = e.globals.dom.baseEl.querySelector(".apexcharts-menu"); a && a.classList.contains("apexcharts-menu-open") && "apexcharts-menu-icon" !== i && a.classList.remove("apexcharts-menu-open") } e.globals.clientX = "touchmove" === t.type ? t.touches[0].clientX : t.clientX, e.globals.clientY = "touchmove" === t.type ? t.touches[0].clientY : t.clientY } }]), t }(), $ = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "setCurrentLocaleValues", value: function (t) { var e = this.w.config.chart.locales; window.Apex.chart && window.Apex.chart.locales && window.Apex.chart.locales.length > 0 && (e = this.w.config.chart.locales.concat(window.Apex.chart.locales)); var i = e.filter((function (e) { return e.name === t }))[0]; if (!i) throw new Error("Wrong locale name provided. Please make sure you set the correct locale name in options"); var a = x.extend(M, i); this.w.globals.locale = a.options } }]), t }(), J = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "drawAxis", value: function (t, e) { var i, a, s = this, r = this.w.globals, o = this.w.config, n = new V(this.ctx, e), l = new q(this.ctx, e); r.axisCharts && "radar" !== t && (r.isBarHorizontal ? (a = l.drawYaxisInversed(0), i = n.drawXaxisInversed(0), r.dom.elGraphical.add(i), r.dom.elGraphical.add(a)) : (i = n.drawXaxis(), r.dom.elGraphical.add(i), o.yaxis.map((function (t, e) { if (-1 === r.ignoreYAxisIndexes.indexOf(e) && (a = l.drawYaxis(e), r.dom.Paper.add(a), "back" === s.w.config.grid.position)) { var i = r.dom.Paper.children()[1]; i.remove(), r.dom.Paper.add(i) } })))) } }]), t }(), Q = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "drawXCrosshairs", value: function () { var t = this.w, e = new m(this.ctx), i = new v(this.ctx), a = t.config.xaxis.crosshairs.fill.gradient, s = t.config.xaxis.crosshairs.dropShadow, r = t.config.xaxis.crosshairs.fill.type, o = a.colorFrom, n = a.colorTo, l = a.opacityFrom, h = a.opacityTo, c = a.stops, d = s.enabled, g = s.left, u = s.top, p = s.blur, f = s.color, b = s.opacity, y = t.config.xaxis.crosshairs.fill.color; if (t.config.xaxis.crosshairs.show) { "gradient" === r && (y = e.drawGradient("vertical", o, n, l, h, null, c, null)); var w = e.drawRect(); 1 === t.config.xaxis.crosshairs.width && (w = e.drawLine()); var k = t.globals.gridHeight; (!x.isNumber(k) || k < 0) && (k = 0); var A = t.config.xaxis.crosshairs.width; (!x.isNumber(A) || A < 0) && (A = 0), w.attr({ class: "apexcharts-xcrosshairs", x: 0, y: 0, y2: k, width: A, height: k, fill: y, filter: "none", "fill-opacity": t.config.xaxis.crosshairs.opacity, stroke: t.config.xaxis.crosshairs.stroke.color, "stroke-width": t.config.xaxis.crosshairs.stroke.width, "stroke-dasharray": t.config.xaxis.crosshairs.stroke.dashArray }), d && (w = i.dropShadow(w, { left: g, top: u, blur: p, color: f, opacity: b })), t.globals.dom.elGraphical.add(w) } } }, { key: "drawYCrosshairs", value: function () { var t = this.w, e = new m(this.ctx), i = t.config.yaxis[0].crosshairs, a = t.globals.barPadForNumericAxis; if (t.config.yaxis[0].crosshairs.show) { var s = e.drawLine(-a, 0, t.globals.gridWidth + a, 0, i.stroke.color, i.stroke.dashArray, i.stroke.width); s.attr({ class: "apexcharts-ycrosshairs" }), t.globals.dom.elGraphical.add(s) } var r = e.drawLine(-a, 0, t.globals.gridWidth + a, 0, i.stroke.color, 0, 0); r.attr({ class: "apexcharts-ycrosshairs-hidden" }), t.globals.dom.elGraphical.add(r) } }]), t }(), K = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "checkResponsiveConfig", value: function (t) { var e = this, i = this.w, a = i.config; if (0 !== a.responsive.length) { var s = a.responsive.slice(); s.sort((function (t, e) { return t.breakpoint > e.breakpoint ? 1 : e.breakpoint > t.breakpoint ? -1 : 0 })).reverse(); var r = new Y({}), o = function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, a = s[0].breakpoint, o = window.innerWidth > 0 ? window.innerWidth : screen.width; if (o > a) { var n = x.clone(i.globals.initialConfig); n.series = x.clone(i.config.series); var l = y.extendArrayProps(r, n, i); t = x.extend(l, t), t = x.extend(i.config, t), e.overrideResponsiveOptions(t) } else for (var h = 0; h < s.length; h++)if (o < s[h].breakpoint) { var c = y.extendArrayProps(r, s[h].options, i); t = x.extend(c, t), t = x.extend(i.config, t), e.overrideResponsiveOptions(t) } }; if (t) { var n = y.extendArrayProps(r, t, i); n = x.extend(i.config, n), o(n = x.extend(n, t)) } else o({}) } } }, { key: "overrideResponsiveOptions", value: function (t) { var e = new Y(t).init({ responsiveOverride: !0 }); this.w.config = e } }]), t }(), tt = function () { function t(e) { a(this, t), this.ctx = e, this.colors = [], this.w = e.w; var i = this.w; this.isColorFn = !1, this.isHeatmapDistributed = "treemap" === i.config.chart.type && i.config.plotOptions.treemap.distributed || "heatmap" === i.config.chart.type && i.config.plotOptions.heatmap.distributed, this.isBarDistributed = i.config.plotOptions.bar.distributed && ("bar" === i.config.chart.type || "rangeBar" === i.config.chart.type) } return r(t, [{ key: "init", value: function () { this.setDefaultColors() } }, { key: "setDefaultColors", value: function () { var t, e = this, i = this.w, a = new x; if (i.globals.dom.elWrap.classList.add("apexcharts-theme-".concat(i.config.theme.mode)), void 0 === i.config.colors || 0 === (null === (t = i.config.colors) || void 0 === t ? void 0 : t.length) ? i.globals.colors = this.predefined() : (i.globals.colors = i.config.colors, Array.isArray(i.config.colors) && i.config.colors.length > 0 && "function" == typeof i.config.colors[0] && (i.globals.colors = i.config.series.map((function (t, a) { var s = i.config.colors[a]; return s || (s = i.config.colors[0]), "function" == typeof s ? (e.isColorFn = !0, s({ value: i.globals.axisCharts ? i.globals.series[a][0] ? i.globals.series[a][0] : 0 : i.globals.series[a], seriesIndex: a, dataPointIndex: a, w: i })) : s })))), i.globals.seriesColors.map((function (t, e) { t && (i.globals.colors[e] = t) })), i.config.theme.monochrome.enabled) { var s = [], r = i.globals.series.length; (this.isBarDistributed || this.isHeatmapDistributed) && (r = i.globals.series[0].length * i.globals.series.length); for (var o = i.config.theme.monochrome.color, n = 1 / (r / i.config.theme.monochrome.shadeIntensity), l = i.config.theme.monochrome.shadeTo, h = 0, c = 0; c < r; c++) { var d = void 0; "dark" === l ? (d = a.shadeColor(-1 * h, o), h += n) : (d = a.shadeColor(h, o), h += n), s.push(d) } i.globals.colors = s.slice() } var g = i.globals.colors.slice(); this.pushExtraColors(i.globals.colors);["fill", "stroke"].forEach((function (t) { void 0 === i.config[t].colors ? i.globals[t].colors = e.isColorFn ? i.config.colors : g : i.globals[t].colors = i.config[t].colors.slice(), e.pushExtraColors(i.globals[t].colors) })), void 0 === i.config.dataLabels.style.colors ? i.globals.dataLabels.style.colors = g : i.globals.dataLabels.style.colors = i.config.dataLabels.style.colors.slice(), this.pushExtraColors(i.globals.dataLabels.style.colors, 50), void 0 === i.config.plotOptions.radar.polygons.fill.colors ? i.globals.radarPolygons.fill.colors = ["dark" === i.config.theme.mode ? "#424242" : "none"] : i.globals.radarPolygons.fill.colors = i.config.plotOptions.radar.polygons.fill.colors.slice(), this.pushExtraColors(i.globals.radarPolygons.fill.colors, 20), void 0 === i.config.markers.colors ? i.globals.markers.colors = g : i.globals.markers.colors = i.config.markers.colors.slice(), this.pushExtraColors(i.globals.markers.colors) } }, { key: "pushExtraColors", value: function (t, e) { var i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : null, a = this.w, s = e || a.globals.series.length; if (null === i && (i = this.isBarDistributed || this.isHeatmapDistributed || "heatmap" === a.config.chart.type && a.config.plotOptions.heatmap.colorScale.inverse), i && a.globals.series.length && (s = a.globals.series[a.globals.maxValsInArrayIndex].length * a.globals.series.length), t.length < s) for (var r = s - t.length, o = 0; o < r; o++)t.push(t[o]) } }, { key: "updateThemeOptions", value: function (t) { t.chart = t.chart || {}, t.tooltip = t.tooltip || {}; var e = t.theme.mode || "light", i = t.theme.palette ? t.theme.palette : "dark" === e ? "palette4" : "palette1", a = t.chart.foreColor ? t.chart.foreColor : "dark" === e ? "#f6f7f8" : "#373d3f"; return t.tooltip.theme = e, t.chart.foreColor = a, t.theme.palette = i, t } }, { key: "predefined", value: function () { switch (this.w.config.theme.palette) { case "palette1": default: this.colors = ["#008FFB", "#00E396", "#FEB019", "#FF4560", "#775DD0"]; break; case "palette2": this.colors = ["#3f51b5", "#03a9f4", "#4caf50", "#f9ce1d", "#FF9800"]; break; case "palette3": this.colors = ["#33b2df", "#546E7A", "#d4526e", "#13d8aa", "#A5978B"]; break; case "palette4": this.colors = ["#4ecdc4", "#c7f464", "#81D4FA", "#fd6a6a", "#546E7A"]; break; case "palette5": this.colors = ["#2b908f", "#f9a3a4", "#90ee7e", "#fa4443", "#69d2e7"]; break; case "palette6": this.colors = ["#449DD1", "#F86624", "#EA3546", "#662E9B", "#C5D86D"]; break; case "palette7": this.colors = ["#D7263D", "#1B998B", "#2E294E", "#F46036", "#E2C044"]; break; case "palette8": this.colors = ["#662E9B", "#F86624", "#F9C80E", "#EA3546", "#43BCCD"]; break; case "palette9": this.colors = ["#5C4742", "#A5978B", "#8D5B4C", "#5A2A27", "#C4BBAF"]; break; case "palette10": this.colors = ["#A300D6", "#7D02EB", "#5653FE", "#2983FF", "#00B1F2"] }return this.colors } }]), t }(), et = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "draw", value: function () { this.drawTitleSubtitle("title"), this.drawTitleSubtitle("subtitle") } }, { key: "drawTitleSubtitle", value: function (t) { var e = this.w, i = "title" === t ? e.config.title : e.config.subtitle, a = e.globals.svgWidth / 2, s = i.offsetY, r = "middle"; if ("left" === i.align ? (a = 10, r = "start") : "right" === i.align && (a = e.globals.svgWidth - 10, r = "end"), a += i.offsetX, s = s + parseInt(i.style.fontSize, 10) + i.margin / 2, void 0 !== i.text) { var o = new m(this.ctx).drawText({ x: a, y: s, text: i.text, textAnchor: r, fontSize: i.style.fontSize, fontFamily: i.style.fontFamily, fontWeight: i.style.fontWeight, foreColor: i.style.color, opacity: 1 }); o.node.setAttribute("class", "apexcharts-".concat(t, "-text")), e.globals.dom.Paper.add(o) } } }]), t }(), it = function () { function t(e) { a(this, t), this.w = e.w, this.dCtx = e } return r(t, [{ key: "getTitleSubtitleCoords", value: function (t) { var e = this.w, i = 0, a = 0, s = "title" === t ? e.config.title.floating : e.config.subtitle.floating, r = e.globals.dom.baseEl.querySelector(".apexcharts-".concat(t, "-text")); if (null !== r && !s) { var o = r.getBoundingClientRect(); i = o.width, a = e.globals.axisCharts ? o.height + 5 : o.height } return { width: i, height: a } } }, { key: "getLegendsRect", value: function () { var t = this.w, e = t.globals.dom.elLegendWrap; t.config.legend.height || "top" !== t.config.legend.position && "bottom" !== t.config.legend.position || (e.style.maxHeight = t.globals.svgHeight / 2 + "px"); var i = Object.assign({}, x.getBoundingClientRect(e)); return null !== e && !t.config.legend.floating && t.config.legend.show ? this.dCtx.lgRect = { x: i.x, y: i.y, height: i.height, width: 0 === i.height ? 0 : i.width } : this.dCtx.lgRect = { x: 0, y: 0, height: 0, width: 0 }, "left" !== t.config.legend.position && "right" !== t.config.legend.position || 1.5 * this.dCtx.lgRect.width > t.globals.svgWidth && (this.dCtx.lgRect.width = t.globals.svgWidth / 1.5), this.dCtx.lgRect } }, { key: "getDatalabelsRect", value: function () { var t = this, e = this.w, i = []; e.config.series.forEach((function (s, r) { s.data.forEach((function (s, o) { var n; n = e.globals.series[r][o], a = e.config.dataLabels.formatter(n, { ctx: t.dCtx.ctx, seriesIndex: r, dataPointIndex: o, w: e }), i.push(a) })) })); var a = x.getLargestStringFromArr(i), s = new m(this.dCtx.ctx), r = e.config.dataLabels.style, o = s.getTextRects(a, parseInt(r.fontSize), r.fontFamily); return { width: 1.05 * o.width, height: o.height } } }, { key: "getLargestStringFromMultiArr", value: function (t, e) { var i = t; if (this.w.globals.isMultiLineX) { var a = e.map((function (t, e) { return Array.isArray(t) ? t.length : 1 })), s = Math.max.apply(Math, u(a)); i = e[a.indexOf(s)] } return i } }]), t }(), at = function () { function t(e) { a(this, t), this.w = e.w, this.dCtx = e } return r(t, [{ key: "getxAxisLabelsCoords", value: function () { var t, e = this.w, i = e.globals.labels.slice(); if (e.config.xaxis.convertedCatToNumeric && 0 === i.length && (i = e.globals.categoryLabels), e.globals.timescaleLabels.length > 0) { var a = this.getxAxisTimeScaleLabelsCoords(); t = { width: a.width, height: a.height }, e.globals.rotateXLabels = !1 } else { this.dCtx.lgWidthForSideLegends = "left" !== e.config.legend.position && "right" !== e.config.legend.position || e.config.legend.floating ? 0 : this.dCtx.lgRect.width; var s = e.globals.xLabelFormatter, r = x.getLargestStringFromArr(i), o = this.dCtx.dimHelpers.getLargestStringFromMultiArr(r, i); e.globals.isBarHorizontal && (o = r = e.globals.yAxisScale[0].result.reduce((function (t, e) { return t.length > e.length ? t : e }), 0)); var n = new S(this.dCtx.ctx), l = r; r = n.xLabelFormat(s, r, l, { i: void 0, dateFormatter: new A(this.dCtx.ctx).formatDate, w: e }), o = n.xLabelFormat(s, o, l, { i: void 0, dateFormatter: new A(this.dCtx.ctx).formatDate, w: e }), (e.config.xaxis.convertedCatToNumeric && void 0 === r || "" === String(r).trim()) && (o = r = "1"); var h = new m(this.dCtx.ctx), c = h.getTextRects(r, e.config.xaxis.labels.style.fontSize), d = c; if (r !== o && (d = h.getTextRects(o, e.config.xaxis.labels.style.fontSize)), (t = { width: c.width >= d.width ? c.width : d.width, height: c.height >= d.height ? c.height : d.height }).width * i.length > e.globals.svgWidth - this.dCtx.lgWidthForSideLegends - this.dCtx.yAxisWidth - this.dCtx.gridPad.left - this.dCtx.gridPad.right && 0 !== e.config.xaxis.labels.rotate || e.config.xaxis.labels.rotateAlways) { if (!e.globals.isBarHorizontal) { e.globals.rotateXLabels = !0; var g = function (t) { return h.getTextRects(t, e.config.xaxis.labels.style.fontSize, e.config.xaxis.labels.style.fontFamily, "rotate(".concat(e.config.xaxis.labels.rotate, " 0 0)"), !1) }; c = g(r), r !== o && (d = g(o)), t.height = (c.height > d.height ? c.height : d.height) / 1.5, t.width = c.width > d.width ? c.width : d.width } } else e.globals.rotateXLabels = !1 } return e.config.xaxis.labels.show || (t = { width: 0, height: 0 }), { width: t.width, height: t.height } } }, { key: "getxAxisGroupLabelsCoords", value: function () { var t, e = this.w; if (!e.globals.hasXaxisGroups) return { width: 0, height: 0 }; var i, a = (null === (t = e.config.xaxis.group.style) || void 0 === t ? void 0 : t.fontSize) || e.config.xaxis.labels.style.fontSize, s = e.globals.groups.map((function (t) { return t.title })), r = x.getLargestStringFromArr(s), o = this.dCtx.dimHelpers.getLargestStringFromMultiArr(r, s), n = new m(this.dCtx.ctx), l = n.getTextRects(r, a), h = l; return r !== o && (h = n.getTextRects(o, a)), i = { width: l.width >= h.width ? l.width : h.width, height: l.height >= h.height ? l.height : h.height }, e.config.xaxis.labels.show || (i = { width: 0, height: 0 }), { width: i.width, height: i.height } } }, { key: "getxAxisTitleCoords", value: function () { var t = this.w, e = 0, i = 0; if (void 0 !== t.config.xaxis.title.text) { var a = new m(this.dCtx.ctx).getTextRects(t.config.xaxis.title.text, t.config.xaxis.title.style.fontSize); e = a.width, i = a.height } return { width: e, height: i } } }, { key: "getxAxisTimeScaleLabelsCoords", value: function () { var t, e = this.w; this.dCtx.timescaleLabels = e.globals.timescaleLabels.slice(); var i = this.dCtx.timescaleLabels.map((function (t) { return t.value })), a = i.reduce((function (t, e) { return void 0 === t ? (console.error("You have possibly supplied invalid Date format. Please supply a valid JavaScript Date"), 0) : t.length > e.length ? t : e }), 0); return 1.05 * (t = new m(this.dCtx.ctx).getTextRects(a, e.config.xaxis.labels.style.fontSize)).width * i.length > e.globals.gridWidth && 0 !== e.config.xaxis.labels.rotate && (e.globals.overlappingXLabels = !0), t } }, { key: "additionalPaddingXLabels", value: function (t) { var e = this, i = this.w, a = i.globals, s = i.config, r = s.xaxis.type, o = t.width; a.skipLastTimelinelabel = !1, a.skipFirstTimelinelabel = !1; var n = i.config.yaxis[0].opposite && i.globals.isBarHorizontal, l = function (t, n) { s.yaxis.length > 1 && function (t) { return -1 !== a.collapsedSeriesIndices.indexOf(t) }(n) || function (t) { if (e.dCtx.timescaleLabels && e.dCtx.timescaleLabels.length) { var n = e.dCtx.timescaleLabels[0], l = e.dCtx.timescaleLabels[e.dCtx.timescaleLabels.length - 1].position + o / 1.75 - e.dCtx.yAxisWidthRight, h = n.position - o / 1.75 + e.dCtx.yAxisWidthLeft, c = "right" === i.config.legend.position && e.dCtx.lgRect.width > 0 ? e.dCtx.lgRect.width : 0; l > a.svgWidth - a.translateX - c && (a.skipLastTimelinelabel = !0), h < -(t.show && !t.floating || "bar" !== s.chart.type && "candlestick" !== s.chart.type && "rangeBar" !== s.chart.type && "boxPlot" !== s.chart.type ? 10 : o / 1.75) && (a.skipFirstTimelinelabel = !0) } else "datetime" === r ? e.dCtx.gridPad.right < o && !a.rotateXLabels && (a.skipLastTimelinelabel = !0) : "datetime" !== r && e.dCtx.gridPad.right < o / 2 - e.dCtx.yAxisWidthRight && !a.rotateXLabels && !i.config.xaxis.labels.trim && ("between" !== i.config.xaxis.tickPlacement || i.globals.isBarHorizontal) && (e.dCtx.xPadRight = o / 2 + 1) }(t) }; s.yaxis.forEach((function (t, i) { n ? (e.dCtx.gridPad.left < o && (e.dCtx.xPadLeft = o / 2 + 1), e.dCtx.xPadRight = o / 2 + 1) : l(t, i) })) } }]), t }(), st = function () { function t(e) { a(this, t), this.w = e.w, this.dCtx = e } return r(t, [{ key: "getyAxisLabelsCoords", value: function () { var t = this, e = this.w, i = [], a = 10, s = new C(this.dCtx.ctx); return e.config.yaxis.map((function (r, o) { var n = { seriesIndex: o, dataPointIndex: -1, w: e }, l = e.globals.yAxisScale[o], h = 0; if (!s.isYAxisHidden(o) && r.labels.show && void 0 !== r.labels.minWidth && (h = r.labels.minWidth), !s.isYAxisHidden(o) && r.labels.show && l.result.length) { var c = e.globals.yLabelFormatters[o], d = l.niceMin === Number.MIN_VALUE ? 0 : l.niceMin, g = l.result.reduce((function (t, e) { var i, a; return (null === (i = String(c(t, n))) || void 0 === i ? void 0 : i.length) > (null === (a = String(c(e, n))) || void 0 === a ? void 0 : a.length) ? t : e }), d), u = g = c(g, n); if (void 0 !== g && 0 !== g.length || (g = l.niceMax), e.globals.isBarHorizontal) { a = 0; var p = e.globals.labels.slice(); g = x.getLargestStringFromArr(p), g = c(g, { seriesIndex: o, dataPointIndex: -1, w: e }), u = t.dCtx.dimHelpers.getLargestStringFromMultiArr(g, p) } var f = new m(t.dCtx.ctx), b = "rotate(".concat(r.labels.rotate, " 0 0)"), v = f.getTextRects(g, r.labels.style.fontSize, r.labels.style.fontFamily, b, !1), y = v; g !== u && (y = f.getTextRects(u, r.labels.style.fontSize, r.labels.style.fontFamily, b, !1)), i.push({ width: (h > y.width || h > v.width ? h : y.width > v.width ? y.width : v.width) + a, height: y.height > v.height ? y.height : v.height }) } else i.push({ width: 0, height: 0 }) })), i } }, { key: "getyAxisTitleCoords", value: function () { var t = this, e = this.w, i = []; return e.config.yaxis.map((function (e, a) { if (e.show && void 0 !== e.title.text) { var s = new m(t.dCtx.ctx), r = "rotate(".concat(e.title.rotate, " 0 0)"), o = s.getTextRects(e.title.text, e.title.style.fontSize, e.title.style.fontFamily, r, !1); i.push({ width: o.width, height: o.height }) } else i.push({ width: 0, height: 0 }) })), i } }, { key: "getTotalYAxisWidth", value: function () { var t = this.w, e = 0, i = 0, a = 0, s = t.globals.yAxisScale.length > 1 ? 10 : 0, r = new C(this.dCtx.ctx), o = function (o, n) { var l = t.config.yaxis[n].floating, h = 0; o.width > 0 && !l ? (h = o.width + s, function (e) { return t.globals.ignoreYAxisIndexes.indexOf(e) > -1 }(n) && (h = h - o.width - s)) : h = l || r.isYAxisHidden(n) ? 0 : 5, t.config.yaxis[n].opposite ? a += h : i += h, e += h }; return t.globals.yLabelsCoords.map((function (t, e) { o(t, e) })), t.globals.yTitleCoords.map((function (t, e) { o(t, e) })), t.globals.isBarHorizontal && !t.config.yaxis[0].floating && (e = t.globals.yLabelsCoords[0].width + t.globals.yTitleCoords[0].width + 15), this.dCtx.yAxisWidthLeft = i, this.dCtx.yAxisWidthRight = a, e } }]), t }(), rt = function () { function t(e) { a(this, t), this.w = e.w, this.dCtx = e } return r(t, [{ key: "gridPadForColumnsInNumericAxis", value: function (t) { var e = this.w, i = e.config, a = e.globals; if (a.noData || a.collapsedSeries.length + a.ancillaryCollapsedSeries.length === i.series.length) return 0; var s = function (t) { return "bar" === t || "rangeBar" === t || "candlestick" === t || "boxPlot" === t }, r = i.chart.type, o = 0, n = s(r) ? i.series.length : 1; if (a.comboBarCount > 0 && (n = a.comboBarCount), a.collapsedSeries.forEach((function (t) { s(t.type) && (n -= 1) })), i.chart.stacked && (n = 1), (s(r) || a.comboBarCount > 0) && a.isXNumeric && !a.isBarHorizontal && n > 0) { var l, h, c = Math.abs(a.initialMaxX - a.initialMinX); c <= 3 && (c = a.dataPoints), l = c / t, a.minXDiff && a.minXDiff / l > 0 && (h = a.minXDiff / l), h > t / 2 && (h /= 2), (o = h * parseInt(i.plotOptions.bar.columnWidth, 10) / 100) < 1 && (o = 1), a.barPadForNumericAxis = o } return o } }, { key: "gridPadFortitleSubtitle", value: function () { var t = this, e = this.w, i = e.globals, a = this.dCtx.isSparkline || !e.globals.axisCharts ? 0 : 10;["title", "subtitle"].forEach((function (i) { void 0 !== e.config[i].text ? a += e.config[i].margin : a += t.dCtx.isSparkline || !e.globals.axisCharts ? 0 : 5 })), !e.config.legend.show || "bottom" !== e.config.legend.position || e.config.legend.floating || e.globals.axisCharts || (a += 10); var s = this.dCtx.dimHelpers.getTitleSubtitleCoords("title"), r = this.dCtx.dimHelpers.getTitleSubtitleCoords("subtitle"); i.gridHeight = i.gridHeight - s.height - r.height - a, i.translateY = i.translateY + s.height + r.height + a } }, { key: "setGridXPosForDualYAxis", value: function (t, e) { var i = this.w, a = new C(this.dCtx.ctx); i.config.yaxis.map((function (s, r) { -1 !== i.globals.ignoreYAxisIndexes.indexOf(r) || s.floating || a.isYAxisHidden(r) || (s.opposite && (i.globals.translateX = i.globals.translateX - (e[r].width + t[r].width) - parseInt(i.config.yaxis[r].labels.style.fontSize, 10) / 1.2 - 12), i.globals.translateX < 2 && (i.globals.translateX = 2)) })) } }]), t }(), ot = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w, this.lgRect = {}, this.yAxisWidth = 0, this.yAxisWidthLeft = 0, this.yAxisWidthRight = 0, this.xAxisHeight = 0, this.isSparkline = this.w.config.chart.sparkline.enabled, this.dimHelpers = new it(this), this.dimYAxis = new st(this), this.dimXAxis = new at(this), this.dimGrid = new rt(this), this.lgWidthForSideLegends = 0, this.gridPad = this.w.config.grid.padding, this.xPadRight = 0, this.xPadLeft = 0 } return r(t, [{ key: "plotCoords", value: function () { var t = this, e = this.w, i = e.globals; this.lgRect = this.dimHelpers.getLegendsRect(), this.datalabelsCoords = { width: 0, height: 0 }; var a = Array.isArray(e.config.stroke.width) ? Math.max.apply(Math, u(e.config.stroke.width)) : e.config.stroke.width; this.isSparkline && ((e.config.markers.discrete.length > 0 || e.config.markers.size > 0) && Object.entries(this.gridPad).forEach((function (e) { var i = g(e, 2), a = i[0], s = i[1]; t.gridPad[a] = Math.max(s, t.w.globals.markers.largestSize / 1.5) })), this.gridPad.top = Math.max(a / 2, this.gridPad.top), this.gridPad.bottom = Math.max(a / 2, this.gridPad.bottom)), i.axisCharts ? this.setDimensionsForAxisCharts() : this.setDimensionsForNonAxisCharts(), this.dimGrid.gridPadFortitleSubtitle(), i.gridHeight = i.gridHeight - this.gridPad.top - this.gridPad.bottom, i.gridWidth = i.gridWidth - this.gridPad.left - this.gridPad.right - this.xPadRight - this.xPadLeft; var s = this.dimGrid.gridPadForColumnsInNumericAxis(i.gridWidth); i.gridWidth = i.gridWidth - 2 * s, i.translateX = i.translateX + this.gridPad.left + this.xPadLeft + (s > 0 ? s : 0), i.translateY = i.translateY + this.gridPad.top } }, { key: "setDimensionsForAxisCharts", value: function () { var t = this, e = this.w, i = e.globals, a = this.dimYAxis.getyAxisLabelsCoords(), s = this.dimYAxis.getyAxisTitleCoords(); i.isSlopeChart && (this.datalabelsCoords = this.dimHelpers.getDatalabelsRect()), e.globals.yLabelsCoords = [], e.globals.yTitleCoords = [], e.config.yaxis.map((function (t, i) { e.globals.yLabelsCoords.push({ width: a[i].width, index: i }), e.globals.yTitleCoords.push({ width: s[i].width, index: i }) })), this.yAxisWidth = this.dimYAxis.getTotalYAxisWidth(); var r = this.dimXAxis.getxAxisLabelsCoords(), o = this.dimXAxis.getxAxisGroupLabelsCoords(), n = this.dimXAxis.getxAxisTitleCoords(); this.conditionalChecksForAxisCoords(r, n, o), i.translateXAxisY = e.globals.rotateXLabels ? this.xAxisHeight / 8 : -4, i.translateXAxisX = e.globals.rotateXLabels && e.globals.isXNumeric && e.config.xaxis.labels.rotate <= -45 ? -this.xAxisWidth / 4 : 0, e.globals.isBarHorizontal && (i.rotateXLabels = !1, i.translateXAxisY = parseInt(e.config.xaxis.labels.style.fontSize, 10) / 1.5 * -1), i.translateXAxisY = i.translateXAxisY + e.config.xaxis.labels.offsetY, i.translateXAxisX = i.translateXAxisX + e.config.xaxis.labels.offsetX; var l = this.yAxisWidth, h = this.xAxisHeight; i.xAxisLabelsHeight = this.xAxisHeight - n.height, i.xAxisGroupLabelsHeight = i.xAxisLabelsHeight - r.height, i.xAxisLabelsWidth = this.xAxisWidth, i.xAxisHeight = this.xAxisHeight; var c = 10; ("radar" === e.config.chart.type || this.isSparkline) && (l = 0, h = i.goldenPadding), this.isSparkline && (this.lgRect = { height: 0, width: 0 }), (this.isSparkline || "treemap" === e.config.chart.type) && (l = 0, h = 0, c = 0), this.isSparkline || this.dimXAxis.additionalPaddingXLabels(r); var d = function () { i.translateX = l + t.datalabelsCoords.width, i.gridHeight = i.svgHeight - t.lgRect.height - h - (t.isSparkline || "treemap" === e.config.chart.type ? 0 : e.globals.rotateXLabels ? 10 : 15), i.gridWidth = i.svgWidth - l - 2 * t.datalabelsCoords.width }; switch ("top" === e.config.xaxis.position && (c = i.xAxisHeight - e.config.xaxis.axisTicks.height - 5), e.config.legend.position) { case "bottom": i.translateY = c, d(); break; case "top": i.translateY = this.lgRect.height + c, d(); break; case "left": i.translateY = c, i.translateX = this.lgRect.width + l + this.datalabelsCoords.width, i.gridHeight = i.svgHeight - h - 12, i.gridWidth = i.svgWidth - this.lgRect.width - l - 2 * this.datalabelsCoords.width; break; case "right": i.translateY = c, i.translateX = l + this.datalabelsCoords.width, i.gridHeight = i.svgHeight - h - 12, i.gridWidth = i.svgWidth - this.lgRect.width - l - 2 * this.datalabelsCoords.width - 5; break; default: throw new Error("Legend position not supported") }this.dimGrid.setGridXPosForDualYAxis(s, a), new q(this.ctx).setYAxisXPosition(a, s) } }, { key: "setDimensionsForNonAxisCharts", value: function () { var t = this.w, e = t.globals, i = t.config, a = 0; t.config.legend.show && !t.config.legend.floating && (a = 20); var s = "pie" === i.chart.type || "polarArea" === i.chart.type || "donut" === i.chart.type ? "pie" : "radialBar", r = i.plotOptions[s].offsetY, o = i.plotOptions[s].offsetX; if (!i.legend.show || i.legend.floating) return e.gridHeight = e.svgHeight - i.grid.padding.left + i.grid.padding.right, e.gridWidth = Math.min(e.svgWidth, e.gridHeight), e.translateY = r, void (e.translateX = o + (e.svgWidth - e.gridWidth) / 2); switch (i.legend.position) { case "bottom": e.gridHeight = e.svgHeight - this.lgRect.height - e.goldenPadding, e.gridWidth = e.svgWidth, e.translateY = r - 10, e.translateX = o + (e.svgWidth - e.gridWidth) / 2; break; case "top": e.gridHeight = e.svgHeight - this.lgRect.height - e.goldenPadding, e.gridWidth = e.svgWidth, e.translateY = this.lgRect.height + r + 10, e.translateX = o + (e.svgWidth - e.gridWidth) / 2; break; case "left": e.gridWidth = e.svgWidth - this.lgRect.width - a, e.gridHeight = "auto" !== i.chart.height ? e.svgHeight : e.gridWidth, e.translateY = r, e.translateX = o + this.lgRect.width + a; break; case "right": e.gridWidth = e.svgWidth - this.lgRect.width - a - 5, e.gridHeight = "auto" !== i.chart.height ? e.svgHeight : e.gridWidth, e.translateY = r, e.translateX = o + 10; break; default: throw new Error("Legend position not supported") } } }, { key: "conditionalChecksForAxisCoords", value: function (t, e, i) { var a = this.w, s = a.globals.hasXaxisGroups ? 2 : 1, r = i.height + t.height + e.height, o = a.globals.isMultiLineX ? 1.2 : a.globals.LINE_HEIGHT_RATIO, n = a.globals.rotateXLabels ? 22 : 10, l = a.globals.rotateXLabels && "bottom" === a.config.legend.position ? 10 : 0; this.xAxisHeight = r * o + s * n + l, this.xAxisWidth = t.width, this.xAxisHeight - e.height > a.config.xaxis.labels.maxHeight && (this.xAxisHeight = a.config.xaxis.labels.maxHeight), a.config.xaxis.labels.minHeight && this.xAxisHeight < a.config.xaxis.labels.minHeight && (this.xAxisHeight = a.config.xaxis.labels.minHeight), a.config.xaxis.floating && (this.xAxisHeight = 0); var h = 0, c = 0; a.config.yaxis.forEach((function (t) { h += t.labels.minWidth, c += t.labels.maxWidth })), this.yAxisWidth < h && (this.yAxisWidth = h), this.yAxisWidth > c && (this.yAxisWidth = c) } }]), t }(), nt = function () { function t(e) { a(this, t), this.w = e.w, this.lgCtx = e } return r(t, [{ key: "getLegendStyles", value: function () { var t, e, i, a = document.createElement("style"); a.setAttribute("type", "text/css"); var s = (null === (t = this.lgCtx.ctx) || void 0 === t || null === (e = t.opts) || void 0 === e || null === (i = e.chart) || void 0 === i ? void 0 : i.nonce) || this.w.config.chart.nonce; s && a.setAttribute("nonce", s); var r = document.createTextNode("\n .apexcharts-legend {\n display: flex;\n overflow: auto;\n padding: 0 10px;\n }\n .apexcharts-legend.apx-legend-position-bottom, .apexcharts-legend.apx-legend-position-top {\n flex-wrap: wrap\n }\n .apexcharts-legend.apx-legend-position-right, .apexcharts-legend.apx-legend-position-left {\n flex-direction: column;\n bottom: 0;\n }\n .apexcharts-legend.apx-legend-position-bottom.apexcharts-align-left, .apexcharts-legend.apx-legend-position-top.apexcharts-align-left, .apexcharts-legend.apx-legend-position-right, .apexcharts-legend.apx-legend-position-left {\n justify-content: flex-start;\n }\n .apexcharts-legend.apx-legend-position-bottom.apexcharts-align-center, .apexcharts-legend.apx-legend-position-top.apexcharts-align-center {\n justify-content: center;\n }\n .apexcharts-legend.apx-legend-position-bottom.apexcharts-align-right, .apexcharts-legend.apx-legend-position-top.apexcharts-align-right {\n justify-content: flex-end;\n }\n .apexcharts-legend-series {\n cursor: pointer;\n line-height: normal;\n }\n .apexcharts-legend.apx-legend-position-bottom .apexcharts-legend-series, .apexcharts-legend.apx-legend-position-top .apexcharts-legend-series{\n display: flex;\n align-items: center;\n }\n .apexcharts-legend-text {\n position: relative;\n font-size: 14px;\n }\n .apexcharts-legend-text *, .apexcharts-legend-marker * {\n pointer-events: none;\n }\n .apexcharts-legend-marker {\n position: relative;\n display: inline-block;\n cursor: pointer;\n margin-right: 3px;\n border-style: solid;\n }\n\n .apexcharts-legend.apexcharts-align-right .apexcharts-legend-series, .apexcharts-legend.apexcharts-align-left .apexcharts-legend-series{\n display: inline-block;\n }\n .apexcharts-legend-series.apexcharts-no-click {\n cursor: auto;\n }\n .apexcharts-legend .apexcharts-hidden-zero-series, .apexcharts-legend .apexcharts-hidden-null-series {\n display: none !important;\n }\n .apexcharts-inactive-legend {\n opacity: 0.45;\n }"); return a.appendChild(r), a } }, { key: "getLegendBBox", value: function () { var t = this.w.globals.dom.baseEl.querySelector(".apexcharts-legend").getBoundingClientRect(), e = t.width; return { clwh: t.height, clww: e } } }, { key: "appendToForeignObject", value: function () { this.w.globals.dom.elLegendForeign.appendChild(this.getLegendStyles()) } }, { key: "toggleDataSeries", value: function (t, e) { var i = this, a = this.w; if (a.globals.axisCharts || "radialBar" === a.config.chart.type) { a.globals.resized = !0; var s = null, r = null; if (a.globals.risingSeries = [], a.globals.axisCharts ? (s = a.globals.dom.baseEl.querySelector(".apexcharts-series[data\\:realIndex='".concat(t, "']")), r = parseInt(s.getAttribute("data:realIndex"), 10)) : (s = a.globals.dom.baseEl.querySelector(".apexcharts-series[rel='".concat(t + 1, "']")), r = parseInt(s.getAttribute("rel"), 10) - 1), e) [{ cs: a.globals.collapsedSeries, csi: a.globals.collapsedSeriesIndices }, { cs: a.globals.ancillaryCollapsedSeries, csi: a.globals.ancillaryCollapsedSeriesIndices }].forEach((function (t) { i.riseCollapsedSeries(t.cs, t.csi, r) })); else this.hideSeries({ seriesEl: s, realIndex: r }) } else { var o = a.globals.dom.Paper.select(" .apexcharts-series[rel='".concat(t + 1, "'] path")), n = a.config.chart.type; if ("pie" === n || "polarArea" === n || "donut" === n) { var l = a.config.plotOptions.pie.donut.labels; new m(this.lgCtx.ctx).pathMouseDown(o.members[0], null), this.lgCtx.ctx.pie.printDataLabelsInner(o.members[0].node, l) } o.fire("click") } } }, { key: "hideSeries", value: function (t) { var e = t.seriesEl, i = t.realIndex, a = this.w, s = a.globals, r = x.clone(a.config.series); if (s.axisCharts) { var o = a.config.yaxis[s.seriesYAxisReverseMap[i]]; if (o && o.show && o.showAlways) s.ancillaryCollapsedSeriesIndices.indexOf(i) < 0 && (s.ancillaryCollapsedSeries.push({ index: i, data: r[i].data.slice(), type: e.parentNode.className.baseVal.split("-")[1] }), s.ancillaryCollapsedSeriesIndices.push(i)); else if (s.collapsedSeriesIndices.indexOf(i) < 0) { s.collapsedSeries.push({ index: i, data: r[i].data.slice(), type: e.parentNode.className.baseVal.split("-")[1] }), s.collapsedSeriesIndices.push(i); var n = s.risingSeries.indexOf(i); s.risingSeries.splice(n, 1) } } else s.collapsedSeries.push({ index: i, data: r[i] }), s.collapsedSeriesIndices.push(i); for (var l = e.childNodes, h = 0; h < l.length; h++)l[h].classList.contains("apexcharts-series-markers-wrap") && (l[h].classList.contains("apexcharts-hide") ? l[h].classList.remove("apexcharts-hide") : l[h].classList.add("apexcharts-hide")); s.allSeriesCollapsed = s.collapsedSeries.length + s.ancillaryCollapsedSeries.length === a.config.series.length, r = this._getSeriesBasedOnCollapsedState(r), this.lgCtx.ctx.updateHelpers._updateSeries(r, a.config.chart.animations.dynamicAnimation.enabled) } }, { key: "riseCollapsedSeries", value: function (t, e, i) { var a = this.w, s = x.clone(a.config.series); if (t.length > 0) { for (var r = 0; r < t.length; r++)t[r].index === i && (a.globals.axisCharts ? (s[i].data = t[r].data.slice(), t.splice(r, 1), e.splice(r, 1), a.globals.risingSeries.push(i)) : (s[i] = t[r].data, t.splice(r, 1), e.splice(r, 1), a.globals.risingSeries.push(i))); s = this._getSeriesBasedOnCollapsedState(s), this.lgCtx.ctx.updateHelpers._updateSeries(s, a.config.chart.animations.dynamicAnimation.enabled) } } }, { key: "_getSeriesBasedOnCollapsedState", value: function (t) { var e = this.w, i = 0; return e.globals.axisCharts ? t.forEach((function (a, s) { e.globals.collapsedSeriesIndices.indexOf(s) < 0 && e.globals.ancillaryCollapsedSeriesIndices.indexOf(s) < 0 || (t[s].data = [], i++) })) : t.forEach((function (a, s) { !e.globals.collapsedSeriesIndices.indexOf(s) < 0 && (t[s] = 0, i++) })), e.globals.allSeriesCollapsed = i === t.length, t } }]), t }(), lt = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w, this.onLegendClick = this.onLegendClick.bind(this), this.onLegendHovered = this.onLegendHovered.bind(this), this.isBarsDistributed = "bar" === this.w.config.chart.type && this.w.config.plotOptions.bar.distributed && 1 === this.w.config.series.length, this.legendHelpers = new nt(this) } return r(t, [{ key: "init", value: function () { var t = this.w, e = t.globals, i = t.config; if ((i.legend.showForSingleSeries && 1 === e.series.length || this.isBarsDistributed || e.series.length > 1 || !e.axisCharts) && i.legend.show) { for (; e.dom.elLegendWrap.firstChild;)e.dom.elLegendWrap.removeChild(e.dom.elLegendWrap.firstChild); this.drawLegends(), x.isIE11() ? document.getElementsByTagName("head")[0].appendChild(this.legendHelpers.getLegendStyles()) : this.legendHelpers.appendToForeignObject(), "bottom" === i.legend.position || "top" === i.legend.position ? this.legendAlignHorizontal() : "right" !== i.legend.position && "left" !== i.legend.position || this.legendAlignVertical() } } }, { key: "drawLegends", value: function () { var t = this, e = this.w, i = e.config.legend.fontFamily, a = e.globals.seriesNames, s = e.globals.colors.slice(); if ("heatmap" === e.config.chart.type) { var r = e.config.plotOptions.heatmap.colorScale.ranges; a = r.map((function (t) { return t.name ? t.name : t.from + " - " + t.to })), s = r.map((function (t) { return t.color })) } else this.isBarsDistributed && (a = e.globals.labels.slice()); e.config.legend.customLegendItems.length && (a = e.config.legend.customLegendItems); for (var o = e.globals.legendFormatter, n = e.config.legend.inverseOrder, l = n ? a.length - 1 : 0; n ? l >= 0 : l <= a.length - 1; n ? l-- : l++) { var h, c = o(a[l], { seriesIndex: l, w: e }), d = !1, g = !1; if (e.globals.collapsedSeries.length > 0) for (var u = 0; u < e.globals.collapsedSeries.length; u++)e.globals.collapsedSeries[u].index === l && (d = !0); if (e.globals.ancillaryCollapsedSeriesIndices.length > 0) for (var p = 0; p < e.globals.ancillaryCollapsedSeriesIndices.length; p++)e.globals.ancillaryCollapsedSeriesIndices[p] === l && (g = !0); var f = document.createElement("span"); f.classList.add("apexcharts-legend-marker"); var b = e.config.legend.markers.offsetX, v = e.config.legend.markers.offsetY, w = e.config.legend.markers.height, k = e.config.legend.markers.width, A = e.config.legend.markers.strokeWidth, S = e.config.legend.markers.strokeColor, C = e.config.legend.markers.radius, L = f.style; L.background = s[l], L.color = s[l], L.setProperty("background", s[l], "important"), e.config.legend.markers.fillColors && e.config.legend.markers.fillColors[l] && (L.background = e.config.legend.markers.fillColors[l]), void 0 !== e.globals.seriesColors[l] && (L.background = e.globals.seriesColors[l], L.color = e.globals.seriesColors[l]), L.height = Array.isArray(w) ? parseFloat(w[l]) + "px" : parseFloat(w) + "px", L.width = Array.isArray(k) ? parseFloat(k[l]) + "px" : parseFloat(k) + "px", L.left = (Array.isArray(b) ? parseFloat(b[l]) : parseFloat(b)) + "px", L.top = (Array.isArray(v) ? parseFloat(v[l]) : parseFloat(v)) + "px", L.borderWidth = Array.isArray(A) ? A[l] : A, L.borderColor = Array.isArray(S) ? S[l] : S, L.borderRadius = Array.isArray(C) ? parseFloat(C[l]) + "px" : parseFloat(C) + "px", e.config.legend.markers.customHTML && (Array.isArray(e.config.legend.markers.customHTML) ? e.config.legend.markers.customHTML[l] && (f.innerHTML = e.config.legend.markers.customHTML[l]()) : f.innerHTML = e.config.legend.markers.customHTML()), m.setAttrs(f, { rel: l + 1, "data:collapsed": d || g }), (d || g) && f.classList.add("apexcharts-inactive-legend"); var P = document.createElement("div"), M = document.createElement("span"); M.classList.add("apexcharts-legend-text"), M.innerHTML = Array.isArray(c) ? c.join(" ") : c; var I = e.config.legend.labels.useSeriesColors ? e.globals.colors[l] : Array.isArray(e.config.legend.labels.colors) ? null === (h = e.config.legend.labels.colors) || void 0 === h ? void 0 : h[l] : e.config.legend.labels.colors; I || (I = e.config.chart.foreColor), M.style.color = I, M.style.fontSize = parseFloat(e.config.legend.fontSize) + "px", M.style.fontWeight = e.config.legend.fontWeight, M.style.fontFamily = i || e.config.chart.fontFamily, m.setAttrs(M, { rel: l + 1, i: l, "data:default-text": encodeURIComponent(c), "data:collapsed": d || g }), P.appendChild(f), P.appendChild(M); var T = new y(this.ctx); if (!e.config.legend.showForZeroSeries) 0 === T.getSeriesTotalByIndex(l) && T.seriesHaveSameValues(l) && !T.isSeriesNull(l) && -1 === e.globals.collapsedSeriesIndices.indexOf(l) && -1 === e.globals.ancillaryCollapsedSeriesIndices.indexOf(l) && P.classList.add("apexcharts-hidden-zero-series"); e.config.legend.showForNullSeries || T.isSeriesNull(l) && -1 === e.globals.collapsedSeriesIndices.indexOf(l) && -1 === e.globals.ancillaryCollapsedSeriesIndices.indexOf(l) && P.classList.add("apexcharts-hidden-null-series"), e.globals.dom.elLegendWrap.appendChild(P), e.globals.dom.elLegendWrap.classList.add("apexcharts-align-".concat(e.config.legend.horizontalAlign)), e.globals.dom.elLegendWrap.classList.add("apx-legend-position-" + e.config.legend.position), P.classList.add("apexcharts-legend-series"), P.style.margin = "".concat(e.config.legend.itemMargin.vertical, "px ").concat(e.config.legend.itemMargin.horizontal, "px"), e.globals.dom.elLegendWrap.style.width = e.config.legend.width ? e.config.legend.width + "px" : "", e.globals.dom.elLegendWrap.style.height = e.config.legend.height ? e.config.legend.height + "px" : "", m.setAttrs(P, { rel: l + 1, seriesName: x.escapeString(a[l]), "data:collapsed": d || g }), (d || g) && P.classList.add("apexcharts-inactive-legend"), e.config.legend.onItemClick.toggleDataSeries || P.classList.add("apexcharts-no-click") } e.globals.dom.elWrap.addEventListener("click", t.onLegendClick, !0), e.config.legend.onItemHover.highlightDataSeries && 0 === e.config.legend.customLegendItems.length && (e.globals.dom.elWrap.addEventListener("mousemove", t.onLegendHovered, !0), e.globals.dom.elWrap.addEventListener("mouseout", t.onLegendHovered, !0)) } }, { key: "setLegendWrapXY", value: function (t, e) { var i = this.w, a = i.globals.dom.elLegendWrap, s = a.getBoundingClientRect(), r = 0, o = 0; if ("bottom" === i.config.legend.position) o += i.globals.svgHeight - s.height / 2; else if ("top" === i.config.legend.position) { var n = new ot(this.ctx), l = n.dimHelpers.getTitleSubtitleCoords("title").height, h = n.dimHelpers.getTitleSubtitleCoords("subtitle").height; o = o + (l > 0 ? l - 10 : 0) + (h > 0 ? h - 10 : 0) } a.style.position = "absolute", r = r + t + i.config.legend.offsetX, o = o + e + i.config.legend.offsetY, a.style.left = r + "px", a.style.top = o + "px", "bottom" === i.config.legend.position ? (a.style.top = "auto", a.style.bottom = 5 - i.config.legend.offsetY + "px") : "right" === i.config.legend.position && (a.style.left = "auto", a.style.right = 25 + i.config.legend.offsetX + "px");["width", "height"].forEach((function (t) { a.style[t] && (a.style[t] = parseInt(i.config.legend[t], 10) + "px") })) } }, { key: "legendAlignHorizontal", value: function () { var t = this.w; t.globals.dom.elLegendWrap.style.right = 0; var e = this.legendHelpers.getLegendBBox(), i = new ot(this.ctx), a = i.dimHelpers.getTitleSubtitleCoords("title"), s = i.dimHelpers.getTitleSubtitleCoords("subtitle"), r = 0; "bottom" === t.config.legend.position ? r = -e.clwh / 1.8 : "top" === t.config.legend.position && (r = a.height + s.height + t.config.title.margin + t.config.subtitle.margin - 10), this.setLegendWrapXY(20, r) } }, { key: "legendAlignVertical", value: function () { var t = this.w, e = this.legendHelpers.getLegendBBox(), i = 0; "left" === t.config.legend.position && (i = 20), "right" === t.config.legend.position && (i = t.globals.svgWidth - e.clww - 10), this.setLegendWrapXY(i, 20) } }, { key: "onLegendHovered", value: function (t) { var e = this.w, i = t.target.classList.contains("apexcharts-legend-series") || t.target.classList.contains("apexcharts-legend-text") || t.target.classList.contains("apexcharts-legend-marker"); if ("heatmap" === e.config.chart.type || this.isBarsDistributed) { if (i) { var a = parseInt(t.target.getAttribute("rel"), 10) - 1; this.ctx.events.fireEvent("legendHover", [this.ctx, a, this.w]), new W(this.ctx).highlightRangeInSeries(t, t.target) } } else !t.target.classList.contains("apexcharts-inactive-legend") && i && new W(this.ctx).toggleSeriesOnHover(t, t.target) } }, { key: "onLegendClick", value: function (t) { var e = this.w; if (!e.config.legend.customLegendItems.length && (t.target.classList.contains("apexcharts-legend-series") || t.target.classList.contains("apexcharts-legend-text") || t.target.classList.contains("apexcharts-legend-marker"))) { var i = parseInt(t.target.getAttribute("rel"), 10) - 1, a = "true" === t.target.getAttribute("data:collapsed"), s = this.w.config.chart.events.legendClick; "function" == typeof s && s(this.ctx, i, this.w), this.ctx.events.fireEvent("legendClick", [this.ctx, i, this.w]); var r = this.w.config.legend.markers.onClick; "function" == typeof r && t.target.classList.contains("apexcharts-legend-marker") && (r(this.ctx, i, this.w), this.ctx.events.fireEvent("legendMarkerClick", [this.ctx, i, this.w])), "treemap" !== e.config.chart.type && "heatmap" !== e.config.chart.type && !this.isBarsDistributed && e.config.legend.onItemClick.toggleDataSeries && this.legendHelpers.toggleDataSeries(i, a) } } }]), t }(), ht = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w; var i = this.w; this.ev = this.w.config.chart.events, this.selectedClass = "apexcharts-selected", this.localeValues = this.w.globals.locale.toolbar, this.minX = i.globals.minX, this.maxX = i.globals.maxX } return r(t, [{ key: "createToolbar", value: function () { var t = this, e = this.w, i = function () { return document.createElement("div") }, a = i(); if (a.setAttribute("class", "apexcharts-toolbar"), a.style.top = e.config.chart.toolbar.offsetY + "px", a.style.right = 3 - e.config.chart.toolbar.offsetX + "px", e.globals.dom.elWrap.appendChild(a), this.elZoom = i(), this.elZoomIn = i(), this.elZoomOut = i(), this.elPan = i(), this.elSelection = i(), this.elZoomReset = i(), this.elMenuIcon = i(), this.elMenu = i(), this.elCustomIcons = [], this.t = e.config.chart.toolbar.tools, Array.isArray(this.t.customIcons)) for (var s = 0; s < this.t.customIcons.length; s++)this.elCustomIcons.push(i()); var r = [], o = function (i, a, s) { var o = i.toLowerCase(); t.t[o] && e.config.chart.zoom.enabled && r.push({ el: a, icon: "string" == typeof t.t[o] ? t.t[o] : s, title: t.localeValues[i], class: "apexcharts-".concat(o, "-icon") }) }; o("zoomIn", this.elZoomIn, '\n \n \n\n'), o("zoomOut", this.elZoomOut, '\n \n \n\n'); var n = function (i) { t.t[i] && e.config.chart[i].enabled && r.push({ el: "zoom" === i ? t.elZoom : t.elSelection, icon: "string" == typeof t.t[i] ? t.t[i] : "zoom" === i ? '\n \n \n \n' : '\n \n \n', title: t.localeValues["zoom" === i ? "selectionZoom" : "selection"], class: e.globals.isTouchDevice ? "apexcharts-element-hidden" : "apexcharts-".concat(i, "-icon") }) }; n("zoom"), n("selection"), this.t.pan && e.config.chart.zoom.enabled && r.push({ el: this.elPan, icon: "string" == typeof this.t.pan ? this.t.pan : '\n \n \n \n \n \n \n \n', title: this.localeValues.pan, class: e.globals.isTouchDevice ? "apexcharts-element-hidden" : "apexcharts-pan-icon" }), o("reset", this.elZoomReset, '\n \n \n'), this.t.download && r.push({ el: this.elMenuIcon, icon: "string" == typeof this.t.download ? this.t.download : '', title: this.localeValues.menu, class: "apexcharts-menu-icon" }); for (var l = 0; l < this.elCustomIcons.length; l++)r.push({ el: this.elCustomIcons[l], icon: this.t.customIcons[l].icon, title: this.t.customIcons[l].title, index: this.t.customIcons[l].index, class: "apexcharts-toolbar-custom-icon " + this.t.customIcons[l].class }); r.forEach((function (t, e) { t.index && x.moveIndexInArray(r, e, t.index) })); for (var h = 0; h < r.length; h++)m.setAttrs(r[h].el, { class: r[h].class, title: r[h].title }), r[h].el.innerHTML = r[h].icon, a.appendChild(r[h].el); this._createHamburgerMenu(a), e.globals.zoomEnabled ? this.elZoom.classList.add(this.selectedClass) : e.globals.panEnabled ? this.elPan.classList.add(this.selectedClass) : e.globals.selectionEnabled && this.elSelection.classList.add(this.selectedClass), this.addToolbarEventListeners() } }, { key: "_createHamburgerMenu", value: function (t) { this.elMenuItems = [], t.appendChild(this.elMenu), m.setAttrs(this.elMenu, { class: "apexcharts-menu" }); for (var e = [{ name: "exportSVG", title: this.localeValues.exportToSVG }, { name: "exportPNG", title: this.localeValues.exportToPNG }, { name: "exportCSV", title: this.localeValues.exportToCSV }], i = 0; i < e.length; i++)this.elMenuItems.push(document.createElement("div")), this.elMenuItems[i].innerHTML = e[i].title, m.setAttrs(this.elMenuItems[i], { class: "apexcharts-menu-item ".concat(e[i].name), title: e[i].title }), this.elMenu.appendChild(this.elMenuItems[i]) } }, { key: "addToolbarEventListeners", value: function () { var t = this; this.elZoomReset.addEventListener("click", this.handleZoomReset.bind(this)), this.elSelection.addEventListener("click", this.toggleZoomSelection.bind(this, "selection")), this.elZoom.addEventListener("click", this.toggleZoomSelection.bind(this, "zoom")), this.elZoomIn.addEventListener("click", this.handleZoomIn.bind(this)), this.elZoomOut.addEventListener("click", this.handleZoomOut.bind(this)), this.elPan.addEventListener("click", this.togglePanning.bind(this)), this.elMenuIcon.addEventListener("click", this.toggleMenu.bind(this)), this.elMenuItems.forEach((function (e) { e.classList.contains("exportSVG") ? e.addEventListener("click", t.handleDownload.bind(t, "svg")) : e.classList.contains("exportPNG") ? e.addEventListener("click", t.handleDownload.bind(t, "png")) : e.classList.contains("exportCSV") && e.addEventListener("click", t.handleDownload.bind(t, "csv")) })); for (var e = 0; e < this.t.customIcons.length; e++)this.elCustomIcons[e].addEventListener("click", this.t.customIcons[e].click.bind(this, this.ctx, this.ctx.w)) } }, { key: "toggleZoomSelection", value: function (t) { this.ctx.getSyncedCharts().forEach((function (e) { e.ctx.toolbar.toggleOtherControls(); var i = "selection" === t ? e.ctx.toolbar.elSelection : e.ctx.toolbar.elZoom, a = "selection" === t ? "selectionEnabled" : "zoomEnabled"; e.w.globals[a] = !e.w.globals[a], i.classList.contains(e.ctx.toolbar.selectedClass) ? i.classList.remove(e.ctx.toolbar.selectedClass) : i.classList.add(e.ctx.toolbar.selectedClass) })) } }, { key: "getToolbarIconsReference", value: function () { var t = this.w; this.elZoom || (this.elZoom = t.globals.dom.baseEl.querySelector(".apexcharts-zoom-icon")), this.elPan || (this.elPan = t.globals.dom.baseEl.querySelector(".apexcharts-pan-icon")), this.elSelection || (this.elSelection = t.globals.dom.baseEl.querySelector(".apexcharts-selection-icon")) } }, { key: "enableZoomPanFromToolbar", value: function (t) { this.toggleOtherControls(), "pan" === t ? this.w.globals.panEnabled = !0 : this.w.globals.zoomEnabled = !0; var e = "pan" === t ? this.elPan : this.elZoom, i = "pan" === t ? this.elZoom : this.elPan; e && e.classList.add(this.selectedClass), i && i.classList.remove(this.selectedClass) } }, { key: "togglePanning", value: function () { this.ctx.getSyncedCharts().forEach((function (t) { t.ctx.toolbar.toggleOtherControls(), t.w.globals.panEnabled = !t.w.globals.panEnabled, t.ctx.toolbar.elPan.classList.contains(t.ctx.toolbar.selectedClass) ? t.ctx.toolbar.elPan.classList.remove(t.ctx.toolbar.selectedClass) : t.ctx.toolbar.elPan.classList.add(t.ctx.toolbar.selectedClass) })) } }, { key: "toggleOtherControls", value: function () { var t = this, e = this.w; e.globals.panEnabled = !1, e.globals.zoomEnabled = !1, e.globals.selectionEnabled = !1, this.getToolbarIconsReference(), [this.elPan, this.elSelection, this.elZoom].forEach((function (e) { e && e.classList.remove(t.selectedClass) })) } }, { key: "handleZoomIn", value: function () { var t = this.w; t.globals.isRangeBar && (this.minX = t.globals.minY, this.maxX = t.globals.maxY); var e = (this.minX + this.maxX) / 2, i = (this.minX + e) / 2, a = (this.maxX + e) / 2, s = this._getNewMinXMaxX(i, a); t.globals.disableZoomIn || this.zoomUpdateOptions(s.minX, s.maxX) } }, { key: "handleZoomOut", value: function () { var t = this.w; if (t.globals.isRangeBar && (this.minX = t.globals.minY, this.maxX = t.globals.maxY), !("datetime" === t.config.xaxis.type && new Date(this.minX).getUTCFullYear() < 1e3)) { var e = (this.minX + this.maxX) / 2, i = this.minX - (e - this.minX), a = this.maxX - (e - this.maxX), s = this._getNewMinXMaxX(i, a); t.globals.disableZoomOut || this.zoomUpdateOptions(s.minX, s.maxX) } } }, { key: "_getNewMinXMaxX", value: function (t, e) { var i = this.w.config.xaxis.convertedCatToNumeric; return { minX: i ? Math.floor(t) : t, maxX: i ? Math.floor(e) : e } } }, { key: "zoomUpdateOptions", value: function (t, e) { var i = this.w; if (void 0 !== t || void 0 !== e) { if (!(i.config.xaxis.convertedCatToNumeric && (t < 1 && (t = 1, e = i.globals.dataPoints), e - t < 2))) { var a = { min: t, max: e }, s = this.getBeforeZoomRange(a); s && (a = s.xaxis); var r = { xaxis: a }, o = x.clone(i.globals.initialConfig.yaxis); i.config.chart.group || (r.yaxis = o), this.w.globals.zoomed = !0, this.ctx.updateHelpers._updateOptions(r, !1, this.w.config.chart.animations.dynamicAnimation.enabled), this.zoomCallback(a, o) } } else this.handleZoomReset() } }, { key: "zoomCallback", value: function (t, e) { "function" == typeof this.ev.zoomed && this.ev.zoomed(this.ctx, { xaxis: t, yaxis: e }) } }, { key: "getBeforeZoomRange", value: function (t, e) { var i = null; return "function" == typeof this.ev.beforeZoom && (i = this.ev.beforeZoom(this, { xaxis: t, yaxis: e })), i } }, { key: "toggleMenu", value: function () { var t = this; window.setTimeout((function () { t.elMenu.classList.contains("apexcharts-menu-open") ? t.elMenu.classList.remove("apexcharts-menu-open") : t.elMenu.classList.add("apexcharts-menu-open") }), 0) } }, { key: "handleDownload", value: function (t) { var e = this.w, i = new G(this.ctx); switch (t) { case "svg": i.exportToSVG(this.ctx); break; case "png": i.exportToPng(this.ctx); break; case "csv": i.exportToCSV({ series: e.config.series, columnDelimiter: e.config.chart.toolbar.export.csv.columnDelimiter }) } } }, { key: "handleZoomReset", value: function (t) { this.ctx.getSyncedCharts().forEach((function (t) { var e = t.w; if (e.globals.lastXAxis.min = e.globals.initialConfig.xaxis.min, e.globals.lastXAxis.max = e.globals.initialConfig.xaxis.max, t.updateHelpers.revertDefaultAxisMinMax(), "function" == typeof e.config.chart.events.beforeResetZoom) { var i = e.config.chart.events.beforeResetZoom(t, e); i && t.updateHelpers.revertDefaultAxisMinMax(i) } "function" == typeof e.config.chart.events.zoomed && t.ctx.toolbar.zoomCallback({ min: e.config.xaxis.min, max: e.config.xaxis.max }), e.globals.zoomed = !1; var a = t.ctx.series.emptyCollapsedSeries(x.clone(e.globals.initialSeries)); t.updateHelpers._updateSeries(a, e.config.chart.animations.dynamicAnimation.enabled) })) } }, { key: "destroy", value: function () { this.elZoom = null, this.elZoomIn = null, this.elZoomOut = null, this.elPan = null, this.elSelection = null, this.elZoomReset = null, this.elMenuIcon = null } }]), t }(), ct = function (t) { n(i, t); var e = d(i); function i(t) { var s; return a(this, i), (s = e.call(this, t)).ctx = t, s.w = t.w, s.dragged = !1, s.graphics = new m(s.ctx), s.eventList = ["mousedown", "mouseleave", "mousemove", "touchstart", "touchmove", "mouseup", "touchend"], s.clientX = 0, s.clientY = 0, s.startX = 0, s.endX = 0, s.dragX = 0, s.startY = 0, s.endY = 0, s.dragY = 0, s.moveDirection = "none", s } return r(i, [{ key: "init", value: function (t) { var e = this, i = t.xyRatios, a = this.w, s = this; this.xyRatios = i, this.zoomRect = this.graphics.drawRect(0, 0, 0, 0), this.selectionRect = this.graphics.drawRect(0, 0, 0, 0), this.gridRect = a.globals.dom.baseEl.querySelector(".apexcharts-grid"), this.zoomRect.node.classList.add("apexcharts-zoom-rect"), this.selectionRect.node.classList.add("apexcharts-selection-rect"), a.globals.dom.elGraphical.add(this.zoomRect), a.globals.dom.elGraphical.add(this.selectionRect), "x" === a.config.chart.selection.type ? this.slDraggableRect = this.selectionRect.draggable({ minX: 0, minY: 0, maxX: a.globals.gridWidth, maxY: a.globals.gridHeight }).on("dragmove", this.selectionDragging.bind(this, "dragging")) : "y" === a.config.chart.selection.type ? this.slDraggableRect = this.selectionRect.draggable({ minX: 0, maxX: a.globals.gridWidth }).on("dragmove", this.selectionDragging.bind(this, "dragging")) : this.slDraggableRect = this.selectionRect.draggable().on("dragmove", this.selectionDragging.bind(this, "dragging")), this.preselectedSelection(), this.hoverArea = a.globals.dom.baseEl.querySelector("".concat(a.globals.chartClass, " .apexcharts-svg")), this.hoverArea.classList.add("apexcharts-zoomable"), this.eventList.forEach((function (t) { e.hoverArea.addEventListener(t, s.svgMouseEvents.bind(s, i), { capture: !1, passive: !0 }) })) } }, { key: "destroy", value: function () { this.slDraggableRect && (this.slDraggableRect.draggable(!1), this.slDraggableRect.off(), this.selectionRect.off()), this.selectionRect = null, this.zoomRect = null, this.gridRect = null } }, { key: "svgMouseEvents", value: function (t, e) { var i = this.w, a = this, s = this.ctx.toolbar, r = i.globals.zoomEnabled ? i.config.chart.zoom.type : i.config.chart.selection.type, o = i.config.chart.toolbar.autoSelected; if (e.shiftKey ? (this.shiftWasPressed = !0, s.enableZoomPanFromToolbar("pan" === o ? "zoom" : "pan")) : this.shiftWasPressed && (s.enableZoomPanFromToolbar(o), this.shiftWasPressed = !1), e.target) { var n, l = e.target.classList; if (e.target.parentNode && null !== e.target.parentNode && (n = e.target.parentNode.classList), !(l.contains("apexcharts-selection-rect") || l.contains("apexcharts-legend-marker") || l.contains("apexcharts-legend-text") || n && n.contains("apexcharts-toolbar"))) { if (a.clientX = "touchmove" === e.type || "touchstart" === e.type ? e.touches[0].clientX : "touchend" === e.type ? e.changedTouches[0].clientX : e.clientX, a.clientY = "touchmove" === e.type || "touchstart" === e.type ? e.touches[0].clientY : "touchend" === e.type ? e.changedTouches[0].clientY : e.clientY, "mousedown" === e.type && 1 === e.which) { var h = a.gridRect.getBoundingClientRect(); a.startX = a.clientX - h.left, a.startY = a.clientY - h.top, a.dragged = !1, a.w.globals.mousedown = !0 } if (("mousemove" === e.type && 1 === e.which || "touchmove" === e.type) && (a.dragged = !0, i.globals.panEnabled ? (i.globals.selection = null, a.w.globals.mousedown && a.panDragging({ context: a, zoomtype: r, xyRatios: t })) : (a.w.globals.mousedown && i.globals.zoomEnabled || a.w.globals.mousedown && i.globals.selectionEnabled) && (a.selection = a.selectionDrawing({ context: a, zoomtype: r }))), "mouseup" === e.type || "touchend" === e.type || "mouseleave" === e.type) { var c = a.gridRect.getBoundingClientRect(); a.w.globals.mousedown && (a.endX = a.clientX - c.left, a.endY = a.clientY - c.top, a.dragX = Math.abs(a.endX - a.startX), a.dragY = Math.abs(a.endY - a.startY), (i.globals.zoomEnabled || i.globals.selectionEnabled) && a.selectionDrawn({ context: a, zoomtype: r }), i.globals.panEnabled && i.config.xaxis.convertedCatToNumeric && a.delayedPanScrolled()), i.globals.zoomEnabled && a.hideSelectionRect(this.selectionRect), a.dragged = !1, a.w.globals.mousedown = !1 } this.makeSelectionRectDraggable() } } } }, { key: "makeSelectionRectDraggable", value: function () { var t = this.w; if (this.selectionRect) { var e = this.selectionRect.node.getBoundingClientRect(); e.width > 0 && e.height > 0 && this.slDraggableRect.selectize({ points: "l, r", pointSize: 8, pointType: "rect" }).resize({ constraint: { minX: 0, minY: 0, maxX: t.globals.gridWidth, maxY: t.globals.gridHeight } }).on("resizing", this.selectionDragging.bind(this, "resizing")) } } }, { key: "preselectedSelection", value: function () { var t = this.w, e = this.xyRatios; if (!t.globals.zoomEnabled) if (void 0 !== t.globals.selection && null !== t.globals.selection) this.drawSelectionRect(t.globals.selection); else if (void 0 !== t.config.chart.selection.xaxis.min && void 0 !== t.config.chart.selection.xaxis.max) { var i = (t.config.chart.selection.xaxis.min - t.globals.minX) / e.xRatio, a = t.globals.gridWidth - (t.globals.maxX - t.config.chart.selection.xaxis.max) / e.xRatio - i; t.globals.isRangeBar && (i = (t.config.chart.selection.xaxis.min - t.globals.yAxisScale[0].niceMin) / e.invertedYRatio, a = (t.config.chart.selection.xaxis.max - t.config.chart.selection.xaxis.min) / e.invertedYRatio); var s = { x: i, y: 0, width: a, height: t.globals.gridHeight, translateX: 0, translateY: 0, selectionEnabled: !0 }; this.drawSelectionRect(s), this.makeSelectionRectDraggable(), "function" == typeof t.config.chart.events.selection && t.config.chart.events.selection(this.ctx, { xaxis: { min: t.config.chart.selection.xaxis.min, max: t.config.chart.selection.xaxis.max }, yaxis: {} }) } } }, { key: "drawSelectionRect", value: function (t) { var e = t.x, i = t.y, a = t.width, s = t.height, r = t.translateX, o = void 0 === r ? 0 : r, n = t.translateY, l = void 0 === n ? 0 : n, h = this.w, c = this.zoomRect, d = this.selectionRect; if (this.dragged || null !== h.globals.selection) { var g = { transform: "translate(" + o + ", " + l + ")" }; h.globals.zoomEnabled && this.dragged && (a < 0 && (a = 1), c.attr({ x: e, y: i, width: a, height: s, fill: h.config.chart.zoom.zoomedArea.fill.color, "fill-opacity": h.config.chart.zoom.zoomedArea.fill.opacity, stroke: h.config.chart.zoom.zoomedArea.stroke.color, "stroke-width": h.config.chart.zoom.zoomedArea.stroke.width, "stroke-opacity": h.config.chart.zoom.zoomedArea.stroke.opacity }), m.setAttrs(c.node, g)), h.globals.selectionEnabled && (d.attr({ x: e, y: i, width: a > 0 ? a : 0, height: s > 0 ? s : 0, fill: h.config.chart.selection.fill.color, "fill-opacity": h.config.chart.selection.fill.opacity, stroke: h.config.chart.selection.stroke.color, "stroke-width": h.config.chart.selection.stroke.width, "stroke-dasharray": h.config.chart.selection.stroke.dashArray, "stroke-opacity": h.config.chart.selection.stroke.opacity }), m.setAttrs(d.node, g)) } } }, { key: "hideSelectionRect", value: function (t) { t && t.attr({ x: 0, y: 0, width: 0, height: 0 }) } }, { key: "selectionDrawing", value: function (t) { var e = t.context, i = t.zoomtype, a = this.w, s = e, r = this.gridRect.getBoundingClientRect(), o = s.startX - 1, n = s.startY, l = !1, h = !1, c = s.clientX - r.left - o, d = s.clientY - r.top - n, g = {}; return Math.abs(c + o) > a.globals.gridWidth ? c = a.globals.gridWidth - o : s.clientX - r.left < 0 && (c = o), o > s.clientX - r.left && (l = !0, c = Math.abs(c)), n > s.clientY - r.top && (h = !0, d = Math.abs(d)), g = "x" === i ? { x: l ? o - c : o, y: 0, width: c, height: a.globals.gridHeight } : "y" === i ? { x: 0, y: h ? n - d : n, width: a.globals.gridWidth, height: d } : { x: l ? o - c : o, y: h ? n - d : n, width: c, height: d }, s.drawSelectionRect(g), s.selectionDragging("resizing"), g } }, { key: "selectionDragging", value: function (t, e) { var i = this, a = this.w, s = this.xyRatios, r = this.selectionRect, o = 0; "resizing" === t && (o = 30); var n = function (t) { return parseFloat(r.node.getAttribute(t)) }, l = { x: n("x"), y: n("y"), width: n("width"), height: n("height") }; a.globals.selection = l, "function" == typeof a.config.chart.events.selection && a.globals.selectionEnabled && (clearTimeout(this.w.globals.selectionResizeTimer), this.w.globals.selectionResizeTimer = window.setTimeout((function () { var t, e, o, n, l = i.gridRect.getBoundingClientRect(), h = r.node.getBoundingClientRect(); a.globals.isRangeBar ? (t = a.globals.yAxisScale[0].niceMin + (h.left - l.left) * s.invertedYRatio, e = a.globals.yAxisScale[0].niceMin + (h.right - l.left) * s.invertedYRatio, o = 0, n = 1) : (t = a.globals.xAxisScale.niceMin + (h.left - l.left) * s.xRatio, e = a.globals.xAxisScale.niceMin + (h.right - l.left) * s.xRatio, o = a.globals.yAxisScale[0].niceMin + (l.bottom - h.bottom) * s.yRatio[0], n = a.globals.yAxisScale[0].niceMax - (h.top - l.top) * s.yRatio[0]); var c = { xaxis: { min: t, max: e }, yaxis: { min: o, max: n } }; a.config.chart.events.selection(i.ctx, c), a.config.chart.brush.enabled && void 0 !== a.config.chart.events.brushScrolled && a.config.chart.events.brushScrolled(i.ctx, c) }), o)) } }, { key: "selectionDrawn", value: function (t) { var e = t.context, i = t.zoomtype, a = this.w, s = e, r = this.xyRatios, o = this.ctx.toolbar; if (s.startX > s.endX) { var n = s.startX; s.startX = s.endX, s.endX = n } if (s.startY > s.endY) { var l = s.startY; s.startY = s.endY, s.endY = l } var h = void 0, c = void 0; a.globals.isRangeBar ? (h = a.globals.yAxisScale[0].niceMin + s.startX * r.invertedYRatio, c = a.globals.yAxisScale[0].niceMin + s.endX * r.invertedYRatio) : (h = a.globals.xAxisScale.niceMin + s.startX * r.xRatio, c = a.globals.xAxisScale.niceMin + s.endX * r.xRatio); var d = [], g = []; if (a.config.yaxis.forEach((function (t, e) { if (a.globals.seriesYAxisMap[e].length > 0) { var i = a.globals.seriesYAxisMap[e][0]; d.push(a.globals.yAxisScale[e].niceMax - r.yRatio[i] * s.startY), g.push(a.globals.yAxisScale[e].niceMax - r.yRatio[i] * s.endY) } })), s.dragged && (s.dragX > 10 || s.dragY > 10) && h !== c) if (a.globals.zoomEnabled) { var u = x.clone(a.globals.initialConfig.yaxis), p = x.clone(a.globals.initialConfig.xaxis); if (a.globals.zoomed = !0, a.config.xaxis.convertedCatToNumeric && (h = Math.floor(h), c = Math.floor(c), h < 1 && (h = 1, c = a.globals.dataPoints), c - h < 2 && (c = h + 1)), "xy" !== i && "x" !== i || (p = { min: h, max: c }), "xy" !== i && "y" !== i || u.forEach((function (t, e) { u[e].min = g[e], u[e].max = d[e] })), o) { var f = o.getBeforeZoomRange(p, u); f && (p = f.xaxis ? f.xaxis : p, u = f.yaxis ? f.yaxis : u) } var b = { xaxis: p }; a.config.chart.group || (b.yaxis = u), s.ctx.updateHelpers._updateOptions(b, !1, s.w.config.chart.animations.dynamicAnimation.enabled), "function" == typeof a.config.chart.events.zoomed && o.zoomCallback(p, u) } else if (a.globals.selectionEnabled) { var v, m = null; v = { min: h, max: c }, "xy" !== i && "y" !== i || (m = x.clone(a.config.yaxis)).forEach((function (t, e) { m[e].min = g[e], m[e].max = d[e] })), a.globals.selection = s.selection, "function" == typeof a.config.chart.events.selection && a.config.chart.events.selection(s.ctx, { xaxis: v, yaxis: m }) } } }, { key: "panDragging", value: function (t) { var e = t.context, i = this.w, a = e; if (void 0 !== i.globals.lastClientPosition.x) { var s = i.globals.lastClientPosition.x - a.clientX, r = i.globals.lastClientPosition.y - a.clientY; Math.abs(s) > Math.abs(r) && s > 0 ? this.moveDirection = "left" : Math.abs(s) > Math.abs(r) && s < 0 ? this.moveDirection = "right" : Math.abs(r) > Math.abs(s) && r > 0 ? this.moveDirection = "up" : Math.abs(r) > Math.abs(s) && r < 0 && (this.moveDirection = "down") } i.globals.lastClientPosition = { x: a.clientX, y: a.clientY }; var o = i.globals.isRangeBar ? i.globals.minY : i.globals.minX, n = i.globals.isRangeBar ? i.globals.maxY : i.globals.maxX; i.config.xaxis.convertedCatToNumeric || a.panScrolled(o, n) } }, { key: "delayedPanScrolled", value: function () { var t = this.w, e = t.globals.minX, i = t.globals.maxX, a = (t.globals.maxX - t.globals.minX) / 2; "left" === this.moveDirection ? (e = t.globals.minX + a, i = t.globals.maxX + a) : "right" === this.moveDirection && (e = t.globals.minX - a, i = t.globals.maxX - a), e = Math.floor(e), i = Math.floor(i), this.updateScrolledChart({ xaxis: { min: e, max: i } }, e, i) } }, { key: "panScrolled", value: function (t, e) { var i = this.w, a = this.xyRatios, s = x.clone(i.globals.initialConfig.yaxis), r = a.xRatio, o = i.globals.minX, n = i.globals.maxX; i.globals.isRangeBar && (r = a.invertedYRatio, o = i.globals.minY, n = i.globals.maxY), "left" === this.moveDirection ? (t = o + i.globals.gridWidth / 15 * r, e = n + i.globals.gridWidth / 15 * r) : "right" === this.moveDirection && (t = o - i.globals.gridWidth / 15 * r, e = n - i.globals.gridWidth / 15 * r), i.globals.isRangeBar || (t < i.globals.initialMinX || e > i.globals.initialMaxX) && (t = o, e = n); var l = { xaxis: { min: t, max: e } }; i.config.chart.group || (l.yaxis = s), this.updateScrolledChart(l, t, e) } }, { key: "updateScrolledChart", value: function (t, e, i) { var a = this.w; this.ctx.updateHelpers._updateOptions(t, !1, !1), "function" == typeof a.config.chart.events.scrolled && a.config.chart.events.scrolled(this.ctx, { xaxis: { min: e, max: i } }) } }]), i }(ht), dt = function () { function t(e) { a(this, t), this.w = e.w, this.ttCtx = e, this.ctx = e.ctx } return r(t, [{ key: "getNearestValues", value: function (t) { var e = t.hoverArea, i = t.elGrid, a = t.clientX, s = t.clientY, r = this.w, o = i.getBoundingClientRect(), n = o.width, l = o.height, h = n / (r.globals.dataPoints - 1), c = l / r.globals.dataPoints, d = this.hasBars(); !r.globals.comboCharts && !d || r.config.xaxis.convertedCatToNumeric || (h = n / r.globals.dataPoints); var g = a - o.left - r.globals.barPadForNumericAxis, u = s - o.top; g < 0 || u < 0 || g > n || u > l ? (e.classList.remove("hovering-zoom"), e.classList.remove("hovering-pan")) : r.globals.zoomEnabled ? (e.classList.remove("hovering-pan"), e.classList.add("hovering-zoom")) : r.globals.panEnabled && (e.classList.remove("hovering-zoom"), e.classList.add("hovering-pan")); var p = Math.round(g / h), f = Math.floor(u / c); d && !r.config.xaxis.convertedCatToNumeric && (p = Math.ceil(g / h), p -= 1); var b = null, v = null, m = r.globals.seriesXvalues.map((function (t) { return t.filter((function (t) { return x.isNumber(t) })) })), y = r.globals.seriesYvalues.map((function (t) { return t.filter((function (t) { return x.isNumber(t) })) })); if (r.globals.isXNumeric) { var w = this.ttCtx.getElGrid().getBoundingClientRect(), k = g * (w.width / n), A = u * (w.height / l); b = (v = this.closestInMultiArray(k, A, m, y)).index, p = v.j, null !== b && (m = r.globals.seriesXvalues[b], p = (v = this.closestInArray(k, m)).index) } return r.globals.capturedSeriesIndex = null === b ? -1 : b, (!p || p < 1) && (p = 0), r.globals.isBarHorizontal ? r.globals.capturedDataPointIndex = f : r.globals.capturedDataPointIndex = p, { capturedSeries: b, j: r.globals.isBarHorizontal ? f : p, hoverX: g, hoverY: u } } }, { key: "closestInMultiArray", value: function (t, e, i, a) { var s = this.w, r = 0, o = null, n = -1; s.globals.series.length > 1 ? r = this.getFirstActiveXArray(i) : o = 0; var l = i[r][0], h = Math.abs(t - l); if (i.forEach((function (e) { e.forEach((function (e, i) { var a = Math.abs(t - e); a <= h && (h = a, n = i) })) })), -1 !== n) { var c = a[r][n], d = Math.abs(e - c); o = r, a.forEach((function (t, i) { var a = Math.abs(e - t[n]); a <= d && (d = a, o = i) })) } return { index: o, j: n } } }, { key: "getFirstActiveXArray", value: function (t) { for (var e = this.w, i = 0, a = t.map((function (t, e) { return t.length > 0 ? e : -1 })), s = 0; s < a.length; s++)if (-1 !== a[s] && -1 === e.globals.collapsedSeriesIndices.indexOf(s) && -1 === e.globals.ancillaryCollapsedSeriesIndices.indexOf(s)) { i = a[s]; break } return i } }, { key: "closestInArray", value: function (t, e) { for (var i = e[0], a = null, s = Math.abs(t - i), r = 0; r < e.length; r++) { var o = Math.abs(t - e[r]); o < s && (s = o, a = r) } return { index: a } } }, { key: "isXoverlap", value: function (t) { var e = [], i = this.w.globals.seriesX.filter((function (t) { return void 0 !== t[0] })); if (i.length > 0) for (var a = 0; a < i.length - 1; a++)void 0 !== i[a][t] && void 0 !== i[a + 1][t] && i[a][t] !== i[a + 1][t] && e.push("unEqual"); return 0 === e.length } }, { key: "isInitialSeriesSameLen", value: function () { for (var t = !0, e = this.w.globals.initialSeries, i = 0; i < e.length - 1; i++)if (e[i].data.length !== e[i + 1].data.length) { t = !1; break } return t } }, { key: "getBarsHeight", value: function (t) { return u(t).reduce((function (t, e) { return t + e.getBBox().height }), 0) } }, { key: "getElMarkers", value: function (t) { return "number" == typeof t ? this.w.globals.dom.baseEl.querySelectorAll(".apexcharts-series[data\\:realIndex='".concat(t, "'] .apexcharts-series-markers-wrap > *")) : this.w.globals.dom.baseEl.querySelectorAll(".apexcharts-series-markers-wrap > *") } }, { key: "getAllMarkers", value: function () { var t = this.w.globals.dom.baseEl.querySelectorAll(".apexcharts-series-markers-wrap"); (t = u(t)).sort((function (t, e) { var i = Number(t.getAttribute("data:realIndex")), a = Number(e.getAttribute("data:realIndex")); return a < i ? 1 : a > i ? -1 : 0 })); var e = []; return t.forEach((function (t) { e.push(t.querySelector(".apexcharts-marker")) })), e } }, { key: "hasMarkers", value: function (t) { return this.getElMarkers(t).length > 0 } }, { key: "getElBars", value: function () { return this.w.globals.dom.baseEl.querySelectorAll(".apexcharts-bar-series, .apexcharts-candlestick-series, .apexcharts-boxPlot-series, .apexcharts-rangebar-series") } }, { key: "hasBars", value: function () { return this.getElBars().length > 0 } }, { key: "getHoverMarkerSize", value: function (t) { var e = this.w, i = e.config.markers.hover.size; return void 0 === i && (i = e.globals.markers.size[t] + e.config.markers.hover.sizeOffset), i } }, { key: "toggleAllTooltipSeriesGroups", value: function (t) { var e = this.w, i = this.ttCtx; 0 === i.allTooltipSeriesGroups.length && (i.allTooltipSeriesGroups = e.globals.dom.baseEl.querySelectorAll(".apexcharts-tooltip-series-group")); for (var a = i.allTooltipSeriesGroups, s = 0; s < a.length; s++)"enable" === t ? (a[s].classList.add("apexcharts-active"), a[s].style.display = e.config.tooltip.items.display) : (a[s].classList.remove("apexcharts-active"), a[s].style.display = "none") } }]), t }(), gt = function () { function t(e) { a(this, t), this.w = e.w, this.ctx = e.ctx, this.ttCtx = e, this.tooltipUtil = new dt(e) } return r(t, [{ key: "drawSeriesTexts", value: function (t) { var e = t.shared, i = void 0 === e || e, a = t.ttItems, s = t.i, r = void 0 === s ? 0 : s, o = t.j, n = void 0 === o ? null : o, l = t.y1, h = t.y2, c = t.e, d = this.w; void 0 !== d.config.tooltip.custom ? this.handleCustomTooltip({ i: r, j: n, y1: l, y2: h, w: d }) : this.toggleActiveInactiveSeries(i); var g = this.getValuesToPrint({ i: r, j: n }); this.printLabels({ i: r, j: n, values: g, ttItems: a, shared: i, e: c }); var u = this.ttCtx.getElTooltip(); this.ttCtx.tooltipRect.ttWidth = u.getBoundingClientRect().width, this.ttCtx.tooltipRect.ttHeight = u.getBoundingClientRect().height } }, { key: "printLabels", value: function (t) { var i, a = this, s = t.i, r = t.j, o = t.values, n = t.ttItems, l = t.shared, h = t.e, c = this.w, d = [], g = function (t) { return c.globals.seriesGoals[t] && c.globals.seriesGoals[t][r] && Array.isArray(c.globals.seriesGoals[t][r]) }, u = o.xVal, p = o.zVal, f = o.xAxisTTVal, x = "", b = c.globals.colors[s]; null !== r && c.config.plotOptions.bar.distributed && (b = c.globals.colors[r]); for (var v = function (t, o) { var v = a.getFormatters(s); x = a.getSeriesName({ fn: v.yLbTitleFormatter, index: s, seriesIndex: s, j: r }), "treemap" === c.config.chart.type && (x = v.yLbTitleFormatter(String(c.config.series[s].data[r].x), { series: c.globals.series, seriesIndex: s, dataPointIndex: r, w: c })); var m = c.config.tooltip.inverseOrder ? o : t; if (c.globals.axisCharts) { var y = function (t) { var e, i, a, s; return c.globals.isRangeData ? v.yLbFormatter(null === (e = c.globals.seriesRangeStart) || void 0 === e || null === (i = e[t]) || void 0 === i ? void 0 : i[r], { series: c.globals.seriesRangeStart, seriesIndex: t, dataPointIndex: r, w: c }) + " - " + v.yLbFormatter(null === (a = c.globals.seriesRangeEnd) || void 0 === a || null === (s = a[t]) || void 0 === s ? void 0 : s[r], { series: c.globals.seriesRangeEnd, seriesIndex: t, dataPointIndex: r, w: c }) : v.yLbFormatter(c.globals.series[t][r], { series: c.globals.series, seriesIndex: t, dataPointIndex: r, w: c }) }; if (l) v = a.getFormatters(m), x = a.getSeriesName({ fn: v.yLbTitleFormatter, index: m, seriesIndex: s, j: r }), b = c.globals.colors[m], i = y(m), g(m) && (d = c.globals.seriesGoals[m][r].map((function (t) { return { attrs: t, val: v.yLbFormatter(t.value, { seriesIndex: m, dataPointIndex: r, w: c }) } }))); else { var w, k = null == h || null === (w = h.target) || void 0 === w ? void 0 : w.getAttribute("fill"); k && (b = -1 !== k.indexOf("url") ? document.querySelector(k.substr(4).slice(0, -1)).childNodes[0].getAttribute("stroke") : k), i = y(s), g(s) && Array.isArray(c.globals.seriesGoals[s][r]) && (d = c.globals.seriesGoals[s][r].map((function (t) { return { attrs: t, val: v.yLbFormatter(t.value, { seriesIndex: s, dataPointIndex: r, w: c }) } }))) } } null === r && (i = v.yLbFormatter(c.globals.series[s], e(e({}, c), {}, { seriesIndex: s, dataPointIndex: s }))), a.DOMHandling({ i: s, t: m, j: r, ttItems: n, values: { val: i, goalVals: d, xVal: u, xAxisTTVal: f, zVal: p }, seriesName: x, shared: l, pColor: b }) }, m = 0, y = c.globals.series.length - 1; m < c.globals.series.length; m++, y--)v(m, y) } }, { key: "getFormatters", value: function (t) { var e, i = this.w, a = i.globals.yLabelFormatters[t]; return void 0 !== i.globals.ttVal ? Array.isArray(i.globals.ttVal) ? (a = i.globals.ttVal[t] && i.globals.ttVal[t].formatter, e = i.globals.ttVal[t] && i.globals.ttVal[t].title && i.globals.ttVal[t].title.formatter) : (a = i.globals.ttVal.formatter, "function" == typeof i.globals.ttVal.title.formatter && (e = i.globals.ttVal.title.formatter)) : e = i.config.tooltip.y.title.formatter, "function" != typeof a && (a = i.globals.yLabelFormatters[0] ? i.globals.yLabelFormatters[0] : function (t) { return t }), "function" != typeof e && (e = function (t) { return t }), { yLbFormatter: a, yLbTitleFormatter: e } } }, { key: "getSeriesName", value: function (t) { var e = t.fn, i = t.index, a = t.seriesIndex, s = t.j, r = this.w; return e(String(r.globals.seriesNames[i]), { series: r.globals.series, seriesIndex: a, dataPointIndex: s, w: r }) } }, { key: "DOMHandling", value: function (t) { t.i; var e = t.t, i = t.j, a = t.ttItems, s = t.values, r = t.seriesName, o = t.shared, n = t.pColor, l = this.w, h = this.ttCtx, c = s.val, d = s.goalVals, g = s.xVal, u = s.xAxisTTVal, p = s.zVal, f = null; f = a[e].children, l.config.tooltip.fillSeriesColor && (a[e].style.backgroundColor = n, f[0].style.display = "none"), h.showTooltipTitle && (null === h.tooltipTitle && (h.tooltipTitle = l.globals.dom.baseEl.querySelector(".apexcharts-tooltip-title")), h.tooltipTitle.innerHTML = g), h.isXAxisTooltipEnabled && (h.xaxisTooltipText.innerHTML = "" !== u ? u : g); var x = a[e].querySelector(".apexcharts-tooltip-text-y-label"); x && (x.innerHTML = r || ""); var b = a[e].querySelector(".apexcharts-tooltip-text-y-value"); b && (b.innerHTML = void 0 !== c ? c : ""), f[0] && f[0].classList.contains("apexcharts-tooltip-marker") && (l.config.tooltip.marker.fillColors && Array.isArray(l.config.tooltip.marker.fillColors) && (n = l.config.tooltip.marker.fillColors[e]), f[0].style.backgroundColor = n), l.config.tooltip.marker.show || (f[0].style.display = "none"); var v = a[e].querySelector(".apexcharts-tooltip-text-goals-label"), m = a[e].querySelector(".apexcharts-tooltip-text-goals-value"); if (d.length && l.globals.seriesGoals[e]) { var y = function () { var t = "
", e = "
"; d.forEach((function (i, a) { t += '
').concat(i.attrs.name, "
"), e += "
".concat(i.val, "
") })), v.innerHTML = t + "
", m.innerHTML = e + "
" }; o ? l.globals.seriesGoals[e][i] && Array.isArray(l.globals.seriesGoals[e][i]) ? y() : (v.innerHTML = "", m.innerHTML = "") : y() } else v.innerHTML = "", m.innerHTML = ""; null !== p && (a[e].querySelector(".apexcharts-tooltip-text-z-label").innerHTML = l.config.tooltip.z.title, a[e].querySelector(".apexcharts-tooltip-text-z-value").innerHTML = void 0 !== p ? p : ""); if (o && f[0]) { if (l.config.tooltip.hideEmptySeries) { var w = a[e].querySelector(".apexcharts-tooltip-marker"), k = a[e].querySelector(".apexcharts-tooltip-text"); 0 == parseFloat(c) ? (w.style.display = "none", k.style.display = "none") : (w.style.display = "block", k.style.display = "block") } null == c || l.globals.ancillaryCollapsedSeriesIndices.indexOf(e) > -1 || l.globals.collapsedSeriesIndices.indexOf(e) > -1 ? f[0].parentNode.style.display = "none" : f[0].parentNode.style.display = l.config.tooltip.items.display } } }, { key: "toggleActiveInactiveSeries", value: function (t) { var e = this.w; if (t) this.tooltipUtil.toggleAllTooltipSeriesGroups("enable"); else { this.tooltipUtil.toggleAllTooltipSeriesGroups("disable"); var i = e.globals.dom.baseEl.querySelector(".apexcharts-tooltip-series-group"); i && (i.classList.add("apexcharts-active"), i.style.display = e.config.tooltip.items.display) } } }, { key: "getValuesToPrint", value: function (t) { var e = t.i, i = t.j, a = this.w, s = this.ctx.series.filteredSeriesX(), r = "", o = "", n = null, l = null, h = { series: a.globals.series, seriesIndex: e, dataPointIndex: i, w: a }, c = a.globals.ttZFormatter; null === i ? l = a.globals.series[e] : a.globals.isXNumeric && "treemap" !== a.config.chart.type ? (r = s[e][i], 0 === s[e].length && (r = s[this.tooltipUtil.getFirstActiveXArray(s)][i])) : r = void 0 !== a.globals.labels[i] ? a.globals.labels[i] : ""; var d = r; a.globals.isXNumeric && "datetime" === a.config.xaxis.type ? r = new S(this.ctx).xLabelFormat(a.globals.ttKeyFormatter, d, d, { i: void 0, dateFormatter: new A(this.ctx).formatDate, w: this.w }) : r = a.globals.isBarHorizontal ? a.globals.yLabelFormatters[0](d, h) : a.globals.xLabelFormatter(d, h); return void 0 !== a.config.tooltip.x.formatter && (r = a.globals.ttKeyFormatter(d, h)), a.globals.seriesZ.length > 0 && a.globals.seriesZ[e].length > 0 && (n = c(a.globals.seriesZ[e][i], a)), o = "function" == typeof a.config.xaxis.tooltip.formatter ? a.globals.xaxisTooltipFormatter(d, h) : r, { val: Array.isArray(l) ? l.join(" ") : l, xVal: Array.isArray(r) ? r.join(" ") : r, xAxisTTVal: Array.isArray(o) ? o.join(" ") : o, zVal: n } } }, { key: "handleCustomTooltip", value: function (t) { var e = t.i, i = t.j, a = t.y1, s = t.y2, r = t.w, o = this.ttCtx.getElTooltip(), n = r.config.tooltip.custom; Array.isArray(n) && n[e] && (n = n[e]), o.innerHTML = n({ ctx: this.ctx, series: r.globals.series, seriesIndex: e, dataPointIndex: i, y1: a, y2: s, w: r }) } }]), t }(), ut = function () { function t(e) { a(this, t), this.ttCtx = e, this.ctx = e.ctx, this.w = e.w } return r(t, [{ key: "moveXCrosshairs", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null, i = this.ttCtx, a = this.w, s = i.getElXCrosshairs(), r = t - i.xcrosshairsWidth / 2, o = a.globals.labels.slice().length; if (null !== e && (r = a.globals.gridWidth / o * e), null === s || a.globals.isBarHorizontal || (s.setAttribute("x", r), s.setAttribute("x1", r), s.setAttribute("x2", r), s.setAttribute("y2", a.globals.gridHeight), s.classList.add("apexcharts-active")), r < 0 && (r = 0), r > a.globals.gridWidth && (r = a.globals.gridWidth), i.isXAxisTooltipEnabled) { var n = r; "tickWidth" !== a.config.xaxis.crosshairs.width && "barWidth" !== a.config.xaxis.crosshairs.width || (n = r + i.xcrosshairsWidth / 2), this.moveXAxisTooltip(n) } } }, { key: "moveYCrosshairs", value: function (t) { var e = this.ttCtx; null !== e.ycrosshairs && m.setAttrs(e.ycrosshairs, { y1: t, y2: t }), null !== e.ycrosshairsHidden && m.setAttrs(e.ycrosshairsHidden, { y1: t, y2: t }) } }, { key: "moveXAxisTooltip", value: function (t) { var e = this.w, i = this.ttCtx; if (null !== i.xaxisTooltip && 0 !== i.xcrosshairsWidth) { i.xaxisTooltip.classList.add("apexcharts-active"); var a = i.xaxisOffY + e.config.xaxis.tooltip.offsetY + e.globals.translateY + 1 + e.config.xaxis.offsetY; if (t -= i.xaxisTooltip.getBoundingClientRect().width / 2, !isNaN(t)) { t += e.globals.translateX; var s; s = new m(this.ctx).getTextRects(i.xaxisTooltipText.innerHTML), i.xaxisTooltipText.style.minWidth = s.width + "px", i.xaxisTooltip.style.left = t + "px", i.xaxisTooltip.style.top = a + "px" } } } }, { key: "moveYAxisTooltip", value: function (t) { var e = this.w, i = this.ttCtx; null === i.yaxisTTEls && (i.yaxisTTEls = e.globals.dom.baseEl.querySelectorAll(".apexcharts-yaxistooltip")); var a = parseInt(i.ycrosshairsHidden.getAttribute("y1"), 10), s = e.globals.translateY + a, r = i.yaxisTTEls[t].getBoundingClientRect().height, o = e.globals.translateYAxisX[t] - 2; e.config.yaxis[t].opposite && (o -= 26), s -= r / 2, -1 === e.globals.ignoreYAxisIndexes.indexOf(t) ? (i.yaxisTTEls[t].classList.add("apexcharts-active"), i.yaxisTTEls[t].style.top = s + "px", i.yaxisTTEls[t].style.left = o + e.config.yaxis[t].tooltip.offsetX + "px") : i.yaxisTTEls[t].classList.remove("apexcharts-active") } }, { key: "moveTooltip", value: function (t, e) { var i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : null, a = this.w, s = this.ttCtx, r = s.getElTooltip(), o = s.tooltipRect, n = null !== i ? parseFloat(i) : 1, l = parseFloat(t) + n + 5, h = parseFloat(e) + n / 2; if (l > a.globals.gridWidth / 2 && (l = l - o.ttWidth - n - 10), l > a.globals.gridWidth - o.ttWidth - 10 && (l = a.globals.gridWidth - o.ttWidth), l < -20 && (l = -20), a.config.tooltip.followCursor) { var c = s.getElGrid().getBoundingClientRect(); (l = s.e.clientX - c.left) > a.globals.gridWidth / 2 && (l -= s.tooltipRect.ttWidth), (h = s.e.clientY + a.globals.translateY - c.top) > a.globals.gridHeight / 2 && (h -= s.tooltipRect.ttHeight) } else a.globals.isBarHorizontal || o.ttHeight / 2 + h > a.globals.gridHeight && (h = a.globals.gridHeight - o.ttHeight + a.globals.translateY); isNaN(l) || (l += a.globals.translateX, r.style.left = l + "px", r.style.top = h + "px") } }, { key: "moveMarkers", value: function (t, e) { var i = this.w, a = this.ttCtx; if (i.globals.markers.size[t] > 0) for (var s = i.globals.dom.baseEl.querySelectorAll(" .apexcharts-series[data\\:realIndex='".concat(t, "'] .apexcharts-marker")), r = 0; r < s.length; r++)parseInt(s[r].getAttribute("rel"), 10) === e && (a.marker.resetPointsSize(), a.marker.enlargeCurrentPoint(e, s[r])); else a.marker.resetPointsSize(), this.moveDynamicPointOnHover(e, t) } }, { key: "moveDynamicPointOnHover", value: function (t, e) { var i, a, s = this.w, r = this.ttCtx, o = s.globals.pointsArray, n = r.tooltipUtil.getHoverMarkerSize(e), l = s.config.series[e].type; if (!l || "column" !== l && "candlestick" !== l && "boxPlot" !== l) { i = o[e][t][0], a = o[e][t][1] ? o[e][t][1] : 0; var h = s.globals.dom.baseEl.querySelector(".apexcharts-series[data\\:realIndex='".concat(e, "'] .apexcharts-series-markers circle")); h && a < s.globals.gridHeight && a > 0 && (h.setAttribute("r", n), h.setAttribute("cx", i), h.setAttribute("cy", a)), this.moveXCrosshairs(i), r.fixedTooltip || this.moveTooltip(i, a, n) } } }, { key: "moveDynamicPointsOnHover", value: function (t) { var e, i = this.ttCtx, a = i.w, s = 0, r = 0, o = a.globals.pointsArray; e = new W(this.ctx).getActiveConfigSeriesIndex("asc", ["line", "area", "scatter", "bubble"]); var n = i.tooltipUtil.getHoverMarkerSize(e); o[e] && (s = o[e][t][0], r = o[e][t][1]); var l = i.tooltipUtil.getAllMarkers(); if (null !== l) for (var h = 0; h < a.globals.series.length; h++) { var c = o[h]; if (a.globals.comboCharts && void 0 === c && l.splice(h, 0, null), c && c.length) { var d = o[h][t][1], g = void 0; if (l[h].setAttribute("cx", s), "rangeArea" === a.config.chart.type && !a.globals.comboCharts) { var u = t + a.globals.series[h].length; g = o[h][u][1], d -= Math.abs(d - g) / 2 } null !== d && !isNaN(d) && d < a.globals.gridHeight + n && d + n > 0 ? (l[h] && l[h].setAttribute("r", n), l[h] && l[h].setAttribute("cy", d)) : l[h] && l[h].setAttribute("r", 0) } } this.moveXCrosshairs(s), i.fixedTooltip || this.moveTooltip(s, r || a.globals.gridHeight, n) } }, { key: "moveStickyTooltipOverBars", value: function (t, e) { var i = this.w, a = this.ttCtx, s = i.globals.columnSeries ? i.globals.columnSeries.length : i.globals.series.length, r = s >= 2 && s % 2 == 0 ? Math.floor(s / 2) : Math.floor(s / 2) + 1; i.globals.isBarHorizontal && (r = new W(this.ctx).getActiveConfigSeriesIndex("desc") + 1); var o = i.globals.dom.baseEl.querySelector(".apexcharts-bar-series .apexcharts-series[rel='".concat(r, "'] path[j='").concat(t, "'], .apexcharts-candlestick-series .apexcharts-series[rel='").concat(r, "'] path[j='").concat(t, "'], .apexcharts-boxPlot-series .apexcharts-series[rel='").concat(r, "'] path[j='").concat(t, "'], .apexcharts-rangebar-series .apexcharts-series[rel='").concat(r, "'] path[j='").concat(t, "']")); o || "number" != typeof e || (o = i.globals.dom.baseEl.querySelector(".apexcharts-bar-series .apexcharts-series[data\\:realIndex='".concat(e, "'] path[j='").concat(t, "'],\n .apexcharts-candlestick-series .apexcharts-series[data\\:realIndex='").concat(e, "'] path[j='").concat(t, "'],\n .apexcharts-boxPlot-series .apexcharts-series[data\\:realIndex='").concat(e, "'] path[j='").concat(t, "'],\n .apexcharts-rangebar-series .apexcharts-series[data\\:realIndex='").concat(e, "'] path[j='").concat(t, "']"))); var n = o ? parseFloat(o.getAttribute("cx")) : 0, l = o ? parseFloat(o.getAttribute("cy")) : 0, h = o ? parseFloat(o.getAttribute("barWidth")) : 0, c = a.getElGrid().getBoundingClientRect(), d = o && (o.classList.contains("apexcharts-candlestick-area") || o.classList.contains("apexcharts-boxPlot-area")); i.globals.isXNumeric ? (o && !d && (n -= s % 2 != 0 ? h / 2 : 0), o && d && i.globals.comboCharts && (n -= h / 2)) : i.globals.isBarHorizontal || (n = a.xAxisTicksPositions[t - 1] + a.dataPointsDividedWidth / 2, isNaN(n) && (n = a.xAxisTicksPositions[t] - a.dataPointsDividedWidth / 2)), i.globals.isBarHorizontal ? l -= a.tooltipRect.ttHeight : i.config.tooltip.followCursor ? l = a.e.clientY - c.top - a.tooltipRect.ttHeight / 2 : l + a.tooltipRect.ttHeight + 15 > i.globals.gridHeight && (l = i.globals.gridHeight), i.globals.isBarHorizontal || this.moveXCrosshairs(n), a.fixedTooltip || this.moveTooltip(n, l || i.globals.gridHeight) } }]), t }(), pt = function () { function t(e) { a(this, t), this.w = e.w, this.ttCtx = e, this.ctx = e.ctx, this.tooltipPosition = new ut(e) } return r(t, [{ key: "drawDynamicPoints", value: function () { var t = this.w, e = new m(this.ctx), i = new D(this.ctx), a = t.globals.dom.baseEl.querySelectorAll(".apexcharts-series"); a = u(a), t.config.chart.stacked && a.sort((function (t, e) { return parseFloat(t.getAttribute("data:realIndex")) - parseFloat(e.getAttribute("data:realIndex")) })); for (var s = 0; s < a.length; s++) { var r = a[s].querySelector(".apexcharts-series-markers-wrap"); if (null !== r) { var o = void 0, n = "apexcharts-marker w".concat((Math.random() + 1).toString(36).substring(4)); "line" !== t.config.chart.type && "area" !== t.config.chart.type || t.globals.comboCharts || t.config.tooltip.intersect || (n += " no-pointer-events"); var l = i.getMarkerConfig({ cssClass: n, seriesIndex: Number(r.getAttribute("data:realIndex")) }); (o = e.drawMarker(0, 0, l)).node.setAttribute("default-marker-size", 0); var h = document.createElementNS(t.globals.SVGNS, "g"); h.classList.add("apexcharts-series-markers"), h.appendChild(o.node), r.appendChild(h) } } } }, { key: "enlargeCurrentPoint", value: function (t, e) { var i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : null, a = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : null, s = this.w; "bubble" !== s.config.chart.type && this.newPointSize(t, e); var r = e.getAttribute("cx"), o = e.getAttribute("cy"); if (null !== i && null !== a && (r = i, o = a), this.tooltipPosition.moveXCrosshairs(r), !this.fixedTooltip) { if ("radar" === s.config.chart.type) { var n = this.ttCtx.getElGrid().getBoundingClientRect(); r = this.ttCtx.e.clientX - n.left } this.tooltipPosition.moveTooltip(r, o, s.config.markers.hover.size) } } }, { key: "enlargePoints", value: function (t) { for (var e = this.w, i = this, a = this.ttCtx, s = t, r = e.globals.dom.baseEl.querySelectorAll(".apexcharts-series:not(.apexcharts-series-collapsed) .apexcharts-marker"), o = e.config.markers.hover.size, n = 0; n < r.length; n++) { var l = r[n].getAttribute("rel"), h = r[n].getAttribute("index"); if (void 0 === o && (o = e.globals.markers.size[h] + e.config.markers.hover.sizeOffset), s === parseInt(l, 10)) { i.newPointSize(s, r[n]); var c = r[n].getAttribute("cx"), d = r[n].getAttribute("cy"); i.tooltipPosition.moveXCrosshairs(c), a.fixedTooltip || i.tooltipPosition.moveTooltip(c, d, o) } else i.oldPointSize(r[n]) } } }, { key: "newPointSize", value: function (t, e) { var i = this.w, a = i.config.markers.hover.size, s = 0 === t ? e.parentNode.firstChild : e.parentNode.lastChild; if ("0" !== s.getAttribute("default-marker-size")) { var r = parseInt(s.getAttribute("index"), 10); void 0 === a && (a = i.globals.markers.size[r] + i.config.markers.hover.sizeOffset), a < 0 && (a = 0), s.setAttribute("r", a) } } }, { key: "oldPointSize", value: function (t) { var e = parseFloat(t.getAttribute("default-marker-size")); t.setAttribute("r", e) } }, { key: "resetPointsSize", value: function () { for (var t = this.w.globals.dom.baseEl.querySelectorAll(".apexcharts-series:not(.apexcharts-series-collapsed) .apexcharts-marker"), e = 0; e < t.length; e++) { var i = parseFloat(t[e].getAttribute("default-marker-size")); x.isNumber(i) && i >= 0 ? t[e].setAttribute("r", i) : t[e].setAttribute("r", 0) } } }]), t }(), ft = function () { function t(e) { a(this, t), this.w = e.w; var i = this.w; this.ttCtx = e, this.isVerticalGroupedRangeBar = !i.globals.isBarHorizontal && "rangeBar" === i.config.chart.type && i.config.plotOptions.bar.rangeBarGroupRows } return r(t, [{ key: "getAttr", value: function (t, e) { return parseFloat(t.target.getAttribute(e)) } }, { key: "handleHeatTreeTooltip", value: function (t) { var e = t.e, i = t.opt, a = t.x, s = t.y, r = t.type, o = this.ttCtx, n = this.w; if (e.target.classList.contains("apexcharts-".concat(r, "-rect"))) { var l = this.getAttr(e, "i"), h = this.getAttr(e, "j"), c = this.getAttr(e, "cx"), d = this.getAttr(e, "cy"), g = this.getAttr(e, "width"), u = this.getAttr(e, "height"); if (o.tooltipLabels.drawSeriesTexts({ ttItems: i.ttItems, i: l, j: h, shared: !1, e: e }), n.globals.capturedSeriesIndex = l, n.globals.capturedDataPointIndex = h, a = c + o.tooltipRect.ttWidth / 2 + g, s = d + o.tooltipRect.ttHeight / 2 - u / 2, o.tooltipPosition.moveXCrosshairs(c + g / 2), a > n.globals.gridWidth / 2 && (a = c - o.tooltipRect.ttWidth / 2 + g), o.w.config.tooltip.followCursor) { var p = n.globals.dom.elWrap.getBoundingClientRect(); a = n.globals.clientX - p.left - (a > n.globals.gridWidth / 2 ? o.tooltipRect.ttWidth : 0), s = n.globals.clientY - p.top - (s > n.globals.gridHeight / 2 ? o.tooltipRect.ttHeight : 0) } } return { x: a, y: s } } }, { key: "handleMarkerTooltip", value: function (t) { var e, i, a = t.e, s = t.opt, r = t.x, o = t.y, n = this.w, l = this.ttCtx; if (a.target.classList.contains("apexcharts-marker")) { var h = parseInt(s.paths.getAttribute("cx"), 10), c = parseInt(s.paths.getAttribute("cy"), 10), d = parseFloat(s.paths.getAttribute("val")); if (i = parseInt(s.paths.getAttribute("rel"), 10), e = parseInt(s.paths.parentNode.parentNode.parentNode.getAttribute("rel"), 10) - 1, l.intersect) { var g = x.findAncestor(s.paths, "apexcharts-series"); g && (e = parseInt(g.getAttribute("data:realIndex"), 10)) } if (l.tooltipLabels.drawSeriesTexts({ ttItems: s.ttItems, i: e, j: i, shared: !l.showOnIntersect && n.config.tooltip.shared, e: a }), "mouseup" === a.type && l.markerClick(a, e, i), n.globals.capturedSeriesIndex = e, n.globals.capturedDataPointIndex = i, r = h, o = c + n.globals.translateY - 1.4 * l.tooltipRect.ttHeight, l.w.config.tooltip.followCursor) { var u = l.getElGrid().getBoundingClientRect(); o = l.e.clientY + n.globals.translateY - u.top } d < 0 && (o = c), l.marker.enlargeCurrentPoint(i, s.paths, r, o) } return { x: r, y: o } } }, { key: "handleBarTooltip", value: function (t) { var e, i, a = t.e, s = t.opt, r = this.w, o = this.ttCtx, n = o.getElTooltip(), l = 0, h = 0, c = 0, d = this.getBarTooltipXY({ e: a, opt: s }); e = d.i; var g = d.barHeight, u = d.j; r.globals.capturedSeriesIndex = e, r.globals.capturedDataPointIndex = u, r.globals.isBarHorizontal && o.tooltipUtil.hasBars() || !r.config.tooltip.shared ? (h = d.x, c = d.y, i = Array.isArray(r.config.stroke.width) ? r.config.stroke.width[e] : r.config.stroke.width, l = h) : r.globals.comboCharts || r.config.tooltip.shared || (l /= 2), isNaN(c) && (c = r.globals.svgHeight - o.tooltipRect.ttHeight); var p = parseInt(s.paths.parentNode.getAttribute("data:realIndex"), 10), f = r.globals.isMultipleYAxis ? r.config.yaxis[p] && r.config.yaxis[p].reversed : r.config.yaxis[0].reversed; if (h + o.tooltipRect.ttWidth > r.globals.gridWidth && !f ? h -= o.tooltipRect.ttWidth : h < 0 && (h = 0), o.w.config.tooltip.followCursor) { var x = o.getElGrid().getBoundingClientRect(); c = o.e.clientY - x.top } null === o.tooltip && (o.tooltip = r.globals.dom.baseEl.querySelector(".apexcharts-tooltip")), r.config.tooltip.shared || (r.globals.comboBarCount > 0 ? o.tooltipPosition.moveXCrosshairs(l + i / 2) : o.tooltipPosition.moveXCrosshairs(l)), !o.fixedTooltip && (!r.config.tooltip.shared || r.globals.isBarHorizontal && o.tooltipUtil.hasBars()) && (f && (h -= o.tooltipRect.ttWidth) < 0 && (h = 0), !f || r.globals.isBarHorizontal && o.tooltipUtil.hasBars() || (c = c + g - 2 * (r.globals.series[e][u] < 0 ? g : 0)), c = c + r.globals.translateY - o.tooltipRect.ttHeight / 2, n.style.left = h + r.globals.translateX + "px", n.style.top = c + "px") } }, { key: "getBarTooltipXY", value: function (t) { var e = this, i = t.e, a = t.opt, s = this.w, r = null, o = this.ttCtx, n = 0, l = 0, h = 0, c = 0, d = 0, g = i.target.classList; if (g.contains("apexcharts-bar-area") || g.contains("apexcharts-candlestick-area") || g.contains("apexcharts-boxPlot-area") || g.contains("apexcharts-rangebar-area")) { var u = i.target, p = u.getBoundingClientRect(), f = a.elGrid.getBoundingClientRect(), x = p.height; d = p.height; var b = p.width, v = parseInt(u.getAttribute("cx"), 10), m = parseInt(u.getAttribute("cy"), 10); c = parseFloat(u.getAttribute("barWidth")); var y = "touchmove" === i.type ? i.touches[0].clientX : i.clientX; r = parseInt(u.getAttribute("j"), 10), n = parseInt(u.parentNode.getAttribute("rel"), 10) - 1; var w = u.getAttribute("data-range-y1"), k = u.getAttribute("data-range-y2"); s.globals.comboCharts && (n = parseInt(u.parentNode.getAttribute("data:realIndex"), 10)); var A = function (t) { return s.globals.isXNumeric ? v - b / 2 : e.isVerticalGroupedRangeBar ? v + b / 2 : v - o.dataPointsDividedWidth + b / 2 }, S = function () { return m - o.dataPointsDividedHeight + x / 2 - o.tooltipRect.ttHeight / 2 }; o.tooltipLabels.drawSeriesTexts({ ttItems: a.ttItems, i: n, j: r, y1: w ? parseInt(w, 10) : null, y2: k ? parseInt(k, 10) : null, shared: !o.showOnIntersect && s.config.tooltip.shared, e: i }), s.config.tooltip.followCursor ? s.globals.isBarHorizontal ? (l = y - f.left + 15, h = S()) : (l = A(), h = i.clientY - f.top - o.tooltipRect.ttHeight / 2 - 15) : s.globals.isBarHorizontal ? ((l = v) < o.xyRatios.baseLineInvertedY && (l = v - o.tooltipRect.ttWidth), h = S()) : (l = A(), h = m) } return { x: l, y: h, barHeight: d, barWidth: c, i: n, j: r } } }]), t }(), xt = function () { function t(e) { a(this, t), this.w = e.w, this.ttCtx = e } return r(t, [{ key: "drawXaxisTooltip", value: function () { var t = this.w, e = this.ttCtx, i = "bottom" === t.config.xaxis.position; e.xaxisOffY = i ? t.globals.gridHeight + 1 : -t.globals.xAxisHeight - t.config.xaxis.axisTicks.height + 3; var a = i ? "apexcharts-xaxistooltip apexcharts-xaxistooltip-bottom" : "apexcharts-xaxistooltip apexcharts-xaxistooltip-top", s = t.globals.dom.elWrap; e.isXAxisTooltipEnabled && (null === t.globals.dom.baseEl.querySelector(".apexcharts-xaxistooltip") && (e.xaxisTooltip = document.createElement("div"), e.xaxisTooltip.setAttribute("class", a + " apexcharts-theme-" + t.config.tooltip.theme), s.appendChild(e.xaxisTooltip), e.xaxisTooltipText = document.createElement("div"), e.xaxisTooltipText.classList.add("apexcharts-xaxistooltip-text"), e.xaxisTooltipText.style.fontFamily = t.config.xaxis.tooltip.style.fontFamily || t.config.chart.fontFamily, e.xaxisTooltipText.style.fontSize = t.config.xaxis.tooltip.style.fontSize, e.xaxisTooltip.appendChild(e.xaxisTooltipText))) } }, { key: "drawYaxisTooltip", value: function () { for (var t = this.w, e = this.ttCtx, i = 0; i < t.config.yaxis.length; i++) { var a = t.config.yaxis[i].opposite || t.config.yaxis[i].crosshairs.opposite; e.yaxisOffX = a ? t.globals.gridWidth + 1 : 1; var s = "apexcharts-yaxistooltip apexcharts-yaxistooltip-".concat(i, a ? " apexcharts-yaxistooltip-right" : " apexcharts-yaxistooltip-left"), r = t.globals.dom.elWrap; null === t.globals.dom.baseEl.querySelector(".apexcharts-yaxistooltip apexcharts-yaxistooltip-".concat(i)) && (e.yaxisTooltip = document.createElement("div"), e.yaxisTooltip.setAttribute("class", s + " apexcharts-theme-" + t.config.tooltip.theme), r.appendChild(e.yaxisTooltip), 0 === i && (e.yaxisTooltipText = []), e.yaxisTooltipText[i] = document.createElement("div"), e.yaxisTooltipText[i].classList.add("apexcharts-yaxistooltip-text"), e.yaxisTooltip.appendChild(e.yaxisTooltipText[i])) } } }, { key: "setXCrosshairWidth", value: function () { var t = this.w, e = this.ttCtx, i = e.getElXCrosshairs(); if (e.xcrosshairsWidth = parseInt(t.config.xaxis.crosshairs.width, 10), t.globals.comboCharts) { var a = t.globals.dom.baseEl.querySelector(".apexcharts-bar-area"); if (null !== a && "barWidth" === t.config.xaxis.crosshairs.width) { var s = parseFloat(a.getAttribute("barWidth")); e.xcrosshairsWidth = s } else if ("tickWidth" === t.config.xaxis.crosshairs.width) { var r = t.globals.labels.length; e.xcrosshairsWidth = t.globals.gridWidth / r } } else if ("tickWidth" === t.config.xaxis.crosshairs.width) { var o = t.globals.labels.length; e.xcrosshairsWidth = t.globals.gridWidth / o } else if ("barWidth" === t.config.xaxis.crosshairs.width) { var n = t.globals.dom.baseEl.querySelector(".apexcharts-bar-area"); if (null !== n) { var l = parseFloat(n.getAttribute("barWidth")); e.xcrosshairsWidth = l } else e.xcrosshairsWidth = 1 } t.globals.isBarHorizontal && (e.xcrosshairsWidth = 0), null !== i && e.xcrosshairsWidth > 0 && i.setAttribute("width", e.xcrosshairsWidth) } }, { key: "handleYCrosshair", value: function () { var t = this.w, e = this.ttCtx; e.ycrosshairs = t.globals.dom.baseEl.querySelector(".apexcharts-ycrosshairs"), e.ycrosshairsHidden = t.globals.dom.baseEl.querySelector(".apexcharts-ycrosshairs-hidden") } }, { key: "drawYaxisTooltipText", value: function (t, e, i) { var a = this.ttCtx, s = this.w, r = s.globals, o = r.seriesYAxisMap[t]; if (a.yaxisTooltips[t] && o.length > 0) { var n = r.yLabelFormatters[t], l = a.getElGrid().getBoundingClientRect(), h = o[0]; i.yRatio.length > 1 && function (t) { throw new TypeError('"' + t + '" is read-only') }("translationsIndex"); var c = (e - l.top) * i.yRatio[0], d = r.maxYArr[h] - r.minYArr[h], g = r.minYArr[h] + (d - c); s.config.yaxis[t].reversed && (g = r.maxYArr[h] - (d - c)), a.tooltipPosition.moveYCrosshairs(e - l.top), a.yaxisTooltipText[t].innerHTML = n(g), a.tooltipPosition.moveYAxisTooltip(t) } } }]), t }(), bt = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w; var i = this.w; this.tConfig = i.config.tooltip, this.tooltipUtil = new dt(this), this.tooltipLabels = new gt(this), this.tooltipPosition = new ut(this), this.marker = new pt(this), this.intersect = new ft(this), this.axesTooltip = new xt(this), this.showOnIntersect = this.tConfig.intersect, this.showTooltipTitle = this.tConfig.x.show, this.fixedTooltip = this.tConfig.fixed.enabled, this.xaxisTooltip = null, this.yaxisTTEls = null, this.isBarShared = !i.globals.isBarHorizontal && this.tConfig.shared, this.lastHoverTime = Date.now() } return r(t, [{ key: "getElTooltip", value: function (t) { return t || (t = this), t.w.globals.dom.baseEl ? t.w.globals.dom.baseEl.querySelector(".apexcharts-tooltip") : null } }, { key: "getElXCrosshairs", value: function () { return this.w.globals.dom.baseEl.querySelector(".apexcharts-xcrosshairs") } }, { key: "getElGrid", value: function () { return this.w.globals.dom.baseEl.querySelector(".apexcharts-grid") } }, { key: "drawTooltip", value: function (t) { var e = this.w; this.xyRatios = t, this.isXAxisTooltipEnabled = e.config.xaxis.tooltip.enabled && e.globals.axisCharts, this.yaxisTooltips = e.config.yaxis.map((function (t, i) { return !!(t.show && t.tooltip.enabled && e.globals.axisCharts) })), this.allTooltipSeriesGroups = [], e.globals.axisCharts || (this.showTooltipTitle = !1); var i = document.createElement("div"); if (i.classList.add("apexcharts-tooltip"), e.config.tooltip.cssClass && i.classList.add(e.config.tooltip.cssClass), i.classList.add("apexcharts-theme-".concat(this.tConfig.theme)), e.globals.dom.elWrap.appendChild(i), e.globals.axisCharts) { this.axesTooltip.drawXaxisTooltip(), this.axesTooltip.drawYaxisTooltip(), this.axesTooltip.setXCrosshairWidth(), this.axesTooltip.handleYCrosshair(); var a = new V(this.ctx); this.xAxisTicksPositions = a.getXAxisTicksPositions() } if (!e.globals.comboCharts && !this.tConfig.intersect && "rangeBar" !== e.config.chart.type || this.tConfig.shared || (this.showOnIntersect = !0), 0 !== e.config.markers.size && 0 !== e.globals.markers.largestSize || this.marker.drawDynamicPoints(this), e.globals.collapsedSeries.length !== e.globals.series.length) { this.dataPointsDividedHeight = e.globals.gridHeight / e.globals.dataPoints, this.dataPointsDividedWidth = e.globals.gridWidth / e.globals.dataPoints, this.showTooltipTitle && (this.tooltipTitle = document.createElement("div"), this.tooltipTitle.classList.add("apexcharts-tooltip-title"), this.tooltipTitle.style.fontFamily = this.tConfig.style.fontFamily || e.config.chart.fontFamily, this.tooltipTitle.style.fontSize = this.tConfig.style.fontSize, i.appendChild(this.tooltipTitle)); var s = e.globals.series.length; (e.globals.xyCharts || e.globals.comboCharts) && this.tConfig.shared && (s = this.showOnIntersect ? 1 : e.globals.series.length), this.legendLabels = e.globals.dom.baseEl.querySelectorAll(".apexcharts-legend-text"), this.ttItems = this.createTTElements(s), this.addSVGEvents() } } }, { key: "createTTElements", value: function (t) { for (var e = this, i = this.w, a = [], s = this.getElTooltip(), r = function (r) { var o = document.createElement("div"); o.classList.add("apexcharts-tooltip-series-group"), o.style.order = i.config.tooltip.inverseOrder ? t - r : r + 1, e.tConfig.shared && e.tConfig.enabledOnSeries && Array.isArray(e.tConfig.enabledOnSeries) && e.tConfig.enabledOnSeries.indexOf(r) < 0 && o.classList.add("apexcharts-tooltip-series-group-hidden"); var n = document.createElement("span"); n.classList.add("apexcharts-tooltip-marker"), n.style.backgroundColor = i.globals.colors[r], o.appendChild(n); var l = document.createElement("div"); l.classList.add("apexcharts-tooltip-text"), l.style.fontFamily = e.tConfig.style.fontFamily || i.config.chart.fontFamily, l.style.fontSize = e.tConfig.style.fontSize, ["y", "goals", "z"].forEach((function (t) { var e = document.createElement("div"); e.classList.add("apexcharts-tooltip-".concat(t, "-group")); var i = document.createElement("span"); i.classList.add("apexcharts-tooltip-text-".concat(t, "-label")), e.appendChild(i); var a = document.createElement("span"); a.classList.add("apexcharts-tooltip-text-".concat(t, "-value")), e.appendChild(a), l.appendChild(e) })), o.appendChild(l), s.appendChild(o), a.push(o) }, o = 0; o < t; o++)r(o); return a } }, { key: "addSVGEvents", value: function () { var t = this.w, e = t.config.chart.type, i = this.getElTooltip(), a = !("bar" !== e && "candlestick" !== e && "boxPlot" !== e && "rangeBar" !== e), s = "area" === e || "line" === e || "scatter" === e || "bubble" === e || "radar" === e, r = t.globals.dom.Paper.node, o = this.getElGrid(); o && (this.seriesBound = o.getBoundingClientRect()); var n, l = [], h = [], c = { hoverArea: r, elGrid: o, tooltipEl: i, tooltipY: l, tooltipX: h, ttItems: this.ttItems }; if (t.globals.axisCharts && (s ? n = t.globals.dom.baseEl.querySelectorAll(".apexcharts-series[data\\:longestSeries='true'] .apexcharts-marker") : a ? n = t.globals.dom.baseEl.querySelectorAll(".apexcharts-series .apexcharts-bar-area, .apexcharts-series .apexcharts-candlestick-area, .apexcharts-series .apexcharts-boxPlot-area, .apexcharts-series .apexcharts-rangebar-area") : "heatmap" !== e && "treemap" !== e || (n = t.globals.dom.baseEl.querySelectorAll(".apexcharts-series .apexcharts-heatmap, .apexcharts-series .apexcharts-treemap")), n && n.length)) for (var d = 0; d < n.length; d++)l.push(n[d].getAttribute("cy")), h.push(n[d].getAttribute("cx")); if (t.globals.xyCharts && !this.showOnIntersect || t.globals.comboCharts && !this.showOnIntersect || a && this.tooltipUtil.hasBars() && this.tConfig.shared) this.addPathsEventListeners([r], c); else if (a && !t.globals.comboCharts || s && this.showOnIntersect) this.addDatapointEventsListeners(c); else if (!t.globals.axisCharts || "heatmap" === e || "treemap" === e) { var g = t.globals.dom.baseEl.querySelectorAll(".apexcharts-series"); this.addPathsEventListeners(g, c) } if (this.showOnIntersect) { var u = t.globals.dom.baseEl.querySelectorAll(".apexcharts-line-series .apexcharts-marker, .apexcharts-area-series .apexcharts-marker"); u.length > 0 && this.addPathsEventListeners(u, c), this.tooltipUtil.hasBars() && !this.tConfig.shared && this.addDatapointEventsListeners(c) } } }, { key: "drawFixedTooltipRect", value: function () { var t = this.w, e = this.getElTooltip(), i = e.getBoundingClientRect(), a = i.width + 10, s = i.height + 10, r = this.tConfig.fixed.offsetX, o = this.tConfig.fixed.offsetY, n = this.tConfig.fixed.position.toLowerCase(); return n.indexOf("right") > -1 && (r = r + t.globals.svgWidth - a + 10), n.indexOf("bottom") > -1 && (o = o + t.globals.svgHeight - s - 10), e.style.left = r + "px", e.style.top = o + "px", { x: r, y: o, ttWidth: a, ttHeight: s } } }, { key: "addDatapointEventsListeners", value: function (t) { var e = this.w.globals.dom.baseEl.querySelectorAll(".apexcharts-series-markers .apexcharts-marker, .apexcharts-bar-area, .apexcharts-candlestick-area, .apexcharts-boxPlot-area, .apexcharts-rangebar-area"); this.addPathsEventListeners(e, t) } }, { key: "addPathsEventListeners", value: function (t, e) { for (var i = this, a = function (a) { var s = { paths: t[a], tooltipEl: e.tooltipEl, tooltipY: e.tooltipY, tooltipX: e.tooltipX, elGrid: e.elGrid, hoverArea: e.hoverArea, ttItems: e.ttItems };["mousemove", "mouseup", "touchmove", "mouseout", "touchend"].map((function (e) { return t[a].addEventListener(e, i.onSeriesHover.bind(i, s), { capture: !1, passive: !0 }) })) }, s = 0; s < t.length; s++)a(s) } }, { key: "onSeriesHover", value: function (t, e) { var i = this, a = Date.now() - this.lastHoverTime; a >= 100 ? this.seriesHover(t, e) : (clearTimeout(this.seriesHoverTimeout), this.seriesHoverTimeout = setTimeout((function () { i.seriesHover(t, e) }), 100 - a)) } }, { key: "seriesHover", value: function (t, e) { var i = this; this.lastHoverTime = Date.now(); var a = [], s = this.w; s.config.chart.group && (a = this.ctx.getGroupedCharts()), s.globals.axisCharts && (s.globals.minX === -1 / 0 && s.globals.maxX === 1 / 0 || 0 === s.globals.dataPoints) || (a.length ? a.forEach((function (a) { var s = i.getElTooltip(a), r = { paths: t.paths, tooltipEl: s, tooltipY: t.tooltipY, tooltipX: t.tooltipX, elGrid: t.elGrid, hoverArea: t.hoverArea, ttItems: a.w.globals.tooltip.ttItems }; a.w.globals.minX === i.w.globals.minX && a.w.globals.maxX === i.w.globals.maxX && a.w.globals.tooltip.seriesHoverByContext({ chartCtx: a, ttCtx: a.w.globals.tooltip, opt: r, e: e }) })) : this.seriesHoverByContext({ chartCtx: this.ctx, ttCtx: this.w.globals.tooltip, opt: t, e: e })) } }, { key: "seriesHoverByContext", value: function (t) { var e = t.chartCtx, i = t.ttCtx, a = t.opt, s = t.e, r = e.w, o = this.getElTooltip(); if (o) { if (i.tooltipRect = { x: 0, y: 0, ttWidth: o.getBoundingClientRect().width, ttHeight: o.getBoundingClientRect().height }, i.e = s, i.tooltipUtil.hasBars() && !r.globals.comboCharts && !i.isBarShared) if (this.tConfig.onDatasetHover.highlightDataSeries) new W(e).toggleSeriesOnHover(s, s.target.parentNode); i.fixedTooltip && i.drawFixedTooltipRect(), r.globals.axisCharts ? i.axisChartsTooltips({ e: s, opt: a, tooltipRect: i.tooltipRect }) : i.nonAxisChartsTooltips({ e: s, opt: a, tooltipRect: i.tooltipRect }) } } }, { key: "axisChartsTooltips", value: function (t) { var e, i, a = t.e, s = t.opt, r = this.w, o = s.elGrid.getBoundingClientRect(), n = "touchmove" === a.type ? a.touches[0].clientX : a.clientX, l = "touchmove" === a.type ? a.touches[0].clientY : a.clientY; if (this.clientY = l, this.clientX = n, r.globals.capturedSeriesIndex = -1, r.globals.capturedDataPointIndex = -1, l < o.top || l > o.top + o.height) this.handleMouseOut(s); else { if (Array.isArray(this.tConfig.enabledOnSeries) && !r.config.tooltip.shared) { var h = parseInt(s.paths.getAttribute("index"), 10); if (this.tConfig.enabledOnSeries.indexOf(h) < 0) return void this.handleMouseOut(s) } var c = this.getElTooltip(), d = this.getElXCrosshairs(), g = r.globals.xyCharts || "bar" === r.config.chart.type && !r.globals.isBarHorizontal && this.tooltipUtil.hasBars() && this.tConfig.shared || r.globals.comboCharts && this.tooltipUtil.hasBars(); if ("mousemove" === a.type || "touchmove" === a.type || "mouseup" === a.type) { if (r.globals.collapsedSeries.length + r.globals.ancillaryCollapsedSeries.length === r.globals.series.length) return; null !== d && d.classList.add("apexcharts-active"); var u = this.yaxisTooltips.filter((function (t) { return !0 === t })); if (null !== this.ycrosshairs && u.length && this.ycrosshairs.classList.add("apexcharts-active"), g && !this.showOnIntersect) this.handleStickyTooltip(a, n, l, s); else if ("heatmap" === r.config.chart.type || "treemap" === r.config.chart.type) { var p = this.intersect.handleHeatTreeTooltip({ e: a, opt: s, x: e, y: i, type: r.config.chart.type }); e = p.x, i = p.y, c.style.left = e + "px", c.style.top = i + "px" } else this.tooltipUtil.hasBars() && this.intersect.handleBarTooltip({ e: a, opt: s }), this.tooltipUtil.hasMarkers() && this.intersect.handleMarkerTooltip({ e: a, opt: s, x: e, y: i }); if (this.yaxisTooltips.length) for (var f = 0; f < r.config.yaxis.length; f++)this.axesTooltip.drawYaxisTooltipText(f, l, this.xyRatios); s.tooltipEl.classList.add("apexcharts-active") } else "mouseout" !== a.type && "touchend" !== a.type || this.handleMouseOut(s) } } }, { key: "nonAxisChartsTooltips", value: function (t) { var e = t.e, i = t.opt, a = t.tooltipRect, s = this.w, r = i.paths.getAttribute("rel"), o = this.getElTooltip(), n = s.globals.dom.elWrap.getBoundingClientRect(); if ("mousemove" === e.type || "touchmove" === e.type) { o.classList.add("apexcharts-active"), this.tooltipLabels.drawSeriesTexts({ ttItems: i.ttItems, i: parseInt(r, 10) - 1, shared: !1 }); var l = s.globals.clientX - n.left - a.ttWidth / 2, h = s.globals.clientY - n.top - a.ttHeight - 10; if (o.style.left = l + "px", o.style.top = h + "px", s.config.legend.tooltipHoverFormatter) { var c = r - 1, d = (0, s.config.legend.tooltipHoverFormatter)(this.legendLabels[c].getAttribute("data:default-text"), { seriesIndex: c, dataPointIndex: c, w: s }); this.legendLabels[c].innerHTML = d } } else "mouseout" !== e.type && "touchend" !== e.type || (o.classList.remove("apexcharts-active"), s.config.legend.tooltipHoverFormatter && this.legendLabels.forEach((function (t) { var e = t.getAttribute("data:default-text"); t.innerHTML = decodeURIComponent(e) }))) } }, { key: "handleStickyTooltip", value: function (t, e, i, a) { var s = this.w, r = this.tooltipUtil.getNearestValues({ context: this, hoverArea: a.hoverArea, elGrid: a.elGrid, clientX: e, clientY: i }), o = r.j, n = r.capturedSeries; s.globals.collapsedSeriesIndices.includes(n) && (n = null); var l = a.elGrid.getBoundingClientRect(); if (r.hoverX < 0 || r.hoverX > l.width) this.handleMouseOut(a); else if (null !== n) this.handleStickyCapturedSeries(t, n, a, o); else if (this.tooltipUtil.isXoverlap(o) || s.globals.isBarHorizontal) { var h = s.globals.series.findIndex((function (t, e) { return !s.globals.collapsedSeriesIndices.includes(e) })); this.create(t, this, h, o, a.ttItems) } } }, { key: "handleStickyCapturedSeries", value: function (t, e, i, a) { var s = this.w; if (!this.tConfig.shared && null === s.globals.series[e][a]) return void this.handleMouseOut(i); if (void 0 !== s.globals.series[e][a]) this.tConfig.shared && this.tooltipUtil.isXoverlap(a) && this.tooltipUtil.isInitialSeriesSameLen() ? this.create(t, this, e, a, i.ttItems) : this.create(t, this, e, a, i.ttItems, !1); else if (this.tooltipUtil.isXoverlap(a)) { var r = s.globals.series.findIndex((function (t, e) { return !s.globals.collapsedSeriesIndices.includes(e) })); this.create(t, this, r, a, i.ttItems) } } }, { key: "deactivateHoverFilter", value: function () { for (var t = this.w, e = new m(this.ctx), i = t.globals.dom.Paper.select(".apexcharts-bar-area"), a = 0; a < i.length; a++)e.pathMouseLeave(i[a]) } }, { key: "handleMouseOut", value: function (t) { var e = this.w, i = this.getElXCrosshairs(); if (t.tooltipEl.classList.remove("apexcharts-active"), this.deactivateHoverFilter(), "bubble" !== e.config.chart.type && this.marker.resetPointsSize(), null !== i && i.classList.remove("apexcharts-active"), null !== this.ycrosshairs && this.ycrosshairs.classList.remove("apexcharts-active"), this.isXAxisTooltipEnabled && this.xaxisTooltip.classList.remove("apexcharts-active"), this.yaxisTooltips.length) { null === this.yaxisTTEls && (this.yaxisTTEls = e.globals.dom.baseEl.querySelectorAll(".apexcharts-yaxistooltip")); for (var a = 0; a < this.yaxisTTEls.length; a++)this.yaxisTTEls[a].classList.remove("apexcharts-active") } e.config.legend.tooltipHoverFormatter && this.legendLabels.forEach((function (t) { var e = t.getAttribute("data:default-text"); t.innerHTML = decodeURIComponent(e) })) } }, { key: "markerClick", value: function (t, e, i) { var a = this.w; "function" == typeof a.config.chart.events.markerClick && a.config.chart.events.markerClick(t, this.ctx, { seriesIndex: e, dataPointIndex: i, w: a }), this.ctx.events.fireEvent("markerClick", [t, this.ctx, { seriesIndex: e, dataPointIndex: i, w: a }]) } }, { key: "create", value: function (t, i, a, s, r) { var o, n, l, h, c, d, g, u, p, f, x, b, v, y, w, k, A = arguments.length > 5 && void 0 !== arguments[5] ? arguments[5] : null, S = this.w, C = i; "mouseup" === t.type && this.markerClick(t, a, s), null === A && (A = this.tConfig.shared); var L = this.tooltipUtil.hasMarkers(a), P = this.tooltipUtil.getElBars(); if (S.config.legend.tooltipHoverFormatter) { var M = S.config.legend.tooltipHoverFormatter, I = Array.from(this.legendLabels); I.forEach((function (t) { var e = t.getAttribute("data:default-text"); t.innerHTML = decodeURIComponent(e) })); for (var T = 0; T < I.length; T++) { var z = I[T], X = parseInt(z.getAttribute("i"), 10), E = decodeURIComponent(z.getAttribute("data:default-text")), Y = M(E, { seriesIndex: A ? X : a, dataPointIndex: s, w: S }); if (A) z.innerHTML = S.globals.collapsedSeriesIndices.indexOf(X) < 0 ? Y : E; else if (z.innerHTML = X === a ? Y : E, a === X) break } } var F = e(e({ ttItems: r, i: a, j: s }, void 0 !== (null === (o = S.globals.seriesRange) || void 0 === o || null === (n = o[a]) || void 0 === n || null === (l = n[s]) || void 0 === l || null === (h = l.y[0]) || void 0 === h ? void 0 : h.y1) && { y1: null === (c = S.globals.seriesRange) || void 0 === c || null === (d = c[a]) || void 0 === d || null === (g = d[s]) || void 0 === g || null === (u = g.y[0]) || void 0 === u ? void 0 : u.y1 }), void 0 !== (null === (p = S.globals.seriesRange) || void 0 === p || null === (f = p[a]) || void 0 === f || null === (x = f[s]) || void 0 === x || null === (b = x.y[0]) || void 0 === b ? void 0 : b.y2) && { y2: null === (v = S.globals.seriesRange) || void 0 === v || null === (y = v[a]) || void 0 === y || null === (w = y[s]) || void 0 === w || null === (k = w.y[0]) || void 0 === k ? void 0 : k.y2 }); if (A) { if (C.tooltipLabels.drawSeriesTexts(e(e({}, F), {}, { shared: !this.showOnIntersect && this.tConfig.shared })), L) S.globals.markers.largestSize > 0 ? C.marker.enlargePoints(s) : C.tooltipPosition.moveDynamicPointsOnHover(s); else if (this.tooltipUtil.hasBars() && (this.barSeriesHeight = this.tooltipUtil.getBarsHeight(P), this.barSeriesHeight > 0)) { var R = new m(this.ctx), H = S.globals.dom.Paper.select(".apexcharts-bar-area[j='".concat(s, "']")); this.deactivateHoverFilter(), this.tooltipPosition.moveStickyTooltipOverBars(s, a); for (var D = 0; D < H.length; D++)R.pathMouseEnter(H[D]) } } else C.tooltipLabels.drawSeriesTexts(e({ shared: !1 }, F)), this.tooltipUtil.hasBars() && C.tooltipPosition.moveStickyTooltipOverBars(s, a), L && C.tooltipPosition.moveMarkers(a, s) } }]), t }(), vt = function () { function t(e) { a(this, t), this.w = e.w, this.barCtx = e, this.totalFormatter = this.w.config.plotOptions.bar.dataLabels.total.formatter, this.totalFormatter || (this.totalFormatter = this.w.config.dataLabels.formatter) } return r(t, [{ key: "handleBarDataLabels", value: function (t) { var e, i, a = t.x, s = t.y, r = t.y1, o = t.y2, n = t.i, l = t.j, h = t.realIndex, c = t.columnGroupIndex, d = t.series, g = t.barHeight, u = t.barWidth, p = t.barXPosition, f = t.barYPosition, x = t.visibleSeries, b = t.renderedPath, v = this.w, y = new m(this.barCtx.ctx), w = Array.isArray(this.barCtx.strokeWidth) ? this.barCtx.strokeWidth[h] : this.barCtx.strokeWidth; v.globals.isXNumeric && !v.globals.isBarHorizontal ? (e = a + parseFloat(u * (x + 1)), i = s + parseFloat(g * (x + 1)) - w) : (e = a + parseFloat(u * x), i = s + parseFloat(g * x)); var k, A = null, S = a, C = s, L = {}, P = v.config.dataLabels, M = this.barCtx.barOptions.dataLabels, I = this.barCtx.barOptions.dataLabels.total; void 0 !== f && this.barCtx.isRangeBar && (i = f, C = f), void 0 !== p && this.barCtx.isVerticalGroupedRangeBar && (e = p, S = p); var T = P.offsetX, z = P.offsetY, X = { width: 0, height: 0 }; if (v.config.dataLabels.enabled) { var E = this.barCtx.series[n][l]; X = y.getTextRects(v.globals.yLabelFormatters[0](E), parseFloat(P.style.fontSize)) } var Y = { x: a, y: s, i: n, j: l, realIndex: h, columnGroupIndex: c, renderedPath: b, bcx: e, bcy: i, barHeight: g, barWidth: u, textRects: X, strokeWidth: w, dataLabelsX: S, dataLabelsY: C, dataLabelsConfig: P, barDataLabelsConfig: M, barTotalDataLabelsConfig: I, offX: T, offY: z }; return L = this.barCtx.isHorizontal ? this.calculateBarsDataLabelsPosition(Y) : this.calculateColumnsDataLabelsPosition(Y), b.attr({ cy: L.bcy, cx: L.bcx, j: l, val: d[n][l], barHeight: g, barWidth: u }), k = this.drawCalculatedDataLabels({ x: L.dataLabelsX, y: L.dataLabelsY, val: this.barCtx.isRangeBar ? [r, o] : d[n][l], i: h, j: l, barWidth: u, barHeight: g, textRects: X, dataLabelsConfig: P }), v.config.chart.stacked && I.enabled && (A = this.drawTotalDataLabels({ x: L.totalDataLabelsX, y: L.totalDataLabelsY, barWidth: u, barHeight: g, realIndex: h, textAnchor: L.totalDataLabelsAnchor, val: this.getStackedTotalDataLabel({ realIndex: h, j: l }), dataLabelsConfig: P, barTotalDataLabelsConfig: I })), { dataLabels: k, totalDataLabels: A } } }, { key: "getStackedTotalDataLabel", value: function (t) { var i = t.realIndex, a = t.j, s = this.w, r = this.barCtx.stackedSeriesTotals[a]; return this.totalFormatter && (r = this.totalFormatter(r, e(e({}, s), {}, { seriesIndex: i, dataPointIndex: a, w: s }))), r } }, { key: "calculateColumnsDataLabelsPosition", value: function (t) { var e, i, a = this.w, s = t.i, r = t.j, o = t.realIndex, n = t.columnGroupIndex, l = t.y, h = t.bcx, c = t.barWidth, d = t.barHeight, g = t.textRects, u = t.dataLabelsX, p = t.dataLabelsY, f = t.dataLabelsConfig, x = t.barDataLabelsConfig, b = t.barTotalDataLabelsConfig, v = t.strokeWidth, y = t.offX, w = t.offY, k = h; d = Math.abs(d); var A = "vertical" === a.config.plotOptions.bar.dataLabels.orientation, S = this.barCtx.barHelpers.getZeroValueEncounters({ i: s, j: r }).zeroEncounters; h = h - v / 2 + n * c; var C = a.globals.gridWidth / a.globals.dataPoints; if (this.barCtx.isVerticalGroupedRangeBar ? u += c / 2 : (u = a.globals.isXNumeric ? h - c / 2 + y : h - C + c / 2 + y, S > 0 && a.config.plotOptions.bar.hideZeroBarsWhenGrouped && (u -= c * S)), A) { u = u + g.height / 2 - v / 2 - 2 } var L = this.barCtx.series[s][r] < 0, P = l; switch (this.barCtx.isReversed && (P = l + (L ? d : -d), l -= d), x.position) { case "center": p = A ? L ? P - d / 2 + w : P + d / 2 - w : L ? P - d / 2 + g.height / 2 + w : P + d / 2 + g.height / 2 - w; break; case "bottom": p = A ? L ? P - d + w : P + d - w : L ? P - d + g.height + v + w : P + d - g.height / 2 + v - w; break; case "top": p = A ? L ? P + w : P - w : L ? P - g.height / 2 - w : P + g.height + w }if (this.barCtx.lastActiveBarSerieIndex === o && b.enabled) { var M = new m(this.barCtx.ctx).getTextRects(this.getStackedTotalDataLabel({ realIndex: o, j: r }), f.fontSize); e = L ? P - M.height / 2 - w - b.offsetY + 18 : P + M.height + w + b.offsetY - 18, i = k + (a.globals.isXNumeric ? c * (a.globals.barGroups.length - 1) - c / 2 : -(c * a.globals.barGroups.length - c / 2 - 2 * v)) + b.offsetX } return a.config.chart.stacked || (p < 0 ? p = 0 + v : p + g.height / 3 > a.globals.gridHeight && (p = a.globals.gridHeight - v)), { bcx: h, bcy: l, dataLabelsX: u, dataLabelsY: p, totalDataLabelsX: i, totalDataLabelsY: e, totalDataLabelsAnchor: "middle" } } }, { key: "calculateBarsDataLabelsPosition", value: function (t) { var e = this.w, i = t.x, a = t.i, s = t.j, r = t.realIndex, o = t.columnGroupIndex, n = t.bcy, l = t.barHeight, h = t.barWidth, c = t.textRects, d = t.dataLabelsX, g = t.strokeWidth, u = t.dataLabelsConfig, p = t.barDataLabelsConfig, f = t.barTotalDataLabelsConfig, x = t.offX, b = t.offY, v = e.globals.gridHeight / e.globals.dataPoints; h = Math.abs(h); var y, w, k = (n += o * l) - (this.barCtx.isRangeBar ? 0 : v) + l / 2 + c.height / 2 + b - 3, A = "start", S = this.barCtx.series[a][s] < 0, C = i; switch (this.barCtx.isReversed && (C = i + (S ? -h : h), i = e.globals.gridWidth - h, A = S ? "start" : "end"), p.position) { case "center": d = S ? C + h / 2 - x : Math.max(c.width / 2, C - h / 2) + x; break; case "bottom": d = S ? C + h - g - Math.round(c.width / 2) - x : C - h + g + Math.round(c.width / 2) + x; break; case "top": d = S ? C - g + Math.round(c.width / 2) - x : C - g - Math.round(c.width / 2) + x }if (this.barCtx.lastActiveBarSerieIndex === r && f.enabled) { var L = new m(this.barCtx.ctx).getTextRects(this.getStackedTotalDataLabel({ realIndex: r, j: s }), u.fontSize); S ? (y = C - g - x - f.offsetX, A = "end") : y = C + x + f.offsetX + (this.barCtx.isReversed ? -(h + g) : g), w = k - c.height / 2 + L.height / 2 + f.offsetY + g } return e.config.chart.stacked || (d < 0 ? d = d + c.width + g : d + c.width / 2 > e.globals.gridWidth && (d = e.globals.gridWidth - c.width - g)), { bcx: i, bcy: n, dataLabelsX: d, dataLabelsY: k, totalDataLabelsX: y, totalDataLabelsY: w, totalDataLabelsAnchor: A } } }, { key: "drawCalculatedDataLabels", value: function (t) { var i = t.x, a = t.y, s = t.val, r = t.i, o = t.j, n = t.textRects, l = t.barHeight, h = t.barWidth, c = t.dataLabelsConfig, d = this.w, g = "rotate(0)"; "vertical" === d.config.plotOptions.bar.dataLabels.orientation && (g = "rotate(-90, ".concat(i, ", ").concat(a, ")")); var u = new N(this.barCtx.ctx), p = new m(this.barCtx.ctx), f = c.formatter, x = null, b = d.globals.collapsedSeriesIndices.indexOf(r) > -1; if (c.enabled && !b) { x = p.group({ class: "apexcharts-data-labels", transform: g }); var v = ""; void 0 !== s && (v = f(s, e(e({}, d), {}, { seriesIndex: r, dataPointIndex: o, w: d }))), !s && d.config.plotOptions.bar.hideZeroBarsWhenGrouped && (v = ""); var y = d.globals.series[r][o] < 0, w = d.config.plotOptions.bar.dataLabels.position; if ("vertical" === d.config.plotOptions.bar.dataLabels.orientation && ("top" === w && (c.textAnchor = y ? "end" : "start"), "center" === w && (c.textAnchor = "middle"), "bottom" === w && (c.textAnchor = y ? "end" : "start")), this.barCtx.isRangeBar && this.barCtx.barOptions.dataLabels.hideOverflowingLabels) h < p.getTextRects(v, parseFloat(c.style.fontSize)).width && (v = ""); d.config.chart.stacked && this.barCtx.barOptions.dataLabels.hideOverflowingLabels && (this.barCtx.isHorizontal ? n.width / 1.6 > Math.abs(h) && (v = "") : n.height / 1.6 > Math.abs(l) && (v = "")); var k = e({}, c); this.barCtx.isHorizontal && s < 0 && ("start" === c.textAnchor ? k.textAnchor = "end" : "end" === c.textAnchor && (k.textAnchor = "start")), u.plotDataLabelsText({ x: i, y: a, text: v, i: r, j: o, parent: x, dataLabelsConfig: k, alwaysDrawDataLabel: !0, offsetCorrection: !0 }) } return x } }, { key: "drawTotalDataLabels", value: function (t) { var e, i = t.x, a = t.y, s = t.val, r = t.barWidth, o = t.barHeight, n = t.realIndex, l = t.textAnchor, h = t.barTotalDataLabelsConfig, c = this.w, d = new m(this.barCtx.ctx); return h.enabled && void 0 !== i && void 0 !== a && this.barCtx.lastActiveBarSerieIndex === n && (e = d.drawText({ x: i - (!c.globals.isBarHorizontal && c.globals.barGroups.length ? r * (c.globals.barGroups.length - 1) / 2 : 0), y: a - (c.globals.isBarHorizontal && c.globals.barGroups.length ? o * (c.globals.barGroups.length - 1) / 2 : 0), foreColor: h.style.color, text: s, textAnchor: l, fontFamily: h.style.fontFamily, fontSize: h.style.fontSize, fontWeight: h.style.fontWeight })), e } }]), t }(), mt = function () { function t(e) { a(this, t), this.w = e.w, this.barCtx = e } return r(t, [{ key: "initVariables", value: function (t) { var e = this.w; this.barCtx.series = t, this.barCtx.totalItems = 0, this.barCtx.seriesLen = 0, this.barCtx.visibleI = -1, this.barCtx.visibleItems = 1; for (var i = 0; i < t.length; i++)if (t[i].length > 0 && (this.barCtx.seriesLen = this.barCtx.seriesLen + 1, this.barCtx.totalItems += t[i].length), e.globals.isXNumeric) for (var a = 0; a < t[i].length; a++)e.globals.seriesX[i][a] > e.globals.minX && e.globals.seriesX[i][a] < e.globals.maxX && this.barCtx.visibleItems++; else this.barCtx.visibleItems = e.globals.dataPoints; 0 === this.barCtx.seriesLen && (this.barCtx.seriesLen = 1), this.barCtx.zeroSerieses = [], e.globals.comboCharts || this.checkZeroSeries({ series: t }) } }, { key: "initialPositions", value: function () { var t, e, i, a, s, r, o, n, l = this.w, h = l.globals.dataPoints; this.barCtx.isRangeBar && (h = l.globals.labels.length); var c = this.barCtx.seriesLen; if (l.config.plotOptions.bar.rangeBarGroupRows && (c = 1), this.barCtx.isHorizontal) s = (i = l.globals.gridHeight / h) / c, l.globals.isXNumeric && (s = (i = l.globals.gridHeight / this.barCtx.totalItems) / this.barCtx.seriesLen), s = s * parseInt(this.barCtx.barOptions.barHeight, 10) / 100, -1 === String(this.barCtx.barOptions.barHeight).indexOf("%") && (s = parseInt(this.barCtx.barOptions.barHeight, 10)), n = this.barCtx.baseLineInvertedY + l.globals.padHorizontal + (this.barCtx.isReversed ? l.globals.gridWidth : 0) - (this.barCtx.isReversed ? 2 * this.barCtx.baseLineInvertedY : 0), this.barCtx.isFunnel && (n = l.globals.gridWidth / 2), e = (i - s * this.barCtx.seriesLen) / 2; else { if (a = l.globals.gridWidth / this.barCtx.visibleItems, l.config.xaxis.convertedCatToNumeric && (a = l.globals.gridWidth / l.globals.dataPoints), r = a / c * parseInt(this.barCtx.barOptions.columnWidth, 10) / 100, l.globals.isXNumeric) { var d = this.barCtx.xRatio; l.globals.minXDiff && .5 !== l.globals.minXDiff && l.globals.minXDiff / d > 0 && (a = l.globals.minXDiff / d), (r = a / c * parseInt(this.barCtx.barOptions.columnWidth, 10) / 100) < 1 && (r = 1) } -1 === String(this.barCtx.barOptions.columnWidth).indexOf("%") && (r = parseInt(this.barCtx.barOptions.columnWidth, 10)), o = l.globals.gridHeight - this.barCtx.baseLineY[this.barCtx.translationsIndex] - (this.barCtx.isReversed ? l.globals.gridHeight : 0) + (this.barCtx.isReversed ? 2 * this.barCtx.baseLineY[this.barCtx.translationsIndex] : 0), t = l.globals.padHorizontal + (a - r * this.barCtx.seriesLen) / 2 } return l.globals.barHeight = s, l.globals.barWidth = r, { x: t, y: e, yDivision: i, xDivision: a, barHeight: s, barWidth: r, zeroH: o, zeroW: n } } }, { key: "initializeStackedPrevVars", value: function (t) { t.w.globals.seriesGroups.forEach((function (e) { t[e] || (t[e] = {}), t[e].prevY = [], t[e].prevX = [], t[e].prevYF = [], t[e].prevXF = [], t[e].prevYVal = [], t[e].prevXVal = [] })) } }, { key: "initializeStackedXYVars", value: function (t) { t.w.globals.seriesGroups.forEach((function (e) { t[e] || (t[e] = {}), t[e].xArrj = [], t[e].xArrjF = [], t[e].xArrjVal = [], t[e].yArrj = [], t[e].yArrjF = [], t[e].yArrjVal = [] })) } }, { key: "getPathFillColor", value: function (t, e, i, a) { var s, r, o, n, l = this.w, h = new H(this.barCtx.ctx), c = null, d = this.barCtx.barOptions.distributed ? i : e; this.barCtx.barOptions.colors.ranges.length > 0 && this.barCtx.barOptions.colors.ranges.map((function (a) { t[e][i] >= a.from && t[e][i] <= a.to && (c = a.color) })); return l.config.series[e].data[i] && l.config.series[e].data[i].fillColor && (c = l.config.series[e].data[i].fillColor), h.fillPath({ seriesNumber: this.barCtx.barOptions.distributed ? d : a, dataPointIndex: i, color: c, value: t[e][i], fillConfig: null === (s = l.config.series[e].data[i]) || void 0 === s ? void 0 : s.fill, fillType: null !== (r = l.config.series[e].data[i]) && void 0 !== r && null !== (o = r.fill) && void 0 !== o && o.type ? null === (n = l.config.series[e].data[i]) || void 0 === n ? void 0 : n.fill.type : Array.isArray(l.config.fill.type) ? l.config.fill.type[e] : l.config.fill.type }) } }, { key: "getStrokeWidth", value: function (t, e, i) { var a = 0, s = this.w; return void 0 === this.barCtx.series[t][e] || null === this.barCtx.series[t][e] ? this.barCtx.isNullValue = !0 : this.barCtx.isNullValue = !1, s.config.stroke.show && (this.barCtx.isNullValue || (a = Array.isArray(this.barCtx.strokeWidth) ? this.barCtx.strokeWidth[i] : this.barCtx.strokeWidth)), a } }, { key: "shouldApplyRadius", value: function (t) { var e = this.w, i = !1; return e.config.plotOptions.bar.borderRadius > 0 && (e.config.chart.stacked && "last" === e.config.plotOptions.bar.borderRadiusWhenStacked ? this.barCtx.lastActiveBarSerieIndex === t && (i = !0) : i = !0), i } }, { key: "barBackground", value: function (t) { var e = t.j, i = t.i, a = t.x1, s = t.x2, r = t.y1, o = t.y2, n = t.elSeries, l = this.w, h = new m(this.barCtx.ctx), c = new W(this.barCtx.ctx).getActiveConfigSeriesIndex(); if (this.barCtx.barOptions.colors.backgroundBarColors.length > 0 && c === i) { e >= this.barCtx.barOptions.colors.backgroundBarColors.length && (e %= this.barCtx.barOptions.colors.backgroundBarColors.length); var d = this.barCtx.barOptions.colors.backgroundBarColors[e], g = h.drawRect(void 0 !== a ? a : 0, void 0 !== r ? r : 0, void 0 !== s ? s : l.globals.gridWidth, void 0 !== o ? o : l.globals.gridHeight, this.barCtx.barOptions.colors.backgroundBarRadius, d, this.barCtx.barOptions.colors.backgroundBarOpacity); n.add(g), g.node.classList.add("apexcharts-backgroundBar") } } }, { key: "getColumnPaths", value: function (t) { var e, i = t.barWidth, a = t.barXPosition, s = t.y1, r = t.y2, o = t.strokeWidth, n = t.seriesGroup, l = t.realIndex, h = t.i, c = t.j, d = t.w, g = new m(this.barCtx.ctx); (o = Array.isArray(o) ? o[l] : o) || (o = 0); var u = i, p = a; null !== (e = d.config.series[l].data[c]) && void 0 !== e && e.columnWidthOffset && (p = a - d.config.series[l].data[c].columnWidthOffset / 2, u = i + d.config.series[l].data[c].columnWidthOffset); var f = o / 2, x = p + f, b = p + u - f; s += .001 - f, r += .001 + f; var v = g.move(x, s), y = g.move(x, s), w = g.line(b, s); if (d.globals.previousPaths.length > 0 && (y = this.barCtx.getPreviousPath(l, c, !1)), v = v + g.line(x, r) + g.line(b, r) + g.line(b, s) + ("around" === d.config.plotOptions.bar.borderRadiusApplication ? " Z" : " z"), y = y + g.line(x, s) + w + w + w + w + w + g.line(x, s) + ("around" === d.config.plotOptions.bar.borderRadiusApplication ? " Z" : " z"), this.shouldApplyRadius(l) && (v = g.roundPathCorners(v, d.config.plotOptions.bar.borderRadius)), d.config.chart.stacked) { var k = this.barCtx; (k = this.barCtx[n]).yArrj.push(r - f), k.yArrjF.push(Math.abs(s - r + o)), k.yArrjVal.push(this.barCtx.series[h][c]) } return { pathTo: v, pathFrom: y } } }, { key: "getBarpaths", value: function (t) { var e, i = t.barYPosition, a = t.barHeight, s = t.x1, r = t.x2, o = t.strokeWidth, n = t.seriesGroup, l = t.realIndex, h = t.i, c = t.j, d = t.w, g = new m(this.barCtx.ctx); (o = Array.isArray(o) ? o[l] : o) || (o = 0); var u = i, p = a; null !== (e = d.config.series[l].data[c]) && void 0 !== e && e.barHeightOffset && (u = i - d.config.series[l].data[c].barHeightOffset / 2, p = a + d.config.series[l].data[c].barHeightOffset); var f = o / 2, x = u + f, b = u + p - f; s += .001 - f, r += .001 + f; var v = g.move(s, x), y = g.move(s, x); d.globals.previousPaths.length > 0 && (y = this.barCtx.getPreviousPath(l, c, !1)); var w = g.line(s, b); if (v = v + g.line(r, x) + g.line(r, b) + w + ("around" === d.config.plotOptions.bar.borderRadiusApplication ? " Z" : " z"), y = y + g.line(s, x) + w + w + w + w + w + g.line(s, x) + ("around" === d.config.plotOptions.bar.borderRadiusApplication ? " Z" : " z"), this.shouldApplyRadius(l) && (v = g.roundPathCorners(v, d.config.plotOptions.bar.borderRadius)), d.config.chart.stacked) { var k = this.barCtx; (k = this.barCtx[n]).xArrj.push(r + f), k.xArrjF.push(Math.abs(s - r)), k.xArrjVal.push(this.barCtx.series[h][c]) } return { pathTo: v, pathFrom: y } } }, { key: "checkZeroSeries", value: function (t) { for (var e = t.series, i = this.w, a = 0; a < e.length; a++) { for (var s = 0, r = 0; r < e[i.globals.maxValsInArrayIndex].length; r++)s += e[a][r]; 0 === s && this.barCtx.zeroSerieses.push(a) } } }, { key: "getXForValue", value: function (t, e) { var i = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2] ? e : null; return null != t && (i = e + t / this.barCtx.invertedYRatio - 2 * (this.barCtx.isReversed ? t / this.barCtx.invertedYRatio : 0)), i } }, { key: "getYForValue", value: function (t, e, i) { var a = !(arguments.length > 3 && void 0 !== arguments[3]) || arguments[3] ? e : null; return null != t && (a = e - t / this.barCtx.yRatio[i] + 2 * (this.barCtx.isReversed ? t / this.barCtx.yRatio[i] : 0)), a } }, { key: "getGoalValues", value: function (t, i, a, s, r, n) { var l = this, h = this.w, c = [], d = function (e, s) { var r; c.push((o(r = {}, t, "x" === t ? l.getXForValue(e, i, !1) : l.getYForValue(e, a, n, !1)), o(r, "attrs", s), r)) }; if (h.globals.seriesGoals[s] && h.globals.seriesGoals[s][r] && Array.isArray(h.globals.seriesGoals[s][r]) && h.globals.seriesGoals[s][r].forEach((function (t) { d(t.value, t) })), this.barCtx.barOptions.isDumbbell && h.globals.seriesRange.length) { var g = this.barCtx.barOptions.dumbbellColors ? this.barCtx.barOptions.dumbbellColors : h.globals.colors, u = { strokeHeight: "x" === t ? 0 : h.globals.markers.size[s], strokeWidth: "x" === t ? h.globals.markers.size[s] : 0, strokeDashArray: 0, strokeLineCap: "round", strokeColor: Array.isArray(g[s]) ? g[s][0] : g[s] }; d(h.globals.seriesRangeStart[s][r], u), d(h.globals.seriesRangeEnd[s][r], e(e({}, u), {}, { strokeColor: Array.isArray(g[s]) ? g[s][1] : g[s] })) } return c } }, { key: "drawGoalLine", value: function (t) { var e = t.barXPosition, i = t.barYPosition, a = t.goalX, s = t.goalY, r = t.barWidth, o = t.barHeight, n = new m(this.barCtx.ctx), l = n.group({ className: "apexcharts-bar-goals-groups" }); l.node.classList.add("apexcharts-element-hidden"), this.barCtx.w.globals.delayedElements.push({ el: l.node }), l.attr("clip-path", "url(#gridRectMarkerMask".concat(this.barCtx.w.globals.cuid, ")")); var h = null; return this.barCtx.isHorizontal ? Array.isArray(a) && a.forEach((function (t) { if (t.x >= -1 && t.x <= n.w.globals.gridWidth + 1) { var e = void 0 !== t.attrs.strokeHeight ? t.attrs.strokeHeight : o / 2, a = i + e + o / 2; h = n.drawLine(t.x, a - 2 * e, t.x, a, t.attrs.strokeColor ? t.attrs.strokeColor : void 0, t.attrs.strokeDashArray, t.attrs.strokeWidth ? t.attrs.strokeWidth : 2, t.attrs.strokeLineCap), l.add(h) } })) : Array.isArray(s) && s.forEach((function (t) { if (t.y >= -1 && t.y <= n.w.globals.gridHeight + 1) { var i = void 0 !== t.attrs.strokeWidth ? t.attrs.strokeWidth : r / 2, a = e + i + r / 2; h = n.drawLine(a - 2 * i, t.y, a, t.y, t.attrs.strokeColor ? t.attrs.strokeColor : void 0, t.attrs.strokeDashArray, t.attrs.strokeHeight ? t.attrs.strokeHeight : 2, t.attrs.strokeLineCap), l.add(h) } })), l } }, { key: "drawBarShadow", value: function (t) { var e = t.prevPaths, i = t.currPaths, a = t.color, s = this.w, r = e.x, o = e.x1, n = e.barYPosition, l = i.x, h = i.x1, c = i.barYPosition, d = n + i.barHeight, g = new m(this.barCtx.ctx), u = new x, p = g.move(o, d) + g.line(r, d) + g.line(l, c) + g.line(h, c) + g.line(o, d) + ("around" === s.config.plotOptions.bar.borderRadiusApplication ? " Z" : " z"); return g.drawPath({ d: p, fill: u.shadeColor(.5, x.rgb2hex(a)), stroke: "none", strokeWidth: 0, fillOpacity: 1, classes: "apexcharts-bar-shadows" }) } }, { key: "getZeroValueEncounters", value: function (t) { var e, i = t.i, a = t.j, s = this.w, r = 0, o = 0; return (s.config.plotOptions.bar.horizontal ? s.globals.series.map((function (t, e) { return e })) : (null === (e = s.globals.columnSeries) || void 0 === e ? void 0 : e.i.map((function (t) { return t }))) || []).forEach((function (t) { var e = s.globals.seriesPercent[t][a]; e && r++, t < i && 0 === e && o++ })), { nonZeroColumns: r, zeroEncounters: o } } }, { key: "getGroupIndex", value: function (t) { var e = this.w, i = e.globals.seriesGroups.findIndex((function (i) { return i.indexOf(e.globals.seriesNames[t]) > -1 })), a = this.barCtx.columnGroupIndices, s = a.indexOf(i); return s < 0 && (a.push(i), s = a.length - 1), { groupIndex: i, columnGroupIndex: s } } }]), t }(), yt = function () { function t(e, i) { a(this, t), this.ctx = e, this.w = e.w; var s = this.w; this.barOptions = s.config.plotOptions.bar, this.isHorizontal = this.barOptions.horizontal, this.strokeWidth = s.config.stroke.width, this.isNullValue = !1, this.isRangeBar = s.globals.seriesRange.length && this.isHorizontal, this.isVerticalGroupedRangeBar = !s.globals.isBarHorizontal && s.globals.seriesRange.length && s.config.plotOptions.bar.rangeBarGroupRows, this.isFunnel = this.barOptions.isFunnel, this.xyRatios = i, null !== this.xyRatios && (this.xRatio = i.xRatio, this.yRatio = i.yRatio, this.invertedXRatio = i.invertedXRatio, this.invertedYRatio = i.invertedYRatio, this.baseLineY = i.baseLineY, this.baseLineInvertedY = i.baseLineInvertedY), this.yaxisIndex = 0, this.translationsIndex = 0, this.seriesLen = 0, this.pathArr = []; var r = new W(this.ctx); this.lastActiveBarSerieIndex = r.getActiveConfigSeriesIndex("desc", ["bar", "column"]), this.columnGroupIndices = []; var o = r.getBarSeriesIndices(), n = new y(this.ctx); this.stackedSeriesTotals = n.getStackedSeriesTotals(this.w.config.series.map((function (t, e) { return -1 === o.indexOf(e) ? e : -1 })).filter((function (t) { return -1 !== t }))), this.barHelpers = new mt(this) } return r(t, [{ key: "draw", value: function (t, i) { var a = this.w, s = new m(this.ctx), r = new y(this.ctx, a); t = r.getLogSeries(t), this.series = t, this.yRatio = r.getLogYRatios(this.yRatio), this.barHelpers.initVariables(t); var o = s.group({ class: "apexcharts-bar-series apexcharts-plot-series" }); a.config.dataLabels.enabled && this.totalItems > this.barOptions.dataLabels.maxItems && console.warn("WARNING: DataLabels are enabled but there are too many to display. This may cause performance issue when rendering - ApexCharts"); for (var n = 0, l = 0; n < t.length; n++, l++) { var h, c, d, g, u = void 0, p = void 0, f = [], b = [], v = a.globals.comboCharts ? i[n] : n, w = this.barHelpers.getGroupIndex(v).columnGroupIndex, k = s.group({ class: "apexcharts-series", rel: n + 1, seriesName: x.escapeString(a.globals.seriesNames[v]), "data:realIndex": v }); this.ctx.series.addCollapsedClassToSeries(k, v), t[n].length > 0 && (this.visibleI = this.visibleI + 1); var A = 0, S = 0; this.yRatio.length > 1 && (this.yaxisIndex = a.globals.seriesYAxisReverseMap[v], this.translationsIndex = v); var C = this.translationsIndex; this.isReversed = a.config.yaxis[this.yaxisIndex] && a.config.yaxis[this.yaxisIndex].reversed; var L = this.barHelpers.initialPositions(); p = L.y, A = L.barHeight, c = L.yDivision, g = L.zeroW, u = L.x, S = L.barWidth, h = L.xDivision, d = L.zeroH, this.horizontal || b.push(u + S / 2); var P = s.group({ class: "apexcharts-datalabels", "data:realIndex": v }); a.globals.delayedElements.push({ el: P.node }), P.node.classList.add("apexcharts-element-hidden"); var M = s.group({ class: "apexcharts-bar-goals-markers" }), I = s.group({ class: "apexcharts-bar-shadows" }); a.globals.delayedElements.push({ el: I.node }), I.node.classList.add("apexcharts-element-hidden"); for (var T = 0; T < t[n].length; T++) { var z = this.barHelpers.getStrokeWidth(n, T, v), X = null, E = { indexes: { i: n, j: T, realIndex: v, translationsIndex: C, bc: l }, x: u, y: p, strokeWidth: z, elSeries: k }; this.isHorizontal ? (X = this.drawBarPaths(e(e({}, E), {}, { barHeight: A, zeroW: g, yDivision: c })), S = this.series[n][T] / this.invertedYRatio) : (X = this.drawColumnPaths(e(e({}, E), {}, { xDivision: h, barWidth: S, zeroH: d })), A = this.series[n][T] / this.yRatio[C]); var Y = this.barHelpers.getPathFillColor(t, n, T, v); if (this.isFunnel && this.barOptions.isFunnel3d && this.pathArr.length && T > 0) { var F = this.barHelpers.drawBarShadow({ color: "string" == typeof Y && -1 === (null == Y ? void 0 : Y.indexOf("url")) ? Y : x.hexToRgba(a.globals.colors[n]), prevPaths: this.pathArr[this.pathArr.length - 1], currPaths: X }); F && I.add(F) } this.pathArr.push(X); var R = this.barHelpers.drawGoalLine({ barXPosition: X.barXPosition, barYPosition: X.barYPosition, goalX: X.goalX, goalY: X.goalY, barHeight: A, barWidth: S }); R && M.add(R), p = X.y, u = X.x, T > 0 && b.push(u + S / 2), f.push(p), this.renderSeries({ realIndex: v, pathFill: Y, j: T, i: n, columnGroupIndex: w, pathFrom: X.pathFrom, pathTo: X.pathTo, strokeWidth: z, elSeries: k, x: u, y: p, series: t, barHeight: X.barHeight ? X.barHeight : A, barWidth: X.barWidth ? X.barWidth : S, elDataLabelsWrap: P, elGoalsMarkers: M, elBarShadows: I, visibleSeries: this.visibleI, type: "bar" }) } a.globals.seriesXvalues[v] = b, a.globals.seriesYvalues[v] = f, o.add(k) } return o } }, { key: "renderSeries", value: function (t) { var e = t.realIndex, i = t.pathFill, a = t.lineFill, s = t.j, r = t.i, o = t.columnGroupIndex, n = t.pathFrom, l = t.pathTo, h = t.strokeWidth, c = t.elSeries, d = t.x, g = t.y, u = t.y1, p = t.y2, f = t.series, x = t.barHeight, b = t.barWidth, y = t.barXPosition, w = t.barYPosition, k = t.elDataLabelsWrap, A = t.elGoalsMarkers, S = t.elBarShadows, C = t.visibleSeries, L = t.type, P = this.w, M = new m(this.ctx); if (!a) { var I = "function" == typeof P.globals.stroke.colors[e] ? function (t) { var e, i = P.config.stroke.colors; return Array.isArray(i) && i.length > 0 && ((e = i[t]) || (e = ""), "function" == typeof e) ? e({ value: P.globals.series[t][s], dataPointIndex: s, w: P }) : e }(e) : P.globals.stroke.colors[e]; a = this.barOptions.distributed ? P.globals.stroke.colors[s] : I } P.config.series[r].data[s] && P.config.series[r].data[s].strokeColor && (a = P.config.series[r].data[s].strokeColor), this.isNullValue && (i = "none"); var T = s / P.config.chart.animations.animateGradually.delay * (P.config.chart.animations.speed / P.globals.dataPoints) / 2.4, z = M.renderPaths({ i: r, j: s, realIndex: e, pathFrom: n, pathTo: l, stroke: a, strokeWidth: h, strokeLineCap: P.config.stroke.lineCap, fill: i, animationDelay: T, initialSpeed: P.config.chart.animations.speed, dataChangeSpeed: P.config.chart.animations.dynamicAnimation.speed, className: "apexcharts-".concat(L, "-area") }); z.attr("clip-path", "url(#gridRectMask".concat(P.globals.cuid, ")")); var X = P.config.forecastDataPoints; X.count > 0 && s >= P.globals.dataPoints - X.count && (z.node.setAttribute("stroke-dasharray", X.dashArray), z.node.setAttribute("stroke-width", X.strokeWidth), z.node.setAttribute("fill-opacity", X.fillOpacity)), void 0 !== u && void 0 !== p && (z.attr("data-range-y1", u), z.attr("data-range-y2", p)), new v(this.ctx).setSelectionFilter(z, e, s), c.add(z); var E = new vt(this).handleBarDataLabels({ x: d, y: g, y1: u, y2: p, i: r, j: s, series: f, realIndex: e, columnGroupIndex: o, barHeight: x, barWidth: b, barXPosition: y, barYPosition: w, renderedPath: z, visibleSeries: C }); return null !== E.dataLabels && k.add(E.dataLabels), E.totalDataLabels && k.add(E.totalDataLabels), c.add(k), A && c.add(A), S && c.add(S), c } }, { key: "drawBarPaths", value: function (t) { var e, i = t.indexes, a = t.barHeight, s = t.strokeWidth, r = t.zeroW, o = t.x, n = t.y, l = t.yDivision, h = t.elSeries, c = this.w, d = i.i, g = i.j; if (c.globals.isXNumeric) e = (n = (c.globals.seriesX[d][g] - c.globals.minX) / this.invertedXRatio - a) + a * this.visibleI; else if (c.config.plotOptions.bar.hideZeroBarsWhenGrouped) { var u = 0, p = 0; c.globals.seriesPercent.forEach((function (t, e) { t[g] && u++, e < d && 0 === t[g] && p++ })), u > 0 && (a = this.seriesLen * a / u), e = n + a * this.visibleI, e -= a * p } else e = n + a * this.visibleI; this.isFunnel && (r -= (this.barHelpers.getXForValue(this.series[d][g], r) - r) / 2), o = this.barHelpers.getXForValue(this.series[d][g], r); var f = this.barHelpers.getBarpaths({ barYPosition: e, barHeight: a, x1: r, x2: o, strokeWidth: s, series: this.series, realIndex: i.realIndex, i: d, j: g, w: c }); return c.globals.isXNumeric || (n += l), this.barHelpers.barBackground({ j: g, i: d, y1: e - a * this.visibleI, y2: a * this.seriesLen, elSeries: h }), { pathTo: f.pathTo, pathFrom: f.pathFrom, x1: r, x: o, y: n, goalX: this.barHelpers.getGoalValues("x", r, null, d, g), barYPosition: e, barHeight: a } } }, { key: "drawColumnPaths", value: function (t) { var e, i = t.indexes, a = t.x, s = t.y, r = t.xDivision, o = t.barWidth, n = t.zeroH, l = t.strokeWidth, h = t.elSeries, c = this.w, d = i.realIndex, g = i.translationsIndex, u = i.i, p = i.j, f = i.bc; if (c.globals.isXNumeric) { var x = this.getBarXForNumericXAxis({ x: a, j: p, realIndex: d, barWidth: o }); a = x.x, e = x.barXPosition } else if (c.config.plotOptions.bar.hideZeroBarsWhenGrouped) { var b = this.barHelpers.getZeroValueEncounters({ i: u, j: p }), v = b.nonZeroColumns, m = b.zeroEncounters; v > 0 && (o = this.seriesLen * o / v), e = a + o * this.visibleI, e -= o * m } else e = a + o * this.visibleI; s = this.barHelpers.getYForValue(this.series[u][p], n, g); var y = this.barHelpers.getColumnPaths({ barXPosition: e, barWidth: o, y1: n, y2: s, strokeWidth: l, series: this.series, realIndex: d, i: u, j: p, w: c }); return c.globals.isXNumeric || (a += r), this.barHelpers.barBackground({ bc: f, j: p, i: u, x1: e - l / 2 - o * this.visibleI, x2: o * this.seriesLen + l / 2, elSeries: h }), { pathTo: y.pathTo, pathFrom: y.pathFrom, x: a, y: s, goalY: this.barHelpers.getGoalValues("y", null, n, u, p, g), barXPosition: e, barWidth: o } } }, { key: "getBarXForNumericXAxis", value: function (t) { var e = t.x, i = t.barWidth, a = t.realIndex, s = t.j, r = this.w, o = a; return r.globals.seriesX[a].length || (o = r.globals.maxValsInArrayIndex), r.globals.seriesX[o][s] && (e = (r.globals.seriesX[o][s] - r.globals.minX) / this.xRatio - i * this.seriesLen / 2), { barXPosition: e + i * this.visibleI, x: e } } }, { key: "getPreviousPath", value: function (t, e) { for (var i, a = this.w, s = 0; s < a.globals.previousPaths.length; s++) { var r = a.globals.previousPaths[s]; r.paths && r.paths.length > 0 && parseInt(r.realIndex, 10) === parseInt(t, 10) && void 0 !== a.globals.previousPaths[s].paths[e] && (i = a.globals.previousPaths[s].paths[e].d) } return i } }]), t }(), wt = function (t) { n(s, t); var i = d(s); function s() { return a(this, s), i.apply(this, arguments) } return r(s, [{ key: "draw", value: function (t, i) { var a = this, s = this.w; this.graphics = new m(this.ctx), this.bar = new yt(this.ctx, this.xyRatios); var r = new y(this.ctx, s); t = r.getLogSeries(t), this.yRatio = r.getLogYRatios(this.yRatio), this.barHelpers.initVariables(t), "100%" === s.config.chart.stackType && (t = s.globals.comboCharts ? i.map((function (t) { return s.globals.seriesPercent[t] })) : s.globals.seriesPercent.slice()), this.series = t, this.barHelpers.initializeStackedPrevVars(this); for (var o = this.graphics.group({ class: "apexcharts-bar-series apexcharts-plot-series" }), n = 0, l = 0, h = function (r, h) { var c = void 0, d = void 0, g = void 0, u = void 0, p = s.globals.comboCharts ? i[r] : r, f = a.barHelpers.getGroupIndex(p), b = f.groupIndex, v = f.columnGroupIndex; a.groupCtx = a[s.globals.seriesGroups[b]]; var m = [], y = [], w = 0; a.yRatio.length > 1 && (a.yaxisIndex = s.globals.seriesYAxisReverseMap[p][0], w = p), a.isReversed = s.config.yaxis[a.yaxisIndex] && s.config.yaxis[a.yaxisIndex].reversed; var k = a.graphics.group({ class: "apexcharts-series", seriesName: x.escapeString(s.globals.seriesNames[p]), rel: r + 1, "data:realIndex": p }); a.ctx.series.addCollapsedClassToSeries(k, p); var A = a.graphics.group({ class: "apexcharts-datalabels", "data:realIndex": p }), S = a.graphics.group({ class: "apexcharts-bar-goals-markers" }), C = 0, L = 0, P = a.initialPositions(n, l, c, d, g, u, w); l = P.y, C = P.barHeight, d = P.yDivision, u = P.zeroW, n = P.x, L = P.barWidth, c = P.xDivision, g = P.zeroH, s.globals.barHeight = C, s.globals.barWidth = L, a.barHelpers.initializeStackedXYVars(a), 1 === a.groupCtx.prevY.length && a.groupCtx.prevY[0].every((function (t) { return isNaN(t) })) && (a.groupCtx.prevY[0] = a.groupCtx.prevY[0].map((function () { return g })), a.groupCtx.prevYF[0] = a.groupCtx.prevYF[0].map((function () { return 0 }))); for (var M = 0; M < s.globals.dataPoints; M++) { var I = a.barHelpers.getStrokeWidth(r, M, p), T = { indexes: { i: r, j: M, realIndex: p, translationsIndex: w, bc: h }, strokeWidth: I, x: n, y: l, elSeries: k, columnGroupIndex: v, seriesGroup: s.globals.seriesGroups[b] }, z = null; a.isHorizontal ? (z = a.drawStackedBarPaths(e(e({}, T), {}, { zeroW: u, barHeight: C, yDivision: d })), L = a.series[r][M] / a.invertedYRatio) : (z = a.drawStackedColumnPaths(e(e({}, T), {}, { xDivision: c, barWidth: L, zeroH: g })), C = a.series[r][M] / a.yRatio[w]); var X = a.barHelpers.drawGoalLine({ barXPosition: z.barXPosition, barYPosition: z.barYPosition, goalX: z.goalX, goalY: z.goalY, barHeight: C, barWidth: L }); X && S.add(X), l = z.y, n = z.x, m.push(n), y.push(l); var E = a.barHelpers.getPathFillColor(t, r, M, p); k = a.renderSeries({ realIndex: p, pathFill: E, j: M, i: r, columnGroupIndex: v, pathFrom: z.pathFrom, pathTo: z.pathTo, strokeWidth: I, elSeries: k, x: n, y: l, series: t, barHeight: C, barWidth: L, elDataLabelsWrap: A, elGoalsMarkers: S, type: "bar", visibleSeries: 0 }) } s.globals.seriesXvalues[p] = m, s.globals.seriesYvalues[p] = y, a.groupCtx.prevY.push(a.groupCtx.yArrj), a.groupCtx.prevYF.push(a.groupCtx.yArrjF), a.groupCtx.prevYVal.push(a.groupCtx.yArrjVal), a.groupCtx.prevX.push(a.groupCtx.xArrj), a.groupCtx.prevXF.push(a.groupCtx.xArrjF), a.groupCtx.prevXVal.push(a.groupCtx.xArrjVal), o.add(k) }, c = 0, d = 0; c < t.length; c++, d++)h(c, d); return o } }, { key: "initialPositions", value: function (t, e, i, a, s, r, o) { var n, l, h = this.w; if (this.isHorizontal) { a = h.globals.gridHeight / h.globals.dataPoints; var c = h.config.plotOptions.bar.barHeight; n = -1 === String(c).indexOf("%") ? parseInt(c, 10) : a * parseInt(c, 10) / 100, r = h.globals.padHorizontal + (this.isReversed ? h.globals.gridWidth - this.baseLineInvertedY : this.baseLineInvertedY), e = (a - n) / 2 } else { l = i = h.globals.gridWidth / h.globals.dataPoints; var d = h.config.plotOptions.bar.columnWidth; h.globals.isXNumeric && h.globals.dataPoints > 1 ? l = (i = h.globals.minXDiff / this.xRatio) * parseInt(this.barOptions.columnWidth, 10) / 100 : -1 === String(d).indexOf("%") ? l = parseInt(d, 10) : l *= parseInt(d, 10) / 100, s = h.globals.gridHeight - this.baseLineY[o] - (this.isReversed ? h.globals.gridHeight : 0), t = h.globals.padHorizontal + (i - l) / 2 } var g = h.globals.barGroups.length || 1; return { x: t, y: e, yDivision: a, xDivision: i, barHeight: n / g, barWidth: l / g, zeroH: s, zeroW: r } } }, { key: "drawStackedBarPaths", value: function (t) { for (var e, i = t.indexes, a = t.barHeight, s = t.strokeWidth, r = t.zeroW, o = t.x, n = t.y, l = t.columnGroupIndex, h = t.seriesGroup, c = t.yDivision, d = t.elSeries, g = this.w, u = n + l * a, p = i.i, f = i.j, x = i.realIndex, b = i.translationsIndex, v = 0, m = 0; m < this.groupCtx.prevXF.length; m++)v += this.groupCtx.prevXF[m][f]; var y; if ((y = h.indexOf(g.config.series[x].name)) > 0) { var w = r; this.groupCtx.prevXVal[y - 1][f] < 0 ? w = this.series[p][f] >= 0 ? this.groupCtx.prevX[y - 1][f] + v - 2 * (this.isReversed ? v : 0) : this.groupCtx.prevX[y - 1][f] : this.groupCtx.prevXVal[y - 1][f] >= 0 && (w = this.series[p][f] >= 0 ? this.groupCtx.prevX[y - 1][f] : this.groupCtx.prevX[y - 1][f] - v + 2 * (this.isReversed ? v : 0)), e = w } else e = r; o = null === this.series[p][f] ? e : e + this.series[p][f] / this.invertedYRatio - 2 * (this.isReversed ? this.series[p][f] / this.invertedYRatio : 0); var k = this.barHelpers.getBarpaths({ barYPosition: u, barHeight: a, x1: e, x2: o, strokeWidth: s, series: this.series, realIndex: i.realIndex, seriesGroup: h, i: p, j: f, w: g }); return this.barHelpers.barBackground({ j: f, i: p, y1: u, y2: a, elSeries: d }), n += c, { pathTo: k.pathTo, pathFrom: k.pathFrom, goalX: this.barHelpers.getGoalValues("x", r, null, p, f, b), barXPosition: e, barYPosition: u, x: o, y: n } } }, { key: "drawStackedColumnPaths", value: function (t) { var e = t.indexes, i = t.x, a = t.y, s = t.xDivision, r = t.barWidth, o = t.zeroH, n = t.columnGroupIndex, l = t.seriesGroup, h = t.elSeries, c = this.w, d = e.i, g = e.j, u = e.bc, p = e.realIndex, f = e.translationsIndex; if (c.globals.isXNumeric) { var x = c.globals.seriesX[p][g]; x || (x = 0), i = (x - c.globals.minX) / this.xRatio - r / 2 * c.globals.barGroups.length } for (var b, v = i + n * r, m = 0, y = 0; y < this.groupCtx.prevYF.length; y++)m += isNaN(this.groupCtx.prevYF[y][g]) ? 0 : this.groupCtx.prevYF[y][g]; var w = d; if (l && (w = l.indexOf(c.globals.seriesNames[p])), w > 0 && !c.globals.isXNumeric || w > 0 && c.globals.isXNumeric && c.globals.seriesX[p - 1][g] === c.globals.seriesX[p][g]) { var k, A, S, C = Math.min(this.yRatio.length + 1, p + 1); if (void 0 !== this.groupCtx.prevY[w - 1] && this.groupCtx.prevY[w - 1].length) for (var L = 1; L < C; L++) { var P; if (!isNaN(null === (P = this.groupCtx.prevY[w - L]) || void 0 === P ? void 0 : P[g])) { S = this.groupCtx.prevY[w - L][g]; break } } for (var M = 1; M < C; M++) { var I, T; if ((null === (I = this.groupCtx.prevYVal[w - M]) || void 0 === I ? void 0 : I[g]) < 0) { A = this.series[d][g] >= 0 ? S - m + 2 * (this.isReversed ? m : 0) : S; break } if ((null === (T = this.groupCtx.prevYVal[w - M]) || void 0 === T ? void 0 : T[g]) >= 0) { A = this.series[d][g] >= 0 ? S : S + m - 2 * (this.isReversed ? m : 0); break } } void 0 === A && (A = c.globals.gridHeight), b = null !== (k = this.groupCtx.prevYF[0]) && void 0 !== k && k.every((function (t) { return 0 === t })) && this.groupCtx.prevYF.slice(1, w).every((function (t) { return t.every((function (t) { return isNaN(t) })) })) ? o : A } else b = o; a = this.series[d][g] ? b - this.series[d][g] / this.yRatio[f] + 2 * (this.isReversed ? this.series[d][g] / this.yRatio[f] : 0) : b; var z = this.barHelpers.getColumnPaths({ barXPosition: v, barWidth: r, y1: b, y2: a, yRatio: this.yRatio[f], strokeWidth: this.strokeWidth, series: this.series, seriesGroup: l, realIndex: e.realIndex, i: d, j: g, w: c }); return this.barHelpers.barBackground({ bc: u, j: g, i: d, x1: v, x2: r, elSeries: h }), i += s, { pathTo: z.pathTo, pathFrom: z.pathFrom, goalY: this.barHelpers.getGoalValues("y", null, o, d, g), barXPosition: v, x: c.globals.isXNumeric ? i - s : i, y: a } } }]), s }(yt), kt = function (t) { n(s, t); var i = d(s); function s() { return a(this, s), i.apply(this, arguments) } return r(s, [{ key: "draw", value: function (t, i, a) { var s = this, r = this.w, o = new m(this.ctx), n = r.globals.comboCharts ? i : r.config.chart.type, l = new H(this.ctx); this.candlestickOptions = this.w.config.plotOptions.candlestick, this.boxOptions = this.w.config.plotOptions.boxPlot, this.isHorizontal = r.config.plotOptions.bar.horizontal; var h = new y(this.ctx, r); t = h.getLogSeries(t), this.series = t, this.yRatio = h.getLogYRatios(this.yRatio), this.barHelpers.initVariables(t); for (var c = o.group({ class: "apexcharts-".concat(n, "-series apexcharts-plot-series") }), d = function (i) { s.isBoxPlot = "boxPlot" === r.config.chart.type || "boxPlot" === r.config.series[i].type; var n, h, d, g, u = void 0, p = void 0, f = [], b = [], v = r.globals.comboCharts ? a[i] : i, m = s.barHelpers.getGroupIndex(v).columnGroupIndex, y = o.group({ class: "apexcharts-series", seriesName: x.escapeString(r.globals.seriesNames[v]), rel: i + 1, "data:realIndex": v }); s.ctx.series.addCollapsedClassToSeries(y, v), t[i].length > 0 && (s.visibleI = s.visibleI + 1); var w, k, A = 0; s.yRatio.length > 1 && (s.yaxisIndex = r.globals.seriesYAxisReverseMap[v][0], A = v); var S = s.barHelpers.initialPositions(); p = S.y, w = S.barHeight, h = S.yDivision, g = S.zeroW, u = S.x, k = S.barWidth, n = S.xDivision, d = S.zeroH, b.push(u + k / 2); for (var C = o.group({ class: "apexcharts-datalabels", "data:realIndex": v }), L = function (a) { var o = s.barHelpers.getStrokeWidth(i, a, v), c = null, x = { indexes: { i: i, j: a, realIndex: v, translationsIndex: A }, x: u, y: p, strokeWidth: o, elSeries: y }; c = s.isHorizontal ? s.drawHorizontalBoxPaths(e(e({}, x), {}, { yDivision: h, barHeight: w, zeroW: g })) : s.drawVerticalBoxPaths(e(e({}, x), {}, { xDivision: n, barWidth: k, zeroH: d })), p = c.y, u = c.x, a > 0 && b.push(u + k / 2), f.push(p), c.pathTo.forEach((function (e, n) { var h = !s.isBoxPlot && s.candlestickOptions.wick.useFillColor ? c.color[n] : r.globals.stroke.colors[i], d = l.fillPath({ seriesNumber: v, dataPointIndex: a, color: c.color[n], value: t[i][a] }); s.renderSeries({ realIndex: v, pathFill: d, lineFill: h, j: a, i: i, pathFrom: c.pathFrom, pathTo: e, strokeWidth: o, elSeries: y, x: u, y: p, series: t, columnGroupIndex: m, barHeight: w, barWidth: k, elDataLabelsWrap: C, visibleSeries: s.visibleI, type: r.config.chart.type }) })) }, P = 0; P < r.globals.dataPoints; P++)L(P); r.globals.seriesXvalues[v] = b, r.globals.seriesYvalues[v] = f, c.add(y) }, g = 0; g < t.length; g++)d(g); return c } }, { key: "drawVerticalBoxPaths", value: function (t) { var e = t.indexes, i = t.x; t.y; var a = t.xDivision, s = t.barWidth, r = t.zeroH, o = t.strokeWidth, n = this.w, l = new m(this.ctx), h = e.i, c = e.j, d = !0, g = n.config.plotOptions.candlestick.colors.upward, u = n.config.plotOptions.candlestick.colors.downward, p = ""; this.isBoxPlot && (p = [this.boxOptions.colors.lower, this.boxOptions.colors.upper]); var f = this.yRatio[e.translationsIndex], x = e.realIndex, b = this.getOHLCValue(x, c), v = r, y = r; b.o > b.c && (d = !1); var w = Math.min(b.o, b.c), k = Math.max(b.o, b.c), A = b.m; n.globals.isXNumeric && (i = (n.globals.seriesX[x][c] - n.globals.minX) / this.xRatio - s / 2); var S = i + s * this.visibleI; void 0 === this.series[h][c] || null === this.series[h][c] ? (w = r, k = r) : (w = r - w / f, k = r - k / f, v = r - b.h / f, y = r - b.l / f, A = r - b.m / f); var C = l.move(S, r), L = l.move(S + s / 2, w); return n.globals.previousPaths.length > 0 && (L = this.getPreviousPath(x, c, !0)), C = this.isBoxPlot ? [l.move(S, w) + l.line(S + s / 2, w) + l.line(S + s / 2, v) + l.line(S + s / 4, v) + l.line(S + s - s / 4, v) + l.line(S + s / 2, v) + l.line(S + s / 2, w) + l.line(S + s, w) + l.line(S + s, A) + l.line(S, A) + l.line(S, w + o / 2), l.move(S, A) + l.line(S + s, A) + l.line(S + s, k) + l.line(S + s / 2, k) + l.line(S + s / 2, y) + l.line(S + s - s / 4, y) + l.line(S + s / 4, y) + l.line(S + s / 2, y) + l.line(S + s / 2, k) + l.line(S, k) + l.line(S, A) + "z"] : [l.move(S, k) + l.line(S + s / 2, k) + l.line(S + s / 2, v) + l.line(S + s / 2, k) + l.line(S + s, k) + l.line(S + s, w) + l.line(S + s / 2, w) + l.line(S + s / 2, y) + l.line(S + s / 2, w) + l.line(S, w) + l.line(S, k - o / 2)], L += l.move(S, w), n.globals.isXNumeric || (i += a), { pathTo: C, pathFrom: L, x: i, y: k, barXPosition: S, color: this.isBoxPlot ? p : d ? [g] : [u] } } }, { key: "drawHorizontalBoxPaths", value: function (t) { var e = t.indexes; t.x; var i = t.y, a = t.yDivision, s = t.barHeight, r = t.zeroW, o = t.strokeWidth, n = this.w, l = new m(this.ctx), h = e.i, c = e.j, d = this.boxOptions.colors.lower; this.isBoxPlot && (d = [this.boxOptions.colors.lower, this.boxOptions.colors.upper]); var g = this.invertedYRatio, u = e.realIndex, p = this.getOHLCValue(u, c), f = r, x = r, b = Math.min(p.o, p.c), v = Math.max(p.o, p.c), y = p.m; n.globals.isXNumeric && (i = (n.globals.seriesX[u][c] - n.globals.minX) / this.invertedXRatio - s / 2); var w = i + s * this.visibleI; void 0 === this.series[h][c] || null === this.series[h][c] ? (b = r, v = r) : (b = r + b / g, v = r + v / g, f = r + p.h / g, x = r + p.l / g, y = r + p.m / g); var k = l.move(r, w), A = l.move(b, w + s / 2); return n.globals.previousPaths.length > 0 && (A = this.getPreviousPath(u, c, !0)), k = [l.move(b, w) + l.line(b, w + s / 2) + l.line(f, w + s / 2) + l.line(f, w + s / 2 - s / 4) + l.line(f, w + s / 2 + s / 4) + l.line(f, w + s / 2) + l.line(b, w + s / 2) + l.line(b, w + s) + l.line(y, w + s) + l.line(y, w) + l.line(b + o / 2, w), l.move(y, w) + l.line(y, w + s) + l.line(v, w + s) + l.line(v, w + s / 2) + l.line(x, w + s / 2) + l.line(x, w + s - s / 4) + l.line(x, w + s / 4) + l.line(x, w + s / 2) + l.line(v, w + s / 2) + l.line(v, w) + l.line(y, w) + "z"], A += l.move(b, w), n.globals.isXNumeric || (i += a), { pathTo: k, pathFrom: A, x: v, y: i, barYPosition: w, color: d } } }, { key: "getOHLCValue", value: function (t, e) { var i = this.w; return { o: this.isBoxPlot ? i.globals.seriesCandleH[t][e] : i.globals.seriesCandleO[t][e], h: this.isBoxPlot ? i.globals.seriesCandleO[t][e] : i.globals.seriesCandleH[t][e], m: i.globals.seriesCandleM[t][e], l: this.isBoxPlot ? i.globals.seriesCandleC[t][e] : i.globals.seriesCandleL[t][e], c: this.isBoxPlot ? i.globals.seriesCandleL[t][e] : i.globals.seriesCandleC[t][e] } } }]), s }(yt), At = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "checkColorRange", value: function () { var t = this.w, e = !1, i = t.config.plotOptions[t.config.chart.type]; return i.colorScale.ranges.length > 0 && i.colorScale.ranges.map((function (t, i) { t.from <= 0 && (e = !0) })), e } }, { key: "getShadeColor", value: function (t, e, i, a) { var s = this.w, r = 1, o = s.config.plotOptions[t].shadeIntensity, n = this.determineColor(t, e, i); s.globals.hasNegs || a ? r = s.config.plotOptions[t].reverseNegativeShade ? n.percent < 0 ? n.percent / 100 * (1.25 * o) : (1 - n.percent / 100) * (1.25 * o) : n.percent <= 0 ? 1 - (1 + n.percent / 100) * o : (1 - n.percent / 100) * o : (r = 1 - n.percent / 100, "treemap" === t && (r = (1 - n.percent / 100) * (1.25 * o))); var l = n.color, h = new x; return s.config.plotOptions[t].enableShades && (l = "dark" === this.w.config.theme.mode ? x.hexToRgba(h.shadeColor(-1 * r, n.color), s.config.fill.opacity) : x.hexToRgba(h.shadeColor(r, n.color), s.config.fill.opacity)), { color: l, colorProps: n } } }, { key: "determineColor", value: function (t, e, i) { var a = this.w, s = a.globals.series[e][i], r = a.config.plotOptions[t], o = r.colorScale.inverse ? i : e; r.distributed && "treemap" === a.config.chart.type && (o = i); var n = a.globals.colors[o], l = null, h = Math.min.apply(Math, u(a.globals.series[e])), c = Math.max.apply(Math, u(a.globals.series[e])); r.distributed || "heatmap" !== t || (h = a.globals.minY, c = a.globals.maxY), void 0 !== r.colorScale.min && (h = r.colorScale.min < a.globals.minY ? r.colorScale.min : a.globals.minY, c = r.colorScale.max > a.globals.maxY ? r.colorScale.max : a.globals.maxY); var d = Math.abs(c) + Math.abs(h), g = 100 * s / (0 === d ? d - 1e-6 : d); r.colorScale.ranges.length > 0 && r.colorScale.ranges.map((function (t, e) { if (s >= t.from && s <= t.to) { n = t.color, l = t.foreColor ? t.foreColor : null, h = t.from, c = t.to; var i = Math.abs(c) + Math.abs(h); g = 100 * s / (0 === i ? i - 1e-6 : i) } })); return { color: n, foreColor: l, percent: g } } }, { key: "calculateDataLabels", value: function (t) { var e = t.text, i = t.x, a = t.y, s = t.i, r = t.j, o = t.colorProps, n = t.fontSize, l = this.w.config.dataLabels, h = new m(this.ctx), c = new N(this.ctx), d = null; if (l.enabled) { d = h.group({ class: "apexcharts-data-labels" }); var g = l.offsetX, u = l.offsetY, p = i + g, f = a + parseFloat(l.style.fontSize) / 3 + u; c.plotDataLabelsText({ x: p, y: f, text: e, i: s, j: r, color: o.foreColor, parent: d, fontSize: n, dataLabelsConfig: l }) } return d } }, { key: "addListeners", value: function (t) { var e = new m(this.ctx); t.node.addEventListener("mouseenter", e.pathMouseEnter.bind(this, t)), t.node.addEventListener("mouseleave", e.pathMouseLeave.bind(this, t)), t.node.addEventListener("mousedown", e.pathMouseDown.bind(this, t)) } }]), t }(), St = function () { function t(e, i) { a(this, t), this.ctx = e, this.w = e.w, this.xRatio = i.xRatio, this.yRatio = i.yRatio, this.dynamicAnim = this.w.config.chart.animations.dynamicAnimation, this.helpers = new At(e), this.rectRadius = this.w.config.plotOptions.heatmap.radius, this.strokeWidth = this.w.config.stroke.show ? this.w.config.stroke.width : 0 } return r(t, [{ key: "draw", value: function (t) { var e = this.w, i = new m(this.ctx), a = i.group({ class: "apexcharts-heatmap" }); a.attr("clip-path", "url(#gridRectMask".concat(e.globals.cuid, ")")); var s = e.globals.gridWidth / e.globals.dataPoints, r = e.globals.gridHeight / e.globals.series.length, o = 0, n = !1; this.negRange = this.helpers.checkColorRange(); var l = t.slice(); e.config.yaxis[0].reversed && (n = !0, l.reverse()); for (var h = n ? 0 : l.length - 1; n ? h < l.length : h >= 0; n ? h++ : h--) { var c = i.group({ class: "apexcharts-series apexcharts-heatmap-series", seriesName: x.escapeString(e.globals.seriesNames[h]), rel: h + 1, "data:realIndex": h }); if (this.ctx.series.addCollapsedClassToSeries(c, h), e.config.chart.dropShadow.enabled) { var d = e.config.chart.dropShadow; new v(this.ctx).dropShadow(c, d, h) } for (var g = 0, u = e.config.plotOptions.heatmap.shadeIntensity, p = 0; p < l[h].length; p++) { var f = this.helpers.getShadeColor(e.config.chart.type, h, p, this.negRange), b = f.color, y = f.colorProps; if ("image" === e.config.fill.type) b = new H(this.ctx).fillPath({ seriesNumber: h, dataPointIndex: p, opacity: e.globals.hasNegs ? y.percent < 0 ? 1 - (1 + y.percent / 100) : u + y.percent / 100 : y.percent / 100, patternID: x.randomId(), width: e.config.fill.image.width ? e.config.fill.image.width : s, height: e.config.fill.image.height ? e.config.fill.image.height : r }); var w = this.rectRadius, k = i.drawRect(g, o, s, r, w); if (k.attr({ cx: g, cy: o }), k.node.classList.add("apexcharts-heatmap-rect"), c.add(k), k.attr({ fill: b, i: h, index: h, j: p, val: t[h][p], "stroke-width": this.strokeWidth, stroke: e.config.plotOptions.heatmap.useFillColorAsStroke ? b : e.globals.stroke.colors[0], color: b }), this.helpers.addListeners(k), e.config.chart.animations.enabled && !e.globals.dataChanged) { var A = 1; e.globals.resized || (A = e.config.chart.animations.speed), this.animateHeatMap(k, g, o, s, r, A) } if (e.globals.dataChanged) { var S = 1; if (this.dynamicAnim.enabled && e.globals.shouldAnimate) { S = this.dynamicAnim.speed; var C = e.globals.previousPaths[h] && e.globals.previousPaths[h][p] && e.globals.previousPaths[h][p].color; C || (C = "rgba(255, 255, 255, 0)"), this.animateHeatColor(k, x.isColorHex(C) ? C : x.rgb2hex(C), x.isColorHex(b) ? b : x.rgb2hex(b), S) } } var L = (0, e.config.dataLabels.formatter)(e.globals.series[h][p], { value: e.globals.series[h][p], seriesIndex: h, dataPointIndex: p, w: e }), P = this.helpers.calculateDataLabels({ text: L, x: g + s / 2, y: o + r / 2, i: h, j: p, colorProps: y, series: l }); null !== P && c.add(P), g += s } o += r, a.add(c) } var M = e.globals.yAxisScale[0].result.slice(); return e.config.yaxis[0].reversed ? M.unshift("") : M.push(""), e.globals.yAxisScale[0].result = M, a } }, { key: "animateHeatMap", value: function (t, e, i, a, s, r) { var o = new b(this.ctx); o.animateRect(t, { x: e + a / 2, y: i + s / 2, width: 0, height: 0 }, { x: e, y: i, width: a, height: s }, r, (function () { o.animationCompleted(t) })) } }, { key: "animateHeatColor", value: function (t, e, i, a) { t.attr({ fill: e }).animate(a).attr({ fill: i }) } }]), t }(), Ct = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "drawYAxisTexts", value: function (t, e, i, a) { var s = this.w, r = s.config.yaxis[0], o = s.globals.yLabelFormatters[0]; return new m(this.ctx).drawText({ x: t + r.labels.offsetX, y: e + r.labels.offsetY, text: o(a, i), textAnchor: "middle", fontSize: r.labels.style.fontSize, fontFamily: r.labels.style.fontFamily, foreColor: Array.isArray(r.labels.style.colors) ? r.labels.style.colors[i] : r.labels.style.colors }) } }]), t }(), Lt = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w; var i = this.w; this.chartType = this.w.config.chart.type, this.initialAnim = this.w.config.chart.animations.enabled, this.dynamicAnim = this.initialAnim && this.w.config.chart.animations.dynamicAnimation.enabled, this.animBeginArr = [0], this.animDur = 0, this.donutDataLabels = this.w.config.plotOptions.pie.donut.labels, this.lineColorArr = void 0 !== i.globals.stroke.colors ? i.globals.stroke.colors : i.globals.colors, this.defaultSize = Math.min(i.globals.gridWidth, i.globals.gridHeight), this.centerY = this.defaultSize / 2, this.centerX = i.globals.gridWidth / 2, "radialBar" === i.config.chart.type ? this.fullAngle = 360 : this.fullAngle = Math.abs(i.config.plotOptions.pie.endAngle - i.config.plotOptions.pie.startAngle), this.initialAngle = i.config.plotOptions.pie.startAngle % this.fullAngle, i.globals.radialSize = this.defaultSize / 2.05 - i.config.stroke.width - (i.config.chart.sparkline.enabled ? 0 : i.config.chart.dropShadow.blur), this.donutSize = i.globals.radialSize * parseInt(i.config.plotOptions.pie.donut.size, 10) / 100, this.maxY = 0, this.sliceLabels = [], this.sliceSizes = [], this.prevSectorAngleArr = [] } return r(t, [{ key: "draw", value: function (t) { var e = this, i = this.w, a = new m(this.ctx); if (this.ret = a.group({ class: "apexcharts-pie" }), i.globals.noData) return this.ret; for (var s = 0, r = 0; r < t.length; r++)s += x.negToZero(t[r]); var o = [], n = a.group(); 0 === s && (s = 1e-5), t.forEach((function (t) { e.maxY = Math.max(e.maxY, t) })), i.config.yaxis[0].max && (this.maxY = i.config.yaxis[0].max), "back" === i.config.grid.position && "polarArea" === this.chartType && this.drawPolarElements(this.ret); for (var l = 0; l < t.length; l++) { var h = this.fullAngle * x.negToZero(t[l]) / s; o.push(h), "polarArea" === this.chartType ? (o[l] = this.fullAngle / t.length, this.sliceSizes.push(i.globals.radialSize * t[l] / this.maxY)) : this.sliceSizes.push(i.globals.radialSize) } if (i.globals.dataChanged) { for (var c, d = 0, g = 0; g < i.globals.previousPaths.length; g++)d += x.negToZero(i.globals.previousPaths[g]); for (var u = 0; u < i.globals.previousPaths.length; u++)c = this.fullAngle * x.negToZero(i.globals.previousPaths[u]) / d, this.prevSectorAngleArr.push(c) } this.donutSize < 0 && (this.donutSize = 0); var p = i.config.plotOptions.pie.customScale, f = i.globals.gridWidth / 2, b = i.globals.gridHeight / 2, v = f - i.globals.gridWidth / 2 * p, y = b - i.globals.gridHeight / 2 * p; if ("donut" === this.chartType) { var w = a.drawCircle(this.donutSize); w.attr({ cx: this.centerX, cy: this.centerY, fill: i.config.plotOptions.pie.donut.background ? i.config.plotOptions.pie.donut.background : "transparent" }), n.add(w) } var k = this.drawArcs(o, t); if (this.sliceLabels.forEach((function (t) { k.add(t) })), n.attr({ transform: "translate(".concat(v, ", ").concat(y, ") scale(").concat(p, ")") }), n.add(k), this.ret.add(n), this.donutDataLabels.show) { var A = this.renderInnerDataLabels(this.donutDataLabels, { hollowSize: this.donutSize, centerX: this.centerX, centerY: this.centerY, opacity: this.donutDataLabels.show, translateX: v, translateY: y }); this.ret.add(A) } return "front" === i.config.grid.position && "polarArea" === this.chartType && this.drawPolarElements(this.ret), this.ret } }, { key: "drawArcs", value: function (t, e) { var i = this.w, a = new v(this.ctx), s = new m(this.ctx), r = new H(this.ctx), o = s.group({ class: "apexcharts-slices" }), n = this.initialAngle, l = this.initialAngle, h = this.initialAngle, c = this.initialAngle; this.strokeWidth = i.config.stroke.show ? i.config.stroke.width : 0; for (var d = 0; d < t.length; d++) { var g = s.group({ class: "apexcharts-series apexcharts-pie-series", seriesName: x.escapeString(i.globals.seriesNames[d]), rel: d + 1, "data:realIndex": d }); o.add(g), l = c, h = (n = h) + t[d], c = l + this.prevSectorAngleArr[d]; var u = h < n ? this.fullAngle + h - n : h - n, p = r.fillPath({ seriesNumber: d, size: this.sliceSizes[d], value: e[d] }), f = this.getChangedPath(l, c), b = s.drawPath({ d: f, stroke: Array.isArray(this.lineColorArr) ? this.lineColorArr[d] : this.lineColorArr, strokeWidth: 0, fill: p, fillOpacity: i.config.fill.opacity, classes: "apexcharts-pie-area apexcharts-".concat(this.chartType.toLowerCase(), "-slice-").concat(d) }); if (b.attr({ index: 0, j: d }), a.setSelectionFilter(b, 0, d), i.config.chart.dropShadow.enabled) { var y = i.config.chart.dropShadow; a.dropShadow(b, y, d) } this.addListeners(b, this.donutDataLabels), m.setAttrs(b.node, { "data:angle": u, "data:startAngle": n, "data:strokeWidth": this.strokeWidth, "data:value": e[d] }); var w = { x: 0, y: 0 }; "pie" === this.chartType || "polarArea" === this.chartType ? w = x.polarToCartesian(this.centerX, this.centerY, i.globals.radialSize / 1.25 + i.config.plotOptions.pie.dataLabels.offset, (n + u / 2) % this.fullAngle) : "donut" === this.chartType && (w = x.polarToCartesian(this.centerX, this.centerY, (i.globals.radialSize + this.donutSize) / 2 + i.config.plotOptions.pie.dataLabels.offset, (n + u / 2) % this.fullAngle)), g.add(b); var k = 0; if (!this.initialAnim || i.globals.resized || i.globals.dataChanged ? this.animBeginArr.push(0) : (0 === (k = u / this.fullAngle * i.config.chart.animations.speed) && (k = 1), this.animDur = k + this.animDur, this.animBeginArr.push(this.animDur)), this.dynamicAnim && i.globals.dataChanged ? this.animatePaths(b, { size: this.sliceSizes[d], endAngle: h, startAngle: n, prevStartAngle: l, prevEndAngle: c, animateStartingPos: !0, i: d, animBeginArr: this.animBeginArr, shouldSetPrevPaths: !0, dur: i.config.chart.animations.dynamicAnimation.speed }) : this.animatePaths(b, { size: this.sliceSizes[d], endAngle: h, startAngle: n, i: d, totalItems: t.length - 1, animBeginArr: this.animBeginArr, dur: k }), i.config.plotOptions.pie.expandOnClick && "polarArea" !== this.chartType && b.node.addEventListener("mouseup", this.pieClicked.bind(this, d)), void 0 !== i.globals.selectedDataPoints[0] && i.globals.selectedDataPoints[0].indexOf(d) > -1 && this.pieClicked(d), i.config.dataLabels.enabled) { var A = w.x, S = w.y, C = 100 * u / this.fullAngle + "%"; if (0 !== u && i.config.plotOptions.pie.dataLabels.minAngleToShowLabel < t[d]) { var L = i.config.dataLabels.formatter; void 0 !== L && (C = L(i.globals.seriesPercent[d][0], { seriesIndex: d, w: i })); var P = i.globals.dataLabels.style.colors[d], M = s.group({ class: "apexcharts-datalabels" }), I = s.drawText({ x: A, y: S, text: C, textAnchor: "middle", fontSize: i.config.dataLabels.style.fontSize, fontFamily: i.config.dataLabels.style.fontFamily, fontWeight: i.config.dataLabels.style.fontWeight, foreColor: P }); if (M.add(I), i.config.dataLabels.dropShadow.enabled) { var T = i.config.dataLabels.dropShadow; a.dropShadow(I, T) } I.node.classList.add("apexcharts-pie-label"), i.config.chart.animations.animate && !1 === i.globals.resized && (I.node.classList.add("apexcharts-pie-label-delay"), I.node.style.animationDelay = i.config.chart.animations.speed / 940 + "s"), this.sliceLabels.push(M) } } } return o } }, { key: "addListeners", value: function (t, e) { var i = new m(this.ctx); t.node.addEventListener("mouseenter", i.pathMouseEnter.bind(this, t)), t.node.addEventListener("mouseleave", i.pathMouseLeave.bind(this, t)), t.node.addEventListener("mouseleave", this.revertDataLabelsInner.bind(this, t.node, e)), t.node.addEventListener("mousedown", i.pathMouseDown.bind(this, t)), this.donutDataLabels.total.showAlways || (t.node.addEventListener("mouseenter", this.printDataLabelsInner.bind(this, t.node, e)), t.node.addEventListener("mousedown", this.printDataLabelsInner.bind(this, t.node, e))) } }, { key: "animatePaths", value: function (t, e) { var i = this.w, a = e.endAngle < e.startAngle ? this.fullAngle + e.endAngle - e.startAngle : e.endAngle - e.startAngle, s = a, r = e.startAngle, o = e.startAngle; void 0 !== e.prevStartAngle && void 0 !== e.prevEndAngle && (r = e.prevEndAngle, s = e.prevEndAngle < e.prevStartAngle ? this.fullAngle + e.prevEndAngle - e.prevStartAngle : e.prevEndAngle - e.prevStartAngle), e.i === i.config.series.length - 1 && (a + o > this.fullAngle ? e.endAngle = e.endAngle - (a + o) : a + o < this.fullAngle && (e.endAngle = e.endAngle + (this.fullAngle - (a + o)))), a === this.fullAngle && (a = this.fullAngle - .01), this.animateArc(t, r, o, a, s, e) } }, { key: "animateArc", value: function (t, e, i, a, s, r) { var o, n = this, l = this.w, h = new b(this.ctx), c = r.size; (isNaN(e) || isNaN(s)) && (e = i, s = a, r.dur = 0); var d = a, g = i, u = e < i ? this.fullAngle + e - i : e - i; l.globals.dataChanged && r.shouldSetPrevPaths && r.prevEndAngle && (o = n.getPiePath({ me: n, startAngle: r.prevStartAngle, angle: r.prevEndAngle < r.prevStartAngle ? this.fullAngle + r.prevEndAngle - r.prevStartAngle : r.prevEndAngle - r.prevStartAngle, size: c }), t.attr({ d: o })), 0 !== r.dur ? t.animate(r.dur, l.globals.easing, r.animBeginArr[r.i]).afterAll((function () { "pie" !== n.chartType && "donut" !== n.chartType && "polarArea" !== n.chartType || this.animate(l.config.chart.animations.dynamicAnimation.speed).attr({ "stroke-width": n.strokeWidth }), r.i === l.config.series.length - 1 && h.animationCompleted(t) })).during((function (l) { d = u + (a - u) * l, r.animateStartingPos && (d = s + (a - s) * l, g = e - s + (i - (e - s)) * l), o = n.getPiePath({ me: n, startAngle: g, angle: d, size: c }), t.node.setAttribute("data:pathOrig", o), t.attr({ d: o }) })) : (o = n.getPiePath({ me: n, startAngle: g, angle: a, size: c }), r.isTrack || (l.globals.animationEnded = !0), t.node.setAttribute("data:pathOrig", o), t.attr({ d: o, "stroke-width": n.strokeWidth })) } }, { key: "pieClicked", value: function (t) { var e, i = this.w, a = this, s = a.sliceSizes[t] + (i.config.plotOptions.pie.expandOnClick ? 4 : 0), r = i.globals.dom.Paper.select(".apexcharts-".concat(a.chartType.toLowerCase(), "-slice-").concat(t)).members[0]; if ("true" !== r.attr("data:pieClicked")) { var o = i.globals.dom.baseEl.getElementsByClassName("apexcharts-pie-area"); Array.prototype.forEach.call(o, (function (t) { t.setAttribute("data:pieClicked", "false"); var e = t.getAttribute("data:pathOrig"); e && t.setAttribute("d", e) })), i.globals.capturedDataPointIndex = t, r.attr("data:pieClicked", "true"); var n = parseInt(r.attr("data:startAngle"), 10), l = parseInt(r.attr("data:angle"), 10); e = a.getPiePath({ me: a, startAngle: n, angle: l, size: s }), 360 !== l && r.plot(e) } else { r.attr({ "data:pieClicked": "false" }), this.revertDataLabelsInner(r.node, this.donutDataLabels); var h = r.attr("data:pathOrig"); r.attr({ d: h }) } } }, { key: "getChangedPath", value: function (t, e) { var i = ""; return this.dynamicAnim && this.w.globals.dataChanged && (i = this.getPiePath({ me: this, startAngle: t, angle: e - t, size: this.size })), i } }, { key: "getPiePath", value: function (t) { var e, i = t.me, a = t.startAngle, s = t.angle, r = t.size, o = new m(this.ctx), n = a, l = Math.PI * (n - 90) / 180, h = s + a; Math.ceil(h) >= this.fullAngle + this.w.config.plotOptions.pie.startAngle % this.fullAngle && (h = this.fullAngle + this.w.config.plotOptions.pie.startAngle % this.fullAngle - .01), Math.ceil(h) > this.fullAngle && (h -= this.fullAngle); var c = Math.PI * (h - 90) / 180, d = i.centerX + r * Math.cos(l), g = i.centerY + r * Math.sin(l), u = i.centerX + r * Math.cos(c), p = i.centerY + r * Math.sin(c), f = x.polarToCartesian(i.centerX, i.centerY, i.donutSize, h), b = x.polarToCartesian(i.centerX, i.centerY, i.donutSize, n), v = s > 180 ? 1 : 0, y = ["M", d, g, "A", r, r, 0, v, 1, u, p]; return e = "donut" === i.chartType ? [].concat(y, ["L", f.x, f.y, "A", i.donutSize, i.donutSize, 0, v, 0, b.x, b.y, "L", d, g, "z"]).join(" ") : "pie" === i.chartType || "polarArea" === i.chartType ? [].concat(y, ["L", i.centerX, i.centerY, "L", d, g]).join(" ") : [].concat(y).join(" "), o.roundPathCorners(e, 2 * this.strokeWidth) } }, { key: "drawPolarElements", value: function (t) { var e = this.w, i = new _(this.ctx), a = new m(this.ctx), s = new Ct(this.ctx), r = a.group(), o = a.group(), n = i.niceScale(0, Math.ceil(this.maxY), 0), l = n.result.reverse(), h = n.result.length; this.maxY = n.niceMax; for (var c = e.globals.radialSize, d = c / (h - 1), g = 0; g < h - 1; g++) { var u = a.drawCircle(c); if (u.attr({ cx: this.centerX, cy: this.centerY, fill: "none", "stroke-width": e.config.plotOptions.polarArea.rings.strokeWidth, stroke: e.config.plotOptions.polarArea.rings.strokeColor }), e.config.yaxis[0].show) { var p = s.drawYAxisTexts(this.centerX, this.centerY - c + parseInt(e.config.yaxis[0].labels.style.fontSize, 10) / 2, g, l[g]); o.add(p) } r.add(u), c -= d } this.drawSpokes(t), t.add(r), t.add(o) } }, { key: "renderInnerDataLabels", value: function (t, e) { var i = this.w, a = new m(this.ctx), s = a.group({ class: "apexcharts-datalabels-group", transform: "translate(".concat(e.translateX ? e.translateX : 0, ", ").concat(e.translateY ? e.translateY : 0, ") scale(").concat(i.config.plotOptions.pie.customScale, ")") }), r = t.total.show; s.node.style.opacity = e.opacity; var o, n, l = e.centerX, h = e.centerY; o = void 0 === t.name.color ? i.globals.colors[0] : t.name.color; var c = t.name.fontSize, d = t.name.fontFamily, g = t.name.fontWeight; n = void 0 === t.value.color ? i.config.chart.foreColor : t.value.color; var u = t.value.formatter, p = "", f = ""; if (r ? (o = t.total.color, c = t.total.fontSize, d = t.total.fontFamily, g = t.total.fontWeight, f = t.total.label, p = t.total.formatter(i)) : 1 === i.globals.series.length && (p = u(i.globals.series[0], i), f = i.globals.seriesNames[0]), f && (f = t.name.formatter(f, t.total.show, i)), t.name.show) { var x = a.drawText({ x: l, y: h + parseFloat(t.name.offsetY), text: f, textAnchor: "middle", foreColor: o, fontSize: c, fontWeight: g, fontFamily: d }); x.node.classList.add("apexcharts-datalabel-label"), s.add(x) } if (t.value.show) { var b = t.name.show ? parseFloat(t.value.offsetY) + 16 : t.value.offsetY, v = a.drawText({ x: l, y: h + b, text: p, textAnchor: "middle", foreColor: n, fontWeight: t.value.fontWeight, fontSize: t.value.fontSize, fontFamily: t.value.fontFamily }); v.node.classList.add("apexcharts-datalabel-value"), s.add(v) } return s } }, { key: "printInnerLabels", value: function (t, e, i, a) { var s, r = this.w; a ? s = void 0 === t.name.color ? r.globals.colors[parseInt(a.parentNode.getAttribute("rel"), 10) - 1] : t.name.color : r.globals.series.length > 1 && t.total.show && (s = t.total.color); var o = r.globals.dom.baseEl.querySelector(".apexcharts-datalabel-label"), n = r.globals.dom.baseEl.querySelector(".apexcharts-datalabel-value"); i = (0, t.value.formatter)(i, r), a || "function" != typeof t.total.formatter || (i = t.total.formatter(r)); var l = e === t.total.label; e = t.name.formatter(e, l, r), null !== o && (o.textContent = e), null !== n && (n.textContent = i), null !== o && (o.style.fill = s) } }, { key: "printDataLabelsInner", value: function (t, e) { var i = this.w, a = t.getAttribute("data:value"), s = i.globals.seriesNames[parseInt(t.parentNode.getAttribute("rel"), 10) - 1]; i.globals.series.length > 1 && this.printInnerLabels(e, s, a, t); var r = i.globals.dom.baseEl.querySelector(".apexcharts-datalabels-group"); null !== r && (r.style.opacity = 1) } }, { key: "drawSpokes", value: function (t) { var e = this, i = this.w, a = new m(this.ctx), s = i.config.plotOptions.polarArea.spokes; if (0 !== s.strokeWidth) { for (var r = [], o = 360 / i.globals.series.length, n = 0; n < i.globals.series.length; n++)r.push(x.polarToCartesian(this.centerX, this.centerY, i.globals.radialSize, i.config.plotOptions.pie.startAngle + o * n)); r.forEach((function (i, r) { var o = a.drawLine(i.x, i.y, e.centerX, e.centerY, Array.isArray(s.connectorColors) ? s.connectorColors[r] : s.connectorColors); t.add(o) })) } } }, { key: "revertDataLabelsInner", value: function (t, e, i) { var a = this, s = this.w, r = s.globals.dom.baseEl.querySelector(".apexcharts-datalabels-group"), o = !1, n = s.globals.dom.baseEl.getElementsByClassName("apexcharts-pie-area"), l = function (t) { var i = t.makeSliceOut, s = t.printLabel; Array.prototype.forEach.call(n, (function (t) { "true" === t.getAttribute("data:pieClicked") && (i && (o = !0), s && a.printDataLabelsInner(t, e)) })) }; if (l({ makeSliceOut: !0, printLabel: !1 }), e.total.show && s.globals.series.length > 1) o && !e.total.showAlways ? l({ makeSliceOut: !1, printLabel: !0 }) : this.printInnerLabels(e, e.total.label, e.total.formatter(s)); else if (l({ makeSliceOut: !1, printLabel: !0 }), !o) if (s.globals.selectedDataPoints.length && s.globals.series.length > 1) if (s.globals.selectedDataPoints[0].length > 0) { var h = s.globals.selectedDataPoints[0], c = s.globals.dom.baseEl.querySelector(".apexcharts-".concat(this.chartType.toLowerCase(), "-slice-").concat(h)); this.printDataLabelsInner(c, e) } else r && s.globals.selectedDataPoints.length && 0 === s.globals.selectedDataPoints[0].length && (r.style.opacity = 0); else r && s.globals.series.length > 1 && (r.style.opacity = 0) } }]), t }(), Pt = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w, this.chartType = this.w.config.chart.type, this.initialAnim = this.w.config.chart.animations.enabled, this.dynamicAnim = this.initialAnim && this.w.config.chart.animations.dynamicAnimation.enabled, this.animDur = 0; var i = this.w; this.graphics = new m(this.ctx), this.lineColorArr = void 0 !== i.globals.stroke.colors ? i.globals.stroke.colors : i.globals.colors, this.defaultSize = i.globals.svgHeight < i.globals.svgWidth ? i.globals.gridHeight + 1.5 * i.globals.goldenPadding : i.globals.gridWidth, this.isLog = i.config.yaxis[0].logarithmic, this.logBase = i.config.yaxis[0].logBase, this.coreUtils = new y(this.ctx), this.maxValue = this.isLog ? this.coreUtils.getLogVal(this.logBase, i.globals.maxY, 0) : i.globals.maxY, this.minValue = this.isLog ? this.coreUtils.getLogVal(this.logBase, this.w.globals.minY, 0) : i.globals.minY, this.polygons = i.config.plotOptions.radar.polygons, this.strokeWidth = i.config.stroke.show ? i.config.stroke.width : 0, this.size = this.defaultSize / 2.1 - this.strokeWidth - i.config.chart.dropShadow.blur, i.config.xaxis.labels.show && (this.size = this.size - i.globals.xAxisLabelsWidth / 1.75), void 0 !== i.config.plotOptions.radar.size && (this.size = i.config.plotOptions.radar.size), this.dataRadiusOfPercent = [], this.dataRadius = [], this.angleArr = [], this.yaxisLabelsTextsPos = [] } return r(t, [{ key: "draw", value: function (t) { var i = this, a = this.w, s = new H(this.ctx), r = [], o = new N(this.ctx); t.length && (this.dataPointsLen = t[a.globals.maxValsInArrayIndex].length), this.disAngle = 2 * Math.PI / this.dataPointsLen; var n = a.globals.gridWidth / 2, l = a.globals.gridHeight / 2, h = n + a.config.plotOptions.radar.offsetX, c = l + a.config.plotOptions.radar.offsetY, d = this.graphics.group({ class: "apexcharts-radar-series apexcharts-plot-series", transform: "translate(".concat(h || 0, ", ").concat(c || 0, ")") }), g = [], u = null, p = null; if (this.yaxisLabels = this.graphics.group({ class: "apexcharts-yaxis" }), t.forEach((function (t, n) { var l = t.length === a.globals.dataPoints, h = i.graphics.group().attr({ class: "apexcharts-series", "data:longestSeries": l, seriesName: x.escapeString(a.globals.seriesNames[n]), rel: n + 1, "data:realIndex": n }); i.dataRadiusOfPercent[n] = [], i.dataRadius[n] = [], i.angleArr[n] = [], t.forEach((function (t, e) { var a = Math.abs(i.maxValue - i.minValue); t -= i.minValue, i.isLog && (t = i.coreUtils.getLogVal(i.logBase, t, 0)), i.dataRadiusOfPercent[n][e] = t / a, i.dataRadius[n][e] = i.dataRadiusOfPercent[n][e] * i.size, i.angleArr[n][e] = e * i.disAngle })), g = i.getDataPointsPos(i.dataRadius[n], i.angleArr[n]); var c = i.createPaths(g, { x: 0, y: 0 }); u = i.graphics.group({ class: "apexcharts-series-markers-wrap apexcharts-element-hidden" }), p = i.graphics.group({ class: "apexcharts-datalabels", "data:realIndex": n }), a.globals.delayedElements.push({ el: u.node, index: n }); var d = { i: n, realIndex: n, animationDelay: n, initialSpeed: a.config.chart.animations.speed, dataChangeSpeed: a.config.chart.animations.dynamicAnimation.speed, className: "apexcharts-radar", shouldClipToGrid: !1, bindEventsOnPaths: !1, stroke: a.globals.stroke.colors[n], strokeLineCap: a.config.stroke.lineCap }, f = null; a.globals.previousPaths.length > 0 && (f = i.getPreviousPath(n)); for (var b = 0; b < c.linePathsTo.length; b++) { var m = i.graphics.renderPaths(e(e({}, d), {}, { pathFrom: null === f ? c.linePathsFrom[b] : f, pathTo: c.linePathsTo[b], strokeWidth: Array.isArray(i.strokeWidth) ? i.strokeWidth[n] : i.strokeWidth, fill: "none", drawShadow: !1 })); h.add(m); var y = s.fillPath({ seriesNumber: n }), w = i.graphics.renderPaths(e(e({}, d), {}, { pathFrom: null === f ? c.areaPathsFrom[b] : f, pathTo: c.areaPathsTo[b], strokeWidth: 0, fill: y, drawShadow: !1 })); if (a.config.chart.dropShadow.enabled) { var k = new v(i.ctx), A = a.config.chart.dropShadow; k.dropShadow(w, Object.assign({}, A, { noUserSpaceOnUse: !0 }), n) } h.add(w) } t.forEach((function (t, s) { var r = new D(i.ctx).getMarkerConfig({ cssClass: "apexcharts-marker", seriesIndex: n, dataPointIndex: s }), l = i.graphics.drawMarker(g[s].x, g[s].y, r); l.attr("rel", s), l.attr("j", s), l.attr("index", n), l.node.setAttribute("default-marker-size", r.pSize); var c = i.graphics.group({ class: "apexcharts-series-markers" }); c && c.add(l), u.add(c), h.add(u); var d = a.config.dataLabels; if (d.enabled) { var f = d.formatter(a.globals.series[n][s], { seriesIndex: n, dataPointIndex: s, w: a }); o.plotDataLabelsText({ x: g[s].x, y: g[s].y, text: f, textAnchor: "middle", i: n, j: n, parent: p, offsetCorrection: !1, dataLabelsConfig: e({}, d) }) } h.add(p) })), r.push(h) })), this.drawPolygons({ parent: d }), a.config.xaxis.labels.show) { var f = this.drawXAxisTexts(); d.add(f) } return r.forEach((function (t) { d.add(t) })), d.add(this.yaxisLabels), d } }, { key: "drawPolygons", value: function (t) { for (var e = this, i = this.w, a = t.parent, s = new Ct(this.ctx), r = i.globals.yAxisScale[0].result.reverse(), o = r.length, n = [], l = this.size / (o - 1), h = 0; h < o; h++)n[h] = l * h; n.reverse(); var c = [], d = []; n.forEach((function (t, i) { var a = x.getPolygonPos(t, e.dataPointsLen), s = ""; a.forEach((function (t, a) { if (0 === i) { var r = e.graphics.drawLine(t.x, t.y, 0, 0, Array.isArray(e.polygons.connectorColors) ? e.polygons.connectorColors[a] : e.polygons.connectorColors); d.push(r) } 0 === a && e.yaxisLabelsTextsPos.push({ x: t.x, y: t.y }), s += t.x + "," + t.y + " " })), c.push(s) })), c.forEach((function (t, s) { var r = e.polygons.strokeColors, o = e.polygons.strokeWidth, n = e.graphics.drawPolygon(t, Array.isArray(r) ? r[s] : r, Array.isArray(o) ? o[s] : o, i.globals.radarPolygons.fill.colors[s]); a.add(n) })), d.forEach((function (t) { a.add(t) })), i.config.yaxis[0].show && this.yaxisLabelsTextsPos.forEach((function (t, i) { var a = s.drawYAxisTexts(t.x, t.y, i, r[i]); e.yaxisLabels.add(a) })) } }, { key: "drawXAxisTexts", value: function () { var t = this, i = this.w, a = i.config.xaxis.labels, s = this.graphics.group({ class: "apexcharts-xaxis" }), r = x.getPolygonPos(this.size, this.dataPointsLen); return i.globals.labels.forEach((function (o, n) { var l = i.config.xaxis.labels.formatter, h = new N(t.ctx); if (r[n]) { var c = t.getTextPos(r[n], t.size), d = l(o, { seriesIndex: -1, dataPointIndex: n, w: i }); h.plotDataLabelsText({ x: c.newX, y: c.newY, text: d, textAnchor: c.textAnchor, i: n, j: n, parent: s, color: Array.isArray(a.style.colors) && a.style.colors[n] ? a.style.colors[n] : "#a8a8a8", dataLabelsConfig: e({ textAnchor: c.textAnchor, dropShadow: { enabled: !1 } }, a), offsetCorrection: !1 }) } })), s } }, { key: "createPaths", value: function (t, e) { var i = this, a = [], s = [], r = [], o = []; if (t.length) { s = [this.graphics.move(e.x, e.y)], o = [this.graphics.move(e.x, e.y)]; var n = this.graphics.move(t[0].x, t[0].y), l = this.graphics.move(t[0].x, t[0].y); t.forEach((function (e, a) { n += i.graphics.line(e.x, e.y), l += i.graphics.line(e.x, e.y), a === t.length - 1 && (n += "Z", l += "Z") })), a.push(n), r.push(l) } return { linePathsFrom: s, linePathsTo: a, areaPathsFrom: o, areaPathsTo: r } } }, { key: "getTextPos", value: function (t, e) { var i = "middle", a = t.x, s = t.y; return Math.abs(t.x) >= 10 ? t.x > 0 ? (i = "start", a += 10) : t.x < 0 && (i = "end", a -= 10) : i = "middle", Math.abs(t.y) >= e - 10 && (t.y < 0 ? s -= 10 : t.y > 0 && (s += 10)), { textAnchor: i, newX: a, newY: s } } }, { key: "getPreviousPath", value: function (t) { for (var e = this.w, i = null, a = 0; a < e.globals.previousPaths.length; a++) { var s = e.globals.previousPaths[a]; s.paths.length > 0 && parseInt(s.realIndex, 10) === parseInt(t, 10) && void 0 !== e.globals.previousPaths[a].paths[0] && (i = e.globals.previousPaths[a].paths[0].d) } return i } }, { key: "getDataPointsPos", value: function (t, e) { var i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : this.dataPointsLen; t = t || [], e = e || []; for (var a = [], s = 0; s < i; s++) { var r = {}; r.x = t[s] * Math.sin(e[s]), r.y = -t[s] * Math.cos(e[s]), a.push(r) } return a } }]), t }(), Mt = function (t) { n(i, t); var e = d(i); function i(t) { var s; a(this, i), (s = e.call(this, t)).ctx = t, s.w = t.w, s.animBeginArr = [0], s.animDur = 0; var r = s.w; return s.startAngle = r.config.plotOptions.radialBar.startAngle, s.endAngle = r.config.plotOptions.radialBar.endAngle, s.totalAngle = Math.abs(r.config.plotOptions.radialBar.endAngle - r.config.plotOptions.radialBar.startAngle), s.trackStartAngle = r.config.plotOptions.radialBar.track.startAngle, s.trackEndAngle = r.config.plotOptions.radialBar.track.endAngle, s.barLabels = s.w.config.plotOptions.radialBar.barLabels, s.donutDataLabels = s.w.config.plotOptions.radialBar.dataLabels, s.radialDataLabels = s.donutDataLabels, s.trackStartAngle || (s.trackStartAngle = s.startAngle), s.trackEndAngle || (s.trackEndAngle = s.endAngle), 360 === s.endAngle && (s.endAngle = 359.99), s.margin = parseInt(r.config.plotOptions.radialBar.track.margin, 10), s.onBarLabelClick = s.onBarLabelClick.bind(c(s)), s } return r(i, [{ key: "draw", value: function (t) { var e = this.w, i = new m(this.ctx), a = i.group({ class: "apexcharts-radialbar" }); if (e.globals.noData) return a; var s = i.group(), r = this.defaultSize / 2, o = e.globals.gridWidth / 2, n = this.defaultSize / 2.05; e.config.chart.sparkline.enabled || (n = n - e.config.stroke.width - e.config.chart.dropShadow.blur); var l = e.globals.fill.colors; if (e.config.plotOptions.radialBar.track.show) { var h = this.drawTracks({ size: n, centerX: o, centerY: r, colorArr: l, series: t }); s.add(h) } var c = this.drawArcs({ size: n, centerX: o, centerY: r, colorArr: l, series: t }), d = 360; e.config.plotOptions.radialBar.startAngle < 0 && (d = this.totalAngle); var g = (360 - d) / 360; if (e.globals.radialSize = n - n * g, this.radialDataLabels.value.show) { var u = Math.max(this.radialDataLabels.value.offsetY, this.radialDataLabels.name.offsetY); e.globals.radialSize += u * g } return s.add(c.g), "front" === e.config.plotOptions.radialBar.hollow.position && (c.g.add(c.elHollow), c.dataLabels && c.g.add(c.dataLabels)), a.add(s), a } }, { key: "drawTracks", value: function (t) { var e = this.w, i = new m(this.ctx), a = i.group({ class: "apexcharts-tracks" }), s = new v(this.ctx), r = new H(this.ctx), o = this.getStrokeWidth(t); t.size = t.size - o / 2; for (var n = 0; n < t.series.length; n++) { var l = i.group({ class: "apexcharts-radialbar-track apexcharts-track" }); a.add(l), l.attr({ rel: n + 1 }), t.size = t.size - o - this.margin; var h = e.config.plotOptions.radialBar.track, c = r.fillPath({ seriesNumber: 0, size: t.size, fillColors: Array.isArray(h.background) ? h.background[n] : h.background, solid: !0 }), d = this.trackStartAngle, g = this.trackEndAngle; Math.abs(g) + Math.abs(d) >= 360 && (g = 360 - Math.abs(this.startAngle) - .1); var u = i.drawPath({ d: "", stroke: c, strokeWidth: o * parseInt(h.strokeWidth, 10) / 100, fill: "none", strokeOpacity: h.opacity, classes: "apexcharts-radialbar-area" }); if (h.dropShadow.enabled) { var p = h.dropShadow; s.dropShadow(u, p) } l.add(u), u.attr("id", "apexcharts-radialbarTrack-" + n), this.animatePaths(u, { centerX: t.centerX, centerY: t.centerY, endAngle: g, startAngle: d, size: t.size, i: n, totalItems: 2, animBeginArr: 0, dur: 0, isTrack: !0, easing: e.globals.easing }) } return a } }, { key: "drawArcs", value: function (t) { var e = this.w, i = new m(this.ctx), a = new H(this.ctx), s = new v(this.ctx), r = i.group(), o = this.getStrokeWidth(t); t.size = t.size - o / 2; var n = e.config.plotOptions.radialBar.hollow.background, l = t.size - o * t.series.length - this.margin * t.series.length - o * parseInt(e.config.plotOptions.radialBar.track.strokeWidth, 10) / 100 / 2, h = l - e.config.plotOptions.radialBar.hollow.margin; void 0 !== e.config.plotOptions.radialBar.hollow.image && (n = this.drawHollowImage(t, r, l, n)); var c = this.drawHollow({ size: h, centerX: t.centerX, centerY: t.centerY, fill: n || "transparent" }); if (e.config.plotOptions.radialBar.hollow.dropShadow.enabled) { var d = e.config.plotOptions.radialBar.hollow.dropShadow; s.dropShadow(c, d) } var g = 1; !this.radialDataLabels.total.show && e.globals.series.length > 1 && (g = 0); var u = null; this.radialDataLabels.show && (u = this.renderInnerDataLabels(this.radialDataLabels, { hollowSize: l, centerX: t.centerX, centerY: t.centerY, opacity: g })), "back" === e.config.plotOptions.radialBar.hollow.position && (r.add(c), u && r.add(u)); var p = !1; e.config.plotOptions.radialBar.inverseOrder && (p = !0); for (var f = p ? t.series.length - 1 : 0; p ? f >= 0 : f < t.series.length; p ? f-- : f++) { var b = i.group({ class: "apexcharts-series apexcharts-radial-series", seriesName: x.escapeString(e.globals.seriesNames[f]) }); r.add(b), b.attr({ rel: f + 1, "data:realIndex": f }), this.ctx.series.addCollapsedClassToSeries(b, f), t.size = t.size - o - this.margin; var y = a.fillPath({ seriesNumber: f, size: t.size, value: t.series[f] }), w = this.startAngle, k = void 0, A = x.negToZero(t.series[f] > 100 ? 100 : t.series[f]) / 100, S = Math.round(this.totalAngle * A) + this.startAngle, C = void 0; e.globals.dataChanged && (k = this.startAngle, C = Math.round(this.totalAngle * x.negToZero(e.globals.previousPaths[f]) / 100) + k), Math.abs(S) + Math.abs(w) >= 360 && (S -= .01), Math.abs(C) + Math.abs(k) >= 360 && (C -= .01); var L = S - w, P = Array.isArray(e.config.stroke.dashArray) ? e.config.stroke.dashArray[f] : e.config.stroke.dashArray, M = i.drawPath({ d: "", stroke: y, strokeWidth: o, fill: "none", fillOpacity: e.config.fill.opacity, classes: "apexcharts-radialbar-area apexcharts-radialbar-slice-" + f, strokeDashArray: P }); if (m.setAttrs(M.node, { "data:angle": L, "data:value": t.series[f] }), e.config.chart.dropShadow.enabled) { var I = e.config.chart.dropShadow; s.dropShadow(M, I, f) } if (s.setSelectionFilter(M, 0, f), this.addListeners(M, this.radialDataLabels), b.add(M), M.attr({ index: 0, j: f }), this.barLabels.enabled) { var T = x.polarToCartesian(t.centerX, t.centerY, t.size, w), z = this.barLabels.formatter(e.globals.seriesNames[f], { seriesIndex: f, w: e }), X = ["apexcharts-radialbar-label"]; this.barLabels.onClick || X.push("apexcharts-no-click"); var E = this.barLabels.useSeriesColors ? e.globals.colors[f] : e.config.chart.foreColor; E || (E = e.config.chart.foreColor); var Y = T.x - this.barLabels.margin, F = T.y, R = i.drawText({ x: Y, y: F, text: z, textAnchor: "end", dominantBaseline: "middle", fontFamily: this.barLabels.fontFamily, fontWeight: this.barLabels.fontWeight, fontSize: this.barLabels.fontSize, foreColor: E, cssClass: X.join(" ") }); R.on("click", this.onBarLabelClick), R.attr({ rel: f + 1 }), 0 !== w && R.attr({ "transform-origin": "".concat(Y, " ").concat(F), transform: "rotate(".concat(w, " 0 0)") }), b.add(R) } var D = 0; !this.initialAnim || e.globals.resized || e.globals.dataChanged || (D = e.config.chart.animations.speed), e.globals.dataChanged && (D = e.config.chart.animations.dynamicAnimation.speed), this.animDur = D / (1.2 * t.series.length) + this.animDur, this.animBeginArr.push(this.animDur), this.animatePaths(M, { centerX: t.centerX, centerY: t.centerY, endAngle: S, startAngle: w, prevEndAngle: C, prevStartAngle: k, size: t.size, i: f, totalItems: 2, animBeginArr: this.animBeginArr, dur: D, shouldSetPrevPaths: !0, easing: e.globals.easing }) } return { g: r, elHollow: c, dataLabels: u } } }, { key: "drawHollow", value: function (t) { var e = new m(this.ctx).drawCircle(2 * t.size); return e.attr({ class: "apexcharts-radialbar-hollow", cx: t.centerX, cy: t.centerY, r: t.size, fill: t.fill }), e } }, { key: "drawHollowImage", value: function (t, e, i, a) { var s = this.w, r = new H(this.ctx), o = x.randomId(), n = s.config.plotOptions.radialBar.hollow.image; if (s.config.plotOptions.radialBar.hollow.imageClipped) r.clippedImgArea({ width: i, height: i, image: n, patternID: "pattern".concat(s.globals.cuid).concat(o) }), a = "url(#pattern".concat(s.globals.cuid).concat(o, ")"); else { var l = s.config.plotOptions.radialBar.hollow.imageWidth, h = s.config.plotOptions.radialBar.hollow.imageHeight; if (void 0 === l && void 0 === h) { var c = s.globals.dom.Paper.image(n).loaded((function (e) { this.move(t.centerX - e.width / 2 + s.config.plotOptions.radialBar.hollow.imageOffsetX, t.centerY - e.height / 2 + s.config.plotOptions.radialBar.hollow.imageOffsetY) })); e.add(c) } else { var d = s.globals.dom.Paper.image(n).loaded((function (e) { this.move(t.centerX - l / 2 + s.config.plotOptions.radialBar.hollow.imageOffsetX, t.centerY - h / 2 + s.config.plotOptions.radialBar.hollow.imageOffsetY), this.size(l, h) })); e.add(d) } } return a } }, { key: "getStrokeWidth", value: function (t) { var e = this.w; return t.size * (100 - parseInt(e.config.plotOptions.radialBar.hollow.size, 10)) / 100 / (t.series.length + 1) - this.margin } }, { key: "onBarLabelClick", value: function (t) { var e = parseInt(t.target.getAttribute("rel"), 10) - 1, i = this.barLabels.onClick, a = this.w; i && i(a.globals.seriesNames[e], { w: a, seriesIndex: e }) } }]), i }(Lt), It = function (t) { n(s, t); var i = d(s); function s() { return a(this, s), i.apply(this, arguments) } return r(s, [{ key: "draw", value: function (t, i) { var a = this.w, s = new m(this.ctx); this.rangeBarOptions = this.w.config.plotOptions.rangeBar, this.series = t, this.seriesRangeStart = a.globals.seriesRangeStart, this.seriesRangeEnd = a.globals.seriesRangeEnd, this.barHelpers.initVariables(t); for (var r = s.group({ class: "apexcharts-rangebar-series apexcharts-plot-series" }), n = 0; n < t.length; n++) { var l, h, c, d, g = void 0, u = void 0, p = a.globals.comboCharts ? i[n] : n, f = this.barHelpers.getGroupIndex(p).columnGroupIndex, b = s.group({ class: "apexcharts-series", seriesName: x.escapeString(a.globals.seriesNames[p]), rel: n + 1, "data:realIndex": p }); this.ctx.series.addCollapsedClassToSeries(b, p), t[n].length > 0 && (this.visibleI = this.visibleI + 1); var v = 0, y = 0, w = 0; this.yRatio.length > 1 && (this.yaxisIndex = a.globals.seriesYAxisReverseMap[p][0], w = p); var k = this.barHelpers.initialPositions(); u = k.y, d = k.zeroW, g = k.x, y = k.barWidth, v = k.barHeight, l = k.xDivision, h = k.yDivision, c = k.zeroH; for (var A = s.group({ class: "apexcharts-datalabels", "data:realIndex": p }), S = s.group({ class: "apexcharts-rangebar-goals-markers" }), C = 0; C < a.globals.dataPoints; C++) { var L, P = this.barHelpers.getStrokeWidth(n, C, p), M = this.seriesRangeStart[n][C], I = this.seriesRangeEnd[n][C], T = null, z = null, X = null, E = { x: g, y: u, strokeWidth: P, elSeries: b }, Y = this.seriesLen; if (a.config.plotOptions.bar.rangeBarGroupRows && (Y = 1), void 0 === a.config.series[n].data[C]) break; if (this.isHorizontal) { X = u + v * this.visibleI; var F = (h - v * Y) / 2; if (a.config.series[n].data[C].x) { var R = this.detectOverlappingBars({ i: n, j: C, barYPosition: X, srty: F, barHeight: v, yDivision: h, initPositions: k }); v = R.barHeight, X = R.barYPosition } y = (T = this.drawRangeBarPaths(e({ indexes: { i: n, j: C, realIndex: p }, barHeight: v, barYPosition: X, zeroW: d, yDivision: h, y1: M, y2: I }, E))).barWidth } else { a.globals.isXNumeric && (g = (a.globals.seriesX[n][C] - a.globals.minX) / this.xRatio - y / 2), z = g + y * this.visibleI; var H = (l - y * Y) / 2; if (a.config.series[n].data[C].x) { var D = this.detectOverlappingBars({ i: n, j: C, barXPosition: z, srtx: H, barWidth: y, xDivision: l, initPositions: k }); y = D.barWidth, z = D.barXPosition } v = (T = this.drawRangeColumnPaths(e({ indexes: { i: n, j: C, realIndex: p, translationsIndex: w }, barWidth: y, barXPosition: z, zeroH: c, xDivision: l }, E))).barHeight } var O = this.barHelpers.drawGoalLine({ barXPosition: T.barXPosition, barYPosition: X, goalX: T.goalX, goalY: T.goalY, barHeight: v, barWidth: y }); O && S.add(O), u = T.y, g = T.x; var N = this.barHelpers.getPathFillColor(t, n, C, p), W = a.globals.stroke.colors[p]; this.renderSeries((o(L = { realIndex: p, pathFill: N, lineFill: W, j: C, i: n, x: g, y: u, y1: M, y2: I, pathFrom: T.pathFrom, pathTo: T.pathTo, strokeWidth: P, elSeries: b, series: t, barHeight: v, barWidth: y, barXPosition: z, barYPosition: X }, "barWidth", y), o(L, "columnGroupIndex", f), o(L, "elDataLabelsWrap", A), o(L, "elGoalsMarkers", S), o(L, "visibleSeries", this.visibleI), o(L, "type", "rangebar"), L)) } r.add(b) } return r } }, { key: "detectOverlappingBars", value: function (t) { var e = t.i, i = t.j, a = t.barYPosition, s = t.barXPosition, r = t.srty, o = t.srtx, n = t.barHeight, l = t.barWidth, h = t.yDivision, c = t.xDivision, d = t.initPositions, g = this.w, u = [], p = g.config.series[e].data[i].rangeName, f = g.config.series[e].data[i].x, x = Array.isArray(f) ? f.join(" ") : f, b = g.globals.labels.map((function (t) { return Array.isArray(t) ? t.join(" ") : t })).indexOf(x), v = g.globals.seriesRange[e].findIndex((function (t) { return t.x === x && t.overlaps.length > 0 })); return this.isHorizontal ? (a = g.config.plotOptions.bar.rangeBarGroupRows ? r + h * b : r + n * this.visibleI + h * b, v > -1 && !g.config.plotOptions.bar.rangeBarOverlap && (u = g.globals.seriesRange[e][v].overlaps).indexOf(p) > -1 && (a = (n = d.barHeight / u.length) * this.visibleI + h * (100 - parseInt(this.barOptions.barHeight, 10)) / 100 / 2 + n * (this.visibleI + u.indexOf(p)) + h * b)) : (b > -1 && !g.globals.timescaleLabels.length && (s = g.config.plotOptions.bar.rangeBarGroupRows ? o + c * b : o + l * this.visibleI + c * b), v > -1 && !g.config.plotOptions.bar.rangeBarOverlap && (u = g.globals.seriesRange[e][v].overlaps).indexOf(p) > -1 && (s = (l = d.barWidth / u.length) * this.visibleI + c * (100 - parseInt(this.barOptions.barWidth, 10)) / 100 / 2 + l * (this.visibleI + u.indexOf(p)) + c * b)), { barYPosition: a, barXPosition: s, barHeight: n, barWidth: l } } }, { key: "drawRangeColumnPaths", value: function (t) { var e = t.indexes, i = t.x, a = t.xDivision, s = t.barWidth, r = t.barXPosition, o = t.zeroH, n = this.w, l = e.i, h = e.j, c = e.realIndex, d = e.translationsIndex, g = this.yRatio[d], u = this.getRangeValue(c, h), p = Math.min(u.start, u.end), f = Math.max(u.start, u.end); void 0 === this.series[l][h] || null === this.series[l][h] ? p = o : (p = o - p / g, f = o - f / g); var x = Math.abs(f - p), b = this.barHelpers.getColumnPaths({ barXPosition: r, barWidth: s, y1: p, y2: f, strokeWidth: this.strokeWidth, series: this.seriesRangeEnd, realIndex: c, i: c, j: h, w: n }); if (n.globals.isXNumeric) { var v = this.getBarXForNumericXAxis({ x: i, j: h, realIndex: c, barWidth: s }); i = v.x, r = v.barXPosition } else i += a; return { pathTo: b.pathTo, pathFrom: b.pathFrom, barHeight: x, x: i, y: u.start < 0 && u.end < 0 ? p : f, goalY: this.barHelpers.getGoalValues("y", null, o, l, h, d), barXPosition: r } } }, { key: "drawRangeBarPaths", value: function (t) { var e = t.indexes, i = t.y, a = t.y1, s = t.y2, r = t.yDivision, o = t.barHeight, n = t.barYPosition, l = t.zeroW, h = this.w, c = e.realIndex, d = e.j, g = l + a / this.invertedYRatio, u = l + s / this.invertedYRatio, p = this.getRangeValue(c, d), f = Math.abs(u - g), x = this.barHelpers.getBarpaths({ barYPosition: n, barHeight: o, x1: g, x2: u, strokeWidth: this.strokeWidth, series: this.seriesRangeEnd, i: c, realIndex: c, j: d, w: h }); return h.globals.isXNumeric || (i += r), { pathTo: x.pathTo, pathFrom: x.pathFrom, barWidth: f, x: p.start < 0 && p.end < 0 ? g : u, goalX: this.barHelpers.getGoalValues("x", l, null, c, d), y: i } } }, { key: "getRangeValue", value: function (t, e) { var i = this.w; return { start: i.globals.seriesRangeStart[t][e], end: i.globals.seriesRangeEnd[t][e] } } }]), s }(yt), Tt = function () { function t(e) { a(this, t), this.w = e.w, this.lineCtx = e } return r(t, [{ key: "sameValueSeriesFix", value: function (t, e) { var i = this.w; if (("gradient" === i.config.fill.type || "gradient" === i.config.fill.type[t]) && new y(this.lineCtx.ctx, i).seriesHaveSameValues(t)) { var a = e[t].slice(); a[a.length - 1] = a[a.length - 1] + 1e-6, e[t] = a } return e } }, { key: "calculatePoints", value: function (t) { var e = t.series, i = t.realIndex, a = t.x, s = t.y, r = t.i, o = t.j, n = t.prevY, l = this.w, h = [], c = []; if (0 === o) { var d = this.lineCtx.categoryAxisCorrection + l.config.markers.offsetX; l.globals.isXNumeric && (d = (l.globals.seriesX[i][0] - l.globals.minX) / this.lineCtx.xRatio + l.config.markers.offsetX), h.push(d), c.push(x.isNumber(e[r][0]) ? n + l.config.markers.offsetY : null), h.push(a + l.config.markers.offsetX), c.push(x.isNumber(e[r][o + 1]) ? s + l.config.markers.offsetY : null) } else h.push(a + l.config.markers.offsetX), c.push(x.isNumber(e[r][o + 1]) ? s + l.config.markers.offsetY : null); return { x: h, y: c } } }, { key: "checkPreviousPaths", value: function (t) { for (var e = t.pathFromLine, i = t.pathFromArea, a = t.realIndex, s = this.w, r = 0; r < s.globals.previousPaths.length; r++) { var o = s.globals.previousPaths[r]; ("line" === o.type || "area" === o.type) && o.paths.length > 0 && parseInt(o.realIndex, 10) === parseInt(a, 10) && ("line" === o.type ? (this.lineCtx.appendPathFrom = !1, e = s.globals.previousPaths[r].paths[0].d) : "area" === o.type && (this.lineCtx.appendPathFrom = !1, i = s.globals.previousPaths[r].paths[0].d, s.config.stroke.show && s.globals.previousPaths[r].paths[1] && (e = s.globals.previousPaths[r].paths[1].d))) } return { pathFromLine: e, pathFromArea: i } } }, { key: "determineFirstPrevY", value: function (t) { var e, i, a, s = t.i, r = t.realIndex, o = t.series, n = t.prevY, l = t.lineYPosition, h = t.translationsIndex, c = this.w, d = c.config.chart.stacked && !c.globals.comboCharts || c.config.chart.stacked && c.globals.comboCharts && (!this.w.config.chart.stackOnlyBar || "bar" === (null === (e = this.w.config.series[r]) || void 0 === e ? void 0 : e.type) || "column" === (null === (i = this.w.config.series[r]) || void 0 === i ? void 0 : i.type)); if (void 0 !== (null === (a = o[s]) || void 0 === a ? void 0 : a[0])) n = (l = d && s > 0 ? this.lineCtx.prevSeriesY[s - 1][0] : this.lineCtx.zeroY) - o[s][0] / this.lineCtx.yRatio[h] + 2 * (this.lineCtx.isReversed ? o[s][0] / this.lineCtx.yRatio[h] : 0); else if (d && s > 0 && void 0 === o[s][0]) for (var g = s - 1; g >= 0; g--)if (null !== o[g][0] && void 0 !== o[g][0]) { n = l = this.lineCtx.prevSeriesY[g][0]; break } return { prevY: n, lineYPosition: l } } }]), t }(), zt = function (t) { for (var e, i, a, s, r = function (t) { for (var e = [], i = t[0], a = t[1], s = e[0] = Yt(i, a), r = 1, o = t.length - 1; r < o; r++)i = a, a = t[r + 1], e[r] = .5 * (s + (s = Yt(i, a))); return e[r] = s, e }(t), o = t.length - 1, n = [], l = 0; l < o; l++)a = Yt(t[l], t[l + 1]), Math.abs(a) < 1e-6 ? r[l] = r[l + 1] = 0 : (s = (e = r[l] / a) * e + (i = r[l + 1] / a) * i) > 9 && (s = 3 * a / Math.sqrt(s), r[l] = s * e, r[l + 1] = s * i); for (var h = 0; h <= o; h++)s = (t[Math.min(o, h + 1)][0] - t[Math.max(0, h - 1)][0]) / (6 * (1 + r[h] * r[h])), n.push([s || 0, r[h] * s || 0]); return n }, Xt = function (t) { var e = zt(t), i = t[1], a = t[0], s = [], r = e[1], o = e[0]; s.push(a, [a[0] + o[0], a[1] + o[1], i[0] - r[0], i[1] - r[1], i[0], i[1]]); for (var n = 2, l = e.length; n < l; n++) { var h = t[n], c = e[n]; s.push([h[0] - c[0], h[1] - c[1], h[0], h[1]]) } return s }, Et = function (t, e, i) { var a = t.slice(e, i); if (e) { if (i - e > 1 && a[1].length < 6) { var s = a[0].length; a[1] = [2 * a[0][s - 2] - a[0][s - 4], 2 * a[0][s - 1] - a[0][s - 3]].concat(a[1]) } a[0] = a[0].slice(-2) } return a }; function Yt(t, e) { return (e[1] - t[1]) / (e[0] - t[0]) } var Ft = function () { function t(e, i, s) { a(this, t), this.ctx = e, this.w = e.w, this.xyRatios = i, this.pointsChart = !("bubble" !== this.w.config.chart.type && "scatter" !== this.w.config.chart.type) || s, this.scatter = new O(this.ctx), this.noNegatives = this.w.globals.minX === Number.MAX_VALUE, this.lineHelpers = new Tt(this), this.markers = new D(this.ctx), this.prevSeriesY = [], this.categoryAxisCorrection = 0, this.yaxisIndex = 0 } return r(t, [{ key: "draw", value: function (t, i, a, s) { var r, o = this.w, n = new m(this.ctx), l = o.globals.comboCharts ? i : o.config.chart.type, h = n.group({ class: "apexcharts-".concat(l, "-series apexcharts-plot-series") }), c = new y(this.ctx, o); this.yRatio = this.xyRatios.yRatio, this.zRatio = this.xyRatios.zRatio, this.xRatio = this.xyRatios.xRatio, this.baseLineY = this.xyRatios.baseLineY, t = c.getLogSeries(t), this.yRatio = c.getLogYRatios(this.yRatio), this.prevSeriesY = []; for (var d = [], g = 0; g < t.length; g++) { t = this.lineHelpers.sameValueSeriesFix(g, t); var u = o.globals.comboCharts ? a[g] : g, p = this.yRatio.length > 1 ? u : 0; this._initSerieVariables(t, g, u); var f = [], x = [], b = [], v = o.globals.padHorizontal + this.categoryAxisCorrection; this.ctx.series.addCollapsedClassToSeries(this.elSeries, u), o.globals.isXNumeric && o.globals.seriesX.length > 0 && (v = (o.globals.seriesX[u][0] - o.globals.minX) / this.xRatio), b.push(v); var w, k = v, A = void 0, S = k, C = this.zeroY, L = this.zeroY; C = this.lineHelpers.determineFirstPrevY({ i: g, realIndex: u, series: t, prevY: C, lineYPosition: 0, translationsIndex: p }).prevY, "monotoneCubic" === o.config.stroke.curve && null === t[g][0] ? f.push(null) : f.push(C), w = C; "rangeArea" === l && (A = L = this.lineHelpers.determineFirstPrevY({ i: g, realIndex: u, series: s, prevY: L, lineYPosition: 0, translationsIndex: p }).prevY, x.push(null !== f[0] ? L : null)); var P = this._calculatePathsFrom({ type: l, series: t, i: g, realIndex: u, translationsIndex: p, prevX: S, prevY: C, prevY2: L }), M = [f[0]], I = [x[0]], T = { type: l, series: t, realIndex: u, translationsIndex: p, i: g, x: v, y: 1, pX: k, pY: w, pathsFrom: P, linePaths: [], areaPaths: [], seriesIndex: a, lineYPosition: 0, xArrj: b, yArrj: f, y2Arrj: x, seriesRangeEnd: s }, z = this._iterateOverDataPoints(e(e({}, T), {}, { iterations: "rangeArea" === l ? t[g].length - 1 : void 0, isRangeStart: !0 })); if ("rangeArea" === l) { for (var X = this._calculatePathsFrom({ series: s, i: g, realIndex: u, prevX: S, prevY: L }), E = this._iterateOverDataPoints(e(e({}, T), {}, { series: s, xArrj: [v], yArrj: M, y2Arrj: I, pY: A, areaPaths: z.areaPaths, pathsFrom: X, iterations: s[g].length - 1, isRangeStart: !1 })), Y = z.linePaths.length / 2, F = 0; F < Y; F++)z.linePaths[F] = E.linePaths[F + Y] + z.linePaths[F]; z.linePaths.splice(Y), z.pathFromLine = E.pathFromLine + z.pathFromLine } else z.pathFromArea += n.line(0, this.zeroY); this._handlePaths({ type: l, realIndex: u, i: g, paths: z }), this.elSeries.add(this.elPointsMain), this.elSeries.add(this.elDataLabelsWrap), d.push(this.elSeries) } if (void 0 !== (null === (r = o.config.series[0]) || void 0 === r ? void 0 : r.zIndex) && d.sort((function (t, e) { return Number(t.node.getAttribute("zIndex")) - Number(e.node.getAttribute("zIndex")) })), o.config.chart.stacked) for (var R = d.length - 1; R >= 0; R--)h.add(d[R]); else for (var H = 0; H < d.length; H++)h.add(d[H]); return h } }, { key: "_initSerieVariables", value: function (t, e, i) { var a = this.w, s = new m(this.ctx); this.xDivision = a.globals.gridWidth / (a.globals.dataPoints - ("on" === a.config.xaxis.tickPlacement ? 1 : 0)), this.strokeWidth = Array.isArray(a.config.stroke.width) ? a.config.stroke.width[i] : a.config.stroke.width; var r = 0; this.yRatio.length > 1 && (this.yaxisIndex = a.globals.seriesYAxisReverseMap[i], r = i), this.isReversed = a.config.yaxis[this.yaxisIndex] && a.config.yaxis[this.yaxisIndex].reversed, this.zeroY = a.globals.gridHeight - this.baseLineY[r] - (this.isReversed ? a.globals.gridHeight : 0) + (this.isReversed ? 2 * this.baseLineY[r] : 0), this.areaBottomY = this.zeroY, (this.zeroY > a.globals.gridHeight || "end" === a.config.plotOptions.area.fillTo) && (this.areaBottomY = a.globals.gridHeight), this.categoryAxisCorrection = this.xDivision / 2, this.elSeries = s.group({ class: "apexcharts-series", zIndex: void 0 !== a.config.series[i].zIndex ? a.config.series[i].zIndex : i, seriesName: x.escapeString(a.globals.seriesNames[i]) }), this.elPointsMain = s.group({ class: "apexcharts-series-markers-wrap", "data:realIndex": i }), this.elDataLabelsWrap = s.group({ class: "apexcharts-datalabels", "data:realIndex": i }); var o = t[e].length === a.globals.dataPoints; this.elSeries.attr({ "data:longestSeries": o, rel: e + 1, "data:realIndex": i }), this.appendPathFrom = !0 } }, { key: "_calculatePathsFrom", value: function (t) { var e, i, a, s, r = t.type, o = t.series, n = t.i, l = t.realIndex, h = t.translationsIndex, c = t.prevX, d = t.prevY, g = t.prevY2, u = this.w, p = new m(this.ctx); if (null === o[n][0]) { for (var f = 0; f < o[n].length; f++)if (null !== o[n][f]) { c = this.xDivision * f, d = this.zeroY - o[n][f] / this.yRatio[h], e = p.move(c, d), i = p.move(c, this.areaBottomY); break } } else e = p.move(c, d), "rangeArea" === r && (e = p.move(c, g) + p.line(c, d)), i = p.move(c, this.areaBottomY) + p.line(c, d); if (a = p.move(0, this.zeroY) + p.line(0, this.zeroY), s = p.move(0, this.zeroY) + p.line(0, this.zeroY), u.globals.previousPaths.length > 0) { var x = this.lineHelpers.checkPreviousPaths({ pathFromLine: a, pathFromArea: s, realIndex: l }); a = x.pathFromLine, s = x.pathFromArea } return { prevX: c, prevY: d, linePath: e, areaPath: i, pathFromLine: a, pathFromArea: s } } }, { key: "_handlePaths", value: function (t) { var i = t.type, a = t.realIndex, s = t.i, r = t.paths, o = this.w, n = new m(this.ctx), l = new H(this.ctx); this.prevSeriesY.push(r.yArrj), o.globals.seriesXvalues[a] = r.xArrj, o.globals.seriesYvalues[a] = r.yArrj; var h = o.config.forecastDataPoints; if (h.count > 0 && "rangeArea" !== i) { var c = o.globals.seriesXvalues[a][o.globals.seriesXvalues[a].length - h.count - 1], d = n.drawRect(c, 0, o.globals.gridWidth, o.globals.gridHeight, 0); o.globals.dom.elForecastMask.appendChild(d.node); var g = n.drawRect(0, 0, c, o.globals.gridHeight, 0); o.globals.dom.elNonForecastMask.appendChild(g.node) } this.pointsChart || o.globals.delayedElements.push({ el: this.elPointsMain.node, index: a }); var u = { i: s, realIndex: a, animationDelay: s, initialSpeed: o.config.chart.animations.speed, dataChangeSpeed: o.config.chart.animations.dynamicAnimation.speed, className: "apexcharts-".concat(i) }; if ("area" === i) for (var p = l.fillPath({ seriesNumber: a }), f = 0; f < r.areaPaths.length; f++) { var x = n.renderPaths(e(e({}, u), {}, { pathFrom: r.pathFromArea, pathTo: r.areaPaths[f], stroke: "none", strokeWidth: 0, strokeLineCap: null, fill: p })); this.elSeries.add(x) } if (o.config.stroke.show && !this.pointsChart) { var b = null; if ("line" === i) b = l.fillPath({ seriesNumber: a, i: s }); else if ("solid" === o.config.stroke.fill.type) b = o.globals.stroke.colors[a]; else { var v = o.config.fill; o.config.fill = o.config.stroke.fill, b = l.fillPath({ seriesNumber: a, i: s }), o.config.fill = v } for (var y = 0; y < r.linePaths.length; y++) { var w = b; "rangeArea" === i && (w = l.fillPath({ seriesNumber: a })); var k = e(e({}, u), {}, { pathFrom: r.pathFromLine, pathTo: r.linePaths[y], stroke: b, strokeWidth: this.strokeWidth, strokeLineCap: o.config.stroke.lineCap, fill: "rangeArea" === i ? w : "none" }), A = n.renderPaths(k); if (this.elSeries.add(A), A.attr("fill-rule", "evenodd"), h.count > 0 && "rangeArea" !== i) { var S = n.renderPaths(k); S.node.setAttribute("stroke-dasharray", h.dashArray), h.strokeWidth && S.node.setAttribute("stroke-width", h.strokeWidth), this.elSeries.add(S), S.attr("clip-path", "url(#forecastMask".concat(o.globals.cuid, ")")), A.attr("clip-path", "url(#nonForecastMask".concat(o.globals.cuid, ")")) } } } } }, { key: "_iterateOverDataPoints", value: function (t) { var e, i, a = this, s = t.type, r = t.series, o = t.iterations, n = t.realIndex, l = t.translationsIndex, h = t.i, c = t.x, d = t.y, g = t.pX, u = t.pY, p = t.pathsFrom, f = t.linePaths, b = t.areaPaths, v = t.seriesIndex, y = t.lineYPosition, w = t.xArrj, k = t.yArrj, A = t.y2Arrj, S = t.isRangeStart, C = t.seriesRangeEnd, L = this.w, P = new m(this.ctx), M = this.yRatio, I = p.prevY, T = p.linePath, z = p.areaPath, X = p.pathFromLine, E = p.pathFromArea, Y = x.isNumber(L.globals.minYArr[n]) ? L.globals.minYArr[n] : L.globals.minY; o || (o = L.globals.dataPoints > 1 ? L.globals.dataPoints - 1 : L.globals.dataPoints); var F = function (t, e) { return e - t / M[l] + 2 * (a.isReversed ? t / M[l] : 0) }, R = d, H = L.config.chart.stacked && !L.globals.comboCharts || L.config.chart.stacked && L.globals.comboCharts && (!this.w.config.chart.stackOnlyBar || "bar" === (null === (e = this.w.config.series[n]) || void 0 === e ? void 0 : e.type) || "column" === (null === (i = this.w.config.series[n]) || void 0 === i ? void 0 : i.type)), D = L.config.stroke.curve; Array.isArray(D) && (D = Array.isArray(v) ? D[v[h]] : D[h]); for (var O, N = 0, W = 0; W < o; W++) { var B = void 0 === r[h][W + 1] || null === r[h][W + 1]; if (L.globals.isXNumeric) { var G = L.globals.seriesX[n][W + 1]; void 0 === L.globals.seriesX[n][W + 1] && (G = L.globals.seriesX[n][o - 1]), c = (G - L.globals.minX) / this.xRatio } else c += this.xDivision; if (H) if (h > 0 && L.globals.collapsedSeries.length < L.config.series.length - 1) { y = this.prevSeriesY[function (t) { for (var e = t; e > 0; e--) { if (!(L.globals.collapsedSeriesIndices.indexOf((null == v ? void 0 : v[e]) || e) > -1)) return e; e-- } return 0 }(h - 1)][W + 1] } else y = this.zeroY; else y = this.zeroY; B ? d = F(Y, y) : (d = F(r[h][W + 1], y), "rangeArea" === s && (R = F(C[h][W + 1], y))), w.push(c), !B || "smooth" !== L.config.stroke.curve && "monotoneCubic" !== L.config.stroke.curve ? (k.push(d), A.push(R)) : (k.push(null), A.push(null)); var V = this.lineHelpers.calculatePoints({ series: r, x: c, y: d, realIndex: n, i: h, j: W, prevY: I }), j = this._createPaths({ type: s, series: r, i: h, realIndex: n, j: W, x: c, y: d, y2: R, xArrj: w, yArrj: k, y2Arrj: A, pX: g, pY: u, pathState: N, segmentStartX: O, linePath: T, areaPath: z, linePaths: f, areaPaths: b, curve: D, isRangeStart: S }); b = j.areaPaths, f = j.linePaths, g = j.pX, u = j.pY, N = j.pathState, O = j.segmentStartX, z = j.areaPath, T = j.linePath, !this.appendPathFrom || "monotoneCubic" === D && "rangeArea" === s || (X += P.line(c, this.zeroY), E += P.line(c, this.zeroY)), this.handleNullDataPoints(r, V, h, W, n), this._handleMarkersAndLabels({ type: s, pointsPos: V, i: h, j: W, realIndex: n, isRangeStart: S }) } return { yArrj: k, xArrj: w, pathFromArea: E, areaPaths: b, pathFromLine: X, linePaths: f, linePath: T, areaPath: z } } }, { key: "_handleMarkersAndLabels", value: function (t) { var e = t.type, i = t.pointsPos, a = t.isRangeStart, s = t.i, r = t.j, o = t.realIndex, n = this.w, l = new N(this.ctx); if (this.pointsChart) this.scatter.draw(this.elSeries, r, { realIndex: o, pointsPos: i, zRatio: this.zRatio, elParent: this.elPointsMain }); else { n.globals.series[s].length > 1 && this.elPointsMain.node.classList.add("apexcharts-element-hidden"); var h = this.markers.plotChartMarkers(i, o, r + 1); null !== h && this.elPointsMain.add(h) } var c = l.drawDataLabel({ type: e, isRangeStart: a, pos: i, i: o, j: r + 1 }); null !== c && this.elDataLabelsWrap.add(c) } }, { key: "_createPaths", value: function (t) { var e = t.type, i = t.series, a = t.i; t.realIndex; var s = t.j, r = t.x, o = t.y, n = t.xArrj, l = t.yArrj, h = t.y2, c = t.y2Arrj, d = t.pX, g = t.pY, u = t.pathState, p = t.segmentStartX, f = t.linePath, x = t.areaPath, b = t.linePaths, v = t.areaPaths, y = t.curve, w = t.isRangeStart; this.w; var k, A = new m(this.ctx), S = this.areaBottomY, C = "rangeArea" === e, L = "rangeArea" === e && w; switch (y) { case "monotoneCubic": var P = w ? l : c; switch (u) { case 0: if (null === P[s + 1]) break; u = 1; case 1: if (!(C ? n.length === i[a].length : s === i[a].length - 2)) break; case 2: var M = w ? n : n.slice().reverse(), I = w ? P : P.slice().reverse(), T = (k = I, M.map((function (t, e) { return [t, k[e]] })).filter((function (t) { return null !== t[1] }))), z = T.length > 1 ? Xt(T) : T, X = []; C && (L ? v = T : X = v.reverse()); var E = 0, Y = 0; if (function (t, e) { for (var i = function (t) { var e = [], i = 0; return t.forEach((function (t) { null !== t ? i++ : i > 0 && (e.push(i), i = 0) })), i > 0 && e.push(i), e }(t), a = [], s = 0, r = 0; s < i.length; r += i[s++])a[s] = Et(e, r, r + i[s]); return a }(I, z).forEach((function (t) { E++; var e = function (t) { for (var e = "", i = 0; i < t.length; i++) { var a = t[i], s = a.length; s > 4 ? (e += "C".concat(a[0], ", ").concat(a[1]), e += ", ".concat(a[2], ", ").concat(a[3]), e += ", ".concat(a[4], ", ").concat(a[5])) : s > 2 && (e += "S".concat(a[0], ", ").concat(a[1]), e += ", ".concat(a[2], ", ").concat(a[3])) } return e }(t), i = Y, a = (Y += t.length) - 1; L ? f = A.move(T[i][0], T[i][1]) + e : C ? f = A.move(X[i][0], X[i][1]) + A.line(T[i][0], T[i][1]) + e + A.line(X[a][0], X[a][1]) : (f = A.move(T[i][0], T[i][1]) + e, x = f + A.line(T[a][0], S) + A.line(T[i][0], S) + "z", v.push(x)), b.push(f) })), C && E > 1 && !L) { var F = b.slice(E).reverse(); b.splice(E), F.forEach((function (t) { return b.push(t) })) } u = 0 }break; case "smooth": var R = .35 * (r - d); if (null === i[a][s]) u = 0; else switch (u) { case 0: if (p = d, f = L ? A.move(d, c[s]) + A.line(d, g) : A.move(d, g), x = A.move(d, g), u = 1, s < i[a].length - 2) { var H = A.curve(d + R, g, r - R, o, r, o); f += H, x += H; break } case 1: if (null === i[a][s + 1]) f += L ? A.line(d, h) : A.move(d, g), x += A.line(d, S) + A.line(p, S) + "z", b.push(f), v.push(x); else { var D = A.curve(d + R, g, r - R, o, r, o); f += D, x += D, s >= i[a].length - 2 && (L && (f += A.curve(r, o, r, o, r, h) + A.move(r, h)), x += A.curve(r, o, r, o, r, S) + A.line(p, S) + "z", b.push(f), v.push(x)) } }d = r, g = o; break; default: var O = function (t, e, i) { var a = []; switch (t) { case "stepline": a = A.line(e, null, "H") + A.line(null, i, "V"); break; case "linestep": a = A.line(null, i, "V") + A.line(e, null, "H"); break; case "straight": a = A.line(e, i) }return a }; if (null === i[a][s]) u = 0; else switch (u) { case 0: if (p = d, f = L ? A.move(d, c[s]) + A.line(d, g) : A.move(d, g), x = A.move(d, g), u = 1, s < i[a].length - 2) { var N = O(y, r, o); f += N, x += N; break } case 1: if (null === i[a][s + 1]) f += L ? A.line(d, h) : A.move(d, g), x += A.line(d, S) + A.line(p, S) + "z", b.push(f), v.push(x); else { var W = O(y, r, o); f += W, x += W, s >= i[a].length - 2 && (L && (f += A.line(r, h)), x += A.line(r, S) + A.line(p, S) + "z", b.push(f), v.push(x)) } }d = r, g = o }return { linePaths: b, areaPaths: v, pX: d, pY: g, pathState: u, segmentStartX: p, linePath: f, areaPath: x } } }, { key: "handleNullDataPoints", value: function (t, e, i, a, s) { var r = this.w; if (null === t[i][a] && r.config.markers.showNullDataPoints || 1 === t[i].length) { var o = this.strokeWidth - r.config.markers.strokeWidth / 2; o > 0 || (o = 0); var n = this.markers.plotChartMarkers(e, s, a + 1, o, !0); null !== n && this.elPointsMain.add(n) } } }]), t }(); window.TreemapSquared = {}, window.TreemapSquared.generate = function () { function t(e, i, a, s) { this.xoffset = e, this.yoffset = i, this.height = s, this.width = a, this.shortestEdge = function () { return Math.min(this.height, this.width) }, this.getCoordinates = function (t) { var e, i = [], a = this.xoffset, s = this.yoffset, o = r(t) / this.height, n = r(t) / this.width; if (this.width >= this.height) for (e = 0; e < t.length; e++)i.push([a, s, a + o, s + t[e] / o]), s += t[e] / o; else for (e = 0; e < t.length; e++)i.push([a, s, a + t[e] / n, s + n]), a += t[e] / n; return i }, this.cutArea = function (e) { var i; if (this.width >= this.height) { var a = e / this.height, s = this.width - a; i = new t(this.xoffset + a, this.yoffset, s, this.height) } else { var r = e / this.width, o = this.height - r; i = new t(this.xoffset, this.yoffset + r, this.width, o) } return i } } function e(e, a, s, o, n) { o = void 0 === o ? 0 : o, n = void 0 === n ? 0 : n; var l = i(function (t, e) { var i, a = [], s = e / r(t); for (i = 0; i < t.length; i++)a[i] = t[i] * s; return a }(e, a * s), [], new t(o, n, a, s), []); return function (t) { var e, i, a = []; for (e = 0; e < t.length; e++)for (i = 0; i < t[e].length; i++)a.push(t[e][i]); return a }(l) } function i(t, e, s, o) { var n, l, h; if (0 !== t.length) return n = s.shortestEdge(), function (t, e, i) { var s; if (0 === t.length) return !0; (s = t.slice()).push(e); var r = a(t, i), o = a(s, i); return r >= o }(e, l = t[0], n) ? (e.push(l), i(t.slice(1), e, s, o)) : (h = s.cutArea(r(e), o), o.push(s.getCoordinates(e)), i(t, [], h, o)), o; o.push(s.getCoordinates(e)) } function a(t, e) { var i = Math.min.apply(Math, t), a = Math.max.apply(Math, t), s = r(t); return Math.max(Math.pow(e, 2) * a / Math.pow(s, 2), Math.pow(s, 2) / (Math.pow(e, 2) * i)) } function s(t) { return t && t.constructor === Array } function r(t) { var e, i = 0; for (e = 0; e < t.length; e++)i += t[e]; return i } function o(t) { var e, i = 0; if (s(t[0])) for (e = 0; e < t.length; e++)i += o(t[e]); else i = r(t); return i } return function t(i, a, r, n, l) { n = void 0 === n ? 0 : n, l = void 0 === l ? 0 : l; var h, c, d = [], g = []; if (s(i[0])) { for (c = 0; c < i.length; c++)d[c] = o(i[c]); for (h = e(d, a, r, n, l), c = 0; c < i.length; c++)g.push(t(i[c], h[c][2] - h[c][0], h[c][3] - h[c][1], h[c][0], h[c][1])) } else g = e(i, a, r, n, l); return g } }(); var Rt, Ht, Dt = function () { function t(e, i) { a(this, t), this.ctx = e, this.w = e.w, this.strokeWidth = this.w.config.stroke.width, this.helpers = new At(e), this.dynamicAnim = this.w.config.chart.animations.dynamicAnimation, this.labels = [] } return r(t, [{ key: "draw", value: function (t) { var e = this, i = this.w, a = new m(this.ctx), s = new H(this.ctx), r = a.group({ class: "apexcharts-treemap" }); if (i.globals.noData) return r; var o = []; return t.forEach((function (t) { var e = t.map((function (t) { return Math.abs(t) })); o.push(e) })), this.negRange = this.helpers.checkColorRange(), i.config.series.forEach((function (t, i) { t.data.forEach((function (t) { Array.isArray(e.labels[i]) || (e.labels[i] = []), e.labels[i].push(t.x) })) })), window.TreemapSquared.generate(o, i.globals.gridWidth, i.globals.gridHeight).forEach((function (o, n) { var l = a.group({ class: "apexcharts-series apexcharts-treemap-series", seriesName: x.escapeString(i.globals.seriesNames[n]), rel: n + 1, "data:realIndex": n }); if (i.config.chart.dropShadow.enabled) { var h = i.config.chart.dropShadow; new v(e.ctx).dropShadow(r, h, n) } var c = a.group({ class: "apexcharts-data-labels" }); o.forEach((function (r, o) { var h = r[0], c = r[1], d = r[2], g = r[3], u = a.drawRect(h, c, d - h, g - c, i.config.plotOptions.treemap.borderRadius, "#fff", 1, e.strokeWidth, i.config.plotOptions.treemap.useFillColorAsStroke ? f : i.globals.stroke.colors[n]); u.attr({ cx: h, cy: c, index: n, i: n, j: o, width: d - h, height: g - c }); var p = e.helpers.getShadeColor(i.config.chart.type, n, o, e.negRange), f = p.color; void 0 !== i.config.series[n].data[o] && i.config.series[n].data[o].fillColor && (f = i.config.series[n].data[o].fillColor); var x = s.fillPath({ color: f, seriesNumber: n, dataPointIndex: o }); u.node.classList.add("apexcharts-treemap-rect"), u.attr({ fill: x }), e.helpers.addListeners(u); var b = { x: h + (d - h) / 2, y: c + (g - c) / 2, width: 0, height: 0 }, v = { x: h, y: c, width: d - h, height: g - c }; if (i.config.chart.animations.enabled && !i.globals.dataChanged) { var m = 1; i.globals.resized || (m = i.config.chart.animations.speed), e.animateTreemap(u, b, v, m) } if (i.globals.dataChanged) { var y = 1; e.dynamicAnim.enabled && i.globals.shouldAnimate && (y = e.dynamicAnim.speed, i.globals.previousPaths[n] && i.globals.previousPaths[n][o] && i.globals.previousPaths[n][o].rect && (b = i.globals.previousPaths[n][o].rect), e.animateTreemap(u, b, v, y)) } var w = e.getFontSize(r), k = i.config.dataLabels.formatter(e.labels[n][o], { value: i.globals.series[n][o], seriesIndex: n, dataPointIndex: o, w: i }); "truncate" === i.config.plotOptions.treemap.dataLabels.format && (w = parseInt(i.config.dataLabels.style.fontSize, 10), k = e.truncateLabels(k, w, h, c, d, g)); var A = e.helpers.calculateDataLabels({ text: k, x: (h + d) / 2, y: (c + g) / 2 + e.strokeWidth / 2 + w / 3, i: n, j: o, colorProps: p, fontSize: w, series: t }); i.config.dataLabels.enabled && A && e.rotateToFitLabel(A, w, k, h, c, d, g), l.add(u), null !== A && l.add(A) })), l.add(c), r.add(l) })), r } }, { key: "getFontSize", value: function (t) { var e = this.w; var i, a, s, r, o = function t(e) { var i, a = 0; if (Array.isArray(e[0])) for (i = 0; i < e.length; i++)a += t(e[i]); else for (i = 0; i < e.length; i++)a += e[i].length; return a }(this.labels) / function t(e) { var i, a = 0; if (Array.isArray(e[0])) for (i = 0; i < e.length; i++)a += t(e[i]); else for (i = 0; i < e.length; i++)a += 1; return a }(this.labels); return i = t[2] - t[0], a = t[3] - t[1], s = i * a, r = Math.pow(s, .5), Math.min(r / o, parseInt(e.config.dataLabels.style.fontSize, 10)) } }, { key: "rotateToFitLabel", value: function (t, e, i, a, s, r, o) { var n = new m(this.ctx), l = n.getTextRects(i, e); if (l.width + this.w.config.stroke.width + 5 > r - a && l.width <= o - s) { var h = n.rotateAroundCenter(t.node); t.node.setAttribute("transform", "rotate(-90 ".concat(h.x, " ").concat(h.y, ") translate(").concat(l.height / 3, ")")) } } }, { key: "truncateLabels", value: function (t, e, i, a, s, r) { var o = new m(this.ctx), n = o.getTextRects(t, e).width + this.w.config.stroke.width + 5 > s - i && r - a > s - i ? r - a : s - i, l = o.getTextBasedOnMaxWidth({ text: t, maxWidth: n, fontSize: e }); return t.length !== l.length && n / e < 5 ? "" : l } }, { key: "animateTreemap", value: function (t, e, i, a) { var s = new b(this.ctx); s.animateRect(t, { x: e.x, y: e.y, width: e.width, height: e.height }, { x: i.x, y: i.y, width: i.width, height: i.height }, a, (function () { s.animationCompleted(t) })) } }]), t }(), Ot = 86400, Nt = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w, this.timeScaleArray = [], this.utc = this.w.config.xaxis.labels.datetimeUTC } return r(t, [{ key: "calculateTimeScaleTicks", value: function (t, i) { var a = this, s = this.w; if (s.globals.allSeriesCollapsed) return s.globals.labels = [], s.globals.timescaleLabels = [], []; var r = new A(this.ctx), o = (i - t) / 864e5; this.determineInterval(o), s.globals.disableZoomIn = !1, s.globals.disableZoomOut = !1, o < .00011574074074074075 ? s.globals.disableZoomIn = !0 : o > 5e4 && (s.globals.disableZoomOut = !0); var n = r.getTimeUnitsfromTimestamp(t, i, this.utc), l = s.globals.gridWidth / o, h = l / 24, c = h / 60, d = c / 60, g = Math.floor(24 * o), u = Math.floor(1440 * o), p = Math.floor(o * Ot), f = Math.floor(o), x = Math.floor(o / 30), b = Math.floor(o / 365), v = { minMillisecond: n.minMillisecond, minSecond: n.minSecond, minMinute: n.minMinute, minHour: n.minHour, minDate: n.minDate, minMonth: n.minMonth, minYear: n.minYear }, m = { firstVal: v, currentMillisecond: v.minMillisecond, currentSecond: v.minSecond, currentMinute: v.minMinute, currentHour: v.minHour, currentMonthDate: v.minDate, currentDate: v.minDate, currentMonth: v.minMonth, currentYear: v.minYear, daysWidthOnXAxis: l, hoursWidthOnXAxis: h, minutesWidthOnXAxis: c, secondsWidthOnXAxis: d, numberOfSeconds: p, numberOfMinutes: u, numberOfHours: g, numberOfDays: f, numberOfMonths: x, numberOfYears: b }; switch (this.tickInterval) { case "years": this.generateYearScale(m); break; case "months": case "half_year": this.generateMonthScale(m); break; case "months_days": case "months_fortnight": case "days": case "week_days": this.generateDayScale(m); break; case "hours": this.generateHourScale(m); break; case "minutes_fives": case "minutes": this.generateMinuteScale(m); break; case "seconds_tens": case "seconds_fives": case "seconds": this.generateSecondScale(m) }var y = this.timeScaleArray.map((function (t) { var i = { position: t.position, unit: t.unit, year: t.year, day: t.day ? t.day : 1, hour: t.hour ? t.hour : 0, month: t.month + 1 }; return "month" === t.unit ? e(e({}, i), {}, { day: 1, value: t.value + 1 }) : "day" === t.unit || "hour" === t.unit ? e(e({}, i), {}, { value: t.value }) : "minute" === t.unit ? e(e({}, i), {}, { value: t.value, minute: t.value }) : "second" === t.unit ? e(e({}, i), {}, { value: t.value, minute: t.minute, second: t.second }) : t })); return y.filter((function (t) { var e = 1, i = Math.ceil(s.globals.gridWidth / 120), r = t.value; void 0 !== s.config.xaxis.tickAmount && (i = s.config.xaxis.tickAmount), y.length > i && (e = Math.floor(y.length / i)); var o = !1, n = !1; switch (a.tickInterval) { case "years": "year" === t.unit && (o = !0); break; case "half_year": e = 7, "year" === t.unit && (o = !0); break; case "months": e = 1, "year" === t.unit && (o = !0); break; case "months_fortnight": e = 15, "year" !== t.unit && "month" !== t.unit || (o = !0), 30 === r && (n = !0); break; case "months_days": e = 10, "month" === t.unit && (o = !0), 30 === r && (n = !0); break; case "week_days": e = 8, "month" === t.unit && (o = !0); break; case "days": e = 1, "month" === t.unit && (o = !0); break; case "hours": "day" === t.unit && (o = !0); break; case "minutes_fives": case "seconds_fives": r % 5 != 0 && (n = !0); break; case "seconds_tens": r % 10 != 0 && (n = !0) }if ("hours" === a.tickInterval || "minutes_fives" === a.tickInterval || "seconds_tens" === a.tickInterval || "seconds_fives" === a.tickInterval) { if (!n) return !0 } else if ((r % e == 0 || o) && !n) return !0 })) } }, { key: "recalcDimensionsBasedOnFormat", value: function (t, e) { var i = this.w, a = this.formatDates(t), s = this.removeOverlappingTS(a); i.globals.timescaleLabels = s.slice(), new ot(this.ctx).plotCoords() } }, { key: "determineInterval", value: function (t) { var e = 24 * t, i = 60 * e; switch (!0) { case t / 365 > 5: this.tickInterval = "years"; break; case t > 800: this.tickInterval = "half_year"; break; case t > 180: this.tickInterval = "months"; break; case t > 90: this.tickInterval = "months_fortnight"; break; case t > 60: this.tickInterval = "months_days"; break; case t > 30: this.tickInterval = "week_days"; break; case t > 2: this.tickInterval = "days"; break; case e > 2.4: this.tickInterval = "hours"; break; case i > 15: this.tickInterval = "minutes_fives"; break; case i > 5: this.tickInterval = "minutes"; break; case i > 1: this.tickInterval = "seconds_tens"; break; case 60 * i > 20: this.tickInterval = "seconds_fives"; break; default: this.tickInterval = "seconds" } } }, { key: "generateYearScale", value: function (t) { var e = t.firstVal, i = t.currentMonth, a = t.currentYear, s = t.daysWidthOnXAxis, r = t.numberOfYears, o = e.minYear, n = 0, l = new A(this.ctx), h = "year"; if (e.minDate > 1 || e.minMonth > 0) { var c = l.determineRemainingDaysOfYear(e.minYear, e.minMonth, e.minDate); n = (l.determineDaysOfYear(e.minYear) - c + 1) * s, o = e.minYear + 1, this.timeScaleArray.push({ position: n, value: o, unit: h, year: o, month: x.monthMod(i + 1) }) } else 1 === e.minDate && 0 === e.minMonth && this.timeScaleArray.push({ position: n, value: o, unit: h, year: a, month: x.monthMod(i + 1) }); for (var d = o, g = n, u = 0; u < r; u++)d++, g = l.determineDaysOfYear(d - 1) * s + g, this.timeScaleArray.push({ position: g, value: d, unit: h, year: d, month: 1 }) } }, { key: "generateMonthScale", value: function (t) { var e = t.firstVal, i = t.currentMonthDate, a = t.currentMonth, s = t.currentYear, r = t.daysWidthOnXAxis, o = t.numberOfMonths, n = a, l = 0, h = new A(this.ctx), c = "month", d = 0; if (e.minDate > 1) { l = (h.determineDaysOfMonths(a + 1, e.minYear) - i + 1) * r, n = x.monthMod(a + 1); var g = s + d, u = x.monthMod(n), p = n; 0 === n && (c = "year", p = g, u = 1, g += d += 1), this.timeScaleArray.push({ position: l, value: p, unit: c, year: g, month: u }) } else this.timeScaleArray.push({ position: l, value: n, unit: c, year: s, month: x.monthMod(a) }); for (var f = n + 1, b = l, v = 0, m = 1; v < o; v++, m++) { 0 === (f = x.monthMod(f)) ? (c = "year", d += 1) : c = "month"; var y = this._getYear(s, f, d); b = h.determineDaysOfMonths(f, y) * r + b; var w = 0 === f ? y : f; this.timeScaleArray.push({ position: b, value: w, unit: c, year: y, month: 0 === f ? 1 : f }), f++ } } }, { key: "generateDayScale", value: function (t) { var e = t.firstVal, i = t.currentMonth, a = t.currentYear, s = t.hoursWidthOnXAxis, r = t.numberOfDays, o = new A(this.ctx), n = "day", l = e.minDate + 1, h = l, c = function (t, e, i) { return t > o.determineDaysOfMonths(e + 1, i) ? (h = 1, n = "month", g = e += 1, e) : e }, d = (24 - e.minHour) * s, g = l, u = c(h, i, a); 0 === e.minHour && 1 === e.minDate ? (d = 0, g = x.monthMod(e.minMonth), n = "month", h = e.minDate) : 1 !== e.minDate && 0 === e.minHour && 0 === e.minMinute && (d = 0, l = e.minDate, g = l, u = c(h = l, i, a)), this.timeScaleArray.push({ position: d, value: g, unit: n, year: this._getYear(a, u, 0), month: x.monthMod(u), day: h }); for (var p = d, f = 0; f < r; f++) { n = "day", u = c(h += 1, u, this._getYear(a, u, 0)); var b = this._getYear(a, u, 0); p = 24 * s + p; var v = 1 === h ? x.monthMod(u) : h; this.timeScaleArray.push({ position: p, value: v, unit: n, year: b, month: x.monthMod(u), day: v }) } } }, { key: "generateHourScale", value: function (t) { var e = t.firstVal, i = t.currentDate, a = t.currentMonth, s = t.currentYear, r = t.minutesWidthOnXAxis, o = t.numberOfHours, n = new A(this.ctx), l = "hour", h = function (t, e) { return t > n.determineDaysOfMonths(e + 1, s) && (f = 1, e += 1), { month: e, date: f } }, c = function (t, e) { return t > n.determineDaysOfMonths(e + 1, s) ? e += 1 : e }, d = 60 - (e.minMinute + e.minSecond / 60), g = d * r, u = e.minHour + 1, p = u; 60 === d && (g = 0, p = u = e.minHour); var f = i; p >= 24 && (p = 0, f += 1, l = "day"); var b = h(f, a).month; b = c(f, b), this.timeScaleArray.push({ position: g, value: u, unit: l, day: f, hour: p, year: s, month: x.monthMod(b) }), p++; for (var v = g, m = 0; m < o; m++) { if (l = "hour", p >= 24) p = 0, l = "day", b = h(f += 1, b).month, b = c(f, b); var y = this._getYear(s, b, 0); v = 60 * r + v; var w = 0 === p ? f : p; this.timeScaleArray.push({ position: v, value: w, unit: l, hour: p, day: f, year: y, month: x.monthMod(b) }), p++ } } }, { key: "generateMinuteScale", value: function (t) { for (var e = t.currentMillisecond, i = t.currentSecond, a = t.currentMinute, s = t.currentHour, r = t.currentDate, o = t.currentMonth, n = t.currentYear, l = t.minutesWidthOnXAxis, h = t.secondsWidthOnXAxis, c = t.numberOfMinutes, d = a + 1, g = r, u = o, p = n, f = s, b = (60 - i - e / 1e3) * h, v = 0; v < c; v++)d >= 60 && (d = 0, 24 === (f += 1) && (f = 0)), this.timeScaleArray.push({ position: b, value: d, unit: "minute", hour: f, minute: d, day: g, year: this._getYear(p, u, 0), month: x.monthMod(u) }), b += l, d++ } }, { key: "generateSecondScale", value: function (t) { for (var e = t.currentMillisecond, i = t.currentSecond, a = t.currentMinute, s = t.currentHour, r = t.currentDate, o = t.currentMonth, n = t.currentYear, l = t.secondsWidthOnXAxis, h = t.numberOfSeconds, c = i + 1, d = a, g = r, u = o, p = n, f = s, b = (1e3 - e) / 1e3 * l, v = 0; v < h; v++)c >= 60 && (c = 0, ++d >= 60 && (d = 0, 24 === ++f && (f = 0))), this.timeScaleArray.push({ position: b, value: c, unit: "second", hour: f, minute: d, second: c, day: g, year: this._getYear(p, u, 0), month: x.monthMod(u) }), b += l, c++ } }, { key: "createRawDateString", value: function (t, e) { var i = t.year; return 0 === t.month && (t.month = 1), i += "-" + ("0" + t.month.toString()).slice(-2), "day" === t.unit ? i += "day" === t.unit ? "-" + ("0" + e).slice(-2) : "-01" : i += "-" + ("0" + (t.day ? t.day : "1")).slice(-2), "hour" === t.unit ? i += "hour" === t.unit ? "T" + ("0" + e).slice(-2) : "T00" : i += "T" + ("0" + (t.hour ? t.hour : "0")).slice(-2), "minute" === t.unit ? i += ":" + ("0" + e).slice(-2) : i += ":" + (t.minute ? ("0" + t.minute).slice(-2) : "00"), "second" === t.unit ? i += ":" + ("0" + e).slice(-2) : i += ":00", this.utc && (i += ".000Z"), i } }, { key: "formatDates", value: function (t) { var e = this, i = this.w; return t.map((function (t) { var a = t.value.toString(), s = new A(e.ctx), r = e.createRawDateString(t, a), o = s.getDate(s.parseDate(r)); if (e.utc || (o = s.getDate(s.parseDateWithTimezone(r))), void 0 === i.config.xaxis.labels.format) { var n = "dd MMM", l = i.config.xaxis.labels.datetimeFormatter; "year" === t.unit && (n = l.year), "month" === t.unit && (n = l.month), "day" === t.unit && (n = l.day), "hour" === t.unit && (n = l.hour), "minute" === t.unit && (n = l.minute), "second" === t.unit && (n = l.second), a = s.formatDate(o, n) } else a = s.formatDate(o, i.config.xaxis.labels.format); return { dateString: r, position: t.position, value: a, unit: t.unit, year: t.year, month: t.month } })) } }, { key: "removeOverlappingTS", value: function (t) { var e, i = this, a = new m(this.ctx), s = !1; t.length > 0 && t[0].value && t.every((function (e) { return e.value.length === t[0].value.length })) && (s = !0, e = a.getTextRects(t[0].value).width); var r = 0, o = t.map((function (o, n) { if (n > 0 && i.w.config.xaxis.labels.hideOverlappingLabels) { var l = s ? e : a.getTextRects(t[r].value).width, h = t[r].position; return o.position > h + l + 10 ? (r = n, o) : null } return o })); return o = o.filter((function (t) { return null !== t })) } }, { key: "_getYear", value: function (t, e, i) { return t + Math.floor(e / 12) + i } }]), t }(), Wt = function () { function t(e, i) { a(this, t), this.ctx = i, this.w = i.w, this.el = e } return r(t, [{ key: "setupElements", value: function () { var t = this.w.globals, e = this.w.config, i = e.chart.type; t.axisCharts = ["line", "area", "bar", "rangeBar", "rangeArea", "candlestick", "boxPlot", "scatter", "bubble", "radar", "heatmap", "treemap"].indexOf(i) > -1, t.xyCharts = ["line", "area", "bar", "rangeBar", "rangeArea", "candlestick", "boxPlot", "scatter", "bubble"].indexOf(i) > -1, t.isBarHorizontal = ("bar" === e.chart.type || "rangeBar" === e.chart.type || "boxPlot" === e.chart.type) && e.plotOptions.bar.horizontal, t.chartClass = ".apexcharts" + t.chartID, t.dom.baseEl = this.el, t.dom.elWrap = document.createElement("div"), m.setAttrs(t.dom.elWrap, { id: t.chartClass.substring(1), class: "apexcharts-canvas " + t.chartClass.substring(1) }), this.el.appendChild(t.dom.elWrap), t.dom.Paper = new window.SVG.Doc(t.dom.elWrap), t.dom.Paper.attr({ class: "apexcharts-svg", "xmlns:data": "ApexChartsNS", transform: "translate(".concat(e.chart.offsetX, ", ").concat(e.chart.offsetY, ")") }), t.dom.Paper.node.style.background = "dark" !== e.theme.mode || e.chart.background ? e.chart.background : "rgba(0, 0, 0, 0.8)", this.setSVGDimensions(), t.dom.elLegendForeign = document.createElementNS(t.SVGNS, "foreignObject"), m.setAttrs(t.dom.elLegendForeign, { x: 0, y: 0, width: t.svgWidth, height: t.svgHeight }), t.dom.elLegendWrap = document.createElement("div"), t.dom.elLegendWrap.classList.add("apexcharts-legend"), t.dom.elLegendWrap.setAttribute("xmlns", "http://www.w3.org/1999/xhtml"), t.dom.elLegendForeign.appendChild(t.dom.elLegendWrap), t.dom.Paper.node.appendChild(t.dom.elLegendForeign), t.dom.elGraphical = t.dom.Paper.group().attr({ class: "apexcharts-inner apexcharts-graphical" }), t.dom.elDefs = t.dom.Paper.defs(), t.dom.Paper.add(t.dom.elGraphical), t.dom.elGraphical.add(t.dom.elDefs) } }, { key: "plotChartType", value: function (t, e) { var i = this.w, a = i.config, s = i.globals, r = { series: [], i: [] }, o = { series: [], i: [] }, n = { series: [], i: [] }, l = { series: [], i: [] }, h = { series: [], i: [] }, c = { series: [], i: [] }, d = { series: [], i: [] }, g = { series: [], i: [] }, p = { series: [], seriesRangeEnd: [], i: [] }, f = void 0 !== a.chart.type ? a.chart.type : "line", x = null, b = 0; s.series.forEach((function (e, a) { var u = t[a].type || f; switch (u) { case "column": case "bar": h.series.push(e), h.i.push(a), i.globals.columnSeries = h; break; case "area": o.series.push(e), o.i.push(a); break; case "line": r.series.push(e), r.i.push(a); break; case "scatter": n.series.push(e), n.i.push(a); break; case "bubble": l.series.push(e), l.i.push(a); break; case "candlestick": c.series.push(e), c.i.push(a); break; case "boxPlot": d.series.push(e), d.i.push(a); break; case "rangeBar": g.series.push(e), g.i.push(a); break; case "rangeArea": p.series.push(s.seriesRangeStart[a]), p.seriesRangeEnd.push(s.seriesRangeEnd[a]), p.i.push(a); break; case "heatmap": case "treemap": case "pie": case "donut": case "polarArea": case "radialBar": case "radar": x = u; break; default: console.warn("You have specified an unrecognized series type (", u, ").") }f !== u && "scatter" !== u && b++ })), b > 0 && (null !== x && console.warn("Chart or series type ", x, " can not appear with other chart or series types."), h.series.length > 0 && a.plotOptions.bar.horizontal && (b -= h.length, h = { series: [], i: [] }, i.globals.columnSeries = { series: [], i: [] }, console.warn("Horizontal bars are not supported in a mixed/combo chart. Please turn off `plotOptions.bar.horizontal`"))), s.comboCharts || (s.comboCharts = b > 0); var v = new Ft(this.ctx, e), m = new kt(this.ctx, e); this.ctx.pie = new Lt(this.ctx); var w = new Mt(this.ctx); this.ctx.rangeBar = new It(this.ctx, e); var k = new Pt(this.ctx), A = []; if (s.comboCharts) { var S, C, L = new y(this.ctx); if (o.series.length > 0) (S = A).push.apply(S, u(L.drawSeriesByGroup(o, s.areaGroups, "area", v))); if (h.series.length > 0) if (i.config.chart.stacked) { var P = new wt(this.ctx, e); A.push(P.draw(h.series, h.i)) } else this.ctx.bar = new yt(this.ctx, e), A.push(this.ctx.bar.draw(h.series, h.i)); if (p.series.length > 0 && A.push(v.draw(p.series, "rangeArea", p.i, p.seriesRangeEnd)), r.series.length > 0) (C = A).push.apply(C, u(L.drawSeriesByGroup(r, s.lineGroups, "line", v))); if (c.series.length > 0 && A.push(m.draw(c.series, "candlestick", c.i)), d.series.length > 0 && A.push(m.draw(d.series, "boxPlot", d.i)), g.series.length > 0 && A.push(this.ctx.rangeBar.draw(g.series, g.i)), n.series.length > 0) { var M = new Ft(this.ctx, e, !0); A.push(M.draw(n.series, "scatter", n.i)) } if (l.series.length > 0) { var I = new Ft(this.ctx, e, !0); A.push(I.draw(l.series, "bubble", l.i)) } } else switch (a.chart.type) { case "line": A = v.draw(s.series, "line"); break; case "area": A = v.draw(s.series, "area"); break; case "bar": if (a.chart.stacked) A = new wt(this.ctx, e).draw(s.series); else this.ctx.bar = new yt(this.ctx, e), A = this.ctx.bar.draw(s.series); break; case "candlestick": A = new kt(this.ctx, e).draw(s.series, "candlestick"); break; case "boxPlot": A = new kt(this.ctx, e).draw(s.series, a.chart.type); break; case "rangeBar": A = this.ctx.rangeBar.draw(s.series); break; case "rangeArea": A = v.draw(s.seriesRangeStart, "rangeArea", void 0, s.seriesRangeEnd); break; case "heatmap": A = new St(this.ctx, e).draw(s.series); break; case "treemap": A = new Dt(this.ctx, e).draw(s.series); break; case "pie": case "donut": case "polarArea": A = this.ctx.pie.draw(s.series); break; case "radialBar": A = w.draw(s.series); break; case "radar": A = k.draw(s.series); break; default: A = v.draw(s.series) }return A } }, { key: "setSVGDimensions", value: function () { var t = this.w.globals, e = this.w.config; t.svgWidth = e.chart.width, t.svgHeight = e.chart.height; var i = x.getDimensions(this.el), a = e.chart.width.toString().split(/[0-9]+/g).pop(); "%" === a ? x.isNumber(i[0]) && (0 === i[0].width && (i = x.getDimensions(this.el.parentNode)), t.svgWidth = i[0] * parseInt(e.chart.width, 10) / 100) : "px" !== a && "" !== a || (t.svgWidth = parseInt(e.chart.width, 10)); var s = e.chart.height.toString().split(/[0-9]+/g).pop(); if ("auto" !== t.svgHeight && "" !== t.svgHeight) if ("%" === s) { var r = x.getDimensions(this.el.parentNode); t.svgHeight = r[1] * parseInt(e.chart.height, 10) / 100 } else t.svgHeight = parseInt(e.chart.height, 10); else t.axisCharts ? t.svgHeight = t.svgWidth / 1.61 : t.svgHeight = t.svgWidth / 1.2; if (t.svgWidth < 0 && (t.svgWidth = 0), t.svgHeight < 0 && (t.svgHeight = 0), m.setAttrs(t.dom.Paper.node, { width: t.svgWidth, height: t.svgHeight }), "%" !== s) { var o = e.chart.sparkline.enabled ? 0 : t.axisCharts ? e.chart.parentHeightOffset : 0; t.dom.Paper.node.parentNode.parentNode.style.minHeight = t.svgHeight + o + "px" } t.dom.elWrap.style.width = t.svgWidth + "px", t.dom.elWrap.style.height = t.svgHeight + "px" } }, { key: "shiftGraphPosition", value: function () { var t = this.w.globals, e = t.translateY, i = { transform: "translate(" + t.translateX + ", " + e + ")" }; m.setAttrs(t.dom.elGraphical.node, i) } }, { key: "resizeNonAxisCharts", value: function () { var t = this.w, e = t.globals, i = 0, a = t.config.chart.sparkline.enabled ? 1 : 15; a += t.config.grid.padding.bottom, "top" !== t.config.legend.position && "bottom" !== t.config.legend.position || !t.config.legend.show || t.config.legend.floating || (i = new lt(this.ctx).legendHelpers.getLegendBBox().clwh + 10); var s = t.globals.dom.baseEl.querySelector(".apexcharts-radialbar, .apexcharts-pie"), r = 2.05 * t.globals.radialSize; if (s && !t.config.chart.sparkline.enabled && 0 !== t.config.plotOptions.radialBar.startAngle) { var o = x.getBoundingClientRect(s); r = o.bottom; var n = o.bottom - o.top; r = Math.max(2.05 * t.globals.radialSize, n) } var l = r + e.translateY + i + a; e.dom.elLegendForeign && e.dom.elLegendForeign.setAttribute("height", l), t.config.chart.height && String(t.config.chart.height).indexOf("%") > 0 || (e.dom.elWrap.style.height = l + "px", m.setAttrs(e.dom.Paper.node, { height: l }), e.dom.Paper.node.parentNode.parentNode.style.minHeight = l + "px") } }, { key: "coreCalculations", value: function () { new U(this.ctx).init() } }, { key: "resetGlobals", value: function () { var t = this, e = function () { return t.w.config.series.map((function (t) { return [] })) }, i = new F, a = this.w.globals; i.initGlobalVars(a), a.seriesXvalues = e(), a.seriesYvalues = e() } }, { key: "isMultipleY", value: function () { if (this.w.config.yaxis.constructor === Array && this.w.config.yaxis.length > 1) return this.w.globals.isMultipleYAxis = !0, !0 } }, { key: "xySettings", value: function () { var t = null, e = this.w; if (e.globals.axisCharts) { if ("back" === e.config.xaxis.crosshairs.position) new Q(this.ctx).drawXCrosshairs(); if ("back" === e.config.yaxis[0].crosshairs.position) new Q(this.ctx).drawYCrosshairs(); if ("datetime" === e.config.xaxis.type && void 0 === e.config.xaxis.labels.formatter) { this.ctx.timeScale = new Nt(this.ctx); var i = []; isFinite(e.globals.minX) && isFinite(e.globals.maxX) && !e.globals.isBarHorizontal ? i = this.ctx.timeScale.calculateTimeScaleTicks(e.globals.minX, e.globals.maxX) : e.globals.isBarHorizontal && (i = this.ctx.timeScale.calculateTimeScaleTicks(e.globals.minY, e.globals.maxY)), this.ctx.timeScale.recalcDimensionsBasedOnFormat(i) } t = new y(this.ctx).getCalculatedRatios() } return t } }, { key: "updateSourceChart", value: function (t) { this.ctx.w.globals.selection = void 0, this.ctx.updateHelpers._updateOptions({ chart: { selection: { xaxis: { min: t.w.globals.minX, max: t.w.globals.maxX } } } }, !1, !1) } }, { key: "setupBrushHandler", value: function () { var t = this, e = this.w; if (e.config.chart.brush.enabled && "function" != typeof e.config.chart.events.selection) { var i = Array.isArray(e.config.chart.brush.targets) ? e.config.chart.brush.targets : [e.config.chart.brush.target]; i.forEach((function (e) { var i = ApexCharts.getChartByID(e); i.w.globals.brushSource = t.ctx, "function" != typeof i.w.config.chart.events.zoomed && (i.w.config.chart.events.zoomed = function () { t.updateSourceChart(i) }), "function" != typeof i.w.config.chart.events.scrolled && (i.w.config.chart.events.scrolled = function () { t.updateSourceChart(i) }) })), e.config.chart.events.selection = function (t, e) { i.forEach((function (t) { ApexCharts.getChartByID(t).ctx.updateHelpers._updateOptions({ xaxis: { min: e.xaxis.min, max: e.xaxis.max } }, !1, !1, !1, !1) })) } } } }]), t }(), Bt = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "_updateOptions", value: function (t) { var e = this, a = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], s = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], r = !(arguments.length > 3 && void 0 !== arguments[3]) || arguments[3], o = arguments.length > 4 && void 0 !== arguments[4] && arguments[4]; return new Promise((function (n) { var l = [e.ctx]; r && (l = e.ctx.getSyncedCharts()), e.ctx.w.globals.isExecCalled && (l = [e.ctx], e.ctx.w.globals.isExecCalled = !1), l.forEach((function (r, h) { var c = r.w; if (c.globals.shouldAnimate = s, a || (c.globals.resized = !0, c.globals.dataChanged = !0, s && r.series.getPreviousPaths()), t && "object" === i(t) && (r.config = new Y(t), t = y.extendArrayProps(r.config, t, c), r.w.globals.chartID !== e.ctx.w.globals.chartID && delete t.series, c.config = x.extend(c.config, t), o && (c.globals.lastXAxis = t.xaxis ? x.clone(t.xaxis) : [], c.globals.lastYAxis = t.yaxis ? x.clone(t.yaxis) : [], c.globals.initialConfig = x.extend({}, c.config), c.globals.initialSeries = x.clone(c.config.series), t.series))) { for (var d = 0; d < c.globals.collapsedSeriesIndices.length; d++) { var g = c.config.series[c.globals.collapsedSeriesIndices[d]]; c.globals.collapsedSeries[d].data = c.globals.axisCharts ? g.data.slice() : g } for (var u = 0; u < c.globals.ancillaryCollapsedSeriesIndices.length; u++) { var p = c.config.series[c.globals.ancillaryCollapsedSeriesIndices[u]]; c.globals.ancillaryCollapsedSeries[u].data = c.globals.axisCharts ? p.data.slice() : p } r.series.emptyCollapsedSeries(c.config.series) } return r.update(t).then((function () { h === l.length - 1 && n(r) })) })) })) } }, { key: "_updateSeries", value: function (t, e) { var i = this, a = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; return new Promise((function (s) { var r, o = i.w; return o.globals.shouldAnimate = e, o.globals.dataChanged = !0, e && i.ctx.series.getPreviousPaths(), o.globals.axisCharts ? (0 === (r = t.map((function (t, e) { return i._extendSeries(t, e) }))).length && (r = [{ data: [] }]), o.config.series = r) : o.config.series = t.slice(), a && (o.globals.initialConfig.series = x.clone(o.config.series), o.globals.initialSeries = x.clone(o.config.series)), i.ctx.update().then((function () { s(i.ctx) })) })) } }, { key: "_extendSeries", value: function (t, i) { var a = this.w, s = a.config.series[i]; return e(e({}, a.config.series[i]), {}, { name: t.name ? t.name : null == s ? void 0 : s.name, color: t.color ? t.color : null == s ? void 0 : s.color, type: t.type ? t.type : null == s ? void 0 : s.type, group: t.group ? t.group : null == s ? void 0 : s.group, data: t.data ? t.data : null == s ? void 0 : s.data, zIndex: void 0 !== t.zIndex ? t.zIndex : i }) } }, { key: "toggleDataPointSelection", value: function (t, e) { var i = this.w, a = null, s = ".apexcharts-series[data\\:realIndex='".concat(t, "']"); return i.globals.axisCharts ? a = i.globals.dom.Paper.select("".concat(s, " path[j='").concat(e, "'], ").concat(s, " circle[j='").concat(e, "'], ").concat(s, " rect[j='").concat(e, "']")).members[0] : void 0 === e && (a = i.globals.dom.Paper.select("".concat(s, " path[j='").concat(t, "']")).members[0], "pie" !== i.config.chart.type && "polarArea" !== i.config.chart.type && "donut" !== i.config.chart.type || this.ctx.pie.pieClicked(t)), a ? (new m(this.ctx).pathMouseDown(a, null), a.node ? a.node : null) : (console.warn("toggleDataPointSelection: Element not found"), null) } }, { key: "forceXAxisUpdate", value: function (t) { var e = this.w; if (["min", "max"].forEach((function (i) { void 0 !== t.xaxis[i] && (e.config.xaxis[i] = t.xaxis[i], e.globals.lastXAxis[i] = t.xaxis[i]) })), t.xaxis.categories && t.xaxis.categories.length && (e.config.xaxis.categories = t.xaxis.categories), e.config.xaxis.convertedCatToNumeric) { var i = new E(t); t = i.convertCatToNumericXaxis(t, this.ctx) } return t } }, { key: "forceYAxisUpdate", value: function (t) { return t.chart && t.chart.stacked && "100%" === t.chart.stackType && (Array.isArray(t.yaxis) ? t.yaxis.forEach((function (e, i) { t.yaxis[i].min = 0, t.yaxis[i].max = 100 })) : (t.yaxis.min = 0, t.yaxis.max = 100)), t } }, { key: "revertDefaultAxisMinMax", value: function (t) { var e = this, i = this.w, a = i.globals.lastXAxis, s = i.globals.lastYAxis; t && t.xaxis && (a = t.xaxis), t && t.yaxis && (s = t.yaxis), i.config.xaxis.min = a.min, i.config.xaxis.max = a.max; var r = function (t) { void 0 !== s[t] && (i.config.yaxis[t].min = s[t].min, i.config.yaxis[t].max = s[t].max) }; i.config.yaxis.map((function (t, a) { i.globals.zoomed || void 0 !== s[a] ? r(a) : void 0 !== e.ctx.opts.yaxis[a] && (t.min = e.ctx.opts.yaxis[a].min, t.max = e.ctx.opts.yaxis[a].max) })) } }]), t }(); Rt = "undefined" != typeof window ? window : void 0, Ht = function (t, e) { var a = (void 0 !== this ? this : t).SVG = function (t) { if (a.supported) return t = new a.Doc(t), a.parser.draw || a.prepare(), t }; if (a.ns = "http://www.w3.org/2000/svg", a.xmlns = "http://www.w3.org/2000/xmlns/", a.xlink = "http://www.w3.org/1999/xlink", a.svgjs = "http://svgjs.dev", a.supported = !0, !a.supported) return !1; a.did = 1e3, a.eid = function (t) { return "Svgjs" + d(t) + a.did++ }, a.create = function (t) { var i = e.createElementNS(this.ns, t); return i.setAttribute("id", this.eid(t)), i }, a.extend = function () { var t, e; e = (t = [].slice.call(arguments)).pop(); for (var i = t.length - 1; i >= 0; i--)if (t[i]) for (var s in e) t[i].prototype[s] = e[s]; a.Set && a.Set.inherit && a.Set.inherit() }, a.invent = function (t) { var e = "function" == typeof t.create ? t.create : function () { this.constructor.call(this, a.create(t.create)) }; return t.inherit && (e.prototype = new t.inherit), t.extend && a.extend(e, t.extend), t.construct && a.extend(t.parent || a.Container, t.construct), e }, a.adopt = function (e) { return e ? e.instance ? e.instance : ((i = "svg" == e.nodeName ? e.parentNode instanceof t.SVGElement ? new a.Nested : new a.Doc : "linearGradient" == e.nodeName ? new a.Gradient("linear") : "radialGradient" == e.nodeName ? new a.Gradient("radial") : a[d(e.nodeName)] ? new (a[d(e.nodeName)]) : new a.Element(e)).type = e.nodeName, i.node = e, e.instance = i, i instanceof a.Doc && i.namespace().defs(), i.setData(JSON.parse(e.getAttribute("svgjs:data")) || {}), i) : null; var i }, a.prepare = function () { var t = e.getElementsByTagName("body")[0], i = (t ? new a.Doc(t) : a.adopt(e.documentElement).nested()).size(2, 0); a.parser = { body: t || e.documentElement, draw: i.style("opacity:0;position:absolute;left:-100%;top:-100%;overflow:hidden").node, poly: i.polyline().node, path: i.path().node, native: a.create("svg") } }, a.parser = { native: a.create("svg") }, e.addEventListener("DOMContentLoaded", (function () { a.parser.draw || a.prepare() }), !1), a.regex = { numberAndUnit: /^([+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?)([a-z%]*)$/i, hex: /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i, rgb: /rgb\((\d+),(\d+),(\d+)\)/, reference: /#([a-z0-9\-_]+)/i, transforms: /\)\s*,?\s*/, whitespace: /\s/g, isHex: /^#[a-f0-9]{3,6}$/i, isRgb: /^rgb\(/, isCss: /[^:]+:[^;]+;?/, isBlank: /^(\s+)?$/, isNumber: /^[+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i, isPercent: /^-?[\d\.]+%$/, isImage: /\.(jpg|jpeg|png|gif|svg)(\?[^=]+.*)?/i, delimiter: /[\s,]+/, hyphen: /([^e])\-/gi, pathLetters: /[MLHVCSQTAZ]/gi, isPathLetter: /[MLHVCSQTAZ]/i, numbersWithDots: /((\d?\.\d+(?:e[+-]?\d+)?)((?:\.\d+(?:e[+-]?\d+)?)+))+/gi, dots: /\./g }, a.utils = { map: function (t, e) { for (var i = t.length, a = [], s = 0; s < i; s++)a.push(e(t[s])); return a }, filter: function (t, e) { for (var i = t.length, a = [], s = 0; s < i; s++)e(t[s]) && a.push(t[s]); return a }, filterSVGElements: function (e) { return this.filter(e, (function (e) { return e instanceof t.SVGElement })) } }, a.defaults = { attrs: { "fill-opacity": 1, "stroke-opacity": 1, "stroke-width": 0, "stroke-linejoin": "miter", "stroke-linecap": "butt", fill: "#000000", stroke: "#000000", opacity: 1, x: 0, y: 0, cx: 0, cy: 0, width: 0, height: 0, r: 0, rx: 0, ry: 0, offset: 0, "stop-opacity": 1, "stop-color": "#000000", "font-size": 16, "font-family": "Helvetica, Arial, sans-serif", "text-anchor": "start" } }, a.Color = function (t) { var e, s; this.r = 0, this.g = 0, this.b = 0, t && ("string" == typeof t ? a.regex.isRgb.test(t) ? (e = a.regex.rgb.exec(t.replace(a.regex.whitespace, "")), this.r = parseInt(e[1]), this.g = parseInt(e[2]), this.b = parseInt(e[3])) : a.regex.isHex.test(t) && (e = a.regex.hex.exec(4 == (s = t).length ? ["#", s.substring(1, 2), s.substring(1, 2), s.substring(2, 3), s.substring(2, 3), s.substring(3, 4), s.substring(3, 4)].join("") : s), this.r = parseInt(e[1], 16), this.g = parseInt(e[2], 16), this.b = parseInt(e[3], 16)) : "object" === i(t) && (this.r = t.r, this.g = t.g, this.b = t.b)) }, a.extend(a.Color, { toString: function () { return this.toHex() }, toHex: function () { return "#" + g(this.r) + g(this.g) + g(this.b) }, toRgb: function () { return "rgb(" + [this.r, this.g, this.b].join() + ")" }, brightness: function () { return this.r / 255 * .3 + this.g / 255 * .59 + this.b / 255 * .11 }, morph: function (t) { return this.destination = new a.Color(t), this }, at: function (t) { return this.destination ? (t = t < 0 ? 0 : t > 1 ? 1 : t, new a.Color({ r: ~~(this.r + (this.destination.r - this.r) * t), g: ~~(this.g + (this.destination.g - this.g) * t), b: ~~(this.b + (this.destination.b - this.b) * t) })) : this } }), a.Color.test = function (t) { return t += "", a.regex.isHex.test(t) || a.regex.isRgb.test(t) }, a.Color.isRgb = function (t) { return t && "number" == typeof t.r && "number" == typeof t.g && "number" == typeof t.b }, a.Color.isColor = function (t) { return a.Color.isRgb(t) || a.Color.test(t) }, a.Array = function (t, e) { 0 == (t = (t || []).valueOf()).length && e && (t = e.valueOf()), this.value = this.parse(t) }, a.extend(a.Array, { toString: function () { return this.value.join(" ") }, valueOf: function () { return this.value }, parse: function (t) { return t = t.valueOf(), Array.isArray(t) ? t : this.split(t) } }), a.PointArray = function (t, e) { a.Array.call(this, t, e || [[0, 0]]) }, a.PointArray.prototype = new a.Array, a.PointArray.prototype.constructor = a.PointArray; for (var s = { M: function (t, e, i) { return e.x = i.x = t[0], e.y = i.y = t[1], ["M", e.x, e.y] }, L: function (t, e) { return e.x = t[0], e.y = t[1], ["L", t[0], t[1]] }, H: function (t, e) { return e.x = t[0], ["H", t[0]] }, V: function (t, e) { return e.y = t[0], ["V", t[0]] }, C: function (t, e) { return e.x = t[4], e.y = t[5], ["C", t[0], t[1], t[2], t[3], t[4], t[5]] }, Q: function (t, e) { return e.x = t[2], e.y = t[3], ["Q", t[0], t[1], t[2], t[3]] }, S: function (t, e) { return e.x = t[2], e.y = t[3], ["S", t[0], t[1], t[2], t[3]] }, Z: function (t, e, i) { return e.x = i.x, e.y = i.y, ["Z"] } }, r = "mlhvqtcsaz".split(""), o = 0, n = r.length; o < n; ++o)s[r[o]] = function (t) { return function (e, i, a) { if ("H" == t) e[0] = e[0] + i.x; else if ("V" == t) e[0] = e[0] + i.y; else if ("A" == t) e[5] = e[5] + i.x, e[6] = e[6] + i.y; else for (var r = 0, o = e.length; r < o; ++r)e[r] = e[r] + (r % 2 ? i.y : i.x); if (s && "function" == typeof s[t]) return s[t](e, i, a) } }(r[o].toUpperCase()); a.PathArray = function (t, e) { a.Array.call(this, t, e || [["M", 0, 0]]) }, a.PathArray.prototype = new a.Array, a.PathArray.prototype.constructor = a.PathArray, a.extend(a.PathArray, { toString: function () { return function (t) { for (var e = 0, i = t.length, a = ""; e < i; e++)a += t[e][0], null != t[e][1] && (a += t[e][1], null != t[e][2] && (a += " ", a += t[e][2], null != t[e][3] && (a += " ", a += t[e][3], a += " ", a += t[e][4], null != t[e][5] && (a += " ", a += t[e][5], a += " ", a += t[e][6], null != t[e][7] && (a += " ", a += t[e][7]))))); return a + " " }(this.value) }, move: function (t, e) { var i = this.bbox(); return i.x, i.y, this }, at: function (t) { if (!this.destination) return this; for (var e = this.value, i = this.destination.value, s = [], r = new a.PathArray, o = 0, n = e.length; o < n; o++) { s[o] = [e[o][0]]; for (var l = 1, h = e[o].length; l < h; l++)s[o][l] = e[o][l] + (i[o][l] - e[o][l]) * t; "A" === s[o][0] && (s[o][4] = +(0 != s[o][4]), s[o][5] = +(0 != s[o][5])) } return r.value = s, r }, parse: function (t) { if (t instanceof a.PathArray) return t.valueOf(); var e, i = { M: 2, L: 2, H: 1, V: 1, C: 6, S: 4, Q: 4, T: 2, A: 7, Z: 0 }; t = "string" == typeof t ? t.replace(a.regex.numbersWithDots, h).replace(a.regex.pathLetters, " $& ").replace(a.regex.hyphen, "$1 -").trim().split(a.regex.delimiter) : t.reduce((function (t, e) { return [].concat.call(t, e) }), []); var r = [], o = new a.Point, n = new a.Point, l = 0, c = t.length; do { a.regex.isPathLetter.test(t[l]) ? (e = t[l], ++l) : "M" == e ? e = "L" : "m" == e && (e = "l"), r.push(s[e].call(null, t.slice(l, l += i[e.toUpperCase()]).map(parseFloat), o, n)) } while (c > l); return r }, bbox: function () { return a.parser.draw || a.prepare(), a.parser.path.setAttribute("d", this.toString()), a.parser.path.getBBox() } }), a.Number = a.invent({ create: function (t, e) { this.value = 0, this.unit = e || "", "number" == typeof t ? this.value = isNaN(t) ? 0 : isFinite(t) ? t : t < 0 ? -34e37 : 34e37 : "string" == typeof t ? (e = t.match(a.regex.numberAndUnit)) && (this.value = parseFloat(e[1]), "%" == e[5] ? this.value /= 100 : "s" == e[5] && (this.value *= 1e3), this.unit = e[5]) : t instanceof a.Number && (this.value = t.valueOf(), this.unit = t.unit) }, extend: { toString: function () { return ("%" == this.unit ? ~~(1e8 * this.value) / 1e6 : "s" == this.unit ? this.value / 1e3 : this.value) + this.unit }, toJSON: function () { return this.toString() }, valueOf: function () { return this.value }, plus: function (t) { return t = new a.Number(t), new a.Number(this + t, this.unit || t.unit) }, minus: function (t) { return t = new a.Number(t), new a.Number(this - t, this.unit || t.unit) }, times: function (t) { return t = new a.Number(t), new a.Number(this * t, this.unit || t.unit) }, divide: function (t) { return t = new a.Number(t), new a.Number(this / t, this.unit || t.unit) }, to: function (t) { var e = new a.Number(this); return "string" == typeof t && (e.unit = t), e }, morph: function (t) { return this.destination = new a.Number(t), t.relative && (this.destination.value += this.value), this }, at: function (t) { return this.destination ? new a.Number(this.destination).minus(this).times(t).plus(this) : this } } }), a.Element = a.invent({ create: function (t) { this._stroke = a.defaults.attrs.stroke, this._event = null, this.dom = {}, (this.node = t) && (this.type = t.nodeName, this.node.instance = this, this._stroke = t.getAttribute("stroke") || this._stroke) }, extend: { x: function (t) { return this.attr("x", t) }, y: function (t) { return this.attr("y", t) }, cx: function (t) { return null == t ? this.x() + this.width() / 2 : this.x(t - this.width() / 2) }, cy: function (t) { return null == t ? this.y() + this.height() / 2 : this.y(t - this.height() / 2) }, move: function (t, e) { return this.x(t).y(e) }, center: function (t, e) { return this.cx(t).cy(e) }, width: function (t) { return this.attr("width", t) }, height: function (t) { return this.attr("height", t) }, size: function (t, e) { var i = u(this, t, e); return this.width(new a.Number(i.width)).height(new a.Number(i.height)) }, clone: function (t) { this.writeDataToDom(); var e = x(this.node.cloneNode(!0)); return t ? t.add(e) : this.after(e), e }, remove: function () { return this.parent() && this.parent().removeElement(this), this }, replace: function (t) { return this.after(t).remove(), t }, addTo: function (t) { return t.put(this) }, putIn: function (t) { return t.add(this) }, id: function (t) { return this.attr("id", t) }, show: function () { return this.style("display", "") }, hide: function () { return this.style("display", "none") }, visible: function () { return "none" != this.style("display") }, toString: function () { return this.attr("id") }, classes: function () { var t = this.attr("class"); return null == t ? [] : t.trim().split(a.regex.delimiter) }, hasClass: function (t) { return -1 != this.classes().indexOf(t) }, addClass: function (t) { if (!this.hasClass(t)) { var e = this.classes(); e.push(t), this.attr("class", e.join(" ")) } return this }, removeClass: function (t) { return this.hasClass(t) && this.attr("class", this.classes().filter((function (e) { return e != t })).join(" ")), this }, toggleClass: function (t) { return this.hasClass(t) ? this.removeClass(t) : this.addClass(t) }, reference: function (t) { return a.get(this.attr(t)) }, parent: function (e) { var i = this; if (!i.node.parentNode) return null; if (i = a.adopt(i.node.parentNode), !e) return i; for (; i && i.node instanceof t.SVGElement;) { if ("string" == typeof e ? i.matches(e) : i instanceof e) return i; if (!i.node.parentNode || "#document" == i.node.parentNode.nodeName) return null; i = a.adopt(i.node.parentNode) } }, doc: function () { return this instanceof a.Doc ? this : this.parent(a.Doc) }, parents: function (t) { var e = [], i = this; do { if (!(i = i.parent(t)) || !i.node) break; e.push(i) } while (i.parent); return e }, matches: function (t) { return function (t, e) { return (t.matches || t.matchesSelector || t.msMatchesSelector || t.mozMatchesSelector || t.webkitMatchesSelector || t.oMatchesSelector).call(t, e) }(this.node, t) }, native: function () { return this.node }, svg: function (t) { var i = e.createElementNS("http://www.w3.org/2000/svg", "svg"); if (!(t && this instanceof a.Parent)) return i.appendChild(t = e.createElementNS("http://www.w3.org/2000/svg", "svg")), this.writeDataToDom(), t.appendChild(this.node.cloneNode(!0)), i.innerHTML.replace(/^/, "").replace(/<\/svg>$/, ""); i.innerHTML = "" + t.replace(/\n/, "").replace(/<([\w:-]+)([^<]+?)\/>/g, "<$1$2>") + ""; for (var s = 0, r = i.firstChild.childNodes.length; s < r; s++)this.node.appendChild(i.firstChild.firstChild); return this }, writeDataToDom: function () { return (this.each || this.lines) && (this.each ? this : this.lines()).each((function () { this.writeDataToDom() })), this.node.removeAttribute("svgjs:data"), Object.keys(this.dom).length && this.node.setAttribute("svgjs:data", JSON.stringify(this.dom)), this }, setData: function (t) { return this.dom = t, this }, is: function (t) { return function (t, e) { return t instanceof e }(this, t) } } }), a.easing = { "-": function (t) { return t }, "<>": function (t) { return -Math.cos(t * Math.PI) / 2 + .5 }, ">": function (t) { return Math.sin(t * Math.PI / 2) }, "<": function (t) { return 1 - Math.cos(t * Math.PI / 2) } }, a.morph = function (t) { return function (e, i) { return new a.MorphObj(e, i).at(t) } }, a.Situation = a.invent({ create: function (t) { this.init = !1, this.reversed = !1, this.reversing = !1, this.duration = new a.Number(t.duration).valueOf(), this.delay = new a.Number(t.delay).valueOf(), this.start = +new Date + this.delay, this.finish = this.start + this.duration, this.ease = t.ease, this.loop = 0, this.loops = !1, this.animations = {}, this.attrs = {}, this.styles = {}, this.transforms = [], this.once = {} } }), a.FX = a.invent({ create: function (t) { this._target = t, this.situations = [], this.active = !1, this.situation = null, this.paused = !1, this.lastPos = 0, this.pos = 0, this.absPos = 0, this._speed = 1 }, extend: { animate: function (t, e, s) { "object" === i(t) && (e = t.ease, s = t.delay, t = t.duration); var r = new a.Situation({ duration: t || 1e3, delay: s || 0, ease: a.easing[e || "-"] || e }); return this.queue(r), this }, target: function (t) { return t && t instanceof a.Element ? (this._target = t, this) : this._target }, timeToAbsPos: function (t) { return (t - this.situation.start) / (this.situation.duration / this._speed) }, absPosToTime: function (t) { return this.situation.duration / this._speed * t + this.situation.start }, startAnimFrame: function () { this.stopAnimFrame(), this.animationFrame = t.requestAnimationFrame(function () { this.step() }.bind(this)) }, stopAnimFrame: function () { t.cancelAnimationFrame(this.animationFrame) }, start: function () { return !this.active && this.situation && (this.active = !0, this.startCurrent()), this }, startCurrent: function () { return this.situation.start = +new Date + this.situation.delay / this._speed, this.situation.finish = this.situation.start + this.situation.duration / this._speed, this.initAnimations().step() }, queue: function (t) { return ("function" == typeof t || t instanceof a.Situation) && this.situations.push(t), this.situation || (this.situation = this.situations.shift()), this }, dequeue: function () { return this.stop(), this.situation = this.situations.shift(), this.situation && (this.situation instanceof a.Situation ? this.start() : this.situation.call(this)), this }, initAnimations: function () { var t, e = this.situation; if (e.init) return this; for (var i in e.animations) { t = this.target()[i](), Array.isArray(t) || (t = [t]), Array.isArray(e.animations[i]) || (e.animations[i] = [e.animations[i]]); for (var s = t.length; s--;)e.animations[i][s] instanceof a.Number && (t[s] = new a.Number(t[s])), e.animations[i][s] = t[s].morph(e.animations[i][s]) } for (var i in e.attrs) e.attrs[i] = new a.MorphObj(this.target().attr(i), e.attrs[i]); for (var i in e.styles) e.styles[i] = new a.MorphObj(this.target().style(i), e.styles[i]); return e.initialTransformation = this.target().matrixify(), e.init = !0, this }, clearQueue: function () { return this.situations = [], this }, clearCurrent: function () { return this.situation = null, this }, stop: function (t, e) { var i = this.active; return this.active = !1, e && this.clearQueue(), t && this.situation && (!i && this.startCurrent(), this.atEnd()), this.stopAnimFrame(), this.clearCurrent() }, after: function (t) { var e = this.last(); return this.target().on("finished.fx", (function i(a) { a.detail.situation == e && (t.call(this, e), this.off("finished.fx", i)) })), this._callStart() }, during: function (t) { var e = this.last(), i = function (i) { i.detail.situation == e && t.call(this, i.detail.pos, a.morph(i.detail.pos), i.detail.eased, e) }; return this.target().off("during.fx", i).on("during.fx", i), this.after((function () { this.off("during.fx", i) })), this._callStart() }, afterAll: function (t) { var e = function e(i) { t.call(this), this.off("allfinished.fx", e) }; return this.target().off("allfinished.fx", e).on("allfinished.fx", e), this._callStart() }, last: function () { return this.situations.length ? this.situations[this.situations.length - 1] : this.situation }, add: function (t, e, i) { return this.last()[i || "animations"][t] = e, this._callStart() }, step: function (t) { var e, i, a; t || (this.absPos = this.timeToAbsPos(+new Date)), !1 !== this.situation.loops ? (e = Math.max(this.absPos, 0), i = Math.floor(e), !0 === this.situation.loops || i < this.situation.loops ? (this.pos = e - i, a = this.situation.loop, this.situation.loop = i) : (this.absPos = this.situation.loops, this.pos = 1, a = this.situation.loop - 1, this.situation.loop = this.situation.loops), this.situation.reversing && (this.situation.reversed = this.situation.reversed != Boolean((this.situation.loop - a) % 2))) : (this.absPos = Math.min(this.absPos, 1), this.pos = this.absPos), this.pos < 0 && (this.pos = 0), this.situation.reversed && (this.pos = 1 - this.pos); var s = this.situation.ease(this.pos); for (var r in this.situation.once) r > this.lastPos && r <= s && (this.situation.once[r].call(this.target(), this.pos, s), delete this.situation.once[r]); return this.active && this.target().fire("during", { pos: this.pos, eased: s, fx: this, situation: this.situation }), this.situation ? (this.eachAt(), 1 == this.pos && !this.situation.reversed || this.situation.reversed && 0 == this.pos ? (this.stopAnimFrame(), this.target().fire("finished", { fx: this, situation: this.situation }), this.situations.length || (this.target().fire("allfinished"), this.situations.length || (this.target().off(".fx"), this.active = !1)), this.active ? this.dequeue() : this.clearCurrent()) : !this.paused && this.active && this.startAnimFrame(), this.lastPos = s, this) : this }, eachAt: function () { var t, e = this, i = this.target(), s = this.situation; for (var r in s.animations) t = [].concat(s.animations[r]).map((function (t) { return "string" != typeof t && t.at ? t.at(s.ease(e.pos), e.pos) : t })), i[r].apply(i, t); for (var r in s.attrs) t = [r].concat(s.attrs[r]).map((function (t) { return "string" != typeof t && t.at ? t.at(s.ease(e.pos), e.pos) : t })), i.attr.apply(i, t); for (var r in s.styles) t = [r].concat(s.styles[r]).map((function (t) { return "string" != typeof t && t.at ? t.at(s.ease(e.pos), e.pos) : t })), i.style.apply(i, t); if (s.transforms.length) { t = s.initialTransformation, r = 0; for (var o = s.transforms.length; r < o; r++) { var n = s.transforms[r]; n instanceof a.Matrix ? t = n.relative ? t.multiply((new a.Matrix).morph(n).at(s.ease(this.pos))) : t.morph(n).at(s.ease(this.pos)) : (n.relative || n.undo(t.extract()), t = t.multiply(n.at(s.ease(this.pos)))) } i.matrix(t) } return this }, once: function (t, e, i) { var a = this.last(); return i || (t = a.ease(t)), a.once[t] = e, this }, _callStart: function () { return setTimeout(function () { this.start() }.bind(this), 0), this } }, parent: a.Element, construct: { animate: function (t, e, i) { return (this.fx || (this.fx = new a.FX(this))).animate(t, e, i) }, delay: function (t) { return (this.fx || (this.fx = new a.FX(this))).delay(t) }, stop: function (t, e) { return this.fx && this.fx.stop(t, e), this }, finish: function () { return this.fx && this.fx.finish(), this } } }), a.MorphObj = a.invent({ create: function (t, e) { return a.Color.isColor(e) ? new a.Color(t).morph(e) : a.regex.delimiter.test(t) ? a.regex.pathLetters.test(t) ? new a.PathArray(t).morph(e) : new a.Array(t).morph(e) : a.regex.numberAndUnit.test(e) ? new a.Number(t).morph(e) : (this.value = t, void (this.destination = e)) }, extend: { at: function (t, e) { return e < 1 ? this.value : this.destination }, valueOf: function () { return this.value } } }), a.extend(a.FX, { attr: function (t, e, a) { if ("object" === i(t)) for (var s in t) this.attr(s, t[s]); else this.add(t, e, "attrs"); return this }, plot: function (t, e, i, a) { return 4 == arguments.length ? this.plot([t, e, i, a]) : this.add("plot", new (this.target().morphArray)(t)) } }), a.Box = a.invent({ create: function (t, e, s, r) { if (!("object" !== i(t) || t instanceof a.Element)) return a.Box.call(this, null != t.left ? t.left : t.x, null != t.top ? t.top : t.y, t.width, t.height); var o; 4 == arguments.length && (this.x = t, this.y = e, this.width = s, this.height = r), null == (o = this).x && (o.x = 0, o.y = 0, o.width = 0, o.height = 0), o.w = o.width, o.h = o.height, o.x2 = o.x + o.width, o.y2 = o.y + o.height, o.cx = o.x + o.width / 2, o.cy = o.y + o.height / 2 } }), a.BBox = a.invent({ create: function (t) { if (a.Box.apply(this, [].slice.call(arguments)), t instanceof a.Element) { var i; try { if (!e.documentElement.contains) { for (var s = t.node; s.parentNode;)s = s.parentNode; if (s != e) throw new Error("Element not in the dom") } i = t.node.getBBox() } catch (e) { if (t instanceof a.Shape) { a.parser.draw || a.prepare(); var r = t.clone(a.parser.draw.instance).show(); r && r.node && "function" == typeof r.node.getBBox && (i = r.node.getBBox()), r && "function" == typeof r.remove && r.remove() } else i = { x: t.node.clientLeft, y: t.node.clientTop, width: t.node.clientWidth, height: t.node.clientHeight } } a.Box.call(this, i) } }, inherit: a.Box, parent: a.Element, construct: { bbox: function () { return new a.BBox(this) } } }), a.BBox.prototype.constructor = a.BBox, a.Matrix = a.invent({ create: function (t) { var e = f([1, 0, 0, 1, 0, 0]); t = null === t ? e : t instanceof a.Element ? t.matrixify() : "string" == typeof t ? f(t.split(a.regex.delimiter).map(parseFloat)) : 6 == arguments.length ? f([].slice.call(arguments)) : Array.isArray(t) ? f(t) : t && "object" === i(t) ? t : e; for (var s = v.length - 1; s >= 0; --s)this[v[s]] = null != t[v[s]] ? t[v[s]] : e[v[s]] }, extend: { extract: function () { var t = p(this, 0, 1); p(this, 1, 0); var e = 180 / Math.PI * Math.atan2(t.y, t.x) - 90; return { x: this.e, y: this.f, transformedX: (this.e * Math.cos(e * Math.PI / 180) + this.f * Math.sin(e * Math.PI / 180)) / Math.sqrt(this.a * this.a + this.b * this.b), transformedY: (this.f * Math.cos(e * Math.PI / 180) + this.e * Math.sin(-e * Math.PI / 180)) / Math.sqrt(this.c * this.c + this.d * this.d), rotation: e, a: this.a, b: this.b, c: this.c, d: this.d, e: this.e, f: this.f, matrix: new a.Matrix(this) } }, clone: function () { return new a.Matrix(this) }, morph: function (t) { return this.destination = new a.Matrix(t), this }, multiply: function (t) { return new a.Matrix(this.native().multiply(function (t) { return t instanceof a.Matrix || (t = new a.Matrix(t)), t }(t).native())) }, inverse: function () { return new a.Matrix(this.native().inverse()) }, translate: function (t, e) { return new a.Matrix(this.native().translate(t || 0, e || 0)) }, native: function () { for (var t = a.parser.native.createSVGMatrix(), e = v.length - 1; e >= 0; e--)t[v[e]] = this[v[e]]; return t }, toString: function () { return "matrix(" + b(this.a) + "," + b(this.b) + "," + b(this.c) + "," + b(this.d) + "," + b(this.e) + "," + b(this.f) + ")" } }, parent: a.Element, construct: { ctm: function () { return new a.Matrix(this.node.getCTM()) }, screenCTM: function () { if (this instanceof a.Nested) { var t = this.rect(1, 1), e = t.node.getScreenCTM(); return t.remove(), new a.Matrix(e) } return new a.Matrix(this.node.getScreenCTM()) } } }), a.Point = a.invent({ create: function (t, e) { var a; a = Array.isArray(t) ? { x: t[0], y: t[1] } : "object" === i(t) ? { x: t.x, y: t.y } : null != t ? { x: t, y: null != e ? e : t } : { x: 0, y: 0 }, this.x = a.x, this.y = a.y }, extend: { clone: function () { return new a.Point(this) }, morph: function (t, e) { return this.destination = new a.Point(t, e), this } } }), a.extend(a.Element, { point: function (t, e) { return new a.Point(t, e).transform(this.screenCTM().inverse()) } }), a.extend(a.Element, { attr: function (t, e, s) { if (null == t) { for (t = {}, s = (e = this.node.attributes).length - 1; s >= 0; s--)t[e[s].nodeName] = a.regex.isNumber.test(e[s].nodeValue) ? parseFloat(e[s].nodeValue) : e[s].nodeValue; return t } if ("object" === i(t)) for (var r in t) this.attr(r, t[r]); else if (null === e) this.node.removeAttribute(t); else { if (null == e) return null == (e = this.node.getAttribute(t)) ? a.defaults.attrs[t] : a.regex.isNumber.test(e) ? parseFloat(e) : e; "stroke-width" == t ? this.attr("stroke", parseFloat(e) > 0 ? this._stroke : null) : "stroke" == t && (this._stroke = e), "fill" != t && "stroke" != t || (a.regex.isImage.test(e) && (e = this.doc().defs().image(e, 0, 0)), e instanceof a.Image && (e = this.doc().defs().pattern(0, 0, (function () { this.add(e) })))), "number" == typeof e ? e = new a.Number(e) : a.Color.isColor(e) ? e = new a.Color(e) : Array.isArray(e) && (e = new a.Array(e)), "leading" == t ? this.leading && this.leading(e) : "string" == typeof s ? this.node.setAttributeNS(s, t, e.toString()) : this.node.setAttribute(t, e.toString()), !this.rebuild || "font-size" != t && "x" != t || this.rebuild(t, e) } return this } }), a.extend(a.Element, { transform: function (t, e) { var s; return "object" !== i(t) ? (s = new a.Matrix(this).extract(), "string" == typeof t ? s[t] : s) : (s = new a.Matrix(this), e = !!e || !!t.relative, null != t.a && (s = e ? s.multiply(new a.Matrix(t)) : new a.Matrix(t)), this.attr("transform", s)) } }), a.extend(a.Element, { untransform: function () { return this.attr("transform", null) }, matrixify: function () { return (this.attr("transform") || "").split(a.regex.transforms).slice(0, -1).map((function (t) { var e = t.trim().split("("); return [e[0], e[1].split(a.regex.delimiter).map((function (t) { return parseFloat(t) }))] })).reduce((function (t, e) { return "matrix" == e[0] ? t.multiply(f(e[1])) : t[e[0]].apply(t, e[1]) }), new a.Matrix) }, toParent: function (t) { if (this == t) return this; var e = this.screenCTM(), i = t.screenCTM().inverse(); return this.addTo(t).untransform().transform(i.multiply(e)), this }, toDoc: function () { return this.toParent(this.doc()) } }), a.Transformation = a.invent({ create: function (t, e) { if (arguments.length > 1 && "boolean" != typeof e) return this.constructor.call(this, [].slice.call(arguments)); if (Array.isArray(t)) for (var a = 0, s = this.arguments.length; a < s; ++a)this[this.arguments[a]] = t[a]; else if (t && "object" === i(t)) for (a = 0, s = this.arguments.length; a < s; ++a)this[this.arguments[a]] = t[this.arguments[a]]; this.inversed = !1, !0 === e && (this.inversed = !0) } }), a.Translate = a.invent({ parent: a.Matrix, inherit: a.Transformation, create: function (t, e) { this.constructor.apply(this, [].slice.call(arguments)) }, extend: { arguments: ["transformedX", "transformedY"], method: "translate" } }), a.extend(a.Element, { style: function (t, e) { if (0 == arguments.length) return this.node.style.cssText || ""; if (arguments.length < 2) if ("object" === i(t)) for (var s in t) this.style(s, t[s]); else { if (!a.regex.isCss.test(t)) return this.node.style[c(t)]; for (t = t.split(/\s*;\s*/).filter((function (t) { return !!t })).map((function (t) { return t.split(/\s*:\s*/) })); e = t.pop();)this.style(e[0], e[1]) } else this.node.style[c(t)] = null === e || a.regex.isBlank.test(e) ? "" : e; return this } }), a.Parent = a.invent({ create: function (t) { this.constructor.call(this, t) }, inherit: a.Element, extend: { children: function () { return a.utils.map(a.utils.filterSVGElements(this.node.childNodes), (function (t) { return a.adopt(t) })) }, add: function (t, e) { return null == e ? this.node.appendChild(t.node) : t.node != this.node.childNodes[e] && this.node.insertBefore(t.node, this.node.childNodes[e]), this }, put: function (t, e) { return this.add(t, e), t }, has: function (t) { return this.index(t) >= 0 }, index: function (t) { return [].slice.call(this.node.childNodes).indexOf(t.node) }, get: function (t) { return a.adopt(this.node.childNodes[t]) }, first: function () { return this.get(0) }, last: function () { return this.get(this.node.childNodes.length - 1) }, each: function (t, e) { for (var i = this.children(), s = 0, r = i.length; s < r; s++)i[s] instanceof a.Element && t.apply(i[s], [s, i]), e && i[s] instanceof a.Container && i[s].each(t, e); return this }, removeElement: function (t) { return this.node.removeChild(t.node), this }, clear: function () { for (; this.node.hasChildNodes();)this.node.removeChild(this.node.lastChild); return delete this._defs, this }, defs: function () { return this.doc().defs() } } }), a.extend(a.Parent, { ungroup: function (t, e) { return 0 === e || this instanceof a.Defs || this.node == a.parser.draw || (t = t || (this instanceof a.Doc ? this : this.parent(a.Parent)), e = e || 1 / 0, this.each((function () { return this instanceof a.Defs ? this : this instanceof a.Parent ? this.ungroup(t, e - 1) : this.toParent(t) })), this.node.firstChild || this.remove()), this }, flatten: function (t, e) { return this.ungroup(t, e) } }), a.Container = a.invent({ create: function (t) { this.constructor.call(this, t) }, inherit: a.Parent }), a.ViewBox = a.invent({ parent: a.Container, construct: {} }), ["click", "dblclick", "mousedown", "mouseup", "mouseover", "mouseout", "mousemove", "touchstart", "touchmove", "touchleave", "touchend", "touchcancel"].forEach((function (t) { a.Element.prototype[t] = function (e) { return a.on(this.node, t, e), this } })), a.listeners = [], a.handlerMap = [], a.listenerId = 0, a.on = function (t, e, i, s, r) { var o = i.bind(s || t.instance || t), n = (a.handlerMap.indexOf(t) + 1 || a.handlerMap.push(t)) - 1, l = e.split(".")[0], h = e.split(".")[1] || "*"; a.listeners[n] = a.listeners[n] || {}, a.listeners[n][l] = a.listeners[n][l] || {}, a.listeners[n][l][h] = a.listeners[n][l][h] || {}, i._svgjsListenerId || (i._svgjsListenerId = ++a.listenerId), a.listeners[n][l][h][i._svgjsListenerId] = o, t.addEventListener(l, o, r || { passive: !1 }) }, a.off = function (t, e, i) { var s = a.handlerMap.indexOf(t), r = e && e.split(".")[0], o = e && e.split(".")[1], n = ""; if (-1 != s) if (i) { if ("function" == typeof i && (i = i._svgjsListenerId), !i) return; a.listeners[s][r] && a.listeners[s][r][o || "*"] && (t.removeEventListener(r, a.listeners[s][r][o || "*"][i], !1), delete a.listeners[s][r][o || "*"][i]) } else if (o && r) { if (a.listeners[s][r] && a.listeners[s][r][o]) { for (var l in a.listeners[s][r][o]) a.off(t, [r, o].join("."), l); delete a.listeners[s][r][o] } } else if (o) for (var h in a.listeners[s]) for (var n in a.listeners[s][h]) o === n && a.off(t, [h, o].join(".")); else if (r) { if (a.listeners[s][r]) { for (var n in a.listeners[s][r]) a.off(t, [r, n].join(".")); delete a.listeners[s][r] } } else { for (var h in a.listeners[s]) a.off(t, h); delete a.listeners[s], delete a.handlerMap[s] } }, a.extend(a.Element, { on: function (t, e, i, s) { return a.on(this.node, t, e, i, s), this }, off: function (t, e) { return a.off(this.node, t, e), this }, fire: function (e, i) { return e instanceof t.Event ? this.node.dispatchEvent(e) : this.node.dispatchEvent(e = new a.CustomEvent(e, { detail: i, cancelable: !0 })), this._event = e, this }, event: function () { return this._event } }), a.Defs = a.invent({ create: "defs", inherit: a.Container }), a.G = a.invent({ create: "g", inherit: a.Container, extend: { x: function (t) { return null == t ? this.transform("x") : this.transform({ x: t - this.x() }, !0) } }, construct: { group: function () { return this.put(new a.G) } } }), a.Doc = a.invent({ create: function (t) { t && ("svg" == (t = "string" == typeof t ? e.getElementById(t) : t).nodeName ? this.constructor.call(this, t) : (this.constructor.call(this, a.create("svg")), t.appendChild(this.node), this.size("100%", "100%")), this.namespace().defs()) }, inherit: a.Container, extend: { namespace: function () { return this.attr({ xmlns: a.ns, version: "1.1" }).attr("xmlns:xlink", a.xlink, a.xmlns).attr("xmlns:svgjs", a.svgjs, a.xmlns) }, defs: function () { var t; return this._defs || ((t = this.node.getElementsByTagName("defs")[0]) ? this._defs = a.adopt(t) : this._defs = new a.Defs, this.node.appendChild(this._defs.node)), this._defs }, parent: function () { return this.node.parentNode && "#document" != this.node.parentNode.nodeName ? this.node.parentNode : null }, remove: function () { return this.parent() && this.parent().removeChild(this.node), this }, clear: function () { for (; this.node.hasChildNodes();)this.node.removeChild(this.node.lastChild); return delete this._defs, a.parser.draw && !a.parser.draw.parentNode && this.node.appendChild(a.parser.draw), this }, clone: function (t) { this.writeDataToDom(); var e = this.node, i = x(e.cloneNode(!0)); return t ? (t.node || t).appendChild(i.node) : e.parentNode.insertBefore(i.node, e.nextSibling), i } } }), a.extend(a.Element, {}), a.Gradient = a.invent({ create: function (t) { this.constructor.call(this, a.create(t + "Gradient")), this.type = t }, inherit: a.Container, extend: { at: function (t, e, i) { return this.put(new a.Stop).update(t, e, i) }, update: function (t) { return this.clear(), "function" == typeof t && t.call(this, this), this }, fill: function () { return "url(#" + this.id() + ")" }, toString: function () { return this.fill() }, attr: function (t, e, i) { return "transform" == t && (t = "gradientTransform"), a.Container.prototype.attr.call(this, t, e, i) } }, construct: { gradient: function (t, e) { return this.defs().gradient(t, e) } } }), a.extend(a.Gradient, a.FX, { from: function (t, e) { return "radial" == (this._target || this).type ? this.attr({ fx: new a.Number(t), fy: new a.Number(e) }) : this.attr({ x1: new a.Number(t), y1: new a.Number(e) }) }, to: function (t, e) { return "radial" == (this._target || this).type ? this.attr({ cx: new a.Number(t), cy: new a.Number(e) }) : this.attr({ x2: new a.Number(t), y2: new a.Number(e) }) } }), a.extend(a.Defs, { gradient: function (t, e) { return this.put(new a.Gradient(t)).update(e) } }), a.Stop = a.invent({ create: "stop", inherit: a.Element, extend: { update: function (t) { return ("number" == typeof t || t instanceof a.Number) && (t = { offset: arguments[0], color: arguments[1], opacity: arguments[2] }), null != t.opacity && this.attr("stop-opacity", t.opacity), null != t.color && this.attr("stop-color", t.color), null != t.offset && this.attr("offset", new a.Number(t.offset)), this } } }), a.Pattern = a.invent({ create: "pattern", inherit: a.Container, extend: { fill: function () { return "url(#" + this.id() + ")" }, update: function (t) { return this.clear(), "function" == typeof t && t.call(this, this), this }, toString: function () { return this.fill() }, attr: function (t, e, i) { return "transform" == t && (t = "patternTransform"), a.Container.prototype.attr.call(this, t, e, i) } }, construct: { pattern: function (t, e, i) { return this.defs().pattern(t, e, i) } } }), a.extend(a.Defs, { pattern: function (t, e, i) { return this.put(new a.Pattern).update(i).attr({ x: 0, y: 0, width: t, height: e, patternUnits: "userSpaceOnUse" }) } }), a.Shape = a.invent({ create: function (t) { this.constructor.call(this, t) }, inherit: a.Element }), a.Symbol = a.invent({ create: "symbol", inherit: a.Container, construct: { symbol: function () { return this.put(new a.Symbol) } } }), a.Use = a.invent({ create: "use", inherit: a.Shape, extend: { element: function (t, e) { return this.attr("href", (e || "") + "#" + t, a.xlink) } }, construct: { use: function (t, e) { return this.put(new a.Use).element(t, e) } } }), a.Rect = a.invent({ create: "rect", inherit: a.Shape, construct: { rect: function (t, e) { return this.put(new a.Rect).size(t, e) } } }), a.Circle = a.invent({ create: "circle", inherit: a.Shape, construct: { circle: function (t) { return this.put(new a.Circle).rx(new a.Number(t).divide(2)).move(0, 0) } } }), a.extend(a.Circle, a.FX, { rx: function (t) { return this.attr("r", t) }, ry: function (t) { return this.rx(t) } }), a.Ellipse = a.invent({ create: "ellipse", inherit: a.Shape, construct: { ellipse: function (t, e) { return this.put(new a.Ellipse).size(t, e).move(0, 0) } } }), a.extend(a.Ellipse, a.Rect, a.FX, { rx: function (t) { return this.attr("rx", t) }, ry: function (t) { return this.attr("ry", t) } }), a.extend(a.Circle, a.Ellipse, { x: function (t) { return null == t ? this.cx() - this.rx() : this.cx(t + this.rx()) }, y: function (t) { return null == t ? this.cy() - this.ry() : this.cy(t + this.ry()) }, cx: function (t) { return null == t ? this.attr("cx") : this.attr("cx", t) }, cy: function (t) { return null == t ? this.attr("cy") : this.attr("cy", t) }, width: function (t) { return null == t ? 2 * this.rx() : this.rx(new a.Number(t).divide(2)) }, height: function (t) { return null == t ? 2 * this.ry() : this.ry(new a.Number(t).divide(2)) }, size: function (t, e) { var i = u(this, t, e); return this.rx(new a.Number(i.width).divide(2)).ry(new a.Number(i.height).divide(2)) } }), a.Line = a.invent({ create: "line", inherit: a.Shape, extend: { array: function () { return new a.PointArray([[this.attr("x1"), this.attr("y1")], [this.attr("x2"), this.attr("y2")]]) }, plot: function (t, e, i, s) { return null == t ? this.array() : (t = void 0 !== e ? { x1: t, y1: e, x2: i, y2: s } : new a.PointArray(t).toLine(), this.attr(t)) }, move: function (t, e) { return this.attr(this.array().move(t, e).toLine()) }, size: function (t, e) { var i = u(this, t, e); return this.attr(this.array().size(i.width, i.height).toLine()) } }, construct: { line: function (t, e, i, s) { return a.Line.prototype.plot.apply(this.put(new a.Line), null != t ? [t, e, i, s] : [0, 0, 0, 0]) } } }), a.Polyline = a.invent({ create: "polyline", inherit: a.Shape, construct: { polyline: function (t) { return this.put(new a.Polyline).plot(t || new a.PointArray) } } }), a.Polygon = a.invent({ create: "polygon", inherit: a.Shape, construct: { polygon: function (t) { return this.put(new a.Polygon).plot(t || new a.PointArray) } } }), a.extend(a.Polyline, a.Polygon, { array: function () { return this._array || (this._array = new a.PointArray(this.attr("points"))) }, plot: function (t) { return null == t ? this.array() : this.clear().attr("points", "string" == typeof t ? t : this._array = new a.PointArray(t)) }, clear: function () { return delete this._array, this }, move: function (t, e) { return this.attr("points", this.array().move(t, e)) }, size: function (t, e) { var i = u(this, t, e); return this.attr("points", this.array().size(i.width, i.height)) } }), a.extend(a.Line, a.Polyline, a.Polygon, { morphArray: a.PointArray, x: function (t) { return null == t ? this.bbox().x : this.move(t, this.bbox().y) }, y: function (t) { return null == t ? this.bbox().y : this.move(this.bbox().x, t) }, width: function (t) { var e = this.bbox(); return null == t ? e.width : this.size(t, e.height) }, height: function (t) { var e = this.bbox(); return null == t ? e.height : this.size(e.width, t) } }), a.Path = a.invent({ create: "path", inherit: a.Shape, extend: { morphArray: a.PathArray, array: function () { return this._array || (this._array = new a.PathArray(this.attr("d"))) }, plot: function (t) { return null == t ? this.array() : this.clear().attr("d", "string" == typeof t ? t : this._array = new a.PathArray(t)) }, clear: function () { return delete this._array, this } }, construct: { path: function (t) { return this.put(new a.Path).plot(t || new a.PathArray) } } }), a.Image = a.invent({ create: "image", inherit: a.Shape, extend: { load: function (e) { if (!e) return this; var i = this, s = new t.Image; return a.on(s, "load", (function () { a.off(s); var t = i.parent(a.Pattern); null !== t && (0 == i.width() && 0 == i.height() && i.size(s.width, s.height), t && 0 == t.width() && 0 == t.height() && t.size(i.width(), i.height()), "function" == typeof i._loaded && i._loaded.call(i, { width: s.width, height: s.height, ratio: s.width / s.height, url: e })) })), a.on(s, "error", (function (t) { a.off(s), "function" == typeof i._error && i._error.call(i, t) })), this.attr("href", s.src = this.src = e, a.xlink) }, loaded: function (t) { return this._loaded = t, this }, error: function (t) { return this._error = t, this } }, construct: { image: function (t, e, i) { return this.put(new a.Image).load(t).size(e || 0, i || e || 0) } } }), a.Text = a.invent({ create: function () { this.constructor.call(this, a.create("text")), this.dom.leading = new a.Number(1.3), this._rebuild = !0, this._build = !1, this.attr("font-family", a.defaults.attrs["font-family"]) }, inherit: a.Shape, extend: { x: function (t) { return null == t ? this.attr("x") : this.attr("x", t) }, text: function (t) { if (void 0 === t) { t = ""; for (var e = this.node.childNodes, i = 0, s = e.length; i < s; ++i)0 != i && 3 != e[i].nodeType && 1 == a.adopt(e[i]).dom.newLined && (t += "\n"), t += e[i].textContent; return t } if (this.clear().build(!0), "function" == typeof t) t.call(this, this); else { i = 0; for (var r = (t = t.split("\n")).length; i < r; i++)this.tspan(t[i]).newLine() } return this.build(!1).rebuild() }, size: function (t) { return this.attr("font-size", t).rebuild() }, leading: function (t) { return null == t ? this.dom.leading : (this.dom.leading = new a.Number(t), this.rebuild()) }, lines: function () { var t = (this.textPath && this.textPath() || this).node, e = a.utils.map(a.utils.filterSVGElements(t.childNodes), (function (t) { return a.adopt(t) })); return new a.Set(e) }, rebuild: function (t) { if ("boolean" == typeof t && (this._rebuild = t), this._rebuild) { var e = this, i = 0, s = this.dom.leading * new a.Number(this.attr("font-size")); this.lines().each((function () { this.dom.newLined && (e.textPath() || this.attr("x", e.attr("x")), "\n" == this.text() ? i += s : (this.attr("dy", s + i), i = 0)) })), this.fire("rebuild") } return this }, build: function (t) { return this._build = !!t, this }, setData: function (t) { return this.dom = t, this.dom.leading = new a.Number(t.leading || 1.3), this } }, construct: { text: function (t) { return this.put(new a.Text).text(t) }, plain: function (t) { return this.put(new a.Text).plain(t) } } }), a.Tspan = a.invent({ create: "tspan", inherit: a.Shape, extend: { text: function (t) { return null == t ? this.node.textContent + (this.dom.newLined ? "\n" : "") : ("function" == typeof t ? t.call(this, this) : this.plain(t), this) }, dx: function (t) { return this.attr("dx", t) }, dy: function (t) { return this.attr("dy", t) }, newLine: function () { var t = this.parent(a.Text); return this.dom.newLined = !0, this.dy(t.dom.leading * t.attr("font-size")).attr("x", t.x()) } } }), a.extend(a.Text, a.Tspan, { plain: function (t) { return !1 === this._build && this.clear(), this.node.appendChild(e.createTextNode(t)), this }, tspan: function (t) { var e = (this.textPath && this.textPath() || this).node, i = new a.Tspan; return !1 === this._build && this.clear(), e.appendChild(i.node), i.text(t) }, clear: function () { for (var t = (this.textPath && this.textPath() || this).node; t.hasChildNodes();)t.removeChild(t.lastChild); return this }, length: function () { return this.node.getComputedTextLength() } }), a.TextPath = a.invent({ create: "textPath", inherit: a.Parent, parent: a.Text, construct: { morphArray: a.PathArray, array: function () { var t = this.track(); return t ? t.array() : null }, plot: function (t) { var e = this.track(), i = null; return e && (i = e.plot(t)), null == t ? i : this }, track: function () { var t = this.textPath(); if (t) return t.reference("href") }, textPath: function () { if (this.node.firstChild && "textPath" == this.node.firstChild.nodeName) return a.adopt(this.node.firstChild) } } }), a.Nested = a.invent({ create: function () { this.constructor.call(this, a.create("svg")), this.style("overflow", "visible") }, inherit: a.Container, construct: { nested: function () { return this.put(new a.Nested) } } }); var l = { stroke: ["color", "width", "opacity", "linecap", "linejoin", "miterlimit", "dasharray", "dashoffset"], fill: ["color", "opacity", "rule"], prefix: function (t, e) { return "color" == e ? t : t + "-" + e } }; function h(t, e, i, s) { return i + s.replace(a.regex.dots, " .") } function c(t) { return t.toLowerCase().replace(/-(.)/g, (function (t, e) { return e.toUpperCase() })) } function d(t) { return t.charAt(0).toUpperCase() + t.slice(1) } function g(t) { var e = t.toString(16); return 1 == e.length ? "0" + e : e } function u(t, e, i) { if (null == e || null == i) { var a = t.bbox(); null == e ? e = a.width / a.height * i : null == i && (i = a.height / a.width * e) } return { width: e, height: i } } function p(t, e, i) { return { x: e * t.a + i * t.c + 0, y: e * t.b + i * t.d + 0 } } function f(t) { return { a: t[0], b: t[1], c: t[2], d: t[3], e: t[4], f: t[5] } } function x(e) { for (var i = e.childNodes.length - 1; i >= 0; i--)e.childNodes[i] instanceof t.SVGElement && x(e.childNodes[i]); return a.adopt(e).id(a.eid(e.nodeName)) } function b(t) { return Math.abs(t) > 1e-37 ? t : 0 } ["fill", "stroke"].forEach((function (t) { var e = {}; e[t] = function (e) { if (void 0 === e) return this; if ("string" == typeof e || a.Color.isRgb(e) || e && "function" == typeof e.fill) this.attr(t, e); else for (var i = l[t].length - 1; i >= 0; i--)null != e[l[t][i]] && this.attr(l.prefix(t, l[t][i]), e[l[t][i]]); return this }, a.extend(a.Element, a.FX, e) })), a.extend(a.Element, a.FX, { translate: function (t, e) { return this.transform({ x: t, y: e }) }, matrix: function (t) { return this.attr("transform", new a.Matrix(6 == arguments.length ? [].slice.call(arguments) : t)) }, opacity: function (t) { return this.attr("opacity", t) }, dx: function (t) { return this.x(new a.Number(t).plus(this instanceof a.FX ? 0 : this.x()), !0) }, dy: function (t) { return this.y(new a.Number(t).plus(this instanceof a.FX ? 0 : this.y()), !0) } }), a.extend(a.Path, { length: function () { return this.node.getTotalLength() }, pointAt: function (t) { return this.node.getPointAtLength(t) } }), a.Set = a.invent({ create: function (t) { Array.isArray(t) ? this.members = t : this.clear() }, extend: { add: function () { for (var t = [].slice.call(arguments), e = 0, i = t.length; e < i; e++)this.members.push(t[e]); return this }, remove: function (t) { var e = this.index(t); return e > -1 && this.members.splice(e, 1), this }, each: function (t) { for (var e = 0, i = this.members.length; e < i; e++)t.apply(this.members[e], [e, this.members]); return this }, clear: function () { return this.members = [], this }, length: function () { return this.members.length }, has: function (t) { return this.index(t) >= 0 }, index: function (t) { return this.members.indexOf(t) }, get: function (t) { return this.members[t] }, first: function () { return this.get(0) }, last: function () { return this.get(this.members.length - 1) }, valueOf: function () { return this.members } }, construct: { set: function (t) { return new a.Set(t) } } }), a.FX.Set = a.invent({ create: function (t) { this.set = t } }), a.Set.inherit = function () { var t = []; for (var e in a.Shape.prototype) "function" == typeof a.Shape.prototype[e] && "function" != typeof a.Set.prototype[e] && t.push(e); for (var e in t.forEach((function (t) { a.Set.prototype[t] = function () { for (var e = 0, i = this.members.length; e < i; e++)this.members[e] && "function" == typeof this.members[e][t] && this.members[e][t].apply(this.members[e], arguments); return "animate" == t ? this.fx || (this.fx = new a.FX.Set(this)) : this } })), t = [], a.FX.prototype) "function" == typeof a.FX.prototype[e] && "function" != typeof a.FX.Set.prototype[e] && t.push(e); t.forEach((function (t) { a.FX.Set.prototype[t] = function () { for (var e = 0, i = this.set.members.length; e < i; e++)this.set.members[e].fx[t].apply(this.set.members[e].fx, arguments); return this } })) }, a.extend(a.Element, {}), a.extend(a.Element, { remember: function (t, e) { if ("object" === i(arguments[0])) for (var a in t) this.remember(a, t[a]); else { if (1 == arguments.length) return this.memory()[t]; this.memory()[t] = e } return this }, forget: function () { if (0 == arguments.length) this._memory = {}; else for (var t = arguments.length - 1; t >= 0; t--)delete this.memory()[arguments[t]]; return this }, memory: function () { return this._memory || (this._memory = {}) } }), a.get = function (t) { var i = e.getElementById(function (t) { var e = (t || "").toString().match(a.regex.reference); if (e) return e[1] }(t) || t); return a.adopt(i) }, a.select = function (t, i) { return new a.Set(a.utils.map((i || e).querySelectorAll(t), (function (t) { return a.adopt(t) }))) }, a.extend(a.Parent, { select: function (t) { return a.select(t, this.node) } }); var v = "abcdef".split(""); if ("function" != typeof t.CustomEvent) { var m = function (t, i) { i = i || { bubbles: !1, cancelable: !1, detail: void 0 }; var a = e.createEvent("CustomEvent"); return a.initCustomEvent(t, i.bubbles, i.cancelable, i.detail), a }; m.prototype = t.Event.prototype, a.CustomEvent = m } else a.CustomEvent = t.CustomEvent; return a }, "function" == typeof define && define.amd ? define((function () { return Ht(Rt, Rt.document) })) : "object" === ("undefined" == typeof exports ? "undefined" : i(exports)) && "undefined" != typeof module ? module.exports = Rt.document ? Ht(Rt, Rt.document) : function (t) { return Ht(t, t.document) } : Rt.SVG = Ht(Rt, Rt.document), - /*! svg.filter.js - v2.0.2 - 2016-02-24 - * https://github.com/wout/svg.filter.js - * Copyright (c) 2016 Wout Fierens; Licensed MIT */ - function () { SVG.Filter = SVG.invent({ create: "filter", inherit: SVG.Parent, extend: { source: "SourceGraphic", sourceAlpha: "SourceAlpha", background: "BackgroundImage", backgroundAlpha: "BackgroundAlpha", fill: "FillPaint", stroke: "StrokePaint", autoSetIn: !0, put: function (t, e) { return this.add(t, e), !t.attr("in") && this.autoSetIn && t.attr("in", this.source), t.attr("result") || t.attr("result", t), t }, blend: function (t, e, i) { return this.put(new SVG.BlendEffect(t, e, i)) }, colorMatrix: function (t, e) { return this.put(new SVG.ColorMatrixEffect(t, e)) }, convolveMatrix: function (t) { return this.put(new SVG.ConvolveMatrixEffect(t)) }, componentTransfer: function (t) { return this.put(new SVG.ComponentTransferEffect(t)) }, composite: function (t, e, i) { return this.put(new SVG.CompositeEffect(t, e, i)) }, flood: function (t, e) { return this.put(new SVG.FloodEffect(t, e)) }, offset: function (t, e) { return this.put(new SVG.OffsetEffect(t, e)) }, image: function (t) { return this.put(new SVG.ImageEffect(t)) }, merge: function () { var t = [void 0]; for (var e in arguments) t.push(arguments[e]); return this.put(new (SVG.MergeEffect.bind.apply(SVG.MergeEffect, t))) }, gaussianBlur: function (t, e) { return this.put(new SVG.GaussianBlurEffect(t, e)) }, morphology: function (t, e) { return this.put(new SVG.MorphologyEffect(t, e)) }, diffuseLighting: function (t, e, i) { return this.put(new SVG.DiffuseLightingEffect(t, e, i)) }, displacementMap: function (t, e, i, a, s) { return this.put(new SVG.DisplacementMapEffect(t, e, i, a, s)) }, specularLighting: function (t, e, i, a) { return this.put(new SVG.SpecularLightingEffect(t, e, i, a)) }, tile: function () { return this.put(new SVG.TileEffect) }, turbulence: function (t, e, i, a, s) { return this.put(new SVG.TurbulenceEffect(t, e, i, a, s)) }, toString: function () { return "url(#" + this.attr("id") + ")" } } }), SVG.extend(SVG.Defs, { filter: function (t) { var e = this.put(new SVG.Filter); return "function" == typeof t && t.call(e, e), e } }), SVG.extend(SVG.Container, { filter: function (t) { return this.defs().filter(t) } }), SVG.extend(SVG.Element, SVG.G, SVG.Nested, { filter: function (t) { return this.filterer = t instanceof SVG.Element ? t : this.doc().filter(t), this.doc() && this.filterer.doc() !== this.doc() && this.doc().defs().add(this.filterer), this.attr("filter", this.filterer), this.filterer }, unfilter: function (t) { return this.filterer && !0 === t && this.filterer.remove(), delete this.filterer, this.attr("filter", null) } }), SVG.Effect = SVG.invent({ create: function () { this.constructor.call(this) }, inherit: SVG.Element, extend: { in: function (t) { return null == t ? this.parent() && this.parent().select('[result="' + this.attr("in") + '"]').get(0) || this.attr("in") : this.attr("in", t) }, result: function (t) { return null == t ? this.attr("result") : this.attr("result", t) }, toString: function () { return this.result() } } }), SVG.ParentEffect = SVG.invent({ create: function () { this.constructor.call(this) }, inherit: SVG.Parent, extend: { in: function (t) { return null == t ? this.parent() && this.parent().select('[result="' + this.attr("in") + '"]').get(0) || this.attr("in") : this.attr("in", t) }, result: function (t) { return null == t ? this.attr("result") : this.attr("result", t) }, toString: function () { return this.result() } } }); var t = { blend: function (t, e) { return this.parent() && this.parent().blend(this, t, e) }, colorMatrix: function (t, e) { return this.parent() && this.parent().colorMatrix(t, e).in(this) }, convolveMatrix: function (t) { return this.parent() && this.parent().convolveMatrix(t).in(this) }, componentTransfer: function (t) { return this.parent() && this.parent().componentTransfer(t).in(this) }, composite: function (t, e) { return this.parent() && this.parent().composite(this, t, e) }, flood: function (t, e) { return this.parent() && this.parent().flood(t, e) }, offset: function (t, e) { return this.parent() && this.parent().offset(t, e).in(this) }, image: function (t) { return this.parent() && this.parent().image(t) }, merge: function () { return this.parent() && this.parent().merge.apply(this.parent(), [this].concat(arguments)) }, gaussianBlur: function (t, e) { return this.parent() && this.parent().gaussianBlur(t, e).in(this) }, morphology: function (t, e) { return this.parent() && this.parent().morphology(t, e).in(this) }, diffuseLighting: function (t, e, i) { return this.parent() && this.parent().diffuseLighting(t, e, i).in(this) }, displacementMap: function (t, e, i, a) { return this.parent() && this.parent().displacementMap(this, t, e, i, a) }, specularLighting: function (t, e, i, a) { return this.parent() && this.parent().specularLighting(t, e, i, a).in(this) }, tile: function () { return this.parent() && this.parent().tile().in(this) }, turbulence: function (t, e, i, a, s) { return this.parent() && this.parent().turbulence(t, e, i, a, s).in(this) } }; SVG.extend(SVG.Effect, t), SVG.extend(SVG.ParentEffect, t), SVG.ChildEffect = SVG.invent({ create: function () { this.constructor.call(this) }, inherit: SVG.Element, extend: { in: function (t) { this.attr("in", t) } } }); var e = { blend: function (t, e, i) { this.attr({ in: t, in2: e, mode: i || "normal" }) }, colorMatrix: function (t, e) { "matrix" == t && (e = s(e)), this.attr({ type: t, values: void 0 === e ? null : e }) }, convolveMatrix: function (t) { t = s(t), this.attr({ order: Math.sqrt(t.split(" ").length), kernelMatrix: t }) }, composite: function (t, e, i) { this.attr({ in: t, in2: e, operator: i }) }, flood: function (t, e) { this.attr("flood-color", t), null != e && this.attr("flood-opacity", e) }, offset: function (t, e) { this.attr({ dx: t, dy: e }) }, image: function (t) { this.attr("href", t, SVG.xlink) }, displacementMap: function (t, e, i, a, s) { this.attr({ in: t, in2: e, scale: i, xChannelSelector: a, yChannelSelector: s }) }, gaussianBlur: function (t, e) { null != t || null != e ? this.attr("stdDeviation", function (t) { if (!Array.isArray(t)) return t; for (var e = 0, i = t.length, a = []; e < i; e++)a.push(t[e]); return a.join(" ") }(Array.prototype.slice.call(arguments))) : this.attr("stdDeviation", "0 0") }, morphology: function (t, e) { this.attr({ operator: t, radius: e }) }, tile: function () { }, turbulence: function (t, e, i, a, s) { this.attr({ numOctaves: e, seed: i, stitchTiles: a, baseFrequency: t, type: s }) } }, i = { merge: function () { var t; if (arguments[0] instanceof SVG.Set) { var e = this; arguments[0].each((function (t) { this instanceof SVG.MergeNode ? e.put(this) : (this instanceof SVG.Effect || this instanceof SVG.ParentEffect) && e.put(new SVG.MergeNode(this)) })) } else { t = Array.isArray(arguments[0]) ? arguments[0] : arguments; for (var i = 0; i < t.length; i++)t[i] instanceof SVG.MergeNode ? this.put(t[i]) : this.put(new SVG.MergeNode(t[i])) } }, componentTransfer: function (t) { if (this.rgb = new SVG.Set, ["r", "g", "b", "a"].forEach(function (t) { this[t] = new (SVG["Func" + t.toUpperCase()])("identity"), this.rgb.add(this[t]), this.node.appendChild(this[t].node) }.bind(this)), t) for (var e in t.rgb && (["r", "g", "b"].forEach(function (e) { this[e].attr(t.rgb) }.bind(this)), delete t.rgb), t) this[e].attr(t[e]) }, diffuseLighting: function (t, e, i) { this.attr({ surfaceScale: t, diffuseConstant: e, kernelUnitLength: i }) }, specularLighting: function (t, e, i, a) { this.attr({ surfaceScale: t, diffuseConstant: e, specularExponent: i, kernelUnitLength: a }) } }, a = { distantLight: function (t, e) { this.attr({ azimuth: t, elevation: e }) }, pointLight: function (t, e, i) { this.attr({ x: t, y: e, z: i }) }, spotLight: function (t, e, i, a, s, r) { this.attr({ x: t, y: e, z: i, pointsAtX: a, pointsAtY: s, pointsAtZ: r }) }, mergeNode: function (t) { this.attr("in", t) } }; function s(t) { return Array.isArray(t) && (t = new SVG.Array(t)), t.toString().replace(/^\s+/, "").replace(/\s+$/, "").replace(/\s+/g, " ") } function r() { var t = function () { }; for (var e in "function" == typeof arguments[arguments.length - 1] && (t = arguments[arguments.length - 1], Array.prototype.splice.call(arguments, arguments.length - 1, 1)), arguments) for (var i in arguments[e]) t(arguments[e][i], i, arguments[e]) } ["r", "g", "b", "a"].forEach((function (t) { a["Func" + t.toUpperCase()] = function (t) { switch (this.attr("type", t), t) { case "table": this.attr("tableValues", arguments[1]); break; case "linear": this.attr("slope", arguments[1]), this.attr("intercept", arguments[2]); break; case "gamma": this.attr("amplitude", arguments[1]), this.attr("exponent", arguments[2]), this.attr("offset", arguments[2]) } } })), r(e, (function (t, e) { var i = e.charAt(0).toUpperCase() + e.slice(1); SVG[i + "Effect"] = SVG.invent({ create: function () { this.constructor.call(this, SVG.create("fe" + i)), t.apply(this, arguments), this.result(this.attr("id") + "Out") }, inherit: SVG.Effect, extend: {} }) })), r(i, (function (t, e) { var i = e.charAt(0).toUpperCase() + e.slice(1); SVG[i + "Effect"] = SVG.invent({ create: function () { this.constructor.call(this, SVG.create("fe" + i)), t.apply(this, arguments), this.result(this.attr("id") + "Out") }, inherit: SVG.ParentEffect, extend: {} }) })), r(a, (function (t, e) { var i = e.charAt(0).toUpperCase() + e.slice(1); SVG[i] = SVG.invent({ create: function () { this.constructor.call(this, SVG.create("fe" + i)), t.apply(this, arguments) }, inherit: SVG.ChildEffect, extend: {} }) })), SVG.extend(SVG.MergeEffect, { in: function (t) { return t instanceof SVG.MergeNode ? this.add(t, 0) : this.add(new SVG.MergeNode(t), 0), this } }), SVG.extend(SVG.CompositeEffect, SVG.BlendEffect, SVG.DisplacementMapEffect, { in2: function (t) { return null == t ? this.parent() && this.parent().select('[result="' + this.attr("in2") + '"]').get(0) || this.attr("in2") : this.attr("in2", t) } }), SVG.filter = { sepiatone: [.343, .669, .119, 0, 0, .249, .626, .13, 0, 0, .172, .334, .111, 0, 0, 0, 0, 0, 1, 0] } }.call(void 0), function () { function t(t, s, r, o, n, l, h) { for (var c = t.slice(s, r || h), d = o.slice(n, l || h), g = 0, u = { pos: [0, 0], start: [0, 0] }, p = { pos: [0, 0], start: [0, 0] }; ;) { if (c[g] = e.call(u, c[g]), d[g] = e.call(p, d[g]), c[g][0] != d[g][0] || "M" == c[g][0] || "A" == c[g][0] && (c[g][4] != d[g][4] || c[g][5] != d[g][5]) ? (Array.prototype.splice.apply(c, [g, 1].concat(a.call(u, c[g]))), Array.prototype.splice.apply(d, [g, 1].concat(a.call(p, d[g])))) : (c[g] = i.call(u, c[g]), d[g] = i.call(p, d[g])), ++g == c.length && g == d.length) break; g == c.length && c.push(["C", u.pos[0], u.pos[1], u.pos[0], u.pos[1], u.pos[0], u.pos[1]]), g == d.length && d.push(["C", p.pos[0], p.pos[1], p.pos[0], p.pos[1], p.pos[0], p.pos[1]]) } return { start: c, dest: d } } function e(t) { switch (t[0]) { case "z": case "Z": t[0] = "L", t[1] = this.start[0], t[2] = this.start[1]; break; case "H": t[0] = "L", t[2] = this.pos[1]; break; case "V": t[0] = "L", t[2] = t[1], t[1] = this.pos[0]; break; case "T": t[0] = "Q", t[3] = t[1], t[4] = t[2], t[1] = this.reflection[1], t[2] = this.reflection[0]; break; case "S": t[0] = "C", t[6] = t[4], t[5] = t[3], t[4] = t[2], t[3] = t[1], t[2] = this.reflection[1], t[1] = this.reflection[0] }return t } function i(t) { var e = t.length; return this.pos = [t[e - 2], t[e - 1]], -1 != "SCQT".indexOf(t[0]) && (this.reflection = [2 * this.pos[0] - t[e - 4], 2 * this.pos[1] - t[e - 3]]), t } function a(t) { var e = [t]; switch (t[0]) { case "M": return this.pos = this.start = [t[1], t[2]], e; case "L": t[5] = t[3] = t[1], t[6] = t[4] = t[2], t[1] = this.pos[0], t[2] = this.pos[1]; break; case "Q": t[6] = t[4], t[5] = t[3], t[4] = 1 * t[4] / 3 + 2 * t[2] / 3, t[3] = 1 * t[3] / 3 + 2 * t[1] / 3, t[2] = 1 * this.pos[1] / 3 + 2 * t[2] / 3, t[1] = 1 * this.pos[0] / 3 + 2 * t[1] / 3; break; case "A": e = function (t, e) { var i, a, s, r, o, n, l, h, c, d, g, u, p, f, x, b, v, m, y, w, k, A, S, C, L, P, M = Math.abs(e[1]), I = Math.abs(e[2]), T = e[3] % 360, z = e[4], X = e[5], E = e[6], Y = e[7], F = new SVG.Point(t), R = new SVG.Point(E, Y), H = []; if (0 === M || 0 === I || F.x === R.x && F.y === R.y) return [["C", F.x, F.y, R.x, R.y, R.x, R.y]]; i = new SVG.Point((F.x - R.x) / 2, (F.y - R.y) / 2).transform((new SVG.Matrix).rotate(T)), (a = i.x * i.x / (M * M) + i.y * i.y / (I * I)) > 1 && (M *= a = Math.sqrt(a), I *= a); s = (new SVG.Matrix).rotate(T).scale(1 / M, 1 / I).rotate(-T), F = F.transform(s), R = R.transform(s), r = [R.x - F.x, R.y - F.y], n = r[0] * r[0] + r[1] * r[1], o = Math.sqrt(n), r[0] /= o, r[1] /= o, l = n < 4 ? Math.sqrt(1 - n / 4) : 0, z === X && (l *= -1); h = new SVG.Point((R.x + F.x) / 2 + l * -r[1], (R.y + F.y) / 2 + l * r[0]), c = new SVG.Point(F.x - h.x, F.y - h.y), d = new SVG.Point(R.x - h.x, R.y - h.y), g = Math.acos(c.x / Math.sqrt(c.x * c.x + c.y * c.y)), c.y < 0 && (g *= -1); u = Math.acos(d.x / Math.sqrt(d.x * d.x + d.y * d.y)), d.y < 0 && (u *= -1); X && g > u && (u += 2 * Math.PI); !X && g < u && (u -= 2 * Math.PI); for (f = Math.ceil(2 * Math.abs(g - u) / Math.PI), b = [], v = g, p = (u - g) / f, x = 4 * Math.tan(p / 4) / 3, k = 0; k <= f; k++)y = Math.cos(v), m = Math.sin(v), w = new SVG.Point(h.x + y, h.y + m), b[k] = [new SVG.Point(w.x + x * m, w.y - x * y), w, new SVG.Point(w.x - x * m, w.y + x * y)], v += p; for (b[0][0] = b[0][1].clone(), b[b.length - 1][2] = b[b.length - 1][1].clone(), s = (new SVG.Matrix).rotate(T).scale(M, I).rotate(-T), k = 0, A = b.length; k < A; k++)b[k][0] = b[k][0].transform(s), b[k][1] = b[k][1].transform(s), b[k][2] = b[k][2].transform(s); for (k = 1, A = b.length; k < A; k++)S = (w = b[k - 1][2]).x, C = w.y, L = (w = b[k][0]).x, P = w.y, E = (w = b[k][1]).x, Y = w.y, H.push(["C", S, C, L, P, E, Y]); return H }(this.pos, t), t = e[0] }return t[0] = "C", this.pos = [t[5], t[6]], this.reflection = [2 * t[5] - t[3], 2 * t[6] - t[4]], e } function s(t, e) { if (!1 === e) return !1; for (var i = e, a = t.length; i < a; ++i)if ("M" == t[i][0]) return i; return !1 } SVG.extend(SVG.PathArray, { morph: function (e) { for (var i = this.value, a = this.parse(e), r = 0, o = 0, n = !1, l = !1; !1 !== r || !1 !== o;) { var h; n = s(i, !1 !== r && r + 1), l = s(a, !1 !== o && o + 1), !1 === r && (r = 0 == (h = new SVG.PathArray(c.start).bbox()).height || 0 == h.width ? i.push(i[0]) - 1 : i.push(["M", h.x + h.width / 2, h.y + h.height / 2]) - 1), !1 === o && (o = 0 == (h = new SVG.PathArray(c.dest).bbox()).height || 0 == h.width ? a.push(a[0]) - 1 : a.push(["M", h.x + h.width / 2, h.y + h.height / 2]) - 1); var c = t(i, r, n, a, o, l); i = i.slice(0, r).concat(c.start, !1 === n ? [] : i.slice(n)), a = a.slice(0, o).concat(c.dest, !1 === l ? [] : a.slice(l)), r = !1 !== n && r + c.start.length, o = !1 !== l && o + c.dest.length } return this.value = i, this.destination = new SVG.PathArray, this.destination.value = a, this } }) }(), - /*! svg.draggable.js - v2.2.2 - 2019-01-08 - * https://github.com/svgdotjs/svg.draggable.js - * Copyright (c) 2019 Wout Fierens; Licensed MIT */ - function () { function t(t) { t.remember("_draggable", this), this.el = t } t.prototype.init = function (t, e) { var i = this; this.constraint = t, this.value = e, this.el.on("mousedown.drag", (function (t) { i.start(t) })), this.el.on("touchstart.drag", (function (t) { i.start(t) })) }, t.prototype.transformPoint = function (t, e) { var i = (t = t || window.event).changedTouches && t.changedTouches[0] || t; return this.p.x = i.clientX - (e || 0), this.p.y = i.clientY, this.p.matrixTransform(this.m) }, t.prototype.getBBox = function () { var t = this.el.bbox(); return this.el instanceof SVG.Nested && (t = this.el.rbox()), (this.el instanceof SVG.G || this.el instanceof SVG.Use || this.el instanceof SVG.Nested) && (t.x = this.el.x(), t.y = this.el.y()), t }, t.prototype.start = function (t) { if ("click" != t.type && "mousedown" != t.type && "mousemove" != t.type || 1 == (t.which || t.buttons)) { var e = this; if (this.el.fire("beforedrag", { event: t, handler: this }), !this.el.event().defaultPrevented) { t.preventDefault(), t.stopPropagation(), this.parent = this.parent || this.el.parent(SVG.Nested) || this.el.parent(SVG.Doc), this.p = this.parent.node.createSVGPoint(), this.m = this.el.node.getScreenCTM().inverse(); var i, a = this.getBBox(); if (this.el instanceof SVG.Text) switch (i = this.el.node.getComputedTextLength(), this.el.attr("text-anchor")) { case "middle": i /= 2; break; case "start": i = 0 }this.startPoints = { point: this.transformPoint(t, i), box: a, transform: this.el.transform() }, SVG.on(window, "mousemove.drag", (function (t) { e.drag(t) })), SVG.on(window, "touchmove.drag", (function (t) { e.drag(t) })), SVG.on(window, "mouseup.drag", (function (t) { e.end(t) })), SVG.on(window, "touchend.drag", (function (t) { e.end(t) })), this.el.fire("dragstart", { event: t, p: this.startPoints.point, m: this.m, handler: this }) } } }, t.prototype.drag = function (t) { var e = this.getBBox(), i = this.transformPoint(t), a = this.startPoints.box.x + i.x - this.startPoints.point.x, s = this.startPoints.box.y + i.y - this.startPoints.point.y, r = this.constraint, o = i.x - this.startPoints.point.x, n = i.y - this.startPoints.point.y; if (this.el.fire("dragmove", { event: t, p: i, m: this.m, handler: this }), this.el.event().defaultPrevented) return i; if ("function" == typeof r) { var l = r.call(this.el, a, s, this.m); "boolean" == typeof l && (l = { x: l, y: l }), !0 === l.x ? this.el.x(a) : !1 !== l.x && this.el.x(l.x), !0 === l.y ? this.el.y(s) : !1 !== l.y && this.el.y(l.y) } else "object" == typeof r && (null != r.minX && a < r.minX ? o = (a = r.minX) - this.startPoints.box.x : null != r.maxX && a > r.maxX - e.width && (o = (a = r.maxX - e.width) - this.startPoints.box.x), null != r.minY && s < r.minY ? n = (s = r.minY) - this.startPoints.box.y : null != r.maxY && s > r.maxY - e.height && (n = (s = r.maxY - e.height) - this.startPoints.box.y), null != r.snapToGrid && (a -= a % r.snapToGrid, s -= s % r.snapToGrid, o -= o % r.snapToGrid, n -= n % r.snapToGrid), this.el instanceof SVG.G ? this.el.matrix(this.startPoints.transform).transform({ x: o, y: n }, !0) : this.el.move(a, s)); return i }, t.prototype.end = function (t) { var e = this.drag(t); this.el.fire("dragend", { event: t, p: e, m: this.m, handler: this }), SVG.off(window, "mousemove.drag"), SVG.off(window, "touchmove.drag"), SVG.off(window, "mouseup.drag"), SVG.off(window, "touchend.drag") }, SVG.extend(SVG.Element, { draggable: function (e, i) { "function" != typeof e && "object" != typeof e || (i = e, e = !0); var a = this.remember("_draggable") || new t(this); return (e = void 0 === e || e) ? a.init(i || {}, e) : (this.off("mousedown.drag"), this.off("touchstart.drag")), this } }) }.call(void 0), function () { function t(t) { this.el = t, t.remember("_selectHandler", this), this.pointSelection = { isSelected: !1 }, this.rectSelection = { isSelected: !1 }, this.pointsList = { lt: [0, 0], rt: ["width", 0], rb: ["width", "height"], lb: [0, "height"], t: ["width", 0], r: ["width", "height"], b: ["width", "height"], l: [0, "height"] }, this.pointCoord = function (t, e, i) { var a = "string" != typeof t ? t : e[t]; return i ? a / 2 : a }, this.pointCoords = function (t, e) { var i = this.pointsList[t]; return { x: this.pointCoord(i[0], e, "t" === t || "b" === t), y: this.pointCoord(i[1], e, "r" === t || "l" === t) } } } t.prototype.init = function (t, e) { var i = this.el.bbox(); this.options = {}; var a = this.el.selectize.defaults.points; for (var s in this.el.selectize.defaults) this.options[s] = this.el.selectize.defaults[s], void 0 !== e[s] && (this.options[s] = e[s]); var r = ["points", "pointsExclude"]; for (var s in r) { var o = this.options[r[s]]; "string" == typeof o ? o = o.length > 0 ? o.split(/\s*,\s*/i) : [] : "boolean" == typeof o && "points" === r[s] && (o = o ? a : []), this.options[r[s]] = o } this.options.points = [a, this.options.points].reduce((function (t, e) { return t.filter((function (t) { return e.indexOf(t) > -1 })) })), this.options.points = [this.options.points, this.options.pointsExclude].reduce((function (t, e) { return t.filter((function (t) { return e.indexOf(t) < 0 })) })), this.parent = this.el.parent(), this.nested = this.nested || this.parent.group(), this.nested.matrix(new SVG.Matrix(this.el).translate(i.x, i.y)), this.options.deepSelect && -1 !== ["line", "polyline", "polygon"].indexOf(this.el.type) ? this.selectPoints(t) : this.selectRect(t), this.observe(), this.cleanup() }, t.prototype.selectPoints = function (t) { return this.pointSelection.isSelected = t, this.pointSelection.set || (this.pointSelection.set = this.parent.set(), this.drawPoints()), this }, t.prototype.getPointArray = function () { var t = this.el.bbox(); return this.el.array().valueOf().map((function (e) { return [e[0] - t.x, e[1] - t.y] })) }, t.prototype.drawPoints = function () { for (var t = this, e = this.getPointArray(), i = 0, a = e.length; i < a; ++i) { var s = function (e) { return function (i) { (i = i || window.event).preventDefault ? i.preventDefault() : i.returnValue = !1, i.stopPropagation(); var a = i.pageX || i.touches[0].pageX, s = i.pageY || i.touches[0].pageY; t.el.fire("point", { x: a, y: s, i: e, event: i }) } }(i), r = this.drawPoint(e[i][0], e[i][1]).addClass(this.options.classPoints).addClass(this.options.classPoints + "_point").on("touchstart", s).on("mousedown", s); this.pointSelection.set.add(r) } }, t.prototype.drawPoint = function (t, e) { var i = this.options.pointType; switch (i) { case "circle": return this.drawCircle(t, e); case "rect": return this.drawRect(t, e); default: if ("function" == typeof i) return i.call(this, t, e); throw new Error("Unknown " + i + " point type!") } }, t.prototype.drawCircle = function (t, e) { return this.nested.circle(this.options.pointSize).center(t, e) }, t.prototype.drawRect = function (t, e) { return this.nested.rect(this.options.pointSize, this.options.pointSize).center(t, e) }, t.prototype.updatePointSelection = function () { var t = this.getPointArray(); this.pointSelection.set.each((function (e) { this.cx() === t[e][0] && this.cy() === t[e][1] || this.center(t[e][0], t[e][1]) })) }, t.prototype.updateRectSelection = function () { var t = this, e = this.el.bbox(); if (this.rectSelection.set.get(0).attr({ width: e.width, height: e.height }), this.options.points.length && this.options.points.map((function (i, a) { var s = t.pointCoords(i, e); t.rectSelection.set.get(a + 1).center(s.x, s.y) })), this.options.rotationPoint) { var i = this.rectSelection.set.length(); this.rectSelection.set.get(i - 1).center(e.width / 2, 20) } }, t.prototype.selectRect = function (t) { var e = this, i = this.el.bbox(); function a(t) { return function (i) { (i = i || window.event).preventDefault ? i.preventDefault() : i.returnValue = !1, i.stopPropagation(); var a = i.pageX || i.touches[0].pageX, s = i.pageY || i.touches[0].pageY; e.el.fire(t, { x: a, y: s, event: i }) } } if (this.rectSelection.isSelected = t, this.rectSelection.set = this.rectSelection.set || this.parent.set(), this.rectSelection.set.get(0) || this.rectSelection.set.add(this.nested.rect(i.width, i.height).addClass(this.options.classRect)), this.options.points.length && this.rectSelection.set.length() < 2) { this.options.points.map((function (t, s) { var r = e.pointCoords(t, i), o = e.drawPoint(r.x, r.y).attr("class", e.options.classPoints + "_" + t).on("mousedown", a(t)).on("touchstart", a(t)); e.rectSelection.set.add(o) })), this.rectSelection.set.each((function () { this.addClass(e.options.classPoints) })) } if (this.options.rotationPoint && (this.options.points && !this.rectSelection.set.get(9) || !this.options.points && !this.rectSelection.set.get(1))) { var s = function (t) { (t = t || window.event).preventDefault ? t.preventDefault() : t.returnValue = !1, t.stopPropagation(); var i = t.pageX || t.touches[0].pageX, a = t.pageY || t.touches[0].pageY; e.el.fire("rot", { x: i, y: a, event: t }) }, r = this.drawPoint(i.width / 2, 20).attr("class", this.options.classPoints + "_rot").on("touchstart", s).on("mousedown", s); this.rectSelection.set.add(r) } }, t.prototype.handler = function () { var t = this.el.bbox(); this.nested.matrix(new SVG.Matrix(this.el).translate(t.x, t.y)), this.rectSelection.isSelected && this.updateRectSelection(), this.pointSelection.isSelected && this.updatePointSelection() }, t.prototype.observe = function () { var t = this; if (MutationObserver) if (this.rectSelection.isSelected || this.pointSelection.isSelected) this.observerInst = this.observerInst || new MutationObserver((function () { t.handler() })), this.observerInst.observe(this.el.node, { attributes: !0 }); else try { this.observerInst.disconnect(), delete this.observerInst } catch (t) { } else this.el.off("DOMAttrModified.select"), (this.rectSelection.isSelected || this.pointSelection.isSelected) && this.el.on("DOMAttrModified.select", (function () { t.handler() })) }, t.prototype.cleanup = function () { !this.rectSelection.isSelected && this.rectSelection.set && (this.rectSelection.set.each((function () { this.remove() })), this.rectSelection.set.clear(), delete this.rectSelection.set), !this.pointSelection.isSelected && this.pointSelection.set && (this.pointSelection.set.each((function () { this.remove() })), this.pointSelection.set.clear(), delete this.pointSelection.set), this.pointSelection.isSelected || this.rectSelection.isSelected || (this.nested.remove(), delete this.nested) }, SVG.extend(SVG.Element, { selectize: function (e, i) { return "object" == typeof e && (i = e, e = !0), (this.remember("_selectHandler") || new t(this)).init(void 0 === e || e, i || {}), this } }), SVG.Element.prototype.selectize.defaults = { points: ["lt", "rt", "rb", "lb", "t", "r", "b", "l"], pointsExclude: [], classRect: "svg_select_boundingRect", classPoints: "svg_select_points", pointSize: 7, rotationPoint: !0, deepSelect: !1, pointType: "circle" } }(), function () { (function () { function t(t) { t.remember("_resizeHandler", this), this.el = t, this.parameters = {}, this.lastUpdateCall = null, this.p = t.doc().node.createSVGPoint() } t.prototype.transformPoint = function (t, e, i) { return this.p.x = t - (this.offset.x - window.pageXOffset), this.p.y = e - (this.offset.y - window.pageYOffset), this.p.matrixTransform(i || this.m) }, t.prototype._extractPosition = function (t) { return { x: null != t.clientX ? t.clientX : t.touches[0].clientX, y: null != t.clientY ? t.clientY : t.touches[0].clientY } }, t.prototype.init = function (t) { var e = this; if (this.stop(), "stop" !== t) { for (var i in this.options = {}, this.el.resize.defaults) this.options[i] = this.el.resize.defaults[i], void 0 !== t[i] && (this.options[i] = t[i]); this.el.on("lt.resize", (function (t) { e.resize(t || window.event) })), this.el.on("rt.resize", (function (t) { e.resize(t || window.event) })), this.el.on("rb.resize", (function (t) { e.resize(t || window.event) })), this.el.on("lb.resize", (function (t) { e.resize(t || window.event) })), this.el.on("t.resize", (function (t) { e.resize(t || window.event) })), this.el.on("r.resize", (function (t) { e.resize(t || window.event) })), this.el.on("b.resize", (function (t) { e.resize(t || window.event) })), this.el.on("l.resize", (function (t) { e.resize(t || window.event) })), this.el.on("rot.resize", (function (t) { e.resize(t || window.event) })), this.el.on("point.resize", (function (t) { e.resize(t || window.event) })), this.update() } }, t.prototype.stop = function () { return this.el.off("lt.resize"), this.el.off("rt.resize"), this.el.off("rb.resize"), this.el.off("lb.resize"), this.el.off("t.resize"), this.el.off("r.resize"), this.el.off("b.resize"), this.el.off("l.resize"), this.el.off("rot.resize"), this.el.off("point.resize"), this }, t.prototype.resize = function (t) { var e = this; this.m = this.el.node.getScreenCTM().inverse(), this.offset = { x: window.pageXOffset, y: window.pageYOffset }; var i = this._extractPosition(t.detail.event); if (this.parameters = { type: this.el.type, p: this.transformPoint(i.x, i.y), x: t.detail.x, y: t.detail.y, box: this.el.bbox(), rotation: this.el.transform().rotation }, "text" === this.el.type && (this.parameters.fontSize = this.el.attr()["font-size"]), void 0 !== t.detail.i) { var a = this.el.array().valueOf(); this.parameters.i = t.detail.i, this.parameters.pointCoords = [a[t.detail.i][0], a[t.detail.i][1]] } switch (t.type) { case "lt": this.calc = function (t, e) { var i = this.snapToGrid(t, e); if (this.parameters.box.width - i[0] > 0 && this.parameters.box.height - i[1] > 0) { if ("text" === this.parameters.type) return this.el.move(this.parameters.box.x + i[0], this.parameters.box.y), void this.el.attr("font-size", this.parameters.fontSize - i[0]); i = this.checkAspectRatio(i), this.el.move(this.parameters.box.x + i[0], this.parameters.box.y + i[1]).size(this.parameters.box.width - i[0], this.parameters.box.height - i[1]) } }; break; case "rt": this.calc = function (t, e) { var i = this.snapToGrid(t, e, 2); if (this.parameters.box.width + i[0] > 0 && this.parameters.box.height - i[1] > 0) { if ("text" === this.parameters.type) return this.el.move(this.parameters.box.x - i[0], this.parameters.box.y), void this.el.attr("font-size", this.parameters.fontSize + i[0]); i = this.checkAspectRatio(i, !0), this.el.move(this.parameters.box.x, this.parameters.box.y + i[1]).size(this.parameters.box.width + i[0], this.parameters.box.height - i[1]) } }; break; case "rb": this.calc = function (t, e) { var i = this.snapToGrid(t, e, 0); if (this.parameters.box.width + i[0] > 0 && this.parameters.box.height + i[1] > 0) { if ("text" === this.parameters.type) return this.el.move(this.parameters.box.x - i[0], this.parameters.box.y), void this.el.attr("font-size", this.parameters.fontSize + i[0]); i = this.checkAspectRatio(i), this.el.move(this.parameters.box.x, this.parameters.box.y).size(this.parameters.box.width + i[0], this.parameters.box.height + i[1]) } }; break; case "lb": this.calc = function (t, e) { var i = this.snapToGrid(t, e, 1); if (this.parameters.box.width - i[0] > 0 && this.parameters.box.height + i[1] > 0) { if ("text" === this.parameters.type) return this.el.move(this.parameters.box.x + i[0], this.parameters.box.y), void this.el.attr("font-size", this.parameters.fontSize - i[0]); i = this.checkAspectRatio(i, !0), this.el.move(this.parameters.box.x + i[0], this.parameters.box.y).size(this.parameters.box.width - i[0], this.parameters.box.height + i[1]) } }; break; case "t": this.calc = function (t, e) { var i = this.snapToGrid(t, e, 2); if (this.parameters.box.height - i[1] > 0) { if ("text" === this.parameters.type) return; this.el.move(this.parameters.box.x, this.parameters.box.y + i[1]).height(this.parameters.box.height - i[1]) } }; break; case "r": this.calc = function (t, e) { var i = this.snapToGrid(t, e, 0); if (this.parameters.box.width + i[0] > 0) { if ("text" === this.parameters.type) return; this.el.move(this.parameters.box.x, this.parameters.box.y).width(this.parameters.box.width + i[0]) } }; break; case "b": this.calc = function (t, e) { var i = this.snapToGrid(t, e, 0); if (this.parameters.box.height + i[1] > 0) { if ("text" === this.parameters.type) return; this.el.move(this.parameters.box.x, this.parameters.box.y).height(this.parameters.box.height + i[1]) } }; break; case "l": this.calc = function (t, e) { var i = this.snapToGrid(t, e, 1); if (this.parameters.box.width - i[0] > 0) { if ("text" === this.parameters.type) return; this.el.move(this.parameters.box.x + i[0], this.parameters.box.y).width(this.parameters.box.width - i[0]) } }; break; case "rot": this.calc = function (t, e) { var i = t + this.parameters.p.x, a = e + this.parameters.p.y, s = Math.atan2(this.parameters.p.y - this.parameters.box.y - this.parameters.box.height / 2, this.parameters.p.x - this.parameters.box.x - this.parameters.box.width / 2), r = Math.atan2(a - this.parameters.box.y - this.parameters.box.height / 2, i - this.parameters.box.x - this.parameters.box.width / 2), o = this.parameters.rotation + 180 * (r - s) / Math.PI + this.options.snapToAngle / 2; this.el.center(this.parameters.box.cx, this.parameters.box.cy).rotate(o - o % this.options.snapToAngle, this.parameters.box.cx, this.parameters.box.cy) }; break; case "point": this.calc = function (t, e) { var i = this.snapToGrid(t, e, this.parameters.pointCoords[0], this.parameters.pointCoords[1]), a = this.el.array().valueOf(); a[this.parameters.i][0] = this.parameters.pointCoords[0] + i[0], a[this.parameters.i][1] = this.parameters.pointCoords[1] + i[1], this.el.plot(a) } }this.el.fire("resizestart", { dx: this.parameters.x, dy: this.parameters.y, event: t }), SVG.on(window, "touchmove.resize", (function (t) { e.update(t || window.event) })), SVG.on(window, "touchend.resize", (function () { e.done() })), SVG.on(window, "mousemove.resize", (function (t) { e.update(t || window.event) })), SVG.on(window, "mouseup.resize", (function () { e.done() })) }, t.prototype.update = function (t) { if (t) { var e = this._extractPosition(t), i = this.transformPoint(e.x, e.y), a = i.x - this.parameters.p.x, s = i.y - this.parameters.p.y; this.lastUpdateCall = [a, s], this.calc(a, s), this.el.fire("resizing", { dx: a, dy: s, event: t }) } else this.lastUpdateCall && this.calc(this.lastUpdateCall[0], this.lastUpdateCall[1]) }, t.prototype.done = function () { this.lastUpdateCall = null, SVG.off(window, "mousemove.resize"), SVG.off(window, "mouseup.resize"), SVG.off(window, "touchmove.resize"), SVG.off(window, "touchend.resize"), this.el.fire("resizedone") }, t.prototype.snapToGrid = function (t, e, i, a) { var s; return void 0 !== a ? s = [(i + t) % this.options.snapToGrid, (a + e) % this.options.snapToGrid] : (i = null == i ? 3 : i, s = [(this.parameters.box.x + t + (1 & i ? 0 : this.parameters.box.width)) % this.options.snapToGrid, (this.parameters.box.y + e + (2 & i ? 0 : this.parameters.box.height)) % this.options.snapToGrid]), t < 0 && (s[0] -= this.options.snapToGrid), e < 0 && (s[1] -= this.options.snapToGrid), t -= Math.abs(s[0]) < this.options.snapToGrid / 2 ? s[0] : s[0] - (t < 0 ? -this.options.snapToGrid : this.options.snapToGrid), e -= Math.abs(s[1]) < this.options.snapToGrid / 2 ? s[1] : s[1] - (e < 0 ? -this.options.snapToGrid : this.options.snapToGrid), this.constraintToBox(t, e, i, a) }, t.prototype.constraintToBox = function (t, e, i, a) { var s, r, o = this.options.constraint || {}; return void 0 !== a ? (s = i, r = a) : (s = this.parameters.box.x + (1 & i ? 0 : this.parameters.box.width), r = this.parameters.box.y + (2 & i ? 0 : this.parameters.box.height)), void 0 !== o.minX && s + t < o.minX && (t = o.minX - s), void 0 !== o.maxX && s + t > o.maxX && (t = o.maxX - s), void 0 !== o.minY && r + e < o.minY && (e = o.minY - r), void 0 !== o.maxY && r + e > o.maxY && (e = o.maxY - r), [t, e] }, t.prototype.checkAspectRatio = function (t, e) { if (!this.options.saveAspectRatio) return t; var i = t.slice(), a = this.parameters.box.width / this.parameters.box.height, s = this.parameters.box.width + t[0], r = this.parameters.box.height - t[1], o = s / r; return o < a ? (i[1] = s / a - this.parameters.box.height, e && (i[1] = -i[1])) : o > a && (i[0] = this.parameters.box.width - r * a, e && (i[0] = -i[0])), i }, SVG.extend(SVG.Element, { resize: function (e) { return (this.remember("_resizeHandler") || new t(this)).init(e || {}), this } }), SVG.Element.prototype.resize.defaults = { snapToAngle: .1, snapToGrid: 1, constraint: {}, saveAspectRatio: !1 } }).call(this) }(), void 0 === window.Apex && (window.Apex = {}); var Gt = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "initModules", value: function () { this.ctx.publicMethods = ["updateOptions", "updateSeries", "appendData", "appendSeries", "isSeriesHidden", "toggleSeries", "showSeries", "hideSeries", "setLocale", "resetSeries", "zoomX", "toggleDataPointSelection", "dataURI", "exportToCSV", "addXaxisAnnotation", "addYaxisAnnotation", "addPointAnnotation", "clearAnnotations", "removeAnnotation", "paper", "destroy"], this.ctx.eventList = ["click", "mousedown", "mousemove", "mouseleave", "touchstart", "touchmove", "touchleave", "mouseup", "touchend"], this.ctx.animations = new b(this.ctx), this.ctx.axes = new J(this.ctx), this.ctx.core = new Wt(this.ctx.el, this.ctx), this.ctx.config = new Y({}), this.ctx.data = new B(this.ctx), this.ctx.grid = new j(this.ctx), this.ctx.graphics = new m(this.ctx), this.ctx.coreUtils = new y(this.ctx), this.ctx.crosshairs = new Q(this.ctx), this.ctx.events = new Z(this.ctx), this.ctx.exports = new G(this.ctx), this.ctx.localization = new $(this.ctx), this.ctx.options = new I, this.ctx.responsive = new K(this.ctx), this.ctx.series = new W(this.ctx), this.ctx.theme = new tt(this.ctx), this.ctx.formatters = new S(this.ctx), this.ctx.titleSubtitle = new et(this.ctx), this.ctx.legend = new lt(this.ctx), this.ctx.toolbar = new ht(this.ctx), this.ctx.tooltip = new bt(this.ctx), this.ctx.dimensions = new ot(this.ctx), this.ctx.updateHelpers = new Bt(this.ctx), this.ctx.zoomPanSelection = new ct(this.ctx), this.ctx.w.globals.tooltip = new bt(this.ctx) } }]), t }(), Vt = function () { function t(e) { a(this, t), this.ctx = e, this.w = e.w } return r(t, [{ key: "clear", value: function (t) { var e = t.isUpdating; this.ctx.zoomPanSelection && this.ctx.zoomPanSelection.destroy(), this.ctx.toolbar && this.ctx.toolbar.destroy(), this.ctx.animations = null, this.ctx.axes = null, this.ctx.annotations = null, this.ctx.core = null, this.ctx.data = null, this.ctx.grid = null, this.ctx.series = null, this.ctx.responsive = null, this.ctx.theme = null, this.ctx.formatters = null, this.ctx.titleSubtitle = null, this.ctx.legend = null, this.ctx.dimensions = null, this.ctx.options = null, this.ctx.crosshairs = null, this.ctx.zoomPanSelection = null, this.ctx.updateHelpers = null, this.ctx.toolbar = null, this.ctx.localization = null, this.ctx.w.globals.tooltip = null, this.clearDomElements({ isUpdating: e }) } }, { key: "killSVG", value: function (t) { t.each((function (t, e) { this.removeClass("*"), this.off(), this.stop() }), !0), t.ungroup(), t.clear() } }, { key: "clearDomElements", value: function (t) { var e = this, i = t.isUpdating, a = this.w.globals.dom.Paper.node; a.parentNode && a.parentNode.parentNode && !i && (a.parentNode.parentNode.style.minHeight = "unset"); var s = this.w.globals.dom.baseEl; s && this.ctx.eventList.forEach((function (t) { s.removeEventListener(t, e.ctx.events.documentEvent) })); var r = this.w.globals.dom; if (null !== this.ctx.el) for (; this.ctx.el.firstChild;)this.ctx.el.removeChild(this.ctx.el.firstChild); this.killSVG(r.Paper), r.Paper.remove(), r.elWrap = null, r.elGraphical = null, r.elLegendWrap = null, r.elLegendForeign = null, r.baseEl = null, r.elGridRect = null, r.elGridRectMask = null, r.elGridRectMarkerMask = null, r.elForecastMask = null, r.elNonForecastMask = null, r.elDefs = null } }]), t }(), jt = new WeakMap; var _t = function () { function t(e, i) { a(this, t), this.opts = i, this.ctx = this, this.w = new R(i).init(), this.el = e, this.w.globals.cuid = x.randomId(), this.w.globals.chartID = this.w.config.chart.id ? x.escapeString(this.w.config.chart.id) : this.w.globals.cuid, new Gt(this).initModules(), this.create = x.bind(this.create, this), this.windowResizeHandler = this._windowResizeHandler.bind(this), this.parentResizeHandler = this._parentResizeCallback.bind(this) } return r(t, [{ key: "render", value: function () { var t = this; return new Promise((function (e, i) { if (null !== t.el) { void 0 === Apex._chartInstances && (Apex._chartInstances = []), t.w.config.chart.id && Apex._chartInstances.push({ id: t.w.globals.chartID, group: t.w.config.chart.group, chart: t }), t.setLocale(t.w.config.chart.defaultLocale); var a = t.w.config.chart.events.beforeMount; "function" == typeof a && a(t, t.w), t.events.fireEvent("beforeMount", [t, t.w]), window.addEventListener("resize", t.windowResizeHandler), function (t, e) { var i = !1; if (t.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) { var a = t.getBoundingClientRect(); "none" !== t.style.display && 0 !== a.width || (i = !0) } var s = new ResizeObserver((function (a) { i && e.call(t, a), i = !0 })); t.nodeType === Node.DOCUMENT_FRAGMENT_NODE ? Array.from(t.children).forEach((function (t) { return s.observe(t) })) : s.observe(t), jt.set(e, s) }(t.el.parentNode, t.parentResizeHandler); var s = t.el.getRootNode && t.el.getRootNode(), r = x.is("ShadowRoot", s), o = t.el.ownerDocument, n = r ? s.getElementById("apexcharts-css") : o.getElementById("apexcharts-css"); if (!n) { var l; (n = document.createElement("style")).id = "apexcharts-css", n.textContent = '@keyframes opaque {\n 0% {\n opacity: 0\n }\n\n to {\n opacity: 1\n }\n}\n\n@keyframes resizeanim {\n 0%,to {\n opacity: 0\n }\n}\n\n.apexcharts-canvas {\n position: relative;\n user-select: none\n}\n\n.apexcharts-canvas ::-webkit-scrollbar {\n -webkit-appearance: none;\n width: 6px\n}\n\n.apexcharts-canvas ::-webkit-scrollbar-thumb {\n border-radius: 4px;\n background-color: rgba(0,0,0,.5);\n box-shadow: 0 0 1px rgba(255,255,255,.5);\n -webkit-box-shadow: 0 0 1px rgba(255,255,255,.5)\n}\n\n.apexcharts-inner {\n position: relative\n}\n\n.apexcharts-text tspan {\n font-family: inherit\n}\n\n.legend-mouseover-inactive {\n transition: .15s ease all;\n opacity: .2\n}\n\n.apexcharts-legend-text {\n padding-left: 15px;\n margin-left: -15px;\n}\n\n.apexcharts-series-collapsed {\n opacity: 0\n}\n\n.apexcharts-tooltip {\n border-radius: 5px;\n box-shadow: 2px 2px 6px -4px #999;\n cursor: default;\n font-size: 14px;\n left: 62px;\n opacity: 0;\n pointer-events: none;\n position: absolute;\n top: 20px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n white-space: nowrap;\n z-index: 12;\n transition: .15s ease all\n}\n\n.apexcharts-tooltip.apexcharts-active {\n opacity: 1;\n transition: .15s ease all\n}\n\n.apexcharts-tooltip.apexcharts-theme-light {\n border: 1px solid #e3e3e3;\n background: rgba(255,255,255,.96)\n}\n\n.apexcharts-tooltip.apexcharts-theme-dark {\n color: #fff;\n background: rgba(30,30,30,.8)\n}\n\n.apexcharts-tooltip * {\n font-family: inherit\n}\n\n.apexcharts-tooltip-title {\n padding: 6px;\n font-size: 15px;\n margin-bottom: 4px\n}\n\n.apexcharts-tooltip.apexcharts-theme-light .apexcharts-tooltip-title {\n background: #eceff1;\n border-bottom: 1px solid #ddd\n}\n\n.apexcharts-tooltip.apexcharts-theme-dark .apexcharts-tooltip-title {\n background: rgba(0,0,0,.7);\n border-bottom: 1px solid #333\n}\n\n.apexcharts-tooltip-text-goals-value,.apexcharts-tooltip-text-y-value,.apexcharts-tooltip-text-z-value {\n display: inline-block;\n margin-left: 5px;\n font-weight: 600\n}\n\n.apexcharts-tooltip-text-goals-label:empty,.apexcharts-tooltip-text-goals-value:empty,.apexcharts-tooltip-text-y-label:empty,.apexcharts-tooltip-text-y-value:empty,.apexcharts-tooltip-text-z-value:empty,.apexcharts-tooltip-title:empty {\n display: none\n}\n\n.apexcharts-tooltip-text-goals-label,.apexcharts-tooltip-text-goals-value {\n padding: 6px 0 5px\n}\n\n.apexcharts-tooltip-goals-group,.apexcharts-tooltip-text-goals-label,.apexcharts-tooltip-text-goals-value {\n display: flex\n}\n\n.apexcharts-tooltip-text-goals-label:not(:empty),.apexcharts-tooltip-text-goals-value:not(:empty) {\n margin-top: -6px\n}\n\n.apexcharts-tooltip-marker {\n width: 12px;\n height: 12px;\n position: relative;\n top: 0;\n margin-right: 10px;\n border-radius: 50%\n}\n\n.apexcharts-tooltip-series-group {\n padding: 0 10px;\n display: none;\n text-align: left;\n justify-content: left;\n align-items: center\n}\n\n.apexcharts-tooltip-series-group.apexcharts-active .apexcharts-tooltip-marker {\n opacity: 1\n}\n\n.apexcharts-tooltip-series-group.apexcharts-active,.apexcharts-tooltip-series-group:last-child {\n padding-bottom: 4px\n}\n\n.apexcharts-tooltip-series-group-hidden {\n opacity: 0;\n height: 0;\n line-height: 0;\n padding: 0!important\n}\n\n.apexcharts-tooltip-y-group {\n padding: 6px 0 5px\n}\n\n.apexcharts-custom-tooltip,.apexcharts-tooltip-box {\n padding: 4px 8px\n}\n\n.apexcharts-tooltip-boxPlot {\n display: flex;\n flex-direction: column-reverse\n}\n\n.apexcharts-tooltip-box>div {\n margin: 4px 0\n}\n\n.apexcharts-tooltip-box span.value {\n font-weight: 700\n}\n\n.apexcharts-tooltip-rangebar {\n padding: 5px 8px\n}\n\n.apexcharts-tooltip-rangebar .category {\n font-weight: 600;\n color: #777\n}\n\n.apexcharts-tooltip-rangebar .series-name {\n font-weight: 700;\n display: block;\n margin-bottom: 5px\n}\n\n.apexcharts-xaxistooltip,.apexcharts-yaxistooltip {\n opacity: 0;\n pointer-events: none;\n color: #373d3f;\n font-size: 13px;\n text-align: center;\n border-radius: 2px;\n position: absolute;\n z-index: 10;\n background: #eceff1;\n border: 1px solid #90a4ae\n}\n\n.apexcharts-xaxistooltip {\n padding: 9px 10px;\n transition: .15s ease all\n}\n\n.apexcharts-xaxistooltip.apexcharts-theme-dark {\n background: rgba(0,0,0,.7);\n border: 1px solid rgba(0,0,0,.5);\n color: #fff\n}\n\n.apexcharts-xaxistooltip:after,.apexcharts-xaxistooltip:before {\n left: 50%;\n border: solid transparent;\n content: " ";\n height: 0;\n width: 0;\n position: absolute;\n pointer-events: none\n}\n\n.apexcharts-xaxistooltip:after {\n border-color: transparent;\n border-width: 6px;\n margin-left: -6px\n}\n\n.apexcharts-xaxistooltip:before {\n border-color: transparent;\n border-width: 7px;\n margin-left: -7px\n}\n\n.apexcharts-xaxistooltip-bottom:after,.apexcharts-xaxistooltip-bottom:before {\n bottom: 100%\n}\n\n.apexcharts-xaxistooltip-top:after,.apexcharts-xaxistooltip-top:before {\n top: 100%\n}\n\n.apexcharts-xaxistooltip-bottom:after {\n border-bottom-color: #eceff1\n}\n\n.apexcharts-xaxistooltip-bottom:before {\n border-bottom-color: #90a4ae\n}\n\n.apexcharts-xaxistooltip-bottom.apexcharts-theme-dark:after,.apexcharts-xaxistooltip-bottom.apexcharts-theme-dark:before {\n border-bottom-color: rgba(0,0,0,.5)\n}\n\n.apexcharts-xaxistooltip-top:after {\n border-top-color: #eceff1\n}\n\n.apexcharts-xaxistooltip-top:before {\n border-top-color: #90a4ae\n}\n\n.apexcharts-xaxistooltip-top.apexcharts-theme-dark:after,.apexcharts-xaxistooltip-top.apexcharts-theme-dark:before {\n border-top-color: rgba(0,0,0,.5)\n}\n\n.apexcharts-xaxistooltip.apexcharts-active {\n opacity: 1;\n transition: .15s ease all\n}\n\n.apexcharts-yaxistooltip {\n padding: 4px 10px\n}\n\n.apexcharts-yaxistooltip.apexcharts-theme-dark {\n background: rgba(0,0,0,.7);\n border: 1px solid rgba(0,0,0,.5);\n color: #fff\n}\n\n.apexcharts-yaxistooltip:after,.apexcharts-yaxistooltip:before {\n top: 50%;\n border: solid transparent;\n content: " ";\n height: 0;\n width: 0;\n position: absolute;\n pointer-events: none\n}\n\n.apexcharts-yaxistooltip:after {\n border-color: transparent;\n border-width: 6px;\n margin-top: -6px\n}\n\n.apexcharts-yaxistooltip:before {\n border-color: transparent;\n border-width: 7px;\n margin-top: -7px\n}\n\n.apexcharts-yaxistooltip-left:after,.apexcharts-yaxistooltip-left:before {\n left: 100%\n}\n\n.apexcharts-yaxistooltip-right:after,.apexcharts-yaxistooltip-right:before {\n right: 100%\n}\n\n.apexcharts-yaxistooltip-left:after {\n border-left-color: #eceff1\n}\n\n.apexcharts-yaxistooltip-left:before {\n border-left-color: #90a4ae\n}\n\n.apexcharts-yaxistooltip-left.apexcharts-theme-dark:after,.apexcharts-yaxistooltip-left.apexcharts-theme-dark:before {\n border-left-color: rgba(0,0,0,.5)\n}\n\n.apexcharts-yaxistooltip-right:after {\n border-right-color: #eceff1\n}\n\n.apexcharts-yaxistooltip-right:before {\n border-right-color: #90a4ae\n}\n\n.apexcharts-yaxistooltip-right.apexcharts-theme-dark:after,.apexcharts-yaxistooltip-right.apexcharts-theme-dark:before {\n border-right-color: rgba(0,0,0,.5)\n}\n\n.apexcharts-yaxistooltip.apexcharts-active {\n opacity: 1\n}\n\n.apexcharts-yaxistooltip-hidden {\n display: none\n}\n\n.apexcharts-xcrosshairs,.apexcharts-ycrosshairs {\n pointer-events: none;\n opacity: 0;\n transition: .15s ease all\n}\n\n.apexcharts-xcrosshairs.apexcharts-active,.apexcharts-ycrosshairs.apexcharts-active {\n opacity: 1;\n transition: .15s ease all\n}\n\n.apexcharts-ycrosshairs-hidden {\n opacity: 0\n}\n\n.apexcharts-selection-rect {\n cursor: move\n}\n\n.svg_select_boundingRect,.svg_select_points_rot {\n pointer-events: none;\n opacity: 0;\n visibility: hidden\n}\n\n.apexcharts-selection-rect+g .svg_select_boundingRect,.apexcharts-selection-rect+g .svg_select_points_rot {\n opacity: 0;\n visibility: hidden\n}\n\n.apexcharts-selection-rect+g .svg_select_points_l,.apexcharts-selection-rect+g .svg_select_points_r {\n cursor: ew-resize;\n opacity: 1;\n visibility: visible\n}\n\n.svg_select_points {\n fill: #efefef;\n stroke: #333;\n rx: 2\n}\n\n.apexcharts-svg.apexcharts-zoomable.hovering-zoom {\n cursor: crosshair\n}\n\n.apexcharts-svg.apexcharts-zoomable.hovering-pan {\n cursor: move\n}\n\n.apexcharts-menu-icon,.apexcharts-pan-icon,.apexcharts-reset-icon,.apexcharts-selection-icon,.apexcharts-toolbar-custom-icon,.apexcharts-zoom-icon,.apexcharts-zoomin-icon,.apexcharts-zoomout-icon {\n cursor: pointer;\n width: 20px;\n height: 20px;\n line-height: 24px;\n color: #6e8192;\n text-align: center\n}\n\n.apexcharts-menu-icon svg,.apexcharts-reset-icon svg,.apexcharts-zoom-icon svg,.apexcharts-zoomin-icon svg,.apexcharts-zoomout-icon svg {\n fill: #6e8192\n}\n\n.apexcharts-selection-icon svg {\n fill: #444;\n transform: scale(.76)\n}\n\n.apexcharts-theme-dark .apexcharts-menu-icon svg,.apexcharts-theme-dark .apexcharts-pan-icon svg,.apexcharts-theme-dark .apexcharts-reset-icon svg,.apexcharts-theme-dark .apexcharts-selection-icon svg,.apexcharts-theme-dark .apexcharts-toolbar-custom-icon svg,.apexcharts-theme-dark .apexcharts-zoom-icon svg,.apexcharts-theme-dark .apexcharts-zoomin-icon svg,.apexcharts-theme-dark .apexcharts-zoomout-icon svg {\n fill: #f3f4f5\n}\n\n.apexcharts-canvas .apexcharts-reset-zoom-icon.apexcharts-selected svg,.apexcharts-canvas .apexcharts-selection-icon.apexcharts-selected svg,.apexcharts-canvas .apexcharts-zoom-icon.apexcharts-selected svg {\n fill: #008ffb\n}\n\n.apexcharts-theme-light .apexcharts-menu-icon:hover svg,.apexcharts-theme-light .apexcharts-reset-icon:hover svg,.apexcharts-theme-light .apexcharts-selection-icon:not(.apexcharts-selected):hover svg,.apexcharts-theme-light .apexcharts-zoom-icon:not(.apexcharts-selected):hover svg,.apexcharts-theme-light .apexcharts-zoomin-icon:hover svg,.apexcharts-theme-light .apexcharts-zoomout-icon:hover svg {\n fill: #333\n}\n\n.apexcharts-menu-icon,.apexcharts-selection-icon {\n position: relative\n}\n\n.apexcharts-reset-icon {\n margin-left: 5px\n}\n\n.apexcharts-menu-icon,.apexcharts-reset-icon,.apexcharts-zoom-icon {\n transform: scale(.85)\n}\n\n.apexcharts-zoomin-icon,.apexcharts-zoomout-icon {\n transform: scale(.7)\n}\n\n.apexcharts-zoomout-icon {\n margin-right: 3px\n}\n\n.apexcharts-pan-icon {\n transform: scale(.62);\n position: relative;\n left: 1px;\n top: 0\n}\n\n.apexcharts-pan-icon svg {\n fill: #fff;\n stroke: #6e8192;\n stroke-width: 2\n}\n\n.apexcharts-pan-icon.apexcharts-selected svg {\n stroke: #008ffb\n}\n\n.apexcharts-pan-icon:not(.apexcharts-selected):hover svg {\n stroke: #333\n}\n\n.apexcharts-toolbar {\n position: absolute;\n z-index: 11;\n max-width: 176px;\n text-align: right;\n border-radius: 3px;\n padding: 0 6px 2px;\n display: flex;\n justify-content: space-between;\n align-items: center\n}\n\n.apexcharts-menu {\n background: #fff;\n position: absolute;\n top: 100%;\n border: 1px solid #ddd;\n border-radius: 3px;\n padding: 3px;\n right: 10px;\n opacity: 0;\n min-width: 110px;\n transition: .15s ease all;\n pointer-events: none\n}\n\n.apexcharts-menu.apexcharts-menu-open {\n opacity: 1;\n pointer-events: all;\n transition: .15s ease all\n}\n\n.apexcharts-menu-item {\n padding: 6px 7px;\n font-size: 12px;\n cursor: pointer\n}\n\n.apexcharts-theme-light .apexcharts-menu-item:hover {\n background: #eee\n}\n\n.apexcharts-theme-dark .apexcharts-menu {\n background: rgba(0,0,0,.7);\n color: #fff\n}\n\n@media screen and (min-width:768px) {\n .apexcharts-canvas:hover .apexcharts-toolbar {\n opacity: 1\n }\n}\n\n.apexcharts-canvas .apexcharts-element-hidden,.apexcharts-datalabel.apexcharts-element-hidden,.apexcharts-hide .apexcharts-series-points {\n display: none;\n}\n\n.apexcharts-hidden-element-shown {\n opacity: 1;\n transition: 0.25s ease all;\n}\n.apexcharts-datalabel,.apexcharts-datalabel-label,.apexcharts-datalabel-value,.apexcharts-datalabels,.apexcharts-pie-label {\n cursor: default;\n pointer-events: none\n}\n\n.apexcharts-pie-label-delay {\n opacity: 0;\n animation-name: opaque;\n animation-duration: .3s;\n animation-fill-mode: forwards;\n animation-timing-function: ease\n}\n\n.apexcharts-radialbar-label {\n cursor: pointer;\n}\n\n.apexcharts-annotation-rect,.apexcharts-area-series .apexcharts-area,.apexcharts-area-series .apexcharts-series-markers .apexcharts-marker.no-pointer-events,.apexcharts-gridline,.apexcharts-line,.apexcharts-line-series .apexcharts-series-markers .apexcharts-marker.no-pointer-events,.apexcharts-point-annotation-label,.apexcharts-radar-series path,.apexcharts-radar-series polygon,.apexcharts-toolbar svg,.apexcharts-tooltip .apexcharts-marker,.apexcharts-xaxis-annotation-label,.apexcharts-yaxis-annotation-label,.apexcharts-zoom-rect {\n pointer-events: none\n}\n\n.apexcharts-marker {\n transition: .15s ease all\n}\n\n.resize-triggers {\n animation: 1ms resizeanim;\n visibility: hidden;\n opacity: 0;\n height: 100%;\n width: 100%;\n overflow: hidden\n}\n\n.contract-trigger:before,.resize-triggers,.resize-triggers>div {\n content: " ";\n display: block;\n position: absolute;\n top: 0;\n left: 0\n}\n\n.resize-triggers>div {\n height: 100%;\n width: 100%;\n background: #eee;\n overflow: auto\n}\n\n.contract-trigger:before {\n overflow: hidden;\n width: 200%;\n height: 200%\n}\n\n.apexcharts-bar-goals-markers{\n pointer-events: none\n}\n\n.apexcharts-bar-shadows{\n pointer-events: none\n}\n\n.apexcharts-rangebar-goals-markers{\n pointer-events: none\n}'; var h = (null === (l = t.opts.chart) || void 0 === l ? void 0 : l.nonce) || t.w.config.chart.nonce; h && n.setAttribute("nonce", h), r ? s.prepend(n) : o.head.appendChild(n) } var c = t.create(t.w.config.series, {}); if (!c) return e(t); t.mount(c).then((function () { "function" == typeof t.w.config.chart.events.mounted && t.w.config.chart.events.mounted(t, t.w), t.events.fireEvent("mounted", [t, t.w]), e(c) })).catch((function (t) { i(t) })) } else i(new Error("Element not found")) })) } }, { key: "create", value: function (t, e) { var i = this.w; new Gt(this).initModules(); var a = this.w.globals; (a.noData = !1, a.animationEnded = !1, this.responsive.checkResponsiveConfig(e), i.config.xaxis.convertedCatToNumeric) && new E(i.config).convertCatToNumericXaxis(i.config, this.ctx); if (null === this.el) return a.animationEnded = !0, null; if (this.core.setupElements(), "treemap" === i.config.chart.type && (i.config.grid.show = !1, i.config.yaxis[0].show = !1), 0 === a.svgWidth) return a.animationEnded = !0, null; var s = y.checkComboSeries(t, i.config.chart.type); a.comboCharts = s.comboCharts, a.comboBarCount = s.comboBarCount; var r = t.every((function (t) { return t.data && 0 === t.data.length })); (0 === t.length || r && a.collapsedSeries.length < 1) && this.series.handleNoData(), this.events.setupEventHandlers(), this.data.parseData(t), this.theme.init(), new D(this).setGlobalMarkerSize(), this.formatters.setLabelFormatters(), this.titleSubtitle.draw(), a.noData && a.collapsedSeries.length !== a.series.length && !i.config.legend.showForSingleSeries || this.legend.init(), this.series.hasAllSeriesEqualX(), a.axisCharts && (this.core.coreCalculations(), "category" !== i.config.xaxis.type && this.formatters.setLabelFormatters(), this.ctx.toolbar.minX = i.globals.minX, this.ctx.toolbar.maxX = i.globals.maxX), this.formatters.heatmapLabelFormatters(), new y(this).getLargestMarkerSize(), this.dimensions.plotCoords(); var o = this.core.xySettings(); this.grid.createGridMask(); var n = this.core.plotChartType(t, o), l = new N(this); return l.bringForward(), i.config.dataLabels.background.enabled && l.dataLabelsBackground(), this.core.shiftGraphPosition(), { elGraph: n, xyRatios: o, dimensions: { plot: { left: i.globals.translateX, top: i.globals.translateY, width: i.globals.gridWidth, height: i.globals.gridHeight } } } } }, { key: "mount", value: function () { var t = this, e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null, i = this, a = i.w; return new Promise((function (s, r) { if (null === i.el) return r(new Error("Not enough data to display or target element not found")); (null === e || a.globals.allSeriesCollapsed) && i.series.handleNoData(), i.grid = new j(i); var o, n, l = i.grid.drawGrid(); (i.annotations = new T(i), i.annotations.drawImageAnnos(), i.annotations.drawTextAnnos(), "back" === a.config.grid.position) && (l && a.globals.dom.elGraphical.add(l.el), null != l && null !== (o = l.elGridBorders) && void 0 !== o && o.node && a.globals.dom.elGraphical.add(l.elGridBorders)); if (Array.isArray(e.elGraph)) for (var h = 0; h < e.elGraph.length; h++)a.globals.dom.elGraphical.add(e.elGraph[h]); else a.globals.dom.elGraphical.add(e.elGraph); "front" === a.config.grid.position && (l && a.globals.dom.elGraphical.add(l.el), null != l && null !== (n = l.elGridBorders) && void 0 !== n && n.node && a.globals.dom.elGraphical.add(l.elGridBorders)); "front" === a.config.xaxis.crosshairs.position && i.crosshairs.drawXCrosshairs(), "front" === a.config.yaxis[0].crosshairs.position && i.crosshairs.drawYCrosshairs(), "treemap" !== a.config.chart.type && i.axes.drawAxis(a.config.chart.type, l); var c = new V(t.ctx, l), d = new q(t.ctx, l); if (null !== l && (c.xAxisLabelCorrections(l.xAxisTickWidth), d.setYAxisTextAlignments(), a.config.yaxis.map((function (t, e) { -1 === a.globals.ignoreYAxisIndexes.indexOf(e) && d.yAxisTitleRotate(e, t.opposite) }))), i.annotations.drawAxesAnnotations(), !a.globals.noData) { if (a.config.tooltip.enabled && !a.globals.noData && i.w.globals.tooltip.drawTooltip(e.xyRatios), a.globals.axisCharts && (a.globals.isXNumeric || a.config.xaxis.convertedCatToNumeric || a.globals.isRangeBar)) (a.config.chart.zoom.enabled || a.config.chart.selection && a.config.chart.selection.enabled || a.config.chart.pan && a.config.chart.pan.enabled) && i.zoomPanSelection.init({ xyRatios: e.xyRatios }); else { var g = a.config.chart.toolbar.tools;["zoom", "zoomin", "zoomout", "selection", "pan", "reset"].forEach((function (t) { g[t] = !1 })) } a.config.chart.toolbar.show && !a.globals.allSeriesCollapsed && i.toolbar.createToolbar() } a.globals.memory.methodsToExec.length > 0 && a.globals.memory.methodsToExec.forEach((function (t) { t.method(t.params, !1, t.context) })), a.globals.axisCharts || a.globals.noData || i.core.resizeNonAxisCharts(), s(i) })) } }, { key: "destroy", value: function () { var t, e; window.removeEventListener("resize", this.windowResizeHandler), this.el.parentNode, t = this.parentResizeHandler, (e = jt.get(t)) && (e.disconnect(), jt.delete(t)); var i = this.w.config.chart.id; i && Apex._chartInstances.forEach((function (t, e) { t.id === x.escapeString(i) && Apex._chartInstances.splice(e, 1) })), new Vt(this.ctx).clear({ isUpdating: !1 }) } }, { key: "updateOptions", value: function (t) { var e = this, i = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], a = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], s = !(arguments.length > 3 && void 0 !== arguments[3]) || arguments[3], r = !(arguments.length > 4 && void 0 !== arguments[4]) || arguments[4], o = this.w; return o.globals.selection = void 0, t.series && (this.series.resetSeries(!1, !0, !1), t.series.length && t.series[0].data && (t.series = t.series.map((function (t, i) { return e.updateHelpers._extendSeries(t, i) }))), this.updateHelpers.revertDefaultAxisMinMax()), t.xaxis && (t = this.updateHelpers.forceXAxisUpdate(t)), t.yaxis && (t = this.updateHelpers.forceYAxisUpdate(t)), o.globals.collapsedSeriesIndices.length > 0 && this.series.clearPreviousPaths(), t.theme && (t = this.theme.updateThemeOptions(t)), this.updateHelpers._updateOptions(t, i, a, s, r) } }, { key: "updateSeries", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [], e = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1], i = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2]; return this.series.resetSeries(!1), this.updateHelpers.revertDefaultAxisMinMax(), this.updateHelpers._updateSeries(t, e, i) } }, { key: "appendSeries", value: function (t) { var e = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1], i = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], a = this.w.config.series.slice(); return a.push(t), this.series.resetSeries(!1), this.updateHelpers.revertDefaultAxisMinMax(), this.updateHelpers._updateSeries(a, e, i) } }, { key: "appendData", value: function (t) { var e = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1], i = this; i.w.globals.dataChanged = !0, i.series.getPreviousPaths(); for (var a = i.w.config.series.slice(), s = 0; s < a.length; s++)if (null !== t[s] && void 0 !== t[s]) for (var r = 0; r < t[s].data.length; r++)a[s].data.push(t[s].data[r]); return i.w.config.series = a, e && (i.w.globals.initialSeries = x.clone(i.w.config.series)), this.update() } }, { key: "update", value: function (t) { var e = this; return new Promise((function (i, a) { new Vt(e.ctx).clear({ isUpdating: !0 }); var s = e.create(e.w.config.series, t); if (!s) return i(e); e.mount(s).then((function () { "function" == typeof e.w.config.chart.events.updated && e.w.config.chart.events.updated(e, e.w), e.events.fireEvent("updated", [e, e.w]), e.w.globals.isDirty = !0, i(e) })).catch((function (t) { a(t) })) })) } }, { key: "getSyncedCharts", value: function () { var t = this.getGroupedCharts(), e = [this]; return t.length && (e = [], t.forEach((function (t) { e.push(t) }))), e } }, { key: "getGroupedCharts", value: function () { var t = this; return Apex._chartInstances.filter((function (t) { if (t.group) return !0 })).map((function (e) { return t.w.config.chart.group === e.group ? e.chart : t })) } }, { key: "toggleSeries", value: function (t) { return this.series.toggleSeries(t) } }, { key: "highlightSeriesOnLegendHover", value: function (t, e) { return this.series.toggleSeriesOnHover(t, e) } }, { key: "showSeries", value: function (t) { this.series.showSeries(t) } }, { key: "hideSeries", value: function (t) { this.series.hideSeries(t) } }, { key: "isSeriesHidden", value: function (t) { this.series.isSeriesHidden(t) } }, { key: "resetSeries", value: function () { var t = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0], e = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1]; this.series.resetSeries(t, e) } }, { key: "addEventListener", value: function (t, e) { this.events.addEventListener(t, e) } }, { key: "removeEventListener", value: function (t, e) { this.events.removeEventListener(t, e) } }, { key: "addXaxisAnnotation", value: function (t) { var e = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1], i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : void 0, a = this; i && (a = i), a.annotations.addXaxisAnnotationExternal(t, e, a) } }, { key: "addYaxisAnnotation", value: function (t) { var e = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1], i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : void 0, a = this; i && (a = i), a.annotations.addYaxisAnnotationExternal(t, e, a) } }, { key: "addPointAnnotation", value: function (t) { var e = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1], i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : void 0, a = this; i && (a = i), a.annotations.addPointAnnotationExternal(t, e, a) } }, { key: "clearAnnotations", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : void 0, e = this; t && (e = t), e.annotations.clearAnnotations(e) } }, { key: "removeAnnotation", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : void 0, i = this; e && (i = e), i.annotations.removeAnnotation(i, t) } }, { key: "getChartArea", value: function () { return this.w.globals.dom.baseEl.querySelector(".apexcharts-inner") } }, { key: "getSeriesTotalXRange", value: function (t, e) { return this.coreUtils.getSeriesTotalsXRange(t, e) } }, { key: "getHighestValueInSeries", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0; return new U(this.ctx).getMinYMaxY(t).highestY } }, { key: "getLowestValueInSeries", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0; return new U(this.ctx).getMinYMaxY(t).lowestY } }, { key: "getSeriesTotal", value: function () { return this.w.globals.seriesTotals } }, { key: "toggleDataPointSelection", value: function (t, e) { return this.updateHelpers.toggleDataPointSelection(t, e) } }, { key: "zoomX", value: function (t, e) { this.ctx.toolbar.zoomUpdateOptions(t, e) } }, { key: "setLocale", value: function (t) { this.localization.setCurrentLocaleValues(t) } }, { key: "dataURI", value: function (t) { return new G(this.ctx).dataURI(t) } }, { key: "exportToCSV", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; return new G(this.ctx).exportToCSV(t) } }, { key: "paper", value: function () { return this.w.globals.dom.Paper } }, { key: "_parentResizeCallback", value: function () { this.w.globals.animationEnded && this.w.config.chart.redrawOnParentResize && this._windowResize() } }, { key: "_windowResize", value: function () { var t = this; clearTimeout(this.w.globals.resizeTimer), this.w.globals.resizeTimer = window.setTimeout((function () { t.w.globals.resized = !0, t.w.globals.dataChanged = !1, t.ctx.update() }), 150) } }, { key: "_windowResizeHandler", value: function () { var t = this.w.config.chart.redrawOnWindowResize; "function" == typeof t && (t = t()), t && this._windowResize() } }], [{ key: "getChartByID", value: function (t) { var e = x.escapeString(t); if (Apex._chartInstances) { var i = Apex._chartInstances.filter((function (t) { return t.id === e }))[0]; return i && i.chart } } }, { key: "initOnLoad", value: function () { for (var e = document.querySelectorAll("[data-apexcharts]"), i = 0; i < e.length; i++) { new t(e[i], JSON.parse(e[i].getAttribute("data-options"))).render() } } }, { key: "exec", value: function (t, e) { var i = this.getChartByID(t); if (i) { i.w.globals.isExecCalled = !0; var a = null; if (-1 !== i.publicMethods.indexOf(e)) { for (var s = arguments.length, r = new Array(s > 2 ? s - 2 : 0), o = 2; o < s; o++)r[o - 2] = arguments[o]; a = i[e].apply(i, r) } return a } } }, { key: "merge", value: function (t, e) { return x.extend(t, e) } }]), t }(); return _t -})); diff --git a/public/js/dropzone.js b/public/js/dropzone.js deleted file mode 100644 index 58ec1972f7..0000000000 --- a/public/js/dropzone.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var n=t();for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(self,(function(){return function(){var e={3099:function(e){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},6077:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},1223:function(e,t,n){var r=n(5112),i=n(30),o=n(3070),a=r("unscopables"),u=Array.prototype;null==u[a]&&o.f(u,a,{configurable:!0,value:i(null)}),e.exports=function(e){u[a][e]=!0}},1530:function(e,t,n){"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:function(e){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},9670:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},4019:function(e){e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},260:function(e,t,n){"use strict";var r,i=n(4019),o=n(9781),a=n(7854),u=n(111),s=n(6656),l=n(648),c=n(8880),f=n(1320),p=n(3070).f,h=n(9518),d=n(7674),v=n(5112),y=n(9711),g=a.Int8Array,m=g&&g.prototype,b=a.Uint8ClampedArray,x=b&&b.prototype,w=g&&h(g),E=m&&h(m),k=Object.prototype,A=k.isPrototypeOf,S=v("toStringTag"),F=y("TYPED_ARRAY_TAG"),T=i&&!!d&&"Opera"!==l(a.opera),C=!1,L={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},R={BigInt64Array:8,BigUint64Array:8},I=function(e){if(!u(e))return!1;var t=l(e);return s(L,t)||s(R,t)};for(r in L)a[r]||(T=!1);if((!T||"function"!=typeof w||w===Function.prototype)&&(w=function(){throw TypeError("Incorrect invocation")},T))for(r in L)a[r]&&d(a[r],w);if((!T||!E||E===k)&&(E=w.prototype,T))for(r in L)a[r]&&d(a[r].prototype,E);if(T&&h(x)!==E&&d(x,E),o&&!s(E,S))for(r in C=!0,p(E,S,{get:function(){return u(this)?this[F]:void 0}}),L)a[r]&&c(a[r],F,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:T,TYPED_ARRAY_TAG:C&&F,aTypedArray:function(e){if(I(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(d){if(A.call(w,e))return e}else for(var t in L)if(s(L,r)){var n=a[t];if(n&&(e===n||A.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(o){if(n)for(var r in L){var i=a[r];i&&s(i.prototype,e)&&delete i.prototype[e]}E[e]&&!n||f(E,e,n?t:T&&m[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var r,i;if(o){if(d){if(n)for(r in L)(i=a[r])&&s(i,e)&&delete i[e];if(w[e]&&!n)return;try{return f(w,e,n?t:T&&g[e]||t)}catch(e){}}for(r in L)!(i=a[r])||i[e]&&!n||f(i,e,t)}},isView:function(e){if(!u(e))return!1;var t=l(e);return"DataView"===t||s(L,t)||s(R,t)},isTypedArray:I,TypedArray:w,TypedArrayPrototype:E}},3331:function(e,t,n){"use strict";var r=n(7854),i=n(9781),o=n(4019),a=n(8880),u=n(2248),s=n(7293),l=n(5787),c=n(9958),f=n(7466),p=n(7067),h=n(1179),d=n(9518),v=n(7674),y=n(8006).f,g=n(3070).f,m=n(1285),b=n(8003),x=n(9909),w=x.get,E=x.set,k="ArrayBuffer",A="DataView",S="Wrong index",F=r.ArrayBuffer,T=F,C=r.DataView,L=C&&C.prototype,R=Object.prototype,I=r.RangeError,U=h.pack,O=h.unpack,_=function(e){return[255&e]},M=function(e){return[255&e,e>>8&255]},z=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},P=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},j=function(e){return U(e,23,4)},D=function(e){return U(e,52,8)},N=function(e,t){g(e.prototype,t,{get:function(){return w(this)[t]}})},B=function(e,t,n,r){var i=p(n),o=w(e);if(i+t>o.byteLength)throw I(S);var a=w(o.buffer).bytes,u=i+o.byteOffset,s=a.slice(u,u+t);return r?s:s.reverse()},q=function(e,t,n,r,i,o){var a=p(n),u=w(e);if(a+t>u.byteLength)throw I(S);for(var s=w(u.buffer).bytes,l=a+u.byteOffset,c=r(+i),f=0;fG;)(W=Y[G++])in T||a(T,W,F[W]);H.constructor=T}v&&d(L)!==R&&v(L,R);var Q=new C(new T(2)),$=L.setInt8;Q.setInt8(0,2147483648),Q.setInt8(1,2147483649),!Q.getInt8(0)&&Q.getInt8(1)||u(L,{setInt8:function(e,t){$.call(this,e,t<<24>>24)},setUint8:function(e,t){$.call(this,e,t<<24>>24)}},{unsafe:!0})}else T=function(e){l(this,T,k);var t=p(e);E(this,{bytes:m.call(new Array(t),0),byteLength:t}),i||(this.byteLength=t)},C=function(e,t,n){l(this,C,A),l(e,T,A);var r=w(e).byteLength,o=c(t);if(o<0||o>r)throw I("Wrong offset");if(o+(n=void 0===n?r-o:f(n))>r)throw I("Wrong length");E(this,{buffer:e,byteLength:n,byteOffset:o}),i||(this.buffer=e,this.byteLength=n,this.byteOffset=o)},i&&(N(T,"byteLength"),N(C,"buffer"),N(C,"byteLength"),N(C,"byteOffset")),u(C.prototype,{getInt8:function(e){return B(this,1,e)[0]<<24>>24},getUint8:function(e){return B(this,1,e)[0]},getInt16:function(e){var t=B(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=B(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return P(B(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return P(B(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return O(B(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return O(B(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){q(this,1,e,_,t)},setUint8:function(e,t){q(this,1,e,_,t)},setInt16:function(e,t){q(this,2,e,M,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){q(this,2,e,M,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){q(this,4,e,z,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){q(this,4,e,z,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){q(this,4,e,j,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){q(this,8,e,D,t,arguments.length>2?arguments[2]:void 0)}});b(T,k),b(C,A),e.exports={ArrayBuffer:T,DataView:C}},1048:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466),a=Math.min;e.exports=[].copyWithin||function(e,t){var n=r(this),u=o(n.length),s=i(e,u),l=i(t,u),c=arguments.length>2?arguments[2]:void 0,f=a((void 0===c?u:i(c,u))-l,u-s),p=1;for(l0;)l in n?n[s]=n[l]:delete n[s],s+=p,l+=p;return n}},1285:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466);e.exports=function(e){for(var t=r(this),n=o(t.length),a=arguments.length,u=i(a>1?arguments[1]:void 0,n),s=a>2?arguments[2]:void 0,l=void 0===s?n:i(s,n);l>u;)t[u++]=e;return t}},8533:function(e,t,n){"use strict";var r=n(2092).forEach,i=n(9341)("forEach");e.exports=i?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},8457:function(e,t,n){"use strict";var r=n(9974),i=n(7908),o=n(3411),a=n(7659),u=n(7466),s=n(6135),l=n(1246);e.exports=function(e){var t,n,c,f,p,h,d=i(e),v="function"==typeof this?this:Array,y=arguments.length,g=y>1?arguments[1]:void 0,m=void 0!==g,b=l(d),x=0;if(m&&(g=r(g,y>2?arguments[2]:void 0,2)),null==b||v==Array&&a(b))for(n=new v(t=u(d.length));t>x;x++)h=m?g(d[x],x):d[x],s(n,x,h);else for(p=(f=b.call(d)).next,n=new v;!(c=p.call(f)).done;x++)h=m?o(f,g,[c.value,x],!0):c.value,s(n,x,h);return n.length=x,n}},1318:function(e,t,n){var r=n(5656),i=n(7466),o=n(1400),a=function(e){return function(t,n,a){var u,s=r(t),l=i(s.length),c=o(a,l);if(e&&n!=n){for(;l>c;)if((u=s[c++])!=u)return!0}else for(;l>c;c++)if((e||c in s)&&s[c]===n)return e||c||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},2092:function(e,t,n){var r=n(9974),i=n(8361),o=n(7908),a=n(7466),u=n(5417),s=[].push,l=function(e){var t=1==e,n=2==e,l=3==e,c=4==e,f=6==e,p=7==e,h=5==e||f;return function(d,v,y,g){for(var m,b,x=o(d),w=i(x),E=r(v,y,3),k=a(w.length),A=0,S=g||u,F=t?S(d,k):n||p?S(d,0):void 0;k>A;A++)if((h||A in w)&&(b=E(m=w[A],A,x),e))if(t)F[A]=b;else if(b)switch(e){case 3:return!0;case 5:return m;case 6:return A;case 2:s.call(F,m)}else switch(e){case 4:return!1;case 7:s.call(F,m)}return f?-1:l||c?c:F}};e.exports={forEach:l(0),map:l(1),filter:l(2),some:l(3),every:l(4),find:l(5),findIndex:l(6),filterOut:l(7)}},6583:function(e,t,n){"use strict";var r=n(5656),i=n(9958),o=n(7466),a=n(9341),u=Math.min,s=[].lastIndexOf,l=!!s&&1/[1].lastIndexOf(1,-0)<0,c=a("lastIndexOf"),f=l||!c;e.exports=f?function(e){if(l)return s.apply(this,arguments)||0;var t=r(this),n=o(t.length),a=n-1;for(arguments.length>1&&(a=u(a,i(arguments[1]))),a<0&&(a=n+a);a>=0;a--)if(a in t&&t[a]===e)return a||0;return-1}:s},1194:function(e,t,n){var r=n(7293),i=n(5112),o=n(7392),a=i("species");e.exports=function(e){return o>=51||!r((function(){var t=[];return(t.constructor={})[a]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},9341:function(e,t,n){"use strict";var r=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){throw 1},1)}))}},3671:function(e,t,n){var r=n(3099),i=n(7908),o=n(8361),a=n(7466),u=function(e){return function(t,n,u,s){r(n);var l=i(t),c=o(l),f=a(l.length),p=e?f-1:0,h=e?-1:1;if(u<2)for(;;){if(p in c){s=c[p],p+=h;break}if(p+=h,e?p<0:f<=p)throw TypeError("Reduce of empty array with no initial value")}for(;e?p>=0:f>p;p+=h)p in c&&(s=n(s,c[p],p,l));return s}};e.exports={left:u(!1),right:u(!0)}},5417:function(e,t,n){var r=n(111),i=n(3157),o=n(5112)("species");e.exports=function(e,t){var n;return i(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[o])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},3411:function(e,t,n){var r=n(9670),i=n(9212);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){throw i(e),t}}},7072:function(e,t,n){var r=n(5112)("iterator"),i=!1;try{var o=0,a={next:function(){return{done:!!o++}},return:function(){i=!0}};a[r]=function(){return this},Array.from(a,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},e(o)}catch(e){}return n}},4326:function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},648:function(e,t,n){var r=n(1694),i=n(4326),o=n(5112)("toStringTag"),a="Arguments"==i(function(){return arguments}());e.exports=r?i:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:a?i(t):"Object"==(r=i(t))&&"function"==typeof t.callee?"Arguments":r}},9920:function(e,t,n){var r=n(6656),i=n(3887),o=n(1236),a=n(3070);e.exports=function(e,t){for(var n=i(t),u=a.f,s=o.f,l=0;l=74)&&(r=a.match(/Chrome\/(\d+)/))&&(i=r[1]),e.exports=i&&+i},748:function(e){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(e,t,n){var r=n(7854),i=n(1236).f,o=n(8880),a=n(1320),u=n(3505),s=n(9920),l=n(4705);e.exports=function(e,t){var n,c,f,p,h,d=e.target,v=e.global,y=e.stat;if(n=v?r:y?r[d]||u(d,{}):(r[d]||{}).prototype)for(c in t){if(p=t[c],f=e.noTargetGet?(h=i(n,c))&&h.value:n[c],!l(v?c:d+(y?".":"#")+c,e.forced)&&void 0!==f){if(typeof p==typeof f)continue;s(p,f)}(e.sham||f&&f.sham)&&o(p,"sham",!0),a(n,c,p,e)}}},7293:function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:function(e,t,n){"use strict";n(4916);var r=n(1320),i=n(7293),o=n(5112),a=n(2261),u=n(8880),s=o("species"),l=!i((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")})),c="$0"==="a".replace(/./,"$0"),f=o("replace"),p=!!/./[f]&&""===/./[f]("a","$0"),h=!i((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}));e.exports=function(e,t,n,f){var d=o(e),v=!i((function(){var t={};return t[d]=function(){return 7},7!=""[e](t)})),y=v&&!i((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[s]=function(){return n},n.flags="",n[d]=/./[d]),n.exec=function(){return t=!0,null},n[d](""),!t}));if(!v||!y||"replace"===e&&(!l||!c||p)||"split"===e&&!h){var g=/./[d],m=n(d,""[e],(function(e,t,n,r,i){return t.exec===a?v&&!i?{done:!0,value:g.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),{REPLACE_KEEPS_$0:c,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:p}),b=m[0],x=m[1];r(String.prototype,e,b),r(RegExp.prototype,d,2==t?function(e,t){return x.call(e,this,t)}:function(e){return x.call(e,this)})}f&&u(RegExp.prototype[d],"sham",!0)}},9974:function(e,t,n){var r=n(3099);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},5005:function(e,t,n){var r=n(857),i=n(7854),o=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(r[e])||o(i[e]):r[e]&&r[e][t]||i[e]&&i[e][t]}},1246:function(e,t,n){var r=n(648),i=n(7497),o=n(5112)("iterator");e.exports=function(e){if(null!=e)return e[o]||e["@@iterator"]||i[r(e)]}},8554:function(e,t,n){var r=n(9670),i=n(1246);e.exports=function(e){var t=i(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return r(t.call(e))}},647:function(e,t,n){var r=n(7908),i=Math.floor,o="".replace,a=/\$([$&'`]|\d\d?|<[^>]*>)/g,u=/\$([$&'`]|\d\d?)/g;e.exports=function(e,t,n,s,l,c){var f=n+e.length,p=s.length,h=u;return void 0!==l&&(l=r(l),h=a),o.call(c,h,(function(r,o){var a;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(f);case"<":a=l[o.slice(1,-1)];break;default:var u=+o;if(0===u)return r;if(u>p){var c=i(u/10);return 0===c?r:c<=p?void 0===s[c-1]?o.charAt(1):s[c-1]+o.charAt(1):r}a=s[u-1]}return void 0===a?"":a}))}},7854:function(e,t,n){var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},6656:function(e){var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},3501:function(e){e.exports={}},490:function(e,t,n){var r=n(5005);e.exports=r("document","documentElement")},4664:function(e,t,n){var r=n(9781),i=n(7293),o=n(317);e.exports=!r&&!i((function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a}))},1179:function(e){var t=Math.abs,n=Math.pow,r=Math.floor,i=Math.log,o=Math.LN2;e.exports={pack:function(e,a,u){var s,l,c,f=new Array(u),p=8*u-a-1,h=(1<>1,v=23===a?n(2,-24)-n(2,-77):0,y=e<0||0===e&&1/e<0?1:0,g=0;for((e=t(e))!=e||e===1/0?(l=e!=e?1:0,s=h):(s=r(i(e)/o),e*(c=n(2,-s))<1&&(s--,c*=2),(e+=s+d>=1?v/c:v*n(2,1-d))*c>=2&&(s++,c/=2),s+d>=h?(l=0,s=h):s+d>=1?(l=(e*c-1)*n(2,a),s+=d):(l=e*n(2,d-1)*n(2,a),s=0));a>=8;f[g++]=255&l,l/=256,a-=8);for(s=s<0;f[g++]=255&s,s/=256,p-=8);return f[--g]|=128*y,f},unpack:function(e,t){var r,i=e.length,o=8*i-t-1,a=(1<>1,s=o-7,l=i-1,c=e[l--],f=127&c;for(c>>=7;s>0;f=256*f+e[l],l--,s-=8);for(r=f&(1<<-s)-1,f>>=-s,s+=t;s>0;r=256*r+e[l],l--,s-=8);if(0===f)f=1-u;else{if(f===a)return r?NaN:c?-1/0:1/0;r+=n(2,t),f-=u}return(c?-1:1)*r*n(2,f-t)}}},8361:function(e,t,n){var r=n(7293),i=n(4326),o="".split;e.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==i(e)?o.call(e,""):Object(e)}:Object},9587:function(e,t,n){var r=n(111),i=n(7674);e.exports=function(e,t,n){var o,a;return i&&"function"==typeof(o=t.constructor)&&o!==n&&r(a=o.prototype)&&a!==n.prototype&&i(e,a),e}},2788:function(e,t,n){var r=n(5465),i=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return i.call(e)}),e.exports=r.inspectSource},9909:function(e,t,n){var r,i,o,a=n(8536),u=n(7854),s=n(111),l=n(8880),c=n(6656),f=n(5465),p=n(6200),h=n(3501),d=u.WeakMap;if(a){var v=f.state||(f.state=new d),y=v.get,g=v.has,m=v.set;r=function(e,t){return t.facade=e,m.call(v,e,t),t},i=function(e){return y.call(v,e)||{}},o=function(e){return g.call(v,e)}}else{var b=p("state");h[b]=!0,r=function(e,t){return t.facade=e,l(e,b,t),t},i=function(e){return c(e,b)?e[b]:{}},o=function(e){return c(e,b)}}e.exports={set:r,get:i,has:o,enforce:function(e){return o(e)?i(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!s(t)||(n=i(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},7659:function(e,t,n){var r=n(5112),i=n(7497),o=r("iterator"),a=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||a[o]===e)}},3157:function(e,t,n){var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},4705:function(e,t,n){var r=n(7293),i=/#|\.prototype\./,o=function(e,t){var n=u[a(e)];return n==l||n!=s&&("function"==typeof t?r(t):!!t)},a=o.normalize=function(e){return String(e).replace(i,".").toLowerCase()},u=o.data={},s=o.NATIVE="N",l=o.POLYFILL="P";e.exports=o},111:function(e){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},1913:function(e){e.exports=!1},7850:function(e,t,n){var r=n(111),i=n(4326),o=n(5112)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[o])?!!t:"RegExp"==i(e))}},9212:function(e,t,n){var r=n(9670);e.exports=function(e){var t=e.return;if(void 0!==t)return r(t.call(e)).value}},3383:function(e,t,n){"use strict";var r,i,o,a=n(7293),u=n(9518),s=n(8880),l=n(6656),c=n(5112),f=n(1913),p=c("iterator"),h=!1;[].keys&&("next"in(o=[].keys())?(i=u(u(o)))!==Object.prototype&&(r=i):h=!0);var d=null==r||a((function(){var e={};return r[p].call(e)!==e}));d&&(r={}),f&&!d||l(r,p)||s(r,p,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:h}},7497:function(e){e.exports={}},133:function(e,t,n){var r=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},590:function(e,t,n){var r=n(7293),i=n(5112),o=n(1913),a=i("iterator");e.exports=!r((function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach((function(e,r){t.delete("b"),n+=r+e})),o&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[a]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host}))},8536:function(e,t,n){var r=n(7854),i=n(2788),o=r.WeakMap;e.exports="function"==typeof o&&/native code/.test(i(o))},1574:function(e,t,n){"use strict";var r=n(9781),i=n(7293),o=n(1956),a=n(5181),u=n(5296),s=n(7908),l=n(8361),c=Object.assign,f=Object.defineProperty;e.exports=!c||i((function(){if(r&&1!==c({b:1},c(f({},"a",{enumerable:!0,get:function(){f(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach((function(e){t[e]=e})),7!=c({},e)[n]||o(c({},t)).join("")!=i}))?function(e,t){for(var n=s(e),i=arguments.length,c=1,f=a.f,p=u.f;i>c;)for(var h,d=l(arguments[c++]),v=f?o(d).concat(f(d)):o(d),y=v.length,g=0;y>g;)h=v[g++],r&&!p.call(d,h)||(n[h]=d[h]);return n}:c},30:function(e,t,n){var r,i=n(9670),o=n(6048),a=n(748),u=n(3501),s=n(490),l=n(317),c=n(6200)("IE_PROTO"),f=function(){},p=function(e){return"'),this.element.appendChild(e));var i=e.getElementsByTagName("span")[0];return i&&(null!=i.textContent?i.textContent=this.options.dictFallbackMessage:null!=i.innerText&&(i.innerText=this.options.dictFallbackMessage)),this.element.appendChild(this.getFallbackForm())},resize:function(e,t,n,r){var i={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},o=e.width/e.height;null==t&&null==n?(t=i.srcWidth,n=i.srcHeight):null==t?t=n*o:null==n&&(n=t/o);var a=(t=Math.min(t,i.srcWidth))/(n=Math.min(n,i.srcHeight));if(i.srcWidth>t||i.srcHeight>n)if("crop"===r)o>a?(i.srcHeight=e.height,i.srcWidth=i.srcHeight*a):(i.srcWidth=e.width,i.srcHeight=i.srcWidth/a);else{if("contain"!==r)throw new Error("Unknown resizeMethod '".concat(r,"'"));o>a?n=t/o:t=n*o}return i.srcX=(e.width-i.srcWidth)/2,i.srcY=(e.height-i.srcHeight)/2,i.trgWidth=t,i.trgHeight=n,i},transformFile:function(e,t){return(this.options.resizeWidth||this.options.resizeHeight)&&e.type.match(/image.*/)?this.resizeImage(e,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,t):t(e)},previewTemplate:'
Check
Error
',drop:function(e){return this.element.classList.remove("dz-drag-hover")},dragstart:function(e){},dragend:function(e){return this.element.classList.remove("dz-drag-hover")},dragenter:function(e){return this.element.classList.add("dz-drag-hover")},dragover:function(e){return this.element.classList.add("dz-drag-hover")},dragleave:function(e){return this.element.classList.remove("dz-drag-hover")},paste:function(e){},reset:function(){return this.element.classList.remove("dz-started")},addedfile:function(e){var t=this;if(this.element===this.previewsContainer&&this.element.classList.add("dz-started"),this.previewsContainer&&!this.options.disablePreviews){e.previewElement=b.createElement(this.options.previewTemplate.trim()),e.previewTemplate=e.previewElement,this.previewsContainer.appendChild(e.previewElement);var n,r=a(e.previewElement.querySelectorAll("[data-dz-name]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.textContent=e.name}}catch(e){r.e(e)}finally{r.f()}var o,u=a(e.previewElement.querySelectorAll("[data-dz-size]"),!0);try{for(u.s();!(o=u.n()).done;)(i=o.value).innerHTML=this.filesize(e.size)}catch(e){u.e(e)}finally{u.f()}this.options.addRemoveLinks&&(e._removeLink=b.createElement(''.concat(this.options.dictRemoveFile,"")),e.previewElement.appendChild(e._removeLink));var s,l=function(n){return n.preventDefault(),n.stopPropagation(),e.status===b.UPLOADING?b.confirm(t.options.dictCancelUploadConfirmation,(function(){return t.removeFile(e)})):t.options.dictRemoveFileConfirmation?b.confirm(t.options.dictRemoveFileConfirmation,(function(){return t.removeFile(e)})):t.removeFile(e)},c=a(e.previewElement.querySelectorAll("[data-dz-remove]"),!0);try{for(c.s();!(s=c.n()).done;)s.value.addEventListener("click",l)}catch(e){c.e(e)}finally{c.f()}}},removedfile:function(e){return null!=e.previewElement&&null!=e.previewElement.parentNode&&e.previewElement.parentNode.removeChild(e.previewElement),this._updateMaxFilesReachedClass()},thumbnail:function(e,t){if(e.previewElement){e.previewElement.classList.remove("dz-file-preview");var n,r=a(e.previewElement.querySelectorAll("[data-dz-thumbnail]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.alt=e.name,i.src=t}}catch(e){r.e(e)}finally{r.f()}return setTimeout((function(){return e.previewElement.classList.add("dz-image-preview")}),1)}},error:function(e,t){if(e.previewElement){e.previewElement.classList.add("dz-error"),"string"!=typeof t&&t.error&&(t=t.error);var n,r=a(e.previewElement.querySelectorAll("[data-dz-errormessage]"),!0);try{for(r.s();!(n=r.n()).done;)n.value.textContent=t}catch(e){r.e(e)}finally{r.f()}}},errormultiple:function(){},processing:function(e){if(e.previewElement&&(e.previewElement.classList.add("dz-processing"),e._removeLink))return e._removeLink.innerHTML=this.options.dictCancelUpload},processingmultiple:function(){},uploadprogress:function(e,t,n){if(e.previewElement){var r,i=a(e.previewElement.querySelectorAll("[data-dz-uploadprogress]"),!0);try{for(i.s();!(r=i.n()).done;){var o=r.value;"PROGRESS"===o.nodeName?o.value=t:o.style.width="".concat(t,"%")}}catch(e){i.e(e)}finally{i.f()}}},totaluploadprogress:function(){},sending:function(){},sendingmultiple:function(){},success:function(e){if(e.previewElement)return e.previewElement.classList.add("dz-success")},successmultiple:function(){},canceled:function(e){return this.emit("error",e,this.options.dictUploadCanceled)},canceledmultiple:function(){},complete:function(e){if(e._removeLink&&(e._removeLink.innerHTML=this.options.dictRemoveFile),e.previewElement)return e.previewElement.classList.add("dz-complete")},completemultiple:function(){},maxfilesexceeded:function(){},maxfilesreached:function(){},queuecomplete:function(){},addedfiles:function(){}};function l(e){return(l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function c(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return f(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?f(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return a=e.done,e},e:function(e){u=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(u)throw o}}}}function f(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n"))),this.clickableElements.length&&function t(){e.hiddenFileInput&&e.hiddenFileInput.parentNode.removeChild(e.hiddenFileInput),e.hiddenFileInput=document.createElement("input"),e.hiddenFileInput.setAttribute("type","file"),(null===e.options.maxFiles||e.options.maxFiles>1)&&e.hiddenFileInput.setAttribute("multiple","multiple"),e.hiddenFileInput.className="dz-hidden-input",null!==e.options.acceptedFiles&&e.hiddenFileInput.setAttribute("accept",e.options.acceptedFiles),null!==e.options.capture&&e.hiddenFileInput.setAttribute("capture",e.options.capture),e.hiddenFileInput.setAttribute("tabindex","-1"),e.hiddenFileInput.style.visibility="hidden",e.hiddenFileInput.style.position="absolute",e.hiddenFileInput.style.top="0",e.hiddenFileInput.style.left="0",e.hiddenFileInput.style.height="0",e.hiddenFileInput.style.width="0",i.getElement(e.options.hiddenInputContainer,"hiddenInputContainer").appendChild(e.hiddenFileInput),e.hiddenFileInput.addEventListener("change",(function(){var n=e.hiddenFileInput.files;if(n.length){var r,i=c(n,!0);try{for(i.s();!(r=i.n()).done;){var o=r.value;e.addFile(o)}}catch(e){i.e(e)}finally{i.f()}}e.emit("addedfiles",n),t()}))}(),this.URL=null!==window.URL?window.URL:window.webkitURL;var t,n=c(this.events,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.on(r,this.options[r])}}catch(e){n.e(e)}finally{n.f()}this.on("uploadprogress",(function(){return e.updateTotalUploadProgress()})),this.on("removedfile",(function(){return e.updateTotalUploadProgress()})),this.on("canceled",(function(t){return e.emit("complete",t)})),this.on("complete",(function(t){if(0===e.getAddedFiles().length&&0===e.getUploadingFiles().length&&0===e.getQueuedFiles().length)return setTimeout((function(){return e.emit("queuecomplete")}),0)}));var o=function(e){if(function(e){if(e.dataTransfer.types)for(var t=0;t")),n+='');var r=i.createElement(n);return"FORM"!==this.element.tagName?(t=i.createElement('
'))).appendChild(r):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:r}},{key:"getExistingFallback",value:function(){for(var e=function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;if(/(^| )fallback($| )/.test(r.className))return r}}catch(e){n.e(e)}finally{n.f()}},t=0,n=["div","form"];t0){for(var r=["tb","gb","mb","kb","b"],i=0;i=Math.pow(this.options.filesizeBase,4-i)/10){t=e/Math.pow(this.options.filesizeBase,4-i),n=o;break}}t=Math.round(10*t)/10}return"".concat(t," ").concat(this.options.dictFileSizeUnits[n])}},{key:"_updateMaxFilesReachedClass",value:function(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")}},{key:"drop",value:function(e){if(e.dataTransfer){this.emit("drop",e);for(var t=[],n=0;n0){var i,o=c(r,!0);try{for(o.s();!(i=o.n()).done;){var a=i.value;a.isFile?a.file((function(e){if(!n.options.ignoreHiddenFiles||"."!==e.name.substring(0,1))return e.fullPath="".concat(t,"/").concat(e.name),n.addFile(e)})):a.isDirectory&&n._addFilesFromDirectory(a,"".concat(t,"/").concat(a.name))}}catch(e){o.e(e)}finally{o.f()}e()}return null}),i)}()}},{key:"accept",value:function(e,t){this.options.maxFilesize&&e.size>1024*this.options.maxFilesize*1024?t(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):i.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(t(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,t):t(this.options.dictInvalidFileType)}},{key:"addFile",value:function(e){var t=this;e.upload={uuid:i.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=i.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,(function(n){n?(e.accepted=!1,t._errorProcessing([e],n)):(e.accepted=!0,t.options.autoQueue&&t.enqueueFile(e)),t._updateMaxFilesReachedClass()}))}},{key:"enqueueFiles",value:function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.enqueueFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"enqueueFile",value:function(e){var t=this;if(e.status!==i.ADDED||!0!==e.accepted)throw new Error("This file can't be queued because it has already been processed or was rejected.");if(e.status=i.QUEUED,this.options.autoProcessQueue)return setTimeout((function(){return t.processQueue()}),0)}},{key:"_enqueueThumbnail",value:function(e){var t=this;if(this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1024*this.options.maxThumbnailFilesize*1024)return this._thumbnailQueue.push(e),setTimeout((function(){return t._processThumbnailQueue()}),0)}},{key:"_processThumbnailQueue",value:function(){var e=this;if(!this._processingThumbnail&&0!==this._thumbnailQueue.length){this._processingThumbnail=!0;var t=this._thumbnailQueue.shift();return this.createThumbnail(t,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,!0,(function(n){return e.emit("thumbnail",t,n),e._processingThumbnail=!1,e._processThumbnailQueue()}))}}},{key:"removeFile",value:function(e){if(e.status===i.UPLOADING&&this.cancelUpload(e),this.files=x(this.files,e),this.emit("removedfile",e),0===this.files.length)return this.emit("reset")}},{key:"removeAllFiles",value:function(e){null==e&&(e=!1);var t,n=c(this.files.slice(),!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;(r.status!==i.UPLOADING||e)&&this.removeFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"resizeImage",value:function(e,t,n,r,o){var a=this;return this.createThumbnail(e,t,n,r,!0,(function(t,n){if(null==n)return o(e);var r=a.options.resizeMimeType;null==r&&(r=e.type);var u=n.toDataURL(r,a.options.resizeQuality);return"image/jpeg"!==r&&"image/jpg"!==r||(u=k.restore(e.dataURL,u)),o(i.dataURItoBlob(u))}))}},{key:"createThumbnail",value:function(e,t,n,r,i,o){var a=this,u=new FileReader;u.onload=function(){e.dataURL=u.result,"image/svg+xml"!==e.type?a.createThumbnailFromUrl(e,t,n,r,i,o):null!=o&&o(u.result)},u.readAsDataURL(e)}},{key:"displayExistingFile",value:function(e,t,n,r){var i=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];if(this.emit("addedfile",e),this.emit("complete",e),o){var a=function(t){i.emit("thumbnail",e,t),n&&n()};e.dataURL=t,this.createThumbnailFromUrl(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,this.options.fixOrientation,a,r)}else this.emit("thumbnail",e,t),n&&n()}},{key:"createThumbnailFromUrl",value:function(e,t,n,r,i,o,a){var u=this,s=document.createElement("img");return a&&(s.crossOrigin=a),i="from-image"!=getComputedStyle(document.body).imageOrientation&&i,s.onload=function(){var a=function(e){return e(1)};return"undefined"!=typeof EXIF&&null!==EXIF&&i&&(a=function(e){return EXIF.getData(s,(function(){return e(EXIF.getTag(this,"Orientation"))}))}),a((function(i){e.width=s.width,e.height=s.height;var a=u.options.resize.call(u,e,t,n,r),l=document.createElement("canvas"),c=l.getContext("2d");switch(l.width=a.trgWidth,l.height=a.trgHeight,i>4&&(l.width=a.trgHeight,l.height=a.trgWidth),i){case 2:c.translate(l.width,0),c.scale(-1,1);break;case 3:c.translate(l.width,l.height),c.rotate(Math.PI);break;case 4:c.translate(0,l.height),c.scale(1,-1);break;case 5:c.rotate(.5*Math.PI),c.scale(1,-1);break;case 6:c.rotate(.5*Math.PI),c.translate(0,-l.width);break;case 7:c.rotate(.5*Math.PI),c.translate(l.height,-l.width),c.scale(-1,1);break;case 8:c.rotate(-.5*Math.PI),c.translate(-l.height,0)}E(c,s,null!=a.srcX?a.srcX:0,null!=a.srcY?a.srcY:0,a.srcWidth,a.srcHeight,null!=a.trgX?a.trgX:0,null!=a.trgY?a.trgY:0,a.trgWidth,a.trgHeight);var f=l.toDataURL("image/png");if(null!=o)return o(f,l)}))},null!=o&&(s.onerror=o),s.src=e.dataURL}},{key:"processQueue",value:function(){var e=this.options.parallelUploads,t=this.getUploadingFiles().length,n=t;if(!(t>=e)){var r=this.getQueuedFiles();if(r.length>0){if(this.options.uploadMultiple)return this.processFiles(r.slice(0,e-t));for(;n1?t-1:0),r=1;rt.options.chunkSize),e[0].upload.totalChunkCount=Math.ceil(r.size/t.options.chunkSize)}if(e[0].upload.chunked){var o=e[0],a=n[0];o.upload.chunks=[];var u=function(){for(var n=0;void 0!==o.upload.chunks[n];)n++;if(!(n>=o.upload.totalChunkCount)){var r=n*t.options.chunkSize,u=Math.min(r+t.options.chunkSize,a.size),s={name:t._getParamName(0),data:a.webkitSlice?a.webkitSlice(r,u):a.slice(r,u),filename:o.upload.filename,chunkIndex:n};o.upload.chunks[n]={file:o,index:n,dataBlock:s,status:i.UPLOADING,progress:0,retries:0},t._uploadData(e,[s])}};if(o.upload.finishedChunkUpload=function(n,r){var a=!0;n.status=i.SUCCESS,n.dataBlock=null,n.xhr=null;for(var s=0;s1?t-1:0),r=1;r=a;u?o++:o--)i[o]=t.charCodeAt(o);return new Blob([r],{type:n})};var x=function(e,t){return e.filter((function(e){return e!==t})).map((function(e){return e}))},w=function(e){return e.replace(/[\-_](\w)/g,(function(e){return e.charAt(1).toUpperCase()}))};b.createElement=function(e){var t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},b.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},b.getElement=function(e,t){var n;if("string"==typeof e?n=document.querySelector(e):null!=e.nodeType&&(n=e),null==n)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector or a plain HTML element."));return n},b.getElements=function(e,t){var n,r;if(e instanceof Array){r=[];try{var i,o=c(e,!0);try{for(o.s();!(i=o.n()).done;)n=i.value,r.push(this.getElement(n,t))}catch(e){o.e(e)}finally{o.f()}}catch(e){r=null}}else if("string"==typeof e){r=[];var a,u=c(document.querySelectorAll(e),!0);try{for(u.s();!(a=u.n()).done;)n=a.value,r.push(n)}catch(e){u.e(e)}finally{u.f()}}else null!=e.nodeType&&(r=[e]);if(null==r||!r.length)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector, a plain HTML element or a list of those."));return r},b.confirm=function(e,t,n){return window.confirm(e)?t():null!=n?n():void 0},b.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");var n,r=e.type,i=r.replace(/\/.*$/,""),o=c(t,!0);try{for(o.s();!(n=o.n()).done;){var a=n.value;if("."===(a=a.trim()).charAt(0)){if(-1!==e.name.toLowerCase().indexOf(a.toLowerCase(),e.name.length-a.length))return!0}else if(/\/\*$/.test(a)){if(i===a.replace(/\/.*$/,""))return!0}else if(r===a)return!0}}catch(e){o.e(e)}finally{o.f()}return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each((function(){return new b(this,e)}))}),b.ADDED="added",b.QUEUED="queued",b.ACCEPTED=b.QUEUED,b.UPLOADING="uploading",b.PROCESSING=b.UPLOADING,b.CANCELED="canceled",b.ERROR="error",b.SUCCESS="success";var E=function(e,t,n,r,i,o,a,u,s,l){var c=function(e){e.naturalWidth;var t=e.naturalHeight,n=document.createElement("canvas");n.width=1,n.height=t;var r=n.getContext("2d");r.drawImage(e,0,0);for(var i=r.getImageData(1,0,1,t).data,o=0,a=t,u=t;u>o;)0===i[4*(u-1)+3]?a=u:o=u,u=a+o>>1;var s=u/t;return 0===s?1:s}(t);return e.drawImage(t,n,r,i,o,a,u,s,l/c)},k=function(){function e(){p(this,e)}return d(e,null,[{key:"initClass",value:function(){this.KEY_STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}},{key:"encode64",value:function(e){for(var t="",n=void 0,r=void 0,i="",o=void 0,a=void 0,u=void 0,s="",l=0;o=(n=e[l++])>>2,a=(3&n)<<4|(r=e[l++])>>4,u=(15&r)<<2|(i=e[l++])>>6,s=63&i,isNaN(r)?u=s=64:isNaN(i)&&(s=64),t=t+this.KEY_STR.charAt(o)+this.KEY_STR.charAt(a)+this.KEY_STR.charAt(u)+this.KEY_STR.charAt(s),n=r=i="",o=a=u=s="",le.length)break}return n}},{key:"decode64",value:function(e){var t=void 0,n=void 0,r="",i=void 0,o=void 0,a="",u=0,s=[];for(/[^A-Za-z0-9\+\/\=]/g.exec(e)&&console.warn("There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\nExpect errors in decoding."),e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");t=this.KEY_STR.indexOf(e.charAt(u++))<<2|(i=this.KEY_STR.indexOf(e.charAt(u++)))>>4,n=(15&i)<<4|(o=this.KEY_STR.indexOf(e.charAt(u++)))>>2,r=(3&o)<<6|(a=this.KEY_STR.indexOf(e.charAt(u++))),s.push(t),64!==o&&s.push(n),64!==a&&s.push(r),t=n=r="",i=o=a="",u=0?!0:typeof process<"u"?process.platform==="win32":!1}}W.Environment=n})(ie||(ie={}));var ie;(function(W){class n{constructor(d,f,p){this.type=d,this.detail=f,this.timestamp=p}}W.LoaderEvent=n;class i{constructor(d){this._events=[new n(1,"",d)]}record(d,f){this._events.push(new n(d,f,W.Utilities.getHighPerformanceTimestamp()))}getEvents(){return this._events}}W.LoaderEventRecorder=i;class x{record(d,f){}getEvents(){return[]}}x.INSTANCE=new x,W.NullLoaderEventRecorder=x})(ie||(ie={}));var ie;(function(W){class n{static fileUriToFilePath(x,A){if(A=decodeURI(A).replace(/%23/g,"#"),x){if(/^file:\/\/\//.test(A))return A.substr(8);if(/^file:\/\//.test(A))return A.substr(5)}else if(/^file:\/\//.test(A))return A.substr(7);return A}static startsWith(x,A){return x.length>=A.length&&x.substr(0,A.length)===A}static endsWith(x,A){return x.length>=A.length&&x.substr(x.length-A.length)===A}static containsQueryString(x){return/^[^\#]*\?/gi.test(x)}static isAbsolutePath(x){return/^((http:\/\/)|(https:\/\/)|(file:\/\/)|(\/))/.test(x)}static forEachProperty(x,A){if(x){let d;for(d in x)x.hasOwnProperty(d)&&A(d,x[d])}}static isEmpty(x){let A=!0;return n.forEachProperty(x,()=>{A=!1}),A}static recursiveClone(x){if(!x||typeof x!="object"||x instanceof RegExp||!Array.isArray(x)&&Object.getPrototypeOf(x)!==Object.prototype)return x;let A=Array.isArray(x)?[]:{};return n.forEachProperty(x,(d,f)=>{f&&typeof f=="object"?A[d]=n.recursiveClone(f):A[d]=f}),A}static generateAnonymousModule(){return"===anonymous"+n.NEXT_ANONYMOUS_ID+++"==="}static isAnonymousModule(x){return n.startsWith(x,"===anonymous")}static getHighPerformanceTimestamp(){return this.PERFORMANCE_NOW_PROBED||(this.PERFORMANCE_NOW_PROBED=!0,this.HAS_PERFORMANCE_NOW=W.global.performance&&typeof W.global.performance.now=="function"),this.HAS_PERFORMANCE_NOW?W.global.performance.now():Date.now()}}n.NEXT_ANONYMOUS_ID=1,n.PERFORMANCE_NOW_PROBED=!1,n.HAS_PERFORMANCE_NOW=!1,W.Utilities=n})(ie||(ie={}));var ie;(function(W){function n(A){if(A instanceof Error)return A;const d=new Error(A.message||String(A)||"Unknown Error");return A.stack&&(d.stack=A.stack),d}W.ensureError=n;class i{static validateConfigurationOptions(d){function f(p){if(p.phase==="loading"){console.error('Loading "'+p.moduleId+'" failed'),console.error(p),console.error("Here are the modules that depend on it:"),console.error(p.neededBy);return}if(p.phase==="factory"){console.error('The factory function of "'+p.moduleId+'" has thrown an exception'),console.error(p),console.error("Here are the modules that depend on it:"),console.error(p.neededBy);return}}if(d=d||{},typeof d.baseUrl!="string"&&(d.baseUrl=""),typeof d.isBuild!="boolean"&&(d.isBuild=!1),typeof d.paths!="object"&&(d.paths={}),typeof d.config!="object"&&(d.config={}),typeof d.catchError>"u"&&(d.catchError=!1),typeof d.recordStats>"u"&&(d.recordStats=!1),typeof d.urlArgs!="string"&&(d.urlArgs=""),typeof d.onError!="function"&&(d.onError=f),Array.isArray(d.ignoreDuplicateModules)||(d.ignoreDuplicateModules=[]),d.baseUrl.length>0&&(W.Utilities.endsWith(d.baseUrl,"/")||(d.baseUrl+="/")),typeof d.cspNonce!="string"&&(d.cspNonce=""),typeof d.preferScriptTags>"u"&&(d.preferScriptTags=!1),d.nodeCachedData&&typeof d.nodeCachedData=="object"&&(typeof d.nodeCachedData.seed!="string"&&(d.nodeCachedData.seed="seed"),(typeof d.nodeCachedData.writeDelay!="number"||d.nodeCachedData.writeDelay<0)&&(d.nodeCachedData.writeDelay=1e3*7),!d.nodeCachedData.path||typeof d.nodeCachedData.path!="string")){const p=n(new Error("INVALID cached data configuration, 'path' MUST be set"));p.phase="configuration",d.onError(p),d.nodeCachedData=void 0}return d}static mergeConfigurationOptions(d=null,f=null){let p=W.Utilities.recursiveClone(f||{});return W.Utilities.forEachProperty(d,(c,a)=>{c==="ignoreDuplicateModules"&&typeof p.ignoreDuplicateModules<"u"?p.ignoreDuplicateModules=p.ignoreDuplicateModules.concat(a):c==="paths"&&typeof p.paths<"u"?W.Utilities.forEachProperty(a,(m,e)=>p.paths[m]=e):c==="config"&&typeof p.config<"u"?W.Utilities.forEachProperty(a,(m,e)=>p.config[m]=e):p[c]=W.Utilities.recursiveClone(a)}),i.validateConfigurationOptions(p)}}W.ConfigurationOptionsUtil=i;class x{constructor(d,f){if(this._env=d,this.options=i.mergeConfigurationOptions(f),this._createIgnoreDuplicateModulesMap(),this._createSortedPathsRules(),this.options.baseUrl===""&&this.options.nodeRequire&&this.options.nodeRequire.main&&this.options.nodeRequire.main.filename&&this._env.isNode){let p=this.options.nodeRequire.main.filename,c=Math.max(p.lastIndexOf("/"),p.lastIndexOf("\\"));this.options.baseUrl=p.substring(0,c+1)}}_createIgnoreDuplicateModulesMap(){this.ignoreDuplicateModulesMap={};for(let d=0;d{Array.isArray(f)?this.sortedPathsRules.push({from:d,to:f}):this.sortedPathsRules.push({from:d,to:[f]})}),this.sortedPathsRules.sort((d,f)=>f.from.length-d.from.length)}cloneAndMerge(d){return new x(this._env,i.mergeConfigurationOptions(d,this.options))}getOptionsLiteral(){return this.options}_applyPaths(d){let f;for(let p=0,c=this.sortedPathsRules.length;pthis.triggerCallback(m),s=>this.triggerErrorback(m,s))}triggerCallback(a){let m=this._callbackMap[a];delete this._callbackMap[a];for(let e=0;e{a.removeEventListener("load",r),a.removeEventListener("error",s)},r=o=>{h(),m()},s=o=>{h(),e(o)};a.addEventListener("load",r),a.addEventListener("error",s)}load(a,m,e,h){if(/^node\|/.test(m)){let r=a.getConfig().getOptionsLiteral(),s=f(a.getRecorder(),r.nodeRequire||W.global.nodeRequire),o=m.split("|"),u=null;try{u=s(o[1])}catch(S){h(S);return}a.enqueueDefineAnonymousModule([],()=>u),e()}else{let r=document.createElement("script");r.setAttribute("async","async"),r.setAttribute("type","text/javascript"),this.attachListeners(r,e,h);const{trustedTypesPolicy:s}=a.getConfig().getOptionsLiteral();s&&(m=s.createScriptURL(m)),r.setAttribute("src",m);const{cspNonce:o}=a.getConfig().getOptionsLiteral();o&&r.setAttribute("nonce",o),document.getElementsByTagName("head")[0].appendChild(r)}}}function x(c){const{trustedTypesPolicy:a}=c.getConfig().getOptionsLiteral();try{return(a?self.eval(a.createScript("","true")):new Function("true")).call(self),!0}catch{return!1}}class A{constructor(){this._cachedCanUseEval=null}_canUseEval(a){return this._cachedCanUseEval===null&&(this._cachedCanUseEval=x(a)),this._cachedCanUseEval}load(a,m,e,h){if(/^node\|/.test(m)){const r=a.getConfig().getOptionsLiteral(),s=f(a.getRecorder(),r.nodeRequire||W.global.nodeRequire),o=m.split("|");let u=null;try{u=s(o[1])}catch(S){h(S);return}a.enqueueDefineAnonymousModule([],function(){return u}),e()}else{const{trustedTypesPolicy:r}=a.getConfig().getOptionsLiteral();if(!(/^((http:)|(https:)|(file:))/.test(m)&&m.substring(0,self.origin.length)!==self.origin)&&this._canUseEval(a)){fetch(m).then(o=>{if(o.status!==200)throw new Error(o.statusText);return o.text()}).then(o=>{o=`${o} -//# sourceURL=${m}`,(r?self.eval(r.createScript("",o)):new Function(o)).call(self),e()}).then(void 0,h);return}try{r&&(m=r.createScriptURL(m)),importScripts(m),e()}catch(o){h(o)}}}}class d{constructor(a){this._env=a,this._didInitialize=!1,this._didPatchNodeRequire=!1}_init(a){this._didInitialize||(this._didInitialize=!0,this._fs=a("fs"),this._vm=a("vm"),this._path=a("path"),this._crypto=a("crypto"))}_initNodeRequire(a,m){const{nodeCachedData:e}=m.getConfig().getOptionsLiteral();if(!e||this._didPatchNodeRequire)return;this._didPatchNodeRequire=!0;const h=this,r=a("module");function s(o){const u=o.constructor;let S=function(N){try{return o.require(N)}finally{}};return S.resolve=function(N,P){return u._resolveFilename(N,o,!1,P)},S.resolve.paths=function(N){return u._resolveLookupPaths(N,o)},S.main=process.mainModule,S.extensions=u._extensions,S.cache=u._cache,S}r.prototype._compile=function(o,u){const S=r.wrap(o.replace(/^#!.*/,"")),L=m.getRecorder(),N=h._getCachedDataPath(e,u),P={filename:u};let E;try{const y=h._fs.readFileSync(N);E=y.slice(0,16),P.cachedData=y.slice(16),L.record(60,N)}catch{L.record(61,N)}const v=new h._vm.Script(S,P),l=v.runInThisContext(P),b=h._path.dirname(u),g=s(this),w=[this.exports,g,this,u,b,process,Me,Buffer],M=l.apply(this.exports,w);return h._handleCachedData(v,S,N,!P.cachedData,m),h._verifyCachedData(v,S,N,E,m),M}}load(a,m,e,h){const r=a.getConfig().getOptionsLiteral(),s=f(a.getRecorder(),r.nodeRequire||W.global.nodeRequire),o=r.nodeInstrumenter||function(S){return S};this._init(s),this._initNodeRequire(s,a);let u=a.getRecorder();if(/^node\|/.test(m)){let S=m.split("|"),L=null;try{L=s(S[1])}catch(N){h(N);return}a.enqueueDefineAnonymousModule([],()=>L),e()}else{m=W.Utilities.fileUriToFilePath(this._env.isWindows,m);const S=this._path.normalize(m),L=this._getElectronRendererScriptPathOrUri(S),N=!!r.nodeCachedData,P=N?this._getCachedDataPath(r.nodeCachedData,m):void 0;this._readSourceAndCachedData(S,P,u,(E,v,l,b)=>{if(E){h(E);return}let g;v.charCodeAt(0)===d._BOM?g=d._PREFIX+v.substring(1)+d._SUFFIX:g=d._PREFIX+v+d._SUFFIX,g=o(g,S);const w={filename:L,cachedData:l},M=this._createAndEvalScript(a,g,w,e,h);this._handleCachedData(M,g,P,N&&!l,a),this._verifyCachedData(M,g,P,b,a)})}}_createAndEvalScript(a,m,e,h,r){const s=a.getRecorder();s.record(31,e.filename);const o=new this._vm.Script(m,e),u=o.runInThisContext(e),S=a.getGlobalAMDDefineFunc();let L=!1;const N=function(){return L=!0,S.apply(null,arguments)};return N.amd=S.amd,u.call(W.global,a.getGlobalAMDRequireFunc(),N,e.filename,this._path.dirname(e.filename)),s.record(32,e.filename),L?h():r(new Error(`Didn't receive define call in ${e.filename}!`)),o}_getElectronRendererScriptPathOrUri(a){if(!this._env.isElectronRenderer)return a;let m=a.match(/^([a-z])\:(.*)/i);return m?`file:///${(m[1].toUpperCase()+":"+m[2]).replace(/\\/g,"/")}`:`file://${a}`}_getCachedDataPath(a,m){const e=this._crypto.createHash("md5").update(m,"utf8").update(a.seed,"utf8").update(process.arch,"").digest("hex"),h=this._path.basename(m).replace(/\.js$/,"");return this._path.join(a.path,`${h}-${e}.code`)}_handleCachedData(a,m,e,h,r){a.cachedDataRejected?this._fs.unlink(e,s=>{r.getRecorder().record(62,e),this._createAndWriteCachedData(a,m,e,r),s&&r.getConfig().onError(s)}):h&&this._createAndWriteCachedData(a,m,e,r)}_createAndWriteCachedData(a,m,e,h){let r=Math.ceil(h.getConfig().getOptionsLiteral().nodeCachedData.writeDelay*(1+Math.random())),s=-1,o=0,u;const S=()=>{setTimeout(()=>{u||(u=this._crypto.createHash("md5").update(m,"utf8").digest());const L=a.createCachedData();if(!(L.length===0||L.length===s||o>=5)){if(L.length{N&&h.getConfig().onError(N),h.getRecorder().record(63,e),S()})}},r*Math.pow(4,o++))};S()}_readSourceAndCachedData(a,m,e,h){if(!m)this._fs.readFile(a,{encoding:"utf8"},h);else{let r,s,o,u=2;const S=L=>{L?h(L):--u===0&&h(void 0,r,s,o)};this._fs.readFile(a,{encoding:"utf8"},(L,N)=>{r=N,S(L)}),this._fs.readFile(m,(L,N)=>{!L&&N&&N.length>0?(o=N.slice(0,16),s=N.slice(16),e.record(60,m)):e.record(61,m),S()})}}_verifyCachedData(a,m,e,h,r){h&&(a.cachedDataRejected||setTimeout(()=>{const s=this._crypto.createHash("md5").update(m,"utf8").digest();h.equals(s)||(r.getConfig().onError(new Error(`FAILED TO VERIFY CACHED DATA, deleting stale '${e}' now, but a RESTART IS REQUIRED`)),this._fs.unlink(e,o=>{o&&r.getConfig().onError(o)}))},Math.ceil(5e3*(1+Math.random()))))}}d._BOM=65279,d._PREFIX="(function (require, define, __filename, __dirname) { ",d._SUFFIX=` -});`;function f(c,a){if(a.__$__isRecorded)return a;const m=function(h){c.record(33,h);try{return a(h)}finally{c.record(34,h)}};return m.__$__isRecorded=!0,m}W.ensureRecordedNodeRequire=f;function p(c){return new n(c)}W.createScriptLoader=p})(ie||(ie={}));var ie;(function(W){class n{constructor(c){let a=c.lastIndexOf("/");a!==-1?this.fromModulePath=c.substr(0,a+1):this.fromModulePath=""}static _normalizeModuleId(c){let a=c,m;for(m=/\/\.\//;m.test(a);)a=a.replace(m,"/");for(a=a.replace(/^\.\//g,""),m=/\/(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//;m.test(a);)a=a.replace(m,"/");return a=a.replace(/^(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//,""),a}resolveModule(c){let a=c;return W.Utilities.isAbsolutePath(a)||(W.Utilities.startsWith(a,"./")||W.Utilities.startsWith(a,"../"))&&(a=n._normalizeModuleId(this.fromModulePath+a)),a}}n.ROOT=new n(""),W.ModuleIdResolver=n;class i{constructor(c,a,m,e,h,r){this.id=c,this.strId=a,this.dependencies=m,this._callback=e,this._errorback=h,this.moduleIdResolver=r,this.exports={},this.error=null,this.exportsPassedIn=!1,this.unresolvedDependenciesCount=this.dependencies.length,this._isComplete=!1}static _safeInvokeFunction(c,a){try{return{returnedValue:c.apply(W.global,a),producedError:null}}catch(m){return{returnedValue:null,producedError:m}}}static _invokeFactory(c,a,m,e){return c.shouldInvokeFactory(a)?c.shouldCatchError()?this._safeInvokeFunction(m,e):{returnedValue:m.apply(W.global,e),producedError:null}:{returnedValue:null,producedError:null}}complete(c,a,m,e){this._isComplete=!0;let h=null;if(this._callback)if(typeof this._callback=="function"){c.record(21,this.strId);let r=i._invokeFactory(a,this.strId,this._callback,m);h=r.producedError,c.record(22,this.strId),!h&&typeof r.returnedValue<"u"&&(!this.exportsPassedIn||W.Utilities.isEmpty(this.exports))&&(this.exports=r.returnedValue)}else this.exports=this._callback;if(h){let r=W.ensureError(h);r.phase="factory",r.moduleId=this.strId,r.neededBy=e(this.id),this.error=r,a.onError(r)}this.dependencies=null,this._callback=null,this._errorback=null,this.moduleIdResolver=null}onDependencyError(c){return this._isComplete=!0,this.error=c,this._errorback?(this._errorback(c),!0):!1}isComplete(){return this._isComplete}}W.Module=i;class x{constructor(){this._nextId=0,this._strModuleIdToIntModuleId=new Map,this._intModuleIdToStrModuleId=[],this.getModuleId("exports"),this.getModuleId("module"),this.getModuleId("require")}getMaxModuleId(){return this._nextId}getModuleId(c){let a=this._strModuleIdToIntModuleId.get(c);return typeof a>"u"&&(a=this._nextId++,this._strModuleIdToIntModuleId.set(c,a),this._intModuleIdToStrModuleId[a]=c),a}getStrModuleId(c){return this._intModuleIdToStrModuleId[c]}}class A{constructor(c){this.id=c}}A.EXPORTS=new A(0),A.MODULE=new A(1),A.REQUIRE=new A(2),W.RegularDependency=A;class d{constructor(c,a,m){this.id=c,this.pluginId=a,this.pluginParam=m}}W.PluginDependency=d;class f{constructor(c,a,m,e,h=0){this._env=c,this._scriptLoader=a,this._loaderAvailableTimestamp=h,this._defineFunc=m,this._requireFunc=e,this._moduleIdProvider=new x,this._config=new W.Configuration(this._env),this._hasDependencyCycle=!1,this._modules2=[],this._knownModules2=[],this._inverseDependencies2=[],this._inversePluginDependencies2=new Map,this._currentAnonymousDefineCall=null,this._recorder=null,this._buildInfoPath=[],this._buildInfoDefineStack=[],this._buildInfoDependencies=[],this._requireFunc.moduleManager=this}reset(){return new f(this._env,this._scriptLoader,this._defineFunc,this._requireFunc,this._loaderAvailableTimestamp)}getGlobalAMDDefineFunc(){return this._defineFunc}getGlobalAMDRequireFunc(){return this._requireFunc}static _findRelevantLocationInStack(c,a){let m=r=>r.replace(/\\/g,"/"),e=m(c),h=a.split(/\n/);for(let r=0;rthis._moduleIdProvider.getStrModuleId(u.id))),this._resolve(o)}_normalizeDependency(c,a){if(c==="exports")return A.EXPORTS;if(c==="module")return A.MODULE;if(c==="require")return A.REQUIRE;let m=c.indexOf("!");if(m>=0){let e=a.resolveModule(c.substr(0,m)),h=a.resolveModule(c.substr(m+1)),r=this._moduleIdProvider.getModuleId(e+"!"+h),s=this._moduleIdProvider.getModuleId(e);return new d(r,s,h)}return new A(this._moduleIdProvider.getModuleId(a.resolveModule(c)))}_normalizeDependencies(c,a){let m=[],e=0;for(let h=0,r=c.length;hthis._moduleIdProvider.getStrModuleId(r));const h=W.ensureError(a);return h.phase="loading",h.moduleId=m,h.neededBy=e,h}_onLoadError(c,a){const m=this._createLoadError(c,a);this._modules2[c]||(this._modules2[c]=new i(c,this._moduleIdProvider.getStrModuleId(c),[],()=>{},null,null));let e=[];for(let s=0,o=this._moduleIdProvider.getMaxModuleId();s0;){let s=r.shift(),o=this._modules2[s];o&&(h=o.onDependencyError(m)||h);let u=this._inverseDependencies2[s];if(u)for(let S=0,L=u.length;S0;){let s=h.shift().dependencies;if(s)for(let o=0,u=s.length;othis._relativeRequire(c,m,e,h);return a.toUrl=m=>this._config.requireToUrl(c.resolveModule(m)),a.getStats=()=>this.getLoaderEvents(),a.hasDependencyCycle=()=>this._hasDependencyCycle,a.config=(m,e=!1)=>{this.configure(m,e)},a.__$__nodeRequire=W.global.nodeRequire,a}_loadModule(c){if(this._modules2[c]||this._knownModules2[c])return;this._knownModules2[c]=!0;let a=this._moduleIdProvider.getStrModuleId(c),m=this._config.moduleIdToPaths(a),e=/^@[^\/]+\/[^\/]+$/;this._env.isNode&&(a.indexOf("/")===-1||e.test(a))&&m.push("node|"+a);let h=-1,r=s=>{if(h++,h>=m.length)this._onLoadError(c,s);else{let o=m[h],u=this.getRecorder();if(this._config.isBuild()&&o==="empty:"){this._buildInfoPath[c]=o,this.defineModule(this._moduleIdProvider.getStrModuleId(c),[],null,null,null),this._onLoad(c);return}u.record(10,o),this._scriptLoader.load(this,o,()=>{this._config.isBuild()&&(this._buildInfoPath[c]=o),u.record(11,o),this._onLoad(c)},S=>{u.record(12,o),r(S)})}};r(null)}_loadPluginDependency(c,a){if(this._modules2[a.id]||this._knownModules2[a.id])return;this._knownModules2[a.id]=!0;let m=e=>{this.defineModule(this._moduleIdProvider.getStrModuleId(a.id),[],e,null,null)};m.error=e=>{this._config.onError(this._createLoadError(a.id,e))},c.load(a.pluginParam,this._createRequire(n.ROOT),m,this._config.getOptionsLiteral())}_resolve(c){let a=c.dependencies;if(a)for(let m=0,e=a.length;mthis._moduleIdProvider.getStrModuleId(o)).join(` => -`)),c.unresolvedDependenciesCount--;continue}if(this._inverseDependencies2[h.id]=this._inverseDependencies2[h.id]||[],this._inverseDependencies2[h.id].push(c.id),h instanceof d){let s=this._modules2[h.pluginId];if(s&&s.isComplete()){this._loadPluginDependency(s.exports,h);continue}let o=this._inversePluginDependencies2.get(h.pluginId);o||(o=[],this._inversePluginDependencies2.set(h.pluginId,o)),o.push(h),this._loadModule(h.pluginId);continue}this._loadModule(h.id)}c.unresolvedDependenciesCount===0&&this._onModuleComplete(c)}_onModuleComplete(c){let a=this.getRecorder();if(c.isComplete())return;let m=c.dependencies,e=[];if(m)for(let o=0,u=m.length;othis._config.getConfigForModule(c.strId)};continue}if(S===A.REQUIRE){e[o]=this._createRequire(c.moduleIdResolver);continue}let L=this._modules2[S.id];if(L){e[o]=L.exports;continue}e[o]=null}const h=o=>(this._inverseDependencies2[o]||[]).map(u=>this._moduleIdProvider.getStrModuleId(u));c.complete(a,this._config,e,h);let r=this._inverseDependencies2[c.id];if(this._inverseDependencies2[c.id]=null,r)for(let o=0,u=r.length;o"u"&&f())})(ie||(ie={})),function(){const W=globalThis.MonacoEnvironment,n=W&&W.baseUrl?W.baseUrl:"../../../";function i(e,h){if(W?.createTrustedTypesPolicy)try{return W.createTrustedTypesPolicy(e,h)}catch(r){console.warn(r);return}try{return self.trustedTypes?.createPolicy(e,h)}catch(r){console.warn(r);return}}const x=i("amdLoader",{createScriptURL:e=>e,createScript:(e,...h)=>{const r=h.slice(0,-1).join(","),s=h.pop().toString();return`(function anonymous(${r}) { ${s} -})`}});function A(){try{return(x?globalThis.eval(x.createScript("","true")):new Function("true")).call(globalThis),!0}catch{return!1}}function d(){return new Promise((e,h)=>{if(typeof globalThis.define=="function"&&globalThis.define.amd)return e();const r=n+"vs/loader.js";if(!(/^((http:)|(https:)|(file:))/.test(r)&&r.substring(0,globalThis.origin.length)!==globalThis.origin)&&A()){fetch(r).then(o=>{if(o.status!==200)throw new Error(o.statusText);return o.text()}).then(o=>{o=`${o} -//# sourceURL=${r}`,(x?globalThis.eval(x.createScript("",o)):new Function(o)).call(globalThis),e()}).then(void 0,h);return}x?importScripts(x.createScriptURL(r)):importScripts(r),e()})}function f(){require.config({baseUrl:n,catchError:!0,trustedTypesPolicy:x,amdModulesPattern:/^vs\//})}function p(e){return d().then(()=>(f(),new Promise((h,r)=>{require([e],h,r)})))}function c(e){setTimeout(function(){const h=e.create((r,s)=>{globalThis.postMessage(r,s)});for(self.onmessage=r=>h.onmessage(r.data,r.ports);m.length>0;)self.onmessage(m.shift())},0)}typeof globalThis.define=="function"&&globalThis.define.amd&&f();let a=!0;const m=[];globalThis.onmessage=e=>{if(!a){m.push(e);return}a=!1,p(e.data).then(h=>{c(h)},h=>{console.error(h)})}}(),X(J[7],Z([0,1]),function(W,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.Permutation=n.CallbackIterable=n.ArrayQueue=n.booleanComparator=n.numberComparator=n.CompareResult=void 0,n.tail=i,n.tail2=x,n.equals=A,n.removeFastWithoutKeepingOrder=d,n.binarySearch=f,n.binarySearch2=p,n.quickSelect=c,n.groupBy=a,n.groupAdjacentBy=m,n.forEachAdjacent=e,n.forEachWithNeighbors=h,n.coalesce=r,n.coalesceInPlace=s,n.isFalsyOrEmpty=o,n.isNonEmptyArray=u,n.distinct=S,n.firstOrDefault=L,n.range=N,n.arrayInsert=P,n.pushToStart=E,n.pushToEnd=v,n.pushMany=l,n.asArray=b,n.insertInto=g,n.splice=w,n.compareBy=_,n.tieBreakComparators=C,n.reverseOrder=T;function i(F,q=0){return F[F.length-(1+q)]}function x(F){if(F.length===0)throw new Error("Invalid tail call");return[F.slice(0,F.length-1),F[F.length-1]]}function A(F,q,B=(G,$)=>G===$){if(F===q)return!0;if(!F||!q||F.length!==q.length)return!1;for(let G=0,$=F.length;G<$;G++)if(!B(F[G],q[G]))return!1;return!0}function d(F,q){const B=F.length-1;qB(F[G],q))}function p(F,q){let B=0,G=F-1;for(;B<=G;){const $=(B+G)/2|0,U=q($);if(U<0)B=$+1;else if(U>0)G=$-1;else return $}return-(B+1)}function c(F,q,B){if(F=F|0,F>=q.length)throw new TypeError("invalid index");const G=q[Math.floor(q.length*Math.random())],$=[],U=[],ee=[];for(const re of q){const ue=B(re,G);ue<0?$.push(re):ue>0?U.push(re):ee.push(re)}return F<$.length?c(F,$,B):F<$.length+ee.length?ee[0]:c(F-($.length+ee.length),U,B)}function a(F,q){const B=[];let G;for(const $ of F.slice(0).sort(q))!G||q(G[0],$)!==0?(G=[$],B.push(G)):G.push($);return B}function*m(F,q){let B,G;for(const $ of F)G!==void 0&&q(G,$)?B.push($):(B&&(yield B),B=[$]),G=$;B&&(yield B)}function e(F,q){for(let B=0;B<=F.length;B++)q(B===0?void 0:F[B-1],B===F.length?void 0:F[B])}function h(F,q){for(let B=0;B!!q)}function s(F){let q=0;for(let B=0;B0}function S(F,q=B=>B){const B=new Set;return F.filter(G=>{const $=q(G);return B.has($)?!1:(B.add($),!0)})}function L(F,q){return F.length>0?F[0]:q}function N(F,q){let B=typeof q=="number"?F:0;typeof q=="number"?B=F:(B=0,q=F);const G=[];if(B<=q)for(let $=B;$q;$--)G.push($);return G}function P(F,q,B){const G=F.slice(0,q),$=F.slice(q);return G.concat(B,$)}function E(F,q){const B=F.indexOf(q);B>-1&&(F.splice(B,1),F.unshift(q))}function v(F,q){const B=F.indexOf(q);B>-1&&(F.splice(B,1),F.push(q))}function l(F,q){for(const B of q)F.push(B)}function b(F){return Array.isArray(F)?F:[F]}function g(F,q,B){const G=M(F,q),$=F.length,U=B.length;F.length=$+U;for(let ee=$-1;ee>=G;ee--)F[ee+U]=F[ee];for(let ee=0;ee0}F.isGreaterThan=G;function $(U){return U===0}F.isNeitherLessOrGreaterThan=$,F.greaterThan=1,F.lessThan=-1,F.neitherLessOrGreaterThan=0})(y||(n.CompareResult=y={}));function _(F,q){return(B,G)=>q(F(B),F(G))}function C(...F){return(q,B)=>{for(const G of F){const $=G(q,B);if(!y.isNeitherLessOrGreaterThan($))return $}return y.neitherLessOrGreaterThan}}const R=(F,q)=>F-q;n.numberComparator=R;const D=(F,q)=>(0,n.numberComparator)(F?1:0,q?1:0);n.booleanComparator=D;function T(F){return(q,B)=>-F(q,B)}class O{constructor(q){this.items=q,this.firstIdx=0,this.lastIdx=this.items.length-1}get length(){return this.lastIdx-this.firstIdx+1}takeWhile(q){let B=this.firstIdx;for(;B=0&&q(this.items[B]);)B--;const G=B===this.lastIdx?null:this.items.slice(B+1,this.lastIdx+1);return this.lastIdx=B,G}peek(){if(this.length!==0)return this.items[this.firstIdx]}dequeue(){const q=this.items[this.firstIdx];return this.firstIdx++,q}takeCount(q){const B=this.items.slice(this.firstIdx,this.firstIdx+q);return this.firstIdx+=q,B}}n.ArrayQueue=O;class z{static{this.empty=new z(q=>{})}constructor(q){this.iterate=q}toArray(){const q=[];return this.iterate(B=>(q.push(B),!0)),q}filter(q){return new z(B=>this.iterate(G=>q(G)?B(G):!0))}map(q){return new z(B=>this.iterate(G=>B(q(G))))}findLast(q){let B;return this.iterate(G=>(q(G)&&(B=G),!0)),B}findLastMaxBy(q){let B,G=!0;return this.iterate($=>((G||y.isGreaterThan(q($,B)))&&(G=!1,B=$),!0)),B}}n.CallbackIterable=z;class j{constructor(q){this._indexMap=q}static createSortPermutation(q,B){const G=Array.from(q.keys()).sort(($,U)=>B(q[$],q[U]));return new j(G)}apply(q){return q.map((B,G)=>q[this._indexMap[G]])}inverse(){const q=this._indexMap.slice();for(let B=0;B=0;S--){const L=s[S];if(o(L))return S}return-1}function A(s,o){const u=d(s,o);return u===-1?void 0:s[u]}function d(s,o,u=0,S=s.length){let L=u,N=S;for(;L0&&(u=L)}return u}function m(s,o){if(s.length===0)return;let u=s[0];for(let S=1;S=0&&(u=L)}return u}function e(s,o){return a(s,(u,S)=>-o(u,S))}function h(s,o){if(s.length===0)return-1;let u=0;for(let S=1;S0&&(u=S)}return u}function r(s,o){for(const u of s){const S=o(u);if(S!==void 0)return S}}}),X(J[39],Z([0,1]),function(W,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.CachedFunction=n.LRUCachedFunction=void 0,n.identity=i;function i(d){return d}class x{constructor(f,p){this.lastCache=void 0,this.lastArgKey=void 0,typeof f=="function"?(this._fn=f,this._computeKey=i):(this._fn=p,this._computeKey=f.getCacheKey)}get(f){const p=this._computeKey(f);return this.lastArgKey!==p&&(this.lastArgKey=p,this.lastCache=this._fn(f)),this.lastCache}}n.LRUCachedFunction=x;class A{get cachedValues(){return this._map}constructor(f,p){this._map=new Map,this._map2=new Map,typeof f=="function"?(this._fn=f,this._computeKey=i):(this._fn=p,this._computeKey=f.getCacheKey)}get(f){const p=this._computeKey(f);if(this._map2.has(p))return this._map2.get(p);const c=this._fn(f);return this._map.set(f,c),this._map2.set(p,c),c}}n.CachedFunction=A}),X(J[40],Z([0,1]),function(W,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.Color=n.HSVA=n.HSLA=n.RGBA=void 0;function i(p,c){const a=Math.pow(10,c);return Math.round(p*a)/a}class x{constructor(c,a,m,e=1){this._rgbaBrand=void 0,this.r=Math.min(255,Math.max(0,c))|0,this.g=Math.min(255,Math.max(0,a))|0,this.b=Math.min(255,Math.max(0,m))|0,this.a=i(Math.max(Math.min(1,e),0),3)}static equals(c,a){return c.r===a.r&&c.g===a.g&&c.b===a.b&&c.a===a.a}}n.RGBA=x;class A{constructor(c,a,m,e){this._hslaBrand=void 0,this.h=Math.max(Math.min(360,c),0)|0,this.s=i(Math.max(Math.min(1,a),0),3),this.l=i(Math.max(Math.min(1,m),0),3),this.a=i(Math.max(Math.min(1,e),0),3)}static equals(c,a){return c.h===a.h&&c.s===a.s&&c.l===a.l&&c.a===a.a}static fromRGBA(c){const a=c.r/255,m=c.g/255,e=c.b/255,h=c.a,r=Math.max(a,m,e),s=Math.min(a,m,e);let o=0,u=0;const S=(s+r)/2,L=r-s;if(L>0){switch(u=Math.min(S<=.5?L/(2*S):L/(2-2*S),1),r){case a:o=(m-e)/L+(m1&&(m-=1),m<1/6?c+(a-c)*6*m:m<1/2?a:m<2/3?c+(a-c)*(2/3-m)*6:c}static toRGBA(c){const a=c.h/360,{s:m,l:e,a:h}=c;let r,s,o;if(m===0)r=s=o=e;else{const u=e<.5?e*(1+m):e+m-e*m,S=2*e-u;r=A._hue2rgb(S,u,a+1/3),s=A._hue2rgb(S,u,a),o=A._hue2rgb(S,u,a-1/3)}return new x(Math.round(r*255),Math.round(s*255),Math.round(o*255),h)}}n.HSLA=A;class d{constructor(c,a,m,e){this._hsvaBrand=void 0,this.h=Math.max(Math.min(360,c),0)|0,this.s=i(Math.max(Math.min(1,a),0),3),this.v=i(Math.max(Math.min(1,m),0),3),this.a=i(Math.max(Math.min(1,e),0),3)}static equals(c,a){return c.h===a.h&&c.s===a.s&&c.v===a.v&&c.a===a.a}static fromRGBA(c){const a=c.r/255,m=c.g/255,e=c.b/255,h=Math.max(a,m,e),r=Math.min(a,m,e),s=h-r,o=h===0?0:s/h;let u;return s===0?u=0:h===a?u=((m-e)/s%6+6)%6:h===m?u=(e-a)/s+2:u=(a-m)/s+4,new d(Math.round(u*60),o,h,c.a)}static toRGBA(c){const{h:a,s:m,v:e,a:h}=c,r=e*m,s=r*(1-Math.abs(a/60%2-1)),o=e-r;let[u,S,L]=[0,0,0];return a<60?(u=r,S=s):a<120?(u=s,S=r):a<180?(S=r,L=s):a<240?(S=s,L=r):a<300?(u=s,L=r):a<=360&&(u=r,L=s),u=Math.round((u+o)*255),S=Math.round((S+o)*255),L=Math.round((L+o)*255),new x(u,S,L,h)}}n.HSVA=d;class f{static fromHex(c){return f.Format.CSS.parseHex(c)||f.red}static equals(c,a){return!c&&!a?!0:!c||!a?!1:c.equals(a)}get hsla(){return this._hsla?this._hsla:A.fromRGBA(this.rgba)}get hsva(){return this._hsva?this._hsva:d.fromRGBA(this.rgba)}constructor(c){if(c)if(c instanceof x)this.rgba=c;else if(c instanceof A)this._hsla=c,this.rgba=A.toRGBA(c);else if(c instanceof d)this._hsva=c,this.rgba=d.toRGBA(c);else throw new Error("Invalid color ctor argument");else throw new Error("Color needs a value")}equals(c){return!!c&&x.equals(this.rgba,c.rgba)&&A.equals(this.hsla,c.hsla)&&d.equals(this.hsva,c.hsva)}getRelativeLuminance(){const c=f._relativeLuminanceForComponent(this.rgba.r),a=f._relativeLuminanceForComponent(this.rgba.g),m=f._relativeLuminanceForComponent(this.rgba.b),e=.2126*c+.7152*a+.0722*m;return i(e,4)}static _relativeLuminanceForComponent(c){const a=c/255;return a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4)}isLighter(){return(this.rgba.r*299+this.rgba.g*587+this.rgba.b*114)/1e3>=128}isLighterThan(c){const a=this.getRelativeLuminance(),m=c.getRelativeLuminance();return a>m}isDarkerThan(c){const a=this.getRelativeLuminance(),m=c.getRelativeLuminance();return a{throw u.stack?r.isErrorNoTelemetry(u)?new r(u.message+` - -`+u.stack):new Error(u.message+` - -`+u.stack):u},0)}}emit(u){this.listeners.forEach(S=>{S(u)})}onUnexpectedError(u){this.unexpectedErrorHandler(u),this.emit(u)}onUnexpectedExternalError(u){this.unexpectedErrorHandler(u)}}n.ErrorHandler=i,n.errorHandler=new i;function x(o){p(o)||n.errorHandler.onUnexpectedError(o)}function A(o){p(o)||n.errorHandler.onUnexpectedExternalError(o)}function d(o){if(o instanceof Error){const{name:u,message:S}=o,L=o.stacktrace||o.stack;return{$isError:!0,name:u,message:S,stack:L,noTelemetry:r.isErrorNoTelemetry(o)}}return o}const f="Canceled";function p(o){return o instanceof c?!0:o instanceof Error&&o.name===f&&o.message===f}class c extends Error{constructor(){super(f),this.name=this.message}}n.CancellationError=c;function a(){const o=new Error(f);return o.name=o.message,o}function m(o){return o?new Error(`Illegal argument: ${o}`):new Error("Illegal argument")}function e(o){return o?new Error(`Illegal state: ${o}`):new Error("Illegal state")}class h extends Error{constructor(u){super("NotSupported"),u&&(this.message=u)}}n.NotSupportedError=h;class r extends Error{constructor(u){super(u),this.name="CodeExpectedError"}static fromError(u){if(u instanceof r)return u;const S=new r;return S.message=u.message,S.stack=u.stack,S}static isErrorNoTelemetry(u){return u.name==="CodeExpectedError"}}n.ErrorNoTelemetry=r;class s extends Error{constructor(u){super(u||"An unexpected bug occurred."),Object.setPrototypeOf(this,s.prototype)}}n.BugIndicatingError=s}),X(J[12],Z([0,1,3]),function(W,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.ok=x,n.assertNever=A,n.softAssert=d,n.assertFn=f,n.checkAdjacentItems=p;function x(c,a){if(!c)throw new Error(a?`Assertion failed (${a})`:"Assertion Failed")}function A(c,a="Unreachable"){throw new Error(a)}function d(c){c||(0,i.onUnexpectedError)(new i.BugIndicatingError("Soft Assertion Failed"))}function f(c){if(!c()){debugger;c(),(0,i.onUnexpectedError)(new i.BugIndicatingError("Assertion Failed"))}}function p(c,a){let m=0;for(;m=0;b--)yield l[b]}x.reverse=m;function e(l){return!l||l[Symbol.iterator]().next().done===!0}x.isEmpty=e;function h(l){return l[Symbol.iterator]().next().value}x.first=h;function r(l,b){let g=0;for(const w of l)if(b(w,g++))return!0;return!1}x.some=r;function s(l,b){for(const g of l)if(b(g))return g}x.find=s;function*o(l,b){for(const g of l)b(g)&&(yield g)}x.filter=o;function*u(l,b){let g=0;for(const w of l)yield b(w,g++)}x.map=u;function*S(l,b){let g=0;for(const w of l)yield*b(w,g++)}x.flatMap=S;function*L(...l){for(const b of l)yield*b}x.concat=L;function N(l,b,g){let w=g;for(const M of l)w=b(w,M);return w}x.reduce=N;function*P(l,b,g=l.length){for(b<0&&(b+=l.length),g<0?g+=l.length:g>l.length&&(g=l.length);b=98&&L<=113)return null;switch(L){case 16:return"Up";case 18:return"Down";case 15:return"Left";case 17:return"Right"}return x.keyCodeToStr(L)}e.toElectronAccelerator=S})(a||(n.KeyCodeUtils=a={}));function m(e,h){const r=(h&65535)<<16>>>0;return(e|r)>>>0}}),X(J[43],Z([0,1]),function(W,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.Lazy=void 0;class i{constructor(A){this.executor=A,this._didRun=!1}get value(){if(!this._didRun)try{this._value=this.executor()}catch(A){this._error=A}finally{this._didRun=!0}if(this._error)throw this._error;return this._value}get rawValue(){return this._value}}n.Lazy=i}),X(J[8],Z([0,1,18,19]),function(W,n,i,x){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.DisposableMap=n.ImmortalReference=n.RefCountedDisposable=n.MutableDisposable=n.Disposable=n.DisposableStore=void 0,n.setDisposableTracker=f,n.trackDisposable=p,n.markAsDisposed=c,n.markAsSingleton=e,n.isDisposable=h,n.dispose=r,n.combinedDisposable=s,n.toDisposable=o;const A=!1;let d=null;function f(v){d=v}if(A){const v="__is_disposable_tracked__";f(new class{trackDisposable(l){const b=new Error("Potentially leaked disposable").stack;setTimeout(()=>{l[v]||console.log(b)},3e3)}setParent(l,b){if(l&&l!==S.None)try{l[v]=!0}catch{}}markAsDisposed(l){if(l&&l!==S.None)try{l[v]=!0}catch{}}markAsSingleton(l){}})}function p(v){return d?.trackDisposable(v),v}function c(v){d?.markAsDisposed(v)}function a(v,l){d?.setParent(v,l)}function m(v,l){if(d)for(const b of v)d.setParent(b,l)}function e(v){return d?.markAsSingleton(v),v}function h(v){return typeof v=="object"&&v!==null&&typeof v.dispose=="function"&&v.dispose.length===0}function r(v){if(x.Iterable.is(v)){const l=[];for(const b of v)if(b)try{b.dispose()}catch(g){l.push(g)}if(l.length===1)throw l[0];if(l.length>1)throw new AggregateError(l,"Encountered errors while disposing of store");return Array.isArray(v)?[]:v}else if(v)return v.dispose(),v}function s(...v){const l=o(()=>r(v));return m(v,l),l}function o(v){const l=p({dispose:(0,i.createSingleCallFunction)(()=>{c(l),v()})});return l}class u{static{this.DISABLE_DISPOSED_WARNING=!1}constructor(){this._toDispose=new Set,this._isDisposed=!1,p(this)}dispose(){this._isDisposed||(c(this),this._isDisposed=!0,this.clear())}get isDisposed(){return this._isDisposed}clear(){if(this._toDispose.size!==0)try{r(this._toDispose)}finally{this._toDispose.clear()}}add(l){if(!l)return l;if(l===this)throw new Error("Cannot register a disposable on itself!");return a(l,this),this._isDisposed?u.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(l),l}deleteAndLeak(l){l&&this._toDispose.has(l)&&(this._toDispose.delete(l),a(l,null))}}n.DisposableStore=u;class S{static{this.None=Object.freeze({dispose(){}})}constructor(){this._store=new u,p(this),a(this._store,this)}dispose(){c(this),this._store.dispose()}_register(l){if(l===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(l)}}n.Disposable=S;class L{constructor(){this._isDisposed=!1,p(this)}get value(){return this._isDisposed?void 0:this._value}set value(l){this._isDisposed||l===this._value||(this._value?.dispose(),l&&a(l,this),this._value=l)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,c(this),this._value?.dispose(),this._value=void 0}}n.MutableDisposable=L;class N{constructor(l){this._disposable=l,this._counter=1}acquire(){return this._counter++,this}release(){return--this._counter===0&&this._disposable.dispose(),this}}n.RefCountedDisposable=N;class P{constructor(l){this.object=l}dispose(){}}n.ImmortalReference=P;class E{constructor(){this._store=new Map,this._isDisposed=!1,p(this)}dispose(){c(this),this._isDisposed=!0,this.clearAndDisposeAll()}clearAndDisposeAll(){if(this._store.size)try{r(this._store.values())}finally{this._store.clear()}}get(l){return this._store.get(l)}set(l,b,g=!1){this._isDisposed&&console.warn(new Error("Trying to add a disposable to a DisposableMap that has already been disposed of. The added object will be leaked!").stack),g||this._store.get(l)?.dispose(),this._store.set(l,b)}deleteAndDispose(l){this._store.get(l)?.dispose(),this._store.delete(l)}[Symbol.iterator](){return this._store[Symbol.iterator]()}}n.DisposableMap=E}),X(J[20],Z([0,1]),function(W,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.LinkedList=void 0;class i{static{this.Undefined=new i(void 0)}constructor(d){this.element=d,this.next=i.Undefined,this.prev=i.Undefined}}class x{constructor(){this._first=i.Undefined,this._last=i.Undefined,this._size=0}get size(){return this._size}isEmpty(){return this._first===i.Undefined}clear(){let d=this._first;for(;d!==i.Undefined;){const f=d.next;d.prev=i.Undefined,d.next=i.Undefined,d=f}this._first=i.Undefined,this._last=i.Undefined,this._size=0}unshift(d){return this._insert(d,!1)}push(d){return this._insert(d,!0)}_insert(d,f){const p=new i(d);if(this._first===i.Undefined)this._first=p,this._last=p;else if(f){const a=this._last;this._last=p,p.prev=a,a.next=p}else{const a=this._first;this._first=p,p.next=a,a.prev=p}this._size+=1;let c=!1;return()=>{c||(c=!0,this._remove(p))}}shift(){if(this._first!==i.Undefined){const d=this._first.element;return this._remove(this._first),d}}pop(){if(this._last!==i.Undefined){const d=this._last.element;return this._remove(this._last),d}}_remove(d){if(d.prev!==i.Undefined&&d.next!==i.Undefined){const f=d.prev;f.next=d.next,d.next.prev=f}else d.prev===i.Undefined&&d.next===i.Undefined?(this._first=i.Undefined,this._last=i.Undefined):d.next===i.Undefined?(this._last=this._last.prev,this._last.next=i.Undefined):d.prev===i.Undefined&&(this._first=this._first.next,this._first.prev=i.Undefined);this._size-=1}*[Symbol.iterator](){let d=this._first;for(;d!==i.Undefined;)yield d.element,d=d.next}}n.LinkedList=x}),X(J[21],Z([0,1]),function(W,n){"use strict";var i,x;Object.defineProperty(n,"__esModule",{value:!0}),n.SetMap=n.BidirectionalMap=n.LRUCache=n.LinkedMap=n.ResourceMap=void 0;class A{constructor(r,s){this.uri=r,this.value=s}}function d(h){return Array.isArray(h)}class f{static{this.defaultToKey=r=>r.toString()}constructor(r,s){if(this[i]="ResourceMap",r instanceof f)this.map=new Map(r.map),this.toKey=s??f.defaultToKey;else if(d(r)){this.map=new Map,this.toKey=s??f.defaultToKey;for(const[o,u]of r)this.set(o,u)}else this.map=new Map,this.toKey=r??f.defaultToKey}set(r,s){return this.map.set(this.toKey(r),new A(r,s)),this}get(r){return this.map.get(this.toKey(r))?.value}has(r){return this.map.has(this.toKey(r))}get size(){return this.map.size}clear(){this.map.clear()}delete(r){return this.map.delete(this.toKey(r))}forEach(r,s){typeof s<"u"&&(r=r.bind(s));for(const[o,u]of this.map)r(u.value,u.uri,this)}*values(){for(const r of this.map.values())yield r.value}*keys(){for(const r of this.map.values())yield r.uri}*entries(){for(const r of this.map.values())yield[r.uri,r.value]}*[(i=Symbol.toStringTag,Symbol.iterator)](){for(const[,r]of this.map)yield[r.uri,r.value]}}n.ResourceMap=f;class p{constructor(){this[x]="LinkedMap",this._map=new Map,this._head=void 0,this._tail=void 0,this._size=0,this._state=0}clear(){this._map.clear(),this._head=void 0,this._tail=void 0,this._size=0,this._state++}isEmpty(){return!this._head&&!this._tail}get size(){return this._size}get first(){return this._head?.value}get last(){return this._tail?.value}has(r){return this._map.has(r)}get(r,s=0){const o=this._map.get(r);if(o)return s!==0&&this.touch(o,s),o.value}set(r,s,o=0){let u=this._map.get(r);if(u)u.value=s,o!==0&&this.touch(u,o);else{switch(u={key:r,value:s,next:void 0,previous:void 0},o){case 0:this.addItemLast(u);break;case 1:this.addItemFirst(u);break;case 2:this.addItemLast(u);break;default:this.addItemLast(u);break}this._map.set(r,u),this._size++}return this}delete(r){return!!this.remove(r)}remove(r){const s=this._map.get(r);if(s)return this._map.delete(r),this.removeItem(s),this._size--,s.value}shift(){if(!this._head&&!this._tail)return;if(!this._head||!this._tail)throw new Error("Invalid list");const r=this._head;return this._map.delete(r.key),this.removeItem(r),this._size--,r.value}forEach(r,s){const o=this._state;let u=this._head;for(;u;){if(s?r.bind(s)(u.value,u.key,this):r(u.value,u.key,this),this._state!==o)throw new Error("LinkedMap got modified during iteration.");u=u.next}}keys(){const r=this,s=this._state;let o=this._head;const u={[Symbol.iterator](){return u},next(){if(r._state!==s)throw new Error("LinkedMap got modified during iteration.");if(o){const S={value:o.key,done:!1};return o=o.next,S}else return{value:void 0,done:!0}}};return u}values(){const r=this,s=this._state;let o=this._head;const u={[Symbol.iterator](){return u},next(){if(r._state!==s)throw new Error("LinkedMap got modified during iteration.");if(o){const S={value:o.value,done:!1};return o=o.next,S}else return{value:void 0,done:!0}}};return u}entries(){const r=this,s=this._state;let o=this._head;const u={[Symbol.iterator](){return u},next(){if(r._state!==s)throw new Error("LinkedMap got modified during iteration.");if(o){const S={value:[o.key,o.value],done:!1};return o=o.next,S}else return{value:void 0,done:!0}}};return u}[(x=Symbol.toStringTag,Symbol.iterator)](){return this.entries()}trimOld(r){if(r>=this.size)return;if(r===0){this.clear();return}let s=this._head,o=this.size;for(;s&&o>r;)this._map.delete(s.key),s=s.next,o--;this._head=s,this._size=o,s&&(s.previous=void 0),this._state++}trimNew(r){if(r>=this.size)return;if(r===0){this.clear();return}let s=this._tail,o=this.size;for(;s&&o>r;)this._map.delete(s.key),s=s.previous,o--;this._tail=s,this._size=o,s&&(s.next=void 0),this._state++}addItemFirst(r){if(!this._head&&!this._tail)this._tail=r;else if(this._head)r.next=this._head,this._head.previous=r;else throw new Error("Invalid list");this._head=r,this._state++}addItemLast(r){if(!this._head&&!this._tail)this._head=r;else if(this._tail)r.previous=this._tail,this._tail.next=r;else throw new Error("Invalid list");this._tail=r,this._state++}removeItem(r){if(r===this._head&&r===this._tail)this._head=void 0,this._tail=void 0;else if(r===this._head){if(!r.next)throw new Error("Invalid list");r.next.previous=void 0,this._head=r.next}else if(r===this._tail){if(!r.previous)throw new Error("Invalid list");r.previous.next=void 0,this._tail=r.previous}else{const s=r.next,o=r.previous;if(!s||!o)throw new Error("Invalid list");s.previous=o,o.next=s}r.next=void 0,r.previous=void 0,this._state++}touch(r,s){if(!this._head||!this._tail)throw new Error("Invalid list");if(!(s!==1&&s!==2)){if(s===1){if(r===this._head)return;const o=r.next,u=r.previous;r===this._tail?(u.next=void 0,this._tail=u):(o.previous=u,u.next=o),r.previous=void 0,r.next=this._head,this._head.previous=r,this._head=r,this._state++}else if(s===2){if(r===this._tail)return;const o=r.next,u=r.previous;r===this._head?(o.previous=void 0,this._head=o):(o.previous=u,u.next=o),r.next=void 0,r.previous=this._tail,this._tail.next=r,this._tail=r,this._state++}}}toJSON(){const r=[];return this.forEach((s,o)=>{r.push([o,s])}),r}fromJSON(r){this.clear();for(const[s,o]of r)this.set(s,o)}}n.LinkedMap=p;class c extends p{constructor(r,s=1){super(),this._limit=r,this._ratio=Math.min(Math.max(0,s),1)}get limit(){return this._limit}set limit(r){this._limit=r,this.checkTrim()}get(r,s=2){return super.get(r,s)}peek(r){return super.get(r,0)}set(r,s){return super.set(r,s,2),this}checkTrim(){this.size>this._limit&&this.trim(Math.round(this._limit*this._ratio))}}class a extends c{constructor(r,s=1){super(r,s)}trim(r){this.trimOld(r)}set(r,s){return super.set(r,s),this.checkTrim(),this}}n.LRUCache=a;class m{constructor(r){if(this._m1=new Map,this._m2=new Map,r)for(const[s,o]of r)this.set(s,o)}clear(){this._m1.clear(),this._m2.clear()}set(r,s){this._m1.set(r,s),this._m2.set(s,r)}get(r){return this._m1.get(r)}getKey(r){return this._m2.get(r)}delete(r){const s=this._m1.get(r);return s===void 0?!1:(this._m1.delete(r),this._m2.delete(s),!0)}keys(){return this._m1.keys()}values(){return this._m1.values()}}n.BidirectionalMap=m;class e{constructor(){this.map=new Map}add(r,s){let o=this.map.get(r);o||(o=new Set,this.map.set(r,o)),o.add(s)}delete(r,s){const o=this.map.get(r);o&&(o.delete(s),o.size===0&&this.map.delete(r))}forEach(r,s){const o=this.map.get(r);o&&o.forEach(s)}get(r){const s=this.map.get(r);return s||new Set}}n.SetMap=e}),X(J[22],Z([0,1]),function(W,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.StopWatch=void 0;const i=globalThis.performance&&typeof globalThis.performance.now=="function";class x{static create(d){return new x(d)}constructor(d){this._now=i&&d===!1?Date.now:globalThis.performance.now.bind(globalThis.performance),this._startTime=this._now(),this._stopTime=-1}stop(){this._stopTime=this._now()}reset(){this._startTime=this._now(),this._stopTime=-1}elapsed(){return this._stopTime!==-1?this._stopTime-this._startTime:this._now()-this._startTime}}n.StopWatch=x}),X(J[9],Z([0,1,3,18,8,20,22]),function(W,n,i,x,A,d,f){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.Relay=n.EventBufferer=n.EventMultiplexer=n.MicrotaskEmitter=n.DebounceEmitter=n.PauseableEmitter=n.createEventDeliveryQueue=n.Emitter=n.ListenerRefusalError=n.ListenerLeakError=n.EventProfiling=n.Event=void 0;const p=!1,c=!1,a=!1;var m;(function(C){C.None=()=>A.Disposable.None;function R(K){if(a){const{onDidAddListener:Q}=K,k=s.create();let I=0;K.onDidAddListener=()=>{++I===2&&(console.warn("snapshotted emitter LIKELY used public and SHOULD HAVE BEEN created with DisposableStore. snapshotted here"),k.print()),Q?.()}}}function D(K,Q){return ee(K,()=>{},0,void 0,!0,void 0,Q)}C.defer=D;function T(K){return(Q,k=null,I)=>{let V=!1,H;return H=K(Y=>{if(!V)return H?H.dispose():V=!0,Q.call(k,Y)},null,I),V&&H.dispose(),H}}C.once=T;function O(K,Q){return C.once(C.filter(K,Q))}C.onceIf=O;function z(K,Q,k){return $((I,V=null,H)=>K(Y=>I.call(V,Q(Y)),null,H),k)}C.map=z;function j(K,Q,k){return $((I,V=null,H)=>K(Y=>{Q(Y),I.call(V,Y)},null,H),k)}C.forEach=j;function F(K,Q,k){return $((I,V=null,H)=>K(Y=>Q(Y)&&I.call(V,Y),null,H),k)}C.filter=F;function q(K){return K}C.signal=q;function B(...K){return(Q,k=null,I)=>{const V=(0,A.combinedDisposable)(...K.map(H=>H(Y=>Q.call(k,Y))));return U(V,I)}}C.any=B;function G(K,Q,k,I){let V=k;return z(K,H=>(V=Q(V,H),V),I)}C.reduce=G;function $(K,Q){let k;const I={onWillAddFirstListener(){k=K(V.fire,V)},onDidRemoveLastListener(){k?.dispose()}};Q||R(I);const V=new E(I);return Q?.add(V),V.event}function U(K,Q){return Q instanceof Array?Q.push(K):Q&&Q.add(K),K}function ee(K,Q,k=100,I=!1,V=!1,H,Y){let te,ne,ae,le=0,oe;const se={leakWarningThreshold:H,onWillAddFirstListener(){te=K(he=>{le++,ne=Q(ne,he),I&&!ae&&(ce.fire(ne),ne=void 0),oe=()=>{const be=ne;ne=void 0,ae=void 0,(!I||le>1)&&ce.fire(be),le=0},typeof k=="number"?(clearTimeout(ae),ae=setTimeout(oe,k)):ae===void 0&&(ae=0,queueMicrotask(oe))})},onWillRemoveListener(){V&&le>0&&oe?.()},onDidRemoveLastListener(){oe=void 0,te.dispose()}};Y||R(se);const ce=new E(se);return Y?.add(ce),ce.event}C.debounce=ee;function re(K,Q=0,k){return C.debounce(K,(I,V)=>I?(I.push(V),I):[V],Q,void 0,!0,void 0,k)}C.accumulate=re;function ue(K,Q=(I,V)=>I===V,k){let I=!0,V;return F(K,H=>{const Y=I||!Q(H,V);return I=!1,V=H,Y},k)}C.latch=ue;function de(K,Q,k){return[C.filter(K,Q,k),C.filter(K,I=>!Q(I),k)]}C.split=de;function ge(K,Q=!1,k=[],I){let V=k.slice(),H=K(ne=>{V?V.push(ne):te.fire(ne)});I&&I.add(H);const Y=()=>{V?.forEach(ne=>te.fire(ne)),V=null},te=new E({onWillAddFirstListener(){H||(H=K(ne=>te.fire(ne)),I&&I.add(H))},onDidAddFirstListener(){V&&(Q?setTimeout(Y):Y())},onDidRemoveLastListener(){H&&H.dispose(),H=null}});return I&&I.add(te),te.event}C.buffer=ge;function t(K,Q){return(I,V,H)=>{const Y=Q(new pe);return K(function(te){const ne=Y.evaluate(te);ne!==me&&I.call(V,ne)},void 0,H)}}C.chain=t;const me=Symbol("HaltChainable");class pe{constructor(){this.steps=[]}map(Q){return this.steps.push(Q),this}forEach(Q){return this.steps.push(k=>(Q(k),k)),this}filter(Q){return this.steps.push(k=>Q(k)?k:me),this}reduce(Q,k){let I=k;return this.steps.push(V=>(I=Q(I,V),I)),this}latch(Q=(k,I)=>k===I){let k=!0,I;return this.steps.push(V=>{const H=k||!Q(V,I);return k=!1,I=V,H?V:me}),this}evaluate(Q){for(const k of this.steps)if(Q=k(Q),Q===me)break;return Q}}function Le(K,Q,k=I=>I){const I=(...te)=>Y.fire(k(...te)),V=()=>K.on(Q,I),H=()=>K.removeListener(Q,I),Y=new E({onWillAddFirstListener:V,onDidRemoveLastListener:H});return Y.event}C.fromNodeEventEmitter=Le;function we(K,Q,k=I=>I){const I=(...te)=>Y.fire(k(...te)),V=()=>K.addEventListener(Q,I),H=()=>K.removeEventListener(Q,I),Y=new E({onWillAddFirstListener:V,onDidRemoveLastListener:H});return Y.event}C.fromDOMEventEmitter=we;function Ce(K){return new Promise(Q=>T(K)(Q))}C.toPromise=Ce;function ve(K){const Q=new E;return K.then(k=>{Q.fire(k)},()=>{Q.fire(void 0)}).finally(()=>{Q.dispose()}),Q.event}C.fromPromise=ve;function fe(K,Q){return K(k=>Q.fire(k))}C.forward=fe;function Se(K,Q,k){return Q(k),K(I=>Q(I))}C.runAndSubscribe=Se;class _e{constructor(Q,k){this._observable=Q,this._counter=0,this._hasChanged=!1;const I={onWillAddFirstListener:()=>{Q.addObserver(this),this._observable.reportChanges()},onDidRemoveLastListener:()=>{Q.removeObserver(this)}};k||R(I),this.emitter=new E(I),k&&k.add(this.emitter)}beginUpdate(Q){this._counter++}handlePossibleChange(Q){}handleChange(Q,k){this._hasChanged=!0}endUpdate(Q){this._counter--,this._counter===0&&(this._observable.reportChanges(),this._hasChanged&&(this._hasChanged=!1,this.emitter.fire(this._observable.get())))}}function ye(K,Q){return new _e(K,Q).emitter.event}C.fromObservable=ye;function Ee(K){return(Q,k,I)=>{let V=0,H=!1;const Y={beginUpdate(){V++},endUpdate(){V--,V===0&&(K.reportChanges(),H&&(H=!1,Q.call(k)))},handlePossibleChange(){},handleChange(){H=!0}};K.addObserver(Y),K.reportChanges();const te={dispose(){K.removeObserver(Y)}};return I instanceof A.DisposableStore?I.add(te):Array.isArray(I)&&I.push(te),te}}C.fromObservableLight=Ee})(m||(n.Event=m={}));class e{static{this.all=new Set}static{this._idPool=0}constructor(R){this.listenerCount=0,this.invocationCount=0,this.elapsedOverall=0,this.durations=[],this.name=`${R}_${e._idPool++}`,e.all.add(this)}start(R){this._stopWatch=new f.StopWatch,this.listenerCount=R}stop(){if(this._stopWatch){const R=this._stopWatch.elapsed();this.durations.push(R),this.elapsedOverall+=R,this.invocationCount+=1,this._stopWatch=void 0}}}n.EventProfiling=e;let h=-1;class r{static{this._idPool=1}constructor(R,D,T=(r._idPool++).toString(16).padStart(3,"0")){this._errorHandler=R,this.threshold=D,this.name=T,this._warnCountdown=0}dispose(){this._stacks?.clear()}check(R,D){const T=this.threshold;if(T<=0||D{const z=this._stacks.get(R.value)||0;this._stacks.set(R.value,z-1)}}getMostFrequentStack(){if(!this._stacks)return;let R,D=0;for(const[T,O]of this._stacks)(!R||D{if(C instanceof S)R(C);else for(let D=0;D{C.length!==0&&(console.warn("[LEAKING LISTENERS] GC'ed these listeners that were NOT yet disposed:"),console.warn(C.join(` -`)),C.length=0)},3e3),P=new FinalizationRegistry(R=>{typeof R=="string"&&C.push(R)})}class E{constructor(R){this._size=0,this._options=R,this._leakageMon=h>0||this._options?.leakWarningThreshold?new r(R?.onListenerError??i.onUnexpectedError,this._options?.leakWarningThreshold??h):void 0,this._perfMon=this._options?._profName?new e(this._options._profName):void 0,this._deliveryQueue=this._options?.deliveryQueue}dispose(){if(!this._disposed){if(this._disposed=!0,this._deliveryQueue?.current===this&&this._deliveryQueue.reset(),this._listeners){if(c){const R=this._listeners;queueMicrotask(()=>{N(R,D=>D.stack?.print())})}this._listeners=void 0,this._size=0}this._options?.onDidRemoveLastListener?.(),this._leakageMon?.dispose()}}get event(){return this._event??=(R,D,T)=>{if(this._leakageMon&&this._size>this._leakageMon.threshold**2){const q=`[${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far (${this._size} vs ${this._leakageMon.threshold})`;console.warn(q);const B=this._leakageMon.getMostFrequentStack()??["UNKNOWN stack",-1],G=new u(`${q}. HINT: Stack shows most frequent listener (${B[1]}-times)`,B[0]);return(this._options?.onListenerError||i.onUnexpectedError)(G),A.Disposable.None}if(this._disposed)return A.Disposable.None;D&&(R=R.bind(D));const O=new S(R);let z,j;this._leakageMon&&this._size>=Math.ceil(this._leakageMon.threshold*.2)&&(O.stack=s.create(),z=this._leakageMon.check(O.stack,this._size+1)),c&&(O.stack=j??s.create()),this._listeners?this._listeners instanceof S?(this._deliveryQueue??=new l,this._listeners=[this._listeners,O]):this._listeners.push(O):(this._options?.onWillAddFirstListener?.(this),this._listeners=O,this._options?.onDidAddFirstListener?.(this)),this._size++;const F=(0,A.toDisposable)(()=>{P?.unregister(F),z?.(),this._removeListener(O)});if(T instanceof A.DisposableStore?T.add(F):Array.isArray(T)&&T.push(F),P){const q=new Error().stack.split(` -`).slice(2,3).join(` -`).trim(),B=/(file:|vscode-file:\/\/vscode-app)?(\/[^:]*:\d+:\d+)/.exec(q);P.register(F,B?.[2]??q,F)}return F},this._event}_removeListener(R){if(this._options?.onWillRemoveListener?.(this),!this._listeners)return;if(this._size===1){this._listeners=void 0,this._options?.onDidRemoveLastListener?.(this),this._size=0;return}const D=this._listeners,T=D.indexOf(R);if(T===-1)throw console.log("disposed?",this._disposed),console.log("size?",this._size),console.log("arr?",JSON.stringify(this._listeners)),new Error("Attempted to dispose unknown listener");this._size--,D[T]=void 0;const O=this._deliveryQueue.current===this;if(this._size*L<=D.length){let z=0;for(let j=0;j0}}n.Emitter=E;const v=()=>new l;n.createEventDeliveryQueue=v;class l{constructor(){this.i=-1,this.end=0}enqueue(R,D,T){this.i=0,this.end=T,this.current=R,this.value=D}reset(){this.i=this.end,this.current=void 0,this.value=void 0}}class b extends E{constructor(R){super(R),this._isPaused=0,this._eventQueue=new d.LinkedList,this._mergeFn=R?.merge}pause(){this._isPaused++}resume(){if(this._isPaused!==0&&--this._isPaused===0)if(this._mergeFn){if(this._eventQueue.size>0){const R=Array.from(this._eventQueue);this._eventQueue.clear(),super.fire(this._mergeFn(R))}}else for(;!this._isPaused&&this._eventQueue.size!==0;)super.fire(this._eventQueue.shift())}fire(R){this._size&&(this._isPaused!==0?this._eventQueue.push(R):super.fire(R))}}n.PauseableEmitter=b;class g extends b{constructor(R){super(R),this._delay=R.delay??100}fire(R){this._handle||(this.pause(),this._handle=setTimeout(()=>{this._handle=void 0,this.resume()},this._delay)),super.fire(R)}}n.DebounceEmitter=g;class w extends E{constructor(R){super(R),this._queuedEvents=[],this._mergeFn=R?.merge}fire(R){this.hasListeners()&&(this._queuedEvents.push(R),this._queuedEvents.length===1&&queueMicrotask(()=>{this._mergeFn?super.fire(this._mergeFn(this._queuedEvents)):this._queuedEvents.forEach(D=>super.fire(D)),this._queuedEvents=[]}))}}n.MicrotaskEmitter=w;class M{constructor(){this.hasListeners=!1,this.events=[],this.emitter=new E({onWillAddFirstListener:()=>this.onFirstListenerAdd(),onDidRemoveLastListener:()=>this.onLastListenerRemove()})}get event(){return this.emitter.event}add(R){const D={event:R,listener:null};this.events.push(D),this.hasListeners&&this.hook(D);const T=()=>{this.hasListeners&&this.unhook(D);const O=this.events.indexOf(D);this.events.splice(O,1)};return(0,A.toDisposable)((0,x.createSingleCallFunction)(T))}onFirstListenerAdd(){this.hasListeners=!0,this.events.forEach(R=>this.hook(R))}onLastListenerRemove(){this.hasListeners=!1,this.events.forEach(R=>this.unhook(R))}hook(R){R.listener=R.event(D=>this.emitter.fire(D))}unhook(R){R.listener?.dispose(),R.listener=null}dispose(){this.emitter.dispose();for(const R of this.events)R.listener?.dispose();this.events=[]}}n.EventMultiplexer=M;class y{constructor(){this.data=[]}wrapEvent(R,D,T){return(O,z,j)=>R(F=>{const q=this.data[this.data.length-1];if(!D){q?q.buffers.push(()=>O.call(z,F)):O.call(z,F);return}const B=q;if(!B){O.call(z,D(T,F));return}B.items??=[],B.items.push(F),B.buffers.length===0&&q.buffers.push(()=>{B.reducedResult??=T?B.items.reduce(D,T):B.items.reduce(D),O.call(z,B.reducedResult)})},void 0,j)}bufferEvents(R){const D={buffers:new Array};this.data.push(D);const T=R();return this.data.pop(),D.buffers.forEach(O=>O()),T}}n.EventBufferer=y;class _{constructor(){this.listening=!1,this.inputEvent=m.None,this.inputEventListener=A.Disposable.None,this.emitter=new E({onDidAddFirstListener:()=>{this.listening=!0,this.inputEventListener=this.inputEvent(this.emitter.fire,this.emitter)},onDidRemoveLastListener:()=>{this.listening=!1,this.inputEventListener.dispose()}}),this.event=this.emitter.event}set input(R){this.inputEvent=R,this.listening&&(this.inputEventListener.dispose(),this.inputEventListener=R(this.emitter.fire,this.emitter))}dispose(){this.inputEventListener.dispose(),this.emitter.dispose()}}n.Relay=_}),X(J[23],Z([0,1,9]),function(W,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.CancellationTokenSource=n.CancellationToken=void 0,n.cancelOnDispose=p;const x=Object.freeze(function(c,a){const m=setTimeout(c.bind(a),0);return{dispose(){clearTimeout(m)}}});var A;(function(c){function a(m){return m===c.None||m===c.Cancelled||m instanceof d?!0:!m||typeof m!="object"?!1:typeof m.isCancellationRequested=="boolean"&&typeof m.onCancellationRequested=="function"}c.isCancellationToken=a,c.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:i.Event.None}),c.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:x})})(A||(n.CancellationToken=A={}));class d{constructor(){this._isCancelled=!1,this._emitter=null}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?x:(this._emitter||(this._emitter=new i.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=null)}}class f{constructor(a){this._token=void 0,this._parentListener=void 0,this._parentListener=a&&a.onCancellationRequested(this.cancel,this)}get token(){return this._token||(this._token=new d),this._token}cancel(){this._token?this._token instanceof d&&this._token.cancel():this._token=A.Cancelled}dispose(a=!1){a&&this.cancel(),this._parentListener?.dispose(),this._token?this._token instanceof d&&this._token.dispose():this._token=A.None}}n.CancellationTokenSource=f;function p(c){const a=new f;return c.add({dispose(){a.cancel()}}),a.token}}),X(J[6],Z([0,1,39,43]),function(W,n,i,x){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.InvisibleCharacters=n.AmbiguousCharacters=n.noBreakWhitespace=n.UTF8_BOM_CHARACTER=n.UNUSUAL_LINE_TERMINATORS=n.GraphemeIterator=n.CodePointIterator=void 0,n.isFalsyOrWhitespace=A,n.format=f,n.htmlAttributeEncodeValue=p,n.escape=c,n.escapeRegExpCharacters=a,n.trim=m,n.ltrim=e,n.rtrim=h,n.convertSimple2RegExpPattern=r,n.stripWildcards=s,n.createRegExp=o,n.regExpLeadsToEndlessLoop=u,n.splitLines=S,n.splitLinesIncludeSeparators=L,n.firstNonWhitespaceIndex=N,n.getLeadingWhitespace=P,n.lastNonWhitespaceIndex=E,n.compare=v,n.compareSubstring=l,n.compareIgnoreCase=b,n.compareSubstringIgnoreCase=g,n.isAsciiDigit=w,n.isLowerAsciiLetter=M,n.isUpperAsciiLetter=y,n.equalsIgnoreCase=_,n.startsWithIgnoreCase=C,n.commonPrefixLength=R,n.commonSuffixLength=D,n.isHighSurrogate=T,n.isLowSurrogate=O,n.computeCodePoint=z,n.getNextCodePoint=j,n.nextCharLength=G,n.prevCharLength=$,n.getCharContainingOffset=U,n.containsRTL=ue,n.isBasicASCII=ge,n.containsUnusualLineTerminators=t,n.isFullWidthCharacter=me,n.isEmojiImprecise=pe,n.startsWithUTF8BOM=Le,n.containsUppercaseCharacter=we,n.singleLetterHash=Ce,n.getLeftDeleteOffset=_e;function A(k){return!k||typeof k!="string"?!0:k.trim().length===0}const d=/{(\d+)}/g;function f(k,...I){return I.length===0?k:k.replace(d,function(V,H){const Y=parseInt(H,10);return isNaN(Y)||Y<0||Y>=I.length?V:I[Y]})}function p(k){return k.replace(/[<>"'&]/g,I=>{switch(I){case"<":return"<";case">":return">";case'"':return""";case"'":return"'";case"&":return"&"}return I})}function c(k){return k.replace(/[<>&]/g,function(I){switch(I){case"<":return"<";case">":return">";case"&":return"&";default:return I}})}function a(k){return k.replace(/[\\\{\}\*\+\?\|\^\$\.\[\]\(\)]/g,"\\$&")}function m(k,I=" "){const V=e(k,I);return h(V,I)}function e(k,I){if(!k||!I)return k;const V=I.length;if(V===0||k.length===0)return k;let H=0;for(;k.indexOf(I,H)===H;)H=H+V;return k.substring(H)}function h(k,I){if(!k||!I)return k;const V=I.length,H=k.length;if(V===0||H===0)return k;let Y=H,te=-1;for(;te=k.lastIndexOf(I,Y-1),!(te===-1||te+V!==Y);){if(te===0)return"";Y=te}return k.substring(0,Y)}function r(k){return k.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g,"\\$&").replace(/[\*]/g,".*")}function s(k){return k.replace(/\*/g,"")}function o(k,I,V={}){if(!k)throw new Error("Cannot create regex from empty string");I||(k=a(k)),V.wholeWord&&(/\B/.test(k.charAt(0))||(k="\\b"+k),/\B/.test(k.charAt(k.length-1))||(k=k+"\\b"));let H="";return V.global&&(H+="g"),V.matchCase||(H+="i"),V.multiline&&(H+="m"),V.unicode&&(H+="u"),new RegExp(k,H)}function u(k){return k.source==="^"||k.source==="^$"||k.source==="$"||k.source==="^\\s*$"?!1:!!(k.exec("")&&k.lastIndex===0)}function S(k){return k.split(/\r\n|\r|\n/)}function L(k){const I=[],V=k.split(/(\r\n|\r|\n)/);for(let H=0;H=0;V--){const H=k.charCodeAt(V);if(H!==32&&H!==9)return V}return-1}function v(k,I){return kI?1:0}function l(k,I,V=0,H=k.length,Y=0,te=I.length){for(;Voe)return 1}const ne=H-V,ae=te-Y;return neae?1:0}function b(k,I){return g(k,I,0,k.length,0,I.length)}function g(k,I,V=0,H=k.length,Y=0,te=I.length){for(;V=128||oe>=128)return l(k.toLowerCase(),I.toLowerCase(),V,H,Y,te);M(le)&&(le-=32),M(oe)&&(oe-=32);const se=le-oe;if(se!==0)return se}const ne=H-V,ae=te-Y;return neae?1:0}function w(k){return k>=48&&k<=57}function M(k){return k>=97&&k<=122}function y(k){return k>=65&&k<=90}function _(k,I){return k.length===I.length&&g(k,I)===0}function C(k,I){const V=I.length;return I.length>k.length?!1:g(k,I,0,V)===0}function R(k,I){const V=Math.min(k.length,I.length);let H;for(H=0;H1){const H=k.charCodeAt(I-2);if(T(H))return z(H,V)}return V}class q{get offset(){return this._offset}constructor(I,V=0){this._str=I,this._len=I.length,this._offset=V}setOffset(I){this._offset=I}prevCodePoint(){const I=F(this._str,this._offset);return this._offset-=I>=65536?2:1,I}nextCodePoint(){const I=j(this._str,this._len,this._offset);return this._offset+=I>=65536?2:1,I}eol(){return this._offset>=this._len}}n.CodePointIterator=q;class B{get offset(){return this._iterator.offset}constructor(I,V=0){this._iterator=new q(I,V)}nextGraphemeLength(){const I=fe.getInstance(),V=this._iterator,H=V.offset;let Y=I.getGraphemeBreakType(V.nextCodePoint());for(;!V.eol();){const te=V.offset,ne=I.getGraphemeBreakType(V.nextCodePoint());if(ve(Y,ne)){V.setOffset(te);break}Y=ne}return V.offset-H}prevGraphemeLength(){const I=fe.getInstance(),V=this._iterator,H=V.offset;let Y=I.getGraphemeBreakType(V.prevCodePoint());for(;V.offset>0;){const te=V.offset,ne=I.getGraphemeBreakType(V.prevCodePoint());if(ve(ne,Y)){V.setOffset(te);break}Y=ne}return H-V.offset}eol(){return this._iterator.eol()}}n.GraphemeIterator=B;function G(k,I){return new B(k,I).nextGraphemeLength()}function $(k,I){return new B(k,I).prevGraphemeLength()}function U(k,I){I>0&&O(k.charCodeAt(I))&&I--;const V=I+G(k,I);return[V-$(k,V),V]}let ee;function re(){return/(?:[\u05BE\u05C0\u05C3\u05C6\u05D0-\u05F4\u0608\u060B\u060D\u061B-\u064A\u066D-\u066F\u0671-\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u0710\u0712-\u072F\u074D-\u07A5\u07B1-\u07EA\u07F4\u07F5\u07FA\u07FE-\u0815\u081A\u0824\u0828\u0830-\u0858\u085E-\u088E\u08A0-\u08C9\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFD3D\uFD50-\uFDC7\uFDF0-\uFDFC\uFE70-\uFEFC]|\uD802[\uDC00-\uDD1B\uDD20-\uDE00\uDE10-\uDE35\uDE40-\uDEE4\uDEEB-\uDF35\uDF40-\uDFFF]|\uD803[\uDC00-\uDD23\uDE80-\uDEA9\uDEAD-\uDF45\uDF51-\uDF81\uDF86-\uDFF6]|\uD83A[\uDC00-\uDCCF\uDD00-\uDD43\uDD4B-\uDFFF]|\uD83B[\uDC00-\uDEBB])/}function ue(k){return ee||(ee=re()),ee.test(k)}const de=/^[\t\n\r\x20-\x7E]*$/;function ge(k){return de.test(k)}n.UNUSUAL_LINE_TERMINATORS=/[\u2028\u2029]/;function t(k){return n.UNUSUAL_LINE_TERMINATORS.test(k)}function me(k){return k>=11904&&k<=55215||k>=63744&&k<=64255||k>=65281&&k<=65374}function pe(k){return k>=127462&&k<=127487||k===8986||k===8987||k===9200||k===9203||k>=9728&&k<=10175||k===11088||k===11093||k>=127744&&k<=128591||k>=128640&&k<=128764||k>=128992&&k<=129008||k>=129280&&k<=129535||k>=129648&&k<=129782}n.UTF8_BOM_CHARACTER="\uFEFF";function Le(k){return!!(k&&k.length>0&&k.charCodeAt(0)===65279)}function we(k,I=!1){return k?(I&&(k=k.replace(/\\./g,"")),k.toLowerCase()!==k):!1}function Ce(k){return k=k%(2*26),k<26?String.fromCharCode(97+k):String.fromCharCode(65+k-26)}function ve(k,I){return k===0?I!==5&&I!==7:k===2&&I===3?!1:k===4||k===2||k===3||I===4||I===2||I===3?!0:!(k===8&&(I===8||I===9||I===11||I===12)||(k===11||k===9)&&(I===9||I===10)||(k===12||k===10)&&I===10||I===5||I===13||I===7||k===1||k===13&&I===14||k===6&&I===6)}class fe{static{this._INSTANCE=null}static getInstance(){return fe._INSTANCE||(fe._INSTANCE=new fe),fe._INSTANCE}constructor(){this._data=Se()}getGraphemeBreakType(I){if(I<32)return I===10?3:I===13?2:4;if(I<127)return 0;const V=this._data,H=V.length/3;let Y=1;for(;Y<=H;)if(IV[3*Y+1])Y=2*Y+1;else return V[3*Y+2];return 0}}function Se(){return JSON.parse("[0,0,0,51229,51255,12,44061,44087,12,127462,127487,6,7083,7085,5,47645,47671,12,54813,54839,12,128678,128678,14,3270,3270,5,9919,9923,14,45853,45879,12,49437,49463,12,53021,53047,12,71216,71218,7,128398,128399,14,129360,129374,14,2519,2519,5,4448,4519,9,9742,9742,14,12336,12336,14,44957,44983,12,46749,46775,12,48541,48567,12,50333,50359,12,52125,52151,12,53917,53943,12,69888,69890,5,73018,73018,5,127990,127990,14,128558,128559,14,128759,128760,14,129653,129655,14,2027,2035,5,2891,2892,7,3761,3761,5,6683,6683,5,8293,8293,4,9825,9826,14,9999,9999,14,43452,43453,5,44509,44535,12,45405,45431,12,46301,46327,12,47197,47223,12,48093,48119,12,48989,49015,12,49885,49911,12,50781,50807,12,51677,51703,12,52573,52599,12,53469,53495,12,54365,54391,12,65279,65279,4,70471,70472,7,72145,72147,7,119173,119179,5,127799,127818,14,128240,128244,14,128512,128512,14,128652,128652,14,128721,128722,14,129292,129292,14,129445,129450,14,129734,129743,14,1476,1477,5,2366,2368,7,2750,2752,7,3076,3076,5,3415,3415,5,4141,4144,5,6109,6109,5,6964,6964,5,7394,7400,5,9197,9198,14,9770,9770,14,9877,9877,14,9968,9969,14,10084,10084,14,43052,43052,5,43713,43713,5,44285,44311,12,44733,44759,12,45181,45207,12,45629,45655,12,46077,46103,12,46525,46551,12,46973,46999,12,47421,47447,12,47869,47895,12,48317,48343,12,48765,48791,12,49213,49239,12,49661,49687,12,50109,50135,12,50557,50583,12,51005,51031,12,51453,51479,12,51901,51927,12,52349,52375,12,52797,52823,12,53245,53271,12,53693,53719,12,54141,54167,12,54589,54615,12,55037,55063,12,69506,69509,5,70191,70193,5,70841,70841,7,71463,71467,5,72330,72342,5,94031,94031,5,123628,123631,5,127763,127765,14,127941,127941,14,128043,128062,14,128302,128317,14,128465,128467,14,128539,128539,14,128640,128640,14,128662,128662,14,128703,128703,14,128745,128745,14,129004,129007,14,129329,129330,14,129402,129402,14,129483,129483,14,129686,129704,14,130048,131069,14,173,173,4,1757,1757,1,2200,2207,5,2434,2435,7,2631,2632,5,2817,2817,5,3008,3008,5,3201,3201,5,3387,3388,5,3542,3542,5,3902,3903,7,4190,4192,5,6002,6003,5,6439,6440,5,6765,6770,7,7019,7027,5,7154,7155,7,8205,8205,13,8505,8505,14,9654,9654,14,9757,9757,14,9792,9792,14,9852,9853,14,9890,9894,14,9937,9937,14,9981,9981,14,10035,10036,14,11035,11036,14,42654,42655,5,43346,43347,7,43587,43587,5,44006,44007,7,44173,44199,12,44397,44423,12,44621,44647,12,44845,44871,12,45069,45095,12,45293,45319,12,45517,45543,12,45741,45767,12,45965,45991,12,46189,46215,12,46413,46439,12,46637,46663,12,46861,46887,12,47085,47111,12,47309,47335,12,47533,47559,12,47757,47783,12,47981,48007,12,48205,48231,12,48429,48455,12,48653,48679,12,48877,48903,12,49101,49127,12,49325,49351,12,49549,49575,12,49773,49799,12,49997,50023,12,50221,50247,12,50445,50471,12,50669,50695,12,50893,50919,12,51117,51143,12,51341,51367,12,51565,51591,12,51789,51815,12,52013,52039,12,52237,52263,12,52461,52487,12,52685,52711,12,52909,52935,12,53133,53159,12,53357,53383,12,53581,53607,12,53805,53831,12,54029,54055,12,54253,54279,12,54477,54503,12,54701,54727,12,54925,54951,12,55149,55175,12,68101,68102,5,69762,69762,7,70067,70069,7,70371,70378,5,70720,70721,7,71087,71087,5,71341,71341,5,71995,71996,5,72249,72249,7,72850,72871,5,73109,73109,5,118576,118598,5,121505,121519,5,127245,127247,14,127568,127569,14,127777,127777,14,127872,127891,14,127956,127967,14,128015,128016,14,128110,128172,14,128259,128259,14,128367,128368,14,128424,128424,14,128488,128488,14,128530,128532,14,128550,128551,14,128566,128566,14,128647,128647,14,128656,128656,14,128667,128673,14,128691,128693,14,128715,128715,14,128728,128732,14,128752,128752,14,128765,128767,14,129096,129103,14,129311,129311,14,129344,129349,14,129394,129394,14,129413,129425,14,129466,129471,14,129511,129535,14,129664,129666,14,129719,129722,14,129760,129767,14,917536,917631,5,13,13,2,1160,1161,5,1564,1564,4,1807,1807,1,2085,2087,5,2307,2307,7,2382,2383,7,2497,2500,5,2563,2563,7,2677,2677,5,2763,2764,7,2879,2879,5,2914,2915,5,3021,3021,5,3142,3144,5,3263,3263,5,3285,3286,5,3398,3400,7,3530,3530,5,3633,3633,5,3864,3865,5,3974,3975,5,4155,4156,7,4229,4230,5,5909,5909,7,6078,6085,7,6277,6278,5,6451,6456,7,6744,6750,5,6846,6846,5,6972,6972,5,7074,7077,5,7146,7148,7,7222,7223,5,7416,7417,5,8234,8238,4,8417,8417,5,9000,9000,14,9203,9203,14,9730,9731,14,9748,9749,14,9762,9763,14,9776,9783,14,9800,9811,14,9831,9831,14,9872,9873,14,9882,9882,14,9900,9903,14,9929,9933,14,9941,9960,14,9974,9974,14,9989,9989,14,10006,10006,14,10062,10062,14,10160,10160,14,11647,11647,5,12953,12953,14,43019,43019,5,43232,43249,5,43443,43443,5,43567,43568,7,43696,43696,5,43765,43765,7,44013,44013,5,44117,44143,12,44229,44255,12,44341,44367,12,44453,44479,12,44565,44591,12,44677,44703,12,44789,44815,12,44901,44927,12,45013,45039,12,45125,45151,12,45237,45263,12,45349,45375,12,45461,45487,12,45573,45599,12,45685,45711,12,45797,45823,12,45909,45935,12,46021,46047,12,46133,46159,12,46245,46271,12,46357,46383,12,46469,46495,12,46581,46607,12,46693,46719,12,46805,46831,12,46917,46943,12,47029,47055,12,47141,47167,12,47253,47279,12,47365,47391,12,47477,47503,12,47589,47615,12,47701,47727,12,47813,47839,12,47925,47951,12,48037,48063,12,48149,48175,12,48261,48287,12,48373,48399,12,48485,48511,12,48597,48623,12,48709,48735,12,48821,48847,12,48933,48959,12,49045,49071,12,49157,49183,12,49269,49295,12,49381,49407,12,49493,49519,12,49605,49631,12,49717,49743,12,49829,49855,12,49941,49967,12,50053,50079,12,50165,50191,12,50277,50303,12,50389,50415,12,50501,50527,12,50613,50639,12,50725,50751,12,50837,50863,12,50949,50975,12,51061,51087,12,51173,51199,12,51285,51311,12,51397,51423,12,51509,51535,12,51621,51647,12,51733,51759,12,51845,51871,12,51957,51983,12,52069,52095,12,52181,52207,12,52293,52319,12,52405,52431,12,52517,52543,12,52629,52655,12,52741,52767,12,52853,52879,12,52965,52991,12,53077,53103,12,53189,53215,12,53301,53327,12,53413,53439,12,53525,53551,12,53637,53663,12,53749,53775,12,53861,53887,12,53973,53999,12,54085,54111,12,54197,54223,12,54309,54335,12,54421,54447,12,54533,54559,12,54645,54671,12,54757,54783,12,54869,54895,12,54981,55007,12,55093,55119,12,55243,55291,10,66045,66045,5,68325,68326,5,69688,69702,5,69817,69818,5,69957,69958,7,70089,70092,5,70198,70199,5,70462,70462,5,70502,70508,5,70750,70750,5,70846,70846,7,71100,71101,5,71230,71230,7,71351,71351,5,71737,71738,5,72000,72000,7,72160,72160,5,72273,72278,5,72752,72758,5,72882,72883,5,73031,73031,5,73461,73462,7,94192,94193,7,119149,119149,7,121403,121452,5,122915,122916,5,126980,126980,14,127358,127359,14,127535,127535,14,127759,127759,14,127771,127771,14,127792,127793,14,127825,127867,14,127897,127899,14,127945,127945,14,127985,127986,14,128000,128007,14,128021,128021,14,128066,128100,14,128184,128235,14,128249,128252,14,128266,128276,14,128335,128335,14,128379,128390,14,128407,128419,14,128444,128444,14,128481,128481,14,128499,128499,14,128526,128526,14,128536,128536,14,128543,128543,14,128556,128556,14,128564,128564,14,128577,128580,14,128643,128645,14,128649,128649,14,128654,128654,14,128660,128660,14,128664,128664,14,128675,128675,14,128686,128689,14,128695,128696,14,128705,128709,14,128717,128719,14,128725,128725,14,128736,128741,14,128747,128748,14,128755,128755,14,128762,128762,14,128981,128991,14,129009,129023,14,129160,129167,14,129296,129304,14,129320,129327,14,129340,129342,14,129356,129356,14,129388,129392,14,129399,129400,14,129404,129407,14,129432,129442,14,129454,129455,14,129473,129474,14,129485,129487,14,129648,129651,14,129659,129660,14,129671,129679,14,129709,129711,14,129728,129730,14,129751,129753,14,129776,129782,14,917505,917505,4,917760,917999,5,10,10,3,127,159,4,768,879,5,1471,1471,5,1536,1541,1,1648,1648,5,1767,1768,5,1840,1866,5,2070,2073,5,2137,2139,5,2274,2274,1,2363,2363,7,2377,2380,7,2402,2403,5,2494,2494,5,2507,2508,7,2558,2558,5,2622,2624,7,2641,2641,5,2691,2691,7,2759,2760,5,2786,2787,5,2876,2876,5,2881,2884,5,2901,2902,5,3006,3006,5,3014,3016,7,3072,3072,5,3134,3136,5,3157,3158,5,3260,3260,5,3266,3266,5,3274,3275,7,3328,3329,5,3391,3392,7,3405,3405,5,3457,3457,5,3536,3537,7,3551,3551,5,3636,3642,5,3764,3772,5,3895,3895,5,3967,3967,7,3993,4028,5,4146,4151,5,4182,4183,7,4226,4226,5,4253,4253,5,4957,4959,5,5940,5940,7,6070,6070,7,6087,6088,7,6158,6158,4,6432,6434,5,6448,6449,7,6679,6680,5,6742,6742,5,6754,6754,5,6783,6783,5,6912,6915,5,6966,6970,5,6978,6978,5,7042,7042,7,7080,7081,5,7143,7143,7,7150,7150,7,7212,7219,5,7380,7392,5,7412,7412,5,8203,8203,4,8232,8232,4,8265,8265,14,8400,8412,5,8421,8432,5,8617,8618,14,9167,9167,14,9200,9200,14,9410,9410,14,9723,9726,14,9733,9733,14,9745,9745,14,9752,9752,14,9760,9760,14,9766,9766,14,9774,9774,14,9786,9786,14,9794,9794,14,9823,9823,14,9828,9828,14,9833,9850,14,9855,9855,14,9875,9875,14,9880,9880,14,9885,9887,14,9896,9897,14,9906,9916,14,9926,9927,14,9935,9935,14,9939,9939,14,9962,9962,14,9972,9972,14,9978,9978,14,9986,9986,14,9997,9997,14,10002,10002,14,10017,10017,14,10055,10055,14,10071,10071,14,10133,10135,14,10548,10549,14,11093,11093,14,12330,12333,5,12441,12442,5,42608,42610,5,43010,43010,5,43045,43046,5,43188,43203,7,43302,43309,5,43392,43394,5,43446,43449,5,43493,43493,5,43571,43572,7,43597,43597,7,43703,43704,5,43756,43757,5,44003,44004,7,44009,44010,7,44033,44059,12,44089,44115,12,44145,44171,12,44201,44227,12,44257,44283,12,44313,44339,12,44369,44395,12,44425,44451,12,44481,44507,12,44537,44563,12,44593,44619,12,44649,44675,12,44705,44731,12,44761,44787,12,44817,44843,12,44873,44899,12,44929,44955,12,44985,45011,12,45041,45067,12,45097,45123,12,45153,45179,12,45209,45235,12,45265,45291,12,45321,45347,12,45377,45403,12,45433,45459,12,45489,45515,12,45545,45571,12,45601,45627,12,45657,45683,12,45713,45739,12,45769,45795,12,45825,45851,12,45881,45907,12,45937,45963,12,45993,46019,12,46049,46075,12,46105,46131,12,46161,46187,12,46217,46243,12,46273,46299,12,46329,46355,12,46385,46411,12,46441,46467,12,46497,46523,12,46553,46579,12,46609,46635,12,46665,46691,12,46721,46747,12,46777,46803,12,46833,46859,12,46889,46915,12,46945,46971,12,47001,47027,12,47057,47083,12,47113,47139,12,47169,47195,12,47225,47251,12,47281,47307,12,47337,47363,12,47393,47419,12,47449,47475,12,47505,47531,12,47561,47587,12,47617,47643,12,47673,47699,12,47729,47755,12,47785,47811,12,47841,47867,12,47897,47923,12,47953,47979,12,48009,48035,12,48065,48091,12,48121,48147,12,48177,48203,12,48233,48259,12,48289,48315,12,48345,48371,12,48401,48427,12,48457,48483,12,48513,48539,12,48569,48595,12,48625,48651,12,48681,48707,12,48737,48763,12,48793,48819,12,48849,48875,12,48905,48931,12,48961,48987,12,49017,49043,12,49073,49099,12,49129,49155,12,49185,49211,12,49241,49267,12,49297,49323,12,49353,49379,12,49409,49435,12,49465,49491,12,49521,49547,12,49577,49603,12,49633,49659,12,49689,49715,12,49745,49771,12,49801,49827,12,49857,49883,12,49913,49939,12,49969,49995,12,50025,50051,12,50081,50107,12,50137,50163,12,50193,50219,12,50249,50275,12,50305,50331,12,50361,50387,12,50417,50443,12,50473,50499,12,50529,50555,12,50585,50611,12,50641,50667,12,50697,50723,12,50753,50779,12,50809,50835,12,50865,50891,12,50921,50947,12,50977,51003,12,51033,51059,12,51089,51115,12,51145,51171,12,51201,51227,12,51257,51283,12,51313,51339,12,51369,51395,12,51425,51451,12,51481,51507,12,51537,51563,12,51593,51619,12,51649,51675,12,51705,51731,12,51761,51787,12,51817,51843,12,51873,51899,12,51929,51955,12,51985,52011,12,52041,52067,12,52097,52123,12,52153,52179,12,52209,52235,12,52265,52291,12,52321,52347,12,52377,52403,12,52433,52459,12,52489,52515,12,52545,52571,12,52601,52627,12,52657,52683,12,52713,52739,12,52769,52795,12,52825,52851,12,52881,52907,12,52937,52963,12,52993,53019,12,53049,53075,12,53105,53131,12,53161,53187,12,53217,53243,12,53273,53299,12,53329,53355,12,53385,53411,12,53441,53467,12,53497,53523,12,53553,53579,12,53609,53635,12,53665,53691,12,53721,53747,12,53777,53803,12,53833,53859,12,53889,53915,12,53945,53971,12,54001,54027,12,54057,54083,12,54113,54139,12,54169,54195,12,54225,54251,12,54281,54307,12,54337,54363,12,54393,54419,12,54449,54475,12,54505,54531,12,54561,54587,12,54617,54643,12,54673,54699,12,54729,54755,12,54785,54811,12,54841,54867,12,54897,54923,12,54953,54979,12,55009,55035,12,55065,55091,12,55121,55147,12,55177,55203,12,65024,65039,5,65520,65528,4,66422,66426,5,68152,68154,5,69291,69292,5,69633,69633,5,69747,69748,5,69811,69814,5,69826,69826,5,69932,69932,7,70016,70017,5,70079,70080,7,70095,70095,5,70196,70196,5,70367,70367,5,70402,70403,7,70464,70464,5,70487,70487,5,70709,70711,7,70725,70725,7,70833,70834,7,70843,70844,7,70849,70849,7,71090,71093,5,71103,71104,5,71227,71228,7,71339,71339,5,71344,71349,5,71458,71461,5,71727,71735,5,71985,71989,7,71998,71998,5,72002,72002,7,72154,72155,5,72193,72202,5,72251,72254,5,72281,72283,5,72344,72345,5,72766,72766,7,72874,72880,5,72885,72886,5,73023,73029,5,73104,73105,5,73111,73111,5,92912,92916,5,94095,94098,5,113824,113827,4,119142,119142,7,119155,119162,4,119362,119364,5,121476,121476,5,122888,122904,5,123184,123190,5,125252,125258,5,127183,127183,14,127340,127343,14,127377,127386,14,127491,127503,14,127548,127551,14,127744,127756,14,127761,127761,14,127769,127769,14,127773,127774,14,127780,127788,14,127796,127797,14,127820,127823,14,127869,127869,14,127894,127895,14,127902,127903,14,127943,127943,14,127947,127950,14,127972,127972,14,127988,127988,14,127992,127994,14,128009,128011,14,128019,128019,14,128023,128041,14,128064,128064,14,128102,128107,14,128174,128181,14,128238,128238,14,128246,128247,14,128254,128254,14,128264,128264,14,128278,128299,14,128329,128330,14,128348,128359,14,128371,128377,14,128392,128393,14,128401,128404,14,128421,128421,14,128433,128434,14,128450,128452,14,128476,128478,14,128483,128483,14,128495,128495,14,128506,128506,14,128519,128520,14,128528,128528,14,128534,128534,14,128538,128538,14,128540,128542,14,128544,128549,14,128552,128555,14,128557,128557,14,128560,128563,14,128565,128565,14,128567,128576,14,128581,128591,14,128641,128642,14,128646,128646,14,128648,128648,14,128650,128651,14,128653,128653,14,128655,128655,14,128657,128659,14,128661,128661,14,128663,128663,14,128665,128666,14,128674,128674,14,128676,128677,14,128679,128685,14,128690,128690,14,128694,128694,14,128697,128702,14,128704,128704,14,128710,128714,14,128716,128716,14,128720,128720,14,128723,128724,14,128726,128727,14,128733,128735,14,128742,128744,14,128746,128746,14,128749,128751,14,128753,128754,14,128756,128758,14,128761,128761,14,128763,128764,14,128884,128895,14,128992,129003,14,129008,129008,14,129036,129039,14,129114,129119,14,129198,129279,14,129293,129295,14,129305,129310,14,129312,129319,14,129328,129328,14,129331,129338,14,129343,129343,14,129351,129355,14,129357,129359,14,129375,129387,14,129393,129393,14,129395,129398,14,129401,129401,14,129403,129403,14,129408,129412,14,129426,129431,14,129443,129444,14,129451,129453,14,129456,129465,14,129472,129472,14,129475,129482,14,129484,129484,14,129488,129510,14,129536,129647,14,129652,129652,14,129656,129658,14,129661,129663,14,129667,129670,14,129680,129685,14,129705,129708,14,129712,129718,14,129723,129727,14,129731,129733,14,129744,129750,14,129754,129759,14,129768,129775,14,129783,129791,14,917504,917504,4,917506,917535,4,917632,917759,4,918000,921599,4,0,9,4,11,12,4,14,31,4,169,169,14,174,174,14,1155,1159,5,1425,1469,5,1473,1474,5,1479,1479,5,1552,1562,5,1611,1631,5,1750,1756,5,1759,1764,5,1770,1773,5,1809,1809,5,1958,1968,5,2045,2045,5,2075,2083,5,2089,2093,5,2192,2193,1,2250,2273,5,2275,2306,5,2362,2362,5,2364,2364,5,2369,2376,5,2381,2381,5,2385,2391,5,2433,2433,5,2492,2492,5,2495,2496,7,2503,2504,7,2509,2509,5,2530,2531,5,2561,2562,5,2620,2620,5,2625,2626,5,2635,2637,5,2672,2673,5,2689,2690,5,2748,2748,5,2753,2757,5,2761,2761,7,2765,2765,5,2810,2815,5,2818,2819,7,2878,2878,5,2880,2880,7,2887,2888,7,2893,2893,5,2903,2903,5,2946,2946,5,3007,3007,7,3009,3010,7,3018,3020,7,3031,3031,5,3073,3075,7,3132,3132,5,3137,3140,7,3146,3149,5,3170,3171,5,3202,3203,7,3262,3262,7,3264,3265,7,3267,3268,7,3271,3272,7,3276,3277,5,3298,3299,5,3330,3331,7,3390,3390,5,3393,3396,5,3402,3404,7,3406,3406,1,3426,3427,5,3458,3459,7,3535,3535,5,3538,3540,5,3544,3550,7,3570,3571,7,3635,3635,7,3655,3662,5,3763,3763,7,3784,3789,5,3893,3893,5,3897,3897,5,3953,3966,5,3968,3972,5,3981,3991,5,4038,4038,5,4145,4145,7,4153,4154,5,4157,4158,5,4184,4185,5,4209,4212,5,4228,4228,7,4237,4237,5,4352,4447,8,4520,4607,10,5906,5908,5,5938,5939,5,5970,5971,5,6068,6069,5,6071,6077,5,6086,6086,5,6089,6099,5,6155,6157,5,6159,6159,5,6313,6313,5,6435,6438,7,6441,6443,7,6450,6450,5,6457,6459,5,6681,6682,7,6741,6741,7,6743,6743,7,6752,6752,5,6757,6764,5,6771,6780,5,6832,6845,5,6847,6862,5,6916,6916,7,6965,6965,5,6971,6971,7,6973,6977,7,6979,6980,7,7040,7041,5,7073,7073,7,7078,7079,7,7082,7082,7,7142,7142,5,7144,7145,5,7149,7149,5,7151,7153,5,7204,7211,7,7220,7221,7,7376,7378,5,7393,7393,7,7405,7405,5,7415,7415,7,7616,7679,5,8204,8204,5,8206,8207,4,8233,8233,4,8252,8252,14,8288,8292,4,8294,8303,4,8413,8416,5,8418,8420,5,8482,8482,14,8596,8601,14,8986,8987,14,9096,9096,14,9193,9196,14,9199,9199,14,9201,9202,14,9208,9210,14,9642,9643,14,9664,9664,14,9728,9729,14,9732,9732,14,9735,9741,14,9743,9744,14,9746,9746,14,9750,9751,14,9753,9756,14,9758,9759,14,9761,9761,14,9764,9765,14,9767,9769,14,9771,9773,14,9775,9775,14,9784,9785,14,9787,9791,14,9793,9793,14,9795,9799,14,9812,9822,14,9824,9824,14,9827,9827,14,9829,9830,14,9832,9832,14,9851,9851,14,9854,9854,14,9856,9861,14,9874,9874,14,9876,9876,14,9878,9879,14,9881,9881,14,9883,9884,14,9888,9889,14,9895,9895,14,9898,9899,14,9904,9905,14,9917,9918,14,9924,9925,14,9928,9928,14,9934,9934,14,9936,9936,14,9938,9938,14,9940,9940,14,9961,9961,14,9963,9967,14,9970,9971,14,9973,9973,14,9975,9977,14,9979,9980,14,9982,9985,14,9987,9988,14,9992,9996,14,9998,9998,14,10000,10001,14,10004,10004,14,10013,10013,14,10024,10024,14,10052,10052,14,10060,10060,14,10067,10069,14,10083,10083,14,10085,10087,14,10145,10145,14,10175,10175,14,11013,11015,14,11088,11088,14,11503,11505,5,11744,11775,5,12334,12335,5,12349,12349,14,12951,12951,14,42607,42607,5,42612,42621,5,42736,42737,5,43014,43014,5,43043,43044,7,43047,43047,7,43136,43137,7,43204,43205,5,43263,43263,5,43335,43345,5,43360,43388,8,43395,43395,7,43444,43445,7,43450,43451,7,43454,43456,7,43561,43566,5,43569,43570,5,43573,43574,5,43596,43596,5,43644,43644,5,43698,43700,5,43710,43711,5,43755,43755,7,43758,43759,7,43766,43766,5,44005,44005,5,44008,44008,5,44012,44012,7,44032,44032,11,44060,44060,11,44088,44088,11,44116,44116,11,44144,44144,11,44172,44172,11,44200,44200,11,44228,44228,11,44256,44256,11,44284,44284,11,44312,44312,11,44340,44340,11,44368,44368,11,44396,44396,11,44424,44424,11,44452,44452,11,44480,44480,11,44508,44508,11,44536,44536,11,44564,44564,11,44592,44592,11,44620,44620,11,44648,44648,11,44676,44676,11,44704,44704,11,44732,44732,11,44760,44760,11,44788,44788,11,44816,44816,11,44844,44844,11,44872,44872,11,44900,44900,11,44928,44928,11,44956,44956,11,44984,44984,11,45012,45012,11,45040,45040,11,45068,45068,11,45096,45096,11,45124,45124,11,45152,45152,11,45180,45180,11,45208,45208,11,45236,45236,11,45264,45264,11,45292,45292,11,45320,45320,11,45348,45348,11,45376,45376,11,45404,45404,11,45432,45432,11,45460,45460,11,45488,45488,11,45516,45516,11,45544,45544,11,45572,45572,11,45600,45600,11,45628,45628,11,45656,45656,11,45684,45684,11,45712,45712,11,45740,45740,11,45768,45768,11,45796,45796,11,45824,45824,11,45852,45852,11,45880,45880,11,45908,45908,11,45936,45936,11,45964,45964,11,45992,45992,11,46020,46020,11,46048,46048,11,46076,46076,11,46104,46104,11,46132,46132,11,46160,46160,11,46188,46188,11,46216,46216,11,46244,46244,11,46272,46272,11,46300,46300,11,46328,46328,11,46356,46356,11,46384,46384,11,46412,46412,11,46440,46440,11,46468,46468,11,46496,46496,11,46524,46524,11,46552,46552,11,46580,46580,11,46608,46608,11,46636,46636,11,46664,46664,11,46692,46692,11,46720,46720,11,46748,46748,11,46776,46776,11,46804,46804,11,46832,46832,11,46860,46860,11,46888,46888,11,46916,46916,11,46944,46944,11,46972,46972,11,47000,47000,11,47028,47028,11,47056,47056,11,47084,47084,11,47112,47112,11,47140,47140,11,47168,47168,11,47196,47196,11,47224,47224,11,47252,47252,11,47280,47280,11,47308,47308,11,47336,47336,11,47364,47364,11,47392,47392,11,47420,47420,11,47448,47448,11,47476,47476,11,47504,47504,11,47532,47532,11,47560,47560,11,47588,47588,11,47616,47616,11,47644,47644,11,47672,47672,11,47700,47700,11,47728,47728,11,47756,47756,11,47784,47784,11,47812,47812,11,47840,47840,11,47868,47868,11,47896,47896,11,47924,47924,11,47952,47952,11,47980,47980,11,48008,48008,11,48036,48036,11,48064,48064,11,48092,48092,11,48120,48120,11,48148,48148,11,48176,48176,11,48204,48204,11,48232,48232,11,48260,48260,11,48288,48288,11,48316,48316,11,48344,48344,11,48372,48372,11,48400,48400,11,48428,48428,11,48456,48456,11,48484,48484,11,48512,48512,11,48540,48540,11,48568,48568,11,48596,48596,11,48624,48624,11,48652,48652,11,48680,48680,11,48708,48708,11,48736,48736,11,48764,48764,11,48792,48792,11,48820,48820,11,48848,48848,11,48876,48876,11,48904,48904,11,48932,48932,11,48960,48960,11,48988,48988,11,49016,49016,11,49044,49044,11,49072,49072,11,49100,49100,11,49128,49128,11,49156,49156,11,49184,49184,11,49212,49212,11,49240,49240,11,49268,49268,11,49296,49296,11,49324,49324,11,49352,49352,11,49380,49380,11,49408,49408,11,49436,49436,11,49464,49464,11,49492,49492,11,49520,49520,11,49548,49548,11,49576,49576,11,49604,49604,11,49632,49632,11,49660,49660,11,49688,49688,11,49716,49716,11,49744,49744,11,49772,49772,11,49800,49800,11,49828,49828,11,49856,49856,11,49884,49884,11,49912,49912,11,49940,49940,11,49968,49968,11,49996,49996,11,50024,50024,11,50052,50052,11,50080,50080,11,50108,50108,11,50136,50136,11,50164,50164,11,50192,50192,11,50220,50220,11,50248,50248,11,50276,50276,11,50304,50304,11,50332,50332,11,50360,50360,11,50388,50388,11,50416,50416,11,50444,50444,11,50472,50472,11,50500,50500,11,50528,50528,11,50556,50556,11,50584,50584,11,50612,50612,11,50640,50640,11,50668,50668,11,50696,50696,11,50724,50724,11,50752,50752,11,50780,50780,11,50808,50808,11,50836,50836,11,50864,50864,11,50892,50892,11,50920,50920,11,50948,50948,11,50976,50976,11,51004,51004,11,51032,51032,11,51060,51060,11,51088,51088,11,51116,51116,11,51144,51144,11,51172,51172,11,51200,51200,11,51228,51228,11,51256,51256,11,51284,51284,11,51312,51312,11,51340,51340,11,51368,51368,11,51396,51396,11,51424,51424,11,51452,51452,11,51480,51480,11,51508,51508,11,51536,51536,11,51564,51564,11,51592,51592,11,51620,51620,11,51648,51648,11,51676,51676,11,51704,51704,11,51732,51732,11,51760,51760,11,51788,51788,11,51816,51816,11,51844,51844,11,51872,51872,11,51900,51900,11,51928,51928,11,51956,51956,11,51984,51984,11,52012,52012,11,52040,52040,11,52068,52068,11,52096,52096,11,52124,52124,11,52152,52152,11,52180,52180,11,52208,52208,11,52236,52236,11,52264,52264,11,52292,52292,11,52320,52320,11,52348,52348,11,52376,52376,11,52404,52404,11,52432,52432,11,52460,52460,11,52488,52488,11,52516,52516,11,52544,52544,11,52572,52572,11,52600,52600,11,52628,52628,11,52656,52656,11,52684,52684,11,52712,52712,11,52740,52740,11,52768,52768,11,52796,52796,11,52824,52824,11,52852,52852,11,52880,52880,11,52908,52908,11,52936,52936,11,52964,52964,11,52992,52992,11,53020,53020,11,53048,53048,11,53076,53076,11,53104,53104,11,53132,53132,11,53160,53160,11,53188,53188,11,53216,53216,11,53244,53244,11,53272,53272,11,53300,53300,11,53328,53328,11,53356,53356,11,53384,53384,11,53412,53412,11,53440,53440,11,53468,53468,11,53496,53496,11,53524,53524,11,53552,53552,11,53580,53580,11,53608,53608,11,53636,53636,11,53664,53664,11,53692,53692,11,53720,53720,11,53748,53748,11,53776,53776,11,53804,53804,11,53832,53832,11,53860,53860,11,53888,53888,11,53916,53916,11,53944,53944,11,53972,53972,11,54000,54000,11,54028,54028,11,54056,54056,11,54084,54084,11,54112,54112,11,54140,54140,11,54168,54168,11,54196,54196,11,54224,54224,11,54252,54252,11,54280,54280,11,54308,54308,11,54336,54336,11,54364,54364,11,54392,54392,11,54420,54420,11,54448,54448,11,54476,54476,11,54504,54504,11,54532,54532,11,54560,54560,11,54588,54588,11,54616,54616,11,54644,54644,11,54672,54672,11,54700,54700,11,54728,54728,11,54756,54756,11,54784,54784,11,54812,54812,11,54840,54840,11,54868,54868,11,54896,54896,11,54924,54924,11,54952,54952,11,54980,54980,11,55008,55008,11,55036,55036,11,55064,55064,11,55092,55092,11,55120,55120,11,55148,55148,11,55176,55176,11,55216,55238,9,64286,64286,5,65056,65071,5,65438,65439,5,65529,65531,4,66272,66272,5,68097,68099,5,68108,68111,5,68159,68159,5,68900,68903,5,69446,69456,5,69632,69632,7,69634,69634,7,69744,69744,5,69759,69761,5,69808,69810,7,69815,69816,7,69821,69821,1,69837,69837,1,69927,69931,5,69933,69940,5,70003,70003,5,70018,70018,7,70070,70078,5,70082,70083,1,70094,70094,7,70188,70190,7,70194,70195,7,70197,70197,7,70206,70206,5,70368,70370,7,70400,70401,5,70459,70460,5,70463,70463,7,70465,70468,7,70475,70477,7,70498,70499,7,70512,70516,5,70712,70719,5,70722,70724,5,70726,70726,5,70832,70832,5,70835,70840,5,70842,70842,5,70845,70845,5,70847,70848,5,70850,70851,5,71088,71089,7,71096,71099,7,71102,71102,7,71132,71133,5,71219,71226,5,71229,71229,5,71231,71232,5,71340,71340,7,71342,71343,7,71350,71350,7,71453,71455,5,71462,71462,7,71724,71726,7,71736,71736,7,71984,71984,5,71991,71992,7,71997,71997,7,71999,71999,1,72001,72001,1,72003,72003,5,72148,72151,5,72156,72159,7,72164,72164,7,72243,72248,5,72250,72250,1,72263,72263,5,72279,72280,7,72324,72329,1,72343,72343,7,72751,72751,7,72760,72765,5,72767,72767,5,72873,72873,7,72881,72881,7,72884,72884,7,73009,73014,5,73020,73021,5,73030,73030,1,73098,73102,7,73107,73108,7,73110,73110,7,73459,73460,5,78896,78904,4,92976,92982,5,94033,94087,7,94180,94180,5,113821,113822,5,118528,118573,5,119141,119141,5,119143,119145,5,119150,119154,5,119163,119170,5,119210,119213,5,121344,121398,5,121461,121461,5,121499,121503,5,122880,122886,5,122907,122913,5,122918,122922,5,123566,123566,5,125136,125142,5,126976,126979,14,126981,127182,14,127184,127231,14,127279,127279,14,127344,127345,14,127374,127374,14,127405,127461,14,127489,127490,14,127514,127514,14,127538,127546,14,127561,127567,14,127570,127743,14,127757,127758,14,127760,127760,14,127762,127762,14,127766,127768,14,127770,127770,14,127772,127772,14,127775,127776,14,127778,127779,14,127789,127791,14,127794,127795,14,127798,127798,14,127819,127819,14,127824,127824,14,127868,127868,14,127870,127871,14,127892,127893,14,127896,127896,14,127900,127901,14,127904,127940,14,127942,127942,14,127944,127944,14,127946,127946,14,127951,127955,14,127968,127971,14,127973,127984,14,127987,127987,14,127989,127989,14,127991,127991,14,127995,127999,5,128008,128008,14,128012,128014,14,128017,128018,14,128020,128020,14,128022,128022,14,128042,128042,14,128063,128063,14,128065,128065,14,128101,128101,14,128108,128109,14,128173,128173,14,128182,128183,14,128236,128237,14,128239,128239,14,128245,128245,14,128248,128248,14,128253,128253,14,128255,128258,14,128260,128263,14,128265,128265,14,128277,128277,14,128300,128301,14,128326,128328,14,128331,128334,14,128336,128347,14,128360,128366,14,128369,128370,14,128378,128378,14,128391,128391,14,128394,128397,14,128400,128400,14,128405,128406,14,128420,128420,14,128422,128423,14,128425,128432,14,128435,128443,14,128445,128449,14,128453,128464,14,128468,128475,14,128479,128480,14,128482,128482,14,128484,128487,14,128489,128494,14,128496,128498,14,128500,128505,14,128507,128511,14,128513,128518,14,128521,128525,14,128527,128527,14,128529,128529,14,128533,128533,14,128535,128535,14,128537,128537,14]")}function _e(k,I){if(k===0)return 0;const V=ye(k,I);if(V!==void 0)return V;const H=new q(I,k);return H.prevCodePoint(),H.offset}function ye(k,I){const V=new q(I,k);let H=V.prevCodePoint();for(;Ee(H)||H===65039||H===8419;){if(V.offset===0)return;H=V.prevCodePoint()}if(!pe(H))return;let Y=V.offset;return Y>0&&V.prevCodePoint()===8205&&(Y=V.offset),Y}function Ee(k){return 127995<=k&&k<=127999}n.noBreakWhitespace="\xA0";class K{static{this.ambiguousCharacterData=new x.Lazy(()=>JSON.parse('{"_common":[8232,32,8233,32,5760,32,8192,32,8193,32,8194,32,8195,32,8196,32,8197,32,8198,32,8200,32,8201,32,8202,32,8287,32,8199,32,8239,32,2042,95,65101,95,65102,95,65103,95,8208,45,8209,45,8210,45,65112,45,1748,45,8259,45,727,45,8722,45,10134,45,11450,45,1549,44,1643,44,8218,44,184,44,42233,44,894,59,2307,58,2691,58,1417,58,1795,58,1796,58,5868,58,65072,58,6147,58,6153,58,8282,58,1475,58,760,58,42889,58,8758,58,720,58,42237,58,451,33,11601,33,660,63,577,63,2429,63,5038,63,42731,63,119149,46,8228,46,1793,46,1794,46,42510,46,68176,46,1632,46,1776,46,42232,46,1373,96,65287,96,8219,96,8242,96,1370,96,1523,96,8175,96,65344,96,900,96,8189,96,8125,96,8127,96,8190,96,697,96,884,96,712,96,714,96,715,96,756,96,699,96,701,96,700,96,702,96,42892,96,1497,96,2036,96,2037,96,5194,96,5836,96,94033,96,94034,96,65339,91,10088,40,10098,40,12308,40,64830,40,65341,93,10089,41,10099,41,12309,41,64831,41,10100,123,119060,123,10101,125,65342,94,8270,42,1645,42,8727,42,66335,42,5941,47,8257,47,8725,47,8260,47,9585,47,10187,47,10744,47,119354,47,12755,47,12339,47,11462,47,20031,47,12035,47,65340,92,65128,92,8726,92,10189,92,10741,92,10745,92,119311,92,119355,92,12756,92,20022,92,12034,92,42872,38,708,94,710,94,5869,43,10133,43,66203,43,8249,60,10094,60,706,60,119350,60,5176,60,5810,60,5120,61,11840,61,12448,61,42239,61,8250,62,10095,62,707,62,119351,62,5171,62,94015,62,8275,126,732,126,8128,126,8764,126,65372,124,65293,45,120784,50,120794,50,120804,50,120814,50,120824,50,130034,50,42842,50,423,50,1000,50,42564,50,5311,50,42735,50,119302,51,120785,51,120795,51,120805,51,120815,51,120825,51,130035,51,42923,51,540,51,439,51,42858,51,11468,51,1248,51,94011,51,71882,51,120786,52,120796,52,120806,52,120816,52,120826,52,130036,52,5070,52,71855,52,120787,53,120797,53,120807,53,120817,53,120827,53,130037,53,444,53,71867,53,120788,54,120798,54,120808,54,120818,54,120828,54,130038,54,11474,54,5102,54,71893,54,119314,55,120789,55,120799,55,120809,55,120819,55,120829,55,130039,55,66770,55,71878,55,2819,56,2538,56,2666,56,125131,56,120790,56,120800,56,120810,56,120820,56,120830,56,130040,56,547,56,546,56,66330,56,2663,57,2920,57,2541,57,3437,57,120791,57,120801,57,120811,57,120821,57,120831,57,130041,57,42862,57,11466,57,71884,57,71852,57,71894,57,9082,97,65345,97,119834,97,119886,97,119938,97,119990,97,120042,97,120094,97,120146,97,120198,97,120250,97,120302,97,120354,97,120406,97,120458,97,593,97,945,97,120514,97,120572,97,120630,97,120688,97,120746,97,65313,65,119808,65,119860,65,119912,65,119964,65,120016,65,120068,65,120120,65,120172,65,120224,65,120276,65,120328,65,120380,65,120432,65,913,65,120488,65,120546,65,120604,65,120662,65,120720,65,5034,65,5573,65,42222,65,94016,65,66208,65,119835,98,119887,98,119939,98,119991,98,120043,98,120095,98,120147,98,120199,98,120251,98,120303,98,120355,98,120407,98,120459,98,388,98,5071,98,5234,98,5551,98,65314,66,8492,66,119809,66,119861,66,119913,66,120017,66,120069,66,120121,66,120173,66,120225,66,120277,66,120329,66,120381,66,120433,66,42932,66,914,66,120489,66,120547,66,120605,66,120663,66,120721,66,5108,66,5623,66,42192,66,66178,66,66209,66,66305,66,65347,99,8573,99,119836,99,119888,99,119940,99,119992,99,120044,99,120096,99,120148,99,120200,99,120252,99,120304,99,120356,99,120408,99,120460,99,7428,99,1010,99,11429,99,43951,99,66621,99,128844,67,71922,67,71913,67,65315,67,8557,67,8450,67,8493,67,119810,67,119862,67,119914,67,119966,67,120018,67,120174,67,120226,67,120278,67,120330,67,120382,67,120434,67,1017,67,11428,67,5087,67,42202,67,66210,67,66306,67,66581,67,66844,67,8574,100,8518,100,119837,100,119889,100,119941,100,119993,100,120045,100,120097,100,120149,100,120201,100,120253,100,120305,100,120357,100,120409,100,120461,100,1281,100,5095,100,5231,100,42194,100,8558,68,8517,68,119811,68,119863,68,119915,68,119967,68,120019,68,120071,68,120123,68,120175,68,120227,68,120279,68,120331,68,120383,68,120435,68,5024,68,5598,68,5610,68,42195,68,8494,101,65349,101,8495,101,8519,101,119838,101,119890,101,119942,101,120046,101,120098,101,120150,101,120202,101,120254,101,120306,101,120358,101,120410,101,120462,101,43826,101,1213,101,8959,69,65317,69,8496,69,119812,69,119864,69,119916,69,120020,69,120072,69,120124,69,120176,69,120228,69,120280,69,120332,69,120384,69,120436,69,917,69,120492,69,120550,69,120608,69,120666,69,120724,69,11577,69,5036,69,42224,69,71846,69,71854,69,66182,69,119839,102,119891,102,119943,102,119995,102,120047,102,120099,102,120151,102,120203,102,120255,102,120307,102,120359,102,120411,102,120463,102,43829,102,42905,102,383,102,7837,102,1412,102,119315,70,8497,70,119813,70,119865,70,119917,70,120021,70,120073,70,120125,70,120177,70,120229,70,120281,70,120333,70,120385,70,120437,70,42904,70,988,70,120778,70,5556,70,42205,70,71874,70,71842,70,66183,70,66213,70,66853,70,65351,103,8458,103,119840,103,119892,103,119944,103,120048,103,120100,103,120152,103,120204,103,120256,103,120308,103,120360,103,120412,103,120464,103,609,103,7555,103,397,103,1409,103,119814,71,119866,71,119918,71,119970,71,120022,71,120074,71,120126,71,120178,71,120230,71,120282,71,120334,71,120386,71,120438,71,1292,71,5056,71,5107,71,42198,71,65352,104,8462,104,119841,104,119945,104,119997,104,120049,104,120101,104,120153,104,120205,104,120257,104,120309,104,120361,104,120413,104,120465,104,1211,104,1392,104,5058,104,65320,72,8459,72,8460,72,8461,72,119815,72,119867,72,119919,72,120023,72,120179,72,120231,72,120283,72,120335,72,120387,72,120439,72,919,72,120494,72,120552,72,120610,72,120668,72,120726,72,11406,72,5051,72,5500,72,42215,72,66255,72,731,105,9075,105,65353,105,8560,105,8505,105,8520,105,119842,105,119894,105,119946,105,119998,105,120050,105,120102,105,120154,105,120206,105,120258,105,120310,105,120362,105,120414,105,120466,105,120484,105,618,105,617,105,953,105,8126,105,890,105,120522,105,120580,105,120638,105,120696,105,120754,105,1110,105,42567,105,1231,105,43893,105,5029,105,71875,105,65354,106,8521,106,119843,106,119895,106,119947,106,119999,106,120051,106,120103,106,120155,106,120207,106,120259,106,120311,106,120363,106,120415,106,120467,106,1011,106,1112,106,65322,74,119817,74,119869,74,119921,74,119973,74,120025,74,120077,74,120129,74,120181,74,120233,74,120285,74,120337,74,120389,74,120441,74,42930,74,895,74,1032,74,5035,74,5261,74,42201,74,119844,107,119896,107,119948,107,120000,107,120052,107,120104,107,120156,107,120208,107,120260,107,120312,107,120364,107,120416,107,120468,107,8490,75,65323,75,119818,75,119870,75,119922,75,119974,75,120026,75,120078,75,120130,75,120182,75,120234,75,120286,75,120338,75,120390,75,120442,75,922,75,120497,75,120555,75,120613,75,120671,75,120729,75,11412,75,5094,75,5845,75,42199,75,66840,75,1472,108,8739,73,9213,73,65512,73,1633,108,1777,73,66336,108,125127,108,120783,73,120793,73,120803,73,120813,73,120823,73,130033,73,65321,73,8544,73,8464,73,8465,73,119816,73,119868,73,119920,73,120024,73,120128,73,120180,73,120232,73,120284,73,120336,73,120388,73,120440,73,65356,108,8572,73,8467,108,119845,108,119897,108,119949,108,120001,108,120053,108,120105,73,120157,73,120209,73,120261,73,120313,73,120365,73,120417,73,120469,73,448,73,120496,73,120554,73,120612,73,120670,73,120728,73,11410,73,1030,73,1216,73,1493,108,1503,108,1575,108,126464,108,126592,108,65166,108,65165,108,1994,108,11599,73,5825,73,42226,73,93992,73,66186,124,66313,124,119338,76,8556,76,8466,76,119819,76,119871,76,119923,76,120027,76,120079,76,120131,76,120183,76,120235,76,120287,76,120339,76,120391,76,120443,76,11472,76,5086,76,5290,76,42209,76,93974,76,71843,76,71858,76,66587,76,66854,76,65325,77,8559,77,8499,77,119820,77,119872,77,119924,77,120028,77,120080,77,120132,77,120184,77,120236,77,120288,77,120340,77,120392,77,120444,77,924,77,120499,77,120557,77,120615,77,120673,77,120731,77,1018,77,11416,77,5047,77,5616,77,5846,77,42207,77,66224,77,66321,77,119847,110,119899,110,119951,110,120003,110,120055,110,120107,110,120159,110,120211,110,120263,110,120315,110,120367,110,120419,110,120471,110,1400,110,1404,110,65326,78,8469,78,119821,78,119873,78,119925,78,119977,78,120029,78,120081,78,120185,78,120237,78,120289,78,120341,78,120393,78,120445,78,925,78,120500,78,120558,78,120616,78,120674,78,120732,78,11418,78,42208,78,66835,78,3074,111,3202,111,3330,111,3458,111,2406,111,2662,111,2790,111,3046,111,3174,111,3302,111,3430,111,3664,111,3792,111,4160,111,1637,111,1781,111,65359,111,8500,111,119848,111,119900,111,119952,111,120056,111,120108,111,120160,111,120212,111,120264,111,120316,111,120368,111,120420,111,120472,111,7439,111,7441,111,43837,111,959,111,120528,111,120586,111,120644,111,120702,111,120760,111,963,111,120532,111,120590,111,120648,111,120706,111,120764,111,11423,111,4351,111,1413,111,1505,111,1607,111,126500,111,126564,111,126596,111,65259,111,65260,111,65258,111,65257,111,1726,111,64428,111,64429,111,64427,111,64426,111,1729,111,64424,111,64425,111,64423,111,64422,111,1749,111,3360,111,4125,111,66794,111,71880,111,71895,111,66604,111,1984,79,2534,79,2918,79,12295,79,70864,79,71904,79,120782,79,120792,79,120802,79,120812,79,120822,79,130032,79,65327,79,119822,79,119874,79,119926,79,119978,79,120030,79,120082,79,120134,79,120186,79,120238,79,120290,79,120342,79,120394,79,120446,79,927,79,120502,79,120560,79,120618,79,120676,79,120734,79,11422,79,1365,79,11604,79,4816,79,2848,79,66754,79,42227,79,71861,79,66194,79,66219,79,66564,79,66838,79,9076,112,65360,112,119849,112,119901,112,119953,112,120005,112,120057,112,120109,112,120161,112,120213,112,120265,112,120317,112,120369,112,120421,112,120473,112,961,112,120530,112,120544,112,120588,112,120602,112,120646,112,120660,112,120704,112,120718,112,120762,112,120776,112,11427,112,65328,80,8473,80,119823,80,119875,80,119927,80,119979,80,120031,80,120083,80,120187,80,120239,80,120291,80,120343,80,120395,80,120447,80,929,80,120504,80,120562,80,120620,80,120678,80,120736,80,11426,80,5090,80,5229,80,42193,80,66197,80,119850,113,119902,113,119954,113,120006,113,120058,113,120110,113,120162,113,120214,113,120266,113,120318,113,120370,113,120422,113,120474,113,1307,113,1379,113,1382,113,8474,81,119824,81,119876,81,119928,81,119980,81,120032,81,120084,81,120188,81,120240,81,120292,81,120344,81,120396,81,120448,81,11605,81,119851,114,119903,114,119955,114,120007,114,120059,114,120111,114,120163,114,120215,114,120267,114,120319,114,120371,114,120423,114,120475,114,43847,114,43848,114,7462,114,11397,114,43905,114,119318,82,8475,82,8476,82,8477,82,119825,82,119877,82,119929,82,120033,82,120189,82,120241,82,120293,82,120345,82,120397,82,120449,82,422,82,5025,82,5074,82,66740,82,5511,82,42211,82,94005,82,65363,115,119852,115,119904,115,119956,115,120008,115,120060,115,120112,115,120164,115,120216,115,120268,115,120320,115,120372,115,120424,115,120476,115,42801,115,445,115,1109,115,43946,115,71873,115,66632,115,65331,83,119826,83,119878,83,119930,83,119982,83,120034,83,120086,83,120138,83,120190,83,120242,83,120294,83,120346,83,120398,83,120450,83,1029,83,1359,83,5077,83,5082,83,42210,83,94010,83,66198,83,66592,83,119853,116,119905,116,119957,116,120009,116,120061,116,120113,116,120165,116,120217,116,120269,116,120321,116,120373,116,120425,116,120477,116,8868,84,10201,84,128872,84,65332,84,119827,84,119879,84,119931,84,119983,84,120035,84,120087,84,120139,84,120191,84,120243,84,120295,84,120347,84,120399,84,120451,84,932,84,120507,84,120565,84,120623,84,120681,84,120739,84,11430,84,5026,84,42196,84,93962,84,71868,84,66199,84,66225,84,66325,84,119854,117,119906,117,119958,117,120010,117,120062,117,120114,117,120166,117,120218,117,120270,117,120322,117,120374,117,120426,117,120478,117,42911,117,7452,117,43854,117,43858,117,651,117,965,117,120534,117,120592,117,120650,117,120708,117,120766,117,1405,117,66806,117,71896,117,8746,85,8899,85,119828,85,119880,85,119932,85,119984,85,120036,85,120088,85,120140,85,120192,85,120244,85,120296,85,120348,85,120400,85,120452,85,1357,85,4608,85,66766,85,5196,85,42228,85,94018,85,71864,85,8744,118,8897,118,65366,118,8564,118,119855,118,119907,118,119959,118,120011,118,120063,118,120115,118,120167,118,120219,118,120271,118,120323,118,120375,118,120427,118,120479,118,7456,118,957,118,120526,118,120584,118,120642,118,120700,118,120758,118,1141,118,1496,118,71430,118,43945,118,71872,118,119309,86,1639,86,1783,86,8548,86,119829,86,119881,86,119933,86,119985,86,120037,86,120089,86,120141,86,120193,86,120245,86,120297,86,120349,86,120401,86,120453,86,1140,86,11576,86,5081,86,5167,86,42719,86,42214,86,93960,86,71840,86,66845,86,623,119,119856,119,119908,119,119960,119,120012,119,120064,119,120116,119,120168,119,120220,119,120272,119,120324,119,120376,119,120428,119,120480,119,7457,119,1121,119,1309,119,1377,119,71434,119,71438,119,71439,119,43907,119,71919,87,71910,87,119830,87,119882,87,119934,87,119986,87,120038,87,120090,87,120142,87,120194,87,120246,87,120298,87,120350,87,120402,87,120454,87,1308,87,5043,87,5076,87,42218,87,5742,120,10539,120,10540,120,10799,120,65368,120,8569,120,119857,120,119909,120,119961,120,120013,120,120065,120,120117,120,120169,120,120221,120,120273,120,120325,120,120377,120,120429,120,120481,120,5441,120,5501,120,5741,88,9587,88,66338,88,71916,88,65336,88,8553,88,119831,88,119883,88,119935,88,119987,88,120039,88,120091,88,120143,88,120195,88,120247,88,120299,88,120351,88,120403,88,120455,88,42931,88,935,88,120510,88,120568,88,120626,88,120684,88,120742,88,11436,88,11613,88,5815,88,42219,88,66192,88,66228,88,66327,88,66855,88,611,121,7564,121,65369,121,119858,121,119910,121,119962,121,120014,121,120066,121,120118,121,120170,121,120222,121,120274,121,120326,121,120378,121,120430,121,120482,121,655,121,7935,121,43866,121,947,121,8509,121,120516,121,120574,121,120632,121,120690,121,120748,121,1199,121,4327,121,71900,121,65337,89,119832,89,119884,89,119936,89,119988,89,120040,89,120092,89,120144,89,120196,89,120248,89,120300,89,120352,89,120404,89,120456,89,933,89,978,89,120508,89,120566,89,120624,89,120682,89,120740,89,11432,89,1198,89,5033,89,5053,89,42220,89,94019,89,71844,89,66226,89,119859,122,119911,122,119963,122,120015,122,120067,122,120119,122,120171,122,120223,122,120275,122,120327,122,120379,122,120431,122,120483,122,7458,122,43923,122,71876,122,66293,90,71909,90,65338,90,8484,90,8488,90,119833,90,119885,90,119937,90,119989,90,120041,90,120197,90,120249,90,120301,90,120353,90,120405,90,120457,90,918,90,120493,90,120551,90,120609,90,120667,90,120725,90,5059,90,42204,90,71849,90,65282,34,65284,36,65285,37,65286,38,65290,42,65291,43,65294,46,65295,47,65296,48,65297,49,65298,50,65299,51,65300,52,65301,53,65302,54,65303,55,65304,56,65305,57,65308,60,65309,61,65310,62,65312,64,65316,68,65318,70,65319,71,65324,76,65329,81,65330,82,65333,85,65334,86,65335,87,65343,95,65346,98,65348,100,65350,102,65355,107,65357,109,65358,110,65361,113,65362,114,65364,116,65365,117,65367,119,65370,122,65371,123,65373,125,119846,109],"_default":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"cs":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"de":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"es":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"fr":[65374,126,65306,58,65281,33,8216,96,8245,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"it":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"ja":[8211,45,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65292,44,65307,59],"ko":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"pl":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"pt-BR":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"qps-ploc":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"ru":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,305,105,921,73,1009,112,215,120,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"tr":[160,32,8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"zh-hans":[65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41],"zh-hant":[8211,45,65374,126,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65307,59]}'))}static{this.cache=new i.LRUCachedFunction({getCacheKey:JSON.stringify},I=>{function V(se){const ce=new Map;for(let he=0;he!se.startsWith("_")&&se in te);ne.length===0&&(ne=["_default"]);let ae;for(const se of ne){const ce=V(te[se]);ae=Y(ae,ce)}const le=V(te._common),oe=H(le,ae);return new K(oe)})}static getInstance(I){return K.cache.get(Array.from(I))}static{this._locales=new x.Lazy(()=>Object.keys(K.ambiguousCharacterData.value).filter(I=>!I.startsWith("_")))}static getLocales(){return K._locales.value}constructor(I){this.confusableDictionary=I}isAmbiguous(I){return this.confusableDictionary.has(I)}getPrimaryConfusable(I){return this.confusableDictionary.get(I)}getConfusableCodePoints(){return new Set(this.confusableDictionary.keys())}}n.AmbiguousCharacters=K;class Q{static getRawData(){return JSON.parse("[9,10,11,12,13,32,127,160,173,847,1564,4447,4448,6068,6069,6155,6156,6157,6158,7355,7356,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8234,8235,8236,8237,8238,8239,8287,8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,10240,12288,12644,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65279,65440,65520,65521,65522,65523,65524,65525,65526,65527,65528,65532,78844,119155,119156,119157,119158,119159,119160,119161,119162,917504,917505,917506,917507,917508,917509,917510,917511,917512,917513,917514,917515,917516,917517,917518,917519,917520,917521,917522,917523,917524,917525,917526,917527,917528,917529,917530,917531,917532,917533,917534,917535,917536,917537,917538,917539,917540,917541,917542,917543,917544,917545,917546,917547,917548,917549,917550,917551,917552,917553,917554,917555,917556,917557,917558,917559,917560,917561,917562,917563,917564,917565,917566,917567,917568,917569,917570,917571,917572,917573,917574,917575,917576,917577,917578,917579,917580,917581,917582,917583,917584,917585,917586,917587,917588,917589,917590,917591,917592,917593,917594,917595,917596,917597,917598,917599,917600,917601,917602,917603,917604,917605,917606,917607,917608,917609,917610,917611,917612,917613,917614,917615,917616,917617,917618,917619,917620,917621,917622,917623,917624,917625,917626,917627,917628,917629,917630,917631,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999]")}static{this._data=void 0}static getData(){return this._data||(this._data=new Set(Q.getRawData())),this._data}static isInvisibleCharacter(I){return Q.getData().has(I)}static get codePoints(){return Q.getData()}}n.InvisibleCharacters=Q}),X(J[44],Z([0,1,6]),function(W,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.StringSHA1=void 0,n.hash=x,n.doHash=A,n.numberHash=d,n.stringHash=p,n.toHexString=r;function x(o){return A(o,0)}function A(o,u){switch(typeof o){case"object":return o===null?d(349,u):Array.isArray(o)?c(o,u):a(o,u);case"string":return p(o,u);case"boolean":return f(o,u);case"number":return d(o,u);case"undefined":return d(937,u);default:return d(617,u)}}function d(o,u){return(u<<5)-u+o|0}function f(o,u){return d(o?433:863,u)}function p(o,u){u=d(149417,u);for(let S=0,L=o.length;SA(L,S),u)}function a(o,u){return u=d(181387,u),Object.keys(o).sort().reduce((S,L)=>(S=p(L,S),A(o[L],S)),u)}function m(o,u,S=32){const L=S-u,N=~((1<>>L)>>>0}function e(o,u=0,S=o.byteLength,L=0){for(let N=0;NS.toString(16).padStart(2,"0")).join(""):h((o>>>0).toString(16),u/4)}class s{static{this._bigBlock32=new DataView(new ArrayBuffer(320))}constructor(){this._h0=1732584193,this._h1=4023233417,this._h2=2562383102,this._h3=271733878,this._h4=3285377520,this._buff=new Uint8Array(67),this._buffDV=new DataView(this._buff.buffer),this._buffLen=0,this._totalLen=0,this._leftoverHighSurrogate=0,this._finished=!1}update(u){const S=u.length;if(S===0)return;const L=this._buff;let N=this._buffLen,P=this._leftoverHighSurrogate,E,v;for(P!==0?(E=P,v=-1,P=0):(E=u.charCodeAt(0),v=0);;){let l=E;if(i.isHighSurrogate(E))if(v+1>>6,u[S++]=128|(L&63)>>>0):L<65536?(u[S++]=224|(L&61440)>>>12,u[S++]=128|(L&4032)>>>6,u[S++]=128|(L&63)>>>0):(u[S++]=240|(L&1835008)>>>18,u[S++]=128|(L&258048)>>>12,u[S++]=128|(L&4032)>>>6,u[S++]=128|(L&63)>>>0),S>=64&&(this._step(),S-=64,this._totalLen+=64,u[0]=u[64],u[1]=u[65],u[2]=u[66]),S}digest(){return this._finished||(this._finished=!0,this._leftoverHighSurrogate&&(this._leftoverHighSurrogate=0,this._buffLen=this._push(this._buff,this._buffLen,65533)),this._totalLen+=this._buffLen,this._wrapUp()),r(this._h0)+r(this._h1)+r(this._h2)+r(this._h3)+r(this._h4)}_wrapUp(){this._buff[this._buffLen++]=128,e(this._buff,this._buffLen),this._buffLen>56&&(this._step(),e(this._buff));const u=8*this._totalLen;this._buffDV.setUint32(56,Math.floor(u/4294967296),!1),this._buffDV.setUint32(60,u%4294967296,!1),this._step()}_step(){const u=s._bigBlock32,S=this._buffDV;for(let w=0;w<64;w+=4)u.setUint32(w,S.getUint32(w,!1),!1);for(let w=64;w<320;w+=4)u.setUint32(w,m(u.getUint32(w-12,!1)^u.getUint32(w-32,!1)^u.getUint32(w-56,!1)^u.getUint32(w-64,!1),1),!1);let L=this._h0,N=this._h1,P=this._h2,E=this._h3,v=this._h4,l,b,g;for(let w=0;w<80;w++)w<20?(l=N&P|~N&E,b=1518500249):w<40?(l=N^P^E,b=1859775393):w<60?(l=N&P|N&E|P&E,b=2400959708):(l=N^P^E,b=3395469782),g=m(L,5)+l+v+b+u.getUint32(w*4,!1)&4294967295,v=E,E=P,P=m(N,30),N=L,L=g;this._h0=this._h0+L&4294967295,this._h1=this._h1+N&4294967295,this._h2=this._h2+P&4294967295,this._h3=this._h3+E&4294967295,this._h4=this._h4+v&4294967295}}n.StringSHA1=s}),X(J[24],Z([0,1,41,44]),function(W,n,i,x){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.LcsDiff=n.StringDiffSequence=void 0,n.stringDiff=d;class A{constructor(e){this.source=e}getElements(){const e=this.source,h=new Int32Array(e.length);for(let r=0,s=e.length;r0||this.m_modifiedCount>0)&&this.m_changes.push(new i.DiffChange(this.m_originalStart,this.m_originalCount,this.m_modifiedStart,this.m_modifiedCount)),this.m_originalCount=0,this.m_modifiedCount=0,this.m_originalStart=1073741824,this.m_modifiedStart=1073741824}AddOriginalElement(e,h){this.m_originalStart=Math.min(this.m_originalStart,e),this.m_modifiedStart=Math.min(this.m_modifiedStart,h),this.m_originalCount++}AddModifiedElement(e,h){this.m_originalStart=Math.min(this.m_originalStart,e),this.m_modifiedStart=Math.min(this.m_modifiedStart,h),this.m_modifiedCount++}getChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes}getReverseChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes.reverse(),this.m_changes}}class a{constructor(e,h,r=null){this.ContinueProcessingPredicate=r,this._originalSequence=e,this._modifiedSequence=h;const[s,o,u]=a._getElements(e),[S,L,N]=a._getElements(h);this._hasStrings=u&&N,this._originalStringElements=s,this._originalElementsOrHash=o,this._modifiedStringElements=S,this._modifiedElementsOrHash=L,this.m_forwardHistory=[],this.m_reverseHistory=[]}static _isStringArray(e){return e.length>0&&typeof e[0]=="string"}static _getElements(e){const h=e.getElements();if(a._isStringArray(h)){const r=new Int32Array(h.length);for(let s=0,o=h.length;s=e&&s>=r&&this.ElementsAreEqual(h,s);)h--,s--;if(e>h||r>s){let E;return r<=s?(f.Assert(e===h+1,"originalStart should only be one more than originalEnd"),E=[new i.DiffChange(e,0,r,s-r+1)]):e<=h?(f.Assert(r===s+1,"modifiedStart should only be one more than modifiedEnd"),E=[new i.DiffChange(e,h-e+1,r,0)]):(f.Assert(e===h+1,"originalStart should only be one more than originalEnd"),f.Assert(r===s+1,"modifiedStart should only be one more than modifiedEnd"),E=[]),E}const u=[0],S=[0],L=this.ComputeRecursionPoint(e,h,r,s,u,S,o),N=u[0],P=S[0];if(L!==null)return L;if(!o[0]){const E=this.ComputeDiffRecursive(e,N,r,P,o);let v=[];return o[0]?v=[new i.DiffChange(N+1,h-(N+1)+1,P+1,s-(P+1)+1)]:v=this.ComputeDiffRecursive(N+1,h,P+1,s,o),this.ConcatenateChanges(E,v)}return[new i.DiffChange(e,h-e+1,r,s-r+1)]}WALKTRACE(e,h,r,s,o,u,S,L,N,P,E,v,l,b,g,w,M,y){let _=null,C=null,R=new c,D=h,T=r,O=l[0]-w[0]-s,z=-1073741824,j=this.m_forwardHistory.length-1;do{const F=O+e;F===D||F=0&&(N=this.m_forwardHistory[j],e=N[0],D=1,T=N.length-1)}while(--j>=-1);if(_=R.getReverseChanges(),y[0]){let F=l[0]+1,q=w[0]+1;if(_!==null&&_.length>0){const B=_[_.length-1];F=Math.max(F,B.getOriginalEnd()),q=Math.max(q,B.getModifiedEnd())}C=[new i.DiffChange(F,v-F+1,q,g-q+1)]}else{R=new c,D=u,T=S,O=l[0]-w[0]-L,z=1073741824,j=M?this.m_reverseHistory.length-1:this.m_reverseHistory.length-2;do{const F=O+o;F===D||F=P[F+1]?(E=P[F+1]-1,b=E-O-L,E>z&&R.MarkNextChange(),z=E+1,R.AddOriginalElement(E+1,b+1),O=F+1-o):(E=P[F-1],b=E-O-L,E>z&&R.MarkNextChange(),z=E,R.AddModifiedElement(E+1,b+1),O=F-1-o),j>=0&&(P=this.m_reverseHistory[j],o=P[0],D=1,T=P.length-1)}while(--j>=-1);C=R.getChanges()}return this.ConcatenateChanges(_,C)}ComputeRecursionPoint(e,h,r,s,o,u,S){let L=0,N=0,P=0,E=0,v=0,l=0;e--,r--,o[0]=0,u[0]=0,this.m_forwardHistory=[],this.m_reverseHistory=[];const b=h-e+(s-r),g=b+1,w=new Int32Array(g),M=new Int32Array(g),y=s-r,_=h-e,C=e-r,R=h-s,T=(_-y)%2===0;w[y]=e,M[_]=h,S[0]=!1;for(let O=1;O<=b/2+1;O++){let z=0,j=0;P=this.ClipDiagonalBound(y-O,O,y,g),E=this.ClipDiagonalBound(y+O,O,y,g);for(let q=P;q<=E;q+=2){q===P||qz+j&&(z=L,j=N),!T&&Math.abs(q-_)<=O-1&&L>=M[q])return o[0]=L,u[0]=N,B<=M[q]&&O<=1448?this.WALKTRACE(y,P,E,C,_,v,l,R,w,M,L,h,o,N,s,u,T,S):null}const F=(z-e+(j-r)-O)/2;if(this.ContinueProcessingPredicate!==null&&!this.ContinueProcessingPredicate(z,F))return S[0]=!0,o[0]=z,u[0]=j,F>0&&O<=1448?this.WALKTRACE(y,P,E,C,_,v,l,R,w,M,L,h,o,N,s,u,T,S):(e++,r++,[new i.DiffChange(e,h-e+1,r,s-r+1)]);v=this.ClipDiagonalBound(_-O,O,_,g),l=this.ClipDiagonalBound(_+O,O,_,g);for(let q=v;q<=l;q+=2){q===v||q=M[q+1]?L=M[q+1]-1:L=M[q-1],N=L-(q-_)-R;const B=L;for(;L>e&&N>r&&this.ElementsAreEqual(L,N);)L--,N--;if(M[q]=L,T&&Math.abs(q-y)<=O&&L<=w[q])return o[0]=L,u[0]=N,B>=w[q]&&O<=1448?this.WALKTRACE(y,P,E,C,_,v,l,R,w,M,L,h,o,N,s,u,T,S):null}if(O<=1447){let q=new Int32Array(E-P+2);q[0]=y-P+1,p.Copy2(w,P,q,1,E-P+1),this.m_forwardHistory.push(q),q=new Int32Array(l-v+2),q[0]=_-v+1,p.Copy2(M,v,q,1,l-v+1),this.m_reverseHistory.push(q)}}return this.WALKTRACE(y,P,E,C,_,v,l,R,w,M,L,h,o,N,s,u,T,S)}PrettifyChanges(e){for(let h=0;h0,S=r.modifiedLength>0;for(;r.originalStart+r.originalLength=0;h--){const r=e[h];let s=0,o=0;if(h>0){const E=e[h-1];s=E.originalStart+E.originalLength,o=E.modifiedStart+E.modifiedLength}const u=r.originalLength>0,S=r.modifiedLength>0;let L=0,N=this._boundaryScore(r.originalStart,r.originalLength,r.modifiedStart,r.modifiedLength);for(let E=1;;E++){const v=r.originalStart-E,l=r.modifiedStart-E;if(vN&&(N=g,L=E)}r.originalStart-=L,r.modifiedStart-=L;const P=[null];if(h>0&&this.ChangesOverlap(e[h-1],e[h],P)){e[h-1]=P[0],e.splice(h,1),h++;continue}}if(this._hasStrings)for(let h=1,r=e.length;h0&&l>L&&(L=l,N=E,P=v)}return L>0?[N,P]:null}_contiguousSequenceScore(e,h,r){let s=0;for(let o=0;o=this._originalElementsOrHash.length-1?!0:this._hasStrings&&/^\s*$/.test(this._originalStringElements[e])}_OriginalRegionIsBoundary(e,h){if(this._OriginalIsBoundary(e)||this._OriginalIsBoundary(e-1))return!0;if(h>0){const r=e+h;if(this._OriginalIsBoundary(r-1)||this._OriginalIsBoundary(r))return!0}return!1}_ModifiedIsBoundary(e){return e<=0||e>=this._modifiedElementsOrHash.length-1?!0:this._hasStrings&&/^\s*$/.test(this._modifiedStringElements[e])}_ModifiedRegionIsBoundary(e,h){if(this._ModifiedIsBoundary(e)||this._ModifiedIsBoundary(e-1))return!0;if(h>0){const r=e+h;if(this._ModifiedIsBoundary(r-1)||this._ModifiedIsBoundary(r))return!0}return!1}_boundaryScore(e,h,r,s){const o=this._OriginalRegionIsBoundary(e,h)?1:0,u=this._ModifiedRegionIsBoundary(r,s)?1:0;return o+u}ConcatenateChanges(e,h){const r=[];if(e.length===0||h.length===0)return h.length>0?h:e;if(this.ChangesOverlap(e[e.length-1],h[0],r)){const s=new Array(e.length+h.length-1);return p.Copy(e,0,s,0,e.length-1),s[e.length-1]=r[0],p.Copy(h,1,s,e.length,h.length-1),s}else{const s=new Array(e.length+h.length);return p.Copy(e,0,s,0,e.length),p.Copy(h,0,s,e.length,h.length),s}}ChangesOverlap(e,h,r){if(f.Assert(e.originalStart<=h.originalStart,"Left change is not less than or equal to right change"),f.Assert(e.modifiedStart<=h.modifiedStart,"Left change is not less than or equal to right change"),e.originalStart+e.originalLength>=h.originalStart||e.modifiedStart+e.modifiedLength>=h.modifiedStart){const s=e.originalStart;let o=e.originalLength;const u=e.modifiedStart;let S=e.modifiedLength;return e.originalStart+e.originalLength>=h.originalStart&&(o=h.originalStart+h.originalLength-e.originalStart),e.modifiedStart+e.modifiedLength>=h.modifiedStart&&(S=h.modifiedStart+h.modifiedLength-e.modifiedStart),r[0]=new i.DiffChange(s,o,u,S),!0}else return r[0]=null,!1}ClipDiagonalBound(e,h,r,s){if(e>=0&&e"u"}function a(u){return!m(u)}function m(u){return c(u)||u===null}function e(u,S){if(!u)throw new Error(S?`Unexpected type, expected '${S}'`:"Unexpected type")}function h(u){if(m(u))throw new Error("Assertion Failed: argument is undefined or null");return u}function r(u){return typeof u=="function"}function s(u,S){const L=Math.min(u.length,S.length);for(let N=0;N{s[o]=u&&typeof u=="object"?x(u):u}),s}function A(r){if(!r||typeof r!="object")return r;const s=[r];for(;s.length>0;){const o=s.shift();Object.freeze(o);for(const u in o)if(d.call(o,u)){const S=o[u];typeof S=="object"&&!Object.isFrozen(S)&&!(0,i.isTypedArray)(S)&&s.push(S)}}return r}const d=Object.prototype.hasOwnProperty;function f(r,s){return p(r,s,new Set)}function p(r,s,o){if((0,i.isUndefinedOrNull)(r))return r;const u=s(r);if(typeof u<"u")return u;if(Array.isArray(r)){const S=[];for(const L of r)S.push(p(L,s,o));return S}if((0,i.isObject)(r)){if(o.has(r))throw new Error("Cannot clone recursive data-structure");o.add(r);const S={};for(const L in r)d.call(r,L)&&(S[L]=p(r[L],s,o));return o.delete(r),S}return r}function c(r,s,o=!0){return(0,i.isObject)(r)?((0,i.isObject)(s)&&Object.keys(s).forEach(u=>{u in r?o&&((0,i.isObject)(r[u])&&(0,i.isObject)(s[u])?c(r[u],s[u],o):r[u]=s[u]):r[u]=s[u]}),r):s}function a(r,s){if(r===s)return!0;if(r==null||s===null||s===void 0||typeof r!=typeof s||typeof r!="object"||Array.isArray(r)!==Array.isArray(s))return!1;let o,u;if(Array.isArray(r)){if(r.length!==s.length)return!1;for(o=0;ofunction(){const L=Array.prototype.slice.call(arguments,0);return s(S,L)},u={};for(const S of r)u[S]=o(S);return u}}),X(J[28],Z([0,1]),function(W,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.toUint8=i,n.toUint32=x;function i(A){return A<0?0:A>255?255:A|0}function x(A){return A<0?0:A>4294967295?4294967295:A|0}}),X(J[29],Z([0,1,28]),function(W,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.CharacterSet=n.CharacterClassifier=void 0;class x{constructor(f){const p=(0,i.toUint8)(f);this._defaultValue=p,this._asciiMap=x._createAsciiMap(p),this._map=new Map}static _createAsciiMap(f){const p=new Uint8Array(256);return p.fill(f),p}set(f,p){const c=(0,i.toUint8)(p);f>=0&&f<256?this._asciiMap[f]=c:this._map.set(f,c)}get(f){return f>=0&&f<256?this._asciiMap[f]:this._map.get(f)||this._defaultValue}clear(){this._asciiMap.fill(this._defaultValue),this._map.clear()}}n.CharacterClassifier=x;class A{constructor(){this._actual=new x(0)}add(f){this._actual.set(f,1)}has(f){return this._actual.get(f)===1}clear(){return this._actual.clear()}}n.CharacterSet=A}),X(J[5],Z([0,1,3]),function(W,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.OffsetRangeSet=n.OffsetRange=void 0;class x{static addRange(f,p){let c=0;for(;cp))return new x(f,p)}static ofLength(f){return new x(0,f)}static ofStartAndLength(f,p){return new x(f,f+p)}constructor(f,p){if(this.start=f,this.endExclusive=p,f>p)throw new i.BugIndicatingError(`Invalid range: ${this.toString()}`)}get isEmpty(){return this.start===this.endExclusive}delta(f){return new x(this.start+f,this.endExclusive+f)}deltaStart(f){return new x(this.start+f,this.endExclusive)}deltaEnd(f){return new x(this.start,this.endExclusive+f)}get length(){return this.endExclusive-this.start}toString(){return`[${this.start}, ${this.endExclusive})`}contains(f){return this.start<=f&&f=f.endExclusive}slice(f){return f.slice(this.start,this.endExclusive)}substring(f){return f.substring(this.start,this.endExclusive)}clip(f){if(this.isEmpty)throw new i.BugIndicatingError(`Invalid clipping range: ${this.toString()}`);return Math.max(this.start,Math.min(this.endExclusive-1,f))}clipCyclic(f){if(this.isEmpty)throw new i.BugIndicatingError(`Invalid clipping range: ${this.toString()}`);return f=this.endExclusive?this.start+(f-this.start)%this.length:f}forEach(f){for(let p=this.start;pf.toString()).join(", ")}intersectsStrict(f){let p=0;for(;pf+p.length,0)}}n.OffsetRangeSet=A}),X(J[4],Z([0,1]),function(W,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.Position=void 0;class i{constructor(A,d){this.lineNumber=A,this.column=d}with(A=this.lineNumber,d=this.column){return A===this.lineNumber&&d===this.column?this:new i(A,d)}delta(A=0,d=0){return this.with(this.lineNumber+A,this.column+d)}equals(A){return i.equals(this,A)}static equals(A,d){return!A&&!d?!0:!!A&&!!d&&A.lineNumber===d.lineNumber&&A.column===d.column}isBefore(A){return i.isBefore(this,A)}static isBefore(A,d){return A.lineNumberp||d===p&&f>c?(this.startLineNumber=p,this.startColumn=c,this.endLineNumber=d,this.endColumn=f):(this.startLineNumber=d,this.startColumn=f,this.endLineNumber=p,this.endColumn=c)}isEmpty(){return x.isEmpty(this)}static isEmpty(d){return d.startLineNumber===d.endLineNumber&&d.startColumn===d.endColumn}containsPosition(d){return x.containsPosition(this,d)}static containsPosition(d,f){return!(f.lineNumberd.endLineNumber||f.lineNumber===d.startLineNumber&&f.columnd.endColumn)}static strictContainsPosition(d,f){return!(f.lineNumberd.endLineNumber||f.lineNumber===d.startLineNumber&&f.column<=d.startColumn||f.lineNumber===d.endLineNumber&&f.column>=d.endColumn)}containsRange(d){return x.containsRange(this,d)}static containsRange(d,f){return!(f.startLineNumberd.endLineNumber||f.endLineNumber>d.endLineNumber||f.startLineNumber===d.startLineNumber&&f.startColumnd.endColumn)}strictContainsRange(d){return x.strictContainsRange(this,d)}static strictContainsRange(d,f){return!(f.startLineNumberd.endLineNumber||f.endLineNumber>d.endLineNumber||f.startLineNumber===d.startLineNumber&&f.startColumn<=d.startColumn||f.endLineNumber===d.endLineNumber&&f.endColumn>=d.endColumn)}plusRange(d){return x.plusRange(this,d)}static plusRange(d,f){let p,c,a,m;return f.startLineNumberd.endLineNumber?(a=f.endLineNumber,m=f.endColumn):f.endLineNumber===d.endLineNumber?(a=f.endLineNumber,m=Math.max(f.endColumn,d.endColumn)):(a=d.endLineNumber,m=d.endColumn),new x(p,c,a,m)}intersectRanges(d){return x.intersectRanges(this,d)}static intersectRanges(d,f){let p=d.startLineNumber,c=d.startColumn,a=d.endLineNumber,m=d.endColumn;const e=f.startLineNumber,h=f.startColumn,r=f.endLineNumber,s=f.endColumn;return pr?(a=r,m=s):a===r&&(m=Math.min(m,s)),p>a||p===a&&c>m?null:new x(p,c,a,m)}equalsRange(d){return x.equalsRange(this,d)}static equalsRange(d,f){return!d&&!f?!0:!!d&&!!f&&d.startLineNumber===f.startLineNumber&&d.startColumn===f.startColumn&&d.endLineNumber===f.endLineNumber&&d.endColumn===f.endColumn}getEndPosition(){return x.getEndPosition(this)}static getEndPosition(d){return new i.Position(d.endLineNumber,d.endColumn)}getStartPosition(){return x.getStartPosition(this)}static getStartPosition(d){return new i.Position(d.startLineNumber,d.startColumn)}toString(){return"["+this.startLineNumber+","+this.startColumn+" -> "+this.endLineNumber+","+this.endColumn+"]"}setEndPosition(d,f){return new x(this.startLineNumber,this.startColumn,d,f)}setStartPosition(d,f){return new x(d,f,this.endLineNumber,this.endColumn)}collapseToStart(){return x.collapseToStart(this)}static collapseToStart(d){return new x(d.startLineNumber,d.startColumn,d.startLineNumber,d.startColumn)}collapseToEnd(){return x.collapseToEnd(this)}static collapseToEnd(d){return new x(d.endLineNumber,d.endColumn,d.endLineNumber,d.endColumn)}delta(d){return new x(this.startLineNumber+d,this.startColumn,this.endLineNumber+d,this.endColumn)}static fromPositions(d,f=d){return new x(d.lineNumber,d.column,f.lineNumber,f.column)}static lift(d){return d?new x(d.startLineNumber,d.startColumn,d.endLineNumber,d.endColumn):null}static isIRange(d){return d&&typeof d.startLineNumber=="number"&&typeof d.startColumn=="number"&&typeof d.endLineNumber=="number"&&typeof d.endColumn=="number"}static areIntersectingOrTouching(d,f){return!(d.endLineNumberd.startLineNumber}toJSON(){return this}}n.Range=x}),X(J[13],Z([0,1,3,5,2,15]),function(W,n,i,x,A,d){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.LineRangeSet=n.LineRange=void 0;class f{static fromRangeInclusive(a){return new f(a.startLineNumber,a.endLineNumber+1)}static joinMany(a){if(a.length===0)return[];let m=new p(a[0].slice());for(let e=1;em)throw new i.BugIndicatingError(`startLineNumber ${a} cannot be after endLineNumberExclusive ${m}`);this.startLineNumber=a,this.endLineNumberExclusive=m}contains(a){return this.startLineNumber<=a&&ah.endLineNumberExclusive>=a.startLineNumber),e=(0,d.findLastIdxMonotonous)(this._normalizedRanges,h=>h.startLineNumber<=a.endLineNumberExclusive)+1;if(m===e)this._normalizedRanges.splice(m,0,a);else if(m===e-1){const h=this._normalizedRanges[m];this._normalizedRanges[m]=h.join(a)}else{const h=this._normalizedRanges[m].join(this._normalizedRanges[e-1]).join(a);this._normalizedRanges.splice(m,e-m,h)}}contains(a){const m=(0,d.findLastMonotonous)(this._normalizedRanges,e=>e.startLineNumber<=a);return!!m&&m.endLineNumberExclusive>a}intersects(a){const m=(0,d.findLastMonotonous)(this._normalizedRanges,e=>e.startLineNumbera.startLineNumber}getUnion(a){if(this._normalizedRanges.length===0)return a;if(a._normalizedRanges.length===0)return this;const m=[];let e=0,h=0,r=null;for(;e=s.startLineNumber?r=new f(r.startLineNumber,Math.max(r.endLineNumberExclusive,s.endLineNumberExclusive)):(m.push(r),r=s)}return r!==null&&m.push(r),new p(m)}subtractFrom(a){const m=(0,d.findFirstIdxMonotonousOrArrLen)(this._normalizedRanges,s=>s.endLineNumberExclusive>=a.startLineNumber),e=(0,d.findLastIdxMonotonous)(this._normalizedRanges,s=>s.startLineNumber<=a.endLineNumberExclusive)+1;if(m===e)return new p([a]);const h=[];let r=a.startLineNumber;for(let s=m;sr&&h.push(new f(r,o.startLineNumber)),r=o.endLineNumberExclusive}return ra.toString()).join(", ")}getIntersection(a){const m=[];let e=0,h=0;for(;em.delta(a)))}}n.LineRangeSet=p}),X(J[48],Z([0,1,4,2]),function(W,n,i,x){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.Selection=void 0;class A extends x.Range{constructor(f,p,c,a){super(f,p,c,a),this.selectionStartLineNumber=f,this.selectionStartColumn=p,this.positionLineNumber=c,this.positionColumn=a}toString(){return"["+this.selectionStartLineNumber+","+this.selectionStartColumn+" -> "+this.positionLineNumber+","+this.positionColumn+"]"}equalsSelection(f){return A.selectionsEqual(this,f)}static selectionsEqual(f,p){return f.selectionStartLineNumber===p.selectionStartLineNumber&&f.selectionStartColumn===p.selectionStartColumn&&f.positionLineNumber===p.positionLineNumber&&f.positionColumn===p.positionColumn}getDirection(){return this.selectionStartLineNumber===this.startLineNumber&&this.selectionStartColumn===this.startColumn?0:1}setEndPosition(f,p){return this.getDirection()===0?new A(this.startLineNumber,this.startColumn,f,p):new A(f,p,this.startLineNumber,this.startColumn)}getPosition(){return new i.Position(this.positionLineNumber,this.positionColumn)}getSelectionStart(){return new i.Position(this.selectionStartLineNumber,this.selectionStartColumn)}setStartPosition(f,p){return this.getDirection()===0?new A(f,p,this.endLineNumber,this.endColumn):new A(this.endLineNumber,this.endColumn,f,p)}static fromPositions(f,p=f){return new A(f.lineNumber,f.column,p.lineNumber,p.column)}static fromRange(f,p){return p===0?new A(f.startLineNumber,f.startColumn,f.endLineNumber,f.endColumn):new A(f.endLineNumber,f.endColumn,f.startLineNumber,f.startColumn)}static liftSelection(f){return new A(f.selectionStartLineNumber,f.selectionStartColumn,f.positionLineNumber,f.positionColumn)}static selectionsArrEqual(f,p){if(f&&!p||!f&&p)return!1;if(!f&&!p)return!0;if(f.length!==p.length)return!1;for(let c=0,a=f.length;cf.lineCount:this.columnCount>=f.columnCount}createRange(f){return this.lineCount===0?new x.Range(f.lineNumber,f.column,f.lineNumber,f.column+this.columnCount):new x.Range(f.lineNumber,f.column,f.lineNumber+this.lineCount,this.columnCount+1)}addToPosition(f){return this.lineCount===0?new i.Position(f.lineNumber,f.column+this.columnCount):new i.Position(f.lineNumber+this.lineCount,this.columnCount+1)}toString(){return`${this.lineCount},${this.columnCount}`}}n.TextLength=A}),X(J[49],Z([0,1,5,30]),function(W,n,i,x){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.PositionOffsetTransformer=void 0;class A{constructor(f){this.text=f,this.lineStartOffsetByLineIdx=[],this.lineStartOffsetByLineIdx.push(0);for(let p=0;p(0,i.checkAdjacentItems)(s,(o,u)=>o.range.getEndPosition().isBeforeOrEqual(u.range.getStartPosition())))}apply(s){let o="",u=new A.Position(1,1);for(const L of this.edits){const N=L.range,P=N.getStartPosition(),E=N.getEndPosition(),v=m(u,P);v.isEmpty()||(o+=s.getValueOfRange(v)),o+=L.text,u=E}const S=m(u,s.endPositionExclusive);return S.isEmpty()||(o+=s.getValueOfRange(S)),o}applyToString(s){const o=new h(s);return this.apply(o)}getNewRanges(){const s=[];let o=0,u=0,S=0;for(const L of this.edits){const N=p.TextLength.ofText(L.text),P=A.Position.lift({lineNumber:L.range.startLineNumber+u,column:L.range.startColumn+(L.range.startLineNumber===o?S:0)}),E=N.createRange(P);s.push(E),u=E.endLineNumber-L.range.endLineNumber,S=E.endColumn-L.range.endColumn,o=L.range.endLineNumber}return s}}n.TextEdit=c;class a{constructor(s,o){this.range=s,this.text=o}toSingleEditOperation(){return{range:this.range,text:this.text}}}n.SingleTextEdit=a;function m(r,s){if(r.lineNumber===s.lineNumber&&r.column===Number.MAX_SAFE_INTEGER)return f.Range.fromPositions(s,s);if(!r.isBeforeOrEqual(s))throw new x.BugIndicatingError("start must be before end");return new f.Range(r.lineNumber,r.column,s.lineNumber,s.column)}class e{get endPositionExclusive(){return this.length.addToPosition(new A.Position(1,1))}}n.AbstractText=e;class h extends e{constructor(s){super(),this.value=s,this._t=new d.PositionOffsetTransformer(this.value)}getValueOfRange(s){return this._t.getOffsetRange(s).substring(this.value)}get length(){return this._t.textLength}}n.StringText=h}),X(J[51],Z([0,1,21,29]),function(W,n,i,x){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.WordCharacterClassifier=void 0,n.getMapForWordSeparators=f;class A extends x.CharacterClassifier{constructor(c,a){super(0),this._segmenter=null,this._cachedLine=null,this._cachedSegments=[],this.intlSegmenterLocales=a,this.intlSegmenterLocales.length>0?this._segmenter=new Intl.Segmenter(this.intlSegmenterLocales,{granularity:"word"}):this._segmenter=null;for(let m=0,e=c.length;ma)break;m=e}return m}findNextIntlWordAtOrAfterOffset(c,a){for(const m of this._getIntlSegmenterWordsOnLine(c))if(!(m.index/?";function A(a=""){let m="(-?\\d*\\.\\d\\w*)|([^";for(const e of n.USUAL_WORD_SEPARATORS)a.indexOf(e)>=0||(m+="\\"+e);return m+="\\s]+)",new RegExp(m,"g")}n.DEFAULT_WORD_REGEXP=A();function d(a){let m=n.DEFAULT_WORD_REGEXP;if(a&&a instanceof RegExp)if(a.global)m=a;else{let e="g";a.ignoreCase&&(e+="i"),a.multiline&&(e+="m"),a.unicode&&(e+="u"),m=new RegExp(a.source,e)}return m.lastIndex=0,m}const f=new x.LinkedList;f.unshift({maxLen:1e3,windowSize:15,timeBudget:150});function p(a,m,e,h,r){if(m=d(m),r||(r=i.Iterable.first(f)),e.length>r.maxLen){let L=a-r.maxLen/2;return L<0?L=0:h+=L,e=e.substring(L,a+r.maxLen/2),p(a,m,e,h,r)}const s=Date.now(),o=a-1-h;let u=-1,S=null;for(let L=1;!(Date.now()-s>=r.timeBudget);L++){const N=o-r.windowSize*L;m.lastIndex=Math.max(0,N);const P=c(m,e,o,u);if(!P&&S||(S=P,N<=0))break;u=N}if(S){const L={word:S[0],startColumn:h+1+S.index,endColumn:h+1+S.index+S[0].length};return m.lastIndex=0,L}return null}function c(a,m,e,h){let r;for(;r=a.exec(m);){const s=r.index||0;if(s<=e&&a.lastIndex>=e)return r;if(h>0&&s>h)return null}return null}}),X(J[10],Z([0,1,7,3,5]),function(W,n,i,x,A){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.DateTimeout=n.InfiniteTimeout=n.OffsetPair=n.SequenceDiff=n.DiffAlgorithmResult=void 0;class d{static trivial(e,h){return new d([new f(A.OffsetRange.ofLength(e.length),A.OffsetRange.ofLength(h.length))],!1)}static trivialTimedOut(e,h){return new d([new f(A.OffsetRange.ofLength(e.length),A.OffsetRange.ofLength(h.length))],!0)}constructor(e,h){this.diffs=e,this.hitTimeout=h}}n.DiffAlgorithmResult=d;class f{static invert(e,h){const r=[];return(0,i.forEachAdjacent)(e,(s,o)=>{r.push(f.fromOffsetPairs(s?s.getEndExclusives():p.zero,o?o.getStarts():new p(h,(s?s.seq2Range.endExclusive-s.seq1Range.endExclusive:0)+h)))}),r}static fromOffsetPairs(e,h){return new f(new A.OffsetRange(e.offset1,h.offset1),new A.OffsetRange(e.offset2,h.offset2))}static assertSorted(e){let h;for(const r of e){if(h&&!(h.seq1Range.endExclusive<=r.seq1Range.start&&h.seq2Range.endExclusive<=r.seq2Range.start))throw new x.BugIndicatingError("Sequence diffs must be sorted");h=r}}constructor(e,h){this.seq1Range=e,this.seq2Range=h}swap(){return new f(this.seq2Range,this.seq1Range)}toString(){return`${this.seq1Range} <-> ${this.seq2Range}`}join(e){return new f(this.seq1Range.join(e.seq1Range),this.seq2Range.join(e.seq2Range))}delta(e){return e===0?this:new f(this.seq1Range.delta(e),this.seq2Range.delta(e))}deltaStart(e){return e===0?this:new f(this.seq1Range.deltaStart(e),this.seq2Range.deltaStart(e))}deltaEnd(e){return e===0?this:new f(this.seq1Range.deltaEnd(e),this.seq2Range.deltaEnd(e))}intersect(e){const h=this.seq1Range.intersect(e.seq1Range),r=this.seq2Range.intersect(e.seq2Range);if(!(!h||!r))return new f(h,r)}getStarts(){return new p(this.seq1Range.start,this.seq2Range.start)}getEndExclusives(){return new p(this.seq1Range.endExclusive,this.seq2Range.endExclusive)}}n.SequenceDiff=f;class p{static{this.zero=new p(0,0)}static{this.max=new p(Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER)}constructor(e,h){this.offset1=e,this.offset2=h}toString(){return`${this.offset1} <-> ${this.offset2}`}delta(e){return e===0?this:new p(this.offset1+e,this.offset2+e)}equals(e){return this.offset1===e.offset1&&this.offset2===e.offset2}}n.OffsetPair=p;class c{static{this.instance=new c}isValid(){return!0}}n.InfiniteTimeout=c;class a{constructor(e){if(this.timeout=e,this.startTime=Date.now(),this.valid=!0,e<=0)throw new x.BugIndicatingError("timeout must be positive")}isValid(){if(!(Date.now()-this.startTimeh.length||_>r.length)continue;const C=s(y,_);u.set(L,C);const R=y===w?S.get(L+1):S.get(L-1);if(S.set(L,C!==y?new d(R,y,_,C-y):R),u.get(L)===h.length&&u.get(L)-L===r.length)break e}}let N=S.get(L);const P=[];let E=h.length,v=r.length;for(;;){const l=N?N.x+N.length:0,b=N?N.y+N.length:0;if((l!==E||b!==v)&&P.push(new x.SequenceDiff(new i.OffsetRange(l,E),new i.OffsetRange(b,v))),!N)break;E=N.x,v=N.y,N=N.prev}return P.reverse(),new x.DiffAlgorithmResult(P,!1)}}n.MyersDiffAlgorithm=A;class d{constructor(a,m,e,h){this.prev=a,this.x=m,this.y=e,this.length=h}}class f{constructor(){this.positiveArr=new Int32Array(10),this.negativeArr=new Int32Array(10)}get(a){return a<0?(a=-a-1,this.negativeArr[a]):this.positiveArr[a]}set(a,m){if(a<0){if(a=-a-1,a>=this.negativeArr.length){const e=this.negativeArr;this.negativeArr=new Int32Array(e.length*2),this.negativeArr.set(e)}this.negativeArr[a]=m}else{if(a>=this.positiveArr.length){const e=this.positiveArr;this.positiveArr=new Int32Array(e.length*2),this.positiveArr.set(e)}this.positiveArr[a]=m}}}class p{constructor(){this.positiveArr=[],this.negativeArr=[]}get(a){return a<0?(a=-a-1,this.negativeArr[a]):this.positiveArr[a]}set(a,m){a<0?(a=-a-1,this.negativeArr[a]=m):this.positiveArr[a]=m}}}),X(J[52],Z([0,1,7,5,10]),function(W,n,i,x,A){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.optimizeSequenceDiffs=d,n.removeShortMatches=a,n.extendDiffsToEntireWordIfAppropriate=m,n.removeVeryShortMatchingLinesBetweenDiffs=h,n.removeVeryShortMatchingTextBetweenLongDiffs=r;function d(s,o,u){let S=u;return S=f(s,o,S),S=f(s,o,S),S=p(s,o,S),S}function f(s,o,u){if(u.length===0)return u;const S=[];S.push(u[0]);for(let N=1;N0&&(E=E.delta(l))}L.push(E)}return S.length>0&&L.push(S[S.length-1]),L}function p(s,o,u){if(!s.getBoundaryScore||!o.getBoundaryScore)return u;for(let S=0;S0?u[S-1]:void 0,N=u[S],P=S+1=S.start&&s.seq2Range.start-P>=L.start&&u.isStronglyEqual(s.seq2Range.start-P,s.seq2Range.endExclusive-P)&&P<100;)P++;P--;let E=0;for(;s.seq1Range.start+El&&(l=y,v=b)}return s.delta(v)}function a(s,o,u){const S=[];for(const L of u){const N=S[S.length-1];if(!N){S.push(L);continue}L.seq1Range.start-N.seq1Range.endExclusive<=2||L.seq2Range.start-N.seq2Range.endExclusive<=2?S[S.length-1]=new A.SequenceDiff(N.seq1Range.join(L.seq1Range),N.seq2Range.join(L.seq2Range)):S.push(L)}return S}function m(s,o,u){const S=A.SequenceDiff.invert(u,s.length),L=[];let N=new A.OffsetPair(0,0);function P(v,l){if(v.offset10;){const C=S[0];if(!(C.seq1Range.intersects(w.seq1Range)||C.seq2Range.intersects(w.seq2Range)))break;const D=s.findWordContaining(C.seq1Range.start),T=o.findWordContaining(C.seq2Range.start),O=new A.SequenceDiff(D,T),z=O.intersect(C);if(y+=z.seq1Range.length,_+=z.seq2Range.length,w=w.join(O),w.seq1Range.endExclusive>=C.seq1Range.endExclusive)S.shift();else break}y+_<(w.seq1Range.length+w.seq2Range.length)*2/3&&L.push(w),N=w.getEndExclusives()}for(;S.length>0;){const v=S.shift();v.seq1Range.isEmpty||(P(v.getStarts(),v),P(v.getEndExclusives().delta(-1),v))}return e(u,L)}function e(s,o){const u=[];for(;s.length>0||o.length>0;){const S=s[0],L=o[0];let N;S&&(!L||S.seq1Range.start0&&u[u.length-1].seq1Range.endExclusive>=N.seq1Range.start?u[u.length-1]=u[u.length-1].join(N):u.push(N)}return u}function h(s,o,u){let S=u;if(S.length===0)return S;let L=0,N;do{N=!1;const P=[S[0]];for(let E=1;E5||M.seq1Range.length+M.seq2Range.length>5)};const v=S[E],l=P[P.length-1];b(l,v)?(N=!0,P[P.length-1]=P[P.length-1].join(v)):P.push(v)}S=P}while(L++<10&&N);return S}function r(s,o,u){let S=u;if(S.length===0)return S;let L=0,N;do{N=!1;const E=[S[0]];for(let v=1;v5||_.length>500)return!1;const R=s.getText(_).trim();if(R.length>20||R.split(/\r\n|\r|\n/).length>1)return!1;const D=s.countLinesIn(M.seq1Range),T=M.seq1Range.length,O=o.countLinesIn(M.seq2Range),z=M.seq2Range.length,j=s.countLinesIn(y.seq1Range),F=y.seq1Range.length,q=o.countLinesIn(y.seq2Range),B=y.seq2Range.length,G=2*40+50;function $(U){return Math.min(U,G)}return Math.pow(Math.pow($(D*40+T),1.5)+Math.pow($(O*40+z),1.5),1.5)+Math.pow(Math.pow($(j*40+F),1.5)+Math.pow($(q*40+B),1.5),1.5)>(G**1.5)**1.5*1.3};const l=S[v],b=E[E.length-1];g(b,l)?(N=!0,E[E.length-1]=E[E.length-1].join(l)):E.push(l)}S=E}while(L++<10&&N);const P=[];return(0,i.forEachWithNeighbors)(S,(E,v,l)=>{let b=v;function g(R){return R.length>0&&R.trim().length<=3&&v.seq1Range.length+v.seq2Range.length>100}const w=s.extendToFullLines(v.seq1Range),M=s.getText(new x.OffsetRange(w.start,v.seq1Range.start));g(M)&&(b=b.deltaStart(-M.length));const y=s.getText(new x.OffsetRange(v.seq1Range.endExclusive,w.endExclusive));g(y)&&(b=b.deltaEnd(y.length));const _=A.SequenceDiff.fromOffsetPairs(E?E.getEndExclusives():A.OffsetPair.zero,l?l.getStarts():A.OffsetPair.max),C=b.intersect(_);P.length>0&&C.getStarts().equals(P[P.length-1].getEndExclusives())?P[P.length-1]=P[P.length-1].join(C):P.push(C)}),P}}),X(J[53],Z([0,1]),function(W,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.LineSequence=void 0;class i{constructor(d,f){this.trimmedHash=d,this.lines=f}getElement(d){return this.trimmedHash[d]}get length(){return this.trimmedHash.length}getBoundaryScore(d){const f=d===0?0:x(this.lines[d-1]),p=d===this.lines.length?0:x(this.lines[d]);return 1e3-(f+p)}getText(d){return this.lines.slice(d.start,d.endExclusive).join(` -`)}isStronglyEqual(d,f){return this.lines[d]===this.lines[f]}}n.LineSequence=i;function x(A){let d=0;for(;d0&&E>0&&h.get(P-1,E-1)===3&&(b+=r.get(P-1,E-1)),b+=m?m(P,E):1):b=-1;const g=Math.max(v,l,b);if(g===b){const w=P>0&&E>0?r.get(P-1,E-1):0;r.set(P,E,w+1),h.set(P,E,3)}else g===v?(r.set(P,E,0),h.set(P,E,1)):g===l&&(r.set(P,E,0),h.set(P,E,2));e.set(P,E,g)}const s=[];let o=p.length,u=c.length;function S(P,E){(P+1!==o||E+1!==u)&&s.push(new x.SequenceDiff(new i.OffsetRange(P+1,o),new i.OffsetRange(E+1,u))),o=P,u=E}let L=p.length-1,N=c.length-1;for(;L>=0&&N>=0;)h.get(L,N)===3?(S(L,N),L--,N--):h.get(L,N)===1?L--:N--;return S(-1,-1),s.reverse(),new x.DiffAlgorithmResult(s,!1)}}n.DynamicProgrammingDiffing=d}),X(J[33],Z([0,1,15,5,4,2,16]),function(W,n,i,x,A,d,f){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.LinesSliceCharSequence=void 0;class p{constructor(r,s,o){this.lines=r,this.range=s,this.considerWhitespaceChanges=o,this.elements=[],this.firstElementOffsetByLineIdx=[],this.lineStartOffsets=[],this.trimmedWsLengthsByLineIdx=[],this.firstElementOffsetByLineIdx.push(0);for(let u=this.range.startLineNumber;u<=this.range.endLineNumber;u++){let S=r[u-1],L=0;u===this.range.startLineNumber&&this.range.startColumn>1&&(L=this.range.startColumn-1,S=S.substring(L)),this.lineStartOffsets.push(L);let N=0;if(!o){const E=S.trimStart();N=S.length-E.length,S=E.trimEnd()}this.trimmedWsLengthsByLineIdx.push(N);const P=u===this.range.endLineNumber?Math.min(this.range.endColumn-1-L-N,S.length):S.length;for(let E=0;EString.fromCharCode(s)).join("")}getElement(r){return this.elements[r]}get length(){return this.elements.length}getBoundaryScore(r){const s=e(r>0?this.elements[r-1]:-1),o=e(rS<=r),u=r-this.firstElementOffsetByLineIdx[o];return new A.Position(this.range.startLineNumber+o,1+this.lineStartOffsets[o]+u+(u===0&&s==="left"?0:this.trimmedWsLengthsByLineIdx[o]))}translateRange(r){const s=this.translateOffset(r.start,"right"),o=this.translateOffset(r.endExclusive,"left");return o.isBefore(s)?d.Range.fromPositions(o,o):d.Range.fromPositions(s,o)}findWordContaining(r){if(r<0||r>=this.elements.length||!c(this.elements[r]))return;let s=r;for(;s>0&&c(this.elements[s-1]);)s--;let o=r;for(;ou<=r.start)??0,o=(0,i.findFirstMonotonous)(this.firstElementOffsetByLineIdx,u=>r.endExclusive<=u)??this.elements.length;return new x.OffsetRange(s,o)}}n.LinesSliceCharSequence=p;function c(h){return h>=97&&h<=122||h>=65&&h<=90||h>=48&&h<=57}const a={0:0,1:0,2:0,3:10,4:2,5:30,6:3,7:10,8:10};function m(h){return a[h]}function e(h){return h===10?8:h===13?7:(0,f.isSpace)(h)?6:h>=97&&h<=122?0:h>=65&&h<=90?1:h>=48&&h<=57?2:h===-1?3:h===44||h===59?5:4}}),X(J[34],Z([0,1]),function(W,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.MovedText=n.LinesDiff=void 0;class i{constructor(d,f,p){this.changes=d,this.moves=f,this.hitTimeout=p}}n.LinesDiff=i;class x{constructor(d,f){this.lineRangeMapping=d,this.changes=f}}n.MovedText=x}),X(J[17],Z([0,1,3,13,4,2,50]),function(W,n,i,x,A,d,f){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.RangeMapping=n.DetailedLineRangeMapping=n.LineRangeMapping=void 0;class p{static inverse(r,s,o){const u=[];let S=1,L=1;for(const P of r){const E=new p(new x.LineRange(S,P.original.startLineNumber),new x.LineRange(L,P.modified.startLineNumber));E.modified.isEmpty||u.push(E),S=P.original.endLineNumberExclusive,L=P.modified.endLineNumberExclusive}const N=new p(new x.LineRange(S,s+1),new x.LineRange(L,o+1));return N.modified.isEmpty||u.push(N),u}static clip(r,s,o){const u=[];for(const S of r){const L=S.original.intersect(s),N=S.modified.intersect(o);L&&!L.isEmpty&&N&&!N.isEmpty&&u.push(new p(L,N))}return u}constructor(r,s){this.original=r,this.modified=s}toString(){return`{${this.original.toString()}->${this.modified.toString()}}`}flip(){return new p(this.modified,this.original)}join(r){return new p(this.original.join(r.original),this.modified.join(r.modified))}toRangeMapping(){const r=this.original.toInclusiveRange(),s=this.modified.toInclusiveRange();if(r&&s)return new e(r,s);if(this.original.startLineNumber===1||this.modified.startLineNumber===1){if(!(this.modified.startLineNumber===1&&this.original.startLineNumber===1))throw new i.BugIndicatingError("not a valid diff");return new e(new d.Range(this.original.startLineNumber,1,this.original.endLineNumberExclusive,1),new d.Range(this.modified.startLineNumber,1,this.modified.endLineNumberExclusive,1))}else return new e(new d.Range(this.original.startLineNumber-1,Number.MAX_SAFE_INTEGER,this.original.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER),new d.Range(this.modified.startLineNumber-1,Number.MAX_SAFE_INTEGER,this.modified.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER))}toRangeMapping2(r,s){if(a(this.original.endLineNumberExclusive,r)&&a(this.modified.endLineNumberExclusive,s))return new e(new d.Range(this.original.startLineNumber,1,this.original.endLineNumberExclusive,1),new d.Range(this.modified.startLineNumber,1,this.modified.endLineNumberExclusive,1));if(!this.original.isEmpty&&!this.modified.isEmpty)return new e(d.Range.fromPositions(new A.Position(this.original.startLineNumber,1),c(new A.Position(this.original.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER),r)),d.Range.fromPositions(new A.Position(this.modified.startLineNumber,1),c(new A.Position(this.modified.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER),s)));if(this.original.startLineNumber>1&&this.modified.startLineNumber>1)return new e(d.Range.fromPositions(c(new A.Position(this.original.startLineNumber-1,Number.MAX_SAFE_INTEGER),r),c(new A.Position(this.original.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER),r)),d.Range.fromPositions(c(new A.Position(this.modified.startLineNumber-1,Number.MAX_SAFE_INTEGER),s),c(new A.Position(this.modified.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER),s)));throw new i.BugIndicatingError}}n.LineRangeMapping=p;function c(h,r){if(h.lineNumber<1)return new A.Position(1,1);if(h.lineNumber>r.length)return new A.Position(r.length,r[r.length-1].length+1);const s=r[h.lineNumber-1];return h.column>s.length+1?new A.Position(h.lineNumber,s.length+1):h}function a(h,r){return h>=1&&h<=r.length}class m extends p{static fromRangeMappings(r){const s=x.LineRange.join(r.map(u=>x.LineRange.fromRangeInclusive(u.originalRange))),o=x.LineRange.join(r.map(u=>x.LineRange.fromRangeInclusive(u.modifiedRange)));return new m(s,o,r)}constructor(r,s,o){super(r,s),this.innerChanges=o}flip(){return new m(this.modified,this.original,this.innerChanges?.map(r=>r.flip()))}withInnerChangesFromLineRanges(){return new m(this.original,this.modified,[this.toRangeMapping()])}}n.DetailedLineRangeMapping=m;class e{static assertSorted(r){for(let s=1;s${this.modifiedRange.toString()}}`}flip(){return new e(this.modifiedRange,this.originalRange)}toTextEdit(r){const s=r.getValueOfRange(this.modifiedRange);return new f.SingleTextEdit(this.originalRange,s)}}n.RangeMapping=e}),X(J[55],Z([0,1,10,17,7,15,21,13,33,16,32,2]),function(W,n,i,x,A,d,f,p,c,a,m,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.computeMovedLines=h;function h(N,P,E,v,l,b){let{moves:g,excludedChanges:w}=s(N,P,E,b);if(!b.isValid())return[];const M=N.filter(_=>!w.has(_)),y=o(M,v,l,P,E,b);return(0,A.pushMany)(g,y),g=S(g),g=g.filter(_=>{const C=_.original.toOffsetRange().slice(P).map(D=>D.trim());return C.join(` -`).length>=15&&r(C,D=>D.length>=2)>=2}),g=L(N,g),g}function r(N,P){let E=0;for(const v of N)P(v)&&E++;return E}function s(N,P,E,v){const l=[],b=N.filter(M=>M.modified.isEmpty&&M.original.length>=3).map(M=>new a.LineRangeFragment(M.original,P,M)),g=new Set(N.filter(M=>M.original.isEmpty&&M.modified.length>=3).map(M=>new a.LineRangeFragment(M.modified,E,M))),w=new Set;for(const M of b){let y=-1,_;for(const C of g){const R=M.computeSimilarity(C);R>y&&(y=R,_=C)}if(y>.9&&_&&(g.delete(_),l.push(new x.LineRangeMapping(M.range,_.range)),w.add(M.source),w.add(_.source)),!v.isValid())return{moves:l,excludedChanges:w}}return{moves:l,excludedChanges:w}}function o(N,P,E,v,l,b){const g=[],w=new f.SetMap;for(const R of N)for(let D=R.original.startLineNumber;DR.modified.startLineNumber,A.numberComparator));for(const R of N){let D=[];for(let T=R.modified.startLineNumber;T{for(const B of D)if(B.originalLineRange.endLineNumberExclusive+1===F.endLineNumberExclusive&&B.modifiedLineRange.endLineNumberExclusive+1===z.endLineNumberExclusive){B.originalLineRange=new p.LineRange(B.originalLineRange.startLineNumber,F.endLineNumberExclusive),B.modifiedLineRange=new p.LineRange(B.modifiedLineRange.startLineNumber,z.endLineNumberExclusive),j.push(B);return}const q={modifiedLineRange:z,originalLineRange:F};M.push(q),j.push(q)}),D=j}if(!b.isValid())return[]}M.sort((0,A.reverseOrder)((0,A.compareBy)(R=>R.modifiedLineRange.length,A.numberComparator)));const y=new p.LineRangeSet,_=new p.LineRangeSet;for(const R of M){const D=R.modifiedLineRange.startLineNumber-R.originalLineRange.startLineNumber,T=y.subtractFrom(R.modifiedLineRange),O=_.subtractFrom(R.originalLineRange).getWithDelta(D),z=T.getIntersection(O);for(const j of z.ranges){if(j.length<3)continue;const F=j,q=j.delta(-D);g.push(new x.LineRangeMapping(q,F)),y.addRange(F),_.addRange(q)}}g.sort((0,A.compareBy)(R=>R.original.startLineNumber,A.numberComparator));const C=new d.MonotonousArray(N);for(let R=0;R$.original.startLineNumber<=D.original.startLineNumber),O=(0,d.findLastMonotonous)(N,$=>$.modified.startLineNumber<=D.modified.startLineNumber),z=Math.max(D.original.startLineNumber-T.original.startLineNumber,D.modified.startLineNumber-O.modified.startLineNumber),j=C.findLastMonotonous($=>$.original.startLineNumber$.modified.startLineNumberv.length||U>l.length||y.contains(U)||_.contains($)||!u(v[$-1],l[U-1],b))break}B>0&&(_.addRange(new p.LineRange(D.original.startLineNumber-B,D.original.startLineNumber)),y.addRange(new p.LineRange(D.modified.startLineNumber-B,D.modified.startLineNumber)));let G;for(G=0;Gv.length||U>l.length||y.contains(U)||_.contains($)||!u(v[$-1],l[U-1],b))break}G>0&&(_.addRange(new p.LineRange(D.original.endLineNumberExclusive,D.original.endLineNumberExclusive+G)),y.addRange(new p.LineRange(D.modified.endLineNumberExclusive,D.modified.endLineNumberExclusive+G))),(B>0||G>0)&&(g[R]=new x.LineRangeMapping(new p.LineRange(D.original.startLineNumber-B,D.original.endLineNumberExclusive+G),new p.LineRange(D.modified.startLineNumber-B,D.modified.endLineNumberExclusive+G)))}return g}function u(N,P,E){if(N.trim()===P.trim())return!0;if(N.length>300&&P.length>300)return!1;const l=new m.MyersDiffAlgorithm().compute(new c.LinesSliceCharSequence([N],new e.Range(1,1,1,N.length),!1),new c.LinesSliceCharSequence([P],new e.Range(1,1,1,P.length),!1),E);let b=0;const g=i.SequenceDiff.invert(l.diffs,N.length);for(const _ of g)_.seq1Range.forEach(C=>{(0,a.isSpace)(N.charCodeAt(C))||b++});function w(_){let C=0;for(let R=0;RP.length?N:P);return b/M>.6&&M>10}function S(N){if(N.length===0)return N;N.sort((0,A.compareBy)(E=>E.original.startLineNumber,A.numberComparator));const P=[N[0]];for(let E=1;E=0&&g>=0&&b+g<=2){P[P.length-1]=v.join(l);continue}P.push(l)}return P}function L(N,P){const E=new d.MonotonousArray(N);return P=P.filter(v=>{const l=E.findLastMonotonous(w=>w.original.startLineNumberw.modified.startLineNumber$===U))return new s.LinesDiff([],[],!1);if(E.length===1&&E[0].length===0||v.length===1&&v[0].length===0)return new s.LinesDiff([new o.DetailedLineRangeMapping(new A.LineRange(1,E.length+1),new A.LineRange(1,v.length+1),[new o.RangeMapping(new f.Range(1,1,E.length,E[E.length-1].length+1),new f.Range(1,1,v.length,v[v.length-1].length+1))])],[],!1);const b=l.maxComputationTimeMs===0?p.InfiniteTimeout.instance:new p.DateTimeout(l.maxComputationTimeMs),g=!l.ignoreTrimWhitespace,w=new Map;function M($){let U=w.get($);return U===void 0&&(U=w.size,w.set($,U)),U}const y=E.map($=>M($.trim())),_=v.map($=>M($.trim())),C=new h.LineSequence(y,E),R=new h.LineSequence(_,v),D=C.length+R.length<1700?this.dynamicProgrammingDiffing.compute(C,R,b,($,U)=>E[$]===v[U]?v[U].length===0?.1:1+Math.log(1+v[U].length):.99):this.myersDiffingAlgorithm.compute(C,R,b);let T=D.diffs,O=D.hitTimeout;T=(0,e.optimizeSequenceDiffs)(C,R,T),T=(0,e.removeVeryShortMatchingLinesBetweenDiffs)(C,R,T);const z=[],j=$=>{if(g)for(let U=0;U<$;U++){const ee=F+U,re=q+U;if(E[ee]!==v[re]){const ue=this.refineDiff(E,v,new p.SequenceDiff(new d.OffsetRange(ee,ee+1),new d.OffsetRange(re,re+1)),b,g);for(const de of ue.mappings)z.push(de);ue.hitTimeout&&(O=!0)}}};let F=0,q=0;for(const $ of T){(0,x.assertFn)(()=>$.seq1Range.start-F===$.seq2Range.start-q);const U=$.seq1Range.start-F;j(U),F=$.seq1Range.endExclusive,q=$.seq2Range.endExclusive;const ee=this.refineDiff(E,v,$,b,g);ee.hitTimeout&&(O=!0);for(const re of ee.mappings)z.push(re)}j(E.length-F);const B=S(z,E,v);let G=[];return l.computeMoves&&(G=this.computeMoves(B,E,v,y,_,b,g)),(0,x.assertFn)(()=>{function $(ee,re){if(ee.lineNumber<1||ee.lineNumber>re.length)return!1;const ue=re[ee.lineNumber-1];return!(ee.column<1||ee.column>ue.length+1)}function U(ee,re){return!(ee.startLineNumber<1||ee.startLineNumber>re.length+1||ee.endLineNumberExclusive<1||ee.endLineNumberExclusive>re.length+1)}for(const ee of B){if(!ee.innerChanges)return!1;for(const re of ee.innerChanges)if(!($(re.modifiedRange.getStartPosition(),v)&&$(re.modifiedRange.getEndPosition(),v)&&$(re.originalRange.getStartPosition(),E)&&$(re.originalRange.getEndPosition(),E)))return!1;if(!U(ee.modified,v)||!U(ee.original,E))return!1}return!0}),new s.LinesDiff(B,G,O)}computeMoves(E,v,l,b,g,w,M){return(0,m.computeMovedLines)(E,v,l,b,g,w).map(C=>{const R=this.refineDiff(v,l,new p.SequenceDiff(C.original.toOffsetRange(),C.modified.toOffsetRange()),w,M),D=S(R.mappings,v,l,!0);return new s.MovedText(C,D)})}refineDiff(E,v,l,b,g){const M=N(l).toRangeMapping2(E,v),y=new r.LinesSliceCharSequence(E,M.originalRange,g),_=new r.LinesSliceCharSequence(v,M.modifiedRange,g),C=y.length+_.length<500?this.dynamicProgrammingDiffing.compute(y,_,b):this.myersDiffingAlgorithm.compute(y,_,b),R=!1;let D=C.diffs;R&&p.SequenceDiff.assertSorted(D),D=(0,e.optimizeSequenceDiffs)(y,_,D),R&&p.SequenceDiff.assertSorted(D),D=(0,e.extendDiffsToEntireWordIfAppropriate)(y,_,D),R&&p.SequenceDiff.assertSorted(D),D=(0,e.removeShortMatches)(y,_,D),R&&p.SequenceDiff.assertSorted(D),D=(0,e.removeVeryShortMatchingTextBetweenLongDiffs)(y,_,D),R&&p.SequenceDiff.assertSorted(D);const T=D.map(O=>new o.RangeMapping(y.translateRange(O.seq1Range),_.translateRange(O.seq2Range)));return R&&o.RangeMapping.assertSorted(T),{mappings:T,hitTimeout:C.hitTimeout}}}n.DefaultLinesDiffComputer=u;function S(P,E,v,l=!1){const b=[];for(const g of(0,i.groupAdjacentBy)(P.map(w=>L(w,E,v)),(w,M)=>w.original.overlapOrTouch(M.original)||w.modified.overlapOrTouch(M.modified))){const w=g[0],M=g[g.length-1];b.push(new o.DetailedLineRangeMapping(w.original.join(M.original),w.modified.join(M.modified),g.map(y=>y.innerChanges[0])))}return(0,x.assertFn)(()=>!l&&b.length>0&&(b[0].modified.startLineNumber!==b[0].original.startLineNumber||v.length-b[b.length-1].modified.endLineNumberExclusive!==E.length-b[b.length-1].original.endLineNumberExclusive)?!1:(0,x.checkAdjacentItems)(b,(g,w)=>w.original.startLineNumber-g.original.endLineNumberExclusive===w.modified.startLineNumber-g.modified.endLineNumberExclusive&&g.original.endLineNumberExclusive=v[P.modifiedRange.startLineNumber-1].length&&P.originalRange.startColumn-1>=E[P.originalRange.startLineNumber-1].length&&P.originalRange.startLineNumber<=P.originalRange.endLineNumber+b&&P.modifiedRange.startLineNumber<=P.modifiedRange.endLineNumber+b&&(l=1);const g=new A.LineRange(P.originalRange.startLineNumber+l,P.originalRange.endLineNumber+1+b),w=new A.LineRange(P.modifiedRange.startLineNumber+l,P.modifiedRange.endLineNumber+1+b);return new o.DetailedLineRangeMapping(g,w,[P])}function N(P){return new o.LineRangeMapping(new A.LineRange(P.seq1Range.start+1,P.seq1Range.endExclusive+1),new A.LineRange(P.seq2Range.start+1,P.seq2Range.endExclusive+1))}}),X(J[57],Z([0,1,24,34,17,6,2,12,13]),function(W,n,i,x,A,d,f,p,c){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.DiffComputer=n.LegacyLinesDiffComputer=void 0;const a=3;class m{computeDiff(v,l,b){const w=new S(v,l,{maxComputationTime:b.maxComputationTimeMs,shouldIgnoreTrimWhitespace:b.ignoreTrimWhitespace,shouldComputeCharChanges:!0,shouldMakePrettyDiff:!0,shouldPostProcessCharChanges:!0}).computeDiff(),M=[];let y=null;for(const _ of w.changes){let C;_.originalEndLineNumber===0?C=new c.LineRange(_.originalStartLineNumber+1,_.originalStartLineNumber+1):C=new c.LineRange(_.originalStartLineNumber,_.originalEndLineNumber+1);let R;_.modifiedEndLineNumber===0?R=new c.LineRange(_.modifiedStartLineNumber+1,_.modifiedStartLineNumber+1):R=new c.LineRange(_.modifiedStartLineNumber,_.modifiedEndLineNumber+1);let D=new A.DetailedLineRangeMapping(C,R,_.charChanges?.map(T=>new A.RangeMapping(new f.Range(T.originalStartLineNumber,T.originalStartColumn,T.originalEndLineNumber,T.originalEndColumn),new f.Range(T.modifiedStartLineNumber,T.modifiedStartColumn,T.modifiedEndLineNumber,T.modifiedEndColumn))));y&&(y.modified.endLineNumberExclusive===D.modified.startLineNumber||y.original.endLineNumberExclusive===D.original.startLineNumber)&&(D=new A.DetailedLineRangeMapping(y.original.join(D.original),y.modified.join(D.modified),y.innerChanges&&D.innerChanges?y.innerChanges.concat(D.innerChanges):void 0),M.pop()),M.push(D),y=D}return(0,p.assertFn)(()=>(0,p.checkAdjacentItems)(M,(_,C)=>C.original.startLineNumber-_.original.endLineNumberExclusive===C.modified.startLineNumber-_.modified.endLineNumberExclusive&&_.original.endLineNumberExclusive(v===10?"\\n":String.fromCharCode(v))+`-(${this._lineNumbers[l]},${this._columns[l]})`).join(", ")+"]"}_assertIndex(v,l){if(v<0||v>=l.length)throw new Error("Illegal index")}getElements(){return this._charCodes}getStartLineNumber(v){return v>0&&v===this._lineNumbers.length?this.getEndLineNumber(v-1):(this._assertIndex(v,this._lineNumbers),this._lineNumbers[v])}getEndLineNumber(v){return v===-1?this.getStartLineNumber(v+1):(this._assertIndex(v,this._lineNumbers),this._charCodes[v]===10?this._lineNumbers[v]+1:this._lineNumbers[v])}getStartColumn(v){return v>0&&v===this._columns.length?this.getEndColumn(v-1):(this._assertIndex(v,this._columns),this._columns[v])}getEndColumn(v){return v===-1?this.getStartColumn(v+1):(this._assertIndex(v,this._columns),this._charCodes[v]===10?1:this._columns[v]+1)}}class s{constructor(v,l,b,g,w,M,y,_){this.originalStartLineNumber=v,this.originalStartColumn=l,this.originalEndLineNumber=b,this.originalEndColumn=g,this.modifiedStartLineNumber=w,this.modifiedStartColumn=M,this.modifiedEndLineNumber=y,this.modifiedEndColumn=_}static createFromDiffChange(v,l,b){const g=l.getStartLineNumber(v.originalStart),w=l.getStartColumn(v.originalStart),M=l.getEndLineNumber(v.originalStart+v.originalLength-1),y=l.getEndColumn(v.originalStart+v.originalLength-1),_=b.getStartLineNumber(v.modifiedStart),C=b.getStartColumn(v.modifiedStart),R=b.getEndLineNumber(v.modifiedStart+v.modifiedLength-1),D=b.getEndColumn(v.modifiedStart+v.modifiedLength-1);return new s(g,w,M,y,_,C,R,D)}}function o(E){if(E.length<=1)return E;const v=[E[0]];let l=v[0];for(let b=1,g=E.length;b0&&l.originalLength<20&&l.modifiedLength>0&&l.modifiedLength<20&&w()){const O=b.createCharSequence(v,l.originalStart,l.originalStart+l.originalLength-1),z=g.createCharSequence(v,l.modifiedStart,l.modifiedStart+l.modifiedLength-1);if(O.getElements().length>0&&z.getElements().length>0){let j=e(O,z,w,!0).changes;y&&(j=o(j)),T=[];for(let F=0,q=j.length;F1&&j>1;){const F=T.charCodeAt(z-2),q=O.charCodeAt(j-2);if(F!==q)break;z--,j--}(z>1||j>1)&&this._pushTrimWhitespaceCharChange(g,w+1,1,z,M+1,1,j)}{let z=N(T,1),j=N(O,1);const F=T.length+1,q=O.length+1;for(;z!0;const v=Date.now();return()=>Date.now()-vnew i.LegacyLinesDiffComputer,getDefault:()=>new x.DefaultLinesDiffComputer}}),X(J[59],Z([0,1,40]),function(W,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.computeDefaultDocumentColors=e;function x(h){const r=[];for(const s of h){const o=Number(s);(o||o===0&&s.replace(/\s/g,"")!=="")&&r.push(o)}return r}function A(h,r,s,o){return{red:h/255,blue:s/255,green:r/255,alpha:o}}function d(h,r){const s=r.index,o=r[0].length;if(!s)return;const u=h.positionAt(s);return{startLineNumber:u.lineNumber,startColumn:u.column,endLineNumber:u.lineNumber,endColumn:u.column+o}}function f(h,r){if(!h)return;const s=i.Color.Format.CSS.parseHex(r);if(s)return{range:h,color:A(s.rgba.r,s.rgba.g,s.rgba.b,s.rgba.a)}}function p(h,r,s){if(!h||r.length!==1)return;const u=r[0].values(),S=x(u);return{range:h,color:A(S[0],S[1],S[2],s?S[3]:1)}}function c(h,r,s){if(!h||r.length!==1)return;const u=r[0].values(),S=x(u),L=new i.Color(new i.HSLA(S[0],S[1]/100,S[2]/100,s?S[3]:1));return{range:h,color:A(L.rgba.r,L.rgba.g,L.rgba.b,L.rgba.a)}}function a(h,r){return typeof h=="string"?[...h.matchAll(r)]:h.findMatches(r)}function m(h){const r=[],o=a(h,/\b(rgb|rgba|hsl|hsla)(\([0-9\s,.\%]*\))|(#)([A-Fa-f0-9]{3})\b|(#)([A-Fa-f0-9]{4})\b|(#)([A-Fa-f0-9]{6})\b|(#)([A-Fa-f0-9]{8})\b/gm);if(o.length>0)for(const u of o){const S=u.filter(E=>E!==void 0),L=S[1],N=S[2];if(!N)continue;let P;if(L==="rgb"){const E=/^\(\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*\)$/gm;P=p(d(h,u),a(N,E),!1)}else if(L==="rgba"){const E=/^\(\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\s*\)$/gm;P=p(d(h,u),a(N,E),!0)}else if(L==="hsl"){const E=/^\(\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*\)$/gm;P=c(d(h,u),a(N,E),!1)}else if(L==="hsla"){const E=/^\(\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\s*\)$/gm;P=c(d(h,u),a(N,E),!0)}else L==="#"&&(P=f(d(h,u),L+N));P&&r.push(P)}return r}function e(h){return!h||typeof h.getValue!="function"||typeof h.positionAt!="function"?[]:m(h)}}),X(J[60],Z([0,1,29]),function(W,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.LinkComputer=n.StateMachine=void 0,n.computeLinks=m;class x{constructor(h,r,s){const o=new Uint8Array(h*r);for(let u=0,S=h*r;ur&&(r=N),L>s&&(s=L),P>s&&(s=P)}r++,s++;const o=new x(s,r,0);for(let u=0,S=h.length;u=this._maxCharCode?0:this._states.get(h,r)}}n.StateMachine=A;let d=null;function f(){return d===null&&(d=new A([[1,104,2],[1,72,2],[1,102,6],[1,70,6],[2,116,3],[2,84,3],[3,116,4],[3,84,4],[4,112,5],[4,80,5],[5,115,9],[5,83,9],[5,58,10],[6,105,7],[6,73,7],[7,108,8],[7,76,8],[8,101,9],[8,69,9],[9,58,10],[10,47,11],[11,47,12]])),d}let p=null;function c(){if(p===null){p=new i.CharacterClassifier(0);const e=` <>'"\u3001\u3002\uFF61\uFF64\uFF0C\uFF0E\uFF1A\uFF1B\u2018\u3008\u300C\u300E\u3014\uFF08\uFF3B\uFF5B\uFF62\uFF63\uFF5D\uFF3D\uFF09\u3015\u300F\u300D\u3009\u2019\uFF40\uFF5E\u2026`;for(let r=0;ro);if(o>0){const L=r.charCodeAt(o-1),N=r.charCodeAt(S);(L===40&&N===41||L===91&&N===93||L===123&&N===125)&&S--}return{range:{startLineNumber:s,startColumn:o+1,endLineNumber:s,endColumn:S+2},url:r.substring(o,S+1)}}static computeLinks(h,r=f()){const s=c(),o=[];for(let u=1,S=h.getLineCount();u<=S;u++){const L=h.getLineContent(u),N=L.length;let P=0,E=0,v=0,l=1,b=!1,g=!1,w=!1,M=!1;for(;P=0?(p+=f?1:-1,p<0?p=A.length-1:p%=A.length,A[p]):null}}n.BasicInplaceReplace=i}),X(J[62],Z([0,1,27]),function(W,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.ApplyEditsResult=n.SearchData=n.ValidAnnotatedEditOperation=n.FindMatch=n.TextModelResolvedOptions=n.InjectedTextCursorStops=n.GlyphMarginLane=n.OverviewRulerLane=void 0,n.isITextSnapshot=c,n.shouldSynchronizeModel=h;var x;(function(r){r[r.Left=1]="Left",r[r.Center=2]="Center",r[r.Right=4]="Right",r[r.Full=7]="Full"})(x||(n.OverviewRulerLane=x={}));var A;(function(r){r[r.Left=1]="Left",r[r.Center=2]="Center",r[r.Right=3]="Right"})(A||(n.GlyphMarginLane=A={}));var d;(function(r){r[r.Both=0]="Both",r[r.Right=1]="Right",r[r.Left=2]="Left",r[r.None=3]="None"})(d||(n.InjectedTextCursorStops=d={}));class f{get originalIndentSize(){return this._indentSizeIsTabSize?"tabSize":this.indentSize}constructor(s){this._textModelResolvedOptionsBrand=void 0,this.tabSize=Math.max(1,s.tabSize|0),s.indentSize==="tabSize"?(this.indentSize=this.tabSize,this._indentSizeIsTabSize=!0):(this.indentSize=Math.max(1,s.indentSize|0),this._indentSizeIsTabSize=!1),this.insertSpaces=!!s.insertSpaces,this.defaultEOL=s.defaultEOL|0,this.trimAutoWhitespace=!!s.trimAutoWhitespace,this.bracketPairColorizationOptions=s.bracketPairColorizationOptions}equals(s){return this.tabSize===s.tabSize&&this._indentSizeIsTabSize===s._indentSizeIsTabSize&&this.indentSize===s.indentSize&&this.insertSpaces===s.insertSpaces&&this.defaultEOL===s.defaultEOL&&this.trimAutoWhitespace===s.trimAutoWhitespace&&(0,i.equals)(this.bracketPairColorizationOptions,s.bracketPairColorizationOptions)}createChangeEvent(s){return{tabSize:this.tabSize!==s.tabSize,indentSize:this.indentSize!==s.indentSize,insertSpaces:this.insertSpaces!==s.insertSpaces,trimAutoWhitespace:this.trimAutoWhitespace!==s.trimAutoWhitespace}}}n.TextModelResolvedOptions=f;class p{constructor(s,o){this._findMatchBrand=void 0,this.range=s,this.matches=o}}n.FindMatch=p;function c(r){return r&&typeof r.read=="function"}class a{constructor(s,o,u,S,L,N){this.identifier=s,this.range=o,this.text=u,this.forceMoveMarkers=S,this.isAutoWhitespaceEdit=L,this._isTracked=N}}n.ValidAnnotatedEditOperation=a;class m{constructor(s,o,u){this.regex=s,this.wordSeparators=o,this.simpleSearch=u}}n.SearchData=m;class e{constructor(s,o,u){this.reverseEdits=s,this.changes=o,this.trimAutoWhitespaceLineNumbers=u}}n.ApplyEditsResult=e;function h(r){return!r.isTooLargeForSyncing()&&!r.isForSimpleWidget}}),X(J[63],Z([0,1,7,28]),function(W,n,i,x){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.PrefixSumIndexOfResult=n.ConstantTimePrefixSumComputer=n.PrefixSumComputer=void 0;class A{constructor(c){this.values=c,this.prefixSum=new Uint32Array(c.length),this.prefixSumValidIndex=new Int32Array(1),this.prefixSumValidIndex[0]=-1}insertValues(c,a){c=(0,x.toUint32)(c);const m=this.values,e=this.prefixSum,h=a.length;return h===0?!1:(this.values=new Uint32Array(m.length+h),this.values.set(m.subarray(0,c),0),this.values.set(m.subarray(c),c+h),this.values.set(a,c),c-1=0&&this.prefixSum.set(e.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}setValue(c,a){return c=(0,x.toUint32)(c),a=(0,x.toUint32)(a),this.values[c]===a?!1:(this.values[c]=a,c-1=m.length)return!1;const h=m.length-c;return a>=h&&(a=h),a===0?!1:(this.values=new Uint32Array(m.length-a),this.values.set(m.subarray(0,c),0),this.values.set(m.subarray(c+a),c),this.prefixSum=new Uint32Array(this.values.length),c-1=0&&this.prefixSum.set(e.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}getTotalSum(){return this.values.length===0?0:this._getPrefixSum(this.values.length-1)}getPrefixSum(c){return c<0?0:(c=(0,x.toUint32)(c),this._getPrefixSum(c))}_getPrefixSum(c){if(c<=this.prefixSumValidIndex[0])return this.prefixSum[c];let a=this.prefixSumValidIndex[0]+1;a===0&&(this.prefixSum[0]=this.values[0],a++),c>=this.values.length&&(c=this.values.length-1);for(let m=a;m<=c;m++)this.prefixSum[m]=this.prefixSum[m-1]+this.values[m];return this.prefixSumValidIndex[0]=Math.max(this.prefixSumValidIndex[0],c),this.prefixSum[c]}getIndexOf(c){c=Math.floor(c),this.getTotalSum();let a=0,m=this.values.length-1,e=0,h=0,r=0;for(;a<=m;)if(e=a+(m-a)/2|0,h=this.prefixSum[e],r=h-this.values[e],c=h)a=e+1;else break;return new f(e,c-r)}}n.PrefixSumComputer=A;class d{constructor(c){this._values=c,this._isValid=!1,this._validEndIndex=-1,this._prefixSum=[],this._indexBySum=[]}getTotalSum(){return this._ensureValid(),this._indexBySum.length}getPrefixSum(c){return this._ensureValid(),c===0?0:this._prefixSum[c-1]}getIndexOf(c){this._ensureValid();const a=this._indexBySum[c],m=a>0?this._prefixSum[a-1]:0;return new f(a,c-m)}removeValues(c,a){this._values.splice(c,a),this._invalidate(c)}insertValues(c,a){this._values=(0,i.arrayInsert)(this._values,c,a),this._invalidate(c)}_invalidate(c){this._isValid=!1,this._validEndIndex=Math.min(this._validEndIndex,c-1)}_ensureValid(){if(!this._isValid){for(let c=this._validEndIndex+1,a=this._values.length;c0?this._prefixSum[c-1]:0;this._prefixSum[c]=e+m;for(let h=0;h=0;let N=null;try{N=i.createRegExp(this.searchString,this.isRegex,{matchCase:this.matchCase,wholeWord:!1,multiline:L,global:!0,unicode:!0})}catch{return null}if(!N)return null;let P=!this.isRegex&&!L;return P&&this.searchString.toLowerCase()!==this.searchString.toUpperCase()&&(P=this.matchCase),new f.SearchData(N,this.wordSeparators?(0,x.getMapForWordSeparators)(this.wordSeparators,[]):null,P?this.searchString:null)}}n.SearchParams=c;function a(S){if(!S||S.length===0)return!1;for(let L=0,N=S.length;L=N)break;const E=S.charCodeAt(L);if(E===110||E===114||E===87)return!0}}return!1}function m(S,L,N){if(!N)return new f.FindMatch(S,null);const P=[];for(let E=0,v=L.length;E>0);N[v]>=L?E=v-1:N[v+1]>=L?(P=v,E=v):P=v+1}return P+1}}class h{static findMatches(L,N,P,E,v){const l=N.parseSearchRequest();return l?l.regex.multiline?this._doFindMatchesMultiline(L,P,new u(l.wordSeparators,l.regex),E,v):this._doFindMatchesLineByLine(L,P,l,E,v):[]}static _getMultilineMatchRange(L,N,P,E,v,l){let b,g=0;E?(g=E.findLineFeedCountBeforeOffset(v),b=N+v+g):b=N+v;let w;if(E){const C=E.findLineFeedCountBeforeOffset(v+l.length)-g;w=b+l.length+C}else w=b+l.length;const M=L.getPositionAt(b),y=L.getPositionAt(w);return new d.Range(M.lineNumber,M.column,y.lineNumber,y.column)}static _doFindMatchesMultiline(L,N,P,E,v){const l=L.getOffsetAt(N.getStartPosition()),b=L.getValueInRange(N,1),g=L.getEOL()===`\r -`?new e(b):null,w=[];let M=0,y;for(P.reset(0);y=P.next(b);)if(w[M++]=m(this._getMultilineMatchRange(L,l,b,g,y.index,y[0]),y,E),M>=v)return w;return w}static _doFindMatchesLineByLine(L,N,P,E,v){const l=[];let b=0;if(N.startLineNumber===N.endLineNumber){const w=L.getLineContent(N.startLineNumber).substring(N.startColumn-1,N.endColumn-1);return b=this._findMatchesInLine(P,w,N.startLineNumber,N.startColumn-1,b,l,E,v),l}const g=L.getLineContent(N.startLineNumber).substring(N.startColumn-1);b=this._findMatchesInLine(P,g,N.startLineNumber,N.startColumn-1,b,l,E,v);for(let w=N.startLineNumber+1;w=g))return v;return v}const M=new u(L.wordSeparators,L.regex);let y;M.reset(0);do if(y=M.next(N),y&&(l[v++]=m(new d.Range(P,y.index+1+E,P,y.index+1+y[0].length+E),y,b),v>=g))return v;while(y);return v}static findNextMatch(L,N,P,E){const v=N.parseSearchRequest();if(!v)return null;const l=new u(v.wordSeparators,v.regex);return v.regex.multiline?this._doFindNextMatchMultiline(L,P,l,E):this._doFindNextMatchLineByLine(L,P,l,E)}static _doFindNextMatchMultiline(L,N,P,E){const v=new A.Position(N.lineNumber,1),l=L.getOffsetAt(v),b=L.getLineCount(),g=L.getValueInRange(new d.Range(v.lineNumber,v.column,b,L.getLineMaxColumn(b)),1),w=L.getEOL()===`\r -`?new e(g):null;P.reset(N.column-1);const M=P.next(g);return M?m(this._getMultilineMatchRange(L,l,g,w,M.index,M[0]),M,E):N.lineNumber!==1||N.column!==1?this._doFindNextMatchMultiline(L,new A.Position(1,1),P,E):null}static _doFindNextMatchLineByLine(L,N,P,E){const v=L.getLineCount(),l=N.lineNumber,b=L.getLineContent(l),g=this._findFirstMatchInLine(P,b,l,N.column,E);if(g)return g;for(let w=1;w<=v;w++){const M=(l+w-1)%v,y=L.getLineContent(M+1),_=this._findFirstMatchInLine(P,y,M+1,1,E);if(_)return _}return null}static _findFirstMatchInLine(L,N,P,E,v){L.reset(E-1);const l=L.next(N);return l?m(new d.Range(P,l.index+1,P,l.index+1+l[0].length),l,v):null}static findPreviousMatch(L,N,P,E){const v=N.parseSearchRequest();if(!v)return null;const l=new u(v.wordSeparators,v.regex);return v.regex.multiline?this._doFindPreviousMatchMultiline(L,P,l,E):this._doFindPreviousMatchLineByLine(L,P,l,E)}static _doFindPreviousMatchMultiline(L,N,P,E){const v=this._doFindMatchesMultiline(L,new d.Range(1,1,N.lineNumber,N.column),P,E,10*p);if(v.length>0)return v[v.length-1];const l=L.getLineCount();return N.lineNumber!==l||N.column!==L.getLineMaxColumn(l)?this._doFindPreviousMatchMultiline(L,new A.Position(l,L.getLineMaxColumn(l)),P,E):null}static _doFindPreviousMatchLineByLine(L,N,P,E){const v=L.getLineCount(),l=N.lineNumber,b=L.getLineContent(l).substring(0,N.column-1),g=this._findLastMatchInLine(P,b,l,E);if(g)return g;for(let w=1;w<=v;w++){const M=(v+l-w-1)%v,y=L.getLineContent(M+1),_=this._findLastMatchInLine(P,y,M+1,E);if(_)return _}return null}static _findLastMatchInLine(L,N,P,E){let v=null,l;for(L.reset(0);l=L.next(N);)v=m(new d.Range(P,l.index+1,P,l.index+1+l[0].length),l,E);return v}}n.TextModelSearch=h;function r(S,L,N,P,E){if(P===0)return!0;const v=L.charCodeAt(P-1);if(S.get(v)!==0||v===13||v===10)return!0;if(E>0){const l=L.charCodeAt(P);if(S.get(l)!==0)return!0}return!1}function s(S,L,N,P,E){if(P+E===N)return!0;const v=L.charCodeAt(P+E);if(S.get(v)!==0||v===13||v===10)return!0;if(E>0){const l=L.charCodeAt(P+E-1);if(S.get(l)!==0)return!0}return!1}function o(S,L,N,P,E){return r(S,L,N,P,E)&&s(S,L,N,P,E)}class u{constructor(L,N){this._wordSeparators=L,this._searchRegex=N,this._prevMatchStartIndex=-1,this._prevMatchLength=0}reset(L){this._searchRegex.lastIndex=L,this._prevMatchStartIndex=-1,this._prevMatchLength=0}next(L){const N=L.length;let P;do{if(this._prevMatchStartIndex+this._prevMatchLength===N||(P=this._searchRegex.exec(L),!P))return null;const E=P.index,v=P[0].length;if(E===this._prevMatchStartIndex&&v===this._prevMatchLength){if(v===0){i.getNextCodePoint(L,N,this._searchRegex.lastIndex)>65535?this._searchRegex.lastIndex+=2:this._searchRegex.lastIndex+=1;continue}return null}if(this._prevMatchStartIndex=E,this._prevMatchLength=v,!this._wordSeparators||o(this._wordSeparators,L,N,E,v))return P}while(P);return null}}n.Searcher=u}),X(J[66],Z([0,1]),function(W,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.EditorWorkerHost=void 0;class i{static{this.CHANNEL_NAME="editorWorkerHost"}static getChannel(A){return A.getChannel(i.CHANNEL_NAME)}static setChannel(A,d){A.setChannel(i.CHANNEL_NAME,d)}}n.EditorWorkerHost=i}),X(J[67],Z([0,1]),function(W,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.findSectionHeaders=A;const i=new RegExp("\\bMARK:\\s*(.*)$","d"),x=/^-+|-+$/g;function A(a,m){let e=[];if(m.findRegionSectionHeaders&&m.foldingRules?.markers){const h=d(a,m);e=e.concat(h)}if(m.findMarkSectionHeaders){const h=f(a);e=e.concat(h)}return e}function d(a,m){const e=[],h=a.getLineCount();for(let r=1;r<=h;r++){const s=a.getLineContent(r),o=s.match(m.foldingRules.markers.start);if(o){const u={startLineNumber:r,startColumn:o[0].length+1,endLineNumber:r,endColumn:s.length+1};if(u.endColumn>u.startColumn){const S={range:u,...c(s.substring(o[0].length)),shouldBeInComments:!1};(S.text||S.hasSeparatorLine)&&e.push(S)}}}return e}function f(a){const m=[],e=a.getLineCount();for(let h=1;h<=e;h++){const r=a.getLineContent(h);p(r,h,m)}return m}function p(a,m,e){i.lastIndex=0;const h=i.exec(a);if(h){const r=h.indices[1][0]+1,s=h.indices[1][1]+1,o={startLineNumber:m,startColumn:r,endLineNumber:m,endColumn:s};if(o.endColumn>o.startColumn){const u={range:o,...c(h[1]),shouldBeInComments:!0};(u.text||u.hasSeparatorLine)&&e.push(u)}}}function c(a){a=a.trim();const m=a.startsWith("-");return a=a.replace(x,""),{text:a,hasSeparatorLine:m}}}),X(J[68],Z([0,1,2,65,6,12,31]),function(W,n,i,x,A,d,f){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.UnicodeTextModelHighlighter=void 0;class p{static computeUnicodeHighlights(h,r,s){const o=s?s.startLineNumber:1,u=s?s.endLineNumber:h.getLineCount(),S=new a(r),L=S.getCandidateCodePoints();let N;L==="allNonBasicAscii"?N=new RegExp("[^\\t\\n\\r\\x20-\\x7E]","g"):N=new RegExp(`${c(Array.from(L))}`,"g");const P=new x.Searcher(null,N),E=[];let v=!1,l,b=0,g=0,w=0;e:for(let M=o,y=u;M<=y;M++){const _=h.getLineContent(M),C=_.length;P.reset(0);do if(l=P.next(_),l){let R=l.index,D=l.index+l[0].length;if(R>0){const j=_.charCodeAt(R-1);A.isHighSurrogate(j)&&R--}if(D+1=1e3){v=!0;break e}E.push(new i.Range(M,R+1,M,D+1))}}while(l)}return{ranges:E,hasMore:v,ambiguousCharacterCount:b,invisibleCharacterCount:g,nonBasicAsciiCharacterCount:w}}static computeUnicodeHighlightReason(h,r){const s=new a(r);switch(s.shouldHighlightNonBasicASCII(h,null)){case 0:return null;case 2:return{kind:1};case 3:{const u=h.codePointAt(0),S=s.ambiguousCharacters.getPrimaryConfusable(u),L=A.AmbiguousCharacters.getLocales().filter(N=>!A.AmbiguousCharacters.getInstance(new Set([...r.allowedLocales,N])).isAmbiguous(u));return{kind:0,confusableWith:String.fromCodePoint(S),notAmbiguousInLocales:L}}case 1:return{kind:2}}}}n.UnicodeTextModelHighlighter=p;function c(e,h){return`[${A.escapeRegExpCharacters(e.map(s=>String.fromCodePoint(s)).join(""))}]`}class a{constructor(h){this.options=h,this.allowedCodePoints=new Set(h.allowedCodePoints),this.ambiguousCharacters=A.AmbiguousCharacters.getInstance(new Set(h.allowedLocales))}getCandidateCodePoints(){if(this.options.nonBasicASCII)return"allNonBasicAscii";const h=new Set;if(this.options.invisibleCharacters)for(const r of A.InvisibleCharacters.codePoints)m(String.fromCodePoint(r))||h.add(r);if(this.options.ambiguousCharacters)for(const r of this.ambiguousCharacters.getConfusableCodePoints())h.add(r);for(const r of this.allowedCodePoints)h.delete(r);return h}shouldHighlightNonBasicASCII(h,r){const s=h.codePointAt(0);if(this.allowedCodePoints.has(s))return 0;if(this.options.nonBasicASCII)return 1;let o=!1,u=!1;if(r)for(const S of r){const L=S.codePointAt(0),N=A.isBasicASCII(S);o=o||N,!N&&!this.ambiguousCharacters.isAmbiguous(L)&&!A.InvisibleCharacters.isInvisibleCharacter(L)&&(u=!0)}return!o&&u?0:this.options.invisibleCharacters&&!m(h)&&A.InvisibleCharacters.isInvisibleCharacter(s)?2:this.options.ambiguousCharacters&&this.ambiguousCharacters.isAmbiguous(s)?3:0}}function m(e){return e===" "||e===` -`||e===" "}}),X(J[69],Z([0,1]),function(W,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.WrappingIndent=n.TrackedRangeStickiness=n.TextEditorCursorStyle=n.TextEditorCursorBlinkingStyle=n.SymbolTag=n.SymbolKind=n.SignatureHelpTriggerKind=n.ShowLightbulbIconMode=n.SelectionDirection=n.ScrollbarVisibility=n.ScrollType=n.RenderMinimap=n.RenderLineNumbersType=n.PositionAffinity=n.PartialAcceptTriggerKind=n.OverviewRulerLane=n.OverlayWidgetPositionPreference=n.NewSymbolNameTriggerKind=n.NewSymbolNameTag=n.MouseTargetType=n.MinimapSectionHeaderStyle=n.MinimapPosition=n.MarkerTag=n.MarkerSeverity=n.KeyCode=n.InlineEditTriggerKind=n.InlineCompletionTriggerKind=n.InlayHintKind=n.InjectedTextCursorStops=n.IndentAction=n.HoverVerbosityAction=n.GlyphMarginLane=n.EndOfLineSequence=n.EndOfLinePreference=n.EditorOption=n.EditorAutoIndentStrategy=n.DocumentHighlightKind=n.DefaultEndOfLine=n.CursorChangeReason=n.ContentWidgetPositionPreference=n.CompletionTriggerKind=n.CompletionItemTag=n.CompletionItemKind=n.CompletionItemInsertTextRule=n.CodeActionTriggerType=n.AccessibilitySupport=void 0;var i;(function(t){t[t.Unknown=0]="Unknown",t[t.Disabled=1]="Disabled",t[t.Enabled=2]="Enabled"})(i||(n.AccessibilitySupport=i={}));var x;(function(t){t[t.Invoke=1]="Invoke",t[t.Auto=2]="Auto"})(x||(n.CodeActionTriggerType=x={}));var A;(function(t){t[t.None=0]="None",t[t.KeepWhitespace=1]="KeepWhitespace",t[t.InsertAsSnippet=4]="InsertAsSnippet"})(A||(n.CompletionItemInsertTextRule=A={}));var d;(function(t){t[t.Method=0]="Method",t[t.Function=1]="Function",t[t.Constructor=2]="Constructor",t[t.Field=3]="Field",t[t.Variable=4]="Variable",t[t.Class=5]="Class",t[t.Struct=6]="Struct",t[t.Interface=7]="Interface",t[t.Module=8]="Module",t[t.Property=9]="Property",t[t.Event=10]="Event",t[t.Operator=11]="Operator",t[t.Unit=12]="Unit",t[t.Value=13]="Value",t[t.Constant=14]="Constant",t[t.Enum=15]="Enum",t[t.EnumMember=16]="EnumMember",t[t.Keyword=17]="Keyword",t[t.Text=18]="Text",t[t.Color=19]="Color",t[t.File=20]="File",t[t.Reference=21]="Reference",t[t.Customcolor=22]="Customcolor",t[t.Folder=23]="Folder",t[t.TypeParameter=24]="TypeParameter",t[t.User=25]="User",t[t.Issue=26]="Issue",t[t.Snippet=27]="Snippet"})(d||(n.CompletionItemKind=d={}));var f;(function(t){t[t.Deprecated=1]="Deprecated"})(f||(n.CompletionItemTag=f={}));var p;(function(t){t[t.Invoke=0]="Invoke",t[t.TriggerCharacter=1]="TriggerCharacter",t[t.TriggerForIncompleteCompletions=2]="TriggerForIncompleteCompletions"})(p||(n.CompletionTriggerKind=p={}));var c;(function(t){t[t.EXACT=0]="EXACT",t[t.ABOVE=1]="ABOVE",t[t.BELOW=2]="BELOW"})(c||(n.ContentWidgetPositionPreference=c={}));var a;(function(t){t[t.NotSet=0]="NotSet",t[t.ContentFlush=1]="ContentFlush",t[t.RecoverFromMarkers=2]="RecoverFromMarkers",t[t.Explicit=3]="Explicit",t[t.Paste=4]="Paste",t[t.Undo=5]="Undo",t[t.Redo=6]="Redo"})(a||(n.CursorChangeReason=a={}));var m;(function(t){t[t.LF=1]="LF",t[t.CRLF=2]="CRLF"})(m||(n.DefaultEndOfLine=m={}));var e;(function(t){t[t.Text=0]="Text",t[t.Read=1]="Read",t[t.Write=2]="Write"})(e||(n.DocumentHighlightKind=e={}));var h;(function(t){t[t.None=0]="None",t[t.Keep=1]="Keep",t[t.Brackets=2]="Brackets",t[t.Advanced=3]="Advanced",t[t.Full=4]="Full"})(h||(n.EditorAutoIndentStrategy=h={}));var r;(function(t){t[t.acceptSuggestionOnCommitCharacter=0]="acceptSuggestionOnCommitCharacter",t[t.acceptSuggestionOnEnter=1]="acceptSuggestionOnEnter",t[t.accessibilitySupport=2]="accessibilitySupport",t[t.accessibilityPageSize=3]="accessibilityPageSize",t[t.ariaLabel=4]="ariaLabel",t[t.ariaRequired=5]="ariaRequired",t[t.autoClosingBrackets=6]="autoClosingBrackets",t[t.autoClosingComments=7]="autoClosingComments",t[t.screenReaderAnnounceInlineSuggestion=8]="screenReaderAnnounceInlineSuggestion",t[t.autoClosingDelete=9]="autoClosingDelete",t[t.autoClosingOvertype=10]="autoClosingOvertype",t[t.autoClosingQuotes=11]="autoClosingQuotes",t[t.autoIndent=12]="autoIndent",t[t.automaticLayout=13]="automaticLayout",t[t.autoSurround=14]="autoSurround",t[t.bracketPairColorization=15]="bracketPairColorization",t[t.guides=16]="guides",t[t.codeLens=17]="codeLens",t[t.codeLensFontFamily=18]="codeLensFontFamily",t[t.codeLensFontSize=19]="codeLensFontSize",t[t.colorDecorators=20]="colorDecorators",t[t.colorDecoratorsLimit=21]="colorDecoratorsLimit",t[t.columnSelection=22]="columnSelection",t[t.comments=23]="comments",t[t.contextmenu=24]="contextmenu",t[t.copyWithSyntaxHighlighting=25]="copyWithSyntaxHighlighting",t[t.cursorBlinking=26]="cursorBlinking",t[t.cursorSmoothCaretAnimation=27]="cursorSmoothCaretAnimation",t[t.cursorStyle=28]="cursorStyle",t[t.cursorSurroundingLines=29]="cursorSurroundingLines",t[t.cursorSurroundingLinesStyle=30]="cursorSurroundingLinesStyle",t[t.cursorWidth=31]="cursorWidth",t[t.disableLayerHinting=32]="disableLayerHinting",t[t.disableMonospaceOptimizations=33]="disableMonospaceOptimizations",t[t.domReadOnly=34]="domReadOnly",t[t.dragAndDrop=35]="dragAndDrop",t[t.dropIntoEditor=36]="dropIntoEditor",t[t.emptySelectionClipboard=37]="emptySelectionClipboard",t[t.experimentalWhitespaceRendering=38]="experimentalWhitespaceRendering",t[t.extraEditorClassName=39]="extraEditorClassName",t[t.fastScrollSensitivity=40]="fastScrollSensitivity",t[t.find=41]="find",t[t.fixedOverflowWidgets=42]="fixedOverflowWidgets",t[t.folding=43]="folding",t[t.foldingStrategy=44]="foldingStrategy",t[t.foldingHighlight=45]="foldingHighlight",t[t.foldingImportsByDefault=46]="foldingImportsByDefault",t[t.foldingMaximumRegions=47]="foldingMaximumRegions",t[t.unfoldOnClickAfterEndOfLine=48]="unfoldOnClickAfterEndOfLine",t[t.fontFamily=49]="fontFamily",t[t.fontInfo=50]="fontInfo",t[t.fontLigatures=51]="fontLigatures",t[t.fontSize=52]="fontSize",t[t.fontWeight=53]="fontWeight",t[t.fontVariations=54]="fontVariations",t[t.formatOnPaste=55]="formatOnPaste",t[t.formatOnType=56]="formatOnType",t[t.glyphMargin=57]="glyphMargin",t[t.gotoLocation=58]="gotoLocation",t[t.hideCursorInOverviewRuler=59]="hideCursorInOverviewRuler",t[t.hover=60]="hover",t[t.inDiffEditor=61]="inDiffEditor",t[t.inlineSuggest=62]="inlineSuggest",t[t.inlineEdit=63]="inlineEdit",t[t.letterSpacing=64]="letterSpacing",t[t.lightbulb=65]="lightbulb",t[t.lineDecorationsWidth=66]="lineDecorationsWidth",t[t.lineHeight=67]="lineHeight",t[t.lineNumbers=68]="lineNumbers",t[t.lineNumbersMinChars=69]="lineNumbersMinChars",t[t.linkedEditing=70]="linkedEditing",t[t.links=71]="links",t[t.matchBrackets=72]="matchBrackets",t[t.minimap=73]="minimap",t[t.mouseStyle=74]="mouseStyle",t[t.mouseWheelScrollSensitivity=75]="mouseWheelScrollSensitivity",t[t.mouseWheelZoom=76]="mouseWheelZoom",t[t.multiCursorMergeOverlapping=77]="multiCursorMergeOverlapping",t[t.multiCursorModifier=78]="multiCursorModifier",t[t.multiCursorPaste=79]="multiCursorPaste",t[t.multiCursorLimit=80]="multiCursorLimit",t[t.occurrencesHighlight=81]="occurrencesHighlight",t[t.overviewRulerBorder=82]="overviewRulerBorder",t[t.overviewRulerLanes=83]="overviewRulerLanes",t[t.padding=84]="padding",t[t.pasteAs=85]="pasteAs",t[t.parameterHints=86]="parameterHints",t[t.peekWidgetDefaultFocus=87]="peekWidgetDefaultFocus",t[t.placeholder=88]="placeholder",t[t.definitionLinkOpensInPeek=89]="definitionLinkOpensInPeek",t[t.quickSuggestions=90]="quickSuggestions",t[t.quickSuggestionsDelay=91]="quickSuggestionsDelay",t[t.readOnly=92]="readOnly",t[t.readOnlyMessage=93]="readOnlyMessage",t[t.renameOnType=94]="renameOnType",t[t.renderControlCharacters=95]="renderControlCharacters",t[t.renderFinalNewline=96]="renderFinalNewline",t[t.renderLineHighlight=97]="renderLineHighlight",t[t.renderLineHighlightOnlyWhenFocus=98]="renderLineHighlightOnlyWhenFocus",t[t.renderValidationDecorations=99]="renderValidationDecorations",t[t.renderWhitespace=100]="renderWhitespace",t[t.revealHorizontalRightPadding=101]="revealHorizontalRightPadding",t[t.roundedSelection=102]="roundedSelection",t[t.rulers=103]="rulers",t[t.scrollbar=104]="scrollbar",t[t.scrollBeyondLastColumn=105]="scrollBeyondLastColumn",t[t.scrollBeyondLastLine=106]="scrollBeyondLastLine",t[t.scrollPredominantAxis=107]="scrollPredominantAxis",t[t.selectionClipboard=108]="selectionClipboard",t[t.selectionHighlight=109]="selectionHighlight",t[t.selectOnLineNumbers=110]="selectOnLineNumbers",t[t.showFoldingControls=111]="showFoldingControls",t[t.showUnused=112]="showUnused",t[t.snippetSuggestions=113]="snippetSuggestions",t[t.smartSelect=114]="smartSelect",t[t.smoothScrolling=115]="smoothScrolling",t[t.stickyScroll=116]="stickyScroll",t[t.stickyTabStops=117]="stickyTabStops",t[t.stopRenderingLineAfter=118]="stopRenderingLineAfter",t[t.suggest=119]="suggest",t[t.suggestFontSize=120]="suggestFontSize",t[t.suggestLineHeight=121]="suggestLineHeight",t[t.suggestOnTriggerCharacters=122]="suggestOnTriggerCharacters",t[t.suggestSelection=123]="suggestSelection",t[t.tabCompletion=124]="tabCompletion",t[t.tabIndex=125]="tabIndex",t[t.unicodeHighlighting=126]="unicodeHighlighting",t[t.unusualLineTerminators=127]="unusualLineTerminators",t[t.useShadowDOM=128]="useShadowDOM",t[t.useTabStops=129]="useTabStops",t[t.wordBreak=130]="wordBreak",t[t.wordSegmenterLocales=131]="wordSegmenterLocales",t[t.wordSeparators=132]="wordSeparators",t[t.wordWrap=133]="wordWrap",t[t.wordWrapBreakAfterCharacters=134]="wordWrapBreakAfterCharacters",t[t.wordWrapBreakBeforeCharacters=135]="wordWrapBreakBeforeCharacters",t[t.wordWrapColumn=136]="wordWrapColumn",t[t.wordWrapOverride1=137]="wordWrapOverride1",t[t.wordWrapOverride2=138]="wordWrapOverride2",t[t.wrappingIndent=139]="wrappingIndent",t[t.wrappingStrategy=140]="wrappingStrategy",t[t.showDeprecated=141]="showDeprecated",t[t.inlayHints=142]="inlayHints",t[t.editorClassName=143]="editorClassName",t[t.pixelRatio=144]="pixelRatio",t[t.tabFocusMode=145]="tabFocusMode",t[t.layoutInfo=146]="layoutInfo",t[t.wrappingInfo=147]="wrappingInfo",t[t.defaultColorDecorators=148]="defaultColorDecorators",t[t.colorDecoratorsActivatedOn=149]="colorDecoratorsActivatedOn",t[t.inlineCompletionsAccessibilityVerbose=150]="inlineCompletionsAccessibilityVerbose"})(r||(n.EditorOption=r={}));var s;(function(t){t[t.TextDefined=0]="TextDefined",t[t.LF=1]="LF",t[t.CRLF=2]="CRLF"})(s||(n.EndOfLinePreference=s={}));var o;(function(t){t[t.LF=0]="LF",t[t.CRLF=1]="CRLF"})(o||(n.EndOfLineSequence=o={}));var u;(function(t){t[t.Left=1]="Left",t[t.Center=2]="Center",t[t.Right=3]="Right"})(u||(n.GlyphMarginLane=u={}));var S;(function(t){t[t.Increase=0]="Increase",t[t.Decrease=1]="Decrease"})(S||(n.HoverVerbosityAction=S={}));var L;(function(t){t[t.None=0]="None",t[t.Indent=1]="Indent",t[t.IndentOutdent=2]="IndentOutdent",t[t.Outdent=3]="Outdent"})(L||(n.IndentAction=L={}));var N;(function(t){t[t.Both=0]="Both",t[t.Right=1]="Right",t[t.Left=2]="Left",t[t.None=3]="None"})(N||(n.InjectedTextCursorStops=N={}));var P;(function(t){t[t.Type=1]="Type",t[t.Parameter=2]="Parameter"})(P||(n.InlayHintKind=P={}));var E;(function(t){t[t.Automatic=0]="Automatic",t[t.Explicit=1]="Explicit"})(E||(n.InlineCompletionTriggerKind=E={}));var v;(function(t){t[t.Invoke=0]="Invoke",t[t.Automatic=1]="Automatic"})(v||(n.InlineEditTriggerKind=v={}));var l;(function(t){t[t.DependsOnKbLayout=-1]="DependsOnKbLayout",t[t.Unknown=0]="Unknown",t[t.Backspace=1]="Backspace",t[t.Tab=2]="Tab",t[t.Enter=3]="Enter",t[t.Shift=4]="Shift",t[t.Ctrl=5]="Ctrl",t[t.Alt=6]="Alt",t[t.PauseBreak=7]="PauseBreak",t[t.CapsLock=8]="CapsLock",t[t.Escape=9]="Escape",t[t.Space=10]="Space",t[t.PageUp=11]="PageUp",t[t.PageDown=12]="PageDown",t[t.End=13]="End",t[t.Home=14]="Home",t[t.LeftArrow=15]="LeftArrow",t[t.UpArrow=16]="UpArrow",t[t.RightArrow=17]="RightArrow",t[t.DownArrow=18]="DownArrow",t[t.Insert=19]="Insert",t[t.Delete=20]="Delete",t[t.Digit0=21]="Digit0",t[t.Digit1=22]="Digit1",t[t.Digit2=23]="Digit2",t[t.Digit3=24]="Digit3",t[t.Digit4=25]="Digit4",t[t.Digit5=26]="Digit5",t[t.Digit6=27]="Digit6",t[t.Digit7=28]="Digit7",t[t.Digit8=29]="Digit8",t[t.Digit9=30]="Digit9",t[t.KeyA=31]="KeyA",t[t.KeyB=32]="KeyB",t[t.KeyC=33]="KeyC",t[t.KeyD=34]="KeyD",t[t.KeyE=35]="KeyE",t[t.KeyF=36]="KeyF",t[t.KeyG=37]="KeyG",t[t.KeyH=38]="KeyH",t[t.KeyI=39]="KeyI",t[t.KeyJ=40]="KeyJ",t[t.KeyK=41]="KeyK",t[t.KeyL=42]="KeyL",t[t.KeyM=43]="KeyM",t[t.KeyN=44]="KeyN",t[t.KeyO=45]="KeyO",t[t.KeyP=46]="KeyP",t[t.KeyQ=47]="KeyQ",t[t.KeyR=48]="KeyR",t[t.KeyS=49]="KeyS",t[t.KeyT=50]="KeyT",t[t.KeyU=51]="KeyU",t[t.KeyV=52]="KeyV",t[t.KeyW=53]="KeyW",t[t.KeyX=54]="KeyX",t[t.KeyY=55]="KeyY",t[t.KeyZ=56]="KeyZ",t[t.Meta=57]="Meta",t[t.ContextMenu=58]="ContextMenu",t[t.F1=59]="F1",t[t.F2=60]="F2",t[t.F3=61]="F3",t[t.F4=62]="F4",t[t.F5=63]="F5",t[t.F6=64]="F6",t[t.F7=65]="F7",t[t.F8=66]="F8",t[t.F9=67]="F9",t[t.F10=68]="F10",t[t.F11=69]="F11",t[t.F12=70]="F12",t[t.F13=71]="F13",t[t.F14=72]="F14",t[t.F15=73]="F15",t[t.F16=74]="F16",t[t.F17=75]="F17",t[t.F18=76]="F18",t[t.F19=77]="F19",t[t.F20=78]="F20",t[t.F21=79]="F21",t[t.F22=80]="F22",t[t.F23=81]="F23",t[t.F24=82]="F24",t[t.NumLock=83]="NumLock",t[t.ScrollLock=84]="ScrollLock",t[t.Semicolon=85]="Semicolon",t[t.Equal=86]="Equal",t[t.Comma=87]="Comma",t[t.Minus=88]="Minus",t[t.Period=89]="Period",t[t.Slash=90]="Slash",t[t.Backquote=91]="Backquote",t[t.BracketLeft=92]="BracketLeft",t[t.Backslash=93]="Backslash",t[t.BracketRight=94]="BracketRight",t[t.Quote=95]="Quote",t[t.OEM_8=96]="OEM_8",t[t.IntlBackslash=97]="IntlBackslash",t[t.Numpad0=98]="Numpad0",t[t.Numpad1=99]="Numpad1",t[t.Numpad2=100]="Numpad2",t[t.Numpad3=101]="Numpad3",t[t.Numpad4=102]="Numpad4",t[t.Numpad5=103]="Numpad5",t[t.Numpad6=104]="Numpad6",t[t.Numpad7=105]="Numpad7",t[t.Numpad8=106]="Numpad8",t[t.Numpad9=107]="Numpad9",t[t.NumpadMultiply=108]="NumpadMultiply",t[t.NumpadAdd=109]="NumpadAdd",t[t.NUMPAD_SEPARATOR=110]="NUMPAD_SEPARATOR",t[t.NumpadSubtract=111]="NumpadSubtract",t[t.NumpadDecimal=112]="NumpadDecimal",t[t.NumpadDivide=113]="NumpadDivide",t[t.KEY_IN_COMPOSITION=114]="KEY_IN_COMPOSITION",t[t.ABNT_C1=115]="ABNT_C1",t[t.ABNT_C2=116]="ABNT_C2",t[t.AudioVolumeMute=117]="AudioVolumeMute",t[t.AudioVolumeUp=118]="AudioVolumeUp",t[t.AudioVolumeDown=119]="AudioVolumeDown",t[t.BrowserSearch=120]="BrowserSearch",t[t.BrowserHome=121]="BrowserHome",t[t.BrowserBack=122]="BrowserBack",t[t.BrowserForward=123]="BrowserForward",t[t.MediaTrackNext=124]="MediaTrackNext",t[t.MediaTrackPrevious=125]="MediaTrackPrevious",t[t.MediaStop=126]="MediaStop",t[t.MediaPlayPause=127]="MediaPlayPause",t[t.LaunchMediaPlayer=128]="LaunchMediaPlayer",t[t.LaunchMail=129]="LaunchMail",t[t.LaunchApp2=130]="LaunchApp2",t[t.Clear=131]="Clear",t[t.MAX_VALUE=132]="MAX_VALUE"})(l||(n.KeyCode=l={}));var b;(function(t){t[t.Hint=1]="Hint",t[t.Info=2]="Info",t[t.Warning=4]="Warning",t[t.Error=8]="Error"})(b||(n.MarkerSeverity=b={}));var g;(function(t){t[t.Unnecessary=1]="Unnecessary",t[t.Deprecated=2]="Deprecated"})(g||(n.MarkerTag=g={}));var w;(function(t){t[t.Inline=1]="Inline",t[t.Gutter=2]="Gutter"})(w||(n.MinimapPosition=w={}));var M;(function(t){t[t.Normal=1]="Normal",t[t.Underlined=2]="Underlined"})(M||(n.MinimapSectionHeaderStyle=M={}));var y;(function(t){t[t.UNKNOWN=0]="UNKNOWN",t[t.TEXTAREA=1]="TEXTAREA",t[t.GUTTER_GLYPH_MARGIN=2]="GUTTER_GLYPH_MARGIN",t[t.GUTTER_LINE_NUMBERS=3]="GUTTER_LINE_NUMBERS",t[t.GUTTER_LINE_DECORATIONS=4]="GUTTER_LINE_DECORATIONS",t[t.GUTTER_VIEW_ZONE=5]="GUTTER_VIEW_ZONE",t[t.CONTENT_TEXT=6]="CONTENT_TEXT",t[t.CONTENT_EMPTY=7]="CONTENT_EMPTY",t[t.CONTENT_VIEW_ZONE=8]="CONTENT_VIEW_ZONE",t[t.CONTENT_WIDGET=9]="CONTENT_WIDGET",t[t.OVERVIEW_RULER=10]="OVERVIEW_RULER",t[t.SCROLLBAR=11]="SCROLLBAR",t[t.OVERLAY_WIDGET=12]="OVERLAY_WIDGET",t[t.OUTSIDE_EDITOR=13]="OUTSIDE_EDITOR"})(y||(n.MouseTargetType=y={}));var _;(function(t){t[t.AIGenerated=1]="AIGenerated"})(_||(n.NewSymbolNameTag=_={}));var C;(function(t){t[t.Invoke=0]="Invoke",t[t.Automatic=1]="Automatic"})(C||(n.NewSymbolNameTriggerKind=C={}));var R;(function(t){t[t.TOP_RIGHT_CORNER=0]="TOP_RIGHT_CORNER",t[t.BOTTOM_RIGHT_CORNER=1]="BOTTOM_RIGHT_CORNER",t[t.TOP_CENTER=2]="TOP_CENTER"})(R||(n.OverlayWidgetPositionPreference=R={}));var D;(function(t){t[t.Left=1]="Left",t[t.Center=2]="Center",t[t.Right=4]="Right",t[t.Full=7]="Full"})(D||(n.OverviewRulerLane=D={}));var T;(function(t){t[t.Word=0]="Word",t[t.Line=1]="Line",t[t.Suggest=2]="Suggest"})(T||(n.PartialAcceptTriggerKind=T={}));var O;(function(t){t[t.Left=0]="Left",t[t.Right=1]="Right",t[t.None=2]="None",t[t.LeftOfInjectedText=3]="LeftOfInjectedText",t[t.RightOfInjectedText=4]="RightOfInjectedText"})(O||(n.PositionAffinity=O={}));var z;(function(t){t[t.Off=0]="Off",t[t.On=1]="On",t[t.Relative=2]="Relative",t[t.Interval=3]="Interval",t[t.Custom=4]="Custom"})(z||(n.RenderLineNumbersType=z={}));var j;(function(t){t[t.None=0]="None",t[t.Text=1]="Text",t[t.Blocks=2]="Blocks"})(j||(n.RenderMinimap=j={}));var F;(function(t){t[t.Smooth=0]="Smooth",t[t.Immediate=1]="Immediate"})(F||(n.ScrollType=F={}));var q;(function(t){t[t.Auto=1]="Auto",t[t.Hidden=2]="Hidden",t[t.Visible=3]="Visible"})(q||(n.ScrollbarVisibility=q={}));var B;(function(t){t[t.LTR=0]="LTR",t[t.RTL=1]="RTL"})(B||(n.SelectionDirection=B={}));var G;(function(t){t.Off="off",t.OnCode="onCode",t.On="on"})(G||(n.ShowLightbulbIconMode=G={}));var $;(function(t){t[t.Invoke=1]="Invoke",t[t.TriggerCharacter=2]="TriggerCharacter",t[t.ContentChange=3]="ContentChange"})($||(n.SignatureHelpTriggerKind=$={}));var U;(function(t){t[t.File=0]="File",t[t.Module=1]="Module",t[t.Namespace=2]="Namespace",t[t.Package=3]="Package",t[t.Class=4]="Class",t[t.Method=5]="Method",t[t.Property=6]="Property",t[t.Field=7]="Field",t[t.Constructor=8]="Constructor",t[t.Enum=9]="Enum",t[t.Interface=10]="Interface",t[t.Function=11]="Function",t[t.Variable=12]="Variable",t[t.Constant=13]="Constant",t[t.String=14]="String",t[t.Number=15]="Number",t[t.Boolean=16]="Boolean",t[t.Array=17]="Array",t[t.Object=18]="Object",t[t.Key=19]="Key",t[t.Null=20]="Null",t[t.EnumMember=21]="EnumMember",t[t.Struct=22]="Struct",t[t.Event=23]="Event",t[t.Operator=24]="Operator",t[t.TypeParameter=25]="TypeParameter"})(U||(n.SymbolKind=U={}));var ee;(function(t){t[t.Deprecated=1]="Deprecated"})(ee||(n.SymbolTag=ee={}));var re;(function(t){t[t.Hidden=0]="Hidden",t[t.Blink=1]="Blink",t[t.Smooth=2]="Smooth",t[t.Phase=3]="Phase",t[t.Expand=4]="Expand",t[t.Solid=5]="Solid"})(re||(n.TextEditorCursorBlinkingStyle=re={}));var ue;(function(t){t[t.Line=1]="Line",t[t.Block=2]="Block",t[t.Underline=3]="Underline",t[t.LineThin=4]="LineThin",t[t.BlockOutline=5]="BlockOutline",t[t.UnderlineThin=6]="UnderlineThin"})(ue||(n.TextEditorCursorStyle=ue={}));var de;(function(t){t[t.AlwaysGrowsWhenTypingAtEdges=0]="AlwaysGrowsWhenTypingAtEdges",t[t.NeverGrowsWhenTypingAtEdges=1]="NeverGrowsWhenTypingAtEdges",t[t.GrowsOnlyWhenTypingBefore=2]="GrowsOnlyWhenTypingBefore",t[t.GrowsOnlyWhenTypingAfter=3]="GrowsOnlyWhenTypingAfter"})(de||(n.TrackedRangeStickiness=de={}));var ge;(function(t){t[t.None=0]="None",t[t.Same=1]="Same",t[t.Indent=2]="Indent",t[t.DeepIndent=3]="DeepIndent"})(ge||(n.WrappingIndent=ge={}))}),X(J[70],Z([0,1,9,8]),function(W,n,i,x){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.TokenizationRegistry=void 0;class A{constructor(){this._tokenizationSupports=new Map,this._factories=new Map,this._onDidChange=new i.Emitter,this.onDidChange=this._onDidChange.event,this._colorMap=null}handleChange(p){this._onDidChange.fire({changedLanguages:p,changedColorMap:!1})}register(p,c){return this._tokenizationSupports.set(p,c),this.handleChange([p]),(0,x.toDisposable)(()=>{this._tokenizationSupports.get(p)===c&&(this._tokenizationSupports.delete(p),this.handleChange([p]))})}get(p){return this._tokenizationSupports.get(p)||null}registerFactory(p,c){this._factories.get(p)?.dispose();const a=new d(this,p,c);return this._factories.set(p,a),(0,x.toDisposable)(()=>{const m=this._factories.get(p);!m||m!==a||(this._factories.delete(p),m.dispose())})}async getOrCreate(p){const c=this.get(p);if(c)return c;const a=this._factories.get(p);return!a||a.isResolved?null:(await a.resolve(),this.get(p))}isResolved(p){if(this.get(p))return!0;const a=this._factories.get(p);return!!(!a||a.isResolved)}setColorMap(p){this._colorMap=p,this._onDidChange.fire({changedLanguages:Array.from(this._tokenizationSupports.keys()),changedColorMap:!0})}getColorMap(){return this._colorMap}getDefaultBackground(){return this._colorMap&&this._colorMap.length>2?this._colorMap[2]:null}}n.TokenizationRegistry=A;class d extends x.Disposable{get isResolved(){return this._isResolved}constructor(p,c,a){super(),this._registry=p,this._languageId=c,this._factory=a,this._isDisposed=!1,this._resolvePromise=null,this._isResolved=!1}dispose(){this._isDisposed=!0,super.dispose()}async resolve(){return this._resolvePromise||(this._resolvePromise=this._create()),this._resolvePromise}async _create(){const p=await this._factory.tokenizationSupport;this._isResolved=!0,p&&!this._isDisposed&&this._register(this._registry.register(this._languageId,p))}}}),X(J[35],Z([0,1]),function(W,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getNLSMessages=i,n.getNLSLanguage=x;function i(){return globalThis._VSCODE_NLS_MESSAGES}function x(){return globalThis._VSCODE_NLS_LANGUAGE}}),X(J[36],Z([0,1,35,35]),function(W,n,i,x){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getNLSMessages=n.getNLSLanguage=void 0,n.localize=f,n.localize2=c,Object.defineProperty(n,"getNLSLanguage",{enumerable:!0,get:function(){return x.getNLSLanguage}}),Object.defineProperty(n,"getNLSMessages",{enumerable:!0,get:function(){return x.getNLSMessages}});const A=(0,i.getNLSLanguage)()==="pseudo"||typeof document<"u"&&document.location&&document.location.hash.indexOf("pseudo=true")>=0;function d(a,m){let e;return m.length===0?e=a:e=a.replace(/\{(\d+)\}/g,(h,r)=>{const s=r[0],o=m[s];let u=h;return typeof o=="string"?u=o:(typeof o=="number"||typeof o=="boolean"||o===void 0||o===null)&&(u=String(o)),u}),A&&(e="\uFF3B"+e.replace(/[aouei]/g,"$&$&")+"\uFF3D"),e}function f(a,m,...e){return d(typeof a=="number"?p(a,m):m,e)}function p(a,m){const e=(0,i.getNLSMessages)()?.[a];if(typeof e!="string"){if(typeof m=="string")return m;throw new Error(`!!! NLS MISSING: ${a} !!!`)}return e}function c(a,m,...e){let h;typeof a=="number"?h=p(a,m):h=m;const r=d(h,e);return{value:r,original:m===h?r:d(m,e)}}}),X(J[11],Z([0,1,36]),function(W,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.isAndroid=n.isEdge=n.isSafari=n.isFirefox=n.isChrome=n.OS=n.setTimeout0=n.setTimeout0IsFaster=n.language=n.userAgent=n.isMobile=n.isIOS=n.webWorkerOrigin=n.isWebWorker=n.isWeb=n.isNative=n.isLinux=n.isMacintosh=n.isWindows=n.LANGUAGE_DEFAULT=void 0,n.isLittleEndian=g,n.LANGUAGE_DEFAULT="en";let x=!1,A=!1,d=!1,f=!1,p=!1,c=!1,a=!1,m=!1,e=!1,h=!1,r,s=n.LANGUAGE_DEFAULT,o=n.LANGUAGE_DEFAULT,u,S;const L=globalThis;let N;typeof L.vscode<"u"&&typeof L.vscode.process<"u"?N=L.vscode.process:typeof process<"u"&&typeof process?.versions?.node=="string"&&(N=process);const P=typeof N?.versions?.electron=="string",E=P&&N?.type==="renderer";if(typeof N=="object"){x=N.platform==="win32",A=N.platform==="darwin",d=N.platform==="linux",f=d&&!!N.env.SNAP&&!!N.env.SNAP_REVISION,a=P,e=!!N.env.CI||!!N.env.BUILD_ARTIFACTSTAGINGDIRECTORY,r=n.LANGUAGE_DEFAULT,s=n.LANGUAGE_DEFAULT;const w=N.env.VSCODE_NLS_CONFIG;if(w)try{const M=JSON.parse(w);r=M.userLocale,o=M.osLocale,s=M.resolvedLanguage||n.LANGUAGE_DEFAULT,u=M.languagePack?.translationsConfigFile}catch{}p=!0}else typeof navigator=="object"&&!E?(S=navigator.userAgent,x=S.indexOf("Windows")>=0,A=S.indexOf("Macintosh")>=0,m=(S.indexOf("Macintosh")>=0||S.indexOf("iPad")>=0||S.indexOf("iPhone")>=0)&&!!navigator.maxTouchPoints&&navigator.maxTouchPoints>0,d=S.indexOf("Linux")>=0,h=S?.indexOf("Mobi")>=0,c=!0,s=i.getNLSLanguage()||n.LANGUAGE_DEFAULT,r=navigator.language.toLowerCase(),o=r):console.error("Unable to resolve platform.");let v=0;A?v=1:x?v=3:d&&(v=2),n.isWindows=x,n.isMacintosh=A,n.isLinux=d,n.isNative=p,n.isWeb=c,n.isWebWorker=c&&typeof L.importScripts=="function",n.webWorkerOrigin=n.isWebWorker?L.origin:void 0,n.isIOS=m,n.isMobile=h,n.userAgent=S,n.language=s,n.setTimeout0IsFaster=typeof L.postMessage=="function"&&!L.importScripts,n.setTimeout0=(()=>{if(n.setTimeout0IsFaster){const w=[];L.addEventListener("message",y=>{if(y.data&&y.data.vscodeScheduleAsyncWork)for(let _=0,C=w.length;_{const _=++M;w.push({id:_,callback:y}),L.postMessage({vscodeScheduleAsyncWork:_},"*")}}return w=>setTimeout(w)})(),n.OS=A||m?2:x?1:3;let l=!0,b=!1;function g(){if(!b){b=!0;const w=new Uint8Array(2);w[0]=1,w[1]=2,l=new Uint16Array(w.buffer)[0]===513}return l}n.isChrome=!!(n.userAgent&&n.userAgent.indexOf("Chrome")>=0),n.isFirefox=!!(n.userAgent&&n.userAgent.indexOf("Firefox")>=0),n.isSafari=!!(!n.isChrome&&n.userAgent&&n.userAgent.indexOf("Safari")>=0),n.isEdge=!!(n.userAgent&&n.userAgent.indexOf("Edg/")>=0),n.isAndroid=!!(n.userAgent&&n.userAgent.indexOf("Android")>=0)}),X(J[71],Z([0,1,23,3,9,8,11,45]),function(W,n,i,x,A,d,f,p){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.CancelableAsyncIterableObject=n.AsyncIterableObject=n.Promises=n.DeferredPromise=n.GlobalIdleValue=n.AbstractIdleValue=n._runWhenIdle=n.runWhenGlobalIdle=n.RunOnceScheduler=n.IntervalTimer=n.TimeoutTimer=n.ThrottledDelayer=n.Delayer=n.Throttler=void 0,n.isThenable=c,n.createCancelablePromise=a,n.raceCancellation=m,n.timeout=u,n.disposableTimeout=S,n.first=L,n.createCancelableAsyncIterable=y;function c(_){return!!_&&typeof _.then=="function"}function a(_){const C=new i.CancellationTokenSource,R=_(C.token),D=new Promise((T,O)=>{const z=C.token.onCancellationRequested(()=>{z.dispose(),O(new x.CancellationError)});Promise.resolve(R).then(j=>{z.dispose(),C.dispose(),T(j)},j=>{z.dispose(),C.dispose(),O(j)})});return new class{cancel(){C.cancel(),C.dispose()}then(T,O){return D.then(T,O)}catch(T){return this.then(void 0,T)}finally(T){return D.finally(T)}}}function m(_,C,R){return new Promise((D,T)=>{const O=C.onCancellationRequested(()=>{O.dispose(),D(R)});_.then(D,T).finally(()=>O.dispose())})}class e{constructor(){this.isDisposed=!1,this.activePromise=null,this.queuedPromise=null,this.queuedPromiseFactory=null}queue(C){if(this.isDisposed)return Promise.reject(new Error("Throttler is disposed"));if(this.activePromise){if(this.queuedPromiseFactory=C,!this.queuedPromise){const R=()=>{if(this.queuedPromise=null,this.isDisposed)return;const D=this.queue(this.queuedPromiseFactory);return this.queuedPromiseFactory=null,D};this.queuedPromise=new Promise(D=>{this.activePromise.then(R,R).then(D)})}return new Promise((R,D)=>{this.queuedPromise.then(R,D)})}return this.activePromise=C(),new Promise((R,D)=>{this.activePromise.then(T=>{this.activePromise=null,R(T)},T=>{this.activePromise=null,D(T)})})}dispose(){this.isDisposed=!0}}n.Throttler=e;const h=(_,C)=>{let R=!0;const D=setTimeout(()=>{R=!1,C()},_);return{isTriggered:()=>R,dispose:()=>{clearTimeout(D),R=!1}}},r=_=>{let C=!0;return queueMicrotask(()=>{C&&(C=!1,_())}),{isTriggered:()=>C,dispose:()=>{C=!1}}};class s{constructor(C){this.defaultDelay=C,this.deferred=null,this.completionPromise=null,this.doResolve=null,this.doReject=null,this.task=null}trigger(C,R=this.defaultDelay){this.task=C,this.cancelTimeout(),this.completionPromise||(this.completionPromise=new Promise((T,O)=>{this.doResolve=T,this.doReject=O}).then(()=>{if(this.completionPromise=null,this.doResolve=null,this.task){const T=this.task;return this.task=null,T()}}));const D=()=>{this.deferred=null,this.doResolve?.(null)};return this.deferred=R===p.MicrotaskDelay?r(D):h(R,D),this.completionPromise}isTriggered(){return!!this.deferred?.isTriggered()}cancel(){this.cancelTimeout(),this.completionPromise&&(this.doReject?.(new x.CancellationError),this.completionPromise=null)}cancelTimeout(){this.deferred?.dispose(),this.deferred=null}dispose(){this.cancel()}}n.Delayer=s;class o{constructor(C){this.delayer=new s(C),this.throttler=new e}trigger(C,R){return this.delayer.trigger(()=>this.throttler.queue(C),R)}cancel(){this.delayer.cancel()}dispose(){this.delayer.dispose(),this.throttler.dispose()}}n.ThrottledDelayer=o;function u(_,C){return C?new Promise((R,D)=>{const T=setTimeout(()=>{O.dispose(),R()},_),O=C.onCancellationRequested(()=>{clearTimeout(T),O.dispose(),D(new x.CancellationError)})}):a(R=>u(_,R))}function S(_,C=0,R){const D=setTimeout(()=>{_(),R&&T.dispose()},C),T=(0,d.toDisposable)(()=>{clearTimeout(D),R?.deleteAndLeak(T)});return R?.add(T),T}function L(_,C=D=>!!D,R=null){let D=0;const T=_.length,O=()=>{if(D>=T)return Promise.resolve(R);const z=_[D++];return Promise.resolve(z()).then(F=>C(F)?Promise.resolve(F):O())};return O()}class N{constructor(C,R){this._isDisposed=!1,this._token=-1,typeof C=="function"&&typeof R=="number"&&this.setIfNotSet(C,R)}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._token!==-1&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(C,R){if(this._isDisposed)throw new x.BugIndicatingError("Calling 'cancelAndSet' on a disposed TimeoutTimer");this.cancel(),this._token=setTimeout(()=>{this._token=-1,C()},R)}setIfNotSet(C,R){if(this._isDisposed)throw new x.BugIndicatingError("Calling 'setIfNotSet' on a disposed TimeoutTimer");this._token===-1&&(this._token=setTimeout(()=>{this._token=-1,C()},R))}}n.TimeoutTimer=N;class P{constructor(){this.disposable=void 0,this.isDisposed=!1}cancel(){this.disposable?.dispose(),this.disposable=void 0}cancelAndSet(C,R,D=globalThis){if(this.isDisposed)throw new x.BugIndicatingError("Calling 'cancelAndSet' on a disposed IntervalTimer");this.cancel();const T=D.setInterval(()=>{C()},R);this.disposable=(0,d.toDisposable)(()=>{D.clearInterval(T),this.disposable=void 0})}dispose(){this.cancel(),this.isDisposed=!0}}n.IntervalTimer=P;class E{constructor(C,R){this.timeoutToken=-1,this.runner=C,this.timeout=R,this.timeoutHandler=this.onTimeout.bind(this)}dispose(){this.cancel(),this.runner=null}cancel(){this.isScheduled()&&(clearTimeout(this.timeoutToken),this.timeoutToken=-1)}schedule(C=this.timeout){this.cancel(),this.timeoutToken=setTimeout(this.timeoutHandler,C)}get delay(){return this.timeout}set delay(C){this.timeout=C}isScheduled(){return this.timeoutToken!==-1}onTimeout(){this.timeoutToken=-1,this.runner&&this.doRun()}doRun(){this.runner?.()}}n.RunOnceScheduler=E,function(){typeof globalThis.requestIdleCallback!="function"||typeof globalThis.cancelIdleCallback!="function"?n._runWhenIdle=(_,C)=>{(0,f.setTimeout0)(()=>{if(R)return;const D=Date.now()+15;C(Object.freeze({didTimeout:!0,timeRemaining(){return Math.max(0,D-Date.now())}}))});let R=!1;return{dispose(){R||(R=!0)}}}:n._runWhenIdle=(_,C,R)=>{const D=_.requestIdleCallback(C,typeof R=="number"?{timeout:R}:void 0);let T=!1;return{dispose(){T||(T=!0,_.cancelIdleCallback(D))}}},n.runWhenGlobalIdle=_=>(0,n._runWhenIdle)(globalThis,_)}();class v{constructor(C,R){this._didRun=!1,this._executor=()=>{try{this._value=R()}catch(D){this._error=D}finally{this._didRun=!0}},this._handle=(0,n._runWhenIdle)(C,()=>this._executor())}dispose(){this._handle.dispose()}get value(){if(this._didRun||(this._handle.dispose(),this._executor()),this._error)throw this._error;return this._value}get isInitialized(){return this._didRun}}n.AbstractIdleValue=v;class l extends v{constructor(C){super(globalThis,C)}}n.GlobalIdleValue=l;class b{get isRejected(){return this.outcome?.outcome===1}get isSettled(){return!!this.outcome}constructor(){this.p=new Promise((C,R)=>{this.completeCallback=C,this.errorCallback=R})}complete(C){return new Promise(R=>{this.completeCallback(C),this.outcome={outcome:0,value:C},R()})}error(C){return new Promise(R=>{this.errorCallback(C),this.outcome={outcome:1,value:C},R()})}cancel(){return this.error(new x.CancellationError)}}n.DeferredPromise=b;var g;(function(_){async function C(D){let T;const O=await Promise.all(D.map(z=>z.then(j=>j,j=>{T||(T=j)})));if(typeof T<"u")throw T;return O}_.settled=C;function R(D){return new Promise(async(T,O)=>{try{await D(T,O)}catch(z){O(z)}})}_.withAsyncBody=R})(g||(n.Promises=g={}));class w{static fromArray(C){return new w(R=>{R.emitMany(C)})}static fromPromise(C){return new w(async R=>{R.emitMany(await C)})}static fromPromises(C){return new w(async R=>{await Promise.all(C.map(async D=>R.emitOne(await D)))})}static merge(C){return new w(async R=>{await Promise.all(C.map(async D=>{for await(const T of D)R.emitOne(T)}))})}static{this.EMPTY=w.fromArray([])}constructor(C,R){this._state=0,this._results=[],this._error=null,this._onReturn=R,this._onStateChanged=new A.Emitter,queueMicrotask(async()=>{const D={emitOne:T=>this.emitOne(T),emitMany:T=>this.emitMany(T),reject:T=>this.reject(T)};try{await Promise.resolve(C(D)),this.resolve()}catch(T){this.reject(T)}finally{D.emitOne=void 0,D.emitMany=void 0,D.reject=void 0}})}[Symbol.asyncIterator](){let C=0;return{next:async()=>{do{if(this._state===2)throw this._error;if(C(this._onReturn?.(),{done:!0,value:void 0})}}static map(C,R){return new w(async D=>{for await(const T of C)D.emitOne(R(T))})}map(C){return w.map(this,C)}static filter(C,R){return new w(async D=>{for await(const T of C)R(T)&&D.emitOne(T)})}filter(C){return w.filter(this,C)}static coalesce(C){return w.filter(C,R=>!!R)}coalesce(){return w.coalesce(this)}static async toPromise(C){const R=[];for await(const D of C)R.push(D);return R}toPromise(){return w.toPromise(this)}emitOne(C){this._state===0&&(this._results.push(C),this._onStateChanged.fire())}emitMany(C){this._state===0&&(this._results=this._results.concat(C),this._onStateChanged.fire())}resolve(){this._state===0&&(this._state=1,this._onStateChanged.fire())}reject(C){this._state===0&&(this._state=2,this._error=C,this._onStateChanged.fire())}}n.AsyncIterableObject=w;class M extends w{constructor(C,R){super(R),this._source=C}cancel(){this._source.cancel()}}n.CancelableAsyncIterableObject=M;function y(_){const C=new i.CancellationTokenSource,R=_(C.token);return new M(C,async D=>{const T=C.token.onCancellationRequested(()=>{T.dispose(),C.dispose(),D.reject(new x.CancellationError)});try{for await(const O of R){if(C.token.isCancellationRequested)return;D.emitOne(O)}T.dispose(),C.dispose()}catch(O){T.dispose(),C.dispose(),D.reject(O)}})}}),X(J[72],Z([0,1,11]),function(W,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.platform=n.env=n.cwd=void 0;let x;const A=globalThis.vscode;if(typeof A<"u"&&typeof A.process<"u"){const d=A.process;x={get platform(){return d.platform},get arch(){return d.arch},get env(){return d.env},cwd(){return d.cwd()}}}else typeof process<"u"&&typeof process?.versions?.node=="string"?x={get platform(){return process.platform},get arch(){return process.arch},get env(){return process.env},cwd(){return process.env.VSCODE_CWD||process.cwd()}}:x={get platform(){return i.isWindows?"win32":i.isMacintosh?"darwin":"linux"},get arch(){},get env(){return{}},cwd(){return"/"}};n.cwd=x.cwd,n.env=x.env,n.platform=x.platform}),X(J[37],Z([0,1,72]),function(W,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.sep=n.extname=n.basename=n.dirname=n.relative=n.resolve=n.join=n.normalize=n.posix=n.win32=void 0;const x=65,A=97,d=90,f=122,p=46,c=47,a=92,m=58,e=63;class h extends Error{constructor(b,g,w){let M;typeof g=="string"&&g.indexOf("not ")===0?(M="must not be",g=g.replace(/^not /,"")):M="must be";const y=b.indexOf(".")!==-1?"property":"argument";let _=`The "${b}" ${y} ${M} of type ${g}`;_+=`. Received type ${typeof w}`,super(_),this.code="ERR_INVALID_ARG_TYPE"}}function r(l,b){if(l===null||typeof l!="object")throw new h(b,"Object",l)}function s(l,b){if(typeof l!="string")throw new h(b,"string",l)}const o=i.platform==="win32";function u(l){return l===c||l===a}function S(l){return l===c}function L(l){return l>=x&&l<=d||l>=A&&l<=f}function N(l,b,g,w){let M="",y=0,_=-1,C=0,R=0;for(let D=0;D<=l.length;++D){if(D2){const T=M.lastIndexOf(g);T===-1?(M="",y=0):(M=M.slice(0,T),y=M.length-1-M.lastIndexOf(g)),_=D,C=0;continue}else if(M.length!==0){M="",y=0,_=D,C=0;continue}}b&&(M+=M.length>0?`${g}..`:"..",y=2)}else M.length>0?M+=`${g}${l.slice(_+1,D)}`:M=l.slice(_+1,D),y=D-_-1;_=D,C=0}else R===p&&C!==-1?++C:C=-1}return M}function P(l){return l?`${l[0]==="."?"":"."}${l}`:""}function E(l,b){r(b,"pathObject");const g=b.dir||b.root,w=b.base||`${b.name||""}${P(b.ext)}`;return g?g===b.root?`${g}${w}`:`${g}${l}${w}`:w}n.win32={resolve(...l){let b="",g="",w=!1;for(let M=l.length-1;M>=-1;M--){let y;if(M>=0){if(y=l[M],s(y,`paths[${M}]`),y.length===0)continue}else b.length===0?y=i.cwd():(y=i.env[`=${b}`]||i.cwd(),(y===void 0||y.slice(0,2).toLowerCase()!==b.toLowerCase()&&y.charCodeAt(2)===a)&&(y=`${b}\\`));const _=y.length;let C=0,R="",D=!1;const T=y.charCodeAt(0);if(_===1)u(T)&&(C=1,D=!0);else if(u(T))if(D=!0,u(y.charCodeAt(1))){let O=2,z=O;for(;O<_&&!u(y.charCodeAt(O));)O++;if(O<_&&O!==z){const j=y.slice(z,O);for(z=O;O<_&&u(y.charCodeAt(O));)O++;if(O<_&&O!==z){for(z=O;O<_&&!u(y.charCodeAt(O));)O++;(O===_||O!==z)&&(R=`\\\\${j}\\${y.slice(z,O)}`,C=O)}}}else C=1;else L(T)&&y.charCodeAt(1)===m&&(R=y.slice(0,2),C=2,_>2&&u(y.charCodeAt(2))&&(D=!0,C=3));if(R.length>0)if(b.length>0){if(R.toLowerCase()!==b.toLowerCase())continue}else b=R;if(w){if(b.length>0)break}else if(g=`${y.slice(C)}\\${g}`,w=D,D&&b.length>0)break}return g=N(g,!w,"\\",u),w?`${b}\\${g}`:`${b}${g}`||"."},normalize(l){s(l,"path");const b=l.length;if(b===0)return".";let g=0,w,M=!1;const y=l.charCodeAt(0);if(b===1)return S(y)?"\\":l;if(u(y))if(M=!0,u(l.charCodeAt(1))){let C=2,R=C;for(;C2&&u(l.charCodeAt(2))&&(M=!0,g=3));let _=g0&&u(l.charCodeAt(b-1))&&(_+="\\"),w===void 0?M?`\\${_}`:_:M?`${w}\\${_}`:`${w}${_}`},isAbsolute(l){s(l,"path");const b=l.length;if(b===0)return!1;const g=l.charCodeAt(0);return u(g)||b>2&&L(g)&&l.charCodeAt(1)===m&&u(l.charCodeAt(2))},join(...l){if(l.length===0)return".";let b,g;for(let y=0;y0&&(b===void 0?b=g=_:b+=`\\${_}`)}if(b===void 0)return".";let w=!0,M=0;if(typeof g=="string"&&u(g.charCodeAt(0))){++M;const y=g.length;y>1&&u(g.charCodeAt(1))&&(++M,y>2&&(u(g.charCodeAt(2))?++M:w=!1))}if(w){for(;M=2&&(b=`\\${b.slice(M)}`)}return n.win32.normalize(b)},relative(l,b){if(s(l,"from"),s(b,"to"),l===b)return"";const g=n.win32.resolve(l),w=n.win32.resolve(b);if(g===w||(l=g.toLowerCase(),b=w.toLowerCase(),l===b))return"";let M=0;for(;MM&&l.charCodeAt(y-1)===a;)y--;const _=y-M;let C=0;for(;CC&&b.charCodeAt(R-1)===a;)R--;const D=R-C,T=_T){if(b.charCodeAt(C+z)===a)return w.slice(C+z+1);if(z===2)return w.slice(C+z)}_>T&&(l.charCodeAt(M+z)===a?O=z:z===2&&(O=3)),O===-1&&(O=0)}let j="";for(z=M+O+1;z<=y;++z)(z===y||l.charCodeAt(z)===a)&&(j+=j.length===0?"..":"\\..");return C+=O,j.length>0?`${j}${w.slice(C,R)}`:(w.charCodeAt(C)===a&&++C,w.slice(C,R))},toNamespacedPath(l){if(typeof l!="string"||l.length===0)return l;const b=n.win32.resolve(l);if(b.length<=2)return l;if(b.charCodeAt(0)===a){if(b.charCodeAt(1)===a){const g=b.charCodeAt(2);if(g!==e&&g!==p)return`\\\\?\\UNC\\${b.slice(2)}`}}else if(L(b.charCodeAt(0))&&b.charCodeAt(1)===m&&b.charCodeAt(2)===a)return`\\\\?\\${b}`;return l},dirname(l){s(l,"path");const b=l.length;if(b===0)return".";let g=-1,w=0;const M=l.charCodeAt(0);if(b===1)return u(M)?l:".";if(u(M)){if(g=w=1,u(l.charCodeAt(1))){let C=2,R=C;for(;C2&&u(l.charCodeAt(2))?3:2,w=g);let y=-1,_=!0;for(let C=b-1;C>=w;--C)if(u(l.charCodeAt(C))){if(!_){y=C;break}}else _=!1;if(y===-1){if(g===-1)return".";y=g}return l.slice(0,y)},basename(l,b){b!==void 0&&s(b,"suffix"),s(l,"path");let g=0,w=-1,M=!0,y;if(l.length>=2&&L(l.charCodeAt(0))&&l.charCodeAt(1)===m&&(g=2),b!==void 0&&b.length>0&&b.length<=l.length){if(b===l)return"";let _=b.length-1,C=-1;for(y=l.length-1;y>=g;--y){const R=l.charCodeAt(y);if(u(R)){if(!M){g=y+1;break}}else C===-1&&(M=!1,C=y+1),_>=0&&(R===b.charCodeAt(_)?--_===-1&&(w=y):(_=-1,w=C))}return g===w?w=C:w===-1&&(w=l.length),l.slice(g,w)}for(y=l.length-1;y>=g;--y)if(u(l.charCodeAt(y))){if(!M){g=y+1;break}}else w===-1&&(M=!1,w=y+1);return w===-1?"":l.slice(g,w)},extname(l){s(l,"path");let b=0,g=-1,w=0,M=-1,y=!0,_=0;l.length>=2&&l.charCodeAt(1)===m&&L(l.charCodeAt(0))&&(b=w=2);for(let C=l.length-1;C>=b;--C){const R=l.charCodeAt(C);if(u(R)){if(!y){w=C+1;break}continue}M===-1&&(y=!1,M=C+1),R===p?g===-1?g=C:_!==1&&(_=1):g!==-1&&(_=-1)}return g===-1||M===-1||_===0||_===1&&g===M-1&&g===w+1?"":l.slice(g,M)},format:E.bind(null,"\\"),parse(l){s(l,"path");const b={root:"",dir:"",base:"",ext:"",name:""};if(l.length===0)return b;const g=l.length;let w=0,M=l.charCodeAt(0);if(g===1)return u(M)?(b.root=b.dir=l,b):(b.base=b.name=l,b);if(u(M)){if(w=1,u(l.charCodeAt(1))){let O=2,z=O;for(;O0&&(b.root=l.slice(0,w));let y=-1,_=w,C=-1,R=!0,D=l.length-1,T=0;for(;D>=w;--D){if(M=l.charCodeAt(D),u(M)){if(!R){_=D+1;break}continue}C===-1&&(R=!1,C=D+1),M===p?y===-1?y=D:T!==1&&(T=1):y!==-1&&(T=-1)}return C!==-1&&(y===-1||T===0||T===1&&y===C-1&&y===_+1?b.base=b.name=l.slice(_,C):(b.name=l.slice(_,y),b.base=l.slice(_,C),b.ext=l.slice(y,C))),_>0&&_!==w?b.dir=l.slice(0,_-1):b.dir=b.root,b},sep:"\\",delimiter:";",win32:null,posix:null};const v=(()=>{if(o){const l=/\\/g;return()=>{const b=i.cwd().replace(l,"/");return b.slice(b.indexOf("/"))}}return()=>i.cwd()})();n.posix={resolve(...l){let b="",g=!1;for(let w=l.length-1;w>=-1&&!g;w--){const M=w>=0?l[w]:v();s(M,`paths[${w}]`),M.length!==0&&(b=`${M}/${b}`,g=M.charCodeAt(0)===c)}return b=N(b,!g,"/",S),g?`/${b}`:b.length>0?b:"."},normalize(l){if(s(l,"path"),l.length===0)return".";const b=l.charCodeAt(0)===c,g=l.charCodeAt(l.length-1)===c;return l=N(l,!b,"/",S),l.length===0?b?"/":g?"./":".":(g&&(l+="/"),b?`/${l}`:l)},isAbsolute(l){return s(l,"path"),l.length>0&&l.charCodeAt(0)===c},join(...l){if(l.length===0)return".";let b;for(let g=0;g0&&(b===void 0?b=w:b+=`/${w}`)}return b===void 0?".":n.posix.normalize(b)},relative(l,b){if(s(l,"from"),s(b,"to"),l===b||(l=n.posix.resolve(l),b=n.posix.resolve(b),l===b))return"";const g=1,w=l.length,M=w-g,y=1,_=b.length-y,C=M<_?M:_;let R=-1,D=0;for(;DC){if(b.charCodeAt(y+D)===c)return b.slice(y+D+1);if(D===0)return b.slice(y+D)}else M>C&&(l.charCodeAt(g+D)===c?R=D:D===0&&(R=0));let T="";for(D=g+R+1;D<=w;++D)(D===w||l.charCodeAt(D)===c)&&(T+=T.length===0?"..":"/..");return`${T}${b.slice(y+R)}`},toNamespacedPath(l){return l},dirname(l){if(s(l,"path"),l.length===0)return".";const b=l.charCodeAt(0)===c;let g=-1,w=!0;for(let M=l.length-1;M>=1;--M)if(l.charCodeAt(M)===c){if(!w){g=M;break}}else w=!1;return g===-1?b?"/":".":b&&g===1?"//":l.slice(0,g)},basename(l,b){b!==void 0&&s(b,"ext"),s(l,"path");let g=0,w=-1,M=!0,y;if(b!==void 0&&b.length>0&&b.length<=l.length){if(b===l)return"";let _=b.length-1,C=-1;for(y=l.length-1;y>=0;--y){const R=l.charCodeAt(y);if(R===c){if(!M){g=y+1;break}}else C===-1&&(M=!1,C=y+1),_>=0&&(R===b.charCodeAt(_)?--_===-1&&(w=y):(_=-1,w=C))}return g===w?w=C:w===-1&&(w=l.length),l.slice(g,w)}for(y=l.length-1;y>=0;--y)if(l.charCodeAt(y)===c){if(!M){g=y+1;break}}else w===-1&&(M=!1,w=y+1);return w===-1?"":l.slice(g,w)},extname(l){s(l,"path");let b=-1,g=0,w=-1,M=!0,y=0;for(let _=l.length-1;_>=0;--_){const C=l.charCodeAt(_);if(C===c){if(!M){g=_+1;break}continue}w===-1&&(M=!1,w=_+1),C===p?b===-1?b=_:y!==1&&(y=1):b!==-1&&(y=-1)}return b===-1||w===-1||y===0||y===1&&b===w-1&&b===g+1?"":l.slice(b,w)},format:E.bind(null,"/"),parse(l){s(l,"path");const b={root:"",dir:"",base:"",ext:"",name:""};if(l.length===0)return b;const g=l.charCodeAt(0)===c;let w;g?(b.root="/",w=1):w=0;let M=-1,y=0,_=-1,C=!0,R=l.length-1,D=0;for(;R>=w;--R){const T=l.charCodeAt(R);if(T===c){if(!C){y=R+1;break}continue}_===-1&&(C=!1,_=R+1),T===p?M===-1?M=R:D!==1&&(D=1):M!==-1&&(D=-1)}if(_!==-1){const T=y===0&&g?1:y;M===-1||D===0||D===1&&M===_-1&&M===y+1?b.base=b.name=l.slice(T,_):(b.name=l.slice(T,M),b.base=l.slice(T,_),b.ext=l.slice(M,_))}return y>0?b.dir=l.slice(0,y-1):g&&(b.dir="/"),b},sep:"/",delimiter:":",win32:null,posix:null},n.posix.win32=n.win32.win32=n.win32,n.posix.posix=n.win32.posix=n.posix,n.normalize=o?n.win32.normalize:n.posix.normalize,n.join=o?n.win32.join:n.posix.join,n.resolve=o?n.win32.resolve:n.posix.resolve,n.relative=o?n.win32.relative:n.posix.relative,n.dirname=o?n.win32.dirname:n.posix.dirname,n.basename=o?n.win32.basename:n.posix.basename,n.extname=o?n.win32.extname:n.posix.extname,n.sep=o?n.win32.sep:n.posix.sep}),X(J[14],Z([0,1,37,11]),function(W,n,i,x){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.URI=void 0,n.uriToFsPath=N;const A=/^\w[\w\d+.-]*$/,d=/^\//,f=/^\/\//;function p(b,g){if(!b.scheme&&g)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${b.authority}", path: "${b.path}", query: "${b.query}", fragment: "${b.fragment}"}`);if(b.scheme&&!A.test(b.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(b.path){if(b.authority){if(!d.test(b.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(f.test(b.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}function c(b,g){return!b&&!g?"file":b}function a(b,g){switch(b){case"https":case"http":case"file":g?g[0]!==e&&(g=e+g):g=e;break}return g}const m="",e="/",h=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class r{static isUri(g){return g instanceof r?!0:g?typeof g.authority=="string"&&typeof g.fragment=="string"&&typeof g.path=="string"&&typeof g.query=="string"&&typeof g.scheme=="string"&&typeof g.fsPath=="string"&&typeof g.with=="function"&&typeof g.toString=="function":!1}constructor(g,w,M,y,_,C=!1){typeof g=="object"?(this.scheme=g.scheme||m,this.authority=g.authority||m,this.path=g.path||m,this.query=g.query||m,this.fragment=g.fragment||m):(this.scheme=c(g,C),this.authority=w||m,this.path=a(this.scheme,M||m),this.query=y||m,this.fragment=_||m,p(this,C))}get fsPath(){return N(this,!1)}with(g){if(!g)return this;let{scheme:w,authority:M,path:y,query:_,fragment:C}=g;return w===void 0?w=this.scheme:w===null&&(w=m),M===void 0?M=this.authority:M===null&&(M=m),y===void 0?y=this.path:y===null&&(y=m),_===void 0?_=this.query:_===null&&(_=m),C===void 0?C=this.fragment:C===null&&(C=m),w===this.scheme&&M===this.authority&&y===this.path&&_===this.query&&C===this.fragment?this:new o(w,M,y,_,C)}static parse(g,w=!1){const M=h.exec(g);return M?new o(M[2]||m,l(M[4]||m),l(M[5]||m),l(M[7]||m),l(M[9]||m),w):new o(m,m,m,m,m)}static file(g){let w=m;if(x.isWindows&&(g=g.replace(/\\/g,e)),g[0]===e&&g[1]===e){const M=g.indexOf(e,2);M===-1?(w=g.substring(2),g=e):(w=g.substring(2,M),g=g.substring(M)||e)}return new o("file",w,g,m,m)}static from(g,w){return new o(g.scheme,g.authority,g.path,g.query,g.fragment,w)}static joinPath(g,...w){if(!g.path)throw new Error("[UriError]: cannot call joinPath on URI without path");let M;return x.isWindows&&g.scheme==="file"?M=r.file(i.win32.join(N(g,!0),...w)).path:M=i.posix.join(g.path,...w),g.with({path:M})}toString(g=!1){return P(this,g)}toJSON(){return this}static revive(g){if(g){if(g instanceof r)return g;{const w=new o(g);return w._formatted=g.external??null,w._fsPath=g._sep===s?g.fsPath??null:null,w}}else return g}}n.URI=r;const s=x.isWindows?1:void 0;class o extends r{constructor(){super(...arguments),this._formatted=null,this._fsPath=null}get fsPath(){return this._fsPath||(this._fsPath=N(this,!1)),this._fsPath}toString(g=!1){return g?P(this,!0):(this._formatted||(this._formatted=P(this,!1)),this._formatted)}toJSON(){const g={$mid:1};return this._fsPath&&(g.fsPath=this._fsPath,g._sep=s),this._formatted&&(g.external=this._formatted),this.path&&(g.path=this.path),this.scheme&&(g.scheme=this.scheme),this.authority&&(g.authority=this.authority),this.query&&(g.query=this.query),this.fragment&&(g.fragment=this.fragment),g}}const u={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function S(b,g,w){let M,y=-1;for(let _=0;_=97&&C<=122||C>=65&&C<=90||C>=48&&C<=57||C===45||C===46||C===95||C===126||g&&C===47||w&&C===91||w&&C===93||w&&C===58)y!==-1&&(M+=encodeURIComponent(b.substring(y,_)),y=-1),M!==void 0&&(M+=b.charAt(_));else{M===void 0&&(M=b.substr(0,_));const R=u[C];R!==void 0?(y!==-1&&(M+=encodeURIComponent(b.substring(y,_)),y=-1),M+=R):y===-1&&(y=_)}}return y!==-1&&(M+=encodeURIComponent(b.substring(y))),M!==void 0?M:b}function L(b){let g;for(let w=0;w1&&b.scheme==="file"?w=`//${b.authority}${b.path}`:b.path.charCodeAt(0)===47&&(b.path.charCodeAt(1)>=65&&b.path.charCodeAt(1)<=90||b.path.charCodeAt(1)>=97&&b.path.charCodeAt(1)<=122)&&b.path.charCodeAt(2)===58?g?w=b.path.substr(1):w=b.path[1].toLowerCase()+b.path.substr(2):w=b.path,x.isWindows&&(w=w.replace(/\//g,"\\")),w}function P(b,g){const w=g?L:S;let M="",{scheme:y,authority:_,path:C,query:R,fragment:D}=b;if(y&&(M+=y,M+=":"),(_||y==="file")&&(M+=e,M+=e),_){let T=_.indexOf("@");if(T!==-1){const O=_.substr(0,T);_=_.substr(T+1),T=O.lastIndexOf(":"),T===-1?M+=w(O,!1,!1):(M+=w(O.substr(0,T),!1,!1),M+=":",M+=w(O.substr(T+1),!1,!0)),M+="@"}_=_.toLowerCase(),T=_.lastIndexOf(":"),T===-1?M+=w(_,!1,!0):(M+=w(_.substr(0,T),!1,!0),M+=_.substr(T))}if(C){if(C.length>=3&&C.charCodeAt(0)===47&&C.charCodeAt(2)===58){const T=C.charCodeAt(1);T>=65&&T<=90&&(C=`/${String.fromCharCode(T+32)}:${C.substr(3)}`)}else if(C.length>=2&&C.charCodeAt(1)===58){const T=C.charCodeAt(0);T>=65&&T<=90&&(C=`${String.fromCharCode(T+32)}:${C.substr(2)}`)}M+=w(C,!0,!1)}return R&&(M+="?",M+=w(R,!1,!1)),D&&(M+="#",M+=g?D:S(D,!1,!1)),M}function E(b){try{return decodeURIComponent(b)}catch{return b.length>3?b.substr(0,3)+E(b.substr(3)):b}}const v=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function l(b){return b.match(v)?b.replace(v,g=>E(g)):b}}),X(J[38],Z([0,1,3,11,6,14,37]),function(W,n,i,x,A,d,f){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.COI=n.FileAccess=n.VSCODE_AUTHORITY=n.RemoteAuthorities=n.connectionTokenQueryName=n.Schemas=void 0,n.matchesScheme=c,n.matchesSomeScheme=a;var p;(function(r){r.inMemory="inmemory",r.vscode="vscode",r.internal="private",r.walkThrough="walkThrough",r.walkThroughSnippet="walkThroughSnippet",r.http="http",r.https="https",r.file="file",r.mailto="mailto",r.untitled="untitled",r.data="data",r.command="command",r.vscodeRemote="vscode-remote",r.vscodeRemoteResource="vscode-remote-resource",r.vscodeManagedRemoteResource="vscode-managed-remote-resource",r.vscodeUserData="vscode-userdata",r.vscodeCustomEditor="vscode-custom-editor",r.vscodeNotebookCell="vscode-notebook-cell",r.vscodeNotebookCellMetadata="vscode-notebook-cell-metadata",r.vscodeNotebookCellMetadataDiff="vscode-notebook-cell-metadata-diff",r.vscodeNotebookCellOutput="vscode-notebook-cell-output",r.vscodeNotebookCellOutputDiff="vscode-notebook-cell-output-diff",r.vscodeNotebookMetadata="vscode-notebook-metadata",r.vscodeInteractiveInput="vscode-interactive-input",r.vscodeSettings="vscode-settings",r.vscodeWorkspaceTrust="vscode-workspace-trust",r.vscodeTerminal="vscode-terminal",r.vscodeChatCodeBlock="vscode-chat-code-block",r.vscodeChatCodeCompareBlock="vscode-chat-code-compare-block",r.vscodeChatSesssion="vscode-chat-editor",r.webviewPanel="webview-panel",r.vscodeWebview="vscode-webview",r.extension="extension",r.vscodeFileResource="vscode-file",r.tmp="tmp",r.vsls="vsls",r.vscodeSourceControl="vscode-scm",r.commentsInput="comment",r.codeSetting="code-setting",r.outputChannel="output"})(p||(n.Schemas=p={}));function c(r,s){return d.URI.isUri(r)?(0,A.equalsIgnoreCase)(r.scheme,s):(0,A.startsWithIgnoreCase)(r,s+":")}function a(r,...s){return s.some(o=>c(r,o))}n.connectionTokenQueryName="tkn";class m{constructor(){this._hosts=Object.create(null),this._ports=Object.create(null),this._connectionTokens=Object.create(null),this._preferredWebSchema="http",this._delegate=null,this._serverRootPath="/"}setPreferredWebSchema(s){this._preferredWebSchema=s}get _remoteResourcesPath(){return f.posix.join(this._serverRootPath,p.vscodeRemoteResource)}rewrite(s){if(this._delegate)try{return this._delegate(s)}catch(P){return i.onUnexpectedError(P),s}const o=s.authority;let u=this._hosts[o];u&&u.indexOf(":")!==-1&&u.indexOf("[")===-1&&(u=`[${u}]`);const S=this._ports[o],L=this._connectionTokens[o];let N=`path=${encodeURIComponent(s.path)}`;return typeof L=="string"&&(N+=`&${n.connectionTokenQueryName}=${encodeURIComponent(L)}`),d.URI.from({scheme:x.isWeb?this._preferredWebSchema:p.vscodeRemoteResource,authority:`${u}:${S}`,path:this._remoteResourcesPath,query:N})}}n.RemoteAuthorities=new m,n.VSCODE_AUTHORITY="vscode-app";class e{static{this.FALLBACK_AUTHORITY=n.VSCODE_AUTHORITY}asBrowserUri(s){const o=this.toUri(s,W);return this.uriToBrowserUri(o)}uriToBrowserUri(s){return s.scheme===p.vscodeRemote?n.RemoteAuthorities.rewrite(s):s.scheme===p.file&&(x.isNative||x.webWorkerOrigin===`${p.vscodeFileResource}://${e.FALLBACK_AUTHORITY}`)?s.with({scheme:p.vscodeFileResource,authority:s.authority||e.FALLBACK_AUTHORITY,query:null,fragment:null}):s}toUri(s,o){if(d.URI.isUri(s))return s;if(globalThis._VSCODE_FILE_ROOT){const u=globalThis._VSCODE_FILE_ROOT;if(/^\w[\w\d+.-]*:\/\//.test(u))return d.URI.joinPath(d.URI.parse(u,!0),s);const S=f.join(u,s);return d.URI.file(S)}return d.URI.parse(o.toUrl(s))}}n.FileAccess=new e;var h;(function(r){const s=new Map([["1",{"Cross-Origin-Opener-Policy":"same-origin"}],["2",{"Cross-Origin-Embedder-Policy":"require-corp"}],["3",{"Cross-Origin-Opener-Policy":"same-origin","Cross-Origin-Embedder-Policy":"require-corp"}]]);r.CoopAndCoep=Object.freeze(s.get("3"));const o="vscode-coi";function u(L){let N;typeof L=="string"?N=new URL(L).searchParams:L instanceof URL?N=L.searchParams:d.URI.isUri(L)&&(N=new URL(L.toString(!0)).searchParams);const P=N?.get(o);if(P)return s.get(P)}r.getHeadersFromQuery=u;function S(L,N,P){if(!globalThis.crossOriginIsolated)return;const E=N&&P?"3":P?"2":"1";L instanceof URLSearchParams?L.set(o,E):L[o]=E}r.addSearchParam=S})(h||(n.COI=h={}))}),X(J[76],Z([0,1,3,9,8,38,11,6]),function(W,n,i,x,A,d,f,p){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.SimpleWorkerServer=n.SimpleWorkerClient=void 0,n.logOnceWebWorkerWarning=h,n.create=l;const c=!1,a="default",m="$initialize";let e=!1;function h(b){f.isWeb&&(e||(e=!0,console.warn("Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/microsoft/monaco-editor#faq")),console.warn(b.message))}class r{constructor(g,w,M,y,_){this.vsWorker=g,this.req=w,this.channel=M,this.method=y,this.args=_,this.type=0}}class s{constructor(g,w,M,y){this.vsWorker=g,this.seq=w,this.res=M,this.err=y,this.type=1}}class o{constructor(g,w,M,y,_){this.vsWorker=g,this.req=w,this.channel=M,this.eventName=y,this.arg=_,this.type=2}}class u{constructor(g,w,M){this.vsWorker=g,this.req=w,this.event=M,this.type=3}}class S{constructor(g,w){this.vsWorker=g,this.req=w,this.type=4}}class L{constructor(g){this._workerId=-1,this._handler=g,this._lastSentReq=0,this._pendingReplies=Object.create(null),this._pendingEmitters=new Map,this._pendingEvents=new Map}setWorkerId(g){this._workerId=g}sendMessage(g,w,M){const y=String(++this._lastSentReq);return new Promise((_,C)=>{this._pendingReplies[y]={resolve:_,reject:C},this._send(new r(this._workerId,y,g,w,M))})}listen(g,w,M){let y=null;const _=new x.Emitter({onWillAddFirstListener:()=>{y=String(++this._lastSentReq),this._pendingEmitters.set(y,_),this._send(new o(this._workerId,y,g,w,M))},onDidRemoveLastListener:()=>{this._pendingEmitters.delete(y),this._send(new S(this._workerId,y)),y=null}});return _.event}handleMessage(g){!g||!g.vsWorker||this._workerId!==-1&&g.vsWorker!==this._workerId||this._handleMessage(g)}createProxyToRemoteChannel(g,w){const M={get:(y,_)=>(typeof _=="string"&&!y[_]&&(E(_)?y[_]=C=>this.listen(g,_,C):P(_)?y[_]=this.listen(g,_,void 0):_.charCodeAt(0)===36&&(y[_]=async(...C)=>(await w?.(),this.sendMessage(g,_,C)))),y[_])};return new Proxy(Object.create(null),M)}_handleMessage(g){switch(g.type){case 1:return this._handleReplyMessage(g);case 0:return this._handleRequestMessage(g);case 2:return this._handleSubscribeEventMessage(g);case 3:return this._handleEventMessage(g);case 4:return this._handleUnsubscribeEventMessage(g)}}_handleReplyMessage(g){if(!this._pendingReplies[g.seq]){console.warn("Got reply to unknown seq");return}const w=this._pendingReplies[g.seq];if(delete this._pendingReplies[g.seq],g.err){let M=g.err;g.err.$isError&&(M=new Error,M.name=g.err.name,M.message=g.err.message,M.stack=g.err.stack),w.reject(M);return}w.resolve(g.res)}_handleRequestMessage(g){const w=g.req;this._handler.handleMessage(g.channel,g.method,g.args).then(y=>{this._send(new s(this._workerId,w,y,void 0))},y=>{y.detail instanceof Error&&(y.detail=(0,i.transformErrorForSerialization)(y.detail)),this._send(new s(this._workerId,w,void 0,(0,i.transformErrorForSerialization)(y)))})}_handleSubscribeEventMessage(g){const w=g.req,M=this._handler.handleEvent(g.channel,g.eventName,g.arg)(y=>{this._send(new u(this._workerId,w,y))});this._pendingEvents.set(w,M)}_handleEventMessage(g){if(!this._pendingEmitters.has(g.req)){console.warn("Got event for unknown req");return}this._pendingEmitters.get(g.req).fire(g.event)}_handleUnsubscribeEventMessage(g){if(!this._pendingEvents.has(g.req)){console.warn("Got unsubscribe for unknown req");return}this._pendingEvents.get(g.req).dispose(),this._pendingEvents.delete(g.req)}_send(g){const w=[];if(g.type===0)for(let M=0;M{this._protocol.handleMessage(_)},_=>{(0,i.onUnexpectedError)(_)})),this._protocol=new L({sendMessage:(_,C)=>{this._worker.postMessage(_,C)},handleMessage:(_,C,R)=>this._handleMessage(_,C,R),handleEvent:(_,C,R)=>this._handleEvent(_,C,R)}),this._protocol.setWorkerId(this._worker.getId());let M=null;const y=globalThis.require;typeof y<"u"&&typeof y.getConfig=="function"?M=y.getConfig():typeof globalThis.requirejs<"u"&&(M=globalThis.requirejs.s.contexts._.config),this._onModuleLoaded=this._protocol.sendMessage(a,m,[this._worker.getId(),JSON.parse(JSON.stringify(M)),w.amdModuleId]),this.proxy=this._protocol.createProxyToRemoteChannel(a,async()=>{await this._onModuleLoaded}),this._onModuleLoaded.catch(_=>{this._onError("Worker failed to load "+w.amdModuleId,_)})}_handleMessage(g,w,M){const y=this._localChannels.get(g);if(!y)return Promise.reject(new Error(`Missing channel ${g} on main thread`));if(typeof y[w]!="function")return Promise.reject(new Error(`Missing method ${w} on main thread channel ${g}`));try{return Promise.resolve(y[w].apply(y,M))}catch(_){return Promise.reject(_)}}_handleEvent(g,w,M){const y=this._localChannels.get(g);if(!y)throw new Error(`Missing channel ${g} on main thread`);if(E(w)){const _=y[w].call(y,M);if(typeof _!="function")throw new Error(`Missing dynamic event ${w} on main thread channel ${g}.`);return _}if(P(w)){const _=y[w];if(typeof _!="function")throw new Error(`Missing event ${w} on main thread channel ${g}.`);return _}throw new Error(`Malformed event name ${w}`)}setChannel(g,w){this._localChannels.set(g,w)}_onError(g,w){console.error(g),console.info(w)}}n.SimpleWorkerClient=N;function P(b){return b[0]==="o"&&b[1]==="n"&&p.isUpperAsciiLetter(b.charCodeAt(2))}function E(b){return/^onDynamic/.test(b)&&p.isUpperAsciiLetter(b.charCodeAt(9))}class v{constructor(g,w){this._localChannels=new Map,this._remoteChannels=new Map,this._requestHandlerFactory=w,this._requestHandler=null,this._protocol=new L({sendMessage:(M,y)=>{g(M,y)},handleMessage:(M,y,_)=>this._handleMessage(M,y,_),handleEvent:(M,y,_)=>this._handleEvent(M,y,_)})}onmessage(g){this._protocol.handleMessage(g)}_handleMessage(g,w,M){if(g===a&&w===m)return this.initialize(M[0],M[1],M[2]);const y=g===a?this._requestHandler:this._localChannels.get(g);if(!y)return Promise.reject(new Error(`Missing channel ${g} on worker thread`));if(typeof y[w]!="function")return Promise.reject(new Error(`Missing method ${w} on worker thread channel ${g}`));try{return Promise.resolve(y[w].apply(y,M))}catch(_){return Promise.reject(_)}}_handleEvent(g,w,M){const y=g===a?this._requestHandler:this._localChannels.get(g);if(!y)throw new Error(`Missing channel ${g} on worker thread`);if(E(w)){const _=y[w].call(y,M);if(typeof _!="function")throw new Error(`Missing dynamic event ${w} on request handler.`);return _}if(P(w)){const _=y[w];if(typeof _!="function")throw new Error(`Missing event ${w} on request handler.`);return _}throw new Error(`Malformed event name ${w}`)}getChannel(g){if(!this._remoteChannels.has(g)){const w=this._protocol.createProxyToRemoteChannel(g);this._remoteChannels.set(g,w)}return this._remoteChannels.get(g)}async initialize(g,w,M){if(this._protocol.setWorkerId(g),this._requestHandlerFactory){this._requestHandler=this._requestHandlerFactory(this);return}if(w&&(typeof w.baseUrl<"u"&&delete w.baseUrl,typeof w.paths<"u"&&typeof w.paths.vs<"u"&&delete w.paths.vs,typeof w.trustedTypesPolicy<"u"&&delete w.trustedTypesPolicy,w.catchError=!0,globalThis.require.config(w)),c){const y=d.FileAccess.asBrowserUri(`${M}.js`).toString(!0);return new Promise((_,C)=>{W([`${y}`],_,C)}).then(_=>{if(this._requestHandler=_.create(this),!this._requestHandler)throw new Error("No RequestHandler!")})}return new Promise((y,_)=>{(globalThis.require||W)([M],R=>{if(this._requestHandler=R.create(this),!this._requestHandler){_(new Error("No RequestHandler!"));return}y()},_)})}}n.SimpleWorkerServer=v;function l(b){return new v(b,null)}}),X(J[73],Z([0,1,47,14,2,70,36]),function(W,n,i,x,A,d,f){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.InlineEditTriggerKind=n.TreeSitterTokenizationRegistry=n.TokenizationRegistry=n.LazyTokenizationSupport=n.InlayHintKind=n.Command=n.NewSymbolNameTriggerKind=n.NewSymbolNameTag=n.FoldingRangeKind=n.TextEdit=n.SymbolKinds=n.symbolKindNames=n.DocumentHighlightKind=n.SignatureHelpTriggerKind=n.DocumentPasteTriggerKind=n.SelectedSuggestionInfo=n.InlineCompletionTriggerKind=n.CompletionItemKinds=n.HoverVerbosityAction=n.EncodedTokenizationResult=n.TokenizationResult=n.Token=void 0,n.isLocationLink=S,n.getAriaLabelForSymbol=L;class p{constructor(_,C,R){this.offset=_,this.type=C,this.language=R,this._tokenBrand=void 0}toString(){return"("+this.offset+", "+this.type+")"}}n.Token=p;class c{constructor(_,C){this.tokens=_,this.endState=C,this._tokenizationResultBrand=void 0}}n.TokenizationResult=c;class a{constructor(_,C){this.tokens=_,this.endState=C,this._encodedTokenizationResultBrand=void 0}}n.EncodedTokenizationResult=a;var m;(function(y){y[y.Increase=0]="Increase",y[y.Decrease=1]="Decrease"})(m||(n.HoverVerbosityAction=m={}));var e;(function(y){const _=new Map;_.set(0,i.Codicon.symbolMethod),_.set(1,i.Codicon.symbolFunction),_.set(2,i.Codicon.symbolConstructor),_.set(3,i.Codicon.symbolField),_.set(4,i.Codicon.symbolVariable),_.set(5,i.Codicon.symbolClass),_.set(6,i.Codicon.symbolStruct),_.set(7,i.Codicon.symbolInterface),_.set(8,i.Codicon.symbolModule),_.set(9,i.Codicon.symbolProperty),_.set(10,i.Codicon.symbolEvent),_.set(11,i.Codicon.symbolOperator),_.set(12,i.Codicon.symbolUnit),_.set(13,i.Codicon.symbolValue),_.set(15,i.Codicon.symbolEnum),_.set(14,i.Codicon.symbolConstant),_.set(15,i.Codicon.symbolEnum),_.set(16,i.Codicon.symbolEnumMember),_.set(17,i.Codicon.symbolKeyword),_.set(27,i.Codicon.symbolSnippet),_.set(18,i.Codicon.symbolText),_.set(19,i.Codicon.symbolColor),_.set(20,i.Codicon.symbolFile),_.set(21,i.Codicon.symbolReference),_.set(22,i.Codicon.symbolCustomColor),_.set(23,i.Codicon.symbolFolder),_.set(24,i.Codicon.symbolTypeParameter),_.set(25,i.Codicon.account),_.set(26,i.Codicon.issues);function C(T){let O=_.get(T);return O||(console.info("No codicon found for CompletionItemKind "+T),O=i.Codicon.symbolProperty),O}y.toIcon=C;const R=new Map;R.set("method",0),R.set("function",1),R.set("constructor",2),R.set("field",3),R.set("variable",4),R.set("class",5),R.set("struct",6),R.set("interface",7),R.set("module",8),R.set("property",9),R.set("event",10),R.set("operator",11),R.set("unit",12),R.set("value",13),R.set("constant",14),R.set("enum",15),R.set("enum-member",16),R.set("enumMember",16),R.set("keyword",17),R.set("snippet",27),R.set("text",18),R.set("color",19),R.set("file",20),R.set("reference",21),R.set("customcolor",22),R.set("folder",23),R.set("type-parameter",24),R.set("typeParameter",24),R.set("account",25),R.set("issue",26);function D(T,O){let z=R.get(T);return typeof z>"u"&&!O&&(z=9),z}y.fromString=D})(e||(n.CompletionItemKinds=e={}));var h;(function(y){y[y.Automatic=0]="Automatic",y[y.Explicit=1]="Explicit"})(h||(n.InlineCompletionTriggerKind=h={}));class r{constructor(_,C,R,D){this.range=_,this.text=C,this.completionKind=R,this.isSnippetText=D}equals(_){return A.Range.lift(this.range).equalsRange(_.range)&&this.text===_.text&&this.completionKind===_.completionKind&&this.isSnippetText===_.isSnippetText}}n.SelectedSuggestionInfo=r;var s;(function(y){y[y.Automatic=0]="Automatic",y[y.PasteAs=1]="PasteAs"})(s||(n.DocumentPasteTriggerKind=s={}));var o;(function(y){y[y.Invoke=1]="Invoke",y[y.TriggerCharacter=2]="TriggerCharacter",y[y.ContentChange=3]="ContentChange"})(o||(n.SignatureHelpTriggerKind=o={}));var u;(function(y){y[y.Text=0]="Text",y[y.Read=1]="Read",y[y.Write=2]="Write"})(u||(n.DocumentHighlightKind=u={}));function S(y){return y&&x.URI.isUri(y.uri)&&A.Range.isIRange(y.range)&&(A.Range.isIRange(y.originSelectionRange)||A.Range.isIRange(y.targetSelectionRange))}n.symbolKindNames={17:(0,f.localize)(669,"array"),16:(0,f.localize)(670,"boolean"),4:(0,f.localize)(671,"class"),13:(0,f.localize)(672,"constant"),8:(0,f.localize)(673,"constructor"),9:(0,f.localize)(674,"enumeration"),21:(0,f.localize)(675,"enumeration member"),23:(0,f.localize)(676,"event"),7:(0,f.localize)(677,"field"),0:(0,f.localize)(678,"file"),11:(0,f.localize)(679,"function"),10:(0,f.localize)(680,"interface"),19:(0,f.localize)(681,"key"),5:(0,f.localize)(682,"method"),1:(0,f.localize)(683,"module"),2:(0,f.localize)(684,"namespace"),20:(0,f.localize)(685,"null"),15:(0,f.localize)(686,"number"),18:(0,f.localize)(687,"object"),24:(0,f.localize)(688,"operator"),3:(0,f.localize)(689,"package"),6:(0,f.localize)(690,"property"),14:(0,f.localize)(691,"string"),22:(0,f.localize)(692,"struct"),25:(0,f.localize)(693,"type parameter"),12:(0,f.localize)(694,"variable")};function L(y,_){return(0,f.localize)(695,"{0} ({1})",y,n.symbolKindNames[_])}var N;(function(y){const _=new Map;_.set(0,i.Codicon.symbolFile),_.set(1,i.Codicon.symbolModule),_.set(2,i.Codicon.symbolNamespace),_.set(3,i.Codicon.symbolPackage),_.set(4,i.Codicon.symbolClass),_.set(5,i.Codicon.symbolMethod),_.set(6,i.Codicon.symbolProperty),_.set(7,i.Codicon.symbolField),_.set(8,i.Codicon.symbolConstructor),_.set(9,i.Codicon.symbolEnum),_.set(10,i.Codicon.symbolInterface),_.set(11,i.Codicon.symbolFunction),_.set(12,i.Codicon.symbolVariable),_.set(13,i.Codicon.symbolConstant),_.set(14,i.Codicon.symbolString),_.set(15,i.Codicon.symbolNumber),_.set(16,i.Codicon.symbolBoolean),_.set(17,i.Codicon.symbolArray),_.set(18,i.Codicon.symbolObject),_.set(19,i.Codicon.symbolKey),_.set(20,i.Codicon.symbolNull),_.set(21,i.Codicon.symbolEnumMember),_.set(22,i.Codicon.symbolStruct),_.set(23,i.Codicon.symbolEvent),_.set(24,i.Codicon.symbolOperator),_.set(25,i.Codicon.symbolTypeParameter);function C(R){let D=_.get(R);return D||(console.info("No codicon found for SymbolKind "+R),D=i.Codicon.symbolProperty),D}y.toIcon=C})(N||(n.SymbolKinds=N={}));class P{}n.TextEdit=P;class E{static{this.Comment=new E("comment")}static{this.Imports=new E("imports")}static{this.Region=new E("region")}static fromValue(_){switch(_){case"comment":return E.Comment;case"imports":return E.Imports;case"region":return E.Region}return new E(_)}constructor(_){this.value=_}}n.FoldingRangeKind=E;var v;(function(y){y[y.AIGenerated=1]="AIGenerated"})(v||(n.NewSymbolNameTag=v={}));var l;(function(y){y[y.Invoke=0]="Invoke",y[y.Automatic=1]="Automatic"})(l||(n.NewSymbolNameTriggerKind=l={}));var b;(function(y){function _(C){return!C||typeof C!="object"?!1:typeof C.id=="string"&&typeof C.title=="string"}y.is=_})(b||(n.Command=b={}));var g;(function(y){y[y.Type=1]="Type",y[y.Parameter=2]="Parameter"})(g||(n.InlayHintKind=g={}));class w{constructor(_){this.createSupport=_,this._tokenizationSupport=null}dispose(){this._tokenizationSupport&&this._tokenizationSupport.then(_=>{_&&_.dispose()})}get tokenizationSupport(){return this._tokenizationSupport||(this._tokenizationSupport=this.createSupport()),this._tokenizationSupport}}n.LazyTokenizationSupport=w,n.TokenizationRegistry=new d.TokenizationRegistry,n.TreeSitterTokenizationRegistry=new d.TokenizationRegistry;var M;(function(y){y[y.Invoke=0]="Invoke",y[y.Automatic=1]="Automatic"})(M||(n.InlineEditTriggerKind=M={}))}),X(J[74],Z([0,1,23,9,42,14,4,2,48,73,69]),function(W,n,i,x,A,d,f,p,c,a,m){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.KeyMod=void 0,n.createMonacoBaseAPI=h;class e{static{this.CtrlCmd=2048}static{this.Shift=1024}static{this.Alt=512}static{this.WinCtrl=256}static chord(s,o){return(0,A.KeyChord)(s,o)}}n.KeyMod=e;function h(){return{editor:void 0,languages:void 0,CancellationTokenSource:i.CancellationTokenSource,Emitter:x.Emitter,KeyCode:m.KeyCode,KeyMod:e,Position:f.Position,Range:p.Range,Selection:c.Selection,SelectionDirection:m.SelectionDirection,MarkerSeverity:m.MarkerSeverity,MarkerTag:m.MarkerTag,Uri:d.URI,Token:a.Token}}}),X(J[75],Z([0,1,71,8,14,4,2,31,64]),function(W,n,i,x,A,d,f,p,c){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.MirrorModel=n.WorkerTextModelSyncServer=n.WorkerTextModelSyncClient=n.STOP_SYNC_MODEL_DELTA_TIME_MS=void 0,n.STOP_SYNC_MODEL_DELTA_TIME_MS=60*1e3;class a extends x.Disposable{constructor(r,s,o=!1){if(super(),this._syncedModels=Object.create(null),this._syncedModelsLastUsedTime=Object.create(null),this._proxy=r,this._modelService=s,!o){const u=new i.IntervalTimer;u.cancelAndSet(()=>this._checkStopModelSync(),Math.round(n.STOP_SYNC_MODEL_DELTA_TIME_MS/2)),this._register(u)}}dispose(){for(const r in this._syncedModels)(0,x.dispose)(this._syncedModels[r]);this._syncedModels=Object.create(null),this._syncedModelsLastUsedTime=Object.create(null),super.dispose()}ensureSyncedResources(r,s=!1){for(const o of r){const u=o.toString();this._syncedModels[u]||this._beginModelSync(o,s),this._syncedModels[u]&&(this._syncedModelsLastUsedTime[u]=new Date().getTime())}}_checkStopModelSync(){const r=new Date().getTime(),s=[];for(const o in this._syncedModelsLastUsedTime)r-this._syncedModelsLastUsedTime[o]>n.STOP_SYNC_MODEL_DELTA_TIME_MS&&s.push(o);for(const o of s)this._stopModelSync(o)}_beginModelSync(r,s){const o=this._modelService.getModel(r);if(!o||!s&&o.isTooLargeForSyncing())return;const u=r.toString();this._proxy.$acceptNewModel({url:o.uri.toString(),lines:o.getLinesContent(),EOL:o.getEOL(),versionId:o.getVersionId()});const S=new x.DisposableStore;S.add(o.onDidChangeContent(L=>{this._proxy.$acceptModelChanged(u.toString(),L)})),S.add(o.onWillDispose(()=>{this._stopModelSync(u)})),S.add((0,x.toDisposable)(()=>{this._proxy.$acceptRemovedModel(u)})),this._syncedModels[u]=S}_stopModelSync(r){const s=this._syncedModels[r];delete this._syncedModels[r],delete this._syncedModelsLastUsedTime[r],(0,x.dispose)(s)}}n.WorkerTextModelSyncClient=a;class m{constructor(){this._models=Object.create(null)}getModel(r){return this._models[r]}getModels(){const r=[];return Object.keys(this._models).forEach(s=>r.push(this._models[s])),r}$acceptNewModel(r){this._models[r.url]=new e(A.URI.parse(r.url),r.lines,r.EOL,r.versionId)}$acceptModelChanged(r,s){if(!this._models[r])return;this._models[r].onEvents(s)}$acceptRemovedModel(r){this._models[r]&&delete this._models[r]}}n.WorkerTextModelSyncServer=m;class e extends c.MirrorTextModel{get uri(){return this._uri}get eol(){return this._eol}getValue(){return this.getText()}findMatches(r){const s=[];for(let o=0;othis._lines.length)s=this._lines.length,o=this._lines[s-1].length+1,u=!0;else{const S=this._lines[s-1].length+1;o<1?(o=1,u=!0):o>S&&(o=S,u=!0)}return u?{lineNumber:s,column:o}:r}}n.MirrorModel=e}),X(J[77],Z([0,1,24,2,60,61,74,66,22,68,58,27,38,59,67,75]),function(W,n,i,x,A,d,f,p,c,a,m,e,h,r,s,o){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.EditorSimpleWorker=n.BaseEditorSimpleWorker=void 0,n.create=N;const u=!1;class S{constructor(){this._workerTextModelSyncServer=new o.WorkerTextModelSyncServer}dispose(){}_getModel(E){return this._workerTextModelSyncServer.getModel(E)}_getModels(){return this._workerTextModelSyncServer.getModels()}$acceptNewModel(E){this._workerTextModelSyncServer.$acceptNewModel(E)}$acceptModelChanged(E,v){this._workerTextModelSyncServer.$acceptModelChanged(E,v)}$acceptRemovedModel(E){this._workerTextModelSyncServer.$acceptRemovedModel(E)}async $computeUnicodeHighlights(E,v,l){const b=this._getModel(E);return b?a.UnicodeTextModelHighlighter.computeUnicodeHighlights(b,v,l):{ranges:[],hasMore:!1,ambiguousCharacterCount:0,invisibleCharacterCount:0,nonBasicAsciiCharacterCount:0}}async $findSectionHeaders(E,v){const l=this._getModel(E);return l?(0,s.findSectionHeaders)(l,v):[]}async $computeDiff(E,v,l,b){const g=this._getModel(E),w=this._getModel(v);return!g||!w?null:L.computeDiff(g,w,l,b)}static computeDiff(E,v,l,b){const g=b==="advanced"?m.linesDiffComputers.getDefault():m.linesDiffComputers.getLegacy(),w=E.getLinesContent(),M=v.getLinesContent(),y=g.computeDiff(w,M,l),_=y.changes.length>0?!1:this._modelsAreIdentical(E,v);function C(R){return R.map(D=>[D.original.startLineNumber,D.original.endLineNumberExclusive,D.modified.startLineNumber,D.modified.endLineNumberExclusive,D.innerChanges?.map(T=>[T.originalRange.startLineNumber,T.originalRange.startColumn,T.originalRange.endLineNumber,T.originalRange.endColumn,T.modifiedRange.startLineNumber,T.modifiedRange.startColumn,T.modifiedRange.endLineNumber,T.modifiedRange.endColumn])])}return{identical:_,quitEarly:y.hitTimeout,changes:C(y.changes),moves:y.moves.map(R=>[R.lineRangeMapping.original.startLineNumber,R.lineRangeMapping.original.endLineNumberExclusive,R.lineRangeMapping.modified.startLineNumber,R.lineRangeMapping.modified.endLineNumberExclusive,C(R.changes)])}}static _modelsAreIdentical(E,v){const l=E.getLineCount(),b=v.getLineCount();if(l!==b)return!1;for(let g=1;g<=l;g++){const w=E.getLineContent(g),M=v.getLineContent(g);if(w!==M)return!1}return!0}static{this._diffLimit=1e5}async $computeMoreMinimalEdits(E,v,l){const b=this._getModel(E);if(!b)return v;const g=[];let w;v=v.slice(0).sort((y,_)=>{if(y.range&&_.range)return x.Range.compareRangesUsingStarts(y.range,_.range);const C=y.range?0:1,R=_.range?0:1;return C-R});let M=0;for(let y=1;yL._diffLimit){g.push({range:y,text:_});continue}const D=(0,i.stringDiff)(R,_,l),T=b.offsetAt(x.Range.lift(y).getStartPosition());for(const O of D){const z=b.positionAt(T+O.originalStart),j=b.positionAt(T+O.originalStart+O.originalLength),F={text:_.substr(O.modifiedStart,O.modifiedLength),range:{startLineNumber:z.lineNumber,startColumn:z.column,endLineNumber:j.lineNumber,endColumn:j.column}};b.getValueInRange(F.range)!==F.text&&g.push(F)}}return typeof w=="number"&&g.push({eol:w,text:"",range:{startLineNumber:0,startColumn:0,endLineNumber:0,endColumn:0}}),g}async $computeLinks(E){const v=this._getModel(E);return v?(0,A.computeLinks)(v):null}async $computeDefaultDocumentColors(E){const v=this._getModel(E);return v?(0,r.computeDefaultDocumentColors)(v):null}static{this._suggestionsLimit=1e4}async $textualSuggest(E,v,l,b){const g=new c.StopWatch,w=new RegExp(l,b),M=new Set;e:for(const y of E){const _=this._getModel(y);if(_){for(const C of _.words(w))if(!(C===v||!isNaN(Number(C)))&&(M.add(C),M.size>L._suggestionsLimit))break e}}return{words:Array.from(M),duration:g.elapsed()}}async $computeWordRanges(E,v,l,b){const g=this._getModel(E);if(!g)return Object.create(null);const w=new RegExp(l,b),M=Object.create(null);for(let y=v.startLineNumber;ythis._host.$fhr(M,y),w={host:(0,e.createProxyObject)(l,b),getMirrorModels:()=>this._getModels()};return this._foreignModuleFactory?(this._foreignModule=this._foreignModuleFactory(w,v),Promise.resolve((0,e.getAllMethodNames)(this._foreignModule))):new Promise((M,y)=>{const _=C=>{this._foreignModule=C.create(w,v),M((0,e.getAllMethodNames)(this._foreignModule))};if(!u)W([`${E}`],_,y);else{const C=h.FileAccess.asBrowserUri(`${E}.js`).toString(!0);new Promise((R,D)=>{W([`${C}`],R,D)}).then(_).catch(y)}})}$fmr(E,v){if(!this._foreignModule||typeof this._foreignModule[E]!="function")return Promise.reject(new Error("Missing requestHandler or method: "+E));try{return Promise.resolve(this._foreignModule[E].apply(this._foreignModule,v))}catch(l){return Promise.reject(l)}}}n.EditorSimpleWorker=L;function N(P){return new L(p.EditorWorkerHost.getChannel(P),null)}typeof importScripts=="function"&&(globalThis.monaco=(0,f.createMonacoBaseAPI)())})}).call(this); - -//# sourceMappingURL=../../../../min-maps/vs/base/worker/workerMain.js.map \ No newline at end of file diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/abap/abap.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/abap/abap.js deleted file mode 100644 index 4d640ab5dc..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/abap/abap.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/abap/abap", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var i in e)s(t,i,{get:e[i],enumerable:!0})},d=(t,e,i,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of r(e))!c.call(t,n)&&n!==i&&s(t,n,{get:()=>e[n],enumerable:!(a=o(e,n))||a.enumerable});return t};var p=t=>d(s({},"__esModule",{value:!0}),t);var g={};l(g,{conf:()=>m,language:()=>u});var m={comments:{lineComment:"*"},brackets:[["[","]"],["(",")"]]},u={defaultToken:"invalid",ignoreCase:!0,tokenPostfix:".abap",keywords:["abap-source","abbreviated","abstract","accept","accepting","according","activation","actual","add","add-corresponding","adjacent","after","alias","aliases","align","all","allocate","alpha","analysis","analyzer","and","append","appendage","appending","application","archive","area","arithmetic","as","ascending","aspect","assert","assign","assigned","assigning","association","asynchronous","at","attributes","authority","authority-check","avg","back","background","backup","backward","badi","base","before","begin","between","big","binary","bintohex","bit","black","blank","blanks","blob","block","blocks","blue","bound","boundaries","bounds","boxed","break-point","buffer","by","bypassing","byte","byte-order","call","calling","case","cast","casting","catch","center","centered","chain","chain-input","chain-request","change","changing","channels","character","char-to-hex","check","checkbox","ci_","circular","class","class-coding","class-data","class-events","class-methods","class-pool","cleanup","clear","client","clob","clock","close","coalesce","code","coding","col_background","col_group","col_heading","col_key","col_negative","col_normal","col_positive","col_total","collect","color","column","columns","comment","comments","commit","common","communication","comparing","component","components","compression","compute","concat","concat_with_space","concatenate","cond","condense","condition","connect","connection","constants","context","contexts","continue","control","controls","conv","conversion","convert","copies","copy","corresponding","country","cover","cpi","create","creating","critical","currency","currency_conversion","current","cursor","cursor-selection","customer","customer-function","dangerous","data","database","datainfo","dataset","date","dats_add_days","dats_add_months","dats_days_between","dats_is_valid","daylight","dd/mm/yy","dd/mm/yyyy","ddmmyy","deallocate","decimal_shift","decimals","declarations","deep","default","deferred","define","defining","definition","delete","deleting","demand","department","descending","describe","destination","detail","dialog","directory","disconnect","display","display-mode","distinct","divide","divide-corresponding","division","do","dummy","duplicate","duplicates","duration","during","dynamic","dynpro","edit","editor-call","else","elseif","empty","enabled","enabling","encoding","end","endat","endcase","endcatch","endchain","endclass","enddo","endenhancement","end-enhancement-section","endexec","endform","endfunction","endian","endif","ending","endinterface","end-lines","endloop","endmethod","endmodule","end-of-definition","end-of-editing","end-of-file","end-of-page","end-of-selection","endon","endprovide","endselect","end-test-injection","end-test-seam","endtry","endwhile","endwith","engineering","enhancement","enhancement-point","enhancements","enhancement-section","entries","entry","enum","environment","equiv","errormessage","errors","escaping","event","events","exact","except","exception","exceptions","exception-table","exclude","excluding","exec","execute","exists","exit","exit-command","expand","expanding","expiration","explicit","exponent","export","exporting","extend","extended","extension","extract","fail","fetch","field","field-groups","fields","field-symbol","field-symbols","file","filter","filters","filter-table","final","find","first","first-line","fixed-point","fkeq","fkge","flush","font","for","form","format","forward","found","frame","frames","free","friends","from","function","functionality","function-pool","further","gaps","generate","get","giving","gkeq","gkge","global","grant","green","group","groups","handle","handler","harmless","hashed","having","hdb","header","headers","heading","head-lines","help-id","help-request","hextobin","hide","high","hint","hold","hotspot","icon","id","identification","identifier","ids","if","ignore","ignoring","immediately","implementation","implementations","implemented","implicit","import","importing","in","inactive","incl","include","includes","including","increment","index","index-line","infotypes","inheriting","init","initial","initialization","inner","inout","input","insert","instance","instances","instr","intensified","interface","interface-pool","interfaces","internal","intervals","into","inverse","inverted-date","is","iso","job","join","keep","keeping","kernel","key","keys","keywords","kind","language","last","late","layout","leading","leave","left","left-justified","leftplus","leftspace","legacy","length","let","level","levels","like","line","lines","line-count","linefeed","line-selection","line-size","list","listbox","list-processing","little","llang","load","load-of-program","lob","local","locale","locator","logfile","logical","log-point","long","loop","low","lower","lpad","lpi","ltrim","mail","main","major-id","mapping","margin","mark","mask","match","matchcode","max","maximum","medium","members","memory","mesh","message","message-id","messages","messaging","method","methods","min","minimum","minor-id","mm/dd/yy","mm/dd/yyyy","mmddyy","mode","modif","modifier","modify","module","move","move-corresponding","multiply","multiply-corresponding","name","nametab","native","nested","nesting","new","new-line","new-page","new-section","next","no","no-display","no-extension","no-gap","no-gaps","no-grouping","no-heading","no-scrolling","no-sign","no-title","no-topofpage","no-zero","node","nodes","non-unicode","non-unique","not","null","number","object","objects","obligatory","occurrence","occurrences","occurs","of","off","offset","ole","on","only","open","option","optional","options","or","order","other","others","out","outer","output","output-length","overflow","overlay","pack","package","pad","padding","page","pages","parameter","parameters","parameter-table","part","partially","pattern","percentage","perform","performing","person","pf1","pf10","pf11","pf12","pf13","pf14","pf15","pf2","pf3","pf4","pf5","pf6","pf7","pf8","pf9","pf-status","pink","places","pool","pos_high","pos_low","position","pragmas","precompiled","preferred","preserving","primary","print","print-control","priority","private","procedure","process","program","property","protected","provide","public","push","pushbutton","put","queue-only","quickinfo","radiobutton","raise","raising","range","ranges","read","reader","read-only","receive","received","receiver","receiving","red","redefinition","reduce","reduced","ref","reference","refresh","regex","reject","remote","renaming","replace","replacement","replacing","report","request","requested","reserve","reset","resolution","respecting","responsible","result","results","resumable","resume","retry","return","returncode","returning","returns","right","right-justified","rightplus","rightspace","risk","rmc_communication_failure","rmc_invalid_status","rmc_system_failure","role","rollback","rows","rpad","rtrim","run","sap","sap-spool","saving","scale_preserving","scale_preserving_scientific","scan","scientific","scientific_with_leading_zero","scroll","scroll-boundary","scrolling","search","secondary","seconds","section","select","selection","selections","selection-screen","selection-set","selection-sets","selection-table","select-options","send","separate","separated","set","shared","shift","short","shortdump-id","sign_as_postfix","single","size","skip","skipping","smart","some","sort","sortable","sorted","source","specified","split","spool","spots","sql","sqlscript","stable","stamp","standard","starting","start-of-editing","start-of-selection","state","statement","statements","static","statics","statusinfo","step-loop","stop","structure","structures","style","subkey","submatches","submit","subroutine","subscreen","subtract","subtract-corresponding","suffix","sum","summary","summing","supplied","supply","suppress","switch","switchstates","symbol","syncpoints","syntax","syntax-check","syntax-trace","system-call","system-exceptions","system-exit","tab","tabbed","table","tables","tableview","tabstrip","target","task","tasks","test","testing","test-injection","test-seam","text","textpool","then","throw","time","times","timestamp","timezone","tims_is_valid","title","titlebar","title-lines","to","tokenization","tokens","top-lines","top-of-page","trace-file","trace-table","trailing","transaction","transfer","transformation","translate","transporting","trmac","truncate","truncation","try","tstmp_add_seconds","tstmp_current_utctimestamp","tstmp_is_valid","tstmp_seconds_between","type","type-pool","type-pools","types","uline","unassign","under","unicode","union","unique","unit_conversion","unix","unpack","until","unwind","up","update","upper","user","user-command","using","utf-8","valid","value","value-request","values","vary","varying","verification-message","version","via","view","visible","wait","warning","when","whenever","where","while","width","window","windows","with","with-heading","without","with-title","word","work","write","writer","xml","xsd","yellow","yes","yymmdd","zero","zone","abap_system_timezone","abap_user_timezone","access","action","adabas","adjust_numbers","allow_precision_loss","allowed","amdp","applicationuser","as_geo_json","as400","associations","balance","behavior","breakup","bulk","cds","cds_client","check_before_save","child","clients","corr","corr_spearman","cross","cycles","datn_add_days","datn_add_months","datn_days_between","dats_from_datn","dats_tims_to_tstmp","dats_to_datn","db2","db6","ddl","dense_rank","depth","deterministic","discarding","entities","entity","error","failed","finalize","first_value","fltp_to_dec","following","fractional","full","graph","grouping","hierarchy","hierarchy_ancestors","hierarchy_ancestors_aggregate","hierarchy_descendants","hierarchy_descendants_aggregate","hierarchy_siblings","incremental","indicators","lag","last_value","lead","leaves","like_regexpr","link","locale_sap","lock","locks","many","mapped","matched","measures","median","mssqlnt","multiple","nodetype","ntile","nulls","occurrences_regexpr","one","operations","oracle","orphans","over","parent","parents","partition","pcre","period","pfcg_mapping","preceding","privileged","product","projection","rank","redirected","replace_regexpr","reported","response","responses","root","row","row_number","sap_system_date","save","schema","session","sets","shortdump","siblings","spantree","start","stddev","string_agg","subtotal","sybase","tims_from_timn","tims_to_timn","to_blob","to_clob","total","trace-entry","tstmp_to_dats","tstmp_to_dst","tstmp_to_tims","tstmpl_from_utcl","tstmpl_to_utcl","unbounded","utcl_add_seconds","utcl_current","utcl_seconds_between","uuid","var","verbatim"],builtinFunctions:["abs","acos","asin","atan","bit-set","boolc","boolx","ceil","char_off","charlen","cmax","cmin","concat_lines_of","contains","contains_any_not_of","contains_any_of","cos","cosh","count","count_any_not_of","count_any_of","dbmaxlen","distance","escape","exp","find_any_not_of","find_any_of","find_end","floor","frac","from_mixed","ipow","line_exists","line_index","log","log10","matches","nmax","nmin","numofchar","repeat","rescale","reverse","round","segment","shift_left","shift_right","sign","sin","sinh","sqrt","strlen","substring","substring_after","substring_before","substring_from","substring_to","tan","tanh","to_lower","to_mixed","to_upper","trunc","utclong_add","utclong_current","utclong_diff","xsdbool","xstrlen"],typeKeywords:["b","c","d","decfloat16","decfloat34","f","i","int8","n","p","s","string","t","utclong","x","xstring","any","clike","csequence","decfloat","numeric","simple","xsequence","accp","char","clnt","cuky","curr","datn","dats","d16d","d16n","d16r","d34d","d34n","d34r","dec","df16_dec","df16_raw","df34_dec","df34_raw","fltp","geom_ewkb","int1","int2","int4","lang","lchr","lraw","numc","quan","raw","rawstring","sstring","timn","tims","unit","utcl","df16_scl","df34_scl","prec","varc","abap_bool","abap_false","abap_true","abap_undefined","me","screen","space","super","sy","syst","table_line","*sys*"],builtinMethods:["class_constructor","constructor"],derivedTypes:["%CID","%CID_REF","%CONTROL","%DATA","%ELEMENT","%FAIL","%KEY","%MSG","%PARAM","%PID","%PID_ASSOC","%PID_PARENT","%_HINTS"],cdsLanguage:["@AbapAnnotation","@AbapCatalog","@AccessControl","@API","@ClientDependent","@ClientHandling","@CompatibilityContract","@DataAging","@EndUserText","@Environment","@LanguageDependency","@MappingRole","@Metadata","@MetadataExtension","@ObjectModel","@Scope","@Semantics","$EXTENSION","$SELF"],selectors:["->","->*","=>","~","~*"],operators:[" +"," -","/","*","**","div","mod","=","#","@","+=","-=","*=","/=","**=","&&=","?=","&","&&","bit-and","bit-not","bit-or","bit-xor","m","o","z","<"," >","<=",">=","<>","><","=<","=>","bt","byte-ca","byte-cn","byte-co","byte-cs","byte-na","byte-ns","ca","cn","co","cp","cs","eq","ge","gt","le","lt","na","nb","ne","np","ns","*/","*:","--","/*","//"],symbols:/[=>))*/,{cases:{"@typeKeywords":"type","@keywords":"keyword","@cdsLanguage":"annotation","@derivedTypes":"type","@builtinFunctions":"type","@builtinMethods":"type","@operators":"key","@default":"identifier"}}],[/<[\w]+>/,"identifier"],[/##[\w|_]+/,"comment"],{include:"@whitespace"},[/[:,.]/,"delimiter"],[/[{}()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@selectors":"tag","@operators":"key","@default":""}}],[/'/,{token:"string",bracket:"@open",next:"@stringquote"}],[/`/,{token:"string",bracket:"@open",next:"@stringping"}],[/\|/,{token:"string",bracket:"@open",next:"@stringtemplate"}],[/\d+/,"number"]],stringtemplate:[[/[^\\\|]+/,"string"],[/\\\|/,"string"],[/\|/,{token:"string",bracket:"@close",next:"@pop"}]],stringping:[[/[^\\`]+/,"string"],[/`/,{token:"string",bracket:"@close",next:"@pop"}]],stringquote:[[/[^\\']+/,"string"],[/'/,{token:"string",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[/^\*.*$/,"comment"],[/\".*$/,"comment"]]}};return p(g);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/apex/apex.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/apex/apex.js deleted file mode 100644 index 1d345475bc..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/apex/apex.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/apex/apex", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var i=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var d=(e,t)=>{for(var s in t)i(e,s,{get:t[s],enumerable:!0})},g=(e,t,s,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of c(t))!l.call(e,o)&&o!==s&&i(e,o,{get:()=>t[o],enumerable:!(a=r(t,o))||a.enumerable});return e};var p=e=>g(i({},"__esModule",{value:!0}),e);var h={};d(h,{conf:()=>m,language:()=>b});var m={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:))")}}},u=["abstract","activate","and","any","array","as","asc","assert","autonomous","begin","bigdecimal","blob","boolean","break","bulk","by","case","cast","catch","char","class","collect","commit","const","continue","convertcurrency","decimal","default","delete","desc","do","double","else","end","enum","exception","exit","export","extends","false","final","finally","float","for","from","future","get","global","goto","group","having","hint","if","implements","import","in","inner","insert","instanceof","int","interface","into","join","last_90_days","last_month","last_n_days","last_week","like","limit","list","long","loop","map","merge","native","new","next_90_days","next_month","next_n_days","next_week","not","null","nulls","number","object","of","on","or","outer","override","package","parallel","pragma","private","protected","public","retrieve","return","returning","rollback","savepoint","search","select","set","short","sort","stat","static","strictfp","super","switch","synchronized","system","testmethod","then","this","this_month","this_week","throw","throws","today","tolabel","tomorrow","transaction","transient","trigger","true","try","type","undelete","update","upsert","using","virtual","void","volatile","webservice","when","where","while","yesterday"],f=e=>e.charAt(0).toUpperCase()+e.substr(1),n=[];u.forEach(e=>{n.push(e),n.push(e.toUpperCase()),n.push(f(e))});var b={defaultToken:"",tokenPostfix:".apex",keywords:n,operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,"annotation"],[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)[fFdD]/,"number.float"],[/(@digits)[lL]?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string",'@string."'],[/'/,"string","@string.'"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@apexdoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],apexdoc:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]]}};return p(h);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/azcli/azcli.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/azcli/azcli.js deleted file mode 100644 index 842f39cd18..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/azcli/azcli.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/azcli/azcli", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(t,e)=>{for(var o in e)s(t,o,{get:e[o],enumerable:!0})},k=(t,e,o,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of r(e))!l.call(t,n)&&n!==o&&s(t,n,{get:()=>e[n],enumerable:!(a=i(e,n))||a.enumerable});return t};var p=t=>k(s({},"__esModule",{value:!0}),t);var d={};c(d,{conf:()=>f,language:()=>g});var f={comments:{lineComment:"#"}},g={defaultToken:"keyword",ignoreCase:!0,tokenPostfix:".azcli",str:/[^#\s]/,tokenizer:{root:[{include:"@comment"},[/\s-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":{token:"key.identifier",next:"@type"}}}],[/^-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":{token:"key.identifier",next:"@type"}}}]],type:[{include:"@comment"},[/-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":"key.identifier"}}],[/@str+\s*/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}]],comment:[[/#.*$/,{cases:{"@eos":{token:"comment",next:"@popall"}}}]]}};return p(d);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/bat/bat.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/bat/bat.js deleted file mode 100644 index 34424bd87d..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/bat/bat.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/bat/bat", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var n=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var g=(o,e)=>{for(var t in e)n(o,t,{get:e[t],enumerable:!0})},c=(o,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of l(e))!i.call(o,s)&&s!==t&&n(o,s,{get:()=>e[s],enumerable:!(a=r(e,s))||a.enumerable});return o};var p=o=>c(n({},"__esModule",{value:!0}),o);var k={};g(k,{conf:()=>d,language:()=>m});var d={comments:{lineComment:"REM"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],folding:{markers:{start:new RegExp("^\\s*(::\\s*|REM\\s+)#region"),end:new RegExp("^\\s*(::\\s*|REM\\s+)#endregion")}}},m={defaultToken:"",ignoreCase:!0,tokenPostfix:".bat",brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:/call|defined|echo|errorlevel|exist|for|goto|if|pause|set|shift|start|title|not|pushd|popd/,symbols:/[=>{ -"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var g=(e,n)=>{for(var o in n)r(e,o,{get:n[o],enumerable:!0})},l=(e,n,o,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of c(n))!a.call(e,t)&&t!==o&&r(e,t,{get:()=>n[t],enumerable:!(i=s(n,t))||i.enumerable});return e};var m=e=>l(r({},"__esModule",{value:!0}),e);var y={};g(y,{conf:()=>$,language:()=>w});var p=e=>`\\b${e}\\b`,k="[_a-zA-Z]",x="[_a-zA-Z0-9]",u=p(`${k}${x}*`),d=["targetScope","resource","module","param","var","output","for","in","if","existing"],b=["true","false","null"],f="[ \\t\\r\\n]",C="[0-9]+",$={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'"},{open:"'''",close:"'''"}],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:"'''",close:"'''",notIn:["string","comment"]}],autoCloseBefore:`:.,=}])' - `,indentationRules:{increaseIndentPattern:new RegExp("^((?!\\/\\/).)*(\\{[^}\"'`]*|\\([^)\"'`]*|\\[[^\\]\"'`]*)$"),decreaseIndentPattern:new RegExp("^((?!.*?\\/\\*).*\\*/)?\\s*[\\}\\]].*$")}},w={defaultToken:"",tokenPostfix:".bicep",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],symbols:/[=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(o,e)=>{for(var n in e)s(o,n,{get:e[n],enumerable:!0})},m=(o,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of a(e))!l.call(o,t)&&t!==n&&s(o,t,{get:()=>e[t],enumerable:!(r=i(e,t))||r.enumerable});return o};var p=o=>m(s({},"__esModule",{value:!0}),o);var u={};c(u,{conf:()=>d,language:()=>g});var d={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'},{open:"(*",close:"*)"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'},{open:"(*",close:"*)"}]},g={defaultToken:"",tokenPostfix:".cameligo",ignoreCase:!0,brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],keywords:["abs","assert","block","Bytes","case","Crypto","Current","else","failwith","false","for","fun","if","in","let","let%entry","let%init","List","list","Map","map","match","match%nat","mod","not","operation","Operation","of","record","Set","set","sender","skip","source","String","then","to","true","type","with"],typeKeywords:["int","unit","string","tz","nat","bool"],operators:["=",">","<","<=",">=","<>",":",":=","and","mod","or","+","-","*","/","@","&","^","%","->","<-","&&","||"],symbols:/[=><:@\^&|+\-*\/\^%]+/,tokenizer:{root:[[/[a-zA-Z_][\w]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\$[0-9a-fA-F]{1,16}/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/'/,"string","@string"],[/'[^\\']'/,"string"],[/'/,"string.invalid"],[/\#\d+/,"string"]],comment:[[/[^\(\*]+/,"comment"],[/\*\)/,"comment","@pop"],[/\(\*/,"comment"]],string:[[/[^\\']+/,"string"],[/\\./,"string.escape.invalid"],[/'/,{token:"string.quote",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,"white"],[/\(\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}};return p(u);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/clojure/clojure.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/clojure/clojure.js deleted file mode 100644 index 3a3369e92c..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/clojure/clojure.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/clojure/clojure", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var a=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var d=(t,e)=>{for(var r in e)a(t,r,{get:e[r],enumerable:!0})},l=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of i(e))!c.call(t,n)&&n!==r&&a(t,n,{get:()=>e[n],enumerable:!(s=o(e,n))||s.enumerable});return t};var p=t=>l(a({},"__esModule",{value:!0}),t);var h={};d(h,{conf:()=>u,language:()=>m});var u={comments:{lineComment:";;"},brackets:[["[","]"],["(",")"],["{","}"]],autoClosingPairs:[{open:"[",close:"]"},{open:'"',close:'"'},{open:"(",close:")"},{open:"{",close:"}"}],surroundingPairs:[{open:"[",close:"]"},{open:'"',close:'"'},{open:"(",close:")"},{open:"{",close:"}"}]},m={defaultToken:"",ignoreCase:!0,tokenPostfix:".clj",brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"}],constants:["true","false","nil"],numbers:/^(?:[+\-]?\d+(?:(?:N|(?:[eE][+\-]?\d+))|(?:\.?\d*(?:M|(?:[eE][+\-]?\d+))?)|\/\d+|[xX][0-9a-fA-F]+|r[0-9a-zA-Z]+)?(?=[\\\[\]\s"#'(),;@^`{}~]|$))/,characters:/^(?:\\(?:backspace|formfeed|newline|return|space|tab|o[0-7]{3}|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{4}|.)?(?=[\\\[\]\s"(),;@^`{}~]|$))/,escapes:/^\\(?:["'\\bfnrt]|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,qualifiedSymbols:/^(?:(?:[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*(?:\.[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*\/)?(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*(?=[\\\[\]\s"(),;@^`{}~]|$))/,specialForms:[".","catch","def","do","if","monitor-enter","monitor-exit","new","quote","recur","set!","throw","try","var"],coreSymbols:["*","*'","*1","*2","*3","*agent*","*allow-unresolved-vars*","*assert*","*clojure-version*","*command-line-args*","*compile-files*","*compile-path*","*compiler-options*","*data-readers*","*default-data-reader-fn*","*e","*err*","*file*","*flush-on-newline*","*fn-loader*","*in*","*math-context*","*ns*","*out*","*print-dup*","*print-length*","*print-level*","*print-meta*","*print-namespace-maps*","*print-readably*","*read-eval*","*reader-resolver*","*source-path*","*suppress-read*","*unchecked-math*","*use-context-classloader*","*verbose-defrecords*","*warn-on-reflection*","+","+'","-","-'","->","->>","->ArrayChunk","->Eduction","->Vec","->VecNode","->VecSeq","-cache-protocol-fn","-reset-methods","..","/","<","<=","=","==",">",">=","EMPTY-NODE","Inst","StackTraceElement->vec","Throwable->map","accessor","aclone","add-classpath","add-watch","agent","agent-error","agent-errors","aget","alength","alias","all-ns","alter","alter-meta!","alter-var-root","amap","ancestors","and","any?","apply","areduce","array-map","as->","aset","aset-boolean","aset-byte","aset-char","aset-double","aset-float","aset-int","aset-long","aset-short","assert","assoc","assoc!","assoc-in","associative?","atom","await","await-for","await1","bases","bean","bigdec","bigint","biginteger","binding","bit-and","bit-and-not","bit-clear","bit-flip","bit-not","bit-or","bit-set","bit-shift-left","bit-shift-right","bit-test","bit-xor","boolean","boolean-array","boolean?","booleans","bound-fn","bound-fn*","bound?","bounded-count","butlast","byte","byte-array","bytes","bytes?","case","cast","cat","char","char-array","char-escape-string","char-name-string","char?","chars","chunk","chunk-append","chunk-buffer","chunk-cons","chunk-first","chunk-next","chunk-rest","chunked-seq?","class","class?","clear-agent-errors","clojure-version","coll?","comment","commute","comp","comparator","compare","compare-and-set!","compile","complement","completing","concat","cond","cond->","cond->>","condp","conj","conj!","cons","constantly","construct-proxy","contains?","count","counted?","create-ns","create-struct","cycle","dec","dec'","decimal?","declare","dedupe","default-data-readers","definline","definterface","defmacro","defmethod","defmulti","defn","defn-","defonce","defprotocol","defrecord","defstruct","deftype","delay","delay?","deliver","denominator","deref","derive","descendants","destructure","disj","disj!","dissoc","dissoc!","distinct","distinct?","doall","dorun","doseq","dosync","dotimes","doto","double","double-array","double?","doubles","drop","drop-last","drop-while","eduction","empty","empty?","ensure","ensure-reduced","enumeration-seq","error-handler","error-mode","eval","even?","every-pred","every?","ex-data","ex-info","extend","extend-protocol","extend-type","extenders","extends?","false?","ffirst","file-seq","filter","filterv","find","find-keyword","find-ns","find-protocol-impl","find-protocol-method","find-var","first","flatten","float","float-array","float?","floats","flush","fn","fn?","fnext","fnil","for","force","format","frequencies","future","future-call","future-cancel","future-cancelled?","future-done?","future?","gen-class","gen-interface","gensym","get","get-in","get-method","get-proxy-class","get-thread-bindings","get-validator","group-by","halt-when","hash","hash-combine","hash-map","hash-ordered-coll","hash-set","hash-unordered-coll","ident?","identical?","identity","if-let","if-not","if-some","ifn?","import","in-ns","inc","inc'","indexed?","init-proxy","inst-ms","inst-ms*","inst?","instance?","int","int-array","int?","integer?","interleave","intern","interpose","into","into-array","ints","io!","isa?","iterate","iterator-seq","juxt","keep","keep-indexed","key","keys","keyword","keyword?","last","lazy-cat","lazy-seq","let","letfn","line-seq","list","list*","list?","load","load-file","load-reader","load-string","loaded-libs","locking","long","long-array","longs","loop","macroexpand","macroexpand-1","make-array","make-hierarchy","map","map-entry?","map-indexed","map?","mapcat","mapv","max","max-key","memfn","memoize","merge","merge-with","meta","method-sig","methods","min","min-key","mix-collection-hash","mod","munge","name","namespace","namespace-munge","nat-int?","neg-int?","neg?","newline","next","nfirst","nil?","nnext","not","not-any?","not-empty","not-every?","not=","ns","ns-aliases","ns-imports","ns-interns","ns-map","ns-name","ns-publics","ns-refers","ns-resolve","ns-unalias","ns-unmap","nth","nthnext","nthrest","num","number?","numerator","object-array","odd?","or","parents","partial","partition","partition-all","partition-by","pcalls","peek","persistent!","pmap","pop","pop!","pop-thread-bindings","pos-int?","pos?","pr","pr-str","prefer-method","prefers","primitives-classnames","print","print-ctor","print-dup","print-method","print-simple","print-str","printf","println","println-str","prn","prn-str","promise","proxy","proxy-call-with-super","proxy-mappings","proxy-name","proxy-super","push-thread-bindings","pvalues","qualified-ident?","qualified-keyword?","qualified-symbol?","quot","rand","rand-int","rand-nth","random-sample","range","ratio?","rational?","rationalize","re-find","re-groups","re-matcher","re-matches","re-pattern","re-seq","read","read-line","read-string","reader-conditional","reader-conditional?","realized?","record?","reduce","reduce-kv","reduced","reduced?","reductions","ref","ref-history-count","ref-max-history","ref-min-history","ref-set","refer","refer-clojure","reify","release-pending-sends","rem","remove","remove-all-methods","remove-method","remove-ns","remove-watch","repeat","repeatedly","replace","replicate","require","reset!","reset-meta!","reset-vals!","resolve","rest","restart-agent","resultset-seq","reverse","reversible?","rseq","rsubseq","run!","satisfies?","second","select-keys","send","send-off","send-via","seq","seq?","seqable?","seque","sequence","sequential?","set","set-agent-send-executor!","set-agent-send-off-executor!","set-error-handler!","set-error-mode!","set-validator!","set?","short","short-array","shorts","shuffle","shutdown-agents","simple-ident?","simple-keyword?","simple-symbol?","slurp","some","some->","some->>","some-fn","some?","sort","sort-by","sorted-map","sorted-map-by","sorted-set","sorted-set-by","sorted?","special-symbol?","spit","split-at","split-with","str","string?","struct","struct-map","subs","subseq","subvec","supers","swap!","swap-vals!","symbol","symbol?","sync","tagged-literal","tagged-literal?","take","take-last","take-nth","take-while","test","the-ns","thread-bound?","time","to-array","to-array-2d","trampoline","transduce","transient","tree-seq","true?","type","unchecked-add","unchecked-add-int","unchecked-byte","unchecked-char","unchecked-dec","unchecked-dec-int","unchecked-divide-int","unchecked-double","unchecked-float","unchecked-inc","unchecked-inc-int","unchecked-int","unchecked-long","unchecked-multiply","unchecked-multiply-int","unchecked-negate","unchecked-negate-int","unchecked-remainder-int","unchecked-short","unchecked-subtract","unchecked-subtract-int","underive","unquote","unquote-splicing","unreduced","unsigned-bit-shift-right","update","update-in","update-proxy","uri?","use","uuid?","val","vals","var-get","var-set","var?","vary-meta","vec","vector","vector-of","vector?","volatile!","volatile?","vreset!","vswap!","when","when-first","when-let","when-not","when-some","while","with-bindings","with-bindings*","with-in-str","with-loading-context","with-local-vars","with-meta","with-open","with-out-str","with-precision","with-redefs","with-redefs-fn","xml-seq","zero?","zipmap"],tokenizer:{root:[{include:"@whitespace"},[/@numbers/,"number"],[/@characters/,"string"],{include:"@string"},[/[()\[\]{}]/,"@brackets"],[/\/#"(?:\.|(?:")|[^"\n])*"\/g/,"regexp"],[/[#'@^`~]/,"meta"],[/@qualifiedSymbols/,{cases:{"^:.+$":"constant","@specialForms":"keyword","@coreSymbols":"keyword","@constants":"constant","@default":"identifier"}}]],whitespace:[[/[\s,]+/,"white"],[/;.*$/,"comment"],[/\(comment\b/,"comment","@comment"]],comment:[[/\(/,"comment","@push"],[/\)/,"comment","@pop"],[/[^()]/,"comment"]],string:[[/"/,"string","@multiLineString"]],multiLineString:[[/"/,"string","@popall"],[/@escapes/,"string.escape"],[/./,"string"]]}};return p(h);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/coffee/coffee.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/coffee/coffee.js deleted file mode 100644 index d8dfa50cda..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/coffee/coffee.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/coffee/coffee", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var l=(n,e)=>{for(var t in e)s(n,t,{get:e[t],enumerable:!0})},p=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of g(e))!a.call(n,r)&&r!==t&&s(n,r,{get:()=>e[r],enumerable:!(o=i(e,r))||o.enumerable});return n};var c=n=>p(s({},"__esModule",{value:!0}),n);var m={};l(m,{conf:()=>d,language:()=>x});var d={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#%\^\&\*\(\)\=\$\-\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{blockComment:["###","###"],lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*#region\\b"),end:new RegExp("^\\s*#endregion\\b")}}},x={defaultToken:"",ignoreCase:!0,tokenPostfix:".coffee",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],regEx:/\/(?!\/\/)(?:[^\/\\]|\\.)*\/[igm]*/,keywords:["and","or","is","isnt","not","on","yes","@","no","off","true","false","null","this","new","delete","typeof","in","instanceof","return","throw","break","continue","debugger","if","else","switch","for","while","do","try","catch","finally","class","extends","super","undefined","then","unless","until","loop","of","by","when"],symbols:/[=>{ -"use strict";var moduleExports=(()=>{var o=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var c=(n,e)=>{for(var i in e)o(n,i,{get:e[i],enumerable:!0})},l=(n,e,i,_)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of a(e))!s.call(n,t)&&t!==i&&o(n,t,{get:()=>e[t],enumerable:!(_=r(e,t))||_.enumerable});return n};var d=n=>l(o({},"__esModule",{value:!0}),n);var u={};c(u,{conf:()=>p,language:()=>m});var p={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*#pragma\\s+region\\b"),end:new RegExp("^\\s*#pragma\\s+endregion\\b")}}},m={defaultToken:"",tokenPostfix:".cpp",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["abstract","amp","array","auto","bool","break","case","catch","char","class","const","constexpr","const_cast","continue","cpu","decltype","default","delegate","delete","do","double","dynamic_cast","each","else","enum","event","explicit","export","extern","false","final","finally","float","for","friend","gcnew","generic","goto","if","in","initonly","inline","int","interface","interior_ptr","internal","literal","long","mutable","namespace","new","noexcept","nullptr","__nullptr","operator","override","partial","pascal","pin_ptr","private","property","protected","public","ref","register","reinterpret_cast","restrict","return","safe_cast","sealed","short","signed","sizeof","static","static_assert","static_cast","struct","switch","template","this","thread_local","throw","tile_static","true","try","typedef","typeid","typename","union","unsigned","using","virtual","void","volatile","wchar_t","where","while","_asm","_based","_cdecl","_declspec","_fastcall","_if_exists","_if_not_exists","_inline","_multiple_inheritance","_pascal","_single_inheritance","_stdcall","_virtual_inheritance","_w64","__abstract","__alignof","__asm","__assume","__based","__box","__builtin_alignof","__cdecl","__clrcall","__declspec","__delegate","__event","__except","__fastcall","__finally","__forceinline","__gc","__hook","__identifier","__if_exists","__if_not_exists","__inline","__int128","__int16","__int32","__int64","__int8","__interface","__leave","__m128","__m128d","__m128i","__m256","__m256d","__m256i","__m512","__m512d","__m512i","__m64","__multiple_inheritance","__newslot","__nogc","__noop","__nounwind","__novtordisp","__pascal","__pin","__pragma","__property","__ptr32","__ptr64","__raise","__restrict","__resume","__sealed","__single_inheritance","__stdcall","__super","__thiscall","__try","__try_cast","__typeof","__unaligned","__unhook","__uuidof","__value","__virtual_inheritance","__w64","__wchar_t"],operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>="],symbols:/[=>\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/,"number.hex"],[/0[0-7']*[0-7](@integersuffix)/,"number.octal"],[/0[bB][0-1']*[0-1](@integersuffix)/,"number.binary"],[/\d[\d']*\d(@integersuffix)/,"number"],[/\d(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*\\$/,"comment","@linecomment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],linecomment:[[/.*[^\\]$/,"comment","@pop"],[/[^]+/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],raw:[[/[^)]+/,"string.raw"],[/\)$S2\"/,{token:"string.raw.end",next:"@pop"}],[/\)/,"string.raw"]],annotation:[{include:"@whitespace"},[/using|alignas/,"keyword"],[/[a-zA-Z0-9_]+/,"annotation"],[/[,:]/,"delimiter"],[/[()]/,"@brackets"],[/\]\s*\]/,{token:"annotation",next:"@pop"}]],include:[[/(\s*)(<)([^<>]*)(>)/,["","keyword.directive.include.begin","string.include.identifier",{token:"keyword.directive.include.end",next:"@pop"}]],[/(\s*)(")([^"]*)(")/,["","keyword.directive.include.begin","string.include.identifier",{token:"keyword.directive.include.end",next:"@pop"}]]]}};return d(u);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/csharp/csharp.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/csharp/csharp.js deleted file mode 100644 index 6ff355045b..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/csharp/csharp.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/csharp/csharp", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var o in e)s(t,o,{get:e[o],enumerable:!0})},p=(t,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of a(e))!c.call(t,n)&&n!==o&&s(t,n,{get:()=>e[n],enumerable:!(i=r(e,n))||i.enumerable});return t};var g=t=>p(s({},"__esModule",{value:!0}),t);var u={};l(u,{conf:()=>d,language:()=>m});var d={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\$\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],folding:{markers:{start:new RegExp("^\\s*#region\\b"),end:new RegExp("^\\s*#endregion\\b")}}},m={defaultToken:"",tokenPostfix:".cs",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],keywords:["extern","alias","using","bool","decimal","sbyte","byte","short","ushort","int","uint","long","ulong","char","float","double","object","dynamic","string","assembly","is","as","ref","out","this","base","new","typeof","void","checked","unchecked","default","delegate","var","const","if","else","switch","case","while","do","for","foreach","in","break","continue","goto","return","throw","try","catch","finally","lock","yield","from","let","where","join","on","equals","into","orderby","ascending","descending","select","group","by","namespace","partial","class","field","event","method","param","public","protected","internal","private","abstract","sealed","static","struct","readonly","volatile","virtual","override","params","get","set","add","remove","operator","true","false","implicit","explicit","interface","enum","null","async","await","fixed","sizeof","stackalloc","unsafe","nameof","when"],namespaceFollows:["namespace","using"],parenFollows:["if","for","while","switch","foreach","using","catch","when"],operators:["=","??","||","&&","|","^","&","==","!=","<=",">=","<<","+","-","*","/","%","!","~","++","--","+=","-=","*=","/=","%=","&=","|=","^=","<<=",">>=",">>","=>"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/[0-9_]*\.[0-9_]+([eE][\-+]?\d+)?[fFdD]?/,"number.float"],[/0[xX][0-9a-fA-F_]+/,"number.hex"],[/0[bB][01_]+/,"number.hex"],[/[0-9_]+/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,{token:"string.quote",next:"@string"}],[/\$\@"/,{token:"string.quote",next:"@litinterpstring"}],[/\@"/,{token:"string.quote",next:"@litstring"}],[/\$"/,{token:"string.quote",next:"@interpolatedstring"}],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],qualified:[[/[a-zA-Z_][\w]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],[/\./,"delimiter"],["","","@pop"]],namespace:[{include:"@whitespace"},[/[A-Z]\w*/,"namespace"],[/[\.=]/,"delimiter"],["","","@pop"]],comment:[[/[^\/*]+/,"comment"],["\\*/","comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",next:"@pop"}]],litstring:[[/[^"]+/,"string"],[/""/,"string.escape"],[/"/,{token:"string.quote",next:"@pop"}]],litinterpstring:[[/[^"{]+/,"string"],[/""/,"string.escape"],[/{{/,"string.escape"],[/}}/,"string.escape"],[/{/,{token:"string.quote",next:"root.litinterpstring"}],[/"/,{token:"string.quote",next:"@pop"}]],interpolatedstring:[[/[^\\"{]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/{{/,"string.escape"],[/}}/,"string.escape"],[/{/,{token:"string.quote",next:"root.interpolatedstring"}],[/"/,{token:"string.quote",next:"@pop"}]],whitespace:[[/^[ \t\v\f]*#((r)|(load))(?=\s)/,"directive.csx"],[/^[ \t\v\f]*#\w.*$/,"namespace.cpp"],[/[ \t\v\f\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}};return g(u);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/csp/csp.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/csp/csp.js deleted file mode 100644 index 5a15883d3e..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/csp/csp.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/csp/csp", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var a=(r,t)=>{for(var s in t)o(r,s,{get:t[s],enumerable:!0})},c=(r,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of u(t))!g.call(r,e)&&e!==s&&o(r,e,{get:()=>t[e],enumerable:!(n=i(t,e))||n.enumerable});return r};var q=r=>c(o({},"__esModule",{value:!0}),r);var p={};a(p,{conf:()=>f,language:()=>l});var f={brackets:[],autoClosingPairs:[],surroundingPairs:[]},l={keywords:[],typeKeywords:[],tokenPostfix:".csp",operators:[],symbols:/[=>{ -"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var m=(t,e)=>{for(var o in e)r(t,o,{get:e[o],enumerable:!0})},c=(t,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of s(e))!l.call(t,n)&&n!==o&&r(t,n,{get:()=>e[n],enumerable:!(i=a(e,n))||i.enumerable});return t};var d=t=>c(r({},"__esModule",{value:!0}),t);var k={};m(k,{conf:()=>u,language:()=>p});var u={wordPattern:/(#?-?\d*\.\d\w*%?)|((::|[@#.!:])?[\w-?]+%?)|::|[@#.!:]/g,comments:{blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\/"),end:new RegExp("^\\s*\\/\\*\\s*#endregion\\b.*\\*\\/")}}},p={defaultToken:"",tokenPostfix:".css",ws:`[ -\r\f]*`,identifier:"-?-?([a-zA-Z]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",brackets:[{open:"{",close:"}",token:"delimiter.bracket"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],tokenizer:{root:[{include:"@selector"}],selector:[{include:"@comments"},{include:"@import"},{include:"@strings"},["[@](keyframes|-webkit-keyframes|-moz-keyframes|-o-keyframes)",{token:"keyword",next:"@keyframedeclaration"}],["[@](page|content|font-face|-moz-document)",{token:"keyword"}],["[@](charset|namespace)",{token:"keyword",next:"@declarationbody"}],["(url-prefix)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],["(url)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],{include:"@selectorname"},["[\\*]","tag"],["[>\\+,]","delimiter"],["\\[",{token:"delimiter.bracket",next:"@selectorattribute"}],["{",{token:"delimiter.bracket",next:"@selectorbody"}]],selectorbody:[{include:"@comments"},["[*_]?@identifier@ws:(?=(\\s|\\d|[^{;}]*[;}]))","attribute.name","@rulevalue"],["}",{token:"delimiter.bracket",next:"@pop"}]],selectorname:[["(\\.|#(?=[^{])|%|(@identifier)|:)+","tag"]],selectorattribute:[{include:"@term"},["]",{token:"delimiter.bracket",next:"@pop"}]],term:[{include:"@comments"},["(url-prefix)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],["(url)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],{include:"@functioninvocation"},{include:"@numbers"},{include:"@name"},{include:"@strings"},["([<>=\\+\\-\\*\\/\\^\\|\\~,])","delimiter"],[",","delimiter"]],rulevalue:[{include:"@comments"},{include:"@strings"},{include:"@term"},["!important","keyword"],[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],warndebug:[["[@](warn|debug)",{token:"keyword",next:"@declarationbody"}]],import:[["[@](import)",{token:"keyword",next:"@declarationbody"}]],urldeclaration:[{include:"@strings"},[`[^)\r -]+`,"string"],["\\)",{token:"delimiter.parenthesis",next:"@pop"}]],parenthizedterm:[{include:"@term"},["\\)",{token:"delimiter.parenthesis",next:"@pop"}]],declarationbody:[{include:"@term"},[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[/[^*/]+/,"comment"],[/./,"comment"]],name:[["@identifier","attribute.value"]],numbers:[["-?(\\d*\\.)?\\d+([eE][\\-+]?\\d+)?",{token:"attribute.value.number",next:"@units"}],["#[0-9a-fA-F_]+(?!\\w)","attribute.value.hex"]],units:[["(em|ex|ch|rem|fr|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?","attribute.value.unit","@pop"]],keyframedeclaration:[["@identifier","attribute.value"],["{",{token:"delimiter.bracket",switchTo:"@keyframebody"}]],keyframebody:[{include:"@term"},["{",{token:"delimiter.bracket",next:"@selectorbody"}],["}",{token:"delimiter.bracket",next:"@pop"}]],functioninvocation:[["@identifier\\(",{token:"attribute.value",next:"@functionarguments"}]],functionarguments:[["\\$@identifier@ws:","attribute.name"],["[,]","delimiter"],{include:"@term"},["\\)",{token:"attribute.value",next:"@pop"}]],strings:[['~?"',{token:"string",next:"@stringenddoublequote"}],["~?'",{token:"string",next:"@stringendquote"}]],stringenddoublequote:[["\\\\.","string"],['"',{token:"string",next:"@pop"}],[/[^\\"]+/,"string"],[".","string"]],stringendquote:[["\\\\.","string"],["'",{token:"string",next:"@pop"}],[/[^\\']+/,"string"],[".","string"]]}};return d(k);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/cypher/cypher.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/cypher/cypher.js deleted file mode 100644 index 98ade3a2e4..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/cypher/cypher.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/cypher/cypher", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(i,e)=>{for(var n in e)s(i,n,{get:e[n],enumerable:!0})},g=(i,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of a(e))!l.call(i,t)&&t!==n&&s(i,t,{get:()=>e[t],enumerable:!(o=r(e,t))||o.enumerable});return i};var p=i=>g(s({},"__esModule",{value:!0}),i);var u={};c(u,{conf:()=>d,language:()=>m});var d={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}]},m={defaultToken:"",tokenPostfix:".cypher",ignoreCase:!0,brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["ALL","AND","AS","ASC","ASCENDING","BY","CALL","CASE","CONTAINS","CREATE","DELETE","DESC","DESCENDING","DETACH","DISTINCT","ELSE","END","ENDS","EXISTS","IN","IS","LIMIT","MANDATORY","MATCH","MERGE","NOT","ON","ON","OPTIONAL","OR","ORDER","REMOVE","RETURN","SET","SKIP","STARTS","THEN","UNION","UNWIND","WHEN","WHERE","WITH","XOR","YIELD"],builtinLiterals:["true","TRUE","false","FALSE","null","NULL"],builtinFunctions:["abs","acos","asin","atan","atan2","avg","ceil","coalesce","collect","cos","cot","count","degrees","e","endNode","exists","exp","floor","head","id","keys","labels","last","left","length","log","log10","lTrim","max","min","nodes","percentileCont","percentileDisc","pi","properties","radians","rand","range","relationships","replace","reverse","right","round","rTrim","sign","sin","size","split","sqrt","startNode","stDev","stDevP","substring","sum","tail","tan","timestamp","toBoolean","toFloat","toInteger","toLower","toString","toUpper","trim","type"],operators:["+","-","*","/","%","^","=","<>","<",">","<=",">=","->","<-","-->","<--"],escapes:/\\(?:[tbnrf\\"'`]|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,digits:/\d+/,octaldigits:/[0-7]+/,hexdigits:/[0-9a-fA-F]+/,tokenizer:{root:[[/[{}[\]()]/,"@brackets"],{include:"common"}],common:[{include:"@whitespace"},{include:"@numbers"},{include:"@strings"},[/:[a-zA-Z_][\w]*/,"type.identifier"],[/[a-zA-Z_][\w]*(?=\()/,{cases:{"@builtinFunctions":"predefined.function"}}],[/[a-zA-Z_$][\w$]*/,{cases:{"@keywords":"keyword","@builtinLiterals":"predefined.literal","@default":"identifier"}}],[/`/,"identifier.escape","@identifierBacktick"],[/[;,.:|]/,"delimiter"],[/[<>=%+\-*/^]+/,{cases:{"@operators":"delimiter","@default":""}}]],numbers:[[/-?(@digits)[eE](-?(@digits))?/,"number.float"],[/-?(@digits)?\.(@digits)([eE]-?(@digits))?/,"number.float"],[/-?0x(@hexdigits)/,"number.hex"],[/-?0(@octaldigits)/,"number.octal"],[/-?(@digits)/,"number"]],strings:[[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string","@stringDouble"],[/'/,"string","@stringSingle"]],whitespace:[[/[ \t\r\n]+/,"white"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/\/\/.*/,"comment"],[/[^/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[/*]/,"comment"]],stringDouble:[[/[^\\"]+/,"string"],[/@escapes/,"string"],[/\\./,"string.invalid"],[/"/,"string","@pop"]],stringSingle:[[/[^\\']+/,"string"],[/@escapes/,"string"],[/\\./,"string.invalid"],[/'/,"string","@pop"]],identifierBacktick:[[/[^\\`]+/,"identifier.escape"],[/@escapes/,"identifier.escape"],[/\\./,"identifier.escape.invalid"],[/`/,"identifier.escape","@pop"]]}};return p(u);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/dart/dart.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/dart/dart.js deleted file mode 100644 index e021c87e84..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/dart/dart.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/dart/dart", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var p=(n,e)=>{for(var t in e)r(n,t,{get:e[t],enumerable:!0})},g=(n,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of c(e))!a.call(n,o)&&o!==t&&r(n,o,{get:()=>e[o],enumerable:!(s=i(e,o))||s.enumerable});return n};var l=n=>g(r({},"__esModule",{value:!0}),n);var x={};p(x,{conf:()=>d,language:()=>m});var d={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string"]},{open:"`",close:"`",notIn:["string","comment"]},{open:"/**",close:" */",notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:"(",close:")"},{open:'"',close:'"'},{open:"`",close:"`"}],folding:{markers:{start:/^\s*\s*#?region\b/,end:/^\s*\s*#?endregion\b/}}},m={defaultToken:"invalid",tokenPostfix:".dart",keywords:["abstract","dynamic","implements","show","as","else","import","static","assert","enum","in","super","async","export","interface","switch","await","extends","is","sync","break","external","library","this","case","factory","mixin","throw","catch","false","new","true","class","final","null","try","const","finally","on","typedef","continue","for","operator","var","covariant","Function","part","void","default","get","rethrow","while","deferred","hide","return","with","do","if","set","yield"],typeKeywords:["int","double","String","bool"],operators:["+","-","*","/","~/","%","++","--","==","!=",">","<",">=","<=","=","-=","/=","%=",">>=","^=","+=","*=","~/=","<<=","&=","!=","||","&&","&","|","^","~","<<",">>","!",">>>","??","?",":","|="],symbols:/[=>](?!@symbols)/,"@brackets"],[/!(?=([^=]|$))/,"delimiter"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/(@digits)[eE]([\-+]?(@digits))?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?/,"number.float"],[/0[xX](@hexdigits)n?/,"number.hex"],[/0[oO]?(@octaldigits)n?/,"number.octal"],[/0[bB](@binarydigits)n?/,"number.binary"],[/(@digits)n?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string_double"],[/'/,"string","@string_single"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@jsdoc"],[/\/\*/,"comment","@comment"],[/\/\/\/.*$/,"comment.doc"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],jsdoc:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],regexp:[[/(\{)(\d+(?:,\d*)?)(\})/,["regexp.escape.control","regexp.escape.control","regexp.escape.control"]],[/(\[)(\^?)(?=(?:[^\]\\\/]|\\.)+)/,["regexp.escape.control",{token:"regexp.escape.control",next:"@regexrange"}]],[/(\()(\?:|\?=|\?!)/,["regexp.escape.control","regexp.escape.control"]],[/[()]/,"regexp.escape.control"],[/@regexpctl/,"regexp.escape.control"],[/[^\\\/]/,"regexp"],[/@regexpesc/,"regexp.escape"],[/\\\./,"regexp.invalid"],[/(\/)([gimsuy]*)/,[{token:"regexp",bracket:"@close",next:"@pop"},"keyword.other"]]],regexrange:[[/-/,"regexp.escape.control"],[/\^/,"regexp.invalid"],[/@regexpesc/,"regexp.escape"],[/[^\]]/,"regexp"],[/\]/,{token:"regexp.escape.control",next:"@pop",bracket:"@close"}]],string_double:[[/[^\\"\$]+/,"string"],[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"],[/\$\w+/,"identifier"]],string_single:[[/[^\\'\$]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"],[/\$\w+/,"identifier"]]}};return l(x);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/dockerfile/dockerfile.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/dockerfile/dockerfile.js deleted file mode 100644 index 80855ba5a2..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/dockerfile/dockerfile.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/dockerfile/dockerfile", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var a=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var p=(o,e)=>{for(var s in e)a(o,s,{get:e[s],enumerable:!0})},g=(o,e,s,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of r(e))!i.call(o,n)&&n!==s&&a(o,n,{get:()=>e[n],enumerable:!(t=l(e,n))||t.enumerable});return o};var c=o=>g(a({},"__esModule",{value:!0}),o);var k={};p(k,{conf:()=>u,language:()=>d});var u={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},d={defaultToken:"",tokenPostfix:".dockerfile",variable:/\${?[\w]+}?/,tokenizer:{root:[{include:"@whitespace"},{include:"@comment"},[/(ONBUILD)(\s+)/,["keyword",""]],[/(ENV)(\s+)([\w]+)/,["keyword","",{token:"variable",next:"@arguments"}]],[/(FROM|MAINTAINER|RUN|EXPOSE|ENV|ADD|ARG|VOLUME|LABEL|USER|WORKDIR|COPY|CMD|STOPSIGNAL|SHELL|HEALTHCHECK|ENTRYPOINT)/,{token:"keyword",next:"@arguments"}]],arguments:[{include:"@whitespace"},{include:"@strings"},[/(@variable)/,{cases:{"@eos":{token:"variable",next:"@popall"},"@default":"variable"}}],[/\\/,{cases:{"@eos":"","@default":""}}],[/./,{cases:{"@eos":{token:"",next:"@popall"},"@default":""}}]],whitespace:[[/\s+/,{cases:{"@eos":{token:"",next:"@popall"},"@default":""}}]],comment:[[/(^#.*$)/,"comment","@popall"]],strings:[[/\\'$/,"","@popall"],[/\\'/,""],[/'$/,"string","@popall"],[/'/,"string","@stringBody"],[/"$/,"string","@popall"],[/"/,"string","@dblStringBody"]],stringBody:[[/[^\\\$']/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/\\./,"string.escape"],[/'$/,"string","@popall"],[/'/,"string","@pop"],[/(@variable)/,"variable"],[/\\$/,"string"],[/$/,"string","@popall"]],dblStringBody:[[/[^\\\$"]/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/\\./,"string.escape"],[/"$/,"string","@popall"],[/"/,"string","@pop"],[/(@variable)/,"variable"],[/\\$/,"string"],[/$/,"string","@popall"]]}};return c(k);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/ecl/ecl.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/ecl/ecl.js deleted file mode 100644 index 5ab7f0014e..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/ecl/ecl.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/ecl/ecl", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(o,e)=>{for(var t in e)r(o,t,{get:e[t],enumerable:!0})},d=(o,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of s(e))!l.call(o,n)&&n!==t&&r(o,n,{get:()=>e[n],enumerable:!(a=i(e,n))||a.enumerable});return o};var p=o=>d(r({},"__esModule",{value:!0}),o);var g={};c(g,{conf:()=>m,language:()=>u});var m={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}]},u={defaultToken:"",tokenPostfix:".ecl",ignoreCase:!0,brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],pounds:["append","break","declare","demangle","end","for","getdatatype","if","inmodule","loop","mangle","onwarning","option","set","stored","uniquename"].join("|"),keywords:["__compressed__","after","all","and","any","as","atmost","before","beginc","best","between","case","cluster","compressed","compression","const","counter","csv","default","descend","embed","encoding","encrypt","end","endc","endembed","endmacro","enum","escape","except","exclusive","expire","export","extend","fail","few","fileposition","first","flat","forward","from","full","function","functionmacro","group","grouped","heading","hole","ifblock","import","in","inner","interface","internal","joined","keep","keyed","last","left","limit","linkcounted","literal","little_endian","load","local","locale","lookup","lzw","macro","many","maxcount","maxlength","min skew","module","mofn","multiple","named","namespace","nocase","noroot","noscan","nosort","not","noxpath","of","onfail","only","opt","or","outer","overwrite","packed","partition","penalty","physicallength","pipe","prefetch","quote","record","repeat","retry","return","right","right1","right2","rows","rowset","scan","scope","self","separator","service","shared","skew","skip","smart","soapaction","sql","stable","store","terminator","thor","threshold","timelimit","timeout","token","transform","trim","type","unicodeorder","unordered","unsorted","unstable","update","use","validate","virtual","whole","width","wild","within","wnotrim","xml","xpath"],functions:["abs","acos","aggregate","allnodes","apply","ascii","asin","assert","asstring","atan","atan2","ave","build","buildindex","case","catch","choose","choosen","choosesets","clustersize","combine","correlation","cos","cosh","count","covariance","cron","dataset","dedup","define","denormalize","dictionary","distribute","distributed","distribution","ebcdic","enth","error","evaluate","event","eventextra","eventname","exists","exp","fail","failcode","failmessage","fetch","fromunicode","fromxml","getenv","getisvalid","global","graph","group","hash","hash32","hash64","hashcrc","hashmd5","having","httpcall","httpheader","if","iff","index","intformat","isvalid","iterate","join","keydiff","keypatch","keyunicode","length","library","limit","ln","loadxml","local","log","loop","map","matched","matchlength","matchposition","matchtext","matchunicode","max","merge","mergejoin","min","nofold","nolocal","nonempty","normalize","nothor","notify","output","parallel","parse","pipe","power","preload","process","project","pull","random","range","rank","ranked","realformat","recordof","regexfind","regexreplace","regroup","rejected","rollup","round","roundup","row","rowdiff","sample","sequential","set","sin","sinh","sizeof","soapcall","sort","sorted","sqrt","stepped","stored","sum","table","tan","tanh","thisnode","topn","tounicode","toxml","transfer","transform","trim","truncate","typeof","ungroup","unicodeorder","variance","wait","which","workunit","xmldecode","xmlencode","xmltext","xmlunicode"],typesint:["integer","unsigned"].join("|"),typesnum:["data","qstring","string","unicode","utf8","varstring","varunicode"],typesone:["ascii","big_endian","boolean","data","decimal","ebcdic","grouped","integer","linkcounted","pattern","qstring","real","record","rule","set of","streamed","string","token","udecimal","unicode","unsigned","utf8","varstring","varunicode"].join("|"),operators:["+","-","/",":=","<","<>","=",">","\\","and","in","not","or"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/[0-9_]*\.[0-9_]+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F_]+/,"number.hex"],[/0[bB][01]+/,"number.hex"],[/[0-9_]+/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\v\f\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"]]}};return p(g);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/elixir/elixir.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/elixir/elixir.js deleted file mode 100644 index 0dc7bcc0c4..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/elixir/elixir.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/elixir/elixir", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var o=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var d=(t,e)=>{for(var i in e)o(t,i,{get:e[i],enumerable:!0})},c=(t,e,i,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of s(e))!a.call(t,n)&&n!==i&&o(t,n,{get:()=>e[n],enumerable:!(r=l(e,n))||r.enumerable});return t};var m=t=>c(o({},"__esModule",{value:!0}),t);var p={};d(p,{conf:()=>u,language:()=>g});var u={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'"},{open:'"',close:'"'}],autoClosingPairs:[{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["comment"]},{open:'"""',close:'"""'},{open:"`",close:"`",notIn:["string","comment"]},{open:"(",close:")"},{open:"{",close:"}"},{open:"[",close:"]"},{open:"<<",close:">>"}],indentationRules:{increaseIndentPattern:/^\s*(after|else|catch|rescue|fn|[^#]*(do|<\-|\->|\{|\[|\=))\s*$/,decreaseIndentPattern:/^\s*((\}|\])\s*$|(after|else|catch|rescue|end)\b)/}},g={defaultToken:"source",tokenPostfix:".elixir",brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"<<",close:">>",token:"delimiter.angle.special"}],declarationKeywords:["def","defp","defn","defnp","defguard","defguardp","defmacro","defmacrop","defdelegate","defcallback","defmacrocallback","defmodule","defprotocol","defexception","defimpl","defstruct"],operatorKeywords:["and","in","not","or","when"],namespaceKeywords:["alias","import","require","use"],otherKeywords:["after","case","catch","cond","do","else","end","fn","for","if","quote","raise","receive","rescue","super","throw","try","unless","unquote_splicing","unquote","with"],constants:["true","false","nil"],nameBuiltin:["__MODULE__","__DIR__","__ENV__","__CALLER__","__STACKTRACE__"],operator:/-[->]?|!={0,2}|\*{1,2}|\/|\\\\|&{1,3}|\.\.?|\^(?:\^\^)?|\+\+?|<(?:-|<<|=|>|\|>|~>?)?|=~|={1,3}|>(?:=|>>)?|\|~>|\|>|\|{1,3}|~>>?|~~~|::/,variableName:/[a-z_][a-zA-Z0-9_]*[?!]?/,atomName:/[a-zA-Z_][a-zA-Z0-9_@]*[?!]?|@specialAtomName|@operator/,specialAtomName:/\.\.\.|<<>>|%\{\}|%|\{\}/,aliasPart:/[A-Z][a-zA-Z0-9_]*/,moduleName:/@aliasPart(?:\.@aliasPart)*/,sigilSymmetricDelimiter:/"""|'''|"|'|\/|\|/,sigilStartDelimiter:/@sigilSymmetricDelimiter|<|\{|\[|\(/,sigilEndDelimiter:/@sigilSymmetricDelimiter|>|\}|\]|\)/,sigilModifiers:/[a-zA-Z0-9]*/,decimal:/\d(?:_?\d)*/,hex:/[0-9a-fA-F](_?[0-9a-fA-F])*/,octal:/[0-7](_?[0-7])*/,binary:/[01](_?[01])*/,escape:/\\u[0-9a-fA-F]{4}|\\x[0-9a-fA-F]{2}|\\./,tokenizer:{root:[{include:"@whitespace"},{include:"@comments"},{include:"@keywordsShorthand"},{include:"@numbers"},{include:"@identifiers"},{include:"@strings"},{include:"@atoms"},{include:"@sigils"},{include:"@attributes"},{include:"@symbols"}],whitespace:[[/\s+/,"white"]],comments:[[/(#)(.*)/,["comment.punctuation","comment"]]],keywordsShorthand:[[/(@atomName)(:)(\s+)/,["constant","constant.punctuation","white"]],[/"(?=([^"]|#\{.*?\}|\\")*":)/,{token:"constant.delimiter",next:"@doubleQuotedStringKeyword"}],[/'(?=([^']|#\{.*?\}|\\')*':)/,{token:"constant.delimiter",next:"@singleQuotedStringKeyword"}]],doubleQuotedStringKeyword:[[/":/,{token:"constant.delimiter",next:"@pop"}],{include:"@stringConstantContentInterpol"}],singleQuotedStringKeyword:[[/':/,{token:"constant.delimiter",next:"@pop"}],{include:"@stringConstantContentInterpol"}],numbers:[[/0b@binary/,"number.binary"],[/0o@octal/,"number.octal"],[/0x@hex/,"number.hex"],[/@decimal\.@decimal([eE]-?@decimal)?/,"number.float"],[/@decimal/,"number"]],identifiers:[[/\b(defp?|defnp?|defmacrop?|defguardp?|defdelegate)(\s+)(@variableName)(?!\s+@operator)/,["keyword.declaration","white",{cases:{unquote:"keyword","@default":"function"}}]],[/(@variableName)(?=\s*\.?\s*\()/,{cases:{"@declarationKeywords":"keyword.declaration","@namespaceKeywords":"keyword","@otherKeywords":"keyword","@default":"function.call"}}],[/(@moduleName)(\s*)(\.)(\s*)(@variableName)/,["type.identifier","white","operator","white","function.call"]],[/(:)(@atomName)(\s*)(\.)(\s*)(@variableName)/,["constant.punctuation","constant","white","operator","white","function.call"]],[/(\|>)(\s*)(@variableName)/,["operator","white",{cases:{"@otherKeywords":"keyword","@default":"function.call"}}]],[/(&)(\s*)(@variableName)/,["operator","white","function.call"]],[/@variableName/,{cases:{"@declarationKeywords":"keyword.declaration","@operatorKeywords":"keyword.operator","@namespaceKeywords":"keyword","@otherKeywords":"keyword","@constants":"constant.language","@nameBuiltin":"variable.language","_.*":"comment.unused","@default":"identifier"}}],[/@moduleName/,"type.identifier"]],strings:[[/"""/,{token:"string.delimiter",next:"@doubleQuotedHeredoc"}],[/'''/,{token:"string.delimiter",next:"@singleQuotedHeredoc"}],[/"/,{token:"string.delimiter",next:"@doubleQuotedString"}],[/'/,{token:"string.delimiter",next:"@singleQuotedString"}]],doubleQuotedHeredoc:[[/"""/,{token:"string.delimiter",next:"@pop"}],{include:"@stringContentInterpol"}],singleQuotedHeredoc:[[/'''/,{token:"string.delimiter",next:"@pop"}],{include:"@stringContentInterpol"}],doubleQuotedString:[[/"/,{token:"string.delimiter",next:"@pop"}],{include:"@stringContentInterpol"}],singleQuotedString:[[/'/,{token:"string.delimiter",next:"@pop"}],{include:"@stringContentInterpol"}],atoms:[[/(:)(@atomName)/,["constant.punctuation","constant"]],[/:"/,{token:"constant.delimiter",next:"@doubleQuotedStringAtom"}],[/:'/,{token:"constant.delimiter",next:"@singleQuotedStringAtom"}]],doubleQuotedStringAtom:[[/"/,{token:"constant.delimiter",next:"@pop"}],{include:"@stringConstantContentInterpol"}],singleQuotedStringAtom:[[/'/,{token:"constant.delimiter",next:"@pop"}],{include:"@stringConstantContentInterpol"}],sigils:[[/~[a-z]@sigilStartDelimiter/,{token:"@rematch",next:"@sigil.interpol"}],[/~([A-Z]+)@sigilStartDelimiter/,{token:"@rematch",next:"@sigil.noInterpol"}]],sigil:[[/~([a-z]|[A-Z]+)\{/,{token:"@rematch",switchTo:"@sigilStart.$S2.$1.{.}"}],[/~([a-z]|[A-Z]+)\[/,{token:"@rematch",switchTo:"@sigilStart.$S2.$1.[.]"}],[/~([a-z]|[A-Z]+)\(/,{token:"@rematch",switchTo:"@sigilStart.$S2.$1.(.)"}],[/~([a-z]|[A-Z]+)\"}],[/~([a-z]|[A-Z]+)(@sigilSymmetricDelimiter)/,{token:"@rematch",switchTo:"@sigilStart.$S2.$1.$2.$2"}]],"sigilStart.interpol.s":[[/~s@sigilStartDelimiter/,{token:"string.delimiter",switchTo:"@sigilContinue.$S2.$S3.$S4.$S5"}]],"sigilContinue.interpol.s":[[/(@sigilEndDelimiter)@sigilModifiers/,{cases:{"$1==$S5":{token:"string.delimiter",next:"@pop"},"@default":"string"}}],{include:"@stringContentInterpol"}],"sigilStart.noInterpol.S":[[/~S@sigilStartDelimiter/,{token:"string.delimiter",switchTo:"@sigilContinue.$S2.$S3.$S4.$S5"}]],"sigilContinue.noInterpol.S":[[/(^|[^\\])\\@sigilEndDelimiter/,"string"],[/(@sigilEndDelimiter)@sigilModifiers/,{cases:{"$1==$S5":{token:"string.delimiter",next:"@pop"},"@default":"string"}}],{include:"@stringContent"}],"sigilStart.interpol.r":[[/~r@sigilStartDelimiter/,{token:"regexp.delimiter",switchTo:"@sigilContinue.$S2.$S3.$S4.$S5"}]],"sigilContinue.interpol.r":[[/(@sigilEndDelimiter)@sigilModifiers/,{cases:{"$1==$S5":{token:"regexp.delimiter",next:"@pop"},"@default":"regexp"}}],{include:"@regexpContentInterpol"}],"sigilStart.noInterpol.R":[[/~R@sigilStartDelimiter/,{token:"regexp.delimiter",switchTo:"@sigilContinue.$S2.$S3.$S4.$S5"}]],"sigilContinue.noInterpol.R":[[/(^|[^\\])\\@sigilEndDelimiter/,"regexp"],[/(@sigilEndDelimiter)@sigilModifiers/,{cases:{"$1==$S5":{token:"regexp.delimiter",next:"@pop"},"@default":"regexp"}}],{include:"@regexpContent"}],"sigilStart.interpol":[[/~([a-z]|[A-Z]+)@sigilStartDelimiter/,{token:"sigil.delimiter",switchTo:"@sigilContinue.$S2.$S3.$S4.$S5"}]],"sigilContinue.interpol":[[/(@sigilEndDelimiter)@sigilModifiers/,{cases:{"$1==$S5":{token:"sigil.delimiter",next:"@pop"},"@default":"sigil"}}],{include:"@sigilContentInterpol"}],"sigilStart.noInterpol":[[/~([a-z]|[A-Z]+)@sigilStartDelimiter/,{token:"sigil.delimiter",switchTo:"@sigilContinue.$S2.$S3.$S4.$S5"}]],"sigilContinue.noInterpol":[[/(^|[^\\])\\@sigilEndDelimiter/,"sigil"],[/(@sigilEndDelimiter)@sigilModifiers/,{cases:{"$1==$S5":{token:"sigil.delimiter",next:"@pop"},"@default":"sigil"}}],{include:"@sigilContent"}],attributes:[[/\@(module|type)?doc (~[sS])?"""/,{token:"comment.block.documentation",next:"@doubleQuotedHeredocDocstring"}],[/\@(module|type)?doc (~[sS])?'''/,{token:"comment.block.documentation",next:"@singleQuotedHeredocDocstring"}],[/\@(module|type)?doc (~[sS])?"/,{token:"comment.block.documentation",next:"@doubleQuotedStringDocstring"}],[/\@(module|type)?doc (~[sS])?'/,{token:"comment.block.documentation",next:"@singleQuotedStringDocstring"}],[/\@(module|type)?doc false/,"comment.block.documentation"],[/\@(@variableName)/,"variable"]],doubleQuotedHeredocDocstring:[[/"""/,{token:"comment.block.documentation",next:"@pop"}],{include:"@docstringContent"}],singleQuotedHeredocDocstring:[[/'''/,{token:"comment.block.documentation",next:"@pop"}],{include:"@docstringContent"}],doubleQuotedStringDocstring:[[/"/,{token:"comment.block.documentation",next:"@pop"}],{include:"@docstringContent"}],singleQuotedStringDocstring:[[/'/,{token:"comment.block.documentation",next:"@pop"}],{include:"@docstringContent"}],symbols:[[/\?(\\.|[^\\\s])/,"number.constant"],[/&\d+/,"operator"],[/<<<|>>>/,"operator"],[/[()\[\]\{\}]|<<|>>/,"@brackets"],[/\.\.\./,"identifier"],[/=>/,"punctuation"],[/@operator/,"operator"],[/[:;,.%]/,"punctuation"]],stringContentInterpol:[{include:"@interpolation"},{include:"@escapeChar"},{include:"@stringContent"}],stringContent:[[/./,"string"]],stringConstantContentInterpol:[{include:"@interpolation"},{include:"@escapeChar"},{include:"@stringConstantContent"}],stringConstantContent:[[/./,"constant"]],regexpContentInterpol:[{include:"@interpolation"},{include:"@escapeChar"},{include:"@regexpContent"}],regexpContent:[[/(\s)(#)(\s.*)$/,["white","comment.punctuation","comment"]],[/./,"regexp"]],sigilContentInterpol:[{include:"@interpolation"},{include:"@escapeChar"},{include:"@sigilContent"}],sigilContent:[[/./,"sigil"]],docstringContent:[[/./,"comment.block.documentation"]],escapeChar:[[/@escape/,"constant.character.escape"]],interpolation:[[/#{/,{token:"delimiter.bracket.embed",next:"@interpolationContinue"}]],interpolationContinue:[[/}/,{token:"delimiter.bracket.embed",next:"@pop"}],{include:"@root"}]}};return m(p);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/flow9/flow9.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/flow9/flow9.js deleted file mode 100644 index 2f6b1dd6dd..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/flow9/flow9.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/flow9/flow9", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(o,e)=>{for(var t in e)s(o,t,{get:e[t],enumerable:!0})},m=(o,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of a(e))!l.call(o,n)&&n!==t&&s(o,n,{get:()=>e[n],enumerable:!(i=r(e,n))||i.enumerable});return o};var p=o=>m(s({},"__esModule",{value:!0}),o);var u={};c(u,{conf:()=>g,language:()=>f});var g={comments:{blockComment:["/*","*/"],lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string"]},{open:"[",close:"]",notIn:["string"]},{open:"(",close:")",notIn:["string"]},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}]},f={defaultToken:"",tokenPostfix:".flow",keywords:["import","require","export","forbid","native","if","else","cast","unsafe","switch","default"],types:["io","mutable","bool","int","double","string","flow","void","ref","true","false","with"],operators:["=",">","<","<=",">=","==","!","!=",":=","::=","&&","||","+","-","*","/","@","&","%",":","->","\\","$","??","^"],symbols:/[@$=>](?!@symbols)/,"delimiter"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]]}};return p(u);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/freemarker2/freemarker2.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/freemarker2/freemarker2.js deleted file mode 100644 index c10e5abb1e..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/freemarker2/freemarker2.js +++ /dev/null @@ -1,12 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/freemarker2/freemarker2", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var B=Object.create;var d=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var T=Object.getPrototypeOf,v=Object.prototype.hasOwnProperty;var w=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(n,i)=>(typeof require<"u"?require:n)[i]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var h=(t,n)=>()=>(n||t((n={exports:{}}).exports,n),n.exports),S=(t,n)=>{for(var i in n)d(t,i,{get:n[i],enumerable:!0})},s=(t,n,i,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of D(n))!v.call(t,o)&&o!==i&&d(t,o,{get:()=>n[o],enumerable:!(e=C(n,o))||e.enumerable});return t},m=(t,n,i)=>(s(t,n,"default"),i&&s(i,n,"default")),x=(t,n,i)=>(i=t!=null?B(T(t)):{},s(n||!t||!t.__esModule?d(i,"default",{value:t,enumerable:!0}):i,t)),I=t=>s(d({},"__esModule",{value:!0}),t);var F=h((q,f)=>{var y=x(w("vs/editor/editor.api"));f.exports=y});var M={};S(M,{TagAngleInterpolationBracket:()=>L,TagAngleInterpolationDollar:()=>R,TagAutoInterpolationBracket:()=>j,TagAutoInterpolationDollar:()=>Z,TagBracketInterpolationBracket:()=>O,TagBracketInterpolationDollar:()=>z});var _={};m(_,x(F()));var l=["assign","flush","ftl","return","global","import","include","break","continue","local","nested","nt","setting","stop","t","lt","rt","fallback"],k=["attempt","autoesc","autoEsc","compress","comment","escape","noescape","function","if","list","items","sep","macro","noparse","noParse","noautoesc","noAutoEsc","outputformat","switch","visit","recurse"],r={close:">",id:"angle",open:"<"},u={close:"\\]",id:"bracket",open:"\\["},P={close:"[>\\]]",id:"auto",open:"[<\\[]"},g={close:"\\}",id:"dollar",open1:"\\$",open2:"\\{"},A={close:"\\]",id:"bracket",open1:"\\[",open2:"="};function p(t){return{brackets:[["<",">"],["[","]"],["(",")"],["{","}"]],comments:{blockComment:[`${t.open}--`,`--${t.close}`]},autoCloseBefore:` -\r }]),.:;=`,autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string"]}],surroundingPairs:[{open:'"',close:'"'},{open:"'",close:"'"},{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"}],folding:{markers:{start:new RegExp(`${t.open}#(?:${k.join("|")})([^/${t.close}]*(?!/)${t.close})[^${t.open}]*$`),end:new RegExp(`${t.open}/#(?:${k.join("|")})[\\r\\n\\t ]*>`)}},onEnterRules:[{beforeText:new RegExp(`${t.open}#(?!(?:${l.join("|")}))([a-zA-Z_]+)([^/${t.close}]*(?!/)${t.close})[^${t.open}]*$`),afterText:new RegExp(`^${t.open}/#([a-zA-Z_]+)[\\r\\n\\t ]*${t.close}$`),action:{indentAction:_.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp(`${t.open}#(?!(?:${l.join("|")}))([a-zA-Z_]+)([^/${t.close}]*(?!/)${t.close})[^${t.open}]*$`),action:{indentAction:_.languages.IndentAction.Indent}}]}}function b(){return{brackets:[["<",">"],["[","]"],["(",")"],["{","}"]],autoCloseBefore:` -\r }]),.:;=`,autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string"]}],surroundingPairs:[{open:'"',close:'"'},{open:"'",close:"'"},{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"}],folding:{markers:{start:new RegExp(`[<\\[]#(?:${k.join("|")})([^/>\\]]*(?!/)[>\\]])[^<\\[]*$`),end:new RegExp(`[<\\[]/#(?:${k.join("|")})[\\r\\n\\t ]*>`)}},onEnterRules:[{beforeText:new RegExp(`[<\\[]#(?!(?:${l.join("|")}))([a-zA-Z_]+)([^/>\\]]*(?!/)[>\\]])[^[<\\[]]*$`),afterText:new RegExp("^[<\\[]/#([a-zA-Z_]+)[\\r\\n\\t ]*[>\\]]$"),action:{indentAction:_.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp(`[<\\[]#(?!(?:${l.join("|")}))([a-zA-Z_]+)([^/>\\]]*(?!/)[>\\]])[^[<\\[]]*$`),action:{indentAction:_.languages.IndentAction.Indent}}]}}function a(t,n){let i=`_${t.id}_${n.id}`,e=c=>c.replace(/__id__/g,i),o=c=>{let E=c.source.replace(/__id__/g,i);return new RegExp(E,c.flags)};return{unicode:!0,includeLF:!1,start:e("default__id__"),ignoreCase:!1,defaultToken:"invalid",tokenPostfix:".freemarker2",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],[e("open__id__")]:new RegExp(t.open),[e("close__id__")]:new RegExp(t.close),[e("iOpen1__id__")]:new RegExp(n.open1),[e("iOpen2__id__")]:new RegExp(n.open2),[e("iClose__id__")]:new RegExp(n.close),[e("startTag__id__")]:o(/(@open__id__)(#)/),[e("endTag__id__")]:o(/(@open__id__)(\/#)/),[e("startOrEndTag__id__")]:o(/(@open__id__)(\/?#)/),[e("closeTag1__id__")]:o(/((?:@blank)*)(@close__id__)/),[e("closeTag2__id__")]:o(/((?:@blank)*\/?)(@close__id__)/),blank:/[ \t\n\r]/,keywords:["false","true","in","as","using"],directiveStartCloseTag1:/attempt|recover|sep|auto[eE]sc|no(?:autoe|AutoE)sc|compress|default|no[eE]scape|comment|no[pP]arse/,directiveStartCloseTag2:/else|break|continue|return|stop|flush|t|lt|rt|nt|nested|recurse|fallback|ftl/,directiveStartBlank:/if|else[iI]f|list|for[eE]ach|switch|case|assign|global|local|include|import|function|macro|transform|visit|stop|return|call|setting|output[fF]ormat|nested|recurse|escape|ftl|items/,directiveEndCloseTag1:/if|list|items|sep|recover|attempt|for[eE]ach|local|global|assign|function|macro|output[fF]ormat|auto[eE]sc|no(?:autoe|AutoE)sc|compress|transform|switch|escape|no[eE]scape/,escapedChar:/\\(?:[ntrfbgla\\'"\{=]|(?:x[0-9A-Fa-f]{1,4}))/,asciiDigit:/[0-9]/,integer:/[0-9]+/,nonEscapedIdStartChar:/[\$@-Z_a-z\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u1FFF\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\u3040-\u318F\u31A0-\u31BA\u31F0-\u31FF\u3300-\u337F\u3400-\u4DB5\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\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\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,escapedIdChar:/\\[\-\.:#]/,idStartChar:/(?:@nonEscapedIdStartChar)|(?:@escapedIdChar)/,id:/(?:@idStartChar)(?:(?:@idStartChar)|(?:@asciiDigit))*/,specialHashKeys:/\*\*|\*|false|true|in|as|using/,namedSymbols:/<=|>=|\\lte|\\lt|<|\\gte|\\gt|>|&&|\\and|->|->|==|!=|\+=|-=|\*=|\/=|%=|\+\+|--|<=|&&|\|\||:|\.\.\.|\.\.\*|\.\.<|\.\.!|\?\?|=|<|\+|-|\*|\/|%|\||\.\.|\?|!|&|\.|,|;/,arrows:["->","->"],delimiters:[";",":",",","."],stringOperators:["lte","lt","gte","gt"],noParseTags:["noparse","noParse","comment"],tokenizer:{[e("default__id__")]:[{include:e("@directive_token__id__")},{include:e("@interpolation_and_text_token__id__")}],[e("fmExpression__id__.directive")]:[{include:e("@blank_and_expression_comment_token__id__")},{include:e("@directive_end_token__id__")},{include:e("@expression_token__id__")}],[e("fmExpression__id__.interpolation")]:[{include:e("@blank_and_expression_comment_token__id__")},{include:e("@expression_token__id__")},{include:e("@greater_operators_token__id__")}],[e("inParen__id__.plain")]:[{include:e("@blank_and_expression_comment_token__id__")},{include:e("@directive_end_token__id__")},{include:e("@expression_token__id__")}],[e("inParen__id__.gt")]:[{include:e("@blank_and_expression_comment_token__id__")},{include:e("@expression_token__id__")},{include:e("@greater_operators_token__id__")}],[e("noSpaceExpression__id__")]:[{include:e("@no_space_expression_end_token__id__")},{include:e("@directive_end_token__id__")},{include:e("@expression_token__id__")}],[e("unifiedCall__id__")]:[{include:e("@unified_call_token__id__")}],[e("singleString__id__")]:[{include:e("@string_single_token__id__")}],[e("doubleString__id__")]:[{include:e("@string_double_token__id__")}],[e("rawSingleString__id__")]:[{include:e("@string_single_raw_token__id__")}],[e("rawDoubleString__id__")]:[{include:e("@string_double_raw_token__id__")}],[e("expressionComment__id__")]:[{include:e("@expression_comment_token__id__")}],[e("noParse__id__")]:[{include:e("@no_parse_token__id__")}],[e("terseComment__id__")]:[{include:e("@terse_comment_token__id__")}],[e("directive_token__id__")]:[[o(/(?:@startTag__id__)(@directiveStartCloseTag1)(?:@closeTag1__id__)/),t.id==="auto"?{cases:{"$1==<":{token:"@rematch",switchTo:`@default_angle_${n.id}`},"$1==[":{token:"@rematch",switchTo:`@default_bracket_${n.id}`}}}:[{token:"@brackets.directive"},{token:"delimiter.directive"},{cases:{"@noParseTags":{token:"tag",next:e("@noParse__id__.$3")},"@default":{token:"tag"}}},{token:"delimiter.directive"},{token:"@brackets.directive"}]],[o(/(?:@startTag__id__)(@directiveStartCloseTag2)(?:@closeTag2__id__)/),t.id==="auto"?{cases:{"$1==<":{token:"@rematch",switchTo:`@default_angle_${n.id}`},"$1==[":{token:"@rematch",switchTo:`@default_bracket_${n.id}`}}}:[{token:"@brackets.directive"},{token:"delimiter.directive"},{token:"tag"},{token:"delimiter.directive"},{token:"@brackets.directive"}]],[o(/(?:@startTag__id__)(@directiveStartBlank)(@blank)/),t.id==="auto"?{cases:{"$1==<":{token:"@rematch",switchTo:`@default_angle_${n.id}`},"$1==[":{token:"@rematch",switchTo:`@default_bracket_${n.id}`}}}:[{token:"@brackets.directive"},{token:"delimiter.directive"},{token:"tag"},{token:"",next:e("@fmExpression__id__.directive")}]],[o(/(?:@endTag__id__)(@directiveEndCloseTag1)(?:@closeTag1__id__)/),t.id==="auto"?{cases:{"$1==<":{token:"@rematch",switchTo:`@default_angle_${n.id}`},"$1==[":{token:"@rematch",switchTo:`@default_bracket_${n.id}`}}}:[{token:"@brackets.directive"},{token:"delimiter.directive"},{token:"tag"},{token:"delimiter.directive"},{token:"@brackets.directive"}]],[o(/(@open__id__)(@)/),t.id==="auto"?{cases:{"$1==<":{token:"@rematch",switchTo:`@default_angle_${n.id}`},"$1==[":{token:"@rematch",switchTo:`@default_bracket_${n.id}`}}}:[{token:"@brackets.directive"},{token:"delimiter.directive",next:e("@unifiedCall__id__")}]],[o(/(@open__id__)(\/@)((?:(?:@id)(?:\.(?:@id))*)?)(?:@closeTag1__id__)/),[{token:"@brackets.directive"},{token:"delimiter.directive"},{token:"tag"},{token:"delimiter.directive"},{token:"@brackets.directive"}]],[o(/(@open__id__)#--/),t.id==="auto"?{cases:{"$1==<":{token:"@rematch",switchTo:`@default_angle_${n.id}`},"$1==[":{token:"@rematch",switchTo:`@default_bracket_${n.id}`}}}:{token:"comment",next:e("@terseComment__id__")}],[o(/(?:@startOrEndTag__id__)([a-zA-Z_]+)/),t.id==="auto"?{cases:{"$1==<":{token:"@rematch",switchTo:`@default_angle_${n.id}`},"$1==[":{token:"@rematch",switchTo:`@default_bracket_${n.id}`}}}:[{token:"@brackets.directive"},{token:"delimiter.directive"},{token:"tag.invalid",next:e("@fmExpression__id__.directive")}]]],[e("interpolation_and_text_token__id__")]:[[o(/(@iOpen1__id__)(@iOpen2__id__)/),[{token:n.id==="bracket"?"@brackets.interpolation":"delimiter.interpolation"},{token:n.id==="bracket"?"delimiter.interpolation":"@brackets.interpolation",next:e("@fmExpression__id__.interpolation")}]],[/[\$#<\[\{]|(?:@blank)+|[^\$<#\[\{\n\r\t ]+/,{token:"source"}]],[e("string_single_token__id__")]:[[/[^'\\]/,{token:"string"}],[/@escapedChar/,{token:"string.escape"}],[/'/,{token:"string",next:"@pop"}]],[e("string_double_token__id__")]:[[/[^"\\]/,{token:"string"}],[/@escapedChar/,{token:"string.escape"}],[/"/,{token:"string",next:"@pop"}]],[e("string_single_raw_token__id__")]:[[/[^']+/,{token:"string.raw"}],[/'/,{token:"string.raw",next:"@pop"}]],[e("string_double_raw_token__id__")]:[[/[^"]+/,{token:"string.raw"}],[/"/,{token:"string.raw",next:"@pop"}]],[e("expression_token__id__")]:[[/(r?)(['"])/,{cases:{"r'":[{token:"keyword"},{token:"string.raw",next:e("@rawSingleString__id__")}],'r"':[{token:"keyword"},{token:"string.raw",next:e("@rawDoubleString__id__")}],"'":[{token:"source"},{token:"string",next:e("@singleString__id__")}],'"':[{token:"source"},{token:"string",next:e("@doubleString__id__")}]}}],[/(?:@integer)(?:\.(?:@integer))?/,{cases:{"(?:@integer)":{token:"number"},"@default":{token:"number.float"}}}],[/(\.)(@blank*)(@specialHashKeys)/,[{token:"delimiter"},{token:""},{token:"identifier"}]],[/(?:@namedSymbols)/,{cases:{"@arrows":{token:"meta.arrow"},"@delimiters":{token:"delimiter"},"@default":{token:"operators"}}}],[/@id/,{cases:{"@keywords":{token:"keyword.$0"},"@stringOperators":{token:"operators"},"@default":{token:"identifier"}}}],[/[\[\]\(\)\{\}]/,{cases:{"\\[":{cases:{"$S2==gt":{token:"@brackets",next:e("@inParen__id__.gt")},"@default":{token:"@brackets",next:e("@inParen__id__.plain")}}},"\\]":{cases:{...n.id==="bracket"?{"$S2==interpolation":{token:"@brackets.interpolation",next:"@popall"}}:{},...t.id==="bracket"?{"$S2==directive":{token:"@brackets.directive",next:"@popall"}}:{},[e("$S1==inParen__id__")]:{token:"@brackets",next:"@pop"},"@default":{token:"@brackets"}}},"\\(":{token:"@brackets",next:e("@inParen__id__.gt")},"\\)":{cases:{[e("$S1==inParen__id__")]:{token:"@brackets",next:"@pop"},"@default":{token:"@brackets"}}},"\\{":{cases:{"$S2==gt":{token:"@brackets",next:e("@inParen__id__.gt")},"@default":{token:"@brackets",next:e("@inParen__id__.plain")}}},"\\}":{cases:{...n.id==="bracket"?{}:{"$S2==interpolation":{token:"@brackets.interpolation",next:"@popall"}},[e("$S1==inParen__id__")]:{token:"@brackets",next:"@pop"},"@default":{token:"@brackets"}}}}}],[/\$\{/,{token:"delimiter.invalid"}]],[e("blank_and_expression_comment_token__id__")]:[[/(?:@blank)+/,{token:""}],[/[<\[][#!]--/,{token:"comment",next:e("@expressionComment__id__")}]],[e("directive_end_token__id__")]:[[/>/,t.id==="bracket"?{token:"operators"}:{token:"@brackets.directive",next:"@popall"}],[o(/(\/)(@close__id__)/),[{token:"delimiter.directive"},{token:"@brackets.directive",next:"@popall"}]]],[e("greater_operators_token__id__")]:[[/>/,{token:"operators"}],[/>=/,{token:"operators"}]],[e("no_space_expression_end_token__id__")]:[[/(?:@blank)+/,{token:"",switchTo:e("@fmExpression__id__.directive")}]],[e("unified_call_token__id__")]:[[/(@id)((?:@blank)+)/,[{token:"tag"},{token:"",next:e("@fmExpression__id__.directive")}]],[o(/(@id)(\/?)(@close__id__)/),[{token:"tag"},{token:"delimiter.directive"},{token:"@brackets.directive",next:"@popall"}]],[/./,{token:"@rematch",next:e("@noSpaceExpression__id__")}]],[e("no_parse_token__id__")]:[[o(/(@open__id__)(\/#?)([a-zA-Z]+)((?:@blank)*)(@close__id__)/),{cases:{"$S2==$3":[{token:"@brackets.directive"},{token:"delimiter.directive"},{token:"tag"},{token:""},{token:"@brackets.directive",next:"@popall"}],"$S2==comment":[{token:"comment"},{token:"comment"},{token:"comment"},{token:"comment"},{token:"comment"}],"@default":[{token:"source"},{token:"source"},{token:"source"},{token:"source"},{token:"source"}]}}],[/[^<\[\-]+|[<\[\-]/,{cases:{"$S2==comment":{token:"comment"},"@default":{token:"source"}}}]],[e("expression_comment_token__id__")]:[[/--[>\]]/,{token:"comment",next:"@pop"}],[/[^\->\]]+|[>\]\-]/,{token:"comment"}]],[e("terse_comment_token__id__")]:[[o(/--(?:@close__id__)/),{token:"comment",next:"@popall"}],[/[^<\[\-]+|[<\[\-]/,{token:"comment"}]]}}}function $(t){let n=a(r,t),i=a(u,t),e=a(P,t);return{...n,...i,...e,unicode:!0,includeLF:!1,start:`default_auto_${t.id}`,ignoreCase:!1,defaultToken:"invalid",tokenPostfix:".freemarker2",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],tokenizer:{...n.tokenizer,...i.tokenizer,...e.tokenizer}}}var R={conf:p(r),language:a(r,g)},z={conf:p(u),language:a(u,g)},L={conf:p(r),language:a(r,A)},O={conf:p(u),language:a(u,A)},Z={conf:b(),language:$(g)},j={conf:b(),language:$(A)};return I(M);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/fsharp/fsharp.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/fsharp/fsharp.js deleted file mode 100644 index 5d9f11dcb5..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/fsharp/fsharp.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/fsharp/fsharp", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(n,e)=>{for(var o in e)s(n,o,{get:e[o],enumerable:!0})},g=(n,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of a(e))!l.call(n,t)&&t!==o&&s(n,t,{get:()=>e[t],enumerable:!(i=r(e,t))||i.enumerable});return n};var f=n=>g(s({},"__esModule",{value:!0}),n);var d={};c(d,{conf:()=>m,language:()=>u});var m={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*//\\s*#region\\b|^\\s*\\(\\*\\s*#region(.*)\\*\\)"),end:new RegExp("^\\s*//\\s*#endregion\\b|^\\s*\\(\\*\\s*#endregion\\s*\\*\\)")}}},u={defaultToken:"",tokenPostfix:".fs",keywords:["abstract","and","atomic","as","assert","asr","base","begin","break","checked","component","const","constraint","constructor","continue","class","default","delegate","do","done","downcast","downto","elif","else","end","exception","eager","event","external","extern","false","finally","for","fun","function","fixed","functor","global","if","in","include","inherit","inline","interface","internal","land","lor","lsl","lsr","lxor","lazy","let","match","member","mod","module","mutable","namespace","method","mixin","new","not","null","of","open","or","object","override","private","parallel","process","protected","pure","public","rec","return","static","sealed","struct","sig","then","to","true","tailcall","trait","try","type","upcast","use","val","void","virtual","volatile","when","while","with","yield"],symbols:/[=>\]/,"annotation"],[/^#(if|else|endif)/,"keyword"],[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,"delimiter"],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0x[0-9a-fA-F]+LF/,"number.float"],[/0x[0-9a-fA-F]+(@integersuffix)/,"number.hex"],[/0b[0-1]+(@integersuffix)/,"number.bin"],[/\d+(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"""/,"string",'@string."""'],[/"/,"string",'@string."'],[/\@"/,{token:"string.quote",next:"@litstring"}],[/'[^\\']'B?/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\(\*(?!\))/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^*(]+/,"comment"],[/\*\)/,"comment","@pop"],[/\*/,"comment"],[/\(\*\)/,"comment"],[/\(/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/("""|"B?)/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]],litstring:[[/[^"]+/,"string"],[/""/,"string.escape"],[/"/,{token:"string.quote",next:"@pop"}]]}};return f(d);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/go/go.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/go/go.js deleted file mode 100644 index 2c1d6eacb9..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/go/go.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/go/go", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var m=(n,e)=>{for(var t in e)s(n,t,{get:e[t],enumerable:!0})},l=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of a(e))!c.call(n,o)&&o!==t&&s(n,o,{get:()=>e[o],enumerable:!(r=i(e,o))||r.enumerable});return n};var g=n=>l(s({},"__esModule",{value:!0}),n);var d={};m(d,{conf:()=>p,language:()=>u});var p={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"`",close:"`",notIn:["string"]},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"`",close:"`"},{open:'"',close:'"'},{open:"'",close:"'"}]},u={defaultToken:"",tokenPostfix:".go",keywords:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var","bool","true","false","uint8","uint16","uint32","uint64","int8","int16","int32","int64","float32","float64","complex64","complex128","byte","rune","uint","int","uintptr","string","nil"],operators:["+","-","*","/","%","&","|","^","<<",">>","&^","+=","-=","*=","/=","%=","&=","|=","^=","<<=",">>=","&^=","&&","||","<-","++","--","==","<",">","=","!","!=","<=",">=",":=","...","(",")","","]","{","}",",",";",".",":"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F]/,"number.hex"],[/0[0-7']*[0-7]/,"number.octal"],[/0[bB][0-1']*[0-1]/,"number.binary"],[/\d[\d']*/,"number"],[/\d/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/`/,"string","@rawstring"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\/\*/,"comment.doc.invalid"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],rawstring:[[/[^\`]/,"string"],[/`/,"string","@pop"]]}};return g(d);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/graphql/graphql.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/graphql/graphql.js deleted file mode 100644 index 7436daaba3..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/graphql/graphql.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/graphql/graphql", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(n,e)=>{for(var t in e)s(n,t,{get:e[t],enumerable:!0})},d=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of i(e))!l.call(n,o)&&o!==t&&s(n,o,{get:()=>e[o],enumerable:!(r=a(e,o))||r.enumerable});return n};var p=n=>d(s({},"__esModule",{value:!0}),n);var u={};c(u,{conf:()=>g,language:()=>I});var g={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"""',close:'"""',notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"""',close:'"""'},{open:'"',close:'"'}],folding:{offSide:!0}},I={defaultToken:"invalid",tokenPostfix:".gql",keywords:["null","true","false","query","mutation","subscription","extend","schema","directive","scalar","type","interface","union","enum","input","implements","fragment","on"],typeKeywords:["Int","Float","String","Boolean","ID"],directiveLocations:["SCHEMA","SCALAR","OBJECT","FIELD_DEFINITION","ARGUMENT_DEFINITION","INTERFACE","UNION","ENUM","ENUM_VALUE","INPUT_OBJECT","INPUT_FIELD_DEFINITION","QUERY","MUTATION","SUBSCRIPTION","FIELD","FRAGMENT_DEFINITION","FRAGMENT_SPREAD","INLINE_FRAGMENT","VARIABLE_DEFINITION"],operators:["=","!","?",":","&","|"],symbols:/[=!?:&|]+/,escapes:/\\(?:["\\\/bfnrt]|u[0-9A-Fa-f]{4})/,tokenizer:{root:[[/[a-z_][\w$]*/,{cases:{"@keywords":"keyword","@default":"key.identifier"}}],[/[$][\w$]*/,{cases:{"@keywords":"keyword","@default":"argument.identifier"}}],[/[A-Z][\w\$]*/,{cases:{"@typeKeywords":"keyword","@default":"type.identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,{token:"annotation",log:"annotation token: $0"}],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F]+/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/"""/,{token:"string",next:"@mlstring",nextEmbedded:"markdown"}],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,{token:"string.quote",bracket:"@open",next:"@string"}]],mlstring:[[/[^"]+/,"string"],['"""',{token:"string",next:"@pop",nextEmbedded:"@pop"}]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[/#.*$/,"comment"]]}};return p(u);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/handlebars/handlebars.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/handlebars/handlebars.js deleted file mode 100644 index ee6b1e7f5f..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/handlebars/handlebars.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/handlebars/handlebars", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var h=Object.create;var i=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var y=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var T=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),S=(e,t)=>{for(var n in t)i(e,n,{get:t[n],enumerable:!0})},m=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of u(t))!k.call(e,r)&&r!==n&&i(e,r,{get:()=>t[r],enumerable:!(o=b(t,r))||o.enumerable});return e},l=(e,t,n)=>(m(e,t,"default"),n&&m(n,t,"default")),s=(e,t,n)=>(n=e!=null?h(x(e)):{},m(t||!e||!e.__esModule?i(n,"default",{value:e,enumerable:!0}):n,e)),E=e=>m(i({},"__esModule",{value:!0}),e);var c=T((I,d)=>{var w=s(y("vs/editor/editor.api"));d.exports=w});var f={};S(f,{conf:()=>g,language:()=>$});var a={};l(a,s(c()));var p=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"],g={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:["{{!--","--}}"]},brackets:[[""],["<",">"],["{{","}}"],["{","}"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"<",close:">"},{open:'"',close:'"'},{open:"'",close:"'"}],onEnterRules:[{beforeText:new RegExp(`<(?!(?:${p.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),afterText:/^<\/(\w[\w\d]*)\s*>$/i,action:{indentAction:a.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp(`<(?!(?:${p.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),action:{indentAction:a.languages.IndentAction.Indent}}]},$={defaultToken:"",tokenPostfix:"",tokenizer:{root:[[/\{\{!--/,"comment.block.start.handlebars","@commentBlock"],[/\{\{!/,"comment.start.handlebars","@comment"],[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.root"}],[/)/,["delimiter.html","tag.html","delimiter.html"]],[/(<)(script)/,["delimiter.html",{token:"tag.html",next:"@script"}]],[/(<)(style)/,["delimiter.html",{token:"tag.html",next:"@style"}]],[/(<)([:\w]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/(<\/)(\w+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/]+/,"metatag.content.html"],[/>/,"metatag.html","@pop"]],comment:[[/\}\}/,"comment.end.handlebars","@pop"],[/./,"comment.content.handlebars"]],commentBlock:[[/--\}\}/,"comment.block.end.handlebars","@pop"],[/./,"comment.content.handlebars"]],commentHtml:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.comment"}],[/-->/,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.otherTag"}],[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.script"}],[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptAfterType"}],[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInEmbeddedState.scriptEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],style:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.style"}],[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleAfterType"}],[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInEmbeddedState.styleEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],handlebarsInSimpleState:[[/\{\{\{?/,"delimiter.handlebars"],[/\}\}\}?/,{token:"delimiter.handlebars",switchTo:"@$S2.$S3"}],{include:"handlebarsRoot"}],handlebarsInEmbeddedState:[[/\{\{\{?/,"delimiter.handlebars"],[/\}\}\}?/,{token:"delimiter.handlebars",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}],{include:"handlebarsRoot"}],handlebarsRoot:[[/"[^"]*"/,"string.handlebars"],[/[#/][^\s}]+/,"keyword.helper.handlebars"],[/else\b/,"keyword.helper.handlebars"],[/[\s]+/],[/[^}]/,"variable.parameter.handlebars"]]}};return E(f);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/hcl/hcl.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/hcl/hcl.js deleted file mode 100644 index 0eae607736..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/hcl/hcl.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/hcl/hcl", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var o in e)r(t,o,{get:e[o],enumerable:!0})},d=(t,e,o,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of i(e))!c.call(t,s)&&s!==o&&r(t,s,{get:()=>e[s],enumerable:!(n=a(e,s))||n.enumerable});return t};var m=t=>d(r({},"__esModule",{value:!0}),t);var f={};l(f,{conf:()=>p,language:()=>g});var p={comments:{lineComment:"#",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}]},g={defaultToken:"",tokenPostfix:".hcl",keywords:["var","local","path","for_each","any","string","number","bool","true","false","null","if ","else ","endif ","for ","in","endfor"],operators:["=",">=","<=","==","!=","+","-","*","/","%","&&","||","!","<",">","?","...",":"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\d[\d']*/,"number"],[/\d/,"number"],[/[;,.]/,"delimiter"],[/"/,"string","@string"],[/'/,"invalid"]],heredoc:[[/<<[-]*\s*["]?([\w\-]+)["]?/,{token:"string.heredoc.delimiter",next:"@heredocBody.$1"}]],heredocBody:[[/([\w\-]+)$/,{cases:{"$1==$S2":[{token:"string.heredoc.delimiter",next:"@popall"}],"@default":"string.heredoc"}}],[/./,"string.heredoc"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"],[/#.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],string:[[/\$\{/,{token:"delimiter",next:"@stringExpression"}],[/[^\\"\$]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@popall"]],stringInsideExpression:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],stringExpression:[[/\}/,{token:"delimiter",next:"@pop"}],[/"/,"string","@stringInsideExpression"],{include:"@terraform"}]}};return m(f);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/html/html.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/html/html.js deleted file mode 100644 index fbe1539f54..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/html/html.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/html/html", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var u=Object.create;var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,g=Object.prototype.hasOwnProperty;var k=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var E=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),T=(e,t)=>{for(var n in t)a(e,n,{get:t[n],enumerable:!0})},o=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of x(t))!g.call(e,r)&&r!==n&&a(e,r,{get:()=>t[r],enumerable:!(s=b(t,r))||s.enumerable});return e},d=(e,t,n)=>(o(e,t,"default"),n&&o(n,t,"default")),m=(e,t,n)=>(n=e!=null?u(y(e)):{},o(t||!e||!e.__esModule?a(n,"default",{value:e,enumerable:!0}):n,e)),w=e=>o(a({},"__esModule",{value:!0}),e);var l=E((A,p)=>{var h=m(k("vs/editor/editor.api"));p.exports=h});var $={};T($,{conf:()=>v,language:()=>f});var i={};d(i,m(l()));var c=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"],v={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:[""]},brackets:[[""],["<",">"],["{","}"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:'"',close:'"'},{open:"'",close:"'"},{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"}],onEnterRules:[{beforeText:new RegExp(`<(?!(?:${c.join("|")}))([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:i.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp(`<(?!(?:${c.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),action:{indentAction:i.languages.IndentAction.Indent}}],folding:{markers:{start:new RegExp("^\\s*"),end:new RegExp("^\\s*")}}},f={defaultToken:"",tokenPostfix:".html",ignoreCase:!0,tokenizer:{root:[[/)/,["delimiter","tag","","delimiter"]],[/(<)(script)/,["delimiter",{token:"tag",next:"@script"}]],[/(<)(style)/,["delimiter",{token:"tag",next:"@style"}]],[/(<)((?:[\w\-]+:)?[\w\-]+)/,["delimiter",{token:"tag",next:"@otherTag"}]],[/(<\/)((?:[\w\-]+:)?[\w\-]+)/,["delimiter",{token:"tag",next:"@otherTag"}]],[/]+/,"metatag.content"],[/>/,"metatag","@pop"]],comment:[[/-->/,"comment","@pop"],[/[^-]+/,"comment.content"],[/./,"comment.content"]],otherTag:[[/\/?>/,"delimiter","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter","tag",{token:"delimiter",next:"@pop"}]]],scriptAfterType:[[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/"module"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.text/javascript"}],[/'module'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.text/javascript"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/>/,{token:"delimiter",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]],style:[[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter","tag",{token:"delimiter",next:"@pop"}]]],styleAfterType:[[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/>/,{token:"delimiter",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]]}};return w($);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/ini/ini.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/ini/ini.js deleted file mode 100644 index 8983523157..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/ini/ini.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/ini/ini", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var t=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var c=(n,e)=>{for(var s in e)t(n,s,{get:e[s],enumerable:!0})},l=(n,e,s,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of r(e))!g.call(n,o)&&o!==s&&t(n,o,{get:()=>e[o],enumerable:!(a=i(e,o))||a.enumerable});return n};var p=n=>l(t({},"__esModule",{value:!0}),n);var f={};c(f,{conf:()=>u,language:()=>m});var u={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},m={defaultToken:"",tokenPostfix:".ini",escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^\[[^\]]*\]/,"metatag"],[/(^\w+)(\s*)(\=)/,["key","","delimiter"]],{include:"@whitespace"},[/\d+/,"number"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],whitespace:[[/[ \t\r\n]+/,""],[/^\s*[#;].*$/,"comment"]],string:[[/[^\\"']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]]}};return p(f);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/java/java.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/java/java.js deleted file mode 100644 index e1a65706e4..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/java/java.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/java/java", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var o in e)s(t,o,{get:e[o],enumerable:!0})},d=(t,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of r(e))!c.call(t,n)&&n!==o&&s(t,n,{get:()=>e[n],enumerable:!(i=a(e,n))||i.enumerable});return t};var g=t=>d(s({},"__esModule",{value:!0}),t);var f={};l(f,{conf:()=>m,language:()=>p});var m={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:))")}}},p={defaultToken:"",tokenPostfix:".java",keywords:["abstract","continue","for","new","switch","assert","default","goto","package","synchronized","boolean","do","if","private","this","break","double","implements","protected","throw","byte","else","import","public","throws","case","enum","instanceof","return","transient","catch","extends","int","short","try","char","final","interface","static","void","class","finally","long","strictfp","volatile","const","float","native","super","while","true","false","yield","record","sealed","non-sealed","permits"],operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,"annotation"],[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/,"number.float"],[/0[xX](@hexdigits)[Ll]?/,"number.hex"],[/0(@octaldigits)[Ll]?/,"number.octal"],[/0[bB](@binarydigits)[Ll]?/,"number.binary"],[/(@digits)[fFdD]/,"number.float"],[/(@digits)[lL]?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"""/,"string","@multistring"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@javadoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],javadoc:[[/[^\/*]+/,"comment.doc"],[/\/\*/,"comment.doc.invalid"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],multistring:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"""/,"string","@pop"],[/./,"string"]]}};return g(f);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/javascript/javascript.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/javascript/javascript.js deleted file mode 100644 index 2868298969..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/javascript/javascript.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/javascript/javascript", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var x=Object.create;var a=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var b=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var y=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var w=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),h=(e,t)=>{for(var n in t)a(e,n,{get:t[n],enumerable:!0})},s=(e,t,n,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of f(t))!k.call(e,r)&&r!==n&&a(e,r,{get:()=>t[r],enumerable:!(c=u(t,r))||c.enumerable});return e},g=(e,t,n)=>(s(e,t,"default"),n&&s(n,t,"default")),p=(e,t,n)=>(n=e!=null?x(b(e)):{},s(t||!e||!e.__esModule?a(n,"default",{value:e,enumerable:!0}):n,e)),v=e=>s(a({},"__esModule",{value:!0}),e);var d=w((C,l)=>{var A=p(y("vs/editor/editor.api"));l.exports=A});var _={};h(_,{conf:()=>$,language:()=>T});var i={};g(i,p(d()));var m={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],onEnterRules:[{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,afterText:/^\s*\*\/$/,action:{indentAction:i.languages.IndentAction.IndentOutdent,appendText:" * "}},{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,action:{indentAction:i.languages.IndentAction.None,appendText:" * "}},{beforeText:/^(\t|(\ \ ))*\ \*(\ ([^\*]|\*(?!\/))*)?$/,action:{indentAction:i.languages.IndentAction.None,appendText:"* "}},{beforeText:/^(\t|(\ \ ))*\ \*\/\s*$/,action:{indentAction:i.languages.IndentAction.None,removeText:1}}],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]},{open:"`",close:"`",notIn:["string","comment"]},{open:"/**",close:" */",notIn:["string"]}],folding:{markers:{start:new RegExp("^\\s*//\\s*#?region\\b"),end:new RegExp("^\\s*//\\s*#?endregion\\b")}}},o={defaultToken:"invalid",tokenPostfix:".ts",keywords:["abstract","any","as","asserts","bigint","boolean","break","case","catch","class","continue","const","constructor","debugger","declare","default","delete","do","else","enum","export","extends","false","finally","for","from","function","get","if","implements","import","in","infer","instanceof","interface","is","keyof","let","module","namespace","never","new","null","number","object","out","package","private","protected","public","override","readonly","require","global","return","satisfies","set","static","string","super","switch","symbol","this","throw","true","try","type","typeof","undefined","unique","unknown","var","void","while","with","yield","async","await","of"],operators:["<=",">=","==","!=","===","!==","=>","+","-","**","*","/","%","++","--","<<",">",">>>","&","|","^","!","~","&&","||","??","?",":","=","+=","-=","*=","**=","/=","%=","<<=",">>=",">>>=","&=","|=","^=","@"],symbols:/[=>](?!@symbols)/,"@brackets"],[/!(?=([^=]|$))/,"delimiter"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/(@digits)[eE]([\-+]?(@digits))?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?/,"number.float"],[/0[xX](@hexdigits)n?/,"number.hex"],[/0[oO]?(@octaldigits)n?/,"number.octal"],[/0[bB](@binarydigits)n?/,"number.binary"],[/(@digits)n?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string_double"],[/'/,"string","@string_single"],[/`/,"string","@string_backtick"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@jsdoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],jsdoc:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],regexp:[[/(\{)(\d+(?:,\d*)?)(\})/,["regexp.escape.control","regexp.escape.control","regexp.escape.control"]],[/(\[)(\^?)(?=(?:[^\]\\\/]|\\.)+)/,["regexp.escape.control",{token:"regexp.escape.control",next:"@regexrange"}]],[/(\()(\?:|\?=|\?!)/,["regexp.escape.control","regexp.escape.control"]],[/[()]/,"regexp.escape.control"],[/@regexpctl/,"regexp.escape.control"],[/[^\\\/]/,"regexp"],[/@regexpesc/,"regexp.escape"],[/\\\./,"regexp.invalid"],[/(\/)([dgimsuy]*)/,[{token:"regexp",bracket:"@close",next:"@pop"},"keyword.other"]]],regexrange:[[/-/,"regexp.escape.control"],[/\^/,"regexp.invalid"],[/@regexpesc/,"regexp.escape"],[/[^\]]/,"regexp"],[/\]/,{token:"regexp.escape.control",next:"@pop",bracket:"@close"}]],string_double:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],string_single:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"]],string_backtick:[[/\$\{/,{token:"delimiter.bracket",next:"@bracketCounting"}],[/[^\\`$]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/`/,"string","@pop"]],bracketCounting:[[/\{/,"delimiter.bracket","@bracketCounting"],[/\}/,"delimiter.bracket","@pop"],{include:"common"}]}};var $=m,T={defaultToken:"invalid",tokenPostfix:".js",keywords:["break","case","catch","class","continue","const","constructor","debugger","default","delete","do","else","export","extends","false","finally","for","from","function","get","if","import","in","instanceof","let","new","null","return","set","static","super","switch","symbol","this","throw","true","try","typeof","undefined","var","void","while","with","yield","async","await","of"],typeKeywords:[],operators:o.operators,symbols:o.symbols,escapes:o.escapes,digits:o.digits,octaldigits:o.octaldigits,binarydigits:o.binarydigits,hexdigits:o.hexdigits,regexpctl:o.regexpctl,regexpesc:o.regexpesc,tokenizer:o.tokenizer};return v(_);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/julia/julia.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/julia/julia.js deleted file mode 100644 index 6d32348f8c..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/julia/julia.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/julia/julia", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var c=(t,e)=>{for(var n in e)o(t,n,{get:e[n],enumerable:!0})},l=(t,e,n,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of s(e))!p.call(t,r)&&r!==n&&o(t,r,{get:()=>e[r],enumerable:!(a=i(e,r))||a.enumerable});return t};var d=t=>l(o({},"__esModule",{value:!0}),t);var u={};c(u,{conf:()=>g,language:()=>m});var g={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},m={tokenPostfix:".julia",keywords:["begin","while","if","for","try","return","break","continue","function","macro","quote","let","local","global","const","do","struct","module","baremodule","using","import","export","end","else","elseif","catch","finally","mutable","primitive","abstract","type","in","isa","where","new"],types:["LinRange","LineNumberNode","LinearIndices","LoadError","MIME","Matrix","Method","MethodError","Missing","MissingException","Module","NTuple","NamedTuple","Nothing","Number","OrdinalRange","OutOfMemoryError","OverflowError","Pair","PartialQuickSort","PermutedDimsArray","Pipe","Ptr","QuoteNode","Rational","RawFD","ReadOnlyMemoryError","Real","ReentrantLock","Ref","Regex","RegexMatch","RoundingMode","SegmentationFault","Set","Signed","Some","StackOverflowError","StepRange","StepRangeLen","StridedArray","StridedMatrix","StridedVecOrMat","StridedVector","String","StringIndexError","SubArray","SubString","SubstitutionString","Symbol","SystemError","Task","Text","TextDisplay","Timer","Tuple","Type","TypeError","TypeVar","UInt","UInt128","UInt16","UInt32","UInt64","UInt8","UndefInitializer","AbstractArray","UndefKeywordError","AbstractChannel","UndefRefError","AbstractChar","UndefVarError","AbstractDict","Union","AbstractDisplay","UnionAll","AbstractFloat","UnitRange","AbstractIrrational","Unsigned","AbstractMatrix","AbstractRange","Val","AbstractSet","Vararg","AbstractString","VecElement","AbstractUnitRange","VecOrMat","AbstractVecOrMat","Vector","AbstractVector","VersionNumber","Any","WeakKeyDict","ArgumentError","WeakRef","Array","AssertionError","BigFloat","BigInt","BitArray","BitMatrix","BitSet","BitVector","Bool","BoundsError","CapturedException","CartesianIndex","CartesianIndices","Cchar","Cdouble","Cfloat","Channel","Char","Cint","Cintmax_t","Clong","Clonglong","Cmd","Colon","Complex","ComplexF16","ComplexF32","ComplexF64","CompositeException","Condition","Cptrdiff_t","Cshort","Csize_t","Cssize_t","Cstring","Cuchar","Cuint","Cuintmax_t","Culong","Culonglong","Cushort","Cvoid","Cwchar_t","Cwstring","DataType","DenseArray","DenseMatrix","DenseVecOrMat","DenseVector","Dict","DimensionMismatch","Dims","DivideError","DomainError","EOFError","Enum","ErrorException","Exception","ExponentialBackOff","Expr","Float16","Float32","Float64","Function","GlobalRef","HTML","IO","IOBuffer","IOContext","IOStream","IdDict","IndexCartesian","IndexLinear","IndexStyle","InexactError","InitError","Int","Int128","Int16","Int32","Int64","Int8","Integer","InterruptException","InvalidStateException","Irrational","KeyError"],keywordops:["<:",">:",":","=>","...",".","->","?"],allops:/[^\w\d\s()\[\]{}"'#]+/,constants:["true","false","nothing","missing","undef","Inf","pi","NaN","\u03C0","\u212F","ans","PROGRAM_FILE","ARGS","C_NULL","VERSION","DEPOT_PATH","LOAD_PATH"],operators:["!","!=","!==","%","&","*","+","-","/","//","<","<<","<=","==","===","=>",">",">=",">>",">>>","\\","^","|","|>","~","\xF7","\u2208","\u2209","\u220B","\u220C","\u2218","\u221A","\u221B","\u2229","\u222A","\u2248","\u2249","\u2260","\u2261","\u2262","\u2264","\u2265","\u2286","\u2287","\u2288","\u2289","\u228A","\u228B","\u22BB"],brackets:[{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"}],ident:/π|ℯ|\b(?!\d)\w+\b/,escape:/(?:[abefnrstv\\"'\n\r]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2}|u[0-9A-Fa-f]{4})/,escapes:/\\(?:C\-(@escape|.)|c(@escape|.)|@escape)/,tokenizer:{root:[[/(::)\s*|\b(isa)\s+/,"keyword","@typeanno"],[/\b(isa)(\s*\(@ident\s*,\s*)/,["keyword",{token:"",next:"@typeanno"}]],[/\b(type|struct)[ \t]+/,"keyword","@typeanno"],[/^\s*:@ident[!?]?/,"metatag"],[/(return)(\s*:@ident[!?]?)/,["keyword","metatag"]],[/(\(|\[|\{|@allops)(\s*:@ident[!?]?)/,["","metatag"]],[/:\(/,"metatag","@quote"],[/r"""/,"regexp.delim","@tregexp"],[/r"/,"regexp.delim","@sregexp"],[/raw"""/,"string.delim","@rtstring"],[/[bv]?"""/,"string.delim","@dtstring"],[/raw"/,"string.delim","@rsstring"],[/[bv]?"/,"string.delim","@dsstring"],[/(@ident)\{/,{cases:{"$1@types":{token:"type",next:"@gen"},"@default":{token:"type",next:"@gen"}}}],[/@ident[!?'']?(?=\.?\()/,{cases:{"@types":"type","@keywords":"keyword","@constants":"variable","@default":"keyword.flow"}}],[/@ident[!?']?/,{cases:{"@types":"type","@keywords":"keyword","@constants":"variable","@default":"identifier"}}],[/\$\w+/,"key"],[/\$\(/,"key","@paste"],[/@@@ident/,"annotation"],{include:"@whitespace"},[/'(?:@escapes|.)'/,"string.character"],[/[()\[\]{}]/,"@brackets"],[/@allops/,{cases:{"@keywordops":"keyword","@operators":"operator"}}],[/[;,]/,"delimiter"],[/0[xX][0-9a-fA-F](_?[0-9a-fA-F])*/,"number.hex"],[/0[_oO][0-7](_?[0-7])*/,"number.octal"],[/0[bB][01](_?[01])*/,"number.binary"],[/[+\-]?\d+(\.\d+)?(im?|[eE][+\-]?\d+(\.\d+)?)?/,"number"]],typeanno:[[/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*\{/,"type","@gen"],[/([a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*)(\s*<:\s*)/,["type","keyword"]],[/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*/,"type","@pop"],["","","@pop"]],gen:[[/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*\{/,"type","@push"],[/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*/,"type"],[/<:/,"keyword"],[/(\})(\s*<:\s*)/,["type",{token:"keyword",next:"@pop"}]],[/\}/,"type","@pop"],{include:"@root"}],quote:[[/\$\(/,"key","@paste"],[/\(/,"@brackets","@paren"],[/\)/,"metatag","@pop"],{include:"@root"}],paste:[[/:\(/,"metatag","@quote"],[/\(/,"@brackets","@paren"],[/\)/,"key","@pop"],{include:"@root"}],paren:[[/\$\(/,"key","@paste"],[/:\(/,"metatag","@quote"],[/\(/,"@brackets","@push"],[/\)/,"@brackets","@pop"],{include:"@root"}],sregexp:[[/^.*/,"invalid"],[/[^\\"()\[\]{}]/,"regexp"],[/[()\[\]{}]/,"@brackets"],[/\\./,"operator.scss"],[/"[imsx]*/,"regexp.delim","@pop"]],tregexp:[[/[^\\"()\[\]{}]/,"regexp"],[/[()\[\]{}]/,"@brackets"],[/\\./,"operator.scss"],[/"(?!"")/,"string"],[/"""[imsx]*/,"regexp.delim","@pop"]],rsstring:[[/^.*/,"invalid"],[/[^\\"]/,"string"],[/\\./,"string.escape"],[/"/,"string.delim","@pop"]],rtstring:[[/[^\\"]/,"string"],[/\\./,"string.escape"],[/"(?!"")/,"string"],[/"""/,"string.delim","@pop"]],dsstring:[[/^.*/,"invalid"],[/[^\\"\$]/,"string"],[/\$/,"","@interpolated"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string.delim","@pop"]],dtstring:[[/[^\\"\$]/,"string"],[/\$/,"","@interpolated"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"(?!"")/,"string"],[/"""/,"string.delim","@pop"]],interpolated:[[/\(/,{token:"",switchTo:"@interpolated_compound"}],[/[a-zA-Z_]\w*/,"identifier"],["","","@pop"]],interpolated_compound:[[/\)/,"","@pop"],{include:"@root"}],whitespace:[[/[ \t\r\n]+/,""],[/#=/,"comment","@multi_comment"],[/#.*$/,"comment"]],multi_comment:[[/#=/,"comment","@push"],[/=#/,"comment","@pop"],[/=(?!#)|#(?!=)/,"comment"],[/[^#=]+/,"comment"]]}};return d(u);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/kotlin/kotlin.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/kotlin/kotlin.js deleted file mode 100644 index ed9a2232c8..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/kotlin/kotlin.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/kotlin/kotlin", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var o=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var l=(n,e)=>{for(var i in e)o(n,i,{get:e[i],enumerable:!0})},d=(n,e,i,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of r(e))!c.call(n,t)&&t!==i&&o(n,t,{get:()=>e[t],enumerable:!(s=a(e,t))||s.enumerable});return n};var g=n=>d(o({},"__esModule",{value:!0}),n);var f={};l(f,{conf:()=>m,language:()=>p});var m={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:))")}}},p={defaultToken:"",tokenPostfix:".kt",keywords:["as","as?","break","class","continue","do","else","false","for","fun","if","in","!in","interface","is","!is","null","object","package","return","super","this","throw","true","try","typealias","val","var","when","while","by","catch","constructor","delegate","dynamic","field","file","finally","get","import","init","param","property","receiver","set","setparam","where","actual","abstract","annotation","companion","const","crossinline","data","enum","expect","external","final","infix","inline","inner","internal","lateinit","noinline","open","operator","out","override","private","protected","public","reified","sealed","suspend","tailrec","vararg","field","it"],operators:["+","-","*","/","%","=","+=","-=","*=","/=","%=","++","--","&&","||","!","==","!=","===","!==",">","<","<=",">=","[","]","!!","?.","?:","::","..",":","?","->","@",";","$","_"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,"annotation"],[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/,"number.float"],[/0[xX](@hexdigits)[Ll]?/,"number.hex"],[/0(@octaldigits)[Ll]?/,"number.octal"],[/0[bB](@binarydigits)[Ll]?/,"number.binary"],[/(@digits)[fFdD]/,"number.float"],[/(@digits)[lL]?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"""/,"string","@multistring"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@javadoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],javadoc:[[/[^\/*]+/,"comment.doc"],[/\/\*/,"comment.doc","@push"],[/\/\*/,"comment.doc.invalid"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],multistring:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"""/,"string","@pop"],[/./,"string"]]}};return g(f);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/less/less.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/less/less.js deleted file mode 100644 index 416b2b7277..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/less/less.js +++ /dev/null @@ -1,11 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/less/less", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var d=(t,e)=>{for(var i in e)r(t,i,{get:e[i],enumerable:!0})},u=(t,e,i,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of a(e))!l.call(t,n)&&n!==i&&r(t,n,{get:()=>e[n],enumerable:!(o=s(e,n))||o.enumerable});return t};var c=t=>u(r({},"__esModule",{value:!0}),t);var p={};d(p,{conf:()=>m,language:()=>g});var m={wordPattern:/(#?-?\d*\.\d\w*%?)|([@#!.:]?[\w-?]+%?)|[@#!.]/g,comments:{blockComment:["/*","*/"],lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\/"),end:new RegExp("^\\s*\\/\\*\\s*#endregion\\b.*\\*\\/")}}},g={defaultToken:"",tokenPostfix:".less",identifier:"-?-?([a-zA-Z]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",identifierPlus:"-?-?([a-zA-Z:.]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-:.]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],tokenizer:{root:[{include:"@nestedJSBegin"},["[ \\t\\r\\n]+",""],{include:"@comments"},{include:"@keyword"},{include:"@strings"},{include:"@numbers"},["[*_]?[a-zA-Z\\-\\s]+(?=:.*(;|(\\\\$)))","attribute.name","@attribute"],["url(\\-prefix)?\\(",{token:"tag",next:"@urldeclaration"}],["[{}()\\[\\]]","@brackets"],["[,:;]","delimiter"],["#@identifierPlus","tag.id"],["&","tag"],["\\.@identifierPlus(?=\\()","tag.class","@attribute"],["\\.@identifierPlus","tag.class"],["@identifierPlus","tag"],{include:"@operators"},["@(@identifier(?=[:,\\)]))","variable","@attribute"],["@(@identifier)","variable"],["@","key","@atRules"]],nestedJSBegin:[["``","delimiter.backtick"],["`",{token:"delimiter.backtick",next:"@nestedJSEnd",nextEmbedded:"text/javascript"}]],nestedJSEnd:[["`",{token:"delimiter.backtick",next:"@pop",nextEmbedded:"@pop"}]],operators:[["[<>=\\+\\-\\*\\/\\^\\|\\~]","operator"]],keyword:[["(@[\\s]*import|![\\s]*important|true|false|when|iscolor|isnumber|isstring|iskeyword|isurl|ispixel|ispercentage|isem|hue|saturation|lightness|alpha|lighten|darken|saturate|desaturate|fadein|fadeout|fade|spin|mix|round|ceil|floor|percentage)\\b","keyword"]],urldeclaration:[{include:"@strings"},[`[^)\r -]+`,"string"],["\\)",{token:"tag",next:"@pop"}]],attribute:[{include:"@nestedJSBegin"},{include:"@comments"},{include:"@strings"},{include:"@numbers"},{include:"@keyword"},["[a-zA-Z\\-]+(?=\\()","attribute.value","@attribute"],[">","operator","@pop"],["@identifier","attribute.value"],{include:"@operators"},["@(@identifier)","variable"],["[)\\}]","@brackets","@pop"],["[{}()\\[\\]>]","@brackets"],["[;]","delimiter","@pop"],["[,=:]","delimiter"],["\\s",""],[".","attribute.value"]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[".","comment"]],numbers:[["(\\d*\\.)?\\d+([eE][\\-+]?\\d+)?",{token:"attribute.value.number",next:"@units"}],["#[0-9a-fA-F_]+(?!\\w)","attribute.value.hex"]],units:[["(em|ex|ch|rem|fr|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?","attribute.value.unit","@pop"]],strings:[['~?"',{token:"string.delimiter",next:"@stringsEndDoubleQuote"}],["~?'",{token:"string.delimiter",next:"@stringsEndQuote"}]],stringsEndDoubleQuote:[['\\\\"',"string"],['"',{token:"string.delimiter",next:"@popall"}],[".","string"]],stringsEndQuote:[["\\\\'","string"],["'",{token:"string.delimiter",next:"@popall"}],[".","string"]],atRules:[{include:"@comments"},{include:"@strings"},["[()]","delimiter"],["[\\{;]","delimiter","@pop"],[".","key"]]}};return c(p);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/lexon/lexon.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/lexon/lexon.js deleted file mode 100644 index c77bf5e060..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/lexon/lexon.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/lexon/lexon", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var n=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var i in e)n(t,i,{get:e[i],enumerable:!0})},p=(t,e,i,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of d(e))!a.call(t,o)&&o!==i&&n(t,o,{get:()=>e[o],enumerable:!(r=s(e,o))||r.enumerable});return t};var c=t=>p(n({},"__esModule",{value:!0}),t);var k={};l(k,{conf:()=>m,language:()=>u});var m={comments:{lineComment:"COMMENT"},brackets:[["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:":",close:"."}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"`",close:"`"},{open:'"',close:'"'},{open:"'",close:"'"},{open:":",close:"."}],folding:{markers:{start:new RegExp("^\\s*(::\\s*|COMMENT\\s+)#region"),end:new RegExp("^\\s*(::\\s*|COMMENT\\s+)#endregion")}}},u={tokenPostfix:".lexon",ignoreCase:!0,keywords:["lexon","lex","clause","terms","contracts","may","pay","pays","appoints","into","to"],typeKeywords:["amount","person","key","time","date","asset","text"],operators:["less","greater","equal","le","gt","or","and","add","added","subtract","subtracted","multiply","multiplied","times","divide","divided","is","be","certified"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,"delimiter"],[/\d*\.\d*\.\d*/,"number.semver"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F]+/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"]],quoted_identifier:[[/[^\\"]+/,"identifier"],[/"/,{token:"identifier.quote",bracket:"@close",next:"@pop"}]],space_identifier_until_period:[[":","delimiter"],[" ",{token:"white",next:"@identifier_rest"}]],identifier_until_period:[{include:"@whitespace"},[":",{token:"delimiter",next:"@identifier_rest"}],[/[^\\.]+/,"identifier"],[/\./,{token:"delimiter",bracket:"@close",next:"@pop"}]],identifier_rest:[[/[^\\.]+/,"identifier"],[/\./,{token:"delimiter",bracket:"@close",next:"@pop"}]],semver:[{include:"@whitespace"},[":","delimiter"],[/\d*\.\d*\.\d*/,{token:"number.semver",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,"white"]]}};return c(k);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/liquid/liquid.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/liquid/liquid.js deleted file mode 100644 index 9af8f1d5ab..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/liquid/liquid.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/liquid/liquid", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var p=Object.create;var a=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var h=Object.getPrototypeOf,q=Object.prototype.hasOwnProperty;var f=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,i)=>(typeof require<"u"?require:t)[i]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var b=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),T=(e,t)=>{for(var i in t)a(e,i,{get:t[i],enumerable:!0})},r=(e,t,i,l)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of w(t))!q.call(e,o)&&o!==i&&a(e,o,{get:()=>t[o],enumerable:!(l=g(t,o))||l.enumerable});return e},d=(e,t,i)=>(r(e,t,"default"),i&&r(i,t,"default")),s=(e,t,i)=>(i=e!=null?p(h(e)):{},r(t||!e||!e.__esModule?a(i,"default",{value:e,enumerable:!0}):i,e)),k=e=>r(a({},"__esModule",{value:!0}),e);var c=b((y,u)=>{var _=s(f("vs/editor/editor.api"));u.exports=_});var $={};T($,{conf:()=>x,language:()=>S});var n={};d(n,s(c()));var m=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"],x={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,brackets:[[""],["<",">"],["{{","}}"],["{%","%}"],["{","}"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"%",close:"%"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"<",close:">"},{open:'"',close:'"'},{open:"'",close:"'"}],onEnterRules:[{beforeText:new RegExp(`<(?!(?:${m.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),afterText:/^<\/(\w[\w\d]*)\s*>$/i,action:{indentAction:n.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp(`<(?!(?:${m.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),action:{indentAction:n.languages.IndentAction.Indent}}]},S={defaultToken:"",tokenPostfix:"",builtinTags:["if","else","elseif","endif","render","assign","capture","endcapture","case","endcase","comment","endcomment","cycle","decrement","for","endfor","include","increment","layout","raw","endraw","render","tablerow","endtablerow","unless","endunless"],builtinFilters:["abs","append","at_least","at_most","capitalize","ceil","compact","date","default","divided_by","downcase","escape","escape_once","first","floor","join","json","last","lstrip","map","minus","modulo","newline_to_br","plus","prepend","remove","remove_first","replace","replace_first","reverse","round","rstrip","size","slice","sort","sort_natural","split","strip","strip_html","strip_newlines","times","truncate","truncatewords","uniq","upcase","url_decode","url_encode","where"],constants:["true","false"],operators:["==","!=",">","<",">=","<="],symbol:/[=>)/,["delimiter.html","tag.html","delimiter.html"]],[/(<)([:\w]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/(<\/)([\w\-]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[//,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],liquidState:[[/\{\{/,"delimiter.output.liquid"],[/\}\}/,{token:"delimiter.output.liquid",switchTo:"@$S2.$S3"}],[/\{\%/,"delimiter.tag.liquid"],[/raw\s*\%\}/,"delimiter.tag.liquid","@liquidRaw"],[/\%\}/,{token:"delimiter.tag.liquid",switchTo:"@$S2.$S3"}],{include:"liquidRoot"}],liquidRaw:[[/^(?!\{\%\s*endraw\s*\%\}).+/],[/\{\%/,"delimiter.tag.liquid"],[/@identifier/],[/\%\}/,{token:"delimiter.tag.liquid",next:"@root"}]],liquidRoot:[[/\d+(\.\d+)?/,"number.liquid"],[/"[^"]*"/,"string.liquid"],[/'[^']*'/,"string.liquid"],[/\s+/],[/@symbol/,{cases:{"@operators":"operator.liquid","@default":""}}],[/\./],[/@identifier/,{cases:{"@constants":"keyword.liquid","@builtinFilters":"predefined.liquid","@builtinTags":"predefined.liquid","@default":"variable.liquid"}}],[/[^}|%]/,"variable.liquid"]]}};return k($);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/lua/lua.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/lua/lua.js deleted file mode 100644 index 004e02515b..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/lua/lua.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/lua/lua", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(o,e)=>{for(var t in e)s(o,t,{get:e[t],enumerable:!0})},m=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of i(e))!l.call(o,n)&&n!==t&&s(o,n,{get:()=>e[n],enumerable:!(r=a(e,n))||r.enumerable});return o};var p=o=>m(s({},"__esModule",{value:!0}),o);var u={};c(u,{conf:()=>d,language:()=>g});var d={comments:{lineComment:"--",blockComment:["--[[","]]"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},g={defaultToken:"",tokenPostfix:".lua",keywords:["and","break","do","else","elseif","end","false","for","function","goto","if","in","local","nil","not","or","repeat","return","then","true","until","while"],brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"}],operators:["+","-","*","/","%","^","#","==","~=","<=",">=","<",">","=",";",":",",",".","..","..."],symbols:/[=>{ -"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var R=(o,e)=>{for(var s in e)r(o,s,{get:e[s],enumerable:!0})},c=(o,e,s,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of a(e))!i.call(o,t)&&t!==s&&r(o,t,{get:()=>e[t],enumerable:!(n=E(e,t))||n.enumerable});return o};var m=o=>c(r({},"__esModule",{value:!0}),o);var N={};R(N,{conf:()=>A,language:()=>p});var A={comments:{blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"},{open:"(*",close:"*)"},{open:"<*",close:"*>"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}]},p={defaultToken:"",tokenPostfix:".m3",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:["AND","ANY","ARRAY","AS","BEGIN","BITS","BRANDED","BY","CASE","CONST","DIV","DO","ELSE","ELSIF","END","EVAL","EXCEPT","EXCEPTION","EXIT","EXPORTS","FINALLY","FOR","FROM","GENERIC","IF","IMPORT","IN","INTERFACE","LOCK","LOOP","METHODS","MOD","MODULE","NOT","OBJECT","OF","OR","OVERRIDES","PROCEDURE","RAISE","RAISES","READONLY","RECORD","REF","REPEAT","RETURN","REVEAL","SET","THEN","TO","TRY","TYPE","TYPECASE","UNSAFE","UNTIL","UNTRACED","VALUE","VAR","WHILE","WITH"],reservedConstNames:["ABS","ADR","ADRSIZE","BITSIZE","BYTESIZE","CEILING","DEC","DISPOSE","FALSE","FIRST","FLOAT","FLOOR","INC","ISTYPE","LAST","LOOPHOLE","MAX","MIN","NARROW","NEW","NIL","NUMBER","ORD","ROUND","SUBARRAY","TRUE","TRUNC","TYPECODE","VAL"],reservedTypeNames:["ADDRESS","ANY","BOOLEAN","CARDINAL","CHAR","EXTENDED","INTEGER","LONGCARD","LONGINT","LONGREAL","MUTEX","NULL","REAL","REFANY","ROOT","TEXT"],operators:["+","-","*","/","&","^","."],relations:["=","#","<","<=",">",">=","<:",":"],delimiters:["|","..","=>",",",";",":="],symbols:/[>=<#.,:;+\-*/&^]+/,escapes:/\\(?:[\\fnrt"']|[0-7]{3})/,tokenizer:{root:[[/_\w*/,"invalid"],[/[a-zA-Z][a-zA-Z0-9_]*/,{cases:{"@keywords":{token:"keyword.$0"},"@reservedConstNames":{token:"constant.reserved.$0"},"@reservedTypeNames":{token:"type.reserved.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[0-9]+\.[0-9]+(?:[DdEeXx][\+\-]?[0-9]+)?/,"number.float"],[/[0-9]+(?:\_[0-9a-fA-F]+)?L?/,"number"],[/@symbols/,{cases:{"@operators":"operators","@relations":"operators","@delimiters":"delimiter","@default":"invalid"}}],[/'[^\\']'/,"string.char"],[/(')(@escapes)(')/,["string.char","string.escape","string.char"]],[/'/,"invalid"],[/"([^"\\]|\\.)*$/,"invalid"],[/"/,"string.text","@text"]],text:[[/[^\\"]+/,"string.text"],[/@escapes/,"string.escape"],[/\\./,"invalid"],[/"/,"string.text","@pop"]],comment:[[/\(\*/,"comment","@push"],[/\*\)/,"comment","@pop"],[/./,"comment"]],pragma:[[/<\*/,"keyword.pragma","@push"],[/\*>/,"keyword.pragma","@pop"],[/./,"keyword.pragma"]],whitespace:[[/[ \t\r\n]+/,"white"],[/\(\*/,"comment","@comment"],[/<\*/,"keyword.pragma","@pragma"]]}};return m(N);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/markdown/markdown.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/markdown/markdown.js deleted file mode 100644 index b9edf51097..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/markdown/markdown.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/markdown/markdown", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var o in e)s(t,o,{get:e[o],enumerable:!0})},m=(t,e,o,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of c(e))!i.call(t,n)&&n!==o&&s(t,n,{get:()=>e[n],enumerable:!(a=r(e,n))||a.enumerable});return t};var d=t=>m(s({},"__esModule",{value:!0}),t);var b={};l(b,{conf:()=>p,language:()=>g});var p={comments:{blockComment:[""]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">",notIn:["string"]}],surroundingPairs:[{open:"(",close:")"},{open:"[",close:"]"},{open:"`",close:"`"}],folding:{markers:{start:new RegExp("^\\s*"),end:new RegExp("^\\s*")}}},g={defaultToken:"",tokenPostfix:".md",control:/[\\`*_\[\]{}()#+\-\.!]/,noncontrol:/[^\\`*_\[\]{}()#+\-\.!]/,escapes:/\\(?:@control)/,jsescapes:/\\(?:[btnfr\\"']|[0-7][0-7]?|[0-3][0-7]{2})/,empty:["area","base","basefont","br","col","frame","hr","img","input","isindex","link","meta","param"],tokenizer:{root:[[/^\s*\|/,"@rematch","@table_header"],[/^(\s{0,3})(#+)((?:[^\\#]|@escapes)+)((?:#+)?)/,["white","keyword","keyword","keyword"]],[/^\s*(=+|\-+)\s*$/,"keyword"],[/^\s*((\*[ ]?)+)\s*$/,"meta.separator"],[/^\s*>+/,"comment"],[/^\s*([\*\-+:]|\d+\.)\s/,"keyword"],[/^(\t|[ ]{4})[^ ].*$/,"string"],[/^\s*~~~\s*((?:\w|[\/\-#])+)?\s*$/,{token:"string",next:"@codeblock"}],[/^\s*```\s*((?:\w|[\/\-#])+).*$/,{token:"string",next:"@codeblockgh",nextEmbedded:"$1"}],[/^\s*```\s*$/,{token:"string",next:"@codeblock"}],{include:"@linecontent"}],table_header:[{include:"@table_common"},[/[^\|]+/,"keyword.table.header"]],table_body:[{include:"@table_common"},{include:"@linecontent"}],table_common:[[/\s*[\-:]+\s*/,{token:"keyword",switchTo:"table_body"}],[/^\s*\|/,"keyword.table.left"],[/^\s*[^\|]/,"@rematch","@pop"],[/^\s*$/,"@rematch","@pop"],[/\|/,{cases:{"@eos":"keyword.table.right","@default":"keyword.table.middle"}}]],codeblock:[[/^\s*~~~\s*$/,{token:"string",next:"@pop"}],[/^\s*```\s*$/,{token:"string",next:"@pop"}],[/.*$/,"variable.source"]],codeblockgh:[[/```\s*$/,{token:"string",next:"@pop",nextEmbedded:"@pop"}],[/[^`]+/,"variable.source"]],linecontent:[[/&\w+;/,"string.escape"],[/@escapes/,"escape"],[/\b__([^\\_]|@escapes|_(?!_))+__\b/,"strong"],[/\*\*([^\\*]|@escapes|\*(?!\*))+\*\*/,"strong"],[/\b_[^_]+_\b/,"emphasis"],[/\*([^\\*]|@escapes)+\*/,"emphasis"],[/`([^\\`]|@escapes)+`/,"variable"],[/\{+[^}]+\}+/,"string.target"],[/(!?\[)((?:[^\]\\]|@escapes)*)(\]\([^\)]+\))/,["string.link","","string.link"]],[/(!?\[)((?:[^\]\\]|@escapes)*)(\])/,"string.link"],{include:"html"}],html:[[/<(\w+)\/>/,"tag"],[/<(\w+)(\-|\w)*/,{cases:{"@empty":{token:"tag",next:"@tag.$1"},"@default":{token:"tag",next:"@tag.$1"}}}],[/<\/(\w+)(\-|\w)*\s*>/,{token:"tag"}],[//,"comment","@pop"],[//,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.otherTag"}],[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.script"}],[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.scriptAfterType"}],[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.scriptAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.scriptWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInEmbeddedState.scriptEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],style:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.style"}],[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.styleAfterType"}],[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.styleAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.styleWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInEmbeddedState.styleEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],phpInSimpleState:[[/<\?((php)|=)?/,"metatag.php"],[/\?>/,{token:"metatag.php",switchTo:"@$S2.$S3"}],{include:"phpRoot"}],phpInEmbeddedState:[[/<\?((php)|=)?/,"metatag.php"],[/\?>/,{token:"metatag.php",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}],{include:"phpRoot"}],phpRoot:[[/[a-zA-Z_]\w*/,{cases:{"@phpKeywords":{token:"keyword.php"},"@phpCompileTimeConstants":{token:"constant.php"},"@default":"identifier.php"}}],[/[$a-zA-Z_]\w*/,{cases:{"@phpPreDefinedVariables":{token:"variable.predefined.php"},"@default":"variable.php"}}],[/[{}]/,"delimiter.bracket.php"],[/[\[\]]/,"delimiter.array.php"],[/[()]/,"delimiter.parenthesis.php"],[/[ \t\r\n]+/],[/(#|\/\/)$/,"comment.php"],[/(#|\/\/)/,"comment.php","@phpLineComment"],[/\/\*/,"comment.php","@phpComment"],[/"/,"string.php","@phpDoubleQuoteString"],[/'/,"string.php","@phpSingleQuoteString"],[/[\+\-\*\%\&\|\^\~\!\=\<\>\/\?\;\:\.\,\@]/,"delimiter.php"],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float.php"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float.php"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F]/,"number.hex.php"],[/0[0-7']*[0-7]/,"number.octal.php"],[/0[bB][0-1']*[0-1]/,"number.binary.php"],[/\d[\d']*/,"number.php"],[/\d/,"number.php"]],phpComment:[[/\*\//,"comment.php","@pop"],[/[^*]+/,"comment.php"],[/./,"comment.php"]],phpLineComment:[[/\?>/,{token:"@rematch",next:"@pop"}],[/.$/,"comment.php","@pop"],[/[^?]+$/,"comment.php","@pop"],[/[^?]+/,"comment.php"],[/./,"comment.php"]],phpDoubleQuoteString:[[/[^\\"]+/,"string.php"],[/@escapes/,"string.escape.php"],[/\\./,"string.escape.invalid.php"],[/"/,"string.php","@pop"]],phpSingleQuoteString:[[/[^\\']+/,"string.php"],[/@escapes/,"string.escape.php"],[/\\./,"string.escape.invalid.php"],[/'/,"string.php","@pop"]]},phpKeywords:["abstract","and","array","as","break","callable","case","catch","cfunction","class","clone","const","continue","declare","default","do","else","elseif","enddeclare","endfor","endforeach","endif","endswitch","endwhile","extends","false","final","for","foreach","function","global","goto","if","implements","interface","instanceof","insteadof","namespace","new","null","object","old_function","or","private","protected","public","resource","static","switch","throw","trait","try","true","use","var","while","xor","die","echo","empty","exit","eval","include","include_once","isset","list","require","require_once","return","print","unset","yield","__construct"],phpCompileTimeConstants:["__CLASS__","__DIR__","__FILE__","__LINE__","__NAMESPACE__","__METHOD__","__FUNCTION__","__TRAIT__"],phpPreDefinedVariables:["$GLOBALS","$_SERVER","$_GET","$_POST","$_FILES","$_REQUEST","$_SESSION","$_ENV","$_COOKIE","$php_errormsg","$HTTP_RAW_POST_DATA","$http_response_header","$argc","$argv"],escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/};return l(u);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/pla/pla.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/pla/pla.js deleted file mode 100644 index 4ba2dbf757..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/pla/pla.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/pla/pla", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var l=(o,e)=>{for(var n in e)s(o,n,{get:e[n],enumerable:!0})},c=(o,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of r(e))!p.call(o,t)&&t!==n&&s(o,t,{get:()=>e[t],enumerable:!(i=a(e,t))||i.enumerable});return o};var d=o=>c(s({},"__esModule",{value:!0}),o);var u={};l(u,{conf:()=>k,language:()=>m});var k={comments:{lineComment:"#"},brackets:[["[","]"],["<",">"],["(",")"]],autoClosingPairs:[{open:"[",close:"]"},{open:"<",close:">"},{open:"(",close:")"}],surroundingPairs:[{open:"[",close:"]"},{open:"<",close:">"},{open:"(",close:")"}]},m={defaultToken:"",tokenPostfix:".pla",brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"<",close:">",token:"delimiter.angle"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:[".i",".o",".mv",".ilb",".ob",".label",".type",".phase",".pair",".symbolic",".symbolic-output",".kiss",".p",".e",".end"],comment:/#.*$/,identifier:/[a-zA-Z]+[a-zA-Z0-9_\-]*/,plaContent:/[01\-~\|]+/,tokenizer:{root:[{include:"@whitespace"},[/@comment/,"comment"],[/\.([a-zA-Z_\-]+)/,{cases:{"@eos":{token:"keyword.$1"},"@keywords":{cases:{".type":{token:"keyword.$1",next:"@type"},"@default":{token:"keyword.$1",next:"@keywordArg"}}},"@default":{token:"keyword.$1"}}}],[/@identifier/,"identifier"],[/@plaContent/,"string"]],whitespace:[[/[ \t\r\n]+/,""]],type:[{include:"@whitespace"},[/\w+/,{token:"type",next:"@pop"}]],keywordArg:[[/[ \t\r\n]+/,{cases:{"@eos":{token:"",next:"@pop"},"@default":""}}],[/@comment/,"comment","@pop"],[/[<>()\[\]]/,{cases:{"@eos":{token:"@brackets",next:"@pop"},"@default":"@brackets"}}],[/\-?\d+/,{cases:{"@eos":{token:"number",next:"@pop"},"@default":"number"}}],[/@identifier/,{cases:{"@eos":{token:"identifier",next:"@pop"},"@default":"identifier"}}],[/[;=]/,{cases:{"@eos":{token:"delimiter",next:"@pop"},"@default":"delimiter"}}]]}};return d(u);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/postiats/postiats.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/postiats/postiats.js deleted file mode 100644 index 9e846e5dd2..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/postiats/postiats.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/postiats/postiats", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var i=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var p=(t,e)=>{for(var o in e)i(t,o,{get:e[o],enumerable:!0})},l=(t,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of s(e))!c.call(t,n)&&n!==o&&i(t,n,{get:()=>e[n],enumerable:!(r=a(e,n))||r.enumerable});return t};var d=t=>l(i({},"__esModule",{value:!0}),t);var g={};p(g,{conf:()=>m,language:()=>x});var m={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}]},x={tokenPostfix:".pats",defaultToken:"invalid",keywords:["abstype","abst0ype","absprop","absview","absvtype","absviewtype","absvt0ype","absviewt0ype","as","and","assume","begin","classdec","datasort","datatype","dataprop","dataview","datavtype","dataviewtype","do","end","extern","extype","extvar","exception","fn","fnx","fun","prfn","prfun","praxi","castfn","if","then","else","ifcase","in","infix","infixl","infixr","prefix","postfix","implmnt","implement","primplmnt","primplement","import","let","local","macdef","macrodef","nonfix","symelim","symintr","overload","of","op","rec","sif","scase","sortdef","sta","stacst","stadef","static","staload","dynload","try","tkindef","typedef","propdef","viewdef","vtypedef","viewtypedef","prval","var","prvar","when","where","with","withtype","withprop","withview","withvtype","withviewtype"],keywords_dlr:["$delay","$ldelay","$arrpsz","$arrptrsize","$d2ctype","$effmask","$effmask_ntm","$effmask_exn","$effmask_ref","$effmask_wrt","$effmask_all","$extern","$extkind","$extype","$extype_struct","$extval","$extfcall","$extmcall","$literal","$myfilename","$mylocation","$myfunction","$lst","$lst_t","$lst_vt","$list","$list_t","$list_vt","$rec","$rec_t","$rec_vt","$record","$record_t","$record_vt","$tup","$tup_t","$tup_vt","$tuple","$tuple_t","$tuple_vt","$break","$continue","$raise","$showtype","$vcopyenv_v","$vcopyenv_vt","$tempenver","$solver_assert","$solver_verify"],keywords_srp:["#if","#ifdef","#ifndef","#then","#elif","#elifdef","#elifndef","#else","#endif","#error","#prerr","#print","#assert","#undef","#define","#include","#require","#pragma","#codegen2","#codegen3"],irregular_keyword_list:["val+","val-","val","case+","case-","case","addr@","addr","fold@","free@","fix@","fix","lam@","lam","llam@","llam","viewt@ype+","viewt@ype-","viewt@ype","viewtype+","viewtype-","viewtype","view+","view-","view@","view","type+","type-","type","vtype+","vtype-","vtype","vt@ype+","vt@ype-","vt@ype","viewt@ype+","viewt@ype-","viewt@ype","viewtype+","viewtype-","viewtype","prop+","prop-","prop","type+","type-","type","t@ype","t@ype+","t@ype-","abst@ype","abstype","absviewt@ype","absvt@ype","for*","for","while*","while"],keywords_types:["bool","double","byte","int","short","char","void","unit","long","float","string","strptr"],keywords_effects:["0","fun","clo","prf","funclo","cloptr","cloref","ref","ntm","1"],operators:["@","!","|","`",":","$",".","=","#","~","..","...","=>","=<>","=/=>","=>>","=/=>>","<",">","><",".<",">.",".<>.","->","-<>"],brackets:[{open:",(",close:")",token:"delimiter.parenthesis"},{open:"`(",close:")",token:"delimiter.parenthesis"},{open:"%(",close:")",token:"delimiter.parenthesis"},{open:"'(",close:")",token:"delimiter.parenthesis"},{open:"'{",close:"}",token:"delimiter.parenthesis"},{open:"@(",close:")",token:"delimiter.parenthesis"},{open:"@{",close:"}",token:"delimiter.brace"},{open:"@[",close:"]",token:"delimiter.square"},{open:"#[",close:"]",token:"delimiter.square"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],symbols:/[=>]/,digit:/[0-9]/,digitseq0:/@digit*/,xdigit:/[0-9A-Za-z]/,xdigitseq0:/@xdigit*/,INTSP:/[lLuU]/,FLOATSP:/[fFlL]/,fexponent:/[eE][+-]?[0-9]+/,fexponent_bin:/[pP][+-]?[0-9]+/,deciexp:/\.[0-9]*@fexponent?/,hexiexp:/\.[0-9a-zA-Z]*@fexponent_bin?/,irregular_keywords:/val[+-]?|case[+-]?|addr\@?|fold\@|free\@|fix\@?|lam\@?|llam\@?|prop[+-]?|type[+-]?|view[+-@]?|viewt@?ype[+-]?|t@?ype[+-]?|v(iew)?t@?ype[+-]?|abst@?ype|absv(iew)?t@?ype|for\*?|while\*?/,ESCHAR:/[ntvbrfa\\\?'"\(\[\{]/,start:"root",tokenizer:{root:[{regex:/[ \t\r\n]+/,action:{token:""}},{regex:/\(\*\)/,action:{token:"invalid"}},{regex:/\(\*/,action:{token:"comment",next:"lexing_COMMENT_block_ml"}},{regex:/\(/,action:"@brackets"},{regex:/\)/,action:"@brackets"},{regex:/\[/,action:"@brackets"},{regex:/\]/,action:"@brackets"},{regex:/\{/,action:"@brackets"},{regex:/\}/,action:"@brackets"},{regex:/,\(/,action:"@brackets"},{regex:/,/,action:{token:"delimiter.comma"}},{regex:/;/,action:{token:"delimiter.semicolon"}},{regex:/@\(/,action:"@brackets"},{regex:/@\[/,action:"@brackets"},{regex:/@\{/,action:"@brackets"},{regex:/:/,action:{token:"@rematch",next:"@pop"}}],lexing_EXTCODE:[{regex:/^%}/,action:{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}},{regex:/[^%]+/,action:""}],lexing_DQUOTE:[{regex:/"/,action:{token:"string.quote",next:"@pop"}},{regex:/(\{\$)(@IDENTFST@IDENTRST*)(\})/,action:[{token:"string.escape"},{token:"identifier"},{token:"string.escape"}]},{regex:/\\$/,action:{token:"string.escape"}},{regex:/\\(@ESCHAR|[xX]@xdigit+|@digit+)/,action:{token:"string.escape"}},{regex:/[^\\"]+/,action:{token:"string"}}]}};return d(g);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/powerquery/powerquery.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/powerquery/powerquery.js deleted file mode 100644 index 83f84cf568..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/powerquery/powerquery.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/powerquery/powerquery", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var i=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var T=(t,e)=>{for(var n in e)i(t,n,{get:e[n],enumerable:!0})},m=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of s(e))!l.call(t,a)&&a!==n&&i(t,a,{get:()=>e[a],enumerable:!(o=r(e,a))||o.enumerable});return t};var u=t=>m(i({},"__esModule",{value:!0}),t);var b={};T(b,{conf:()=>d,language:()=>c});var d={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["[","]"],["(",")"],["{","}"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment","identifier"]},{open:"[",close:"]",notIn:["string","comment","identifier"]},{open:"(",close:")",notIn:["string","comment","identifier"]},{open:"{",close:"}",notIn:["string","comment","identifier"]}]},c={defaultToken:"",tokenPostfix:".pq",ignoreCase:!1,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"{",close:"}",token:"delimiter.brackets"},{open:"(",close:")",token:"delimiter.parenthesis"}],operatorKeywords:["and","not","or"],keywords:["as","each","else","error","false","if","in","is","let","meta","otherwise","section","shared","then","true","try","type"],constructors:["#binary","#date","#datetime","#datetimezone","#duration","#table","#time"],constants:["#infinity","#nan","#sections","#shared"],typeKeywords:["action","any","anynonnull","none","null","logical","number","time","date","datetime","datetimezone","duration","text","binary","list","record","table","function"],builtinFunctions:["Access.Database","Action.Return","Action.Sequence","Action.Try","ActiveDirectory.Domains","AdoDotNet.DataSource","AdoDotNet.Query","AdobeAnalytics.Cubes","AnalysisServices.Database","AnalysisServices.Databases","AzureStorage.BlobContents","AzureStorage.Blobs","AzureStorage.Tables","Binary.Buffer","Binary.Combine","Binary.Compress","Binary.Decompress","Binary.End","Binary.From","Binary.FromList","Binary.FromText","Binary.InferContentType","Binary.Length","Binary.ToList","Binary.ToText","BinaryFormat.7BitEncodedSignedInteger","BinaryFormat.7BitEncodedUnsignedInteger","BinaryFormat.Binary","BinaryFormat.Byte","BinaryFormat.ByteOrder","BinaryFormat.Choice","BinaryFormat.Decimal","BinaryFormat.Double","BinaryFormat.Group","BinaryFormat.Length","BinaryFormat.List","BinaryFormat.Null","BinaryFormat.Record","BinaryFormat.SignedInteger16","BinaryFormat.SignedInteger32","BinaryFormat.SignedInteger64","BinaryFormat.Single","BinaryFormat.Text","BinaryFormat.Transform","BinaryFormat.UnsignedInteger16","BinaryFormat.UnsignedInteger32","BinaryFormat.UnsignedInteger64","Byte.From","Character.FromNumber","Character.ToNumber","Combiner.CombineTextByDelimiter","Combiner.CombineTextByEachDelimiter","Combiner.CombineTextByLengths","Combiner.CombineTextByPositions","Combiner.CombineTextByRanges","Comparer.Equals","Comparer.FromCulture","Comparer.Ordinal","Comparer.OrdinalIgnoreCase","Csv.Document","Cube.AddAndExpandDimensionColumn","Cube.AddMeasureColumn","Cube.ApplyParameter","Cube.AttributeMemberId","Cube.AttributeMemberProperty","Cube.CollapseAndRemoveColumns","Cube.Dimensions","Cube.DisplayFolders","Cube.Measures","Cube.Parameters","Cube.Properties","Cube.PropertyKey","Cube.ReplaceDimensions","Cube.Transform","Currency.From","DB2.Database","Date.AddDays","Date.AddMonths","Date.AddQuarters","Date.AddWeeks","Date.AddYears","Date.Day","Date.DayOfWeek","Date.DayOfWeekName","Date.DayOfYear","Date.DaysInMonth","Date.EndOfDay","Date.EndOfMonth","Date.EndOfQuarter","Date.EndOfWeek","Date.EndOfYear","Date.From","Date.FromText","Date.IsInCurrentDay","Date.IsInCurrentMonth","Date.IsInCurrentQuarter","Date.IsInCurrentWeek","Date.IsInCurrentYear","Date.IsInNextDay","Date.IsInNextMonth","Date.IsInNextNDays","Date.IsInNextNMonths","Date.IsInNextNQuarters","Date.IsInNextNWeeks","Date.IsInNextNYears","Date.IsInNextQuarter","Date.IsInNextWeek","Date.IsInNextYear","Date.IsInPreviousDay","Date.IsInPreviousMonth","Date.IsInPreviousNDays","Date.IsInPreviousNMonths","Date.IsInPreviousNQuarters","Date.IsInPreviousNWeeks","Date.IsInPreviousNYears","Date.IsInPreviousQuarter","Date.IsInPreviousWeek","Date.IsInPreviousYear","Date.IsInYearToDate","Date.IsLeapYear","Date.Month","Date.MonthName","Date.QuarterOfYear","Date.StartOfDay","Date.StartOfMonth","Date.StartOfQuarter","Date.StartOfWeek","Date.StartOfYear","Date.ToRecord","Date.ToText","Date.WeekOfMonth","Date.WeekOfYear","Date.Year","DateTime.AddZone","DateTime.Date","DateTime.FixedLocalNow","DateTime.From","DateTime.FromFileTime","DateTime.FromText","DateTime.IsInCurrentHour","DateTime.IsInCurrentMinute","DateTime.IsInCurrentSecond","DateTime.IsInNextHour","DateTime.IsInNextMinute","DateTime.IsInNextNHours","DateTime.IsInNextNMinutes","DateTime.IsInNextNSeconds","DateTime.IsInNextSecond","DateTime.IsInPreviousHour","DateTime.IsInPreviousMinute","DateTime.IsInPreviousNHours","DateTime.IsInPreviousNMinutes","DateTime.IsInPreviousNSeconds","DateTime.IsInPreviousSecond","DateTime.LocalNow","DateTime.Time","DateTime.ToRecord","DateTime.ToText","DateTimeZone.FixedLocalNow","DateTimeZone.FixedUtcNow","DateTimeZone.From","DateTimeZone.FromFileTime","DateTimeZone.FromText","DateTimeZone.LocalNow","DateTimeZone.RemoveZone","DateTimeZone.SwitchZone","DateTimeZone.ToLocal","DateTimeZone.ToRecord","DateTimeZone.ToText","DateTimeZone.ToUtc","DateTimeZone.UtcNow","DateTimeZone.ZoneHours","DateTimeZone.ZoneMinutes","Decimal.From","Diagnostics.ActivityId","Diagnostics.Trace","DirectQueryCapabilities.From","Double.From","Duration.Days","Duration.From","Duration.FromText","Duration.Hours","Duration.Minutes","Duration.Seconds","Duration.ToRecord","Duration.ToText","Duration.TotalDays","Duration.TotalHours","Duration.TotalMinutes","Duration.TotalSeconds","Embedded.Value","Error.Record","Excel.CurrentWorkbook","Excel.Workbook","Exchange.Contents","Expression.Constant","Expression.Evaluate","Expression.Identifier","Facebook.Graph","File.Contents","Folder.Contents","Folder.Files","Function.From","Function.Invoke","Function.InvokeAfter","Function.IsDataSource","GoogleAnalytics.Accounts","Guid.From","HdInsight.Containers","HdInsight.Contents","HdInsight.Files","Hdfs.Contents","Hdfs.Files","Informix.Database","Int16.From","Int32.From","Int64.From","Int8.From","ItemExpression.From","Json.Document","Json.FromValue","Lines.FromBinary","Lines.FromText","Lines.ToBinary","Lines.ToText","List.Accumulate","List.AllTrue","List.Alternate","List.AnyTrue","List.Average","List.Buffer","List.Combine","List.Contains","List.ContainsAll","List.ContainsAny","List.Count","List.Covariance","List.DateTimeZones","List.DateTimes","List.Dates","List.Difference","List.Distinct","List.Durations","List.FindText","List.First","List.FirstN","List.Generate","List.InsertRange","List.Intersect","List.IsDistinct","List.IsEmpty","List.Last","List.LastN","List.MatchesAll","List.MatchesAny","List.Max","List.MaxN","List.Median","List.Min","List.MinN","List.Mode","List.Modes","List.NonNullCount","List.Numbers","List.PositionOf","List.PositionOfAny","List.Positions","List.Product","List.Random","List.Range","List.RemoveFirstN","List.RemoveItems","List.RemoveLastN","List.RemoveMatchingItems","List.RemoveNulls","List.RemoveRange","List.Repeat","List.ReplaceMatchingItems","List.ReplaceRange","List.ReplaceValue","List.Reverse","List.Select","List.Single","List.SingleOrDefault","List.Skip","List.Sort","List.StandardDeviation","List.Sum","List.Times","List.Transform","List.TransformMany","List.Union","List.Zip","Logical.From","Logical.FromText","Logical.ToText","MQ.Queue","MySQL.Database","Number.Abs","Number.Acos","Number.Asin","Number.Atan","Number.Atan2","Number.BitwiseAnd","Number.BitwiseNot","Number.BitwiseOr","Number.BitwiseShiftLeft","Number.BitwiseShiftRight","Number.BitwiseXor","Number.Combinations","Number.Cos","Number.Cosh","Number.Exp","Number.Factorial","Number.From","Number.FromText","Number.IntegerDivide","Number.IsEven","Number.IsNaN","Number.IsOdd","Number.Ln","Number.Log","Number.Log10","Number.Mod","Number.Permutations","Number.Power","Number.Random","Number.RandomBetween","Number.Round","Number.RoundAwayFromZero","Number.RoundDown","Number.RoundTowardZero","Number.RoundUp","Number.Sign","Number.Sin","Number.Sinh","Number.Sqrt","Number.Tan","Number.Tanh","Number.ToText","OData.Feed","Odbc.DataSource","Odbc.Query","OleDb.DataSource","OleDb.Query","Oracle.Database","Percentage.From","PostgreSQL.Database","RData.FromBinary","Record.AddField","Record.Combine","Record.Field","Record.FieldCount","Record.FieldNames","Record.FieldOrDefault","Record.FieldValues","Record.FromList","Record.FromTable","Record.HasFields","Record.RemoveFields","Record.RenameFields","Record.ReorderFields","Record.SelectFields","Record.ToList","Record.ToTable","Record.TransformFields","Replacer.ReplaceText","Replacer.ReplaceValue","RowExpression.Column","RowExpression.From","Salesforce.Data","Salesforce.Reports","SapBusinessWarehouse.Cubes","SapHana.Database","SharePoint.Contents","SharePoint.Files","SharePoint.Tables","Single.From","Soda.Feed","Splitter.SplitByNothing","Splitter.SplitTextByAnyDelimiter","Splitter.SplitTextByDelimiter","Splitter.SplitTextByEachDelimiter","Splitter.SplitTextByLengths","Splitter.SplitTextByPositions","Splitter.SplitTextByRanges","Splitter.SplitTextByRepeatedLengths","Splitter.SplitTextByWhitespace","Sql.Database","Sql.Databases","SqlExpression.SchemaFrom","SqlExpression.ToExpression","Sybase.Database","Table.AddColumn","Table.AddIndexColumn","Table.AddJoinColumn","Table.AddKey","Table.AggregateTableColumn","Table.AlternateRows","Table.Buffer","Table.Column","Table.ColumnCount","Table.ColumnNames","Table.ColumnsOfType","Table.Combine","Table.CombineColumns","Table.Contains","Table.ContainsAll","Table.ContainsAny","Table.DemoteHeaders","Table.Distinct","Table.DuplicateColumn","Table.ExpandListColumn","Table.ExpandRecordColumn","Table.ExpandTableColumn","Table.FillDown","Table.FillUp","Table.FilterWithDataTable","Table.FindText","Table.First","Table.FirstN","Table.FirstValue","Table.FromColumns","Table.FromList","Table.FromPartitions","Table.FromRecords","Table.FromRows","Table.FromValue","Table.Group","Table.HasColumns","Table.InsertRows","Table.IsDistinct","Table.IsEmpty","Table.Join","Table.Keys","Table.Last","Table.LastN","Table.MatchesAllRows","Table.MatchesAnyRows","Table.Max","Table.MaxN","Table.Min","Table.MinN","Table.NestedJoin","Table.Partition","Table.PartitionValues","Table.Pivot","Table.PositionOf","Table.PositionOfAny","Table.PrefixColumns","Table.Profile","Table.PromoteHeaders","Table.Range","Table.RemoveColumns","Table.RemoveFirstN","Table.RemoveLastN","Table.RemoveMatchingRows","Table.RemoveRows","Table.RemoveRowsWithErrors","Table.RenameColumns","Table.ReorderColumns","Table.Repeat","Table.ReplaceErrorValues","Table.ReplaceKeys","Table.ReplaceMatchingRows","Table.ReplaceRelationshipIdentity","Table.ReplaceRows","Table.ReplaceValue","Table.ReverseRows","Table.RowCount","Table.Schema","Table.SelectColumns","Table.SelectRows","Table.SelectRowsWithErrors","Table.SingleRow","Table.Skip","Table.Sort","Table.SplitColumn","Table.ToColumns","Table.ToList","Table.ToRecords","Table.ToRows","Table.TransformColumnNames","Table.TransformColumnTypes","Table.TransformColumns","Table.TransformRows","Table.Transpose","Table.Unpivot","Table.UnpivotOtherColumns","Table.View","Table.ViewFunction","TableAction.DeleteRows","TableAction.InsertRows","TableAction.UpdateRows","Tables.GetRelationships","Teradata.Database","Text.AfterDelimiter","Text.At","Text.BeforeDelimiter","Text.BetweenDelimiters","Text.Clean","Text.Combine","Text.Contains","Text.End","Text.EndsWith","Text.Format","Text.From","Text.FromBinary","Text.Insert","Text.Length","Text.Lower","Text.Middle","Text.NewGuid","Text.PadEnd","Text.PadStart","Text.PositionOf","Text.PositionOfAny","Text.Proper","Text.Range","Text.Remove","Text.RemoveRange","Text.Repeat","Text.Replace","Text.ReplaceRange","Text.Select","Text.Split","Text.SplitAny","Text.Start","Text.StartsWith","Text.ToBinary","Text.ToList","Text.Trim","Text.TrimEnd","Text.TrimStart","Text.Upper","Time.EndOfHour","Time.From","Time.FromText","Time.Hour","Time.Minute","Time.Second","Time.StartOfHour","Time.ToRecord","Time.ToText","Type.AddTableKey","Type.ClosedRecord","Type.Facets","Type.ForFunction","Type.ForRecord","Type.FunctionParameters","Type.FunctionRequiredParameters","Type.FunctionReturn","Type.Is","Type.IsNullable","Type.IsOpenRecord","Type.ListItem","Type.NonNullable","Type.OpenRecord","Type.RecordFields","Type.ReplaceFacets","Type.ReplaceTableKeys","Type.TableColumn","Type.TableKeys","Type.TableRow","Type.TableSchema","Type.Union","Uri.BuildQueryString","Uri.Combine","Uri.EscapeDataString","Uri.Parts","Value.Add","Value.As","Value.Compare","Value.Divide","Value.Equals","Value.Firewall","Value.FromText","Value.Is","Value.Metadata","Value.Multiply","Value.NativeQuery","Value.NullableEquals","Value.RemoveMetadata","Value.ReplaceMetadata","Value.ReplaceType","Value.Subtract","Value.Type","ValueAction.NativeStatement","ValueAction.Replace","Variable.Value","Web.Contents","Web.Page","WebAction.Request","Xml.Document","Xml.Tables"],builtinConstants:["BinaryEncoding.Base64","BinaryEncoding.Hex","BinaryOccurrence.Optional","BinaryOccurrence.Repeating","BinaryOccurrence.Required","ByteOrder.BigEndian","ByteOrder.LittleEndian","Compression.Deflate","Compression.GZip","CsvStyle.QuoteAfterDelimiter","CsvStyle.QuoteAlways","Culture.Current","Day.Friday","Day.Monday","Day.Saturday","Day.Sunday","Day.Thursday","Day.Tuesday","Day.Wednesday","ExtraValues.Error","ExtraValues.Ignore","ExtraValues.List","GroupKind.Global","GroupKind.Local","JoinAlgorithm.Dynamic","JoinAlgorithm.LeftHash","JoinAlgorithm.LeftIndex","JoinAlgorithm.PairwiseHash","JoinAlgorithm.RightHash","JoinAlgorithm.RightIndex","JoinAlgorithm.SortMerge","JoinKind.FullOuter","JoinKind.Inner","JoinKind.LeftAnti","JoinKind.LeftOuter","JoinKind.RightAnti","JoinKind.RightOuter","JoinSide.Left","JoinSide.Right","MissingField.Error","MissingField.Ignore","MissingField.UseNull","Number.E","Number.Epsilon","Number.NaN","Number.NegativeInfinity","Number.PI","Number.PositiveInfinity","Occurrence.All","Occurrence.First","Occurrence.Last","Occurrence.Optional","Occurrence.Repeating","Occurrence.Required","Order.Ascending","Order.Descending","Precision.Decimal","Precision.Double","QuoteStyle.Csv","QuoteStyle.None","RelativePosition.FromEnd","RelativePosition.FromStart","RoundingMode.AwayFromZero","RoundingMode.Down","RoundingMode.ToEven","RoundingMode.TowardZero","RoundingMode.Up","SapHanaDistribution.All","SapHanaDistribution.Connection","SapHanaDistribution.Off","SapHanaDistribution.Statement","SapHanaRangeOperator.Equals","SapHanaRangeOperator.GreaterThan","SapHanaRangeOperator.GreaterThanOrEquals","SapHanaRangeOperator.LessThan","SapHanaRangeOperator.LessThanOrEquals","SapHanaRangeOperator.NotEquals","TextEncoding.Ascii","TextEncoding.BigEndianUnicode","TextEncoding.Unicode","TextEncoding.Utf16","TextEncoding.Utf8","TextEncoding.Windows","TraceLevel.Critical","TraceLevel.Error","TraceLevel.Information","TraceLevel.Verbose","TraceLevel.Warning","WebMethod.Delete","WebMethod.Get","WebMethod.Head","WebMethod.Patch","WebMethod.Post","WebMethod.Put"],builtinTypes:["Action.Type","Any.Type","Binary.Type","BinaryEncoding.Type","BinaryOccurrence.Type","Byte.Type","ByteOrder.Type","Character.Type","Compression.Type","CsvStyle.Type","Currency.Type","Date.Type","DateTime.Type","DateTimeZone.Type","Day.Type","Decimal.Type","Double.Type","Duration.Type","ExtraValues.Type","Function.Type","GroupKind.Type","Guid.Type","Int16.Type","Int32.Type","Int64.Type","Int8.Type","JoinAlgorithm.Type","JoinKind.Type","JoinSide.Type","List.Type","Logical.Type","MissingField.Type","None.Type","Null.Type","Number.Type","Occurrence.Type","Order.Type","Password.Type","Percentage.Type","Precision.Type","QuoteStyle.Type","Record.Type","RelativePosition.Type","RoundingMode.Type","SapHanaDistribution.Type","SapHanaRangeOperator.Type","Single.Type","Table.Type","Text.Type","TextEncoding.Type","Time.Type","TraceLevel.Type","Type.Type","Uri.Type","WebMethod.Type"],tokenizer:{root:[[/#"[\w \.]+"/,"identifier.quote"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F]+/,"number.hex"],[/\d+([eE][\-+]?\d+)?/,"number"],[/(#?[a-z]+)\b/,{cases:{"@typeKeywords":"type","@keywords":"keyword","@constants":"constant","@constructors":"constructor","@operatorKeywords":"operators","@default":"identifier"}}],[/\b([A-Z][a-zA-Z0-9]+\.Type)\b/,{cases:{"@builtinTypes":"type","@default":"identifier"}}],[/\b([A-Z][a-zA-Z0-9]+\.[A-Z][a-zA-Z0-9]+)\b/,{cases:{"@builtinFunctions":"keyword.function","@builtinConstants":"constant","@default":"identifier"}}],[/\b([a-zA-Z_][\w\.]*)\b/,"identifier"],{include:"@whitespace"},{include:"@comments"},{include:"@strings"},[/[{}()\[\]]/,"@brackets"],[/([=\+<>\-\*&@\?\/!])|([<>]=)|(<>)|(=>)|(\.\.\.)|(\.\.)/,"operators"],[/[,;]/,"delimiter"]],whitespace:[[/\s+/,"white"]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[".","comment"]],strings:[['"',"string","@string"]],string:[['""',"string.escape"],['"',"string","@pop"],[".","string"]]}};return u(b);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/powershell/powershell.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/powershell/powershell.js deleted file mode 100644 index 1109d73937..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/powershell/powershell.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/powershell/powershell", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var o=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(n,e)=>{for(var t in e)o(n,t,{get:e[t],enumerable:!0})},g=(n,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of i(e))!l.call(n,s)&&s!==t&&o(n,s,{get:()=>e[s],enumerable:!(a=r(e,s))||a.enumerable});return n};var p=n=>g(o({},"__esModule",{value:!0}),n);var u={};c(u,{conf:()=>d,language:()=>m});var d={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#%\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"#",blockComment:["<#","#>"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*#region\\b"),end:new RegExp("^\\s*#endregion\\b")}}},m={defaultToken:"",ignoreCase:!0,tokenPostfix:".ps1",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"}],keywords:["begin","break","catch","class","continue","data","define","do","dynamicparam","else","elseif","end","exit","filter","finally","for","foreach","from","function","if","in","param","process","return","switch","throw","trap","try","until","using","var","while","workflow","parallel","sequence","inlinescript","configuration"],helpKeywords:/SYNOPSIS|DESCRIPTION|PARAMETER|EXAMPLE|INPUTS|OUTPUTS|NOTES|LINK|COMPONENT|ROLE|FUNCTIONALITY|FORWARDHELPTARGETNAME|FORWARDHELPCATEGORY|REMOTEHELPRUNSPACE|EXTERNALHELP/,symbols:/[=>/,"comment","@pop"],[/(\.)(@helpKeywords)(?!\w)/,{token:"comment.keyword.$2"}],[/[\.#]/,"comment"]]}};return p(u);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/protobuf/protobuf.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/protobuf/protobuf.js deleted file mode 100644 index 74580ff30e..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/protobuf/protobuf.js +++ /dev/null @@ -1,11 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/protobuf/protobuf", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var o=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var p=(t,e)=>{for(var i in e)o(t,i,{get:e[i],enumerable:!0})},d=(t,e,i,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of c(e))!a.call(t,n)&&n!==i&&o(t,n,{get:()=>e[n],enumerable:!(s=r(e,n))||s.enumerable});return t};var l=t=>d(o({},"__esModule",{value:!0}),t);var m={};p(m,{conf:()=>u,language:()=>f});var k=["true","false"],u={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:'"',close:'"'},{open:"'",close:"'"}],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string"]}],autoCloseBefore:`.,=}])>' - `,indentationRules:{increaseIndentPattern:new RegExp("^((?!\\/\\/).)*(\\{[^}\"'`]*|\\([^)\"'`]*|\\[[^\\]\"'`]*)$"),decreaseIndentPattern:new RegExp("^((?!.*?\\/\\*).*\\*/)?\\s*[\\}\\]].*$")}},f={defaultToken:"",tokenPostfix:".proto",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],symbols:/[=>/,{token:"@brackets",bracket:"@close",switchTo:"identifier"}]],field:[{include:"@whitespace"},["group",{cases:{"$S2==proto2":{token:"keyword",switchTo:"@groupDecl.$S2"}}}],[/(@identifier)(\s*)(=)/,["identifier","white",{token:"delimiter",next:"@pop"}]],[/@fullIdentifier|\./,{cases:{"@builtinTypes":"keyword","@default":"type.identifier"}}]],groupDecl:[{include:"@whitespace"},[/@identifier/,"identifier"],["=","operator"],[/{/,{token:"@brackets",bracket:"@open",switchTo:"@messageBody.$S2"}],{include:"@constant"}],type:[{include:"@whitespace"},[/@identifier/,"type.identifier","@pop"],[/./,"delimiter"]],identifier:[{include:"@whitespace"},[/@identifier/,"identifier","@pop"]],serviceDecl:[{include:"@whitespace"},[/@identifier/,"identifier"],[/{/,{token:"@brackets",bracket:"@open",switchTo:"@serviceBody.$S2"}]],serviceBody:[{include:"@whitespace"},{include:"@constant"},[/;/,"delimiter"],[/option\b/,"keyword","@option.$S2"],[/rpc\b/,"keyword","@rpc.$S2"],[/\[/,{token:"@brackets",bracket:"@open",next:"@options.$S2"}],[/}/,{token:"@brackets",bracket:"@close",next:"@pop"}]],rpc:[{include:"@whitespace"},[/@identifier/,"identifier"],[/\(/,{token:"@brackets",bracket:"@open",switchTo:"@request.$S2"}],[/{/,{token:"@brackets",bracket:"@open",next:"@methodOptions.$S2"}],[/;/,"delimiter","@pop"]],request:[{include:"@whitespace"},[/@messageType/,{cases:{stream:{token:"keyword",next:"@type.$S2"},"@default":"type.identifier"}}],[/\)/,{token:"@brackets",bracket:"@close",switchTo:"@returns.$S2"}]],returns:[{include:"@whitespace"},[/returns\b/,"keyword"],[/\(/,{token:"@brackets",bracket:"@open",switchTo:"@response.$S2"}]],response:[{include:"@whitespace"},[/@messageType/,{cases:{stream:{token:"keyword",next:"@type.$S2"},"@default":"type.identifier"}}],[/\)/,{token:"@brackets",bracket:"@close",switchTo:"@rpc.$S2"}]],methodOptions:[{include:"@whitespace"},{include:"@constant"},[/;/,"delimiter"],["option","keyword"],[/@optionName/,"annotation"],[/[()]/,"annotation.brackets"],[/=/,"operator"],[/}/,{token:"@brackets",bracket:"@close",next:"@pop"}]],comment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@push"],["\\*/","comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",bracket:"@close",next:"@pop"}]],stringSingle:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,{token:"string.quote",bracket:"@close",next:"@pop"}]],constant:[["@boolLit","keyword.constant"],["@hexLit","number.hex"],["@octalLit","number.octal"],["@decimalLit","number"],["@floatLit","number.float"],[/("([^"\\]|\\.)*|'([^'\\]|\\.)*)$/,"string.invalid"],[/"/,{token:"string.quote",bracket:"@open",next:"@string"}],[/'/,{token:"string.quote",bracket:"@open",next:"@stringSingle"}],[/{/,{token:"@brackets",bracket:"@open",next:"@prototext"}],[/identifier/,"identifier"]],whitespace:[[/[ \t\r\n]+/,"white"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],prototext:[{include:"@whitespace"},{include:"@constant"},[/@identifier/,"identifier"],[/[:;]/,"delimiter"],[/}/,{token:"@brackets",bracket:"@close",next:"@pop"}]]}};return l(m);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/pug/pug.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/pug/pug.js deleted file mode 100644 index 798bd16d6f..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/pug/pug.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/pug/pug", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var a=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var r=Object.prototype.hasOwnProperty;var p=(t,e)=>{for(var o in e)a(t,o,{get:e[o],enumerable:!0})},c=(t,e,o,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of l(e))!r.call(t,n)&&n!==o&&a(t,n,{get:()=>e[n],enumerable:!(s=i(e,n))||s.enumerable});return t};var d=t=>c(a({},"__esModule",{value:!0}),t);var g={};p(g,{conf:()=>m,language:()=>u});var m={comments:{lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}],folding:{offSide:!0}},u={defaultToken:"",tokenPostfix:".pug",ignoreCase:!0,brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"}],keywords:["append","block","case","default","doctype","each","else","extends","for","if","in","include","mixin","typeof","unless","var","when"],tags:["a","abbr","acronym","address","area","article","aside","audio","b","base","basefont","bdi","bdo","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","command","datalist","dd","del","details","dfn","div","dl","dt","em","embed","fieldset","figcaption","figure","font","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","keygen","kbd","label","li","link","map","mark","menu","meta","meter","nav","noframes","noscript","object","ol","optgroup","option","output","p","param","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strike","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","tracks","tt","u","ul","video","wbr"],symbols:/[\+\-\*\%\&\|\!\=\/\.\,\:]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^(\s*)([a-zA-Z_-][\w-]*)/,{cases:{"$2@tags":{cases:{"@eos":["","tag"],"@default":["",{token:"tag",next:"@tag.$1"}]}},"$2@keywords":["",{token:"keyword.$2"}],"@default":["",""]}}],[/^(\s*)(#[a-zA-Z_-][\w-]*)/,{cases:{"@eos":["","tag.id"],"@default":["",{token:"tag.id",next:"@tag.$1"}]}}],[/^(\s*)(\.[a-zA-Z_-][\w-]*)/,{cases:{"@eos":["","tag.class"],"@default":["",{token:"tag.class",next:"@tag.$1"}]}}],[/^(\s*)(\|.*)$/,""],{include:"@whitespace"},[/[a-zA-Z_$][\w$]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":""}}],[/[{}()\[\]]/,"@brackets"],[/@symbols/,"delimiter"],[/\d+\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\d+/,"number"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],tag:[[/(\.)(\s*$)/,[{token:"delimiter",next:"@blockText.$S2."},""]],[/\s+/,{token:"",next:"@simpleText"}],[/#[a-zA-Z_-][\w-]*/,{cases:{"@eos":{token:"tag.id",next:"@pop"},"@default":"tag.id"}}],[/\.[a-zA-Z_-][\w-]*/,{cases:{"@eos":{token:"tag.class",next:"@pop"},"@default":"tag.class"}}],[/\(/,{token:"delimiter.parenthesis",next:"@attributeList"}]],simpleText:[[/[^#]+$/,{token:"",next:"@popall"}],[/[^#]+/,{token:""}],[/(#{)([^}]*)(})/,{cases:{"@eos":["interpolation.delimiter","interpolation",{token:"interpolation.delimiter",next:"@popall"}],"@default":["interpolation.delimiter","interpolation","interpolation.delimiter"]}}],[/#$/,{token:"",next:"@popall"}],[/#/,""]],attributeList:[[/\s+/,""],[/(\w+)(\s*=\s*)("|')/,["attribute.name","delimiter",{token:"attribute.value",next:"@value.$3"}]],[/\w+/,"attribute.name"],[/,/,{cases:{"@eos":{token:"attribute.delimiter",next:"@popall"},"@default":"attribute.delimiter"}}],[/\)$/,{token:"delimiter.parenthesis",next:"@popall"}],[/\)/,{token:"delimiter.parenthesis",next:"@pop"}]],whitespace:[[/^(\s*)(\/\/.*)$/,{token:"comment",next:"@blockText.$1.comment"}],[/[ \t\r\n]+/,""],[//,{token:"comment",next:"@pop"}],[/"]},brackets:[[""],["<",">"],["{","}"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}],onEnterRules:[{beforeText:new RegExp(`<(?!(?:${p.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),afterText:/^<\/(\w[\w\d]*)\s*>$/i,action:{indentAction:o.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp(`<(?!(?:${p.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),action:{indentAction:o.languages.IndentAction.Indent}}]},E={defaultToken:"",tokenPostfix:"",tokenizer:{root:[[/@@@@/],[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.root"}],[/)/,["delimiter.html","tag.html","delimiter.html"]],[/(<)(script)/,["delimiter.html",{token:"tag.html",next:"@script"}]],[/(<)(style)/,["delimiter.html",{token:"tag.html",next:"@style"}]],[/(<)([:\w\-]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/(<\/)([\w\-]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/]+/,"metatag.content.html"],[/>/,"metatag.html","@pop"]],comment:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.comment"}],[/-->/,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.otherTag"}],[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.script"}],[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.scriptAfterType"}],[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.scriptAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.scriptWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInEmbeddedState.scriptEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],style:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.style"}],[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.styleAfterType"}],[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.styleAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.styleWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInEmbeddedState.styleEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],razorInSimpleState:[[/@\*/,"comment.cs","@razorBlockCommentTopLevel"],[/@[{(]/,"metatag.cs","@razorRootTopLevel"],[/(@)(\s*[\w]+)/,["metatag.cs",{token:"identifier.cs",switchTo:"@$S2.$S3"}]],[/[})]/,{token:"metatag.cs",switchTo:"@$S2.$S3"}],[/\*@/,{token:"comment.cs",switchTo:"@$S2.$S3"}]],razorInEmbeddedState:[[/@\*/,"comment.cs","@razorBlockCommentTopLevel"],[/@[{(]/,"metatag.cs","@razorRootTopLevel"],[/(@)(\s*[\w]+)/,["metatag.cs",{token:"identifier.cs",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}]],[/[})]/,{token:"metatag.cs",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}],[/\*@/,{token:"comment.cs",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}]],razorBlockCommentTopLevel:[[/\*@/,"@rematch","@pop"],[/[^*]+/,"comment.cs"],[/./,"comment.cs"]],razorBlockComment:[[/\*@/,"comment.cs","@pop"],[/[^*]+/,"comment.cs"],[/./,"comment.cs"]],razorRootTopLevel:[[/\{/,"delimiter.bracket.cs","@razorRoot"],[/\(/,"delimiter.parenthesis.cs","@razorRoot"],[/[})]/,"@rematch","@pop"],{include:"razorCommon"}],razorRoot:[[/\{/,"delimiter.bracket.cs","@razorRoot"],[/\(/,"delimiter.parenthesis.cs","@razorRoot"],[/\}/,"delimiter.bracket.cs","@pop"],[/\)/,"delimiter.parenthesis.cs","@pop"],{include:"razorCommon"}],razorCommon:[[/[a-zA-Z_]\w*/,{cases:{"@razorKeywords":{token:"keyword.cs"},"@default":"identifier.cs"}}],[/[\[\]]/,"delimiter.array.cs"],[/[ \t\r\n]+/],[/\/\/.*$/,"comment.cs"],[/@\*/,"comment.cs","@razorBlockComment"],[/"([^"]*)"/,"string.cs"],[/'([^']*)'/,"string.cs"],[/(<)([\w\-]+)(\/>)/,["delimiter.html","tag.html","delimiter.html"]],[/(<)([\w\-]+)(>)/,["delimiter.html","tag.html","delimiter.html"]],[/(<\/)([\w\-]+)(>)/,["delimiter.html","tag.html","delimiter.html"]],[/[\+\-\*\%\&\|\^\~\!\=\<\>\/\?\;\:\.\,]/,"delimiter.cs"],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float.cs"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float.cs"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F]/,"number.hex.cs"],[/0[0-7']*[0-7]/,"number.octal.cs"],[/0[bB][0-1']*[0-1]/,"number.binary.cs"],[/\d[\d']*/,"number.cs"],[/\d/,"number.cs"]]},razorKeywords:["abstract","as","async","await","base","bool","break","by","byte","case","catch","char","checked","class","const","continue","decimal","default","delegate","do","double","descending","explicit","event","extern","else","enum","false","finally","fixed","float","for","foreach","from","goto","group","if","implicit","in","int","interface","internal","into","is","lock","long","nameof","new","null","namespace","object","operator","out","override","orderby","params","private","protected","public","readonly","ref","return","switch","struct","sbyte","sealed","short","sizeof","stackalloc","static","string","select","this","throw","true","try","typeof","uint","ulong","unchecked","unsafe","ushort","using","var","virtual","volatile","void","when","while","where","yield","model","inject"],escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/};return g(z);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/redis/redis.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/redis/redis.js deleted file mode 100644 index 35edabc7ac..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/redis/redis.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/redis/redis", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var R=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var A=(S,E)=>{for(var T in E)R(S,T,{get:E[T],enumerable:!0})},O=(S,E,T,o)=>{if(E&&typeof E=="object"||typeof E=="function")for(let e of N(E))!s.call(S,e)&&e!==T&&R(S,e,{get:()=>E[e],enumerable:!(o=n(E,e))||o.enumerable});return S};var L=S=>O(R({},"__esModule",{value:!0}),S);var r={};A(r,{conf:()=>I,language:()=>i});var I={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},i={defaultToken:"",tokenPostfix:".redis",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["APPEND","AUTH","BGREWRITEAOF","BGSAVE","BITCOUNT","BITFIELD","BITOP","BITPOS","BLPOP","BRPOP","BRPOPLPUSH","CLIENT","KILL","LIST","GETNAME","PAUSE","REPLY","SETNAME","CLUSTER","ADDSLOTS","COUNT-FAILURE-REPORTS","COUNTKEYSINSLOT","DELSLOTS","FAILOVER","FORGET","GETKEYSINSLOT","INFO","KEYSLOT","MEET","NODES","REPLICATE","RESET","SAVECONFIG","SET-CONFIG-EPOCH","SETSLOT","SLAVES","SLOTS","COMMAND","COUNT","GETKEYS","CONFIG","GET","REWRITE","SET","RESETSTAT","DBSIZE","DEBUG","OBJECT","SEGFAULT","DECR","DECRBY","DEL","DISCARD","DUMP","ECHO","EVAL","EVALSHA","EXEC","EXISTS","EXPIRE","EXPIREAT","FLUSHALL","FLUSHDB","GEOADD","GEOHASH","GEOPOS","GEODIST","GEORADIUS","GEORADIUSBYMEMBER","GETBIT","GETRANGE","GETSET","HDEL","HEXISTS","HGET","HGETALL","HINCRBY","HINCRBYFLOAT","HKEYS","HLEN","HMGET","HMSET","HSET","HSETNX","HSTRLEN","HVALS","INCR","INCRBY","INCRBYFLOAT","KEYS","LASTSAVE","LINDEX","LINSERT","LLEN","LPOP","LPUSH","LPUSHX","LRANGE","LREM","LSET","LTRIM","MGET","MIGRATE","MONITOR","MOVE","MSET","MSETNX","MULTI","PERSIST","PEXPIRE","PEXPIREAT","PFADD","PFCOUNT","PFMERGE","PING","PSETEX","PSUBSCRIBE","PUBSUB","PTTL","PUBLISH","PUNSUBSCRIBE","QUIT","RANDOMKEY","READONLY","READWRITE","RENAME","RENAMENX","RESTORE","ROLE","RPOP","RPOPLPUSH","RPUSH","RPUSHX","SADD","SAVE","SCARD","SCRIPT","FLUSH","LOAD","SDIFF","SDIFFSTORE","SELECT","SETBIT","SETEX","SETNX","SETRANGE","SHUTDOWN","SINTER","SINTERSTORE","SISMEMBER","SLAVEOF","SLOWLOG","SMEMBERS","SMOVE","SORT","SPOP","SRANDMEMBER","SREM","STRLEN","SUBSCRIBE","SUNION","SUNIONSTORE","SWAPDB","SYNC","TIME","TOUCH","TTL","TYPE","UNSUBSCRIBE","UNLINK","UNWATCH","WAIT","WATCH","ZADD","ZCARD","ZCOUNT","ZINCRBY","ZINTERSTORE","ZLEXCOUNT","ZRANGE","ZRANGEBYLEX","ZREVRANGEBYLEX","ZRANGEBYSCORE","ZRANK","ZREM","ZREMRANGEBYLEX","ZREMRANGEBYRANK","ZREMRANGEBYSCORE","ZREVRANGE","ZREVRANGEBYSCORE","ZREVRANK","ZSCORE","ZUNIONSTORE","SCAN","SSCAN","HSCAN","ZSCAN"],operators:[],builtinFunctions:[],builtinVariables:[],pseudoColumns:[],tokenizer:{root:[{include:"@whitespace"},{include:"@pseudoColumns"},{include:"@numbers"},{include:"@strings"},{include:"@scopes"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@#$]+/,{cases:{"@keywords":"keyword","@operators":"operator","@builtinVariables":"predefined","@builtinFunctions":"predefined","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],pseudoColumns:[[/[$][A-Za-z_][\w@#$]*/,{cases:{"@pseudoColumns":"predefined","@default":"identifier"}}]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/'/,{token:"string",next:"@string"}],[/"/,{token:"string.double",next:"@stringDouble"}]],string:[[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],stringDouble:[[/[^"]+/,"string.double"],[/""/,"string.double"],[/"/,{token:"string.double",next:"@pop"}]],scopes:[]}};return L(r);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/redshift/redshift.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/redshift/redshift.js deleted file mode 100644 index c6a2a2b9a8..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/redshift/redshift.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/redshift/redshift", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var i=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var n=Object.prototype.hasOwnProperty;var p=(_,e)=>{for(var r in e)i(_,r,{get:e[r],enumerable:!0})},l=(_,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of o(e))!n.call(_,t)&&t!==r&&i(_,t,{get:()=>e[t],enumerable:!(a=s(e,t))||a.enumerable});return _};var g=_=>l(i({},"__esModule",{value:!0}),_);var m={};p(m,{conf:()=>c,language:()=>d});var c={comments:{lineComment:"--",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},d={defaultToken:"",tokenPostfix:".sql",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["AES128","AES256","ALL","ALLOWOVERWRITE","ANALYSE","ANALYZE","AND","ANY","ARRAY","AS","ASC","AUTHORIZATION","AZ64","BACKUP","BETWEEN","BINARY","BLANKSASNULL","BOTH","BYTEDICT","BZIP2","CASE","CAST","CHECK","COLLATE","COLUMN","CONSTRAINT","CREATE","CREDENTIALS","CROSS","CURRENT_DATE","CURRENT_TIME","CURRENT_TIMESTAMP","CURRENT_USER","CURRENT_USER_ID","DEFAULT","DEFERRABLE","DEFLATE","DEFRAG","DELTA","DELTA32K","DESC","DISABLE","DISTINCT","DO","ELSE","EMPTYASNULL","ENABLE","ENCODE","ENCRYPT","ENCRYPTION","END","EXCEPT","EXPLICIT","FALSE","FOR","FOREIGN","FREEZE","FROM","FULL","GLOBALDICT256","GLOBALDICT64K","GRANT","GROUP","GZIP","HAVING","IDENTITY","IGNORE","ILIKE","IN","INITIALLY","INNER","INTERSECT","INTO","IS","ISNULL","JOIN","LANGUAGE","LEADING","LEFT","LIKE","LIMIT","LOCALTIME","LOCALTIMESTAMP","LUN","LUNS","LZO","LZOP","MINUS","MOSTLY16","MOSTLY32","MOSTLY8","NATURAL","NEW","NOT","NOTNULL","NULL","NULLS","OFF","OFFLINE","OFFSET","OID","OLD","ON","ONLY","OPEN","OR","ORDER","OUTER","OVERLAPS","PARALLEL","PARTITION","PERCENT","PERMISSIONS","PLACING","PRIMARY","RAW","READRATIO","RECOVER","REFERENCES","RESPECT","REJECTLOG","RESORT","RESTORE","RIGHT","SELECT","SESSION_USER","SIMILAR","SNAPSHOT","SOME","SYSDATE","SYSTEM","TABLE","TAG","TDES","TEXT255","TEXT32K","THEN","TIMESTAMP","TO","TOP","TRAILING","TRUE","TRUNCATECOLUMNS","UNION","UNIQUE","USER","USING","VERBOSE","WALLET","WHEN","WHERE","WITH","WITHOUT"],operators:["AND","BETWEEN","IN","LIKE","NOT","OR","IS","NULL","INTERSECT","UNION","INNER","JOIN","LEFT","OUTER","RIGHT"],builtinFunctions:["current_schema","current_schemas","has_database_privilege","has_schema_privilege","has_table_privilege","age","current_time","current_timestamp","localtime","isfinite","now","ascii","get_bit","get_byte","set_bit","set_byte","to_ascii","approximate percentile_disc","avg","count","listagg","max","median","min","percentile_cont","stddev_samp","stddev_pop","sum","var_samp","var_pop","bit_and","bit_or","bool_and","bool_or","cume_dist","first_value","lag","last_value","lead","nth_value","ratio_to_report","dense_rank","ntile","percent_rank","rank","row_number","case","coalesce","decode","greatest","least","nvl","nvl2","nullif","add_months","at time zone","convert_timezone","current_date","date_cmp","date_cmp_timestamp","date_cmp_timestamptz","date_part_year","dateadd","datediff","date_part","date_trunc","extract","getdate","interval_cmp","last_day","months_between","next_day","sysdate","timeofday","timestamp_cmp","timestamp_cmp_date","timestamp_cmp_timestamptz","timestamptz_cmp","timestamptz_cmp_date","timestamptz_cmp_timestamp","timezone","to_timestamp","trunc","abs","acos","asin","atan","atan2","cbrt","ceil","ceiling","checksum","cos","cot","degrees","dexp","dlog1","dlog10","exp","floor","ln","log","mod","pi","power","radians","random","round","sin","sign","sqrt","tan","to_hex","bpcharcmp","btrim","bttext_pattern_cmp","char_length","character_length","charindex","chr","concat","crc32","func_sha1","initcap","left and rights","len","length","lower","lpad and rpads","ltrim","md5","octet_length","position","quote_ident","quote_literal","regexp_count","regexp_instr","regexp_replace","regexp_substr","repeat","replace","replicate","reverse","rtrim","split_part","strpos","strtol","substring","textlen","translate","trim","upper","cast","convert","to_char","to_date","to_number","json_array_length","json_extract_array_element_text","json_extract_path_text","current_setting","pg_cancel_backend","pg_terminate_backend","set_config","current_database","current_user","current_user_id","pg_backend_pid","pg_last_copy_count","pg_last_copy_id","pg_last_query_id","pg_last_unload_count","session_user","slice_num","user","version","abbrev","acosd","any","area","array_agg","array_append","array_cat","array_dims","array_fill","array_length","array_lower","array_ndims","array_position","array_positions","array_prepend","array_remove","array_replace","array_to_json","array_to_string","array_to_tsvector","array_upper","asind","atan2d","atand","bit","bit_length","bound_box","box","brin_summarize_new_values","broadcast","cardinality","center","circle","clock_timestamp","col_description","concat_ws","convert_from","convert_to","corr","cosd","cotd","covar_pop","covar_samp","current_catalog","current_query","current_role","currval","cursor_to_xml","diameter","div","encode","enum_first","enum_last","enum_range","every","family","format","format_type","generate_series","generate_subscripts","get_current_ts_config","gin_clean_pending_list","grouping","has_any_column_privilege","has_column_privilege","has_foreign_data_wrapper_privilege","has_function_privilege","has_language_privilege","has_sequence_privilege","has_server_privilege","has_tablespace_privilege","has_type_privilege","height","host","hostmask","inet_client_addr","inet_client_port","inet_merge","inet_same_family","inet_server_addr","inet_server_port","isclosed","isempty","isopen","json_agg","json_object","json_object_agg","json_populate_record","json_populate_recordset","json_to_record","json_to_recordset","jsonb_agg","jsonb_object_agg","justify_days","justify_hours","justify_interval","lastval","left","line","localtimestamp","lower_inc","lower_inf","lpad","lseg","make_date","make_interval","make_time","make_timestamp","make_timestamptz","masklen","mode","netmask","network","nextval","npoints","num_nonnulls","num_nulls","numnode","obj_description","overlay","parse_ident","path","pclose","percentile_disc","pg_advisory_lock","pg_advisory_lock_shared","pg_advisory_unlock","pg_advisory_unlock_all","pg_advisory_unlock_shared","pg_advisory_xact_lock","pg_advisory_xact_lock_shared","pg_backup_start_time","pg_blocking_pids","pg_client_encoding","pg_collation_is_visible","pg_column_size","pg_conf_load_time","pg_control_checkpoint","pg_control_init","pg_control_recovery","pg_control_system","pg_conversion_is_visible","pg_create_logical_replication_slot","pg_create_physical_replication_slot","pg_create_restore_point","pg_current_xlog_flush_location","pg_current_xlog_insert_location","pg_current_xlog_location","pg_database_size","pg_describe_object","pg_drop_replication_slot","pg_export_snapshot","pg_filenode_relation","pg_function_is_visible","pg_get_constraintdef","pg_get_expr","pg_get_function_arguments","pg_get_function_identity_arguments","pg_get_function_result","pg_get_functiondef","pg_get_indexdef","pg_get_keywords","pg_get_object_address","pg_get_owned_sequence","pg_get_ruledef","pg_get_serial_sequence","pg_get_triggerdef","pg_get_userbyid","pg_get_viewdef","pg_has_role","pg_identify_object","pg_identify_object_as_address","pg_index_column_has_property","pg_index_has_property","pg_indexam_has_property","pg_indexes_size","pg_is_in_backup","pg_is_in_recovery","pg_is_other_temp_schema","pg_is_xlog_replay_paused","pg_last_committed_xact","pg_last_xact_replay_timestamp","pg_last_xlog_receive_location","pg_last_xlog_replay_location","pg_listening_channels","pg_logical_emit_message","pg_logical_slot_get_binary_changes","pg_logical_slot_get_changes","pg_logical_slot_peek_binary_changes","pg_logical_slot_peek_changes","pg_ls_dir","pg_my_temp_schema","pg_notification_queue_usage","pg_opclass_is_visible","pg_operator_is_visible","pg_opfamily_is_visible","pg_options_to_table","pg_postmaster_start_time","pg_read_binary_file","pg_read_file","pg_relation_filenode","pg_relation_filepath","pg_relation_size","pg_reload_conf","pg_replication_origin_create","pg_replication_origin_drop","pg_replication_origin_oid","pg_replication_origin_progress","pg_replication_origin_session_is_setup","pg_replication_origin_session_progress","pg_replication_origin_session_reset","pg_replication_origin_session_setup","pg_replication_origin_xact_reset","pg_replication_origin_xact_setup","pg_rotate_logfile","pg_size_bytes","pg_size_pretty","pg_sleep","pg_sleep_for","pg_sleep_until","pg_start_backup","pg_stat_file","pg_stop_backup","pg_switch_xlog","pg_table_is_visible","pg_table_size","pg_tablespace_databases","pg_tablespace_location","pg_tablespace_size","pg_total_relation_size","pg_trigger_depth","pg_try_advisory_lock","pg_try_advisory_lock_shared","pg_try_advisory_xact_lock","pg_try_advisory_xact_lock_shared","pg_ts_config_is_visible","pg_ts_dict_is_visible","pg_ts_parser_is_visible","pg_ts_template_is_visible","pg_type_is_visible","pg_typeof","pg_xact_commit_timestamp","pg_xlog_location_diff","pg_xlog_replay_pause","pg_xlog_replay_resume","pg_xlogfile_name","pg_xlogfile_name_offset","phraseto_tsquery","plainto_tsquery","point","polygon","popen","pqserverversion","query_to_xml","querytree","quote_nullable","radius","range_merge","regexp_matches","regexp_split_to_array","regexp_split_to_table","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","right","row_security_active","row_to_json","rpad","scale","set_masklen","setseed","setval","setweight","shobj_description","sind","sprintf","statement_timestamp","stddev","string_agg","string_to_array","strip","substr","table_to_xml","table_to_xml_and_xmlschema","tand","text","to_json","to_regclass","to_regnamespace","to_regoper","to_regoperator","to_regproc","to_regprocedure","to_regrole","to_regtype","to_tsquery","to_tsvector","transaction_timestamp","ts_debug","ts_delete","ts_filter","ts_headline","ts_lexize","ts_parse","ts_rank","ts_rank_cd","ts_rewrite","ts_stat","ts_token_type","tsquery_phrase","tsvector_to_array","tsvector_update_trigger","tsvector_update_trigger_column","txid_current","txid_current_snapshot","txid_snapshot_xip","txid_snapshot_xmax","txid_snapshot_xmin","txid_visible_in_snapshot","unnest","upper_inc","upper_inf","variance","width","width_bucket","xml_is_well_formed","xml_is_well_formed_content","xml_is_well_formed_document","xmlagg","xmlcomment","xmlconcat","xmlelement","xmlexists","xmlforest","xmlparse","xmlpi","xmlroot","xmlserialize","xpath","xpath_exists"],builtinVariables:[],pseudoColumns:[],tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@pseudoColumns"},{include:"@numbers"},{include:"@strings"},{include:"@complexIdentifiers"},{include:"@scopes"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@#$]+/,{cases:{"@keywords":"keyword","@operators":"operator","@builtinVariables":"predefined","@builtinFunctions":"predefined","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[[/--+.*/,"comment"],[/\/\*/,{token:"comment.quote",next:"@comment"}]],comment:[[/[^*/]+/,"comment"],[/\*\//,{token:"comment.quote",next:"@pop"}],[/./,"comment"]],pseudoColumns:[[/[$][A-Za-z_][\w@#$]*/,{cases:{"@pseudoColumns":"predefined","@default":"identifier"}}]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/'/,{token:"string",next:"@string"}]],string:[[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],complexIdentifiers:[[/"/,{token:"identifier.quote",next:"@quotedIdentifier"}]],quotedIdentifier:[[/[^"]+/,"identifier"],[/""/,"identifier"],[/"/,{token:"identifier.quote",next:"@pop"}]],scopes:[]}};return g(m);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/restructuredtext/restructuredtext.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/restructuredtext/restructuredtext.js deleted file mode 100644 index 9c50bbc674..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/restructuredtext/restructuredtext.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/restructuredtext/restructuredtext", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var t=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var r=Object.prototype.hasOwnProperty;var k=(n,e)=>{for(var i in e)t(n,i,{get:e[i],enumerable:!0})},c=(n,e,i,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of l(e))!r.call(n,s)&&s!==i&&t(n,s,{get:()=>e[s],enumerable:!(o=a(e,s))||o.enumerable});return n};var p=n=>c(t({},"__esModule",{value:!0}),n);var g={};k(g,{conf:()=>u,language:()=>m});var u={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">",notIn:["string"]}],surroundingPairs:[{open:"(",close:")"},{open:"[",close:"]"},{open:"`",close:"`"}],folding:{markers:{start:new RegExp("^\\s*"),end:new RegExp("^\\s*")}}},m={defaultToken:"",tokenPostfix:".rst",control:/[\\`*_\[\]{}()#+\-\.!]/,escapes:/\\(?:@control)/,empty:["area","base","basefont","br","col","frame","hr","img","input","isindex","link","meta","param"],alphanumerics:/[A-Za-z0-9]/,simpleRefNameWithoutBq:/(?:@alphanumerics[-_+:.]*@alphanumerics)+|(?:@alphanumerics+)/,simpleRefName:/(?:`@phrase`|@simpleRefNameWithoutBq)/,phrase:/@simpleRefNameWithoutBq(?:\s@simpleRefNameWithoutBq)*/,citationName:/[A-Za-z][A-Za-z0-9-_.]*/,blockLiteralStart:/(?:[!"#$%&'()*+,-./:;<=>?@\[\]^_`{|}~]|[\s])/,precedingChars:/(?:[ -:/'"<([{])/,followingChars:/(?:[ -.,:;!?/'")\]}>]|$)/,punctuation:/(=|-|~|`|#|"|\^|\+|\*|:|\.|'|_|\+)/,tokenizer:{root:[[/^(@punctuation{3,}$){1,1}?/,"keyword"],[/^\s*([\*\-+‣•]|[a-zA-Z0-9]+\.|\([a-zA-Z0-9]+\)|[a-zA-Z0-9]+\))\s/,"keyword"],[/([ ]::)\s*$/,"keyword","@blankLineOfLiteralBlocks"],[/(::)\s*$/,"keyword","@blankLineOfLiteralBlocks"],{include:"@tables"},{include:"@explicitMarkupBlocks"},{include:"@inlineMarkup"}],explicitMarkupBlocks:[{include:"@citations"},{include:"@footnotes"},[/^(\.\.\s)(@simpleRefName)(::\s)(.*)$/,[{token:"",next:"subsequentLines"},"keyword","",""]],[/^(\.\.)(\s+)(_)(@simpleRefName)(:)(\s+)(.*)/,[{token:"",next:"hyperlinks"},"","","string.link","","","string.link"]],[/^((?:(?:\.\.)(?:\s+))?)(__)(:)(\s+)(.*)/,[{token:"",next:"subsequentLines"},"","","","string.link"]],[/^(__\s+)(.+)/,["","string.link"]],[/^(\.\.)( \|)([^| ]+[^|]*[^| ]*)(\| )(@simpleRefName)(:: .*)/,[{token:"",next:"subsequentLines"},"","string.link","","keyword",""],"@rawBlocks"],[/(\|)([^| ]+[^|]*[^| ]*)(\|_{0,2})/,["","string.link",""]],[/^(\.\.)([ ].*)$/,[{token:"",next:"@comments"},"comment"]]],inlineMarkup:[{include:"@citationsReference"},{include:"@footnotesReference"},[/(@simpleRefName)(_{1,2})/,["string.link",""]],[/(`)([^<`]+\s+)(<)(.*)(>)(`)(_)/,["","string.link","","string.link","","",""]],[/\*\*([^\\*]|\*(?!\*))+\*\*/,"strong"],[/\*[^*]+\*/,"emphasis"],[/(``)((?:[^`]|\`(?!`))+)(``)/,["","keyword",""]],[/(__\s+)(.+)/,["","keyword"]],[/(:)((?:@simpleRefNameWithoutBq)?)(:`)([^`]+)(`)/,["","keyword","","",""]],[/(`)([^`]+)(`:)((?:@simpleRefNameWithoutBq)?)(:)/,["","","","keyword",""]],[/(`)([^`]+)(`)/,""],[/(_`)(@phrase)(`)/,["","string.link",""]]],citations:[[/^(\.\.\s+\[)((?:@citationName))(\]\s+)(.*)/,[{token:"",next:"@subsequentLines"},"string.link","",""]]],citationsReference:[[/(\[)(@citationName)(\]_)/,["","string.link",""]]],footnotes:[[/^(\.\.\s+\[)((?:[0-9]+))(\]\s+.*)/,[{token:"",next:"@subsequentLines"},"string.link",""]],[/^(\.\.\s+\[)((?:#@simpleRefName?))(\]\s+)(.*)/,[{token:"",next:"@subsequentLines"},"string.link","",""]],[/^(\.\.\s+\[)((?:\*))(\]\s+)(.*)/,[{token:"",next:"@subsequentLines"},"string.link","",""]]],footnotesReference:[[/(\[)([0-9]+)(\])(_)/,["","string.link","",""]],[/(\[)(#@simpleRefName?)(\])(_)/,["","string.link","",""]],[/(\[)(\*)(\])(_)/,["","string.link","",""]]],blankLineOfLiteralBlocks:[[/^$/,"","@subsequentLinesOfLiteralBlocks"],[/^.*$/,"","@pop"]],subsequentLinesOfLiteralBlocks:[[/(@blockLiteralStart+)(.*)/,["keyword",""]],[/^(?!blockLiteralStart)/,"","@popall"]],subsequentLines:[[/^[\s]+.*/,""],[/^(?!\s)/,"","@pop"]],hyperlinks:[[/^[\s]+.*/,"string.link"],[/^(?!\s)/,"","@pop"]],comments:[[/^[\s]+.*/,"comment"],[/^(?!\s)/,"","@pop"]],tables:[[/\+-[+-]+/,"keyword"],[/\+=[+=]+/,"keyword"]]}};return p(g);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/ruby/ruby.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/ruby/ruby.js deleted file mode 100644 index 5406570b85..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/ruby/ruby.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/ruby/ruby", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(t,e)=>{for(var r in e)o(t,r,{get:e[r],enumerable:!0})},l=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of c(e))!d.call(t,n)&&n!==r&&o(t,n,{get:()=>e[n],enumerable:!(s=i(e,n))||s.enumerable});return t};var a=t=>l(o({},"__esModule",{value:!0}),t);var m={};p(m,{conf:()=>g,language:()=>x});var g={comments:{lineComment:"#",blockComment:["=begin","=end"]},brackets:[["(",")"],["{","}"],["[","]"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],indentationRules:{increaseIndentPattern:new RegExp(`^\\s*((begin|class|(private|protected)\\s+def|def|else|elsif|ensure|for|if|module|rescue|unless|until|when|while|case)|([^#]*\\sdo\\b)|([^#]*=\\s*(case|if|unless)))\\b([^#\\{;]|("|'|/).*\\4)*(#.*)?$`),decreaseIndentPattern:new RegExp("^\\s*([}\\]]([,)]?\\s*(#|$)|\\.[a-zA-Z_]\\w*\\b)|(end|rescue|ensure|else|elsif|when)\\b)")}},x={tokenPostfix:".ruby",keywords:["__LINE__","__ENCODING__","__FILE__","BEGIN","END","alias","and","begin","break","case","class","def","defined?","do","else","elsif","end","ensure","for","false","if","in","module","next","nil","not","or","redo","rescue","retry","return","self","super","then","true","undef","unless","until","when","while","yield"],keywordops:["::","..","...","?",":","=>"],builtins:["require","public","private","include","extend","attr_reader","protected","private_class_method","protected_class_method","new"],declarations:["module","class","def","case","do","begin","for","if","while","until","unless"],linedecls:["def","case","do","begin","for","if","while","until","unless"],operators:["^","&","|","<=>","==","===","!~","=~",">",">=","<","<=","<<",">>","+","-","*","/","%","**","~","+@","-@","[]","[]=","`","+=","-=","*=","**=","/=","^=","%=","<<=",">>=","&=","&&=","||=","|="],brackets:[{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"}],symbols:/[=>"}],[/%([qws])(@delim)/,{token:"string.$1.delim",switchTo:"@qstring.$1.$2.$2"}],[/%r\(/,{token:"regexp.delim",switchTo:"@pregexp.(.)"}],[/%r\[/,{token:"regexp.delim",switchTo:"@pregexp.[.]"}],[/%r\{/,{token:"regexp.delim",switchTo:"@pregexp.{.}"}],[/%r"}],[/%r(@delim)/,{token:"regexp.delim",switchTo:"@pregexp.$1.$1"}],[/%(x|W|Q?)\(/,{token:"string.$1.delim",switchTo:"@qqstring.$1.(.)"}],[/%(x|W|Q?)\[/,{token:"string.$1.delim",switchTo:"@qqstring.$1.[.]"}],[/%(x|W|Q?)\{/,{token:"string.$1.delim",switchTo:"@qqstring.$1.{.}"}],[/%(x|W|Q?)"}],[/%(x|W|Q?)(@delim)/,{token:"string.$1.delim",switchTo:"@qqstring.$1.$2.$2"}],[/%([rqwsxW]|Q?)./,{token:"invalid",next:"@pop"}],[/./,{token:"invalid",next:"@pop"}]],qstring:[[/\\$/,"string.$S2.escape"],[/\\./,"string.$S2.escape"],[/./,{cases:{"$#==$S4":{token:"string.$S2.delim",next:"@pop"},"$#==$S3":{token:"string.$S2.delim",next:"@push"},"@default":"string.$S2"}}]],qqstring:[[/#/,"string.$S2.escape","@interpolated"],{include:"@qstring"}],whitespace:[[/[ \t\r\n]+/,""],[/^\s*=begin\b/,"comment","@comment"],[/#.*$/,"comment"]],comment:[[/[^=]+/,"comment"],[/^\s*=begin\b/,"comment.invalid"],[/^\s*=end\b.*/,"comment","@pop"],[/[=]/,"comment"]]}};return a(m);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/rust/rust.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/rust/rust.js deleted file mode 100644 index 80db3a6d0c..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/rust/rust.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/rust/rust", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var _=(t,e)=>{for(var n in e)r(t,n,{get:e[n],enumerable:!0})},u=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of a(e))!c.call(t,o)&&o!==n&&r(t,o,{get:()=>e[o],enumerable:!(s=i(e,o))||s.enumerable});return t};var l=t=>u(r({},"__esModule",{value:!0}),t);var m={};_(m,{conf:()=>f,language:()=>p});var f={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*#pragma\\s+region\\b"),end:new RegExp("^\\s*#pragma\\s+endregion\\b")}}},p={tokenPostfix:".rust",defaultToken:"invalid",keywords:["as","async","await","box","break","const","continue","crate","dyn","else","enum","extern","false","fn","for","if","impl","in","let","loop","match","mod","move","mut","pub","ref","return","self","static","struct","super","trait","true","try","type","unsafe","use","where","while","catch","default","union","static","abstract","alignof","become","do","final","macro","offsetof","override","priv","proc","pure","sizeof","typeof","unsized","virtual","yield"],typeKeywords:["Self","m32","m64","m128","f80","f16","f128","int","uint","float","char","bool","u8","u16","u32","u64","f32","f64","i8","i16","i32","i64","str","Option","Either","c_float","c_double","c_void","FILE","fpos_t","DIR","dirent","c_char","c_schar","c_uchar","c_short","c_ushort","c_int","c_uint","c_long","c_ulong","size_t","ptrdiff_t","clock_t","time_t","c_longlong","c_ulonglong","intptr_t","uintptr_t","off_t","dev_t","ino_t","pid_t","mode_t","ssize_t"],constants:["true","false","Some","None","Left","Right","Ok","Err"],supportConstants:["EXIT_FAILURE","EXIT_SUCCESS","RAND_MAX","EOF","SEEK_SET","SEEK_CUR","SEEK_END","_IOFBF","_IONBF","_IOLBF","BUFSIZ","FOPEN_MAX","FILENAME_MAX","L_tmpnam","TMP_MAX","O_RDONLY","O_WRONLY","O_RDWR","O_APPEND","O_CREAT","O_EXCL","O_TRUNC","S_IFIFO","S_IFCHR","S_IFBLK","S_IFDIR","S_IFREG","S_IFMT","S_IEXEC","S_IWRITE","S_IREAD","S_IRWXU","S_IXUSR","S_IWUSR","S_IRUSR","F_OK","R_OK","W_OK","X_OK","STDIN_FILENO","STDOUT_FILENO","STDERR_FILENO"],supportMacros:["format!","print!","println!","panic!","format_args!","unreachable!","write!","writeln!"],operators:["!","!=","%","%=","&","&=","&&","*","*=","+","+=","-","-=","->",".","..","...","/","/=",":",";","<<","<<=","<","<=","=","==","=>",">",">=",">>",">>=","@","^","^=","|","|=","||","_","?","#"],escapes:/\\([nrt0\"''\\]|x\h{2}|u\{\h{1,6}\})/,delimiters:/[,]/,symbols:/[\#\!\%\&\*\+\-\.\/\:\;\<\=\>\@\^\|_\?]+/,intSuffixes:/[iu](8|16|32|64|128|size)/,floatSuffixes:/f(32|64)/,tokenizer:{root:[[/r(#*)"/,{token:"string.quote",bracket:"@open",next:"@stringraw.$1"}],[/[a-zA-Z][a-zA-Z0-9_]*!?|_[a-zA-Z0-9_]+/,{cases:{"@typeKeywords":"keyword.type","@keywords":"keyword","@supportConstants":"keyword","@supportMacros":"keyword","@constants":"keyword","@default":"identifier"}}],[/\$/,"identifier"],[/'[a-zA-Z_][a-zA-Z0-9_]*(?=[^\'])/,"identifier"],[/'(\S|@escapes)'/,"string.byteliteral"],[/"/,{token:"string.quote",bracket:"@open",next:"@string"}],{include:"@numbers"},{include:"@whitespace"},[/@delimiters/,{cases:{"@keywords":"keyword","@default":"delimiter"}}],[/[{}()\[\]<>]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}]],whitespace:[[/[ \t\r\n]+/,"white"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@push"],["\\*/","comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",bracket:"@close",next:"@pop"}]],stringraw:[[/[^"#]+/,{token:"string"}],[/"(#*)/,{cases:{"$1==$S2":{token:"string.quote",bracket:"@close",next:"@pop"},"@default":{token:"string"}}}],[/["#]/,{token:"string"}]],numbers:[[/(0o[0-7_]+)(@intSuffixes)?/,{token:"number"}],[/(0b[0-1_]+)(@intSuffixes)?/,{token:"number"}],[/[\d][\d_]*(\.[\d][\d_]*)?[eE][+-][\d_]+(@floatSuffixes)?/,{token:"number"}],[/\b(\d\.?[\d_]*)(@floatSuffixes)?\b/,{token:"number"}],[/(0x[\da-fA-F]+)_?(@intSuffixes)?/,{token:"number"}],[/[\d][\d_]*(@intSuffixes?)?/,{token:"number"}]]}};return l(m);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/sb/sb.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/sb/sb.js deleted file mode 100644 index 5519cbd286..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/sb/sb.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/sb/sb", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var d=(o,e)=>{for(var t in e)r(o,t,{get:e[t],enumerable:!0})},c=(o,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of a(e))!l.call(o,n)&&n!==t&&r(o,n,{get:()=>e[n],enumerable:!(s=i(e,n))||s.enumerable});return o};var g=o=>c(r({},"__esModule",{value:!0}),o);var m={};d(m,{conf:()=>p,language:()=>f});var p={comments:{lineComment:"'"},brackets:[["(",")"],["[","]"],["If","EndIf"],["While","EndWhile"],["For","EndFor"],["Sub","EndSub"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]}]},f={defaultToken:"",tokenPostfix:".sb",ignoreCase:!0,brackets:[{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"keyword.tag-if",open:"If",close:"EndIf"},{token:"keyword.tag-while",open:"While",close:"EndWhile"},{token:"keyword.tag-for",open:"For",close:"EndFor"},{token:"keyword.tag-sub",open:"Sub",close:"EndSub"}],keywords:["Else","ElseIf","EndFor","EndIf","EndSub","EndWhile","For","Goto","If","Step","Sub","Then","To","While"],tagwords:["If","Sub","While","For"],operators:[">","<","<>","<=",">=","And","Or","+","-","*","/","="],identifier:/[a-zA-Z_][\w]*/,symbols:/[=><:+\-*\/%\.,]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[{include:"@whitespace"},[/(@identifier)(?=[.])/,"type"],[/@identifier/,{cases:{"@keywords":{token:"keyword.$0"},"@operators":"operator","@default":"variable.name"}}],[/([.])(@identifier)/,{cases:{$2:["delimiter","type.member"],"@default":""}}],[/\d*\.\d+/,"number.float"],[/\d+/,"number"],[/[()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":"delimiter"}}],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"]],whitespace:[[/[ \t\r\n]+/,""],[/(\').*$/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"C?/,"string","@pop"]]}};return g(m);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/scala/scala.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/scala/scala.js deleted file mode 100644 index f07ee4cd7f..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/scala/scala.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/scala/scala", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var n=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var r in e)n(t,r,{get:e[r],enumerable:!0})},c=(t,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of i(e))!d.call(t,o)&&o!==r&&n(t,o,{get:()=>e[o],enumerable:!(a=s(e,o))||a.enumerable});return t};var g=t=>c(n({},"__esModule",{value:!0}),t);var m={};l(m,{conf:()=>p,language:()=>w});var p={wordPattern:/(unary_[@~!#%^&*()\-=+\\|:<>\/?]+)|([a-zA-Z_$][\w$]*?_=)|(`[^`]+`)|([a-zA-Z_$][\w$]*)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:))")}}},w={tokenPostfix:".scala",keywords:["asInstanceOf","catch","class","classOf","def","do","else","extends","finally","for","foreach","forSome","if","import","isInstanceOf","macro","match","new","object","package","return","throw","trait","try","type","until","val","var","while","with","yield","given","enum","then"],softKeywords:["as","export","extension","end","derives","on"],constants:["true","false","null","this","super"],modifiers:["abstract","final","implicit","lazy","override","private","protected","sealed"],softModifiers:["inline","opaque","open","transparent","using"],name:/(?:[a-z_$][\w$]*|`[^`]+`)/,type:/(?:[A-Z][\w$]*)/,symbols:/[=>))/,["@brackets","white","variable"]],[/@name/,{cases:{"@keywords":"keyword","@softKeywords":"keyword","@modifiers":"keyword.modifier","@softModifiers":"keyword.modifier","@constants":{token:"constant",next:"@allowMethod"},"@default":{token:"identifier",next:"@allowMethod"}}}],[/@type/,"type","@allowMethod"],{include:"@whitespace"},[/@[a-zA-Z_$][\w$]*(?:\.[a-zA-Z_$][\w$]*)*/,"annotation"],[/[{(]/,"@brackets"],[/[})]/,"@brackets","@allowMethod"],[/\[/,"operator.square"],[/](?!\s*(?:va[rl]|def|type)\b)/,"operator.square","@allowMethod"],[/]/,"operator.square"],[/([=-]>|<-|>:|<:|:>|<%)(?=[\s\w()[\]{},\."'`])/,"keyword"],[/@symbols/,"operator"],[/[;,\.]/,"delimiter"],[/'[a-zA-Z$][\w$]*(?!')/,"attribute.name"],[/'[^\\']'/,"string","@allowMethod"],[/(')(@escapes)(')/,["string","string.escape",{token:"string",next:"@allowMethod"}]],[/'/,"string.invalid"]],import:[[/;/,"delimiter","@pop"],[/^|$/,"","@pop"],[/[ \t]+/,"white"],[/[\n\r]+/,"white","@pop"],[/\/\*/,"comment","@comment"],[/@name|@type/,"type"],[/[(){}]/,"@brackets"],[/[[\]]/,"operator.square"],[/[\.,]/,"delimiter"]],allowMethod:[[/^|$/,"","@pop"],[/[ \t]+/,"white"],[/[\n\r]+/,"white","@pop"],[/\/\*/,"comment","@comment"],[/(?==>[\s\w([{])/,"keyword","@pop"],[/(@name|@symbols)(?=[ \t]*[[({"'`]|[ \t]+(?:[+-]?\.?\d|\w))/,{cases:{"@keywords":{token:"keyword",next:"@pop"},"->|<-|>:|<:|<%":{token:"keyword",next:"@pop"},"@default":{token:"@rematch",next:"@pop"}}}],["","","@pop"]],comment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@push"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],case:[[/\b_\*/,"key"],[/\b(_|true|false|null|this|super)\b/,"keyword","@allowMethod"],[/\bif\b|=>/,"keyword","@pop"],[/`[^`]+`/,"identifier","@allowMethod"],[/@name/,"variable","@allowMethod"],[/:::?|\||@(?![a-z_$])/,"keyword"],{include:"@root"}],vardef:[[/\b_\*/,"key"],[/\b(_|true|false|null|this|super)\b/,"keyword"],[/@name/,"variable"],[/:::?|\||@(?![a-z_$])/,"keyword"],[/=|:(?!:)/,"operator","@pop"],[/$/,"white","@pop"],{include:"@root"}],string:[[/[^\\"\n\r]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}]],stringt:[[/[^\\"\n\r]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"(?=""")/,"string"],[/"""/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/"/,"string"]],fstring:[[/@escapes/,"string.escape"],[/"/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/\$\$/,"string"],[/(\$)([a-z_]\w*)/,["operator","identifier"]],[/\$\{/,"operator","@interp"],[/%%/,"string"],[/(%)([\-#+ 0,(])(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,["metatag","keyword.modifier","number","metatag"]],[/(%)(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,["metatag","number","metatag"]],[/(%)([\-#+ 0,(])(@fstring_conv)/,["metatag","keyword.modifier","metatag"]],[/(%)(@fstring_conv)/,["metatag","metatag"]],[/./,"string"]],fstringt:[[/@escapes/,"string.escape"],[/"(?=""")/,"string"],[/"""/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/\$\$/,"string"],[/(\$)([a-z_]\w*)/,["operator","identifier"]],[/\$\{/,"operator","@interp"],[/%%/,"string"],[/(%)([\-#+ 0,(])(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,["metatag","keyword.modifier","number","metatag"]],[/(%)(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,["metatag","number","metatag"]],[/(%)([\-#+ 0,(])(@fstring_conv)/,["metatag","keyword.modifier","metatag"]],[/(%)(@fstring_conv)/,["metatag","metatag"]],[/./,"string"]],sstring:[[/@escapes/,"string.escape"],[/"/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/\$\$/,"string"],[/(\$)([a-z_]\w*)/,["operator","identifier"]],[/\$\{/,"operator","@interp"],[/./,"string"]],sstringt:[[/@escapes/,"string.escape"],[/"(?=""")/,"string"],[/"""/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/\$\$/,"string"],[/(\$)([a-z_]\w*)/,["operator","identifier"]],[/\$\{/,"operator","@interp"],[/./,"string"]],interp:[[/{/,"operator","@push"],[/}/,"operator","@pop"],{include:"@root"}],rawstring:[[/[^"]/,"string"],[/"/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}]],rawstringt:[[/[^"]/,"string"],[/"(?=""")/,"string"],[/"""/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/"/,"string"]],whitespace:[[/[ \t\r\n]+/,"white"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}};return g(m);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/scheme/scheme.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/scheme/scheme.js deleted file mode 100644 index aca0c9058f..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/scheme/scheme.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/scheme/scheme", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(o,e)=>{for(var t in e)s(o,t,{get:e[t],enumerable:!0})},m=(o,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of i(e))!l.call(o,n)&&n!==t&&s(o,n,{get:()=>e[n],enumerable:!(a=r(e,n))||a.enumerable});return o};var p=o=>m(s({},"__esModule",{value:!0}),o);var u={};c(u,{conf:()=>d,language:()=>g});var d={comments:{lineComment:";",blockComment:["#|","|#"]},brackets:[["(",")"],["{","}"],["[","]"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}]},g={defaultToken:"",ignoreCase:!0,tokenPostfix:".scheme",brackets:[{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"}],keywords:["case","do","let","loop","if","else","when","cons","car","cdr","cond","lambda","lambda*","syntax-rules","format","set!","quote","eval","append","list","list?","member?","load"],constants:["#t","#f"],operators:["eq?","eqv?","equal?","and","or","not","null?"],tokenizer:{root:[[/#[xXoObB][0-9a-fA-F]+/,"number.hex"],[/[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?/,"number.float"],[/(?:\b(?:(define|define-syntax|define-macro))\b)(\s+)((?:\w|\-|\!|\?)*)/,["keyword","white","variable"]],{include:"@whitespace"},{include:"@strings"},[/[a-zA-Z_#][a-zA-Z0-9_\-\?\!\*]*/,{cases:{"@keywords":"keyword","@constants":"constant","@operators":"operators","@default":"identifier"}}]],comment:[[/[^\|#]+/,"comment"],[/#\|/,"comment","@push"],[/\|#/,"comment","@pop"],[/[\|#]/,"comment"]],whitespace:[[/[ \t\r\n]+/,"white"],[/#\|/,"comment","@comment"],[/;.*$/,"comment"]],strings:[[/"$/,"string","@popall"],[/"(?=.)/,"string","@multiLineString"]],multiLineString:[[/[^\\"]+$/,"string","@popall"],[/[^\\"]+/,"string"],[/\\./,"string.escape"],[/"/,"string","@popall"],[/\\$/,"string"]]}};return p(u);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/scss/scss.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/scss/scss.js deleted file mode 100644 index d4770cf0df..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/scss/scss.js +++ /dev/null @@ -1,12 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/scss/scss", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var i=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var c=(t,e)=>{for(var o in e)i(t,o,{get:e[o],enumerable:!0})},m=(t,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of l(e))!d.call(t,n)&&n!==o&&i(t,n,{get:()=>e[n],enumerable:!(r=a(e,n))||r.enumerable});return t};var s=t=>m(i({},"__esModule",{value:!0}),t);var k={};c(k,{conf:()=>u,language:()=>p});var u={wordPattern:/(#?-?\d*\.\d\w*%?)|([@$#!.:]?[\w-?]+%?)|[@#!.]/g,comments:{blockComment:["/*","*/"],lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\/"),end:new RegExp("^\\s*\\/\\*\\s*#endregion\\b.*\\*\\/")}}},p={defaultToken:"",tokenPostfix:".scss",ws:`[ -\r\f]*`,identifier:"-?-?([a-zA-Z]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],tokenizer:{root:[{include:"@selector"}],selector:[{include:"@comments"},{include:"@import"},{include:"@variabledeclaration"},{include:"@warndebug"},["[@](include)",{token:"keyword",next:"@includedeclaration"}],["[@](keyframes|-webkit-keyframes|-moz-keyframes|-o-keyframes)",{token:"keyword",next:"@keyframedeclaration"}],["[@](page|content|font-face|-moz-document)",{token:"keyword"}],["[@](charset|namespace)",{token:"keyword",next:"@declarationbody"}],["[@](function)",{token:"keyword",next:"@functiondeclaration"}],["[@](mixin)",{token:"keyword",next:"@mixindeclaration"}],["url(\\-prefix)?\\(",{token:"meta",next:"@urldeclaration"}],{include:"@controlstatement"},{include:"@selectorname"},["[&\\*]","tag"],["[>\\+,]","delimiter"],["\\[",{token:"delimiter.bracket",next:"@selectorattribute"}],["{",{token:"delimiter.curly",next:"@selectorbody"}]],selectorbody:[["[*_]?@identifier@ws:(?=(\\s|\\d|[^{;}]*[;}]))","attribute.name","@rulevalue"],{include:"@selector"},["[@](extend)",{token:"keyword",next:"@extendbody"}],["[@](return)",{token:"keyword",next:"@declarationbody"}],["}",{token:"delimiter.curly",next:"@pop"}]],selectorname:[["#{",{token:"meta",next:"@variableinterpolation"}],["(\\.|#(?=[^{])|%|(@identifier)|:)+","tag"]],selectorattribute:[{include:"@term"},["]",{token:"delimiter.bracket",next:"@pop"}]],term:[{include:"@comments"},["url(\\-prefix)?\\(",{token:"meta",next:"@urldeclaration"}],{include:"@functioninvocation"},{include:"@numbers"},{include:"@strings"},{include:"@variablereference"},["(and\\b|or\\b|not\\b)","operator"],{include:"@name"},["([<>=\\+\\-\\*\\/\\^\\|\\~,])","operator"],[",","delimiter"],["!default","literal"],["\\(",{token:"delimiter.parenthesis",next:"@parenthizedterm"}]],rulevalue:[{include:"@term"},["!important","literal"],[";","delimiter","@pop"],["{",{token:"delimiter.curly",switchTo:"@nestedproperty"}],["(?=})",{token:"",next:"@pop"}]],nestedproperty:[["[*_]?@identifier@ws:","attribute.name","@rulevalue"],{include:"@comments"},["}",{token:"delimiter.curly",next:"@pop"}]],warndebug:[["[@](warn|debug)",{token:"keyword",next:"@declarationbody"}]],import:[["[@](import)",{token:"keyword",next:"@declarationbody"}]],variabledeclaration:[["\\$@identifier@ws:","variable.decl","@declarationbody"]],urldeclaration:[{include:"@strings"},[`[^)\r -]+`,"string"],["\\)",{token:"meta",next:"@pop"}]],parenthizedterm:[{include:"@term"},["\\)",{token:"delimiter.parenthesis",next:"@pop"}]],declarationbody:[{include:"@term"},[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],extendbody:[{include:"@selectorname"},["!optional","literal"],[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],variablereference:[["\\$@identifier","variable.ref"],["\\.\\.\\.","operator"],["#{",{token:"meta",next:"@variableinterpolation"}]],variableinterpolation:[{include:"@variablereference"},["}",{token:"meta",next:"@pop"}]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[".","comment"]],name:[["@identifier","attribute.value"]],numbers:[["(\\d*\\.)?\\d+([eE][\\-+]?\\d+)?",{token:"number",next:"@units"}],["#[0-9a-fA-F_]+(?!\\w)","number.hex"]],units:[["(em|ex|ch|rem|fr|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?","number","@pop"]],functiondeclaration:[["@identifier@ws\\(",{token:"meta",next:"@parameterdeclaration"}],["{",{token:"delimiter.curly",switchTo:"@functionbody"}]],mixindeclaration:[["@identifier@ws\\(",{token:"meta",next:"@parameterdeclaration"}],["@identifier","meta"],["{",{token:"delimiter.curly",switchTo:"@selectorbody"}]],parameterdeclaration:[["\\$@identifier@ws:","variable.decl"],["\\.\\.\\.","operator"],[",","delimiter"],{include:"@term"},["\\)",{token:"meta",next:"@pop"}]],includedeclaration:[{include:"@functioninvocation"},["@identifier","meta"],[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}],["{",{token:"delimiter.curly",switchTo:"@selectorbody"}]],keyframedeclaration:[["@identifier","meta"],["{",{token:"delimiter.curly",switchTo:"@keyframebody"}]],keyframebody:[{include:"@term"},["{",{token:"delimiter.curly",next:"@selectorbody"}],["}",{token:"delimiter.curly",next:"@pop"}]],controlstatement:[["[@](if|else|for|while|each|media)",{token:"keyword.flow",next:"@controlstatementdeclaration"}]],controlstatementdeclaration:[["(in|from|through|if|to)\\b",{token:"keyword.flow"}],{include:"@term"},["{",{token:"delimiter.curly",switchTo:"@selectorbody"}]],functionbody:[["[@](return)",{token:"keyword"}],{include:"@variabledeclaration"},{include:"@term"},{include:"@controlstatement"},[";","delimiter"],["}",{token:"delimiter.curly",next:"@pop"}]],functioninvocation:[["@identifier\\(",{token:"meta",next:"@functionarguments"}]],functionarguments:[["\\$@identifier@ws:","attribute.name"],["[,]","delimiter"],{include:"@term"},["\\)",{token:"meta",next:"@pop"}]],strings:[['~?"',{token:"string.delimiter",next:"@stringenddoublequote"}],["~?'",{token:"string.delimiter",next:"@stringendquote"}]],stringenddoublequote:[["\\\\.","string"],['"',{token:"string.delimiter",next:"@pop"}],[".","string"]],stringendquote:[["\\\\.","string"],["'",{token:"string.delimiter",next:"@pop"}],[".","string"]]}};return s(k);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/shell/shell.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/shell/shell.js deleted file mode 100644 index 5564df9364..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/shell/shell.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/shell/shell", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var a=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var n=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(r,e)=>{for(var i in e)a(r,i,{get:e[i],enumerable:!0})},d=(r,e,i,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of n(e))!l.call(r,t)&&t!==i&&a(r,t,{get:()=>e[t],enumerable:!(o=s(e,t))||o.enumerable});return r};var p=r=>d(a({},"__esModule",{value:!0}),r);var g={};c(g,{conf:()=>m,language:()=>u});var m={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}]},u={defaultToken:"",ignoreCase:!0,tokenPostfix:".shell",brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:["if","then","do","else","elif","while","until","for","in","esac","fi","fin","fil","done","exit","set","unset","export","function"],builtins:["ab","awk","bash","beep","cat","cc","cd","chown","chmod","chroot","clear","cp","curl","cut","diff","echo","find","gawk","gcc","get","git","grep","hg","kill","killall","ln","ls","make","mkdir","openssl","mv","nc","node","npm","ping","ps","restart","rm","rmdir","sed","service","sh","shopt","shred","source","sort","sleep","ssh","start","stop","su","sudo","svn","tee","telnet","top","touch","vi","vim","wall","wc","wget","who","write","yes","zsh"],startingWithDash:/\-+\w+/,identifiersWithDashes:/[a-zA-Z]\w+(?:@startingWithDash)+/,symbols:/[=>{ -"use strict";var moduleExports=(()=>{var f=Object.defineProperty;var t=Object.getOwnPropertyDescriptor;var n=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var o=(e,x)=>{for(var d in x)f(e,d,{get:x[d],enumerable:!0})},r=(e,x,d,u)=>{if(x&&typeof x=="object"||typeof x=="function")for(let i of n(x))!s.call(e,i)&&i!==d&&f(e,i,{get:()=>x[i],enumerable:!(u=t(x,i))||u.enumerable});return e};var a=e=>r(f({},"__esModule",{value:!0}),e);var l={};o(l,{conf:()=>c,language:()=>m});var c={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}]},m={defaultToken:"",tokenPostfix:".sol",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["pragma","solidity","contract","library","using","struct","function","modifier","constructor","address","string","bool","Int","Uint","Byte","Fixed","Ufixed","int","int8","int16","int24","int32","int40","int48","int56","int64","int72","int80","int88","int96","int104","int112","int120","int128","int136","int144","int152","int160","int168","int176","int184","int192","int200","int208","int216","int224","int232","int240","int248","int256","uint","uint8","uint16","uint24","uint32","uint40","uint48","uint56","uint64","uint72","uint80","uint88","uint96","uint104","uint112","uint120","uint128","uint136","uint144","uint152","uint160","uint168","uint176","uint184","uint192","uint200","uint208","uint216","uint224","uint232","uint240","uint248","uint256","byte","bytes","bytes1","bytes2","bytes3","bytes4","bytes5","bytes6","bytes7","bytes8","bytes9","bytes10","bytes11","bytes12","bytes13","bytes14","bytes15","bytes16","bytes17","bytes18","bytes19","bytes20","bytes21","bytes22","bytes23","bytes24","bytes25","bytes26","bytes27","bytes28","bytes29","bytes30","bytes31","bytes32","fixed","fixed0x8","fixed0x16","fixed0x24","fixed0x32","fixed0x40","fixed0x48","fixed0x56","fixed0x64","fixed0x72","fixed0x80","fixed0x88","fixed0x96","fixed0x104","fixed0x112","fixed0x120","fixed0x128","fixed0x136","fixed0x144","fixed0x152","fixed0x160","fixed0x168","fixed0x176","fixed0x184","fixed0x192","fixed0x200","fixed0x208","fixed0x216","fixed0x224","fixed0x232","fixed0x240","fixed0x248","fixed0x256","fixed8x8","fixed8x16","fixed8x24","fixed8x32","fixed8x40","fixed8x48","fixed8x56","fixed8x64","fixed8x72","fixed8x80","fixed8x88","fixed8x96","fixed8x104","fixed8x112","fixed8x120","fixed8x128","fixed8x136","fixed8x144","fixed8x152","fixed8x160","fixed8x168","fixed8x176","fixed8x184","fixed8x192","fixed8x200","fixed8x208","fixed8x216","fixed8x224","fixed8x232","fixed8x240","fixed8x248","fixed16x8","fixed16x16","fixed16x24","fixed16x32","fixed16x40","fixed16x48","fixed16x56","fixed16x64","fixed16x72","fixed16x80","fixed16x88","fixed16x96","fixed16x104","fixed16x112","fixed16x120","fixed16x128","fixed16x136","fixed16x144","fixed16x152","fixed16x160","fixed16x168","fixed16x176","fixed16x184","fixed16x192","fixed16x200","fixed16x208","fixed16x216","fixed16x224","fixed16x232","fixed16x240","fixed24x8","fixed24x16","fixed24x24","fixed24x32","fixed24x40","fixed24x48","fixed24x56","fixed24x64","fixed24x72","fixed24x80","fixed24x88","fixed24x96","fixed24x104","fixed24x112","fixed24x120","fixed24x128","fixed24x136","fixed24x144","fixed24x152","fixed24x160","fixed24x168","fixed24x176","fixed24x184","fixed24x192","fixed24x200","fixed24x208","fixed24x216","fixed24x224","fixed24x232","fixed32x8","fixed32x16","fixed32x24","fixed32x32","fixed32x40","fixed32x48","fixed32x56","fixed32x64","fixed32x72","fixed32x80","fixed32x88","fixed32x96","fixed32x104","fixed32x112","fixed32x120","fixed32x128","fixed32x136","fixed32x144","fixed32x152","fixed32x160","fixed32x168","fixed32x176","fixed32x184","fixed32x192","fixed32x200","fixed32x208","fixed32x216","fixed32x224","fixed40x8","fixed40x16","fixed40x24","fixed40x32","fixed40x40","fixed40x48","fixed40x56","fixed40x64","fixed40x72","fixed40x80","fixed40x88","fixed40x96","fixed40x104","fixed40x112","fixed40x120","fixed40x128","fixed40x136","fixed40x144","fixed40x152","fixed40x160","fixed40x168","fixed40x176","fixed40x184","fixed40x192","fixed40x200","fixed40x208","fixed40x216","fixed48x8","fixed48x16","fixed48x24","fixed48x32","fixed48x40","fixed48x48","fixed48x56","fixed48x64","fixed48x72","fixed48x80","fixed48x88","fixed48x96","fixed48x104","fixed48x112","fixed48x120","fixed48x128","fixed48x136","fixed48x144","fixed48x152","fixed48x160","fixed48x168","fixed48x176","fixed48x184","fixed48x192","fixed48x200","fixed48x208","fixed56x8","fixed56x16","fixed56x24","fixed56x32","fixed56x40","fixed56x48","fixed56x56","fixed56x64","fixed56x72","fixed56x80","fixed56x88","fixed56x96","fixed56x104","fixed56x112","fixed56x120","fixed56x128","fixed56x136","fixed56x144","fixed56x152","fixed56x160","fixed56x168","fixed56x176","fixed56x184","fixed56x192","fixed56x200","fixed64x8","fixed64x16","fixed64x24","fixed64x32","fixed64x40","fixed64x48","fixed64x56","fixed64x64","fixed64x72","fixed64x80","fixed64x88","fixed64x96","fixed64x104","fixed64x112","fixed64x120","fixed64x128","fixed64x136","fixed64x144","fixed64x152","fixed64x160","fixed64x168","fixed64x176","fixed64x184","fixed64x192","fixed72x8","fixed72x16","fixed72x24","fixed72x32","fixed72x40","fixed72x48","fixed72x56","fixed72x64","fixed72x72","fixed72x80","fixed72x88","fixed72x96","fixed72x104","fixed72x112","fixed72x120","fixed72x128","fixed72x136","fixed72x144","fixed72x152","fixed72x160","fixed72x168","fixed72x176","fixed72x184","fixed80x8","fixed80x16","fixed80x24","fixed80x32","fixed80x40","fixed80x48","fixed80x56","fixed80x64","fixed80x72","fixed80x80","fixed80x88","fixed80x96","fixed80x104","fixed80x112","fixed80x120","fixed80x128","fixed80x136","fixed80x144","fixed80x152","fixed80x160","fixed80x168","fixed80x176","fixed88x8","fixed88x16","fixed88x24","fixed88x32","fixed88x40","fixed88x48","fixed88x56","fixed88x64","fixed88x72","fixed88x80","fixed88x88","fixed88x96","fixed88x104","fixed88x112","fixed88x120","fixed88x128","fixed88x136","fixed88x144","fixed88x152","fixed88x160","fixed88x168","fixed96x8","fixed96x16","fixed96x24","fixed96x32","fixed96x40","fixed96x48","fixed96x56","fixed96x64","fixed96x72","fixed96x80","fixed96x88","fixed96x96","fixed96x104","fixed96x112","fixed96x120","fixed96x128","fixed96x136","fixed96x144","fixed96x152","fixed96x160","fixed104x8","fixed104x16","fixed104x24","fixed104x32","fixed104x40","fixed104x48","fixed104x56","fixed104x64","fixed104x72","fixed104x80","fixed104x88","fixed104x96","fixed104x104","fixed104x112","fixed104x120","fixed104x128","fixed104x136","fixed104x144","fixed104x152","fixed112x8","fixed112x16","fixed112x24","fixed112x32","fixed112x40","fixed112x48","fixed112x56","fixed112x64","fixed112x72","fixed112x80","fixed112x88","fixed112x96","fixed112x104","fixed112x112","fixed112x120","fixed112x128","fixed112x136","fixed112x144","fixed120x8","fixed120x16","fixed120x24","fixed120x32","fixed120x40","fixed120x48","fixed120x56","fixed120x64","fixed120x72","fixed120x80","fixed120x88","fixed120x96","fixed120x104","fixed120x112","fixed120x120","fixed120x128","fixed120x136","fixed128x8","fixed128x16","fixed128x24","fixed128x32","fixed128x40","fixed128x48","fixed128x56","fixed128x64","fixed128x72","fixed128x80","fixed128x88","fixed128x96","fixed128x104","fixed128x112","fixed128x120","fixed128x128","fixed136x8","fixed136x16","fixed136x24","fixed136x32","fixed136x40","fixed136x48","fixed136x56","fixed136x64","fixed136x72","fixed136x80","fixed136x88","fixed136x96","fixed136x104","fixed136x112","fixed136x120","fixed144x8","fixed144x16","fixed144x24","fixed144x32","fixed144x40","fixed144x48","fixed144x56","fixed144x64","fixed144x72","fixed144x80","fixed144x88","fixed144x96","fixed144x104","fixed144x112","fixed152x8","fixed152x16","fixed152x24","fixed152x32","fixed152x40","fixed152x48","fixed152x56","fixed152x64","fixed152x72","fixed152x80","fixed152x88","fixed152x96","fixed152x104","fixed160x8","fixed160x16","fixed160x24","fixed160x32","fixed160x40","fixed160x48","fixed160x56","fixed160x64","fixed160x72","fixed160x80","fixed160x88","fixed160x96","fixed168x8","fixed168x16","fixed168x24","fixed168x32","fixed168x40","fixed168x48","fixed168x56","fixed168x64","fixed168x72","fixed168x80","fixed168x88","fixed176x8","fixed176x16","fixed176x24","fixed176x32","fixed176x40","fixed176x48","fixed176x56","fixed176x64","fixed176x72","fixed176x80","fixed184x8","fixed184x16","fixed184x24","fixed184x32","fixed184x40","fixed184x48","fixed184x56","fixed184x64","fixed184x72","fixed192x8","fixed192x16","fixed192x24","fixed192x32","fixed192x40","fixed192x48","fixed192x56","fixed192x64","fixed200x8","fixed200x16","fixed200x24","fixed200x32","fixed200x40","fixed200x48","fixed200x56","fixed208x8","fixed208x16","fixed208x24","fixed208x32","fixed208x40","fixed208x48","fixed216x8","fixed216x16","fixed216x24","fixed216x32","fixed216x40","fixed224x8","fixed224x16","fixed224x24","fixed224x32","fixed232x8","fixed232x16","fixed232x24","fixed240x8","fixed240x16","fixed248x8","ufixed","ufixed0x8","ufixed0x16","ufixed0x24","ufixed0x32","ufixed0x40","ufixed0x48","ufixed0x56","ufixed0x64","ufixed0x72","ufixed0x80","ufixed0x88","ufixed0x96","ufixed0x104","ufixed0x112","ufixed0x120","ufixed0x128","ufixed0x136","ufixed0x144","ufixed0x152","ufixed0x160","ufixed0x168","ufixed0x176","ufixed0x184","ufixed0x192","ufixed0x200","ufixed0x208","ufixed0x216","ufixed0x224","ufixed0x232","ufixed0x240","ufixed0x248","ufixed0x256","ufixed8x8","ufixed8x16","ufixed8x24","ufixed8x32","ufixed8x40","ufixed8x48","ufixed8x56","ufixed8x64","ufixed8x72","ufixed8x80","ufixed8x88","ufixed8x96","ufixed8x104","ufixed8x112","ufixed8x120","ufixed8x128","ufixed8x136","ufixed8x144","ufixed8x152","ufixed8x160","ufixed8x168","ufixed8x176","ufixed8x184","ufixed8x192","ufixed8x200","ufixed8x208","ufixed8x216","ufixed8x224","ufixed8x232","ufixed8x240","ufixed8x248","ufixed16x8","ufixed16x16","ufixed16x24","ufixed16x32","ufixed16x40","ufixed16x48","ufixed16x56","ufixed16x64","ufixed16x72","ufixed16x80","ufixed16x88","ufixed16x96","ufixed16x104","ufixed16x112","ufixed16x120","ufixed16x128","ufixed16x136","ufixed16x144","ufixed16x152","ufixed16x160","ufixed16x168","ufixed16x176","ufixed16x184","ufixed16x192","ufixed16x200","ufixed16x208","ufixed16x216","ufixed16x224","ufixed16x232","ufixed16x240","ufixed24x8","ufixed24x16","ufixed24x24","ufixed24x32","ufixed24x40","ufixed24x48","ufixed24x56","ufixed24x64","ufixed24x72","ufixed24x80","ufixed24x88","ufixed24x96","ufixed24x104","ufixed24x112","ufixed24x120","ufixed24x128","ufixed24x136","ufixed24x144","ufixed24x152","ufixed24x160","ufixed24x168","ufixed24x176","ufixed24x184","ufixed24x192","ufixed24x200","ufixed24x208","ufixed24x216","ufixed24x224","ufixed24x232","ufixed32x8","ufixed32x16","ufixed32x24","ufixed32x32","ufixed32x40","ufixed32x48","ufixed32x56","ufixed32x64","ufixed32x72","ufixed32x80","ufixed32x88","ufixed32x96","ufixed32x104","ufixed32x112","ufixed32x120","ufixed32x128","ufixed32x136","ufixed32x144","ufixed32x152","ufixed32x160","ufixed32x168","ufixed32x176","ufixed32x184","ufixed32x192","ufixed32x200","ufixed32x208","ufixed32x216","ufixed32x224","ufixed40x8","ufixed40x16","ufixed40x24","ufixed40x32","ufixed40x40","ufixed40x48","ufixed40x56","ufixed40x64","ufixed40x72","ufixed40x80","ufixed40x88","ufixed40x96","ufixed40x104","ufixed40x112","ufixed40x120","ufixed40x128","ufixed40x136","ufixed40x144","ufixed40x152","ufixed40x160","ufixed40x168","ufixed40x176","ufixed40x184","ufixed40x192","ufixed40x200","ufixed40x208","ufixed40x216","ufixed48x8","ufixed48x16","ufixed48x24","ufixed48x32","ufixed48x40","ufixed48x48","ufixed48x56","ufixed48x64","ufixed48x72","ufixed48x80","ufixed48x88","ufixed48x96","ufixed48x104","ufixed48x112","ufixed48x120","ufixed48x128","ufixed48x136","ufixed48x144","ufixed48x152","ufixed48x160","ufixed48x168","ufixed48x176","ufixed48x184","ufixed48x192","ufixed48x200","ufixed48x208","ufixed56x8","ufixed56x16","ufixed56x24","ufixed56x32","ufixed56x40","ufixed56x48","ufixed56x56","ufixed56x64","ufixed56x72","ufixed56x80","ufixed56x88","ufixed56x96","ufixed56x104","ufixed56x112","ufixed56x120","ufixed56x128","ufixed56x136","ufixed56x144","ufixed56x152","ufixed56x160","ufixed56x168","ufixed56x176","ufixed56x184","ufixed56x192","ufixed56x200","ufixed64x8","ufixed64x16","ufixed64x24","ufixed64x32","ufixed64x40","ufixed64x48","ufixed64x56","ufixed64x64","ufixed64x72","ufixed64x80","ufixed64x88","ufixed64x96","ufixed64x104","ufixed64x112","ufixed64x120","ufixed64x128","ufixed64x136","ufixed64x144","ufixed64x152","ufixed64x160","ufixed64x168","ufixed64x176","ufixed64x184","ufixed64x192","ufixed72x8","ufixed72x16","ufixed72x24","ufixed72x32","ufixed72x40","ufixed72x48","ufixed72x56","ufixed72x64","ufixed72x72","ufixed72x80","ufixed72x88","ufixed72x96","ufixed72x104","ufixed72x112","ufixed72x120","ufixed72x128","ufixed72x136","ufixed72x144","ufixed72x152","ufixed72x160","ufixed72x168","ufixed72x176","ufixed72x184","ufixed80x8","ufixed80x16","ufixed80x24","ufixed80x32","ufixed80x40","ufixed80x48","ufixed80x56","ufixed80x64","ufixed80x72","ufixed80x80","ufixed80x88","ufixed80x96","ufixed80x104","ufixed80x112","ufixed80x120","ufixed80x128","ufixed80x136","ufixed80x144","ufixed80x152","ufixed80x160","ufixed80x168","ufixed80x176","ufixed88x8","ufixed88x16","ufixed88x24","ufixed88x32","ufixed88x40","ufixed88x48","ufixed88x56","ufixed88x64","ufixed88x72","ufixed88x80","ufixed88x88","ufixed88x96","ufixed88x104","ufixed88x112","ufixed88x120","ufixed88x128","ufixed88x136","ufixed88x144","ufixed88x152","ufixed88x160","ufixed88x168","ufixed96x8","ufixed96x16","ufixed96x24","ufixed96x32","ufixed96x40","ufixed96x48","ufixed96x56","ufixed96x64","ufixed96x72","ufixed96x80","ufixed96x88","ufixed96x96","ufixed96x104","ufixed96x112","ufixed96x120","ufixed96x128","ufixed96x136","ufixed96x144","ufixed96x152","ufixed96x160","ufixed104x8","ufixed104x16","ufixed104x24","ufixed104x32","ufixed104x40","ufixed104x48","ufixed104x56","ufixed104x64","ufixed104x72","ufixed104x80","ufixed104x88","ufixed104x96","ufixed104x104","ufixed104x112","ufixed104x120","ufixed104x128","ufixed104x136","ufixed104x144","ufixed104x152","ufixed112x8","ufixed112x16","ufixed112x24","ufixed112x32","ufixed112x40","ufixed112x48","ufixed112x56","ufixed112x64","ufixed112x72","ufixed112x80","ufixed112x88","ufixed112x96","ufixed112x104","ufixed112x112","ufixed112x120","ufixed112x128","ufixed112x136","ufixed112x144","ufixed120x8","ufixed120x16","ufixed120x24","ufixed120x32","ufixed120x40","ufixed120x48","ufixed120x56","ufixed120x64","ufixed120x72","ufixed120x80","ufixed120x88","ufixed120x96","ufixed120x104","ufixed120x112","ufixed120x120","ufixed120x128","ufixed120x136","ufixed128x8","ufixed128x16","ufixed128x24","ufixed128x32","ufixed128x40","ufixed128x48","ufixed128x56","ufixed128x64","ufixed128x72","ufixed128x80","ufixed128x88","ufixed128x96","ufixed128x104","ufixed128x112","ufixed128x120","ufixed128x128","ufixed136x8","ufixed136x16","ufixed136x24","ufixed136x32","ufixed136x40","ufixed136x48","ufixed136x56","ufixed136x64","ufixed136x72","ufixed136x80","ufixed136x88","ufixed136x96","ufixed136x104","ufixed136x112","ufixed136x120","ufixed144x8","ufixed144x16","ufixed144x24","ufixed144x32","ufixed144x40","ufixed144x48","ufixed144x56","ufixed144x64","ufixed144x72","ufixed144x80","ufixed144x88","ufixed144x96","ufixed144x104","ufixed144x112","ufixed152x8","ufixed152x16","ufixed152x24","ufixed152x32","ufixed152x40","ufixed152x48","ufixed152x56","ufixed152x64","ufixed152x72","ufixed152x80","ufixed152x88","ufixed152x96","ufixed152x104","ufixed160x8","ufixed160x16","ufixed160x24","ufixed160x32","ufixed160x40","ufixed160x48","ufixed160x56","ufixed160x64","ufixed160x72","ufixed160x80","ufixed160x88","ufixed160x96","ufixed168x8","ufixed168x16","ufixed168x24","ufixed168x32","ufixed168x40","ufixed168x48","ufixed168x56","ufixed168x64","ufixed168x72","ufixed168x80","ufixed168x88","ufixed176x8","ufixed176x16","ufixed176x24","ufixed176x32","ufixed176x40","ufixed176x48","ufixed176x56","ufixed176x64","ufixed176x72","ufixed176x80","ufixed184x8","ufixed184x16","ufixed184x24","ufixed184x32","ufixed184x40","ufixed184x48","ufixed184x56","ufixed184x64","ufixed184x72","ufixed192x8","ufixed192x16","ufixed192x24","ufixed192x32","ufixed192x40","ufixed192x48","ufixed192x56","ufixed192x64","ufixed200x8","ufixed200x16","ufixed200x24","ufixed200x32","ufixed200x40","ufixed200x48","ufixed200x56","ufixed208x8","ufixed208x16","ufixed208x24","ufixed208x32","ufixed208x40","ufixed208x48","ufixed216x8","ufixed216x16","ufixed216x24","ufixed216x32","ufixed216x40","ufixed224x8","ufixed224x16","ufixed224x24","ufixed224x32","ufixed232x8","ufixed232x16","ufixed232x24","ufixed240x8","ufixed240x16","ufixed248x8","event","enum","let","mapping","private","public","external","inherited","payable","true","false","var","import","constant","if","else","for","else","for","while","do","break","continue","throw","returns","return","suicide","new","is","this","super"],operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/,"number.hex"],[/0[0-7']*[0-7](@integersuffix)/,"number.octal"],[/0[bB][0-1']*[0-1](@integersuffix)/,"number.binary"],[/\d[\d']*\d(@integersuffix)/,"number"],[/\d(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]]}};return a(l);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/sophia/sophia.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/sophia/sophia.js deleted file mode 100644 index 857b4b73d9..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/sophia/sophia.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/sophia/sophia", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var o in e)s(t,o,{get:e[o],enumerable:!0})},m=(t,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of a(e))!c.call(t,n)&&n!==o&&s(t,n,{get:()=>e[n],enumerable:!(r=i(e,n))||r.enumerable});return t};var d=t=>m(s({},"__esModule",{value:!0}),t);var u={};l(u,{conf:()=>f,language:()=>g});var f={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}]},g={defaultToken:"",tokenPostfix:".aes",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["contract","library","entrypoint","function","stateful","state","hash","signature","tuple","list","address","string","bool","int","record","datatype","type","option","oracle","oracle_query","Call","Bits","Bytes","Oracle","String","Crypto","Address","Auth","Chain","None","Some","bits","bytes","event","let","map","private","public","true","false","var","if","else","throw"],operators:["=",">","<","!","~","?","::",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/,"number.hex"],[/0[0-7']*[0-7](@integersuffix)/,"number.octal"],[/0[bB][0-1']*[0-1](@integersuffix)/,"number.binary"],[/\d[\d']*\d(@integersuffix)/,"number"],[/\d(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]]}};return d(u);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/sparql/sparql.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/sparql/sparql.js deleted file mode 100644 index 6aae90416d..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/sparql/sparql.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/sparql/sparql", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var d=(s,e)=>{for(var n in e)o(s,n,{get:e[n],enumerable:!0})},c=(s,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of a(e))!l.call(s,t)&&t!==n&&o(s,t,{get:()=>e[t],enumerable:!(r=i(e,t))||r.enumerable});return s};var g=s=>c(o({},"__esModule",{value:!0}),s);var m={};d(m,{conf:()=>u,language:()=>p});var u={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"'",close:"'",notIn:["string"]},{open:'"',close:'"',notIn:["string"]},{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"}]},p={defaultToken:"",tokenPostfix:".rq",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["add","as","asc","ask","base","by","clear","construct","copy","create","data","delete","desc","describe","distinct","drop","false","filter","from","graph","group","having","in","insert","limit","load","minus","move","named","not","offset","optional","order","prefix","reduced","select","service","silent","to","true","undef","union","using","values","where","with"],builtinFunctions:["a","abs","avg","bind","bnode","bound","ceil","coalesce","concat","contains","count","datatype","day","encode_for_uri","exists","floor","group_concat","hours","if","iri","isblank","isiri","isliteral","isnumeric","isuri","lang","langmatches","lcase","max","md5","min","minutes","month","now","rand","regex","replace","round","sameterm","sample","seconds","sha1","sha256","sha384","sha512","str","strafter","strbefore","strdt","strends","strlang","strlen","strstarts","struuid","substr","sum","timezone","tz","ucase","uri","uuid","year"],ignoreCase:!0,tokenizer:{root:[[/<[^\s\u00a0>]*>?/,"tag"],{include:"@strings"},[/#.*/,"comment"],[/[{}()\[\]]/,"@brackets"],[/[;,.]/,"delimiter"],[/[_\w\d]+:(\.(?=[\w_\-\\%])|[:\w_-]|\\[-\\_~.!$&'()*+,;=/?#@%]|%[a-f\d][a-f\d])*/,"tag"],[/:(\.(?=[\w_\-\\%])|[:\w_-]|\\[-\\_~.!$&'()*+,;=/?#@%]|%[a-f\d][a-f\d])+/,"tag"],[/[$?]?[_\w\d]+/,{cases:{"@keywords":{token:"keyword"},"@builtinFunctions":{token:"predefined.sql"},"@default":"identifier"}}],[/\^\^/,"operator.sql"],[/\^[*+\-<>=&|^\/!?]*/,"operator.sql"],[/[*+\-<>=&|\/!?]/,"operator.sql"],[/@[a-z\d\-]*/,"metatag.html"],[/\s+/,"white"]],strings:[[/'([^'\\]|\\.)*$/,"string.invalid"],[/'$/,"string.sql","@pop"],[/'/,"string.sql","@stringBody"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"$/,"string.sql","@pop"],[/"/,"string.sql","@dblStringBody"]],stringBody:[[/[^\\']+/,"string.sql"],[/\\./,"string.escape"],[/'/,"string.sql","@pop"]],dblStringBody:[[/[^\\"]+/,"string.sql"],[/\\./,"string.escape"],[/"/,"string.sql","@pop"]]}};return g(m);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/sql/sql.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/sql/sql.js deleted file mode 100644 index ed2f1a4586..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/sql/sql.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/sql/sql", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var I=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var L=(T,E)=>{for(var A in E)I(T,A,{get:E[A],enumerable:!0})},e=(T,E,A,N)=>{if(E&&typeof E=="object"||typeof E=="function")for(let R of O(E))!C.call(T,R)&&R!==A&&I(T,R,{get:()=>E[R],enumerable:!(N=S(E,R))||N.enumerable});return T};var P=T=>e(I({},"__esModule",{value:!0}),T);var M={};L(M,{conf:()=>D,language:()=>U});var D={comments:{lineComment:"--",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},U={defaultToken:"",tokenPostfix:".sql",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["ABORT","ABSOLUTE","ACTION","ADA","ADD","AFTER","ALL","ALLOCATE","ALTER","ALWAYS","ANALYZE","AND","ANY","ARE","AS","ASC","ASSERTION","AT","ATTACH","AUTHORIZATION","AUTOINCREMENT","AVG","BACKUP","BEFORE","BEGIN","BETWEEN","BIT","BIT_LENGTH","BOTH","BREAK","BROWSE","BULK","BY","CASCADE","CASCADED","CASE","CAST","CATALOG","CHAR","CHARACTER","CHARACTER_LENGTH","CHAR_LENGTH","CHECK","CHECKPOINT","CLOSE","CLUSTERED","COALESCE","COLLATE","COLLATION","COLUMN","COMMIT","COMPUTE","CONFLICT","CONNECT","CONNECTION","CONSTRAINT","CONSTRAINTS","CONTAINS","CONTAINSTABLE","CONTINUE","CONVERT","CORRESPONDING","COUNT","CREATE","CROSS","CURRENT","CURRENT_DATE","CURRENT_TIME","CURRENT_TIMESTAMP","CURRENT_USER","CURSOR","DATABASE","DATE","DAY","DBCC","DEALLOCATE","DEC","DECIMAL","DECLARE","DEFAULT","DEFERRABLE","DEFERRED","DELETE","DENY","DESC","DESCRIBE","DESCRIPTOR","DETACH","DIAGNOSTICS","DISCONNECT","DISK","DISTINCT","DISTRIBUTED","DO","DOMAIN","DOUBLE","DROP","DUMP","EACH","ELSE","END","END-EXEC","ERRLVL","ESCAPE","EXCEPT","EXCEPTION","EXCLUDE","EXCLUSIVE","EXEC","EXECUTE","EXISTS","EXIT","EXPLAIN","EXTERNAL","EXTRACT","FAIL","FALSE","FETCH","FILE","FILLFACTOR","FILTER","FIRST","FLOAT","FOLLOWING","FOR","FOREIGN","FORTRAN","FOUND","FREETEXT","FREETEXTTABLE","FROM","FULL","FUNCTION","GENERATED","GET","GLOB","GLOBAL","GO","GOTO","GRANT","GROUP","GROUPS","HAVING","HOLDLOCK","HOUR","IDENTITY","IDENTITYCOL","IDENTITY_INSERT","IF","IGNORE","IMMEDIATE","IN","INCLUDE","INDEX","INDEXED","INDICATOR","INITIALLY","INNER","INPUT","INSENSITIVE","INSERT","INSTEAD","INT","INTEGER","INTERSECT","INTERVAL","INTO","IS","ISNULL","ISOLATION","JOIN","KEY","KILL","LANGUAGE","LAST","LEADING","LEFT","LEVEL","LIKE","LIMIT","LINENO","LOAD","LOCAL","LOWER","MATCH","MATERIALIZED","MAX","MERGE","MIN","MINUTE","MODULE","MONTH","NAMES","NATIONAL","NATURAL","NCHAR","NEXT","NO","NOCHECK","NONCLUSTERED","NONE","NOT","NOTHING","NOTNULL","NULL","NULLIF","NULLS","NUMERIC","OCTET_LENGTH","OF","OFF","OFFSET","OFFSETS","ON","ONLY","OPEN","OPENDATASOURCE","OPENQUERY","OPENROWSET","OPENXML","OPTION","OR","ORDER","OTHERS","OUTER","OUTPUT","OVER","OVERLAPS","PAD","PARTIAL","PARTITION","PASCAL","PERCENT","PIVOT","PLAN","POSITION","PRAGMA","PRECEDING","PRECISION","PREPARE","PRESERVE","PRIMARY","PRINT","PRIOR","PRIVILEGES","PROC","PROCEDURE","PUBLIC","QUERY","RAISE","RAISERROR","RANGE","READ","READTEXT","REAL","RECONFIGURE","RECURSIVE","REFERENCES","REGEXP","REINDEX","RELATIVE","RELEASE","RENAME","REPLACE","REPLICATION","RESTORE","RESTRICT","RETURN","RETURNING","REVERT","REVOKE","RIGHT","ROLLBACK","ROW","ROWCOUNT","ROWGUIDCOL","ROWS","RULE","SAVE","SAVEPOINT","SCHEMA","SCROLL","SECOND","SECTION","SECURITYAUDIT","SELECT","SEMANTICKEYPHRASETABLE","SEMANTICSIMILARITYDETAILSTABLE","SEMANTICSIMILARITYTABLE","SESSION","SESSION_USER","SET","SETUSER","SHUTDOWN","SIZE","SMALLINT","SOME","SPACE","SQL","SQLCA","SQLCODE","SQLERROR","SQLSTATE","SQLWARNING","STATISTICS","SUBSTRING","SUM","SYSTEM_USER","TABLE","TABLESAMPLE","TEMP","TEMPORARY","TEXTSIZE","THEN","TIES","TIME","TIMESTAMP","TIMEZONE_HOUR","TIMEZONE_MINUTE","TO","TOP","TRAILING","TRAN","TRANSACTION","TRANSLATE","TRANSLATION","TRIGGER","TRIM","TRUE","TRUNCATE","TRY_CONVERT","TSEQUAL","UNBOUNDED","UNION","UNIQUE","UNKNOWN","UNPIVOT","UPDATE","UPDATETEXT","UPPER","USAGE","USE","USER","USING","VACUUM","VALUE","VALUES","VARCHAR","VARYING","VIEW","VIRTUAL","WAITFOR","WHEN","WHENEVER","WHERE","WHILE","WINDOW","WITH","WITHIN GROUP","WITHOUT","WORK","WRITE","WRITETEXT","YEAR","ZONE"],operators:["ALL","AND","ANY","BETWEEN","EXISTS","IN","LIKE","NOT","OR","SOME","EXCEPT","INTERSECT","UNION","APPLY","CROSS","FULL","INNER","JOIN","LEFT","OUTER","RIGHT","CONTAINS","FREETEXT","IS","NULL","PIVOT","UNPIVOT","MATCHED"],builtinFunctions:["AVG","CHECKSUM_AGG","COUNT","COUNT_BIG","GROUPING","GROUPING_ID","MAX","MIN","SUM","STDEV","STDEVP","VAR","VARP","CUME_DIST","FIRST_VALUE","LAG","LAST_VALUE","LEAD","PERCENTILE_CONT","PERCENTILE_DISC","PERCENT_RANK","COLLATE","COLLATIONPROPERTY","TERTIARY_WEIGHTS","FEDERATION_FILTERING_VALUE","CAST","CONVERT","PARSE","TRY_CAST","TRY_CONVERT","TRY_PARSE","ASYMKEY_ID","ASYMKEYPROPERTY","CERTPROPERTY","CERT_ID","CRYPT_GEN_RANDOM","DECRYPTBYASYMKEY","DECRYPTBYCERT","DECRYPTBYKEY","DECRYPTBYKEYAUTOASYMKEY","DECRYPTBYKEYAUTOCERT","DECRYPTBYPASSPHRASE","ENCRYPTBYASYMKEY","ENCRYPTBYCERT","ENCRYPTBYKEY","ENCRYPTBYPASSPHRASE","HASHBYTES","IS_OBJECTSIGNED","KEY_GUID","KEY_ID","KEY_NAME","SIGNBYASYMKEY","SIGNBYCERT","SYMKEYPROPERTY","VERIFYSIGNEDBYCERT","VERIFYSIGNEDBYASYMKEY","CURSOR_STATUS","DATALENGTH","IDENT_CURRENT","IDENT_INCR","IDENT_SEED","IDENTITY","SQL_VARIANT_PROPERTY","CURRENT_TIMESTAMP","DATEADD","DATEDIFF","DATEFROMPARTS","DATENAME","DATEPART","DATETIME2FROMPARTS","DATETIMEFROMPARTS","DATETIMEOFFSETFROMPARTS","DAY","EOMONTH","GETDATE","GETUTCDATE","ISDATE","MONTH","SMALLDATETIMEFROMPARTS","SWITCHOFFSET","SYSDATETIME","SYSDATETIMEOFFSET","SYSUTCDATETIME","TIMEFROMPARTS","TODATETIMEOFFSET","YEAR","CHOOSE","COALESCE","IIF","NULLIF","ABS","ACOS","ASIN","ATAN","ATN2","CEILING","COS","COT","DEGREES","EXP","FLOOR","LOG","LOG10","PI","POWER","RADIANS","RAND","ROUND","SIGN","SIN","SQRT","SQUARE","TAN","APP_NAME","APPLOCK_MODE","APPLOCK_TEST","ASSEMBLYPROPERTY","COL_LENGTH","COL_NAME","COLUMNPROPERTY","DATABASE_PRINCIPAL_ID","DATABASEPROPERTYEX","DB_ID","DB_NAME","FILE_ID","FILE_IDEX","FILE_NAME","FILEGROUP_ID","FILEGROUP_NAME","FILEGROUPPROPERTY","FILEPROPERTY","FULLTEXTCATALOGPROPERTY","FULLTEXTSERVICEPROPERTY","INDEX_COL","INDEXKEY_PROPERTY","INDEXPROPERTY","OBJECT_DEFINITION","OBJECT_ID","OBJECT_NAME","OBJECT_SCHEMA_NAME","OBJECTPROPERTY","OBJECTPROPERTYEX","ORIGINAL_DB_NAME","PARSENAME","SCHEMA_ID","SCHEMA_NAME","SCOPE_IDENTITY","SERVERPROPERTY","STATS_DATE","TYPE_ID","TYPE_NAME","TYPEPROPERTY","DENSE_RANK","NTILE","RANK","ROW_NUMBER","PUBLISHINGSERVERNAME","OPENDATASOURCE","OPENQUERY","OPENROWSET","OPENXML","CERTENCODED","CERTPRIVATEKEY","CURRENT_USER","HAS_DBACCESS","HAS_PERMS_BY_NAME","IS_MEMBER","IS_ROLEMEMBER","IS_SRVROLEMEMBER","LOGINPROPERTY","ORIGINAL_LOGIN","PERMISSIONS","PWDENCRYPT","PWDCOMPARE","SESSION_USER","SESSIONPROPERTY","SUSER_ID","SUSER_NAME","SUSER_SID","SUSER_SNAME","SYSTEM_USER","USER","USER_ID","USER_NAME","ASCII","CHAR","CHARINDEX","CONCAT","DIFFERENCE","FORMAT","LEFT","LEN","LOWER","LTRIM","NCHAR","PATINDEX","QUOTENAME","REPLACE","REPLICATE","REVERSE","RIGHT","RTRIM","SOUNDEX","SPACE","STR","STUFF","SUBSTRING","UNICODE","UPPER","BINARY_CHECKSUM","CHECKSUM","CONNECTIONPROPERTY","CONTEXT_INFO","CURRENT_REQUEST_ID","ERROR_LINE","ERROR_NUMBER","ERROR_MESSAGE","ERROR_PROCEDURE","ERROR_SEVERITY","ERROR_STATE","FORMATMESSAGE","GETANSINULL","GET_FILESTREAM_TRANSACTION_CONTEXT","HOST_ID","HOST_NAME","ISNULL","ISNUMERIC","MIN_ACTIVE_ROWVERSION","NEWID","NEWSEQUENTIALID","ROWCOUNT_BIG","XACT_STATE","TEXTPTR","TEXTVALID","COLUMNS_UPDATED","EVENTDATA","TRIGGER_NESTLEVEL","UPDATE","CHANGETABLE","CHANGE_TRACKING_CONTEXT","CHANGE_TRACKING_CURRENT_VERSION","CHANGE_TRACKING_IS_COLUMN_IN_MASK","CHANGE_TRACKING_MIN_VALID_VERSION","CONTAINSTABLE","FREETEXTTABLE","SEMANTICKEYPHRASETABLE","SEMANTICSIMILARITYDETAILSTABLE","SEMANTICSIMILARITYTABLE","FILETABLEROOTPATH","GETFILENAMESPACEPATH","GETPATHLOCATOR","PATHNAME","GET_TRANSMISSION_STATUS"],builtinVariables:["@@DATEFIRST","@@DBTS","@@LANGID","@@LANGUAGE","@@LOCK_TIMEOUT","@@MAX_CONNECTIONS","@@MAX_PRECISION","@@NESTLEVEL","@@OPTIONS","@@REMSERVER","@@SERVERNAME","@@SERVICENAME","@@SPID","@@TEXTSIZE","@@VERSION","@@CURSOR_ROWS","@@FETCH_STATUS","@@DATEFIRST","@@PROCID","@@ERROR","@@IDENTITY","@@ROWCOUNT","@@TRANCOUNT","@@CONNECTIONS","@@CPU_BUSY","@@IDLE","@@IO_BUSY","@@PACKET_ERRORS","@@PACK_RECEIVED","@@PACK_SENT","@@TIMETICKS","@@TOTAL_ERRORS","@@TOTAL_READ","@@TOTAL_WRITE"],pseudoColumns:["$ACTION","$IDENTITY","$ROWGUID","$PARTITION"],tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@pseudoColumns"},{include:"@numbers"},{include:"@strings"},{include:"@complexIdentifiers"},{include:"@scopes"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@#$]+/,{cases:{"@operators":"operator","@builtinVariables":"predefined","@builtinFunctions":"predefined","@keywords":"keyword","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[[/--+.*/,"comment"],[/\/\*/,{token:"comment.quote",next:"@comment"}]],comment:[[/[^*/]+/,"comment"],[/\*\//,{token:"comment.quote",next:"@pop"}],[/./,"comment"]],pseudoColumns:[[/[$][A-Za-z_][\w@#$]*/,{cases:{"@pseudoColumns":"predefined","@default":"identifier"}}]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/N'/,{token:"string",next:"@string"}],[/'/,{token:"string",next:"@string"}]],string:[[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],complexIdentifiers:[[/\[/,{token:"identifier.quote",next:"@bracketedIdentifier"}],[/"/,{token:"identifier.quote",next:"@quotedIdentifier"}]],bracketedIdentifier:[[/[^\]]+/,"identifier"],[/]]/,"identifier"],[/]/,{token:"identifier.quote",next:"@pop"}]],quotedIdentifier:[[/[^"]+/,"identifier"],[/""/,"identifier"],[/"/,{token:"identifier.quote",next:"@pop"}]],scopes:[[/BEGIN\s+(DISTRIBUTED\s+)?TRAN(SACTION)?\b/i,"keyword"],[/BEGIN\s+TRY\b/i,{token:"keyword.try"}],[/END\s+TRY\b/i,{token:"keyword.try"}],[/BEGIN\s+CATCH\b/i,{token:"keyword.catch"}],[/END\s+CATCH\b/i,{token:"keyword.catch"}],[/(BEGIN|CASE)\b/i,{token:"keyword.block"}],[/END\b/i,{token:"keyword.block"}],[/WHEN\b/i,{token:"keyword.choice"}],[/THEN\b/i,{token:"keyword.choice"}]]}};return P(M);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/st/st.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/st/st.js deleted file mode 100644 index fc2b9edbd7..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/st/st.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/st/st", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var d=(n,e)=>{for(var t in e)r(n,t,{get:e[t],enumerable:!0})},l=(n,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of c(e))!i.call(n,o)&&o!==t&&r(n,o,{get:()=>e[o],enumerable:!(a=s(e,o))||a.enumerable});return n};var _=n=>l(r({},"__esModule",{value:!0}),n);var m={};d(m,{conf:()=>p,language:()=>u});var p={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"],["var","end_var"],["var_input","end_var"],["var_output","end_var"],["var_in_out","end_var"],["var_temp","end_var"],["var_global","end_var"],["var_access","end_var"],["var_external","end_var"],["type","end_type"],["struct","end_struct"],["program","end_program"],["function","end_function"],["function_block","end_function_block"],["action","end_action"],["step","end_step"],["initial_step","end_step"],["transaction","end_transaction"],["configuration","end_configuration"],["tcp","end_tcp"],["recource","end_recource"],["channel","end_channel"],["library","end_library"],["folder","end_folder"],["binaries","end_binaries"],["includes","end_includes"],["sources","end_sources"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"},{open:"/*",close:"*/"},{open:"'",close:"'",notIn:["string_sq"]},{open:'"',close:'"',notIn:["string_dq"]},{open:"var_input",close:"end_var"},{open:"var_output",close:"end_var"},{open:"var_in_out",close:"end_var"},{open:"var_temp",close:"end_var"},{open:"var_global",close:"end_var"},{open:"var_access",close:"end_var"},{open:"var_external",close:"end_var"},{open:"type",close:"end_type"},{open:"struct",close:"end_struct"},{open:"program",close:"end_program"},{open:"function",close:"end_function"},{open:"function_block",close:"end_function_block"},{open:"action",close:"end_action"},{open:"step",close:"end_step"},{open:"initial_step",close:"end_step"},{open:"transaction",close:"end_transaction"},{open:"configuration",close:"end_configuration"},{open:"tcp",close:"end_tcp"},{open:"recource",close:"end_recource"},{open:"channel",close:"end_channel"},{open:"library",close:"end_library"},{open:"folder",close:"end_folder"},{open:"binaries",close:"end_binaries"},{open:"includes",close:"end_includes"},{open:"sources",close:"end_sources"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"var",close:"end_var"},{open:"var_input",close:"end_var"},{open:"var_output",close:"end_var"},{open:"var_in_out",close:"end_var"},{open:"var_temp",close:"end_var"},{open:"var_global",close:"end_var"},{open:"var_access",close:"end_var"},{open:"var_external",close:"end_var"},{open:"type",close:"end_type"},{open:"struct",close:"end_struct"},{open:"program",close:"end_program"},{open:"function",close:"end_function"},{open:"function_block",close:"end_function_block"},{open:"action",close:"end_action"},{open:"step",close:"end_step"},{open:"initial_step",close:"end_step"},{open:"transaction",close:"end_transaction"},{open:"configuration",close:"end_configuration"},{open:"tcp",close:"end_tcp"},{open:"recource",close:"end_recource"},{open:"channel",close:"end_channel"},{open:"library",close:"end_library"},{open:"folder",close:"end_folder"},{open:"binaries",close:"end_binaries"},{open:"includes",close:"end_includes"},{open:"sources",close:"end_sources"}],folding:{markers:{start:new RegExp("^\\s*#pragma\\s+region\\b"),end:new RegExp("^\\s*#pragma\\s+endregion\\b")}}},u={defaultToken:"",tokenPostfix:".st",ignoreCase:!0,brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:["if","end_if","elsif","else","case","of","to","__try","__catch","__finally","do","with","by","while","repeat","end_while","end_repeat","end_case","for","end_for","task","retain","non_retain","constant","with","at","exit","return","interval","priority","address","port","on_channel","then","iec","file","uses","version","packagetype","displayname","copyright","summary","vendor","common_source","from","extends","implements"],constant:["false","true","null"],defineKeywords:["var","var_input","var_output","var_in_out","var_temp","var_global","var_access","var_external","end_var","type","end_type","struct","end_struct","program","end_program","function","end_function","function_block","end_function_block","interface","end_interface","method","end_method","property","end_property","namespace","end_namespace","configuration","end_configuration","tcp","end_tcp","resource","end_resource","channel","end_channel","library","end_library","folder","end_folder","binaries","end_binaries","includes","end_includes","sources","end_sources","action","end_action","step","initial_step","end_step","transaction","end_transaction"],typeKeywords:["int","sint","dint","lint","usint","uint","udint","ulint","real","lreal","time","date","time_of_day","date_and_time","string","bool","byte","word","dword","array","pointer","lword"],operators:["=",">","<",":",":=","<=",">=","<>","&","+","-","*","**","MOD","^","or","and","not","xor","abs","acos","asin","atan","cos","exp","expt","ln","log","sin","sqrt","tan","sel","max","min","limit","mux","shl","shr","rol","ror","indexof","sizeof","adr","adrinst","bitadr","is_valid","ref","ref_to"],builtinVariables:[],builtinFunctions:["sr","rs","tp","ton","tof","eq","ge","le","lt","ne","round","trunc","ctd","\u0441tu","ctud","r_trig","f_trig","move","concat","delete","find","insert","left","len","replace","right","rtc"],symbols:/[=>{ -"use strict";var moduleExports=(()=>{var i=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(o,e)=>{for(var n in e)i(o,n,{get:e[n],enumerable:!0})},u=(o,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of s(e))!l.call(o,t)&&t!==n&&i(o,t,{get:()=>e[t],enumerable:!(r=a(e,t))||r.enumerable});return o};var d=o=>u(i({},"__esModule",{value:!0}),o);var f={};c(f,{conf:()=>p,language:()=>m});var p={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}]},m={defaultToken:"",tokenPostfix:".swift",identifier:/[a-zA-Z_][\w$]*/,attributes:["@GKInspectable","@IBAction","@IBDesignable","@IBInspectable","@IBOutlet","@IBSegueAction","@NSApplicationMain","@NSCopying","@NSManaged","@Sendable","@UIApplicationMain","@autoclosure","@actorIndependent","@asyncHandler","@available","@convention","@derivative","@differentiable","@discardableResult","@dynamicCallable","@dynamicMemberLookup","@escaping","@frozen","@globalActor","@inlinable","@inline","@main","@noDerivative","@nonobjc","@noreturn","@objc","@objcMembers","@preconcurrency","@propertyWrapper","@requires_stored_property_inits","@resultBuilder","@testable","@unchecked","@unknown","@usableFromInline","@warn_unqualified_access"],accessmodifiers:["open","public","internal","fileprivate","private"],keywords:["#available","#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warning","Any","Protocol","Self","Type","actor","as","assignment","associatedtype","associativity","async","await","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","do","dynamic","dynamicType","else","enum","extension","fallthrough","false","fileprivate","final","for","func","get","guard","higherThan","if","import","in","indirect","infix","init","inout","internal","is","isolated","lazy","left","let","lowerThan","mutating","nil","none","nonisolated","nonmutating","open","operator","optional","override","postfix","precedence","precedencegroup","prefix","private","protocol","public","repeat","required","rethrows","return","right","safe","self","set","some","static","struct","subscript","super","switch","throw","throws","true","try","typealias","unowned","unsafe","var","weak","where","while","willSet","__consuming","__owned"],symbols:/[=(){}\[\].,:;@#\_&\-<>`?!+*\\\/]/,operatorstart:/[\/=\-+!*%<>&|^~?\u00A1-\u00A7\u00A9\u00AB\u00AC\u00AE\u00B0-\u00B1\u00B6\u00BB\u00BF\u00D7\u00F7\u2016-\u2017\u2020-\u2027\u2030-\u203E\u2041-\u2053\u2055-\u205E\u2190-\u23FF\u2500-\u2775\u2794-\u2BFF\u2E00-\u2E7F\u3001-\u3003\u3008-\u3030]/,operatorend:/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE00-\uFE0F\uFE20-\uFE2F\uE0100-\uE01EF]/,operators:/(@operatorstart)((@operatorstart)|(@operatorend))*/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[{include:"@whitespace"},{include:"@comment"},{include:"@attribute"},{include:"@literal"},{include:"@keyword"},{include:"@invokedmethod"},{include:"@symbol"}],whitespace:[[/\s+/,"white"],[/"""/,"string.quote","@endDblDocString"]],endDblDocString:[[/[^"]+/,"string"],[/\\"/,"string"],[/"""/,"string.quote","@popall"],[/"/,"string"]],symbol:[[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/[.]/,"delimiter"],[/@operators/,"operator"],[/@symbols/,"operator"]],comment:[[/\/\/\/.*$/,"comment.doc"],[/\/\*\*/,"comment.doc","@commentdocbody"],[/\/\/.*$/,"comment"],[/\/\*/,"comment","@commentbody"]],commentdocbody:[[/\/\*/,"comment","@commentbody"],[/\*\//,"comment.doc","@pop"],[/\:[a-zA-Z]+\:/,"comment.doc.param"],[/./,"comment.doc"]],commentbody:[[/\/\*/,"comment","@commentbody"],[/\*\//,"comment","@pop"],[/./,"comment"]],attribute:[[/@@@identifier/,{cases:{"@attributes":"keyword.control","@default":""}}]],literal:[[/"/,{token:"string.quote",next:"@stringlit"}],[/0[b]([01]_?)+/,"number.binary"],[/0[o]([0-7]_?)+/,"number.octal"],[/0[x]([0-9a-fA-F]_?)+([pP][\-+](\d_?)+)?/,"number.hex"],[/(\d_?)*\.(\d_?)+([eE][\-+]?(\d_?)+)?/,"number.float"],[/(\d_?)+/,"number"]],stringlit:[[/\\\(/,{token:"operator",next:"@interpolatedexpression"}],[/@escapes/,"string"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",next:"@pop"}],[/./,"string"]],interpolatedexpression:[[/\(/,{token:"operator",next:"@interpolatedexpression"}],[/\)/,{token:"operator",next:"@pop"}],{include:"@literal"},{include:"@keyword"},{include:"@symbol"}],keyword:[[/`/,{token:"operator",next:"@escapedkeyword"}],[/@identifier/,{cases:{"@keywords":"keyword","[A-Z][a-zA-Z0-9$]*":"type.identifier","@default":"identifier"}}]],escapedkeyword:[[/`/,{token:"operator",next:"@pop"}],[/./,"identifier"]],invokedmethod:[[/([.])(@identifier)/,{cases:{$2:["delimeter","type.identifier"],"@default":""}}]]}};return d(f);})(); -/*!--------------------------------------------------------------------------------------------- - * Copyright (C) David Owens II, owensd.io. All rights reserved. - *--------------------------------------------------------------------------------------------*/ -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/systemverilog/systemverilog.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/systemverilog/systemverilog.js deleted file mode 100644 index 35c14c021f..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/systemverilog/systemverilog.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/systemverilog/systemverilog", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var d=(n,e)=>{for(var t in e)r(n,t,{get:e[t],enumerable:!0})},l=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of a(e))!c.call(n,i)&&i!==t&&r(n,i,{get:()=>e[i],enumerable:!(o=s(e,i))||o.enumerable});return n};var p=n=>l(r({},"__esModule",{value:!0}),n);var f={};d(f,{conf:()=>u,language:()=>m});var u={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["begin","end"],["case","endcase"],["casex","endcase"],["casez","endcase"],["checker","endchecker"],["class","endclass"],["clocking","endclocking"],["config","endconfig"],["function","endfunction"],["generate","endgenerate"],["group","endgroup"],["interface","endinterface"],["module","endmodule"],["package","endpackage"],["primitive","endprimitive"],["program","endprogram"],["property","endproperty"],["specify","endspecify"],["sequence","endsequence"],["table","endtable"],["task","endtask"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{offSide:!1,markers:{start:new RegExp("^(?:\\s*|.*(?!\\/[\\/\\*])[^\\w])(?:begin|case(x|z)?|class|clocking|config|covergroup|function|generate|interface|module|package|primitive|property|program|sequence|specify|table|task)\\b"),end:new RegExp("^(?:\\s*|.*(?!\\/[\\/\\*])[^\\w])(?:end|endcase|endclass|endclocking|endconfig|endgroup|endfunction|endgenerate|endinterface|endmodule|endpackage|endprimitive|endproperty|endprogram|endsequence|endspecify|endtable|endtask)\\b")}}},m={defaultToken:"",tokenPostfix:".sv",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["accept_on","alias","always","always_comb","always_ff","always_latch","and","assert","assign","assume","automatic","before","begin","bind","bins","binsof","bit","break","buf","bufif0","bufif1","byte","case","casex","casez","cell","chandle","checker","class","clocking","cmos","config","const","constraint","context","continue","cover","covergroup","coverpoint","cross","deassign","default","defparam","design","disable","dist","do","edge","else","end","endcase","endchecker","endclass","endclocking","endconfig","endfunction","endgenerate","endgroup","endinterface","endmodule","endpackage","endprimitive","endprogram","endproperty","endspecify","endsequence","endtable","endtask","enum","event","eventually","expect","export","extends","extern","final","first_match","for","force","foreach","forever","fork","forkjoin","function","generate","genvar","global","highz0","highz1","if","iff","ifnone","ignore_bins","illegal_bins","implements","implies","import","incdir","include","initial","inout","input","inside","instance","int","integer","interconnect","interface","intersect","join","join_any","join_none","large","let","liblist","library","local","localparam","logic","longint","macromodule","matches","medium","modport","module","nand","negedge","nettype","new","nexttime","nmos","nor","noshowcancelled","not","notif0","notif1","null","or","output","package","packed","parameter","pmos","posedge","primitive","priority","program","property","protected","pull0","pull1","pulldown","pullup","pulsestyle_ondetect","pulsestyle_onevent","pure","rand","randc","randcase","randsequence","rcmos","real","realtime","ref","reg","reject_on","release","repeat","restrict","return","rnmos","rpmos","rtran","rtranif0","rtranif1","s_always","s_eventually","s_nexttime","s_until","s_until_with","scalared","sequence","shortint","shortreal","showcancelled","signed","small","soft","solve","specify","specparam","static","string","strong","strong0","strong1","struct","super","supply0","supply1","sync_accept_on","sync_reject_on","table","tagged","task","this","throughout","time","timeprecision","timeunit","tran","tranif0","tranif1","tri","tri0","tri1","triand","trior","trireg","type","typedef","union","unique","unique0","unsigned","until","until_with","untyped","use","uwire","var","vectored","virtual","void","wait","wait_order","wand","weak","weak0","weak1","while","wildcard","wire","with","within","wor","xnor","xor"],builtin_gates:["and","nand","nor","or","xor","xnor","buf","not","bufif0","bufif1","notif1","notif0","cmos","nmos","pmos","rcmos","rnmos","rpmos","tran","tranif1","tranif0","rtran","rtranif1","rtranif0"],operators:["=","+=","-=","*=","/=","%=","&=","|=","^=","<<=",">>+","<<<=",">>>=","?",":","+","-","!","~","&","~&","|","~|","^","~^","^~","+","-","*","/","%","==","!=","===","!==","==?","!=?","&&","||","**","<","<=",">",">=","&","|","^",">>","<<",">>>","<<<","++","--","->","<->","inside","dist","::","+:","-:","*>","&&&","|->","|=>","#=#"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],{include:"@numbers"},[/[;,.]/,"delimiter"],{include:"@strings"}],identifier_or_keyword:[[/@identifier/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}]],numbers:[[/\d+?[\d_]*(?:\.[\d_]+)?[eE][\-+]?\d+/,"number.float"],[/\d+?[\d_]*\.[\d_]+(?:\s*@timeunits)?/,"number.float"],[/(?:\d+?[\d_]*\s*)?'[sS]?[dD]\s*[0-9xXzZ?]+?[0-9xXzZ?_]*/,"number"],[/(?:\d+?[\d_]*\s*)?'[sS]?[bB]\s*[0-1xXzZ?]+?[0-1xXzZ?_]*/,"number.binary"],[/(?:\d+?[\d_]*\s*)?'[sS]?[oO]\s*[0-7xXzZ?]+?[0-7xXzZ?_]*/,"number.octal"],[/(?:\d+?[\d_]*\s*)?'[sS]?[hH]\s*[0-9a-fA-FxXzZ?]+?[0-9a-fA-FxXzZ?_]*/,"number.hex"],[/1step/,"number"],[/[\dxXzZ]+?[\dxXzZ_]*(?:\s*@timeunits)?/,"number"],[/'[01xXzZ]+/,"number"]],module_instance:[{include:"@whitespace"},[/(#?)(\()/,["",{token:"@brackets",next:"@port_connection"}]],[/@identifier\s*[;={}\[\],]/,{token:"@rematch",next:"@pop"}],[/@symbols|[;={}\[\],]/,{token:"@rematch",next:"@pop"}],[/@identifier/,"type"],[/;/,"delimiter","@pop"]],port_connection:[{include:"@identifier_or_keyword"},{include:"@whitespace"},[/@systemcall/,"variable.predefined"],{include:"@numbers"},{include:"@strings"},[/[,]/,"delimiter"],[/\(/,"@brackets","@port_connection"],[/\)/,"@brackets","@pop"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],strings:[[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],include:[[/(\s*)(")([\w*\/*]*)(.\w*)(")/,["","string.include.identifier","string.include.identifier","string.include.identifier",{token:"string.include.identifier",next:"@pop"}]],[/(\s*)(<)([\w*\/*]*)(.\w*)(>)/,["","string.include.identifier","string.include.identifier","string.include.identifier",{token:"string.include.identifier",next:"@pop"}]]],table:[{include:"@whitespace"},[/[()]/,"@brackets"],[/[:;]/,"delimiter"],[/[01\-*?xXbBrRfFpPnN]/,"variable.predefined"],["endtable","keyword.endtable","@pop"]]}};return p(f);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/tcl/tcl.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/tcl/tcl.js deleted file mode 100644 index 1ab974cbee..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/tcl/tcl.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/tcl/tcl", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(t,e)=>{for(var o in e)s(t,o,{get:e[o],enumerable:!0})},p=(t,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of a(e))!l.call(t,n)&&n!==o&&s(t,n,{get:()=>e[n],enumerable:!(i=r(e,n))||i.enumerable});return t};var u=t=>p(s({},"__esModule",{value:!0}),t);var g={};c(g,{conf:()=>k,language:()=>d});var k={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},d={tokenPostfix:".tcl",specialFunctions:["set","unset","rename","variable","proc","coroutine","foreach","incr","append","lappend","linsert","lreplace"],mainFunctions:["if","then","elseif","else","case","switch","while","for","break","continue","return","package","namespace","catch","exit","eval","expr","uplevel","upvar"],builtinFunctions:["file","info","concat","join","lindex","list","llength","lrange","lsearch","lsort","split","array","parray","binary","format","regexp","regsub","scan","string","subst","dict","cd","clock","exec","glob","pid","pwd","close","eof","fblocked","fconfigure","fcopy","fileevent","flush","gets","open","puts","read","seek","socket","tell","interp","after","auto_execok","auto_load","auto_mkindex","auto_reset","bgerror","error","global","history","load","source","time","trace","unknown","unset","update","vwait","winfo","wm","bind","event","pack","place","grid","font","bell","clipboard","destroy","focus","grab","lower","option","raise","selection","send","tk","tkwait","tk_bisque","tk_focusNext","tk_focusPrev","tk_focusFollowsMouse","tk_popup","tk_setPalette"],symbols:/[=>{ -"use strict";var moduleExports=(()=>{var m=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var n=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var s=(e,t)=>{for(var r in t)m(e,r,{get:t[r],enumerable:!0})},d=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of n(t))!a.call(e,i)&&i!==r&&m(e,i,{get:()=>t[i],enumerable:!(o=l(t,i))||o.enumerable});return e};var p=e=>d(m({},"__esModule",{value:!0}),e);var g={};s(g,{conf:()=>h,language:()=>c});var h={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:["{#","#}"]},brackets:[["{#","#}"],["{%","%}"],["{{","}}"],["(",")"],["[","]"],[""],["<",">"]],autoClosingPairs:[{open:"{# ",close:" #}"},{open:"{% ",close:" %}"},{open:"{{ ",close:" }}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}]},c={defaultToken:"",tokenPostfix:"",ignoreCase:!0,keywords:["apply","autoescape","block","deprecated","do","embed","extends","flush","for","from","if","import","include","macro","sandbox","set","use","verbatim","with","endapply","endautoescape","endblock","endembed","endfor","endif","endmacro","endsandbox","endset","endwith","true","false"],tokenizer:{root:[[/\s+/],[/{#/,"comment.twig","@commentState"],[/{%[-~]?/,"delimiter.twig","@blockState"],[/{{[-~]?/,"delimiter.twig","@variableState"],[/)/,["delimiter.html","tag.html","","delimiter.html"]],[/(<)(script)/,["delimiter.html",{token:"tag.html",next:"@script"}]],[/(<)(style)/,["delimiter.html",{token:"tag.html",next:"@style"}]],[/(<)((?:[\w\-]+:)?[\w\-]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/(<\/)((?:[\w\-]+:)?[\w\-]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/|>=|<=/,"operators.twig"],[/(starts with|ends with|matches)(\s+)/,["operators.twig",""]],[/(in)(\s+)/,["operators.twig",""]],[/(is)(\s+)/,["operators.twig",""]],[/\||~|:|\.{1,2}|\?{1,2}/,"operators.twig"],[/[^\W\d][\w]*/,{cases:{"@keywords":"keyword.twig","@default":"variable.twig"}}],[/\d+(\.\d+)?/,"number.twig"],[/\(|\)|\[|\]|{|}|,/,"delimiter.twig"],[/"([^#"\\]*(?:\\.[^#"\\]*)*)"|\'([^\'\\]*(?:\\.[^\'\\]*)*)\'/,"string.twig"],[/"/,"string.twig","@stringState"],[/=>/,"operators.twig"],[/=/,"operators.twig"]],doctype:[[/[^>]+/,"metatag.content.html"],[/>/,"metatag.html","@pop"]],comment:[[/-->/,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/[ \t\r\n]+/]],script:[[/type/,"attribute.name.html","@scriptAfterType"],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/=/,"delimiter.html","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value.html",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value.html",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]],style:[[/type/,"attribute.name.html","@styleAfterType"],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/>/,{token:"delimiter.html",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/=/,"delimiter.html","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value.html",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value.html",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]]}};return p(g);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/typescript/typescript.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/typescript/typescript.js deleted file mode 100644 index fed2be6fe8..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/typescript/typescript.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/typescript/typescript", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var l=Object.create;var s=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var b=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty;var f=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var k=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),y=(e,t)=>{for(var n in t)s(e,n,{get:t[n],enumerable:!0})},i=(e,t,n,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of x(t))!u.call(e,r)&&r!==n&&s(e,r,{get:()=>t[r],enumerable:!(c=m(t,r))||c.enumerable});return e},a=(e,t,n)=>(i(e,t,"default"),n&&i(n,t,"default")),p=(e,t,n)=>(n=e!=null?l(b(e)):{},i(t||!e||!e.__esModule?s(n,"default",{value:e,enumerable:!0}):n,e)),w=e=>i(s({},"__esModule",{value:!0}),e);var d=k((T,g)=>{var A=p(f("vs/editor/editor.api"));g.exports=A});var h={};y(h,{conf:()=>v,language:()=>$});var o={};a(o,p(d()));var v={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],onEnterRules:[{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,afterText:/^\s*\*\/$/,action:{indentAction:o.languages.IndentAction.IndentOutdent,appendText:" * "}},{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,action:{indentAction:o.languages.IndentAction.None,appendText:" * "}},{beforeText:/^(\t|(\ \ ))*\ \*(\ ([^\*]|\*(?!\/))*)?$/,action:{indentAction:o.languages.IndentAction.None,appendText:"* "}},{beforeText:/^(\t|(\ \ ))*\ \*\/\s*$/,action:{indentAction:o.languages.IndentAction.None,removeText:1}}],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]},{open:"`",close:"`",notIn:["string","comment"]},{open:"/**",close:" */",notIn:["string"]}],folding:{markers:{start:new RegExp("^\\s*//\\s*#?region\\b"),end:new RegExp("^\\s*//\\s*#?endregion\\b")}}},$={defaultToken:"invalid",tokenPostfix:".ts",keywords:["abstract","any","as","asserts","bigint","boolean","break","case","catch","class","continue","const","constructor","debugger","declare","default","delete","do","else","enum","export","extends","false","finally","for","from","function","get","if","implements","import","in","infer","instanceof","interface","is","keyof","let","module","namespace","never","new","null","number","object","out","package","private","protected","public","override","readonly","require","global","return","satisfies","set","static","string","super","switch","symbol","this","throw","true","try","type","typeof","undefined","unique","unknown","var","void","while","with","yield","async","await","of"],operators:["<=",">=","==","!=","===","!==","=>","+","-","**","*","/","%","++","--","<<",">",">>>","&","|","^","!","~","&&","||","??","?",":","=","+=","-=","*=","**=","/=","%=","<<=",">>=",">>>=","&=","|=","^=","@"],symbols:/[=>](?!@symbols)/,"@brackets"],[/!(?=([^=]|$))/,"delimiter"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/(@digits)[eE]([\-+]?(@digits))?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?/,"number.float"],[/0[xX](@hexdigits)n?/,"number.hex"],[/0[oO]?(@octaldigits)n?/,"number.octal"],[/0[bB](@binarydigits)n?/,"number.binary"],[/(@digits)n?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string_double"],[/'/,"string","@string_single"],[/`/,"string","@string_backtick"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@jsdoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],jsdoc:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],regexp:[[/(\{)(\d+(?:,\d*)?)(\})/,["regexp.escape.control","regexp.escape.control","regexp.escape.control"]],[/(\[)(\^?)(?=(?:[^\]\\\/]|\\.)+)/,["regexp.escape.control",{token:"regexp.escape.control",next:"@regexrange"}]],[/(\()(\?:|\?=|\?!)/,["regexp.escape.control","regexp.escape.control"]],[/[()]/,"regexp.escape.control"],[/@regexpctl/,"regexp.escape.control"],[/[^\\\/]/,"regexp"],[/@regexpesc/,"regexp.escape"],[/\\\./,"regexp.invalid"],[/(\/)([dgimsuy]*)/,[{token:"regexp",bracket:"@close",next:"@pop"},"keyword.other"]]],regexrange:[[/-/,"regexp.escape.control"],[/\^/,"regexp.invalid"],[/@regexpesc/,"regexp.escape"],[/[^\]]/,"regexp"],[/\]/,{token:"regexp.escape.control",next:"@pop",bracket:"@close"}]],string_double:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],string_single:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"]],string_backtick:[[/\$\{/,{token:"delimiter.bracket",next:"@bracketCounting"}],[/[^\\`$]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/`/,"string","@pop"]],bracketCounting:[[/\{/,"delimiter.bracket","@bracketCounting"],[/\}/,"delimiter.bracket","@pop"],{include:"common"}]}};return w(h);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/typespec/typespec.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/typespec/typespec.js deleted file mode 100644 index 6ca0a8c8b2..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/typespec/typespec.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/typespec/typespec", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var i=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var m=(e,n)=>{for(var o in n)i(e,o,{get:n[o],enumerable:!0})},p=(e,n,o,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of l(n))!k.call(e,t)&&t!==o&&i(e,t,{get:()=>n[t],enumerable:!(r=g(n,t))||r.enumerable});return e};var x=e=>p(i({},"__esModule",{value:!0}),e);var P={};m(P,{conf:()=>L,language:()=>y});var c=e=>`\\b${e}\\b`,s=e=>`(?!${e})`,d="[_a-zA-Z]",u="[_a-zA-Z0-9]",a=c(`${d}${u}*`),f=c("[_a-zA-Z-0-9]+"),$=["import","model","scalar","namespace","op","interface","union","using","is","extends","enum","alias","return","void","if","else","projection","dec","extern","fn"],b=["true","false","null","unknown","never"],w="[ \\t\\r\\n]",C="[0-9]+",L={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"/**",close:" */",notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],indentationRules:{decreaseIndentPattern:new RegExp("^((?!.*?/\\*).*\\*/)?\\s*[\\}\\]].*$"),increaseIndentPattern:new RegExp("^((?!//).)*(\\{([^}\"'`/]*|(\\t|[ ])*//.*)|\\([^)\"'`/]*|\\[[^\\]\"'`/]*)$"),unIndentedLinePattern:new RegExp("^(\\t|[ ])*[ ]\\*[^/]*\\*/\\s*$|^(\\t|[ ])*[ ]\\*/\\s*$|^(\\t|[ ])*[ ]\\*([ ]([^\\*]|\\*(?!/))*)?$")}},y={defaultToken:"",tokenPostfix:".tsp",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],symbols:/[=:;<>]+/,keywords:$,namedLiterals:b,escapes:'\\\\(u{[0-9A-Fa-f]+}|n|r|t|\\\\|"|\\${)',tokenizer:{root:[{include:"@expression"},{include:"@whitespace"}],stringVerbatim:[{regex:'(|"|"")[^"]',action:{token:"string"}},{regex:`"""${s('"')}`,action:{token:"string",next:"@pop"}}],stringLiteral:[{regex:"\\${",action:{token:"delimiter.bracket",next:"@bracketCounting"}},{regex:'[^\\\\"$]+',action:{token:"string"}},{regex:"@escapes",action:{token:"string.escape"}},{regex:"\\\\.",action:{token:"string.escape.invalid"}},{regex:'"',action:{token:"string",next:"@pop"}}],bracketCounting:[{regex:"{",action:{token:"delimiter.bracket",next:"@bracketCounting"}},{regex:"}",action:{token:"delimiter.bracket",next:"@pop"}},{include:"@expression"}],comment:[{regex:"[^\\*]+",action:{token:"comment"}},{regex:"\\*\\/",action:{token:"comment",next:"@pop"}},{regex:"[\\/*]",action:{token:"comment"}}],whitespace:[{regex:w},{regex:"\\/\\*",action:{token:"comment",next:"@comment"}},{regex:"\\/\\/.*$",action:{token:"comment"}}],expression:[{regex:'"""',action:{token:"string",next:"@stringVerbatim"}},{regex:`"${s('""')}`,action:{token:"string",next:"@stringLiteral"}},{regex:C,action:{token:"number"}},{regex:a,action:{cases:{"@keywords":{token:"keyword"},"@namedLiterals":{token:"keyword"},"@default":{token:"identifier"}}}},{regex:`@${a}`,action:{token:"tag"}},{regex:`#${f}`,action:{token:"directive"}}]}};return x(P);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/vb/vb.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/vb/vb.js deleted file mode 100644 index c3bdaa983b..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/vb/vb.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/vb/vb", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var i=(n,e)=>{for(var t in e)r(n,t,{get:e[t],enumerable:!0})},c=(n,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of d(e))!l.call(n,o)&&o!==t&&r(n,o,{get:()=>e[o],enumerable:!(s=a(e,o))||s.enumerable});return n};var u=n=>c(r({},"__esModule",{value:!0}),n);var k={};i(k,{conf:()=>g,language:()=>p});var g={comments:{lineComment:"'",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"],["addhandler","end addhandler"],["class","end class"],["enum","end enum"],["event","end event"],["function","end function"],["get","end get"],["if","end if"],["interface","end interface"],["module","end module"],["namespace","end namespace"],["operator","end operator"],["property","end property"],["raiseevent","end raiseevent"],["removehandler","end removehandler"],["select","end select"],["set","end set"],["structure","end structure"],["sub","end sub"],["synclock","end synclock"],["try","end try"],["while","end while"],["with","end with"],["using","end using"],["do","loop"],["for","next"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"<",close:">",notIn:["string","comment"]}],folding:{markers:{start:new RegExp("^\\s*#Region\\b"),end:new RegExp("^\\s*#End Region\\b")}}},p={defaultToken:"",tokenPostfix:".vb",ignoreCase:!0,brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.angle",open:"<",close:">"},{token:"keyword.tag-addhandler",open:"addhandler",close:"end addhandler"},{token:"keyword.tag-class",open:"class",close:"end class"},{token:"keyword.tag-enum",open:"enum",close:"end enum"},{token:"keyword.tag-event",open:"event",close:"end event"},{token:"keyword.tag-function",open:"function",close:"end function"},{token:"keyword.tag-get",open:"get",close:"end get"},{token:"keyword.tag-if",open:"if",close:"end if"},{token:"keyword.tag-interface",open:"interface",close:"end interface"},{token:"keyword.tag-module",open:"module",close:"end module"},{token:"keyword.tag-namespace",open:"namespace",close:"end namespace"},{token:"keyword.tag-operator",open:"operator",close:"end operator"},{token:"keyword.tag-property",open:"property",close:"end property"},{token:"keyword.tag-raiseevent",open:"raiseevent",close:"end raiseevent"},{token:"keyword.tag-removehandler",open:"removehandler",close:"end removehandler"},{token:"keyword.tag-select",open:"select",close:"end select"},{token:"keyword.tag-set",open:"set",close:"end set"},{token:"keyword.tag-structure",open:"structure",close:"end structure"},{token:"keyword.tag-sub",open:"sub",close:"end sub"},{token:"keyword.tag-synclock",open:"synclock",close:"end synclock"},{token:"keyword.tag-try",open:"try",close:"end try"},{token:"keyword.tag-while",open:"while",close:"end while"},{token:"keyword.tag-with",open:"with",close:"end with"},{token:"keyword.tag-using",open:"using",close:"end using"},{token:"keyword.tag-do",open:"do",close:"loop"},{token:"keyword.tag-for",open:"for",close:"next"}],keywords:["AddHandler","AddressOf","Alias","And","AndAlso","As","Async","Boolean","ByRef","Byte","ByVal","Call","Case","Catch","CBool","CByte","CChar","CDate","CDbl","CDec","Char","CInt","Class","CLng","CObj","Const","Continue","CSByte","CShort","CSng","CStr","CType","CUInt","CULng","CUShort","Date","Decimal","Declare","Default","Delegate","Dim","DirectCast","Do","Double","Each","Else","ElseIf","End","EndIf","Enum","Erase","Error","Event","Exit","False","Finally","For","Friend","Function","Get","GetType","GetXMLNamespace","Global","GoSub","GoTo","Handles","If","Implements","Imports","In","Inherits","Integer","Interface","Is","IsNot","Let","Lib","Like","Long","Loop","Me","Mod","Module","MustInherit","MustOverride","MyBase","MyClass","NameOf","Namespace","Narrowing","New","Next","Not","Nothing","NotInheritable","NotOverridable","Object","Of","On","Operator","Option","Optional","Or","OrElse","Out","Overloads","Overridable","Overrides","ParamArray","Partial","Private","Property","Protected","Public","RaiseEvent","ReadOnly","ReDim","RemoveHandler","Resume","Return","SByte","Select","Set","Shadows","Shared","Short","Single","Static","Step","Stop","String","Structure","Sub","SyncLock","Then","Throw","To","True","Try","TryCast","TypeOf","UInteger","ULong","UShort","Using","Variant","Wend","When","While","Widening","With","WithEvents","WriteOnly","Xor"],tagwords:["If","Sub","Select","Try","Class","Enum","Function","Get","Interface","Module","Namespace","Operator","Set","Structure","Using","While","With","Do","Loop","For","Next","Property","Continue","AddHandler","RemoveHandler","Event","RaiseEvent","SyncLock"],symbols:/[=>{ -"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var p=(t,e)=>{for(var a in e)s(t,a,{get:e[a],enumerable:!0})},d=(t,e,a,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of l(e))!u.call(t,i)&&i!==a&&s(t,i,{get:()=>e[i],enumerable:!(o=m(e,i))||o.enumerable});return t};var x=t=>d(s({},"__esModule",{value:!0}),t);var F={};p(F,{conf:()=>f,language:()=>L});var f={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"}]};function r(t){let e=[],a=t.split(/\t+|\r+|\n+| +/);for(let o=0;o0&&e.push(a[o]);return e}var g=r("true false"),_=r(` - alias - break - case - const - const_assert - continue - continuing - default - diagnostic - discard - else - enable - fn - for - if - let - loop - override - requires - return - struct - switch - var - while - `),h=r(` - NULL - Self - abstract - active - alignas - alignof - as - asm - asm_fragment - async - attribute - auto - await - become - binding_array - cast - catch - class - co_await - co_return - co_yield - coherent - column_major - common - compile - compile_fragment - concept - const_cast - consteval - constexpr - constinit - crate - debugger - decltype - delete - demote - demote_to_helper - do - dynamic_cast - enum - explicit - export - extends - extern - external - fallthrough - filter - final - finally - friend - from - fxgroup - get - goto - groupshared - highp - impl - implements - import - inline - instanceof - interface - layout - lowp - macro - macro_rules - match - mediump - meta - mod - module - move - mut - mutable - namespace - new - nil - noexcept - noinline - nointerpolation - noperspective - null - nullptr - of - operator - package - packoffset - partition - pass - patch - pixelfragment - precise - precision - premerge - priv - protected - pub - public - readonly - ref - regardless - register - reinterpret_cast - require - resource - restrict - self - set - shared - sizeof - smooth - snorm - static - static_assert - static_cast - std - subroutine - super - target - template - this - thread_local - throw - trait - try - type - typedef - typeid - typename - typeof - union - unless - unorm - unsafe - unsized - use - using - varying - virtual - volatile - wgsl - where - with - writeonly - yield - `),b=r(` - read write read_write - function private workgroup uniform storage - perspective linear flat - center centroid sample - vertex_index instance_index position front_facing frag_depth - local_invocation_id local_invocation_index - global_invocation_id workgroup_id num_workgroups - sample_index sample_mask - rgba8unorm - rgba8snorm - rgba8uint - rgba8sint - rgba16uint - rgba16sint - rgba16float - r32uint - r32sint - r32float - rg32uint - rg32sint - rg32float - rgba32uint - rgba32sint - rgba32float - bgra8unorm -`),v=r(` - bool - f16 - f32 - i32 - sampler sampler_comparison - texture_depth_2d - texture_depth_2d_array - texture_depth_cube - texture_depth_cube_array - texture_depth_multisampled_2d - texture_external - texture_external - u32 - `),y=r(` - array - atomic - mat2x2 - mat2x3 - mat2x4 - mat3x2 - mat3x3 - mat3x4 - mat4x2 - mat4x3 - mat4x4 - ptr - texture_1d - texture_2d - texture_2d_array - texture_3d - texture_cube - texture_cube_array - texture_multisampled_2d - texture_storage_1d - texture_storage_2d - texture_storage_2d_array - texture_storage_3d - vec2 - vec3 - vec4 - `),k=r(` - vec2i vec3i vec4i - vec2u vec3u vec4u - vec2f vec3f vec4f - vec2h vec3h vec4h - mat2x2f mat2x3f mat2x4f - mat3x2f mat3x3f mat3x4f - mat4x2f mat4x3f mat4x4f - mat2x2h mat2x3h mat2x4h - mat3x2h mat3x3h mat3x4h - mat4x2h mat4x3h mat4x4h - `),w=r(` - bitcast all any select arrayLength abs acos acosh asin asinh atan atanh atan2 - ceil clamp cos cosh countLeadingZeros countOneBits countTrailingZeros cross - degrees determinant distance dot exp exp2 extractBits faceForward firstLeadingBit - firstTrailingBit floor fma fract frexp inverseBits inverseSqrt ldexp length - log log2 max min mix modf normalize pow quantizeToF16 radians reflect refract - reverseBits round saturate sign sin sinh smoothstep sqrt step tan tanh transpose - trunc dpdx dpdxCoarse dpdxFine dpdy dpdyCoarse dpdyFine fwidth fwidthCoarse fwidthFine - textureDimensions textureGather textureGatherCompare textureLoad textureNumLayers - textureNumLevels textureNumSamples textureSample textureSampleBias textureSampleCompare - textureSampleCompareLevel textureSampleGrad textureSampleLevel textureSampleBaseClampToEdge - textureStore atomicLoad atomicStore atomicAdd atomicSub atomicMax atomicMin - atomicAnd atomicOr atomicXor atomicExchange atomicCompareExchangeWeak pack4x8snorm - pack4x8unorm pack2x16snorm pack2x16unorm pack2x16float unpack4x8snorm unpack4x8unorm - unpack2x16snorm unpack2x16unorm unpack2x16float storageBarrier workgroupBarrier - workgroupUniformLoad -`),S=r(` - & - && - -> - / - = - == - != - > - >= - < - <= - % - - - -- - + - ++ - | - || - * - << - >> - += - -= - *= - /= - %= - &= - |= - ^= - >>= - <<= - `),C=/enable|requires|diagnostic/,c=/[_\p{XID_Start}]\p{XID_Continue}*/u,n="variable.predefined",L={tokenPostfix:".wgsl",defaultToken:"invalid",unicode:!0,atoms:g,keywords:_,reserved:h,predeclared_enums:b,predeclared_types:v,predeclared_type_generators:y,predeclared_type_aliases:k,predeclared_intrinsics:w,operators:S,symbols:/[!%&*+\-\.\/:;<=>^|_~,]+/,tokenizer:{root:[[C,"keyword","@directive"],[c,{cases:{"@atoms":n,"@keywords":"keyword","@reserved":"invalid","@predeclared_enums":n,"@predeclared_types":n,"@predeclared_type_generators":n,"@predeclared_type_aliases":n,"@predeclared_intrinsics":n,"@default":"identifier"}}],{include:"@commentOrSpace"},{include:"@numbers"},[/[{}()\[\]]/,"@brackets"],["@","annotation","@attribute"],[/@symbols/,{cases:{"@operators":"operator","@default":"delimiter"}}],[/./,"invalid"]],commentOrSpace:[[/\s+/,"white"],[/\/\*/,"comment","@blockComment"],[/\/\/.*$/,"comment"]],blockComment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@push"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],attribute:[{include:"@commentOrSpace"},[/\w+/,"annotation","@pop"]],directive:[{include:"@commentOrSpace"},[/[()]/,"@brackets"],[/,/,"delimiter"],[c,"meta.content"],[/;/,"delimiter","@pop"]],numbers:[[/0[fh]/,"number.float"],[/[1-9][0-9]*[fh]/,"number.float"],[/[0-9]*\.[0-9]+([eE][+-]?[0-9]+)?[fh]?/,"number.float"],[/[0-9]+\.[0-9]*([eE][+-]?[0-9]+)?[fh]?/,"number.float"],[/[0-9]+[eE][+-]?[0-9]+[fh]?/,"number.float"],[/0[xX][0-9a-fA-F]*\.[0-9a-fA-F]+(?:[pP][+-]?[0-9]+[fh]?)?/,"number.hex"],[/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*(?:[pP][+-]?[0-9]+[fh]?)?/,"number.hex"],[/0[xX][0-9a-fA-F]+[pP][+-]?[0-9]+[fh]?/,"number.hex"],[/0[xX][0-9a-fA-F]+[iu]?/,"number.hex"],[/[1-9][0-9]*[iu]?/,"number"],[/0[iu]?/,"number"]]}};return x(F);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/xml/xml.js b/public/js/monaco-editor-0.52.2/min/vs/basic-languages/xml/xml.js deleted file mode 100644 index 040ca5821f..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/basic-languages/xml/xml.js +++ /dev/null @@ -1,10 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/xml/xml", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var u=Object.create;var m=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var k=Object.getPrototypeOf,x=Object.prototype.hasOwnProperty;var f=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var w=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),b=(e,t)=>{for(var n in t)m(e,n,{get:t[n],enumerable:!0})},i=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of p(t))!x.call(e,o)&&o!==n&&m(e,o,{get:()=>t[o],enumerable:!(r=g(t,o))||r.enumerable});return e},l=(e,t,n)=>(i(e,t,"default"),n&&i(n,t,"default")),c=(e,t,n)=>(n=e!=null?u(k(e)):{},i(t||!e||!e.__esModule?m(n,"default",{value:e,enumerable:!0}):n,e)),q=e=>i(m({},"__esModule",{value:!0}),e);var s=w((v,d)=>{var N=c(f("vs/editor/editor.api"));d.exports=N});var I={};b(I,{conf:()=>A,language:()=>C});var a={};l(a,c(s()));var A={comments:{blockComment:[""]},brackets:[["<",">"]],autoClosingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],surroundingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],onEnterRules:[{beforeText:new RegExp("<([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$","i"),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:a.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp("<(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$","i"),action:{indentAction:a.languages.IndentAction.Indent}}]},C={defaultToken:"",tokenPostfix:".xml",ignoreCase:!0,qualifiedName:/(?:[\w\.\-]+:)?[\w\.\-]+/,tokenizer:{root:[[/[^<&]+/,""],{include:"@whitespace"},[/(<)(@qualifiedName)/,[{token:"delimiter"},{token:"tag",next:"@tag"}]],[/(<\/)(@qualifiedName)(\s*)(>)/,[{token:"delimiter"},{token:"tag"},"",{token:"delimiter"}]],[/(<\?)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/(<\!)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/<\!\[CDATA\[/,{token:"delimiter.cdata",next:"@cdata"}],[/&\w+;/,"string.escape"]],cdata:[[/[^\]]+/,""],[/\]\]>/,{token:"delimiter.cdata",next:"@pop"}],[/\]/,""]],tag:[[/[ \t\r\n]+/,""],[/(@qualifiedName)(\s*=\s*)("[^"]*"|'[^']*')/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">?\/]*|'[^'>?\/]*)(?=[\?\/]\>)/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">]*|'[^'>]*)/,["attribute.name","","attribute.value"]],[/@qualifiedName/,"attribute.name"],[/\?>/,{token:"delimiter",next:"@pop"}],[/(\/)(>)/,[{token:"tag"},{token:"delimiter",next:"@pop"}]],[/>/,{token:"delimiter",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[//,{token:"comment",next:"@pop"}],[/"),typeof Re!="string"&&!dt(Re))if(typeof Re.toString=="function"){if(Re=Re.toString(),typeof Re!="string")throw Pt("dirty is not a string, aborting")}else throw Pt("toString is not a function");if(!e.isSupported)return Re;if(ue||xe(Se),e.removed=[],typeof Re=="string"&&($=!1),$){if(Re.nodeName){const rt=Oe(Re.nodeName);if(!x[rt]||z[rt])throw Pt("root node is forbidden and cannot be sanitized in-place")}}else if(Re instanceof m)We=je(""),qe=We.ownerDocument.importNode(Re,!0),qe.nodeType===Ft.element&&qe.nodeName==="BODY"||qe.nodeName==="HTML"?We=qe:We.appendChild(qe);else{if(!pe&&!R&&!ie&&Re.indexOf("<")===-1)return r&&ee?r.createHTML(Re):Re;if(We=je(Re),!We)return pe?null:ee?u:""}We&&he&&He(We.firstChild);const tt=Xe($?Re:We);for(;Ue=tt.nextNode();)st(Ue)||(Ue.content instanceof E&&Ie(Ue.content),De(Ue));if($)return Re;if(pe){if(ae)for(Je=h.call(We.ownerDocument);We.firstChild;)Je.appendChild(We.firstChild);else Je=We;return(V.shadowroot||V.shadowrootmode)&&(Je=w.call(k,Je,!0)),Je}let Qe=ie?We.outerHTML:We.innerHTML;return ie&&x["!doctype"]&&We.ownerDocument&&We.ownerDocument.doctype&&We.ownerDocument.doctype.name&&_t(ai,We.ownerDocument.doctype.name)&&(Qe=" -`+Qe),R&&Wt([L,D,T],rt=>{Qe=Rt(Qe,rt," ")}),r&&ee?r.createHTML(Qe):Qe},e.setConfig=function(){let Re=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};xe(Re),ue=!0},e.clearConfig=function(){Fe=null,ue=!1},e.isValidAttribute=function(Re,Se,We){Fe||xe({});const qe=Oe(Re),Ue=Oe(Se);return pt(qe,Ue,We)},e.addHook=function(Re,Se){typeof Se=="function"&&(S[Re]=S[Re]||[],At(S[Re],Se))},e.removeHook=function(Re){if(S[Re])return ei(S[Re])},e.removeHooks=function(Re){S[Re]&&(S[Re]=[])},e.removeAllHooks=function(){S={}},e}var xi=di();define("vs/base/browser/dompurify/dompurify",function(){return xi}),define(ne[39],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FastDomNode=void 0,e.createFastDomNode=I;class d{constructor(y){this.domNode=y,this._maxWidth="",this._width="",this._height="",this._top="",this._left="",this._bottom="",this._right="",this._paddingLeft="",this._fontFamily="",this._fontWeight="",this._fontSize="",this._fontStyle="",this._fontFeatureSettings="",this._fontVariationSettings="",this._textDecoration="",this._lineHeight="",this._letterSpacing="",this._className="",this._display="",this._position="",this._visibility="",this._color="",this._backgroundColor="",this._layerHint=!1,this._contain="none",this._boxShadow=""}setMaxWidth(y){const m=k(y);this._maxWidth!==m&&(this._maxWidth=m,this.domNode.style.maxWidth=this._maxWidth)}setWidth(y){const m=k(y);this._width!==m&&(this._width=m,this.domNode.style.width=this._width)}setHeight(y){const m=k(y);this._height!==m&&(this._height=m,this.domNode.style.height=this._height)}setTop(y){const m=k(y);this._top!==m&&(this._top=m,this.domNode.style.top=this._top)}setLeft(y){const m=k(y);this._left!==m&&(this._left=m,this.domNode.style.left=this._left)}setBottom(y){const m=k(y);this._bottom!==m&&(this._bottom=m,this.domNode.style.bottom=this._bottom)}setRight(y){const m=k(y);this._right!==m&&(this._right=m,this.domNode.style.right=this._right)}setPaddingLeft(y){const m=k(y);this._paddingLeft!==m&&(this._paddingLeft=m,this.domNode.style.paddingLeft=this._paddingLeft)}setFontFamily(y){this._fontFamily!==y&&(this._fontFamily=y,this.domNode.style.fontFamily=this._fontFamily)}setFontWeight(y){this._fontWeight!==y&&(this._fontWeight=y,this.domNode.style.fontWeight=this._fontWeight)}setFontSize(y){const m=k(y);this._fontSize!==m&&(this._fontSize=m,this.domNode.style.fontSize=this._fontSize)}setFontStyle(y){this._fontStyle!==y&&(this._fontStyle=y,this.domNode.style.fontStyle=this._fontStyle)}setFontFeatureSettings(y){this._fontFeatureSettings!==y&&(this._fontFeatureSettings=y,this.domNode.style.fontFeatureSettings=this._fontFeatureSettings)}setFontVariationSettings(y){this._fontVariationSettings!==y&&(this._fontVariationSettings=y,this.domNode.style.fontVariationSettings=this._fontVariationSettings)}setTextDecoration(y){this._textDecoration!==y&&(this._textDecoration=y,this.domNode.style.textDecoration=this._textDecoration)}setLineHeight(y){const m=k(y);this._lineHeight!==m&&(this._lineHeight=m,this.domNode.style.lineHeight=this._lineHeight)}setLetterSpacing(y){const m=k(y);this._letterSpacing!==m&&(this._letterSpacing=m,this.domNode.style.letterSpacing=this._letterSpacing)}setClassName(y){this._className!==y&&(this._className=y,this.domNode.className=this._className)}toggleClassName(y,m){this.domNode.classList.toggle(y,m),this._className=this.domNode.className}setDisplay(y){this._display!==y&&(this._display=y,this.domNode.style.display=this._display)}setPosition(y){this._position!==y&&(this._position=y,this.domNode.style.position=this._position)}setVisibility(y){this._visibility!==y&&(this._visibility=y,this.domNode.style.visibility=this._visibility)}setColor(y){this._color!==y&&(this._color=y,this.domNode.style.color=this._color)}setBackgroundColor(y){this._backgroundColor!==y&&(this._backgroundColor=y,this.domNode.style.backgroundColor=this._backgroundColor)}setLayerHinting(y){this._layerHint!==y&&(this._layerHint=y,this.domNode.style.transform=this._layerHint?"translate3d(0px, 0px, 0px)":"")}setBoxShadow(y){this._boxShadow!==y&&(this._boxShadow=y,this.domNode.style.boxShadow=y)}setContain(y){this._contain!==y&&(this._contain=y,this.domNode.style.contain=this._contain)}setAttribute(y,m){this.domNode.setAttribute(y,m)}removeAttribute(y){this.domNode.removeAttribute(y)}appendChild(y){this.domNode.appendChild(y.domNode)}removeChild(y){this.domNode.removeChild(y.domNode)}}e.FastDomNode=d;function k(E){return typeof E=="number"?`${E}px`:E}function I(E){return new d(E)}}),define(ne[441],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IframeUtils=void 0;const d=new WeakMap;function k(E){if(!E.parent||E.parent===E)return null;try{const y=E.location,m=E.parent.location;if(y.origin!=="null"&&m.origin!=="null"&&y.origin!==m.origin)return null}catch{return null}return E.parent}class I{static getSameOriginWindowChain(y){let m=d.get(y);if(!m){m=[],d.set(y,m);let _=y,b;do b=k(_),b?m.push({window:new WeakRef(_),iframeElement:_.frameElement||null}):m.push({window:new WeakRef(_),iframeElement:null}),_=b;while(_)}return m.slice(0)}static getPositionOfChildWindowRelativeToAncestorWindow(y,m){if(!m||y===m)return{top:0,left:0};let _=0,b=0;const p=this.getSameOriginWindowChain(y);for(const n of p){const o=n.window.deref();if(_+=o?.scrollY??0,b+=o?.scrollX??0,o===m||!n.iframeElement)break;const t=n.iframeElement.getBoundingClientRect();_+=t.top,b+=t.left}return{top:_,left:b}}}e.IframeUtils=I}),define(ne[296],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.inputLatency=void 0;var d;(function(k){const I={total:0,min:Number.MAX_VALUE,max:0},E={...I},y={...I},m={...I};let _=0;const b={keydown:0,input:0,render:0};function p(){r(),performance.mark("inputlatency/start"),performance.mark("keydown/start"),b.keydown=1,queueMicrotask(n)}k.onKeyDown=p;function n(){b.keydown===1&&(performance.mark("keydown/end"),b.keydown=2)}function o(){performance.mark("input/start"),b.input=1,a()}k.onBeforeInput=o;function t(){b.input===0&&o(),queueMicrotask(i)}k.onInput=t;function i(){b.input===1&&(performance.mark("input/end"),b.input=2)}function s(){r()}k.onKeyUp=s;function g(){r()}k.onSelectionChange=g;function c(){b.keydown===2&&b.input===2&&b.render===0&&(performance.mark("render/start"),b.render=1,queueMicrotask(l),a())}k.onRenderStart=c;function l(){b.render===1&&(performance.mark("render/end"),b.render=2)}function a(){setTimeout(r)}function r(){b.keydown===2&&b.input===2&&b.render===2&&(performance.mark("inputlatency/end"),performance.measure("keydown","keydown/start","keydown/end"),performance.measure("input","input/start","input/end"),performance.measure("render","render/start","render/end"),performance.measure("inputlatency","inputlatency/start","inputlatency/end"),u("keydown",I),u("input",E),u("render",y),u("inputlatency",m),_++,C())}function u(w,S){const L=performance.getEntriesByName(w)[0].duration;S.total+=L,S.min=Math.min(S.min,L),S.max=Math.max(S.max,L)}function C(){performance.clearMarks("keydown/start"),performance.clearMarks("keydown/end"),performance.clearMarks("input/start"),performance.clearMarks("input/end"),performance.clearMarks("render/start"),performance.clearMarks("render/end"),performance.clearMarks("inputlatency/start"),performance.clearMarks("inputlatency/end"),performance.clearMeasures("keydown"),performance.clearMeasures("input"),performance.clearMeasures("render"),performance.clearMeasures("inputlatency"),b.keydown=0,b.input=0,b.render=0}function f(){if(_===0)return;const w={keydown:h(I),input:h(E),render:h(y),total:h(m),sampleCount:_};return v(I),v(E),v(y),v(m),_=0,w}k.getAndClearMeasurements=f;function h(w){return{average:w.total/_,max:w.max,min:w.min}}function v(w){w.total=0,w.min=Number.MAX_VALUE,w.max=0}})(d||(e.inputLatency=d={}))}),define(ne[81],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.setBaseLayerHoverDelegate=k,e.getBaseLayerHoverDelegate=I;let d={showHover:()=>{},hideHover:()=>{},showAndFocusLastHover:()=>{},setupManagedHover:()=>null,showManagedHover:()=>{}};function k(E){d=E}function I(){return d}}),define(ne[442],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ListError=void 0;class d extends Error{constructor(I,E){super(`ListError [${I}] ${E}`)}}e.ListError=d}),define(ne[443],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CombinedSpliceable=void 0;class d{constructor(I){this.spliceables=I}splice(I,E,y){this.spliceables.forEach(m=>m.splice(I,E,y))}}e.CombinedSpliceable=d}),define(ne[223],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ScrollbarState=void 0;const d=20;class k{constructor(E,y,m,_,b,p){this._scrollbarSize=Math.round(y),this._oppositeScrollbarSize=Math.round(m),this._arrowSize=Math.round(E),this._visibleSize=_,this._scrollSize=b,this._scrollPosition=p,this._computedAvailableSize=0,this._computedIsNeeded=!1,this._computedSliderSize=0,this._computedSliderRatio=0,this._computedSliderPosition=0,this._refreshComputedValues()}clone(){return new k(this._arrowSize,this._scrollbarSize,this._oppositeScrollbarSize,this._visibleSize,this._scrollSize,this._scrollPosition)}setVisibleSize(E){const y=Math.round(E);return this._visibleSize!==y?(this._visibleSize=y,this._refreshComputedValues(),!0):!1}setScrollSize(E){const y=Math.round(E);return this._scrollSize!==y?(this._scrollSize=y,this._refreshComputedValues(),!0):!1}setScrollPosition(E){const y=Math.round(E);return this._scrollPosition!==y?(this._scrollPosition=y,this._refreshComputedValues(),!0):!1}setScrollbarSize(E){this._scrollbarSize=Math.round(E)}setOppositeScrollbarSize(E){this._oppositeScrollbarSize=Math.round(E)}static _computeValues(E,y,m,_,b){const p=Math.max(0,m-E),n=Math.max(0,p-2*y),o=_>0&&_>m;if(!o)return{computedAvailableSize:Math.round(p),computedIsNeeded:o,computedSliderSize:Math.round(n),computedSliderRatio:0,computedSliderPosition:0};const t=Math.round(Math.max(d,Math.floor(m*n/_))),i=(n-t)/(_-m),s=b*i;return{computedAvailableSize:Math.round(p),computedIsNeeded:o,computedSliderSize:Math.round(t),computedSliderRatio:i,computedSliderPosition:Math.round(s)}}_refreshComputedValues(){const E=k._computeValues(this._oppositeScrollbarSize,this._arrowSize,this._visibleSize,this._scrollSize,this._scrollPosition);this._computedAvailableSize=E.computedAvailableSize,this._computedIsNeeded=E.computedIsNeeded,this._computedSliderSize=E.computedSliderSize,this._computedSliderRatio=E.computedSliderRatio,this._computedSliderPosition=E.computedSliderPosition}getArrowSize(){return this._arrowSize}getScrollPosition(){return this._scrollPosition}getRectangleLargeSize(){return this._computedAvailableSize}getRectangleSmallSize(){return this._scrollbarSize}isNeeded(){return this._computedIsNeeded}getSliderSize(){return this._computedSliderSize}getSliderPosition(){return this._computedSliderPosition}getDesiredScrollPositionFromOffset(E){if(!this._computedIsNeeded)return 0;const y=E-this._arrowSize-this._computedSliderSize/2;return Math.round(y/this._computedSliderRatio)}getDesiredScrollPositionFromOffsetPaged(E){if(!this._computedIsNeeded)return 0;const y=E-this._arrowSize;let m=this._scrollPosition;return yI})}e.mainWindow=window}),define(ne[64],se([1,0,52]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isAndroid=e.isElectron=e.isWebkitWebView=e.isSafari=e.isChrome=e.isWebKit=e.isFirefox=void 0,e.addMatchMediaChangeListener=I,e.getZoomFactor=E,e.isStandalone=_;class k{constructor(){this.mapWindowIdToZoomFactor=new Map}static{this.INSTANCE=new k}getZoomFactor(p){return this.mapWindowIdToZoomFactor.get(this.getWindowId(p))??1}getWindowId(p){return p.vscodeWindowId}}function I(b,p,n){typeof p=="string"&&(p=b.matchMedia(p)),p.addEventListener("change",n)}function E(b){return k.INSTANCE.getZoomFactor(b)}const y=navigator.userAgent;e.isFirefox=y.indexOf("Firefox")>=0,e.isWebKit=y.indexOf("AppleWebKit")>=0,e.isChrome=y.indexOf("Chrome")>=0,e.isSafari=!e.isChrome&&y.indexOf("Safari")>=0,e.isWebkitWebView=!e.isChrome&&!e.isSafari&&e.isWebKit,e.isElectron=y.indexOf("Electron/")>=0,e.isAndroid=y.indexOf("Android")>=0;let m=!1;if(typeof d.mainWindow.matchMedia=="function"){const b=d.mainWindow.matchMedia("(display-mode: standalone) or (display-mode: window-controls-overlay)"),p=d.mainWindow.matchMedia("(display-mode: fullscreen)");m=b.matches,I(d.mainWindow,b,({matches:n})=>{m&&p.matches||(m=n)})}function _(){return m}}),define(ne[13],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Permutation=e.CallbackIterable=e.ArrayQueue=e.booleanComparator=e.numberComparator=e.CompareResult=void 0,e.tail=d,e.tail2=k,e.equals=I,e.removeFastWithoutKeepingOrder=E,e.binarySearch=y,e.binarySearch2=m,e.quickSelect=_,e.groupBy=b,e.groupAdjacentBy=p,e.forEachAdjacent=n,e.forEachWithNeighbors=o,e.coalesce=t,e.coalesceInPlace=i,e.isFalsyOrEmpty=s,e.isNonEmptyArray=g,e.distinct=c,e.firstOrDefault=l,e.range=a,e.arrayInsert=r,e.pushToStart=u,e.pushToEnd=C,e.pushMany=f,e.asArray=h,e.insertInto=v,e.splice=w,e.compareBy=D,e.tieBreakComparators=T,e.reverseOrder=P;function d(x,W=0){return x[x.length-(1+W)]}function k(x){if(x.length===0)throw new Error("Invalid tail call");return[x.slice(0,x.length-1),x[x.length-1]]}function I(x,W,V=(q,H)=>q===H){if(x===W)return!0;if(!x||!W||x.length!==W.length)return!1;for(let q=0,H=x.length;qV(x[q],W))}function m(x,W){let V=0,q=x-1;for(;V<=q;){const H=(V+q)/2|0,z=W(H);if(z<0)V=H+1;else if(z>0)q=H-1;else return H}return-(V+1)}function _(x,W,V){if(x=x|0,x>=W.length)throw new TypeError("invalid index");const q=W[Math.floor(W.length*Math.random())],H=[],z=[],U=[];for(const j of W){const Y=V(j,q);Y<0?H.push(j):Y>0?z.push(j):U.push(j)}return x!!W)}function i(x){let W=0;for(let V=0;V0}function c(x,W=V=>V){const V=new Set;return x.filter(q=>{const H=W(q);return V.has(H)?!1:(V.add(H),!0)})}function l(x,W){return x.length>0?x[0]:W}function a(x,W){let V=typeof W=="number"?x:0;typeof W=="number"?V=x:(V=0,W=x);const q=[];if(V<=W)for(let H=V;HW;H--)q.push(H);return q}function r(x,W,V){const q=x.slice(0,W),H=x.slice(W);return q.concat(V,H)}function u(x,W){const V=x.indexOf(W);V>-1&&(x.splice(V,1),x.unshift(W))}function C(x,W){const V=x.indexOf(W);V>-1&&(x.splice(V,1),x.push(W))}function f(x,W){for(const V of W)x.push(V)}function h(x){return Array.isArray(x)?x:[x]}function v(x,W,V){const q=S(x,W),H=x.length,z=V.length;x.length=H+z;for(let U=H-1;U>=q;U--)x[U+z]=x[U];for(let U=0;U0}x.isGreaterThan=q;function H(z){return z===0}x.isNeitherLessOrGreaterThan=H,x.greaterThan=1,x.lessThan=-1,x.neitherLessOrGreaterThan=0})(L||(e.CompareResult=L={}));function D(x,W){return(V,q)=>W(x(V),x(q))}function T(...x){return(W,V)=>{for(const q of x){const H=q(W,V);if(!L.isNeitherLessOrGreaterThan(H))return H}return L.neitherLessOrGreaterThan}}const M=(x,W)=>x-W;e.numberComparator=M;const A=(x,W)=>(0,e.numberComparator)(x?1:0,W?1:0);e.booleanComparator=A;function P(x){return(W,V)=>-x(W,V)}class N{constructor(W){this.items=W,this.firstIdx=0,this.lastIdx=this.items.length-1}get length(){return this.lastIdx-this.firstIdx+1}takeWhile(W){let V=this.firstIdx;for(;V=0&&W(this.items[V]);)V--;const q=V===this.lastIdx?null:this.items.slice(V+1,this.lastIdx+1);return this.lastIdx=V,q}peek(){if(this.length!==0)return this.items[this.firstIdx]}dequeue(){const W=this.items[this.firstIdx];return this.firstIdx++,W}takeCount(W){const V=this.items.slice(this.firstIdx,this.firstIdx+W);return this.firstIdx+=W,V}}e.ArrayQueue=N;class O{static{this.empty=new O(W=>{})}constructor(W){this.iterate=W}toArray(){const W=[];return this.iterate(V=>(W.push(V),!0)),W}filter(W){return new O(V=>this.iterate(q=>W(q)?V(q):!0))}map(W){return new O(V=>this.iterate(q=>V(W(q))))}findLast(W){let V;return this.iterate(q=>(W(q)&&(V=q),!0)),V}findLastMaxBy(W){let V,q=!0;return this.iterate(H=>((q||L.isGreaterThan(W(H,V)))&&(q=!1,V=H),!0)),V}}e.CallbackIterable=O;class F{constructor(W){this._indexMap=W}static createSortPermutation(W,V){const q=Array.from(W.keys()).sort((H,z)=>V(W[H],W[z]));return new F(q)}apply(W){return W.map((V,q)=>W[this._indexMap[q]])}inverse(){const W=this._indexMap.slice();for(let V=0;V=0;c--){const l=i[c];if(s(l))return c}return-1}function I(i,s){const g=E(i,s);return g===-1?void 0:i[g]}function E(i,s,g=0,c=i.length){let l=g,a=c;for(;l0&&(g=l)}return g}function p(i,s){if(i.length===0)return;let g=i[0];for(let c=1;c=0&&(g=l)}return g}function n(i,s){return b(i,(g,c)=>-s(g,c))}function o(i,s){if(i.length===0)return-1;let g=0;for(let c=1;c0&&(g=c)}return g}function t(i,s){for(const g of i){const c=s(g);if(c!==void 0)return c}}}),define(ne[297],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CachedFunction=e.LRUCachedFunction=void 0,e.identity=d;function d(E){return E}class k{constructor(y,m){this.lastCache=void 0,this.lastArgKey=void 0,typeof y=="function"?(this._fn=y,this._computeKey=d):(this._fn=m,this._computeKey=y.getCacheKey)}get(y){const m=this._computeKey(y);return this.lastArgKey!==m&&(this.lastArgKey=m,this.lastCache=this._fn(y)),this.lastCache}}e.LRUCachedFunction=k;class I{get cachedValues(){return this._map}constructor(y,m){this._map=new Map,this._map2=new Map,typeof y=="function"?(this._fn=y,this._computeKey=d):(this._fn=m,this._computeKey=y.getCacheKey)}get(y){const m=this._computeKey(y);if(this._map2.has(m))return this._map2.get(m);const _=this._fn(y);return this._map.set(y,_),this._map2.set(m,_),_}}e.CachedFunction=I}),define(ne[298],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.diffSets=d,e.intersection=k;function d(I,E){const y=[],m=[];for(const _ of I)E.has(_)||y.push(_);for(const _ of E)I.has(_)||m.push(_);return{removed:y,added:m}}function k(I,E){const y=new Set;for(const m of E)I.has(m)&&y.add(m);return y}}),define(ne[33],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Color=e.HSVA=e.HSLA=e.RGBA=void 0;function d(m,_){const b=Math.pow(10,_);return Math.round(m*b)/b}class k{constructor(_,b,p,n=1){this._rgbaBrand=void 0,this.r=Math.min(255,Math.max(0,_))|0,this.g=Math.min(255,Math.max(0,b))|0,this.b=Math.min(255,Math.max(0,p))|0,this.a=d(Math.max(Math.min(1,n),0),3)}static equals(_,b){return _.r===b.r&&_.g===b.g&&_.b===b.b&&_.a===b.a}}e.RGBA=k;class I{constructor(_,b,p,n){this._hslaBrand=void 0,this.h=Math.max(Math.min(360,_),0)|0,this.s=d(Math.max(Math.min(1,b),0),3),this.l=d(Math.max(Math.min(1,p),0),3),this.a=d(Math.max(Math.min(1,n),0),3)}static equals(_,b){return _.h===b.h&&_.s===b.s&&_.l===b.l&&_.a===b.a}static fromRGBA(_){const b=_.r/255,p=_.g/255,n=_.b/255,o=_.a,t=Math.max(b,p,n),i=Math.min(b,p,n);let s=0,g=0;const c=(i+t)/2,l=t-i;if(l>0){switch(g=Math.min(c<=.5?l/(2*c):l/(2-2*c),1),t){case b:s=(p-n)/l+(p1&&(p-=1),p<1/6?_+(b-_)*6*p:p<1/2?b:p<2/3?_+(b-_)*(2/3-p)*6:_}static toRGBA(_){const b=_.h/360,{s:p,l:n,a:o}=_;let t,i,s;if(p===0)t=i=s=n;else{const g=n<.5?n*(1+p):n+p-n*p,c=2*n-g;t=I._hue2rgb(c,g,b+1/3),i=I._hue2rgb(c,g,b),s=I._hue2rgb(c,g,b-1/3)}return new k(Math.round(t*255),Math.round(i*255),Math.round(s*255),o)}}e.HSLA=I;class E{constructor(_,b,p,n){this._hsvaBrand=void 0,this.h=Math.max(Math.min(360,_),0)|0,this.s=d(Math.max(Math.min(1,b),0),3),this.v=d(Math.max(Math.min(1,p),0),3),this.a=d(Math.max(Math.min(1,n),0),3)}static equals(_,b){return _.h===b.h&&_.s===b.s&&_.v===b.v&&_.a===b.a}static fromRGBA(_){const b=_.r/255,p=_.g/255,n=_.b/255,o=Math.max(b,p,n),t=Math.min(b,p,n),i=o-t,s=o===0?0:i/o;let g;return i===0?g=0:o===b?g=((p-n)/i%6+6)%6:o===p?g=(n-b)/i+2:g=(b-p)/i+4,new E(Math.round(g*60),s,o,_.a)}static toRGBA(_){const{h:b,s:p,v:n,a:o}=_,t=n*p,i=t*(1-Math.abs(b/60%2-1)),s=n-t;let[g,c,l]=[0,0,0];return b<60?(g=t,c=i):b<120?(g=i,c=t):b<180?(c=t,l=i):b<240?(c=i,l=t):b<300?(g=i,l=t):b<=360&&(g=t,l=i),g=Math.round((g+s)*255),c=Math.round((c+s)*255),l=Math.round((l+s)*255),new k(g,c,l,o)}}e.HSVA=E;class y{static fromHex(_){return y.Format.CSS.parseHex(_)||y.red}static equals(_,b){return!_&&!b?!0:!_||!b?!1:_.equals(b)}get hsla(){return this._hsla?this._hsla:I.fromRGBA(this.rgba)}get hsva(){return this._hsva?this._hsva:E.fromRGBA(this.rgba)}constructor(_){if(_)if(_ instanceof k)this.rgba=_;else if(_ instanceof I)this._hsla=_,this.rgba=I.toRGBA(_);else if(_ instanceof E)this._hsva=_,this.rgba=E.toRGBA(_);else throw new Error("Invalid color ctor argument");else throw new Error("Color needs a value")}equals(_){return!!_&&k.equals(this.rgba,_.rgba)&&I.equals(this.hsla,_.hsla)&&E.equals(this.hsva,_.hsva)}getRelativeLuminance(){const _=y._relativeLuminanceForComponent(this.rgba.r),b=y._relativeLuminanceForComponent(this.rgba.g),p=y._relativeLuminanceForComponent(this.rgba.b),n=.2126*_+.7152*b+.0722*p;return d(n,4)}static _relativeLuminanceForComponent(_){const b=_/255;return b<=.03928?b/12.92:Math.pow((b+.055)/1.055,2.4)}isLighter(){return(this.rgba.r*299+this.rgba.g*587+this.rgba.b*114)/1e3>=128}isLighterThan(_){const b=this.getRelativeLuminance(),p=_.getRelativeLuminance();return b>p}isDarkerThan(_){const b=this.getRelativeLuminance(),p=_.getRelativeLuminance();return bb===p;e.strictEquals=k;function I(b=e.strictEquals){return(p,n)=>d.equals(p,n,b)}function E(){return(b,p)=>b.equals(p)}function y(b,p,n){if(n!==void 0){const o=b;return o==null||p===void 0||p===null?p===o:n(o,p)}else{const o=b;return(t,i)=>t==null||i===void 0||i===null?i===t:o(t,i)}}function m(b,p){if(b===p)return!0;if(Array.isArray(b)&&Array.isArray(p)){if(b.length!==p.length)return!1;for(let n=0;n{throw g.stack?t.isErrorNoTelemetry(g)?new t(g.message+` - -`+g.stack):new Error(g.message+` - -`+g.stack):g},0)}}emit(g){this.listeners.forEach(c=>{c(g)})}onUnexpectedError(g){this.unexpectedErrorHandler(g),this.emit(g)}onUnexpectedExternalError(g){this.unexpectedErrorHandler(g)}}e.ErrorHandler=d,e.errorHandler=new d;function k(s){m(s)||e.errorHandler.onUnexpectedError(s)}function I(s){m(s)||e.errorHandler.onUnexpectedExternalError(s)}function E(s){if(s instanceof Error){const{name:g,message:c}=s,l=s.stacktrace||s.stack;return{$isError:!0,name:g,message:c,stack:l,noTelemetry:t.isErrorNoTelemetry(s)}}return s}const y="Canceled";function m(s){return s instanceof _?!0:s instanceof Error&&s.name===y&&s.message===y}class _ extends Error{constructor(){super(y),this.name=this.message}}e.CancellationError=_;function b(){const s=new Error(y);return s.name=s.message,s}function p(s){return s?new Error(`Illegal argument: ${s}`):new Error("Illegal argument")}function n(s){return s?new Error(`Illegal state: ${s}`):new Error("Illegal state")}class o extends Error{constructor(g){super("NotSupported"),g&&(this.message=g)}}e.NotSupportedError=o;class t extends Error{constructor(g){super(g),this.name="CodeExpectedError"}static fromError(g){if(g instanceof t)return g;const c=new t;return c.message=g.message,c.stack=g.stack,c}static isErrorNoTelemetry(g){return g.name==="CodeExpectedError"}}e.ErrorNoTelemetry=t;class i extends Error{constructor(g){super(g||"An unexpected bug occurred."),Object.setPrototypeOf(this,i.prototype)}}e.BugIndicatingError=i}),define(ne[103],se([1,0,8]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createTrustedTypesPolicy=k;function k(I,E){const y=globalThis.MonacoEnvironment;if(y?.createTrustedTypesPolicy)try{return y.createTrustedTypesPolicy(I,E)}catch(m){(0,d.onUnexpectedError)(m);return}try{return globalThis.trustedTypes?.createPolicy(I,E)}catch(m){(0,d.onUnexpectedError)(m);return}}}),define(ne[90],se([1,0,8]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ok=k,e.assertNever=I,e.softAssert=E,e.assertFn=y,e.checkAdjacentItems=m;function k(_,b){if(!_)throw new Error(b?`Assertion failed (${b})`:"Assertion Failed")}function I(_,b="Unreachable"){throw new Error(b)}function E(_){_||(0,d.onUnexpectedError)(new d.BugIndicatingError("Soft Assertion Failed"))}function y(_){if(!_()){debugger;_(),(0,d.onUnexpectedError)(new d.BugIndicatingError("Assertion Failed"))}}function m(_,b){let p=0;for(;p<_.length-1;){const n=_[p],o=_[p+1];if(!b(n,o))return!1;p++}return!0}}),define(ne[127],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createSingleCallFunction=d;function d(k,I){const E=this;let y=!1,m;return function(){if(y)return m;if(y=!0,I)try{m=k.apply(E,arguments)}finally{I()}else m=k.apply(E,arguments);return m}}}),define(ne[91],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HierarchicalKind=void 0;class d{static{this.sep="."}static{this.None=new d("@@none@@")}static{this.Empty=new d("")}constructor(I){this.value=I}equals(I){return this.value===I.value}contains(I){return this.equals(I)||this.value===""||I.value.startsWith(this.value+d.sep)}intersects(I){return this.contains(I)||I.contains(this)}append(...I){return new d((this.value?[this.value,...I]:I).join(d.sep))}}e.HierarchicalKind=d}),define(ne[187],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.defaultGenerator=e.IdGenerator=void 0;class d{constructor(I){this._prefix=I,this._lastId=0}nextId(){return this._prefix+ ++this._lastId}}e.IdGenerator=d,e.defaultGenerator=new d("id#")}),define(ne[53],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Iterable=void 0;var d;(function(k){function I(f){return f&&typeof f=="object"&&typeof f[Symbol.iterator]=="function"}k.is=I;const E=Object.freeze([]);function y(){return E}k.empty=y;function*m(f){yield f}k.single=m;function _(f){return I(f)?f:m(f)}k.wrap=_;function b(f){return f||E}k.from=b;function*p(f){for(let h=f.length-1;h>=0;h--)yield f[h]}k.reverse=p;function n(f){return!f||f[Symbol.iterator]().next().done===!0}k.isEmpty=n;function o(f){return f[Symbol.iterator]().next().value}k.first=o;function t(f,h){let v=0;for(const w of f)if(h(w,v++))return!0;return!1}k.some=t;function i(f,h){for(const v of f)if(h(v))return v}k.find=i;function*s(f,h){for(const v of f)h(v)&&(yield v)}k.filter=s;function*g(f,h){let v=0;for(const w of f)yield h(w,v++)}k.map=g;function*c(f,h){let v=0;for(const w of f)yield*h(w,v++)}k.flatMap=c;function*l(...f){for(const h of f)yield*h}k.concat=l;function a(f,h,v){let w=v;for(const S of f)w=h(w,S);return w}k.reduce=a;function*r(f,h,v=f.length){for(h<0&&(h+=f.length),v<0?v+=f.length:v>f.length&&(v=f.length);h=98&&l<=113)return null;switch(l){case 16:return"Up";case 18:return"Down";case 15:return"Left";case 17:return"Right"}return k.keyCodeToStr(l)}n.toElectronAccelerator=c})(b||(e.KeyCodeUtils=b={}));function p(n,o){const t=(o&65535)<<16>>>0;return(n|t)>>>0}}),define(ne[140],se([1,0,8]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ResolvedKeybinding=e.ResolvedChord=e.Keybinding=e.ScanCodeChord=e.KeyCodeChord=void 0,e.decodeKeybinding=k,e.createSimpleKeybinding=I;function k(p,n){if(typeof p=="number"){if(p===0)return null;const o=(p&65535)>>>0,t=(p&4294901760)>>>16;return t!==0?new m([I(o,n),I(t,n)]):new m([I(o,n)])}else{const o=[];for(let t=0;t({get delay(){return-1},dispose:()=>{},showHover:()=>{}});const E=new d.Lazy(()=>I("mouse",!1)),y=new d.Lazy(()=>I("element",!1));function m(p){I=p}function _(p){return p==="element"?y.value:E.value}function b(){return I("element",!0)}}),define(ne[160],se([1,0,98]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.VSBuffer=void 0,e.readUInt16LE=m,e.writeUInt16LE=_,e.readUInt32BE=b,e.writeUInt32BE=p,e.readUInt8=n,e.writeUInt8=o;const k=typeof Buffer<"u",I=new d.Lazy(()=>new Uint8Array(256));let E;class y{static wrap(i){return k&&!Buffer.isBuffer(i)&&(i=Buffer.from(i.buffer,i.byteOffset,i.byteLength)),new y(i)}constructor(i){this.buffer=i,this.byteLength=this.buffer.byteLength}toString(){return k?this.buffer.toString():(E||(E=new TextDecoder),E.decode(this.buffer))}}e.VSBuffer=y;function m(t,i){return t[i+0]<<0>>>0|t[i+1]<<8>>>0}function _(t,i,s){t[s+0]=i&255,i=i>>>8,t[s+1]=i&255}function b(t,i){return t[i]*2**24+t[i+1]*2**16+t[i+2]*2**8+t[i+3]}function p(t,i,s){t[s+3]=i,i=i>>>8,t[s+2]=i,i=i>>>8,t[s+1]=i,i=i>>>8,t[s]=i}function n(t,i){return t[i]}function o(t,i,s){t[s]=i}}),define(ne[445],se([1,0,98]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.compareFileNames=y,e.compareAnything=m,e.compareByPrefix=_;const k=new d.Lazy(()=>{const b=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});return{collator:b,collatorIsNumeric:b.resolvedOptions().numeric}}),I=new d.Lazy(()=>({collator:new Intl.Collator(void 0,{numeric:!0})})),E=new d.Lazy(()=>({collator:new Intl.Collator(void 0,{numeric:!0,sensitivity:"accent"})}));function y(b,p,n=!1){const o=b||"",t=p||"",i=k.value.collator.compare(o,t);return k.value.collatorIsNumeric&&i===0&&o!==t?ot.length)return 1}return 0}}),define(ne[2],se([1,0,127,53]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DisposableMap=e.ImmortalReference=e.RefCountedDisposable=e.MutableDisposable=e.Disposable=e.DisposableStore=void 0,e.setDisposableTracker=y,e.trackDisposable=m,e.markAsDisposed=_,e.markAsSingleton=n,e.isDisposable=o,e.dispose=t,e.combinedDisposable=i,e.toDisposable=s;const I=!1;let E=null;function y(C){E=C}if(I){const C="__is_disposable_tracked__";y(new class{trackDisposable(f){const h=new Error("Potentially leaked disposable").stack;setTimeout(()=>{f[C]||console.log(h)},3e3)}setParent(f,h){if(f&&f!==c.None)try{f[C]=!0}catch{}}markAsDisposed(f){if(f&&f!==c.None)try{f[C]=!0}catch{}}markAsSingleton(f){}})}function m(C){return E?.trackDisposable(C),C}function _(C){E?.markAsDisposed(C)}function b(C,f){E?.setParent(C,f)}function p(C,f){if(E)for(const h of C)E.setParent(h,f)}function n(C){return E?.markAsSingleton(C),C}function o(C){return typeof C=="object"&&C!==null&&typeof C.dispose=="function"&&C.dispose.length===0}function t(C){if(k.Iterable.is(C)){const f=[];for(const h of C)if(h)try{h.dispose()}catch(v){f.push(v)}if(f.length===1)throw f[0];if(f.length>1)throw new AggregateError(f,"Encountered errors while disposing of store");return Array.isArray(C)?[]:C}else if(C)return C.dispose(),C}function i(...C){const f=s(()=>t(C));return p(C,f),f}function s(C){const f=m({dispose:(0,d.createSingleCallFunction)(()=>{_(f),C()})});return f}class g{static{this.DISABLE_DISPOSED_WARNING=!1}constructor(){this._toDispose=new Set,this._isDisposed=!1,m(this)}dispose(){this._isDisposed||(_(this),this._isDisposed=!0,this.clear())}get isDisposed(){return this._isDisposed}clear(){if(this._toDispose.size!==0)try{t(this._toDispose)}finally{this._toDispose.clear()}}add(f){if(!f)return f;if(f===this)throw new Error("Cannot register a disposable on itself!");return b(f,this),this._isDisposed?g.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(f),f}deleteAndLeak(f){f&&this._toDispose.has(f)&&(this._toDispose.delete(f),b(f,null))}}e.DisposableStore=g;class c{static{this.None=Object.freeze({dispose(){}})}constructor(){this._store=new g,m(this),b(this._store,this)}dispose(){_(this),this._store.dispose()}_register(f){if(f===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(f)}}e.Disposable=c;class l{constructor(){this._isDisposed=!1,m(this)}get value(){return this._isDisposed?void 0:this._value}set value(f){this._isDisposed||f===this._value||(this._value?.dispose(),f&&b(f,this),this._value=f)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,_(this),this._value?.dispose(),this._value=void 0}}e.MutableDisposable=l;class a{constructor(f){this._disposable=f,this._counter=1}acquire(){return this._counter++,this}release(){return--this._counter===0&&this._disposable.dispose(),this}}e.RefCountedDisposable=a;class r{constructor(f){this.object=f}dispose(){}}e.ImmortalReference=r;class u{constructor(){this._store=new Map,this._isDisposed=!1,m(this)}dispose(){_(this),this._isDisposed=!0,this.clearAndDisposeAll()}clearAndDisposeAll(){if(this._store.size)try{t(this._store.values())}finally{this._store.clear()}}get(f){return this._store.get(f)}set(f,h,v=!1){this._isDisposed&&console.warn(new Error("Trying to add a disposable to a DisposableMap that has already been disposed of. The added object will be leaked!").stack),v||this._store.get(f)?.dispose(),this._store.set(f,h)}deleteAndDispose(f){this._store.get(f)?.dispose(),this._store.delete(f)}[Symbol.iterator](){return this._store[Symbol.iterator]()}}e.DisposableMap=u}),define(ne[73],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinkedList=void 0;class d{static{this.Undefined=new d(void 0)}constructor(E){this.element=E,this.next=d.Undefined,this.prev=d.Undefined}}class k{constructor(){this._first=d.Undefined,this._last=d.Undefined,this._size=0}get size(){return this._size}isEmpty(){return this._first===d.Undefined}clear(){let E=this._first;for(;E!==d.Undefined;){const y=E.next;E.prev=d.Undefined,E.next=d.Undefined,E=y}this._first=d.Undefined,this._last=d.Undefined,this._size=0}unshift(E){return this._insert(E,!1)}push(E){return this._insert(E,!0)}_insert(E,y){const m=new d(E);if(this._first===d.Undefined)this._first=m,this._last=m;else if(y){const b=this._last;this._last=m,m.prev=b,b.next=m}else{const b=this._first;this._first=m,m.next=b,b.prev=m}this._size+=1;let _=!1;return()=>{_||(_=!0,this._remove(m))}}shift(){if(this._first!==d.Undefined){const E=this._first.element;return this._remove(this._first),E}}pop(){if(this._last!==d.Undefined){const E=this._last.element;return this._remove(this._last),E}}_remove(E){if(E.prev!==d.Undefined&&E.next!==d.Undefined){const y=E.prev;y.next=E.next,E.next.prev=y}else E.prev===d.Undefined&&E.next===d.Undefined?(this._first=d.Undefined,this._last=d.Undefined):E.next===d.Undefined?(this._last=this._last.prev,this._last.next=d.Undefined):E.prev===d.Undefined&&(this._first=this._first.next,this._first.prev=d.Undefined);this._size-=1}*[Symbol.iterator](){let E=this._first;for(;E!==d.Undefined;)yield E.element,E=E.next}}e.LinkedList=k});var ke=this&&this.__decorate||function(oe,e,d,k){var I=arguments.length,E=I<3?e:k===null?k=Object.getOwnPropertyDescriptor(e,d):k,y;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")E=Reflect.decorate(oe,e,d,k);else for(var m=oe.length-1;m>=0;m--)(y=oe[m])&&(E=(I<3?y(E):I>3?y(e,d,E):y(e,d))||E);return I>3&&E&&Object.defineProperty(e,d,E),E};define(ne[446],se([1,0,126]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinkedText=void 0,e.parseLinkedText=E;class k{constructor(m){this.nodes=m}toString(){return this.nodes.map(m=>typeof m=="string"?m:m.label).join("")}}e.LinkedText=k,ke([d.memoize],k.prototype,"toString",null);const I=/\[([^\]]+)\]\(((?:https?:\/\/|command:|file:)[^\)\s]+)(?: (["'])(.+?)(\3))?\)/gi;function E(y){const m=[];let _=0,b;for(;b=I.exec(y);){b.index-_>0&&m.push(y.substring(_,b.index));const[,p,n,,o]=b;o?m.push({label:p,href:n,title:o}):m.push({label:p,href:n}),_=b.index+b[0].length}return _t.toString()}constructor(t,i){if(this[d]="ResourceMap",t instanceof y)this.map=new Map(t.map),this.toKey=i??y.defaultToKey;else if(E(t)){this.map=new Map,this.toKey=i??y.defaultToKey;for(const[s,g]of t)this.set(s,g)}else this.map=new Map,this.toKey=t??y.defaultToKey}set(t,i){return this.map.set(this.toKey(t),new I(t,i)),this}get(t){return this.map.get(this.toKey(t))?.value}has(t){return this.map.has(this.toKey(t))}get size(){return this.map.size}clear(){this.map.clear()}delete(t){return this.map.delete(this.toKey(t))}forEach(t,i){typeof i<"u"&&(t=t.bind(i));for(const[s,g]of this.map)t(g.value,g.uri,this)}*values(){for(const t of this.map.values())yield t.value}*keys(){for(const t of this.map.values())yield t.uri}*entries(){for(const t of this.map.values())yield[t.uri,t.value]}*[(d=Symbol.toStringTag,Symbol.iterator)](){for(const[,t]of this.map)yield[t.uri,t.value]}}e.ResourceMap=y;class m{constructor(){this[k]="LinkedMap",this._map=new Map,this._head=void 0,this._tail=void 0,this._size=0,this._state=0}clear(){this._map.clear(),this._head=void 0,this._tail=void 0,this._size=0,this._state++}isEmpty(){return!this._head&&!this._tail}get size(){return this._size}get first(){return this._head?.value}get last(){return this._tail?.value}has(t){return this._map.has(t)}get(t,i=0){const s=this._map.get(t);if(s)return i!==0&&this.touch(s,i),s.value}set(t,i,s=0){let g=this._map.get(t);if(g)g.value=i,s!==0&&this.touch(g,s);else{switch(g={key:t,value:i,next:void 0,previous:void 0},s){case 0:this.addItemLast(g);break;case 1:this.addItemFirst(g);break;case 2:this.addItemLast(g);break;default:this.addItemLast(g);break}this._map.set(t,g),this._size++}return this}delete(t){return!!this.remove(t)}remove(t){const i=this._map.get(t);if(i)return this._map.delete(t),this.removeItem(i),this._size--,i.value}shift(){if(!this._head&&!this._tail)return;if(!this._head||!this._tail)throw new Error("Invalid list");const t=this._head;return this._map.delete(t.key),this.removeItem(t),this._size--,t.value}forEach(t,i){const s=this._state;let g=this._head;for(;g;){if(i?t.bind(i)(g.value,g.key,this):t(g.value,g.key,this),this._state!==s)throw new Error("LinkedMap got modified during iteration.");g=g.next}}keys(){const t=this,i=this._state;let s=this._head;const g={[Symbol.iterator](){return g},next(){if(t._state!==i)throw new Error("LinkedMap got modified during iteration.");if(s){const c={value:s.key,done:!1};return s=s.next,c}else return{value:void 0,done:!0}}};return g}values(){const t=this,i=this._state;let s=this._head;const g={[Symbol.iterator](){return g},next(){if(t._state!==i)throw new Error("LinkedMap got modified during iteration.");if(s){const c={value:s.value,done:!1};return s=s.next,c}else return{value:void 0,done:!0}}};return g}entries(){const t=this,i=this._state;let s=this._head;const g={[Symbol.iterator](){return g},next(){if(t._state!==i)throw new Error("LinkedMap got modified during iteration.");if(s){const c={value:[s.key,s.value],done:!1};return s=s.next,c}else return{value:void 0,done:!0}}};return g}[(k=Symbol.toStringTag,Symbol.iterator)](){return this.entries()}trimOld(t){if(t>=this.size)return;if(t===0){this.clear();return}let i=this._head,s=this.size;for(;i&&s>t;)this._map.delete(i.key),i=i.next,s--;this._head=i,this._size=s,i&&(i.previous=void 0),this._state++}trimNew(t){if(t>=this.size)return;if(t===0){this.clear();return}let i=this._tail,s=this.size;for(;i&&s>t;)this._map.delete(i.key),i=i.previous,s--;this._tail=i,this._size=s,i&&(i.next=void 0),this._state++}addItemFirst(t){if(!this._head&&!this._tail)this._tail=t;else if(this._head)t.next=this._head,this._head.previous=t;else throw new Error("Invalid list");this._head=t,this._state++}addItemLast(t){if(!this._head&&!this._tail)this._head=t;else if(this._tail)t.previous=this._tail,this._tail.next=t;else throw new Error("Invalid list");this._tail=t,this._state++}removeItem(t){if(t===this._head&&t===this._tail)this._head=void 0,this._tail=void 0;else if(t===this._head){if(!t.next)throw new Error("Invalid list");t.next.previous=void 0,this._head=t.next}else if(t===this._tail){if(!t.previous)throw new Error("Invalid list");t.previous.next=void 0,this._tail=t.previous}else{const i=t.next,s=t.previous;if(!i||!s)throw new Error("Invalid list");i.previous=s,s.next=i}t.next=void 0,t.previous=void 0,this._state++}touch(t,i){if(!this._head||!this._tail)throw new Error("Invalid list");if(!(i!==1&&i!==2)){if(i===1){if(t===this._head)return;const s=t.next,g=t.previous;t===this._tail?(g.next=void 0,this._tail=g):(s.previous=g,g.next=s),t.previous=void 0,t.next=this._head,this._head.previous=t,this._head=t,this._state++}else if(i===2){if(t===this._tail)return;const s=t.next,g=t.previous;t===this._head?(s.previous=void 0,this._head=s):(s.previous=g,g.next=s),t.next=void 0,t.previous=this._tail,this._tail.next=t,this._tail=t,this._state++}}}toJSON(){const t=[];return this.forEach((i,s)=>{t.push([s,i])}),t}fromJSON(t){this.clear();for(const[i,s]of t)this.set(i,s)}}e.LinkedMap=m;class _ extends m{constructor(t,i=1){super(),this._limit=t,this._ratio=Math.min(Math.max(0,i),1)}get limit(){return this._limit}set limit(t){this._limit=t,this.checkTrim()}get(t,i=2){return super.get(t,i)}peek(t){return super.get(t,0)}set(t,i){return super.set(t,i,2),this}checkTrim(){this.size>this._limit&&this.trim(Math.round(this._limit*this._ratio))}}class b extends _{constructor(t,i=1){super(t,i)}trim(t){this.trimOld(t)}set(t,i){return super.set(t,i),this.checkTrim(),this}}e.LRUCache=b;class p{constructor(t){if(this._m1=new Map,this._m2=new Map,t)for(const[i,s]of t)this.set(i,s)}clear(){this._m1.clear(),this._m2.clear()}set(t,i){this._m1.set(t,i),this._m2.set(i,t)}get(t){return this._m1.get(t)}getKey(t){return this._m2.get(t)}delete(t){const i=this._m1.get(t);return i===void 0?!1:(this._m1.delete(t),this._m2.delete(i),!0)}keys(){return this._m1.keys()}values(){return this._m1.values()}}e.BidirectionalMap=p;class n{constructor(){this.map=new Map}add(t,i){let s=this.map.get(t);s||(s=new Set,this.map.set(t,s)),s.add(i)}delete(t,i){const s=this.map.get(t);s&&(s.delete(i),s.size===0&&this.map.delete(t))}forEach(t,i){const s=this.map.get(t);s&&s.forEach(i)}get(t){const i=this.map.get(t);return i||new Set}}e.SetMap=n}),function(oe,e){typeof define=="function"&&define.amd?define(ne[447],se([0]),e):typeof exports=="object"&&typeof module<"u"?e(exports):(oe=typeof globalThis<"u"?globalThis:oe||self,e(oe.marked={}))}(this,function(oe){"use strict";function e(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}oe.defaults=e();function d(xe){oe.defaults=xe}const k=/[&<>"']/,I=new RegExp(k.source,"g"),E=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,y=new RegExp(E.source,"g"),m={"&":"&","<":"<",">":">",'"':""","'":"'"},_=xe=>m[xe];function b(xe,be){if(be){if(k.test(xe))return xe.replace(I,_)}else if(E.test(xe))return xe.replace(y,_);return xe}const p=/(^|[^\[])\^/g;function n(xe,be){let ve=typeof xe=="string"?xe:xe.source;be=be||"";const we={replace:(Te,Pe)=>{let Be=typeof Pe=="string"?Pe:Pe.source;return Be=Be.replace(p,"$1"),ve=ve.replace(Te,Be),we},getRegex:()=>new RegExp(ve,be)};return we}function o(xe){try{xe=encodeURI(xe).replace(/%25/g,"%")}catch{return null}return xe}const t={exec:()=>null};function i(xe,be){const ve=xe.replace(/\|/g,(Pe,Be,He)=>{let $e=!1,je=Be;for(;--je>=0&&He[je]==="\\";)$e=!$e;return $e?"|":" |"}),we=ve.split(/ \|/);let Te=0;if(we[0].trim()||we.shift(),we.length>0&&!we[we.length-1].trim()&&we.pop(),be)if(we.length>be)we.splice(be);else for(;we.length{const Pe=Te.match(/^\s+/);if(Pe===null)return Te;const[Be]=Pe;return Be.length>=we.length?Te.slice(we.length):Te}).join(` -`)}class a{options;rules;lexer;constructor(be){this.options=be||oe.defaults}space(be){const ve=this.rules.block.newline.exec(be);if(ve&&ve[0].length>0)return{type:"space",raw:ve[0]}}code(be){const ve=this.rules.block.code.exec(be);if(ve){const we=ve[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:ve[0],codeBlockStyle:"indented",text:this.options.pedantic?we:s(we,` -`)}}}fences(be){const ve=this.rules.block.fences.exec(be);if(ve){const we=ve[0],Te=l(we,ve[3]||"");return{type:"code",raw:we,lang:ve[2]?ve[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):ve[2],text:Te}}}heading(be){const ve=this.rules.block.heading.exec(be);if(ve){let we=ve[2].trim();if(/#$/.test(we)){const Te=s(we,"#");(this.options.pedantic||!Te||/ $/.test(Te))&&(we=Te.trim())}return{type:"heading",raw:ve[0],depth:ve[1].length,text:we,tokens:this.lexer.inline(we)}}}hr(be){const ve=this.rules.block.hr.exec(be);if(ve)return{type:"hr",raw:s(ve[0],` -`)}}blockquote(be){const ve=this.rules.block.blockquote.exec(be);if(ve){let we=s(ve[0],` -`).split(` -`),Te="",Pe="";const Be=[];for(;we.length>0;){let He=!1;const $e=[];let je;for(je=0;je/.test(we[je]))$e.push(we[je]),He=!0;else if(!He)$e.push(we[je]);else break;we=we.slice(je);const Xe=$e.join(` -`),et=Xe.replace(/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,` - $1`).replace(/^ {0,3}>[ \t]?/gm,"");Te=Te?`${Te} -${Xe}`:Xe,Pe=Pe?`${Pe} -${et}`:et;const dt=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(et,Be,!0),this.lexer.state.top=dt,we.length===0)break;const at=Be[Be.length-1];if(at?.type==="code")break;if(at?.type==="blockquote"){const st=at,pt=st.raw+` -`+we.join(` -`),bt=this.blockquote(pt);Be[Be.length-1]=bt,Te=Te.substring(0,Te.length-st.raw.length)+bt.raw,Pe=Pe.substring(0,Pe.length-st.text.length)+bt.text;break}else if(at?.type==="list"){const st=at,pt=st.raw+` -`+we.join(` -`),bt=this.list(pt);Be[Be.length-1]=bt,Te=Te.substring(0,Te.length-at.raw.length)+bt.raw,Pe=Pe.substring(0,Pe.length-st.raw.length)+bt.raw,we=pt.substring(Be[Be.length-1].raw.length).split(` -`);continue}}return{type:"blockquote",raw:Te,tokens:Be,text:Pe}}}list(be){let ve=this.rules.block.list.exec(be);if(ve){let we=ve[1].trim();const Te=we.length>1,Pe={type:"list",raw:"",ordered:Te,start:Te?+we.slice(0,-1):"",loose:!1,items:[]};we=Te?`\\d{1,9}\\${we.slice(-1)}`:`\\${we}`,this.options.pedantic&&(we=Te?we:"[*+-]");const Be=new RegExp(`^( {0,3}${we})((?:[ ][^\\n]*)?(?:\\n|$))`);let He=!1;for(;be;){let $e=!1,je="",Xe="";if(!(ve=Be.exec(be))||this.rules.block.hr.test(be))break;je=ve[0],be=be.substring(je.length);let et=ve[2].split(` -`,1)[0].replace(/^\t+/,De=>" ".repeat(3*De.length)),dt=be.split(` -`,1)[0],at=!et.trim(),st=0;if(this.options.pedantic?(st=2,Xe=et.trimStart()):at?st=ve[1].length+1:(st=ve[2].search(/[^ ]/),st=st>4?1:st,Xe=et.slice(st),st+=ve[1].length),at&&/^ *$/.test(dt)&&(je+=dt+` -`,be=be.substring(dt.length+1),$e=!0),!$e){const De=new RegExp(`^ {0,${Math.min(3,st-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),Ie=new RegExp(`^ {0,${Math.min(3,st-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),Re=new RegExp(`^ {0,${Math.min(3,st-1)}}(?:\`\`\`|~~~)`),Se=new RegExp(`^ {0,${Math.min(3,st-1)}}#`);for(;be;){const We=be.split(` -`,1)[0];if(dt=We,this.options.pedantic&&(dt=dt.replace(/^ {1,4}(?=( {4})*[^ ])/g," ")),Re.test(dt)||Se.test(dt)||De.test(dt)||Ie.test(be))break;if(dt.search(/[^ ]/)>=st||!dt.trim())Xe+=` -`+dt.slice(st);else{if(at||et.search(/[^ ]/)>=4||Re.test(et)||Se.test(et)||Ie.test(et))break;Xe+=` -`+dt}!at&&!dt.trim()&&(at=!0),je+=We+` -`,be=be.substring(We.length+1),et=dt.slice(st)}}Pe.loose||(He?Pe.loose=!0:/\n *\n *$/.test(je)&&(He=!0));let pt=null,bt;this.options.gfm&&(pt=/^\[[ xX]\] /.exec(Xe),pt&&(bt=pt[0]!=="[ ] ",Xe=Xe.replace(/^\[[ xX]\] +/,""))),Pe.items.push({type:"list_item",raw:je,task:!!pt,checked:bt,loose:!1,text:Xe,tokens:[]}),Pe.raw+=je}Pe.items[Pe.items.length-1].raw=Pe.items[Pe.items.length-1].raw.trimEnd(),Pe.items[Pe.items.length-1].text=Pe.items[Pe.items.length-1].text.trimEnd(),Pe.raw=Pe.raw.trimEnd();for(let $e=0;$eet.type==="space"),Xe=je.length>0&&je.some(et=>/\n.*\n/.test(et.raw));Pe.loose=Xe}if(Pe.loose)for(let $e=0;$e$/,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",Pe=ve[3]?ve[3].substring(1,ve[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):ve[3];return{type:"def",tag:we,raw:ve[0],href:Te,title:Pe}}}table(be){const ve=this.rules.block.table.exec(be);if(!ve||!/[:|]/.test(ve[2]))return;const we=i(ve[1]),Te=ve[2].replace(/^\||\| *$/g,"").split("|"),Pe=ve[3]&&ve[3].trim()?ve[3].replace(/\n[ \t]*$/,"").split(` -`):[],Be={type:"table",raw:ve[0],header:[],align:[],rows:[]};if(we.length===Te.length){for(const He of Te)/^ *-+: *$/.test(He)?Be.align.push("right"):/^ *:-+: *$/.test(He)?Be.align.push("center"):/^ *:-+ *$/.test(He)?Be.align.push("left"):Be.align.push(null);for(let He=0;He({text:$e,tokens:this.lexer.inline($e),header:!1,align:Be.align[je]})));return Be}}lheading(be){const ve=this.rules.block.lheading.exec(be);if(ve)return{type:"heading",raw:ve[0],depth:ve[2].charAt(0)==="="?1:2,text:ve[1],tokens:this.lexer.inline(ve[1])}}paragraph(be){const ve=this.rules.block.paragraph.exec(be);if(ve){const we=ve[1].charAt(ve[1].length-1)===` -`?ve[1].slice(0,-1):ve[1];return{type:"paragraph",raw:ve[0],text:we,tokens:this.lexer.inline(we)}}}text(be){const ve=this.rules.block.text.exec(be);if(ve)return{type:"text",raw:ve[0],text:ve[0],tokens:this.lexer.inline(ve[0])}}escape(be){const ve=this.rules.inline.escape.exec(be);if(ve)return{type:"escape",raw:ve[0],text:b(ve[1])}}tag(be){const ve=this.rules.inline.tag.exec(be);if(ve)return!this.lexer.state.inLink&&/^/i.test(ve[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(ve[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(ve[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:ve[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:ve[0]}}link(be){const ve=this.rules.inline.link.exec(be);if(ve){const we=ve[2].trim();if(!this.options.pedantic&&/^$/.test(we))return;const Be=s(we.slice(0,-1),"\\");if((we.length-Be.length)%2===0)return}else{const Be=g(ve[2],"()");if(Be>-1){const $e=(ve[0].indexOf("!")===0?5:4)+ve[1].length+Be;ve[2]=ve[2].substring(0,Be),ve[0]=ve[0].substring(0,$e).trim(),ve[3]=""}}let Te=ve[2],Pe="";if(this.options.pedantic){const Be=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(Te);Be&&(Te=Be[1],Pe=Be[3])}else Pe=ve[3]?ve[3].slice(1,-1):"";return Te=Te.trim(),/^$/.test(we)?Te=Te.slice(1):Te=Te.slice(1,-1)),c(ve,{href:Te&&Te.replace(this.rules.inline.anyPunctuation,"$1"),title:Pe&&Pe.replace(this.rules.inline.anyPunctuation,"$1")},ve[0],this.lexer)}}reflink(be,ve){let we;if((we=this.rules.inline.reflink.exec(be))||(we=this.rules.inline.nolink.exec(be))){const Te=(we[2]||we[1]).replace(/\s+/g," "),Pe=ve[Te.toLowerCase()];if(!Pe){const Be=we[0].charAt(0);return{type:"text",raw:Be,text:Be}}return c(we,Pe,we[0],this.lexer)}}emStrong(be,ve,we=""){let Te=this.rules.inline.emStrongLDelim.exec(be);if(!Te||Te[3]&&we.match(/[\p{L}\p{N}]/u))return;if(!(Te[1]||Te[2]||"")||!we||this.rules.inline.punctuation.exec(we)){const Be=[...Te[0]].length-1;let He,$e,je=Be,Xe=0;const et=Te[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(et.lastIndex=0,ve=ve.slice(-1*be.length+Be);(Te=et.exec(ve))!=null;){if(He=Te[1]||Te[2]||Te[3]||Te[4]||Te[5]||Te[6],!He)continue;if($e=[...He].length,Te[3]||Te[4]){je+=$e;continue}else if((Te[5]||Te[6])&&Be%3&&!((Be+$e)%3)){Xe+=$e;continue}if(je-=$e,je>0)continue;$e=Math.min($e,$e+je+Xe);const dt=[...Te[0]][0].length,at=be.slice(0,Be+Te.index+dt+$e);if(Math.min(Be,$e)%2){const pt=at.slice(1,-1);return{type:"em",raw:at,text:pt,tokens:this.lexer.inlineTokens(pt)}}const st=at.slice(2,-2);return{type:"strong",raw:at,text:st,tokens:this.lexer.inlineTokens(st)}}}}codespan(be){const ve=this.rules.inline.code.exec(be);if(ve){let we=ve[2].replace(/\n/g," ");const Te=/[^ ]/.test(we),Pe=/^ /.test(we)&&/ $/.test(we);return Te&&Pe&&(we=we.substring(1,we.length-1)),we=b(we,!0),{type:"codespan",raw:ve[0],text:we}}}br(be){const ve=this.rules.inline.br.exec(be);if(ve)return{type:"br",raw:ve[0]}}del(be){const ve=this.rules.inline.del.exec(be);if(ve)return{type:"del",raw:ve[0],text:ve[2],tokens:this.lexer.inlineTokens(ve[2])}}autolink(be){const ve=this.rules.inline.autolink.exec(be);if(ve){let we,Te;return ve[2]==="@"?(we=b(ve[1]),Te="mailto:"+we):(we=b(ve[1]),Te=we),{type:"link",raw:ve[0],text:we,href:Te,tokens:[{type:"text",raw:we,text:we}]}}}url(be){let ve;if(ve=this.rules.inline.url.exec(be)){let we,Te;if(ve[2]==="@")we=b(ve[0]),Te="mailto:"+we;else{let Pe;do Pe=ve[0],ve[0]=this.rules.inline._backpedal.exec(ve[0])?.[0]??"";while(Pe!==ve[0]);we=b(ve[0]),ve[1]==="www."?Te="http://"+ve[0]:Te=ve[0]}return{type:"link",raw:ve[0],text:we,href:Te,tokens:[{type:"text",raw:we,text:we}]}}}inlineText(be){const ve=this.rules.inline.text.exec(be);if(ve){let we;return this.lexer.state.inRawBlock?we=ve[0]:we=b(ve[0]),{type:"text",raw:ve[0],text:we}}}}const r=/^(?: *(?:\n|$))+/,u=/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,C=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,f=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,h=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,v=/(?:[*+-]|\d{1,9}[.)])/,w=n(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html))+?)\n {0,3}(=+|-+) *(?:\n+|$)/).replace(/bull/g,v).replace(/blockCode/g,/ {4}/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).getRegex(),S=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,L=/^[^\n]+/,D=/(?!\s*\])(?:\\.|[^\[\]\\])+/,T=n(/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/).replace("label",D).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),M=n(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,v).getRegex(),A="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",P=/|$))/,N=n("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))","i").replace("comment",P).replace("tag",A).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),O=n(S).replace("hr",f).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",A).getRegex(),x={blockquote:n(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",O).getRegex(),code:u,def:T,fences:C,heading:h,hr:f,html:N,lheading:w,list:M,newline:r,paragraph:O,table:t,text:L},W=n("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",f).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",A).getRegex(),V={...x,table:W,paragraph:n(S).replace("hr",f).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",W).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",A).getRegex()},q={...x,html:n(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",P).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:t,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:n(S).replace("hr",f).replace("heading",` *#{1,6} *[^ -]`).replace("lheading",w).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},H=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,z=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,U=/^( {2,}|\\)\n(?!\s*$)/,j=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g,R=n(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,"u").replace(/punct/g,Y).getRegex(),J=n("^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])","gu").replace(/punct/g,Y).getRegex(),ie=n("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])","gu").replace(/punct/g,Y).getRegex(),ue=n(/\\([punct])/,"gu").replace(/punct/g,Y).getRegex(),he=n(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[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])?)+(?![-_])/).getRegex(),pe=n(P).replace("(?:-->|$)","-->").getRegex(),ae=n("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",pe).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),ee=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,de=n(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace("label",ee).replace("href",/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),ge=n(/^!?\[(label)\]\[(ref)\]/).replace("label",ee).replace("ref",D).getRegex(),X=n(/^!?\[(ref)\](?:\[\])?/).replace("ref",D).getRegex(),B=n("reflink|nolink(?!\\()","g").replace("reflink",ge).replace("nolink",X).getRegex(),$={_backpedal:t,anyPunctuation:ue,autolink:he,blockSkip:K,br:U,code:z,del:t,emStrongLDelim:R,emStrongRDelimAst:J,emStrongRDelimUnd:ie,escape:H,link:de,nolink:X,punctuation:G,reflink:ge,reflinkSearch:B,tag:ae,text:j,url:t},Q={...$,link:n(/^!?\[(label)\]\((.*?)\)/).replace("label",ee).getRegex(),reflink:n(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",ee).getRegex()},Z={...$,escape:n(H).replace("])","~|])").getRegex(),url:n(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\$e+" ".repeat(je.length));let Te,Pe,Be;for(;be;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some(He=>(Te=He.call({lexer:this},be,ve))?(be=be.substring(Te.raw.length),ve.push(Te),!0):!1))){if(Te=this.tokenizer.space(be)){be=be.substring(Te.raw.length),Te.raw.length===1&&ve.length>0?ve[ve.length-1].raw+=` -`:ve.push(Te);continue}if(Te=this.tokenizer.code(be)){be=be.substring(Te.raw.length),Pe=ve[ve.length-1],Pe&&(Pe.type==="paragraph"||Pe.type==="text")?(Pe.raw+=` -`+Te.raw,Pe.text+=` -`+Te.text,this.inlineQueue[this.inlineQueue.length-1].src=Pe.text):ve.push(Te);continue}if(Te=this.tokenizer.fences(be)){be=be.substring(Te.raw.length),ve.push(Te);continue}if(Te=this.tokenizer.heading(be)){be=be.substring(Te.raw.length),ve.push(Te);continue}if(Te=this.tokenizer.hr(be)){be=be.substring(Te.raw.length),ve.push(Te);continue}if(Te=this.tokenizer.blockquote(be)){be=be.substring(Te.raw.length),ve.push(Te);continue}if(Te=this.tokenizer.list(be)){be=be.substring(Te.raw.length),ve.push(Te);continue}if(Te=this.tokenizer.html(be)){be=be.substring(Te.raw.length),ve.push(Te);continue}if(Te=this.tokenizer.def(be)){be=be.substring(Te.raw.length),Pe=ve[ve.length-1],Pe&&(Pe.type==="paragraph"||Pe.type==="text")?(Pe.raw+=` -`+Te.raw,Pe.text+=` -`+Te.raw,this.inlineQueue[this.inlineQueue.length-1].src=Pe.text):this.tokens.links[Te.tag]||(this.tokens.links[Te.tag]={href:Te.href,title:Te.title});continue}if(Te=this.tokenizer.table(be)){be=be.substring(Te.raw.length),ve.push(Te);continue}if(Te=this.tokenizer.lheading(be)){be=be.substring(Te.raw.length),ve.push(Te);continue}if(Be=be,this.options.extensions&&this.options.extensions.startBlock){let He=1/0;const $e=be.slice(1);let je;this.options.extensions.startBlock.forEach(Xe=>{je=Xe.call({lexer:this},$e),typeof je=="number"&&je>=0&&(He=Math.min(He,je))}),He<1/0&&He>=0&&(Be=be.substring(0,He+1))}if(this.state.top&&(Te=this.tokenizer.paragraph(Be))){Pe=ve[ve.length-1],we&&Pe?.type==="paragraph"?(Pe.raw+=` -`+Te.raw,Pe.text+=` -`+Te.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=Pe.text):ve.push(Te),we=Be.length!==be.length,be=be.substring(Te.raw.length);continue}if(Te=this.tokenizer.text(be)){be=be.substring(Te.raw.length),Pe=ve[ve.length-1],Pe&&Pe.type==="text"?(Pe.raw+=` -`+Te.raw,Pe.text+=` -`+Te.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=Pe.text):ve.push(Te);continue}if(be){const He="Infinite loop on byte: "+be.charCodeAt(0);if(this.options.silent){console.error(He);break}else throw new Error(He)}}return this.state.top=!0,ve}inline(be,ve=[]){return this.inlineQueue.push({src:be,tokens:ve}),ve}inlineTokens(be,ve=[]){let we,Te,Pe,Be=be,He,$e,je;if(this.tokens.links){const Xe=Object.keys(this.tokens.links);if(Xe.length>0)for(;(He=this.tokenizer.rules.inline.reflinkSearch.exec(Be))!=null;)Xe.includes(He[0].slice(He[0].lastIndexOf("[")+1,-1))&&(Be=Be.slice(0,He.index)+"["+"a".repeat(He[0].length-2)+"]"+Be.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(He=this.tokenizer.rules.inline.blockSkip.exec(Be))!=null;)Be=Be.slice(0,He.index)+"["+"a".repeat(He[0].length-2)+"]"+Be.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;(He=this.tokenizer.rules.inline.anyPunctuation.exec(Be))!=null;)Be=Be.slice(0,He.index)+"++"+Be.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;be;)if($e||(je=""),$e=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some(Xe=>(we=Xe.call({lexer:this},be,ve))?(be=be.substring(we.raw.length),ve.push(we),!0):!1))){if(we=this.tokenizer.escape(be)){be=be.substring(we.raw.length),ve.push(we);continue}if(we=this.tokenizer.tag(be)){be=be.substring(we.raw.length),Te=ve[ve.length-1],Te&&we.type==="text"&&Te.type==="text"?(Te.raw+=we.raw,Te.text+=we.text):ve.push(we);continue}if(we=this.tokenizer.link(be)){be=be.substring(we.raw.length),ve.push(we);continue}if(we=this.tokenizer.reflink(be,this.tokens.links)){be=be.substring(we.raw.length),Te=ve[ve.length-1],Te&&we.type==="text"&&Te.type==="text"?(Te.raw+=we.raw,Te.text+=we.text):ve.push(we);continue}if(we=this.tokenizer.emStrong(be,Be,je)){be=be.substring(we.raw.length),ve.push(we);continue}if(we=this.tokenizer.codespan(be)){be=be.substring(we.raw.length),ve.push(we);continue}if(we=this.tokenizer.br(be)){be=be.substring(we.raw.length),ve.push(we);continue}if(we=this.tokenizer.del(be)){be=be.substring(we.raw.length),ve.push(we);continue}if(we=this.tokenizer.autolink(be)){be=be.substring(we.raw.length),ve.push(we);continue}if(!this.state.inLink&&(we=this.tokenizer.url(be))){be=be.substring(we.raw.length),ve.push(we);continue}if(Pe=be,this.options.extensions&&this.options.extensions.startInline){let Xe=1/0;const et=be.slice(1);let dt;this.options.extensions.startInline.forEach(at=>{dt=at.call({lexer:this},et),typeof dt=="number"&&dt>=0&&(Xe=Math.min(Xe,dt))}),Xe<1/0&&Xe>=0&&(Pe=be.substring(0,Xe+1))}if(we=this.tokenizer.inlineText(Pe)){be=be.substring(we.raw.length),we.raw.slice(-1)!=="_"&&(je=we.raw.slice(-1)),$e=!0,Te=ve[ve.length-1],Te&&Te.type==="text"?(Te.raw+=we.raw,Te.text+=we.text):ve.push(we);continue}if(be){const Xe="Infinite loop on byte: "+be.charCodeAt(0);if(this.options.silent){console.error(Xe);break}else throw new Error(Xe)}}return ve}}class Ce{options;parser;constructor(be){this.options=be||oe.defaults}space(be){return""}code({text:be,lang:ve,escaped:we}){const Te=(ve||"").match(/^\S*/)?.[0],Pe=be.replace(/\n$/,"")+` -`;return Te?'
'+(we?Pe:b(Pe,!0))+`
-`:"
"+(we?Pe:b(Pe,!0))+`
-`}blockquote({tokens:be}){return`
-${this.parser.parse(be)}
-`}html({text:be}){return be}heading({tokens:be,depth:ve}){return`${this.parser.parseInline(be)} -`}hr(be){return`
-`}list(be){const ve=be.ordered,we=be.start;let Te="";for(let He=0;He -`+Te+" -`}listitem(be){let ve="";if(be.task){const we=this.checkbox({checked:!!be.checked});be.loose?be.tokens.length>0&&be.tokens[0].type==="paragraph"?(be.tokens[0].text=we+" "+be.tokens[0].text,be.tokens[0].tokens&&be.tokens[0].tokens.length>0&&be.tokens[0].tokens[0].type==="text"&&(be.tokens[0].tokens[0].text=we+" "+be.tokens[0].tokens[0].text)):be.tokens.unshift({type:"text",raw:we+" ",text:we+" "}):ve+=we+" "}return ve+=this.parser.parse(be.tokens,!!be.loose),`
  • ${ve}
  • -`}checkbox({checked:be}){return"'}paragraph({tokens:be}){return`

    ${this.parser.parseInline(be)}

    -`}table(be){let ve="",we="";for(let Pe=0;Pe${Te}`),` - -`+ve+` -`+Te+`
    -`}tablerow({text:be}){return` -${be} -`}tablecell(be){const ve=this.parser.parseInline(be.tokens),we=be.header?"th":"td";return(be.align?`<${we} align="${be.align}">`:`<${we}>`)+ve+` -`}strong({tokens:be}){return`${this.parser.parseInline(be)}`}em({tokens:be}){return`${this.parser.parseInline(be)}`}codespan({text:be}){return`${be}`}br(be){return"
    "}del({tokens:be}){return`${this.parser.parseInline(be)}`}link({href:be,title:ve,tokens:we}){const Te=this.parser.parseInline(we),Pe=o(be);if(Pe===null)return Te;be=Pe;let Be='
    ",Be}image({href:be,title:ve,text:we}){const Te=o(be);if(Te===null)return we;be=Te;let Pe=`${we}{const He=Pe[Be].flat(1/0);we=we.concat(this.walkTokens(He,ve))}):Pe.tokens&&(we=we.concat(this.walkTokens(Pe.tokens,ve)))}}return we}use(...be){const ve=this.defaults.extensions||{renderers:{},childTokens:{}};return be.forEach(we=>{const Te={...we};if(Te.async=this.defaults.async||Te.async||!1,we.extensions&&(we.extensions.forEach(Pe=>{if(!Pe.name)throw new Error("extension name required");if("renderer"in Pe){const Be=ve.renderers[Pe.name];Be?ve.renderers[Pe.name]=function(...He){let $e=Pe.renderer.apply(this,He);return $e===!1&&($e=Be.apply(this,He)),$e}:ve.renderers[Pe.name]=Pe.renderer}if("tokenizer"in Pe){if(!Pe.level||Pe.level!=="block"&&Pe.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");const Be=ve[Pe.level];Be?Be.unshift(Pe.tokenizer):ve[Pe.level]=[Pe.tokenizer],Pe.start&&(Pe.level==="block"?ve.startBlock?ve.startBlock.push(Pe.start):ve.startBlock=[Pe.start]:Pe.level==="inline"&&(ve.startInline?ve.startInline.push(Pe.start):ve.startInline=[Pe.start]))}"childTokens"in Pe&&Pe.childTokens&&(ve.childTokens[Pe.name]=Pe.childTokens)}),Te.extensions=ve),we.renderer){const Pe=this.defaults.renderer||new Ce(this.defaults);for(const Be in we.renderer){if(!(Be in Pe))throw new Error(`renderer '${Be}' does not exist`);if(["options","parser"].includes(Be))continue;const He=Be,$e=we.renderer[He],je=Pe[He];Pe[He]=(...Xe)=>{let et=$e.apply(Pe,Xe);return et===!1&&(et=je.apply(Pe,Xe)),et||""}}Te.renderer=Pe}if(we.tokenizer){const Pe=this.defaults.tokenizer||new a(this.defaults);for(const Be in we.tokenizer){if(!(Be in Pe))throw new Error(`tokenizer '${Be}' does not exist`);if(["options","rules","lexer"].includes(Be))continue;const He=Be,$e=we.tokenizer[He],je=Pe[He];Pe[He]=(...Xe)=>{let et=$e.apply(Pe,Xe);return et===!1&&(et=je.apply(Pe,Xe)),et}}Te.tokenizer=Pe}if(we.hooks){const Pe=this.defaults.hooks||new Ee;for(const Be in we.hooks){if(!(Be in Pe))throw new Error(`hook '${Be}' does not exist`);if(Be==="options")continue;const He=Be,$e=we.hooks[He],je=Pe[He];Ee.passThroughHooks.has(Be)?Pe[He]=Xe=>{if(this.defaults.async)return Promise.resolve($e.call(Pe,Xe)).then(dt=>je.call(Pe,dt));const et=$e.call(Pe,Xe);return je.call(Pe,et)}:Pe[He]=(...Xe)=>{let et=$e.apply(Pe,Xe);return et===!1&&(et=je.apply(Pe,Xe)),et}}Te.hooks=Pe}if(we.walkTokens){const Pe=this.defaults.walkTokens,Be=we.walkTokens;Te.walkTokens=function(He){let $e=[];return $e.push(Be.call(this,He)),Pe&&($e=$e.concat(Pe.call(this,He))),$e}}this.defaults={...this.defaults,...Te}}),this}setOptions(be){return this.defaults={...this.defaults,...be},this}lexer(be,ve){return me.lex(be,ve??this.defaults)}parser(be,ve){return Le.parse(be,ve??this.defaults)}parseMarkdown(be,ve){return(Te,Pe)=>{const Be={...Pe},He={...this.defaults,...Be},$e=this.onError(!!He.silent,!!He.async);if(this.defaults.async===!0&&Be.async===!1)return $e(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof Te>"u"||Te===null)return $e(new Error("marked(): input parameter is undefined or null"));if(typeof Te!="string")return $e(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(Te)+", string expected"));if(He.hooks&&(He.hooks.options=He),He.async)return Promise.resolve(He.hooks?He.hooks.preprocess(Te):Te).then(je=>be(je,He)).then(je=>He.hooks?He.hooks.processAllTokens(je):je).then(je=>He.walkTokens?Promise.all(this.walkTokens(je,He.walkTokens)).then(()=>je):je).then(je=>ve(je,He)).then(je=>He.hooks?He.hooks.postprocess(je):je).catch($e);try{He.hooks&&(Te=He.hooks.preprocess(Te));let je=be(Te,He);He.hooks&&(je=He.hooks.processAllTokens(je)),He.walkTokens&&this.walkTokens(je,He.walkTokens);let Xe=ve(je,He);return He.hooks&&(Xe=He.hooks.postprocess(Xe)),Xe}catch(je){return $e(je)}}}onError(be,ve){return we=>{if(we.message+=` -Please report this to https://github.com/markedjs/marked.`,be){const Te="

    An error occurred:

    "+b(we.message+"",!0)+"
    ";return ve?Promise.resolve(Te):Te}if(ve)return Promise.reject(we);throw we}}}const Ae=new Me;function Ne(xe,be){return Ae.parse(xe,be)}Ne.options=Ne.setOptions=function(xe){return Ae.setOptions(xe),Ne.defaults=Ae.defaults,d(Ne.defaults),Ne},Ne.getDefaults=e,Ne.defaults=oe.defaults,Ne.use=function(...xe){return Ae.use(...xe),Ne.defaults=Ae.defaults,d(Ne.defaults),Ne},Ne.walkTokens=function(xe,be){return Ae.walkTokens(xe,be)},Ne.parseInline=Ae.parseInline,Ne.Parser=Le,Ne.parser=Le.parse,Ne.Renderer=Ce,Ne.TextRenderer=ye,Ne.Lexer=me,Ne.lexer=me.lex,Ne.Tokenizer=a,Ne.Hooks=Ee,Ne.parse=Ne;const Ke=Ne.options,ze=Ne.setOptions,Ge=Ne.use,it=Ne.walkTokens,Oe=Ne.parseInline,Fe=Ne,fe=Le.parse,_e=me.lex;oe.Hooks=Ee,oe.Lexer=me,oe.Marked=Me,oe.Parser=Le,oe.Renderer=Ce,oe.TextRenderer=ye,oe.Tokenizer=a,oe.getDefaults=e,oe.lexer=_e,oe.marked=Ne,oe.options=Ke,oe.parse=Fe,oe.parseInline=Oe,oe.parser=fe,oe.setOptions=ze,oe.use=Ge,oe.walkTokens=it}),define(ne[128],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Mimes=void 0,e.Mimes=Object.freeze({text:"text/plain",binary:"application/octet-stream",unknown:"application/unknown",markdown:"text/markdown",latex:"text/latex",uriList:"text/uri-list"})}),define(ne[224],se([1,0,128]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DataTransfers=void 0,e.DataTransfers={RESOURCES:"ResourceURLs",DOWNLOAD_URL:"DownloadURL",FILES:"Files",TEXT:d.Mimes.text,INTERNAL_URI_LIST:"application/vnd.code.uri-list"}}),define(ne[448],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getKoreanAltChars=d;function d(o){const t=E(o);if(t&&t.length>0)return new Uint32Array(t)}let k=0;const I=new Uint32Array(10);function E(o){if(k=0,y(o,_,4352),k>0||(y(o,b,4449),k>0)||(y(o,p,4520),k>0)||(y(o,n,12593),k))return I.subarray(0,k);if(o>=44032&&o<=55203){const t=o-44032,i=t%588,s=Math.floor(t/588),g=Math.floor(i/28),c=i%28-1;if(s<_.length?y(s,_,0):4352+s-12593=0&&(c0)return I.subarray(0,k)}}function y(o,t,i){o>=i&&o>8&&(I[k++]=o>>8&255),o>>16&&(I[k++]=o>>16&255))}const _=new Uint8Array([114,82,115,101,69,102,97,113,81,116,84,100,119,87,99,122,120,118,103]),b=new Uint16Array([107,111,105,79,106,112,117,80,104,27496,28520,27752,121,110,27246,28782,27758,98,109,27757,108]),p=new Uint16Array([114,82,29810,115,30579,26483,101,102,29286,24934,29030,29798,30822,30310,26470,97,113,29809,116,84,100,119,99,122,120,118,103]),n=new Uint16Array([114,82,29810,115,30579,26483,101,69,102,29286,24934,29030,29798,30822,30310,26470,97,113,81,29809,116,84,100,119,87,99,122,120,118,103,107,111,105,79,106,112,117,80,104,27496,28520,27752,121,110,27246,28782,27758,98,109,27757,108])}),define(ne[449],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ArrayNavigator=void 0;class d{constructor(I,E=0,y=I.length,m=E-1){this.items=I,this.start=E,this.end=y,this.index=m}current(){return this.index===this.start-1||this.index===this.end?null:this.items[this.index]}next(){return this.index=Math.min(this.index+1,this.end),this.current()}previous(){return this.index=Math.max(this.index-1,this.start-1),this.current()}first(){return this.index=this.start,this.current()}last(){return this.index=this.end-1,this.current()}}e.ArrayNavigator=d}),define(ne[450],se([1,0,449]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HistoryNavigator=void 0;class k{constructor(E=[],y=10){this._initialize(E),this._limit=y,this._onChange()}getHistory(){return this._elements}add(E){this._history.delete(E),this._history.add(E),this._onChange()}next(){return this._navigator.next()}previous(){return this._currentPosition()!==0?this._navigator.previous():null}current(){return this._navigator.current()}first(){return this._navigator.first()}last(){return this._navigator.last()}isLast(){return this._currentPosition()>=this._elements.length-1}isNowhere(){return this._navigator.current()===null}has(E){return this._history.has(E)}_onChange(){this._reduceToLimit();const E=this._elements;this._navigator=new d.ArrayNavigator(E,0,E.length,E.length)}_reduceToLimit(){const E=this._elements;E.length>this._limit&&this._initialize(E.slice(E.length-this._limit))}_currentPosition(){const E=this._navigator.current();return E?this._elements.indexOf(E):-1}_initialize(E){this._history=new Set;for(const y of E)this._history.add(y)}get _elements(){const E=[];return this._history.forEach(y=>E.push(y)),E}}e.HistoryNavigator=k}),define(ne[141],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SlidingWindowAverage=e.MovingAverage=void 0,e.clamp=d;function d(E,y,m){return Math.min(Math.max(E,y),m)}class k{constructor(){this._n=1,this._val=0}update(y){return this._val=this._val+(y-this._val)/this._n,this._n+=1,this._val}get value(){return this._val}}e.MovingAverage=k;class I{constructor(y){this._n=0,this._val=0,this._values=[],this._index=0,this._sum=0,this._values=new Array(y),this._values.fill(0,0,y)}update(y){const m=this._values[this._index];return this._values[this._index]=y,this._index=(this._index+1)%this._values.length,this._sum-=m,this._sum+=y,this._nc.debugName).join(", ")+")",{color:"gray"})}handleDerivedCreated(g){const c=g.handleChange;this.changedObservablesSets.set(g,new Set),g.handleChange=(l,a)=>(this.changedObservablesSets.get(g).add(l),c.apply(g,[l,a]))}handleDerivedRecomputed(g,c){const l=this.changedObservablesSets.get(g);console.log(...this.textToConsoleArgs([_("derived recomputed"),b(g.debugName,{color:"BlueViolet"}),...this.formatInfo(c),this.formatChanges(l),{data:[{fn:g._debugNameData.referenceFn??g._computeFn}]}])),l.clear()}handleFromEventObservableTriggered(g,c){console.log(...this.textToConsoleArgs([_("observable from event triggered"),b(g.debugName,{color:"BlueViolet"}),...this.formatInfo(c),{data:[{fn:g._getValue}]}]))}handleAutorunCreated(g){const c=g.handleChange;this.changedObservablesSets.set(g,new Set),g.handleChange=(l,a)=>(this.changedObservablesSets.get(g).add(l),c.apply(g,[l,a]))}handleAutorunTriggered(g){const c=this.changedObservablesSets.get(g);console.log(...this.textToConsoleArgs([_("autorun"),b(g.debugName,{color:"BlueViolet"}),this.formatChanges(c),{data:[{fn:g._debugNameData.referenceFn??g._runFn}]}])),c.clear(),this.indentation++}handleAutorunFinished(g){this.indentation--}handleBeginTransaction(g){let c=g.getDebugName();c===void 0&&(c=""),console.log(...this.textToConsoleArgs([_("transaction"),b(c,{color:"BlueViolet"}),{data:[{fn:g._fn}]}])),this.indentation++}handleEndTransaction(){this.indentation--}}e.ConsoleObservableLogger=E;function y(s){const g=new Array,c=[];let l="";function a(u){if("length"in u)for(const C of u)C&&a(C);else"text"in u?(l+=`%c${u.text}`,g.push(u.style),u.data&&c.push(...u.data)):"data"in u&&c.push(...u.data)}a(s);const r=[l,...g];return r.push(...c),r}function m(s){return b(s,{color:"black"})}function _(s){return b(i(`${s}: `,10),{color:"black",bold:!0})}function b(s,g={color:"black"}){function c(a){return Object.entries(a).reduce((r,[u,C])=>`${r}${u}:${C};`,"")}const l={color:g.color};return g.strikeThrough&&(l["text-decoration"]="line-through"),g.bold&&(l["font-weight"]="bold"),{text:s,style:c(l)}}function p(s,g){switch(typeof s){case"number":return""+s;case"string":return s.length+2<=g?`"${s}"`:`"${s.substr(0,g-7)}"+...`;case"boolean":return s?"true":"false";case"undefined":return"undefined";case"object":return s===null?"null":Array.isArray(s)?n(s,g):o(s,g);case"symbol":return s.toString();case"function":return`[[Function${s.name?" "+s.name:""}]]`;default:return""+s}}function n(s,g){let c="[ ",l=!0;for(const a of s){if(l||(c+=", "),c.length-5>g){c+="...";break}l=!1,c+=`${p(a,g-c.length)}`}return c+=" ]",c}function o(s,g){let c="{ ",l=!0;for(const[a,r]of Object.entries(s)){if(l||(c+=", "),c.length-5>g){c+="...";break}l=!1,c+=`${a}: ${p(r,g-c.length)}`}return c+=" }",c}function t(s,g){let c="";for(let l=1;l<=g;l++)c+=s;return c}function i(s,g){for(;s.length{i.clear(),t(g,c,i)});return(0,k.toDisposable)(()=>{s.dispose(),i.dispose()})}function p(o){const t=new k.DisposableStore,i=m({owner:void 0,debugName:void 0,debugReferenceFn:o},s=>{t.clear(),o(s,t)});return(0,k.toDisposable)(()=>{i.dispose(),t.dispose()})}class n{get debugName(){return this._debugNameData.getDebugName(this)??"(anonymous)"}constructor(t,i,s,g){this._debugNameData=t,this._runFn=i,this.createChangeSummary=s,this._handleChange=g,this.state=2,this.updateCount=0,this.disposed=!1,this.dependencies=new Set,this.dependenciesToBeRemoved=new Set,this.changeSummary=this.createChangeSummary?.(),(0,E.getLogger)()?.handleAutorunCreated(this),this._runIfNeeded(),(0,k.trackDisposable)(this)}dispose(){this.disposed=!0;for(const t of this.dependencies)t.removeObserver(this);this.dependencies.clear(),(0,k.markAsDisposed)(this)}_runIfNeeded(){if(this.state===3)return;const t=this.dependenciesToBeRemoved;this.dependenciesToBeRemoved=this.dependencies,this.dependencies=t,this.state=3;const i=this.disposed;try{if(!i){(0,E.getLogger)()?.handleAutorunTriggered(this);const s=this.changeSummary;this.changeSummary=this.createChangeSummary?.(),this._runFn(this,s)}}finally{i||(0,E.getLogger)()?.handleAutorunFinished(this);for(const s of this.dependenciesToBeRemoved)s.removeObserver(this);this.dependenciesToBeRemoved.clear()}}toString(){return`Autorun<${this.debugName}>`}beginUpdate(){this.state===3&&(this.state=1),this.updateCount++}endUpdate(){if(this.updateCount===1)do{if(this.state===1){this.state=3;for(const t of this.dependencies)if(t.reportChanges(),this.state===2)break}this._runIfNeeded()}while(this.state!==3);this.updateCount--,(0,d.assertFn)(()=>this.updateCount>=0)}handlePossibleChange(t){this.state===3&&this.dependencies.has(t)&&!this.dependenciesToBeRemoved.has(t)&&(this.state=1)}handleChange(t,i){this.dependencies.has(t)&&!this.dependenciesToBeRemoved.has(t)&&(!this._handleChange||this._handleChange({changedObservable:t,change:i,didChange:g=>g===t},this.changeSummary))&&(this.state=2)}readObservable(t){if(this.disposed)return t.get();t.addObserver(this);const i=t.get();return this.dependencies.add(t),this.dependenciesToBeRemoved.delete(t),i}}e.AutorunObserver=n,function(o){o.Observer=n}(y||(e.autorun=y={}))}),define(ne[92],se([1,0,102,161,162]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DisposableObservableValue=e.ObservableValue=e.TransactionImpl=e.BaseObservable=e.ConvenientObservable=void 0,e._setRecomputeInitiallyAndOnChange=y,e._setKeepObserved=_,e._setDerivedOpts=p,e.transaction=t,e.globalTransaction=s,e.asyncTransaction=g,e.subtransaction=c,e.observableValue=a,e.disposableObservableValue=u;let E;function y(f){E=f}let m;function _(f){m=f}let b;function p(f){b=f}class n{get TChange(){return null}reportChanges(){this.get()}read(h){return h?h.readObservable(this):this.get()}map(h,v){const w=v===void 0?void 0:h,S=v===void 0?h:v;return b({owner:w,debugName:()=>{const L=(0,k.getFunctionName)(S);if(L!==void 0)return L;const T=/^\s*\(?\s*([a-zA-Z_$][a-zA-Z_$0-9]*)\s*\)?\s*=>\s*\1(?:\??)\.([a-zA-Z_$][a-zA-Z_$0-9]*)\s*$/.exec(S.toString());if(T)return`${this.debugName}.${T[2]}`;if(!w)return`${this.debugName} (mapped)`},debugReferenceFn:S},L=>S(this.read(L),L))}flatten(){return b({owner:void 0,debugName:()=>`${this.debugName} (flattened)`},h=>this.read(h).read(h))}recomputeInitiallyAndOnChange(h,v){return h.add(E(this,v)),this}keepObserved(h){return h.add(m(this)),this}}e.ConvenientObservable=n;class o extends n{constructor(){super(...arguments),this.observers=new Set}addObserver(h){const v=this.observers.size;this.observers.add(h),v===0&&this.onFirstObserverAdded()}removeObserver(h){this.observers.delete(h)&&this.observers.size===0&&this.onLastObserverRemoved()}onFirstObserverAdded(){}onLastObserverRemoved(){}}e.BaseObservable=o;function t(f,h){const v=new l(f,h);try{f(v)}finally{v.finish()}}let i;function s(f){if(i)f(i);else{const h=new l(f,void 0);i=h;try{f(h)}finally{h.finish(),i=void 0}}}async function g(f,h){const v=new l(f,h);try{await f(v)}finally{v.finish()}}function c(f,h,v){f?h(f):t(h,v)}class l{constructor(h,v){this._fn=h,this._getDebugName=v,this.updatingObservers=[],(0,I.getLogger)()?.handleBeginTransaction(this)}getDebugName(){return this._getDebugName?this._getDebugName():(0,k.getFunctionName)(this._fn)}updateObserver(h,v){this.updatingObservers.push({observer:h,observable:v}),h.beginUpdate(v)}finish(){const h=this.updatingObservers;for(let v=0;v{},()=>`Setting ${this.debugName}`));try{const L=this._value;this._setValue(h),(0,I.getLogger)()?.handleObservableChanged(this,{oldValue:L,newValue:h,change:w,didChange:!0,hadValue:!0});for(const D of this.observers)v.updateObserver(D,this),D.handleChange(this,w)}finally{S&&S.finish()}}toString(){return`${this.debugName}: ${this._value}`}_setValue(h){this._value=h}}e.ObservableValue=r;function u(f,h){let v;return typeof f=="string"?v=new k.DebugNameData(void 0,f,void 0):v=new k.DebugNameData(f,void 0,void 0),new C(v,h,d.strictEquals)}class C extends r{_setValue(h){this._value!==h&&(this._value&&this._value.dispose(),this._value=h)}dispose(){this._value?.dispose()}}e.DisposableObservableValue=C}),define(ne[65],se([1,0,90,102,2,92,161,162]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DerivedWithSetter=e.Derived=void 0,e.derived=_,e.derivedWithSetter=b,e.derivedOpts=p,e.derivedHandleChanges=n,e.derivedWithStore=o,e.derivedDisposable=t;function _(g,c){return c!==void 0?new i(new y.DebugNameData(g,void 0,c),c,void 0,void 0,void 0,k.strictEquals):new i(new y.DebugNameData(void 0,void 0,g),g,void 0,void 0,void 0,k.strictEquals)}function b(g,c,l){return new s(new y.DebugNameData(g,void 0,c),c,void 0,void 0,void 0,k.strictEquals,l)}function p(g,c){return new i(new y.DebugNameData(g.owner,g.debugName,g.debugReferenceFn),c,void 0,void 0,g.onLastObserverRemoved,g.equalsFn??k.strictEquals)}(0,E._setDerivedOpts)(p);function n(g,c){return new i(new y.DebugNameData(g.owner,g.debugName,void 0),c,g.createEmptyChangeSummary,g.handleChange,void 0,g.equalityComparer??k.strictEquals)}function o(g,c){let l,a;c===void 0?(l=g,a=void 0):(a=g,l=c);const r=new I.DisposableStore;return new i(new y.DebugNameData(a,void 0,l),u=>(r.clear(),l(u,r)),void 0,void 0,()=>r.dispose(),k.strictEquals)}function t(g,c){let l,a;c===void 0?(l=g,a=void 0):(a=g,l=c);let r;return new i(new y.DebugNameData(a,void 0,l),u=>{r?r.clear():r=new I.DisposableStore;const C=l(u);return C&&r.add(C),C},void 0,void 0,()=>{r&&(r.dispose(),r=void 0)},k.strictEquals)}class i extends E.BaseObservable{get debugName(){return this._debugNameData.getDebugName(this)??"(anonymous)"}constructor(c,l,a,r,u=void 0,C){super(),this._debugNameData=c,this._computeFn=l,this.createChangeSummary=a,this._handleChange=r,this._handleLastObserverRemoved=u,this._equalityComparator=C,this.state=0,this.value=void 0,this.updateCount=0,this.dependencies=new Set,this.dependenciesToBeRemoved=new Set,this.changeSummary=void 0,this.changeSummary=this.createChangeSummary?.(),(0,m.getLogger)()?.handleDerivedCreated(this)}onLastObserverRemoved(){this.state=0,this.value=void 0;for(const c of this.dependencies)c.removeObserver(this);this.dependencies.clear(),this._handleLastObserverRemoved?.()}get(){if(this.observers.size===0){const c=this._computeFn(this,this.createChangeSummary?.());return this.onLastObserverRemoved(),c}else{do{if(this.state===1){for(const c of this.dependencies)if(c.reportChanges(),this.state===2)break}this.state===1&&(this.state=3),this._recomputeIfNeeded()}while(this.state!==3);return this.value}}_recomputeIfNeeded(){if(this.state===3)return;const c=this.dependenciesToBeRemoved;this.dependenciesToBeRemoved=this.dependencies,this.dependencies=c;const l=this.state!==0,a=this.value;this.state=3;const r=this.changeSummary;this.changeSummary=this.createChangeSummary?.();try{this.value=this._computeFn(this,r)}finally{for(const C of this.dependenciesToBeRemoved)C.removeObserver(this);this.dependenciesToBeRemoved.clear()}const u=l&&!this._equalityComparator(a,this.value);if((0,m.getLogger)()?.handleDerivedRecomputed(this,{oldValue:a,newValue:this.value,change:void 0,didChange:u,hadValue:l}),u)for(const C of this.observers)C.handleChange(this,void 0)}toString(){return`LazyDerived<${this.debugName}>`}beginUpdate(c){this.updateCount++;const l=this.updateCount===1;if(this.state===3&&(this.state=1,!l))for(const a of this.observers)a.handlePossibleChange(this);if(l)for(const a of this.observers)a.beginUpdate(this)}endUpdate(c){if(this.updateCount--,this.updateCount===0){const l=[...this.observers];for(const a of l)a.endUpdate(this)}(0,d.assertFn)(()=>this.updateCount>=0)}handlePossibleChange(c){if(this.state===3&&this.dependencies.has(c)&&!this.dependenciesToBeRemoved.has(c)){this.state=1;for(const l of this.observers)l.handlePossibleChange(this)}}handleChange(c,l){if(this.dependencies.has(c)&&!this.dependenciesToBeRemoved.has(c)){const a=this._handleChange?this._handleChange({changedObservable:c,change:l,didChange:u=>u===c},this.changeSummary):!0,r=this.state===3;if(a&&(this.state===1||r)&&(this.state=2,r))for(const u of this.observers)u.handlePossibleChange(this)}}readObservable(c){c.addObserver(this);const l=c.get();return this.dependencies.add(c),this.dependenciesToBeRemoved.delete(c),l}addObserver(c){const l=!this.observers.has(c)&&this.updateCount>0;super.addObserver(c),l&&c.beginUpdate(this)}removeObserver(c){const l=this.observers.has(c)&&this.updateCount>0;super.removeObserver(c),l&&c.endUpdate(this)}}e.Derived=i;class s extends i{constructor(c,l,a,r,u=void 0,C,f){super(c,l,a,r,u,C),this.set=f}}e.DerivedWithSetter=s}),define(ne[451],se([1,0,92]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LazyObservableValue=void 0;class k extends d.BaseObservable{get debugName(){return this._debugNameData.getDebugName(this)??"LazyObservableValue"}constructor(E,y,m){super(),this._debugNameData=E,this._equalityComparator=m,this._isUpToDate=!0,this._deltas=[],this._updateCounter=0,this._value=y}get(){return this._update(),this._value}_update(){if(!this._isUpToDate)if(this._isUpToDate=!0,this._deltas.length>0){for(const E of this.observers)for(const y of this._deltas)E.handleChange(this,y);this._deltas.length=0}else for(const E of this.observers)E.handleChange(this,void 0)}_beginUpdate(){if(this._updateCounter++,this._updateCounter===1)for(const E of this.observers)E.beginUpdate(this)}_endUpdate(){if(this._updateCounter--,this._updateCounter===0){this._update();const E=[...this.observers];for(const y of E)y.endUpdate(this)}}addObserver(E){const y=!this.observers.has(E)&&this._updateCounter>0;super.addObserver(E),y&&E.beginUpdate(this)}removeObserver(E){const y=this.observers.has(E)&&this._updateCounter>0;super.removeObserver(E),y&&E.endUpdate(this)}set(E,y,m){if(m===void 0&&this._equalityComparator(this._value,E))return;let _;y||(y=_=new d.TransactionImpl(()=>{},()=>`Setting ${this.debugName}`));try{if(this._isUpToDate=!1,this._setValue(E),m!==void 0&&this._deltas.push(m),y.updateObserver({beginUpdate:()=>this._beginUpdate(),endUpdate:()=>this._endUpdate(),handleChange:(b,p)=>{},handlePossibleChange:b=>{}},this),this._updateCounter>1)for(const b of this.observers)b.handlePossibleChange(this)}finally{_&&_.finish()}}toString(){return`${this.debugName}: ${this._value}`}_setValue(E){this._value=E}}e.LazyObservableValue=k}),define(ne[452],se([1,0,102,92,161,451]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.observableValueOpts=y;function y(m,_){return m.lazy?new E.LazyObservableValue(new I.DebugNameData(m.owner,m.debugName,void 0),_,m.equalsFn??d.strictEquals):new k.ObservableValue(new I.DebugNameData(m.owner,m.debugName,void 0),_,m.equalsFn??d.strictEquals)}}),define(ne[453],se([1,0,299,92,8]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PromiseResult=e.ObservablePromise=void 0,e.waitForState=m;class E{static fromFn(b){return new E(b())}constructor(b){this._value=(0,k.observableValue)(this,void 0),this.promiseResult=this._value,this.promise=b.then(p=>((0,k.transaction)(n=>{this._value.set(new y(p,void 0),n)}),p),p=>{throw(0,k.transaction)(n=>{this._value.set(new y(void 0,p),n)}),p})}}e.ObservablePromise=E;class y{constructor(b,p){this.data=b,this.error=p}}e.PromiseResult=y;function m(_,b,p,n){return b||(b=o=>o!=null),new Promise((o,t)=>{let i=!0,s=!1;const g=_.map(l=>({isFinished:b(l),error:p?p(l):!1,state:l})),c=(0,d.autorun)(l=>{const{isFinished:a,error:r,state:u}=g.read(l);(a||r)&&(i?s=!0:c.dispose(),r?t(r===!0?u:r):o(u))});if(n){const l=n.onCancellationRequested(()=>{c.dispose(),l.dispose(),t(new I.CancellationError)});if(n.isCancellationRequested){c.dispose(),l.dispose(),t(new I.CancellationError);return}}i=!1,s&&c.dispose()})}}),define(ne[188],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Range=void 0;var d;(function(k){function I(_,b){if(_.start>=b.end||b.start>=_.end)return{start:0,end:0};const p=Math.max(_.start,b.start),n=Math.min(_.end,b.end);return n-p<=0?{start:0,end:0}:{start:p,end:n}}k.intersect=I;function E(_){return _.end-_.start<=0}k.isEmpty=E;function y(_,b){return!E(I(_,b))}k.intersects=y;function m(_,b){const p=[],n={start:_.start,end:Math.min(b.start,_.end)},o={start:Math.max(b.end,_.start),end:_.end};return E(n)||p.push(n),E(o)||p.push(o),p}k.relativeComplement=m})(d||(e.Range=d={}))}),define(ne[454],se([1,0,188]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RangeMap=void 0,e.groupIntersect=k,e.shift=I,e.consolidate=E;function k(_,b){const p=[];for(const n of b){if(_.start>=n.range.end)continue;if(_.endb.concat(p),[]))}class m{get paddingTop(){return this._paddingTop}set paddingTop(b){this._size=this._size+b-this._paddingTop,this._paddingTop=b}constructor(b){this.groups=[],this._size=0,this._paddingTop=0,this._paddingTop=b??0,this._size=this._paddingTop}splice(b,p,n=[]){const o=n.length-p,t=k({start:0,end:b},this.groups),i=k({start:b+p,end:Number.POSITIVE_INFINITY},this.groups).map(g=>({range:I(g.range,o),size:g.size})),s=n.map((g,c)=>({range:{start:b+c,end:b+c+1},size:g.size}));this.groups=y(t,s,i),this._size=this._paddingTop+this.groups.reduce((g,c)=>g+c.size*(c.range.end-c.range.start),0)}get count(){const b=this.groups.length;return b?this.groups[b-1].range.end:0}get size(){return this._size}indexAt(b){if(b<0)return-1;if(bI.Disposable.None;function M($){if(b){const{onDidAddListener:Q}=$,Z=i.create();let te=0;$.onDidAddListener=()=>{++te===2&&(console.warn("snapshotted emitter LIKELY used public and SHOULD HAVE BEEN created with DisposableStore. snapshotted here"),Z.print()),Q?.()}}}function A($,Q){return U($,()=>{},0,void 0,!0,void 0,Q)}T.defer=A;function P($){return(Q,Z=null,te)=>{let re=!1,le;return le=$(me=>{if(!re)return le?le.dispose():re=!0,Q.call(Z,me)},null,te),re&&le.dispose(),le}}T.once=P;function N($,Q){return T.once(T.filter($,Q))}T.onceIf=N;function O($,Q,Z){return H((te,re=null,le)=>$(me=>te.call(re,Q(me)),null,le),Z)}T.map=O;function F($,Q,Z){return H((te,re=null,le)=>$(me=>{Q(me),te.call(re,me)},null,le),Z)}T.forEach=F;function x($,Q,Z){return H((te,re=null,le)=>$(me=>Q(me)&&te.call(re,me),null,le),Z)}T.filter=x;function W($){return $}T.signal=W;function V(...$){return(Q,Z=null,te)=>{const re=(0,I.combinedDisposable)(...$.map(le=>le(me=>Q.call(Z,me))));return z(re,te)}}T.any=V;function q($,Q,Z,te){let re=Z;return O($,le=>(re=Q(re,le),re),te)}T.reduce=q;function H($,Q){let Z;const te={onWillAddFirstListener(){Z=$(re.fire,re)},onDidRemoveLastListener(){Z?.dispose()}};Q||M(te);const re=new u(te);return Q?.add(re),re.event}function z($,Q){return Q instanceof Array?Q.push($):Q&&Q.add($),$}function U($,Q,Z=100,te=!1,re=!1,le,me){let Ce,ye,Le,Ee=0,Me;const Ae={leakWarningThreshold:le,onWillAddFirstListener(){Ce=$(Ke=>{Ee++,ye=Q(ye,Ke),te&&!Le&&(Ne.fire(ye),ye=void 0),Me=()=>{const ze=ye;ye=void 0,Le=void 0,(!te||Ee>1)&&Ne.fire(ze),Ee=0},typeof Z=="number"?(clearTimeout(Le),Le=setTimeout(Me,Z)):Le===void 0&&(Le=0,queueMicrotask(Me))})},onWillRemoveListener(){re&&Ee>0&&Me?.()},onDidRemoveLastListener(){Me=void 0,Ce.dispose()}};me||M(Ae);const Ne=new u(Ae);return me?.add(Ne),Ne.event}T.debounce=U;function j($,Q=0,Z){return T.debounce($,(te,re)=>te?(te.push(re),te):[re],Q,void 0,!0,void 0,Z)}T.accumulate=j;function Y($,Q=(te,re)=>te===re,Z){let te=!0,re;return x($,le=>{const me=te||!Q(le,re);return te=!1,re=le,me},Z)}T.latch=Y;function G($,Q,Z){return[T.filter($,Q,Z),T.filter($,te=>!Q(te),Z)]}T.split=G;function K($,Q=!1,Z=[],te){let re=Z.slice(),le=$(ye=>{re?re.push(ye):Ce.fire(ye)});te&&te.add(le);const me=()=>{re?.forEach(ye=>Ce.fire(ye)),re=null},Ce=new u({onWillAddFirstListener(){le||(le=$(ye=>Ce.fire(ye)),te&&te.add(le))},onDidAddFirstListener(){re&&(Q?setTimeout(me):me())},onDidRemoveLastListener(){le&&le.dispose(),le=null}});return te&&te.add(Ce),Ce.event}T.buffer=K;function R($,Q){return(te,re,le)=>{const me=Q(new ie);return $(function(Ce){const ye=me.evaluate(Ce);ye!==J&&te.call(re,ye)},void 0,le)}}T.chain=R;const J=Symbol("HaltChainable");class ie{constructor(){this.steps=[]}map(Q){return this.steps.push(Q),this}forEach(Q){return this.steps.push(Z=>(Q(Z),Z)),this}filter(Q){return this.steps.push(Z=>Q(Z)?Z:J),this}reduce(Q,Z){let te=Z;return this.steps.push(re=>(te=Q(te,re),te)),this}latch(Q=(Z,te)=>Z===te){let Z=!0,te;return this.steps.push(re=>{const le=Z||!Q(re,te);return Z=!1,te=re,le?re:J}),this}evaluate(Q){for(const Z of this.steps)if(Q=Z(Q),Q===J)break;return Q}}function ue($,Q,Z=te=>te){const te=(...Ce)=>me.fire(Z(...Ce)),re=()=>$.on(Q,te),le=()=>$.removeListener(Q,te),me=new u({onWillAddFirstListener:re,onDidRemoveLastListener:le});return me.event}T.fromNodeEventEmitter=ue;function he($,Q,Z=te=>te){const te=(...Ce)=>me.fire(Z(...Ce)),re=()=>$.addEventListener(Q,te),le=()=>$.removeEventListener(Q,te),me=new u({onWillAddFirstListener:re,onDidRemoveLastListener:le});return me.event}T.fromDOMEventEmitter=he;function pe($){return new Promise(Q=>P($)(Q))}T.toPromise=pe;function ae($){const Q=new u;return $.then(Z=>{Q.fire(Z)},()=>{Q.fire(void 0)}).finally(()=>{Q.dispose()}),Q.event}T.fromPromise=ae;function ee($,Q){return $(Z=>Q.fire(Z))}T.forward=ee;function de($,Q,Z){return Q(Z),$(te=>Q(te))}T.runAndSubscribe=de;class ge{constructor(Q,Z){this._observable=Q,this._counter=0,this._hasChanged=!1;const te={onWillAddFirstListener:()=>{Q.addObserver(this),this._observable.reportChanges()},onDidRemoveLastListener:()=>{Q.removeObserver(this)}};Z||M(te),this.emitter=new u(te),Z&&Z.add(this.emitter)}beginUpdate(Q){this._counter++}handlePossibleChange(Q){}handleChange(Q,Z){this._hasChanged=!0}endUpdate(Q){this._counter--,this._counter===0&&(this._observable.reportChanges(),this._hasChanged&&(this._hasChanged=!1,this.emitter.fire(this._observable.get())))}}function X($,Q){return new ge($,Q).emitter.event}T.fromObservable=X;function B($){return(Q,Z,te)=>{let re=0,le=!1;const me={beginUpdate(){re++},endUpdate(){re--,re===0&&($.reportChanges(),le&&(le=!1,Q.call(Z)))},handlePossibleChange(){},handleChange(){le=!0}};$.addObserver(me),$.reportChanges();const Ce={dispose(){$.removeObserver(me)}};return te instanceof I.DisposableStore?te.add(Ce):Array.isArray(te)&&te.push(Ce),Ce}}T.fromObservableLight=B})(p||(e.Event=p={}));class n{static{this.all=new Set}static{this._idPool=0}constructor(M){this.listenerCount=0,this.invocationCount=0,this.elapsedOverall=0,this.durations=[],this.name=`${M}_${n._idPool++}`,n.all.add(this)}start(M){this._stopWatch=new y.StopWatch,this.listenerCount=M}stop(){if(this._stopWatch){const M=this._stopWatch.elapsed();this.durations.push(M),this.elapsedOverall+=M,this.invocationCount+=1,this._stopWatch=void 0}}}e.EventProfiling=n;let o=-1;class t{static{this._idPool=1}constructor(M,A,P=(t._idPool++).toString(16).padStart(3,"0")){this._errorHandler=M,this.threshold=A,this.name=P,this._warnCountdown=0}dispose(){this._stacks?.clear()}check(M,A){const P=this.threshold;if(P<=0||A{const O=this._stacks.get(M.value)||0;this._stacks.set(M.value,O-1)}}getMostFrequentStack(){if(!this._stacks)return;let M,A=0;for(const[P,N]of this._stacks)(!M||A{if(T instanceof c)M(T);else for(let A=0;A{T.length!==0&&(console.warn("[LEAKING LISTENERS] GC'ed these listeners that were NOT yet disposed:"),console.warn(T.join(` -`)),T.length=0)},3e3),r=new FinalizationRegistry(M=>{typeof M=="string"&&T.push(M)})}class u{constructor(M){this._size=0,this._options=M,this._leakageMon=o>0||this._options?.leakWarningThreshold?new t(M?.onListenerError??d.onUnexpectedError,this._options?.leakWarningThreshold??o):void 0,this._perfMon=this._options?._profName?new n(this._options._profName):void 0,this._deliveryQueue=this._options?.deliveryQueue}dispose(){if(!this._disposed){if(this._disposed=!0,this._deliveryQueue?.current===this&&this._deliveryQueue.reset(),this._listeners){if(_){const M=this._listeners;queueMicrotask(()=>{a(M,A=>A.stack?.print())})}this._listeners=void 0,this._size=0}this._options?.onDidRemoveLastListener?.(),this._leakageMon?.dispose()}}get event(){return this._event??=(M,A,P)=>{if(this._leakageMon&&this._size>this._leakageMon.threshold**2){const W=`[${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far (${this._size} vs ${this._leakageMon.threshold})`;console.warn(W);const V=this._leakageMon.getMostFrequentStack()??["UNKNOWN stack",-1],q=new g(`${W}. HINT: Stack shows most frequent listener (${V[1]}-times)`,V[0]);return(this._options?.onListenerError||d.onUnexpectedError)(q),I.Disposable.None}if(this._disposed)return I.Disposable.None;A&&(M=M.bind(A));const N=new c(M);let O,F;this._leakageMon&&this._size>=Math.ceil(this._leakageMon.threshold*.2)&&(N.stack=i.create(),O=this._leakageMon.check(N.stack,this._size+1)),_&&(N.stack=F??i.create()),this._listeners?this._listeners instanceof c?(this._deliveryQueue??=new f,this._listeners=[this._listeners,N]):this._listeners.push(N):(this._options?.onWillAddFirstListener?.(this),this._listeners=N,this._options?.onDidAddFirstListener?.(this)),this._size++;const x=(0,I.toDisposable)(()=>{r?.unregister(x),O?.(),this._removeListener(N)});if(P instanceof I.DisposableStore?P.add(x):Array.isArray(P)&&P.push(x),r){const W=new Error().stack.split(` -`).slice(2,3).join(` -`).trim(),V=/(file:|vscode-file:\/\/vscode-app)?(\/[^:]*:\d+:\d+)/.exec(W);r.register(x,V?.[2]??W,x)}return x},this._event}_removeListener(M){if(this._options?.onWillRemoveListener?.(this),!this._listeners)return;if(this._size===1){this._listeners=void 0,this._options?.onDidRemoveLastListener?.(this),this._size=0;return}const A=this._listeners,P=A.indexOf(M);if(P===-1)throw console.log("disposed?",this._disposed),console.log("size?",this._size),console.log("arr?",JSON.stringify(this._listeners)),new Error("Attempted to dispose unknown listener");this._size--,A[P]=void 0;const N=this._deliveryQueue.current===this;if(this._size*l<=A.length){let O=0;for(let F=0;F0}}e.Emitter=u;const C=()=>new f;e.createEventDeliveryQueue=C;class f{constructor(){this.i=-1,this.end=0}enqueue(M,A,P){this.i=0,this.end=P,this.current=M,this.value=A}reset(){this.i=this.end,this.current=void 0,this.value=void 0}}class h extends u{constructor(M){super(M),this._isPaused=0,this._eventQueue=new E.LinkedList,this._mergeFn=M?.merge}pause(){this._isPaused++}resume(){if(this._isPaused!==0&&--this._isPaused===0)if(this._mergeFn){if(this._eventQueue.size>0){const M=Array.from(this._eventQueue);this._eventQueue.clear(),super.fire(this._mergeFn(M))}}else for(;!this._isPaused&&this._eventQueue.size!==0;)super.fire(this._eventQueue.shift())}fire(M){this._size&&(this._isPaused!==0?this._eventQueue.push(M):super.fire(M))}}e.PauseableEmitter=h;class v extends h{constructor(M){super(M),this._delay=M.delay??100}fire(M){this._handle||(this.pause(),this._handle=setTimeout(()=>{this._handle=void 0,this.resume()},this._delay)),super.fire(M)}}e.DebounceEmitter=v;class w extends u{constructor(M){super(M),this._queuedEvents=[],this._mergeFn=M?.merge}fire(M){this.hasListeners()&&(this._queuedEvents.push(M),this._queuedEvents.length===1&&queueMicrotask(()=>{this._mergeFn?super.fire(this._mergeFn(this._queuedEvents)):this._queuedEvents.forEach(A=>super.fire(A)),this._queuedEvents=[]}))}}e.MicrotaskEmitter=w;class S{constructor(){this.hasListeners=!1,this.events=[],this.emitter=new u({onWillAddFirstListener:()=>this.onFirstListenerAdd(),onDidRemoveLastListener:()=>this.onLastListenerRemove()})}get event(){return this.emitter.event}add(M){const A={event:M,listener:null};this.events.push(A),this.hasListeners&&this.hook(A);const P=()=>{this.hasListeners&&this.unhook(A);const N=this.events.indexOf(A);this.events.splice(N,1)};return(0,I.toDisposable)((0,k.createSingleCallFunction)(P))}onFirstListenerAdd(){this.hasListeners=!0,this.events.forEach(M=>this.hook(M))}onLastListenerRemove(){this.hasListeners=!1,this.events.forEach(M=>this.unhook(M))}hook(M){M.listener=M.event(A=>this.emitter.fire(A))}unhook(M){M.listener?.dispose(),M.listener=null}dispose(){this.emitter.dispose();for(const M of this.events)M.listener?.dispose();this.events=[]}}e.EventMultiplexer=S;class L{constructor(){this.data=[]}wrapEvent(M,A,P){return(N,O,F)=>M(x=>{const W=this.data[this.data.length-1];if(!A){W?W.buffers.push(()=>N.call(O,x)):N.call(O,x);return}const V=W;if(!V){N.call(O,A(P,x));return}V.items??=[],V.items.push(x),V.buffers.length===0&&W.buffers.push(()=>{V.reducedResult??=P?V.items.reduce(A,P):V.items.reduce(A),N.call(O,V.reducedResult)})},void 0,F)}bufferEvents(M){const A={buffers:new Array};this.data.push(A);const P=M();return this.data.pop(),A.buffers.forEach(N=>N()),P}}e.EventBufferer=L;class D{constructor(){this.listening=!1,this.inputEvent=p.None,this.inputEventListener=I.Disposable.None,this.emitter=new u({onDidAddFirstListener:()=>{this.listening=!0,this.inputEventListener=this.inputEvent(this.emitter.fire,this.emitter)},onDidRemoveLastListener:()=>{this.listening=!1,this.inputEventListener.dispose()}}),this.event=this.emitter.event}set input(M){this.inputEvent=M,this.listening&&(this.inputEventListener.dispose(),this.inputEventListener=M(this.emitter.fire,this.emitter))}dispose(){this.inputEventListener.dispose(),this.emitter.dispose()}}e.Relay=D}),define(ne[93],se([1,0,6]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DomEmitter=void 0;class k{get event(){return this.emitter.event}constructor(E,y,m){const _=b=>this.emitter.fire(b);this.emitter=new d.Emitter({onWillAddFirstListener:()=>E.addEventListener(y,_,m),onDidRemoveLastListener:()=>E.removeEventListener(y,_,m)})}dispose(){this.emitter.dispose()}}e.DomEmitter=k}),define(ne[18],se([1,0,6]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CancellationTokenSource=e.CancellationToken=void 0,e.cancelOnDispose=m;const k=Object.freeze(function(_,b){const p=setTimeout(_.bind(b),0);return{dispose(){clearTimeout(p)}}});var I;(function(_){function b(p){return p===_.None||p===_.Cancelled||p instanceof E?!0:!p||typeof p!="object"?!1:typeof p.isCancellationRequested=="boolean"&&typeof p.onCancellationRequested=="function"}_.isCancellationToken=b,_.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:d.Event.None}),_.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:k})})(I||(e.CancellationToken=I={}));class E{constructor(){this._isCancelled=!1,this._emitter=null}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?k:(this._emitter||(this._emitter=new d.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=null)}}class y{constructor(b){this._token=void 0,this._parentListener=void 0,this._parentListener=b&&b.onCancellationRequested(this.cancel,this)}get token(){return this._token||(this._token=new E),this._token}cancel(){this._token?this._token instanceof E&&this._token.cancel():this._token=I.Cancelled}dispose(b=!1){b&&this.cancel(),this._parentListener?.dispose(),this._token?this._token instanceof E&&this._token.dispose():this._token=I.None}}e.CancellationTokenSource=y;function m(_){const b=new y;return _.add({dispose(){b.cancel()}}),b.token}}),define(ne[300],se([1,0,6]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IME=e.IMEImpl=void 0;class k{constructor(){this._onDidChange=new d.Emitter,this.onDidChange=this._onDidChange.event,this._enabled=!0}get enabled(){return this._enabled}enable(){this._enabled=!0,this._onDidChange.fire()}disable(){this._enabled=!1,this._onDidChange.fire()}}e.IMEImpl=k,e.IME=new k}),define(ne[189],se([1,0,6,2,92,161,65,162,102]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ValueWithChangeEventFromObservable=e.KeepAliveObserver=e.FromEventObservable=void 0,e.constObservable=b,e.observableFromEvent=n,e.observableFromEventOpts=o,e.observableSignalFromEvent=i,e.observableSignal=g,e.keepObserved=l,e.recomputeInitiallyAndOnChange=a,e.derivedObservableWithCache=u,e.derivedObservableWithWritableCache=C,e.mapObservableArrayCached=f,e.observableFromValueWithChangeEvent=w,e.derivedConstOnceDefined=S;function b(L){return new p(L)}class p extends I.ConvenientObservable{constructor(D){super(),this.value=D}get debugName(){return this.toString()}get(){return this.value}addObserver(D){}removeObserver(D){}toString(){return`Const: ${this.value}`}}function n(...L){let D,T,M;return L.length===3?[D,T,M]=L:[T,M]=L,new t(new E.DebugNameData(D,void 0,M),T,M,()=>t.globalTransaction,_.strictEquals)}function o(L,D,T){return new t(new E.DebugNameData(L.owner,L.debugName,L.debugReferenceFn??T),D,T,()=>t.globalTransaction,L.equalsFn??_.strictEquals)}class t extends I.BaseObservable{constructor(D,T,M,A,P){super(),this._debugNameData=D,this.event=T,this._getValue=M,this._getTransaction=A,this._equalityComparator=P,this.hasValue=!1,this.handleEvent=N=>{const O=this._getValue(N),F=this.value,x=!this.hasValue||!this._equalityComparator(F,O);let W=!1;x&&(this.value=O,this.hasValue&&(W=!0,(0,I.subtransaction)(this._getTransaction(),V=>{(0,m.getLogger)()?.handleFromEventObservableTriggered(this,{oldValue:F,newValue:O,change:void 0,didChange:x,hadValue:this.hasValue});for(const q of this.observers)V.updateObserver(q,this),q.handleChange(this,void 0)},()=>{const V=this.getDebugName();return"Event fired"+(V?`: ${V}`:"")})),this.hasValue=!0),W||(0,m.getLogger)()?.handleFromEventObservableTriggered(this,{oldValue:F,newValue:O,change:void 0,didChange:x,hadValue:this.hasValue})}}getDebugName(){return this._debugNameData.getDebugName(this)}get debugName(){const D=this.getDebugName();return"From Event"+(D?`: ${D}`:"")}onFirstObserverAdded(){this.subscription=this.event(this.handleEvent)}onLastObserverRemoved(){this.subscription.dispose(),this.subscription=void 0,this.hasValue=!1,this.value=void 0}get(){return this.subscription?(this.hasValue||this.handleEvent(void 0),this.value):this._getValue(void 0)}}e.FromEventObservable=t,function(L){L.Observer=t;function D(T,M){let A=!1;t.globalTransaction===void 0&&(t.globalTransaction=T,A=!0);try{M()}finally{A&&(t.globalTransaction=void 0)}}L.batchEventsGlobally=D}(n||(e.observableFromEvent=n={}));function i(L,D){return new s(L,D)}class s extends I.BaseObservable{constructor(D,T){super(),this.debugName=D,this.event=T,this.handleEvent=()=>{(0,I.transaction)(M=>{for(const A of this.observers)M.updateObserver(A,this),A.handleChange(this,void 0)},()=>this.debugName)}}onFirstObserverAdded(){this.subscription=this.event(this.handleEvent)}onLastObserverRemoved(){this.subscription.dispose(),this.subscription=void 0}get(){}}function g(L){return typeof L=="string"?new c(L):new c(void 0,L)}class c extends I.BaseObservable{get debugName(){return new E.DebugNameData(this._owner,this._debugName,void 0).getDebugName(this)??"Observable Signal"}toString(){return this.debugName}constructor(D,T){super(),this._debugName=D,this._owner=T}trigger(D,T){if(!D){(0,I.transaction)(M=>{this.trigger(M,T)},()=>`Trigger signal ${this.debugName}`);return}for(const M of this.observers)D.updateObserver(M,this),M.handleChange(this,T)}get(){}}function l(L){const D=new r(!1,void 0);return L.addObserver(D),(0,k.toDisposable)(()=>{L.removeObserver(D)})}(0,I._setKeepObserved)(l);function a(L,D){const T=new r(!0,D);return L.addObserver(T),D?D(L.get()):L.reportChanges(),(0,k.toDisposable)(()=>{L.removeObserver(T)})}(0,I._setRecomputeInitiallyAndOnChange)(a);class r{constructor(D,T){this._forceRecompute=D,this._handleValue=T,this._counter=0}beginUpdate(D){this._counter++}endUpdate(D){this._counter--,this._counter===0&&this._forceRecompute&&(this._handleValue?this._handleValue(D.get()):D.reportChanges())}handlePossibleChange(D){}handleChange(D,T){}}e.KeepAliveObserver=r;function u(L,D){let T;return(0,y.derivedOpts)({owner:L,debugReferenceFn:D},A=>(T=D(A,T),T))}function C(L,D){let T;const M=g("derivedObservableWithWritableCache"),A=(0,y.derived)(L,P=>(M.read(P),T=D(P,T),T));return Object.assign(A,{clearCache:P=>{T=void 0,M.trigger(P)},setCache:(P,N)=>{T=P,M.trigger(N)}})}function f(L,D,T,M){let A=new h(T,M);return(0,y.derivedOpts)({debugReferenceFn:T,owner:L,onLastObserverRemoved:()=>{A.dispose(),A=new h(T)}},N=>(A.setItems(D.read(N)),A.getItems()))}class h{constructor(D,T){this._map=D,this._keySelector=T,this._cache=new Map,this._items=[]}dispose(){this._cache.forEach(D=>D.store.dispose()),this._cache.clear()}setItems(D){const T=[],M=new Set(this._cache.keys());for(const A of D){const P=this._keySelector?this._keySelector(A):A;let N=this._cache.get(P);if(N)M.delete(P);else{const O=new k.DisposableStore;N={out:this._map(A,O),store:O},this._cache.set(P,N)}T.push(N.out)}for(const A of M)this._cache.get(A).store.dispose(),this._cache.delete(A);this._items=T}getItems(){return this._items}}class v{constructor(D){this.observable=D}get onDidChange(){return d.Event.fromObservableLight(this.observable)}get value(){return this.observable.get()}}e.ValueWithChangeEventFromObservable=v;function w(L,D){return D instanceof v?D.observable:n(L,D.onDidChange,()=>D.value)}function S(L,D){return u(L,(T,M)=>M??D(T))}}),define(ne[21],se([1,0,92,65,299,189,453,452,162]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.observableValueOpts=e.waitForState=e.PromiseResult=e.ObservablePromise=e.observableSignalFromEvent=e.observableSignal=e.observableFromEvent=e.recomputeInitiallyAndOnChange=e.keepObserved=e.derivedObservableWithWritableCache=e.derivedObservableWithCache=e.constObservable=e.autorunWithStoreHandleChanges=e.autorunOpts=e.autorunWithStore=e.autorunHandleChanges=e.autorun=e.derivedWithStore=e.derivedHandleChanges=e.derivedOpts=e.derived=e.subtransaction=e.transaction=e.disposableObservableValue=e.observableValue=void 0,Object.defineProperty(e,"observableValue",{enumerable:!0,get:function(){return d.observableValue}}),Object.defineProperty(e,"disposableObservableValue",{enumerable:!0,get:function(){return d.disposableObservableValue}}),Object.defineProperty(e,"transaction",{enumerable:!0,get:function(){return d.transaction}}),Object.defineProperty(e,"subtransaction",{enumerable:!0,get:function(){return d.subtransaction}}),Object.defineProperty(e,"derived",{enumerable:!0,get:function(){return k.derived}}),Object.defineProperty(e,"derivedOpts",{enumerable:!0,get:function(){return k.derivedOpts}}),Object.defineProperty(e,"derivedHandleChanges",{enumerable:!0,get:function(){return k.derivedHandleChanges}}),Object.defineProperty(e,"derivedWithStore",{enumerable:!0,get:function(){return k.derivedWithStore}}),Object.defineProperty(e,"autorun",{enumerable:!0,get:function(){return I.autorun}}),Object.defineProperty(e,"autorunHandleChanges",{enumerable:!0,get:function(){return I.autorunHandleChanges}}),Object.defineProperty(e,"autorunWithStore",{enumerable:!0,get:function(){return I.autorunWithStore}}),Object.defineProperty(e,"autorunOpts",{enumerable:!0,get:function(){return I.autorunOpts}}),Object.defineProperty(e,"autorunWithStoreHandleChanges",{enumerable:!0,get:function(){return I.autorunWithStoreHandleChanges}}),Object.defineProperty(e,"constObservable",{enumerable:!0,get:function(){return E.constObservable}}),Object.defineProperty(e,"derivedObservableWithCache",{enumerable:!0,get:function(){return E.derivedObservableWithCache}}),Object.defineProperty(e,"derivedObservableWithWritableCache",{enumerable:!0,get:function(){return E.derivedObservableWithWritableCache}}),Object.defineProperty(e,"keepObserved",{enumerable:!0,get:function(){return E.keepObserved}}),Object.defineProperty(e,"recomputeInitiallyAndOnChange",{enumerable:!0,get:function(){return E.recomputeInitiallyAndOnChange}}),Object.defineProperty(e,"observableFromEvent",{enumerable:!0,get:function(){return E.observableFromEvent}}),Object.defineProperty(e,"observableSignal",{enumerable:!0,get:function(){return E.observableSignal}}),Object.defineProperty(e,"observableSignalFromEvent",{enumerable:!0,get:function(){return E.observableSignalFromEvent}}),Object.defineProperty(e,"ObservablePromise",{enumerable:!0,get:function(){return y.ObservablePromise}}),Object.defineProperty(e,"PromiseResult",{enumerable:!0,get:function(){return y.PromiseResult}}),Object.defineProperty(e,"waitForState",{enumerable:!0,get:function(){return y.waitForState}}),Object.defineProperty(e,"observableValueOpts",{enumerable:!0,get:function(){return m.observableValueOpts}}),!1&&(0,_.setLogger)(new _.ConsoleObservableLogger)}),define(ne[163],se([1,0,6,2]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SmoothScrollingOperation=e.SmoothScrollingUpdate=e.Scrollable=e.ScrollState=void 0;class I{constructor(t,i,s,g,c,l,a){this._forceIntegerValues=t,this._scrollStateBrand=void 0,this._forceIntegerValues&&(i=i|0,s=s|0,g=g|0,c=c|0,l=l|0,a=a|0),this.rawScrollLeft=g,this.rawScrollTop=a,i<0&&(i=0),g+i>s&&(g=s-i),g<0&&(g=0),c<0&&(c=0),a+c>l&&(a=l-c),a<0&&(a=0),this.width=i,this.scrollWidth=s,this.scrollLeft=g,this.height=c,this.scrollHeight=l,this.scrollTop=a}equals(t){return this.rawScrollLeft===t.rawScrollLeft&&this.rawScrollTop===t.rawScrollTop&&this.width===t.width&&this.scrollWidth===t.scrollWidth&&this.scrollLeft===t.scrollLeft&&this.height===t.height&&this.scrollHeight===t.scrollHeight&&this.scrollTop===t.scrollTop}withScrollDimensions(t,i){return new I(this._forceIntegerValues,typeof t.width<"u"?t.width:this.width,typeof t.scrollWidth<"u"?t.scrollWidth:this.scrollWidth,i?this.rawScrollLeft:this.scrollLeft,typeof t.height<"u"?t.height:this.height,typeof t.scrollHeight<"u"?t.scrollHeight:this.scrollHeight,i?this.rawScrollTop:this.scrollTop)}withScrollPosition(t){return new I(this._forceIntegerValues,this.width,this.scrollWidth,typeof t.scrollLeft<"u"?t.scrollLeft:this.rawScrollLeft,this.height,this.scrollHeight,typeof t.scrollTop<"u"?t.scrollTop:this.rawScrollTop)}createScrollEvent(t,i){const s=this.width!==t.width,g=this.scrollWidth!==t.scrollWidth,c=this.scrollLeft!==t.scrollLeft,l=this.height!==t.height,a=this.scrollHeight!==t.scrollHeight,r=this.scrollTop!==t.scrollTop;return{inSmoothScrolling:i,oldWidth:t.width,oldScrollWidth:t.scrollWidth,oldScrollLeft:t.scrollLeft,width:this.width,scrollWidth:this.scrollWidth,scrollLeft:this.scrollLeft,oldHeight:t.height,oldScrollHeight:t.scrollHeight,oldScrollTop:t.scrollTop,height:this.height,scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,widthChanged:s,scrollWidthChanged:g,scrollLeftChanged:c,heightChanged:l,scrollHeightChanged:a,scrollTopChanged:r}}}e.ScrollState=I;class E extends k.Disposable{constructor(t){super(),this._scrollableBrand=void 0,this._onScroll=this._register(new d.Emitter),this.onScroll=this._onScroll.event,this._smoothScrollDuration=t.smoothScrollDuration,this._scheduleAtNextAnimationFrame=t.scheduleAtNextAnimationFrame,this._state=new I(t.forceIntegerValues,0,0,0,0,0,0),this._smoothScrolling=null}dispose(){this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),super.dispose()}setSmoothScrollDuration(t){this._smoothScrollDuration=t}validateScrollPosition(t){return this._state.withScrollPosition(t)}getScrollDimensions(){return this._state}setScrollDimensions(t,i){const s=this._state.withScrollDimensions(t,i);this._setState(s,!!this._smoothScrolling),this._smoothScrolling?.acceptScrollDimensions(this._state)}getFutureScrollPosition(){return this._smoothScrolling?this._smoothScrolling.to:this._state}getCurrentScrollPosition(){return this._state}setScrollPositionNow(t){const i=this._state.withScrollPosition(t);this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),this._setState(i,!1)}setScrollPositionSmooth(t,i){if(this._smoothScrollDuration===0)return this.setScrollPositionNow(t);if(this._smoothScrolling){t={scrollLeft:typeof t.scrollLeft>"u"?this._smoothScrolling.to.scrollLeft:t.scrollLeft,scrollTop:typeof t.scrollTop>"u"?this._smoothScrolling.to.scrollTop:t.scrollTop};const s=this._state.withScrollPosition(t);if(this._smoothScrolling.to.scrollLeft===s.scrollLeft&&this._smoothScrolling.to.scrollTop===s.scrollTop)return;let g;i?g=new b(this._smoothScrolling.from,s,this._smoothScrolling.startTime,this._smoothScrolling.duration):g=this._smoothScrolling.combine(this._state,s,this._smoothScrollDuration),this._smoothScrolling.dispose(),this._smoothScrolling=g}else{const s=this._state.withScrollPosition(t);this._smoothScrolling=b.start(this._state,s,this._smoothScrollDuration)}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}hasPendingScrollAnimation(){return!!this._smoothScrolling}_performSmoothScrolling(){if(!this._smoothScrolling)return;const t=this._smoothScrolling.tick(),i=this._state.withScrollPosition(t);if(this._setState(i,!0),!!this._smoothScrolling){if(t.isDone){this._smoothScrolling.dispose(),this._smoothScrolling=null;return}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}}_setState(t,i){const s=this._state;s.equals(t)||(this._state=t,this._onScroll.fire(this._state.createScrollEvent(s,i)))}}e.Scrollable=E;class y{constructor(t,i,s){this.scrollLeft=t,this.scrollTop=i,this.isDone=s}}e.SmoothScrollingUpdate=y;function m(o,t){const i=t-o;return function(s){return o+i*n(s)}}function _(o,t,i){return function(s){return s2.5*s){let c,l;return t=te.length?re:te[me]})}function m(Z){return Z.replace(/[<>"'&]/g,te=>{switch(te){case"<":return"<";case">":return">";case'"':return""";case"'":return"'";case"&":return"&"}return te})}function _(Z){return Z.replace(/[<>&]/g,function(te){switch(te){case"<":return"<";case">":return">";case"&":return"&";default:return te}})}function b(Z){return Z.replace(/[\\\{\}\*\+\?\|\^\$\.\[\]\(\)]/g,"\\$&")}function p(Z,te=" "){const re=n(Z,te);return o(re,te)}function n(Z,te){if(!Z||!te)return Z;const re=te.length;if(re===0||Z.length===0)return Z;let le=0;for(;Z.indexOf(te,le)===le;)le=le+re;return Z.substring(le)}function o(Z,te){if(!Z||!te)return Z;const re=te.length,le=Z.length;if(re===0||le===0)return Z;let me=le,Ce=-1;for(;Ce=Z.lastIndexOf(te,me-1),!(Ce===-1||Ce+re!==me);){if(Ce===0)return"";me=Ce}return Z.substring(0,me)}function t(Z){return Z.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g,"\\$&").replace(/[\*]/g,".*")}function i(Z){return Z.replace(/\*/g,"")}function s(Z,te,re={}){if(!Z)throw new Error("Cannot create regex from empty string");te||(Z=b(Z)),re.wholeWord&&(/\B/.test(Z.charAt(0))||(Z="\\b"+Z),/\B/.test(Z.charAt(Z.length-1))||(Z=Z+"\\b"));let le="";return re.global&&(le+="g"),re.matchCase||(le+="i"),re.multiline&&(le+="m"),re.unicode&&(le+="u"),new RegExp(Z,le)}function g(Z){return Z.source==="^"||Z.source==="^$"||Z.source==="$"||Z.source==="^\\s*$"?!1:!!(Z.exec("")&&Z.lastIndex===0)}function c(Z){return Z.split(/\r\n|\r|\n/)}function l(Z){const te=[],re=Z.split(/(\r\n|\r|\n)/);for(let le=0;le=0;re--){const le=Z.charCodeAt(re);if(le!==32&&le!==9)return re}return-1}function C(Z,te){return Zte?1:0}function f(Z,te,re=0,le=Z.length,me=0,Ce=te.length){for(;reMe)return 1}const ye=le-re,Le=Ce-me;return yeLe?1:0}function h(Z,te){return v(Z,te,0,Z.length,0,te.length)}function v(Z,te,re=0,le=Z.length,me=0,Ce=te.length){for(;re=128||Me>=128)return f(Z.toLowerCase(),te.toLowerCase(),re,le,me,Ce);S(Ee)&&(Ee-=32),S(Me)&&(Me-=32);const Ae=Ee-Me;if(Ae!==0)return Ae}const ye=le-re,Le=Ce-me;return yeLe?1:0}function w(Z){return Z>=48&&Z<=57}function S(Z){return Z>=97&&Z<=122}function L(Z){return Z>=65&&Z<=90}function D(Z,te){return Z.length===te.length&&v(Z,te)===0}function T(Z,te){const re=te.length;return te.length>Z.length?!1:v(Z,te,0,re)===0}function M(Z,te){const re=Math.min(Z.length,te.length);let le;for(le=0;le1){const le=Z.charCodeAt(te-2);if(P(le))return O(le,re)}return re}class W{get offset(){return this._offset}constructor(te,re=0){this._str=te,this._len=te.length,this._offset=re}setOffset(te){this._offset=te}prevCodePoint(){const te=x(this._str,this._offset);return this._offset-=te>=65536?2:1,te}nextCodePoint(){const te=F(this._str,this._len,this._offset);return this._offset+=te>=65536?2:1,te}eol(){return this._offset>=this._len}}e.CodePointIterator=W;class V{get offset(){return this._iterator.offset}constructor(te,re=0){this._iterator=new W(te,re)}nextGraphemeLength(){const te=ee.getInstance(),re=this._iterator,le=re.offset;let me=te.getGraphemeBreakType(re.nextCodePoint());for(;!re.eol();){const Ce=re.offset,ye=te.getGraphemeBreakType(re.nextCodePoint());if(ae(me,ye)){re.setOffset(Ce);break}me=ye}return re.offset-le}prevGraphemeLength(){const te=ee.getInstance(),re=this._iterator,le=re.offset;let me=te.getGraphemeBreakType(re.prevCodePoint());for(;re.offset>0;){const Ce=re.offset,ye=te.getGraphemeBreakType(re.prevCodePoint());if(ae(ye,me)){re.setOffset(Ce);break}me=ye}return le-re.offset}eol(){return this._iterator.eol()}}e.GraphemeIterator=V;function q(Z,te){return new V(Z,te).nextGraphemeLength()}function H(Z,te){return new V(Z,te).prevGraphemeLength()}function z(Z,te){te>0&&N(Z.charCodeAt(te))&&te--;const re=te+q(Z,te);return[re-H(Z,re),re]}let U;function j(){return/(?:[\u05BE\u05C0\u05C3\u05C6\u05D0-\u05F4\u0608\u060B\u060D\u061B-\u064A\u066D-\u066F\u0671-\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u0710\u0712-\u072F\u074D-\u07A5\u07B1-\u07EA\u07F4\u07F5\u07FA\u07FE-\u0815\u081A\u0824\u0828\u0830-\u0858\u085E-\u088E\u08A0-\u08C9\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFD3D\uFD50-\uFDC7\uFDF0-\uFDFC\uFE70-\uFEFC]|\uD802[\uDC00-\uDD1B\uDD20-\uDE00\uDE10-\uDE35\uDE40-\uDEE4\uDEEB-\uDF35\uDF40-\uDFFF]|\uD803[\uDC00-\uDD23\uDE80-\uDEA9\uDEAD-\uDF45\uDF51-\uDF81\uDF86-\uDFF6]|\uD83A[\uDC00-\uDCCF\uDD00-\uDD43\uDD4B-\uDFFF]|\uD83B[\uDC00-\uDEBB])/}function Y(Z){return U||(U=j()),U.test(Z)}const G=/^[\t\n\r\x20-\x7E]*$/;function K(Z){return G.test(Z)}e.UNUSUAL_LINE_TERMINATORS=/[\u2028\u2029]/;function R(Z){return e.UNUSUAL_LINE_TERMINATORS.test(Z)}function J(Z){return Z>=11904&&Z<=55215||Z>=63744&&Z<=64255||Z>=65281&&Z<=65374}function ie(Z){return Z>=127462&&Z<=127487||Z===8986||Z===8987||Z===9200||Z===9203||Z>=9728&&Z<=10175||Z===11088||Z===11093||Z>=127744&&Z<=128591||Z>=128640&&Z<=128764||Z>=128992&&Z<=129008||Z>=129280&&Z<=129535||Z>=129648&&Z<=129782}e.UTF8_BOM_CHARACTER="\uFEFF";function ue(Z){return!!(Z&&Z.length>0&&Z.charCodeAt(0)===65279)}function he(Z,te=!1){return Z?(te&&(Z=Z.replace(/\\./g,"")),Z.toLowerCase()!==Z):!1}function pe(Z){return Z=Z%(2*26),Z<26?String.fromCharCode(97+Z):String.fromCharCode(65+Z-26)}function ae(Z,te){return Z===0?te!==5&&te!==7:Z===2&&te===3?!1:Z===4||Z===2||Z===3||te===4||te===2||te===3?!0:!(Z===8&&(te===8||te===9||te===11||te===12)||(Z===11||Z===9)&&(te===9||te===10)||(Z===12||Z===10)&&te===10||te===5||te===13||te===7||Z===1||Z===13&&te===14||Z===6&&te===6)}class ee{static{this._INSTANCE=null}static getInstance(){return ee._INSTANCE||(ee._INSTANCE=new ee),ee._INSTANCE}constructor(){this._data=de()}getGraphemeBreakType(te){if(te<32)return te===10?3:te===13?2:4;if(te<127)return 0;const re=this._data,le=re.length/3;let me=1;for(;me<=le;)if(tere[3*me+1])me=2*me+1;else return re[3*me+2];return 0}}function de(){return JSON.parse("[0,0,0,51229,51255,12,44061,44087,12,127462,127487,6,7083,7085,5,47645,47671,12,54813,54839,12,128678,128678,14,3270,3270,5,9919,9923,14,45853,45879,12,49437,49463,12,53021,53047,12,71216,71218,7,128398,128399,14,129360,129374,14,2519,2519,5,4448,4519,9,9742,9742,14,12336,12336,14,44957,44983,12,46749,46775,12,48541,48567,12,50333,50359,12,52125,52151,12,53917,53943,12,69888,69890,5,73018,73018,5,127990,127990,14,128558,128559,14,128759,128760,14,129653,129655,14,2027,2035,5,2891,2892,7,3761,3761,5,6683,6683,5,8293,8293,4,9825,9826,14,9999,9999,14,43452,43453,5,44509,44535,12,45405,45431,12,46301,46327,12,47197,47223,12,48093,48119,12,48989,49015,12,49885,49911,12,50781,50807,12,51677,51703,12,52573,52599,12,53469,53495,12,54365,54391,12,65279,65279,4,70471,70472,7,72145,72147,7,119173,119179,5,127799,127818,14,128240,128244,14,128512,128512,14,128652,128652,14,128721,128722,14,129292,129292,14,129445,129450,14,129734,129743,14,1476,1477,5,2366,2368,7,2750,2752,7,3076,3076,5,3415,3415,5,4141,4144,5,6109,6109,5,6964,6964,5,7394,7400,5,9197,9198,14,9770,9770,14,9877,9877,14,9968,9969,14,10084,10084,14,43052,43052,5,43713,43713,5,44285,44311,12,44733,44759,12,45181,45207,12,45629,45655,12,46077,46103,12,46525,46551,12,46973,46999,12,47421,47447,12,47869,47895,12,48317,48343,12,48765,48791,12,49213,49239,12,49661,49687,12,50109,50135,12,50557,50583,12,51005,51031,12,51453,51479,12,51901,51927,12,52349,52375,12,52797,52823,12,53245,53271,12,53693,53719,12,54141,54167,12,54589,54615,12,55037,55063,12,69506,69509,5,70191,70193,5,70841,70841,7,71463,71467,5,72330,72342,5,94031,94031,5,123628,123631,5,127763,127765,14,127941,127941,14,128043,128062,14,128302,128317,14,128465,128467,14,128539,128539,14,128640,128640,14,128662,128662,14,128703,128703,14,128745,128745,14,129004,129007,14,129329,129330,14,129402,129402,14,129483,129483,14,129686,129704,14,130048,131069,14,173,173,4,1757,1757,1,2200,2207,5,2434,2435,7,2631,2632,5,2817,2817,5,3008,3008,5,3201,3201,5,3387,3388,5,3542,3542,5,3902,3903,7,4190,4192,5,6002,6003,5,6439,6440,5,6765,6770,7,7019,7027,5,7154,7155,7,8205,8205,13,8505,8505,14,9654,9654,14,9757,9757,14,9792,9792,14,9852,9853,14,9890,9894,14,9937,9937,14,9981,9981,14,10035,10036,14,11035,11036,14,42654,42655,5,43346,43347,7,43587,43587,5,44006,44007,7,44173,44199,12,44397,44423,12,44621,44647,12,44845,44871,12,45069,45095,12,45293,45319,12,45517,45543,12,45741,45767,12,45965,45991,12,46189,46215,12,46413,46439,12,46637,46663,12,46861,46887,12,47085,47111,12,47309,47335,12,47533,47559,12,47757,47783,12,47981,48007,12,48205,48231,12,48429,48455,12,48653,48679,12,48877,48903,12,49101,49127,12,49325,49351,12,49549,49575,12,49773,49799,12,49997,50023,12,50221,50247,12,50445,50471,12,50669,50695,12,50893,50919,12,51117,51143,12,51341,51367,12,51565,51591,12,51789,51815,12,52013,52039,12,52237,52263,12,52461,52487,12,52685,52711,12,52909,52935,12,53133,53159,12,53357,53383,12,53581,53607,12,53805,53831,12,54029,54055,12,54253,54279,12,54477,54503,12,54701,54727,12,54925,54951,12,55149,55175,12,68101,68102,5,69762,69762,7,70067,70069,7,70371,70378,5,70720,70721,7,71087,71087,5,71341,71341,5,71995,71996,5,72249,72249,7,72850,72871,5,73109,73109,5,118576,118598,5,121505,121519,5,127245,127247,14,127568,127569,14,127777,127777,14,127872,127891,14,127956,127967,14,128015,128016,14,128110,128172,14,128259,128259,14,128367,128368,14,128424,128424,14,128488,128488,14,128530,128532,14,128550,128551,14,128566,128566,14,128647,128647,14,128656,128656,14,128667,128673,14,128691,128693,14,128715,128715,14,128728,128732,14,128752,128752,14,128765,128767,14,129096,129103,14,129311,129311,14,129344,129349,14,129394,129394,14,129413,129425,14,129466,129471,14,129511,129535,14,129664,129666,14,129719,129722,14,129760,129767,14,917536,917631,5,13,13,2,1160,1161,5,1564,1564,4,1807,1807,1,2085,2087,5,2307,2307,7,2382,2383,7,2497,2500,5,2563,2563,7,2677,2677,5,2763,2764,7,2879,2879,5,2914,2915,5,3021,3021,5,3142,3144,5,3263,3263,5,3285,3286,5,3398,3400,7,3530,3530,5,3633,3633,5,3864,3865,5,3974,3975,5,4155,4156,7,4229,4230,5,5909,5909,7,6078,6085,7,6277,6278,5,6451,6456,7,6744,6750,5,6846,6846,5,6972,6972,5,7074,7077,5,7146,7148,7,7222,7223,5,7416,7417,5,8234,8238,4,8417,8417,5,9000,9000,14,9203,9203,14,9730,9731,14,9748,9749,14,9762,9763,14,9776,9783,14,9800,9811,14,9831,9831,14,9872,9873,14,9882,9882,14,9900,9903,14,9929,9933,14,9941,9960,14,9974,9974,14,9989,9989,14,10006,10006,14,10062,10062,14,10160,10160,14,11647,11647,5,12953,12953,14,43019,43019,5,43232,43249,5,43443,43443,5,43567,43568,7,43696,43696,5,43765,43765,7,44013,44013,5,44117,44143,12,44229,44255,12,44341,44367,12,44453,44479,12,44565,44591,12,44677,44703,12,44789,44815,12,44901,44927,12,45013,45039,12,45125,45151,12,45237,45263,12,45349,45375,12,45461,45487,12,45573,45599,12,45685,45711,12,45797,45823,12,45909,45935,12,46021,46047,12,46133,46159,12,46245,46271,12,46357,46383,12,46469,46495,12,46581,46607,12,46693,46719,12,46805,46831,12,46917,46943,12,47029,47055,12,47141,47167,12,47253,47279,12,47365,47391,12,47477,47503,12,47589,47615,12,47701,47727,12,47813,47839,12,47925,47951,12,48037,48063,12,48149,48175,12,48261,48287,12,48373,48399,12,48485,48511,12,48597,48623,12,48709,48735,12,48821,48847,12,48933,48959,12,49045,49071,12,49157,49183,12,49269,49295,12,49381,49407,12,49493,49519,12,49605,49631,12,49717,49743,12,49829,49855,12,49941,49967,12,50053,50079,12,50165,50191,12,50277,50303,12,50389,50415,12,50501,50527,12,50613,50639,12,50725,50751,12,50837,50863,12,50949,50975,12,51061,51087,12,51173,51199,12,51285,51311,12,51397,51423,12,51509,51535,12,51621,51647,12,51733,51759,12,51845,51871,12,51957,51983,12,52069,52095,12,52181,52207,12,52293,52319,12,52405,52431,12,52517,52543,12,52629,52655,12,52741,52767,12,52853,52879,12,52965,52991,12,53077,53103,12,53189,53215,12,53301,53327,12,53413,53439,12,53525,53551,12,53637,53663,12,53749,53775,12,53861,53887,12,53973,53999,12,54085,54111,12,54197,54223,12,54309,54335,12,54421,54447,12,54533,54559,12,54645,54671,12,54757,54783,12,54869,54895,12,54981,55007,12,55093,55119,12,55243,55291,10,66045,66045,5,68325,68326,5,69688,69702,5,69817,69818,5,69957,69958,7,70089,70092,5,70198,70199,5,70462,70462,5,70502,70508,5,70750,70750,5,70846,70846,7,71100,71101,5,71230,71230,7,71351,71351,5,71737,71738,5,72000,72000,7,72160,72160,5,72273,72278,5,72752,72758,5,72882,72883,5,73031,73031,5,73461,73462,7,94192,94193,7,119149,119149,7,121403,121452,5,122915,122916,5,126980,126980,14,127358,127359,14,127535,127535,14,127759,127759,14,127771,127771,14,127792,127793,14,127825,127867,14,127897,127899,14,127945,127945,14,127985,127986,14,128000,128007,14,128021,128021,14,128066,128100,14,128184,128235,14,128249,128252,14,128266,128276,14,128335,128335,14,128379,128390,14,128407,128419,14,128444,128444,14,128481,128481,14,128499,128499,14,128526,128526,14,128536,128536,14,128543,128543,14,128556,128556,14,128564,128564,14,128577,128580,14,128643,128645,14,128649,128649,14,128654,128654,14,128660,128660,14,128664,128664,14,128675,128675,14,128686,128689,14,128695,128696,14,128705,128709,14,128717,128719,14,128725,128725,14,128736,128741,14,128747,128748,14,128755,128755,14,128762,128762,14,128981,128991,14,129009,129023,14,129160,129167,14,129296,129304,14,129320,129327,14,129340,129342,14,129356,129356,14,129388,129392,14,129399,129400,14,129404,129407,14,129432,129442,14,129454,129455,14,129473,129474,14,129485,129487,14,129648,129651,14,129659,129660,14,129671,129679,14,129709,129711,14,129728,129730,14,129751,129753,14,129776,129782,14,917505,917505,4,917760,917999,5,10,10,3,127,159,4,768,879,5,1471,1471,5,1536,1541,1,1648,1648,5,1767,1768,5,1840,1866,5,2070,2073,5,2137,2139,5,2274,2274,1,2363,2363,7,2377,2380,7,2402,2403,5,2494,2494,5,2507,2508,7,2558,2558,5,2622,2624,7,2641,2641,5,2691,2691,7,2759,2760,5,2786,2787,5,2876,2876,5,2881,2884,5,2901,2902,5,3006,3006,5,3014,3016,7,3072,3072,5,3134,3136,5,3157,3158,5,3260,3260,5,3266,3266,5,3274,3275,7,3328,3329,5,3391,3392,7,3405,3405,5,3457,3457,5,3536,3537,7,3551,3551,5,3636,3642,5,3764,3772,5,3895,3895,5,3967,3967,7,3993,4028,5,4146,4151,5,4182,4183,7,4226,4226,5,4253,4253,5,4957,4959,5,5940,5940,7,6070,6070,7,6087,6088,7,6158,6158,4,6432,6434,5,6448,6449,7,6679,6680,5,6742,6742,5,6754,6754,5,6783,6783,5,6912,6915,5,6966,6970,5,6978,6978,5,7042,7042,7,7080,7081,5,7143,7143,7,7150,7150,7,7212,7219,5,7380,7392,5,7412,7412,5,8203,8203,4,8232,8232,4,8265,8265,14,8400,8412,5,8421,8432,5,8617,8618,14,9167,9167,14,9200,9200,14,9410,9410,14,9723,9726,14,9733,9733,14,9745,9745,14,9752,9752,14,9760,9760,14,9766,9766,14,9774,9774,14,9786,9786,14,9794,9794,14,9823,9823,14,9828,9828,14,9833,9850,14,9855,9855,14,9875,9875,14,9880,9880,14,9885,9887,14,9896,9897,14,9906,9916,14,9926,9927,14,9935,9935,14,9939,9939,14,9962,9962,14,9972,9972,14,9978,9978,14,9986,9986,14,9997,9997,14,10002,10002,14,10017,10017,14,10055,10055,14,10071,10071,14,10133,10135,14,10548,10549,14,11093,11093,14,12330,12333,5,12441,12442,5,42608,42610,5,43010,43010,5,43045,43046,5,43188,43203,7,43302,43309,5,43392,43394,5,43446,43449,5,43493,43493,5,43571,43572,7,43597,43597,7,43703,43704,5,43756,43757,5,44003,44004,7,44009,44010,7,44033,44059,12,44089,44115,12,44145,44171,12,44201,44227,12,44257,44283,12,44313,44339,12,44369,44395,12,44425,44451,12,44481,44507,12,44537,44563,12,44593,44619,12,44649,44675,12,44705,44731,12,44761,44787,12,44817,44843,12,44873,44899,12,44929,44955,12,44985,45011,12,45041,45067,12,45097,45123,12,45153,45179,12,45209,45235,12,45265,45291,12,45321,45347,12,45377,45403,12,45433,45459,12,45489,45515,12,45545,45571,12,45601,45627,12,45657,45683,12,45713,45739,12,45769,45795,12,45825,45851,12,45881,45907,12,45937,45963,12,45993,46019,12,46049,46075,12,46105,46131,12,46161,46187,12,46217,46243,12,46273,46299,12,46329,46355,12,46385,46411,12,46441,46467,12,46497,46523,12,46553,46579,12,46609,46635,12,46665,46691,12,46721,46747,12,46777,46803,12,46833,46859,12,46889,46915,12,46945,46971,12,47001,47027,12,47057,47083,12,47113,47139,12,47169,47195,12,47225,47251,12,47281,47307,12,47337,47363,12,47393,47419,12,47449,47475,12,47505,47531,12,47561,47587,12,47617,47643,12,47673,47699,12,47729,47755,12,47785,47811,12,47841,47867,12,47897,47923,12,47953,47979,12,48009,48035,12,48065,48091,12,48121,48147,12,48177,48203,12,48233,48259,12,48289,48315,12,48345,48371,12,48401,48427,12,48457,48483,12,48513,48539,12,48569,48595,12,48625,48651,12,48681,48707,12,48737,48763,12,48793,48819,12,48849,48875,12,48905,48931,12,48961,48987,12,49017,49043,12,49073,49099,12,49129,49155,12,49185,49211,12,49241,49267,12,49297,49323,12,49353,49379,12,49409,49435,12,49465,49491,12,49521,49547,12,49577,49603,12,49633,49659,12,49689,49715,12,49745,49771,12,49801,49827,12,49857,49883,12,49913,49939,12,49969,49995,12,50025,50051,12,50081,50107,12,50137,50163,12,50193,50219,12,50249,50275,12,50305,50331,12,50361,50387,12,50417,50443,12,50473,50499,12,50529,50555,12,50585,50611,12,50641,50667,12,50697,50723,12,50753,50779,12,50809,50835,12,50865,50891,12,50921,50947,12,50977,51003,12,51033,51059,12,51089,51115,12,51145,51171,12,51201,51227,12,51257,51283,12,51313,51339,12,51369,51395,12,51425,51451,12,51481,51507,12,51537,51563,12,51593,51619,12,51649,51675,12,51705,51731,12,51761,51787,12,51817,51843,12,51873,51899,12,51929,51955,12,51985,52011,12,52041,52067,12,52097,52123,12,52153,52179,12,52209,52235,12,52265,52291,12,52321,52347,12,52377,52403,12,52433,52459,12,52489,52515,12,52545,52571,12,52601,52627,12,52657,52683,12,52713,52739,12,52769,52795,12,52825,52851,12,52881,52907,12,52937,52963,12,52993,53019,12,53049,53075,12,53105,53131,12,53161,53187,12,53217,53243,12,53273,53299,12,53329,53355,12,53385,53411,12,53441,53467,12,53497,53523,12,53553,53579,12,53609,53635,12,53665,53691,12,53721,53747,12,53777,53803,12,53833,53859,12,53889,53915,12,53945,53971,12,54001,54027,12,54057,54083,12,54113,54139,12,54169,54195,12,54225,54251,12,54281,54307,12,54337,54363,12,54393,54419,12,54449,54475,12,54505,54531,12,54561,54587,12,54617,54643,12,54673,54699,12,54729,54755,12,54785,54811,12,54841,54867,12,54897,54923,12,54953,54979,12,55009,55035,12,55065,55091,12,55121,55147,12,55177,55203,12,65024,65039,5,65520,65528,4,66422,66426,5,68152,68154,5,69291,69292,5,69633,69633,5,69747,69748,5,69811,69814,5,69826,69826,5,69932,69932,7,70016,70017,5,70079,70080,7,70095,70095,5,70196,70196,5,70367,70367,5,70402,70403,7,70464,70464,5,70487,70487,5,70709,70711,7,70725,70725,7,70833,70834,7,70843,70844,7,70849,70849,7,71090,71093,5,71103,71104,5,71227,71228,7,71339,71339,5,71344,71349,5,71458,71461,5,71727,71735,5,71985,71989,7,71998,71998,5,72002,72002,7,72154,72155,5,72193,72202,5,72251,72254,5,72281,72283,5,72344,72345,5,72766,72766,7,72874,72880,5,72885,72886,5,73023,73029,5,73104,73105,5,73111,73111,5,92912,92916,5,94095,94098,5,113824,113827,4,119142,119142,7,119155,119162,4,119362,119364,5,121476,121476,5,122888,122904,5,123184,123190,5,125252,125258,5,127183,127183,14,127340,127343,14,127377,127386,14,127491,127503,14,127548,127551,14,127744,127756,14,127761,127761,14,127769,127769,14,127773,127774,14,127780,127788,14,127796,127797,14,127820,127823,14,127869,127869,14,127894,127895,14,127902,127903,14,127943,127943,14,127947,127950,14,127972,127972,14,127988,127988,14,127992,127994,14,128009,128011,14,128019,128019,14,128023,128041,14,128064,128064,14,128102,128107,14,128174,128181,14,128238,128238,14,128246,128247,14,128254,128254,14,128264,128264,14,128278,128299,14,128329,128330,14,128348,128359,14,128371,128377,14,128392,128393,14,128401,128404,14,128421,128421,14,128433,128434,14,128450,128452,14,128476,128478,14,128483,128483,14,128495,128495,14,128506,128506,14,128519,128520,14,128528,128528,14,128534,128534,14,128538,128538,14,128540,128542,14,128544,128549,14,128552,128555,14,128557,128557,14,128560,128563,14,128565,128565,14,128567,128576,14,128581,128591,14,128641,128642,14,128646,128646,14,128648,128648,14,128650,128651,14,128653,128653,14,128655,128655,14,128657,128659,14,128661,128661,14,128663,128663,14,128665,128666,14,128674,128674,14,128676,128677,14,128679,128685,14,128690,128690,14,128694,128694,14,128697,128702,14,128704,128704,14,128710,128714,14,128716,128716,14,128720,128720,14,128723,128724,14,128726,128727,14,128733,128735,14,128742,128744,14,128746,128746,14,128749,128751,14,128753,128754,14,128756,128758,14,128761,128761,14,128763,128764,14,128884,128895,14,128992,129003,14,129008,129008,14,129036,129039,14,129114,129119,14,129198,129279,14,129293,129295,14,129305,129310,14,129312,129319,14,129328,129328,14,129331,129338,14,129343,129343,14,129351,129355,14,129357,129359,14,129375,129387,14,129393,129393,14,129395,129398,14,129401,129401,14,129403,129403,14,129408,129412,14,129426,129431,14,129443,129444,14,129451,129453,14,129456,129465,14,129472,129472,14,129475,129482,14,129484,129484,14,129488,129510,14,129536,129647,14,129652,129652,14,129656,129658,14,129661,129663,14,129667,129670,14,129680,129685,14,129705,129708,14,129712,129718,14,129723,129727,14,129731,129733,14,129744,129750,14,129754,129759,14,129768,129775,14,129783,129791,14,917504,917504,4,917506,917535,4,917632,917759,4,918000,921599,4,0,9,4,11,12,4,14,31,4,169,169,14,174,174,14,1155,1159,5,1425,1469,5,1473,1474,5,1479,1479,5,1552,1562,5,1611,1631,5,1750,1756,5,1759,1764,5,1770,1773,5,1809,1809,5,1958,1968,5,2045,2045,5,2075,2083,5,2089,2093,5,2192,2193,1,2250,2273,5,2275,2306,5,2362,2362,5,2364,2364,5,2369,2376,5,2381,2381,5,2385,2391,5,2433,2433,5,2492,2492,5,2495,2496,7,2503,2504,7,2509,2509,5,2530,2531,5,2561,2562,5,2620,2620,5,2625,2626,5,2635,2637,5,2672,2673,5,2689,2690,5,2748,2748,5,2753,2757,5,2761,2761,7,2765,2765,5,2810,2815,5,2818,2819,7,2878,2878,5,2880,2880,7,2887,2888,7,2893,2893,5,2903,2903,5,2946,2946,5,3007,3007,7,3009,3010,7,3018,3020,7,3031,3031,5,3073,3075,7,3132,3132,5,3137,3140,7,3146,3149,5,3170,3171,5,3202,3203,7,3262,3262,7,3264,3265,7,3267,3268,7,3271,3272,7,3276,3277,5,3298,3299,5,3330,3331,7,3390,3390,5,3393,3396,5,3402,3404,7,3406,3406,1,3426,3427,5,3458,3459,7,3535,3535,5,3538,3540,5,3544,3550,7,3570,3571,7,3635,3635,7,3655,3662,5,3763,3763,7,3784,3789,5,3893,3893,5,3897,3897,5,3953,3966,5,3968,3972,5,3981,3991,5,4038,4038,5,4145,4145,7,4153,4154,5,4157,4158,5,4184,4185,5,4209,4212,5,4228,4228,7,4237,4237,5,4352,4447,8,4520,4607,10,5906,5908,5,5938,5939,5,5970,5971,5,6068,6069,5,6071,6077,5,6086,6086,5,6089,6099,5,6155,6157,5,6159,6159,5,6313,6313,5,6435,6438,7,6441,6443,7,6450,6450,5,6457,6459,5,6681,6682,7,6741,6741,7,6743,6743,7,6752,6752,5,6757,6764,5,6771,6780,5,6832,6845,5,6847,6862,5,6916,6916,7,6965,6965,5,6971,6971,7,6973,6977,7,6979,6980,7,7040,7041,5,7073,7073,7,7078,7079,7,7082,7082,7,7142,7142,5,7144,7145,5,7149,7149,5,7151,7153,5,7204,7211,7,7220,7221,7,7376,7378,5,7393,7393,7,7405,7405,5,7415,7415,7,7616,7679,5,8204,8204,5,8206,8207,4,8233,8233,4,8252,8252,14,8288,8292,4,8294,8303,4,8413,8416,5,8418,8420,5,8482,8482,14,8596,8601,14,8986,8987,14,9096,9096,14,9193,9196,14,9199,9199,14,9201,9202,14,9208,9210,14,9642,9643,14,9664,9664,14,9728,9729,14,9732,9732,14,9735,9741,14,9743,9744,14,9746,9746,14,9750,9751,14,9753,9756,14,9758,9759,14,9761,9761,14,9764,9765,14,9767,9769,14,9771,9773,14,9775,9775,14,9784,9785,14,9787,9791,14,9793,9793,14,9795,9799,14,9812,9822,14,9824,9824,14,9827,9827,14,9829,9830,14,9832,9832,14,9851,9851,14,9854,9854,14,9856,9861,14,9874,9874,14,9876,9876,14,9878,9879,14,9881,9881,14,9883,9884,14,9888,9889,14,9895,9895,14,9898,9899,14,9904,9905,14,9917,9918,14,9924,9925,14,9928,9928,14,9934,9934,14,9936,9936,14,9938,9938,14,9940,9940,14,9961,9961,14,9963,9967,14,9970,9971,14,9973,9973,14,9975,9977,14,9979,9980,14,9982,9985,14,9987,9988,14,9992,9996,14,9998,9998,14,10000,10001,14,10004,10004,14,10013,10013,14,10024,10024,14,10052,10052,14,10060,10060,14,10067,10069,14,10083,10083,14,10085,10087,14,10145,10145,14,10175,10175,14,11013,11015,14,11088,11088,14,11503,11505,5,11744,11775,5,12334,12335,5,12349,12349,14,12951,12951,14,42607,42607,5,42612,42621,5,42736,42737,5,43014,43014,5,43043,43044,7,43047,43047,7,43136,43137,7,43204,43205,5,43263,43263,5,43335,43345,5,43360,43388,8,43395,43395,7,43444,43445,7,43450,43451,7,43454,43456,7,43561,43566,5,43569,43570,5,43573,43574,5,43596,43596,5,43644,43644,5,43698,43700,5,43710,43711,5,43755,43755,7,43758,43759,7,43766,43766,5,44005,44005,5,44008,44008,5,44012,44012,7,44032,44032,11,44060,44060,11,44088,44088,11,44116,44116,11,44144,44144,11,44172,44172,11,44200,44200,11,44228,44228,11,44256,44256,11,44284,44284,11,44312,44312,11,44340,44340,11,44368,44368,11,44396,44396,11,44424,44424,11,44452,44452,11,44480,44480,11,44508,44508,11,44536,44536,11,44564,44564,11,44592,44592,11,44620,44620,11,44648,44648,11,44676,44676,11,44704,44704,11,44732,44732,11,44760,44760,11,44788,44788,11,44816,44816,11,44844,44844,11,44872,44872,11,44900,44900,11,44928,44928,11,44956,44956,11,44984,44984,11,45012,45012,11,45040,45040,11,45068,45068,11,45096,45096,11,45124,45124,11,45152,45152,11,45180,45180,11,45208,45208,11,45236,45236,11,45264,45264,11,45292,45292,11,45320,45320,11,45348,45348,11,45376,45376,11,45404,45404,11,45432,45432,11,45460,45460,11,45488,45488,11,45516,45516,11,45544,45544,11,45572,45572,11,45600,45600,11,45628,45628,11,45656,45656,11,45684,45684,11,45712,45712,11,45740,45740,11,45768,45768,11,45796,45796,11,45824,45824,11,45852,45852,11,45880,45880,11,45908,45908,11,45936,45936,11,45964,45964,11,45992,45992,11,46020,46020,11,46048,46048,11,46076,46076,11,46104,46104,11,46132,46132,11,46160,46160,11,46188,46188,11,46216,46216,11,46244,46244,11,46272,46272,11,46300,46300,11,46328,46328,11,46356,46356,11,46384,46384,11,46412,46412,11,46440,46440,11,46468,46468,11,46496,46496,11,46524,46524,11,46552,46552,11,46580,46580,11,46608,46608,11,46636,46636,11,46664,46664,11,46692,46692,11,46720,46720,11,46748,46748,11,46776,46776,11,46804,46804,11,46832,46832,11,46860,46860,11,46888,46888,11,46916,46916,11,46944,46944,11,46972,46972,11,47000,47000,11,47028,47028,11,47056,47056,11,47084,47084,11,47112,47112,11,47140,47140,11,47168,47168,11,47196,47196,11,47224,47224,11,47252,47252,11,47280,47280,11,47308,47308,11,47336,47336,11,47364,47364,11,47392,47392,11,47420,47420,11,47448,47448,11,47476,47476,11,47504,47504,11,47532,47532,11,47560,47560,11,47588,47588,11,47616,47616,11,47644,47644,11,47672,47672,11,47700,47700,11,47728,47728,11,47756,47756,11,47784,47784,11,47812,47812,11,47840,47840,11,47868,47868,11,47896,47896,11,47924,47924,11,47952,47952,11,47980,47980,11,48008,48008,11,48036,48036,11,48064,48064,11,48092,48092,11,48120,48120,11,48148,48148,11,48176,48176,11,48204,48204,11,48232,48232,11,48260,48260,11,48288,48288,11,48316,48316,11,48344,48344,11,48372,48372,11,48400,48400,11,48428,48428,11,48456,48456,11,48484,48484,11,48512,48512,11,48540,48540,11,48568,48568,11,48596,48596,11,48624,48624,11,48652,48652,11,48680,48680,11,48708,48708,11,48736,48736,11,48764,48764,11,48792,48792,11,48820,48820,11,48848,48848,11,48876,48876,11,48904,48904,11,48932,48932,11,48960,48960,11,48988,48988,11,49016,49016,11,49044,49044,11,49072,49072,11,49100,49100,11,49128,49128,11,49156,49156,11,49184,49184,11,49212,49212,11,49240,49240,11,49268,49268,11,49296,49296,11,49324,49324,11,49352,49352,11,49380,49380,11,49408,49408,11,49436,49436,11,49464,49464,11,49492,49492,11,49520,49520,11,49548,49548,11,49576,49576,11,49604,49604,11,49632,49632,11,49660,49660,11,49688,49688,11,49716,49716,11,49744,49744,11,49772,49772,11,49800,49800,11,49828,49828,11,49856,49856,11,49884,49884,11,49912,49912,11,49940,49940,11,49968,49968,11,49996,49996,11,50024,50024,11,50052,50052,11,50080,50080,11,50108,50108,11,50136,50136,11,50164,50164,11,50192,50192,11,50220,50220,11,50248,50248,11,50276,50276,11,50304,50304,11,50332,50332,11,50360,50360,11,50388,50388,11,50416,50416,11,50444,50444,11,50472,50472,11,50500,50500,11,50528,50528,11,50556,50556,11,50584,50584,11,50612,50612,11,50640,50640,11,50668,50668,11,50696,50696,11,50724,50724,11,50752,50752,11,50780,50780,11,50808,50808,11,50836,50836,11,50864,50864,11,50892,50892,11,50920,50920,11,50948,50948,11,50976,50976,11,51004,51004,11,51032,51032,11,51060,51060,11,51088,51088,11,51116,51116,11,51144,51144,11,51172,51172,11,51200,51200,11,51228,51228,11,51256,51256,11,51284,51284,11,51312,51312,11,51340,51340,11,51368,51368,11,51396,51396,11,51424,51424,11,51452,51452,11,51480,51480,11,51508,51508,11,51536,51536,11,51564,51564,11,51592,51592,11,51620,51620,11,51648,51648,11,51676,51676,11,51704,51704,11,51732,51732,11,51760,51760,11,51788,51788,11,51816,51816,11,51844,51844,11,51872,51872,11,51900,51900,11,51928,51928,11,51956,51956,11,51984,51984,11,52012,52012,11,52040,52040,11,52068,52068,11,52096,52096,11,52124,52124,11,52152,52152,11,52180,52180,11,52208,52208,11,52236,52236,11,52264,52264,11,52292,52292,11,52320,52320,11,52348,52348,11,52376,52376,11,52404,52404,11,52432,52432,11,52460,52460,11,52488,52488,11,52516,52516,11,52544,52544,11,52572,52572,11,52600,52600,11,52628,52628,11,52656,52656,11,52684,52684,11,52712,52712,11,52740,52740,11,52768,52768,11,52796,52796,11,52824,52824,11,52852,52852,11,52880,52880,11,52908,52908,11,52936,52936,11,52964,52964,11,52992,52992,11,53020,53020,11,53048,53048,11,53076,53076,11,53104,53104,11,53132,53132,11,53160,53160,11,53188,53188,11,53216,53216,11,53244,53244,11,53272,53272,11,53300,53300,11,53328,53328,11,53356,53356,11,53384,53384,11,53412,53412,11,53440,53440,11,53468,53468,11,53496,53496,11,53524,53524,11,53552,53552,11,53580,53580,11,53608,53608,11,53636,53636,11,53664,53664,11,53692,53692,11,53720,53720,11,53748,53748,11,53776,53776,11,53804,53804,11,53832,53832,11,53860,53860,11,53888,53888,11,53916,53916,11,53944,53944,11,53972,53972,11,54000,54000,11,54028,54028,11,54056,54056,11,54084,54084,11,54112,54112,11,54140,54140,11,54168,54168,11,54196,54196,11,54224,54224,11,54252,54252,11,54280,54280,11,54308,54308,11,54336,54336,11,54364,54364,11,54392,54392,11,54420,54420,11,54448,54448,11,54476,54476,11,54504,54504,11,54532,54532,11,54560,54560,11,54588,54588,11,54616,54616,11,54644,54644,11,54672,54672,11,54700,54700,11,54728,54728,11,54756,54756,11,54784,54784,11,54812,54812,11,54840,54840,11,54868,54868,11,54896,54896,11,54924,54924,11,54952,54952,11,54980,54980,11,55008,55008,11,55036,55036,11,55064,55064,11,55092,55092,11,55120,55120,11,55148,55148,11,55176,55176,11,55216,55238,9,64286,64286,5,65056,65071,5,65438,65439,5,65529,65531,4,66272,66272,5,68097,68099,5,68108,68111,5,68159,68159,5,68900,68903,5,69446,69456,5,69632,69632,7,69634,69634,7,69744,69744,5,69759,69761,5,69808,69810,7,69815,69816,7,69821,69821,1,69837,69837,1,69927,69931,5,69933,69940,5,70003,70003,5,70018,70018,7,70070,70078,5,70082,70083,1,70094,70094,7,70188,70190,7,70194,70195,7,70197,70197,7,70206,70206,5,70368,70370,7,70400,70401,5,70459,70460,5,70463,70463,7,70465,70468,7,70475,70477,7,70498,70499,7,70512,70516,5,70712,70719,5,70722,70724,5,70726,70726,5,70832,70832,5,70835,70840,5,70842,70842,5,70845,70845,5,70847,70848,5,70850,70851,5,71088,71089,7,71096,71099,7,71102,71102,7,71132,71133,5,71219,71226,5,71229,71229,5,71231,71232,5,71340,71340,7,71342,71343,7,71350,71350,7,71453,71455,5,71462,71462,7,71724,71726,7,71736,71736,7,71984,71984,5,71991,71992,7,71997,71997,7,71999,71999,1,72001,72001,1,72003,72003,5,72148,72151,5,72156,72159,7,72164,72164,7,72243,72248,5,72250,72250,1,72263,72263,5,72279,72280,7,72324,72329,1,72343,72343,7,72751,72751,7,72760,72765,5,72767,72767,5,72873,72873,7,72881,72881,7,72884,72884,7,73009,73014,5,73020,73021,5,73030,73030,1,73098,73102,7,73107,73108,7,73110,73110,7,73459,73460,5,78896,78904,4,92976,92982,5,94033,94087,7,94180,94180,5,113821,113822,5,118528,118573,5,119141,119141,5,119143,119145,5,119150,119154,5,119163,119170,5,119210,119213,5,121344,121398,5,121461,121461,5,121499,121503,5,122880,122886,5,122907,122913,5,122918,122922,5,123566,123566,5,125136,125142,5,126976,126979,14,126981,127182,14,127184,127231,14,127279,127279,14,127344,127345,14,127374,127374,14,127405,127461,14,127489,127490,14,127514,127514,14,127538,127546,14,127561,127567,14,127570,127743,14,127757,127758,14,127760,127760,14,127762,127762,14,127766,127768,14,127770,127770,14,127772,127772,14,127775,127776,14,127778,127779,14,127789,127791,14,127794,127795,14,127798,127798,14,127819,127819,14,127824,127824,14,127868,127868,14,127870,127871,14,127892,127893,14,127896,127896,14,127900,127901,14,127904,127940,14,127942,127942,14,127944,127944,14,127946,127946,14,127951,127955,14,127968,127971,14,127973,127984,14,127987,127987,14,127989,127989,14,127991,127991,14,127995,127999,5,128008,128008,14,128012,128014,14,128017,128018,14,128020,128020,14,128022,128022,14,128042,128042,14,128063,128063,14,128065,128065,14,128101,128101,14,128108,128109,14,128173,128173,14,128182,128183,14,128236,128237,14,128239,128239,14,128245,128245,14,128248,128248,14,128253,128253,14,128255,128258,14,128260,128263,14,128265,128265,14,128277,128277,14,128300,128301,14,128326,128328,14,128331,128334,14,128336,128347,14,128360,128366,14,128369,128370,14,128378,128378,14,128391,128391,14,128394,128397,14,128400,128400,14,128405,128406,14,128420,128420,14,128422,128423,14,128425,128432,14,128435,128443,14,128445,128449,14,128453,128464,14,128468,128475,14,128479,128480,14,128482,128482,14,128484,128487,14,128489,128494,14,128496,128498,14,128500,128505,14,128507,128511,14,128513,128518,14,128521,128525,14,128527,128527,14,128529,128529,14,128533,128533,14,128535,128535,14,128537,128537,14]")}function ge(Z,te){if(Z===0)return 0;const re=X(Z,te);if(re!==void 0)return re;const le=new W(te,Z);return le.prevCodePoint(),le.offset}function X(Z,te){const re=new W(te,Z);let le=re.prevCodePoint();for(;B(le)||le===65039||le===8419;){if(re.offset===0)return;le=re.prevCodePoint()}if(!ie(le))return;let me=re.offset;return me>0&&re.prevCodePoint()===8205&&(me=re.offset),me}function B(Z){return 127995<=Z&&Z<=127999}e.noBreakWhitespace="\xA0";class ${static{this.ambiguousCharacterData=new k.Lazy(()=>JSON.parse('{"_common":[8232,32,8233,32,5760,32,8192,32,8193,32,8194,32,8195,32,8196,32,8197,32,8198,32,8200,32,8201,32,8202,32,8287,32,8199,32,8239,32,2042,95,65101,95,65102,95,65103,95,8208,45,8209,45,8210,45,65112,45,1748,45,8259,45,727,45,8722,45,10134,45,11450,45,1549,44,1643,44,8218,44,184,44,42233,44,894,59,2307,58,2691,58,1417,58,1795,58,1796,58,5868,58,65072,58,6147,58,6153,58,8282,58,1475,58,760,58,42889,58,8758,58,720,58,42237,58,451,33,11601,33,660,63,577,63,2429,63,5038,63,42731,63,119149,46,8228,46,1793,46,1794,46,42510,46,68176,46,1632,46,1776,46,42232,46,1373,96,65287,96,8219,96,8242,96,1370,96,1523,96,8175,96,65344,96,900,96,8189,96,8125,96,8127,96,8190,96,697,96,884,96,712,96,714,96,715,96,756,96,699,96,701,96,700,96,702,96,42892,96,1497,96,2036,96,2037,96,5194,96,5836,96,94033,96,94034,96,65339,91,10088,40,10098,40,12308,40,64830,40,65341,93,10089,41,10099,41,12309,41,64831,41,10100,123,119060,123,10101,125,65342,94,8270,42,1645,42,8727,42,66335,42,5941,47,8257,47,8725,47,8260,47,9585,47,10187,47,10744,47,119354,47,12755,47,12339,47,11462,47,20031,47,12035,47,65340,92,65128,92,8726,92,10189,92,10741,92,10745,92,119311,92,119355,92,12756,92,20022,92,12034,92,42872,38,708,94,710,94,5869,43,10133,43,66203,43,8249,60,10094,60,706,60,119350,60,5176,60,5810,60,5120,61,11840,61,12448,61,42239,61,8250,62,10095,62,707,62,119351,62,5171,62,94015,62,8275,126,732,126,8128,126,8764,126,65372,124,65293,45,120784,50,120794,50,120804,50,120814,50,120824,50,130034,50,42842,50,423,50,1000,50,42564,50,5311,50,42735,50,119302,51,120785,51,120795,51,120805,51,120815,51,120825,51,130035,51,42923,51,540,51,439,51,42858,51,11468,51,1248,51,94011,51,71882,51,120786,52,120796,52,120806,52,120816,52,120826,52,130036,52,5070,52,71855,52,120787,53,120797,53,120807,53,120817,53,120827,53,130037,53,444,53,71867,53,120788,54,120798,54,120808,54,120818,54,120828,54,130038,54,11474,54,5102,54,71893,54,119314,55,120789,55,120799,55,120809,55,120819,55,120829,55,130039,55,66770,55,71878,55,2819,56,2538,56,2666,56,125131,56,120790,56,120800,56,120810,56,120820,56,120830,56,130040,56,547,56,546,56,66330,56,2663,57,2920,57,2541,57,3437,57,120791,57,120801,57,120811,57,120821,57,120831,57,130041,57,42862,57,11466,57,71884,57,71852,57,71894,57,9082,97,65345,97,119834,97,119886,97,119938,97,119990,97,120042,97,120094,97,120146,97,120198,97,120250,97,120302,97,120354,97,120406,97,120458,97,593,97,945,97,120514,97,120572,97,120630,97,120688,97,120746,97,65313,65,119808,65,119860,65,119912,65,119964,65,120016,65,120068,65,120120,65,120172,65,120224,65,120276,65,120328,65,120380,65,120432,65,913,65,120488,65,120546,65,120604,65,120662,65,120720,65,5034,65,5573,65,42222,65,94016,65,66208,65,119835,98,119887,98,119939,98,119991,98,120043,98,120095,98,120147,98,120199,98,120251,98,120303,98,120355,98,120407,98,120459,98,388,98,5071,98,5234,98,5551,98,65314,66,8492,66,119809,66,119861,66,119913,66,120017,66,120069,66,120121,66,120173,66,120225,66,120277,66,120329,66,120381,66,120433,66,42932,66,914,66,120489,66,120547,66,120605,66,120663,66,120721,66,5108,66,5623,66,42192,66,66178,66,66209,66,66305,66,65347,99,8573,99,119836,99,119888,99,119940,99,119992,99,120044,99,120096,99,120148,99,120200,99,120252,99,120304,99,120356,99,120408,99,120460,99,7428,99,1010,99,11429,99,43951,99,66621,99,128844,67,71922,67,71913,67,65315,67,8557,67,8450,67,8493,67,119810,67,119862,67,119914,67,119966,67,120018,67,120174,67,120226,67,120278,67,120330,67,120382,67,120434,67,1017,67,11428,67,5087,67,42202,67,66210,67,66306,67,66581,67,66844,67,8574,100,8518,100,119837,100,119889,100,119941,100,119993,100,120045,100,120097,100,120149,100,120201,100,120253,100,120305,100,120357,100,120409,100,120461,100,1281,100,5095,100,5231,100,42194,100,8558,68,8517,68,119811,68,119863,68,119915,68,119967,68,120019,68,120071,68,120123,68,120175,68,120227,68,120279,68,120331,68,120383,68,120435,68,5024,68,5598,68,5610,68,42195,68,8494,101,65349,101,8495,101,8519,101,119838,101,119890,101,119942,101,120046,101,120098,101,120150,101,120202,101,120254,101,120306,101,120358,101,120410,101,120462,101,43826,101,1213,101,8959,69,65317,69,8496,69,119812,69,119864,69,119916,69,120020,69,120072,69,120124,69,120176,69,120228,69,120280,69,120332,69,120384,69,120436,69,917,69,120492,69,120550,69,120608,69,120666,69,120724,69,11577,69,5036,69,42224,69,71846,69,71854,69,66182,69,119839,102,119891,102,119943,102,119995,102,120047,102,120099,102,120151,102,120203,102,120255,102,120307,102,120359,102,120411,102,120463,102,43829,102,42905,102,383,102,7837,102,1412,102,119315,70,8497,70,119813,70,119865,70,119917,70,120021,70,120073,70,120125,70,120177,70,120229,70,120281,70,120333,70,120385,70,120437,70,42904,70,988,70,120778,70,5556,70,42205,70,71874,70,71842,70,66183,70,66213,70,66853,70,65351,103,8458,103,119840,103,119892,103,119944,103,120048,103,120100,103,120152,103,120204,103,120256,103,120308,103,120360,103,120412,103,120464,103,609,103,7555,103,397,103,1409,103,119814,71,119866,71,119918,71,119970,71,120022,71,120074,71,120126,71,120178,71,120230,71,120282,71,120334,71,120386,71,120438,71,1292,71,5056,71,5107,71,42198,71,65352,104,8462,104,119841,104,119945,104,119997,104,120049,104,120101,104,120153,104,120205,104,120257,104,120309,104,120361,104,120413,104,120465,104,1211,104,1392,104,5058,104,65320,72,8459,72,8460,72,8461,72,119815,72,119867,72,119919,72,120023,72,120179,72,120231,72,120283,72,120335,72,120387,72,120439,72,919,72,120494,72,120552,72,120610,72,120668,72,120726,72,11406,72,5051,72,5500,72,42215,72,66255,72,731,105,9075,105,65353,105,8560,105,8505,105,8520,105,119842,105,119894,105,119946,105,119998,105,120050,105,120102,105,120154,105,120206,105,120258,105,120310,105,120362,105,120414,105,120466,105,120484,105,618,105,617,105,953,105,8126,105,890,105,120522,105,120580,105,120638,105,120696,105,120754,105,1110,105,42567,105,1231,105,43893,105,5029,105,71875,105,65354,106,8521,106,119843,106,119895,106,119947,106,119999,106,120051,106,120103,106,120155,106,120207,106,120259,106,120311,106,120363,106,120415,106,120467,106,1011,106,1112,106,65322,74,119817,74,119869,74,119921,74,119973,74,120025,74,120077,74,120129,74,120181,74,120233,74,120285,74,120337,74,120389,74,120441,74,42930,74,895,74,1032,74,5035,74,5261,74,42201,74,119844,107,119896,107,119948,107,120000,107,120052,107,120104,107,120156,107,120208,107,120260,107,120312,107,120364,107,120416,107,120468,107,8490,75,65323,75,119818,75,119870,75,119922,75,119974,75,120026,75,120078,75,120130,75,120182,75,120234,75,120286,75,120338,75,120390,75,120442,75,922,75,120497,75,120555,75,120613,75,120671,75,120729,75,11412,75,5094,75,5845,75,42199,75,66840,75,1472,108,8739,73,9213,73,65512,73,1633,108,1777,73,66336,108,125127,108,120783,73,120793,73,120803,73,120813,73,120823,73,130033,73,65321,73,8544,73,8464,73,8465,73,119816,73,119868,73,119920,73,120024,73,120128,73,120180,73,120232,73,120284,73,120336,73,120388,73,120440,73,65356,108,8572,73,8467,108,119845,108,119897,108,119949,108,120001,108,120053,108,120105,73,120157,73,120209,73,120261,73,120313,73,120365,73,120417,73,120469,73,448,73,120496,73,120554,73,120612,73,120670,73,120728,73,11410,73,1030,73,1216,73,1493,108,1503,108,1575,108,126464,108,126592,108,65166,108,65165,108,1994,108,11599,73,5825,73,42226,73,93992,73,66186,124,66313,124,119338,76,8556,76,8466,76,119819,76,119871,76,119923,76,120027,76,120079,76,120131,76,120183,76,120235,76,120287,76,120339,76,120391,76,120443,76,11472,76,5086,76,5290,76,42209,76,93974,76,71843,76,71858,76,66587,76,66854,76,65325,77,8559,77,8499,77,119820,77,119872,77,119924,77,120028,77,120080,77,120132,77,120184,77,120236,77,120288,77,120340,77,120392,77,120444,77,924,77,120499,77,120557,77,120615,77,120673,77,120731,77,1018,77,11416,77,5047,77,5616,77,5846,77,42207,77,66224,77,66321,77,119847,110,119899,110,119951,110,120003,110,120055,110,120107,110,120159,110,120211,110,120263,110,120315,110,120367,110,120419,110,120471,110,1400,110,1404,110,65326,78,8469,78,119821,78,119873,78,119925,78,119977,78,120029,78,120081,78,120185,78,120237,78,120289,78,120341,78,120393,78,120445,78,925,78,120500,78,120558,78,120616,78,120674,78,120732,78,11418,78,42208,78,66835,78,3074,111,3202,111,3330,111,3458,111,2406,111,2662,111,2790,111,3046,111,3174,111,3302,111,3430,111,3664,111,3792,111,4160,111,1637,111,1781,111,65359,111,8500,111,119848,111,119900,111,119952,111,120056,111,120108,111,120160,111,120212,111,120264,111,120316,111,120368,111,120420,111,120472,111,7439,111,7441,111,43837,111,959,111,120528,111,120586,111,120644,111,120702,111,120760,111,963,111,120532,111,120590,111,120648,111,120706,111,120764,111,11423,111,4351,111,1413,111,1505,111,1607,111,126500,111,126564,111,126596,111,65259,111,65260,111,65258,111,65257,111,1726,111,64428,111,64429,111,64427,111,64426,111,1729,111,64424,111,64425,111,64423,111,64422,111,1749,111,3360,111,4125,111,66794,111,71880,111,71895,111,66604,111,1984,79,2534,79,2918,79,12295,79,70864,79,71904,79,120782,79,120792,79,120802,79,120812,79,120822,79,130032,79,65327,79,119822,79,119874,79,119926,79,119978,79,120030,79,120082,79,120134,79,120186,79,120238,79,120290,79,120342,79,120394,79,120446,79,927,79,120502,79,120560,79,120618,79,120676,79,120734,79,11422,79,1365,79,11604,79,4816,79,2848,79,66754,79,42227,79,71861,79,66194,79,66219,79,66564,79,66838,79,9076,112,65360,112,119849,112,119901,112,119953,112,120005,112,120057,112,120109,112,120161,112,120213,112,120265,112,120317,112,120369,112,120421,112,120473,112,961,112,120530,112,120544,112,120588,112,120602,112,120646,112,120660,112,120704,112,120718,112,120762,112,120776,112,11427,112,65328,80,8473,80,119823,80,119875,80,119927,80,119979,80,120031,80,120083,80,120187,80,120239,80,120291,80,120343,80,120395,80,120447,80,929,80,120504,80,120562,80,120620,80,120678,80,120736,80,11426,80,5090,80,5229,80,42193,80,66197,80,119850,113,119902,113,119954,113,120006,113,120058,113,120110,113,120162,113,120214,113,120266,113,120318,113,120370,113,120422,113,120474,113,1307,113,1379,113,1382,113,8474,81,119824,81,119876,81,119928,81,119980,81,120032,81,120084,81,120188,81,120240,81,120292,81,120344,81,120396,81,120448,81,11605,81,119851,114,119903,114,119955,114,120007,114,120059,114,120111,114,120163,114,120215,114,120267,114,120319,114,120371,114,120423,114,120475,114,43847,114,43848,114,7462,114,11397,114,43905,114,119318,82,8475,82,8476,82,8477,82,119825,82,119877,82,119929,82,120033,82,120189,82,120241,82,120293,82,120345,82,120397,82,120449,82,422,82,5025,82,5074,82,66740,82,5511,82,42211,82,94005,82,65363,115,119852,115,119904,115,119956,115,120008,115,120060,115,120112,115,120164,115,120216,115,120268,115,120320,115,120372,115,120424,115,120476,115,42801,115,445,115,1109,115,43946,115,71873,115,66632,115,65331,83,119826,83,119878,83,119930,83,119982,83,120034,83,120086,83,120138,83,120190,83,120242,83,120294,83,120346,83,120398,83,120450,83,1029,83,1359,83,5077,83,5082,83,42210,83,94010,83,66198,83,66592,83,119853,116,119905,116,119957,116,120009,116,120061,116,120113,116,120165,116,120217,116,120269,116,120321,116,120373,116,120425,116,120477,116,8868,84,10201,84,128872,84,65332,84,119827,84,119879,84,119931,84,119983,84,120035,84,120087,84,120139,84,120191,84,120243,84,120295,84,120347,84,120399,84,120451,84,932,84,120507,84,120565,84,120623,84,120681,84,120739,84,11430,84,5026,84,42196,84,93962,84,71868,84,66199,84,66225,84,66325,84,119854,117,119906,117,119958,117,120010,117,120062,117,120114,117,120166,117,120218,117,120270,117,120322,117,120374,117,120426,117,120478,117,42911,117,7452,117,43854,117,43858,117,651,117,965,117,120534,117,120592,117,120650,117,120708,117,120766,117,1405,117,66806,117,71896,117,8746,85,8899,85,119828,85,119880,85,119932,85,119984,85,120036,85,120088,85,120140,85,120192,85,120244,85,120296,85,120348,85,120400,85,120452,85,1357,85,4608,85,66766,85,5196,85,42228,85,94018,85,71864,85,8744,118,8897,118,65366,118,8564,118,119855,118,119907,118,119959,118,120011,118,120063,118,120115,118,120167,118,120219,118,120271,118,120323,118,120375,118,120427,118,120479,118,7456,118,957,118,120526,118,120584,118,120642,118,120700,118,120758,118,1141,118,1496,118,71430,118,43945,118,71872,118,119309,86,1639,86,1783,86,8548,86,119829,86,119881,86,119933,86,119985,86,120037,86,120089,86,120141,86,120193,86,120245,86,120297,86,120349,86,120401,86,120453,86,1140,86,11576,86,5081,86,5167,86,42719,86,42214,86,93960,86,71840,86,66845,86,623,119,119856,119,119908,119,119960,119,120012,119,120064,119,120116,119,120168,119,120220,119,120272,119,120324,119,120376,119,120428,119,120480,119,7457,119,1121,119,1309,119,1377,119,71434,119,71438,119,71439,119,43907,119,71919,87,71910,87,119830,87,119882,87,119934,87,119986,87,120038,87,120090,87,120142,87,120194,87,120246,87,120298,87,120350,87,120402,87,120454,87,1308,87,5043,87,5076,87,42218,87,5742,120,10539,120,10540,120,10799,120,65368,120,8569,120,119857,120,119909,120,119961,120,120013,120,120065,120,120117,120,120169,120,120221,120,120273,120,120325,120,120377,120,120429,120,120481,120,5441,120,5501,120,5741,88,9587,88,66338,88,71916,88,65336,88,8553,88,119831,88,119883,88,119935,88,119987,88,120039,88,120091,88,120143,88,120195,88,120247,88,120299,88,120351,88,120403,88,120455,88,42931,88,935,88,120510,88,120568,88,120626,88,120684,88,120742,88,11436,88,11613,88,5815,88,42219,88,66192,88,66228,88,66327,88,66855,88,611,121,7564,121,65369,121,119858,121,119910,121,119962,121,120014,121,120066,121,120118,121,120170,121,120222,121,120274,121,120326,121,120378,121,120430,121,120482,121,655,121,7935,121,43866,121,947,121,8509,121,120516,121,120574,121,120632,121,120690,121,120748,121,1199,121,4327,121,71900,121,65337,89,119832,89,119884,89,119936,89,119988,89,120040,89,120092,89,120144,89,120196,89,120248,89,120300,89,120352,89,120404,89,120456,89,933,89,978,89,120508,89,120566,89,120624,89,120682,89,120740,89,11432,89,1198,89,5033,89,5053,89,42220,89,94019,89,71844,89,66226,89,119859,122,119911,122,119963,122,120015,122,120067,122,120119,122,120171,122,120223,122,120275,122,120327,122,120379,122,120431,122,120483,122,7458,122,43923,122,71876,122,66293,90,71909,90,65338,90,8484,90,8488,90,119833,90,119885,90,119937,90,119989,90,120041,90,120197,90,120249,90,120301,90,120353,90,120405,90,120457,90,918,90,120493,90,120551,90,120609,90,120667,90,120725,90,5059,90,42204,90,71849,90,65282,34,65284,36,65285,37,65286,38,65290,42,65291,43,65294,46,65295,47,65296,48,65297,49,65298,50,65299,51,65300,52,65301,53,65302,54,65303,55,65304,56,65305,57,65308,60,65309,61,65310,62,65312,64,65316,68,65318,70,65319,71,65324,76,65329,81,65330,82,65333,85,65334,86,65335,87,65343,95,65346,98,65348,100,65350,102,65355,107,65357,109,65358,110,65361,113,65362,114,65364,116,65365,117,65367,119,65370,122,65371,123,65373,125,119846,109],"_default":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"cs":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"de":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"es":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"fr":[65374,126,65306,58,65281,33,8216,96,8245,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"it":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"ja":[8211,45,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65292,44,65307,59],"ko":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"pl":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"pt-BR":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"qps-ploc":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"ru":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,305,105,921,73,1009,112,215,120,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"tr":[160,32,8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"zh-hans":[65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41],"zh-hant":[8211,45,65374,126,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65307,59]}'))}static{this.cache=new d.LRUCachedFunction({getCacheKey:JSON.stringify},te=>{function re(Ae){const Ne=new Map;for(let Ke=0;Ke!Ae.startsWith("_")&&Ae in Ce);ye.length===0&&(ye=["_default"]);let Le;for(const Ae of ye){const Ne=re(Ce[Ae]);Le=me(Le,Ne)}const Ee=re(Ce._common),Me=le(Ee,Le);return new $(Me)})}static getInstance(te){return $.cache.get(Array.from(te))}static{this._locales=new k.Lazy(()=>Object.keys($.ambiguousCharacterData.value).filter(te=>!te.startsWith("_")))}static getLocales(){return $._locales.value}constructor(te){this.confusableDictionary=te}isAmbiguous(te){return this.confusableDictionary.has(te)}getPrimaryConfusable(te){return this.confusableDictionary.get(te)}getConfusableCodePoints(){return new Set(this.confusableDictionary.keys())}}e.AmbiguousCharacters=$;class Q{static getRawData(){return JSON.parse("[9,10,11,12,13,32,127,160,173,847,1564,4447,4448,6068,6069,6155,6156,6157,6158,7355,7356,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8234,8235,8236,8237,8238,8239,8287,8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,10240,12288,12644,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65279,65440,65520,65521,65522,65523,65524,65525,65526,65527,65528,65532,78844,119155,119156,119157,119158,119159,119160,119161,119162,917504,917505,917506,917507,917508,917509,917510,917511,917512,917513,917514,917515,917516,917517,917518,917519,917520,917521,917522,917523,917524,917525,917526,917527,917528,917529,917530,917531,917532,917533,917534,917535,917536,917537,917538,917539,917540,917541,917542,917543,917544,917545,917546,917547,917548,917549,917550,917551,917552,917553,917554,917555,917556,917557,917558,917559,917560,917561,917562,917563,917564,917565,917566,917567,917568,917569,917570,917571,917572,917573,917574,917575,917576,917577,917578,917579,917580,917581,917582,917583,917584,917585,917586,917587,917588,917589,917590,917591,917592,917593,917594,917595,917596,917597,917598,917599,917600,917601,917602,917603,917604,917605,917606,917607,917608,917609,917610,917611,917612,917613,917614,917615,917616,917617,917618,917619,917620,917621,917622,917623,917624,917625,917626,917627,917628,917629,917630,917631,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999]")}static{this._data=void 0}static getData(){return this._data||(this._data=new Set(Q.getRawData())),this._data}static isInvisibleCharacter(te){return Q.getData().has(te)}static get codePoints(){return Q.getData()}}e.InvisibleCharacters=Q}),define(ne[82],se([1,0,45,448,11]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FuzzyScoreOptions=e.FuzzyScore=e.matchesPrefix=e.matchesStrictPrefix=void 0,e.or=E,e.matchesContiguousSubString=m,e.matchesSubString=_,e.isUpper=n,e.matchesCamelCase=S,e.matchesWords=L,e.matchesFuzzy=N,e.matchesFuzzy2=O,e.anyScore=F,e.createMatches=x,e.isPatternInWord=he,e.fuzzyScore=ee,e.fuzzyScoreGracefulAggressive=X;function E(...Q){return function(Z,te){for(let re=0,le=Q.length;re0?[{start:0,end:Z.length}]:[]:null}function m(Q,Z){const te=Z.toLowerCase().indexOf(Q.toLowerCase());return te===-1?null:[{start:te,end:te+Q.length}]}function _(Q,Z){return b(Q.toLowerCase(),Z.toLowerCase(),0,0)}function b(Q,Z,te,re){if(te===Q.length)return[];if(re===Z.length)return null;if(Q[te]===Z[re]){let le=null;return(le=b(Q,Z,te+1,re+1))?r({start:re,end:re+1},le):null}return b(Q,Z,te,re+1)}function p(Q){return 97<=Q&&Q<=122}function n(Q){return 65<=Q&&Q<=90}function o(Q){return 48<=Q&&Q<=57}function t(Q){return Q===32||Q===9||Q===10||Q===13}const i=new Set;"()[]{}<>`'\"-/;:,.?!".split("").forEach(Q=>i.add(Q.charCodeAt(0)));function s(Q){return t(Q)||i.has(Q)}function g(Q,Z){return Q===Z||s(Q)&&s(Z)}const c=new Map;function l(Q){if(c.has(Q))return c.get(Q);let Z;const te=(0,k.getKoreanAltChars)(Q);return te&&(Z=te),c.set(Q,Z),Z}function a(Q){return p(Q)||n(Q)||o(Q)}function r(Q,Z){return Z.length===0?Z=[Q]:Q.end===Z[0].start?Z[0].start=Q.start:Z.unshift(Q),Z}function u(Q,Z){for(let te=Z;te0&&!a(Q.charCodeAt(te-1)))return te}return Q.length}function C(Q,Z,te,re){if(te===Q.length)return[];if(re===Z.length)return null;if(Q[te]!==Z[re].toLowerCase())return null;{let le=null,me=re+1;for(le=C(Q,Z,te+1,re+1);!le&&(me=u(Z,me)).6}function v(Q){const{upperPercent:Z,lowerPercent:te,alphaPercent:re,numericPercent:le}=Q;return te>.2&&Z<.8&&re>.6&&le<.2}function w(Q){let Z=0,te=0,re=0,le=0;for(let me=0;me60&&(Z=Z.substring(0,60));const te=f(Z);if(!v(te)){if(!h(te))return null;Z=Z.toLowerCase()}let re=null,le=0;for(Q=Q.toLowerCase();le0&&s(Q.charCodeAt(te-1)))return te;return Q.length}const M=E(e.matchesPrefix,S,m),A=E(e.matchesPrefix,S,_),P=new d.LRUCache(1e4);function N(Q,Z,te=!1){if(typeof Q!="string"||typeof Z!="string")return null;let re=P.get(Q);re||(re=new RegExp(I.convertSimple2RegExpPattern(Q),"i"),P.set(Q,re));const le=re.exec(Z);return le?[{start:le.index,end:le.index+le[0].length}]:te?A(Q,Z):M(Q,Z)}function O(Q,Z){const te=ee(Q,Q.toLowerCase(),0,Z,Z.toLowerCase(),0,{firstMatchCanBeWeak:!0,boostFullMatch:!0});return te?x(te):null}function F(Q,Z,te,re,le,me){const Ce=Math.min(13,Q.length);for(;te"u")return[];const Z=[],te=Q[1];for(let re=Q.length-1;re>1;re--){const le=Q[re]+te,me=Z[Z.length-1];me&&me.end===le?me.end=le+1:Z.push({start:le,end:le+1})}return Z}const W=128;function V(){const Q=[],Z=[];for(let te=0;te<=W;te++)Z[te]=0;for(let te=0;te<=W;te++)Q.push(Z.slice(0));return Q}function q(Q){const Z=[];for(let te=0;te<=Q;te++)Z[te]=0;return Z}const H=q(2*W),z=q(2*W),U=V(),j=V(),Y=V(),G=!1;function K(Q,Z,te,re,le){function me(ye,Le,Ee=" "){for(;ye.lengthme(ye,3)).join("|")} -`;for(let ye=0;ye<=te;ye++)ye===0?Ce+=" |":Ce+=`${Z[ye-1]}|`,Ce+=Q[ye].slice(0,le+1).map(Le=>me(Le.toString(),3)).join("|")+` -`;return Ce}function R(Q,Z,te,re){Q=Q.substr(Z),te=te.substr(re),console.log(K(j,Q,Q.length,te,te.length)),console.log(K(Y,Q,Q.length,te,te.length)),console.log(K(U,Q,Q.length,te,te.length))}function J(Q,Z){if(Z<0||Z>=Q.length)return!1;const te=Q.codePointAt(Z);switch(te){case 95:case 45:case 46:case 32:case 47:case 92:case 39:case 34:case 58:case 36:case 60:case 62:case 40:case 41:case 91:case 93:case 123:case 125:return!0;case void 0:return!1;default:return!!I.isEmojiImprecise(te)}}function ie(Q,Z){if(Z<0||Z>=Q.length)return!1;switch(Q.charCodeAt(Z)){case 32:case 9:return!0;default:return!1}}function ue(Q,Z,te){return Z[Q]!==te[Q]}function he(Q,Z,te,re,le,me,Ce=!1){for(;ZW?W:Q.length,Le=re.length>W?W:re.length;if(te>=ye||me>=Le||ye-te>Le-me||!he(Z,te,ye,le,me,Le,!0))return;de(ye,Le,te,me,Z,le);let Ee=1,Me=1,Ae=te,Ne=me;const Ke=[!1];for(Ee=1,Ae=te;AeFe,Te=we?j[Ee][Me-1]+(U[Ee][Me-1]>0?-5:0):0,Pe=Ne>Fe+1&&U[Ee][Me-1]>0,Be=Pe?j[Ee][Me-2]+(U[Ee][Me-2]>0?-5:0):0;if(Pe&&(!we||Be>=Te)&&(!be||Be>=ve))j[Ee][Me]=Be,Y[Ee][Me]=3,U[Ee][Me]=0;else if(we&&(!be||Te>=ve))j[Ee][Me]=Te,Y[Ee][Me]=2,U[Ee][Me]=0;else if(be)j[Ee][Me]=ve,Y[Ee][Me]=1,U[Ee][Me]=U[Ee-1][Me-1]+1;else throw new Error("not possible")}}if(G&&R(Q,te,re,me),!Ke[0]&&!Ce.firstMatchCanBeWeak)return;Ee--,Me--;const ze=[j[Ee][Me],me];let Ge=0,it=0;for(;Ee>=1;){let Fe=Me;do{const fe=Y[Ee][Fe];if(fe===3)Fe=Fe-2;else if(fe===2)Fe=Fe-1;else break}while(Fe>=1);Ge>1&&Z[te+Ee-1]===le[me+Me-1]&&!ue(Fe+me-1,re,le)&&Ge+1>U[Ee][Fe]&&(Fe=Me),Fe===Me?Ge++:Ge=1,it||(it=Fe),Ee--,Me=Fe-1,ze.push(Me)}Le-me===ye&&Ce.boostFullMatch&&(ze[0]+=2);const Oe=it-ye;return ze[0]-=Oe,ze}function de(Q,Z,te,re,le,me){let Ce=Q-1,ye=Z-1;for(;Ce>=te&&ye>=re;)le[Ce]===me[ye]&&(z[Ce]=ye,Ce--),ye--}function ge(Q,Z,te,re,le,me,Ce,ye,Le,Ee,Me){if(Z[te]!==me[Ce])return Number.MIN_SAFE_INTEGER;let Ae=1,Ne=!1;return Ce===te-re?Ae=Q[te]===le[Ce]?7:5:ue(Ce,le,me)&&(Ce===0||!ue(Ce-1,le,me))?(Ae=Q[te]===le[Ce]?7:5,Ne=!0):J(me,Ce)&&(Ce===0||!J(me,Ce-1))?Ae=5:(J(me,Ce-1)||ie(me,Ce-1))&&(Ae=5,Ne=!0),Ae>1&&te===re&&(Me[0]=!0),Ne||(Ne=ue(Ce,le,me)||J(me,Ce-1)||ie(me,Ce-1)),te===re?Ce>Le&&(Ae-=Ne?3:5):Ee?Ae+=Ne?2:0:Ae+=Ne?0:1,Ce+1===ye&&(Ae-=Ne?3:5),Ae}function X(Q,Z,te,re,le,me,Ce){return B(Q,Z,te,re,le,me,!0,Ce)}function B(Q,Z,te,re,le,me,Ce,ye){let Le=ee(Q,Z,te,re,le,me,ye);if(Le&&!Ce)return Le;if(Q.length>=3){const Ee=Math.min(7,Q.length-1);for(let Me=te+1;MeLe[0])&&(Le=Ne))}}}return Le}function $(Q,Z){if(Z+1>=Q.length)return;const te=Q[Z],re=Q[Z+1];if(te!==re)return Q.slice(0,Z)+re+te+Q.slice(Z+2)}}),define(ne[129],se([1,0,11]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StringSHA1=void 0,e.hash=k,e.doHash=I,e.numberHash=E,e.stringHash=m,e.toHexString=t;function k(s){return I(s,0)}function I(s,g){switch(typeof s){case"object":return s===null?E(349,g):Array.isArray(s)?_(s,g):b(s,g);case"string":return m(s,g);case"boolean":return y(s,g);case"number":return E(s,g);case"undefined":return E(937,g);default:return E(617,g)}}function E(s,g){return(g<<5)-g+s|0}function y(s,g){return E(s?433:863,g)}function m(s,g){g=E(149417,g);for(let c=0,l=s.length;cI(l,c),g)}function b(s,g){return g=E(181387,g),Object.keys(s).sort().reduce((c,l)=>(c=m(l,c),I(s[l],c)),g)}function p(s,g,c=32){const l=c-g,a=~((1<>>l)>>>0}function n(s,g=0,c=s.byteLength,l=0){for(let a=0;ac.toString(16).padStart(2,"0")).join(""):o((s>>>0).toString(16),g/4)}class i{static{this._bigBlock32=new DataView(new ArrayBuffer(320))}constructor(){this._h0=1732584193,this._h1=4023233417,this._h2=2562383102,this._h3=271733878,this._h4=3285377520,this._buff=new Uint8Array(67),this._buffDV=new DataView(this._buff.buffer),this._buffLen=0,this._totalLen=0,this._leftoverHighSurrogate=0,this._finished=!1}update(g){const c=g.length;if(c===0)return;const l=this._buff;let a=this._buffLen,r=this._leftoverHighSurrogate,u,C;for(r!==0?(u=r,C=-1,r=0):(u=g.charCodeAt(0),C=0);;){let f=u;if(d.isHighSurrogate(u))if(C+1>>6,g[c++]=128|(l&63)>>>0):l<65536?(g[c++]=224|(l&61440)>>>12,g[c++]=128|(l&4032)>>>6,g[c++]=128|(l&63)>>>0):(g[c++]=240|(l&1835008)>>>18,g[c++]=128|(l&258048)>>>12,g[c++]=128|(l&4032)>>>6,g[c++]=128|(l&63)>>>0),c>=64&&(this._step(),c-=64,this._totalLen+=64,g[0]=g[64],g[1]=g[65],g[2]=g[66]),c}digest(){return this._finished||(this._finished=!0,this._leftoverHighSurrogate&&(this._leftoverHighSurrogate=0,this._buffLen=this._push(this._buff,this._buffLen,65533)),this._totalLen+=this._buffLen,this._wrapUp()),t(this._h0)+t(this._h1)+t(this._h2)+t(this._h3)+t(this._h4)}_wrapUp(){this._buff[this._buffLen++]=128,n(this._buff,this._buffLen),this._buffLen>56&&(this._step(),n(this._buff));const g=8*this._totalLen;this._buffDV.setUint32(56,Math.floor(g/4294967296),!1),this._buffDV.setUint32(60,g%4294967296,!1),this._step()}_step(){const g=i._bigBlock32,c=this._buffDV;for(let w=0;w<64;w+=4)g.setUint32(w,c.getUint32(w,!1),!1);for(let w=64;w<320;w+=4)g.setUint32(w,p(g.getUint32(w-12,!1)^g.getUint32(w-32,!1)^g.getUint32(w-56,!1)^g.getUint32(w-64,!1),1),!1);let l=this._h0,a=this._h1,r=this._h2,u=this._h3,C=this._h4,f,h,v;for(let w=0;w<80;w++)w<20?(f=a&r|~a&u,h=1518500249):w<40?(f=a^r^u,h=1859775393):w<60?(f=a&r|a&u|r&u,h=2400959708):(f=a^r^u,h=3395469782),v=p(l,5)+f+C+h+g.getUint32(w*4,!1)&4294967295,C=u,u=r,r=p(a,30),a=l,l=v;this._h0=this._h0+l&4294967295,this._h1=this._h1+a&4294967295,this._h2=this._h2+r&4294967295,this._h3=this._h3+u&4294967295,this._h4=this._h4+C&4294967295}}e.StringSHA1=i}),define(ne[190],se([1,0,444,129]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LcsDiff=e.StringDiffSequence=void 0,e.stringDiff=E;class I{constructor(n){this.source=n}getElements(){const n=this.source,o=new Int32Array(n.length);for(let t=0,i=n.length;t0||this.m_modifiedCount>0)&&this.m_changes.push(new d.DiffChange(this.m_originalStart,this.m_originalCount,this.m_modifiedStart,this.m_modifiedCount)),this.m_originalCount=0,this.m_modifiedCount=0,this.m_originalStart=1073741824,this.m_modifiedStart=1073741824}AddOriginalElement(n,o){this.m_originalStart=Math.min(this.m_originalStart,n),this.m_modifiedStart=Math.min(this.m_modifiedStart,o),this.m_originalCount++}AddModifiedElement(n,o){this.m_originalStart=Math.min(this.m_originalStart,n),this.m_modifiedStart=Math.min(this.m_modifiedStart,o),this.m_modifiedCount++}getChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes}getReverseChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes.reverse(),this.m_changes}}class b{constructor(n,o,t=null){this.ContinueProcessingPredicate=t,this._originalSequence=n,this._modifiedSequence=o;const[i,s,g]=b._getElements(n),[c,l,a]=b._getElements(o);this._hasStrings=g&&a,this._originalStringElements=i,this._originalElementsOrHash=s,this._modifiedStringElements=c,this._modifiedElementsOrHash=l,this.m_forwardHistory=[],this.m_reverseHistory=[]}static _isStringArray(n){return n.length>0&&typeof n[0]=="string"}static _getElements(n){const o=n.getElements();if(b._isStringArray(o)){const t=new Int32Array(o.length);for(let i=0,s=o.length;i=n&&i>=t&&this.ElementsAreEqual(o,i);)o--,i--;if(n>o||t>i){let u;return t<=i?(y.Assert(n===o+1,"originalStart should only be one more than originalEnd"),u=[new d.DiffChange(n,0,t,i-t+1)]):n<=o?(y.Assert(t===i+1,"modifiedStart should only be one more than modifiedEnd"),u=[new d.DiffChange(n,o-n+1,t,0)]):(y.Assert(n===o+1,"originalStart should only be one more than originalEnd"),y.Assert(t===i+1,"modifiedStart should only be one more than modifiedEnd"),u=[]),u}const g=[0],c=[0],l=this.ComputeRecursionPoint(n,o,t,i,g,c,s),a=g[0],r=c[0];if(l!==null)return l;if(!s[0]){const u=this.ComputeDiffRecursive(n,a,t,r,s);let C=[];return s[0]?C=[new d.DiffChange(a+1,o-(a+1)+1,r+1,i-(r+1)+1)]:C=this.ComputeDiffRecursive(a+1,o,r+1,i,s),this.ConcatenateChanges(u,C)}return[new d.DiffChange(n,o-n+1,t,i-t+1)]}WALKTRACE(n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S,L){let D=null,T=null,M=new _,A=o,P=t,N=f[0]-w[0]-i,O=-1073741824,F=this.m_forwardHistory.length-1;do{const x=N+n;x===A||x=0&&(a=this.m_forwardHistory[F],n=a[0],A=1,P=a.length-1)}while(--F>=-1);if(D=M.getReverseChanges(),L[0]){let x=f[0]+1,W=w[0]+1;if(D!==null&&D.length>0){const V=D[D.length-1];x=Math.max(x,V.getOriginalEnd()),W=Math.max(W,V.getModifiedEnd())}T=[new d.DiffChange(x,C-x+1,W,v-W+1)]}else{M=new _,A=g,P=c,N=f[0]-w[0]-l,O=1073741824,F=S?this.m_reverseHistory.length-1:this.m_reverseHistory.length-2;do{const x=N+s;x===A||x=r[x+1]?(u=r[x+1]-1,h=u-N-l,u>O&&M.MarkNextChange(),O=u+1,M.AddOriginalElement(u+1,h+1),N=x+1-s):(u=r[x-1],h=u-N-l,u>O&&M.MarkNextChange(),O=u,M.AddModifiedElement(u+1,h+1),N=x-1-s),F>=0&&(r=this.m_reverseHistory[F],s=r[0],A=1,P=r.length-1)}while(--F>=-1);T=M.getChanges()}return this.ConcatenateChanges(D,T)}ComputeRecursionPoint(n,o,t,i,s,g,c){let l=0,a=0,r=0,u=0,C=0,f=0;n--,t--,s[0]=0,g[0]=0,this.m_forwardHistory=[],this.m_reverseHistory=[];const h=o-n+(i-t),v=h+1,w=new Int32Array(v),S=new Int32Array(v),L=i-t,D=o-n,T=n-t,M=o-i,P=(D-L)%2===0;w[L]=n,S[D]=o,c[0]=!1;for(let N=1;N<=h/2+1;N++){let O=0,F=0;r=this.ClipDiagonalBound(L-N,N,L,v),u=this.ClipDiagonalBound(L+N,N,L,v);for(let W=r;W<=u;W+=2){W===r||WO+F&&(O=l,F=a),!P&&Math.abs(W-D)<=N-1&&l>=S[W])return s[0]=l,g[0]=a,V<=S[W]&&N<=1448?this.WALKTRACE(L,r,u,T,D,C,f,M,w,S,l,o,s,a,i,g,P,c):null}const x=(O-n+(F-t)-N)/2;if(this.ContinueProcessingPredicate!==null&&!this.ContinueProcessingPredicate(O,x))return c[0]=!0,s[0]=O,g[0]=F,x>0&&N<=1448?this.WALKTRACE(L,r,u,T,D,C,f,M,w,S,l,o,s,a,i,g,P,c):(n++,t++,[new d.DiffChange(n,o-n+1,t,i-t+1)]);C=this.ClipDiagonalBound(D-N,N,D,v),f=this.ClipDiagonalBound(D+N,N,D,v);for(let W=C;W<=f;W+=2){W===C||W=S[W+1]?l=S[W+1]-1:l=S[W-1],a=l-(W-D)-M;const V=l;for(;l>n&&a>t&&this.ElementsAreEqual(l,a);)l--,a--;if(S[W]=l,P&&Math.abs(W-L)<=N&&l<=w[W])return s[0]=l,g[0]=a,V>=w[W]&&N<=1448?this.WALKTRACE(L,r,u,T,D,C,f,M,w,S,l,o,s,a,i,g,P,c):null}if(N<=1447){let W=new Int32Array(u-r+2);W[0]=L-r+1,m.Copy2(w,r,W,1,u-r+1),this.m_forwardHistory.push(W),W=new Int32Array(f-C+2),W[0]=D-C+1,m.Copy2(S,C,W,1,f-C+1),this.m_reverseHistory.push(W)}}return this.WALKTRACE(L,r,u,T,D,C,f,M,w,S,l,o,s,a,i,g,P,c)}PrettifyChanges(n){for(let o=0;o0,c=t.modifiedLength>0;for(;t.originalStart+t.originalLength=0;o--){const t=n[o];let i=0,s=0;if(o>0){const u=n[o-1];i=u.originalStart+u.originalLength,s=u.modifiedStart+u.modifiedLength}const g=t.originalLength>0,c=t.modifiedLength>0;let l=0,a=this._boundaryScore(t.originalStart,t.originalLength,t.modifiedStart,t.modifiedLength);for(let u=1;;u++){const C=t.originalStart-u,f=t.modifiedStart-u;if(Ca&&(a=v,l=u)}t.originalStart-=l,t.modifiedStart-=l;const r=[null];if(o>0&&this.ChangesOverlap(n[o-1],n[o],r)){n[o-1]=r[0],n.splice(o,1),o++;continue}}if(this._hasStrings)for(let o=1,t=n.length;o0&&f>l&&(l=f,a=u,r=C)}return l>0?[a,r]:null}_contiguousSequenceScore(n,o,t){let i=0;for(let s=0;s=this._originalElementsOrHash.length-1?!0:this._hasStrings&&/^\s*$/.test(this._originalStringElements[n])}_OriginalRegionIsBoundary(n,o){if(this._OriginalIsBoundary(n)||this._OriginalIsBoundary(n-1))return!0;if(o>0){const t=n+o;if(this._OriginalIsBoundary(t-1)||this._OriginalIsBoundary(t))return!0}return!1}_ModifiedIsBoundary(n){return n<=0||n>=this._modifiedElementsOrHash.length-1?!0:this._hasStrings&&/^\s*$/.test(this._modifiedStringElements[n])}_ModifiedRegionIsBoundary(n,o){if(this._ModifiedIsBoundary(n)||this._ModifiedIsBoundary(n-1))return!0;if(o>0){const t=n+o;if(this._ModifiedIsBoundary(t-1)||this._ModifiedIsBoundary(t))return!0}return!1}_boundaryScore(n,o,t,i){const s=this._OriginalRegionIsBoundary(n,o)?1:0,g=this._ModifiedRegionIsBoundary(t,i)?1:0;return s+g}ConcatenateChanges(n,o){const t=[];if(n.length===0||o.length===0)return o.length>0?o:n;if(this.ChangesOverlap(n[n.length-1],o[0],t)){const i=new Array(n.length+o.length-1);return m.Copy(n,0,i,0,n.length-1),i[n.length-1]=t[0],m.Copy(o,1,i,n.length,o.length-1),i}else{const i=new Array(n.length+o.length);return m.Copy(n,0,i,0,n.length),m.Copy(o,0,i,n.length,o.length),i}}ChangesOverlap(n,o,t){if(y.Assert(n.originalStart<=o.originalStart,"Left change is not less than or equal to right change"),y.Assert(n.modifiedStart<=o.modifiedStart,"Left change is not less than or equal to right change"),n.originalStart+n.originalLength>=o.originalStart||n.modifiedStart+n.modifiedLength>=o.modifiedStart){const i=n.originalStart;let s=n.originalLength;const g=n.modifiedStart;let c=n.modifiedLength;return n.originalStart+n.originalLength>=o.originalStart&&(s=o.originalStart+o.originalLength-n.originalStart),n.modifiedStart+n.modifiedLength>=o.modifiedStart&&(c=o.modifiedStart+o.modifiedLength-n.modifiedStart),t[0]=new d.DiffChange(i,s,g,c),!0}else return t[0]=null,!1}ClipDiagonalBound(n,o,t,i){if(n>=0&&n0?m[0].toUpperCase()+m.substr(1):y[0][0].toUpperCase()!==y[0][0]&&m.length>0?m[0].toLowerCase()+m.substr(1):m}else return m}function I(y,m,_){return y[0].indexOf(_)!==-1&&m.indexOf(_)!==-1&&y[0].split(_).length===m.split(_).length}function E(y,m,_){const b=m.split(_),p=y[0].split(_);let n="";return b.forEach((o,t)=>{n+=k([p[t]],o)+_}),n.slice(0,-1)}}),define(ne[111],se([1,0,11]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var k;(function(I){I[I.Ignore=0]="Ignore",I[I.Info=1]="Info",I[I.Warning=2]="Warning",I[I.Error=3]="Error"})(k||(k={})),function(I){const E="error",y="warning",m="warn",_="info",b="ignore";function p(o){return o?d.equalsIgnoreCase(E,o)?I.Error:d.equalsIgnoreCase(y,o)||d.equalsIgnoreCase(m,o)?I.Warning:d.equalsIgnoreCase(_,o)?I.Info:I.Ignore:I.Ignore}I.fromValue=p;function n(o){switch(o){case I.Error:return E;case I.Warning:return y;case I.Info:return _;default:return b}}I.toString=n}(k||(k={})),e.default=k}),define(ne[301],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MicrotaskDelay=void 0,e.MicrotaskDelay=Symbol("MicrotaskDelay")}),define(ne[225],se([1,0,11]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TernarySearchTree=e.UriIterator=e.PathIterator=e.ConfigKeysIterator=e.StringIterator=void 0;class k{constructor(){this._value="",this._pos=0}reset(p){return this._value=p,this._pos=0,this}next(){return this._pos+=1,this}hasNext(){return this._pos=0;n--,this._valueLen--){const o=this._value.charCodeAt(n);if(!(o===47||this._splitOnBackslash&&o===92))break}return this.next()}hasNext(){return this._to!1,n=()=>!1){return new _(new y(p,n))}static forStrings(){return new _(new k)}static forConfigKeys(){return new _(new I)}constructor(p){this._iter=p}clear(){this._root=void 0}set(p,n){const o=this._iter.reset(p);let t;this._root||(this._root=new m,this._root.segment=o.value());const i=[];for(t=this._root;;){const g=o.cmp(t.segment);if(g>0)t.left||(t.left=new m,t.left.segment=o.value()),i.push([-1,t]),t=t.left;else if(g<0)t.right||(t.right=new m,t.right.segment=o.value()),i.push([1,t]),t=t.right;else if(o.hasNext())o.next(),t.mid||(t.mid=new m,t.mid.segment=o.value()),i.push([0,t]),t=t.mid;else break}const s=t.value;t.value=n,t.key=p;for(let g=i.length-1;g>=0;g--){const c=i[g][1];c.updateHeight();const l=c.balanceFactor();if(l<-1||l>1){const a=i[g][0],r=i[g+1][0];if(a===1&&r===1)i[g][1]=c.rotateLeft();else if(a===-1&&r===-1)i[g][1]=c.rotateRight();else if(a===1&&r===-1)c.right=i[g+1][1]=i[g+1][1].rotateRight(),i[g][1]=c.rotateLeft();else if(a===-1&&r===1)c.left=i[g+1][1]=i[g+1][1].rotateLeft(),i[g][1]=c.rotateRight();else throw new Error;if(g>0)switch(i[g-1][0]){case-1:i[g-1][1].left=i[g][1];break;case 1:i[g-1][1].right=i[g][1];break;case 0:i[g-1][1].mid=i[g][1];break}else this._root=i[0][1]}}return s}get(p){return this._getNode(p)?.value}_getNode(p){const n=this._iter.reset(p);let o=this._root;for(;o;){const t=n.cmp(o.segment);if(t>0)o=o.left;else if(t<0)o=o.right;else if(n.hasNext())n.next(),o=o.mid;else break}return o}has(p){const n=this._getNode(p);return!(n?.value===void 0&&n?.mid===void 0)}delete(p){return this._delete(p,!1)}deleteSuperstr(p){return this._delete(p,!0)}_delete(p,n){const o=this._iter.reset(p),t=[];let i=this._root;for(;i;){const s=o.cmp(i.segment);if(s>0)t.push([-1,i]),i=i.left;else if(s<0)t.push([1,i]),i=i.right;else if(o.hasNext())o.next(),t.push([0,i]),i=i.mid;else break}if(i){if(n?(i.left=void 0,i.mid=void 0,i.right=void 0,i.height=1):(i.key=void 0,i.value=void 0),!i.mid&&!i.value)if(i.left&&i.right){const s=this._min(i.right);if(s.key){const{key:g,value:c,segment:l}=s;this._delete(s.key,!1),i.key=g,i.value=c,i.segment=l}}else{const s=i.left??i.right;if(t.length>0){const[g,c]=t[t.length-1];switch(g){case-1:c.left=s;break;case 0:c.mid=s;break;case 1:c.right=s;break}}else this._root=s}for(let s=t.length-1;s>=0;s--){const g=t[s][1];g.updateHeight();const c=g.balanceFactor();if(c>1?(g.right.balanceFactor()>=0||(g.right=g.right.rotateRight()),t[s][1]=g.rotateLeft()):c<-1&&(g.left.balanceFactor()<=0||(g.left=g.left.rotateLeft()),t[s][1]=g.rotateRight()),s>0)switch(t[s-1][0]){case-1:t[s-1][1].left=t[s][1];break;case 1:t[s-1][1].right=t[s][1];break;case 0:t[s-1][1].mid=t[s][1];break}else this._root=t[0][1]}}}_min(p){for(;p.left;)p=p.left;return p}findSubstr(p){const n=this._iter.reset(p);let o=this._root,t;for(;o;){const i=n.cmp(o.segment);if(i>0)o=o.left;else if(i<0)o=o.right;else if(n.hasNext())n.next(),t=o.value||t,o=o.mid;else break}return o&&o.value||t}findSuperstr(p){return this._findSuperstrOrElement(p,!1)}_findSuperstrOrElement(p,n){const o=this._iter.reset(p);let t=this._root;for(;t;){const i=o.cmp(t.segment);if(i>0)t=t.left;else if(i<0)t=t.right;else if(o.hasNext())o.next(),t=t.mid;else return t.mid?this._entries(t.mid):n?t.value:void 0}}forEach(p){for(const[n,o]of this)p(o,n)}*[Symbol.iterator](){yield*this._entries(this._root)}_entries(p){const n=[];return this._dfsEntries(p,n),n[Symbol.iterator]()}_dfsEntries(p,n){p&&(p.left&&this._dfsEntries(p.left,n),p.value&&n.push([p.key,p.value]),p.mid&&this._dfsEntries(p.mid,n),p.right&&this._dfsEntries(p.right,n))}}e.TernarySearchTree=_}),define(ne[456],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TfIdfCalculator=void 0,e.normalizeTfIdfScores=I;function d(E){const y=new Map;for(const m of E)y.set(m,(y.get(m)??0)+1);return y}class k{constructor(){this.chunkCount=0,this.chunkOccurrences=new Map,this.documents=new Map}calculateScores(y,m){const _=this.computeEmbedding(y),b=new Map,p=[];for(const[n,o]of this.documents){if(m.isCancellationRequested)return[];for(const t of o.chunks){const i=this.computeSimilarityScore(t,_,b);i>0&&p.push({key:n,score:i})}}return p}static termFrequencies(y){return d(k.splitTerms(y))}static*splitTerms(y){const m=_=>_.toLowerCase();for(const[_]of y.matchAll(/\b\p{Letter}[\p{Letter}\d]{2,}\b/gu)){yield m(_);const b=_.replace(/([a-z])([A-Z])/g,"$1 $2").split(/\s+/g);if(b.length>1)for(const p of b)p.length>2&&/\p{Letter}{3,}/gu.test(p)&&(yield m(p))}}updateDocuments(y){for(const{key:m}of y)this.deleteDocument(m);for(const m of y){const _=[];for(const b of m.textChunks){const p=k.termFrequencies(b);for(const n of p.keys())this.chunkOccurrences.set(n,(this.chunkOccurrences.get(n)??0)+1);_.push({text:b,tf:p})}this.chunkCount+=_.length,this.documents.set(m.key,{chunks:_})}return this}deleteDocument(y){const m=this.documents.get(y);if(m){this.documents.delete(y),this.chunkCount-=m.chunks.length;for(const _ of m.chunks)for(const b of _.tf.keys()){const p=this.chunkOccurrences.get(b);if(typeof p=="number"){const n=p-1;n<=0?this.chunkOccurrences.delete(b):this.chunkOccurrences.set(b,n)}}}}computeSimilarityScore(y,m,_){let b=0;for(const[p,n]of Object.entries(m)){const o=y.tf.get(p);if(!o)continue;let t=_.get(p);typeof t!="number"&&(t=this.computeIdf(p),_.set(p,t));const i=o*t;b+=i*n}return b}computeEmbedding(y){const m=k.termFrequencies(y);return this.computeTfidf(m)}computeIdf(y){const m=this.chunkOccurrences.get(y)??0;return m>0?Math.log((this.chunkCount+1)/m):0}computeTfidf(y){const m=Object.create(null);for(const[_,b]of y){const p=this.computeIdf(_);p>0&&(m[_]=b*p)}return m}}e.TfIdfCalculator=k;function I(E){const y=E.slice(0);y.sort((_,b)=>b.score-_.score);const m=y[0]?.score??0;if(m>0)for(const _ of y)_.score/=m;return y}}),define(ne[19],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isString=d,e.isObject=k,e.isTypedArray=I,e.isNumber=E,e.isIterable=y,e.isBoolean=m,e.isUndefined=_,e.isDefined=b,e.isUndefinedOrNull=p,e.assertType=n,e.assertIsDefined=o,e.isFunction=t,e.validateConstraints=i,e.validateConstraint=s;function d(g){return typeof g=="string"}function k(g){return typeof g=="object"&&g!==null&&!Array.isArray(g)&&!(g instanceof RegExp)&&!(g instanceof Date)}function I(g){const c=Object.getPrototypeOf(Uint8Array);return typeof g=="object"&&g instanceof c}function E(g){return typeof g=="number"&&!isNaN(g)}function y(g){return!!g&&typeof g[Symbol.iterator]=="function"}function m(g){return g===!0||g===!1}function _(g){return typeof g>"u"}function b(g){return!p(g)}function p(g){return _(g)||g===null}function n(g,c){if(!g)throw new Error(c?`Unexpected type, expected '${c}'`:"Unexpected type")}function o(g){if(p(g))throw new Error("Assertion Failed: argument is undefined or null");return g}function t(g){return typeof g=="function"}function i(g,c){const l=Math.min(g.length,c.length);for(let a=0;a{i[s]=g&&typeof g=="object"?k(g):g}),i}function I(t){if(!t||typeof t!="object")return t;const i=[t];for(;i.length>0;){const s=i.shift();Object.freeze(s);for(const g in s)if(E.call(s,g)){const c=s[g];typeof c=="object"&&!Object.isFrozen(c)&&!(0,d.isTypedArray)(c)&&i.push(c)}}return t}const E=Object.prototype.hasOwnProperty;function y(t,i){return m(t,i,new Set)}function m(t,i,s){if((0,d.isUndefinedOrNull)(t))return t;const g=i(t);if(typeof g<"u")return g;if(Array.isArray(t)){const c=[];for(const l of t)c.push(m(l,i,s));return c}if((0,d.isObject)(t)){if(s.has(t))throw new Error("Cannot clone recursive data-structure");s.add(t);const c={};for(const l in t)E.call(t,l)&&(c[l]=m(t[l],i,s));return s.delete(t),c}return t}function _(t,i,s=!0){return(0,d.isObject)(t)?((0,d.isObject)(i)&&Object.keys(i).forEach(g=>{g in t?s&&((0,d.isObject)(t[g])&&(0,d.isObject)(i[g])?_(t[g],i[g],s):t[g]=i[g]):t[g]=i[g]}),t):i}function b(t,i){if(t===i)return!0;if(t==null||i===null||i===void 0||typeof t!=typeof i||typeof t!="object"||Array.isArray(t)!==Array.isArray(i))return!1;let s,g;if(Array.isArray(t)){if(t.length!==i.length)return!1;for(s=0;sfunction(){const l=Array.prototype.slice.call(arguments,0);return i(c,l)},g={};for(const c of t)g[c]=s(c);return g}}),define(ne[30],se([1,0,26]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ThemeIcon=e.ThemeColor=void 0;var k;(function(E){function y(m){return m&&typeof m=="object"&&typeof m.id=="string"}E.isThemeColor=y})(k||(e.ThemeColor=k={}));var I;(function(E){E.iconNameSegment="[A-Za-z0-9]+",E.iconNameExpression="[A-Za-z0-9-]+",E.iconModifierExpression="~[A-Za-z]+",E.iconNameCharacter="[A-Za-z0-9~-]";const y=new RegExp(`^(${E.iconNameExpression})(${E.iconModifierExpression})?$`);function m(c){const l=y.exec(c.id);if(!l)return m(d.Codicon.error);const[,a,r]=l,u=["codicon","codicon-"+a];return r&&u.push("codicon-modifier-"+r.substring(1)),u}E.asClassNameArray=m;function _(c){return m(c).join(" ")}E.asClassName=_;function b(c){return"."+m(c).join(".")}E.asCSSSelector=b;function p(c){return c&&typeof c=="object"&&typeof c.id=="string"&&(typeof c.color>"u"||k.isThemeColor(c.color))}E.isThemeIcon=p;const n=new RegExp(`^\\$\\((${E.iconNameExpression}(?:${E.iconModifierExpression})?)\\)$`);function o(c){const l=n.exec(c);if(!l)return;const[,a]=l;return{id:a}}E.fromString=o;function t(c){return{id:c}}E.fromId=t;function i(c,l){let a=c.id;const r=a.lastIndexOf("~");return r!==-1&&(a=a.substring(0,r)),l&&(a=`${a}~${l}`),{id:a}}E.modify=i;function s(c){const l=c.id.lastIndexOf("~");if(l!==-1)return c.id.substring(l+1)}E.getModifier=s;function g(c,l){return c.id===l.id&&c.color?.id===l.color?.id}E.isEqual=g})(I||(e.ThemeIcon=I={}))}),define(ne[142],se([1,0,82,11,30]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.escapeIcons=_,e.markdownEscapeEscapedIcons=p,e.stripIcons=o,e.getCodiconAriaLabel=t,e.parseLabelWithIcons=s,e.matchesFuzzyIconAware=g;const E="$(",y=new RegExp(`\\$\\(${I.ThemeIcon.iconNameExpression}(?:${I.ThemeIcon.iconModifierExpression})?\\)`,"g"),m=new RegExp(`(\\\\)?${y.source}`,"g");function _(c){return c.replace(m,(l,a)=>a?l:`\\${l}`)}const b=new RegExp(`\\\\${y.source}`,"g");function p(c){return c.replace(b,l=>`\\${l}`)}const n=new RegExp(`(\\s)?(\\\\)?${y.source}(\\s)?`,"g");function o(c){return c.indexOf(E)===-1?c:c.replace(n,(l,a,r,u)=>r?l:a||u||"")}function t(c){return c?c.replace(/\$\((.*?)\)/g,(l,a)=>` ${a} `).trim():""}const i=new RegExp(`\\$\\(${I.ThemeIcon.iconNameCharacter}+\\)`,"g");function s(c){i.lastIndex=0;let l="";const a=[];let r=0;for(;;){const u=i.lastIndex,C=i.exec(c),f=c.substring(u,C?.index);if(f.length>0){l+=f;for(let h=0;h255?255:I|0}function k(I){return I<0?0:I>4294967295?4294967295:I|0}}),define(ne[193],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.generateUuid=void 0,e.generateUuid=function(){if(typeof crypto=="object"&&typeof crypto.randomUUID=="function")return crypto.randomUUID.bind(crypto);let d;typeof crypto=="object"&&typeof crypto.getRandomValues=="function"?d=crypto.getRandomValues.bind(crypto):d=function(E){for(let y=0;yn,asFile:()=>{},value:typeof n=="string"?n:void 0}}function y(n,o,t){const i={id:(0,I.generateUuid)(),name:n,uri:o,data:t};return{asString:async()=>"",asFile:()=>i,value:void 0}}class m{constructor(){this._entries=new Map}get size(){let o=0;for(const t of this._entries)o++;return o}has(o){return this._entries.has(this.toKey(o))}matches(o){const t=[...this._entries.keys()];return k.Iterable.some(this,([i,s])=>s.asFile())&&t.push("files"),p(_(o),t)}get(o){return this._entries.get(this.toKey(o))?.[0]}append(o,t){const i=this._entries.get(o);i?i.push(t):this._entries.set(this.toKey(o),[t])}replace(o,t){this._entries.set(this.toKey(o),[t])}delete(o){this._entries.delete(this.toKey(o))}*[Symbol.iterator](){for(const[o,t]of this._entries)for(const i of t)yield[o,i]}toKey(o){return _(o)}}e.VSDataTransfer=m;function _(n){return n.toLowerCase()}function b(n,o){return p(_(n),o.map(_))}function p(n,o){if(n==="*/*")return o.length>0;if(o.includes(n))return!0;const t=n.match(/^([a-z]+)\/([a-z]+|\*)$/i);if(!t)return!1;const[i,s,g]=t;return g==="*"?o.some(c=>c.startsWith(s+"/")):!1}e.UriList=Object.freeze({create:n=>(0,d.distinct)(n.map(o=>o.toString())).join(`\r -`),split:n=>n.split(`\r -`),parse:n=>e.UriList.split(n).filter(o=>!o.startsWith("#"))})}),define(ne[302],se([10]),{}),define(ne[458],se([10]),{}),define(ne[459],se([10]),{}),define(ne[460],se([10]),{}),define(ne[461],se([10]),{}),define(ne[195],se([1,0,460,461]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0})}),define(ne[462],se([10]),{}),define(ne[463],se([10]),{}),define(ne[303],se([10]),{}),define(ne[304],se([10]),{}),define(ne[464],se([10]),{}),define(ne[465],se([10]),{}),define(ne[466],se([10]),{}),define(ne[467],se([10]),{}),define(ne[305],se([10]),{}),define(ne[468],se([10]),{}),define(ne[226],se([1,0,468]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME=void 0,e.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME="monaco-mouse-cursor-text"}),define(ne[469],se([10]),{}),define(ne[470],se([10]),{}),define(ne[471],se([10]),{}),define(ne[472],se([10]),{}),define(ne[473],se([10]),{}),define(ne[474],se([10]),{}),define(ne[475],se([10]),{}),define(ne[476],se([10]),{}),define(ne[477],se([10]),{}),define(ne[478],se([10]),{}),define(ne[479],se([10]),{}),define(ne[480],se([10]),{}),define(ne[481],se([10]),{}),define(ne[482],se([10]),{}),define(ne[483],se([10]),{}),define(ne[484],se([10]),{}),define(ne[485],se([10]),{}),define(ne[486],se([10]),{}),define(ne[487],se([10]),{}),define(ne[488],se([10]),{}),define(ne[489],se([10]),{}),define(ne[490],se([10]),{}),define(ne[491],se([10]),{}),define(ne[492],se([10]),{}),define(ne[493],se([10]),{}),define(ne[494],se([10]),{}),define(ne[495],se([10]),{}),define(ne[496],se([10]),{}),define(ne[497],se([10]),{}),define(ne[498],se([10]),{}),define(ne[499],se([10]),{}),define(ne[500],se([10]),{}),define(ne[501],se([10]),{}),define(ne[502],se([10]),{}),define(ne[503],se([10]),{}),define(ne[504],se([10]),{}),define(ne[505],se([10]),{}),define(ne[506],se([10]),{}),define(ne[227],se([10]),{}),define(ne[507],se([10]),{}),define(ne[508],se([10]),{}),define(ne[509],se([10]),{}),define(ne[510],se([10]),{}),define(ne[511],se([10]),{}),define(ne[512],se([10]),{}),define(ne[513],se([10]),{}),define(ne[514],se([10]),{}),define(ne[196],se([10]),{}),define(ne[515],se([10]),{}),define(ne[516],se([10]),{}),define(ne[517],se([10]),{}),define(ne[518],se([10]),{}),define(ne[519],se([10]),{}),define(ne[520],se([10]),{}),define(ne[521],se([10]),{}),define(ne[522],se([10]),{}),define(ne[523],se([10]),{}),define(ne[524],se([10]),{}),define(ne[525],se([10]),{}),define(ne[526],se([10]),{}),define(ne[527],se([10]),{}),define(ne[528],se([10]),{}),define(ne[529],se([10]),{}),define(ne[530],se([10]),{}),define(ne[531],se([10]),{}),define(ne[532],se([10]),{}),define(ne[533],se([10]),{}),define(ne[534],se([10]),{}),define(ne[535],se([10]),{}),define(ne[536],se([10]),{}),define(ne[537],se([10]),{}),define(ne[538],se([10]),{}),define(ne[539],se([10]),{}),define(ne[540],se([10]),{}),define(ne[541],se([10]),{}),define(ne[306],se([10]),{}),define(ne[542],se([10]),{}),define(ne[543],se([10]),{}),define(ne[228],se([10]),{}),define(ne[544],se([10]),{}),define(ne[74],se([1,0,39]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.applyFontInfo=k;function k(I,E){I instanceof d.FastDomNode?(I.setFontFamily(E.getMassagedFontFamily()),I.setFontWeight(E.fontWeight),I.setFontSize(E.fontSize),I.setFontFeatureSettings(E.fontFeatureSettings),I.setFontVariationSettings(E.fontVariationSettings),I.setLineHeight(E.lineHeight),I.setLetterSpacing(E.letterSpacing)):(I.style.fontFamily=E.getMassagedFontFamily(),I.style.fontWeight=E.fontWeight,I.style.fontSize=E.fontSize+"px",I.style.fontFeatureSettings=E.fontFeatureSettings,I.style.fontVariationSettings=E.fontVariationSettings,I.style.lineHeight=E.lineHeight+"px",I.style.letterSpacing=E.letterSpacing+"px")}}),define(ne[545],se([1,0,74]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CharWidthRequest=void 0,e.readCharWidths=E;class k{constructor(m,_){this.chr=m,this.type=_,this.width=0}fulfill(m){this.width=m}}e.CharWidthRequest=k;class I{constructor(m,_){this._bareFontInfo=m,this._requests=_,this._container=null,this._testElements=null}read(m){this._createDomElements(),m.document.body.appendChild(this._container),this._readFromDomElements(),this._container?.remove(),this._container=null,this._testElements=null}_createDomElements(){const m=document.createElement("div");m.style.position="absolute",m.style.top="-50000px",m.style.width="50000px";const _=document.createElement("div");(0,d.applyFontInfo)(_,this._bareFontInfo),m.appendChild(_);const b=document.createElement("div");(0,d.applyFontInfo)(b,this._bareFontInfo),b.style.fontWeight="bold",m.appendChild(b);const p=document.createElement("div");(0,d.applyFontInfo)(p,this._bareFontInfo),p.style.fontStyle="italic",m.appendChild(p);const n=[];for(const o of this._requests){let t;o.type===0&&(t=_),o.type===2&&(t=b),o.type===1&&(t=p),t.appendChild(document.createElement("br"));const i=document.createElement("span");I._render(i,o),t.appendChild(i),n.push(i)}this._container=m,this._testElements=n}static _render(m,_){if(_.chr===" "){let b="\xA0";for(let p=0;p<8;p++)b+=b;m.innerText=b}else{let b=_.chr;for(let p=0;p<8;p++)b+=b;m.textContent=b}}_readFromDomElements(){for(let m=0,_=this._requests.length;m<_;m++){const b=this._requests[m],p=this._testElements[m];b.fulfill(p.offsetWidth/256)}}}function E(y,m,_){new I(m,_).read(y)}}),define(ne[546],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorSettingMigration=void 0,e.migrateOptions=E;class d{static{this.items=[]}constructor(_,b){this.key=_,this.migrate=b}apply(_){const b=d._read(_,this.key),p=o=>d._read(_,o),n=(o,t)=>d._write(_,o,t);this.migrate(b,p,n)}static _read(_,b){if(typeof _>"u")return;const p=b.indexOf(".");if(p>=0){const n=b.substring(0,p);return this._read(_[n],b.substring(p+1))}return _[b]}static _write(_,b,p){const n=b.indexOf(".");if(n>=0){const o=b.substring(0,n);_[o]=_[o]||{},this._write(_[o],b.substring(n+1),p);return}_[b]=p}}e.EditorSettingMigration=d;function k(m,_){d.items.push(new d(m,_))}function I(m,_){k(m,(b,p,n)=>{if(typeof b<"u"){for(const[o,t]of _)if(b===o){n(m,t);return}}})}function E(m){d.items.forEach(_=>_.apply(m))}I("wordWrap",[[!0,"on"],[!1,"off"]]),I("lineNumbers",[[!0,"on"],[!1,"off"]]),I("cursorBlinking",[["visible","solid"]]),I("renderWhitespace",[[!0,"boundary"],[!1,"none"]]),I("renderLineHighlight",[[!0,"line"],[!1,"none"]]),I("acceptSuggestionOnEnter",[[!0,"on"],[!1,"off"]]),I("tabCompletion",[[!1,"off"],[!0,"onlySnippets"]]),I("hover",[[!0,{enabled:!0}],[!1,{enabled:!1}]]),I("parameterHints",[[!0,{enabled:!0}],[!1,{enabled:!1}]]),I("autoIndent",[[!1,"advanced"],[!0,"full"]]),I("matchBrackets",[[!0,"always"],[!1,"never"]]),I("renderFinalNewline",[[!0,"on"],[!1,"off"]]),I("cursorSmoothCaretAnimation",[[!0,"on"],[!1,"off"]]),I("occurrencesHighlight",[[!0,"singleFile"],[!1,"off"]]),I("wordBasedSuggestions",[[!0,"matchingDocuments"],[!1,"off"]]),k("autoClosingBrackets",(m,_,b)=>{m===!1&&(b("autoClosingBrackets","never"),typeof _("autoClosingQuotes")>"u"&&b("autoClosingQuotes","never"),typeof _("autoSurround")>"u"&&b("autoSurround","never"))}),k("renderIndentGuides",(m,_,b)=>{typeof m<"u"&&(b("renderIndentGuides",void 0),typeof _("guides.indentation")>"u"&&b("guides.indentation",!!m))}),k("highlightActiveIndentGuide",(m,_,b)=>{typeof m<"u"&&(b("highlightActiveIndentGuide",void 0),typeof _("guides.highlightActiveIndentation")>"u"&&b("guides.highlightActiveIndentation",!!m))});const y={method:"showMethods",function:"showFunctions",constructor:"showConstructors",deprecated:"showDeprecated",field:"showFields",variable:"showVariables",class:"showClasses",struct:"showStructs",interface:"showInterfaces",module:"showModules",property:"showProperties",event:"showEvents",operator:"showOperators",unit:"showUnits",value:"showValues",constant:"showConstants",enum:"showEnums",enumMember:"showEnumMembers",keyword:"showKeywords",text:"showWords",color:"showColors",file:"showFiles",reference:"showReferences",folder:"showFolders",typeParameter:"showTypeParameters",snippet:"showSnippets"};k("suggest.filteredTypes",(m,_,b)=>{if(m&&typeof m=="object"){for(const p of Object.entries(y))m[p[0]]===!1&&typeof _(`suggest.${p[1]}`)>"u"&&b(`suggest.${p[1]}`,!1);b("suggest.filteredTypes",void 0)}}),k("quickSuggestions",(m,_,b)=>{if(typeof m=="boolean"){const p=m?"on":"off";b("quickSuggestions",{comments:p,strings:p,other:p})}}),k("experimental.stickyScroll.enabled",(m,_,b)=>{typeof m=="boolean"&&(b("experimental.stickyScroll.enabled",void 0),typeof _("stickyScroll.enabled")>"u"&&b("stickyScroll.enabled",m))}),k("experimental.stickyScroll.maxLineCount",(m,_,b)=>{typeof m=="number"&&(b("experimental.stickyScroll.maxLineCount",void 0),typeof _("stickyScroll.maxLineCount")>"u"&&b("stickyScroll.maxLineCount",m))}),k("codeActionsOnSave",(m,_,b)=>{if(m&&typeof m=="object"){let p=!1;const n={};for(const o of Object.entries(m))typeof o[1]=="boolean"?(p=!0,n[o[0]]=o[1]?"explicit":"never"):n[o[0]]=o[1];p&&b("codeActionsOnSave",n)}}),k("codeActionWidget.includeNearbyQuickfixes",(m,_,b)=>{typeof m=="boolean"&&(b("codeActionWidget.includeNearbyQuickfixes",void 0),typeof _("codeActionWidget.includeNearbyQuickFixes")>"u"&&b("codeActionWidget.includeNearbyQuickFixes",m))}),k("lightbulb.enabled",(m,_,b)=>{typeof m=="boolean"&&b("lightbulb.enabled",m?void 0:"off")})}),define(ne[229],se([1,0,6]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TabFocus=void 0;class k{constructor(){this._tabFocus=!1,this._onDidChangeTabFocus=new d.Emitter,this.onDidChangeTabFocus=this._onDidChangeTabFocus.event}getTabFocusMode(){return this._tabFocus}setTabFocusMode(E){this._tabFocus=E,this._onDidChangeTabFocus.fire(this._tabFocus)}}e.TabFocus=new k}),define(ne[143],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StableEditorScrollState=void 0;class d{static capture(I){if(I.getScrollTop()===0||I.hasPendingScrollAnimation())return new d(I.getScrollTop(),I.getContentHeight(),null,0,null);let E=null,y=0;const m=I.getVisibleRanges();if(m.length>0){E=m[0].getStartPosition();const _=I.getTopForPosition(E.lineNumber,E.column);y=I.getScrollTop()-_}return new d(I.getScrollTop(),I.getContentHeight(),E,y,I.getPosition())}constructor(I,E,y,m,_){this._initialScrollTop=I,this._initialContentHeight=E,this._visiblePosition=y,this._visiblePositionScrollDelta=m,this._cursorPosition=_}restore(I){if(!(this._initialContentHeight===I.getContentHeight()&&this._initialScrollTop===I.getScrollTop())&&this._visiblePosition){const E=I.getTopForPosition(this._visiblePosition.lineNumber,this._visiblePosition.column);I.setScrollTop(E+this._visiblePositionScrollDelta)}}restoreRelativeVerticalPositionOfCursor(I){if(this._initialContentHeight===I.getContentHeight()&&this._initialScrollTop===I.getScrollTop())return;const E=I.getPosition();if(!this._cursorPosition||!E)return;const y=I.getTopForLineNumber(E.lineNumber)-I.getTopForLineNumber(this._cursorPosition.lineNumber);I.setScrollTop(I.getScrollTop()+y,1)}}e.StableEditorScrollState=d}),define(ne[164],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.VisibleRanges=e.HorizontalPosition=e.FloatHorizontalRange=e.HorizontalRange=e.LineVisibleRanges=e.RenderingContext=e.RestrictedRenderingContext=void 0;class d{constructor(p,n){this._restrictedRenderingContextBrand=void 0,this._viewLayout=p,this.viewportData=n,this.scrollWidth=this._viewLayout.getScrollWidth(),this.scrollHeight=this._viewLayout.getScrollHeight(),this.visibleRange=this.viewportData.visibleRange,this.bigNumbersDelta=this.viewportData.bigNumbersDelta;const o=this._viewLayout.getCurrentViewport();this.scrollTop=o.top,this.scrollLeft=o.left,this.viewportWidth=o.width,this.viewportHeight=o.height}getScrolledTopFromAbsoluteTop(p){return p-this.scrollTop}getVerticalOffsetForLineNumber(p,n){return this._viewLayout.getVerticalOffsetForLineNumber(p,n)}getVerticalOffsetAfterLineNumber(p,n){return this._viewLayout.getVerticalOffsetAfterLineNumber(p,n)}getDecorationsInViewport(){return this.viewportData.getDecorationsInViewport()}}e.RestrictedRenderingContext=d;class k extends d{constructor(p,n,o){super(p,n),this._renderingContextBrand=void 0,this._viewLines=o}linesVisibleRangesForRange(p,n){return this._viewLines.linesVisibleRangesForRange(p,n)}visibleRangeForPosition(p){return this._viewLines.visibleRangeForPosition(p)}}e.RenderingContext=k;class I{constructor(p,n,o,t){this.outsideRenderedLine=p,this.lineNumber=n,this.ranges=o,this.continuesOnNextLine=t}}e.LineVisibleRanges=I;class E{static from(p){const n=new Array(p.length);for(let o=0,t=p.length;o=n.left?_.width=Math.max(_.width,n.left+n.width-_.left):(y[m++]=_,_=n)}return y[m++]=_,y}static _createHorizontalRangesFromClientRects(E,y,m){if(!E||E.length===0)return null;const _=[];for(let b=0,p=E.length;bo)return null;if(y=Math.min(o,Math.max(0,y)),_=Math.min(o,Math.max(0,_)),y===_&&m===b&&m===0&&!E.children[y].firstChild){const g=E.children[y].getClientRects();return p.markDidDomLayout(),this._createHorizontalRangesFromClientRects(g,p.clientRectDeltaLeft,p.clientRectScale)}y!==_&&_>0&&b===0&&(_--,b=1073741824);let t=E.children[y].firstChild,i=E.children[_].firstChild;if((!t||!i)&&(!t&&m===0&&y>0&&(t=E.children[y-1].firstChild,m=1073741824),!i&&b===0&&_>0&&(i=E.children[_-1].firstChild,b=1073741824)),!t||!i)return null;m=Math.min(t.textContent.length,Math.max(0,m)),b=Math.min(i.textContent.length,Math.max(0,b));const s=this._readClientRects(t,m,i,b,p.endNode);return p.markDidDomLayout(),this._createHorizontalRangesFromClientRects(s,p.clientRectDeltaLeft,p.clientRectScale)}}e.RangeUtil=k}),define(ne[307],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getCharIndex=e.allCharCodes=void 0,e.allCharCodes=(()=>{const k=[];for(let I=32;I<=126;I++)k.push(I);return k.push(65533),k})();const d=(k,I)=>(k-=32,k<0||k>96?I<=2?(k+96)%96:95:k);e.getCharIndex=d}),define(ne[549],se([1,0,307,192]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MinimapCharRenderer=void 0;class I{constructor(y,m){this.scale=m,this._minimapCharRendererBrand=void 0,this.charDataNormal=I.soften(y,12/15),this.charDataLight=I.soften(y,50/60)}static soften(y,m){const _=new Uint8ClampedArray(y.length);for(let b=0,p=y.length;by.width||_+a>y.height){console.warn("bad render request outside image data");return}const r=s?this.charDataLight:this.charDataNormal,u=(0,d.getCharIndex)(b,i),C=y.width*4,f=o.r,h=o.g,v=o.b,w=p.r-f,S=p.g-h,L=p.b-v,D=Math.max(n,t),T=y.data;let M=u*c*l,A=_*C+m*4;for(let P=0;Py.width||_+g>y.height){console.warn("bad render request outside image data");return}const c=y.width*4,l=.5*(p/255),a=n.r,r=n.g,u=n.b,C=b.r-a,f=b.g-r,h=b.b-u,v=a+C*l,w=r+f*l,S=u+h*l,L=Math.max(p,o),D=y.data;let T=_*c+m*4;for(let M=0;M{const y=new Uint8ClampedArray(E.length/2);for(let m=0;m>1]=k[E[m]]<<4|k[E[m+1]]&15;return y};e.prebakedMiniMaps={1:(0,d.createSingleCallFunction)(()=>I("0000511D6300CF609C709645A78432005642574171487021003C451900274D35D762755E8B629C5BA856AF57BA649530C167D1512A272A3F6038604460398526BCA2A968DB6F8957C768BE5FBE2FB467CF5D8D5B795DC7625B5DFF50DE64C466DB2FC47CD860A65E9A2EB96CB54CE06DA763AB2EA26860524D3763536601005116008177A8705E53AB738E6A982F88BAA35B5F5B626D9C636B449B737E5B7B678598869A662F6B5B8542706C704C80736A607578685B70594A49715A4522E792")),2:(0,d.createSingleCallFunction)(()=>I("000000000000000055394F383D2800008B8B1F210002000081B1CBCBCC820000847AAF6B9AAF2119BE08B8881AD60000A44FD07DCCF107015338130C00000000385972265F390B406E2437634B4B48031B12B8A0847000001E15B29A402F0000000000004B33460B00007A752C2A0000000000004D3900000084394B82013400ABA5CFC7AD9C0302A45A3E5A98AB000089A43382D97900008BA54AA087A70A0248A6A7AE6DBE0000BF6F94987EA40A01A06DCFA7A7A9030496C32F77891D0000A99FB1A0AFA80603B29AB9CA75930D010C0948354D3900000C0948354F37460D0028BE673D8400000000AF9D7B6E00002B007AA8933400007AA642675C2700007984CFB9C3985B768772A8A6B7B20000CAAECAAFC4B700009F94A6009F840009D09F9BA4CA9C0000CC8FC76DC87F0000C991C472A2000000A894A48CA7B501079BA2C9C69BA20000B19A5D3FA89000005CA6009DA2960901B0A7F0669FB200009D009E00B7890000DAD0F5D092820000D294D4C48BD10000B5A7A4A3B1A50402CAB6CBA6A2000000B5A7A4A3B1A8044FCDADD19D9CB00000B7778F7B8AAE0803C9AB5D3F5D3F00009EA09EA0BAB006039EA0989A8C7900009B9EF4D6B7C00000A9A7816CACA80000ABAC84705D3F000096DA635CDC8C00006F486F266F263D4784006124097B00374F6D2D6D2D6D4A3A95872322000000030000000000008D8939130000000000002E22A5C9CBC70600AB25C0B5C9B400061A2DB04CA67001082AA6BEBEBFC606002321DACBC19E03087AA08B6768380000282FBAC0B8CA7A88AD25BBA5A29900004C396C5894A6000040485A6E356E9442A32CD17EADA70000B4237923628600003E2DE9C1D7B500002F25BBA5A2990000231DB6AFB4A804023025C0B5CAB588062B2CBDBEC0C706882435A75CA20000002326BD6A82A908048B4B9A5A668000002423A09CB4BB060025259C9D8A7900001C1FCAB2C7C700002A2A9387ABA200002626A4A47D6E9D14333163A0C87500004B6F9C2D643A257049364936493647358A34438355497F1A0000A24C1D590000D38DFFBDD4CD3126"))}}),define(ne[551],se([1,0,549,307,550,192]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MinimapCharRendererFactory=void 0;class y{static create(_,b){if(this.lastCreated&&_===this.lastCreated.scale&&b===this.lastFontFamily)return this.lastCreated;let p;return I.prebakedMiniMaps[_]?p=new d.MinimapCharRenderer(I.prebakedMiniMaps[_](),_):p=y.createFromSampleData(y.createSampleData(b).data,_),this.lastFontFamily=b,this.lastCreated=p,p}static createSampleData(_){const b=document.createElement("canvas"),p=b.getContext("2d");b.style.height="16px",b.height=16,b.width=96*10,b.style.width=96*10+"px",p.fillStyle="#ffffff",p.font=`bold 16px ${_}`,p.textBaseline="middle";let n=0;for(const o of k.allCharCodes)p.fillText(String.fromCharCode(o),n,16/2),n+=10;return p.getImageData(0,0,96*10,16)}static createFromSampleData(_,b){if(_.length!==61440)throw new Error("Unexpected source in MinimapCharRenderer");const n=y._downsample(_,b);return new d.MinimapCharRenderer(n,b)}static _downsampleChar(_,b,p,n,o){const t=1*o,i=2*o;let s=n,g=0;for(let c=0;c0){const g=255/s;for(let c=0;cthis._itemData.get(m).getId()===I.getId())??y[0],this._unused.delete(E),this._itemData.set(E,I),E.setData(I)}return this._used.add(E),{object:E,dispose:()=>{this._used.delete(E),this._unused.size>5?E.dispose():this._unused.add(E)}}}dispose(){for(const I of this._used)I.dispose();for(const I of this._unused)I.dispose();this._used.clear(),this._unused.clear()}}e.ObjectPool=d}),define(ne[308],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.diffEditorDefaultOptions=void 0,e.diffEditorDefaultOptions={enableSplitViewResizing:!0,splitViewDefaultRatio:.5,renderSideBySide:!0,renderMarginRevertIcon:!0,renderGutterMenu:!0,maxComputationTime:5e3,maxFileSize:50,ignoreTrimWhitespace:!0,renderIndicators:!0,originalEditable:!1,diffCodeLens:!1,renderOverviewRuler:!0,diffWordWrap:"inherit",diffAlgorithm:"advanced",accessibilityVerbose:!1,experimental:{showMoves:!1,showEmptyDecorations:!0,useTrueInlineView:!1},hideUnchangedRegions:{enabled:!1,contextLineCount:3,minimumLineCount:3,revealLineCount:20},isInEmbeddedEditor:!1,onlyShowAccessibleDiffViewer:!1,renderSideBySideInlineBreakpoint:900,useInlineViewWhenSpaceIsLimited:!0,compactMode:!1}}),define(ne[165],se([1,0,6]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorZoom=void 0,e.EditorZoom=new class{constructor(){this._zoomLevel=0,this._onDidChangeZoomLevel=new d.Emitter,this.onDidChangeZoomLevel=this._onDidChangeZoomLevel.event}getZoomLevel(){return this._zoomLevel}setZoomLevel(k){k=Math.min(Math.max(-5,k),20),this._zoomLevel!==k&&(this._zoomLevel=k,this._onDidChangeZoomLevel.fire(this._zoomLevel))}}}),define(ne[144],se([1,0,192]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CharacterSet=e.CharacterClassifier=void 0;class k{constructor(y){const m=(0,d.toUint8)(y);this._defaultValue=m,this._asciiMap=k._createAsciiMap(m),this._map=new Map}static _createAsciiMap(y){const m=new Uint8Array(256);return m.fill(y),m}set(y,m){const _=(0,d.toUint8)(m);y>=0&&y<256?this._asciiMap[y]=_:this._map.set(y,_)}get(y){return y>=0&&y<256?this._asciiMap[y]:this._map.get(y)||this._defaultValue}clear(){this._asciiMap.fill(this._defaultValue),this._map.clear()}}e.CharacterClassifier=k;class I{constructor(){this._actual=new k(0)}add(y){this._actual.set(y,1)}has(y){return this._actual.get(y)===1}clear(){return this._actual.clear()}}e.CharacterSet=I}),define(ne[94],se([1,0,11]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CursorColumns=void 0;class k{static _nextVisibleColumn(E,y,m){return E===9?k.nextRenderTabStop(y,m):d.isFullWidthCharacter(E)||d.isEmojiImprecise(E)?y+2:y+1}static visibleColumnFromColumn(E,y,m){const _=Math.min(y-1,E.length),b=E.substring(0,_),p=new d.GraphemeIterator(b);let n=0;for(;!p.eol();){const o=d.getNextCodePoint(b,_,p.offset);p.nextGraphemeLength(),n=this._nextVisibleColumn(o,n,m)}return n}static columnFromVisibleColumn(E,y,m){if(y<=0)return 1;const _=E.length,b=new d.GraphemeIterator(E);let p=0,n=1;for(;!b.eol();){const o=d.getNextCodePoint(E,_,b.offset);b.nextGraphemeLength();const t=this._nextVisibleColumn(o,p,m),i=b.offset+1;if(t>=y){const s=y-p;return t-ym))return new k(y,m)}static ofLength(y){return new k(0,y)}static ofStartAndLength(y,m){return new k(y,y+m)}constructor(y,m){if(this.start=y,this.endExclusive=m,y>m)throw new d.BugIndicatingError(`Invalid range: ${this.toString()}`)}get isEmpty(){return this.start===this.endExclusive}delta(y){return new k(this.start+y,this.endExclusive+y)}deltaStart(y){return new k(this.start+y,this.endExclusive)}deltaEnd(y){return new k(this.start,this.endExclusive+y)}get length(){return this.endExclusive-this.start}toString(){return`[${this.start}, ${this.endExclusive})`}contains(y){return this.start<=y&&y=y.endExclusive}slice(y){return y.slice(this.start,this.endExclusive)}substring(y){return y.substring(this.start,this.endExclusive)}clip(y){if(this.isEmpty)throw new d.BugIndicatingError(`Invalid clipping range: ${this.toString()}`);return Math.max(this.start,Math.min(this.endExclusive-1,y))}clipCyclic(y){if(this.isEmpty)throw new d.BugIndicatingError(`Invalid clipping range: ${this.toString()}`);return y=this.endExclusive?this.start+(y-this.start)%this.length:y}forEach(y){for(let m=this.start;my.toString()).join(", ")}intersectsStrict(y){let m=0;for(;my+m.length,0)}}e.OffsetRangeSet=I}),define(ne[9],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Position=void 0;class d{constructor(I,E){this.lineNumber=I,this.column=E}with(I=this.lineNumber,E=this.column){return I===this.lineNumber&&E===this.column?this:new d(I,E)}delta(I=0,E=0){return this.with(this.lineNumber+I,this.column+E)}equals(I){return d.equals(this,I)}static equals(I,E){return!I&&!E?!0:!!I&&!!E&&I.lineNumber===E.lineNumber&&I.column===E.column}isBefore(I){return d.isBefore(this,I)}static isBefore(I,E){return I.lineNumberm||E===m&&y>_?(this.startLineNumber=m,this.startColumn=_,this.endLineNumber=E,this.endColumn=y):(this.startLineNumber=E,this.startColumn=y,this.endLineNumber=m,this.endColumn=_)}isEmpty(){return k.isEmpty(this)}static isEmpty(E){return E.startLineNumber===E.endLineNumber&&E.startColumn===E.endColumn}containsPosition(E){return k.containsPosition(this,E)}static containsPosition(E,y){return!(y.lineNumberE.endLineNumber||y.lineNumber===E.startLineNumber&&y.columnE.endColumn)}static strictContainsPosition(E,y){return!(y.lineNumberE.endLineNumber||y.lineNumber===E.startLineNumber&&y.column<=E.startColumn||y.lineNumber===E.endLineNumber&&y.column>=E.endColumn)}containsRange(E){return k.containsRange(this,E)}static containsRange(E,y){return!(y.startLineNumberE.endLineNumber||y.endLineNumber>E.endLineNumber||y.startLineNumber===E.startLineNumber&&y.startColumnE.endColumn)}strictContainsRange(E){return k.strictContainsRange(this,E)}static strictContainsRange(E,y){return!(y.startLineNumberE.endLineNumber||y.endLineNumber>E.endLineNumber||y.startLineNumber===E.startLineNumber&&y.startColumn<=E.startColumn||y.endLineNumber===E.endLineNumber&&y.endColumn>=E.endColumn)}plusRange(E){return k.plusRange(this,E)}static plusRange(E,y){let m,_,b,p;return y.startLineNumberE.endLineNumber?(b=y.endLineNumber,p=y.endColumn):y.endLineNumber===E.endLineNumber?(b=y.endLineNumber,p=Math.max(y.endColumn,E.endColumn)):(b=E.endLineNumber,p=E.endColumn),new k(m,_,b,p)}intersectRanges(E){return k.intersectRanges(this,E)}static intersectRanges(E,y){let m=E.startLineNumber,_=E.startColumn,b=E.endLineNumber,p=E.endColumn;const n=y.startLineNumber,o=y.startColumn,t=y.endLineNumber,i=y.endColumn;return mt?(b=t,p=i):b===t&&(p=Math.min(p,i)),m>b||m===b&&_>p?null:new k(m,_,b,p)}equalsRange(E){return k.equalsRange(this,E)}static equalsRange(E,y){return!E&&!y?!0:!!E&&!!y&&E.startLineNumber===y.startLineNumber&&E.startColumn===y.startColumn&&E.endLineNumber===y.endLineNumber&&E.endColumn===y.endColumn}getEndPosition(){return k.getEndPosition(this)}static getEndPosition(E){return new d.Position(E.endLineNumber,E.endColumn)}getStartPosition(){return k.getStartPosition(this)}static getStartPosition(E){return new d.Position(E.startLineNumber,E.startColumn)}toString(){return"["+this.startLineNumber+","+this.startColumn+" -> "+this.endLineNumber+","+this.endColumn+"]"}setEndPosition(E,y){return new k(this.startLineNumber,this.startColumn,E,y)}setStartPosition(E,y){return new k(E,y,this.endLineNumber,this.endColumn)}collapseToStart(){return k.collapseToStart(this)}static collapseToStart(E){return new k(E.startLineNumber,E.startColumn,E.startLineNumber,E.startColumn)}collapseToEnd(){return k.collapseToEnd(this)}static collapseToEnd(E){return new k(E.endLineNumber,E.endColumn,E.endLineNumber,E.endColumn)}delta(E){return new k(this.startLineNumber+E,this.startColumn,this.endLineNumber+E,this.endColumn)}static fromPositions(E,y=E){return new k(E.lineNumber,E.column,y.lineNumber,y.column)}static lift(E){return E?new k(E.startLineNumber,E.startColumn,E.endLineNumber,E.endColumn):null}static isIRange(E){return E&&typeof E.startLineNumber=="number"&&typeof E.startColumn=="number"&&typeof E.endLineNumber=="number"&&typeof E.endColumn=="number"}static areIntersectingOrTouching(E,y){return!(E.endLineNumberE.startLineNumber}toJSON(){return this}}e.Range=k}),define(ne[310],se([1,0,11,4]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PagedScreenReaderStrategy=e.TextAreaState=e._debugComposition=void 0,e._debugComposition=!1;class I{static{this.EMPTY=new I("",0,0,null,void 0)}constructor(m,_,b,p,n){this.value=m,this.selectionStart=_,this.selectionEnd=b,this.selection=p,this.newlineCountBeforeSelection=n}toString(){return`[ <${this.value}>, selectionStart: ${this.selectionStart}, selectionEnd: ${this.selectionEnd}]`}static readFromTextArea(m,_){const b=m.getValue(),p=m.getSelectionStart(),n=m.getSelectionEnd();let o;if(_){const t=b.substring(0,p),i=_.value.substring(0,_.selectionStart);t===i&&(o=_.newlineCountBeforeSelection)}return new I(b,p,n,null,o)}collapseSelection(){return this.selectionStart===this.value.length?this:new I(this.value,this.value.length,this.value.length,null,void 0)}writeToTextArea(m,_,b){e._debugComposition&&console.log(`writeToTextArea ${m}: ${this.toString()}`),_.setValue(m,this.value),b&&_.setSelectionRange(m,this.selectionStart,this.selectionEnd)}deduceEditorPosition(m){if(m<=this.selectionStart){const p=this.value.substring(m,this.selectionStart);return this._finishDeduceEditorPosition(this.selection?.getStartPosition()??null,p,-1)}if(m>=this.selectionEnd){const p=this.value.substring(this.selectionEnd,m);return this._finishDeduceEditorPosition(this.selection?.getEndPosition()??null,p,1)}const _=this.value.substring(this.selectionStart,m);if(_.indexOf("\u2026")===-1)return this._finishDeduceEditorPosition(this.selection?.getStartPosition()??null,_,1);const b=this.value.substring(m,this.selectionEnd);return this._finishDeduceEditorPosition(this.selection?.getEndPosition()??null,b,-1)}_finishDeduceEditorPosition(m,_,b){let p=0,n=-1;for(;(n=_.indexOf(` -`,n+1))!==-1;)p++;return[m,b*_.length,p]}static deduceInput(m,_,b){if(!m)return{text:"",replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:0};e._debugComposition&&(console.log("------------------------deduceInput"),console.log(`PREVIOUS STATE: ${m.toString()}`),console.log(`CURRENT STATE: ${_.toString()}`));const p=Math.min(d.commonPrefixLength(m.value,_.value),m.selectionStart,_.selectionStart),n=Math.min(d.commonSuffixLength(m.value,_.value),m.value.length-m.selectionEnd,_.value.length-_.selectionEnd),o=m.value.substring(p,m.value.length-n),t=_.value.substring(p,_.value.length-n),i=m.selectionStart-p,s=m.selectionEnd-p,g=_.selectionStart-p,c=_.selectionEnd-p;if(e._debugComposition&&(console.log(`AFTER DIFFING PREVIOUS STATE: <${o}>, selectionStart: ${i}, selectionEnd: ${s}`),console.log(`AFTER DIFFING CURRENT STATE: <${t}>, selectionStart: ${g}, selectionEnd: ${c}`)),g===c){const a=m.selectionStart-p;return e._debugComposition&&console.log(`REMOVE PREVIOUS: ${a} chars`),{text:t,replacePrevCharCnt:a,replaceNextCharCnt:0,positionDelta:0}}const l=s-i;return{text:t,replacePrevCharCnt:l,replaceNextCharCnt:0,positionDelta:0}}static deduceAndroidCompositionInput(m,_){if(!m)return{text:"",replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:0};if(e._debugComposition&&(console.log("------------------------deduceAndroidCompositionInput"),console.log(`PREVIOUS STATE: ${m.toString()}`),console.log(`CURRENT STATE: ${_.toString()}`)),m.value===_.value)return{text:"",replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:_.selectionEnd-m.selectionEnd};const b=Math.min(d.commonPrefixLength(m.value,_.value),m.selectionEnd),p=Math.min(d.commonSuffixLength(m.value,_.value),m.value.length-m.selectionEnd),n=m.value.substring(b,m.value.length-p),o=_.value.substring(b,_.value.length-p),t=m.selectionStart-b,i=m.selectionEnd-b,s=_.selectionStart-b,g=_.selectionEnd-b;return e._debugComposition&&(console.log(`AFTER DIFFING PREVIOUS STATE: <${n}>, selectionStart: ${t}, selectionEnd: ${i}`),console.log(`AFTER DIFFING CURRENT STATE: <${o}>, selectionStart: ${s}, selectionEnd: ${g}`)),{text:o,replacePrevCharCnt:i,replaceNextCharCnt:n.length-i,positionDelta:g-o.length}}}e.TextAreaState=I;class E{static _getPageOfLine(m,_){return Math.floor((m-1)/_)}static _getRangeForPage(m,_){const b=m*_,p=b+1,n=b+_;return new k.Range(p,1,n+1,1)}static fromEditorSelection(m,_,b,p){const o=E._getPageOfLine(_.startLineNumber,b),t=E._getRangeForPage(o,b),i=E._getPageOfLine(_.endLineNumber,b),s=E._getRangeForPage(i,b);let g=t.intersectRanges(new k.Range(1,1,_.startLineNumber,_.startColumn));if(p&&m.getValueLengthInRange(g,1)>500){const f=m.modifyPosition(g.getEndPosition(),-500);g=k.Range.fromPositions(f,g.getEndPosition())}const c=m.getValueInRange(g,1),l=m.getLineCount(),a=m.getLineMaxColumn(l);let r=s.intersectRanges(new k.Range(_.endLineNumber,_.endColumn,l,a));if(p&&m.getValueLengthInRange(r,1)>500){const f=m.modifyPosition(r.getStartPosition(),500);r=k.Range.fromPositions(r.getStartPosition(),f)}const u=m.getValueInRange(r,1);let C;if(o===i||o+1===i)C=m.getValueInRange(_,1);else{const f=t.intersectRanges(_),h=s.intersectRanges(_);C=m.getValueInRange(f,1)+"\u2026"+m.getValueInRange(h,1)}return p&&C.length>2*500&&(C=C.substring(0,500)+"\u2026"+C.substring(C.length-500,C.length)),new I(c+C+u,c.length,c.length+C.length,_,g.endLineNumber-g.startLineNumber)}}e.PagedScreenReaderStrategy=E}),define(ne[75],se([1,0,4]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditOperation=void 0;class k{static insert(E,y){return{range:new d.Range(E.lineNumber,E.column,E.lineNumber,E.column),text:y,forceMoveMarkers:!0}}static delete(E){return{range:E,text:null}}static replace(E,y){return{range:E,text:y}}static replaceMove(E,y){return{range:E,text:y,forceMoveMarkers:!0}}}e.EditOperation=k}),define(ne[554],se([1,0,11,75,4]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TrimTrailingWhitespaceCommand=void 0,e.trimTrailingWhitespace=y;class E{constructor(_,b,p){this._selection=_,this._cursors=b,this._selectionId=null,this._trimInRegexesAndStrings=p}getEditOperations(_,b){const p=y(_,this._cursors,this._trimInRegexesAndStrings);for(let n=0,o=p.length;ni.lineNumber===s.lineNumber?i.column-s.column:i.lineNumber-s.lineNumber);for(let i=_.length-2;i>=0;i--)_[i].lineNumber===_[i+1].lineNumber&&_.splice(i,1);const p=[];let n=0,o=0;const t=_.length;for(let i=1,s=m.getLineCount();i<=s;i++){const g=m.getLineContent(i),c=g.length+1;let l=0;if(op)throw new d.BugIndicatingError(`startLineNumber ${b} cannot be after endLineNumberExclusive ${p}`);this.startLineNumber=b,this.endLineNumberExclusive=p}contains(b){return this.startLineNumber<=b&&bo.endLineNumberExclusive>=b.startLineNumber),n=(0,E.findLastIdxMonotonous)(this._normalizedRanges,o=>o.startLineNumber<=b.endLineNumberExclusive)+1;if(p===n)this._normalizedRanges.splice(p,0,b);else if(p===n-1){const o=this._normalizedRanges[p];this._normalizedRanges[p]=o.join(b)}else{const o=this._normalizedRanges[p].join(this._normalizedRanges[n-1]).join(b);this._normalizedRanges.splice(p,n-p,o)}}contains(b){const p=(0,E.findLastMonotonous)(this._normalizedRanges,n=>n.startLineNumber<=b);return!!p&&p.endLineNumberExclusive>b}intersects(b){const p=(0,E.findLastMonotonous)(this._normalizedRanges,n=>n.startLineNumberb.startLineNumber}getUnion(b){if(this._normalizedRanges.length===0)return b;if(b._normalizedRanges.length===0)return this;const p=[];let n=0,o=0,t=null;for(;n=i.startLineNumber?t=new y(t.startLineNumber,Math.max(t.endLineNumberExclusive,i.endLineNumberExclusive)):(p.push(t),t=i)}return t!==null&&p.push(t),new m(p)}subtractFrom(b){const p=(0,E.findFirstIdxMonotonousOrArrLen)(this._normalizedRanges,i=>i.endLineNumberExclusive>=b.startLineNumber),n=(0,E.findLastIdxMonotonous)(this._normalizedRanges,i=>i.startLineNumber<=b.endLineNumberExclusive)+1;if(p===n)return new m([b]);const o=[];let t=b.startLineNumber;for(let i=p;it&&o.push(new y(t,s.startLineNumber)),t=s.endLineNumberExclusive}return tb.toString()).join(", ")}getIntersection(b){const p=[];let n=0,o=0;for(;np.delta(b)))}}e.LineRangeSet=m}),define(ne[311],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RGBA8=void 0;class d{static{this.Empty=new d(0,0,0,0)}constructor(I,E,y,m){this._rgba8Brand=void 0,this.r=d._clamp(I),this.g=d._clamp(E),this.b=d._clamp(y),this.a=d._clamp(m)}equals(I){return this.r===I.r&&this.g===I.g&&this.b===I.b&&this.a===I.a}static _clamp(I){return I<0?0:I>255?255:I|0}}e.RGBA8=d}),define(ne[23],se([1,0,9,4]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Selection=void 0;class I extends k.Range{constructor(y,m,_,b){super(y,m,_,b),this.selectionStartLineNumber=y,this.selectionStartColumn=m,this.positionLineNumber=_,this.positionColumn=b}toString(){return"["+this.selectionStartLineNumber+","+this.selectionStartColumn+" -> "+this.positionLineNumber+","+this.positionColumn+"]"}equalsSelection(y){return I.selectionsEqual(this,y)}static selectionsEqual(y,m){return y.selectionStartLineNumber===m.selectionStartLineNumber&&y.selectionStartColumn===m.selectionStartColumn&&y.positionLineNumber===m.positionLineNumber&&y.positionColumn===m.positionColumn}getDirection(){return this.selectionStartLineNumber===this.startLineNumber&&this.selectionStartColumn===this.startColumn?0:1}setEndPosition(y,m){return this.getDirection()===0?new I(this.startLineNumber,this.startColumn,y,m):new I(y,m,this.startLineNumber,this.startColumn)}getPosition(){return new d.Position(this.positionLineNumber,this.positionColumn)}getSelectionStart(){return new d.Position(this.selectionStartLineNumber,this.selectionStartColumn)}setStartPosition(y,m){return this.getDirection()===0?new I(y,m,this.endLineNumber,this.endColumn):new I(this.endLineNumber,this.endColumn,y,m)}static fromPositions(y,m=y){return new I(y.lineNumber,y.column,m.lineNumber,m.column)}static fromRange(y,m){return m===0?new I(y.startLineNumber,y.startColumn,y.endLineNumber,y.endColumn):new I(y.endLineNumber,y.endColumn,y.startLineNumber,y.startColumn)}static liftSelection(y){return new I(y.selectionStartLineNumber,y.selectionStartColumn,y.positionLineNumber,y.positionColumn)}static selectionsArrEqual(y,m){if(y&&!m||!y&&m)return!1;if(!y&&!m)return!0;if(y.length!==m.length)return!1;for(let _=0,b=y.length;_{const g=b._map.get(t);g&&(b._map.delete(t),g.dispose(),s.dispose())})}return i}_beginUpdate(){this._updateCounter++,this._updateCounter===1&&(this._currentTransaction=new E.TransactionImpl(()=>{}))}_endUpdate(){if(this._updateCounter--,this._updateCounter===0){const t=this._currentTransaction;this._currentTransaction=void 0,t.finish()}}constructor(t){super(),this.editor=t,this._updateCounter=0,this._currentTransaction=void 0,this._model=(0,I.observableValue)(this,this.editor.getModel()),this.model=this._model,this.isReadonly=(0,I.observableFromEvent)(this,this.editor.onDidChangeConfiguration,()=>this.editor.getOption(92)),this._versionId=(0,I.observableValueOpts)({owner:this,lazy:!0},this.editor.getModel()?.getVersionId()??null),this.versionId=this._versionId,this._selections=(0,I.observableValueOpts)({owner:this,equalsFn:(0,d.equalsIfDefined)((0,d.itemsEquals)(m.Selection.selectionsEqual)),lazy:!0},this.editor.getSelections()??null),this.selections=this._selections,this.isFocused=(0,I.observableFromEvent)(this,i=>{const s=this.editor.onDidFocusEditorWidget(i),g=this.editor.onDidBlurEditorWidget(i);return{dispose(){s.dispose(),g.dispose()}}},()=>this.editor.hasWidgetFocus()),this.value=(0,y.derivedWithSetter)(this,i=>(this.versionId.read(i),this.model.read(i)?.getValue()??""),(i,s)=>{const g=this.model.get();g!==null&&i!==g.getValue()&&g.setValue(i)}),this.valueIsEmpty=(0,I.derived)(this,i=>(this.versionId.read(i),this.editor.getModel()?.getValueLength()===0)),this.cursorSelection=(0,I.derivedOpts)({owner:this,equalsFn:(0,d.equalsIfDefined)(m.Selection.selectionsEqual)},i=>this.selections.read(i)?.[0]??null),this.onDidType=(0,I.observableSignal)(this),this.scrollTop=(0,I.observableFromEvent)(this.editor.onDidScrollChange,()=>this.editor.getScrollTop()),this.scrollLeft=(0,I.observableFromEvent)(this.editor.onDidScrollChange,()=>this.editor.getScrollLeft()),this.layoutInfo=(0,I.observableFromEvent)(this.editor.onDidLayoutChange,()=>this.editor.getLayoutInfo()),this.layoutInfoContentLeft=this.layoutInfo.map(i=>i.contentLeft),this.layoutInfoDecorationsLeft=this.layoutInfo.map(i=>i.decorationsLeft),this.contentWidth=(0,I.observableFromEvent)(this.editor.onDidContentSizeChange,()=>this.editor.getContentWidth()),this._overlayWidgetCounter=0,this._register(this.editor.onBeginUpdate(()=>this._beginUpdate())),this._register(this.editor.onEndUpdate(()=>this._endUpdate())),this._register(this.editor.onDidChangeModel(()=>{this._beginUpdate();try{this._model.set(this.editor.getModel(),this._currentTransaction),this._forceUpdate()}finally{this._endUpdate()}})),this._register(this.editor.onDidType(i=>{this._beginUpdate();try{this._forceUpdate(),this.onDidType.trigger(this._currentTransaction,i)}finally{this._endUpdate()}})),this._register(this.editor.onDidChangeModelContent(i=>{this._beginUpdate();try{this._versionId.set(this.editor.getModel()?.getVersionId()??null,this._currentTransaction,i),this._forceUpdate()}finally{this._endUpdate()}})),this._register(this.editor.onDidChangeCursorSelection(i=>{this._beginUpdate();try{this._selections.set(this.editor.getSelections(),this._currentTransaction,i),this._forceUpdate()}finally{this._endUpdate()}}))}forceUpdate(t){this._beginUpdate();try{return this._forceUpdate(),t?t(this._currentTransaction):void 0}finally{this._endUpdate()}}_forceUpdate(){this._beginUpdate();try{this._model.set(this.editor.getModel(),this._currentTransaction),this._versionId.set(this.editor.getModel()?.getVersionId()??null,this._currentTransaction,void 0),this._selections.set(this.editor.getSelections(),this._currentTransaction,void 0)}finally{this._endUpdate()}}getOption(t){return(0,I.observableFromEvent)(this,i=>this.editor.onDidChangeConfiguration(s=>{s.hasChanged(t)&&i(void 0)}),()=>this.editor.getOption(t))}setDecorations(t){const i=new k.DisposableStore,s=this.editor.createDecorationsCollection();return i.add((0,I.autorunOpts)({owner:this,debugName:()=>`Apply decorations from ${t.debugName}`},g=>{const c=t.read(g);s.set(c)})),i.add({dispose:()=>{s.clear()}}),i}createOverlayWidget(t){const i="observableOverlayWidget"+this._overlayWidgetCounter++,s={getDomNode:()=>t.domNode,getPosition:()=>t.position.get(),getId:()=>i,allowEditorOverflow:t.allowEditorOverflow,getMinContentWidthInPx:()=>t.minContentWidthInPx.get()};this.editor.addOverlayWidget(s);const g=(0,I.autorun)(c=>{t.position.read(c),t.minContentWidthInPx.read(c),this.editor.layoutOverlayWidget(s)});return(0,k.toDisposable)(()=>{g.dispose(),this.editor.removeOverlayWidget(s)})}}e.ObservableCodeEditor=b;function p(o,t){return(0,I.autorunWithStoreHandleChanges)({createEmptyChangeSummary:()=>({deltas:[],didChange:!1}),handleChange:(i,s)=>{if(i.didChange(o)){const g=i.change;g!==void 0&&s.deltas.push(g),s.didChange=!0}return!0}},(i,s)=>{const g=o.read(i);s.didChange&&t(g,s.deltas)})}function n(o,t){const i=new k.DisposableStore,s=p(o,(g,c)=>{i.clear(),t(g,c,i)});return{dispose(){s.dispose(),i.dispose()}}}}),define(ne[146],se([1,0,23]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReplaceCommandThatPreservesSelection=e.ReplaceCommandWithOffsetCursorState=e.ReplaceCommandWithoutChangingPosition=e.ReplaceCommandThatSelectsText=e.ReplaceCommand=void 0;class k{constructor(b,p,n=!1){this._range=b,this._text=p,this.insertsAutoWhitespace=n}getEditOperations(b,p){p.addTrackedEditOperation(this._range,this._text)}computeCursorState(b,p){const o=p.getInverseEditOperations()[0].range;return d.Selection.fromPositions(o.getEndPosition())}}e.ReplaceCommand=k;class I{constructor(b,p){this._range=b,this._text=p}getEditOperations(b,p){p.addTrackedEditOperation(this._range,this._text)}computeCursorState(b,p){const o=p.getInverseEditOperations()[0].range;return d.Selection.fromRange(o,0)}}e.ReplaceCommandThatSelectsText=I;class E{constructor(b,p,n=!1){this._range=b,this._text=p,this.insertsAutoWhitespace=n}getEditOperations(b,p){p.addTrackedEditOperation(this._range,this._text)}computeCursorState(b,p){const o=p.getInverseEditOperations()[0].range;return d.Selection.fromPositions(o.getStartPosition())}}e.ReplaceCommandWithoutChangingPosition=E;class y{constructor(b,p,n,o,t=!1){this._range=b,this._text=p,this._columnDeltaOffset=o,this._lineNumberDeltaOffset=n,this.insertsAutoWhitespace=t}getEditOperations(b,p){p.addTrackedEditOperation(this._range,this._text)}computeCursorState(b,p){const o=p.getInverseEditOperations()[0].range;return d.Selection.fromPositions(o.getEndPosition().delta(this._lineNumberDeltaOffset,this._columnDeltaOffset))}}e.ReplaceCommandWithOffsetCursorState=y;class m{constructor(b,p,n,o=!1){this._range=b,this._text=p,this._initialSelection=n,this._forceMoveMarkers=o,this._selectionId=null}getEditOperations(b,p){p.addTrackedEditOperation(this._range,this._text,this._forceMoveMarkers),this._selectionId=p.trackSelection(this._initialSelection)}computeCursorState(b,p){return p.getTrackedSelection(this._selectionId)}}e.ReplaceCommandThatPreservesSelection=m}),define(ne[312],se([1,0,4,23]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompositionSurroundSelectionCommand=e.SurroundSelectionCommand=void 0;class I{constructor(m,_,b){this._range=m,this._charBeforeSelection=_,this._charAfterSelection=b}getEditOperations(m,_){_.addTrackedEditOperation(new d.Range(this._range.startLineNumber,this._range.startColumn,this._range.startLineNumber,this._range.startColumn),this._charBeforeSelection),_.addTrackedEditOperation(new d.Range(this._range.endLineNumber,this._range.endColumn,this._range.endLineNumber,this._range.endColumn),this._charAfterSelection)}computeCursorState(m,_){const b=_.getInverseEditOperations(),p=b[0].range,n=b[1].range;return new k.Selection(p.endLineNumber,p.endColumn,n.endLineNumber,n.endColumn-this._charAfterSelection.length)}}e.SurroundSelectionCommand=I;class E{constructor(m,_,b){this._position=m,this._text=_,this._charAfter=b}getEditOperations(m,_){_.addTrackedEditOperation(new d.Range(this._position.lineNumber,this._position.column,this._position.lineNumber,this._position.column),this._text+this._charAfter)}computeCursorState(m,_){const p=_.getInverseEditOperations()[0].range;return new k.Selection(p.endLineNumber,p.startColumn,p.endLineNumber,p.endColumn-this._charAfter.length)}}e.CompositionSurroundSelectionCommand=E}),define(ne[113],se([1,0,9,4]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TextLength=void 0;class I{static{this.zero=new I(0,0)}static betweenPositions(y,m){return y.lineNumber===m.lineNumber?new I(0,m.column-y.column):new I(m.lineNumber-y.lineNumber,m.column-1)}static ofRange(y){return I.betweenPositions(y.getStartPosition(),y.getEndPosition())}static ofText(y){let m=0,_=0;for(const b of y)b===` -`?(m++,_=0):_++;return new I(m,_)}constructor(y,m){this.lineCount=y,this.columnCount=m}isGreaterThanOrEqualTo(y){return this.lineCount!==y.lineCount?this.lineCount>y.lineCount:this.columnCount>=y.columnCount}createRange(y){return this.lineCount===0?new k.Range(y.lineNumber,y.column,y.lineNumber,y.column+this.columnCount):new k.Range(y.lineNumber,y.column,y.lineNumber+this.lineCount,this.columnCount+1)}addToPosition(y){return this.lineCount===0?new d.Position(y.lineNumber,y.column+this.columnCount):new d.Position(y.lineNumber+this.lineCount,this.columnCount+1)}toString(){return`${this.lineCount},${this.columnCount}`}}e.TextLength=I}),define(ne[555],se([1,0,68,113]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PositionOffsetTransformer=void 0;class I{constructor(y){this.text=y,this.lineStartOffsetByLineIdx=[],this.lineStartOffsetByLineIdx.push(0);for(let m=0;m(0,d.checkAdjacentItems)(i,(s,g)=>s.range.getEndPosition().isBeforeOrEqual(g.range.getStartPosition())))}apply(i){let s="",g=new I.Position(1,1);for(const l of this.edits){const a=l.range,r=a.getStartPosition(),u=a.getEndPosition(),C=p(g,r);C.isEmpty()||(s+=i.getValueOfRange(C)),s+=l.text,g=u}const c=p(g,i.endPositionExclusive);return c.isEmpty()||(s+=i.getValueOfRange(c)),s}applyToString(i){const s=new o(i);return this.apply(s)}getNewRanges(){const i=[];let s=0,g=0,c=0;for(const l of this.edits){const a=m.TextLength.ofText(l.text),r=I.Position.lift({lineNumber:l.range.startLineNumber+g,column:l.range.startColumn+(l.range.startLineNumber===s?c:0)}),u=a.createRange(r);i.push(u),g=u.endLineNumber-l.range.endLineNumber,c=u.endColumn-l.range.endColumn,s=l.range.endLineNumber}return i}}e.TextEdit=_;class b{constructor(i,s){this.range=i,this.text=s}toSingleEditOperation(){return{range:this.range,text:this.text}}}e.SingleTextEdit=b;function p(t,i){if(t.lineNumber===i.lineNumber&&t.column===Number.MAX_SAFE_INTEGER)return y.Range.fromPositions(i,i);if(!t.isBeforeOrEqual(i))throw new k.BugIndicatingError("start must be before end");return new y.Range(t.lineNumber,t.column,i.lineNumber,i.column)}class n{get endPositionExclusive(){return this.length.addToPosition(new I.Position(1,1))}}e.AbstractText=n;class o extends n{constructor(i){super(),this.value=i,this._t=new E.PositionOffsetTransformer(this.value)}getValueOfRange(i){return this._t.getOffsetRange(i).substring(this.value)}get length(){return this._t.textLength}}e.StringText=o}),define(ne[197],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EDITOR_MODEL_DEFAULTS=void 0,e.EDITOR_MODEL_DEFAULTS={tabSize:4,indentSize:4,insertSpaces:!0,detectIndentation:!0,trimAutoWhitespace:!0,largeFileOptimizations:!0,bracketPairColorizationOptions:{enabled:!0,independentColorPoolPerBracketType:!1}}}),define(ne[166],se([1,0,45,144]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WordCharacterClassifier=void 0,e.getMapForWordSeparators=y;class I extends k.CharacterClassifier{constructor(_,b){super(0),this._segmenter=null,this._cachedLine=null,this._cachedSegments=[],this.intlSegmenterLocales=b,this.intlSegmenterLocales.length>0?this._segmenter=new Intl.Segmenter(this.intlSegmenterLocales,{granularity:"word"}):this._segmenter=null;for(let p=0,n=_.length;pb)break;p=n}return p}findNextIntlWordAtOrAfterOffset(_,b){for(const p of this._getIntlSegmenterWordsOnLine(_))if(!(p.index/?";function I(b=""){let p="(-?\\d*\\.\\d\\w*)|([^";for(const n of e.USUAL_WORD_SEPARATORS)b.indexOf(n)>=0||(p+="\\"+n);return p+="\\s]+)",new RegExp(p,"g")}e.DEFAULT_WORD_REGEXP=I();function E(b){let p=e.DEFAULT_WORD_REGEXP;if(b&&b instanceof RegExp)if(b.global)p=b;else{let n="g";b.ignoreCase&&(n+="i"),b.multiline&&(n+="m"),b.unicode&&(n+="u"),p=new RegExp(b.source,n)}return p.lastIndex=0,p}const y=new k.LinkedList;y.unshift({maxLen:1e3,windowSize:15,timeBudget:150});function m(b,p,n,o,t){if(p=E(p),t||(t=d.Iterable.first(y)),n.length>t.maxLen){let l=b-t.maxLen/2;return l<0?l=0:o+=l,n=n.substring(l,b+t.maxLen/2),m(b,p,n,o,t)}const i=Date.now(),s=b-1-o;let g=-1,c=null;for(let l=1;!(Date.now()-i>=t.timeBudget);l++){const a=s-t.windowSize*l;p.lastIndex=Math.max(0,a);const r=_(p,n,s,g);if(!r&&c||(c=r,a<=0))break;g=a}if(c){const l={word:c[0],startColumn:o+1+c.index,endColumn:o+1+c.index+c[0].length};return p.lastIndex=0,l}return null}function _(b,p,n,o){let t;for(;t=b.exec(p);){const i=t.index||0;if(i<=n&&b.lastIndex>=n)return t;if(o>0&&i>o)return null}return null}}),define(ne[313],se([1,0,94]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AtomicTabMoveOperations=void 0;class k{static whitespaceVisibleColumn(E,y,m){const _=E.length;let b=0,p=-1,n=-1;for(let o=0;o<_;o++){if(o===y)return[p,n,b];switch(b%m===0&&(p=o,n=b),E.charCodeAt(o)){case 32:b+=1;break;case 9:b=d.CursorColumns.nextRenderTabStop(b,m);break;default:return[-1,-1,-1]}}return y===_?[p,n,b]:[-1,-1,-1]}static atomicPosition(E,y,m,_){const b=E.length,[p,n,o]=k.whitespaceVisibleColumn(E,y,m);if(o===-1)return-1;let t;switch(_){case 0:t=!0;break;case 1:t=!1;break;case 2:if(o%m===0)return y;t=o%m<=m/2;break}if(t){if(p===-1)return-1;let g=n;for(let c=p;c{t.push(y.fromOffsetPairs(i?i.getEndExclusives():m.zero,s?s.getStarts():new m(o,(i?i.seq2Range.endExclusive-i.seq1Range.endExclusive:0)+o)))}),t}static fromOffsetPairs(n,o){return new y(new I.OffsetRange(n.offset1,o.offset1),new I.OffsetRange(n.offset2,o.offset2))}static assertSorted(n){let o;for(const t of n){if(o&&!(o.seq1Range.endExclusive<=t.seq1Range.start&&o.seq2Range.endExclusive<=t.seq2Range.start))throw new k.BugIndicatingError("Sequence diffs must be sorted");o=t}}constructor(n,o){this.seq1Range=n,this.seq2Range=o}swap(){return new y(this.seq2Range,this.seq1Range)}toString(){return`${this.seq1Range} <-> ${this.seq2Range}`}join(n){return new y(this.seq1Range.join(n.seq1Range),this.seq2Range.join(n.seq2Range))}delta(n){return n===0?this:new y(this.seq1Range.delta(n),this.seq2Range.delta(n))}deltaStart(n){return n===0?this:new y(this.seq1Range.deltaStart(n),this.seq2Range.deltaStart(n))}deltaEnd(n){return n===0?this:new y(this.seq1Range.deltaEnd(n),this.seq2Range.deltaEnd(n))}intersect(n){const o=this.seq1Range.intersect(n.seq1Range),t=this.seq2Range.intersect(n.seq2Range);if(!(!o||!t))return new y(o,t)}getStarts(){return new m(this.seq1Range.start,this.seq2Range.start)}getEndExclusives(){return new m(this.seq1Range.endExclusive,this.seq2Range.endExclusive)}}e.SequenceDiff=y;class m{static{this.zero=new m(0,0)}static{this.max=new m(Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER)}constructor(n,o){this.offset1=n,this.offset2=o}toString(){return`${this.offset1} <-> ${this.offset2}`}delta(n){return n===0?this:new m(this.offset1+n,this.offset2+n)}equals(n){return this.offset1===n.offset1&&this.offset2===n.offset2}}e.OffsetPair=m;class _{static{this.instance=new _}isValid(){return!0}}e.InfiniteTimeout=_;class b{constructor(n){if(this.timeout=n,this.startTime=Date.now(),this.valid=!0,n<=0)throw new k.BugIndicatingError("timeout must be positive")}isValid(){if(!(Date.now()-this.startTimeo.length||D>t.length)continue;const T=i(L,D);g.set(l,T);const M=L===w?c.get(l+1):c.get(l-1);if(c.set(l,T!==L?new E(M,L,D,T-L):M),g.get(l)===o.length&&g.get(l)-l===t.length)break e}}let a=c.get(l);const r=[];let u=o.length,C=t.length;for(;;){const f=a?a.x+a.length:0,h=a?a.y+a.length:0;if((f!==u||h!==C)&&r.push(new k.SequenceDiff(new d.OffsetRange(f,u),new d.OffsetRange(h,C))),!a)break;u=a.x,C=a.y,a=a.prev}return r.reverse(),new k.DiffAlgorithmResult(r,!1)}}e.MyersDiffAlgorithm=I;class E{constructor(b,p,n,o){this.prev=b,this.x=p,this.y=n,this.length=o}}class y{constructor(){this.positiveArr=new Int32Array(10),this.negativeArr=new Int32Array(10)}get(b){return b<0?(b=-b-1,this.negativeArr[b]):this.positiveArr[b]}set(b,p){if(b<0){if(b=-b-1,b>=this.negativeArr.length){const n=this.negativeArr;this.negativeArr=new Int32Array(n.length*2),this.negativeArr.set(n)}this.negativeArr[b]=p}else{if(b>=this.positiveArr.length){const n=this.positiveArr;this.positiveArr=new Int32Array(n.length*2),this.positiveArr.set(n)}this.positiveArr[b]=p}}}class m{constructor(){this.positiveArr=[],this.negativeArr=[]}get(b){return b<0?(b=-b-1,this.negativeArr[b]):this.positiveArr[b]}set(b,p){b<0?(b=-b-1,this.negativeArr[b]=p):this.positiveArr[b]=p}}}),define(ne[315],se([1,0,13,68,167]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.optimizeSequenceDiffs=E,e.removeShortMatches=b,e.extendDiffsToEntireWordIfAppropriate=p,e.removeVeryShortMatchingLinesBetweenDiffs=o,e.removeVeryShortMatchingTextBetweenLongDiffs=t;function E(i,s,g){let c=g;return c=y(i,s,c),c=y(i,s,c),c=m(i,s,c),c}function y(i,s,g){if(g.length===0)return g;const c=[];c.push(g[0]);for(let a=1;a0&&(u=u.delta(f))}l.push(u)}return c.length>0&&l.push(c[c.length-1]),l}function m(i,s,g){if(!i.getBoundaryScore||!s.getBoundaryScore)return g;for(let c=0;c0?g[c-1]:void 0,a=g[c],r=c+1=c.start&&i.seq2Range.start-r>=l.start&&g.isStronglyEqual(i.seq2Range.start-r,i.seq2Range.endExclusive-r)&&r<100;)r++;r--;let u=0;for(;i.seq1Range.start+uf&&(f=L,C=h)}return i.delta(C)}function b(i,s,g){const c=[];for(const l of g){const a=c[c.length-1];if(!a){c.push(l);continue}l.seq1Range.start-a.seq1Range.endExclusive<=2||l.seq2Range.start-a.seq2Range.endExclusive<=2?c[c.length-1]=new I.SequenceDiff(a.seq1Range.join(l.seq1Range),a.seq2Range.join(l.seq2Range)):c.push(l)}return c}function p(i,s,g){const c=I.SequenceDiff.invert(g,i.length),l=[];let a=new I.OffsetPair(0,0);function r(C,f){if(C.offset10;){const T=c[0];if(!(T.seq1Range.intersects(w.seq1Range)||T.seq2Range.intersects(w.seq2Range)))break;const A=i.findWordContaining(T.seq1Range.start),P=s.findWordContaining(T.seq2Range.start),N=new I.SequenceDiff(A,P),O=N.intersect(T);if(L+=O.seq1Range.length,D+=O.seq2Range.length,w=w.join(N),w.seq1Range.endExclusive>=T.seq1Range.endExclusive)c.shift();else break}L+D<(w.seq1Range.length+w.seq2Range.length)*2/3&&l.push(w),a=w.getEndExclusives()}for(;c.length>0;){const C=c.shift();C.seq1Range.isEmpty||(r(C.getStarts(),C),r(C.getEndExclusives().delta(-1),C))}return n(g,l)}function n(i,s){const g=[];for(;i.length>0||s.length>0;){const c=i[0],l=s[0];let a;c&&(!l||c.seq1Range.start0&&g[g.length-1].seq1Range.endExclusive>=a.seq1Range.start?g[g.length-1]=g[g.length-1].join(a):g.push(a)}return g}function o(i,s,g){let c=g;if(c.length===0)return c;let l=0,a;do{a=!1;const r=[c[0]];for(let u=1;u5||S.seq1Range.length+S.seq2Range.length>5)};const C=c[u],f=r[r.length-1];h(f,C)?(a=!0,r[r.length-1]=r[r.length-1].join(C)):r.push(C)}c=r}while(l++<10&&a);return c}function t(i,s,g){let c=g;if(c.length===0)return c;let l=0,a;do{a=!1;const u=[c[0]];for(let C=1;C5||D.length>500)return!1;const M=i.getText(D).trim();if(M.length>20||M.split(/\r\n|\r|\n/).length>1)return!1;const A=i.countLinesIn(S.seq1Range),P=S.seq1Range.length,N=s.countLinesIn(S.seq2Range),O=S.seq2Range.length,F=i.countLinesIn(L.seq1Range),x=L.seq1Range.length,W=s.countLinesIn(L.seq2Range),V=L.seq2Range.length,q=2*40+50;function H(z){return Math.min(z,q)}return Math.pow(Math.pow(H(A*40+P),1.5)+Math.pow(H(N*40+O),1.5),1.5)+Math.pow(Math.pow(H(F*40+x),1.5)+Math.pow(H(W*40+V),1.5),1.5)>(q**1.5)**1.5*1.3};const f=c[C],h=u[u.length-1];v(h,f)?(a=!0,u[u.length-1]=u[u.length-1].join(f)):u.push(f)}c=u}while(l++<10&&a);const r=[];return(0,d.forEachWithNeighbors)(c,(u,C,f)=>{let h=C;function v(M){return M.length>0&&M.trim().length<=3&&C.seq1Range.length+C.seq2Range.length>100}const w=i.extendToFullLines(C.seq1Range),S=i.getText(new k.OffsetRange(w.start,C.seq1Range.start));v(S)&&(h=h.deltaStart(-S.length));const L=i.getText(new k.OffsetRange(C.seq1Range.endExclusive,w.endExclusive));v(L)&&(h=h.deltaEnd(L.length));const D=I.SequenceDiff.fromOffsetPairs(u?u.getEndExclusives():I.OffsetPair.zero,f?f.getStarts():I.OffsetPair.max),T=h.intersect(D);r.length>0&&T.getStarts().equals(r[r.length-1].getEndExclusives())?r[r.length-1]=r[r.length-1].join(T):r.push(T)}),r}}),define(ne[557],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LineSequence=void 0;class d{constructor(E,y){this.trimmedHash=E,this.lines=y}getElement(E){return this.trimmedHash[E]}get length(){return this.trimmedHash.length}getBoundaryScore(E){const y=E===0?0:k(this.lines[E-1]),m=E===this.lines.length?0:k(this.lines[E]);return 1e3-(y+m)}getText(E){return this.lines.slice(E.start,E.endExclusive).join(` -`)}isStronglyEqual(E,y){return this.lines[E]===this.lines[y]}}e.LineSequence=d;function k(I){let E=0;for(;E0&&u>0&&o.get(r-1,u-1)===3&&(h+=t.get(r-1,u-1)),h+=p?p(r,u):1):h=-1;const v=Math.max(C,f,h);if(v===h){const w=r>0&&u>0?t.get(r-1,u-1):0;t.set(r,u,w+1),o.set(r,u,3)}else v===C?(t.set(r,u,0),o.set(r,u,1)):v===f&&(t.set(r,u,0),o.set(r,u,2));n.set(r,u,v)}const i=[];let s=m.length,g=_.length;function c(r,u){(r+1!==s||u+1!==g)&&i.push(new k.SequenceDiff(new d.OffsetRange(r+1,s),new d.OffsetRange(u+1,g))),s=r,g=u}let l=m.length-1,a=_.length-1;for(;l>=0&&a>=0;)o.get(l,a)===3?(c(l,a),l--,a--):o.get(l,a)===1?l--:a--;return c(-1,-1),i.reverse(),new k.DiffAlgorithmResult(i,!1)}}e.DynamicProgrammingDiffing=E}),define(ne[316],se([1,0,67,68,9,4,231]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinesSliceCharSequence=void 0;class m{constructor(t,i,s){this.lines=t,this.range=i,this.considerWhitespaceChanges=s,this.elements=[],this.firstElementOffsetByLineIdx=[],this.lineStartOffsets=[],this.trimmedWsLengthsByLineIdx=[],this.firstElementOffsetByLineIdx.push(0);for(let g=this.range.startLineNumber;g<=this.range.endLineNumber;g++){let c=t[g-1],l=0;g===this.range.startLineNumber&&this.range.startColumn>1&&(l=this.range.startColumn-1,c=c.substring(l)),this.lineStartOffsets.push(l);let a=0;if(!s){const u=c.trimStart();a=c.length-u.length,c=u.trimEnd()}this.trimmedWsLengthsByLineIdx.push(a);const r=g===this.range.endLineNumber?Math.min(this.range.endColumn-1-l-a,c.length):c.length;for(let u=0;uString.fromCharCode(i)).join("")}getElement(t){return this.elements[t]}get length(){return this.elements.length}getBoundaryScore(t){const i=n(t>0?this.elements[t-1]:-1),s=n(tc<=t),g=t-this.firstElementOffsetByLineIdx[s];return new I.Position(this.range.startLineNumber+s,1+this.lineStartOffsets[s]+g+(g===0&&i==="left"?0:this.trimmedWsLengthsByLineIdx[s]))}translateRange(t){const i=this.translateOffset(t.start,"right"),s=this.translateOffset(t.endExclusive,"left");return s.isBefore(i)?E.Range.fromPositions(s,s):E.Range.fromPositions(i,s)}findWordContaining(t){if(t<0||t>=this.elements.length||!_(this.elements[t]))return;let i=t;for(;i>0&&_(this.elements[i-1]);)i--;let s=t;for(;sg<=t.start)??0,s=(0,d.findFirstMonotonous)(this.firstElementOffsetByLineIdx,g=>t.endExclusive<=g)??this.elements.length;return new k.OffsetRange(i,s)}}e.LinesSliceCharSequence=m;function _(o){return o>=97&&o<=122||o>=65&&o<=90||o>=48&&o<=57}const b={0:0,1:0,2:0,3:10,4:2,5:30,6:3,7:10,8:10};function p(o){return b[o]}function n(o){return o===10?8:o===13?7:(0,y.isSpace)(o)?6:o>=97&&o<=122?0:o>=65&&o<=90?1:o>=48&&o<=57?2:o===-1?3:o===44||o===59?5:4}}),define(ne[232],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MovedText=e.LinesDiff=void 0;class d{constructor(E,y,m){this.changes=E,this.moves=y,this.hitTimeout=m}}e.LinesDiff=d;class k{constructor(E,y){this.lineRangeMapping=E,this.changes=y}}e.MovedText=k}),define(ne[105],se([1,0,8,55,9,4,104]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RangeMapping=e.DetailedLineRangeMapping=e.LineRangeMapping=void 0;class m{static inverse(t,i,s){const g=[];let c=1,l=1;for(const r of t){const u=new m(new k.LineRange(c,r.original.startLineNumber),new k.LineRange(l,r.modified.startLineNumber));u.modified.isEmpty||g.push(u),c=r.original.endLineNumberExclusive,l=r.modified.endLineNumberExclusive}const a=new m(new k.LineRange(c,i+1),new k.LineRange(l,s+1));return a.modified.isEmpty||g.push(a),g}static clip(t,i,s){const g=[];for(const c of t){const l=c.original.intersect(i),a=c.modified.intersect(s);l&&!l.isEmpty&&a&&!a.isEmpty&&g.push(new m(l,a))}return g}constructor(t,i){this.original=t,this.modified=i}toString(){return`{${this.original.toString()}->${this.modified.toString()}}`}flip(){return new m(this.modified,this.original)}join(t){return new m(this.original.join(t.original),this.modified.join(t.modified))}toRangeMapping(){const t=this.original.toInclusiveRange(),i=this.modified.toInclusiveRange();if(t&&i)return new n(t,i);if(this.original.startLineNumber===1||this.modified.startLineNumber===1){if(!(this.modified.startLineNumber===1&&this.original.startLineNumber===1))throw new d.BugIndicatingError("not a valid diff");return new n(new E.Range(this.original.startLineNumber,1,this.original.endLineNumberExclusive,1),new E.Range(this.modified.startLineNumber,1,this.modified.endLineNumberExclusive,1))}else return new n(new E.Range(this.original.startLineNumber-1,Number.MAX_SAFE_INTEGER,this.original.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER),new E.Range(this.modified.startLineNumber-1,Number.MAX_SAFE_INTEGER,this.modified.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER))}toRangeMapping2(t,i){if(b(this.original.endLineNumberExclusive,t)&&b(this.modified.endLineNumberExclusive,i))return new n(new E.Range(this.original.startLineNumber,1,this.original.endLineNumberExclusive,1),new E.Range(this.modified.startLineNumber,1,this.modified.endLineNumberExclusive,1));if(!this.original.isEmpty&&!this.modified.isEmpty)return new n(E.Range.fromPositions(new I.Position(this.original.startLineNumber,1),_(new I.Position(this.original.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER),t)),E.Range.fromPositions(new I.Position(this.modified.startLineNumber,1),_(new I.Position(this.modified.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER),i)));if(this.original.startLineNumber>1&&this.modified.startLineNumber>1)return new n(E.Range.fromPositions(_(new I.Position(this.original.startLineNumber-1,Number.MAX_SAFE_INTEGER),t),_(new I.Position(this.original.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER),t)),E.Range.fromPositions(_(new I.Position(this.modified.startLineNumber-1,Number.MAX_SAFE_INTEGER),i),_(new I.Position(this.modified.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER),i)));throw new d.BugIndicatingError}}e.LineRangeMapping=m;function _(o,t){if(o.lineNumber<1)return new I.Position(1,1);if(o.lineNumber>t.length)return new I.Position(t.length,t[t.length-1].length+1);const i=t[o.lineNumber-1];return o.column>i.length+1?new I.Position(o.lineNumber,i.length+1):o}function b(o,t){return o>=1&&o<=t.length}class p extends m{static fromRangeMappings(t){const i=k.LineRange.join(t.map(g=>k.LineRange.fromRangeInclusive(g.originalRange))),s=k.LineRange.join(t.map(g=>k.LineRange.fromRangeInclusive(g.modifiedRange)));return new p(i,s,t)}constructor(t,i,s){super(t,i),this.innerChanges=s}flip(){return new p(this.modified,this.original,this.innerChanges?.map(t=>t.flip()))}withInnerChangesFromLineRanges(){return new p(this.original,this.modified,[this.toRangeMapping()])}}e.DetailedLineRangeMapping=p;class n{static assertSorted(t){for(let i=1;i${this.modifiedRange.toString()}}`}flip(){return new n(this.modifiedRange,this.originalRange)}toTextEdit(t){const i=t.getValueOfRange(this.modifiedRange);return new y.SingleTextEdit(this.originalRange,i)}}e.RangeMapping=n}),define(ne[559],se([1,0,167,105,13,67,45,55,316,231,314,4]),function(oe,e,d,k,I,E,y,m,_,b,p,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.computeMovedLines=o;function o(a,r,u,C,f,h){let{moves:v,excludedChanges:w}=i(a,r,u,h);if(!h.isValid())return[];const S=a.filter(D=>!w.has(D)),L=s(S,C,f,r,u,h);return(0,I.pushMany)(v,L),v=c(v),v=v.filter(D=>{const T=D.original.toOffsetRange().slice(r).map(A=>A.trim());return T.join(` -`).length>=15&&t(T,A=>A.length>=2)>=2}),v=l(a,v),v}function t(a,r){let u=0;for(const C of a)r(C)&&u++;return u}function i(a,r,u,C){const f=[],h=a.filter(S=>S.modified.isEmpty&&S.original.length>=3).map(S=>new b.LineRangeFragment(S.original,r,S)),v=new Set(a.filter(S=>S.original.isEmpty&&S.modified.length>=3).map(S=>new b.LineRangeFragment(S.modified,u,S))),w=new Set;for(const S of h){let L=-1,D;for(const T of v){const M=S.computeSimilarity(T);M>L&&(L=M,D=T)}if(L>.9&&D&&(v.delete(D),f.push(new k.LineRangeMapping(S.range,D.range)),w.add(S.source),w.add(D.source)),!C.isValid())return{moves:f,excludedChanges:w}}return{moves:f,excludedChanges:w}}function s(a,r,u,C,f,h){const v=[],w=new y.SetMap;for(const M of a)for(let A=M.original.startLineNumber;AM.modified.startLineNumber,I.numberComparator));for(const M of a){let A=[];for(let P=M.modified.startLineNumber;P{for(const V of A)if(V.originalLineRange.endLineNumberExclusive+1===x.endLineNumberExclusive&&V.modifiedLineRange.endLineNumberExclusive+1===O.endLineNumberExclusive){V.originalLineRange=new m.LineRange(V.originalLineRange.startLineNumber,x.endLineNumberExclusive),V.modifiedLineRange=new m.LineRange(V.modifiedLineRange.startLineNumber,O.endLineNumberExclusive),F.push(V);return}const W={modifiedLineRange:O,originalLineRange:x};S.push(W),F.push(W)}),A=F}if(!h.isValid())return[]}S.sort((0,I.reverseOrder)((0,I.compareBy)(M=>M.modifiedLineRange.length,I.numberComparator)));const L=new m.LineRangeSet,D=new m.LineRangeSet;for(const M of S){const A=M.modifiedLineRange.startLineNumber-M.originalLineRange.startLineNumber,P=L.subtractFrom(M.modifiedLineRange),N=D.subtractFrom(M.originalLineRange).getWithDelta(A),O=P.getIntersection(N);for(const F of O.ranges){if(F.length<3)continue;const x=F,W=F.delta(-A);v.push(new k.LineRangeMapping(W,x)),L.addRange(x),D.addRange(W)}}v.sort((0,I.compareBy)(M=>M.original.startLineNumber,I.numberComparator));const T=new E.MonotonousArray(a);for(let M=0;MH.original.startLineNumber<=A.original.startLineNumber),N=(0,E.findLastMonotonous)(a,H=>H.modified.startLineNumber<=A.modified.startLineNumber),O=Math.max(A.original.startLineNumber-P.original.startLineNumber,A.modified.startLineNumber-N.modified.startLineNumber),F=T.findLastMonotonous(H=>H.original.startLineNumberH.modified.startLineNumberC.length||z>f.length||L.contains(z)||D.contains(H)||!g(C[H-1],f[z-1],h))break}V>0&&(D.addRange(new m.LineRange(A.original.startLineNumber-V,A.original.startLineNumber)),L.addRange(new m.LineRange(A.modified.startLineNumber-V,A.modified.startLineNumber)));let q;for(q=0;qC.length||z>f.length||L.contains(z)||D.contains(H)||!g(C[H-1],f[z-1],h))break}q>0&&(D.addRange(new m.LineRange(A.original.endLineNumberExclusive,A.original.endLineNumberExclusive+q)),L.addRange(new m.LineRange(A.modified.endLineNumberExclusive,A.modified.endLineNumberExclusive+q))),(V>0||q>0)&&(v[M]=new k.LineRangeMapping(new m.LineRange(A.original.startLineNumber-V,A.original.endLineNumberExclusive+q),new m.LineRange(A.modified.startLineNumber-V,A.modified.endLineNumberExclusive+q)))}return v}function g(a,r,u){if(a.trim()===r.trim())return!0;if(a.length>300&&r.length>300)return!1;const f=new p.MyersDiffAlgorithm().compute(new _.LinesSliceCharSequence([a],new n.Range(1,1,1,a.length),!1),new _.LinesSliceCharSequence([r],new n.Range(1,1,1,r.length),!1),u);let h=0;const v=d.SequenceDiff.invert(f.diffs,a.length);for(const D of v)D.seq1Range.forEach(T=>{(0,b.isSpace)(a.charCodeAt(T))||h++});function w(D){let T=0;for(let M=0;Mr.length?a:r);return h/S>.6&&S>10}function c(a){if(a.length===0)return a;a.sort((0,I.compareBy)(u=>u.original.startLineNumber,I.numberComparator));const r=[a[0]];for(let u=1;u=0&&v>=0&&h+v<=2){r[r.length-1]=C.join(f);continue}r.push(f)}return r}function l(a,r){const u=new E.MonotonousArray(a);return r=r.filter(C=>{const f=u.findLastMonotonous(w=>w.original.startLineNumberw.modified.startLineNumberH===z))return new i.LinesDiff([],[],!1);if(u.length===1&&u[0].length===0||C.length===1&&C[0].length===0)return new i.LinesDiff([new s.DetailedLineRangeMapping(new I.LineRange(1,u.length+1),new I.LineRange(1,C.length+1),[new s.RangeMapping(new y.Range(1,1,u.length,u[u.length-1].length+1),new y.Range(1,1,C.length,C[C.length-1].length+1))])],[],!1);const h=f.maxComputationTimeMs===0?m.InfiniteTimeout.instance:new m.DateTimeout(f.maxComputationTimeMs),v=!f.ignoreTrimWhitespace,w=new Map;function S(H){let z=w.get(H);return z===void 0&&(z=w.size,w.set(H,z)),z}const L=u.map(H=>S(H.trim())),D=C.map(H=>S(H.trim())),T=new o.LineSequence(L,u),M=new o.LineSequence(D,C),A=T.length+M.length<1700?this.dynamicProgrammingDiffing.compute(T,M,h,(H,z)=>u[H]===C[z]?C[z].length===0?.1:1+Math.log(1+C[z].length):.99):this.myersDiffingAlgorithm.compute(T,M,h);let P=A.diffs,N=A.hitTimeout;P=(0,n.optimizeSequenceDiffs)(T,M,P),P=(0,n.removeVeryShortMatchingLinesBetweenDiffs)(T,M,P);const O=[],F=H=>{if(v)for(let z=0;zH.seq1Range.start-x===H.seq2Range.start-W);const z=H.seq1Range.start-x;F(z),x=H.seq1Range.endExclusive,W=H.seq2Range.endExclusive;const U=this.refineDiff(u,C,H,h,v);U.hitTimeout&&(N=!0);for(const j of U.mappings)O.push(j)}F(u.length-x);const V=c(O,u,C);let q=[];return f.computeMoves&&(q=this.computeMoves(V,u,C,L,D,h,v)),(0,k.assertFn)(()=>{function H(U,j){if(U.lineNumber<1||U.lineNumber>j.length)return!1;const Y=j[U.lineNumber-1];return!(U.column<1||U.column>Y.length+1)}function z(U,j){return!(U.startLineNumber<1||U.startLineNumber>j.length+1||U.endLineNumberExclusive<1||U.endLineNumberExclusive>j.length+1)}for(const U of V){if(!U.innerChanges)return!1;for(const j of U.innerChanges)if(!(H(j.modifiedRange.getStartPosition(),C)&&H(j.modifiedRange.getEndPosition(),C)&&H(j.originalRange.getStartPosition(),u)&&H(j.originalRange.getEndPosition(),u)))return!1;if(!z(U.modified,C)||!z(U.original,u))return!1}return!0}),new i.LinesDiff(V,q,N)}computeMoves(u,C,f,h,v,w,S){return(0,p.computeMovedLines)(u,C,f,h,v,w).map(T=>{const M=this.refineDiff(C,f,new m.SequenceDiff(T.original.toOffsetRange(),T.modified.toOffsetRange()),w,S),A=c(M.mappings,C,f,!0);return new i.MovedText(T,A)})}refineDiff(u,C,f,h,v){const S=a(f).toRangeMapping2(u,C),L=new t.LinesSliceCharSequence(u,S.originalRange,v),D=new t.LinesSliceCharSequence(C,S.modifiedRange,v),T=L.length+D.length<500?this.dynamicProgrammingDiffing.compute(L,D,h):this.myersDiffingAlgorithm.compute(L,D,h),M=!1;let A=T.diffs;M&&m.SequenceDiff.assertSorted(A),A=(0,n.optimizeSequenceDiffs)(L,D,A),M&&m.SequenceDiff.assertSorted(A),A=(0,n.extendDiffsToEntireWordIfAppropriate)(L,D,A),M&&m.SequenceDiff.assertSorted(A),A=(0,n.removeShortMatches)(L,D,A),M&&m.SequenceDiff.assertSorted(A),A=(0,n.removeVeryShortMatchingTextBetweenLongDiffs)(L,D,A),M&&m.SequenceDiff.assertSorted(A);const P=A.map(N=>new s.RangeMapping(L.translateRange(N.seq1Range),D.translateRange(N.seq2Range)));return M&&s.RangeMapping.assertSorted(P),{mappings:P,hitTimeout:T.hitTimeout}}}e.DefaultLinesDiffComputer=g;function c(r,u,C,f=!1){const h=[];for(const v of(0,d.groupAdjacentBy)(r.map(w=>l(w,u,C)),(w,S)=>w.original.overlapOrTouch(S.original)||w.modified.overlapOrTouch(S.modified))){const w=v[0],S=v[v.length-1];h.push(new s.DetailedLineRangeMapping(w.original.join(S.original),w.modified.join(S.modified),v.map(L=>L.innerChanges[0])))}return(0,k.assertFn)(()=>!f&&h.length>0&&(h[0].modified.startLineNumber!==h[0].original.startLineNumber||C.length-h[h.length-1].modified.endLineNumberExclusive!==u.length-h[h.length-1].original.endLineNumberExclusive)?!1:(0,k.checkAdjacentItems)(h,(v,w)=>w.original.startLineNumber-v.original.endLineNumberExclusive===w.modified.startLineNumber-v.modified.endLineNumberExclusive&&v.original.endLineNumberExclusive=C[r.modifiedRange.startLineNumber-1].length&&r.originalRange.startColumn-1>=u[r.originalRange.startLineNumber-1].length&&r.originalRange.startLineNumber<=r.originalRange.endLineNumber+h&&r.modifiedRange.startLineNumber<=r.modifiedRange.endLineNumber+h&&(f=1);const v=new I.LineRange(r.originalRange.startLineNumber+f,r.originalRange.endLineNumber+1+h),w=new I.LineRange(r.modifiedRange.startLineNumber+f,r.modifiedRange.endLineNumber+1+h);return new s.DetailedLineRangeMapping(v,w,[r])}function a(r){return new s.LineRangeMapping(new I.LineRange(r.seq1Range.start+1,r.seq1Range.endExclusive+1),new I.LineRange(r.seq2Range.start+1,r.seq2Range.endExclusive+1))}}),define(ne[560],se([1,0,190,232,105,11,4,90,55]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffComputer=e.LegacyLinesDiffComputer=void 0;const b=3;class p{computeDiff(C,f,h){const w=new c(C,f,{maxComputationTime:h.maxComputationTimeMs,shouldIgnoreTrimWhitespace:h.ignoreTrimWhitespace,shouldComputeCharChanges:!0,shouldMakePrettyDiff:!0,shouldPostProcessCharChanges:!0}).computeDiff(),S=[];let L=null;for(const D of w.changes){let T;D.originalEndLineNumber===0?T=new _.LineRange(D.originalStartLineNumber+1,D.originalStartLineNumber+1):T=new _.LineRange(D.originalStartLineNumber,D.originalEndLineNumber+1);let M;D.modifiedEndLineNumber===0?M=new _.LineRange(D.modifiedStartLineNumber+1,D.modifiedStartLineNumber+1):M=new _.LineRange(D.modifiedStartLineNumber,D.modifiedEndLineNumber+1);let A=new I.DetailedLineRangeMapping(T,M,D.charChanges?.map(P=>new I.RangeMapping(new y.Range(P.originalStartLineNumber,P.originalStartColumn,P.originalEndLineNumber,P.originalEndColumn),new y.Range(P.modifiedStartLineNumber,P.modifiedStartColumn,P.modifiedEndLineNumber,P.modifiedEndColumn))));L&&(L.modified.endLineNumberExclusive===A.modified.startLineNumber||L.original.endLineNumberExclusive===A.original.startLineNumber)&&(A=new I.DetailedLineRangeMapping(L.original.join(A.original),L.modified.join(A.modified),L.innerChanges&&A.innerChanges?L.innerChanges.concat(A.innerChanges):void 0),S.pop()),S.push(A),L=A}return(0,m.assertFn)(()=>(0,m.checkAdjacentItems)(S,(D,T)=>T.original.startLineNumber-D.original.endLineNumberExclusive===T.modified.startLineNumber-D.modified.endLineNumberExclusive&&D.original.endLineNumberExclusive(C===10?"\\n":String.fromCharCode(C))+`-(${this._lineNumbers[f]},${this._columns[f]})`).join(", ")+"]"}_assertIndex(C,f){if(C<0||C>=f.length)throw new Error("Illegal index")}getElements(){return this._charCodes}getStartLineNumber(C){return C>0&&C===this._lineNumbers.length?this.getEndLineNumber(C-1):(this._assertIndex(C,this._lineNumbers),this._lineNumbers[C])}getEndLineNumber(C){return C===-1?this.getStartLineNumber(C+1):(this._assertIndex(C,this._lineNumbers),this._charCodes[C]===10?this._lineNumbers[C]+1:this._lineNumbers[C])}getStartColumn(C){return C>0&&C===this._columns.length?this.getEndColumn(C-1):(this._assertIndex(C,this._columns),this._columns[C])}getEndColumn(C){return C===-1?this.getStartColumn(C+1):(this._assertIndex(C,this._columns),this._charCodes[C]===10?1:this._columns[C]+1)}}class i{constructor(C,f,h,v,w,S,L,D){this.originalStartLineNumber=C,this.originalStartColumn=f,this.originalEndLineNumber=h,this.originalEndColumn=v,this.modifiedStartLineNumber=w,this.modifiedStartColumn=S,this.modifiedEndLineNumber=L,this.modifiedEndColumn=D}static createFromDiffChange(C,f,h){const v=f.getStartLineNumber(C.originalStart),w=f.getStartColumn(C.originalStart),S=f.getEndLineNumber(C.originalStart+C.originalLength-1),L=f.getEndColumn(C.originalStart+C.originalLength-1),D=h.getStartLineNumber(C.modifiedStart),T=h.getStartColumn(C.modifiedStart),M=h.getEndLineNumber(C.modifiedStart+C.modifiedLength-1),A=h.getEndColumn(C.modifiedStart+C.modifiedLength-1);return new i(v,w,S,L,D,T,M,A)}}function s(u){if(u.length<=1)return u;const C=[u[0]];let f=C[0];for(let h=1,v=u.length;h0&&f.originalLength<20&&f.modifiedLength>0&&f.modifiedLength<20&&w()){const N=h.createCharSequence(C,f.originalStart,f.originalStart+f.originalLength-1),O=v.createCharSequence(C,f.modifiedStart,f.modifiedStart+f.modifiedLength-1);if(N.getElements().length>0&&O.getElements().length>0){let F=n(N,O,w,!0).changes;L&&(F=s(F)),P=[];for(let x=0,W=F.length;x1&&F>1;){const x=P.charCodeAt(O-2),W=N.charCodeAt(F-2);if(x!==W)break;O--,F--}(O>1||F>1)&&this._pushTrimWhitespaceCharChange(v,w+1,1,O,S+1,1,F)}{let O=a(P,1),F=a(N,1);const x=P.length+1,W=N.length+1;for(;O!0;const C=Date.now();return()=>Date.now()-Cnew d.LegacyLinesDiffComputer,getDefault:()=>new k.DefaultLinesDiffComputer}}),define(ne[318],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InternalEditorAction=void 0;class d{constructor(I,E,y,m,_,b,p){this.id=I,this.label=E,this.alias=y,this.metadata=m,this._precondition=_,this._run=b,this._contextKeyService=p}isSupported(){return this._contextKeyService.contextMatchesRules(this._precondition)}run(I){return this.isSupported()?this._run(I):Promise.resolve(void 0)}}e.InternalEditorAction=d}),define(ne[198],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorType=void 0,e.EditorType={ICodeEditor:"vs.editor.ICodeEditor",IDiffEditor:"vs.editor.IDiffEditor"}}),define(ne[168],se([1,0,198]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isCodeEditor=k,e.isDiffEditor=I,e.isCompositeEditor=E,e.getCodeEditor=y;function k(m){return m&&typeof m.getEditorType=="function"?m.getEditorType()===d.EditorType.ICodeEditor:!1}function I(m){return m&&typeof m.getEditorType=="function"?m.getEditorType()===d.EditorType.IDiffEditor:!1}function E(m){return!!m&&typeof m=="object"&&typeof m.onDidChangeActiveEditor=="function"}function y(m){return k(m)?m:I(m)?m.getModifiedEditor():E(m)&&k(m.activeCodeEditor)?m.activeCodeEditor:null}}),define(ne[130],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.registerEditorFeature=k,e.getEditorFeatures=I;const d=[];function k(E){d.push(E)}function I(){return d.slice(0)}}),define(ne[562],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorTheme=void 0;class d{get type(){return this._theme.type}get value(){return this._theme}constructor(I){this._theme=I}update(I){this._theme=I}getColor(I){return this._theme.getColor(I)}}e.EditorTheme=d}),define(ne[148],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TokenMetadata=void 0;class d{static getLanguageId(I){return(I&255)>>>0}static getTokenType(I){return(I&768)>>>8}static containsBalancedBrackets(I){return(I&1024)!==0}static getFontStyle(I){return(I&30720)>>>11}static getForeground(I){return(I&16744448)>>>15}static getBackground(I){return(I&4278190080)>>>24}static getClassNameFromMetadata(I){let y="mtk"+this.getForeground(I);const m=this.getFontStyle(I);return m&1&&(y+=" mtki"),m&2&&(y+=" mtkb"),m&4&&(y+=" mtku"),m&8&&(y+=" mtks"),y}static getInlineStyleFromMetadata(I,E){const y=this.getForeground(I),m=this.getFontStyle(I);let _=`color: ${E[y]};`;m&1&&(_+="font-style: italic;"),m&2&&(_+="font-weight: bold;");let b="";return m&4&&(b+=" underline"),m&8&&(b+=" line-through"),b&&(_+=`text-decoration:${b};`),_}static getPresentationFromMetadata(I){const E=this.getForeground(I),y=this.getFontStyle(I);return{foreground:E,italic:!!(y&1),bold:!!(y&2),underline:!!(y&4),strikethrough:!!(y&8)}}}e.TokenMetadata=d}),define(ne[563],se([1,0,33]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.computeDefaultDocumentColors=n;function k(o){const t=[];for(const i of o){const s=Number(i);(s||s===0&&i.replace(/\s/g,"")!=="")&&t.push(s)}return t}function I(o,t,i,s){return{red:o/255,blue:i/255,green:t/255,alpha:s}}function E(o,t){const i=t.index,s=t[0].length;if(!i)return;const g=o.positionAt(i);return{startLineNumber:g.lineNumber,startColumn:g.column,endLineNumber:g.lineNumber,endColumn:g.column+s}}function y(o,t){if(!o)return;const i=d.Color.Format.CSS.parseHex(t);if(i)return{range:o,color:I(i.rgba.r,i.rgba.g,i.rgba.b,i.rgba.a)}}function m(o,t,i){if(!o||t.length!==1)return;const g=t[0].values(),c=k(g);return{range:o,color:I(c[0],c[1],c[2],i?c[3]:1)}}function _(o,t,i){if(!o||t.length!==1)return;const g=t[0].values(),c=k(g),l=new d.Color(new d.HSLA(c[0],c[1]/100,c[2]/100,i?c[3]:1));return{range:o,color:I(l.rgba.r,l.rgba.g,l.rgba.b,l.rgba.a)}}function b(o,t){return typeof o=="string"?[...o.matchAll(t)]:o.findMatches(t)}function p(o){const t=[],s=b(o,/\b(rgb|rgba|hsl|hsla)(\([0-9\s,.\%]*\))|(#)([A-Fa-f0-9]{3})\b|(#)([A-Fa-f0-9]{4})\b|(#)([A-Fa-f0-9]{6})\b|(#)([A-Fa-f0-9]{8})\b/gm);if(s.length>0)for(const g of s){const c=g.filter(u=>u!==void 0),l=c[1],a=c[2];if(!a)continue;let r;if(l==="rgb"){const u=/^\(\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*\)$/gm;r=m(E(o,g),b(a,u),!1)}else if(l==="rgba"){const u=/^\(\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\s*\)$/gm;r=m(E(o,g),b(a,u),!0)}else if(l==="hsl"){const u=/^\(\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*\)$/gm;r=_(E(o,g),b(a,u),!1)}else if(l==="hsla"){const u=/^\(\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\s*\)$/gm;r=_(E(o,g),b(a,u),!0)}else l==="#"&&(r=y(E(o,g),l+a));r&&t.push(r)}return t}function n(o){return!o||typeof o.getValue!="function"||typeof o.positionAt!="function"?[]:p(o)}}),define(ne[131],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AutoClosingPairs=e.StandardAutoClosingPairConditional=e.IndentAction=void 0;var d;(function(y){y[y.None=0]="None",y[y.Indent=1]="Indent",y[y.IndentOutdent=2]="IndentOutdent",y[y.Outdent=3]="Outdent"})(d||(e.IndentAction=d={}));class k{constructor(m){if(this._neutralCharacter=null,this._neutralCharacterSearched=!1,this.open=m.open,this.close=m.close,this._inString=!0,this._inComment=!0,this._inRegEx=!0,Array.isArray(m.notIn))for(let _=0,b=m.notIn.length;_t&&(t=a),l>i&&(i=l),r>i&&(i=r)}t++,i++;const s=new k(i,t,0);for(let g=0,c=o.length;g=this._maxCharCode?0:this._states.get(o,t)}}e.StateMachine=I;let E=null;function y(){return E===null&&(E=new I([[1,104,2],[1,72,2],[1,102,6],[1,70,6],[2,116,3],[2,84,3],[3,116,4],[3,84,4],[4,112,5],[4,80,5],[5,115,9],[5,83,9],[5,58,10],[6,105,7],[6,73,7],[7,108,8],[7,76,8],[8,101,9],[8,69,9],[9,58,10],[10,47,11],[11,47,12]])),E}let m=null;function _(){if(m===null){m=new d.CharacterClassifier(0);const n=` <>'"\u3001\u3002\uFF61\uFF64\uFF0C\uFF0E\uFF1A\uFF1B\u2018\u3008\u300C\u300E\u3014\uFF08\uFF3B\uFF5B\uFF62\uFF63\uFF5D\uFF3D\uFF09\u3015\u300F\u300D\u3009\u2019\uFF40\uFF5E\u2026`;for(let t=0;ts);if(s>0){const l=t.charCodeAt(s-1),a=t.charCodeAt(c);(l===40&&a===41||l===91&&a===93||l===123&&a===125)&&c--}return{range:{startLineNumber:i,startColumn:s+1,endLineNumber:i,endColumn:c+2},url:t.substring(s,c+1)}}static computeLinks(o,t=y()){const i=_(),s=[];for(let g=1,c=o.getLineCount();g<=c;g++){const l=o.getLineContent(g),a=l.length;let r=0,u=0,C=0,f=1,h=!1,v=!1,w=!1,S=!1;for(;r0&&E.getLanguageId(n-1)===b;)n--;return new k(E,b,n,p+1,E.getStartOffset(n),E.getEndOffset(p))}class k{constructor(y,m,_,b,p,n){this._scopedLineTokensBrand=void 0,this._actual=y,this.languageId=m,this._firstTokenIndex=_,this._lastTokenIndex=b,this.firstCharOffset=p,this._lastCharOffset=n,this.languageIdCodec=y.languageIdCodec}getLineContent(){return this._actual.getLineContent().substring(this.firstCharOffset,this._lastCharOffset)}getLineLength(){return this._lastCharOffset-this.firstCharOffset}getActualLineContentBefore(y){return this._actual.getLineContent().substring(0,this.firstCharOffset+y)}getTokenCount(){return this._lastTokenIndex-this._firstTokenIndex}findTokenIndexAtOffset(y){return this._actual.findTokenIndexAtOffset(y+this.firstCharOffset)-this._firstTokenIndex}getStandardTokenType(y){return this._actual.getStandardTokenType(y+this._firstTokenIndex)}toIViewLineTokens(){return this._actual.sliceAndInflate(this.firstCharOffset,this._lastCharOffset,0)}}e.ScopedLineTokens=k;function I(E){return(E&3)!==0}}),define(ne[76],se([1,0,9,4,23,169,94,230]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditOperationResult=e.SingleCursorState=e.PartialViewCursorState=e.PartialModelCursorState=e.CursorState=e.CursorConfiguration=void 0,e.isQuote=c;const _=()=>!0,b=()=>!1,p=l=>l===" "||l===" ";class n{static shouldRecreate(a){return a.hasChanged(146)||a.hasChanged(132)||a.hasChanged(37)||a.hasChanged(77)||a.hasChanged(79)||a.hasChanged(80)||a.hasChanged(6)||a.hasChanged(7)||a.hasChanged(11)||a.hasChanged(9)||a.hasChanged(10)||a.hasChanged(14)||a.hasChanged(129)||a.hasChanged(50)||a.hasChanged(92)||a.hasChanged(131)}constructor(a,r,u,C){this.languageConfigurationService=C,this._cursorMoveConfigurationBrand=void 0,this._languageId=a;const f=u.options,h=f.get(146),v=f.get(50);this.readOnly=f.get(92),this.tabSize=r.tabSize,this.indentSize=r.indentSize,this.insertSpaces=r.insertSpaces,this.stickyTabStops=f.get(117),this.lineHeight=v.lineHeight,this.typicalHalfwidthCharacterWidth=v.typicalHalfwidthCharacterWidth,this.pageSize=Math.max(1,Math.floor(h.height/this.lineHeight)-2),this.useTabStops=f.get(129),this.wordSeparators=f.get(132),this.emptySelectionClipboard=f.get(37),this.copyWithSyntaxHighlighting=f.get(25),this.multiCursorMergeOverlapping=f.get(77),this.multiCursorPaste=f.get(79),this.multiCursorLimit=f.get(80),this.autoClosingBrackets=f.get(6),this.autoClosingComments=f.get(7),this.autoClosingQuotes=f.get(11),this.autoClosingDelete=f.get(9),this.autoClosingOvertype=f.get(10),this.autoSurround=f.get(14),this.autoIndent=f.get(12),this.wordSegmenterLocales=f.get(131),this.surroundingPairs={},this._electricChars=null,this.shouldAutoCloseBefore={quote:this._getShouldAutoClose(a,this.autoClosingQuotes,!0),comment:this._getShouldAutoClose(a,this.autoClosingComments,!1),bracket:this._getShouldAutoClose(a,this.autoClosingBrackets,!1)},this.autoClosingPairs=this.languageConfigurationService.getLanguageConfiguration(a).getAutoClosingPairs();const w=this.languageConfigurationService.getLanguageConfiguration(a).getSurroundingPairs();if(w)for(const L of w)this.surroundingPairs[L.open]=L.close;const S=this.languageConfigurationService.getLanguageConfiguration(a).comments;this.blockCommentStartToken=S?.blockCommentStartToken??null}get electricChars(){if(!this._electricChars){this._electricChars={};const a=this.languageConfigurationService.getLanguageConfiguration(this._languageId).electricCharacter?.getElectricCharacters();if(a)for(const r of a)this._electricChars[r]=!0}return this._electricChars}onElectricCharacter(a,r,u){const C=(0,E.createScopedLineTokens)(r,u-1),f=this.languageConfigurationService.getLanguageConfiguration(C.languageId).electricCharacter;return f?f.onElectricCharacter(a,C,u-C.firstCharOffset):null}normalizeIndentation(a){return(0,m.normalizeIndentation)(a,this.indentSize,this.insertSpaces)}_getShouldAutoClose(a,r,u){switch(r){case"beforeWhitespace":return p;case"languageDefined":return this._getLanguageDefinedShouldAutoClose(a,u);case"always":return _;case"never":return b}}_getLanguageDefinedShouldAutoClose(a,r){const u=this.languageConfigurationService.getLanguageConfiguration(a).getAutoCloseBeforeSet(r);return C=>u.indexOf(C)!==-1}visibleColumnFromColumn(a,r){return y.CursorColumns.visibleColumnFromColumn(a.getLineContent(r.lineNumber),r.column,this.tabSize)}columnFromVisibleColumn(a,r,u){const C=y.CursorColumns.columnFromVisibleColumn(a.getLineContent(r),u,this.tabSize),f=a.getLineMinColumn(r);if(Ch?h:C}}e.CursorConfiguration=n;class o{static fromModelState(a){return new t(a)}static fromViewState(a){return new i(a)}static fromModelSelection(a){const r=I.Selection.liftSelection(a),u=new s(k.Range.fromPositions(r.getSelectionStart()),0,0,r.getPosition(),0);return o.fromModelState(u)}static fromModelSelections(a){const r=[];for(let u=0,C=a.length;un,s=p>o,g=po||fp||C0&&p--,E.columnSelect(m,_,b.fromViewLineNumber,b.fromViewVisualColumn,b.toViewLineNumber,p)}static columnSelectRight(m,_,b){let p=0;const n=Math.min(b.fromViewLineNumber,b.toViewLineNumber),o=Math.max(b.fromViewLineNumber,b.toViewLineNumber);for(let i=n;i<=o;i++){const s=_.getLineMaxColumn(i),g=m.visibleColumnFromColumn(_,new k.Position(i,s));p=Math.max(p,g)}let t=b.toViewVisualColumn;return tn.getLineMinColumn(o.lineNumber))return o.delta(void 0,-d.prevCharLength(n.getLineContent(o.lineNumber),o.column-1));if(o.lineNumber>1){const t=o.lineNumber-1;return new I.Position(t,n.getLineMaxColumn(t))}else return o}static leftPositionAtomicSoftTabs(n,o,t){if(o.column<=n.getLineIndentColumn(o.lineNumber)){const i=n.getLineMinColumn(o.lineNumber),s=n.getLineContent(o.lineNumber),g=y.AtomicTabMoveOperations.atomicPosition(s,o.column-1,t,0);if(g!==-1&&g+1>=i)return new I.Position(o.lineNumber,g+1)}return this.leftPosition(n,o)}static left(n,o,t){const i=n.stickyTabStops?b.leftPositionAtomicSoftTabs(o,t,n.tabSize):b.leftPosition(o,t);return new _(i.lineNumber,i.column,0)}static moveLeft(n,o,t,i,s){let g,c;if(t.hasSelection()&&!i)g=t.selection.startLineNumber,c=t.selection.startColumn;else{const l=t.position.delta(void 0,-(s-1)),a=o.normalizePosition(b.clipPositionColumn(l,o),0),r=b.left(n,o,a);g=r.lineNumber,c=r.column}return t.move(i,g,c,0)}static clipPositionColumn(n,o){return new I.Position(n.lineNumber,b.clipRange(n.column,o.getLineMinColumn(n.lineNumber),o.getLineMaxColumn(n.lineNumber)))}static clipRange(n,o,t){return nt?t:n}static rightPosition(n,o,t){return tr?(t=r,c?i=o.getLineMaxColumn(t):i=Math.min(o.getLineMaxColumn(t),i)):i=n.columnFromVisibleColumn(o,t,a),f?s=0:s=a-k.CursorColumns.visibleColumnFromColumn(o.getLineContent(t),i,n.tabSize),l!==void 0){const h=new I.Position(t,i),v=o.normalizePosition(h,l);s=s+(i-v.column),t=v.lineNumber,i=v.column}return new _(t,i,s)}static down(n,o,t,i,s,g,c){return this.vertical(n,o,t,i,s,t+g,c,4)}static moveDown(n,o,t,i,s){let g,c;t.hasSelection()&&!i?(g=t.selection.endLineNumber,c=t.selection.endColumn):(g=t.position.lineNumber,c=t.position.column);let l=0,a;do if(a=b.down(n,o,g+l,c,t.leftoverVisibleColumns,s,!0),o.normalizePosition(new I.Position(a.lineNumber,a.column),2).lineNumber>g)break;while(l++<10&&g+l1&&this._isBlankLine(o,s);)s--;for(;s>1&&!this._isBlankLine(o,s);)s--;return t.move(i,s,o.getLineMinColumn(s),0)}static moveToNextBlankLine(n,o,t,i){const s=o.getLineCount();let g=t.position.lineNumber;for(;g=C.length+1)return!1;const f=C.charAt(u.column-2),h=i.get(f);if(!h)return!1;if((0,I.isQuote)(f)){if(t==="never")return!1}else if(o==="never")return!1;const v=C.charAt(u.column-1);let w=!1;for(const S of h)S.open===f&&S.close===v&&(w=!0);if(!w)return!1;if(n==="auto"){let S=!1;for(let L=0,D=c.length;L1){const s=o.getLineContent(i.lineNumber),g=d.firstNonWhitespaceIndex(s),c=g===-1?s.length+1:g+1;if(i.column<=c){const l=t.visibleColumnFromColumn(o,i),a=E.CursorColumns.prevIndentTabStop(l,t.indentSize),r=t.columnFromVisibleColumn(o,i.lineNumber,a);return new m.Range(i.lineNumber,r,i.lineNumber,i.column)}}return m.Range.fromPositions(b.getPositionAfterDeleteLeft(i,o),i)}static getPositionAfterDeleteLeft(n,o){if(n.column>1){const t=d.getLeftDeleteOffset(n.column-1,o.getLineContent(n.lineNumber));return n.with(void 0,t+1)}else if(n.lineNumber>1){const t=n.lineNumber-1;return new _.Position(t,o.getLineMaxColumn(t))}else return n}static cut(n,o,t){const i=[];let s=null;t.sort((g,c)=>_.Position.compare(g.getStartPosition(),c.getEndPosition()));for(let g=0,c=t.length;g1&&s?.endLineNumber!==a.lineNumber?(r=a.lineNumber-1,u=o.getLineMaxColumn(a.lineNumber-1),C=a.lineNumber,f=o.getLineMaxColumn(a.lineNumber)):(r=a.lineNumber,u=1,C=a.lineNumber,f=o.getLineMaxColumn(a.lineNumber));const h=new m.Range(r,u,C,f);s=h,h.isEmpty()?i[g]=null:i[g]=new k.ReplaceCommand(h,"")}else i[g]=null;else i[g]=new k.ReplaceCommand(l,"")}return new I.EditOperationResult(0,i,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!0})}}e.DeleteOperations=b}),define(ne[199],se([1,0,11,76,234,166,9,4]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WordPartOperations=e.WordOperations=void 0;class _{static _createWord(o,t,i,s,g){return{start:s,end:g,wordType:t,nextCharClass:i}}static _createIntlWord(o,t){return{start:o.index,end:o.index+o.segment.length,wordType:1,nextCharClass:t}}static _findPreviousWordOnLine(o,t,i){const s=t.getLineContent(i.lineNumber);return this._doFindPreviousWordOnLine(s,o,i)}static _doFindPreviousWordOnLine(o,t,i){let s=0;const g=t.findPrevIntlWordBeforeOrAtOffset(o,i.column-2);for(let c=i.column-2;c>=0;c--){const l=o.charCodeAt(c),a=t.get(l);if(g&&c===g.index)return this._createIntlWord(g,a);if(a===0){if(s===2)return this._createWord(o,s,a,c+1,this._findEndOfWord(o,t,s,c+1));s=1}else if(a===2){if(s===1)return this._createWord(o,s,a,c+1,this._findEndOfWord(o,t,s,c+1));s=2}else if(a===1&&s!==0)return this._createWord(o,s,a,c+1,this._findEndOfWord(o,t,s,c+1))}return s!==0?this._createWord(o,s,1,0,this._findEndOfWord(o,t,s,0)):null}static _findEndOfWord(o,t,i,s){const g=t.findNextIntlWordAtOrAfterOffset(o,s),c=o.length;for(let l=s;l=0;c--){const l=o.charCodeAt(c),a=t.get(l);if(g&&c===g.index)return c;if(a===1||i===1&&a===2||i===2&&a===0)return c+1}return 0}static moveWordLeft(o,t,i,s,g){let c=i.lineNumber,l=i.column;l===1&&c>1&&(c=c-1,l=t.getLineMaxColumn(c));let a=_._findPreviousWordOnLine(o,t,new y.Position(c,l));if(s===0)return new y.Position(c,a?a.start+1:1);if(s===1)return!g&&a&&a.wordType===2&&a.end-a.start===1&&a.nextCharClass===0&&(a=_._findPreviousWordOnLine(o,t,new y.Position(c,a.start+1))),new y.Position(c,a?a.start+1:1);if(s===3){for(;a&&a.wordType===2;)a=_._findPreviousWordOnLine(o,t,new y.Position(c,a.start+1));return new y.Position(c,a?a.start+1:1)}return a&&l<=a.end+1&&(a=_._findPreviousWordOnLine(o,t,new y.Position(c,a.start+1))),new y.Position(c,a?a.end+1:1)}static _moveWordPartLeft(o,t){const i=t.lineNumber,s=o.getLineMaxColumn(i);if(t.column===1)return i>1?new y.Position(i-1,o.getLineMaxColumn(i-1)):t;const g=o.getLineContent(i);for(let c=t.column-1;c>1;c--){const l=g.charCodeAt(c-2),a=g.charCodeAt(c-1);if(l===95&&a!==95)return new y.Position(i,c);if(l===45&&a!==45)return new y.Position(i,c);if((d.isLowerAsciiLetter(l)||d.isAsciiDigit(l))&&d.isUpperAsciiLetter(a))return new y.Position(i,c);if(d.isUpperAsciiLetter(l)&&d.isUpperAsciiLetter(a)&&c+1=a.start+1&&(a=_._findNextWordOnLine(o,t,new y.Position(g,a.end+1))),a?c=a.start+1:c=t.getLineMaxColumn(g);return new y.Position(g,c)}static _moveWordPartRight(o,t){const i=t.lineNumber,s=o.getLineMaxColumn(i);if(t.column===s)return i1?r=1:(a--,r=s.getLineMaxColumn(a)):(u&&r<=u.end+1&&(u=_._findPreviousWordOnLine(i,s,new y.Position(a,u.start+1))),u?r=u.end+1:r>1?r=1:(a--,r=s.getLineMaxColumn(a))),new m.Range(a,r,l.lineNumber,l.column)}static deleteInsideWord(o,t,i){if(!i.isEmpty())return i;const s=new y.Position(i.positionLineNumber,i.positionColumn),g=this._deleteInsideWordWhitespace(t,s);return g||this._deleteInsideWordDetermineDeleteRange(o,t,s)}static _charAtIsWhitespace(o,t){const i=o.charCodeAt(t);return i===32||i===9}static _deleteInsideWordWhitespace(o,t){const i=o.getLineContent(t.lineNumber),s=i.length;if(s===0)return null;let g=Math.max(t.column-2,0);if(!this._charAtIsWhitespace(i,g))return null;let c=Math.min(t.column-1,s-1);if(!this._charAtIsWhitespace(i,c))return null;for(;g>0&&this._charAtIsWhitespace(i,g-1);)g--;for(;c+11?new m.Range(i.lineNumber-1,t.getLineMaxColumn(i.lineNumber-1),i.lineNumber,1):i.lineNumberC.start+1<=i.column&&i.column<=C.end+1,l=(C,f)=>(C=Math.min(C,i.column),f=Math.max(f,i.column),new m.Range(i.lineNumber,C,i.lineNumber,f)),a=C=>{let f=C.start+1,h=C.end+1,v=!1;for(;h-11&&this._charAtIsWhitespace(s,f-2);)f--;return l(f,h)},r=_._findPreviousWordOnLine(o,t,i);if(r&&c(r))return a(r);const u=_._findNextWordOnLine(o,t,i);return u&&c(u)?a(u):r&&u?l(r.end+1,u.start+1):r?l(r.start+1,r.end+1):u?l(u.start+1,u.end+1):l(1,g+1)}static _deleteWordPartLeft(o,t){if(!t.isEmpty())return t;const i=t.getPosition(),s=_._moveWordPartLeft(o,i);return new m.Range(i.lineNumber,i.column,s.lineNumber,s.column)}static _findFirstNonWhitespaceChar(o,t){const i=o.length;for(let s=t;s=f.start+1&&(f=_._findNextWordOnLine(i,s,new y.Position(a,f.end+1))),f?r=f.start+1:r!!o)}}),define(ne[235],se([1,0,19,76,233,199,9,4]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CursorMove=e.CursorMoveCommands=void 0;class _{static addCursorDown(n,o,t){const i=[];let s=0;for(let g=0,c=o.length;ga&&(r=a,u=n.model.getLineMaxColumn(r)),k.CursorState.fromModelState(new k.SingleCursorState(new m.Range(g.lineNumber,1,r,u),2,0,new y.Position(r,u),0))}const l=o.modelState.selectionStart.getStartPosition().lineNumber;if(g.lineNumberl){const a=n.getLineCount();let r=c.lineNumber+1,u=1;return r>a&&(r=a,u=n.getLineMaxColumn(r)),k.CursorState.fromViewState(o.viewState.move(!0,r,u,0))}else{const a=o.modelState.selectionStart.getEndPosition();return k.CursorState.fromModelState(o.modelState.move(!0,a.lineNumber,a.column,0))}}static word(n,o,t,i){const s=n.model.validatePosition(i);return k.CursorState.fromModelState(E.WordOperations.word(n.cursorConfig,n.model,o.modelState,t,s))}static cancelSelection(n,o){if(!o.modelState.hasSelection())return new k.CursorState(o.modelState,o.viewState);const t=o.viewState.position.lineNumber,i=o.viewState.position.column;return k.CursorState.fromViewState(new k.SingleCursorState(new m.Range(t,i,t,i),0,0,new y.Position(t,i),0))}static moveTo(n,o,t,i,s){if(t){if(o.modelState.selectionStartKind===1)return this.word(n,o,t,i);if(o.modelState.selectionStartKind===2)return this.line(n,o,t,i,s)}const g=n.model.validatePosition(i),c=s?n.coordinatesConverter.validateViewPosition(new y.Position(s.lineNumber,s.column),g):n.coordinatesConverter.convertModelPositionToViewPosition(g);return k.CursorState.fromViewState(o.viewState.move(t,c.lineNumber,c.column,0))}static simpleMove(n,o,t,i,s,g){switch(t){case 0:return g===4?this._moveHalfLineLeft(n,o,i):this._moveLeft(n,o,i,s);case 1:return g===4?this._moveHalfLineRight(n,o,i):this._moveRight(n,o,i,s);case 2:return g===2?this._moveUpByViewLines(n,o,i,s):this._moveUpByModelLines(n,o,i,s);case 3:return g===2?this._moveDownByViewLines(n,o,i,s):this._moveDownByModelLines(n,o,i,s);case 4:return g===2?o.map(c=>k.CursorState.fromViewState(I.MoveOperations.moveToPrevBlankLine(n.cursorConfig,n,c.viewState,i))):o.map(c=>k.CursorState.fromModelState(I.MoveOperations.moveToPrevBlankLine(n.cursorConfig,n.model,c.modelState,i)));case 5:return g===2?o.map(c=>k.CursorState.fromViewState(I.MoveOperations.moveToNextBlankLine(n.cursorConfig,n,c.viewState,i))):o.map(c=>k.CursorState.fromModelState(I.MoveOperations.moveToNextBlankLine(n.cursorConfig,n.model,c.modelState,i)));case 6:return this._moveToViewMinColumn(n,o,i);case 7:return this._moveToViewFirstNonWhitespaceColumn(n,o,i);case 8:return this._moveToViewCenterColumn(n,o,i);case 9:return this._moveToViewMaxColumn(n,o,i);case 10:return this._moveToViewLastNonWhitespaceColumn(n,o,i);default:return null}}static viewportMove(n,o,t,i,s){const g=n.getCompletelyVisibleViewRange(),c=n.coordinatesConverter.convertViewRangeToModelRange(g);switch(t){case 11:{const l=this._firstLineNumberInRange(n.model,c,s),a=n.model.getLineFirstNonWhitespaceColumn(l);return[this._moveToModelPosition(n,o[0],i,l,a)]}case 13:{const l=this._lastLineNumberInRange(n.model,c,s),a=n.model.getLineFirstNonWhitespaceColumn(l);return[this._moveToModelPosition(n,o[0],i,l,a)]}case 12:{const l=Math.round((c.startLineNumber+c.endLineNumber)/2),a=n.model.getLineFirstNonWhitespaceColumn(l);return[this._moveToModelPosition(n,o[0],i,l,a)]}case 14:{const l=[];for(let a=0,r=o.length;at.endLineNumber-1?g=t.endLineNumber-1:sk.CursorState.fromViewState(I.MoveOperations.moveLeft(n.cursorConfig,n,s.viewState,t,i)))}static _moveHalfLineLeft(n,o,t){const i=[];for(let s=0,g=o.length;sk.CursorState.fromViewState(I.MoveOperations.moveRight(n.cursorConfig,n,s.viewState,t,i)))}static _moveHalfLineRight(n,o,t){const i=[];for(let s=0,g=o.length;sn.readSelectionFromMarkers(this.context))}getAll(){return this.cursors.map(n=>n.asCursorState())}getViewPositions(){return this.cursors.map(n=>n.viewState.position)}getTopMostViewPosition(){return(0,k.findFirstMin)(this.cursors,(0,d.compareBy)(n=>n.viewState.position,y.Position.compare)).viewState.position}getBottomMostViewPosition(){return(0,k.findLastMax)(this.cursors,(0,d.compareBy)(n=>n.viewState.position,y.Position.compare)).viewState.position}getSelections(){return this.cursors.map(n=>n.modelState.selection)}getViewSelections(){return this.cursors.map(n=>n.viewState.selection)}setSelections(n){this.setStates(I.CursorState.fromModelSelections(n))}getPrimaryCursor(){return this.cursors[0].asCursorState()}setStates(n){n!==null&&(this.cursors[0].setState(this.context,n[0].modelState,n[0].viewState),this._setSecondaryStates(n.slice(1)))}_setSecondaryStates(n){const o=this.cursors.length-1,t=n.length;if(ot){const i=o-t;for(let s=0;s=n+1&&this.lastAddedCursorIndex--,this.cursors[n+1].dispose(this.context),this.cursors.splice(n+1,1)}normalize(){if(this.cursors.length===1)return;const n=this.cursors.slice(0),o=[];for(let t=0,i=n.length;tt.selection,m.Range.compareRangesUsingStarts));for(let t=0;tu&&v.index--;n.splice(u,1),o.splice(r,1),this._removeSecondaryCursor(u-1),t--}}}}e.CursorCollection=b}),define(ne[568],se([1,0,131]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CharacterPairSupport=void 0;class k{static{this.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_QUOTES=`;:.,=}])> - `}static{this.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_BRACKETS=`'"\`;:.,=}])> - `}constructor(E){if(E.autoClosingPairs?this._autoClosingPairs=E.autoClosingPairs.map(y=>new d.StandardAutoClosingPairConditional(y)):E.brackets?this._autoClosingPairs=E.brackets.map(y=>new d.StandardAutoClosingPairConditional({open:y[0],close:y[1]})):this._autoClosingPairs=[],E.__electricCharacterSupport&&E.__electricCharacterSupport.docComment){const y=E.__electricCharacterSupport.docComment;this._autoClosingPairs.push(new d.StandardAutoClosingPairConditional({open:y.open,close:y.close||""}))}this._autoCloseBeforeForQuotes=typeof E.autoCloseBefore=="string"?E.autoCloseBefore:k.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_QUOTES,this._autoCloseBeforeForBrackets=typeof E.autoCloseBefore=="string"?E.autoCloseBefore:k.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_BRACKETS,this._surroundingPairs=E.surroundingPairs||this._autoClosingPairs}getAutoClosingPairs(){return this._autoClosingPairs}getAutoCloseBeforeSet(E){return E?this._autoCloseBeforeForQuotes:this._autoCloseBeforeForBrackets}getSurroundingPairs(){return this._surroundingPairs}}e.CharacterPairSupport=k}),define(ne[569],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IndentRulesSupport=void 0;function d(I){return I.global&&(I.lastIndex=0),!0}class k{constructor(E){this._indentationRules=E}shouldIncrease(E){return!!(this._indentationRules&&this._indentationRules.increaseIndentPattern&&d(this._indentationRules.increaseIndentPattern)&&this._indentationRules.increaseIndentPattern.test(E))}shouldDecrease(E){return!!(this._indentationRules&&this._indentationRules.decreaseIndentPattern&&d(this._indentationRules.decreaseIndentPattern)&&this._indentationRules.decreaseIndentPattern.test(E))}shouldIndentNextLine(E){return!!(this._indentationRules&&this._indentationRules.indentNextLinePattern&&d(this._indentationRules.indentNextLinePattern)&&this._indentationRules.indentNextLinePattern.test(E))}shouldIgnore(E){return!!(this._indentationRules&&this._indentationRules.unIndentedLinePattern&&d(this._indentationRules.unIndentedLinePattern)&&this._indentationRules.unIndentedLinePattern.test(E))}getIndentMetadata(E){let y=0;return this.shouldIncrease(E)&&(y+=1),this.shouldDecrease(E)&&(y+=2),this.shouldIndentNextLine(E)&&(y+=4),this.shouldIgnore(E)&&(y+=8),y}}e.IndentRulesSupport=k}),define(ne[570],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BasicInplaceReplace=void 0;class d{constructor(){this._defaultValueSet=[["true","false"],["True","False"],["Private","Public","Friend","ReadOnly","Partial","Protected","WriteOnly"],["public","protected","private"]]}static{this.INSTANCE=new d}navigateValueSet(I,E,y,m,_){if(I&&E){const b=this.doNavigateValueSet(E,_);if(b)return{range:I,value:b}}if(y&&m){const b=this.doNavigateValueSet(m,_);if(b)return{range:y,value:b}}return null}doNavigateValueSet(I,E){const y=this.numberReplace(I,E);return y!==null?y:this.textReplace(I,E)}numberReplace(I,E){const y=Math.pow(10,I.length-(I.lastIndexOf(".")+1));let m=Number(I);const _=parseFloat(I);return!isNaN(m)&&!isNaN(_)&&m===_?m===0&&!E?null:(m=Math.floor(m*y),m+=E?y:-y,String(m/y)):null}textReplace(I,E){return this.valueSetsReplace(this._defaultValueSet,I,E)}valueSetsReplace(I,E,y){let m=null;for(let _=0,b=I.length;m===null&&_=0?(m+=y?1:-1,m<0?m=I.length-1:m%=I.length,I[m]):null}}e.BasicInplaceReplace=d}),define(ne[571],se([1,0,8,11,131]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OnEnterSupport=void 0;class E{constructor(m){m=m||{},m.brackets=m.brackets||[["(",")"],["{","}"],["[","]"]],this._brackets=[],m.brackets.forEach(_=>{const b=E._createOpenBracketRegExp(_[0]),p=E._createCloseBracketRegExp(_[1]);b&&p&&this._brackets.push({open:_[0],openRegExp:b,close:_[1],closeRegExp:p})}),this._regExpRules=m.onEnterRules||[]}onEnter(m,_,b,p){if(m>=3)for(let n=0,o=this._regExpRules.length;ns.reg?(s.reg.lastIndex=0,s.reg.test(s.text)):!0))return t.action}if(m>=2&&b.length>0&&p.length>0)for(let n=0,o=this._brackets.length;n=2&&b.length>0){for(let n=0,o=this._brackets.length;n{const S=n(v.token,w.token);return S!==0?S:v.index-w.index});let c=0,l="000000",a="ffffff";for(;s.length>=1&&s[0].token==="";){const v=s.shift();v.fontStyle!==-1&&(c=v.fontStyle),v.foreground!==null&&(l=v.foreground),v.background!==null&&(a=v.background)}const r=new m;for(const v of g)r.getId(v);const u=r.getId(l),C=r.getId(a),f=new o(c,u,C),h=new t(f);for(let v=0,w=s.length;v"u"){const a=this._match(c),r=p(c);l=(a.metadata|r<<8)>>>0,this._cache.set(c,l)}return(l|g<<0)>>>0}}e.TokenTheme=_;const b=/\b(comment|string|regex|regexp)\b/;function p(s){const g=s.match(b);if(!g)return 0;switch(g[1]){case"comment":return 1;case"string":return 2;case"regex":return 3;case"regexp":return 3}throw new Error("Unexpected match for standard token type!")}function n(s,g){return sg?1:0}class o{constructor(g,c,l){this._themeTrieElementRuleBrand=void 0,this._fontStyle=g,this._foreground=c,this._background=l,this.metadata=(this._fontStyle<<11|this._foreground<<15|this._background<<24)>>>0}clone(){return new o(this._fontStyle,this._foreground,this._background)}acceptOverwrite(g,c,l){g!==-1&&(this._fontStyle=g),c!==0&&(this._foreground=c),l!==0&&(this._background=l),this.metadata=(this._fontStyle<<11|this._foreground<<15|this._background<<24)>>>0}}e.ThemeTrieElementRule=o;class t{constructor(g){this._themeTrieElementBrand=void 0,this._mainRule=g,this._children=new Map}match(g){if(g==="")return this._mainRule;const c=g.indexOf(".");let l,a;c===-1?(l=g,a=""):(l=g.substring(0,c),a=g.substring(c+1));const r=this._children.get(l);return typeof r<"u"?r.match(a):this._mainRule}insert(g,c,l,a){if(g===""){this._mainRule.acceptOverwrite(c,l,a);return}const r=g.indexOf(".");let u,C;r===-1?(u=g,C=""):(u=g.substring(0,r),C=g.substring(r+1));let f=this._children.get(u);typeof f>"u"&&(f=new t(this._mainRule.clone()),this._children.set(u,f)),f.insert(C,c,l,a)}}e.ThemeTrieElement=t;function i(s){const g=[];for(let c=1,l=s.length;c=m&&(h=h-C%m),h}function t(C,f){return C.reduce((h,v)=>o(h,f(v)),e.lengthZero)}function i(C,f){return C===f}function s(C,f){const h=C,v=f;if(v-h<=0)return e.lengthZero;const S=Math.floor(h/m),L=Math.floor(v/m),D=v-L*m;if(S===L){const T=h-S*m;return _(0,D-T)}else return _(L-S,D)}function g(C,f){return C=f}function a(C){return _(C.lineNumber-1,C.column-1)}function r(C,f){const h=C,v=Math.floor(h/m),w=h-v*m,S=f,L=Math.floor(S/m),D=S-L*m;return new k.Range(v+1,w+1,L+1,D+1)}function u(C){const f=(0,d.splitLines)(C);return _(f.length-1,f[f.length-1].length)}}),define(ne[200],se([1,0,4,106]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BeforeEditPositionMapper=e.TextEditInfo=void 0;class I{static fromModelContentChanges(_){return _.map(p=>{const n=d.Range.lift(p.range);return new I((0,k.positionToLength)(n.getStartPosition()),(0,k.positionToLength)(n.getEndPosition()),(0,k.lengthOfString)(p.text))}).reverse()}constructor(_,b,p){this.startOffset=_,this.endOffset=b,this.newLength=p}toString(){return`[${(0,k.lengthToObj)(this.startOffset)}...${(0,k.lengthToObj)(this.endOffset)}) -> ${(0,k.lengthToObj)(this.newLength)}`}}e.TextEditInfo=I;class E{constructor(_){this.nextEditIdx=0,this.deltaOldToNewLineCount=0,this.deltaOldToNewColumnCount=0,this.deltaLineIdxInOld=-1,this.edits=_.map(b=>y.from(b))}getOffsetBeforeChange(_){return this.adjustNextEdit(_),this.translateCurToOld(_)}getDistanceToNextChange(_){this.adjustNextEdit(_);const b=this.edits[this.nextEditIdx],p=b?this.translateOldToCur(b.offsetObj):null;return p===null?null:(0,k.lengthDiffNonNegative)(_,p)}translateOldToCur(_){return _.lineCount===this.deltaLineIdxInOld?(0,k.toLength)(_.lineCount+this.deltaOldToNewLineCount,_.columnCount+this.deltaOldToNewColumnCount):(0,k.toLength)(_.lineCount+this.deltaOldToNewLineCount,_.columnCount)}translateCurToOld(_){const b=(0,k.lengthToObj)(_);return b.lineCount-this.deltaOldToNewLineCount===this.deltaLineIdxInOld?(0,k.toLength)(b.lineCount-this.deltaOldToNewLineCount,b.columnCount-this.deltaOldToNewColumnCount):(0,k.toLength)(b.lineCount-this.deltaOldToNewLineCount,b.columnCount)}adjustNextEdit(_){for(;this.nextEditIdx!0)||[];return o&&a.unshift(o),a}const l=[];for(;o&&!(0,I.lengthIsZero)(c);){const[a,r]=o.splitAt(c);l.push(a),c=(0,I.lengthDiffNonNegative)(a.lengthAfter,c),o=r??p.dequeue()}return(0,I.lengthIsZero)(c)||l.push(new y(!1,c,c)),l}const i=[];function s(c,l,a){if(i.length>0&&(0,I.lengthEquals)(i[i.length-1].endOffset,c)){const r=i[i.length-1];i[i.length-1]=new k.TextEditInfo(r.startOffset,l,(0,I.lengthAdd)(r.newLength,a))}else i.push({startOffset:c,endOffset:l,newLength:a})}let g=I.lengthZero;for(const c of n){const l=t(c.lengthBefore);if(c.modified){const a=(0,I.sumLengths)(l,u=>u.lengthBefore),r=(0,I.lengthAdd)(g,a);s(g,r,c.lengthAfter),g=r}else for(const a of l){const r=g;g=(0,I.lengthAdd)(g,a.lengthBefore),a.modified&&s(r,g,a.lengthAfter)}}return i}class y{constructor(b,p,n){this.modified=b,this.lengthBefore=p,this.lengthAfter=n}splitAt(b){const p=(0,I.lengthDiffNonNegative)(b,this.lengthAfter);return(0,I.lengthEquals)(p,I.lengthZero)?[this,void 0]:this.modified?[new y(this.modified,this.lengthBefore,b),new y(this.modified,I.lengthZero,p)]:[new y(this.modified,b,b),new y(this.modified,p,p)]}toString(){return`${this.modified?"M":"U"}:${(0,I.lengthToObj)(this.lengthBefore)} -> ${(0,I.lengthToObj)(this.lengthAfter)}`}}function m(_){const b=[];let p=I.lengthZero;for(const n of _){const o=(0,I.lengthDiffNonNegative)(p,n.startOffset);(0,I.lengthIsZero)(o)||b.push(new y(!1,o,o));const t=(0,I.lengthDiffNonNegative)(n.startOffset,n.endOffset);b.push(new y(!0,t,n.newLength)),p=n.endOffset}return b}}),define(ne[573],se([1,0,106]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.NodeReader=void 0;class k{constructor(m){this.lastOffset=d.lengthZero,this.nextNodes=[m],this.offsets=[d.lengthZero],this.idxs=[]}readLongestNodeAt(m,_){if((0,d.lengthLessThan)(m,this.lastOffset))throw new Error("Invalid offset");for(this.lastOffset=m;;){const b=E(this.nextNodes);if(!b)return;const p=E(this.offsets);if((0,d.lengthLessThan)(m,p))return;if((0,d.lengthLessThan)(p,m))if((0,d.lengthAdd)(p,b.length)<=m)this.nextNodeAfterCurrent();else{const n=I(b);n!==-1?(this.nextNodes.push(b.getChild(n)),this.offsets.push(p),this.idxs.push(n)):this.nextNodeAfterCurrent()}else{if(_(b))return this.nextNodeAfterCurrent(),b;{const n=I(b);if(n===-1){this.nextNodeAfterCurrent();return}else this.nextNodes.push(b.getChild(n)),this.offsets.push(p),this.idxs.push(n)}}}}nextNodeAfterCurrent(){for(;;){const m=E(this.offsets),_=E(this.nextNodes);if(this.nextNodes.pop(),this.offsets.pop(),this.idxs.length===0)break;const b=E(this.nextNodes),p=I(b,this.idxs[this.idxs.length-1]);if(p!==-1){this.nextNodes.push(b.getChild(p)),this.offsets.push((0,d.lengthAdd)(m,_.length)),this.idxs[this.idxs.length-1]=p;break}else this.idxs.pop()}}}e.NodeReader=k;function I(y,m=-1){for(;;){if(m++,m>=y.childrenLength)return-1;if(y.getChild(m))return m}}function E(y){return y.length>0?y[y.length-1]:void 0}}),define(ne[149],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DenseKeyProvider=e.identityKeyProvider=e.SmallImmutableSet=void 0;const d=[];class k{static{this.cache=new Array(129)}static create(y,m){if(y<=128&&m.length===0){let _=k.cache[y];return _||(_=new k(y,m),k.cache[y]=_),_}return new k(y,m)}static{this.empty=k.create(0,d)}static getEmpty(){return this.empty}constructor(y,m){this.items=y,this.additionalItems=m}add(y,m){const _=m.getKey(y);let b=_>>5;if(b===0){const n=1<<_|this.items;return n===this.items?this:k.create(n,this.additionalItems)}b--;const p=this.additionalItems.slice(0);for(;p.length=b.length)return null;const s=p,g=b[s].listHeight;for(p++;p=2?I(s===0&&p===b.length?b:b.slice(s,p),!1):b[s]}let o=n(),t=n();if(!t)return o;for(let s=n();s;s=n())E(o,t)<=E(t,s)?(o=y(o,t),t=s):t=y(t,s);return y(o,t)}function I(b,p=!1){if(b.length===0)return null;if(b.length===1)return b[0];let n=b.length;for(;n>3;){const o=n>>1;for(let t=0;t=3?b[2]:null,p)}function E(b,p){return Math.abs(b.listHeight-p.listHeight)}function y(b,p){return b.listHeight===p.listHeight?d.ListAstNode.create23(b,p,null,!1):b.listHeight>p.listHeight?m(b,p):_(p,b)}function m(b,p){b=b.toMutable();let n=b;const o=[];let t;for(;;){if(p.listHeight===n.listHeight){t=p;break}if(n.kind!==4)throw new Error("unexpected");o.push(n),n=n.makeLastElementMutable()}for(let i=o.length-1;i>=0;i--){const s=o[i];t?s.childrenLength>=3?t=d.ListAstNode.create23(s.unappendChild(),t,null,!1):(s.appendChildOfSameHeight(t),t=void 0):s.handleChildrenChanged()}return t?d.ListAstNode.create23(b,t,null,!1):b}function _(b,p){b=b.toMutable();let n=b;const o=[];for(;p.listHeight!==n.listHeight;){if(n.kind!==4)throw new Error("unexpected");o.push(n),n=n.makeFirstElementMutable()}let t=p;for(let i=o.length-1;i>=0;i--){const s=o[i];t?s.childrenLength>=3?t=d.ListAstNode.create23(t,s.unprependChild(),null,!1):(s.prependChildOfSameHeight(t),t=void 0):s.handleChildrenChanged()}return t?d.ListAstNode.create23(t,b,null,!1):b}}),define(ne[320],se([1,0,201,200,149,106,574,573]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.parseDocument=_;function _(p,n,o,t){return new b(p,n,o,t).parseDocument()}class b{constructor(n,o,t,i){if(this.tokenizer=n,this.createImmutableLists=i,this._itemsConstructed=0,this._itemsFromCache=0,t&&i)throw new Error("Not supported");this.oldNodeReader=t?new m.NodeReader(t):void 0,this.positionMapper=new k.BeforeEditPositionMapper(o)}parseDocument(){this._itemsConstructed=0,this._itemsFromCache=0;let n=this.parseList(I.SmallImmutableSet.getEmpty(),0);return n||(n=d.ListAstNode.getEmpty()),n}parseList(n,o){const t=[];for(;;){let s=this.tryReadChildFromCache(n);if(!s){const g=this.tokenizer.peek();if(!g||g.kind===2&&g.bracketIds.intersects(n))break;s=this.parseChild(n,o+1)}s.kind===4&&s.childrenLength===0||t.push(s)}return this.oldNodeReader?(0,y.concat23Trees)(t):(0,y.concat23TreesOfSameHeight)(t,this.createImmutableLists)}tryReadChildFromCache(n){if(this.oldNodeReader){const o=this.positionMapper.getDistanceToNextChange(this.tokenizer.offset);if(o===null||!(0,E.lengthIsZero)(o)){const t=this.oldNodeReader.readLongestNodeAt(this.positionMapper.getOffsetBeforeChange(this.tokenizer.offset),i=>o!==null&&!(0,E.lengthLessThan)(i.length,o)?!1:i.canBeReused(n));if(t)return this._itemsFromCache++,this.tokenizer.skip(t.length),t}}}parseChild(n,o){this._itemsConstructed++;const t=this.tokenizer.read();switch(t.kind){case 2:return new d.InvalidBracketAstNode(t.bracketIds,t.length);case 0:return t.astNode;case 1:{if(o>300)return new d.TextAstNode(t.length);const i=n.merge(t.bracketIds),s=this.parseList(i,o+1),g=this.tokenizer.peek();return g&&g.kind===2&&(g.bracketId===t.bracketId||g.bracketIds.intersects(t.bracketIds))?(this.tokenizer.read(),d.PairAstNode.create(t.astNode,s,g.astNode)):d.PairAstNode.create(t.astNode,s,null)}default:throw new Error("unexpected")}}}}),define(ne[236],se([1,0,8,148,201,106,149]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FastTokenizer=e.TextBufferTokenizer=e.Token=void 0;class m{constructor(o,t,i,s,g){this.length=o,this.kind=t,this.bracketId=i,this.bracketIds=s,this.astNode=g}}e.Token=m;class _{constructor(o,t){this.textModel=o,this.bracketTokens=t,this.reader=new b(this.textModel,this.bracketTokens),this._offset=E.lengthZero,this.didPeek=!1,this.peeked=null,this.textBufferLineCount=o.getLineCount(),this.textBufferLastLineLength=o.getLineLength(this.textBufferLineCount)}get offset(){return this._offset}get length(){return(0,E.toLength)(this.textBufferLineCount-1,this.textBufferLastLineLength)}skip(o){this.didPeek=!1,this._offset=(0,E.lengthAdd)(this._offset,o);const t=(0,E.lengthToObj)(this._offset);this.reader.setPosition(t.lineCount,t.columnCount)}read(){let o;return this.peeked?(this.didPeek=!1,o=this.peeked):o=this.reader.read(),o&&(this._offset=(0,E.lengthAdd)(this._offset,o.length)),o}peek(){return this.didPeek||(this.peeked=this.reader.read(),this.didPeek=!0),this.peeked}}e.TextBufferTokenizer=_;class b{constructor(o,t){this.textModel=o,this.bracketTokens=t,this.lineIdx=0,this.line=null,this.lineCharOffset=0,this.lineTokens=null,this.lineTokenOffset=0,this.peekedToken=null,this.textBufferLineCount=o.getLineCount(),this.textBufferLastLineLength=o.getLineLength(this.textBufferLineCount)}setPosition(o,t){o===this.lineIdx?(this.lineCharOffset=t,this.line!==null&&(this.lineTokenOffset=this.lineCharOffset===0?0:this.lineTokens.findTokenIndexAtOffset(this.lineCharOffset))):(this.lineIdx=o,this.lineCharOffset=t,this.line=null),this.peekedToken=null}read(){if(this.peekedToken){const g=this.peekedToken;return this.peekedToken=null,this.lineCharOffset+=(0,E.lengthGetColumnCountIfZeroLineCount)(g.length),g}if(this.lineIdx>this.textBufferLineCount-1||this.lineIdx===this.textBufferLineCount-1&&this.lineCharOffset>=this.textBufferLastLineLength)return null;this.line===null&&(this.lineTokens=this.textModel.tokenization.getLineTokens(this.lineIdx+1),this.line=this.lineTokens.getLineContent(),this.lineTokenOffset=this.lineCharOffset===0?0:this.lineTokens.findTokenIndexAtOffset(this.lineCharOffset));const o=this.lineIdx,t=this.lineCharOffset;let i=0;for(;;){const g=this.lineTokens,c=g.getCount();let l=null;if(this.lineTokenOffset1e3))break;if(i>1500)break}const s=(0,E.lengthDiff)(o,t,this.lineIdx,this.lineCharOffset);return new m(s,0,-1,y.SmallImmutableSet.getEmpty(),new I.TextAstNode(s))}}class p{constructor(o,t){this.text=o,this._offset=E.lengthZero,this.idx=0;const i=t.getRegExpStr(),s=i?new RegExp(i+`| -`,"gi"):null,g=[];let c,l=0,a=0,r=0,u=0;const C=[];for(let v=0;v<60;v++)C.push(new m((0,E.toLength)(0,v),0,-1,y.SmallImmutableSet.getEmpty(),new I.TextAstNode((0,E.toLength)(0,v))));const f=[];for(let v=0;v<60;v++)f.push(new m((0,E.toLength)(1,v),0,-1,y.SmallImmutableSet.getEmpty(),new I.TextAstNode((0,E.toLength)(1,v))));if(s)for(s.lastIndex=0;(c=s.exec(o))!==null;){const v=c.index,w=c[0];if(w===` -`)l++,a=v+1;else{if(r!==v){let S;if(u===l){const L=v-r;if(L_(o)).join("|")}}get regExpGlobal(){if(!this.hasRegExp){const n=this.getRegExpStr();this._regExpGlobal=n?new RegExp(n,"gi"):null,this.hasRegExp=!0}return this._regExpGlobal}getToken(n){return this.map.get(n.toLowerCase())}findClosingTokenText(n){for(const[o,t]of this.map)if(t.kind===2&&t.bracketIds.intersects(n))return o}get isEmpty(){return this.map.size===0}}e.BracketTokens=m;function _(p){let n=(0,d.escapeRegExpCharacters)(p);return/^[\w ]+/.test(p)&&(n=`\\b${n}`),/[\w ]+$/.test(p)&&(n=`${n}\\b`),n}class b{constructor(n,o){this.denseKeyProvider=n,this.getLanguageConfiguration=o,this.languageIdToBracketTokens=new Map}didLanguageChange(n){return this.languageIdToBracketTokens.has(n)}getSingleLanguageBracketTokens(n){let o=this.languageIdToBracketTokens.get(n);return o||(o=m.createFromLanguage(this.getLanguageConfiguration(n),this.denseKeyProvider),this.languageIdToBracketTokens.set(n,o)),o}}e.LanguageAgnosticBracketTokens=b}),define(ne[575],se([1,0,321,106,320,149,236]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.fixBracketsInLine=m;function m(b,p){const n=new E.DenseKeyProvider,o=new d.LanguageAgnosticBracketTokens(n,l=>p.getLanguageConfiguration(l)),t=new y.TextBufferTokenizer(new _([b]),o),i=(0,I.parseDocument)(t,[],void 0,!0);let s="";const g=b.getLineContent();function c(l,a){if(l.kind===2)if(c(l.openingBracket,a),a=(0,k.lengthAdd)(a,l.openingBracket.length),l.child&&(c(l.child,a),a=(0,k.lengthAdd)(a,l.child.length)),l.closingBracket)c(l.closingBracket,a),a=(0,k.lengthAdd)(a,l.closingBracket.length);else{const u=o.getSingleLanguageBracketTokens(l.openingBracket.languageId).findClosingTokenText(l.openingBracket.bracketIds);s+=u}else if(l.kind!==3){if(l.kind===0||l.kind===1)s+=g.substring((0,k.lengthGetColumnCountIfZeroLineCount)(a),(0,k.lengthGetColumnCountIfZeroLineCount)((0,k.lengthAdd)(a,l.length)));else if(l.kind===4)for(const r of l.children)c(r,a),a=(0,k.lengthAdd)(a,r.length)}}return c(i,k.lengthZero),s}class _{constructor(p){this.lines=p,this.tokenization={getLineTokens:n=>this.lines[n-1]}}getLineCount(){return this.lines.length}getLineLength(p){return this.lines[p-1].getLineContent().length}}}),define(ne[576],se([1,0,13]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FixedArray=void 0;class k{constructor(y){this._default=y,this._store=[]}get(y){return y=this._store.length;)this._store[this._store.length]=this._default;this._store[y]=m}replace(y,m,_){if(y>=this._store.length)return;if(m===0){this.insert(y,_);return}else if(_===0){this.delete(y,m);return}const b=this._store.slice(0,y),p=this._store.slice(y+m),n=I(_,this._default);this._store=b.concat(n,p)}delete(y,m){m===0||y>=this._store.length||this._store.splice(y,m)}insert(y,m){if(m===0||y>=this._store.length)return;const _=[];for(let b=0;b0&&o>0||t>0&&i>0)return;const s=Math.abs(o-i),g=Math.abs(n-t);if(s===0){b.spacesDiff=g,g>0&&0<=t-1&&t-10?b++:v>1&&p++,k(n,o,u,h,g),g.looksLikeAlignment&&!(m&&y===g.spacesDiff)))continue;const S=g.spacesDiff;S<=i&&s[S]++,n=u,o=h}let c=m;b!==p&&(c=b{const u=s[r];u>a&&(a=u,l=r)}),l===4&&s[4]>0&&s[2]>0&&s[2]>=s[4]/2&&(l=2)}return{insertSpaces:c,tabSize:l}}}),define(ne[578],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IntervalTree=e.SENTINEL=e.IntervalNode=void 0,e.getNodeColor=d,e.nodeAcceptEdit=l,e.recomputeMaxEnd=P,e.intervalCompare=O;function d(F){return(F.metadata&1)>>>0}function k(F,x){F.metadata=F.metadata&254|x<<0}function I(F){return(F.metadata&2)>>>1===1}function E(F,x){F.metadata=F.metadata&253|(x?1:0)<<1}function y(F){return(F.metadata&4)>>>2===1}function m(F,x){F.metadata=F.metadata&251|(x?1:0)<<2}function _(F){return(F.metadata&64)>>>6===1}function b(F,x){F.metadata=F.metadata&191|(x?1:0)<<6}function p(F){return(F.metadata&24)>>>3}function n(F,x){F.metadata=F.metadata&231|x<<3}function o(F){return(F.metadata&32)>>>5===1}function t(F,x){F.metadata=F.metadata&223|(x?1:0)<<5}class i{constructor(x,W,V){this.metadata=0,this.parent=this,this.left=this,this.right=this,k(this,1),this.start=W,this.end=V,this.delta=0,this.maxEnd=V,this.id=x,this.ownerId=0,this.options=null,m(this,!1),b(this,!1),n(this,1),t(this,!1),this.cachedVersionId=0,this.cachedAbsoluteStart=W,this.cachedAbsoluteEnd=V,this.range=null,E(this,!1)}reset(x,W,V,q){this.start=W,this.end=V,this.maxEnd=V,this.cachedVersionId=x,this.cachedAbsoluteStart=W,this.cachedAbsoluteEnd=V,this.range=q}setOptions(x){this.options=x;const W=this.options.className;m(this,W==="squiggly-error"||W==="squiggly-warning"||W==="squiggly-info"),b(this,this.options.glyphMarginClassName!==null),n(this,this.options.stickiness),t(this,this.options.collapseOnReplaceEdit)}setCachedOffsets(x,W,V){this.cachedVersionId!==V&&(this.range=null),this.cachedVersionId=V,this.cachedAbsoluteStart=x,this.cachedAbsoluteEnd=W}detach(){this.parent=null,this.left=null,this.right=null}}e.IntervalNode=i,e.SENTINEL=new i(null,0,0),e.SENTINEL.parent=e.SENTINEL,e.SENTINEL.left=e.SENTINEL,e.SENTINEL.right=e.SENTINEL,k(e.SENTINEL,0);class s{constructor(){this.root=e.SENTINEL,this.requestNormalizeDelta=!1}intervalSearch(x,W,V,q,H,z){return this.root===e.SENTINEL?[]:h(this,x,W,V,q,H,z)}search(x,W,V,q){return this.root===e.SENTINEL?[]:f(this,x,W,V,q)}collectNodesFromOwner(x){return u(this,x)}collectNodesPostOrder(){return C(this)}insert(x){v(this,x),this._normalizeDeltaIfNecessary()}delete(x){S(this,x),this._normalizeDeltaIfNecessary()}resolveNode(x,W){const V=x;let q=0;for(;x!==this.root;)x===x.parent.right&&(q+=x.parent.delta),x=x.parent;const H=V.start+q,z=V.end+q;V.setCachedOffsets(H,z,W)}acceptReplace(x,W,V,q){const H=a(this,x,x+W);for(let z=0,U=H.length;zW||V===1?!1:V===2?!0:x}function l(F,x,W,V,q){const H=p(F),z=H===0||H===2,U=H===1||H===2,j=W-x,Y=V,G=Math.min(j,Y),K=F.start;let R=!1;const J=F.end;let ie=!1;x<=K&&J<=W&&o(F)&&(F.start=x,R=!0,F.end=x,ie=!0);{const he=q?1:j>0?2:0;!R&&c(K,z,x,he)&&(R=!0),!ie&&c(J,U,x,he)&&(ie=!0)}if(G>0&&!q){const he=j>Y?2:0;!R&&c(K,z,x+G,he)&&(R=!0),!ie&&c(J,U,x+G,he)&&(ie=!0)}{const he=q?1:0;!R&&c(K,z,W,he)&&(F.start=x+Y,R=!0),!ie&&c(J,U,W,he)&&(F.end=x+Y,ie=!0)}const ue=Y-j;R||(F.start=Math.max(0,K+ue)),ie||(F.end=Math.max(0,J+ue)),F.start>F.end&&(F.end=F.start)}function a(F,x,W){let V=F.root,q=0,H=0,z=0,U=0;const j=[];let Y=0;for(;V!==e.SENTINEL;){if(I(V)){E(V.left,!1),E(V.right,!1),V===V.parent.right&&(q-=V.parent.delta),V=V.parent;continue}if(!I(V.left)){if(H=q+V.maxEnd,HW){E(V,!0);continue}if(U=q+V.end,U>=x&&(V.setCachedOffsets(z,U,0),j[Y++]=V),E(V,!0),V.right!==e.SENTINEL&&!I(V.right)){q+=V.delta,V=V.right;continue}}return E(F.root,!1),j}function r(F,x,W,V){let q=F.root,H=0,z=0,U=0;const j=V-(W-x);for(;q!==e.SENTINEL;){if(I(q)){E(q.left,!1),E(q.right,!1),q===q.parent.right&&(H-=q.parent.delta),P(q),q=q.parent;continue}if(!I(q.left)){if(z=H+q.maxEnd,zW){q.start+=j,q.end+=j,q.delta+=j,(q.delta<-1073741824||q.delta>1073741824)&&(F.requestNormalizeDelta=!0),E(q,!0);continue}if(E(q,!0),q.right!==e.SENTINEL&&!I(q.right)){H+=q.delta,q=q.right;continue}}E(F.root,!1)}function u(F,x){let W=F.root;const V=[];let q=0;for(;W!==e.SENTINEL;){if(I(W)){E(W.left,!1),E(W.right,!1),W=W.parent;continue}if(W.left!==e.SENTINEL&&!I(W.left)){W=W.left;continue}if(W.ownerId===x&&(V[q++]=W),E(W,!0),W.right!==e.SENTINEL&&!I(W.right)){W=W.right;continue}}return E(F.root,!1),V}function C(F){let x=F.root;const W=[];let V=0;for(;x!==e.SENTINEL;){if(I(x)){E(x.left,!1),E(x.right,!1),x=x.parent;continue}if(x.left!==e.SENTINEL&&!I(x.left)){x=x.left;continue}if(x.right!==e.SENTINEL&&!I(x.right)){x=x.right;continue}W[V++]=x,E(x,!0)}return E(F.root,!1),W}function f(F,x,W,V,q){let H=F.root,z=0,U=0,j=0;const Y=[];let G=0;for(;H!==e.SENTINEL;){if(I(H)){E(H.left,!1),E(H.right,!1),H===H.parent.right&&(z-=H.parent.delta),H=H.parent;continue}if(H.left!==e.SENTINEL&&!I(H.left)){H=H.left;continue}U=z+H.start,j=z+H.end,H.setCachedOffsets(U,j,V);let K=!0;if(x&&H.ownerId&&H.ownerId!==x&&(K=!1),W&&y(H)&&(K=!1),q&&!_(H)&&(K=!1),K&&(Y[G++]=H),E(H,!0),H.right!==e.SENTINEL&&!I(H.right)){z+=H.delta,H=H.right;continue}}return E(F.root,!1),Y}function h(F,x,W,V,q,H,z){let U=F.root,j=0,Y=0,G=0,K=0;const R=[];let J=0;for(;U!==e.SENTINEL;){if(I(U)){E(U.left,!1),E(U.right,!1),U===U.parent.right&&(j-=U.parent.delta),U=U.parent;continue}if(!I(U.left)){if(Y=j+U.maxEnd,YW){E(U,!0);continue}if(K=j+U.end,K>=x){U.setCachedOffsets(G,K,H);let ie=!0;V&&U.ownerId&&U.ownerId!==V&&(ie=!1),q&&y(U)&&(ie=!1),z&&!_(U)&&(ie=!1),ie&&(R[J++]=U)}if(E(U,!0),U.right!==e.SENTINEL&&!I(U.right)){j+=U.delta,U=U.right;continue}}return E(F.root,!1),R}function v(F,x){if(F.root===e.SENTINEL)return x.parent=e.SENTINEL,x.left=e.SENTINEL,x.right=e.SENTINEL,k(x,0),F.root=x,F.root;w(F,x),N(x.parent);let W=x;for(;W!==F.root&&d(W.parent)===1;)if(W.parent===W.parent.parent.left){const V=W.parent.parent.right;d(V)===1?(k(W.parent,0),k(V,0),k(W.parent.parent,1),W=W.parent.parent):(W===W.parent.right&&(W=W.parent,T(F,W)),k(W.parent,0),k(W.parent.parent,1),M(F,W.parent.parent))}else{const V=W.parent.parent.left;d(V)===1?(k(W.parent,0),k(V,0),k(W.parent.parent,1),W=W.parent.parent):(W===W.parent.left&&(W=W.parent,M(F,W)),k(W.parent,0),k(W.parent.parent,1),T(F,W.parent.parent))}return k(F.root,0),x}function w(F,x){let W=0,V=F.root;const q=x.start,H=x.end;for(;;)if(O(q,H,V.start+W,V.end+W)<0)if(V.left===e.SENTINEL){x.start-=W,x.end-=W,x.maxEnd-=W,V.left=x;break}else V=V.left;else if(V.right===e.SENTINEL){x.start-=W+V.delta,x.end-=W+V.delta,x.maxEnd-=W+V.delta,V.right=x;break}else W+=V.delta,V=V.right;x.parent=V,x.left=e.SENTINEL,x.right=e.SENTINEL,k(x,1)}function S(F,x){let W,V;if(x.left===e.SENTINEL?(W=x.right,V=x,W.delta+=x.delta,(W.delta<-1073741824||W.delta>1073741824)&&(F.requestNormalizeDelta=!0),W.start+=x.delta,W.end+=x.delta):x.right===e.SENTINEL?(W=x.left,V=x):(V=L(x.right),W=V.right,W.start+=V.delta,W.end+=V.delta,W.delta+=V.delta,(W.delta<-1073741824||W.delta>1073741824)&&(F.requestNormalizeDelta=!0),V.start+=x.delta,V.end+=x.delta,V.delta=x.delta,(V.delta<-1073741824||V.delta>1073741824)&&(F.requestNormalizeDelta=!0)),V===F.root){F.root=W,k(W,0),x.detach(),D(),P(W),F.root.parent=e.SENTINEL;return}const q=d(V)===1;if(V===V.parent.left?V.parent.left=W:V.parent.right=W,V===x?W.parent=V.parent:(V.parent===x?W.parent=V:W.parent=V.parent,V.left=x.left,V.right=x.right,V.parent=x.parent,k(V,d(x)),x===F.root?F.root=V:x===x.parent.left?x.parent.left=V:x.parent.right=V,V.left!==e.SENTINEL&&(V.left.parent=V),V.right!==e.SENTINEL&&(V.right.parent=V)),x.detach(),q){N(W.parent),V!==x&&(N(V),N(V.parent)),D();return}N(W),N(W.parent),V!==x&&(N(V),N(V.parent));let H;for(;W!==F.root&&d(W)===0;)W===W.parent.left?(H=W.parent.right,d(H)===1&&(k(H,0),k(W.parent,1),T(F,W.parent),H=W.parent.right),d(H.left)===0&&d(H.right)===0?(k(H,1),W=W.parent):(d(H.right)===0&&(k(H.left,0),k(H,1),M(F,H),H=W.parent.right),k(H,d(W.parent)),k(W.parent,0),k(H.right,0),T(F,W.parent),W=F.root)):(H=W.parent.left,d(H)===1&&(k(H,0),k(W.parent,1),M(F,W.parent),H=W.parent.left),d(H.left)===0&&d(H.right)===0?(k(H,1),W=W.parent):(d(H.left)===0&&(k(H.right,0),k(H,1),T(F,H),H=W.parent.left),k(H,d(W.parent)),k(W.parent,0),k(H.left,0),M(F,W.parent),W=F.root));k(W,0),D()}function L(F){for(;F.left!==e.SENTINEL;)F=F.left;return F}function D(){e.SENTINEL.parent=e.SENTINEL,e.SENTINEL.delta=0,e.SENTINEL.start=0,e.SENTINEL.end=0}function T(F,x){const W=x.right;W.delta+=x.delta,(W.delta<-1073741824||W.delta>1073741824)&&(F.requestNormalizeDelta=!0),W.start+=x.delta,W.end+=x.delta,x.right=W.left,W.left!==e.SENTINEL&&(W.left.parent=x),W.parent=x.parent,x.parent===e.SENTINEL?F.root=W:x===x.parent.left?x.parent.left=W:x.parent.right=W,W.left=x,x.parent=W,P(x),P(W)}function M(F,x){const W=x.left;x.delta-=W.delta,(x.delta<-1073741824||x.delta>1073741824)&&(F.requestNormalizeDelta=!0),x.start-=W.delta,x.end-=W.delta,x.left=W.right,W.right!==e.SENTINEL&&(W.right.parent=x),W.parent=x.parent,x.parent===e.SENTINEL?F.root=W:x===x.parent.right?x.parent.right=W:x.parent.left=W,W.right=x,x.parent=W,P(x),P(W)}function A(F){let x=F.end;if(F.left!==e.SENTINEL){const W=F.left.maxEnd;W>x&&(x=W)}if(F.right!==e.SENTINEL){const W=F.right.maxEnd+F.delta;W>x&&(x=W)}return x}function P(F){F.maxEnd=A(F)}function N(F){for(;F!==e.SENTINEL;){const x=A(F);if(F.maxEnd===x)return;F.maxEnd=x,F=F.parent}}function O(F,x,W,V){return F===W?x-V:F-W}}),define(ne[579],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SENTINEL=e.TreeNode=void 0,e.leftest=k,e.righttest=I,e.leftRotate=_,e.rightRotate=b,e.rbDelete=p,e.fixInsert=n,e.updateTreeMetadata=o,e.recomputeTreeMetadata=t;class d{constructor(s,g){this.piece=s,this.color=g,this.size_left=0,this.lf_left=0,this.parent=this,this.left=this,this.right=this}next(){if(this.right!==e.SENTINEL)return k(this.right);let s=this;for(;s.parent!==e.SENTINEL&&s.parent.left!==s;)s=s.parent;return s.parent===e.SENTINEL?e.SENTINEL:s.parent}prev(){if(this.left!==e.SENTINEL)return I(this.left);let s=this;for(;s.parent!==e.SENTINEL&&s.parent.right!==s;)s=s.parent;return s.parent===e.SENTINEL?e.SENTINEL:s.parent}detach(){this.parent=null,this.left=null,this.right=null}}e.TreeNode=d,e.SENTINEL=new d(null,0),e.SENTINEL.parent=e.SENTINEL,e.SENTINEL.left=e.SENTINEL,e.SENTINEL.right=e.SENTINEL,e.SENTINEL.color=0;function k(i){for(;i.left!==e.SENTINEL;)i=i.left;return i}function I(i){for(;i.right!==e.SENTINEL;)i=i.right;return i}function E(i){return i===e.SENTINEL?0:i.size_left+i.piece.length+E(i.right)}function y(i){return i===e.SENTINEL?0:i.lf_left+i.piece.lineFeedCnt+y(i.right)}function m(){e.SENTINEL.parent=e.SENTINEL}function _(i,s){const g=s.right;g.size_left+=s.size_left+(s.piece?s.piece.length:0),g.lf_left+=s.lf_left+(s.piece?s.piece.lineFeedCnt:0),s.right=g.left,g.left!==e.SENTINEL&&(g.left.parent=s),g.parent=s.parent,s.parent===e.SENTINEL?i.root=g:s.parent.left===s?s.parent.left=g:s.parent.right=g,g.left=s,s.parent=g}function b(i,s){const g=s.left;s.left=g.right,g.right!==e.SENTINEL&&(g.right.parent=s),g.parent=s.parent,s.size_left-=g.size_left+(g.piece?g.piece.length:0),s.lf_left-=g.lf_left+(g.piece?g.piece.lineFeedCnt:0),s.parent===e.SENTINEL?i.root=g:s===s.parent.right?s.parent.right=g:s.parent.left=g,g.right=s,s.parent=g}function p(i,s){let g,c;if(s.left===e.SENTINEL?(c=s,g=c.right):s.right===e.SENTINEL?(c=s,g=c.left):(c=k(s.right),g=c.right),c===i.root){i.root=g,g.color=0,s.detach(),m(),i.root.parent=e.SENTINEL;return}const l=c.color===1;if(c===c.parent.left?c.parent.left=g:c.parent.right=g,c===s?(g.parent=c.parent,t(i,g)):(c.parent===s?g.parent=c:g.parent=c.parent,t(i,g),c.left=s.left,c.right=s.right,c.parent=s.parent,c.color=s.color,s===i.root?i.root=c:s===s.parent.left?s.parent.left=c:s.parent.right=c,c.left!==e.SENTINEL&&(c.left.parent=c),c.right!==e.SENTINEL&&(c.right.parent=c),c.size_left=s.size_left,c.lf_left=s.lf_left,t(i,c)),s.detach(),g.parent.left===g){const r=E(g),u=y(g);if(r!==g.parent.size_left||u!==g.parent.lf_left){const C=r-g.parent.size_left,f=u-g.parent.lf_left;g.parent.size_left=r,g.parent.lf_left=u,o(i,g.parent,C,f)}}if(t(i,g.parent),l){m();return}let a;for(;g!==i.root&&g.color===0;)g===g.parent.left?(a=g.parent.right,a.color===1&&(a.color=0,g.parent.color=1,_(i,g.parent),a=g.parent.right),a.left.color===0&&a.right.color===0?(a.color=1,g=g.parent):(a.right.color===0&&(a.left.color=0,a.color=1,b(i,a),a=g.parent.right),a.color=g.parent.color,g.parent.color=0,a.right.color=0,_(i,g.parent),g=i.root)):(a=g.parent.left,a.color===1&&(a.color=0,g.parent.color=1,b(i,g.parent),a=g.parent.left),a.left.color===0&&a.right.color===0?(a.color=1,g=g.parent):(a.left.color===0&&(a.right.color=0,a.color=1,_(i,a),a=g.parent.left),a.color=g.parent.color,g.parent.color=0,a.left.color=0,b(i,g.parent),g=i.root));g.color=0,m()}function n(i,s){for(t(i,s);s!==i.root&&s.parent.color===1;)if(s.parent===s.parent.parent.left){const g=s.parent.parent.right;g.color===1?(s.parent.color=0,g.color=0,s.parent.parent.color=1,s=s.parent.parent):(s===s.parent.right&&(s=s.parent,_(i,s)),s.parent.color=0,s.parent.parent.color=1,b(i,s.parent.parent))}else{const g=s.parent.parent.left;g.color===1?(s.parent.color=0,g.color=0,s.parent.parent.color=1,s=s.parent.parent):(s===s.parent.left&&(s=s.parent,b(i,s)),s.parent.color=0,s.parent.parent.color=1,_(i,s.parent.parent))}i.root.color=0}function o(i,s,g,c){for(;s!==i.root&&s!==e.SENTINEL;)s.parent.left===s&&(s.parent.size_left+=g,s.parent.lf_left+=c),s=s.parent}function t(i,s){let g=0,c=0;if(s!==i.root){for(;s!==i.root&&s===s.parent.right;)s=s.parent;if(s!==i.root)for(s=s.parent,g=E(s.left)-s.size_left,c=y(s.left)-s.lf_left,s.size_left+=g,s.lf_left+=c;s!==i.root&&(g!==0||c!==0);)s.parent.left===s&&(s.parent.size_left+=g,s.parent.lf_left+=c),s=s.parent}}}),define(ne[322],se([1,0,13,192]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PrefixSumIndexOfResult=e.ConstantTimePrefixSumComputer=e.PrefixSumComputer=void 0;class I{constructor(_){this.values=_,this.prefixSum=new Uint32Array(_.length),this.prefixSumValidIndex=new Int32Array(1),this.prefixSumValidIndex[0]=-1}insertValues(_,b){_=(0,k.toUint32)(_);const p=this.values,n=this.prefixSum,o=b.length;return o===0?!1:(this.values=new Uint32Array(p.length+o),this.values.set(p.subarray(0,_),0),this.values.set(p.subarray(_),_+o),this.values.set(b,_),_-1=0&&this.prefixSum.set(n.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}setValue(_,b){return _=(0,k.toUint32)(_),b=(0,k.toUint32)(b),this.values[_]===b?!1:(this.values[_]=b,_-1=p.length)return!1;const o=p.length-_;return b>=o&&(b=o),b===0?!1:(this.values=new Uint32Array(p.length-b),this.values.set(p.subarray(0,_),0),this.values.set(p.subarray(_+b),_),this.prefixSum=new Uint32Array(this.values.length),_-1=0&&this.prefixSum.set(n.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}getTotalSum(){return this.values.length===0?0:this._getPrefixSum(this.values.length-1)}getPrefixSum(_){return _<0?0:(_=(0,k.toUint32)(_),this._getPrefixSum(_))}_getPrefixSum(_){if(_<=this.prefixSumValidIndex[0])return this.prefixSum[_];let b=this.prefixSumValidIndex[0]+1;b===0&&(this.prefixSum[0]=this.values[0],b++),_>=this.values.length&&(_=this.values.length-1);for(let p=b;p<=_;p++)this.prefixSum[p]=this.prefixSum[p-1]+this.values[p];return this.prefixSumValidIndex[0]=Math.max(this.prefixSumValidIndex[0],_),this.prefixSum[_]}getIndexOf(_){_=Math.floor(_),this.getTotalSum();let b=0,p=this.values.length-1,n=0,o=0,t=0;for(;b<=p;)if(n=b+(p-b)/2|0,o=this.prefixSum[n],t=o-this.values[n],_=o)b=n+1;else break;return new y(n,_-t)}}e.PrefixSumComputer=I;class E{constructor(_){this._values=_,this._isValid=!1,this._validEndIndex=-1,this._prefixSum=[],this._indexBySum=[]}getTotalSum(){return this._ensureValid(),this._indexBySum.length}getPrefixSum(_){return this._ensureValid(),_===0?0:this._prefixSum[_-1]}getIndexOf(_){this._ensureValid();const b=this._indexBySum[_],p=b>0?this._prefixSum[b-1]:0;return new y(b,_-p)}removeValues(_,b){this._values.splice(_,b),this._invalidate(_)}insertValues(_,b){this._values=(0,d.arrayInsert)(this._values,_,b),this._invalidate(_)}_invalidate(_){this._isValid=!1,this._validEndIndex=Math.min(this._validEndIndex,_-1)}_ensureValid(){if(!this._isValid){for(let _=this._validEndIndex+1,b=this._values.length;_0?this._prefixSum[_-1]:0;this._prefixSum[_]=n+p;for(let o=0;o=0;let a=null;try{a=d.createRegExp(this.searchString,this.isRegex,{matchCase:this.matchCase,wholeWord:!1,multiline:l,global:!0,unicode:!0})}catch{return null}if(!a)return null;let r=!this.isRegex&&!l;return r&&this.searchString.toLowerCase()!==this.searchString.toUpperCase()&&(r=this.matchCase),new y.SearchData(a,this.wordSeparators?(0,k.getMapForWordSeparators)(this.wordSeparators,[]):null,r?this.searchString:null)}}e.SearchParams=_;function b(c){if(!c||c.length===0)return!1;for(let l=0,a=c.length;l=a)break;const u=c.charCodeAt(l);if(u===110||u===114||u===87)return!0}}return!1}function p(c,l,a){if(!a)return new y.FindMatch(c,null);const r=[];for(let u=0,C=l.length;u>0);a[C]>=l?u=C-1:a[C+1]>=l?(r=C,u=C):r=C+1}return r+1}}class o{static findMatches(l,a,r,u,C){const f=a.parseSearchRequest();return f?f.regex.multiline?this._doFindMatchesMultiline(l,r,new g(f.wordSeparators,f.regex),u,C):this._doFindMatchesLineByLine(l,r,f,u,C):[]}static _getMultilineMatchRange(l,a,r,u,C,f){let h,v=0;u?(v=u.findLineFeedCountBeforeOffset(C),h=a+C+v):h=a+C;let w;if(u){const T=u.findLineFeedCountBeforeOffset(C+f.length)-v;w=h+f.length+T}else w=h+f.length;const S=l.getPositionAt(h),L=l.getPositionAt(w);return new E.Range(S.lineNumber,S.column,L.lineNumber,L.column)}static _doFindMatchesMultiline(l,a,r,u,C){const f=l.getOffsetAt(a.getStartPosition()),h=l.getValueInRange(a,1),v=l.getEOL()===`\r -`?new n(h):null,w=[];let S=0,L;for(r.reset(0);L=r.next(h);)if(w[S++]=p(this._getMultilineMatchRange(l,f,h,v,L.index,L[0]),L,u),S>=C)return w;return w}static _doFindMatchesLineByLine(l,a,r,u,C){const f=[];let h=0;if(a.startLineNumber===a.endLineNumber){const w=l.getLineContent(a.startLineNumber).substring(a.startColumn-1,a.endColumn-1);return h=this._findMatchesInLine(r,w,a.startLineNumber,a.startColumn-1,h,f,u,C),f}const v=l.getLineContent(a.startLineNumber).substring(a.startColumn-1);h=this._findMatchesInLine(r,v,a.startLineNumber,a.startColumn-1,h,f,u,C);for(let w=a.startLineNumber+1;w=v))return C;return C}const S=new g(l.wordSeparators,l.regex);let L;S.reset(0);do if(L=S.next(a),L&&(f[C++]=p(new E.Range(r,L.index+1+u,r,L.index+1+L[0].length+u),L,h),C>=v))return C;while(L);return C}static findNextMatch(l,a,r,u){const C=a.parseSearchRequest();if(!C)return null;const f=new g(C.wordSeparators,C.regex);return C.regex.multiline?this._doFindNextMatchMultiline(l,r,f,u):this._doFindNextMatchLineByLine(l,r,f,u)}static _doFindNextMatchMultiline(l,a,r,u){const C=new I.Position(a.lineNumber,1),f=l.getOffsetAt(C),h=l.getLineCount(),v=l.getValueInRange(new E.Range(C.lineNumber,C.column,h,l.getLineMaxColumn(h)),1),w=l.getEOL()===`\r -`?new n(v):null;r.reset(a.column-1);const S=r.next(v);return S?p(this._getMultilineMatchRange(l,f,v,w,S.index,S[0]),S,u):a.lineNumber!==1||a.column!==1?this._doFindNextMatchMultiline(l,new I.Position(1,1),r,u):null}static _doFindNextMatchLineByLine(l,a,r,u){const C=l.getLineCount(),f=a.lineNumber,h=l.getLineContent(f),v=this._findFirstMatchInLine(r,h,f,a.column,u);if(v)return v;for(let w=1;w<=C;w++){const S=(f+w-1)%C,L=l.getLineContent(S+1),D=this._findFirstMatchInLine(r,L,S+1,1,u);if(D)return D}return null}static _findFirstMatchInLine(l,a,r,u,C){l.reset(u-1);const f=l.next(a);return f?p(new E.Range(r,f.index+1,r,f.index+1+f[0].length),f,C):null}static findPreviousMatch(l,a,r,u){const C=a.parseSearchRequest();if(!C)return null;const f=new g(C.wordSeparators,C.regex);return C.regex.multiline?this._doFindPreviousMatchMultiline(l,r,f,u):this._doFindPreviousMatchLineByLine(l,r,f,u)}static _doFindPreviousMatchMultiline(l,a,r,u){const C=this._doFindMatchesMultiline(l,new E.Range(1,1,a.lineNumber,a.column),r,u,10*m);if(C.length>0)return C[C.length-1];const f=l.getLineCount();return a.lineNumber!==f||a.column!==l.getLineMaxColumn(f)?this._doFindPreviousMatchMultiline(l,new I.Position(f,l.getLineMaxColumn(f)),r,u):null}static _doFindPreviousMatchLineByLine(l,a,r,u){const C=l.getLineCount(),f=a.lineNumber,h=l.getLineContent(f).substring(0,a.column-1),v=this._findLastMatchInLine(r,h,f,u);if(v)return v;for(let w=1;w<=C;w++){const S=(C+f-w-1)%C,L=l.getLineContent(S+1),D=this._findLastMatchInLine(r,L,S+1,u);if(D)return D}return null}static _findLastMatchInLine(l,a,r,u){let C=null,f;for(l.reset(0);f=l.next(a);)C=p(new E.Range(r,f.index+1,r,f.index+1+f[0].length),f,u);return C}}e.TextModelSearch=o;function t(c,l,a,r,u){if(r===0)return!0;const C=l.charCodeAt(r-1);if(c.get(C)!==0||C===13||C===10)return!0;if(u>0){const f=l.charCodeAt(r);if(c.get(f)!==0)return!0}return!1}function i(c,l,a,r,u){if(r+u===a)return!0;const C=l.charCodeAt(r+u);if(c.get(C)!==0||C===13||C===10)return!0;if(u>0){const f=l.charCodeAt(r+u-1);if(c.get(f)!==0)return!0}return!1}function s(c,l,a,r,u){return t(c,l,a,r,u)&&i(c,l,a,r,u)}class g{constructor(l,a){this._wordSeparators=l,this._searchRegex=a,this._prevMatchStartIndex=-1,this._prevMatchLength=0}reset(l){this._searchRegex.lastIndex=l,this._prevMatchStartIndex=-1,this._prevMatchLength=0}next(l){const a=l.length;let r;do{if(this._prevMatchStartIndex+this._prevMatchLength===a||(r=this._searchRegex.exec(l),!r))return null;const u=r.index,C=r[0].length;if(u===this._prevMatchStartIndex&&C===this._prevMatchLength){if(C===0){d.getNextCodePoint(l,a,this._searchRegex.lastIndex)>65535?this._searchRegex.lastIndex+=2:this._searchRegex.lastIndex+=1;continue}return null}if(this._prevMatchStartIndex=u,this._prevMatchLength=C,!this._wordSeparators||s(this._wordSeparators,l,a,u,C))return r}while(r);return null}}e.Searcher=g}),define(ne[324],se([1,0,9,4,40,579,202]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PieceTreeBase=e.StringBuffer=e.Piece=void 0,e.createLineStartsFast=p,e.createLineStarts=n;const m=65535;function _(c){let l;return c[c.length-1]<65536?l=new Uint16Array(c.length):l=new Uint32Array(c.length),l.set(c,0),l}class b{constructor(l,a,r,u,C){this.lineStarts=l,this.cr=a,this.lf=r,this.crlf=u,this.isBasicASCII=C}}function p(c,l=!0){const a=[0];let r=1;for(let u=0,C=c.length;u126)&&(f=!1)}const h=new b(_(c),r,u,C,f);return c.length=0,h}class o{constructor(l,a,r,u,C){this.bufferIndex=l,this.start=a,this.end=r,this.lineFeedCnt=u,this.length=C}}e.Piece=o;class t{constructor(l,a){this.buffer=l,this.lineStarts=a}}e.StringBuffer=t;class i{constructor(l,a){this._pieces=[],this._tree=l,this._BOM=a,this._index=0,l.root!==E.SENTINEL&&l.iterate(l.root,r=>(r!==E.SENTINEL&&this._pieces.push(r.piece),!0))}read(){return this._pieces.length===0?this._index===0?(this._index++,this._BOM):null:this._index>this._pieces.length-1?null:this._index===0?this._BOM+this._tree.getPieceContent(this._pieces[this._index++]):this._tree.getPieceContent(this._pieces[this._index++])}}class s{constructor(l){this._limit=l,this._cache=[]}get(l){for(let a=this._cache.length-1;a>=0;a--){const r=this._cache[a];if(r.nodeStartOffset<=l&&r.nodeStartOffset+r.node.piece.length>=l)return r}return null}get2(l){for(let a=this._cache.length-1;a>=0;a--){const r=this._cache[a];if(r.nodeStartLineNumber&&r.nodeStartLineNumber=l)return r}return null}set(l){this._cache.length>=this._limit&&this._cache.shift(),this._cache.push(l)}validate(l){let a=!1;const r=this._cache;for(let u=0;u=l){r[u]=null,a=!0;continue}}if(a){const u=[];for(const C of r)C!==null&&u.push(C);this._cache=u}}}class g{constructor(l,a,r){this.create(l,a,r)}create(l,a,r){this._buffers=[new t("",[0])],this._lastChangeBufferPos={line:0,column:0},this.root=E.SENTINEL,this._lineCnt=1,this._length=0,this._EOL=a,this._EOLLength=a.length,this._EOLNormalized=r;let u=null;for(let C=0,f=l.length;C0){l[C].lineStarts||(l[C].lineStarts=p(l[C].buffer));const h=new o(C+1,{line:0,column:0},{line:l[C].lineStarts.length-1,column:l[C].buffer.length-l[C].lineStarts[l[C].lineStarts.length-1]},l[C].lineStarts.length-1,l[C].buffer.length);this._buffers.push(l[C]),u=this.rbInsertRight(u,h)}this._searchCache=new s(1),this._lastVisitedLine={lineNumber:0,value:""},this.computeBufferMetadata()}normalizeEOL(l){const a=m,r=a-Math.floor(a/3),u=r*2;let C="",f=0;const h=[];if(this.iterate(this.root,v=>{const w=this.getNodeContent(v),S=w.length;if(f<=r||f+S0){const v=C.replace(/\r\n|\r|\n/g,l);h.push(new t(v,p(v)))}this.create(h,l,!0)}getEOL(){return this._EOL}setEOL(l){this._EOL=l,this._EOLLength=this._EOL.length,this.normalizeEOL(l)}createSnapshot(l){return new i(this,l)}getOffsetAt(l,a){let r=0,u=this.root;for(;u!==E.SENTINEL;)if(u.left!==E.SENTINEL&&u.lf_left+1>=l)u=u.left;else if(u.lf_left+u.piece.lineFeedCnt+1>=l){r+=u.size_left;const C=this.getAccumulatedValue(u,l-u.lf_left-2);return r+=C+a-1}else l-=u.lf_left+u.piece.lineFeedCnt,r+=u.size_left+u.piece.length,u=u.right;return r}getPositionAt(l){l=Math.floor(l),l=Math.max(0,l);let a=this.root,r=0;const u=l;for(;a!==E.SENTINEL;)if(a.size_left!==0&&a.size_left>=l)a=a.left;else if(a.size_left+a.piece.length>=l){const C=this.getIndexOf(a,l-a.size_left);if(r+=a.lf_left+C.index,C.index===0){const f=this.getOffsetAt(r+1,1),h=u-f;return new d.Position(r+1,h+1)}return new d.Position(r+1,C.remainder+1)}else if(l-=a.size_left+a.piece.length,r+=a.lf_left+a.piece.lineFeedCnt,a.right===E.SENTINEL){const C=this.getOffsetAt(r+1,1),f=u-l-C;return new d.Position(r+1,f+1)}else a=a.right;return new d.Position(1,1)}getValueInRange(l,a){if(l.startLineNumber===l.endLineNumber&&l.startColumn===l.endColumn)return"";const r=this.nodeAt2(l.startLineNumber,l.startColumn),u=this.nodeAt2(l.endLineNumber,l.endColumn),C=this.getValueInRange2(r,u);return a?a!==this._EOL||!this._EOLNormalized?C.replace(/\r\n|\r|\n/g,a):a===this.getEOL()&&this._EOLNormalized?C:C.replace(/\r\n|\r|\n/g,a):C}getValueInRange2(l,a){if(l.node===a.node){const h=l.node,v=this._buffers[h.piece.bufferIndex].buffer,w=this.offsetInBuffer(h.piece.bufferIndex,h.piece.start);return v.substring(w+l.remainder,w+a.remainder)}let r=l.node;const u=this._buffers[r.piece.bufferIndex].buffer,C=this.offsetInBuffer(r.piece.bufferIndex,r.piece.start);let f=u.substring(C+l.remainder,C+r.piece.length);for(r=r.next();r!==E.SENTINEL;){const h=this._buffers[r.piece.bufferIndex].buffer,v=this.offsetInBuffer(r.piece.bufferIndex,r.piece.start);if(r===a.node){f+=h.substring(v,v+a.remainder);break}else f+=h.substr(v,r.piece.length);r=r.next()}return f}getLinesContent(){const l=[];let a=0,r="",u=!1;return this.iterate(this.root,C=>{if(C===E.SENTINEL)return!0;const f=C.piece;let h=f.length;if(h===0)return!0;const v=this._buffers[f.bufferIndex].buffer,w=this._buffers[f.bufferIndex].lineStarts,S=f.start.line,L=f.end.line;let D=w[S]+f.start.column;if(u&&(v.charCodeAt(D)===10&&(D++,h--),l[a++]=r,r="",u=!1,h===0))return!0;if(S===L)return!this._EOLNormalized&&v.charCodeAt(D+h-1)===13?(u=!0,r+=v.substr(D,h-1)):r+=v.substr(D,h),!0;r+=this._EOLNormalized?v.substring(D,Math.max(D,w[S+1]-this._EOLLength)):v.substring(D,w[S+1]).replace(/(\r\n|\r|\n)$/,""),l[a++]=r;for(let T=S+1;Tx+M,a.reset(0)):(O=D.buffer,F=x=>x,a.reset(M));do if(P=a.next(O),P){if(F(P.index)>=A)return S;this.positionInBuffer(l,F(P.index)-T,N);const x=this.getLineFeedCnt(l.piece.bufferIndex,C,N),W=N.line===C.line?N.column-C.column+u:N.column+1,V=W+P[0].length;if(L[S++]=(0,y.createFindMatch)(new k.Range(r+x,W,r+x,V),P,v),F(P.index)+P[0].length>=A||S>=w)return S}while(P);return S}findMatchesLineByLine(l,a,r,u){const C=[];let f=0;const h=new y.Searcher(a.wordSeparators,a.regex);let v=this.nodeAt2(l.startLineNumber,l.startColumn);if(v===null)return[];const w=this.nodeAt2(l.endLineNumber,l.endColumn);if(w===null)return[];let S=this.positionInBuffer(v.node,v.remainder);const L=this.positionInBuffer(w.node,w.remainder);if(v.node===w.node)return this.findMatchesInNode(v.node,h,l.startLineNumber,l.startColumn,S,L,a,r,u,f,C),C;let D=l.startLineNumber,T=v.node;for(;T!==w.node;){const A=this.getLineFeedCnt(T.piece.bufferIndex,S,T.piece.end);if(A>=1){const N=this._buffers[T.piece.bufferIndex].lineStarts,O=this.offsetInBuffer(T.piece.bufferIndex,T.piece.start),F=N[S.line+A],x=D===l.startLineNumber?l.startColumn:1;if(f=this.findMatchesInNode(T,h,D,x,S,this.positionInBuffer(T,F-O),a,r,u,f,C),f>=u)return C;D+=A}const P=D===l.startLineNumber?l.startColumn-1:0;if(D===l.endLineNumber){const N=this.getLineContent(D).substring(P,l.endColumn-1);return f=this._findMatchesInLine(a,h,N,l.endLineNumber,P,f,C,r,u),C}if(f=this._findMatchesInLine(a,h,this.getLineContent(D).substr(P),D,P,f,C,r,u),f>=u)return C;D++,v=this.nodeAt2(D,1),T=v.node,S=this.positionInBuffer(v.node,v.remainder)}if(D===l.endLineNumber){const A=D===l.startLineNumber?l.startColumn-1:0,P=this.getLineContent(D).substring(A,l.endColumn-1);return f=this._findMatchesInLine(a,h,P,l.endLineNumber,A,f,C,r,u),C}const M=D===l.startLineNumber?l.startColumn:1;return f=this.findMatchesInNode(w.node,h,D,M,S,L,a,r,u,f,C),C}_findMatchesInLine(l,a,r,u,C,f,h,v,w){const S=l.wordSeparators;if(!v&&l.simpleSearch){const D=l.simpleSearch,T=D.length,M=r.length;let A=-T;for(;(A=r.indexOf(D,A+T))!==-1;)if((!S||(0,y.isValidMatch)(S,r,M,A,T))&&(h[f++]=new I.FindMatch(new k.Range(u,A+1+C,u,A+1+T+C),null),f>=w))return f;return f}let L;a.reset(0);do if(L=a.next(r),L&&(h[f++]=(0,y.createFindMatch)(new k.Range(u,L.index+1+C,u,L.index+1+L[0].length+C),L,v),f>=w))return f;while(L);return f}insert(l,a,r=!1){if(this._EOLNormalized=this._EOLNormalized&&r,this._lastVisitedLine.lineNumber=0,this._lastVisitedLine.value="",this.root!==E.SENTINEL){const{node:u,remainder:C,nodeStartOffset:f}=this.nodeAt(l),h=u.piece,v=h.bufferIndex,w=this.positionInBuffer(u,C);if(u.piece.bufferIndex===0&&h.end.line===this._lastChangeBufferPos.line&&h.end.column===this._lastChangeBufferPos.column&&f+h.length===l&&a.lengthl){const S=[];let L=new o(h.bufferIndex,w,h.end,this.getLineFeedCnt(h.bufferIndex,w,h.end),this.offsetInBuffer(v,h.end)-this.offsetInBuffer(v,w));if(this.shouldCheckCRLF()&&this.endWithCR(a)&&this.nodeCharCodeAt(u,C)===10){const A={line:L.start.line+1,column:0};L=new o(L.bufferIndex,A,L.end,this.getLineFeedCnt(L.bufferIndex,A,L.end),L.length-1),a+=` -`}if(this.shouldCheckCRLF()&&this.startWithLF(a))if(this.nodeCharCodeAt(u,C-1)===13){const A=this.positionInBuffer(u,C-1);this.deleteNodeTail(u,A),a="\r"+a,u.piece.length===0&&S.push(u)}else this.deleteNodeTail(u,w);else this.deleteNodeTail(u,w);const D=this.createNewPieces(a);L.length>0&&this.rbInsertRight(u,L);let T=u;for(let M=0;M=0;f--)C=this.rbInsertLeft(C,u[f]);this.validateCRLFWithPrevNode(C),this.deleteNodes(r)}insertContentToNodeRight(l,a){this.adjustCarriageReturnFromNext(l,a)&&(l+=` -`);const r=this.createNewPieces(l),u=this.rbInsertRight(a,r[0]);let C=u;for(let f=1;f=D)w=L+1;else break;return r?(r.line=L,r.column=v-T,null):{line:L,column:v-T}}getLineFeedCnt(l,a,r){if(r.column===0)return r.line-a.line;const u=this._buffers[l].lineStarts;if(r.line===u.length-1)return r.line-a.line;const C=u[r.line+1],f=u[r.line]+r.column;if(C>f+1)return r.line-a.line;const h=f-1;return this._buffers[l].buffer.charCodeAt(h)===13?r.line-a.line+1:r.line-a.line}offsetInBuffer(l,a){return this._buffers[l].lineStarts[a.line]+a.column}deleteNodes(l){for(let a=0;am){const S=[];for(;l.length>m;){const D=l.charCodeAt(m-1);let T;D===13||D>=55296&&D<=56319?(T=l.substring(0,m-1),l=l.substring(m-1)):(T=l.substring(0,m),l=l.substring(m));const M=p(T);S.push(new o(this._buffers.length,{line:0,column:0},{line:M.length-1,column:T.length-M[M.length-1]},M.length-1,T.length)),this._buffers.push(new t(T,M))}const L=p(l);return S.push(new o(this._buffers.length,{line:0,column:0},{line:L.length-1,column:l.length-L[L.length-1]},L.length-1,l.length)),this._buffers.push(new t(l,L)),S}let a=this._buffers[0].buffer.length;const r=p(l,!1);let u=this._lastChangeBufferPos;if(this._buffers[0].lineStarts[this._buffers[0].lineStarts.length-1]===a&&a!==0&&this.startWithLF(l)&&this.endWithCR(this._buffers[0].buffer)){this._lastChangeBufferPos={line:this._lastChangeBufferPos.line,column:this._lastChangeBufferPos.column+1},u=this._lastChangeBufferPos;for(let S=0;S=l-1)r=r.left;else if(r.lf_left+r.piece.lineFeedCnt>l-1){const v=this.getAccumulatedValue(r,l-r.lf_left-2),w=this.getAccumulatedValue(r,l-r.lf_left-1),S=this._buffers[r.piece.bufferIndex].buffer,L=this.offsetInBuffer(r.piece.bufferIndex,r.piece.start);return f+=r.size_left,this._searchCache.set({node:r,nodeStartOffset:f,nodeStartLineNumber:h-(l-1-r.lf_left)}),S.substring(L+v,L+w-a)}else if(r.lf_left+r.piece.lineFeedCnt===l-1){const v=this.getAccumulatedValue(r,l-r.lf_left-2),w=this._buffers[r.piece.bufferIndex].buffer,S=this.offsetInBuffer(r.piece.bufferIndex,r.piece.start);u=w.substring(S+v,S+r.piece.length);break}else l-=r.lf_left+r.piece.lineFeedCnt,f+=r.size_left+r.piece.length,r=r.right}for(r=r.next();r!==E.SENTINEL;){const f=this._buffers[r.piece.bufferIndex].buffer;if(r.piece.lineFeedCnt>0){const h=this.getAccumulatedValue(r,0),v=this.offsetInBuffer(r.piece.bufferIndex,r.piece.start);return u+=f.substring(v,v+h-a),u}else{const h=this.offsetInBuffer(r.piece.bufferIndex,r.piece.start);u+=f.substr(h,r.piece.length)}r=r.next()}return u}computeBufferMetadata(){let l=this.root,a=1,r=0;for(;l!==E.SENTINEL;)a+=l.lf_left+l.piece.lineFeedCnt,r+=l.size_left+l.piece.length,l=l.right;this._lineCnt=a,this._length=r,this._searchCache.validate(this._length)}getIndexOf(l,a){const r=l.piece,u=this.positionInBuffer(l,a),C=u.line-r.start.line;if(this.offsetInBuffer(r.bufferIndex,r.end)-this.offsetInBuffer(r.bufferIndex,r.start)===a){const f=this.getLineFeedCnt(l.piece.bufferIndex,r.start,u);if(f!==C)return{index:f,remainder:0}}return{index:C,remainder:u.column}}getAccumulatedValue(l,a){if(a<0)return 0;const r=l.piece,u=this._buffers[r.bufferIndex].lineStarts,C=r.start.line+a+1;return C>r.end.line?u[r.end.line]+r.end.column-u[r.start.line]-r.start.column:u[C]-u[r.start.line]-r.start.column}deleteNodeTail(l,a){const r=l.piece,u=r.lineFeedCnt,C=this.offsetInBuffer(r.bufferIndex,r.end),f=a,h=this.offsetInBuffer(r.bufferIndex,f),v=this.getLineFeedCnt(r.bufferIndex,r.start,f),w=v-u,S=h-C,L=r.length+S;l.piece=new o(r.bufferIndex,r.start,f,v,L),(0,E.updateTreeMetadata)(this,l,S,w)}deleteNodeHead(l,a){const r=l.piece,u=r.lineFeedCnt,C=this.offsetInBuffer(r.bufferIndex,r.start),f=a,h=this.getLineFeedCnt(r.bufferIndex,f,r.end),v=this.offsetInBuffer(r.bufferIndex,f),w=h-u,S=C-v,L=r.length+S;l.piece=new o(r.bufferIndex,f,r.end,h,L),(0,E.updateTreeMetadata)(this,l,S,w)}shrinkNode(l,a,r){const u=l.piece,C=u.start,f=u.end,h=u.length,v=u.lineFeedCnt,w=a,S=this.getLineFeedCnt(u.bufferIndex,u.start,w),L=this.offsetInBuffer(u.bufferIndex,a)-this.offsetInBuffer(u.bufferIndex,C);l.piece=new o(u.bufferIndex,u.start,w,S,L),(0,E.updateTreeMetadata)(this,l,L-h,S-v);const D=new o(u.bufferIndex,r,f,this.getLineFeedCnt(u.bufferIndex,r,f),this.offsetInBuffer(u.bufferIndex,f)-this.offsetInBuffer(u.bufferIndex,r)),T=this.rbInsertRight(l,D);this.validateCRLFWithPrevNode(T)}appendToNode(l,a){this.adjustCarriageReturnFromNext(a,l)&&(a+=` -`);const r=this.shouldCheckCRLF()&&this.startWithLF(a)&&this.endWithCR(l),u=this._buffers[0].buffer.length;this._buffers[0].buffer+=a;const C=p(a,!1);for(let T=0;Tl)a=a.left;else if(a.size_left+a.piece.length>=l){u+=a.size_left;const C={node:a,remainder:l-a.size_left,nodeStartOffset:u};return this._searchCache.set(C),C}else l-=a.size_left+a.piece.length,u+=a.size_left+a.piece.length,a=a.right;return null}nodeAt2(l,a){let r=this.root,u=0;for(;r!==E.SENTINEL;)if(r.left!==E.SENTINEL&&r.lf_left>=l-1)r=r.left;else if(r.lf_left+r.piece.lineFeedCnt>l-1){const C=this.getAccumulatedValue(r,l-r.lf_left-2),f=this.getAccumulatedValue(r,l-r.lf_left-1);return u+=r.size_left,{node:r,remainder:Math.min(C+a-1,f),nodeStartOffset:u}}else if(r.lf_left+r.piece.lineFeedCnt===l-1){const C=this.getAccumulatedValue(r,l-r.lf_left-2);if(C+a-1<=r.piece.length)return{node:r,remainder:C+a-1,nodeStartOffset:u};a-=r.piece.length-C;break}else l-=r.lf_left+r.piece.lineFeedCnt,u+=r.size_left+r.piece.length,r=r.right;for(r=r.next();r!==E.SENTINEL;){if(r.piece.lineFeedCnt>0){const C=this.getAccumulatedValue(r,0),f=this.offsetOfNode(r);return{node:r,remainder:Math.min(a-1,C),nodeStartOffset:f}}else if(r.piece.length>=a-1){const C=this.offsetOfNode(r);return{node:r,remainder:a-1,nodeStartOffset:C}}else a-=r.piece.length;r=r.next()}return null}nodeCharCodeAt(l,a){if(l.piece.lineFeedCnt<1)return-1;const r=this._buffers[l.piece.bufferIndex],u=this.offsetInBuffer(l.piece.bufferIndex,l.piece.start)+a;return r.buffer.charCodeAt(u)}offsetOfNode(l){if(!l)return 0;let a=l.size_left;for(;l!==this.root;)l.parent.right===l&&(a+=l.parent.size_left+l.parent.piece.length),l=l.parent;return a}shouldCheckCRLF(){return!(this._EOLNormalized&&this._EOL===` -`)}startWithLF(l){if(typeof l=="string")return l.charCodeAt(0)===10;if(l===E.SENTINEL||l.piece.lineFeedCnt===0)return!1;const a=l.piece,r=this._buffers[a.bufferIndex].lineStarts,u=a.start.line,C=r[u]+a.start.column;return u===r.length-1||r[u+1]>C+1?!1:this._buffers[a.bufferIndex].buffer.charCodeAt(C)===10}endWithCR(l){return typeof l=="string"?l.charCodeAt(l.length-1)===13:l===E.SENTINEL||l.piece.lineFeedCnt===0?!1:this.nodeCharCodeAt(l,l.piece.length-1)===13}validateCRLFWithPrevNode(l){if(this.shouldCheckCRLF()&&this.startWithLF(l)){const a=l.prev();this.endWithCR(a)&&this.fixCRLF(a,l)}}validateCRLFWithNextNode(l){if(this.shouldCheckCRLF()&&this.endWithCR(l)){const a=l.next();this.startWithLF(a)&&this.fixCRLF(l,a)}}fixCRLF(l,a){const r=[],u=this._buffers[l.piece.bufferIndex].lineStarts;let C;l.piece.end.column===0?C={line:l.piece.end.line-1,column:u[l.piece.end.line]-u[l.piece.end.line-1]-1}:C={line:l.piece.end.line,column:l.piece.end.column-1};const f=l.piece.length-1,h=l.piece.lineFeedCnt-1;l.piece=new o(l.piece.bufferIndex,l.piece.start,C,h,f),(0,E.updateTreeMetadata)(this,l,-1,-1),l.piece.length===0&&r.push(l);const v={line:a.piece.start.line+1,column:0},w=a.piece.length-1,S=this.getLineFeedCnt(a.piece.bufferIndex,v,a.piece.end);a.piece=new o(a.piece.bufferIndex,v,a.piece.end,S,w),(0,E.updateTreeMetadata)(this,a,-1,-1),a.piece.length===0&&r.push(a);const L=this.createNewPieces(`\r -`);this.rbInsertRight(l,L[0]);for(let D=0;D0?this.wrappedTextIndentLength:0}getLineLength(n){const o=n>0?this.breakOffsets[n-1]:0;let i=this.breakOffsets[n]-o;return n>0&&(i+=this.wrappedTextIndentLength),i}getMaxOutputOffset(n){return this.getLineLength(n)}translateToInputOffset(n,o){n>0&&(o=Math.max(0,o-this.wrappedTextIndentLength));let i=n===0?o:this.breakOffsets[n-1]+o;if(this.injectionOffsets!==null)for(let s=0;sthis.injectionOffsets[s];s++)i0?this.breakOffsets[s-1]:0,o===0)if(n<=g)i=s-1;else if(n>l)t=s+1;else break;else if(n=l)t=s+1;else break}let c=n-g;return s>0&&(c+=this.wrappedTextIndentLength),new b(s,c)}normalizeOutputPosition(n,o,t){if(this.injectionOffsets!==null){const i=this.outputPositionToOffsetInInputWithInjections(n,o),s=this.normalizeOffsetInInputWithInjectionsAroundInjections(i,t);if(s!==i)return this.offsetInInputWithInjectionsToOutputPosition(s,t)}if(t===0){if(n>0&&o===this.getMinOutputOffset(n))return new b(n-1,this.getMaxOutputOffset(n-1))}else if(t===1){const i=this.getOutputLineCount()-1;if(n0&&(o=Math.max(0,o-this.wrappedTextIndentLength)),(n>0?this.breakOffsets[n-1]:0)+o}normalizeOffsetInInputWithInjectionsAroundInjections(n,o){const t=this.getInjectedTextAtOffset(n);if(!t)return n;if(o===2){if(n===t.offsetInInputWithInjections+t.length&&y(this.injectionOptions[t.injectedTextIndex].cursorStops))return t.offsetInInputWithInjections+t.length;{let i=t.offsetInInputWithInjections;if(m(this.injectionOptions[t.injectedTextIndex].cursorStops))return i;let s=t.injectedTextIndex-1;for(;s>=0&&this.injectionOffsets[s]===this.injectionOffsets[t.injectedTextIndex]&&!(y(this.injectionOptions[s].cursorStops)||(i-=this.injectionOptions[s].content.length,m(this.injectionOptions[s].cursorStops)));)s--;return i}}else if(o===1||o===4){let i=t.offsetInInputWithInjections+t.length,s=t.injectedTextIndex;for(;s+1=0&&this.injectionOffsets[s-1]===this.injectionOffsets[s];)i-=this.injectionOptions[s-1].content.length,s--;return i}(0,d.assertNever)(o)}getInjectedText(n,o){const t=this.outputPositionToOffsetInInputWithInjections(n,o),i=this.getInjectedTextAtOffset(t);return i?{options:this.injectionOptions[i.injectedTextIndex]}:null}getInjectedTextAtOffset(n){const o=this.injectionOffsets,t=this.injectionOptions;if(o!==null){let i=0;for(let s=0;sn)break;if(n<=l)return{injectedTextIndex:s,offsetInInputWithInjections:c,length:g};i+=g}}}}e.ModelLineProjectionData=E;function y(p){return p==null?!0:p===I.InjectedTextCursorStops.Right||p===I.InjectedTextCursorStops.Both}function m(p){return p==null?!0:p===I.InjectedTextCursorStops.Left||p===I.InjectedTextCursorStops.Both}class _{constructor(n){this.options=n}}e.InjectedText=_;class b{constructor(n,o){this.outputLineIndex=n,this.outputOffset=o}toString(){return`${this.outputLineIndex}:${this.outputOffset}`}toPosition(n){return new k.Position(n+this.outputLineIndex,this.outputOffset+1)}}e.OutputPosition=b}),define(ne[326],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorWorkerHost=void 0;class d{static{this.CHANNEL_NAME="editorWorkerHost"}static getChannel(I){return I.getChannel(d.CHANNEL_NAME)}static setChannel(I,E){I.setChannel(d.CHANNEL_NAME,E)}}e.EditorWorkerHost=d}),define(ne[582],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.findSectionHeaders=I;const d=new RegExp("\\bMARK:\\s*(.*)$","d"),k=/^-+|-+$/g;function I(b,p){let n=[];if(p.findRegionSectionHeaders&&p.foldingRules?.markers){const o=E(b,p);n=n.concat(o)}if(p.findMarkSectionHeaders){const o=y(b);n=n.concat(o)}return n}function E(b,p){const n=[],o=b.getLineCount();for(let t=1;t<=o;t++){const i=b.getLineContent(t),s=i.match(p.foldingRules.markers.start);if(s){const g={startLineNumber:t,startColumn:s[0].length+1,endLineNumber:t,endColumn:i.length+1};if(g.endColumn>g.startColumn){const c={range:g,..._(i.substring(s[0].length)),shouldBeInComments:!1};(c.text||c.hasSeparatorLine)&&n.push(c)}}}return n}function y(b){const p=[],n=b.getLineCount();for(let o=1;o<=n;o++){const t=b.getLineContent(o);m(t,o,p)}return p}function m(b,p,n){d.lastIndex=0;const o=d.exec(b);if(o){const t=o.indices[1][0]+1,i=o.indices[1][1]+1,s={startLineNumber:p,startColumn:t,endLineNumber:p,endColumn:i};if(s.endColumn>s.startColumn){const g={range:s,..._(o[1]),shouldBeInComments:!0};(g.text||g.hasSeparatorLine)&&n.push(g)}}}function _(b){b=b.trim();const p=b.startsWith("-");return b=b.replace(k,""),{text:b,hasSeparatorLine:p}}}),define(ne[327],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DraggedTreeItemsIdentifier=e.TreeViewsDnDService=void 0;class d{constructor(){this._dragOperations=new Map}removeDragOperationTransfer(E){if(E&&this._dragOperations.has(E)){const y=this._dragOperations.get(E);return this._dragOperations.delete(E),y}}}e.TreeViewsDnDService=d;class k{constructor(E){this.identifier=E}}e.DraggedTreeItemsIdentifier=k}),define(ne[328],se([1,0,4,202,11,90,147]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UnicodeTextModelHighlighter=void 0;class m{static computeUnicodeHighlights(o,t,i){const s=i?i.startLineNumber:1,g=i?i.endLineNumber:o.getLineCount(),c=new b(t),l=c.getCandidateCodePoints();let a;l==="allNonBasicAscii"?a=new RegExp("[^\\t\\n\\r\\x20-\\x7E]","g"):a=new RegExp(`${_(Array.from(l))}`,"g");const r=new k.Searcher(null,a),u=[];let C=!1,f,h=0,v=0,w=0;e:for(let S=s,L=g;S<=L;S++){const D=o.getLineContent(S),T=D.length;r.reset(0);do if(f=r.next(D),f){let M=f.index,A=f.index+f[0].length;if(M>0){const F=D.charCodeAt(M-1);I.isHighSurrogate(F)&&M--}if(A+1=1e3){C=!0;break e}u.push(new d.Range(S,M+1,S,A+1))}}while(f)}return{ranges:u,hasMore:C,ambiguousCharacterCount:h,invisibleCharacterCount:v,nonBasicAsciiCharacterCount:w}}static computeUnicodeHighlightReason(o,t){const i=new b(t);switch(i.shouldHighlightNonBasicASCII(o,null)){case 0:return null;case 2:return{kind:1};case 3:{const g=o.codePointAt(0),c=i.ambiguousCharacters.getPrimaryConfusable(g),l=I.AmbiguousCharacters.getLocales().filter(a=>!I.AmbiguousCharacters.getInstance(new Set([...t.allowedLocales,a])).isAmbiguous(g));return{kind:0,confusableWith:String.fromCodePoint(c),notAmbiguousInLocales:l}}case 1:return{kind:2}}}}e.UnicodeTextModelHighlighter=m;function _(n,o){return`[${I.escapeRegExpCharacters(n.map(i=>String.fromCodePoint(i)).join(""))}]`}class b{constructor(o){this.options=o,this.allowedCodePoints=new Set(o.allowedCodePoints),this.ambiguousCharacters=I.AmbiguousCharacters.getInstance(new Set(o.allowedLocales))}getCandidateCodePoints(){if(this.options.nonBasicASCII)return"allNonBasicAscii";const o=new Set;if(this.options.invisibleCharacters)for(const t of I.InvisibleCharacters.codePoints)p(String.fromCodePoint(t))||o.add(t);if(this.options.ambiguousCharacters)for(const t of this.ambiguousCharacters.getConfusableCodePoints())o.add(t);for(const t of this.allowedCodePoints)o.delete(t);return o}shouldHighlightNonBasicASCII(o,t){const i=o.codePointAt(0);if(this.allowedCodePoints.has(i))return 0;if(this.options.nonBasicASCII)return 1;let s=!1,g=!1;if(t)for(const c of t){const l=c.codePointAt(0),a=I.isBasicASCII(c);s=s||a,!a&&!this.ambiguousCharacters.isAmbiguous(l)&&!I.InvisibleCharacters.isInvisibleCharacter(l)&&(g=!0)}return!s&&g?0:this.options.invisibleCharacters&&!p(o)&&I.InvisibleCharacters.isInvisibleCharacter(i)?2:this.options.ambiguousCharacters&&this.ambiguousCharacters.isAmbiguous(i)?3:0}}function p(n){return n===" "||n===` -`||n===" "}}),define(ne[238],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WrappingIndent=e.TrackedRangeStickiness=e.TextEditorCursorStyle=e.TextEditorCursorBlinkingStyle=e.SymbolTag=e.SymbolKind=e.SignatureHelpTriggerKind=e.ShowLightbulbIconMode=e.SelectionDirection=e.ScrollbarVisibility=e.ScrollType=e.RenderMinimap=e.RenderLineNumbersType=e.PositionAffinity=e.PartialAcceptTriggerKind=e.OverviewRulerLane=e.OverlayWidgetPositionPreference=e.NewSymbolNameTriggerKind=e.NewSymbolNameTag=e.MouseTargetType=e.MinimapSectionHeaderStyle=e.MinimapPosition=e.MarkerTag=e.MarkerSeverity=e.KeyCode=e.InlineEditTriggerKind=e.InlineCompletionTriggerKind=e.InlayHintKind=e.InjectedTextCursorStops=e.IndentAction=e.HoverVerbosityAction=e.GlyphMarginLane=e.EndOfLineSequence=e.EndOfLinePreference=e.EditorOption=e.EditorAutoIndentStrategy=e.DocumentHighlightKind=e.DefaultEndOfLine=e.CursorChangeReason=e.ContentWidgetPositionPreference=e.CompletionTriggerKind=e.CompletionItemTag=e.CompletionItemKind=e.CompletionItemInsertTextRule=e.CodeActionTriggerType=e.AccessibilitySupport=void 0;var d;(function(R){R[R.Unknown=0]="Unknown",R[R.Disabled=1]="Disabled",R[R.Enabled=2]="Enabled"})(d||(e.AccessibilitySupport=d={}));var k;(function(R){R[R.Invoke=1]="Invoke",R[R.Auto=2]="Auto"})(k||(e.CodeActionTriggerType=k={}));var I;(function(R){R[R.None=0]="None",R[R.KeepWhitespace=1]="KeepWhitespace",R[R.InsertAsSnippet=4]="InsertAsSnippet"})(I||(e.CompletionItemInsertTextRule=I={}));var E;(function(R){R[R.Method=0]="Method",R[R.Function=1]="Function",R[R.Constructor=2]="Constructor",R[R.Field=3]="Field",R[R.Variable=4]="Variable",R[R.Class=5]="Class",R[R.Struct=6]="Struct",R[R.Interface=7]="Interface",R[R.Module=8]="Module",R[R.Property=9]="Property",R[R.Event=10]="Event",R[R.Operator=11]="Operator",R[R.Unit=12]="Unit",R[R.Value=13]="Value",R[R.Constant=14]="Constant",R[R.Enum=15]="Enum",R[R.EnumMember=16]="EnumMember",R[R.Keyword=17]="Keyword",R[R.Text=18]="Text",R[R.Color=19]="Color",R[R.File=20]="File",R[R.Reference=21]="Reference",R[R.Customcolor=22]="Customcolor",R[R.Folder=23]="Folder",R[R.TypeParameter=24]="TypeParameter",R[R.User=25]="User",R[R.Issue=26]="Issue",R[R.Snippet=27]="Snippet"})(E||(e.CompletionItemKind=E={}));var y;(function(R){R[R.Deprecated=1]="Deprecated"})(y||(e.CompletionItemTag=y={}));var m;(function(R){R[R.Invoke=0]="Invoke",R[R.TriggerCharacter=1]="TriggerCharacter",R[R.TriggerForIncompleteCompletions=2]="TriggerForIncompleteCompletions"})(m||(e.CompletionTriggerKind=m={}));var _;(function(R){R[R.EXACT=0]="EXACT",R[R.ABOVE=1]="ABOVE",R[R.BELOW=2]="BELOW"})(_||(e.ContentWidgetPositionPreference=_={}));var b;(function(R){R[R.NotSet=0]="NotSet",R[R.ContentFlush=1]="ContentFlush",R[R.RecoverFromMarkers=2]="RecoverFromMarkers",R[R.Explicit=3]="Explicit",R[R.Paste=4]="Paste",R[R.Undo=5]="Undo",R[R.Redo=6]="Redo"})(b||(e.CursorChangeReason=b={}));var p;(function(R){R[R.LF=1]="LF",R[R.CRLF=2]="CRLF"})(p||(e.DefaultEndOfLine=p={}));var n;(function(R){R[R.Text=0]="Text",R[R.Read=1]="Read",R[R.Write=2]="Write"})(n||(e.DocumentHighlightKind=n={}));var o;(function(R){R[R.None=0]="None",R[R.Keep=1]="Keep",R[R.Brackets=2]="Brackets",R[R.Advanced=3]="Advanced",R[R.Full=4]="Full"})(o||(e.EditorAutoIndentStrategy=o={}));var t;(function(R){R[R.acceptSuggestionOnCommitCharacter=0]="acceptSuggestionOnCommitCharacter",R[R.acceptSuggestionOnEnter=1]="acceptSuggestionOnEnter",R[R.accessibilitySupport=2]="accessibilitySupport",R[R.accessibilityPageSize=3]="accessibilityPageSize",R[R.ariaLabel=4]="ariaLabel",R[R.ariaRequired=5]="ariaRequired",R[R.autoClosingBrackets=6]="autoClosingBrackets",R[R.autoClosingComments=7]="autoClosingComments",R[R.screenReaderAnnounceInlineSuggestion=8]="screenReaderAnnounceInlineSuggestion",R[R.autoClosingDelete=9]="autoClosingDelete",R[R.autoClosingOvertype=10]="autoClosingOvertype",R[R.autoClosingQuotes=11]="autoClosingQuotes",R[R.autoIndent=12]="autoIndent",R[R.automaticLayout=13]="automaticLayout",R[R.autoSurround=14]="autoSurround",R[R.bracketPairColorization=15]="bracketPairColorization",R[R.guides=16]="guides",R[R.codeLens=17]="codeLens",R[R.codeLensFontFamily=18]="codeLensFontFamily",R[R.codeLensFontSize=19]="codeLensFontSize",R[R.colorDecorators=20]="colorDecorators",R[R.colorDecoratorsLimit=21]="colorDecoratorsLimit",R[R.columnSelection=22]="columnSelection",R[R.comments=23]="comments",R[R.contextmenu=24]="contextmenu",R[R.copyWithSyntaxHighlighting=25]="copyWithSyntaxHighlighting",R[R.cursorBlinking=26]="cursorBlinking",R[R.cursorSmoothCaretAnimation=27]="cursorSmoothCaretAnimation",R[R.cursorStyle=28]="cursorStyle",R[R.cursorSurroundingLines=29]="cursorSurroundingLines",R[R.cursorSurroundingLinesStyle=30]="cursorSurroundingLinesStyle",R[R.cursorWidth=31]="cursorWidth",R[R.disableLayerHinting=32]="disableLayerHinting",R[R.disableMonospaceOptimizations=33]="disableMonospaceOptimizations",R[R.domReadOnly=34]="domReadOnly",R[R.dragAndDrop=35]="dragAndDrop",R[R.dropIntoEditor=36]="dropIntoEditor",R[R.emptySelectionClipboard=37]="emptySelectionClipboard",R[R.experimentalWhitespaceRendering=38]="experimentalWhitespaceRendering",R[R.extraEditorClassName=39]="extraEditorClassName",R[R.fastScrollSensitivity=40]="fastScrollSensitivity",R[R.find=41]="find",R[R.fixedOverflowWidgets=42]="fixedOverflowWidgets",R[R.folding=43]="folding",R[R.foldingStrategy=44]="foldingStrategy",R[R.foldingHighlight=45]="foldingHighlight",R[R.foldingImportsByDefault=46]="foldingImportsByDefault",R[R.foldingMaximumRegions=47]="foldingMaximumRegions",R[R.unfoldOnClickAfterEndOfLine=48]="unfoldOnClickAfterEndOfLine",R[R.fontFamily=49]="fontFamily",R[R.fontInfo=50]="fontInfo",R[R.fontLigatures=51]="fontLigatures",R[R.fontSize=52]="fontSize",R[R.fontWeight=53]="fontWeight",R[R.fontVariations=54]="fontVariations",R[R.formatOnPaste=55]="formatOnPaste",R[R.formatOnType=56]="formatOnType",R[R.glyphMargin=57]="glyphMargin",R[R.gotoLocation=58]="gotoLocation",R[R.hideCursorInOverviewRuler=59]="hideCursorInOverviewRuler",R[R.hover=60]="hover",R[R.inDiffEditor=61]="inDiffEditor",R[R.inlineSuggest=62]="inlineSuggest",R[R.inlineEdit=63]="inlineEdit",R[R.letterSpacing=64]="letterSpacing",R[R.lightbulb=65]="lightbulb",R[R.lineDecorationsWidth=66]="lineDecorationsWidth",R[R.lineHeight=67]="lineHeight",R[R.lineNumbers=68]="lineNumbers",R[R.lineNumbersMinChars=69]="lineNumbersMinChars",R[R.linkedEditing=70]="linkedEditing",R[R.links=71]="links",R[R.matchBrackets=72]="matchBrackets",R[R.minimap=73]="minimap",R[R.mouseStyle=74]="mouseStyle",R[R.mouseWheelScrollSensitivity=75]="mouseWheelScrollSensitivity",R[R.mouseWheelZoom=76]="mouseWheelZoom",R[R.multiCursorMergeOverlapping=77]="multiCursorMergeOverlapping",R[R.multiCursorModifier=78]="multiCursorModifier",R[R.multiCursorPaste=79]="multiCursorPaste",R[R.multiCursorLimit=80]="multiCursorLimit",R[R.occurrencesHighlight=81]="occurrencesHighlight",R[R.overviewRulerBorder=82]="overviewRulerBorder",R[R.overviewRulerLanes=83]="overviewRulerLanes",R[R.padding=84]="padding",R[R.pasteAs=85]="pasteAs",R[R.parameterHints=86]="parameterHints",R[R.peekWidgetDefaultFocus=87]="peekWidgetDefaultFocus",R[R.placeholder=88]="placeholder",R[R.definitionLinkOpensInPeek=89]="definitionLinkOpensInPeek",R[R.quickSuggestions=90]="quickSuggestions",R[R.quickSuggestionsDelay=91]="quickSuggestionsDelay",R[R.readOnly=92]="readOnly",R[R.readOnlyMessage=93]="readOnlyMessage",R[R.renameOnType=94]="renameOnType",R[R.renderControlCharacters=95]="renderControlCharacters",R[R.renderFinalNewline=96]="renderFinalNewline",R[R.renderLineHighlight=97]="renderLineHighlight",R[R.renderLineHighlightOnlyWhenFocus=98]="renderLineHighlightOnlyWhenFocus",R[R.renderValidationDecorations=99]="renderValidationDecorations",R[R.renderWhitespace=100]="renderWhitespace",R[R.revealHorizontalRightPadding=101]="revealHorizontalRightPadding",R[R.roundedSelection=102]="roundedSelection",R[R.rulers=103]="rulers",R[R.scrollbar=104]="scrollbar",R[R.scrollBeyondLastColumn=105]="scrollBeyondLastColumn",R[R.scrollBeyondLastLine=106]="scrollBeyondLastLine",R[R.scrollPredominantAxis=107]="scrollPredominantAxis",R[R.selectionClipboard=108]="selectionClipboard",R[R.selectionHighlight=109]="selectionHighlight",R[R.selectOnLineNumbers=110]="selectOnLineNumbers",R[R.showFoldingControls=111]="showFoldingControls",R[R.showUnused=112]="showUnused",R[R.snippetSuggestions=113]="snippetSuggestions",R[R.smartSelect=114]="smartSelect",R[R.smoothScrolling=115]="smoothScrolling",R[R.stickyScroll=116]="stickyScroll",R[R.stickyTabStops=117]="stickyTabStops",R[R.stopRenderingLineAfter=118]="stopRenderingLineAfter",R[R.suggest=119]="suggest",R[R.suggestFontSize=120]="suggestFontSize",R[R.suggestLineHeight=121]="suggestLineHeight",R[R.suggestOnTriggerCharacters=122]="suggestOnTriggerCharacters",R[R.suggestSelection=123]="suggestSelection",R[R.tabCompletion=124]="tabCompletion",R[R.tabIndex=125]="tabIndex",R[R.unicodeHighlighting=126]="unicodeHighlighting",R[R.unusualLineTerminators=127]="unusualLineTerminators",R[R.useShadowDOM=128]="useShadowDOM",R[R.useTabStops=129]="useTabStops",R[R.wordBreak=130]="wordBreak",R[R.wordSegmenterLocales=131]="wordSegmenterLocales",R[R.wordSeparators=132]="wordSeparators",R[R.wordWrap=133]="wordWrap",R[R.wordWrapBreakAfterCharacters=134]="wordWrapBreakAfterCharacters",R[R.wordWrapBreakBeforeCharacters=135]="wordWrapBreakBeforeCharacters",R[R.wordWrapColumn=136]="wordWrapColumn",R[R.wordWrapOverride1=137]="wordWrapOverride1",R[R.wordWrapOverride2=138]="wordWrapOverride2",R[R.wrappingIndent=139]="wrappingIndent",R[R.wrappingStrategy=140]="wrappingStrategy",R[R.showDeprecated=141]="showDeprecated",R[R.inlayHints=142]="inlayHints",R[R.editorClassName=143]="editorClassName",R[R.pixelRatio=144]="pixelRatio",R[R.tabFocusMode=145]="tabFocusMode",R[R.layoutInfo=146]="layoutInfo",R[R.wrappingInfo=147]="wrappingInfo",R[R.defaultColorDecorators=148]="defaultColorDecorators",R[R.colorDecoratorsActivatedOn=149]="colorDecoratorsActivatedOn",R[R.inlineCompletionsAccessibilityVerbose=150]="inlineCompletionsAccessibilityVerbose"})(t||(e.EditorOption=t={}));var i;(function(R){R[R.TextDefined=0]="TextDefined",R[R.LF=1]="LF",R[R.CRLF=2]="CRLF"})(i||(e.EndOfLinePreference=i={}));var s;(function(R){R[R.LF=0]="LF",R[R.CRLF=1]="CRLF"})(s||(e.EndOfLineSequence=s={}));var g;(function(R){R[R.Left=1]="Left",R[R.Center=2]="Center",R[R.Right=3]="Right"})(g||(e.GlyphMarginLane=g={}));var c;(function(R){R[R.Increase=0]="Increase",R[R.Decrease=1]="Decrease"})(c||(e.HoverVerbosityAction=c={}));var l;(function(R){R[R.None=0]="None",R[R.Indent=1]="Indent",R[R.IndentOutdent=2]="IndentOutdent",R[R.Outdent=3]="Outdent"})(l||(e.IndentAction=l={}));var a;(function(R){R[R.Both=0]="Both",R[R.Right=1]="Right",R[R.Left=2]="Left",R[R.None=3]="None"})(a||(e.InjectedTextCursorStops=a={}));var r;(function(R){R[R.Type=1]="Type",R[R.Parameter=2]="Parameter"})(r||(e.InlayHintKind=r={}));var u;(function(R){R[R.Automatic=0]="Automatic",R[R.Explicit=1]="Explicit"})(u||(e.InlineCompletionTriggerKind=u={}));var C;(function(R){R[R.Invoke=0]="Invoke",R[R.Automatic=1]="Automatic"})(C||(e.InlineEditTriggerKind=C={}));var f;(function(R){R[R.DependsOnKbLayout=-1]="DependsOnKbLayout",R[R.Unknown=0]="Unknown",R[R.Backspace=1]="Backspace",R[R.Tab=2]="Tab",R[R.Enter=3]="Enter",R[R.Shift=4]="Shift",R[R.Ctrl=5]="Ctrl",R[R.Alt=6]="Alt",R[R.PauseBreak=7]="PauseBreak",R[R.CapsLock=8]="CapsLock",R[R.Escape=9]="Escape",R[R.Space=10]="Space",R[R.PageUp=11]="PageUp",R[R.PageDown=12]="PageDown",R[R.End=13]="End",R[R.Home=14]="Home",R[R.LeftArrow=15]="LeftArrow",R[R.UpArrow=16]="UpArrow",R[R.RightArrow=17]="RightArrow",R[R.DownArrow=18]="DownArrow",R[R.Insert=19]="Insert",R[R.Delete=20]="Delete",R[R.Digit0=21]="Digit0",R[R.Digit1=22]="Digit1",R[R.Digit2=23]="Digit2",R[R.Digit3=24]="Digit3",R[R.Digit4=25]="Digit4",R[R.Digit5=26]="Digit5",R[R.Digit6=27]="Digit6",R[R.Digit7=28]="Digit7",R[R.Digit8=29]="Digit8",R[R.Digit9=30]="Digit9",R[R.KeyA=31]="KeyA",R[R.KeyB=32]="KeyB",R[R.KeyC=33]="KeyC",R[R.KeyD=34]="KeyD",R[R.KeyE=35]="KeyE",R[R.KeyF=36]="KeyF",R[R.KeyG=37]="KeyG",R[R.KeyH=38]="KeyH",R[R.KeyI=39]="KeyI",R[R.KeyJ=40]="KeyJ",R[R.KeyK=41]="KeyK",R[R.KeyL=42]="KeyL",R[R.KeyM=43]="KeyM",R[R.KeyN=44]="KeyN",R[R.KeyO=45]="KeyO",R[R.KeyP=46]="KeyP",R[R.KeyQ=47]="KeyQ",R[R.KeyR=48]="KeyR",R[R.KeyS=49]="KeyS",R[R.KeyT=50]="KeyT",R[R.KeyU=51]="KeyU",R[R.KeyV=52]="KeyV",R[R.KeyW=53]="KeyW",R[R.KeyX=54]="KeyX",R[R.KeyY=55]="KeyY",R[R.KeyZ=56]="KeyZ",R[R.Meta=57]="Meta",R[R.ContextMenu=58]="ContextMenu",R[R.F1=59]="F1",R[R.F2=60]="F2",R[R.F3=61]="F3",R[R.F4=62]="F4",R[R.F5=63]="F5",R[R.F6=64]="F6",R[R.F7=65]="F7",R[R.F8=66]="F8",R[R.F9=67]="F9",R[R.F10=68]="F10",R[R.F11=69]="F11",R[R.F12=70]="F12",R[R.F13=71]="F13",R[R.F14=72]="F14",R[R.F15=73]="F15",R[R.F16=74]="F16",R[R.F17=75]="F17",R[R.F18=76]="F18",R[R.F19=77]="F19",R[R.F20=78]="F20",R[R.F21=79]="F21",R[R.F22=80]="F22",R[R.F23=81]="F23",R[R.F24=82]="F24",R[R.NumLock=83]="NumLock",R[R.ScrollLock=84]="ScrollLock",R[R.Semicolon=85]="Semicolon",R[R.Equal=86]="Equal",R[R.Comma=87]="Comma",R[R.Minus=88]="Minus",R[R.Period=89]="Period",R[R.Slash=90]="Slash",R[R.Backquote=91]="Backquote",R[R.BracketLeft=92]="BracketLeft",R[R.Backslash=93]="Backslash",R[R.BracketRight=94]="BracketRight",R[R.Quote=95]="Quote",R[R.OEM_8=96]="OEM_8",R[R.IntlBackslash=97]="IntlBackslash",R[R.Numpad0=98]="Numpad0",R[R.Numpad1=99]="Numpad1",R[R.Numpad2=100]="Numpad2",R[R.Numpad3=101]="Numpad3",R[R.Numpad4=102]="Numpad4",R[R.Numpad5=103]="Numpad5",R[R.Numpad6=104]="Numpad6",R[R.Numpad7=105]="Numpad7",R[R.Numpad8=106]="Numpad8",R[R.Numpad9=107]="Numpad9",R[R.NumpadMultiply=108]="NumpadMultiply",R[R.NumpadAdd=109]="NumpadAdd",R[R.NUMPAD_SEPARATOR=110]="NUMPAD_SEPARATOR",R[R.NumpadSubtract=111]="NumpadSubtract",R[R.NumpadDecimal=112]="NumpadDecimal",R[R.NumpadDivide=113]="NumpadDivide",R[R.KEY_IN_COMPOSITION=114]="KEY_IN_COMPOSITION",R[R.ABNT_C1=115]="ABNT_C1",R[R.ABNT_C2=116]="ABNT_C2",R[R.AudioVolumeMute=117]="AudioVolumeMute",R[R.AudioVolumeUp=118]="AudioVolumeUp",R[R.AudioVolumeDown=119]="AudioVolumeDown",R[R.BrowserSearch=120]="BrowserSearch",R[R.BrowserHome=121]="BrowserHome",R[R.BrowserBack=122]="BrowserBack",R[R.BrowserForward=123]="BrowserForward",R[R.MediaTrackNext=124]="MediaTrackNext",R[R.MediaTrackPrevious=125]="MediaTrackPrevious",R[R.MediaStop=126]="MediaStop",R[R.MediaPlayPause=127]="MediaPlayPause",R[R.LaunchMediaPlayer=128]="LaunchMediaPlayer",R[R.LaunchMail=129]="LaunchMail",R[R.LaunchApp2=130]="LaunchApp2",R[R.Clear=131]="Clear",R[R.MAX_VALUE=132]="MAX_VALUE"})(f||(e.KeyCode=f={}));var h;(function(R){R[R.Hint=1]="Hint",R[R.Info=2]="Info",R[R.Warning=4]="Warning",R[R.Error=8]="Error"})(h||(e.MarkerSeverity=h={}));var v;(function(R){R[R.Unnecessary=1]="Unnecessary",R[R.Deprecated=2]="Deprecated"})(v||(e.MarkerTag=v={}));var w;(function(R){R[R.Inline=1]="Inline",R[R.Gutter=2]="Gutter"})(w||(e.MinimapPosition=w={}));var S;(function(R){R[R.Normal=1]="Normal",R[R.Underlined=2]="Underlined"})(S||(e.MinimapSectionHeaderStyle=S={}));var L;(function(R){R[R.UNKNOWN=0]="UNKNOWN",R[R.TEXTAREA=1]="TEXTAREA",R[R.GUTTER_GLYPH_MARGIN=2]="GUTTER_GLYPH_MARGIN",R[R.GUTTER_LINE_NUMBERS=3]="GUTTER_LINE_NUMBERS",R[R.GUTTER_LINE_DECORATIONS=4]="GUTTER_LINE_DECORATIONS",R[R.GUTTER_VIEW_ZONE=5]="GUTTER_VIEW_ZONE",R[R.CONTENT_TEXT=6]="CONTENT_TEXT",R[R.CONTENT_EMPTY=7]="CONTENT_EMPTY",R[R.CONTENT_VIEW_ZONE=8]="CONTENT_VIEW_ZONE",R[R.CONTENT_WIDGET=9]="CONTENT_WIDGET",R[R.OVERVIEW_RULER=10]="OVERVIEW_RULER",R[R.SCROLLBAR=11]="SCROLLBAR",R[R.OVERLAY_WIDGET=12]="OVERLAY_WIDGET",R[R.OUTSIDE_EDITOR=13]="OUTSIDE_EDITOR"})(L||(e.MouseTargetType=L={}));var D;(function(R){R[R.AIGenerated=1]="AIGenerated"})(D||(e.NewSymbolNameTag=D={}));var T;(function(R){R[R.Invoke=0]="Invoke",R[R.Automatic=1]="Automatic"})(T||(e.NewSymbolNameTriggerKind=T={}));var M;(function(R){R[R.TOP_RIGHT_CORNER=0]="TOP_RIGHT_CORNER",R[R.BOTTOM_RIGHT_CORNER=1]="BOTTOM_RIGHT_CORNER",R[R.TOP_CENTER=2]="TOP_CENTER"})(M||(e.OverlayWidgetPositionPreference=M={}));var A;(function(R){R[R.Left=1]="Left",R[R.Center=2]="Center",R[R.Right=4]="Right",R[R.Full=7]="Full"})(A||(e.OverviewRulerLane=A={}));var P;(function(R){R[R.Word=0]="Word",R[R.Line=1]="Line",R[R.Suggest=2]="Suggest"})(P||(e.PartialAcceptTriggerKind=P={}));var N;(function(R){R[R.Left=0]="Left",R[R.Right=1]="Right",R[R.None=2]="None",R[R.LeftOfInjectedText=3]="LeftOfInjectedText",R[R.RightOfInjectedText=4]="RightOfInjectedText"})(N||(e.PositionAffinity=N={}));var O;(function(R){R[R.Off=0]="Off",R[R.On=1]="On",R[R.Relative=2]="Relative",R[R.Interval=3]="Interval",R[R.Custom=4]="Custom"})(O||(e.RenderLineNumbersType=O={}));var F;(function(R){R[R.None=0]="None",R[R.Text=1]="Text",R[R.Blocks=2]="Blocks"})(F||(e.RenderMinimap=F={}));var x;(function(R){R[R.Smooth=0]="Smooth",R[R.Immediate=1]="Immediate"})(x||(e.ScrollType=x={}));var W;(function(R){R[R.Auto=1]="Auto",R[R.Hidden=2]="Hidden",R[R.Visible=3]="Visible"})(W||(e.ScrollbarVisibility=W={}));var V;(function(R){R[R.LTR=0]="LTR",R[R.RTL=1]="RTL"})(V||(e.SelectionDirection=V={}));var q;(function(R){R.Off="off",R.OnCode="onCode",R.On="on"})(q||(e.ShowLightbulbIconMode=q={}));var H;(function(R){R[R.Invoke=1]="Invoke",R[R.TriggerCharacter=2]="TriggerCharacter",R[R.ContentChange=3]="ContentChange"})(H||(e.SignatureHelpTriggerKind=H={}));var z;(function(R){R[R.File=0]="File",R[R.Module=1]="Module",R[R.Namespace=2]="Namespace",R[R.Package=3]="Package",R[R.Class=4]="Class",R[R.Method=5]="Method",R[R.Property=6]="Property",R[R.Field=7]="Field",R[R.Constructor=8]="Constructor",R[R.Enum=9]="Enum",R[R.Interface=10]="Interface",R[R.Function=11]="Function",R[R.Variable=12]="Variable",R[R.Constant=13]="Constant",R[R.String=14]="String",R[R.Number=15]="Number",R[R.Boolean=16]="Boolean",R[R.Array=17]="Array",R[R.Object=18]="Object",R[R.Key=19]="Key",R[R.Null=20]="Null",R[R.EnumMember=21]="EnumMember",R[R.Struct=22]="Struct",R[R.Event=23]="Event",R[R.Operator=24]="Operator",R[R.TypeParameter=25]="TypeParameter"})(z||(e.SymbolKind=z={}));var U;(function(R){R[R.Deprecated=1]="Deprecated"})(U||(e.SymbolTag=U={}));var j;(function(R){R[R.Hidden=0]="Hidden",R[R.Blink=1]="Blink",R[R.Smooth=2]="Smooth",R[R.Phase=3]="Phase",R[R.Expand=4]="Expand",R[R.Solid=5]="Solid"})(j||(e.TextEditorCursorBlinkingStyle=j={}));var Y;(function(R){R[R.Line=1]="Line",R[R.Block=2]="Block",R[R.Underline=3]="Underline",R[R.LineThin=4]="LineThin",R[R.BlockOutline=5]="BlockOutline",R[R.UnderlineThin=6]="UnderlineThin"})(Y||(e.TextEditorCursorStyle=Y={}));var G;(function(R){R[R.AlwaysGrowsWhenTypingAtEdges=0]="AlwaysGrowsWhenTypingAtEdges",R[R.NeverGrowsWhenTypingAtEdges=1]="NeverGrowsWhenTypingAtEdges",R[R.GrowsOnlyWhenTypingBefore=2]="GrowsOnlyWhenTypingBefore",R[R.GrowsOnlyWhenTypingAfter=3]="GrowsOnlyWhenTypingAfter"})(G||(e.TrackedRangeStickiness=G={}));var K;(function(R){R[R.None=0]="None",R[R.Same=1]="Same",R[R.Indent=2]="Indent",R[R.DeepIndent=3]="DeepIndent"})(K||(e.WrappingIndent=K={}))}),define(ne[583],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketPairWithMinIndentationInfo=e.BracketPairInfo=e.BracketInfo=void 0;class d{constructor(y,m,_,b){this.range=y,this.nestingLevel=m,this.nestingLevelOfEqualBracketType=_,this.isInvalid=b}}e.BracketInfo=d;class k{constructor(y,m,_,b,p,n){this.range=y,this.openingBracketRange=m,this.closingBracketRange=_,this.nestingLevel=b,this.nestingLevelOfEqualBracketType=p,this.bracketPairNode=n}get openingBracketInfo(){return this.bracketPairNode.openingBracket.bracketInfo}}e.BracketPairInfo=k;class I extends k{constructor(y,m,_,b,p,n,o){super(y,m,_,b,p,n),this.minVisibleColumnIndentation=o}}e.BracketPairWithMinIndentationInfo=I}),define(ne[584],se([1,0,6,2,583,200,321,106,320,149,236,13,319]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketPairsTree=void 0;class t extends k.Disposable{didLanguageChange(r){return this.brackets.didLanguageChange(r)}constructor(r,u){if(super(),this.textModel=r,this.getLanguageConfiguration=u,this.didChangeEmitter=new d.Emitter,this.denseKeyProvider=new b.DenseKeyProvider,this.brackets=new y.LanguageAgnosticBracketTokens(this.denseKeyProvider,this.getLanguageConfiguration),this.onDidChange=this.didChangeEmitter.event,this.queuedTextEditsForInitialAstWithoutTokens=[],this.queuedTextEdits=[],r.tokenization.hasTokens)r.tokenization.backgroundTokenizationState===2?(this.initialAstWithoutTokens=void 0,this.astWithTokens=this.parseDocumentFromTextBuffer([],void 0,!1)):(this.initialAstWithoutTokens=this.parseDocumentFromTextBuffer([],void 0,!0),this.astWithTokens=this.initialAstWithoutTokens);else{const C=this.brackets.getSingleLanguageBracketTokens(this.textModel.getLanguageId()),f=new p.FastTokenizer(this.textModel.getValue(),C);this.initialAstWithoutTokens=(0,_.parseDocument)(f,[],void 0,!0),this.astWithTokens=this.initialAstWithoutTokens}}handleDidChangeBackgroundTokenizationState(){if(this.textModel.tokenization.backgroundTokenizationState===2){const r=this.initialAstWithoutTokens===void 0;this.initialAstWithoutTokens=void 0,r||this.didChangeEmitter.fire()}}handleDidChangeTokens({ranges:r}){const u=r.map(C=>new E.TextEditInfo((0,m.toLength)(C.fromLineNumber-1,0),(0,m.toLength)(C.toLineNumber,0),(0,m.toLength)(C.toLineNumber-C.fromLineNumber+1,0)));this.handleEdits(u,!0),this.initialAstWithoutTokens||this.didChangeEmitter.fire()}handleContentChanged(r){const u=E.TextEditInfo.fromModelContentChanges(r.changes);this.handleEdits(u,!1)}handleEdits(r,u){const C=(0,o.combineTextEditInfos)(this.queuedTextEdits,r);this.queuedTextEdits=C,this.initialAstWithoutTokens&&!u&&(this.queuedTextEditsForInitialAstWithoutTokens=(0,o.combineTextEditInfos)(this.queuedTextEditsForInitialAstWithoutTokens,r))}flushQueue(){this.queuedTextEdits.length>0&&(this.astWithTokens=this.parseDocumentFromTextBuffer(this.queuedTextEdits,this.astWithTokens,!1),this.queuedTextEdits=[]),this.queuedTextEditsForInitialAstWithoutTokens.length>0&&(this.initialAstWithoutTokens&&(this.initialAstWithoutTokens=this.parseDocumentFromTextBuffer(this.queuedTextEditsForInitialAstWithoutTokens,this.initialAstWithoutTokens,!1)),this.queuedTextEditsForInitialAstWithoutTokens=[])}parseDocumentFromTextBuffer(r,u,C){const h=u,v=new p.TextBufferTokenizer(this.textModel,this.brackets);return(0,_.parseDocument)(v,r,h,C)}getBracketsInRange(r,u){this.flushQueue();const C=(0,m.toLength)(r.startLineNumber-1,r.startColumn-1),f=(0,m.toLength)(r.endLineNumber-1,r.endColumn-1);return new n.CallbackIterable(h=>{const v=this.initialAstWithoutTokens||this.astWithTokens;g(v,m.lengthZero,v.length,C,f,h,0,0,new Map,u)})}getBracketPairsInRange(r,u){this.flushQueue();const C=(0,m.positionToLength)(r.getStartPosition()),f=(0,m.positionToLength)(r.getEndPosition());return new n.CallbackIterable(h=>{const v=this.initialAstWithoutTokens||this.astWithTokens,w=new c(h,u,this.textModel);l(v,m.lengthZero,v.length,C,f,w,0,new Map)})}getFirstBracketAfter(r){this.flushQueue();const u=this.initialAstWithoutTokens||this.astWithTokens;return s(u,m.lengthZero,u.length,(0,m.positionToLength)(r))}getFirstBracketBefore(r){this.flushQueue();const u=this.initialAstWithoutTokens||this.astWithTokens;return i(u,m.lengthZero,u.length,(0,m.positionToLength)(r))}}e.BracketPairsTree=t;function i(a,r,u,C){if(a.kind===4||a.kind===2){const f=[];for(const h of a.children)u=(0,m.lengthAdd)(r,h.length),f.push({nodeOffsetStart:r,nodeOffsetEnd:u}),r=u;for(let h=f.length-1;h>=0;h--){const{nodeOffsetStart:v,nodeOffsetEnd:w}=f[h];if((0,m.lengthLessThan)(v,C)){const S=i(a.children[h],v,w,C);if(S)return S}}return null}else{if(a.kind===3)return null;if(a.kind===1){const f=(0,m.lengthsToRange)(r,u);return{bracketInfo:a.bracketInfo,range:f}}}return null}function s(a,r,u,C){if(a.kind===4||a.kind===2){for(const f of a.children){if(u=(0,m.lengthAdd)(r,f.length),(0,m.lengthLessThan)(C,u)){const h=s(f,r,u,C);if(h)return h}r=u}return null}else{if(a.kind===3)return null;if(a.kind===1){const f=(0,m.lengthsToRange)(r,u);return{bracketInfo:a.bracketInfo,range:f}}}return null}function g(a,r,u,C,f,h,v,w,S,L,D=!1){if(v>200)return!0;e:for(;;)switch(a.kind){case 4:{const T=a.childrenLength;for(let M=0;M200)return!0;let S=!0;if(a.kind===2){let L=0;if(w){let M=w.get(a.openingBracket.text);M===void 0&&(M=0),L=M,M++,w.set(a.openingBracket.text,M)}const D=(0,m.lengthAdd)(r,a.openingBracket.length);let T=-1;if(h.includeMinIndentation&&(T=a.computeMinIndentation(r,h.textModel)),S=h.push(new I.BracketPairWithMinIndentationInfo((0,m.lengthsToRange)(r,u),(0,m.lengthsToRange)(r,D),a.closingBracket?(0,m.lengthsToRange)((0,m.lengthAdd)(D,a.child?.length||m.lengthZero),u):void 0,v,L,a,T)),r=D,S&&a.child){const M=a.child;if(u=(0,m.lengthAdd)(r,M.length),(0,m.lengthLessThanEqual)(r,f)&&(0,m.lengthGreaterThanEqual)(u,C)&&(S=l(M,r,u,C,f,h,v+1,w),!S))return!1}w?.set(a.openingBracket.text,L)}else{let L=r;for(const D of a.children){const T=L;if(L=(0,m.lengthAdd)(L,D.length),(0,m.lengthLessThanEqual)(T,f)&&(0,m.lengthLessThanEqual)(C,L)&&(S=l(D,T,L,C,f,h,v,w),!S))return!1}}return S}}),define(ne[132],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InternalModelContentChangeEvent=e.ModelInjectedTextChangedEvent=e.ModelRawContentChangedEvent=e.ModelRawEOLChanged=e.ModelRawLinesInserted=e.ModelRawLinesDeleted=e.ModelRawLineChanged=e.LineInjectedText=e.ModelRawFlush=void 0;class d{constructor(){this.changeType=1}}e.ModelRawFlush=d;class k{static applyInjectedText(o,t){if(!t||t.length===0)return o;let i="",s=0;for(const g of t)i+=o.substring(s,g.column-1),s=g.column-1,i+=g.options.content;return i+=o.substring(s),i}static fromDecorations(o){const t=[];for(const i of o)i.options.before&&i.options.before.content.length>0&&t.push(new k(i.ownerId,i.range.startLineNumber,i.range.startColumn,i.options.before,0)),i.options.after&&i.options.after.content.length>0&&t.push(new k(i.ownerId,i.range.endLineNumber,i.range.endColumn,i.options.after,1));return t.sort((i,s)=>i.lineNumber===s.lineNumber?i.column===s.column?i.order-s.order:i.column-s.column:i.lineNumber-s.lineNumber),t}constructor(o,t,i,s,g){this.ownerId=o,this.lineNumber=t,this.column=i,this.options=s,this.order=g}}e.LineInjectedText=k;class I{constructor(o,t,i){this.changeType=2,this.lineNumber=o,this.detail=t,this.injectedText=i}}e.ModelRawLineChanged=I;class E{constructor(o,t){this.changeType=3,this.fromLineNumber=o,this.toLineNumber=t}}e.ModelRawLinesDeleted=E;class y{constructor(o,t,i,s){this.changeType=4,this.injectedTexts=s,this.fromLineNumber=o,this.toLineNumber=t,this.detail=i}}e.ModelRawLinesInserted=y;class m{constructor(){this.changeType=5}}e.ModelRawEOLChanged=m;class _{constructor(o,t,i,s){this.changes=o,this.versionId=t,this.isUndoing=i,this.isRedoing=s,this.resultingSelection=null}containsEvent(o){for(let t=0,i=this.changes.length;tg)throw new b.BugIndicatingError("Illegal value for lineNumber");const c=this.getLanguageConfiguration(this.textModel.getLanguageId()).foldingRules,l=!!(c&&c.offSide);let a=-2,r=-1,u=-2,C=-1;const f=O=>{if(a!==-1&&(a===-2||a>O-1)){a=-1,r=-1;for(let F=O-2;F>=0;F--){const x=this._computeIndentLevel(F);if(x>=0){a=F,r=x;break}}}if(u===-2){u=-1,C=-1;for(let F=O;F=0){u=F,C=x;break}}}};let h=-2,v=-1,w=-2,S=-1;const L=O=>{if(h===-2){h=-1,v=-1;for(let F=O-2;F>=0;F--){const x=this._computeIndentLevel(F);if(x>=0){h=F,v=x;break}}}if(w!==-1&&(w===-2||w=0){w=F,S=x;break}}}};let D=0,T=!0,M=0,A=!0,P=0,N=0;for(let O=0;T||A;O++){const F=t-O,x=t+O;O>1&&(F<1||F1&&(x>g||x>s)&&(A=!1),O>5e4&&(T=!1,A=!1);let W=-1;if(T&&F>=1){const q=this._computeIndentLevel(F-1);q>=0?(u=F-1,C=q,W=Math.ceil(q/this.textModel.getOptions().indentSize)):(f(F),W=this._getIndentLevelForWhitespaceLine(l,r,C))}let V=-1;if(A&&x<=g){const q=this._computeIndentLevel(x-1);q>=0?(h=x-1,v=q,V=Math.ceil(q/this.textModel.getOptions().indentSize)):(L(x),V=this._getIndentLevelForWhitespaceLine(l,v,S))}if(O===0){N=W;continue}if(O===1){if(x<=g&&V>=0&&N+1===V){T=!1,D=x,M=x,P=V;continue}if(F>=1&&W>=0&&W-1===N){A=!1,D=F,M=F,P=W;continue}if(D=t,M=t,P=N,P===0)return{startLineNumber:D,endLineNumber:M,indent:P}}T&&(W>=P?D=F:T=!1),A&&(V>=P?M=x:A=!1)}return{startLineNumber:D,endLineNumber:M,indent:P}}getLinesBracketGuides(t,i,s,g){const c=[];for(let f=t;f<=i;f++)c.push([]);const l=!0,a=this.textModel.bracketPairs.getBracketPairsInRangeWithMinIndentation(new E.Range(t,1,i,this.textModel.getLineMaxColumn(i))).toArray();let r;if(s&&a.length>0){const f=(t<=s.lineNumber&&s.lineNumber<=i?a:this.textModel.bracketPairs.getBracketPairsInRange(E.Range.fromPositions(s)).toArray()).filter(h=>E.Range.strictContainsPosition(h.range,s));r=(0,d.findLast)(f,h=>l||h.range.startLineNumber!==h.range.endLineNumber)?.range}const u=this.textModel.getOptions().bracketPairColorizationOptions.independentColorPoolPerBracketType,C=new n;for(const f of a){if(!f.closingBracketRange)continue;const h=r&&f.range.equalsRange(r);if(!h&&!g.includeInactive)continue;const v=C.getInlineClassName(f.nestingLevel,f.nestingLevelOfEqualBracketType,u)+(g.highlightActive&&h?" "+C.activeClassName:""),w=f.openingBracketRange.getStartPosition(),S=f.closingBracketRange.getStartPosition(),L=g.horizontalGuides===_.HorizontalGuidesState.Enabled||g.horizontalGuides===_.HorizontalGuidesState.EnabledForActive&&h;if(f.range.startLineNumber===f.range.endLineNumber){l&&L&&c[f.range.startLineNumber-t].push(new _.IndentGuide(-1,f.openingBracketRange.getEndPosition().column,v,new _.IndentGuideHorizontalLine(!1,S.column),-1,-1));continue}const D=this.getVisibleColumnFromPosition(S),T=this.getVisibleColumnFromPosition(f.openingBracketRange.getStartPosition()),M=Math.min(T,D,f.minVisibleColumnIndentation+1);let A=!1;k.firstNonWhitespaceIndex(this.textModel.getLineContent(f.closingBracketRange.startLineNumber))=t&&T>M&&c[w.lineNumber-t].push(new _.IndentGuide(M,-1,v,new _.IndentGuideHorizontalLine(!1,w.column),-1,-1)),S.lineNumber<=i&&D>M&&c[S.lineNumber-t].push(new _.IndentGuide(M,-1,v,new _.IndentGuideHorizontalLine(!A,S.column),-1,-1)))}for(const f of c)f.sort((h,v)=>h.visibleColumn-v.visibleColumn);return c}getVisibleColumnFromPosition(t){return I.CursorColumns.visibleColumnFromColumn(this.textModel.getLineContent(t.lineNumber),t.column,this.textModel.getOptions().tabSize)+1}getLinesIndentGuides(t,i){this.assertNotDisposed();const s=this.textModel.getLineCount();if(t<1||t>s)throw new Error("Illegal value for startLineNumber");if(i<1||i>s)throw new Error("Illegal value for endLineNumber");const g=this.textModel.getOptions(),c=this.getLanguageConfiguration(this.textModel.getLanguageId()).foldingRules,l=!!(c&&c.offSide),a=new Array(i-t+1);let r=-2,u=-1,C=-2,f=-1;for(let h=t;h<=i;h++){const v=h-t,w=this._computeIndentLevel(h-1);if(w>=0){r=h-1,u=w,a[v]=Math.ceil(w/g.indentSize);continue}if(r===-2){r=-1,u=-1;for(let S=h-2;S>=0;S--){const L=this._computeIndentLevel(S);if(L>=0){r=S,u=L;break}}}if(C!==-1&&(C===-2||C=0){C=S,f=L;break}}}a[v]=this._getIndentLevelForWhitespaceLine(l,u,f)}return a}_getIndentLevelForWhitespaceLine(t,i,s){const g=this.textModel.getOptions();return i===-1||s===-1?0:i{this._tokenizationSupports.get(m)===_&&(this._tokenizationSupports.delete(m),this.handleChange([m]))})}get(m){return this._tokenizationSupports.get(m)||null}registerFactory(m,_){this._factories.get(m)?.dispose();const b=new E(this,m,_);return this._factories.set(m,b),(0,k.toDisposable)(()=>{const p=this._factories.get(m);!p||p!==b||(this._factories.delete(m),p.dispose())})}async getOrCreate(m){const _=this.get(m);if(_)return _;const b=this._factories.get(m);return!b||b.isResolved?null:(await b.resolve(),this.get(m))}isResolved(m){if(this.get(m))return!0;const b=this._factories.get(m);return!!(!b||b.isResolved)}setColorMap(m){this._colorMap=m,this._onDidChange.fire({changedLanguages:Array.from(this._tokenizationSupports.keys()),changedColorMap:!0})}getColorMap(){return this._colorMap}getDefaultBackground(){return this._colorMap&&this._colorMap.length>2?this._colorMap[2]:null}}e.TokenizationRegistry=I;class E extends k.Disposable{get isResolved(){return this._isResolved}constructor(m,_,b){super(),this._registry=m,this._languageId=_,this._factory=b,this._isDisposed=!1,this._resolvePromise=null,this._isResolved=!1}dispose(){this._isDisposed=!0,super.dispose()}async resolve(){return this._resolvePromise||(this._resolvePromise=this._create()),this._resolvePromise}async _create(){const m=await this._factory.tokenizationSupport;this._isResolved=!0,m&&!this._isDisposed&&this._register(this._registry.register(this._languageId,m))}}}),define(ne[586],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContiguousMultilineTokens=void 0;class d{get startLineNumber(){return this._startLineNumber}get endLineNumber(){return this._startLineNumber+this._tokens.length-1}constructor(I,E){this._startLineNumber=I,this._tokens=E}getLineTokens(I){return this._tokens[I-this._startLineNumber]}appendLineTokens(I){this._tokens.push(I)}}e.ContiguousMultilineTokens=d}),define(ne[330],se([1,0,586]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContiguousMultilineTokensBuilder=void 0;class k{constructor(){this._tokens=[]}add(E,y){if(this._tokens.length>0){const m=this._tokens[this._tokens.length-1];if(m.endLineNumber+1===E){m.appendLineTokens(y);return}}this._tokens.push(new d.ContiguousMultilineTokens(E,[y]))}finalize(){return this._tokens}}e.ContiguousMultilineTokensBuilder=k}),define(ne[83],se([1,0,148]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LineTokens=void 0,e.getStandardTokenTypeAtPosition=E;class k{static{this.defaultTokenMetadata=(32768|2<<24)>>>0}static createEmpty(m,_){const b=k.defaultTokenMetadata,p=new Uint32Array(2);return p[0]=m.length,p[1]=b,new k(p,m,_)}static createFromTextAndMetadata(m,_){let b=0,p="";const n=new Array;for(const{text:o,metadata:t}of m)n.push(b+o.length,t),b+=o.length,p+=o;return new k(new Uint32Array(n),p,_)}constructor(m,_,b){this._lineTokensBrand=void 0,this._tokens=m,this._tokensCount=this._tokens.length>>>1,this._text=_,this.languageIdCodec=b}equals(m){return m instanceof k?this.slicedEquals(m,0,this._tokensCount):!1}slicedEquals(m,_,b){if(this._text!==m._text||this._tokensCount!==m._tokensCount)return!1;const p=_<<1,n=p+(b<<1);for(let o=p;o0?this._tokens[m-1<<1]:0}getMetadata(m){return this._tokens[(m<<1)+1]}getLanguageId(m){const _=this._tokens[(m<<1)+1],b=d.TokenMetadata.getLanguageId(_);return this.languageIdCodec.decodeLanguageId(b)}getStandardTokenType(m){const _=this._tokens[(m<<1)+1];return d.TokenMetadata.getTokenType(_)}getForeground(m){const _=this._tokens[(m<<1)+1];return d.TokenMetadata.getForeground(_)}getClassName(m){const _=this._tokens[(m<<1)+1];return d.TokenMetadata.getClassNameFromMetadata(_)}getInlineStyle(m,_){const b=this._tokens[(m<<1)+1];return d.TokenMetadata.getInlineStyleFromMetadata(b,_)}getPresentation(m){const _=this._tokens[(m<<1)+1];return d.TokenMetadata.getPresentationFromMetadata(_)}getEndOffset(m){return this._tokens[m<<1]}findTokenIndexAtOffset(m){return k.findIndexInTokensArray(this._tokens,m)}inflate(){return this}sliceAndInflate(m,_,b){return new I(this,m,_,b)}static convertToEndOffset(m,_){const p=(m.length>>>1)-1;for(let n=0;n>>1)-1;for(;b_&&(p=n)}return b}withInserted(m){if(m.length===0)return this;let _=0,b=0,p="";const n=new Array;let o=0;for(;;){const t=_o){p+=this._text.substring(o,i.offset);const s=this._tokens[(_<<1)+1];n.push(p.length,s),o=i.offset}p+=i.text,n.push(p.length,i.tokenMetadata),b++}else break}return new k(new Uint32Array(n),p,this.languageIdCodec)}getTokenText(m){const _=this.getStartOffset(m),b=this.getEndOffset(m);return this._text.substring(_,b)}forEach(m){const _=this.getCount();for(let b=0;b<_;b++)m(b)}}e.LineTokens=k;class I{constructor(m,_,b,p){this._source=m,this._startOffset=_,this._endOffset=b,this._deltaOffset=p,this._firstTokenIndex=m.findTokenIndexAtOffset(_),this.languageIdCodec=m.languageIdCodec,this._tokensCount=0;for(let n=this._firstTokenIndex,o=m.getCount();n=b);n++)this._tokensCount++}getMetadata(m){return this._source.getMetadata(this._firstTokenIndex+m)}getLanguageId(m){return this._source.getLanguageId(this._firstTokenIndex+m)}getLineContent(){return this._source.getLineContent().substring(this._startOffset,this._endOffset)}equals(m){return m instanceof I?this._startOffset===m._startOffset&&this._endOffset===m._endOffset&&this._deltaOffset===m._deltaOffset&&this._source.slicedEquals(m._source,this._firstTokenIndex,this._tokensCount):!1}getCount(){return this._tokensCount}getStandardTokenType(m){return this._source.getStandardTokenType(this._firstTokenIndex+m)}getForeground(m){return this._source.getForeground(this._firstTokenIndex+m)}getEndOffset(m){const _=this._source.getEndOffset(this._firstTokenIndex+m);return Math.min(this._endOffset,_)-this._startOffset+this._deltaOffset}getClassName(m){return this._source.getClassName(this._firstTokenIndex+m)}getInlineStyle(m,_){return this._source.getInlineStyle(this._firstTokenIndex+m,_)}getPresentation(m){return this._source.getPresentation(this._firstTokenIndex+m)}findTokenIndexAtOffset(m){return this._source.findTokenIndexAtOffset(m+this._startOffset-this._deltaOffset)-this._firstTokenIndex}getTokenText(m){const _=this._firstTokenIndex+m,b=this._source.getStartOffset(_),p=this._source.getEndOffset(_);let n=this._source.getTokenText(_);return bthis._endOffset&&(n=n.substring(0,n.length-(p-this._endOffset))),n}forEach(m){for(let _=0;_{this.model.tokenization.forceTokenization(C);const f=this.model.tokenization.getLineTokens(C),h=this.model.getLineMaxColumn(C)-1;return(0,k.createScopedLineTokens)(f,h)};this.model.tokenization.forceTokenization(p.startLineNumber);const o=this.model.tokenization.getLineTokens(p.startLineNumber),t=(0,k.createScopedLineTokens)(o,p.startColumn-1),i=I.LineTokens.createEmpty("",t.languageIdCodec),s=p.startLineNumber-1;if(s===0||!(t.firstCharOffset===0))return i;const l=n(s);if(!(t.languageId===l.languageId))return i;const r=l.toIViewLineTokens();return this.indentationLineProcessor.getProcessedTokens(r)}}e.IndentationContextProcessor=y;class m{constructor(p,n){this.model=p,this.languageConfigurationService=n}getProcessedLine(p,n){const o=(s,g)=>{const c=d.getLeadingWhitespace(s);return g+s.substring(c.length)};this.model.tokenization.forceTokenization?.(p);const t=this.model.tokenization.getLineTokens(p);let i=this.getProcessedTokens(t).getLineContent();return n!==void 0&&(i=o(i,n)),i}getProcessedTokens(p){const n=c=>c===2||c===3||c===1,o=p.getLanguageId(0),i=this.languageConfigurationService.getLanguageConfiguration(o).bracketsNew.getBracketRegExp({global:!0}),s=[];return p.forEach(c=>{const l=p.getStandardTokenType(c);let a=p.getTokenText(c);n(l)&&(a=a.replace(i,""));const r=p.getMetadata(c);s.push({text:a,metadata:r})}),I.LineTokens.createFromTextAndMetadata(s,p.languageIdCodec)}}function _(b,p){b.tokenization.forceTokenization(p.lineNumber);const n=b.tokenization.getLineTokens(p.lineNumber),o=(0,k.createScopedLineTokens)(n,p.column-1),t=o.firstCharOffset===0,i=n.getLanguageId(0)===o.languageId;return!t&&!i}}),define(ne[241],se([1,0,11,131,240]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getInheritIndentForLine=y,e.getGoodIndentForLine=m,e.getIndentForEnter=_,e.getIndentActionForType=b,e.getIndentMetadata=p;function E(o,t,i){const s=o.tokenization.getLanguageIdAtPosition(t,0);if(t>1){let g,c=-1;for(g=t-1;g>=1;g--){if(o.tokenization.getLanguageIdAtPosition(g,0)!==s)return c;const l=o.getLineContent(g);if(i.shouldIgnore(g)||/^\s+$/.test(l)||l===""){c=g;continue}return g}}return-1}function y(o,t,i,s=!0,g){if(o<4)return null;const c=g.getLanguageConfiguration(t.tokenization.getLanguageId()).indentRulesSupport;if(!c)return null;const l=new I.ProcessedIndentRulesSupport(t,c,g);if(i<=1)return{indentation:"",action:null};for(let r=i-1;r>0&&t.getLineContent(r)==="";r--)if(r===1)return{indentation:"",action:null};const a=E(t,i,l);if(a<0)return null;if(a<1)return{indentation:"",action:null};if(l.shouldIncrease(a)||l.shouldIndentNextLine(a)){const r=t.getLineContent(a);return{indentation:d.getLeadingWhitespace(r),action:k.IndentAction.Indent,line:a}}else if(l.shouldDecrease(a)){const r=t.getLineContent(a);return{indentation:d.getLeadingWhitespace(r),action:null,line:a}}else{if(a===1)return{indentation:d.getLeadingWhitespace(t.getLineContent(a)),action:null,line:a};const r=a-1,u=c.getIndentMetadata(t.getLineContent(r));if(!(u&3)&&u&4){let C=0;for(let f=r-1;f>0;f--)if(!l.shouldIndentNextLine(f)){C=f;break}return{indentation:d.getLeadingWhitespace(t.getLineContent(C+1)),action:null,line:C+1}}if(s)return{indentation:d.getLeadingWhitespace(t.getLineContent(a)),action:null,line:a};for(let C=a;C>0;C--){if(l.shouldIncrease(C))return{indentation:d.getLeadingWhitespace(t.getLineContent(C)),action:k.IndentAction.Indent,line:C};if(l.shouldIndentNextLine(C)){let f=0;for(let h=C-1;h>0;h--)if(!l.shouldIndentNextLine(C)){f=h;break}return{indentation:d.getLeadingWhitespace(t.getLineContent(f+1)),action:null,line:f+1}}else if(l.shouldDecrease(C))return{indentation:d.getLeadingWhitespace(t.getLineContent(C)),action:null,line:C}}return{indentation:d.getLeadingWhitespace(t.getLineContent(1)),action:null,line:1}}}function m(o,t,i,s,g,c){if(o<4)return null;const l=c.getLanguageConfiguration(i);if(!l)return null;const a=c.getLanguageConfiguration(i).indentRulesSupport;if(!a)return null;const r=new I.ProcessedIndentRulesSupport(t,a,c),u=y(o,t,s,void 0,c);if(u){const C=u.line;if(C!==void 0){let f=!0;for(let h=C;h0){const D=t.getLineContent(L);if(u.shouldIndentNextLine(D)&&u.shouldIncrease(S)){const M=y(l,t,i.startLineNumber,!1,c)?.indentation;if(M!==void 0){const A=t.getLineContent(i.startLineNumber),P=d.getLeadingWhitespace(A),O=g.shiftIndent(M)===P,F=/^\s*$/.test(w),x=o.autoClosingPairs.autoClosingPairsOpenByEnd.get(s),V=x&&x.length>0&&F;if(O&&V)return M}}}return null}function p(o,t,i){const s=i.getLanguageConfiguration(o.getLanguageId()).indentRulesSupport;return!s||t<1||t>o.getLineCount()?null:s.getIndentMetadata(o.getLineContent(t))}function n(o,t,i){return{tokenization:{getLineTokens:g=>g===t?i:o.tokenization.getLineTokens(g),getLanguageId:()=>o.getLanguageId(),getLanguageIdAtPosition:(g,c)=>o.getLanguageIdAtPosition(g,c)},getLineContent:g=>g===t?i.getLineContent():o.getLineContent(g)}}}),define(ne[587],se([1,0,83]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContiguousTokensEditing=e.EMPTY_LINE_TOKENS=void 0,e.toUint32Array=I,e.EMPTY_LINE_TOKENS=new Uint32Array(0).buffer;class k{static deleteBeginning(y,m){return y===null||y===e.EMPTY_LINE_TOKENS?y:k.delete(y,0,m)}static deleteEnding(y,m){if(y===null||y===e.EMPTY_LINE_TOKENS)return y;const _=I(y),b=_[_.length-2];return k.delete(y,m,b)}static delete(y,m,_){if(y===null||y===e.EMPTY_LINE_TOKENS||m===_)return y;const b=I(y),p=b.length>>>1;if(m===0&&b[b.length-2]===_)return e.EMPTY_LINE_TOKENS;const n=d.LineTokens.findIndexInTokensArray(b,m),o=n>0?b[n-1<<1]:0,t=b[n<<1];if(_s&&(b[i++]=a,b[i++]=b[(l<<1)+1],s=a)}if(i===b.length)return y;const c=new Uint32Array(i);return c.set(b.subarray(0,i),0),c.buffer}static append(y,m){if(m===e.EMPTY_LINE_TOKENS)return y;if(y===e.EMPTY_LINE_TOKENS)return m;if(y===null)return y;if(m===null)return null;const _=I(y),b=I(m),p=b.length>>>1,n=new Uint32Array(_.length+b.length);n.set(_,0);let o=_.length;const t=_[_.length-2];for(let i=0;i>>1;let n=d.LineTokens.findIndexInTokensArray(b,m);n>0&&b[n-1<<1]===m&&n--;for(let o=n;o0}getTokens(p,n,o){let t=null;if(n1&&(i=y.TokenMetadata.getLanguageId(t[1])!==p),!i)return I.EMPTY_LINE_TOKENS}if(!t||t.length===0){const i=new Uint32Array(2);return i[0]=n,i[1]=_(p),i.buffer}return t[t.length-2]=n,t.byteOffset===0&&t.byteLength===t.buffer.byteLength?t.buffer:t}_ensureLine(p){for(;p>=this._len;)this._lineTokens[this._len]=null,this._len++}_deleteLines(p,n){n!==0&&(p+n>this._len&&(n=this._len-p),this._lineTokens.splice(p,n),this._len-=n)}_insertLines(p,n){if(n===0)return;const o=[];for(let t=0;t=this._len)return;if(p.startLineNumber===p.endLineNumber){if(p.startColumn===p.endColumn)return;this._lineTokens[n]=I.ContiguousTokensEditing.delete(this._lineTokens[n],p.startColumn-1,p.endColumn-1);return}this._lineTokens[n]=I.ContiguousTokensEditing.deleteEnding(this._lineTokens[n],p.startColumn-1);const o=p.endLineNumber-1;let t=null;o=this._len)){if(n===0){this._lineTokens[t]=I.ContiguousTokensEditing.insert(this._lineTokens[t],p.column-1,o);return}this._lineTokens[t]=I.ContiguousTokensEditing.deleteEnding(this._lineTokens[t],p.column-1),this._lineTokens[t]=I.ContiguousTokensEditing.insert(this._lineTokens[t],p.column-1,o),this._insertLines(p.lineNumber,n)}}setMultilineTokens(p,n){if(p.length===0)return{changes:[]};const o=[];for(let t=0,i=p.length;t>>0}}),define(ne[589],se([1,0,9,4,145]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SparseLineTokens=e.SparseMultilineTokens=void 0;class E{static create(b,p){return new E(b,new y(p))}get startLineNumber(){return this._startLineNumber}get endLineNumber(){return this._endLineNumber}constructor(b,p){this._startLineNumber=b,this._tokens=p,this._endLineNumber=this._startLineNumber+this._tokens.getMaxDeltaLine()}toString(){return this._tokens.toString(this._startLineNumber)}_updateEndLineNumber(){this._endLineNumber=this._startLineNumber+this._tokens.getMaxDeltaLine()}isEmpty(){return this._tokens.isEmpty()}getLineTokens(b){return this._startLineNumber<=b&&b<=this._endLineNumber?this._tokens.getLineTokens(b-this._startLineNumber):null}getRange(){const b=this._tokens.getRange();return b&&new k.Range(this._startLineNumber+b.startLineNumber,b.startColumn,this._startLineNumber+b.endLineNumber,b.endColumn)}removeTokens(b){const p=b.startLineNumber-this._startLineNumber,n=b.endLineNumber-this._startLineNumber;this._startLineNumber+=this._tokens.removeTokens(p,b.startColumn-1,n,b.endColumn-1),this._updateEndLineNumber()}split(b){const p=b.startLineNumber-this._startLineNumber,n=b.endLineNumber-this._startLineNumber,[o,t,i]=this._tokens.split(p,b.startColumn-1,n,b.endColumn-1);return[new E(this._startLineNumber,o),new E(this._startLineNumber+i,t)]}applyEdit(b,p){const[n,o,t]=(0,I.countEOL)(p);this.acceptEdit(b,n,o,t,p.length>0?p.charCodeAt(0):0)}acceptEdit(b,p,n,o,t){this._acceptDeleteRange(b),this._acceptInsertText(new d.Position(b.startLineNumber,b.startColumn),p,n,o,t),this._updateEndLineNumber()}_acceptDeleteRange(b){if(b.startLineNumber===b.endLineNumber&&b.startColumn===b.endColumn)return;const p=b.startLineNumber-this._startLineNumber,n=b.endLineNumber-this._startLineNumber;if(n<0){const t=n-p;this._startLineNumber-=t;return}const o=this._tokens.getMaxDeltaLine();if(!(p>=o+1)){if(p<0&&n>=o+1){this._startLineNumber=0,this._tokens.clear();return}if(p<0){const t=-p;this._startLineNumber-=t,this._tokens.acceptDeleteRange(b.startColumn-1,0,0,n,b.endColumn-1)}else this._tokens.acceptDeleteRange(0,p,b.startColumn-1,n,b.endColumn-1)}}_acceptInsertText(b,p,n,o,t){if(p===0&&n===0)return;const i=b.lineNumber-this._startLineNumber;if(i<0){this._startLineNumber+=p;return}const s=this._tokens.getMaxDeltaLine();i>=s+1||this._tokens.acceptInsertText(i,b.column-1,p,n,o,t)}}e.SparseMultilineTokens=E;class y{constructor(b){this._tokens=b,this._tokenCount=b.length/4}toString(b){const p=[];for(let n=0;nb)n=o-1;else{let i=o;for(;i>p&&this._getDeltaLine(i-1)===b;)i--;let s=o;for(;sb||r===b&&C>=p)&&(rb||C===b&&h>=p){if(Ct?f-=t-n:f=n;else if(u===p&&C===n)if(u===o&&f>t)f-=t-n;else{l=!0;continue}else if(ut)u=p,C=n,f=C+(f-t);else{l=!0;continue}else if(u>o){if(g===0&&!l){c=s;break}u-=g}else if(u===o&&C>=t)b&&u===0&&(C+=b,f+=b),u-=g,C-=t-n,f-=t-n;else throw new Error("Not possible!");const v=4*c;i[v]=u,i[v+1]=C,i[v+2]=f,i[v+3]=h,c++}this._tokenCount=c}acceptInsertText(b,p,n,o,t,i){const s=n===0&&o===1&&(i>=48&&i<=57||i>=65&&i<=90||i>=97&&i<=122),g=this._tokens,c=this._tokenCount;for(let l=0;l0){const p=m[0].getRange(),n=m[m.length-1].getRange();if(!p||!n)return y;_=y.plusRange(p).plusRange(n)}let b=null;for(let p=0,n=this._pieces.length;p_.endLineNumber){b=b||{index:p};break}if(o.removeTokens(_),o.isEmpty()){this._pieces.splice(p,1),p--,n--;continue}if(o.endLineNumber<_.startLineNumber)continue;if(o.startLineNumber>_.endLineNumber){b=b||{index:p};continue}const[t,i]=o.split(_);if(t.isEmpty()){b=b||{index:p};continue}i.isEmpty()||(this._pieces.splice(p,1,t,i),p++,n++,b=b||{index:p})}return b=b||{index:this._pieces.length},m.length>0&&(this._pieces=d.arrayInsert(this._pieces,b.index,m)),_}isComplete(){return this._isComplete}addSparseTokens(y,m){if(m.getLineContent().length===0)return m;const _=this._pieces;if(_.length===0)return m;const b=I._findFirstPieceWithLine(_,y),p=_[b].getLineTokens(y);if(!p)return m;const n=m.getCount(),o=p.getCount();let t=0;const i=[];let s=0,g=0;const c=(l,a)=>{l!==g&&(g=l,i[s++]=l,i[s++]=a)};for(let l=0;l>>0,f=~C>>>0;for(;tm)b=p-1;else{for(;p>_&&y[p-1].startLineNumber<=m&&m<=y[p-1].endLineNumber;)p--;return p}}return _}acceptEdit(y,m,_,b,p){for(const n of this._pieces)n.acceptEdit(y,m,_,b,p)}}e.SparseTokensStore=I}),define(ne[170],se([1,0,2]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewEventHandler=void 0;class k extends d.Disposable{constructor(){super(),this._shouldRender=!0}shouldRender(){return this._shouldRender}forceShouldRender(){this._shouldRender=!0}setShouldRender(){this._shouldRender=!0}onDidRender(){this._shouldRender=!1}onCompositionStart(E){return!1}onCompositionEnd(E){return!1}onConfigurationChanged(E){return!1}onCursorStateChanged(E){return!1}onDecorationsChanged(E){return!1}onFlushed(E){return!1}onFocusChanged(E){return!1}onLanguageConfigurationChanged(E){return!1}onLineMappingChanged(E){return!1}onLinesChanged(E){return!1}onLinesDeleted(E){return!1}onLinesInserted(E){return!1}onRevealRangeRequest(E){return!1}onScrollChanged(E){return!1}onThemeChanged(E){return!1}onTokensChanged(E){return!1}onTokensColorsChanged(E){return!1}onZonesChanged(E){return!1}handleEvents(E){let y=!1;for(let m=0,_=E.length;m<_;m++){const b=E[m];switch(b.type){case 0:this.onCompositionStart(b)&&(y=!0);break;case 1:this.onCompositionEnd(b)&&(y=!0);break;case 2:this.onConfigurationChanged(b)&&(y=!0);break;case 3:this.onCursorStateChanged(b)&&(y=!0);break;case 4:this.onDecorationsChanged(b)&&(y=!0);break;case 5:this.onFlushed(b)&&(y=!0);break;case 6:this.onFocusChanged(b)&&(y=!0);break;case 7:this.onLanguageConfigurationChanged(b)&&(y=!0);break;case 8:this.onLineMappingChanged(b)&&(y=!0);break;case 9:this.onLinesChanged(b)&&(y=!0);break;case 10:this.onLinesDeleted(b)&&(y=!0);break;case 11:this.onLinesInserted(b)&&(y=!0);break;case 12:this.onRevealRangeRequest(b)&&(y=!0);break;case 13:this.onScrollChanged(b)&&(y=!0);break;case 15:this.onTokensChanged(b)&&(y=!0);break;case 14:this.onThemeChanged(b)&&(y=!0);break;case 16:this.onTokensColorsChanged(b)&&(y=!0);break;case 17:this.onZonesChanged(b)&&(y=!0);break;default:console.info("View received unknown event: "),console.info(b)}}y&&(this._shouldRender=!0)}}e.ViewEventHandler=k}),define(ne[133],se([1,0,170]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DynamicViewOverlay=void 0;class k extends d.ViewEventHandler{}e.DynamicViewOverlay=k}),define(ne[56],se([1,0,170]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PartFingerprints=e.ViewPart=void 0;class k extends d.ViewEventHandler{constructor(y){super(),this._context=y,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),super.dispose()}}e.ViewPart=k;class I{static write(y,m){y.setAttribute("data-mprt",String(m))}static read(y){const m=y.getAttribute("data-mprt");return m===null?0:parseInt(m,10)}static collect(y,m){const _=[];let b=0;for(;y&&y!==y.ownerDocument.body&&y!==m;)y.nodeType===y.ELEMENT_NODE&&(_[b++]=this.read(y)),y=y.parentElement;const p=new Uint8Array(b);for(let n=0;n{if(i.options.zIndexs.options.zIndex)return 1;const g=i.options.className,c=s.options.className;return gc?1:I.Range.compareRangesUsingStarts(i.range,s.range)});const n=m.visibleRange.startLineNumber,o=m.visibleRange.endLineNumber,t=[];for(let i=n;i<=o;i++){const s=i-n;t[s]=""}this._renderWholeLineDecorations(m,b,t),this._renderNormalDecorations(m,b,t),this._renderResult=t}_renderWholeLineDecorations(m,_,b){const p=m.visibleRange.startLineNumber,n=m.visibleRange.endLineNumber;for(let o=0,t=_.length;o',g=Math.max(i.range.startLineNumber,p),c=Math.min(i.range.endLineNumber,n);for(let l=g;l<=c;l++){const a=l-p;b[a]+=s}}}_renderNormalDecorations(m,_,b){const p=m.visibleRange.startLineNumber;let n=null,o=!1,t=null,i=!1;for(let s=0,g=_.length;s';t[l]+=f}}}render(m,_){if(!this._renderResult)return"";const b=_-m;return b<0||b>=this._renderResult.length?"":this._renderResult[b]}}e.DecorationsOverlay=E}),define(ne[242],se([1,0,39,13,133,56,9,4,40,484]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GlyphMarginWidgets=e.DedupOverlay=e.VisibleLineDecorationsToRender=e.LineDecorationToRender=e.DecorationToRender=void 0;class b{constructor(l,a,r,u,C){this.startLineNumber=l,this.endLineNumber=a,this.className=r,this.tooltip=u,this._decorationToRenderBrand=void 0,this.zIndex=C??0}}e.DecorationToRender=b;class p{constructor(l,a,r){this.className=l,this.zIndex=a,this.tooltip=r}}e.LineDecorationToRender=p;class n{constructor(){this.decorations=[]}add(l){this.decorations.push(l)}getDecorations(){return this.decorations}}e.VisibleLineDecorationsToRender=n;class o extends I.DynamicViewOverlay{_render(l,a,r){const u=[];for(let h=l;h<=a;h++){const v=h-l;u[v]=new n}if(r.length===0)return u;r.sort((h,v)=>h.className===v.className?h.startLineNumber===v.startLineNumber?h.endLineNumber-v.endLineNumber:h.startLineNumber-v.startLineNumber:h.classNameu)continue;const w=Math.max(h,r),S=this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new y.Position(w,0)),L=this._context.viewModel.glyphLanes.getLanesAtLine(S.lineNumber).indexOf(C.preference.lane);a.push(new s(w,L,C.preference.zIndex,C))}}_collectSortedGlyphRenderRequests(l){const a=[];return this._collectDecorationBasedGlyphRenderRequest(l,a),this._collectWidgetBasedGlyphRenderRequest(l,a),a.sort((r,u)=>r.lineNumber===u.lineNumber?r.laneIndex===u.laneIndex?r.zIndex===u.zIndex?u.type===r.type?r.type===0&&u.type===0?r.className0;){const u=a.peek();if(!u)break;const C=a.takeWhile(h=>h.lineNumber===u.lineNumber&&h.laneIndex===u.laneIndex);if(!C||C.length===0)break;const f=C[0];if(f.type===0){const h=[];for(const v of C){if(v.zIndex!==f.zIndex||v.type!==f.type)break;(h.length===0||h[h.length-1]!==v.className)&&h.push(v.className)}r.push(f.accept(h.join(" ")))}else f.widget.renderInfo={lineNumber:f.lineNumber,laneIndex:f.laneIndex}}this._decorationGlyphsToRender=r}render(l){if(!this._glyphMargin){for(const r of Object.values(this._widgets))r.domNode.setDisplay("none");for(;this._managedDomNodes.length>0;)this._managedDomNodes.pop()?.domNode.remove();return}const a=Math.round(this._glyphMarginWidth/this._glyphMarginDecorationLaneCount);for(const r of Object.values(this._widgets))if(!r.renderInfo)r.domNode.setDisplay("none");else{const u=l.viewportData.relativeVerticalOffset[r.renderInfo.lineNumber-l.viewportData.startLineNumber],C=this._glyphMarginLeft+r.renderInfo.laneIndex*this._lineHeight;r.domNode.setDisplay("block"),r.domNode.setTop(u),r.domNode.setLeft(C),r.domNode.setWidth(a),r.domNode.setHeight(this._lineHeight)}for(let r=0;rthis._decorationGlyphsToRender.length;)this._managedDomNodes.pop()?.domNode.remove()}}e.GlyphMarginWidgets=t;class i{constructor(l,a,r,u){this.lineNumber=l,this.laneIndex=a,this.zIndex=r,this.className=u,this.type=0}accept(l){return new g(this.lineNumber,this.laneIndex,l)}}class s{constructor(l,a,r,u){this.lineNumber=l,this.laneIndex=a,this.zIndex=r,this.widget=u,this.type=1}}class g{constructor(l,a,r){this.lineNumber=l,this.laneIndex=a,this.combinedClassName=r}}}),define(ne[593],se([1,0,242,488]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinesDecorationsOverlay=void 0;class k extends d.DedupOverlay{constructor(E){super(),this._context=E;const m=this._context.configuration.options.get(146);this._decorationsLeft=m.decorationsLeft,this._decorationsWidth=m.decorationsWidth,this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(E){const m=this._context.configuration.options.get(146);return this._decorationsLeft=m.decorationsLeft,this._decorationsWidth=m.decorationsWidth,!0}onDecorationsChanged(E){return!0}onFlushed(E){return!0}onLinesChanged(E){return!0}onLinesDeleted(E){return!0}onLinesInserted(E){return!0}onScrollChanged(E){return E.scrollTopChanged}onZonesChanged(E){return!0}_getDecorations(E){const y=E.getDecorationsInViewport(),m=[];let _=0;for(let b=0,p=y.length;b',o=[];for(let t=y;t<=m;t++){const i=t-y,s=_[i].getDecorations();let g="";for(const c of s){let l='
    ';b[n]=t}this._renderResult=b}render(E,y){return this._renderResult?this._renderResult[y-E]:""}}e.MarginViewLineDecorationsOverlay=k}),define(ne[595],se([1,0,39,56,493]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Rulers=void 0;class I extends k.ViewPart{constructor(y){super(y),this.domNode=(0,d.createFastDomNode)(document.createElement("div")),this.domNode.setAttribute("role","presentation"),this.domNode.setAttribute("aria-hidden","true"),this.domNode.setClassName("view-rulers"),this._renderedRulers=[];const m=this._context.configuration.options;this._rulers=m.get(103),this._typicalHalfwidthCharacterWidth=m.get(50).typicalHalfwidthCharacterWidth}dispose(){super.dispose()}onConfigurationChanged(y){const m=this._context.configuration.options;return this._rulers=m.get(103),this._typicalHalfwidthCharacterWidth=m.get(50).typicalHalfwidthCharacterWidth,!0}onScrollChanged(y){return y.scrollHeightChanged}prepareRender(y){}_ensureRulersCount(){const y=this._renderedRulers.length,m=this._rulers.length;if(y===m)return;if(y0;){const o=(0,d.createFastDomNode)(document.createElement("div"));o.setClassName("view-ruler"),o.setWidth(p),this.domNode.appendChild(o),this._renderedRulers.push(o),n--}return}let _=y-m;for(;_>0;){const b=this._renderedRulers.pop();this.domNode.removeChild(b),_--}}render(y){this._ensureRulersCount();for(let m=0,_=this._rulers.length;m<_;m++){const b=this._renderedRulers[m],p=this._rulers[m];b.setBoxShadow(p.color?`1px 0 0 0 ${p.color} inset`:""),b.setHeight(Math.min(y.scrollHeight,1e6)),b.setLeft(p.column*this._typicalHalfwidthCharacterWidth)}}}e.Rulers=I}),define(ne[596],se([1,0,39,56,494]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ScrollDecorationViewPart=void 0;class I extends k.ViewPart{constructor(y){super(y),this._scrollTop=0,this._width=0,this._updateWidth(),this._shouldShow=!1;const _=this._context.configuration.options.get(104);this._useShadows=_.useShadows,this._domNode=(0,d.createFastDomNode)(document.createElement("div")),this._domNode.setAttribute("role","presentation"),this._domNode.setAttribute("aria-hidden","true")}dispose(){super.dispose()}_updateShouldShow(){const y=this._useShadows&&this._scrollTop>0;return this._shouldShow!==y?(this._shouldShow=y,!0):!1}getDomNode(){return this._domNode}_updateWidth(){const m=this._context.configuration.options.get(146);m.minimap.renderMinimap===0||m.minimap.minimapWidth>0&&m.minimap.minimapLeft===0?this._width=m.width:this._width=m.width-m.verticalScrollbarWidth}onConfigurationChanged(y){const _=this._context.configuration.options.get(104);return this._useShadows=_.useShadows,this._updateWidth(),this._updateShouldShow(),!0}onScrollChanged(y){return this._scrollTop=y.scrollTop,this._updateShouldShow()}prepareRender(y){}render(y){this._domNode.setWidth(this._width),this._domNode.setClassName(this._shouldShow?"scroll-decoration":"")}}e.ScrollDecorationViewPart=I}),define(ne[597],se([1,0,39,8,56,9]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewZones=void 0;const y=()=>{throw new Error("Invalid change accessor")};class m extends I.ViewPart{constructor(p){super(p);const n=this._context.configuration.options,o=n.get(146);this._lineHeight=n.get(67),this._contentWidth=o.contentWidth,this._contentLeft=o.contentLeft,this.domNode=(0,d.createFastDomNode)(document.createElement("div")),this.domNode.setClassName("view-zones"),this.domNode.setPosition("absolute"),this.domNode.setAttribute("role","presentation"),this.domNode.setAttribute("aria-hidden","true"),this.marginDomNode=(0,d.createFastDomNode)(document.createElement("div")),this.marginDomNode.setClassName("margin-view-zones"),this.marginDomNode.setPosition("absolute"),this.marginDomNode.setAttribute("role","presentation"),this.marginDomNode.setAttribute("aria-hidden","true"),this._zones={}}dispose(){super.dispose(),this._zones={}}_recomputeWhitespacesProps(){const p=this._context.viewLayout.getWhitespaces(),n=new Map;for(const t of p)n.set(t.id,t);let o=!1;return this._context.viewModel.changeWhitespace(t=>{const i=Object.keys(this._zones);for(let s=0,g=i.length;s{const t={addZone:i=>(n=!0,this._addZone(o,i)),removeZone:i=>{i&&(n=this._removeZone(o,i)||n)},layoutZone:i=>{i&&(n=this._layoutZone(o,i)||n)}};_(p,t),t.addZone=y,t.removeZone=y,t.layoutZone=y}),n}_addZone(p,n){const o=this._computeWhitespaceProps(n),i={whitespaceId:p.insertWhitespace(o.afterViewLineNumber,this._getZoneOrdinal(n),o.heightInPx,o.minWidthInPx),delegate:n,isInHiddenArea:o.isInHiddenArea,isVisible:!1,domNode:(0,d.createFastDomNode)(n.domNode),marginDomNode:n.marginDomNode?(0,d.createFastDomNode)(n.marginDomNode):null};return this._safeCallOnComputedHeight(i.delegate,o.heightInPx),i.domNode.setPosition("absolute"),i.domNode.domNode.style.width="100%",i.domNode.setDisplay("none"),i.domNode.setAttribute("monaco-view-zone",i.whitespaceId),this.domNode.appendChild(i.domNode),i.marginDomNode&&(i.marginDomNode.setPosition("absolute"),i.marginDomNode.domNode.style.width="100%",i.marginDomNode.setDisplay("none"),i.marginDomNode.setAttribute("monaco-view-zone",i.whitespaceId),this.marginDomNode.appendChild(i.marginDomNode)),this._zones[i.whitespaceId]=i,this.setShouldRender(),i.whitespaceId}_removeZone(p,n){if(this._zones.hasOwnProperty(n)){const o=this._zones[n];return delete this._zones[n],p.removeWhitespace(o.whitespaceId),o.domNode.removeAttribute("monaco-visible-view-zone"),o.domNode.removeAttribute("monaco-view-zone"),o.domNode.domNode.remove(),o.marginDomNode&&(o.marginDomNode.removeAttribute("monaco-visible-view-zone"),o.marginDomNode.removeAttribute("monaco-view-zone"),o.marginDomNode.domNode.remove()),this.setShouldRender(),!0}return!1}_layoutZone(p,n){if(this._zones.hasOwnProperty(n)){const o=this._zones[n],t=this._computeWhitespaceProps(o.delegate);return o.isInHiddenArea=t.isInHiddenArea,p.changeOneWhitespace(o.whitespaceId,t.afterViewLineNumber,t.heightInPx),this._safeCallOnComputedHeight(o.delegate,t.heightInPx),this.setShouldRender(),!0}return!1}shouldSuppressMouseDownOnViewZone(p){return this._zones.hasOwnProperty(p)?!!this._zones[p].delegate.suppressMouseDown:!1}_heightInPixels(p){return typeof p.heightInPx=="number"?p.heightInPx:typeof p.heightInLines=="number"?this._lineHeight*p.heightInLines:this._lineHeight}_minWidthInPixels(p){return typeof p.minWidthInPx=="number"?p.minWidthInPx:0}_safeCallOnComputedHeight(p,n){if(typeof p.onComputedHeight=="function")try{p.onComputedHeight(n)}catch(o){(0,k.onUnexpectedError)(o)}}_safeCallOnDomNodeTop(p,n){if(typeof p.onDomNodeTop=="function")try{p.onDomNodeTop(n)}catch(o){(0,k.onUnexpectedError)(o)}}prepareRender(p){}render(p){const n=p.viewportData.whitespaceViewportData,o={};let t=!1;for(const s of n)this._zones[s.id].isInHiddenArea||(o[s.id]=s,t=!0);const i=Object.keys(this._zones);for(let s=0,g=i.length;s=o||(i[s++]=new k(Math.max(1,g.startColumn-n+1),Math.min(t+1,g.endColumn-n+1),g.className,g.type));return i}static filter(_,b,p,n){if(_.length===0)return[];const o=[];let t=0;for(let i=0,s=_.length;ib||c.isEmpty()&&(g.type===0||g.type===3))continue;const l=c.startLineNumber===b?c.startColumn:p,a=c.endLineNumber===b?c.endColumn:n;o[t++]=new k(l,a,g.inlineClassName,g.type)}return o}static _typeCompare(_,b){const p=[2,0,1,3];return p[_]-p[b]}static compare(_,b){if(_.startColumn!==b.startColumn)return _.startColumn-b.startColumn;if(_.endColumn!==b.endColumn)return _.endColumn-b.endColumn;const p=k._typeCompare(_.type,b.type);return p!==0?p:_.className!==b.className?_.className0&&this.stopOffsets[0]<_;){let n=0;for(;n+10&&b<_&&(p.push(new I(b,_-1,this.classNames.join(" "),E._metadata(this.metadata))),b=_),b}insert(_,b,p){if(this.count===0||this.stopOffsets[this.count-1]<=_)this.stopOffsets.push(_),this.classNames.push(b),this.metadata.push(p);else for(let n=0;n=_){this.stopOffsets.splice(n,0,_),this.classNames.splice(n,0,b),this.metadata.splice(n,0,p);break}this.count++}}class y{static normalize(_,b){if(b.length===0)return[];const p=[],n=new E;let o=0;for(let t=0,i=b.length;t1){const C=_.charCodeAt(g-2);d.isHighSurrogate(C)&&g--}if(c>1){const C=_.charCodeAt(c-2);d.isHighSurrogate(C)&&c--}const r=g-1,u=c-2;o=n.consumeLowerThan(r,o,p),n.count===0&&(o=r),n.insert(u,l,a)}return n.consumeLowerThan(1073741824,o,p),p}}e.LineDecorationsNormalizer=y}),define(ne[598],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinePart=void 0;class d{constructor(I,E,y,m){this.endIndex=I,this.type=E,this.metadata=y,this.containsRTL=m,this._linePartBrand=void 0}isWhitespace(){return!!(this.metadata&1)}isPseudoAfter(){return!!(this.metadata&4)}}e.LinePart=d}),define(ne[599],se([1,0,11]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinesLayout=e.EditorWhitespace=void 0;class k{constructor(){this._hasPending=!1,this._inserts=[],this._changes=[],this._removes=[]}insert(m){this._hasPending=!0,this._inserts.push(m)}change(m){this._hasPending=!0,this._changes.push(m)}remove(m){this._hasPending=!0,this._removes.push(m)}mustCommit(){return this._hasPending}commit(m){if(!this._hasPending)return;const _=this._inserts,b=this._changes,p=this._removes;this._hasPending=!1,this._inserts=[],this._changes=[],this._removes=[],m._commitPendingChanges(_,b,p)}}class I{constructor(m,_,b,p,n){this.id=m,this.afterLineNumber=_,this.ordinal=b,this.height=p,this.minWidth=n,this.prefixSum=0}}e.EditorWhitespace=I;class E{static{this.INSTANCE_COUNT=0}constructor(m,_,b,p){this._instanceId=d.singleLetterHash(++E.INSTANCE_COUNT),this._pendingChanges=new k,this._lastWhitespaceId=0,this._arr=[],this._prefixSumValidIndex=-1,this._minWidth=-1,this._lineCount=m,this._lineHeight=_,this._paddingTop=b,this._paddingBottom=p}static findInsertionIndex(m,_,b){let p=0,n=m.length;for(;p>>1;_===m[o].afterLineNumber?b{_=!0,p=p|0,n=n|0,o=o|0,t=t|0;const i=this._instanceId+ ++this._lastWhitespaceId;return this._pendingChanges.insert(new I(i,p,n,o,t)),i},changeOneWhitespace:(p,n,o)=>{_=!0,n=n|0,o=o|0,this._pendingChanges.change({id:p,newAfterLineNumber:n,newHeight:o})},removeWhitespace:p=>{_=!0,this._pendingChanges.remove({id:p})}})}finally{this._pendingChanges.commit(this)}return _}_commitPendingChanges(m,_,b){if((m.length>0||b.length>0)&&(this._minWidth=-1),m.length+_.length+b.length<=1){for(const i of m)this._insertWhitespace(i);for(const i of _)this._changeOneWhitespace(i.id,i.newAfterLineNumber,i.newHeight);for(const i of b){const s=this._findWhitespaceIndex(i.id);s!==-1&&this._removeWhitespace(s)}return}const p=new Set;for(const i of b)p.add(i.id);const n=new Map;for(const i of _)n.set(i.id,i);const o=i=>{const s=[];for(const g of i)if(!p.has(g.id)){if(n.has(g.id)){const c=n.get(g.id);g.afterLineNumber=c.newAfterLineNumber,g.height=c.newHeight}s.push(g)}return s},t=o(this._arr).concat(o(m));t.sort((i,s)=>i.afterLineNumber===s.afterLineNumber?i.ordinal-s.ordinal:i.afterLineNumber-s.afterLineNumber),this._arr=t,this._prefixSumValidIndex=-1}_checkPendingChanges(){this._pendingChanges.mustCommit()&&this._pendingChanges.commit(this)}_insertWhitespace(m){const _=E.findInsertionIndex(this._arr,m.afterLineNumber,m.ordinal);this._arr.splice(_,0,m),this._prefixSumValidIndex=Math.min(this._prefixSumValidIndex,_-1)}_findWhitespaceIndex(m){const _=this._arr;for(let b=0,p=_.length;b_&&(this._arr[b].afterLineNumber-=_-m+1)}}onLinesInserted(m,_){this._checkPendingChanges(),m=m|0,_=_|0,this._lineCount+=_-m+1;for(let b=0,p=this._arr.length;b=_.length||_[t+1].afterLineNumber>=m)return t;b=t+1|0}else p=t-1|0}return-1}_findFirstWhitespaceAfterLineNumber(m){m=m|0;const b=this._findLastWhitespaceBeforeLineNumber(m)+1;return b1?b=this._lineHeight*(m-1):b=0;const p=this.getWhitespaceAccumulatedHeightBeforeLineNumber(m-(_?1:0));return b+p+this._paddingTop}getVerticalOffsetAfterLineNumber(m,_=!1){this._checkPendingChanges(),m=m|0;const b=this._lineHeight*m,p=this.getWhitespaceAccumulatedHeightBeforeLineNumber(m+(_?1:0));return b+p+this._paddingTop}getWhitespaceMinWidth(){if(this._checkPendingChanges(),this._minWidth===-1){let m=0;for(let _=0,b=this._arr.length;__}isInTopPadding(m){return this._paddingTop===0?!1:(this._checkPendingChanges(),m=_-this._paddingBottom}getLineNumberAtOrAfterVerticalOffset(m){if(this._checkPendingChanges(),m=m|0,m<0)return 1;const _=this._lineCount|0,b=this._lineHeight;let p=1,n=_;for(;p=t+b)p=o+1;else{if(m>=t)return o;n=o}}return p>_?_:p}getLinesViewportData(m,_){this._checkPendingChanges(),m=m|0,_=_|0;const b=this._lineHeight,p=this.getLineNumberAtOrAfterVerticalOffset(m)|0,n=this.getVerticalOffsetForLineNumber(p)|0;let o=this._lineCount|0,t=this.getFirstWhitespaceIndexAfterLineNumber(p)|0;const i=this.getWhitespacesCount()|0;let s,g;t===-1?(t=i,g=o+1,s=0):(g=this.getAfterLineNumberForWhitespaceIndex(t)|0,s=this.getHeightForWhitespaceIndex(t)|0);let c=n,l=c;const a=5e5;let r=0;n>=a&&(r=Math.floor(n/a)*a,r=Math.floor(r/b)*b,l-=r);const u=[],C=m+(_-m)/2;let f=-1;for(let S=p;S<=o;S++){if(f===-1){const L=c,D=c+b;(L<=C&&CC)&&(f=S)}for(c+=b,u[S-p]=l,l+=b;g===S;)l+=s,c+=s,t++,t>=i?g=o+1:(g=this.getAfterLineNumberForWhitespaceIndex(t)|0,s=this.getHeightForWhitespaceIndex(t)|0);if(c>=_){o=S;break}}f===-1&&(f=o);const h=this.getVerticalOffsetForLineNumber(o)|0;let v=p,w=o;return v_&&w--,{bigNumbersDelta:r,startLineNumber:p,endLineNumber:o,relativeVerticalOffset:u,centeredLineNumber:f,completelyVisibleStartLineNumber:v,completelyVisibleEndLineNumber:w,lineHeight:this._lineHeight}}getVerticalOffsetForWhitespaceIndex(m){this._checkPendingChanges(),m=m|0;const _=this.getAfterLineNumberForWhitespaceIndex(m);let b;_>=1?b=this._lineHeight*_:b=0;let p;return m>0?p=this.getWhitespacesAccumulatedHeight(m-1):p=0,b+p+this._paddingTop}getWhitespaceIndexAtOrAfterVerticallOffset(m){this._checkPendingChanges(),m=m|0;let _=0,b=this.getWhitespacesCount()-1;if(b<0)return-1;const p=this.getVerticalOffsetForWhitespaceIndex(b),n=this.getHeightForWhitespaceIndex(b);if(m>=p+n)return-1;for(;_=t+i)_=o+1;else{if(m>=t)return o;b=o}}return _}getWhitespaceAtVerticalOffset(m){this._checkPendingChanges(),m=m|0;const _=this.getWhitespaceIndexAtOrAfterVerticallOffset(m);if(_<0||_>=this.getWhitespacesCount())return null;const b=this.getVerticalOffsetForWhitespaceIndex(_);if(b>m)return null;const p=this.getHeightForWhitespaceIndex(_),n=this.getIdForWhitespaceIndex(_),o=this.getAfterLineNumberForWhitespaceIndex(_);return{id:n,afterLineNumber:o,verticalOffset:b,height:p}}getWhitespaceViewportData(m,_){this._checkPendingChanges(),m=m|0,_=_|0;const b=this.getWhitespaceIndexAtOrAfterVerticallOffset(m),p=this.getWhitespacesCount()-1;if(b<0)return[];const n=[];for(let o=b;o<=p;o++){const t=this.getVerticalOffsetForWhitespaceIndex(o),i=this.getHeightForWhitespaceIndex(o);if(t>=_)break;n.push({id:this.getIdForWhitespaceIndex(o),afterLineNumber:this.getAfterLineNumberForWhitespaceIndex(o),verticalOffset:t,height:i})}return n}getWhitespaces(){return this._checkPendingChanges(),this._arr.slice(0)}getWhitespacesCount(){return this._checkPendingChanges(),this._arr.length}getIdForWhitespaceIndex(m){return this._checkPendingChanges(),m=m|0,this._arr[m].id}getAfterLineNumberForWhitespaceIndex(m){return this._checkPendingChanges(),m=m|0,this._arr[m].afterLineNumber}getHeightForWhitespaceIndex(m){return this._checkPendingChanges(),m=m|0,this._arr[m].height}}e.LinesLayout=E}),define(ne[600],se([1,0,4]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewportData=void 0;class k{constructor(E,y,m,_){this.selections=E,this.startLineNumber=y.startLineNumber|0,this.endLineNumber=y.endLineNumber|0,this.relativeVerticalOffset=y.relativeVerticalOffset,this.bigNumbersDelta=y.bigNumbersDelta|0,this.lineHeight=y.lineHeight|0,this.whitespaceViewportData=m,this._model=_,this.visibleRange=new d.Range(y.startLineNumber,this._model.getLineMinColumn(y.startLineNumber),y.endLineNumber,this._model.getLineMaxColumn(y.endLineNumber))}getViewLineRenderingData(E){return this._model.getViewportViewLineRenderingData(this.visibleRange,E)}getDecorationsInViewport(){return this._model.getDecorationsInViewport(this.visibleRange)}}e.ViewportData=k}),define(ne[95],se([1,0,13,11,4]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OverviewRulerDecorationsGroup=e.ViewModelDecoration=e.SingleLineInlineDecoration=e.InlineDecoration=e.ViewLineRenderingData=e.ViewLineData=e.MinimapLinesRenderingData=e.Viewport=void 0;class E{constructor(i,s,g,c){this._viewportBrand=void 0,this.top=i|0,this.left=s|0,this.width=g|0,this.height=c|0}}e.Viewport=E;class y{constructor(i,s){this.tabSize=i,this.data=s}}e.MinimapLinesRenderingData=y;class m{constructor(i,s,g,c,l,a,r){this._viewLineDataBrand=void 0,this.content=i,this.continuesWithWrappedLine=s,this.minColumn=g,this.maxColumn=c,this.startVisibleColumn=l,this.tokens=a,this.inlineDecorations=r}}e.ViewLineData=m;class _{constructor(i,s,g,c,l,a,r,u,C,f){this.minColumn=i,this.maxColumn=s,this.content=g,this.continuesWithWrappedLine=c,this.isBasicASCII=_.isBasicASCII(g,a),this.containsRTL=_.containsRTL(g,this.isBasicASCII,l),this.tokens=r,this.inlineDecorations=u,this.tabSize=C,this.startVisibleColumn=f}static isBasicASCII(i,s){return s?k.isBasicASCII(i):!0}static containsRTL(i,s,g){return!s&&g?k.containsRTL(i):!1}}e.ViewLineRenderingData=_;class b{constructor(i,s,g){this.range=i,this.inlineClassName=s,this.type=g}}e.InlineDecoration=b;class p{constructor(i,s,g,c){this.startOffset=i,this.endOffset=s,this.inlineClassName=g,this.inlineClassNameAffectsLetterSpacing=c}toInlineDecoration(i){return new b(new I.Range(i,this.startOffset+1,i,this.endOffset+1),this.inlineClassName,this.inlineClassNameAffectsLetterSpacing?3:0)}}e.SingleLineInlineDecoration=p;class n{constructor(i,s){this._viewModelDecorationBrand=void 0,this.range=i,this.options=s}}e.ViewModelDecoration=n;class o{constructor(i,s,g){this.color=i,this.zIndex=s,this.data=g}static compareByRenderingProps(i,s){return i.zIndex===s.zIndex?i.colors.color?1:0:i.zIndex-s.zIndex}static equals(i,s){return i.color===s.color&&i.zIndex===s.zIndex&&d.equals(i.data,s.data)}static equalsArr(i,s){return d.equals(i,s,o.equals)}}e.OverviewRulerDecorationsGroup=o}),define(ne[601],se([1,0,40]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GlyphMarginLanesModel=void 0;const k=d.GlyphMarginLane.Right;class I{constructor(y){this.persist=0,this._requiredLanes=1,this.lanes=new Uint8Array(Math.ceil((y+1)*k/8))}reset(y){const m=Math.ceil((y+1)*k/8);this.lanes.length>>3]|=1<>>3]&1<<_%8)&&m.push(b+1),_++;return m.length?m:[d.GlyphMarginLane.Center]}countAtLine(y){let m=k*y,_=0;for(let b=0;b>>3]&1<0?this._projectionData.breakOffsets[g-1]:0,l=this._projectionData.breakOffsets[g];let a;if(this._projectionData.injectionOffsets!==null){const r=this._projectionData.injectionOffsets.map((C,f)=>new I.LineInjectedText(0,0,C+1,this._projectionData.injectionOptions[f],0));a=I.LineInjectedText.applyInjectedText(i.getLineContent(s),r).substring(c,l)}else a=i.getValueInRange({startLineNumber:s,startColumn:c+1,endLineNumber:s,endColumn:l+1});return g>0&&(a=n(this._projectionData.wrappedTextIndentLength)+a),a}getViewLineLength(i,s,g){return this._assertVisible(),this._projectionData.getLineLength(g)}getViewLineMinColumn(i,s,g){return this._assertVisible(),this._projectionData.getMinOutputOffset(g)+1}getViewLineMaxColumn(i,s,g){return this._assertVisible(),this._projectionData.getMaxOutputOffset(g)+1}getViewLineData(i,s,g){const c=new Array;return this.getViewLinesData(i,s,g,1,0,[!0],c),c[0]}getViewLinesData(i,s,g,c,l,a,r){this._assertVisible();const u=this._projectionData,C=u.injectionOffsets,f=u.injectionOptions;let h=null;if(C){h=[];let w=0,S=0;for(let L=0;L0?u.breakOffsets[L-1]:0,M=u.breakOffsets[L];for(;SM)break;if(T0?u.wrappedTextIndentLength:0,x=F+Math.max(P-T,0),W=F+Math.min(N-T,M-T);x!==W&&D.push(new E.SingleLineInlineDecoration(x,W,O.inlineClassName,O.inlineClassNameAffectsLetterSpacing))}}if(N<=M)w+=A,S++;else break}}}let v;C?v=i.tokenization.getLineTokens(s).withInserted(C.map((w,S)=>({offset:w,text:f[S].content,tokenMetadata:d.LineTokens.defaultTokenMetadata}))):v=i.tokenization.getLineTokens(s);for(let w=g;w0?c.wrappedTextIndentLength:0,a=g>0?c.breakOffsets[g-1]:0,r=c.breakOffsets[g],u=i.sliceAndInflate(a,r,l);let C=u.getLineContent();g>0&&(C=n(c.wrappedTextIndentLength)+C);const f=this._projectionData.getMinOutputOffset(g)+1,h=C.length+1,v=g+1=p.length)for(let i=1;i<=t;i++)p[i]=o(i);return p[t]}function o(t){return new Array(t+1).join(" ")}}),define(ne[603],se([1,0,11,144,132,325]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MonospaceLineBreaksComputerFactory=void 0;class y{static create(c){return new y(c.get(135),c.get(134))}constructor(c,l){this.classifier=new m(c,l)}createLineBreaksComputer(c,l,a,r,u){const C=[],f=[],h=[];return{addRequest:(v,w,S)=>{C.push(v),f.push(w),h.push(S)},finalize:()=>{const v=c.typicalFullwidthCharacterWidth/c.typicalHalfwidthCharacterWidth,w=[];for(let S=0,L=C.length;S=0&&c<256?this._asciiMap[c]:c>=12352&&c<=12543||c>=13312&&c<=19903||c>=19968&&c<=40959?3:this._map.get(c)||this._defaultValue}}let _=[],b=[];function p(g,c,l,a,r,u,C,f){if(r===-1)return null;const h=l.length;if(h<=1)return null;const v=f==="keepAll",w=c.breakOffsets,S=c.breakOffsetsVisibleColumn,L=s(l,a,r,u,C),D=r-L,T=_,M=b;let A=0,P=0,N=0,O=r;const F=w.length;let x=0;if(x>=0){let W=Math.abs(S[x]-O);for(;x+1=W)break;W=V,x++}}for(;xW&&(W=P,V=N);let q=0,H=0,z=0,U=0;if(V<=O){let Y=V,G=W===0?0:l.charCodeAt(W-1),K=W===0?0:g.get(G),R=!0;for(let J=W;JP&&i(G,K,ue,he,v)&&(q=ie,H=Y),Y+=pe,Y>O){ie>P?(z=ie,U=Y-pe):(z=J+1,U=Y),Y-H>D&&(q=0),R=!1;break}G=ue,K=he}if(R){A>0&&(T[A]=w[w.length-1],M[A]=S[w.length-1],A++);break}}if(q===0){let Y=V,G=l.charCodeAt(W),K=g.get(G),R=!1;for(let J=W-1;J>=P;J--){const ie=J+1,ue=l.charCodeAt(J);if(ue===9){R=!0;break}let he,pe;if(d.isLowSurrogate(ue)?(J--,he=0,pe=2):(he=g.get(ue),pe=d.isFullWidthCharacter(ue)?u:1),Y<=O){if(z===0&&(z=ie,U=Y),Y<=O-D)break;if(i(ue,he,G,K,v)){q=ie,H=Y;break}}Y-=pe,G=ue,K=he}if(q!==0){const J=D-(U-H);if(J<=a){const ie=l.charCodeAt(z);let ue;d.isHighSurrogate(ie)?ue=2:ue=o(ie,U,a,u),J-ue<0&&(q=0)}}if(R){x--;continue}}if(q===0&&(q=z,H=U),q<=P){const Y=l.charCodeAt(P);d.isHighSurrogate(Y)?(q=P+2,H=N+2):(q=P+1,H=N+o(Y,N,a,u))}for(P=q,T[A]=q,N=H,M[A]=H,A++,O=H+D;x<0||x=j)break;j=Y,x++}}return A===0?null:(T.length=A,M.length=A,_=c.breakOffsets,b=c.breakOffsetsVisibleColumn,c.breakOffsets=T,c.breakOffsetsVisibleColumn=M,c.wrappedTextIndentLength=L,c)}function n(g,c,l,a,r,u,C,f){const h=I.LineInjectedText.applyInjectedText(c,l);let v,w;if(l&&l.length>0?(v=l.map(H=>H.options),w=l.map(H=>H.column-1)):(v=null,w=null),r===-1)return v?new E.ModelLineProjectionData(w,v,[h.length],[],0):null;const S=h.length;if(S<=1)return v?new E.ModelLineProjectionData(w,v,[h.length],[],0):null;const L=f==="keepAll",D=s(h,a,r,u,C),T=r-D,M=[],A=[];let P=0,N=0,O=0,F=r,x=h.charCodeAt(0),W=g.get(x),V=o(x,0,a,u),q=1;d.isHighSurrogate(x)&&(V+=1,x=h.charCodeAt(1),W=g.get(x),q++);for(let H=q;HF&&((N===0||V-O>T)&&(N=z,O=V-Y),M[P]=N,A[P]=O,P++,F=O+T,N=0),x=U,W=j}return P===0&&(!l||l.length===0)?null:(M[P]=S,A[P]=V,new E.ModelLineProjectionData(w,v,M,A,D))}function o(g,c,l,a){return g===9?l-c%l:d.isFullWidthCharacter(g)||g<32?a:1}function t(g,c){return c-g%c}function i(g,c,l,a,r){return l!==32&&(c===2&&a!==2||c!==1&&a===1||!r&&c===3&&a!==2||!r&&a===3&&c!==1)}function s(g,c,l,a,r){let u=0;if(r!==0){const C=d.firstNonWhitespaceIndex(g);if(C!==-1){for(let h=0;hl&&(u=0)}}return u}}),define(ne[332],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OverviewZoneManager=e.OverviewRulerZone=e.ColorZone=void 0;class d{constructor(y,m,_){this._colorZoneBrand=void 0,this.from=y|0,this.to=m|0,this.colorId=_|0}static compare(y,m){return y.colorId===m.colorId?y.from===m.from?y.to-m.to:y.from-m.from:y.colorId-m.colorId}}e.ColorZone=d;class k{constructor(y,m,_,b){this._overviewRulerZoneBrand=void 0,this.startLineNumber=y,this.endLineNumber=m,this.heightInLines=_,this.color=b,this._colorZone=null}static compare(y,m){return y.color===m.color?y.startLineNumber===m.startLineNumber?y.heightInLines===m.heightInLines?y.endLineNumber-m.endLineNumber:y.heightInLines-m.heightInLines:y.startLineNumber-m.startLineNumber:y.color_&&(r=_-u);const C=s.color;let f=this._color2Id[C];f||(f=++this._lastAssignedId,this._color2Id[C]=f,this._id2Color[f]=C);const h=new d(r-u,r+u,f);s.setColorZone(h),o.push(h)}return this._colorZonesInvalid=!1,o.sort(d.compare),o}}e.OverviewZoneManager=I}),define(ne[604],se([1,0,39,332,170]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OverviewRuler=void 0;class E extends I.ViewEventHandler{constructor(m,_){super(),this._context=m;const b=this._context.configuration.options;this._domNode=(0,d.createFastDomNode)(document.createElement("canvas")),this._domNode.setClassName(_),this._domNode.setPosition("absolute"),this._domNode.setLayerHinting(!0),this._domNode.setContain("strict"),this._zoneManager=new k.OverviewZoneManager(p=>this._context.viewLayout.getVerticalOffsetForLineNumber(p)),this._zoneManager.setDOMWidth(0),this._zoneManager.setDOMHeight(0),this._zoneManager.setOuterHeight(this._context.viewLayout.getScrollHeight()),this._zoneManager.setLineHeight(b.get(67)),this._zoneManager.setPixelRatio(b.get(144)),this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),super.dispose()}onConfigurationChanged(m){const _=this._context.configuration.options;return m.hasChanged(67)&&(this._zoneManager.setLineHeight(_.get(67)),this._render()),m.hasChanged(144)&&(this._zoneManager.setPixelRatio(_.get(144)),this._domNode.setWidth(this._zoneManager.getDOMWidth()),this._domNode.setHeight(this._zoneManager.getDOMHeight()),this._domNode.domNode.width=this._zoneManager.getCanvasWidth(),this._domNode.domNode.height=this._zoneManager.getCanvasHeight(),this._render()),!0}onFlushed(m){return this._render(),!0}onScrollChanged(m){return m.scrollHeightChanged&&(this._zoneManager.setOuterHeight(m.scrollHeight),this._render()),!0}onZonesChanged(m){return this._render(),!0}getDomNode(){return this._domNode.domNode}setLayout(m){this._domNode.setTop(m.top),this._domNode.setRight(m.right);let _=!1;_=this._zoneManager.setDOMWidth(m.width)||_,_=this._zoneManager.setDOMHeight(m.height)||_,_&&(this._domNode.setWidth(this._zoneManager.getDOMWidth()),this._domNode.setHeight(this._zoneManager.getDOMHeight()),this._domNode.domNode.width=this._zoneManager.getCanvasWidth(),this._domNode.domNode.height=this._zoneManager.getCanvasHeight(),this._render())}setZones(m){this._zoneManager.setZones(m),this._render()}_render(){if(this._zoneManager.getOuterHeight()===0)return!1;const m=this._zoneManager.getCanvasWidth(),_=this._zoneManager.getCanvasHeight(),b=this._zoneManager.resolveColorZones(),p=this._zoneManager.getId2Color(),n=this._domNode.domNode.getContext("2d");return n.clearRect(0,0,m,_),b.length>0&&this._renderOneLane(n,b,p,m),!0}_renderOneLane(m,_,b,p){let n=0,o=0,t=0;for(const i of _){const s=i.colorId,g=i.from,c=i.to;s!==n?(m.fillRect(0,o,p,t-o),n=s,m.fillStyle=b[n],o=g,t=c):t>=g?t=Math.max(t,c):(m.fillRect(0,o,p,t-o),o=g,t=c)}m.fillRect(0,o,p,t-o)}}e.OverviewRuler=E}),define(ne[605],se([1,0,562]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewContext=void 0;class k{constructor(E,y,m){this.configuration=E,this.theme=new d.EditorTheme(y),this.viewModel=m,this.viewLayout=m.viewLayout}addEventHandler(E){this.viewModel.addViewEventHandler(E)}removeEventHandler(E){this.viewModel.removeViewEventHandler(E)}}e.ViewContext=k}),define(ne[244],se([1,0,6,2]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ModelTokensChangedEvent=e.ModelOptionsChangedEvent=e.ModelContentChangedEvent=e.ModelLanguageConfigurationChangedEvent=e.ModelLanguageChangedEvent=e.ModelDecorationsChangedEvent=e.ReadOnlyEditAttemptEvent=e.CursorStateChangedEvent=e.HiddenAreasChangedEvent=e.ViewZonesChangedEvent=e.ScrollChangedEvent=e.FocusChangedEvent=e.ContentSizeChangedEvent=e.ViewModelEventsCollector=e.ViewModelEventDispatcher=void 0;class I extends k.Disposable{constructor(){super(),this._onEvent=this._register(new d.Emitter),this.onEvent=this._onEvent.event,this._eventHandlers=[],this._viewEventQueue=null,this._isConsumingViewEventQueue=!1,this._collector=null,this._collectorCnt=0,this._outgoingEvents=[]}emitOutgoingEvent(r){this._addOutgoingEvent(r),this._emitOutgoingEvents()}_addOutgoingEvent(r){for(let u=0,C=this._outgoingEvents.length;u0;){if(this._collector||this._isConsumingViewEventQueue)return;const r=this._outgoingEvents.shift();r.isNoOp()||this._onEvent.fire(r)}}addViewEventHandler(r){for(let u=0,C=this._eventHandlers.length;u0&&this._emitMany(u)}this._emitOutgoingEvents()}emitSingleViewEvent(r){try{this.beginEmitViewEvents().emitViewEvent(r)}finally{this.endEmitViewEvents()}}_emitMany(r){this._viewEventQueue?this._viewEventQueue=this._viewEventQueue.concat(r):this._viewEventQueue=r,this._isConsumingViewEventQueue||this._consumeViewEventQueue()}_consumeViewEventQueue(){try{this._isConsumingViewEventQueue=!0,this._doConsumeQueue()}finally{this._isConsumingViewEventQueue=!1}}_doConsumeQueue(){for(;this._viewEventQueue;){const r=this._viewEventQueue;this._viewEventQueue=null;const u=this._eventHandlers.slice(0);for(const C of u)C.handleEvents(r)}}}e.ViewModelEventDispatcher=I;class E{constructor(){this.viewEvents=[],this.outgoingEvents=[]}emitViewEvent(r){this.viewEvents.push(r)}emitOutgoingEvent(r){this.outgoingEvents.push(r)}}e.ViewModelEventsCollector=E;class y{constructor(r,u,C,f){this.kind=0,this._oldContentWidth=r,this._oldContentHeight=u,this.contentWidth=C,this.contentHeight=f,this.contentWidthChanged=this._oldContentWidth!==this.contentWidth,this.contentHeightChanged=this._oldContentHeight!==this.contentHeight}isNoOp(){return!this.contentWidthChanged&&!this.contentHeightChanged}attemptToMerge(r){return r.kind!==this.kind?null:new y(this._oldContentWidth,this._oldContentHeight,r.contentWidth,r.contentHeight)}}e.ContentSizeChangedEvent=y;class m{constructor(r,u){this.kind=1,this.oldHasFocus=r,this.hasFocus=u}isNoOp(){return this.oldHasFocus===this.hasFocus}attemptToMerge(r){return r.kind!==this.kind?null:new m(this.oldHasFocus,r.hasFocus)}}e.FocusChangedEvent=m;class _{constructor(r,u,C,f,h,v,w,S){this.kind=2,this._oldScrollWidth=r,this._oldScrollLeft=u,this._oldScrollHeight=C,this._oldScrollTop=f,this.scrollWidth=h,this.scrollLeft=v,this.scrollHeight=w,this.scrollTop=S,this.scrollWidthChanged=this._oldScrollWidth!==this.scrollWidth,this.scrollLeftChanged=this._oldScrollLeft!==this.scrollLeft,this.scrollHeightChanged=this._oldScrollHeight!==this.scrollHeight,this.scrollTopChanged=this._oldScrollTop!==this.scrollTop}isNoOp(){return!this.scrollWidthChanged&&!this.scrollLeftChanged&&!this.scrollHeightChanged&&!this.scrollTopChanged}attemptToMerge(r){return r.kind!==this.kind?null:new _(this._oldScrollWidth,this._oldScrollLeft,this._oldScrollHeight,this._oldScrollTop,r.scrollWidth,r.scrollLeft,r.scrollHeight,r.scrollTop)}}e.ScrollChangedEvent=_;class b{constructor(){this.kind=3}isNoOp(){return!1}attemptToMerge(r){return r.kind!==this.kind?null:this}}e.ViewZonesChangedEvent=b;class p{constructor(){this.kind=4}isNoOp(){return!1}attemptToMerge(r){return r.kind!==this.kind?null:this}}e.HiddenAreasChangedEvent=p;class n{constructor(r,u,C,f,h,v,w){this.kind=6,this.oldSelections=r,this.selections=u,this.oldModelVersionId=C,this.modelVersionId=f,this.source=h,this.reason=v,this.reachedMaxCursorCount=w}static _selectionsAreEqual(r,u){if(!r&&!u)return!0;if(!r||!u)return!1;const C=r.length,f=u.length;if(C!==f)return!1;for(let h=0;h=i?0:g.horizontalScrollbarSize}_getContentHeight(t,i,s){const g=this._configuration.options;let c=this._linesLayout.getLinesTotalHeight();return g.get(106)?c+=Math.max(0,i-g.get(67)-g.get(84).bottom):g.get(104).ignoreHorizontalScrollbarInContentHeight||(c+=this._getHorizontalScrollbarHeight(t,s)),c}_updateHeight(){const t=this._scrollable.getScrollDimensions(),i=t.width,s=t.height,g=t.contentWidth;this._scrollable.setScrollDimensions(new b(i,t.contentWidth,s,this._getContentHeight(i,s,g)))}getCurrentViewport(){const t=this._scrollable.getScrollDimensions(),i=this._scrollable.getCurrentScrollPosition();return new y.Viewport(i.scrollTop,i.scrollLeft,t.width,t.height)}getFutureViewport(){const t=this._scrollable.getScrollDimensions(),i=this._scrollable.getFutureScrollPosition();return new y.Viewport(i.scrollTop,i.scrollLeft,t.width,t.height)}_computeContentWidth(){const t=this._configuration.options,i=this._maxLineWidth,s=t.get(147),g=t.get(50),c=t.get(146);if(s.isViewportWrapping){const l=t.get(73);return i>c.contentWidth+g.typicalHalfwidthCharacterWidth&&l.enabled&&l.side==="right"?i+c.verticalScrollbarWidth:i}else{const l=t.get(105)*g.typicalHalfwidthCharacterWidth,a=this._linesLayout.getWhitespaceMinWidth();return Math.max(i+l+c.verticalScrollbarWidth,a,this._overlayWidgetsMinWidth)}}setMaxLineWidth(t){this._maxLineWidth=t,this._updateContentWidth()}setOverlayWidgetsMinWidth(t){this._overlayWidgetsMinWidth=t,this._updateContentWidth()}_updateContentWidth(){const t=this._scrollable.getScrollDimensions();this._scrollable.setScrollDimensions(new b(t.width,this._computeContentWidth(),t.height,t.contentHeight)),this._updateHeight()}saveState(){const t=this._scrollable.getFutureScrollPosition(),i=t.scrollTop,s=this._linesLayout.getLineNumberAtOrAfterVerticalOffset(i),g=this._linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(s);return{scrollTop:i,scrollTopWithoutViewZones:i-g,scrollLeft:t.scrollLeft}}changeWhitespace(t){const i=this._linesLayout.changeWhitespace(t);return i&&this.onHeightMaybeChanged(),i}getVerticalOffsetForLineNumber(t,i=!1){return this._linesLayout.getVerticalOffsetForLineNumber(t,i)}getVerticalOffsetAfterLineNumber(t,i=!1){return this._linesLayout.getVerticalOffsetAfterLineNumber(t,i)}isAfterLines(t){return this._linesLayout.isAfterLines(t)}isInTopPadding(t){return this._linesLayout.isInTopPadding(t)}isInBottomPadding(t){return this._linesLayout.isInBottomPadding(t)}getLineNumberAtVerticalOffset(t){return this._linesLayout.getLineNumberAtOrAfterVerticalOffset(t)}getWhitespaceAtVerticalOffset(t){return this._linesLayout.getWhitespaceAtVerticalOffset(t)}getLinesViewportData(){const t=this.getCurrentViewport();return this._linesLayout.getLinesViewportData(t.top,t.top+t.height)}getLinesViewportDataAtScrollTop(t){const i=this._scrollable.getScrollDimensions();return t+i.height>i.scrollHeight&&(t=i.scrollHeight-i.height),t<0&&(t=0),this._linesLayout.getLinesViewportData(t,t+i.height)}getWhitespaceViewportData(){const t=this.getCurrentViewport();return this._linesLayout.getWhitespaceViewportData(t.top,t.top+t.height)}getWhitespaces(){return this._linesLayout.getWhitespaces()}getContentWidth(){return this._scrollable.getScrollDimensions().contentWidth}getScrollWidth(){return this._scrollable.getScrollDimensions().scrollWidth}getContentHeight(){return this._scrollable.getScrollDimensions().contentHeight}getScrollHeight(){return this._scrollable.getScrollDimensions().scrollHeight}getCurrentScrollLeft(){return this._scrollable.getCurrentScrollPosition().scrollLeft}getCurrentScrollTop(){return this._scrollable.getCurrentScrollPosition().scrollTop}validateScrollPosition(t){return this._scrollable.validateScrollPosition(t)}setScrollPosition(t,i){i===1?this._scrollable.setScrollPositionNow(t):this._scrollable.setScrollPositionSmooth(t)}hasPendingScrollAnimation(){return this._scrollable.hasPendingScrollAnimation()}deltaScrollNow(t,i){const s=this._scrollable.getCurrentScrollPosition();this._scrollable.setScrollPositionNow({scrollLeft:s.scrollLeft+t,scrollTop:s.scrollTop+i})}}e.ViewLayout=n}),define(ne[607],se([1,0,4,23]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MoveCaretCommand=void 0;class I{constructor(y,m){this._selection=y,this._isMovingLeft=m}getEditOperations(y,m){if(this._selection.startLineNumber!==this._selection.endLineNumber||this._selection.isEmpty())return;const _=this._selection.startLineNumber,b=this._selection.startColumn,p=this._selection.endColumn;if(!(this._isMovingLeft&&b===1)&&!(!this._isMovingLeft&&p===y.getLineMaxColumn(_)))if(this._isMovingLeft){const n=new d.Range(_,b-1,_,b),o=y.getValueInRange(n);m.addEditOperation(n,null),m.addEditOperation(new d.Range(_,p,_,p),o)}else{const n=new d.Range(_,p,_,p+1),o=y.getValueInRange(n);m.addEditOperation(n,null),m.addEditOperation(new d.Range(_,b,_,b),o)}}computeCursorState(y,m){return this._isMovingLeft?new k.Selection(this._selection.startLineNumber,this._selection.startColumn-1,this._selection.endLineNumber,this._selection.endColumn-1):new k.Selection(this._selection.startLineNumber,this._selection.startColumn+1,this._selection.endLineNumber,this._selection.endColumn+1)}}e.MoveCaretCommand=I}),define(ne[134],se([1,0,8,91]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeActionItem=e.CodeActionCommandArgs=e.CodeActionTriggerSource=e.CodeActionKind=void 0,e.mayIncludeActionsOfKind=E,e.filtersAction=y,e.CodeActionKind=new class{constructor(){this.QuickFix=new k.HierarchicalKind("quickfix"),this.Refactor=new k.HierarchicalKind("refactor"),this.RefactorExtract=this.Refactor.append("extract"),this.RefactorInline=this.Refactor.append("inline"),this.RefactorMove=this.Refactor.append("move"),this.RefactorRewrite=this.Refactor.append("rewrite"),this.Notebook=new k.HierarchicalKind("notebook"),this.Source=new k.HierarchicalKind("source"),this.SourceOrganizeImports=this.Source.append("organizeImports"),this.SourceFixAll=this.Source.append("fixAll"),this.SurroundWith=this.Refactor.append("surround")}};var I;(function(p){p.Refactor="refactor",p.RefactorPreview="refactor preview",p.Lightbulb="lightbulb",p.Default="other (default)",p.SourceAction="source action",p.QuickFix="quick fix action",p.FixAll="fix all",p.OrganizeImports="organize imports",p.AutoFix="auto fix",p.QuickFixHover="quick fix hover window",p.OnSave="save participants",p.ProblemsView="problems view"})(I||(e.CodeActionTriggerSource=I={}));function E(p,n){return!(p.include&&!p.include.intersects(n)||p.excludes&&p.excludes.some(o=>m(n,o,p.include))||!p.includeSourceActions&&e.CodeActionKind.Source.contains(n))}function y(p,n){const o=n.kind?new k.HierarchicalKind(n.kind):void 0;return!(p.include&&(!o||!p.include.contains(o))||p.excludes&&o&&p.excludes.some(t=>m(o,t,p.include))||!p.includeSourceActions&&o&&e.CodeActionKind.Source.contains(o)||p.onlyIncludePreferredActions&&!n.isPreferred)}function m(p,n,o){return!(!n.contains(p)||o&&n.contains(o))}class _{static fromUser(n,o){return!n||typeof n!="object"?new _(o.kind,o.apply,!1):new _(_.getKindFromUser(n,o.kind),_.getApplyFromUser(n,o.apply),_.getPreferredUser(n))}static getApplyFromUser(n,o){switch(typeof n.apply=="string"?n.apply.toLowerCase():""){case"first":return"first";case"never":return"never";case"ifsingle":return"ifSingle";default:return o}}static getKindFromUser(n,o){return typeof n.kind=="string"?new k.HierarchicalKind(n.kind):o}static getPreferredUser(n){return typeof n.preferred=="boolean"?n.preferred:!1}constructor(n,o,t){this.kind=n,this.apply=o,this.preferred=t}}e.CodeActionCommandArgs=_;class b{constructor(n,o,t){this.action=n,this.provider=o,this.highlightRange=t}async resolve(n){if(this.provider?.resolveCodeAction&&!this.action.edit){let o;try{o=await this.provider.resolveCodeAction(this.action,n)}catch(t){(0,d.onUnexpectedExternalError)(t)}o&&(this.action.edit=o.edit)}return this}}e.CodeActionItem=b}),define(ne[608],se([1,0,6]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorPickerModel=void 0;class k{get color(){return this._color}set color(E){this._color.equals(E)||(this._color=E,this._onDidChangeColor.fire(E))}get presentation(){return this.colorPresentations[this.presentationIndex]}get colorPresentations(){return this._colorPresentations}set colorPresentations(E){this._colorPresentations=E,this.presentationIndex>E.length-1&&(this.presentationIndex=0),this._onDidChangePresentation.fire(this.presentation)}constructor(E,y,m){this.presentationIndex=m,this._onColorFlushed=new d.Emitter,this.onColorFlushed=this._onColorFlushed.event,this._onDidChangeColor=new d.Emitter,this.onDidChangeColor=this._onDidChangeColor.event,this._onDidChangePresentation=new d.Emitter,this.onDidChangePresentation=this._onDidChangePresentation.event,this.originalColor=E,this._color=E,this._colorPresentations=y}selectNextColorPresentation(){this.presentationIndex=(this.presentationIndex+1)%this.colorPresentations.length,this.flushColor(),this._onDidChangePresentation.fire(this.presentation)}guessColorPresentation(E,y){let m=-1;for(let _=0;_o)return!1;for(let t=0;t=65&&i<=90&&i+32===s)&&!(s>=65&&s<=90&&s+32===i))return!1}return!0}_createOperationsForBlockComment(_,b,p,n,o,t){const i=_.startLineNumber,s=_.startColumn,g=_.endLineNumber,c=_.endColumn,l=o.getLineContent(i),a=o.getLineContent(g);let r=l.lastIndexOf(b,s-1+b.length),u=a.indexOf(p,c-1-p.length);if(r!==-1&&u!==-1)if(i===g)l.substring(r+b.length,u).indexOf(p)>=0&&(r=-1,u=-1);else{const f=l.substring(r+b.length),h=a.substring(0,u);(f.indexOf(p)>=0||h.indexOf(p)>=0)&&(r=-1,u=-1)}let C;r!==-1&&u!==-1?(n&&r+b.length0&&a.charCodeAt(u-1)===32&&(p=" "+p,u-=1),C=y._createRemoveBlockCommentOperations(new I.Range(i,r+b.length+1,g,u+1),b,p)):(C=y._createAddBlockCommentOperations(_,b,p,this._insertSpace),this._usedEndToken=C.length===1?p:null);for(const f of C)t.addTrackedEditOperation(f.range,f.text)}static _createRemoveBlockCommentOperations(_,b,p){const n=[];return I.Range.isEmpty(_)?n.push(d.EditOperation.delete(new I.Range(_.startLineNumber,_.startColumn-b.length,_.endLineNumber,_.endColumn+p.length))):(n.push(d.EditOperation.delete(new I.Range(_.startLineNumber,_.startColumn-b.length,_.startLineNumber,_.startColumn))),n.push(d.EditOperation.delete(new I.Range(_.endLineNumber,_.endColumn,_.endLineNumber,_.endColumn+p.length)))),n}static _createAddBlockCommentOperations(_,b,p,n){const o=[];return I.Range.isEmpty(_)?o.push(d.EditOperation.replace(new I.Range(_.startLineNumber,_.startColumn,_.endLineNumber,_.endColumn),b+" "+p)):(o.push(d.EditOperation.insert(new k.Position(_.startLineNumber,_.startColumn),b+(n?" ":""))),o.push(d.EditOperation.insert(new k.Position(_.endLineNumber,_.endColumn),(n?" ":"")+p))),o}getEditOperations(_,b){const p=this._selection.startLineNumber,n=this._selection.startColumn;_.tokenization.tokenizeIfCheap(p);const o=_.getLanguageIdAtPosition(p,n),t=this.languageConfigurationService.getLanguageConfiguration(o).comments;!t||!t.blockCommentStartToken||!t.blockCommentEndToken||this._createOperationsForBlockComment(this._selection,t.blockCommentStartToken,t.blockCommentEndToken,this._insertSpace,_,b)}computeCursorState(_,b){const p=b.getInverseEditOperations();if(p.length===2){const n=p[0],o=p[1];return new E.Selection(n.range.endLineNumber,n.range.endColumn,o.range.startLineNumber,o.range.startColumn)}else{const n=p[0].range,o=this._usedEndToken?-this._usedEndToken.length-1:0;return new E.Selection(n.endLineNumber,n.endColumn+o,n.endLineNumber,n.endColumn+o)}}}e.BlockCommentCommand=y}),define(ne[609],se([1,0,11,75,9,4,23,333]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LineCommentCommand=void 0;class _{constructor(p,n,o,t,i,s,g){this.languageConfigurationService=p,this._selection=n,this._indentSize=o,this._type=t,this._insertSpace=i,this._selectionId=null,this._deltaColumn=0,this._moveEndPositionDown=!1,this._ignoreEmptyLines=s,this._ignoreFirstLine=g||!1}static _gatherPreflightCommentStrings(p,n,o,t){p.tokenization.tokenizeIfCheap(n);const i=p.getLanguageIdAtPosition(n,1),s=t.getLanguageConfiguration(i).comments,g=s?s.lineCommentToken:null;if(!g)return null;const c=[];for(let l=0,a=o-n+1;li?n[c].commentStrOffset=s-1:n[c].commentStrOffset=s}}}e.LineCommentCommand=_}),define(ne[610],se([1,0,4,23]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DragAndDropCommand=void 0;class I{constructor(y,m,_){this.selection=y,this.targetPosition=m,this.copy=_,this.targetSelection=null}getEditOperations(y,m){const _=y.getValueInRange(this.selection);if(this.copy||m.addEditOperation(this.selection,null),m.addEditOperation(new d.Range(this.targetPosition.lineNumber,this.targetPosition.column,this.targetPosition.lineNumber,this.targetPosition.column),_),this.selection.containsPosition(this.targetPosition)&&!(this.copy&&(this.selection.getEndPosition().equals(this.targetPosition)||this.selection.getStartPosition().equals(this.targetPosition)))){this.targetSelection=this.selection;return}if(this.copy){this.targetSelection=new k.Selection(this.targetPosition.lineNumber,this.targetPosition.column,this.selection.endLineNumber-this.selection.startLineNumber+this.targetPosition.lineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column+this.selection.endColumn-this.selection.startColumn:this.selection.endColumn);return}if(this.targetPosition.lineNumber>this.selection.endLineNumber){this.targetSelection=new k.Selection(this.targetPosition.lineNumber-this.selection.endLineNumber+this.selection.startLineNumber,this.targetPosition.column,this.targetPosition.lineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column+this.selection.endColumn-this.selection.startColumn:this.selection.endColumn);return}if(this.targetPosition.lineNumber0){const m=[];for(let p=0;pd.Range.compareRangesUsingStarts(p.range,n.range));const _=[];let b=m[0];for(let p=1;p0){const c=[],l=s.caseOps.length;let a=0;for(let r=0,u=g.length;r=l){c.push(g.slice(r));break}switch(s.caseOps[a]){case"U":c.push(g[r].toUpperCase());break;case"u":c.push(g[r].toUpperCase()),a++;break;case"L":c.push(g[r].toLowerCase());break;case"l":c.push(g[r].toLowerCase()),a++;break;default:c.push(g[r])}}g=c.join("")}o+=g}return o}static _substitute(p,n){if(n===null)return"";if(p===0)return n[0];let o="";for(;p>0;){if(p=t)break;const s=b.charCodeAt(o);switch(s){case 92:n.emitUnchanged(o-1),n.emitStatic("\\",o+1);break;case 110:n.emitUnchanged(o-1),n.emitStatic(` -`,o+1);break;case 116:n.emitUnchanged(o-1),n.emitStatic(" ",o+1);break;case 117:case 85:case 108:case 76:n.emitUnchanged(o-1),n.emitStatic("",o+1),p.push(String.fromCharCode(s));break}continue}if(i===36){if(o++,o>=t)break;const s=b.charCodeAt(o);if(s===36){n.emitUnchanged(o-1),n.emitStatic("$",o+1);continue}if(s===48||s===38){n.emitUnchanged(o-1),n.emitMatchIndex(0,o+1,p),p.length=0;continue}if(49<=s&&s<=57){let g=s-48;if(o+1e.MAX_FOLDING_REGIONS)throw new Error("invalid startIndexes or endIndexes size");this._startIndexes=m,this._endIndexes=_,this._collapseStates=new k(m.length),this._userDefinedStates=new k(m.length),this._recoveredStates=new k(m.length),this._types=b,this._parentsComputed=!1}ensureParentIndices(){if(!this._parentsComputed){this._parentsComputed=!0;const m=[],_=(b,p)=>{const n=m[m.length-1];return this.getStartLineNumber(n)<=b&&this.getEndLineNumber(n)>=p};for(let b=0,p=this._startIndexes.length;be.MAX_LINE_NUMBER||o>e.MAX_LINE_NUMBER)throw new Error("startLineNumber or endLineNumber must not exceed "+e.MAX_LINE_NUMBER);for(;m.length>0&&!_(n,o);)m.pop();const t=m.length>0?m[m.length-1]:-1;m.push(b),this._startIndexes[b]=n+((t&255)<<24),this._endIndexes[b]=o+((t&65280)<<16)}}}get length(){return this._startIndexes.length}getStartLineNumber(m){return this._startIndexes[m]&e.MAX_LINE_NUMBER}getEndLineNumber(m){return this._endIndexes[m]&e.MAX_LINE_NUMBER}getType(m){return this._types?this._types[m]:void 0}hasTypes(){return!!this._types}isCollapsed(m){return this._collapseStates.get(m)}setCollapsed(m,_){this._collapseStates.set(m,_)}isUserDefined(m){return this._userDefinedStates.get(m)}setUserDefined(m,_){return this._userDefinedStates.set(m,_)}isRecovered(m){return this._recoveredStates.get(m)}setRecovered(m,_){return this._recoveredStates.set(m,_)}getSource(m){return this.isUserDefined(m)?1:this.isRecovered(m)?2:0}setSource(m,_){_===1?(this.setUserDefined(m,!0),this.setRecovered(m,!1)):_===2?(this.setUserDefined(m,!1),this.setRecovered(m,!0)):(this.setUserDefined(m,!1),this.setRecovered(m,!1))}setCollapsedAllOfType(m,_){let b=!1;if(this._types)for(let p=0;p>>24)+((this._endIndexes[m]&d)>>>16);return _===e.MAX_FOLDING_REGIONS?-1:_}contains(m,_){return this.getStartLineNumber(m)<=_&&this.getEndLineNumber(m)>=_}findIndex(m){let _=0,b=this._startIndexes.length;if(b===0)return-1;for(;_=0){if(this.getEndLineNumber(_)>=m)return _;for(_=this.getParentIndex(_);_!==-1;){if(this.contains(_,m))return _;_=this.getParentIndex(_)}}return-1}toString(){const m=[];for(let _=0;_Array.isArray(C)?h=>hh=c.startLineNumber))g&&g.startLineNumber===c.startLineNumber?(c.source===1?C=c:(C=g,C.isCollapsed=c.isCollapsed&&(g.endLineNumber===c.endLineNumber||!p?.startsInside(g.startLineNumber+1,g.endLineNumber+1)),C.source=0),g=o(++i)):(C=c,c.isCollapsed&&c.source===0&&(C.source=2)),c=t(++s);else{let f=s,h=c;for(;;){if(!h||h.startLineNumber>g.endLineNumber){C=g;break}if(h.source===1&&h.endLineNumber>g.endLineNumber)break;h=t(++f)}g=o(++i)}if(C){for(;a&&a.endLineNumberC.startLineNumber&&C.startLineNumber>r&&C.endLineNumber<=b&&(!a||a.endLineNumber>=C.endLineNumber)&&(u.push(C),r=C.startLineNumber,a&&l.push(a),a=C)}}return u}}e.FoldingRegions=I;class E{constructor(m,_){this.ranges=m,this.index=_}get startLineNumber(){return this.ranges.getStartLineNumber(this.index)}get endLineNumber(){return this.ranges.getEndLineNumber(this.index)}get regionIndex(){return this.index}get parentIndex(){return this.ranges.getParentIndex(this.index)}get isCollapsed(){return this.ranges.isCollapsed(this.index)}containedBy(m){return m.startLineNumber<=this.startLineNumber&&m.endLineNumber>=this.endLineNumber}containsLine(m){return this.startLineNumber<=m&&m<=this.endLineNumber}}e.FoldingRegion=E}),define(ne[334],se([1,0,6,203,129]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FoldingModel=void 0,e.toggleCollapseState=y,e.setCollapseStateLevelsDown=m,e.setCollapseStateLevelsUp=_,e.setCollapseStateUp=b,e.setCollapseStateAtLevel=p,e.setCollapseStateForRest=n,e.setCollapseStateForMatchingLines=o,e.setCollapseStateForType=t,e.getParentFoldLine=i,e.getPreviousFoldLine=s,e.getNextFoldLine=g;class E{get regions(){return this._regions}get textModel(){return this._textModel}constructor(l,a){this._updateEventEmitter=new d.Emitter,this.onDidChange=this._updateEventEmitter.event,this._textModel=l,this._decorationProvider=a,this._regions=new k.FoldingRegions(new Uint32Array(0),new Uint32Array(0)),this._editorDecorationIds=[]}toggleCollapseState(l){if(!l.length)return;l=l.sort((r,u)=>r.regionIndex-u.regionIndex);const a={};this._decorationProvider.changeDecorations(r=>{let u=0,C=-1,f=-1;const h=v=>{for(;uf&&(f=w),u++}};for(const v of l){const w=v.regionIndex,S=this._editorDecorationIds[w];if(S&&!a[S]){a[S]=!0,h(w);const L=!this._regions.isCollapsed(w);this._regions.setCollapsed(w,L),C=Math.max(C,this._regions.getEndLineNumber(w))}}h(this._regions.length)}),this._updateEventEmitter.fire({model:this,collapseStateChanged:l})}removeManualRanges(l){const a=new Array,r=u=>{for(const C of l)if(!(C.startLineNumber>u.endLineNumber||u.startLineNumber>C.endLineNumber))return!0;return!1};for(let u=0;ur&&(r=h)}this._decorationProvider.changeDecorations(u=>this._editorDecorationIds=u.deltaDecorations(this._editorDecorationIds,a)),this._regions=l,this._updateEventEmitter.fire({model:this})}_currentFoldedOrManualRanges(l){const a=[];for(let r=0,u=this._regions.length;r=f.endLineNumber||f.startLineNumber<1||f.endLineNumber>r)continue;const h=this._getLinesChecksum(f.startLineNumber+1,f.endLineNumber);a.push({startLineNumber:f.startLineNumber,endLineNumber:f.endLineNumber,isCollapsed:f.isCollapsed,source:f.source,checksum:h})}return a.length>0?a:void 0}applyMemento(l){if(!Array.isArray(l))return;const a=[],r=this._textModel.getLineCount();for(const C of l){if(C.startLineNumber>=C.endLineNumber||C.startLineNumber<1||C.endLineNumber>r)continue;const f=this._getLinesChecksum(C.startLineNumber+1,C.endLineNumber);(!C.checksum||f===C.checksum)&&a.push({startLineNumber:C.startLineNumber,endLineNumber:C.endLineNumber,type:void 0,isCollapsed:C.isCollapsed??!0,source:C.source??0})}const u=k.FoldingRegions.sanitizeAndMerge(this._regions,a,r);this.updatePost(k.FoldingRegions.fromFoldRanges(u))}_getLinesChecksum(l,a){return(0,I.hash)(this._textModel.getLineContent(l)+this._textModel.getLineContent(a))%1e6}dispose(){this._decorationProvider.removeDecorations(this._editorDecorationIds)}getAllRegionsAtLine(l,a){const r=[];if(this._regions){let u=this._regions.findRange(l),C=1;for(;u>=0;){const f=this._regions.toRegion(u);(!a||a(f,C))&&r.push(f),C++,u=f.parentIndex}}return r}getRegionAtLine(l){if(this._regions){const a=this._regions.findRange(l);if(a>=0)return this._regions.toRegion(a)}return null}getRegionsInside(l,a){const r=[],u=l?l.regionIndex+1:0,C=l?l.endLineNumber:Number.MAX_VALUE;if(a&&a.length===2){const f=[];for(let h=u,v=this._regions.length;h0&&!w.containedBy(f[f.length-1]);)f.pop();f.push(w),a(w,f.length)&&r.push(w)}else break}}else for(let f=u,h=this._regions.length;f1){const h=c.getRegionsInside(C,(v,w)=>v.isCollapsed!==f&&w0)for(const C of r){const f=c.getRegionAtLine(C);if(f&&(f.isCollapsed!==l&&u.push(f),a>1)){const h=c.getRegionsInside(f,(v,w)=>v.isCollapsed!==l&&wf.isCollapsed!==l&&hh.isCollapsed!==l&&v<=a);u.push(...f)}c.toggleCollapseState(u)}function b(c,l,a){const r=[];for(const u of a){const C=c.getAllRegionsAtLine(u,f=>f.isCollapsed!==l);C.length>0&&r.push(C[0])}c.toggleCollapseState(r)}function p(c,l,a,r){const u=(f,h)=>h===l&&f.isCollapsed!==a&&!r.some(v=>f.containsLine(v)),C=c.getRegionsInside(null,u);c.toggleCollapseState(C)}function n(c,l,a){const r=[];for(const f of a){const h=c.getAllRegionsAtLine(f,void 0);h.length>0&&r.push(h[0])}const u=f=>r.every(h=>!h.containedBy(f)&&!f.containedBy(h))&&f.isCollapsed!==l,C=c.getRegionsInside(null,u);c.toggleCollapseState(C)}function o(c,l,a){const r=c.textModel,u=c.regions,C=[];for(let f=u.length-1;f>=0;f--)if(a!==u.isCollapsed(f)){const h=u.getStartLineNumber(f);l.test(r.getLineContent(h))&&C.push(u.toRegion(f))}c.toggleCollapseState(C)}function t(c,l,a){const r=c.regions,u=[];for(let C=r.length-1;C>=0;C--)a!==r.isCollapsed(C)&&l===r.getType(C)&&u.push(r.toRegion(C));c.toggleCollapseState(u)}function i(c,l){let a=null;const r=l.getRegionAtLine(c);if(r!==null&&(a=r.startLineNumber,c===a)){const u=r.parentIndex;u!==-1?a=l.regions.getStartLineNumber(u):a=null}return a}function s(c,l){let a=l.getRegionAtLine(c);if(a!==null&&a.startLineNumber===c){if(c!==a.startLineNumber)return a.startLineNumber;{const r=a.parentIndex;let u=0;for(r!==-1&&(u=l.regions.getStartLineNumber(a.parentIndex));a!==null;)if(a.regionIndex>0){if(a=l.regions.toRegion(a.regionIndex-1),a.startLineNumber<=u)return null;if(a.parentIndex===r)return a.startLineNumber}else return null}}else if(l.regions.length>0)for(a=l.regions.toRegion(l.regions.length-1);a!==null;){if(a.startLineNumber0?a=l.regions.toRegion(a.regionIndex-1):a=null}return null}function g(c,l){let a=l.getRegionAtLine(c);if(a!==null&&a.startLineNumber===c){const r=a.parentIndex;let u=0;if(r!==-1)u=l.regions.getEndLineNumber(a.parentIndex);else{if(l.regions.length===0)return null;u=l.regions.getEndLineNumber(l.regions.length-1)}for(;a!==null;)if(a.regionIndex=u)return null;if(a.parentIndex===r)return a.startLineNumber}else return null}else if(l.regions.length>0)for(a=l.regions.toRegion(0);a!==null;){if(a.startLineNumber>c)return a.startLineNumber;a.regionIndexthis.updateHiddenRanges()),this._hiddenRanges=[],p.regions.length&&this.updateHiddenRanges()}notifyChangeModelContent(p){this._hiddenRanges.length&&!this._hasLineChanges&&(this._hasLineChanges=p.changes.some(n=>n.range.endLineNumber!==n.range.startLineNumber||(0,E.countEOL)(n.text)[0]!==0))}updateHiddenRanges(){let p=!1;const n=[];let o=0,t=0,i=Number.MAX_VALUE,s=-1;const g=this._foldingModel.regions;for(;o0}isHidden(p){return _(this._hiddenRanges,p)!==null}adjustSelections(p){let n=!1;const o=this._foldingModel.textModel;let t=null;const i=s=>((!t||!m(s,t))&&(t=_(this._hiddenRanges,s)),t?t.startLineNumber-1:null);for(let s=0,g=p.length;s0&&(this._hiddenRanges=[],this._updateEventEmitter.fire(this._hiddenRanges)),this._foldingModelListener&&(this._foldingModelListener.dispose(),this._foldingModelListener=null)}}e.HiddenRangeModel=y;function m(b,p){return b>=p.startLineNumber&&b<=p.endLineNumber}function _(b,p){const n=(0,d.findFirstIdxMonotonousOrArrLen)(b,o=>p=0&&b[n].endLineNumber>=p?b[n]:null}}),define(ne[335],se([1,0,237,203]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RangesCollector=e.IndentRangeProvider=void 0,e.computeRanges=b;const I=5e3,E="indent";class y{constructor(n,o,t){this.editorModel=n,this.languageConfigurationService=o,this.foldingRangesLimit=t,this.id=E}dispose(){}compute(n){const o=this.languageConfigurationService.getLanguageConfiguration(this.editorModel.getLanguageId()).foldingRules,t=o&&!!o.offSide,i=o&&o.markers;return Promise.resolve(b(this.editorModel,t,i,this.foldingRangesLimit))}}e.IndentRangeProvider=y;class m{constructor(n){this._startIndexes=[],this._endIndexes=[],this._indentOccurrences=[],this._length=0,this._foldingRangesLimit=n}insertFirst(n,o,t){if(n>k.MAX_LINE_NUMBER||o>k.MAX_LINE_NUMBER)return;const i=this._length;this._startIndexes[i]=n,this._endIndexes[i]=o,this._length++,t<1e3&&(this._indentOccurrences[t]=(this._indentOccurrences[t]||0)+1)}toIndentRanges(n){const o=this._foldingRangesLimit.limit;if(this._length<=o){this._foldingRangesLimit.update(this._length,!1);const t=new Uint32Array(this._length),i=new Uint32Array(this._length);for(let s=this._length-1,g=0;s>=0;s--,g++)t[g]=this._startIndexes[s],i[g]=this._endIndexes[s];return new k.FoldingRegions(t,i)}else{this._foldingRangesLimit.update(this._length,o);let t=0,i=this._indentOccurrences.length;for(let l=0;lo){i=l;break}t+=a}}const s=n.getOptions().tabSize,g=new Uint32Array(o),c=new Uint32Array(o);for(let l=this._length-1,a=0;l>=0;l--){const r=this._startIndexes[l],u=n.getLineContent(r),C=(0,d.computeIndentLevel)(u,s);(C{}};function b(p,n,o,t=_){const i=p.getOptions().tabSize,s=new m(t);let g;o&&(g=new RegExp(`(${o.start.source})|(?:${o.end.source})`));const c=[],l=p.getLineCount()+1;c.push({indent:-1,endAbove:l,line:l});for(let a=p.getLineCount();a>0;a--){const r=p.getLineContent(a),u=(0,d.computeIndentLevel)(r,i);let C=c[c.length-1];if(u===-1){n&&(C.endAbove=a);continue}let f;if(g&&(f=r.match(g)))if(f[1]){let h=c.length-1;for(;h>0&&c[h].indent!==-2;)h--;if(h>0){c.length=h+1,C=c[h],s.insertFirst(a,C.line,u),C.line=a,C.indent=u,C.endAbove=a;continue}}else{c.push({indent:-2,endAbove:a,line:a});continue}if(C.indent>u){do c.pop(),C=c[c.length-1];while(C.indent>u);const h=C.endAbove-1;h-a>=1&&s.insertFirst(a,h,u)}C.indent===u?C.endAbove=a:c.push({indent:u,endAbove:a,line:a})}return s.toIndentRanges(p)}}),define(ne[336],se([1,0,8,2,203]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SyntaxRangeProvider=void 0,e.sanitizeRanges=p;const E={},y="syntax";class m{constructor(o,t,i,s,g){this.editorModel=o,this.providers=t,this.handleFoldingRangesChange=i,this.foldingRangesLimit=s,this.fallbackRangeProvider=g,this.id=y,this.disposables=new k.DisposableStore,g&&this.disposables.add(g);for(const c of t)typeof c.onDidChange=="function"&&this.disposables.add(c.onDidChange(i))}compute(o){return _(this.providers,this.editorModel,o).then(t=>t?p(t,this.foldingRangesLimit):this.fallbackRangeProvider?.compute(o)??null)}dispose(){this.disposables.dispose()}}e.SyntaxRangeProvider=m;function _(n,o,t){let i=null;const s=n.map((g,c)=>Promise.resolve(g.provideFoldingRanges(o,E,t)).then(l=>{if(!t.isCancellationRequested&&Array.isArray(l)){Array.isArray(i)||(i=[]);const a=o.getLineCount();for(const r of l)r.start>0&&r.end>r.start&&r.end<=a&&i.push({start:r.start,end:r.end,rank:c,kind:r.kind})}},d.onUnexpectedExternalError));return Promise.all(s).then(g=>i)}class b{constructor(o){this._startIndexes=[],this._endIndexes=[],this._nestingLevels=[],this._nestingLevelCounts=[],this._types=[],this._length=0,this._foldingRangesLimit=o}add(o,t,i,s){if(o>I.MAX_LINE_NUMBER||t>I.MAX_LINE_NUMBER)return;const g=this._length;this._startIndexes[g]=o,this._endIndexes[g]=t,this._nestingLevels[g]=s,this._types[g]=i,this._length++,s<30&&(this._nestingLevelCounts[s]=(this._nestingLevelCounts[s]||0)+1)}toIndentRanges(){const o=this._foldingRangesLimit.limit;if(this._length<=o){this._foldingRangesLimit.update(this._length,!1);const t=new Uint32Array(this._length),i=new Uint32Array(this._length);for(let s=0;so){i=l;break}t+=a}}const s=new Uint32Array(o),g=new Uint32Array(o),c=[];for(let l=0,a=0;l{let a=c.start-l.start;return a===0&&(a=c.rank-l.rank),a}),i=new b(o);let s;const g=[];for(const c of t)if(!s)s=c,i.add(c.start,c.end,c.kind&&c.kind.value,g.length);else if(c.start>s.start)if(c.end<=s.end)g.push(s),s=c,i.add(c.start,c.end,c.kind&&c.kind.value,g.length);else{if(c.start>s.end){do s=g.pop();while(s&&c.start>s.end);s&&g.push(s),s=c}i.add(c.start,c.end,c.kind&&c.kind.value,g.length)}return i.toIndentRanges()}}),define(ne[337],se([1,0,75,4,143]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FormattingEdit=void 0;class E{static _handleEolEdits(m,_){let b;const p=[];for(const n of _)typeof n.eol=="number"&&(b=n.eol),n.range&&typeof n.text=="string"&&p.push(n);return typeof b=="number"&&m.hasModel()&&m.getModel().pushEOL(b),p}static _isFullModelReplaceEdit(m,_){if(!m.hasModel())return!1;const b=m.getModel(),p=b.validateRange(_.range);return b.getFullModelRange().equalsRange(p)}static execute(m,_,b){b&&m.pushUndoStop();const p=I.StableEditorScrollState.capture(m),n=E._handleEolEdits(m,_);n.length===1&&E._isFullModelReplaceEdit(m,n[0])?m.executeEdits("formatEditsCommand",n.map(o=>d.EditOperation.replace(k.Range.lift(o.range),o.text))):m.executeEdits("formatEditsCommand",n.map(o=>d.EditOperation.replaceMove(k.Range.lift(o.range),o.text))),b&&m.pushUndoStop(),p.restoreRelativeVerticalPositionOfCursor(m)}}e.FormattingEdit=E}),define(ne[614],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FilteredHoverResult=e.HoverResult=void 0;class d{constructor(E,y,m){this.anchor=E,this.hoverParts=y,this.isComplete=m}filter(E){const y=this.hoverParts.filter(m=>m.isValidForHoverAnchor(E));return y.length===this.hoverParts.length?this:new k(this,this.anchor,y,this.isComplete)}}e.HoverResult=d;class k extends d{constructor(E,y,m,_){super(y,m,_),this.original=E}filter(E){return this.original.filter(E)}}e.FilteredHoverResult=k}),define(ne[615],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ExtHoverAccessibleView=e.HoverAccessibilityHelp=e.HoverAccessibleView=void 0;class d{}e.HoverAccessibleView=d;class k{}e.HoverAccessibilityHelp=k;class I{}e.ExtHoverAccessibleView=I}),define(ne[84],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HoverParticipantRegistry=e.RenderedHoverParts=e.HoverForeignElementAnchor=e.HoverRangeAnchor=void 0;class d{constructor(y,m,_,b){this.priority=y,this.range=m,this.initialMousePosX=_,this.initialMousePosY=b,this.type=1}equals(y){return y.type===1&&this.range.equalsRange(y.range)}canAdoptVisibleHover(y,m){return y.type===1&&m.lineNumber===this.range.startLineNumber}}e.HoverRangeAnchor=d;class k{constructor(y,m,_,b,p,n){this.priority=y,this.owner=m,this.range=_,this.initialMousePosX=b,this.initialMousePosY=p,this.supportsMarkerHover=n,this.type=2}equals(y){return y.type===2&&this.owner===y.owner}canAdoptVisibleHover(y,m){return y.type===2&&this.owner===y.owner}}e.HoverForeignElementAnchor=k;class I{constructor(y){this.renderedHoverParts=y}dispose(){for(const y of this.renderedHoverParts)y.dispose()}}e.RenderedHoverParts=I,e.HoverParticipantRegistry=new class{constructor(){this._participants=[]}register(y){this._participants.push(y)}getAll(){return this._participants}}}),define(ne[616],se([1,0,23]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InPlaceReplaceCommand=void 0;class k{constructor(E,y,m){this._editRange=E,this._originalSelection=y,this._text=m}getEditOperations(E,y){y.addTrackedEditOperation(this._editRange,this._text)}computeCursorState(E,y){const _=y.getInverseEditOperations()[0].range;return this._originalSelection.isEmpty()?new d.Selection(_.endLineNumber,Math.min(this._originalSelection.positionColumn,_.endColumn),_.endLineNumber,Math.min(this._originalSelection.positionColumn,_.endColumn)):new d.Selection(_.endLineNumber,_.endColumn-this._text.length,_.endLineNumber,_.endColumn)}}e.InPlaceReplaceCommand=k}),define(ne[338],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getSpaceCnt=d,e.generateIndent=k;function d(I,E){let y=0;for(let m=0;mi.equals(t.parts[s]))}renderForScreenReader(t){if(this.parts.length===0)return"";const i=this.parts[this.parts.length-1],s=t.substr(0,i.column-1);return new y.TextEdit([...this.parts.map(c=>new y.SingleTextEdit(E.Range.fromPositions(new I.Position(1,c.column)),c.lines.join(` -`)))]).applyToString(s).substring(this.parts[0].column-1)}isEmpty(){return this.parts.every(t=>t.lines.length===0)}get lineCount(){return 1+this.parts.reduce((t,i)=>t+i.lines.length-1,0)}}e.GhostText=m;class _{constructor(t,i,s){this.column=t,this.text=i,this.preview=s,this.lines=(0,k.splitLines)(this.text)}equals(t){return this.column===t.column&&this.lines.length===t.lines.length&&this.lines.every((i,s)=>i===t.lines[s])}}e.GhostTextPart=_;class b{constructor(t,i,s,g=0){this.lineNumber=t,this.columnRange=i,this.text=s,this.additionalReservedLineCount=g,this.parts=[new _(this.columnRange.endColumnExclusive,this.text,!1)],this.newLines=(0,k.splitLines)(this.text)}renderForScreenReader(t){return this.newLines.join(` -`)}get lineCount(){return this.newLines.length}isEmpty(){return this.parts.every(t=>t.lines.length===0)}equals(t){return this.lineNumber===t.lineNumber&&this.columnRange.equals(t.columnRange)&&this.newLines.length===t.newLines.length&&this.newLines.every((i,s)=>i===t.newLines[s])&&this.additionalReservedLineCount===t.additionalReservedLineCount}}e.GhostTextReplacement=b;function p(o,t){return(0,d.equals)(o,t,n)}function n(o,t){return o===t?!0:!o||!t?!1:o instanceof m&&t instanceof m||o instanceof b&&t instanceof b?o.equals(t):!1}}),define(ne[246],se([1,0,190,11,4,113,104,204]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.singleTextRemoveCommonPrefix=_,e.singleTextEditAugments=b,e.computeGhostText=p;function _(g,c,l){const a=l?g.range.intersectRanges(l):g.range;if(!a)return g;const r=c.getValueInRange(a,1),u=(0,k.commonPrefixLength)(r,g.text),C=E.TextLength.ofText(r.substring(0,u)).addToPosition(g.range.getStartPosition()),f=g.text.substring(u),h=I.Range.fromPositions(C,g.range.getEndPosition());return new y.SingleTextEdit(h,f)}function b(g,c){return g.text.startsWith(c.text)&&n(g.range,c.range)}function p(g,c,l,a,r=0){let u=_(g,c);if(u.range.endLineNumber!==u.range.startLineNumber)return;const C=c.getLineContent(u.range.startLineNumber),f=(0,k.getLeadingWhitespace)(C).length;if(u.range.startColumn-1<=f){const T=(0,k.getLeadingWhitespace)(u.text).length,M=C.substring(u.range.startColumn-1,f),[A,P]=[u.range.getStartPosition(),u.range.getEndPosition()],N=A.column+M.length<=P.column?A.delta(0,M.length):P,O=I.Range.fromPositions(N,P),F=u.text.startsWith(M)?u.text.substring(M.length):u.text.substring(T);u=new y.SingleTextEdit(O,F)}const v=c.getValueInRange(u.range),w=t(v,u.text);if(!w)return;const S=u.range.startLineNumber,L=new Array;if(l==="prefix"){const T=w.filter(M=>M.originalLength===0);if(T.length>1||T.length===1&&T[0].originalStart!==v.length)return}const D=u.text.length-r;for(const T of w){const M=u.range.startColumn+T.originalStart+T.originalLength;if(l==="subwordSmart"&&a&&a.lineNumber===u.range.startLineNumber&&M0)return;if(T.modifiedLength===0)continue;const A=T.modifiedStart+T.modifiedLength,P=Math.max(T.modifiedStart,Math.min(A,D)),N=u.text.substring(T.modifiedStart,P),O=u.text.substring(P,Math.max(T.modifiedStart,A));N.length>0&&L.push(new m.GhostTextPart(M,N,!1)),O.length>0&&L.push(new m.GhostTextPart(M,O,!0))}return new m.GhostText(S,L)}function n(g,c){return c.getStartPosition().equals(g.getStartPosition())&&c.getEndPosition().isBeforeOrEqual(g.getEndPosition())}let o;function t(g,c){if(o?.originalValue===g&&o?.newValue===c)return o?.changes;{let l=s(g,c,!0);if(l){const a=i(l);if(a>0){const r=s(g,c,!1);r&&i(r)5e3||c.length>5e3)return;function a(v){let w=0;for(let S=0,L=v.length;Sw&&(w=D)}return w}const r=Math.max(a(g),a(c));function u(v){if(v<0)throw new Error("unexpected");return r+v+1}function C(v){let w=0,S=0;const L=new Int32Array(v.length);for(let D=0,T=v.length;Df},{getElements:()=>h}).ComputeDiff(!1).changes}}),define(ne[205],se([1,0,8,2,21,9,4]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColumnRange=void 0,e.getReadonlyEmptyArray=_,e.applyObservableDecorations=p,e.addPositions=n,e.subtractPositions=o;const m=[];function _(){return m}class b{constructor(i,s){if(this.startColumn=i,this.endColumnExclusive=s,i>s)throw new d.BugIndicatingError(`startColumn ${i} cannot be after endColumnExclusive ${s}`)}toRange(i){return new y.Range(i,this.startColumn,i,this.endColumnExclusive)}equals(i){return this.startColumn===i.startColumn&&this.endColumnExclusive===i.endColumnExclusive}}e.ColumnRange=b;function p(t,i){const s=new k.DisposableStore,g=t.createDecorationsCollection();return s.add((0,I.autorunOpts)({debugName:()=>`Apply decorations from ${i.debugName}`},c=>{const l=i.read(c);g.set(l)})),s.add({dispose:()=>{g.clear()}}),s}function n(t,i){return new E.Position(t.lineNumber+i.lineNumber-1,i.lineNumber===1?t.column+i.column-1:i.column)}function o(t,i){return new E.Position(t.lineNumber-i.lineNumber+1,t.lineNumber-i.lineNumber===0?t.column-i.column+1:t.column)}}),define(ne[618],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.inlineEditJumpBackId=e.inlineEditJumpToId=e.inlineEditRejectId=e.inlineEditAcceptId=void 0,e.inlineEditAcceptId="editor.action.inlineEdit.accept",e.inlineEditRejectId="editor.action.inlineEdit.reject",e.inlineEditJumpToId="editor.action.inlineEdit.jumpTo",e.inlineEditJumpBackId="editor.action.inlineEdit.jumpBack"}),define(ne[619],se([1,0,4,23]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CopyLinesCommand=void 0;class I{constructor(y,m,_){this._selection=y,this._isCopyingDown=m,this._noop=_||!1,this._selectionDirection=0,this._selectionId=null,this._startLineNumberDelta=0,this._endLineNumberDelta=0}getEditOperations(y,m){let _=this._selection;this._startLineNumberDelta=0,this._endLineNumberDelta=0,_.startLineNumber<_.endLineNumber&&_.endColumn===1&&(this._endLineNumberDelta=1,_=_.setEndPosition(_.endLineNumber-1,y.getLineMaxColumn(_.endLineNumber-1)));const b=[];for(let n=_.startLineNumber;n<=_.endLineNumber;n++)b.push(y.getLineContent(n));const p=b.join(` -`);p===""&&this._isCopyingDown&&(this._startLineNumberDelta++,this._endLineNumberDelta++),this._noop?m.addEditOperation(new d.Range(_.endLineNumber,y.getLineMaxColumn(_.endLineNumber),_.endLineNumber+1,1),_.endLineNumber===y.getLineCount()?"":` -`):this._isCopyingDown?m.addEditOperation(new d.Range(_.startLineNumber,1,_.startLineNumber,1),p+` -`):m.addEditOperation(new d.Range(_.endLineNumber,y.getLineMaxColumn(_.endLineNumber),_.endLineNumber,y.getLineMaxColumn(_.endLineNumber)),` -`+p),this._selectionId=m.trackSelection(_),this._selectionDirection=this._selection.getDirection()}computeCursorState(y,m){let _=m.getTrackedSelection(this._selectionId);if(this._startLineNumberDelta!==0||this._endLineNumberDelta!==0){let b=_.startLineNumber,p=_.startColumn,n=_.endLineNumber,o=_.endColumn;this._startLineNumberDelta!==0&&(b=b+this._startLineNumberDelta,p=1),this._endLineNumberDelta!==0&&(n=n+this._endLineNumberDelta,o=1),_=k.Selection.createWithDirection(b,p,n,o,this._selectionDirection)}return _}}e.CopyLinesCommand=I}),define(ne[620],se([1,0,75,4]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SortLinesCommand=void 0;class I{static{this._COLLATOR=null}static getCollator(){return I._COLLATOR||(I._COLLATOR=new Intl.Collator),I._COLLATOR}constructor(_,b){this.selection=_,this.descending=b,this.selectionId=null}getEditOperations(_,b){const p=y(_,this.selection,this.descending);p&&b.addEditOperation(p.range,p.text),this.selectionId=b.trackSelection(this.selection)}computeCursorState(_,b){return b.getTrackedSelection(this.selectionId)}static canRun(_,b,p){if(_===null)return!1;const n=E(_,b,p);if(!n)return!1;for(let o=0,t=n.before.length;o=n)return null;const o=[];for(let i=p;i<=n;i++)o.push(m.getLineContent(i));let t=o.slice(0);return t.sort(I.getCollator().compare),b===!0&&(t=t.reverse()),{startLineNumber:p,endLineNumber:n,before:o,after:t}}function y(m,_,b){const p=E(m,_,b);return p?d.EditOperation.replace(new k.Range(p.startLineNumber,1,p.endLineNumber,m.getLineMaxColumn(p.endLineNumber)),p.after.join(` -`)):null}}),define(ne[339],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SEMANTIC_HIGHLIGHTING_SETTING_ID=void 0,e.isSemanticColoringEnabled=d,e.SEMANTIC_HIGHLIGHTING_SETTING_ID="editor.semanticHighlighting";function d(k,I,E){const y=E.getValue(e.SEMANTIC_HIGHLIGHTING_SETTING_ID,{overrideIdentifier:k.getLanguageId(),resource:k.uri})?.enabled;return typeof y=="boolean"?y:I.getColorTheme().semanticHighlighting}}),define(ne[340],se([1,0,73,9,4]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketSelectionRangeProvider=void 0;class E{async provideSelectionRanges(m,_){const b=[];for(const p of _){const n=[];b.push(n);const o=new Map;await new Promise(t=>E._bracketsRightYield(t,0,m,p,o)),await new Promise(t=>E._bracketsLeftYield(t,0,m,p,o,n))}return b}static{this._maxDuration=30}static{this._maxRounds=2}static _bracketsRightYield(m,_,b,p,n){const o=new Map,t=Date.now();for(;;){if(_>=E._maxRounds){m();break}if(!p){m();break}const i=b.bracketPairs.findNextBracket(p);if(!i){m();break}if(Date.now()-t>E._maxDuration){setTimeout(()=>E._bracketsRightYield(m,_+1,b,p,n));break}if(i.bracketInfo.isOpeningBracket){const g=i.bracketInfo.bracketText,c=o.has(g)?o.get(g):0;o.set(g,c+1)}else{const g=i.bracketInfo.getOpeningBrackets()[0].bracketText;let c=o.has(g)?o.get(g):0;if(c-=1,o.set(g,Math.max(0,c)),c<0){let l=n.get(g);l||(l=new d.LinkedList,n.set(g,l)),l.push(i.range)}}p=i.range.getEndPosition()}}static _bracketsLeftYield(m,_,b,p,n,o){const t=new Map,i=Date.now();for(;;){if(_>=E._maxRounds&&n.size===0){m();break}if(!p){m();break}const s=b.bracketPairs.findPrevBracket(p);if(!s){m();break}if(Date.now()-i>E._maxDuration){setTimeout(()=>E._bracketsLeftYield(m,_+1,b,p,n,o));break}if(s.bracketInfo.isOpeningBracket){const c=s.bracketInfo.bracketText;let l=t.has(c)?t.get(c):0;if(l-=1,t.set(c,Math.max(0,l)),l<0){const a=n.get(c);if(a){const r=a.shift();a.size===0&&n.delete(c);const u=I.Range.fromPositions(s.range.getEndPosition(),r.getStartPosition()),C=I.Range.fromPositions(s.range.getStartPosition(),r.getEndPosition());o.push({range:u}),o.push({range:C}),E._addBracketLeading(b,C,o)}}}else{const c=s.bracketInfo.getOpeningBrackets()[0].bracketText,l=t.has(c)?t.get(c):0;t.set(c,l+1)}p=s.range.getStartPosition()}}static _addBracketLeading(m,_,b){if(_.startLineNumber===_.endLineNumber)return;const p=_.startLineNumber,n=m.getLineFirstNonWhitespaceColumn(p);n!==0&&n!==_.startColumn&&(b.push({range:I.Range.fromPositions(new k.Position(p,n),_.getEndPosition())}),b.push({range:I.Range.fromPositions(new k.Position(p,1),_.getEndPosition())}));const o=p-1;if(o>0){const t=m.getLineFirstNonWhitespaceColumn(o);t===_.startColumn&&t!==m.getLineLastNonWhitespaceColumn(o)&&(b.push({range:I.Range.fromPositions(new k.Position(o,t),_.getEndPosition())}),b.push({range:I.Range.fromPositions(new k.Position(o,1),_.getEndPosition())}))}}}e.BracketSelectionRangeProvider=E}),define(ne[621],se([1,0,11,4]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WordSelectionRangeProvider=void 0;class I{constructor(y=!0){this.selectSubwords=y}provideSelectionRanges(y,m){const _=[];for(const b of m){const p=[];_.push(p),this.selectSubwords&&this._addInWordRanges(p,y,b),this._addWordRanges(p,y,b),this._addWhitespaceLine(p,y,b),p.push({range:y.getFullModelRange()})}return _}_addInWordRanges(y,m,_){const b=m.getWordAtPosition(_);if(!b)return;const{word:p,startColumn:n}=b,o=_.column-n;let t=o,i=o,s=0;for(;t>=0;t--){const g=p.charCodeAt(t);if(t!==o&&(g===95||g===45))break;if((0,d.isLowerAsciiLetter)(g)&&(0,d.isUpperAsciiLetter)(s))break;s=g}for(t+=1;i0&&m.getLineFirstNonWhitespaceColumn(_.lineNumber)===0&&m.getLineLastNonWhitespaceColumn(_.lineNumber)===0&&y.push({range:new k.Range(_.lineNumber,1,_.lineNumber,m.getLineMaxColumn(_.lineNumber))})}}e.WordSelectionRangeProvider=I}),define(ne[135],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SnippetParser=e.TextmateSnippet=e.Variable=e.FormatString=e.Transform=e.Choice=e.Placeholder=e.TransformableMarker=e.Text=e.Marker=e.Scanner=void 0;class d{constructor(){this.value="",this.pos=0}static{this._table={36:0,58:1,44:2,123:3,125:4,92:5,47:6,124:7,43:11,45:12,63:13}}static isDigitCharacter(s){return s>=48&&s<=57}static isVariableCharacter(s){return s===95||s>=97&&s<=122||s>=65&&s<=90}text(s){this.value=s,this.pos=0}tokenText(s){return this.value.substr(s.pos,s.len)}next(){if(this.pos>=this.value.length)return{type:14,pos:this.pos,len:0};const s=this.pos;let g=0,c=this.value.charCodeAt(s),l;if(l=d._table[c],typeof l=="number")return this.pos+=1,{type:l,pos:s,len:1};if(d.isDigitCharacter(c)){l=8;do g+=1,c=this.value.charCodeAt(s+g);while(d.isDigitCharacter(c));return this.pos+=g,{type:l,pos:s,len:g}}if(d.isVariableCharacter(c)){l=9;do c=this.value.charCodeAt(s+ ++g);while(d.isVariableCharacter(c)||d.isDigitCharacter(c));return this.pos+=g,{type:l,pos:s,len:g}}l=10;do g+=1,c=this.value.charCodeAt(s+g);while(!isNaN(c)&&typeof d._table[c]>"u"&&!d.isDigitCharacter(c)&&!d.isVariableCharacter(c));return this.pos+=g,{type:l,pos:s,len:g}}}e.Scanner=d;class k{constructor(){this._children=[]}appendChild(s){return s instanceof I&&this._children[this._children.length-1]instanceof I?this._children[this._children.length-1].value+=s.value:(s.parent=this,this._children.push(s)),this}replace(s,g){const{parent:c}=s,l=c.children.indexOf(s),a=c.children.slice(0);a.splice(l,1,...g),c._children=a,function r(u,C){for(const f of u)f.parent=C,r(f.children,f)}(g,c)}get children(){return this._children}get rightMostDescendant(){return this._children.length>0?this._children[this._children.length-1].rightMostDescendant:this}get snippet(){let s=this;for(;;){if(!s)return;if(s instanceof o)return s;s=s.parent}}toString(){return this.children.reduce((s,g)=>s+g.toString(),"")}len(){return 0}}e.Marker=k;class I extends k{constructor(s){super(),this.value=s}toString(){return this.value}len(){return this.value.length}clone(){return new I(this.value)}}e.Text=I;class E extends k{}e.TransformableMarker=E;class y extends E{static compareByIndex(s,g){return s.index===g.index?0:s.isFinalTabstop?1:g.isFinalTabstop||s.indexg.index?1:0}constructor(s){super(),this.index=s}get isFinalTabstop(){return this.index===0}get choice(){return this._children.length===1&&this._children[0]instanceof m?this._children[0]:void 0}clone(){const s=new y(this.index);return this.transform&&(s.transform=this.transform.clone()),s._children=this.children.map(g=>g.clone()),s}}e.Placeholder=y;class m extends k{constructor(){super(...arguments),this.options=[]}appendChild(s){return s instanceof I&&(s.parent=this,this.options.push(s)),this}toString(){return this.options[0].value}len(){return this.options[0].len()}clone(){const s=new m;return this.options.forEach(s.appendChild,s),s}}e.Choice=m;class _ extends k{constructor(){super(...arguments),this.regexp=new RegExp("")}resolve(s){const g=this;let c=!1,l=s.replace(this.regexp,function(){return c=!0,g._replace(Array.prototype.slice.call(arguments,0,-2))});return!c&&this._children.some(a=>a instanceof b&&!!a.elseValue)&&(l=this._replace([])),l}_replace(s){let g="";for(const c of this._children)if(c instanceof b){let l=s[c.index]||"";l=c.resolve(l),g+=l}else g+=c.toString();return g}toString(){return""}clone(){const s=new _;return s.regexp=new RegExp(this.regexp.source,(this.regexp.ignoreCase?"i":"")+(this.regexp.global?"g":"")),s._children=this.children.map(g=>g.clone()),s}}e.Transform=_;class b extends k{constructor(s,g,c,l){super(),this.index=s,this.shorthandName=g,this.ifValue=c,this.elseValue=l}resolve(s){return this.shorthandName==="upcase"?s?s.toLocaleUpperCase():"":this.shorthandName==="downcase"?s?s.toLocaleLowerCase():"":this.shorthandName==="capitalize"?s?s[0].toLocaleUpperCase()+s.substr(1):"":this.shorthandName==="pascalcase"?s?this._toPascalCase(s):"":this.shorthandName==="camelcase"?s?this._toCamelCase(s):"":s&&typeof this.ifValue=="string"?this.ifValue:!s&&typeof this.elseValue=="string"?this.elseValue:s||""}_toPascalCase(s){const g=s.match(/[a-z0-9]+/gi);return g?g.map(c=>c.charAt(0).toUpperCase()+c.substr(1)).join(""):s}_toCamelCase(s){const g=s.match(/[a-z0-9]+/gi);return g?g.map((c,l)=>l===0?c.charAt(0).toLowerCase()+c.substr(1):c.charAt(0).toUpperCase()+c.substr(1)).join(""):s}clone(){return new b(this.index,this.shorthandName,this.ifValue,this.elseValue)}}e.FormatString=b;class p extends E{constructor(s){super(),this.name=s}resolve(s){let g=s.resolve(this);return this.transform&&(g=this.transform.resolve(g||"")),g!==void 0?(this._children=[new I(g)],!0):!1}clone(){const s=new p(this.name);return this.transform&&(s.transform=this.transform.clone()),s._children=this.children.map(g=>g.clone()),s}}e.Variable=p;function n(i,s){const g=[...i];for(;g.length>0;){const c=g.shift();if(!s(c))break;g.unshift(...c.children)}}class o extends k{get placeholderInfo(){if(!this._placeholders){const s=[];let g;this.walk(function(c){return c instanceof y&&(s.push(c),g=!g||g.indexl===s?(c=!0,!1):(g+=l.len(),!0)),c?g:-1}fullLen(s){let g=0;return n([s],c=>(g+=c.len(),!0)),g}enclosingPlaceholders(s){const g=[];let{parent:c}=s;for(;c;)c instanceof y&&g.push(c),c=c.parent;return g}resolveVariables(s){return this.walk(g=>(g instanceof p&&g.resolve(s)&&(this._placeholders=void 0),!0)),this}appendChild(s){return this._placeholders=void 0,super.appendChild(s)}replace(s,g){return this._placeholders=void 0,super.replace(s,g)}clone(){const s=new o;return this._children=this.children.map(g=>g.clone()),s}walk(s){n(this.children,s)}}e.TextmateSnippet=o;class t{constructor(){this._scanner=new d,this._token={type:14,pos:0,len:0}}static escape(s){return s.replace(/\$|}|\\/g,"\\$&")}static guessNeedsClipboard(s){return/\${?CLIPBOARD/.test(s)}parse(s,g,c){const l=new o;return this.parseFragment(s,l),this.ensureFinalTabstop(l,c??!1,g??!1),l}parseFragment(s,g){const c=g.children.length;for(this._scanner.text(s),this._token=this._scanner.next();this._parse(g););const l=new Map,a=[];g.walk(C=>(C instanceof y&&(C.isFinalTabstop?l.set(0,void 0):!l.has(C.index)&&C.children.length>0?l.set(C.index,C.children):a.push(C)),!0));const r=(C,f)=>{const h=l.get(C.index);if(!h)return;const v=new y(C.index);v.transform=C.transform;for(const w of h){const S=w.clone();v.appendChild(S),S instanceof y&&l.has(S.index)&&!f.has(S.index)&&(f.add(S.index),r(S,f),f.delete(S.index))}g.replace(C,[v])},u=new Set;for(const C of a)r(C,u);return g.children.slice(c)}ensureFinalTabstop(s,g,c){(g||c&&s.placeholders.length>0)&&(s.placeholders.find(a=>a.index===0)||s.appendChild(new y(0)))}_accept(s,g){if(s===void 0||this._token.type===s){const c=g?this._scanner.tokenText(this._token):!0;return this._token=this._scanner.next(),c}return!1}_backTo(s){return this._scanner.pos=s.pos+s.len,this._token=s,!1}_until(s){const g=this._token;for(;this._token.type!==s;){if(this._token.type===14)return!1;if(this._token.type===5){const l=this._scanner.next();if(l.type!==0&&l.type!==4&&l.type!==5)return!1}this._token=this._scanner.next()}const c=this._scanner.value.substring(g.pos,this._token.pos).replace(/\\(\$|}|\\)/g,"$1");return this._token=this._scanner.next(),c}_parse(s){return this._parseEscaped(s)||this._parseTabstopOrVariableName(s)||this._parseComplexPlaceholder(s)||this._parseComplexVariable(s)||this._parseAnything(s)}_parseEscaped(s){let g;return(g=this._accept(5,!0))?(g=this._accept(0,!0)||this._accept(4,!0)||this._accept(5,!0)||g,s.appendChild(new I(g)),!0):!1}_parseTabstopOrVariableName(s){let g;const c=this._token;return this._accept(0)&&(g=this._accept(9,!0)||this._accept(8,!0))?(s.appendChild(/^\d+$/.test(g)?new y(Number(g)):new p(g)),!0):this._backTo(c)}_parseComplexPlaceholder(s){let g;const c=this._token;if(!(this._accept(0)&&this._accept(3)&&(g=this._accept(8,!0))))return this._backTo(c);const a=new y(Number(g));if(this._accept(1))for(;;){if(this._accept(4))return s.appendChild(a),!0;if(!this._parse(a))return s.appendChild(new I("${"+g+":")),a.children.forEach(s.appendChild,s),!0}else if(a.index>0&&this._accept(7)){const r=new m;for(;;){if(this._parseChoiceElement(r)){if(this._accept(2))continue;if(this._accept(7)&&(a.appendChild(r),this._accept(4)))return s.appendChild(a),!0}return this._backTo(c),!1}}else return this._accept(6)?this._parseTransform(a)?(s.appendChild(a),!0):(this._backTo(c),!1):this._accept(4)?(s.appendChild(a),!0):this._backTo(c)}_parseChoiceElement(s){const g=this._token,c=[];for(;!(this._token.type===2||this._token.type===7);){let l;if((l=this._accept(5,!0))?l=this._accept(2,!0)||this._accept(7,!0)||this._accept(5,!0)||l:l=this._accept(void 0,!0),!l)return this._backTo(g),!1;c.push(l)}return c.length===0?(this._backTo(g),!1):(s.appendChild(new I(c.join(""))),!0)}_parseComplexVariable(s){let g;const c=this._token;if(!(this._accept(0)&&this._accept(3)&&(g=this._accept(9,!0))))return this._backTo(c);const a=new p(g);if(this._accept(1))for(;;){if(this._accept(4))return s.appendChild(a),!0;if(!this._parse(a))return s.appendChild(new I("${"+g+":")),a.children.forEach(s.appendChild,s),!0}else return this._accept(6)?this._parseTransform(a)?(s.appendChild(a),!0):(this._backTo(c),!1):this._accept(4)?(s.appendChild(a),!0):this._backTo(c)}_parseTransform(s){const g=new _;let c="",l="";for(;!this._accept(6);){let a;if(a=this._accept(5,!0)){a=this._accept(6,!0)||a,c+=a;continue}if(this._token.type!==14){c+=this._accept(void 0,!0);continue}return!1}for(;!this._accept(6);){let a;if(a=this._accept(5,!0)){a=this._accept(5,!0)||this._accept(6,!0)||a,g.appendChild(new I(a));continue}if(!(this._parseFormatString(g)||this._parseAnything(g)))return!1}for(;!this._accept(4);){if(this._token.type!==14){l+=this._accept(void 0,!0);continue}return!1}try{g.regexp=new RegExp(c,l)}catch{return!1}return s.transform=g,!0}_parseFormatString(s){const g=this._token;if(!this._accept(0))return!1;let c=!1;this._accept(3)&&(c=!0);const l=this._accept(8,!0);if(l)if(c){if(this._accept(4))return s.appendChild(new b(Number(l))),!0;if(!this._accept(1))return this._backTo(g),!1}else return s.appendChild(new b(Number(l))),!0;else return this._backTo(g),!1;if(this._accept(6)){const a=this._accept(9,!0);return!a||!this._accept(4)?(this._backTo(g),!1):(s.appendChild(new b(Number(l),a)),!0)}else if(this._accept(11)){const a=this._until(4);if(a)return s.appendChild(new b(Number(l),void 0,a,void 0)),!0}else if(this._accept(12)){const a=this._until(4);if(a)return s.appendChild(new b(Number(l),void 0,void 0,a)),!0}else if(this._accept(13)){const a=this._until(1);if(a){const r=this._until(4);if(r)return s.appendChild(new b(Number(l),void 0,a,r)),!0}}else{const a=this._until(4);if(a)return s.appendChild(new b(Number(l),void 0,void 0,a)),!0}return this._backTo(g),!1}_parseAnything(s){return this._token.type!==14?(s.appendChild(new I(this._scanner.tokenText(this._token))),this._accept(void 0),!0):!1}}e.SnippetParser=t}),define(ne[341],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StickyModel=e.StickyElement=e.StickyRange=void 0;class d{constructor(y,m){this.startLineNumber=y,this.endLineNumber=m}}e.StickyRange=d;class k{constructor(y,m,_){this.range=y,this.children=m,this.parent=_}}e.StickyElement=k;class I{constructor(y,m,_,b){this.uri=y,this.version=m,this.element=_,this.outlineProviderId=b}}e.StickyModel=I}),define(ne[342],se([1,0,13,82,11]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompletionModel=e.LineContext=void 0;class E{constructor(_,b){this.leadingLineContent=_,this.characterCountDelta=b}}e.LineContext=E;class y{constructor(_,b,p,n,o,t,i=k.FuzzyScoreOptions.default,s=void 0){this.clipboardText=s,this._snippetCompareFn=y._compareCompletionItems,this._items=_,this._column=b,this._wordDistance=n,this._options=o,this._refilterKind=1,this._lineContext=p,this._fuzzyScoreOptions=i,t==="top"?this._snippetCompareFn=y._compareCompletionItemsSnippetsUp:t==="bottom"&&(this._snippetCompareFn=y._compareCompletionItemsSnippetsDown)}get lineContext(){return this._lineContext}set lineContext(_){(this._lineContext.leadingLineContent!==_.leadingLineContent||this._lineContext.characterCountDelta!==_.characterCountDelta)&&(this._refilterKind=this._lineContext.characterCountDelta<_.characterCountDelta&&this._filteredItems?2:1,this._lineContext=_)}get items(){return this._ensureCachedState(),this._filteredItems}getItemsByProvider(){return this._ensureCachedState(),this._itemsByProvider}getIncompleteProvider(){this._ensureCachedState();const _=new Set;for(const[b,p]of this.getItemsByProvider())p.length>0&&p[0].container.incomplete&&_.add(b);return _}get stats(){return this._ensureCachedState(),this._stats}_ensureCachedState(){this._refilterKind!==0&&this._createCachedState()}_createCachedState(){this._itemsByProvider=new Map;const _=[],{leadingLineContent:b,characterCountDelta:p}=this._lineContext;let n="",o="";const t=this._refilterKind===1?this._items:this._filteredItems,i=[],s=!this._options.filterGraceful||t.length>2e3?k.fuzzyScore:k.fuzzyScoreGracefulAggressive;for(let g=0;g=r)c.score=k.FuzzyScore.Default;else if(typeof c.completion.filterText=="string"){const C=s(n,o,u,c.completion.filterText,c.filterTextLow,0,this._fuzzyScoreOptions);if(!C)continue;(0,I.compareIgnoreCase)(c.completion.filterText,c.textLabel)===0?c.score=C:(c.score=(0,k.anyScore)(n,o,u,c.textLabel,c.labelLow,0),c.score[0]=C[0])}else{const C=s(n,o,u,c.textLabel,c.labelLow,0,this._fuzzyScoreOptions);if(!C)continue;c.score=C}}c.idx=g,c.distance=this._wordDistance.distance(c.position,c.completion),i.push(c),_.push(c.textLabel.length)}this._filteredItems=i.sort(this._snippetCompareFn),this._refilterKind=0,this._stats={pLabelLen:_.length?(0,d.quickSelect)(_.length-.85,_,(g,c)=>g-c):0}}static _compareCompletionItems(_,b){return _.score[0]>b.score[0]?-1:_.score[0]b.distance?1:_.idxb.idx?1:0}static _compareCompletionItemsSnippetsDown(_,b){if(_.completion.kind!==b.completion.kind){if(_.completion.kind===27)return 1;if(b.completion.kind===27)return-1}return y._compareCompletionItems(_,b)}static _compareCompletionItemsSnippetsUp(_,b){if(_.completion.kind!==b.completion.kind){if(_.completion.kind===27)return-1;if(b.completion.kind===27)return 1}return y._compareCompletionItems(_,b)}}e.CompletionModel=y}),define(ne[622],se([1,0,13,2,144]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CommitCharacterController=void 0;class E{constructor(m,_,b,p){this._disposables=new k.DisposableStore,this._disposables.add(b.onDidSuggest(n=>{n.completionModel.items.length===0&&this.reset()})),this._disposables.add(b.onDidCancel(n=>{this.reset()})),this._disposables.add(_.onDidShow(()=>this._onItem(_.getFocusedItem()))),this._disposables.add(_.onDidFocus(this._onItem,this)),this._disposables.add(_.onDidHide(this.reset,this)),this._disposables.add(m.onWillType(n=>{if(this._active&&!_.isFrozen()&&b.state!==0){const o=n.charCodeAt(n.length-1);this._active.acceptCharacters.has(o)&&m.getOption(0)&&p(this._active.item)}}))}_onItem(m){if(!m||!(0,d.isNonEmptyArray)(m.item.completion.commitCharacters)){this.reset();return}if(this._active&&this._active.item.item===m.item)return;const _=new I.CharacterSet;for(const b of m.item.completion.commitCharacters)b.length>0&&_.add(b.charCodeAt(0));this._active={acceptCharacters:_,item:m}}reset(){this._active=void 0}dispose(){this._disposables.dispose()}}e.CommitCharacterController=E}),define(ne[623],se([1,0,2]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OvertypingCapturer=void 0;class k{static{this._maxSelectionLength=51200}constructor(E,y){this._disposables=new d.DisposableStore,this._lastOvertyped=[],this._locked=!1,this._disposables.add(E.onWillType(()=>{if(this._locked||!E.hasModel())return;const m=E.getSelections(),_=m.length;let b=!1;for(let n=0;n<_;n++)if(!m[n].isEmpty()){b=!0;break}if(!b){this._lastOvertyped.length!==0&&(this._lastOvertyped.length=0);return}this._lastOvertyped=[];const p=E.getModel();for(let n=0;n<_;n++){const o=m[n];if(p.getValueLengthInRange(o)>k._maxSelectionLength)return;this._lastOvertyped[n]={value:p.getValueInRange(o),multiline:o.startLineNumber!==o.endLineNumber}}})),this._disposables.add(y.onDidTrigger(m=>{this._locked=!0})),this._disposables.add(y.onDidCancel(m=>{this._locked=!1}))}getLastOvertypedInfo(E){if(E>=0&&E=0?c[l]:c[Math.max(0,~l-1)];let r=n.length;for(const u of n){if(!k.Range.containsRange(u.range,a))break;r-=1}return r}}}}e.WordDistance=E}),define(ne[624],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneTreeSitterParserService=void 0;class d{getParseResult(I){}}e.StandaloneTreeSitterParserService=d}),define(ne[344],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isFuzzyActionArr=d,e.isFuzzyAction=k,e.isString=I,e.isIAction=E,e.empty=y,e.fixCase=m,e.sanitize=_,e.log=b,e.createError=p,e.substituteMatches=n,e.substituteMatchesRe=o,e.findRules=t,e.stateExists=i;function d(s){return Array.isArray(s)}function k(s){return!d(s)}function I(s){return typeof s=="string"}function E(s){return!I(s)}function y(s){return!s}function m(s,g){return s.ignoreCase&&g?g.toLowerCase():g}function _(s){return s.replace(/[&<>'"_]/g,"-")}function b(s,g){console.log(`${s.languageId}: ${g}`)}function p(s,g){return new Error(`${s.languageId}: ${g}`)}function n(s,g,c,l,a){const r=/\$((\$)|(#)|(\d\d?)|[sS](\d\d?)|@(\w+))/g;let u=null;return g.replace(r,function(C,f,h,v,w,S,L,D,T){return y(h)?y(v)?!y(w)&&w0;){const l=s.tokenizer[c];if(l)return l;const a=c.lastIndexOf(".");a<0?c=null:c=c.substr(0,a)}return null}function i(s,g){let c=g;for(;c&&c.length>0;){if(s.stateNames[c])return!0;const a=c.lastIndexOf(".");a<0?c=null:c=c.substr(0,a)}return!1}}),define(ne[625],se([1,0,344]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.compile=t;function k(i,s){if(!s||!Array.isArray(s))return!1;for(const g of s)if(!i(g))return!1;return!0}function I(i,s){return typeof i=="boolean"?i:s}function E(i,s){return typeof i=="string"?i:s}function y(i){const s={};for(const g of i)s[g]=!0;return s}function m(i,s=!1){s&&(i=i.map(function(c){return c.toLowerCase()}));const g=y(i);return s?function(c){return g[c.toLowerCase()]!==void 0&&g.hasOwnProperty(c.toLowerCase())}:function(c){return g[c]!==void 0&&g.hasOwnProperty(c)}}function _(i,s,g){s=s.replace(/@@/g,"");let c=0,l;do l=!1,s=s.replace(/@(\w+)/g,function(r,u){l=!0;let C="";if(typeof i[u]=="string")C=i[u];else if(i[u]&&i[u]instanceof RegExp)C=i[u].source;else throw i[u]===void 0?d.createError(i,"language definition does not contain attribute '"+u+"', used at: "+s):d.createError(i,"attribute reference '"+u+"' must be a string, used at: "+s);return d.empty(C)?"":"(?:"+C+")"}),c++;while(l&&c<5);s=s.replace(/\x01/g,"@");const a=(i.ignoreCase?"i":"")+(i.unicode?"u":"");if(g&&s.match(/\$[sS](\d\d?)/g)){let u=null,C=null;return f=>(C&&u===f||(u=f,C=new RegExp(d.substituteMatchesRe(i,s,f),a)),C)}return new RegExp(s,a)}function b(i,s,g,c){if(c<0)return i;if(c=100){c=c-100;const l=g.split(".");if(l.unshift(g),c=0&&(c.tokenSubst=!0),typeof g.bracket=="string")if(g.bracket==="@open")c.bracket=1;else if(g.bracket==="@close")c.bracket=-1;else throw d.createError(i,"a 'bracket' attribute must be either '@open' or '@close', in rule: "+s);if(g.next){if(typeof g.next!="string")throw d.createError(i,"the next state must be a string value in rule: "+s);{let l=g.next;if(!/^(@pop|@push|@popall)$/.test(l)&&(l[0]==="@"&&(l=l.substr(1)),l.indexOf("$")<0&&!d.stateExists(i,d.substituteMatches(i,l,"",[],""))))throw d.createError(i,"the next state '"+g.next+"' is not defined in rule: "+s);c.next=l}}return typeof g.goBack=="number"&&(c.goBack=g.goBack),typeof g.switchTo=="string"&&(c.switchTo=g.switchTo),typeof g.log=="string"&&(c.log=g.log),typeof g.nextEmbedded=="string"&&(c.nextEmbedded=g.nextEmbedded,i.usesEmbedded=!0),c}}else if(Array.isArray(g)){const c=[];for(let l=0,a=g.length;l0&&c[0]==="^",this.name=this.name+": "+c,this.regex=_(s,"^(?:"+(this.matchOnlyAtLineStart?c.substr(1):c)+")",!0)}setAction(s,g){this.action=n(s,this.name,g)}resolveRegex(s){return this.regex instanceof RegExp?this.regex:this.regex(s)}}function t(i,s){if(!s||typeof s!="object")throw new Error("Monarch: expecting a language definition object");const g={languageId:i,includeLF:I(s.includeLF,!1),noThrow:!1,maxStack:100,start:typeof s.start=="string"?s.start:null,ignoreCase:I(s.ignoreCase,!1),unicode:I(s.unicode,!1),tokenPostfix:E(s.tokenPostfix,"."+i),defaultToken:E(s.defaultToken,"source"),usesEmbedded:!1,stateNames:{},tokenizer:{},brackets:[]},c=s;c.languageId=i,c.includeLF=g.includeLF,c.ignoreCase=g.ignoreCase,c.unicode=g.unicode,c.noThrow=g.noThrow,c.usesEmbedded=g.usesEmbedded,c.stateNames=s.tokenizer,c.defaultToken=g.defaultToken;function l(r,u,C){for(const f of C){let h=f.include;if(h){if(typeof h!="string")throw d.createError(g,"an 'include' attribute must be a string at: "+r);if(h[0]==="@"&&(h=h.substr(1)),!s.tokenizer[h])throw d.createError(g,"include target '"+h+"' is not defined at: "+r);l(r+"."+h,u,s.tokenizer[h])}else{const v=new o(r);if(Array.isArray(f)&&f.length>=1&&f.length<=3)if(v.setRegex(c,f[0]),f.length>=3)if(typeof f[1]=="string")v.setAction(c,{token:f[1],next:f[2]});else if(typeof f[1]=="object"){const w=f[1];w.next=f[2],v.setAction(c,w)}else throw d.createError(g,"a next state as the last element of a rule can only be given if the action is either an object or a string, at: "+r);else v.setAction(c,f[1]);else{if(!f.regex)throw d.createError(g,"a rule must either be an array, or an object with a 'regex' or 'include' field at: "+r);f.name&&typeof f.name=="string"&&(v.name=f.name),f.matchOnlyAtStart&&(v.matchOnlyAtLineStart=I(f.matchOnlyAtLineStart,!1)),v.setRegex(c,f.regex),v.setAction(c,f.action)}u.push(v)}}}if(!s.tokenizer||typeof s.tokenizer!="object")throw d.createError(g,"a language definition must define the 'tokenizer' attribute as an object");g.tokenizer=[];for(const r in s.tokenizer)if(s.tokenizer.hasOwnProperty(r)){g.start||(g.start=r);const u=s.tokenizer[r];g.tokenizer[r]=new Array,l("tokenizer."+r,g.tokenizer[r],u)}if(g.usesEmbedded=c.usesEmbedded,s.brackets){if(!Array.isArray(s.brackets))throw d.createError(g,"the 'brackets' attribute must be defined as an array")}else s.brackets=[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}];const a=[];for(const r of s.brackets){let u=r;if(u&&Array.isArray(u)&&u.length===3&&(u={token:u[2],open:u[0],close:u[1]}),u.open===u.close)throw d.createError(g,"open and close brackets in a 'brackets' attribute must be different: "+u.open+` - hint: use the 'bracket' attribute if matching on equal brackets is required.`);if(typeof u.open=="string"&&typeof u.token=="string"&&typeof u.close=="string")a.push({token:u.token+g.tokenPostfix,open:d.fixCase(g,u.open),close:d.fixCase(g,u.close)});else throw d.createError(g,"every element in the 'brackets' array must be a '{open,close,token}' object or array")}return g.brackets=a,g.noThrow=!0,g}}),define(ne[345],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getNLSMessages=d,e.getNLSLanguage=k;function d(){return globalThis._VSCODE_NLS_MESSAGES}function k(){return globalThis._VSCODE_NLS_LANGUAGE}}),define(ne[3],se([1,0,345,345]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getNLSMessages=e.getNLSLanguage=void 0,e.localize=y,e.localize2=_,Object.defineProperty(e,"getNLSLanguage",{enumerable:!0,get:function(){return k.getNLSLanguage}}),Object.defineProperty(e,"getNLSMessages",{enumerable:!0,get:function(){return k.getNLSMessages}});const I=(0,d.getNLSLanguage)()==="pseudo"||typeof document<"u"&&document.location&&document.location.hash.indexOf("pseudo=true")>=0;function E(b,p){let n;return p.length===0?n=b:n=b.replace(/\{(\d+)\}/g,(o,t)=>{const i=t[0],s=p[i];let g=o;return typeof s=="string"?g=s:(typeof s=="number"||typeof s=="boolean"||s===void 0||s===null)&&(g=String(s)),g}),I&&(n="\uFF3B"+n.replace(/[aouei]/g,"$&$&")+"\uFF3D"),n}function y(b,p,...n){return E(typeof b=="number"?m(b,p):p,n)}function m(b,p){const n=(0,d.getNLSMessages)()?.[b];if(typeof n!="string"){if(typeof p=="string")return p;throw new Error(`!!! NLS MISSING: ${b} !!!`)}return n}function _(b,p,...n){let o;typeof b=="number"?o=m(b,p):o=p;const t=E(o,n);return{value:t,original:p===o?t:E(p,n)}}}),define(ne[41],se([1,0,6,2,3]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EmptySubmenuAction=e.SubmenuAction=e.Separator=e.ActionRunner=e.Action=void 0,e.toAction=p;class E extends k.Disposable{constructor(o,t="",i="",s=!0,g){super(),this._onDidChange=this._register(new d.Emitter),this.onDidChange=this._onDidChange.event,this._enabled=!0,this._id=o,this._label=t,this._cssClass=i,this._enabled=s,this._actionCallback=g}get id(){return this._id}get label(){return this._label}set label(o){this._setLabel(o)}_setLabel(o){this._label!==o&&(this._label=o,this._onDidChange.fire({label:o}))}get tooltip(){return this._tooltip||""}set tooltip(o){this._setTooltip(o)}_setTooltip(o){this._tooltip!==o&&(this._tooltip=o,this._onDidChange.fire({tooltip:o}))}get class(){return this._cssClass}set class(o){this._setClass(o)}_setClass(o){this._cssClass!==o&&(this._cssClass=o,this._onDidChange.fire({class:o}))}get enabled(){return this._enabled}set enabled(o){this._setEnabled(o)}_setEnabled(o){this._enabled!==o&&(this._enabled=o,this._onDidChange.fire({enabled:o}))}get checked(){return this._checked}set checked(o){this._setChecked(o)}_setChecked(o){this._checked!==o&&(this._checked=o,this._onDidChange.fire({checked:o}))}async run(o,t){this._actionCallback&&await this._actionCallback(o)}}e.Action=E;class y extends k.Disposable{constructor(){super(...arguments),this._onWillRun=this._register(new d.Emitter),this.onWillRun=this._onWillRun.event,this._onDidRun=this._register(new d.Emitter),this.onDidRun=this._onDidRun.event}async run(o,t){if(!o.enabled)return;this._onWillRun.fire({action:o});let i;try{await this.runAction(o,t)}catch(s){i=s}this._onDidRun.fire({action:o,error:i})}async runAction(o,t){await o.run(t)}}e.ActionRunner=y;class m{constructor(){this.id=m.ID,this.label="",this.tooltip="",this.class="separator",this.enabled=!1,this.checked=!1}static join(...o){let t=[];for(const i of o)i.length&&(t.length?t=[...t,new m,...i]:t=i);return t}static{this.ID="vs.actions.separator"}async run(){}}e.Separator=m;class _{get actions(){return this._actions}constructor(o,t,i,s){this.tooltip="",this.enabled=!0,this.checked=void 0,this.id=o,this.label=t,this.class=s,this._actions=i}async run(){}}e.SubmenuAction=_;class b extends E{static{this.ID="vs.actions.empty"}constructor(){super(b.ID,I.localize(27,"(empty)"),void 0,!1)}}e.EmptySubmenuAction=b;function p(n){return{id:n.id,label:n.label,tooltip:n.tooltip??n.label,class:n.class,enabled:n.enabled??!0,checked:n.checked,run:async(...o)=>n.run(...o)}}}),define(ne[346],se([1,0,13,19,3]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toErrorMessage=_;function E(b,p){return p&&(b.stack||b.stacktrace)?I.localize(28,"{0}: {1}",m(b),y(b.stack)||y(b.stacktrace)):m(b)}function y(b){return Array.isArray(b)?b.join(` -`):b}function m(b){return b.code==="ERR_UNC_HOST_NOT_ALLOWED"?`${b.message}. Please update the 'security.allowedUNCHosts' setting if you want to allow this host.`:typeof b.code=="string"&&typeof b.errno=="number"&&typeof b.syscall=="string"?I.localize(29,"A system error occurred ({0})",b.message):b.message||I.localize(30,"An unknown error occurred. Please consult the log for more details.")}function _(b=null,p=!1){if(!b)return I.localize(31,"An unknown error occurred. Please consult the log for more details.");if(Array.isArray(b)){const n=d.coalesce(b),o=_(n[0],p);return n.length>1?I.localize(32,"{0} ({1} errors in total)",o,n.length):o}if(k.isString(b))return b;if(b.detail){const n=b.detail;if(n.error)return E(n.error,p);if(n.exception)return E(n.exception,p)}return b.stack?E(b,p):b.message?b.message:I.localize(33,"An unknown error occurred. Please consult the log for more details.")}}),define(ne[247],se([1,0,3]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UserSettingsLabelProvider=e.ElectronAcceleratorLabelProvider=e.AriaLabelProvider=e.UILabelProvider=e.ModifierLabelProvider=void 0;class k{constructor(y,m,_=m){this.modifierLabels=[null],this.modifierLabels[2]=y,this.modifierLabels[1]=m,this.modifierLabels[3]=_}toLabel(y,m,_){if(m.length===0)return null;const b=[];for(let p=0,n=m.length;p=0,I=c.indexOf("Macintosh")>=0,p=(c.indexOf("Macintosh")>=0||c.indexOf("iPad")>=0||c.indexOf("iPhone")>=0)&&!!navigator.maxTouchPoints&&navigator.maxTouchPoints>0,E=c.indexOf("Linux")>=0,o=c?.indexOf("Mobi")>=0,_=!0,i=d.getNLSLanguage()||e.LANGUAGE_DEFAULT,t=navigator.language.toLowerCase(),s=t):console.error("Unable to resolve platform.");let C=0;I?C=1:k?C=3:E&&(C=2),e.isWindows=k,e.isMacintosh=I,e.isLinux=E,e.isNative=m,e.isWeb=_,e.isWebWorker=_&&typeof l.importScripts=="function",e.webWorkerOrigin=e.isWebWorker?l.origin:void 0,e.isIOS=p,e.isMobile=o,e.userAgent=c,e.language=i,e.setTimeout0IsFaster=typeof l.postMessage=="function"&&!l.importScripts,e.setTimeout0=(()=>{if(e.setTimeout0IsFaster){const w=[];l.addEventListener("message",L=>{if(L.data&&L.data.vscodeScheduleAsyncWork)for(let D=0,T=w.length;D{const D=++S;w.push({id:D,callback:L}),l.postMessage({vscodeScheduleAsyncWork:D},"*")}}return w=>setTimeout(w)})(),e.OS=I||p?2:k?1:3;let f=!0,h=!1;function v(){if(!h){h=!0;const w=new Uint8Array(2);w[0]=1,w[1]=2,f=new Uint16Array(w.buffer)[0]===513}return f}e.isChrome=!!(e.userAgent&&e.userAgent.indexOf("Chrome")>=0),e.isFirefox=!!(e.userAgent&&e.userAgent.indexOf("Firefox")>=0),e.isSafari=!!(!e.isChrome&&e.userAgent&&e.userAgent.indexOf("Safari")>=0),e.isEdge=!!(e.userAgent&&e.userAgent.indexOf("Edg/")>=0),e.isAndroid=!!(e.userAgent&&e.userAgent.indexOf("Android")>=0)}),define(ne[248],se([1,0,64,52,16]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BrowserFeatures=void 0,e.BrowserFeatures={clipboard:{writeText:I.isNative||document.queryCommandSupported&&document.queryCommandSupported("copy")||!!(navigator&&navigator.clipboard&&navigator.clipboard.writeText),readText:I.isNative||!!(navigator&&navigator.clipboard&&navigator.clipboard.readText)},keyboard:I.isNative||d.isStandalone()?0:navigator.keyboard||d.isSafari?1:2,touch:"ontouchstart"in k.mainWindow||navigator.maxTouchPoints>0,pointerEvents:k.mainWindow.PointerEvent&&("ontouchstart"in k.mainWindow||navigator.maxTouchPoints>0)}}),define(ne[347],se([1,0,16]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DEFAULT_FONT_FAMILY=void 0,e.DEFAULT_FONT_FAMILY=d.isWindows?'"Segoe WPC", "Segoe UI", sans-serif':d.isMacintosh?"-apple-system, BlinkMacSystemFont, sans-serif":'system-ui, "Ubuntu", "Droid Sans", sans-serif'}),define(ne[47],se([1,0,64,72,140,16]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandardKeyboardEvent=void 0;function y(o){if(o.charCode){const i=String.fromCharCode(o.charCode).toUpperCase();return k.KeyCodeUtils.fromString(i)}const t=o.keyCode;if(t===3)return 7;if(d.isFirefox)switch(t){case 59:return 85;case 60:if(E.isLinux)return 97;break;case 61:return 86;case 107:return 109;case 109:return 111;case 173:return 88;case 224:if(E.isMacintosh)return 57;break}else if(d.isWebKit){if(E.isMacintosh&&t===93)return 57;if(!E.isMacintosh&&t===92)return 57}return k.EVENT_KEY_CODE_MAP[t]||0}const m=E.isMacintosh?256:2048,_=512,b=1024,p=E.isMacintosh?2048:256;class n{constructor(t){this._standardKeyboardEventBrand=!0;const i=t;this.browserEvent=i,this.target=i.target,this.ctrlKey=i.ctrlKey,this.shiftKey=i.shiftKey,this.altKey=i.altKey,this.metaKey=i.metaKey,this.altGraphKey=i.getModifierState?.("AltGraph"),this.keyCode=y(i),this.code=i.code,this.ctrlKey=this.ctrlKey||this.keyCode===5,this.altKey=this.altKey||this.keyCode===6,this.shiftKey=this.shiftKey||this.keyCode===4,this.metaKey=this.metaKey||this.keyCode===57,this._asKeybinding=this._computeKeybinding(),this._asKeyCodeChord=this._computeKeyCodeChord()}preventDefault(){this.browserEvent&&this.browserEvent.preventDefault&&this.browserEvent.preventDefault()}stopPropagation(){this.browserEvent&&this.browserEvent.stopPropagation&&this.browserEvent.stopPropagation()}toKeyCodeChord(){return this._asKeyCodeChord}equals(t){return this._asKeybinding===t}_computeKeybinding(){let t=0;this.keyCode!==5&&this.keyCode!==4&&this.keyCode!==6&&this.keyCode!==57&&(t=this.keyCode);let i=0;return this.ctrlKey&&(i|=m),this.altKey&&(i|=_),this.shiftKey&&(i|=b),this.metaKey&&(i|=p),i|=t,i}_computeKeyCodeChord(){let t=0;return this.keyCode!==5&&this.keyCode!==4&&this.keyCode!==6&&this.keyCode!==57&&(t=this.keyCode),new I.KeyCodeChord(this.ctrlKey,this.shiftKey,this.altKey,this.metaKey,t)}}e.StandardKeyboardEvent=n}),define(ne[77],se([1,0,64,441,16]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandardWheelEvent=e.StandardMouseEvent=void 0;class E{constructor(_,b){this.timestamp=Date.now(),this.browserEvent=b,this.leftButton=b.button===0,this.middleButton=b.button===1,this.rightButton=b.button===2,this.buttons=b.buttons,this.target=b.target,this.detail=b.detail||1,b.type==="dblclick"&&(this.detail=2),this.ctrlKey=b.ctrlKey,this.shiftKey=b.shiftKey,this.altKey=b.altKey,this.metaKey=b.metaKey,typeof b.pageX=="number"?(this.posx=b.pageX,this.posy=b.pageY):(this.posx=b.clientX+this.target.ownerDocument.body.scrollLeft+this.target.ownerDocument.documentElement.scrollLeft,this.posy=b.clientY+this.target.ownerDocument.body.scrollTop+this.target.ownerDocument.documentElement.scrollTop);const p=k.IframeUtils.getPositionOfChildWindowRelativeToAncestorWindow(_,b.view);this.posx-=p.left,this.posy-=p.top}preventDefault(){this.browserEvent.preventDefault()}stopPropagation(){this.browserEvent.stopPropagation()}}e.StandardMouseEvent=E;class y{constructor(_,b=0,p=0){this.browserEvent=_||null,this.target=_?_.target||_.targetNode||_.srcElement:null,this.deltaY=p,this.deltaX=b;let n=!1;if(d.isChrome){const o=navigator.userAgent.match(/Chrome\/(\d+)/);n=(o?parseInt(o[1]):123)<=122}if(_){const o=_,t=_,i=_.view?.devicePixelRatio||1;if(typeof o.wheelDeltaY<"u")n?this.deltaY=o.wheelDeltaY/(120*i):this.deltaY=o.wheelDeltaY/120;else if(typeof t.VERTICAL_AXIS<"u"&&t.axis===t.VERTICAL_AXIS)this.deltaY=-t.detail/3;else if(_.type==="wheel"){const s=_;s.deltaMode===s.DOM_DELTA_LINE?d.isFirefox&&!I.isMacintosh?this.deltaY=-_.deltaY/3:this.deltaY=-_.deltaY:this.deltaY=-_.deltaY/40}if(typeof o.wheelDeltaX<"u")d.isSafari&&I.isWindows?this.deltaX=-(o.wheelDeltaX/120):n?this.deltaX=o.wheelDeltaX/(120*i):this.deltaX=o.wheelDeltaX/120;else if(typeof t.HORIZONTAL_AXIS<"u"&&t.axis===t.HORIZONTAL_AXIS)this.deltaX=-_.detail/3;else if(_.type==="wheel"){const s=_;s.deltaMode===s.DOM_DELTA_LINE?d.isFirefox&&!I.isMacintosh?this.deltaX=-_.deltaX/3:this.deltaX=-_.deltaX:this.deltaX=-_.deltaX/40}this.deltaY===0&&this.deltaX===0&&_.wheelDelta&&(n?this.deltaY=_.wheelDelta/(120*i):this.deltaY=_.wheelDelta/120)}}preventDefault(){this.browserEvent?.preventDefault()}stopPropagation(){this.browserEvent?.stopPropagation()}}e.StandardWheelEvent=y}),define(ne[14],se([1,0,18,8,6,2,16,301]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CancelableAsyncIterableObject=e.AsyncIterableObject=e.Promises=e.DeferredPromise=e.GlobalIdleValue=e.AbstractIdleValue=e._runWhenIdle=e.runWhenGlobalIdle=e.RunOnceScheduler=e.IntervalTimer=e.TimeoutTimer=e.ThrottledDelayer=e.Delayer=e.Throttler=void 0,e.isThenable=_,e.createCancelablePromise=b,e.raceCancellation=p,e.timeout=g,e.disposableTimeout=c,e.first=l,e.createCancelableAsyncIterable=L;function _(D){return!!D&&typeof D.then=="function"}function b(D){const T=new d.CancellationTokenSource,M=D(T.token),A=new Promise((P,N)=>{const O=T.token.onCancellationRequested(()=>{O.dispose(),N(new k.CancellationError)});Promise.resolve(M).then(F=>{O.dispose(),T.dispose(),P(F)},F=>{O.dispose(),T.dispose(),N(F)})});return new class{cancel(){T.cancel(),T.dispose()}then(P,N){return A.then(P,N)}catch(P){return this.then(void 0,P)}finally(P){return A.finally(P)}}}function p(D,T,M){return new Promise((A,P)=>{const N=T.onCancellationRequested(()=>{N.dispose(),A(M)});D.then(A,P).finally(()=>N.dispose())})}class n{constructor(){this.isDisposed=!1,this.activePromise=null,this.queuedPromise=null,this.queuedPromiseFactory=null}queue(T){if(this.isDisposed)return Promise.reject(new Error("Throttler is disposed"));if(this.activePromise){if(this.queuedPromiseFactory=T,!this.queuedPromise){const M=()=>{if(this.queuedPromise=null,this.isDisposed)return;const A=this.queue(this.queuedPromiseFactory);return this.queuedPromiseFactory=null,A};this.queuedPromise=new Promise(A=>{this.activePromise.then(M,M).then(A)})}return new Promise((M,A)=>{this.queuedPromise.then(M,A)})}return this.activePromise=T(),new Promise((M,A)=>{this.activePromise.then(P=>{this.activePromise=null,M(P)},P=>{this.activePromise=null,A(P)})})}dispose(){this.isDisposed=!0}}e.Throttler=n;const o=(D,T)=>{let M=!0;const A=setTimeout(()=>{M=!1,T()},D);return{isTriggered:()=>M,dispose:()=>{clearTimeout(A),M=!1}}},t=D=>{let T=!0;return queueMicrotask(()=>{T&&(T=!1,D())}),{isTriggered:()=>T,dispose:()=>{T=!1}}};class i{constructor(T){this.defaultDelay=T,this.deferred=null,this.completionPromise=null,this.doResolve=null,this.doReject=null,this.task=null}trigger(T,M=this.defaultDelay){this.task=T,this.cancelTimeout(),this.completionPromise||(this.completionPromise=new Promise((P,N)=>{this.doResolve=P,this.doReject=N}).then(()=>{if(this.completionPromise=null,this.doResolve=null,this.task){const P=this.task;return this.task=null,P()}}));const A=()=>{this.deferred=null,this.doResolve?.(null)};return this.deferred=M===m.MicrotaskDelay?t(A):o(M,A),this.completionPromise}isTriggered(){return!!this.deferred?.isTriggered()}cancel(){this.cancelTimeout(),this.completionPromise&&(this.doReject?.(new k.CancellationError),this.completionPromise=null)}cancelTimeout(){this.deferred?.dispose(),this.deferred=null}dispose(){this.cancel()}}e.Delayer=i;class s{constructor(T){this.delayer=new i(T),this.throttler=new n}trigger(T,M){return this.delayer.trigger(()=>this.throttler.queue(T),M)}cancel(){this.delayer.cancel()}dispose(){this.delayer.dispose(),this.throttler.dispose()}}e.ThrottledDelayer=s;function g(D,T){return T?new Promise((M,A)=>{const P=setTimeout(()=>{N.dispose(),M()},D),N=T.onCancellationRequested(()=>{clearTimeout(P),N.dispose(),A(new k.CancellationError)})}):b(M=>g(D,M))}function c(D,T=0,M){const A=setTimeout(()=>{D(),M&&P.dispose()},T),P=(0,E.toDisposable)(()=>{clearTimeout(A),M?.deleteAndLeak(P)});return M?.add(P),P}function l(D,T=A=>!!A,M=null){let A=0;const P=D.length,N=()=>{if(A>=P)return Promise.resolve(M);const O=D[A++];return Promise.resolve(O()).then(x=>T(x)?Promise.resolve(x):N())};return N()}class a{constructor(T,M){this._isDisposed=!1,this._token=-1,typeof T=="function"&&typeof M=="number"&&this.setIfNotSet(T,M)}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._token!==-1&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(T,M){if(this._isDisposed)throw new k.BugIndicatingError("Calling 'cancelAndSet' on a disposed TimeoutTimer");this.cancel(),this._token=setTimeout(()=>{this._token=-1,T()},M)}setIfNotSet(T,M){if(this._isDisposed)throw new k.BugIndicatingError("Calling 'setIfNotSet' on a disposed TimeoutTimer");this._token===-1&&(this._token=setTimeout(()=>{this._token=-1,T()},M))}}e.TimeoutTimer=a;class r{constructor(){this.disposable=void 0,this.isDisposed=!1}cancel(){this.disposable?.dispose(),this.disposable=void 0}cancelAndSet(T,M,A=globalThis){if(this.isDisposed)throw new k.BugIndicatingError("Calling 'cancelAndSet' on a disposed IntervalTimer");this.cancel();const P=A.setInterval(()=>{T()},M);this.disposable=(0,E.toDisposable)(()=>{A.clearInterval(P),this.disposable=void 0})}dispose(){this.cancel(),this.isDisposed=!0}}e.IntervalTimer=r;class u{constructor(T,M){this.timeoutToken=-1,this.runner=T,this.timeout=M,this.timeoutHandler=this.onTimeout.bind(this)}dispose(){this.cancel(),this.runner=null}cancel(){this.isScheduled()&&(clearTimeout(this.timeoutToken),this.timeoutToken=-1)}schedule(T=this.timeout){this.cancel(),this.timeoutToken=setTimeout(this.timeoutHandler,T)}get delay(){return this.timeout}set delay(T){this.timeout=T}isScheduled(){return this.timeoutToken!==-1}onTimeout(){this.timeoutToken=-1,this.runner&&this.doRun()}doRun(){this.runner?.()}}e.RunOnceScheduler=u,function(){typeof globalThis.requestIdleCallback!="function"||typeof globalThis.cancelIdleCallback!="function"?e._runWhenIdle=(D,T)=>{(0,y.setTimeout0)(()=>{if(M)return;const A=Date.now()+15;T(Object.freeze({didTimeout:!0,timeRemaining(){return Math.max(0,A-Date.now())}}))});let M=!1;return{dispose(){M||(M=!0)}}}:e._runWhenIdle=(D,T,M)=>{const A=D.requestIdleCallback(T,typeof M=="number"?{timeout:M}:void 0);let P=!1;return{dispose(){P||(P=!0,D.cancelIdleCallback(A))}}},e.runWhenGlobalIdle=D=>(0,e._runWhenIdle)(globalThis,D)}();class C{constructor(T,M){this._didRun=!1,this._executor=()=>{try{this._value=M()}catch(A){this._error=A}finally{this._didRun=!0}},this._handle=(0,e._runWhenIdle)(T,()=>this._executor())}dispose(){this._handle.dispose()}get value(){if(this._didRun||(this._handle.dispose(),this._executor()),this._error)throw this._error;return this._value}get isInitialized(){return this._didRun}}e.AbstractIdleValue=C;class f extends C{constructor(T){super(globalThis,T)}}e.GlobalIdleValue=f;class h{get isRejected(){return this.outcome?.outcome===1}get isSettled(){return!!this.outcome}constructor(){this.p=new Promise((T,M)=>{this.completeCallback=T,this.errorCallback=M})}complete(T){return new Promise(M=>{this.completeCallback(T),this.outcome={outcome:0,value:T},M()})}error(T){return new Promise(M=>{this.errorCallback(T),this.outcome={outcome:1,value:T},M()})}cancel(){return this.error(new k.CancellationError)}}e.DeferredPromise=h;var v;(function(D){async function T(A){let P;const N=await Promise.all(A.map(O=>O.then(F=>F,F=>{P||(P=F)})));if(typeof P<"u")throw P;return N}D.settled=T;function M(A){return new Promise(async(P,N)=>{try{await A(P,N)}catch(O){N(O)}})}D.withAsyncBody=M})(v||(e.Promises=v={}));class w{static fromArray(T){return new w(M=>{M.emitMany(T)})}static fromPromise(T){return new w(async M=>{M.emitMany(await T)})}static fromPromises(T){return new w(async M=>{await Promise.all(T.map(async A=>M.emitOne(await A)))})}static merge(T){return new w(async M=>{await Promise.all(T.map(async A=>{for await(const P of A)M.emitOne(P)}))})}static{this.EMPTY=w.fromArray([])}constructor(T,M){this._state=0,this._results=[],this._error=null,this._onReturn=M,this._onStateChanged=new I.Emitter,queueMicrotask(async()=>{const A={emitOne:P=>this.emitOne(P),emitMany:P=>this.emitMany(P),reject:P=>this.reject(P)};try{await Promise.resolve(T(A)),this.resolve()}catch(P){this.reject(P)}finally{A.emitOne=void 0,A.emitMany=void 0,A.reject=void 0}})}[Symbol.asyncIterator](){let T=0;return{next:async()=>{do{if(this._state===2)throw this._error;if(T(this._onReturn?.(),{done:!0,value:void 0})}}static map(T,M){return new w(async A=>{for await(const P of T)A.emitOne(M(P))})}map(T){return w.map(this,T)}static filter(T,M){return new w(async A=>{for await(const P of T)M(P)&&A.emitOne(P)})}filter(T){return w.filter(this,T)}static coalesce(T){return w.filter(T,M=>!!M)}coalesce(){return w.coalesce(this)}static async toPromise(T){const M=[];for await(const A of T)M.push(A);return M}toPromise(){return w.toPromise(this)}emitOne(T){this._state===0&&(this._results.push(T),this._onStateChanged.fire())}emitMany(T){this._state===0&&(this._results=this._results.concat(T),this._onStateChanged.fire())}resolve(){this._state===0&&(this._state=1,this._onStateChanged.fire())}reject(T){this._state===0&&(this._state=2,this._error=T,this._onStateChanged.fire())}}e.AsyncIterableObject=w;class S extends w{constructor(T,M){super(M),this._source=T}cancel(){this._source.cancel()}}e.CancelableAsyncIterableObject=S;function L(D){const T=new d.CancellationTokenSource,M=D(T.token);return new S(T,async A=>{const P=T.token.onCancellationRequested(()=>{P.dispose(),T.dispose(),A.reject(new k.CancellationError)});try{for await(const N of M){if(T.token.isCancellationRequested)return;A.emitOne(N)}P.dispose(),T.dispose()}catch(N){P.dispose(),T.dispose(),A.reject(N)}})}}),define(ne[626],se([1,0,14,2]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ScrollbarVisibilityController=void 0;class I extends k.Disposable{constructor(y,m,_){super(),this._visibility=y,this._visibleClassName=m,this._invisibleClassName=_,this._domNode=null,this._isVisible=!1,this._isNeeded=!1,this._rawShouldBeVisible=!1,this._shouldBeVisible=!1,this._revealTimer=this._register(new d.TimeoutTimer)}setVisibility(y){this._visibility!==y&&(this._visibility=y,this._updateShouldBeVisible())}setShouldBeVisible(y){this._rawShouldBeVisible=y,this._updateShouldBeVisible()}_applyVisibilitySetting(){return this._visibility===2?!1:this._visibility===3?!0:this._rawShouldBeVisible}_updateShouldBeVisible(){const y=this._applyVisibilitySetting();this._shouldBeVisible!==y&&(this._shouldBeVisible=y,this.ensureVisibility())}setIsNeeded(y){this._isNeeded!==y&&(this._isNeeded=y,this.ensureVisibility())}setDomNode(y){this._domNode=y,this._domNode.setClassName(this._invisibleClassName),this.setShouldBeVisible(!1)}ensureVisibility(){if(!this._isNeeded){this._hide(!1);return}this._shouldBeVisible?this._reveal():this._hide(!0)}_reveal(){this._isVisible||(this._isVisible=!0,this._revealTimer.setIfNotSet(()=>{this._domNode?.setClassName(this._visibleClassName)},0))}_hide(y){this._revealTimer.cancel(),this._isVisible&&(this._isVisible=!1,this._domNode?.setClassName(this._invisibleClassName+(y?" fade":"")))}}e.ScrollbarVisibilityController=I}),define(ne[249],se([1,0,159,13,14,301,190,6,53]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IndexTreeModel=void 0,e.isFilterResult=b,e.getVisibleState=p;function b(t){return typeof t=="object"&&"visibility"in t&&"data"in t}function p(t){switch(t){case!0:return 1;case!1:return 0;default:return t}}function n(t){return typeof t.collapsible=="boolean"}class o{constructor(i,s,g,c={}){this.user=i,this.list=s,this.rootRef=[],this.eventBufferer=new m.EventBufferer,this._onDidChangeCollapseState=new m.Emitter,this.onDidChangeCollapseState=this.eventBufferer.wrapEvent(this._onDidChangeCollapseState.event),this._onDidChangeRenderNodeCount=new m.Emitter,this.onDidChangeRenderNodeCount=this.eventBufferer.wrapEvent(this._onDidChangeRenderNodeCount.event),this._onDidSplice=new m.Emitter,this.onDidSplice=this._onDidSplice.event,this.refilterDelayer=new I.Delayer(E.MicrotaskDelay),this.collapseByDefault=typeof c.collapseByDefault>"u"?!1:c.collapseByDefault,this.allowNonCollapsibleParents=c.allowNonCollapsibleParents??!1,this.filter=c.filter,this.autoExpandSingleChildren=typeof c.autoExpandSingleChildren>"u"?!1:c.autoExpandSingleChildren,this.root={parent:void 0,element:g,children:[],depth:0,visibleChildrenCount:0,visibleChildIndex:-1,collapsible:!1,collapsed:!1,renderNodeCount:0,visibility:1,visible:!0,filterData:void 0}}splice(i,s,g=_.Iterable.empty(),c={}){if(i.length===0)throw new d.TreeError(this.user,"Invalid tree location");c.diffIdentityProvider?this.spliceSmart(c.diffIdentityProvider,i,s,g,c):this.spliceSimple(i,s,g,c)}spliceSmart(i,s,g,c=_.Iterable.empty(),l,a=l.diffDepth??0){const{parentNode:r}=this.getParentNodeWithListIndex(s);if(!r.lastDiffIds)return this.spliceSimple(s,g,c,l);const u=[...c],C=s[s.length-1],f=new y.LcsDiff({getElements:()=>r.lastDiffIds},{getElements:()=>[...r.children.slice(0,C),...u,...r.children.slice(C+g)].map(L=>i.getId(L.element).toString())}).ComputeDiff(!1);if(f.quitEarly)return r.lastDiffIds=void 0,this.spliceSimple(s,g,u,l);const h=s.slice(0,-1),v=(L,D,T)=>{if(a>0)for(let M=0;MT.originalStart-D.originalStart))v(w,S,w-(L.originalStart+L.originalLength)),w=L.originalStart,S=L.modifiedStart-C,this.spliceSimple([...h,w],L.originalLength,_.Iterable.slice(u,S,S+L.modifiedLength),l);v(w,S,w)}spliceSimple(i,s,g=_.Iterable.empty(),{onDidCreateNode:c,onDidDeleteNode:l,diffIdentityProvider:a}){const{parentNode:r,listIndex:u,revealed:C,visible:f}=this.getParentNodeWithListIndex(i),h=[],v=_.Iterable.map(g,N=>this.createTreeNode(N,r,r.visible?1:0,C,h,c)),w=i[i.length-1];let S=0;for(let N=w;N>=0&&Na.getId(N.element).toString())):r.lastDiffIds=r.children.map(N=>a.getId(N.element).toString()):r.lastDiffIds=void 0;let A=0;for(const N of M)N.visible&&A++;if(A!==0)for(let N=w+L.length;NO+(F.visible?F.renderNodeCount:0),0);this._updateAncestorsRenderNodeCount(r,T-N),this.list.splice(u,N,h)}if(M.length>0&&l){const N=O=>{l(O),O.children.forEach(N)};M.forEach(N)}this._onDidSplice.fire({insertedNodes:L,deletedNodes:M});let P=r;for(;P;){if(P.visibility===2){this.refilterDelayer.trigger(()=>this.refilter());break}P=P.parent}}rerender(i){if(i.length===0)throw new d.TreeError(this.user,"Invalid tree location");const{node:s,listIndex:g,revealed:c}=this.getTreeNodeWithListIndex(i);s.visible&&c&&this.list.splice(g,1,[s])}has(i){return this.hasTreeNode(i)}getListIndex(i){const{listIndex:s,visible:g,revealed:c}=this.getTreeNodeWithListIndex(i);return g&&c?s:-1}getListRenderCount(i){return this.getTreeNode(i).renderNodeCount}isCollapsible(i){return this.getTreeNode(i).collapsible}setCollapsible(i,s){const g=this.getTreeNode(i);typeof s>"u"&&(s=!g.collapsible);const c={collapsible:s};return this.eventBufferer.bufferEvents(()=>this._setCollapseState(i,c))}isCollapsed(i){return this.getTreeNode(i).collapsed}setCollapsed(i,s,g){const c=this.getTreeNode(i);typeof s>"u"&&(s=!c.collapsed);const l={collapsed:s,recursive:g||!1};return this.eventBufferer.bufferEvents(()=>this._setCollapseState(i,l))}_setCollapseState(i,s){const{node:g,listIndex:c,revealed:l}=this.getTreeNodeWithListIndex(i),a=this._setListNodeCollapseState(g,c,l,s);if(g!==this.root&&this.autoExpandSingleChildren&&a&&!n(s)&&g.collapsible&&!g.collapsed&&!s.recursive){let r=-1;for(let u=0;u-1){r=-1;break}else r=u;r>-1&&this._setCollapseState([...i,r],s)}return a}_setListNodeCollapseState(i,s,g,c){const l=this._setNodeCollapseState(i,c,!1);if(!g||!i.visible||!l)return l;const a=i.renderNodeCount,r=this.updateNodeAfterCollapseChange(i),u=a-(s===-1?0:1);return this.list.splice(s+1,u,r.slice(1)),l}_setNodeCollapseState(i,s,g){let c;if(i===this.root?c=!1:(n(s)?(c=i.collapsible!==s.collapsible,i.collapsible=s.collapsible):i.collapsible?(c=i.collapsed!==s.collapsed,i.collapsed=s.collapsed):c=!1,c&&this._onDidChangeCollapseState.fire({node:i,deep:g})),!n(s)&&s.recursive)for(const l of i.children)c=this._setNodeCollapseState(l,s,!0)||c;return c}expandTo(i){this.eventBufferer.bufferEvents(()=>{let s=this.getTreeNode(i);for(;s.parent;)s=s.parent,i=i.slice(0,i.length-1),s.collapsed&&this._setCollapseState(i,{collapsed:!1,recursive:!1})})}refilter(){const i=this.root.renderNodeCount,s=this.updateNodeAfterFilterChange(this.root);this.list.splice(0,i,s),this.refilterDelayer.cancel()}createTreeNode(i,s,g,c,l,a){const r={parent:s,element:i.element,children:[],depth:s.depth+1,visibleChildrenCount:0,visibleChildIndex:-1,collapsible:typeof i.collapsible=="boolean"?i.collapsible:typeof i.collapsed<"u",collapsed:typeof i.collapsed>"u"?this.collapseByDefault:i.collapsed,renderNodeCount:1,visibility:1,visible:!0,filterData:void 0},u=this._filterNode(r,g);r.visibility=u,c&&l.push(r);const C=i.children||_.Iterable.empty(),f=c&&u!==0&&!r.collapsed;let h=0,v=1;for(const w of C){const S=this.createTreeNode(w,r,u,f,l,a);r.children.push(S),v+=S.renderNodeCount,S.visible&&(S.visibleChildIndex=h++)}return this.allowNonCollapsibleParents||(r.collapsible=r.collapsible||r.children.length>0),r.visibleChildrenCount=h,r.visible=u===2?h>0:u===1,r.visible?r.collapsed||(r.renderNodeCount=v):(r.renderNodeCount=0,c&&l.pop()),a?.(r),r}updateNodeAfterCollapseChange(i){const s=i.renderNodeCount,g=[];return this._updateNodeAfterCollapseChange(i,g),this._updateAncestorsRenderNodeCount(i.parent,g.length-s),g}_updateNodeAfterCollapseChange(i,s){if(i.visible===!1)return 0;if(s.push(i),i.renderNodeCount=1,!i.collapsed)for(const g of i.children)i.renderNodeCount+=this._updateNodeAfterCollapseChange(g,s);return this._onDidChangeRenderNodeCount.fire(i),i.renderNodeCount}updateNodeAfterFilterChange(i){const s=i.renderNodeCount,g=[];return this._updateNodeAfterFilterChange(i,i.visible?1:0,g),this._updateAncestorsRenderNodeCount(i.parent,g.length-s),g}_updateNodeAfterFilterChange(i,s,g,c=!0){let l;if(i!==this.root){if(l=this._filterNode(i,s),l===0)return i.visible=!1,i.renderNodeCount=0,!1;c&&g.push(i)}const a=g.length;i.renderNodeCount=i===this.root?0:1;let r=!1;if(!i.collapsed||l!==0){let u=0;for(const C of i.children)r=this._updateNodeAfterFilterChange(C,l,g,c&&!i.collapsed)||r,C.visible&&(C.visibleChildIndex=u++);i.visibleChildrenCount=u}else i.visibleChildrenCount=0;return i!==this.root&&(i.visible=l===2?r:l===1,i.visibility=l),i.visible?i.collapsed||(i.renderNodeCount+=g.length-a):(i.renderNodeCount=0,c&&g.pop()),this._onDidChangeRenderNodeCount.fire(i),i.visible}_updateAncestorsRenderNodeCount(i,s){if(s!==0)for(;i;)i.renderNodeCount+=s,this._onDidChangeRenderNodeCount.fire(i),i=i.parent}_filterNode(i,s){const g=this.filter?this.filter.filter(i.element,s):1;return typeof g=="boolean"?(i.filterData=void 0,g?1:0):b(g)?(i.filterData=g.data,p(g.visibility)):(i.filterData=void 0,p(g))}hasTreeNode(i,s=this.root){if(!i||i.length===0)return!0;const[g,...c]=i;return g<0||g>s.children.length?!1:this.hasTreeNode(c,s.children[g])}getTreeNode(i,s=this.root){if(!i||i.length===0)return s;const[g,...c]=i;if(g<0||g>s.children.length)throw new d.TreeError(this.user,"Invalid tree location");return this.getTreeNode(c,s.children[g])}getTreeNodeWithListIndex(i){if(i.length===0)return{node:this.root,listIndex:-1,revealed:!0,visible:!1};const{parentNode:s,listIndex:g,revealed:c,visible:l}=this.getParentNodeWithListIndex(i),a=i[i.length-1];if(a<0||a>s.children.length)throw new d.TreeError(this.user,"Invalid tree location");const r=s.children[a];return{node:r,listIndex:g,revealed:c,visible:l&&r.visible}}getParentNodeWithListIndex(i,s=this.root,g=0,c=!0,l=!0){const[a,...r]=i;if(a<0||a>s.children.length)throw new d.TreeError(this.user,"Invalid tree location");for(let u=0;u{if(i.element===null)return;const s=i;if(p.add(s.element),this.nodes.set(s.element,s),this.identityProvider){const g=this.identityProvider.getId(s.element).toString();n.add(g),this.nodesByIdentity.set(g,s)}b.onDidCreateNode?.(s)},t=i=>{if(i.element===null)return;const s=i;if(p.has(s.element)||this.nodes.delete(s.element),this.identityProvider){const g=this.identityProvider.getId(s.element).toString();n.has(g)||this.nodesByIdentity.delete(g)}b.onDidDeleteNode?.(s)};this.model.splice([...m,0],Number.MAX_VALUE,_,{...b,onDidCreateNode:o,onDidDeleteNode:t})}preserveCollapseState(m=I.Iterable.empty()){return this.sorter&&(m=[...m].sort(this.sorter.compare.bind(this.sorter))),I.Iterable.map(m,_=>{let b=this.nodes.get(_.element);if(!b&&this.identityProvider){const o=this.identityProvider.getId(_.element).toString();b=this.nodesByIdentity.get(o)}if(!b){let o;return typeof _.collapsed>"u"?o=void 0:_.collapsed===k.ObjectTreeElementCollapseState.Collapsed||_.collapsed===k.ObjectTreeElementCollapseState.PreserveOrCollapsed?o=!0:_.collapsed===k.ObjectTreeElementCollapseState.Expanded||_.collapsed===k.ObjectTreeElementCollapseState.PreserveOrExpanded?o=!1:o=!!_.collapsed,{..._,children:this.preserveCollapseState(_.children),collapsed:o}}const p=typeof _.collapsible=="boolean"?_.collapsible:b.collapsible;let n;return typeof _.collapsed>"u"||_.collapsed===k.ObjectTreeElementCollapseState.PreserveOrCollapsed||_.collapsed===k.ObjectTreeElementCollapseState.PreserveOrExpanded?n=b.collapsed:_.collapsed===k.ObjectTreeElementCollapseState.Collapsed?n=!0:_.collapsed===k.ObjectTreeElementCollapseState.Expanded?n=!1:n=!!_.collapsed,{..._,collapsible:p,collapsed:n,children:this.preserveCollapseState(_.children)}})}rerender(m){const _=this.getElementLocation(m);this.model.rerender(_)}getFirstElementChild(m=null){const _=this.getElementLocation(m);return this.model.getFirstElementChild(_)}has(m){return this.nodes.has(m)}getListIndex(m){const _=this.getElementLocation(m);return this.model.getListIndex(_)}getListRenderCount(m){const _=this.getElementLocation(m);return this.model.getListRenderCount(_)}isCollapsible(m){const _=this.getElementLocation(m);return this.model.isCollapsible(_)}setCollapsible(m,_){const b=this.getElementLocation(m);return this.model.setCollapsible(b,_)}isCollapsed(m){const _=this.getElementLocation(m);return this.model.isCollapsed(_)}setCollapsed(m,_,b){const p=this.getElementLocation(m);return this.model.setCollapsed(p,_,b)}expandTo(m){const _=this.getElementLocation(m);this.model.expandTo(_)}refilter(){this.model.refilter()}getNode(m=null){if(m===null)return this.model.getNode(this.model.rootRef);const _=this.nodes.get(m);if(!_)throw new k.TreeError(this.user,`Tree element not found: ${m}`);return _}getNodeLocation(m){return m.element}getParentNodeLocation(m){if(m===null)throw new k.TreeError(this.user,"Invalid getParentNodeLocation call");const _=this.nodes.get(m);if(!_)throw new k.TreeError(this.user,`Tree element not found: ${m}`);const b=this.model.getNodeLocation(_),p=this.model.getParentNodeLocation(b);return this.model.getNode(p).element}getElementLocation(m){if(m===null)return[];const _=this.nodes.get(m);if(!_)throw new k.TreeError(this.user,`Tree element not found: ${m}`);return this.model.getNodeLocation(_)}}e.ObjectTreeModel=E}),define(ne[627],se([1,0,250,159,13,6,53]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompressibleObjectTreeModel=e.DefaultElementMapper=e.CompressedObjectTreeModel=void 0,e.compress=_,e.decompress=p;function m(a){const r=[a.element],u=a.incompressible||!1;return{element:{elements:r,incompressible:u},children:y.Iterable.map(y.Iterable.from(a.children),m),collapsible:a.collapsible,collapsed:a.collapsed}}function _(a){const r=[a.element],u=a.incompressible||!1;let C,f;for(;[f,C]=y.Iterable.consume(y.Iterable.from(a.children),2),!(f.length!==1||f[0].incompressible);)a=f[0],r.push(a.element);return{element:{elements:r,incompressible:u},children:y.Iterable.map(y.Iterable.concat(f,C),_),collapsible:a.collapsible,collapsed:a.collapsed}}function b(a,r=0){let u;return rb(C,0)),r===0&&a.element.incompressible?{element:a.element.elements[r],children:u,incompressible:!0,collapsible:a.collapsible,collapsed:a.collapsed}:{element:a.element.elements[r],children:u,collapsible:a.collapsible,collapsed:a.collapsed}}function p(a){return b(a,0)}function n(a,r,u){return a.element===r?{...a,children:u}:{...a,children:y.Iterable.map(y.Iterable.from(a.children),C=>n(C,r,u))}}const o=a=>({getId(r){return r.elements.map(u=>a.getId(u).toString()).join("\0")}});class t{get onDidSplice(){return this.model.onDidSplice}get onDidChangeCollapseState(){return this.model.onDidChangeCollapseState}get onDidChangeRenderNodeCount(){return this.model.onDidChangeRenderNodeCount}constructor(r,u,C={}){this.user=r,this.rootRef=null,this.nodes=new Map,this.model=new d.ObjectTreeModel(r,u,C),this.enabled=typeof C.compressionEnabled>"u"?!0:C.compressionEnabled,this.identityProvider=C.identityProvider}setChildren(r,u=y.Iterable.empty(),C){const f=C.diffIdentityProvider&&o(C.diffIdentityProvider);if(r===null){const P=y.Iterable.map(u,this.enabled?_:m);this._setChildren(null,P,{diffIdentityProvider:f,diffDepth:1/0});return}const h=this.nodes.get(r);if(!h)throw new k.TreeError(this.user,"Unknown compressed tree node");const v=this.model.getNode(h),w=this.model.getParentNodeLocation(h),S=this.model.getNode(w),L=p(v),D=n(L,r,u),T=(this.enabled?_:m)(D),M=C.diffIdentityProvider?(P,N)=>C.diffIdentityProvider.getId(P)===C.diffIdentityProvider.getId(N):void 0;if((0,I.equals)(T.element.elements,v.element.elements,M)){this._setChildren(h,T.children||y.Iterable.empty(),{diffIdentityProvider:f,diffDepth:1});return}const A=S.children.map(P=>P===v?T:P);this._setChildren(S.element,A,{diffIdentityProvider:f,diffDepth:v.depth-S.depth})}isCompressionEnabled(){return this.enabled}setCompressionEnabled(r){if(r===this.enabled)return;this.enabled=r;const C=this.model.getNode().children,f=y.Iterable.map(C,p),h=y.Iterable.map(f,r?_:m);this._setChildren(null,h,{diffIdentityProvider:this.identityProvider,diffDepth:1/0})}_setChildren(r,u,C){const f=new Set,h=w=>{for(const S of w.element.elements)f.add(S),this.nodes.set(S,w.element)},v=w=>{for(const S of w.element.elements)f.has(S)||this.nodes.delete(S)};this.model.setChildren(r,u,{...C,onDidCreateNode:h,onDidDeleteNode:v})}has(r){return this.nodes.has(r)}getListIndex(r){const u=this.getCompressedNode(r);return this.model.getListIndex(u)}getListRenderCount(r){const u=this.getCompressedNode(r);return this.model.getListRenderCount(u)}getNode(r){if(typeof r>"u")return this.model.getNode();const u=this.getCompressedNode(r);return this.model.getNode(u)}getNodeLocation(r){const u=this.model.getNodeLocation(r);return u===null?null:u.elements[u.elements.length-1]}getParentNodeLocation(r){const u=this.getCompressedNode(r),C=this.model.getParentNodeLocation(u);return C===null?null:C.elements[C.elements.length-1]}getFirstElementChild(r){const u=this.getCompressedNode(r);return this.model.getFirstElementChild(u)}isCollapsible(r){const u=this.getCompressedNode(r);return this.model.isCollapsible(u)}setCollapsible(r,u){const C=this.getCompressedNode(r);return this.model.setCollapsible(C,u)}isCollapsed(r){const u=this.getCompressedNode(r);return this.model.isCollapsed(u)}setCollapsed(r,u,C){const f=this.getCompressedNode(r);return this.model.setCollapsed(f,u,C)}expandTo(r){const u=this.getCompressedNode(r);this.model.expandTo(u)}rerender(r){const u=this.getCompressedNode(r);this.model.rerender(u)}refilter(){this.model.refilter()}getCompressedNode(r){if(r===null)return null;const u=this.nodes.get(r);if(!u)throw new k.TreeError(this.user,`Tree element not found: ${r}`);return u}}e.CompressedObjectTreeModel=t;const i=a=>a[a.length-1];e.DefaultElementMapper=i;class s{get element(){return this.node.element===null?null:this.unwrapper(this.node.element)}get children(){return this.node.children.map(r=>new s(this.unwrapper,r))}get depth(){return this.node.depth}get visibleChildrenCount(){return this.node.visibleChildrenCount}get visibleChildIndex(){return this.node.visibleChildIndex}get collapsible(){return this.node.collapsible}get collapsed(){return this.node.collapsed}get visible(){return this.node.visible}get filterData(){return this.node.filterData}constructor(r,u){this.unwrapper=r,this.node=u}}function g(a,r){return{splice(u,C,f){r.splice(u,C,f.map(h=>a.map(h)))},updateElementHeight(u,C){r.updateElementHeight(u,C)}}}function c(a,r){return{...r,identityProvider:r.identityProvider&&{getId(u){return r.identityProvider.getId(a(u))}},sorter:r.sorter&&{compare(u,C){return r.sorter.compare(u.elements[0],C.elements[0])}},filter:r.filter&&{filter(u,C){return r.filter.filter(a(u),C)}}}}class l{get onDidSplice(){return E.Event.map(this.model.onDidSplice,({insertedNodes:r,deletedNodes:u})=>({insertedNodes:r.map(C=>this.nodeMapper.map(C)),deletedNodes:u.map(C=>this.nodeMapper.map(C))}))}get onDidChangeCollapseState(){return E.Event.map(this.model.onDidChangeCollapseState,({node:r,deep:u})=>({node:this.nodeMapper.map(r),deep:u}))}get onDidChangeRenderNodeCount(){return E.Event.map(this.model.onDidChangeRenderNodeCount,r=>this.nodeMapper.map(r))}constructor(r,u,C={}){this.rootRef=null,this.elementMapper=C.elementMapper||e.DefaultElementMapper;const f=h=>this.elementMapper(h.elements);this.nodeMapper=new k.WeakMapper(h=>new s(f,h)),this.model=new t(r,g(this.nodeMapper,u),c(f,C))}setChildren(r,u=y.Iterable.empty(),C={}){this.model.setChildren(r,u,C)}isCompressionEnabled(){return this.model.isCompressionEnabled()}setCompressionEnabled(r){this.model.setCompressionEnabled(r)}has(r){return this.model.has(r)}getListIndex(r){return this.model.getListIndex(r)}getListRenderCount(r){return this.model.getListRenderCount(r)}getNode(r){return this.nodeMapper.map(this.model.getNode(r))}getNodeLocation(r){return r.element}getParentNodeLocation(r){return this.model.getParentNodeLocation(r)}getFirstElementChild(r){const u=this.model.getFirstElementChild(r);return u===null||typeof u>"u"?u:this.elementMapper(u.elements)}isCollapsible(r){return this.model.isCollapsible(r)}setCollapsible(r,u){return this.model.setCollapsible(r,u)}isCollapsed(r){return this.model.isCollapsed(r)}setCollapsed(r,u,C){return this.model.setCollapsed(r,u,C)}expandTo(r){return this.model.expandTo(r)}rerender(r){return this.model.rerender(r)}refilter(){return this.model.refilter()}getCompressedTreeNode(r=null){return this.model.getNode(r)}}e.CompressibleObjectTreeModel=l}),define(ne[348],se([1,0,16]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.platform=e.env=e.cwd=void 0;let k;const I=globalThis.vscode;if(typeof I<"u"&&typeof I.process<"u"){const E=I.process;k={get platform(){return E.platform},get arch(){return E.arch},get env(){return E.env},cwd(){return E.cwd()}}}else typeof process<"u"&&typeof process?.versions?.node=="string"?k={get platform(){return process.platform},get arch(){return process.arch},get env(){return process.env},cwd(){return process.env.VSCODE_CWD||process.cwd()}}:k={get platform(){return d.isWindows?"win32":d.isMacintosh?"darwin":"linux"},get arch(){},get env(){return{}},cwd(){return"/"}};e.cwd=k.cwd,e.env=k.env,e.platform=k.platform}),define(ne[349],se([1,0,348]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isHotReloadEnabled=k,e.registerHotReloadHandler=I;function k(){return d.env&&!!d.env.VSCODE_DEV}function I(m){if(k()){const _=E();return _.add(m),{dispose(){_.delete(m)}}}else return{dispose(){}}}function E(){y||(y=new Set);const m=globalThis;return m.$hotReload_applyNewExports||(m.$hotReload_applyNewExports=_=>{const b={config:{mode:void 0},..._},p=[];for(const n of y){const o=n(b);o&&p.push(o)}if(p.length>0)return n=>{let o=!1;for(const t of p)t(n)&&(o=!0);return o}}),y}let y;k()&&I(({oldExports:m,newSrc:_,config:b})=>{if(b.mode==="patch-prototype")return p=>{for(const n in p){const o=p[n];if(console.log(`[hot-reload] Patching prototype methods of '${n}'`,{exportedItem:o}),typeof o=="function"&&o.prototype){const t=m[n];if(t){for(const i of Object.getOwnPropertyNames(o.prototype)){const s=Object.getOwnPropertyDescriptor(o.prototype,i),g=Object.getOwnPropertyDescriptor(t.prototype,i);s?.value?.toString()!==g?.value?.toString()&&console.log(`[hot-reload] Patching prototype method '${n}.${i}'`),Object.defineProperty(t.prototype,i,s)}p[n]=t}}}return!0}})}),define(ne[171],se([1,0,349,21]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.readHotReloadableExport=I,e.observeHotReloadableExports=E;function I(y,m){return E([y],m),y}function E(y,m){(0,d.isHotReloadEnabled)()&&(0,k.observableSignalFromEvent)("reload",b=>(0,d.registerHotReloadHandler)(({oldExports:p})=>{if([...Object.values(p)].some(n=>y.includes(n)))return n=>(b(void 0),!0)})).read(m)}}),define(ne[99],se([1,0,348]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.sep=e.extname=e.basename=e.dirname=e.relative=e.resolve=e.join=e.normalize=e.posix=e.win32=void 0;const k=65,I=97,E=90,y=122,m=46,_=47,b=92,p=58,n=63;class o extends Error{constructor(h,v,w){let S;typeof v=="string"&&v.indexOf("not ")===0?(S="must not be",v=v.replace(/^not /,"")):S="must be";const L=h.indexOf(".")!==-1?"property":"argument";let D=`The "${h}" ${L} ${S} of type ${v}`;D+=`. Received type ${typeof w}`,super(D),this.code="ERR_INVALID_ARG_TYPE"}}function t(f,h){if(f===null||typeof f!="object")throw new o(h,"Object",f)}function i(f,h){if(typeof f!="string")throw new o(h,"string",f)}const s=d.platform==="win32";function g(f){return f===_||f===b}function c(f){return f===_}function l(f){return f>=k&&f<=E||f>=I&&f<=y}function a(f,h,v,w){let S="",L=0,D=-1,T=0,M=0;for(let A=0;A<=f.length;++A){if(A2){const P=S.lastIndexOf(v);P===-1?(S="",L=0):(S=S.slice(0,P),L=S.length-1-S.lastIndexOf(v)),D=A,T=0;continue}else if(S.length!==0){S="",L=0,D=A,T=0;continue}}h&&(S+=S.length>0?`${v}..`:"..",L=2)}else S.length>0?S+=`${v}${f.slice(D+1,A)}`:S=f.slice(D+1,A),L=A-D-1;D=A,T=0}else M===m&&T!==-1?++T:T=-1}return S}function r(f){return f?`${f[0]==="."?"":"."}${f}`:""}function u(f,h){t(h,"pathObject");const v=h.dir||h.root,w=h.base||`${h.name||""}${r(h.ext)}`;return v?v===h.root?`${v}${w}`:`${v}${f}${w}`:w}e.win32={resolve(...f){let h="",v="",w=!1;for(let S=f.length-1;S>=-1;S--){let L;if(S>=0){if(L=f[S],i(L,`paths[${S}]`),L.length===0)continue}else h.length===0?L=d.cwd():(L=d.env[`=${h}`]||d.cwd(),(L===void 0||L.slice(0,2).toLowerCase()!==h.toLowerCase()&&L.charCodeAt(2)===b)&&(L=`${h}\\`));const D=L.length;let T=0,M="",A=!1;const P=L.charCodeAt(0);if(D===1)g(P)&&(T=1,A=!0);else if(g(P))if(A=!0,g(L.charCodeAt(1))){let N=2,O=N;for(;N2&&g(L.charCodeAt(2))&&(A=!0,T=3));if(M.length>0)if(h.length>0){if(M.toLowerCase()!==h.toLowerCase())continue}else h=M;if(w){if(h.length>0)break}else if(v=`${L.slice(T)}\\${v}`,w=A,A&&h.length>0)break}return v=a(v,!w,"\\",g),w?`${h}\\${v}`:`${h}${v}`||"."},normalize(f){i(f,"path");const h=f.length;if(h===0)return".";let v=0,w,S=!1;const L=f.charCodeAt(0);if(h===1)return c(L)?"\\":f;if(g(L))if(S=!0,g(f.charCodeAt(1))){let T=2,M=T;for(;T2&&g(f.charCodeAt(2))&&(S=!0,v=3));let D=v0&&g(f.charCodeAt(h-1))&&(D+="\\"),w===void 0?S?`\\${D}`:D:S?`${w}\\${D}`:`${w}${D}`},isAbsolute(f){i(f,"path");const h=f.length;if(h===0)return!1;const v=f.charCodeAt(0);return g(v)||h>2&&l(v)&&f.charCodeAt(1)===p&&g(f.charCodeAt(2))},join(...f){if(f.length===0)return".";let h,v;for(let L=0;L0&&(h===void 0?h=v=D:h+=`\\${D}`)}if(h===void 0)return".";let w=!0,S=0;if(typeof v=="string"&&g(v.charCodeAt(0))){++S;const L=v.length;L>1&&g(v.charCodeAt(1))&&(++S,L>2&&(g(v.charCodeAt(2))?++S:w=!1))}if(w){for(;S=2&&(h=`\\${h.slice(S)}`)}return e.win32.normalize(h)},relative(f,h){if(i(f,"from"),i(h,"to"),f===h)return"";const v=e.win32.resolve(f),w=e.win32.resolve(h);if(v===w||(f=v.toLowerCase(),h=w.toLowerCase(),f===h))return"";let S=0;for(;SS&&f.charCodeAt(L-1)===b;)L--;const D=L-S;let T=0;for(;TT&&h.charCodeAt(M-1)===b;)M--;const A=M-T,P=DP){if(h.charCodeAt(T+O)===b)return w.slice(T+O+1);if(O===2)return w.slice(T+O)}D>P&&(f.charCodeAt(S+O)===b?N=O:O===2&&(N=3)),N===-1&&(N=0)}let F="";for(O=S+N+1;O<=L;++O)(O===L||f.charCodeAt(O)===b)&&(F+=F.length===0?"..":"\\..");return T+=N,F.length>0?`${F}${w.slice(T,M)}`:(w.charCodeAt(T)===b&&++T,w.slice(T,M))},toNamespacedPath(f){if(typeof f!="string"||f.length===0)return f;const h=e.win32.resolve(f);if(h.length<=2)return f;if(h.charCodeAt(0)===b){if(h.charCodeAt(1)===b){const v=h.charCodeAt(2);if(v!==n&&v!==m)return`\\\\?\\UNC\\${h.slice(2)}`}}else if(l(h.charCodeAt(0))&&h.charCodeAt(1)===p&&h.charCodeAt(2)===b)return`\\\\?\\${h}`;return f},dirname(f){i(f,"path");const h=f.length;if(h===0)return".";let v=-1,w=0;const S=f.charCodeAt(0);if(h===1)return g(S)?f:".";if(g(S)){if(v=w=1,g(f.charCodeAt(1))){let T=2,M=T;for(;T2&&g(f.charCodeAt(2))?3:2,w=v);let L=-1,D=!0;for(let T=h-1;T>=w;--T)if(g(f.charCodeAt(T))){if(!D){L=T;break}}else D=!1;if(L===-1){if(v===-1)return".";L=v}return f.slice(0,L)},basename(f,h){h!==void 0&&i(h,"suffix"),i(f,"path");let v=0,w=-1,S=!0,L;if(f.length>=2&&l(f.charCodeAt(0))&&f.charCodeAt(1)===p&&(v=2),h!==void 0&&h.length>0&&h.length<=f.length){if(h===f)return"";let D=h.length-1,T=-1;for(L=f.length-1;L>=v;--L){const M=f.charCodeAt(L);if(g(M)){if(!S){v=L+1;break}}else T===-1&&(S=!1,T=L+1),D>=0&&(M===h.charCodeAt(D)?--D===-1&&(w=L):(D=-1,w=T))}return v===w?w=T:w===-1&&(w=f.length),f.slice(v,w)}for(L=f.length-1;L>=v;--L)if(g(f.charCodeAt(L))){if(!S){v=L+1;break}}else w===-1&&(S=!1,w=L+1);return w===-1?"":f.slice(v,w)},extname(f){i(f,"path");let h=0,v=-1,w=0,S=-1,L=!0,D=0;f.length>=2&&f.charCodeAt(1)===p&&l(f.charCodeAt(0))&&(h=w=2);for(let T=f.length-1;T>=h;--T){const M=f.charCodeAt(T);if(g(M)){if(!L){w=T+1;break}continue}S===-1&&(L=!1,S=T+1),M===m?v===-1?v=T:D!==1&&(D=1):v!==-1&&(D=-1)}return v===-1||S===-1||D===0||D===1&&v===S-1&&v===w+1?"":f.slice(v,S)},format:u.bind(null,"\\"),parse(f){i(f,"path");const h={root:"",dir:"",base:"",ext:"",name:""};if(f.length===0)return h;const v=f.length;let w=0,S=f.charCodeAt(0);if(v===1)return g(S)?(h.root=h.dir=f,h):(h.base=h.name=f,h);if(g(S)){if(w=1,g(f.charCodeAt(1))){let N=2,O=N;for(;N0&&(h.root=f.slice(0,w));let L=-1,D=w,T=-1,M=!0,A=f.length-1,P=0;for(;A>=w;--A){if(S=f.charCodeAt(A),g(S)){if(!M){D=A+1;break}continue}T===-1&&(M=!1,T=A+1),S===m?L===-1?L=A:P!==1&&(P=1):L!==-1&&(P=-1)}return T!==-1&&(L===-1||P===0||P===1&&L===T-1&&L===D+1?h.base=h.name=f.slice(D,T):(h.name=f.slice(D,L),h.base=f.slice(D,T),h.ext=f.slice(L,T))),D>0&&D!==w?h.dir=f.slice(0,D-1):h.dir=h.root,h},sep:"\\",delimiter:";",win32:null,posix:null};const C=(()=>{if(s){const f=/\\/g;return()=>{const h=d.cwd().replace(f,"/");return h.slice(h.indexOf("/"))}}return()=>d.cwd()})();e.posix={resolve(...f){let h="",v=!1;for(let w=f.length-1;w>=-1&&!v;w--){const S=w>=0?f[w]:C();i(S,`paths[${w}]`),S.length!==0&&(h=`${S}/${h}`,v=S.charCodeAt(0)===_)}return h=a(h,!v,"/",c),v?`/${h}`:h.length>0?h:"."},normalize(f){if(i(f,"path"),f.length===0)return".";const h=f.charCodeAt(0)===_,v=f.charCodeAt(f.length-1)===_;return f=a(f,!h,"/",c),f.length===0?h?"/":v?"./":".":(v&&(f+="/"),h?`/${f}`:f)},isAbsolute(f){return i(f,"path"),f.length>0&&f.charCodeAt(0)===_},join(...f){if(f.length===0)return".";let h;for(let v=0;v0&&(h===void 0?h=w:h+=`/${w}`)}return h===void 0?".":e.posix.normalize(h)},relative(f,h){if(i(f,"from"),i(h,"to"),f===h||(f=e.posix.resolve(f),h=e.posix.resolve(h),f===h))return"";const v=1,w=f.length,S=w-v,L=1,D=h.length-L,T=ST){if(h.charCodeAt(L+A)===_)return h.slice(L+A+1);if(A===0)return h.slice(L+A)}else S>T&&(f.charCodeAt(v+A)===_?M=A:A===0&&(M=0));let P="";for(A=v+M+1;A<=w;++A)(A===w||f.charCodeAt(A)===_)&&(P+=P.length===0?"..":"/..");return`${P}${h.slice(L+M)}`},toNamespacedPath(f){return f},dirname(f){if(i(f,"path"),f.length===0)return".";const h=f.charCodeAt(0)===_;let v=-1,w=!0;for(let S=f.length-1;S>=1;--S)if(f.charCodeAt(S)===_){if(!w){v=S;break}}else w=!1;return v===-1?h?"/":".":h&&v===1?"//":f.slice(0,v)},basename(f,h){h!==void 0&&i(h,"ext"),i(f,"path");let v=0,w=-1,S=!0,L;if(h!==void 0&&h.length>0&&h.length<=f.length){if(h===f)return"";let D=h.length-1,T=-1;for(L=f.length-1;L>=0;--L){const M=f.charCodeAt(L);if(M===_){if(!S){v=L+1;break}}else T===-1&&(S=!1,T=L+1),D>=0&&(M===h.charCodeAt(D)?--D===-1&&(w=L):(D=-1,w=T))}return v===w?w=T:w===-1&&(w=f.length),f.slice(v,w)}for(L=f.length-1;L>=0;--L)if(f.charCodeAt(L)===_){if(!S){v=L+1;break}}else w===-1&&(S=!1,w=L+1);return w===-1?"":f.slice(v,w)},extname(f){i(f,"path");let h=-1,v=0,w=-1,S=!0,L=0;for(let D=f.length-1;D>=0;--D){const T=f.charCodeAt(D);if(T===_){if(!S){v=D+1;break}continue}w===-1&&(S=!1,w=D+1),T===m?h===-1?h=D:L!==1&&(L=1):h!==-1&&(L=-1)}return h===-1||w===-1||L===0||L===1&&h===w-1&&h===v+1?"":f.slice(h,w)},format:u.bind(null,"/"),parse(f){i(f,"path");const h={root:"",dir:"",base:"",ext:"",name:""};if(f.length===0)return h;const v=f.charCodeAt(0)===_;let w;v?(h.root="/",w=1):w=0;let S=-1,L=0,D=-1,T=!0,M=f.length-1,A=0;for(;M>=w;--M){const P=f.charCodeAt(M);if(P===_){if(!T){L=M+1;break}continue}D===-1&&(T=!1,D=M+1),P===m?S===-1?S=M:A!==1&&(A=1):S!==-1&&(A=-1)}if(D!==-1){const P=L===0&&v?1:L;S===-1||A===0||A===1&&S===D-1&&S===L+1?h.base=h.name=f.slice(P,D):(h.name=f.slice(P,S),h.base=f.slice(P,D),h.ext=f.slice(S,D))}return L>0?h.dir=f.slice(0,L-1):v&&(h.dir="/"),h},sep:"/",delimiter:":",win32:null,posix:null},e.posix.win32=e.win32.win32=e.win32,e.posix.posix=e.win32.posix=e.posix,e.normalize=s?e.win32.normalize:e.posix.normalize,e.join=s?e.win32.join:e.posix.join,e.resolve=s?e.win32.resolve:e.posix.resolve,e.relative=s?e.win32.relative:e.posix.relative,e.dirname=s?e.win32.dirname:e.posix.dirname,e.basename=s?e.win32.basename:e.posix.basename,e.extname=s?e.win32.extname:e.posix.extname,e.sep=s?e.win32.sep:e.posix.sep}),define(ne[251],se([1,0,99,16,11]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isPathSeparator=E,e.toSlashes=y,e.toPosixPath=m,e.getRoot=_,e.isEqualOrParent=b,e.isWindowsDriveLetter=p,e.hasDriveLetter=n;function E(o){return o===47||o===92}function y(o){return o.replace(/[\\/]/g,d.posix.sep)}function m(o){return o.indexOf("/")===-1&&(o=y(o)),/^[a-zA-Z]:(\/|$)/.test(o)&&(o="/"+o),o}function _(o,t=d.posix.sep){if(!o)return"";const i=o.length,s=o.charCodeAt(0);if(E(s)){if(E(o.charCodeAt(1))&&!E(o.charCodeAt(2))){let c=3;const l=c;for(;co.length)return!1;if(i){if(!(0,I.startsWithIgnoreCase)(o,t))return!1;if(t.length===o.length)return!0;let c=t.length;return t.charAt(t.length-1)===s&&c--,o.charAt(c)===s}return t.charAt(t.length-1)!==s&&(t+=s),o.indexOf(t)===0}function p(o){return o>=65&&o<=90||o>=97&&o<=122}function n(o,t=k.isWindows){return t?p(o.charCodeAt(0))&&o.charCodeAt(1)===58:!1}}),define(ne[628],se([1,0,82,99,16,11]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.scoreFuzzy2=m,e.prepareQuery=s,e.pieceToQuery=c;const y=[void 0,[]];function m(l,a,r=0,u=0){const C=a;return C.values&&C.values.length>1?_(l,C.values,r,u):b(l,a,r,u)}function _(l,a,r,u){let C=0;const f=[];for(const h of a){const[v,w]=b(l,h,r,u);if(typeof v!="number")return y;C+=v,f.push(...w)}return[C,n(f)]}function b(l,a,r,u){const C=(0,d.fuzzyScore)(a.original,a.originalLowercase,r,l,l.toLowerCase(),u,{firstMatchCanBeWeak:!0,boostFullMatch:!0});return C?[C[0],(0,d.createMatches)(C)]:y}const p=Object.freeze({score:0});function n(l){const a=l.sort((C,f)=>C.start-f.start),r=[];let u;for(const C of a)!u||!o(u,C)?(u=C,r.push(C)):(u.start=Math.min(u.start,C.start),u.end=Math.max(u.end,C.end));return r}function o(l,a){return!(l.end=0,h=t(l);let v;const w=l.split(i);if(w.length>1)for(const S of w){const L=t(S),{pathNormalized:D,normalized:T,normalizedLowercase:M}=g(S);T&&(v||(v=[]),v.push({original:S,originalLowercase:S.toLowerCase(),pathNormalized:D,normalized:T,normalizedLowercase:M,expectContiguousMatch:L}))}return{original:l,originalLowercase:a,pathNormalized:r,normalized:u,normalizedLowercase:C,values:v,containsPathSeparator:f,expectContiguousMatch:h}}function g(l){let a;I.isWindows?a=l.replace(/\//g,k.sep):a=l.replace(/\\/g,k.sep);const r=(0,E.stripWildcards)(a).replace(/\s|"/g,"");return{pathNormalized:a,normalized:r,normalizedLowercase:r.toLowerCase()}}function c(l){return Array.isArray(l)?s(l.map(a=>a.original).join(i)):s(l.original)}}),define(ne[350],se([1,0,14,251,45,99,16,11]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GLOB_SPLIT=e.GLOBSTAR=void 0,e.splitGlobAware=o,e.match=M,e.parse=A,e.isRelativePattern=P,e.GLOBSTAR="**",e.GLOB_SPLIT="/";const _="[/\\\\]",b="[^/\\\\]",p=/\//g;function n(x,W){switch(x){case 0:return"";case 1:return`${b}*?`;default:return`(?:${_}|${b}+${_}${W?`|${_}${b}+`:""})*?`}}function o(x,W){if(!x)return[];const V=[];let q=!1,H=!1,z="";for(const U of x){switch(U){case W:if(!q&&!H){V.push(z),z="";continue}break;case"{":q=!0;break;case"}":q=!1;break;case"[":H=!0;break;case"]":H=!1;break}z+=U}return z&&V.push(z),V}function t(x){if(!x)return"";let W="";const V=o(x,e.GLOB_SPLIT);if(V.every(q=>q===e.GLOBSTAR))W=".*";else{let q=!1;V.forEach((H,z)=>{if(H===e.GLOBSTAR){if(q)return;W+=n(2,z===V.length-1)}else{let U=!1,j="",Y=!1,G="";for(const K of H){if(K!=="}"&&U){j+=K;continue}if(Y&&(K!=="]"||!G)){let R;K==="-"?R=K:(K==="^"||K==="!")&&!G?R="^":K===e.GLOB_SPLIT?R="":R=(0,m.escapeRegExpCharacters)(K),G+=R;continue}switch(K){case"{":U=!0;continue;case"[":Y=!0;continue;case"}":{const J=`(?:${o(j,",").map(ie=>t(ie)).join("|")})`;W+=J,U=!1,j="";break}case"]":{W+="["+G+"]",Y=!1,G="";break}case"?":W+=b;continue;case"*":W+=n(1);continue;default:W+=(0,m.escapeRegExpCharacters)(K)}}zf(j,W)).filter(j=>j!==C),x),q=V.length;if(!q)return C;if(q===1)return V[0];const H=function(j,Y){for(let G=0,K=V.length;G!!j.allBasenames);z&&(H.allBasenames=z.allBasenames);const U=V.reduce((j,Y)=>Y.allPaths?j.concat(Y.allPaths):j,[]);return U.length&&(H.allPaths=U),H}function D(x,W,V){const q=E.sep===E.posix.sep,H=q?x:x.replace(p,E.sep),z=E.sep+H,U=E.posix.sep+x;let j;return V?j=function(Y,G){return typeof Y=="string"&&(Y===H||Y.endsWith(z)||!q&&(Y===x||Y.endsWith(U)))?W:null}:j=function(Y,G){return typeof Y=="string"&&(Y===H||!q&&Y===x)?W:null},j.allPaths=[(V?"*/":"./")+x],j}function T(x){try{const W=new RegExp(`^${t(x)}$`);return function(V){return W.lastIndex=0,typeof V=="string"&&W.test(V)?x:null}}catch{return C}}function M(x,W,V){return!x||typeof W!="string"?!1:A(x)(W,void 0,V)}function A(x,W={}){if(!x)return u;if(typeof x=="string"||P(x)){const V=f(x,W);if(V===C)return u;const q=function(H,z){return!!V(H,z)};return V.allBasenames&&(q.allBasenames=V.allBasenames),V.allPaths&&(q.allPaths=V.allPaths),q}return N(x,W)}function P(x){const W=x;return W?typeof W.base=="string"&&typeof W.pattern=="string":!1}function N(x,W){const V=F(Object.getOwnPropertyNames(x).map(j=>O(j,x[j],W)).filter(j=>j!==C)),q=V.length;if(!q)return C;if(!V.some(j=>!!j.requiresSiblings)){if(q===1)return V[0];const j=function(K,R){let J;for(let ie=0,ue=V.length;ie{for(const ie of J){const ue=await ie;if(typeof ue=="string")return ue}return null})():null},Y=V.find(K=>!!K.allBasenames);Y&&(j.allBasenames=Y.allBasenames);const G=V.reduce((K,R)=>R.allPaths?K.concat(R.allPaths):K,[]);return G.length&&(j.allPaths=G),j}const H=function(j,Y,G){let K,R;for(let J=0,ie=V.length;J{for(const J of R){const ie=await J;if(typeof ie=="string")return ie}return null})():null},z=V.find(j=>!!j.allBasenames);z&&(H.allBasenames=z.allBasenames);const U=V.reduce((j,Y)=>Y.allPaths?j.concat(Y.allPaths):j,[]);return U.length&&(H.allPaths=U),H}function O(x,W,V){if(W===!1)return C;const q=f(x,V);if(q===C)return C;if(typeof W=="boolean")return q;if(W){const H=W.when;if(typeof H=="string"){const z=(U,j,Y,G)=>{if(!G||!q(U,j))return null;const K=H.replace("$(basename)",()=>Y),R=G(K);return(0,d.isThenable)(R)?R.then(J=>J?x:null):R?x:null};return z.requiresSiblings=!0,z}}return q}function F(x,W){const V=x.filter(j=>!!j.basenames);if(V.length<2)return x;const q=V.reduce((j,Y)=>{const G=Y.basenames;return G?j.concat(G):j},[]);let H;if(W){H=[];for(let j=0,Y=q.length;j{const G=Y.patterns;return G?j.concat(G):j},[]);const z=function(j,Y){if(typeof j!="string")return null;if(!Y){let K;for(K=j.length;K>0;K--){const R=j.charCodeAt(K-1);if(R===47||R===92)break}Y=j.substr(K)}const G=q.indexOf(Y);return G!==-1?H[G]:null};z.basenames=q,z.patterns=H,z.allBasenames=q;const U=x.filter(j=>!j.basenames);return U.push(z),U}}),define(ne[629],se([1,0,251,16]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.normalizeDriveLetter=I;function I(y,m=k.isWindows){return(0,d.hasDriveLetter)(y,m)?y.charAt(0).toUpperCase()+y.slice(1):y}let E=Object.create(null)}),define(ne[22],se([1,0,99,16]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.URI=void 0,e.uriToFsPath=a;const I=/^\w[\w\d+.-]*$/,E=/^\//,y=/^\/\//;function m(h,v){if(!h.scheme&&v)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${h.authority}", path: "${h.path}", query: "${h.query}", fragment: "${h.fragment}"}`);if(h.scheme&&!I.test(h.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(h.path){if(h.authority){if(!E.test(h.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(y.test(h.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}function _(h,v){return!h&&!v?"file":h}function b(h,v){switch(h){case"https":case"http":case"file":v?v[0]!==n&&(v=n+v):v=n;break}return v}const p="",n="/",o=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class t{static isUri(v){return v instanceof t?!0:v?typeof v.authority=="string"&&typeof v.fragment=="string"&&typeof v.path=="string"&&typeof v.query=="string"&&typeof v.scheme=="string"&&typeof v.fsPath=="string"&&typeof v.with=="function"&&typeof v.toString=="function":!1}constructor(v,w,S,L,D,T=!1){typeof v=="object"?(this.scheme=v.scheme||p,this.authority=v.authority||p,this.path=v.path||p,this.query=v.query||p,this.fragment=v.fragment||p):(this.scheme=_(v,T),this.authority=w||p,this.path=b(this.scheme,S||p),this.query=L||p,this.fragment=D||p,m(this,T))}get fsPath(){return a(this,!1)}with(v){if(!v)return this;let{scheme:w,authority:S,path:L,query:D,fragment:T}=v;return w===void 0?w=this.scheme:w===null&&(w=p),S===void 0?S=this.authority:S===null&&(S=p),L===void 0?L=this.path:L===null&&(L=p),D===void 0?D=this.query:D===null&&(D=p),T===void 0?T=this.fragment:T===null&&(T=p),w===this.scheme&&S===this.authority&&L===this.path&&D===this.query&&T===this.fragment?this:new s(w,S,L,D,T)}static parse(v,w=!1){const S=o.exec(v);return S?new s(S[2]||p,f(S[4]||p),f(S[5]||p),f(S[7]||p),f(S[9]||p),w):new s(p,p,p,p,p)}static file(v){let w=p;if(k.isWindows&&(v=v.replace(/\\/g,n)),v[0]===n&&v[1]===n){const S=v.indexOf(n,2);S===-1?(w=v.substring(2),v=n):(w=v.substring(2,S),v=v.substring(S)||n)}return new s("file",w,v,p,p)}static from(v,w){return new s(v.scheme,v.authority,v.path,v.query,v.fragment,w)}static joinPath(v,...w){if(!v.path)throw new Error("[UriError]: cannot call joinPath on URI without path");let S;return k.isWindows&&v.scheme==="file"?S=t.file(d.win32.join(a(v,!0),...w)).path:S=d.posix.join(v.path,...w),v.with({path:S})}toString(v=!1){return r(this,v)}toJSON(){return this}static revive(v){if(v){if(v instanceof t)return v;{const w=new s(v);return w._formatted=v.external??null,w._fsPath=v._sep===i?v.fsPath??null:null,w}}else return v}}e.URI=t;const i=k.isWindows?1:void 0;class s extends t{constructor(){super(...arguments),this._formatted=null,this._fsPath=null}get fsPath(){return this._fsPath||(this._fsPath=a(this,!1)),this._fsPath}toString(v=!1){return v?r(this,!0):(this._formatted||(this._formatted=r(this,!1)),this._formatted)}toJSON(){const v={$mid:1};return this._fsPath&&(v.fsPath=this._fsPath,v._sep=i),this._formatted&&(v.external=this._formatted),this.path&&(v.path=this.path),this.scheme&&(v.scheme=this.scheme),this.authority&&(v.authority=this.authority),this.query&&(v.query=this.query),this.fragment&&(v.fragment=this.fragment),v}}const g={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function c(h,v,w){let S,L=-1;for(let D=0;D=97&&T<=122||T>=65&&T<=90||T>=48&&T<=57||T===45||T===46||T===95||T===126||v&&T===47||w&&T===91||w&&T===93||w&&T===58)L!==-1&&(S+=encodeURIComponent(h.substring(L,D)),L=-1),S!==void 0&&(S+=h.charAt(D));else{S===void 0&&(S=h.substr(0,D));const M=g[T];M!==void 0?(L!==-1&&(S+=encodeURIComponent(h.substring(L,D)),L=-1),S+=M):L===-1&&(L=D)}}return L!==-1&&(S+=encodeURIComponent(h.substring(L))),S!==void 0?S:h}function l(h){let v;for(let w=0;w1&&h.scheme==="file"?w=`//${h.authority}${h.path}`:h.path.charCodeAt(0)===47&&(h.path.charCodeAt(1)>=65&&h.path.charCodeAt(1)<=90||h.path.charCodeAt(1)>=97&&h.path.charCodeAt(1)<=122)&&h.path.charCodeAt(2)===58?v?w=h.path.substr(1):w=h.path[1].toLowerCase()+h.path.substr(2):w=h.path,k.isWindows&&(w=w.replace(/\//g,"\\")),w}function r(h,v){const w=v?l:c;let S="",{scheme:L,authority:D,path:T,query:M,fragment:A}=h;if(L&&(S+=L,S+=":"),(D||L==="file")&&(S+=n,S+=n),D){let P=D.indexOf("@");if(P!==-1){const N=D.substr(0,P);D=D.substr(P+1),P=N.lastIndexOf(":"),P===-1?S+=w(N,!1,!1):(S+=w(N.substr(0,P),!1,!1),S+=":",S+=w(N.substr(P+1),!1,!0)),S+="@"}D=D.toLowerCase(),P=D.lastIndexOf(":"),P===-1?S+=w(D,!1,!0):(S+=w(D.substr(0,P),!1,!0),S+=D.substr(P))}if(T){if(T.length>=3&&T.charCodeAt(0)===47&&T.charCodeAt(2)===58){const P=T.charCodeAt(1);P>=65&&P<=90&&(T=`/${String.fromCharCode(P+32)}:${T.substr(3)}`)}else if(T.length>=2&&T.charCodeAt(1)===58){const P=T.charCodeAt(0);P>=65&&P<=90&&(T=`${String.fromCharCode(P+32)}:${T.substr(2)}`)}S+=w(T,!0,!1)}return M&&(S+="?",S+=w(M,!1,!1)),A&&(S+="#",S+=v?A:c(A,!1,!1)),S}function u(h){try{return decodeURIComponent(h)}catch{return h.length>3?h.substr(0,3)+u(h.substr(3)):h}}const C=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function f(h){return h.match(C)?h.replace(C,v=>u(v)):h}}),define(ne[252],se([1,0,160,22]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.stringify=I,e.parse=E,e.revive=m;function I(_){return JSON.stringify(_,y)}function E(_){let b=JSON.parse(_);return b=m(b),b}function y(_,b){return b instanceof RegExp?{$mid:2,source:b.source,flags:b.flags}:b}function m(_,b=0){if(!_||b>200)return _;if(typeof _=="object"){switch(_.$mid){case 1:return k.URI.revive(_);case 2:return new RegExp(_.source,_.flags);case 17:return new Date(_.source)}if(_ instanceof d.VSBuffer||_ instanceof Uint8Array)return _;if(Array.isArray(_))for(let p=0;p<_.length;++p)_[p]=m(_[p],b+1);else for(const p in _)Object.hasOwnProperty.call(_,p)&&(_[p]=m(_[p],b+1))}return _}}),define(ne[42],se([1,0,8,16,11,22,99]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.COI=e.FileAccess=e.VSCODE_AUTHORITY=e.RemoteAuthorities=e.connectionTokenQueryName=e.Schemas=void 0,e.matchesScheme=_,e.matchesSomeScheme=b;var m;(function(t){t.inMemory="inmemory",t.vscode="vscode",t.internal="private",t.walkThrough="walkThrough",t.walkThroughSnippet="walkThroughSnippet",t.http="http",t.https="https",t.file="file",t.mailto="mailto",t.untitled="untitled",t.data="data",t.command="command",t.vscodeRemote="vscode-remote",t.vscodeRemoteResource="vscode-remote-resource",t.vscodeManagedRemoteResource="vscode-managed-remote-resource",t.vscodeUserData="vscode-userdata",t.vscodeCustomEditor="vscode-custom-editor",t.vscodeNotebookCell="vscode-notebook-cell",t.vscodeNotebookCellMetadata="vscode-notebook-cell-metadata",t.vscodeNotebookCellMetadataDiff="vscode-notebook-cell-metadata-diff",t.vscodeNotebookCellOutput="vscode-notebook-cell-output",t.vscodeNotebookCellOutputDiff="vscode-notebook-cell-output-diff",t.vscodeNotebookMetadata="vscode-notebook-metadata",t.vscodeInteractiveInput="vscode-interactive-input",t.vscodeSettings="vscode-settings",t.vscodeWorkspaceTrust="vscode-workspace-trust",t.vscodeTerminal="vscode-terminal",t.vscodeChatCodeBlock="vscode-chat-code-block",t.vscodeChatCodeCompareBlock="vscode-chat-code-compare-block",t.vscodeChatSesssion="vscode-chat-editor",t.webviewPanel="webview-panel",t.vscodeWebview="vscode-webview",t.extension="extension",t.vscodeFileResource="vscode-file",t.tmp="tmp",t.vsls="vsls",t.vscodeSourceControl="vscode-scm",t.commentsInput="comment",t.codeSetting="code-setting",t.outputChannel="output"})(m||(e.Schemas=m={}));function _(t,i){return E.URI.isUri(t)?(0,I.equalsIgnoreCase)(t.scheme,i):(0,I.startsWithIgnoreCase)(t,i+":")}function b(t,...i){return i.some(s=>_(t,s))}e.connectionTokenQueryName="tkn";class p{constructor(){this._hosts=Object.create(null),this._ports=Object.create(null),this._connectionTokens=Object.create(null),this._preferredWebSchema="http",this._delegate=null,this._serverRootPath="/"}setPreferredWebSchema(i){this._preferredWebSchema=i}get _remoteResourcesPath(){return y.posix.join(this._serverRootPath,m.vscodeRemoteResource)}rewrite(i){if(this._delegate)try{return this._delegate(i)}catch(r){return d.onUnexpectedError(r),i}const s=i.authority;let g=this._hosts[s];g&&g.indexOf(":")!==-1&&g.indexOf("[")===-1&&(g=`[${g}]`);const c=this._ports[s],l=this._connectionTokens[s];let a=`path=${encodeURIComponent(i.path)}`;return typeof l=="string"&&(a+=`&${e.connectionTokenQueryName}=${encodeURIComponent(l)}`),E.URI.from({scheme:k.isWeb?this._preferredWebSchema:m.vscodeRemoteResource,authority:`${g}:${c}`,path:this._remoteResourcesPath,query:a})}}e.RemoteAuthorities=new p,e.VSCODE_AUTHORITY="vscode-app";class n{static{this.FALLBACK_AUTHORITY=e.VSCODE_AUTHORITY}asBrowserUri(i){const s=this.toUri(i,oe);return this.uriToBrowserUri(s)}uriToBrowserUri(i){return i.scheme===m.vscodeRemote?e.RemoteAuthorities.rewrite(i):i.scheme===m.file&&(k.isNative||k.webWorkerOrigin===`${m.vscodeFileResource}://${n.FALLBACK_AUTHORITY}`)?i.with({scheme:m.vscodeFileResource,authority:i.authority||n.FALLBACK_AUTHORITY,query:null,fragment:null}):i}toUri(i,s){if(E.URI.isUri(i))return i;if(globalThis._VSCODE_FILE_ROOT){const g=globalThis._VSCODE_FILE_ROOT;if(/^\w[\w\d+.-]*:\/\//.test(g))return E.URI.joinPath(E.URI.parse(g,!0),i);const c=y.join(g,i);return E.URI.file(c)}return E.URI.parse(s.toUrl(i))}}e.FileAccess=new n;var o;(function(t){const i=new Map([["1",{"Cross-Origin-Opener-Policy":"same-origin"}],["2",{"Cross-Origin-Embedder-Policy":"require-corp"}],["3",{"Cross-Origin-Opener-Policy":"same-origin","Cross-Origin-Embedder-Policy":"require-corp"}]]);t.CoopAndCoep=Object.freeze(i.get("3"));const s="vscode-coi";function g(l){let a;typeof l=="string"?a=new URL(l).searchParams:l instanceof URL?a=l.searchParams:E.URI.isUri(l)&&(a=new URL(l.toString(!0)).searchParams);const r=a?.get(s);if(r)return i.get(r)}t.getHeadersFromQuery=g;function c(l,a,r){if(!globalThis.crossOriginIsolated)return;const u=a&&r?"3":r?"2":"1";l instanceof URLSearchParams?l.set(s,u):l[s]=u}t.addSearchParam=c})(o||(e.COI=o={}))}),define(ne[5],se([1,0,64,248,47,77,14,8,6,351,2,42,16,129,52]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i){"use strict";var s;Object.defineProperty(e,"__esModule",{value:!0}),e.DragAndDropObserver=e.ModifierKeyEmitter=e.basicMarkupHtmlTags=e.Namespace=e.EventHelper=e.EventType=e.sharedMutationObserver=e.Dimension=e.WindowIntervalTimer=e.scheduleAtNextAnimationFrame=e.runAtThisOrScheduleAtNextAnimationFrame=e.WindowIdleValue=e.addStandardDisposableGenericMouseUpListener=e.addStandardDisposableGenericMouseDownListener=e.addStandardDisposableListener=e.onDidUnregisterWindow=e.onWillUnregisterWindow=e.onDidRegisterWindow=e.hasWindow=e.getWindowById=e.getWindowId=e.getWindowsCount=e.getWindows=e.getDocument=e.getWindow=e.registerWindow=void 0,e.clearNode=g,e.addDisposableListener=l,e.addDisposableGenericMouseDownListener=h,e.addDisposableGenericMouseUpListener=v,e.runWhenWindowIdle=w,e.getComputedStyle=T,e.getClientArea=M,e.getTopLeftOffset=N,e.size=O,e.getDomNodePagePosition=F,e.getDomNodeZoomLevel=x,e.getTotalWidth=W,e.getContentWidth=V,e.getContentHeight=q,e.getTotalHeight=H,e.isAncestor=z,e.findParentWithClass=U,e.hasParentWithClass=j,e.isShadowRoot=Y,e.isInShadowDOM=G,e.getShadowRoot=K,e.getActiveElement=R,e.isActiveElement=J,e.isAncestorOfActiveElement=ie,e.getActiveDocument=ue,e.getActiveWindow=he,e.createStyleSheet2=ae,e.createStyleSheet=de,e.createCSSRule=Q,e.removeCSSRulesContainingSelector=Z,e.isHTMLElement=re,e.isHTMLAnchorElement=le,e.isSVGElement=me,e.isMouseEvent=Ce,e.isKeyboardEvent=ye,e.isEventLike=Le,e.saveParentsScrollTop=Ee,e.restoreParentsScrollTop=Me,e.trackFocus=Ne,e.after=Ke,e.append=ze,e.prepend=Ge,e.reset=it,e.$=_e,e.setVisibility=xe,e.show=be,e.hide=ve,e.computeScreenAwareSize=we,e.windowOpenNoOpener=Te,e.animate=Pe,e.asCSSUrl=Be,e.asCSSPropertyValue=He,e.asCssValueWithDefault=$e,e.hookDomPurifyHrefAndSrcSanitizer=je,e.h=st,e.svgElem=pt,s=function(){const De=new Map;(0,i.ensureCodeWindow)(i.mainWindow,1);const Ie={window:i.mainWindow,disposables:new p.DisposableStore};De.set(i.mainWindow.vscodeWindowId,Ie);const Re=new _.Emitter,Se=new _.Emitter,We=new _.Emitter;function qe(Ue,Je){return(typeof Ue=="number"?De.get(Ue):void 0)??(Je?Ie:void 0)}return{onDidRegisterWindow:Re.event,onWillUnregisterWindow:We.event,onDidUnregisterWindow:Se.event,registerWindow(Ue){if(De.has(Ue.vscodeWindowId))return p.Disposable.None;const Je=new p.DisposableStore,tt={window:Ue,disposables:Je.add(new p.DisposableStore)};return De.set(Ue.vscodeWindowId,tt),Je.add((0,p.toDisposable)(()=>{De.delete(Ue.vscodeWindowId),Se.fire(Ue)})),Je.add(l(Ue,e.EventType.BEFORE_UNLOAD,()=>{We.fire(Ue)})),Re.fire(tt),Je},getWindows(){return De.values()},getWindowsCount(){return De.size},getWindowId(Ue){return Ue.vscodeWindowId},hasWindow(Ue){return De.has(Ue)},getWindowById:qe,getWindow(Ue){const Je=Ue;if(Je?.ownerDocument?.defaultView)return Je.ownerDocument.defaultView.window;const tt=Ue;return tt?.view?tt.view.window:i.mainWindow},getDocument(Ue){const Je=Ue;return(0,e.getWindow)(Je).document}}}(),e.registerWindow=s.registerWindow,e.getWindow=s.getWindow,e.getDocument=s.getDocument,e.getWindows=s.getWindows,e.getWindowsCount=s.getWindowsCount,e.getWindowId=s.getWindowId,e.getWindowById=s.getWindowById,e.hasWindow=s.hasWindow,e.onDidRegisterWindow=s.onDidRegisterWindow,e.onWillUnregisterWindow=s.onWillUnregisterWindow,e.onDidUnregisterWindow=s.onDidUnregisterWindow;function g(De){for(;De.firstChild;)De.firstChild.remove()}class c{constructor(Ie,Re,Se,We){this._node=Ie,this._type=Re,this._handler=Se,this._options=We||!1,this._node.addEventListener(this._type,this._handler,this._options)}dispose(){this._handler&&(this._node.removeEventListener(this._type,this._handler,this._options),this._node=null,this._handler=null)}}function l(De,Ie,Re,Se){return new c(De,Ie,Re,Se)}function a(De,Ie){return function(Re){return Ie(new E.StandardMouseEvent(De,Re))}}function r(De){return function(Ie){return De(new I.StandardKeyboardEvent(Ie))}}const u=function(Ie,Re,Se,We){let qe=Se;return Re==="click"||Re==="mousedown"||Re==="contextmenu"?qe=a((0,e.getWindow)(Ie),Se):(Re==="keydown"||Re==="keypress"||Re==="keyup")&&(qe=r(Se)),l(Ie,Re,qe,We)};e.addStandardDisposableListener=u;const C=function(Ie,Re,Se){const We=a((0,e.getWindow)(Ie),Re);return h(Ie,We,Se)};e.addStandardDisposableGenericMouseDownListener=C;const f=function(Ie,Re,Se){const We=a((0,e.getWindow)(Ie),Re);return v(Ie,We,Se)};e.addStandardDisposableGenericMouseUpListener=f;function h(De,Ie,Re){return l(De,o.isIOS&&k.BrowserFeatures.pointerEvents?e.EventType.POINTER_DOWN:e.EventType.MOUSE_DOWN,Ie,Re)}function v(De,Ie,Re){return l(De,o.isIOS&&k.BrowserFeatures.pointerEvents?e.EventType.POINTER_UP:e.EventType.MOUSE_UP,Ie,Re)}function w(De,Ie,Re){return(0,y._runWhenIdle)(De,Ie,Re)}class S extends y.AbstractIdleValue{constructor(Ie,Re){super(Ie,Re)}}e.WindowIdleValue=S;class L extends y.IntervalTimer{constructor(Ie){super(),this.defaultTarget=Ie&&(0,e.getWindow)(Ie)}cancelAndSet(Ie,Re,Se){return super.cancelAndSet(Ie,Re,Se??this.defaultTarget)}}e.WindowIntervalTimer=L;class D{constructor(Ie,Re=0){this._runner=Ie,this.priority=Re,this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(Ie){(0,m.onUnexpectedError)(Ie)}}static sort(Ie,Re){return Re.priority-Ie.priority}}(function(){const De=new Map,Ie=new Map,Re=new Map,Se=new Map,We=qe=>{Re.set(qe,!1);const Ue=De.get(qe)??[];for(Ie.set(qe,Ue),De.set(qe,[]),Se.set(qe,!0);Ue.length>0;)Ue.sort(D.sort),Ue.shift().execute();Se.set(qe,!1)};e.scheduleAtNextAnimationFrame=(qe,Ue,Je=0)=>{const tt=(0,e.getWindowId)(qe),Qe=new D(Ue,Je);let rt=De.get(tt);return rt||(rt=[],De.set(tt,rt)),rt.push(Qe),Re.get(tt)||(Re.set(tt,!0),qe.requestAnimationFrame(()=>We(tt))),Qe},e.runAtThisOrScheduleAtNextAnimationFrame=(qe,Ue,Je)=>{const tt=(0,e.getWindowId)(qe);if(Se.get(tt)){const Qe=new D(Ue,Je);let rt=Ie.get(tt);return rt||(rt=[],Ie.set(tt,rt)),rt.push(Qe),Qe}else return(0,e.scheduleAtNextAnimationFrame)(qe,Ue,Je)}})();function T(De){return(0,e.getWindow)(De).getComputedStyle(De,null)}function M(De,Ie){const Re=(0,e.getWindow)(De),Se=Re.document;if(De!==Se.body)return new P(De.clientWidth,De.clientHeight);if(o.isIOS&&Re?.visualViewport)return new P(Re.visualViewport.width,Re.visualViewport.height);if(Re?.innerWidth&&Re.innerHeight)return new P(Re.innerWidth,Re.innerHeight);if(Se.body&&Se.body.clientWidth&&Se.body.clientHeight)return new P(Se.body.clientWidth,Se.body.clientHeight);if(Se.documentElement&&Se.documentElement.clientWidth&&Se.documentElement.clientHeight)return new P(Se.documentElement.clientWidth,Se.documentElement.clientHeight);if(Ie)return M(Ie);throw new Error("Unable to figure out browser width and height")}class A{static convertToPixels(Ie,Re){return parseFloat(Re)||0}static getDimension(Ie,Re,Se){const We=T(Ie),qe=We?We.getPropertyValue(Re):"0";return A.convertToPixels(Ie,qe)}static getBorderLeftWidth(Ie){return A.getDimension(Ie,"border-left-width","borderLeftWidth")}static getBorderRightWidth(Ie){return A.getDimension(Ie,"border-right-width","borderRightWidth")}static getBorderTopWidth(Ie){return A.getDimension(Ie,"border-top-width","borderTopWidth")}static getBorderBottomWidth(Ie){return A.getDimension(Ie,"border-bottom-width","borderBottomWidth")}static getPaddingLeft(Ie){return A.getDimension(Ie,"padding-left","paddingLeft")}static getPaddingRight(Ie){return A.getDimension(Ie,"padding-right","paddingRight")}static getPaddingTop(Ie){return A.getDimension(Ie,"padding-top","paddingTop")}static getPaddingBottom(Ie){return A.getDimension(Ie,"padding-bottom","paddingBottom")}static getMarginLeft(Ie){return A.getDimension(Ie,"margin-left","marginLeft")}static getMarginTop(Ie){return A.getDimension(Ie,"margin-top","marginTop")}static getMarginRight(Ie){return A.getDimension(Ie,"margin-right","marginRight")}static getMarginBottom(Ie){return A.getDimension(Ie,"margin-bottom","marginBottom")}}class P{static{this.None=new P(0,0)}constructor(Ie,Re){this.width=Ie,this.height=Re}with(Ie=this.width,Re=this.height){return Ie!==this.width||Re!==this.height?new P(Ie,Re):this}static is(Ie){return typeof Ie=="object"&&typeof Ie.height=="number"&&typeof Ie.width=="number"}static lift(Ie){return Ie instanceof P?Ie:new P(Ie.width,Ie.height)}static equals(Ie,Re){return Ie===Re?!0:!Ie||!Re?!1:Ie.width===Re.width&&Ie.height===Re.height}}e.Dimension=P;function N(De){let Ie=De.offsetParent,Re=De.offsetTop,Se=De.offsetLeft;for(;(De=De.parentNode)!==null&&De!==De.ownerDocument.body&&De!==De.ownerDocument.documentElement;){Re-=De.scrollTop;const We=Y(De)?null:T(De);We&&(Se-=We.direction!=="rtl"?De.scrollLeft:-De.scrollLeft),De===Ie&&(Se+=A.getBorderLeftWidth(De),Re+=A.getBorderTopWidth(De),Re+=De.offsetTop,Se+=De.offsetLeft,Ie=De.offsetParent)}return{left:Se,top:Re}}function O(De,Ie,Re){typeof Ie=="number"&&(De.style.width=`${Ie}px`),typeof Re=="number"&&(De.style.height=`${Re}px`)}function F(De){const Ie=De.getBoundingClientRect(),Re=(0,e.getWindow)(De);return{left:Ie.left+Re.scrollX,top:Ie.top+Re.scrollY,width:Ie.width,height:Ie.height}}function x(De){let Ie=De,Re=1;do{const Se=T(Ie).zoom;Se!=null&&Se!=="1"&&(Re*=Se),Ie=Ie.parentElement}while(Ie!==null&&Ie!==Ie.ownerDocument.documentElement);return Re}function W(De){const Ie=A.getMarginLeft(De)+A.getMarginRight(De);return De.offsetWidth+Ie}function V(De){const Ie=A.getBorderLeftWidth(De)+A.getBorderRightWidth(De),Re=A.getPaddingLeft(De)+A.getPaddingRight(De);return De.offsetWidth-Ie-Re}function q(De){const Ie=A.getBorderTopWidth(De)+A.getBorderBottomWidth(De),Re=A.getPaddingTop(De)+A.getPaddingBottom(De);return De.offsetHeight-Ie-Re}function H(De){const Ie=A.getMarginTop(De)+A.getMarginBottom(De);return De.offsetHeight+Ie}function z(De,Ie){return!!Ie?.contains(De)}function U(De,Ie,Re){for(;De&&De.nodeType===De.ELEMENT_NODE;){if(De.classList.contains(Ie))return De;if(Re){if(typeof Re=="string"){if(De.classList.contains(Re))return null}else if(De===Re)return null}De=De.parentNode}return null}function j(De,Ie,Re){return!!U(De,Ie,Re)}function Y(De){return De&&!!De.host&&!!De.mode}function G(De){return!!K(De)}function K(De){for(;De.parentNode;){if(De===De.ownerDocument?.body)return null;De=De.parentNode}return Y(De)?De:null}function R(){let De=ue().activeElement;for(;De?.shadowRoot;)De=De.shadowRoot.activeElement;return De}function J(De){return R()===De}function ie(De){return z(R(),De)}function ue(){return(0,e.getWindowsCount)()<=1?i.mainWindow.document:Array.from((0,e.getWindows)()).map(({window:Ie})=>Ie.document).find(Ie=>Ie.hasFocus())??i.mainWindow.document}function he(){return ue().defaultView?.window??i.mainWindow}const pe=new Map;function ae(){return new ee}class ee{constructor(){this._currentCssStyle="",this._styleSheet=void 0}setStyle(Ie){Ie!==this._currentCssStyle&&(this._currentCssStyle=Ie,this._styleSheet?this._styleSheet.innerText=Ie:this._styleSheet=de(i.mainWindow.document.head,Re=>Re.innerText=Ie))}dispose(){this._styleSheet&&(this._styleSheet.remove(),this._styleSheet=void 0)}}function de(De=i.mainWindow.document.head,Ie,Re){const Se=document.createElement("style");if(Se.type="text/css",Se.media="screen",Ie?.(Se),De.appendChild(Se),Re&&Re.add((0,p.toDisposable)(()=>Se.remove())),De===i.mainWindow.document.head){const We=new Set;pe.set(Se,We);for(const{window:qe,disposables:Ue}of(0,e.getWindows)()){if(qe===i.mainWindow)continue;const Je=Ue.add(ge(Se,We,qe));Re?.add(Je)}}return Se}function ge(De,Ie,Re){const Se=new p.DisposableStore,We=De.cloneNode(!0);Re.document.head.appendChild(We),Se.add((0,p.toDisposable)(()=>We.remove()));for(const qe of $(De))We.sheet?.insertRule(qe.cssText,We.sheet?.cssRules.length);return Se.add(e.sharedMutationObserver.observe(De,Se,{childList:!0})(()=>{We.textContent=De.textContent})),Ie.add(We),Se.add((0,p.toDisposable)(()=>Ie.delete(We))),Se}e.sharedMutationObserver=new class{constructor(){this.mutationObservers=new Map}observe(De,Ie,Re){let Se=this.mutationObservers.get(De);Se||(Se=new Map,this.mutationObservers.set(De,Se));const We=(0,t.hash)(Re);let qe=Se.get(We);if(qe)qe.users+=1;else{const Ue=new _.Emitter,Je=new MutationObserver(Qe=>Ue.fire(Qe));Je.observe(De,Re);const tt=qe={users:1,observer:Je,onDidMutate:Ue.event};Ie.add((0,p.toDisposable)(()=>{tt.users-=1,tt.users===0&&(Ue.dispose(),Je.disconnect(),Se?.delete(We),Se?.size===0&&this.mutationObservers.delete(De))})),Se.set(We,qe)}return qe.onDidMutate}};let X=null;function B(){return X||(X=de()),X}function $(De){return De?.sheet?.rules?De.sheet.rules:De?.sheet?.cssRules?De.sheet.cssRules:[]}function Q(De,Ie,Re=B()){if(!(!Re||!Ie)){Re.sheet?.insertRule(`${De} {${Ie}}`,0);for(const Se of pe.get(Re)??[])Q(De,Ie,Se)}}function Z(De,Ie=B()){if(!Ie)return;const Re=$(Ie),Se=[];for(let We=0;We=0;We--)Ie.sheet?.deleteRule(Se[We]);for(const We of pe.get(Ie)??[])Z(De,We)}function te(De){return typeof De.selectorText=="string"}function re(De){return De instanceof HTMLElement||De instanceof(0,e.getWindow)(De).HTMLElement}function le(De){return De instanceof HTMLAnchorElement||De instanceof(0,e.getWindow)(De).HTMLAnchorElement}function me(De){return De instanceof SVGElement||De instanceof(0,e.getWindow)(De).SVGElement}function Ce(De){return De instanceof MouseEvent||De instanceof(0,e.getWindow)(De).MouseEvent}function ye(De){return De instanceof KeyboardEvent||De instanceof(0,e.getWindow)(De).KeyboardEvent}e.EventType={CLICK:"click",AUXCLICK:"auxclick",DBLCLICK:"dblclick",MOUSE_UP:"mouseup",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_MOVE:"mousemove",MOUSE_OUT:"mouseout",MOUSE_ENTER:"mouseenter",MOUSE_LEAVE:"mouseleave",MOUSE_WHEEL:"wheel",POINTER_UP:"pointerup",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",POINTER_LEAVE:"pointerleave",CONTEXT_MENU:"contextmenu",WHEEL:"wheel",KEY_DOWN:"keydown",KEY_PRESS:"keypress",KEY_UP:"keyup",LOAD:"load",BEFORE_UNLOAD:"beforeunload",UNLOAD:"unload",PAGE_SHOW:"pageshow",PAGE_HIDE:"pagehide",PASTE:"paste",ABORT:"abort",ERROR:"error",RESIZE:"resize",SCROLL:"scroll",FULLSCREEN_CHANGE:"fullscreenchange",WK_FULLSCREEN_CHANGE:"webkitfullscreenchange",SELECT:"select",CHANGE:"change",SUBMIT:"submit",RESET:"reset",FOCUS:"focus",FOCUS_IN:"focusin",FOCUS_OUT:"focusout",BLUR:"blur",INPUT:"input",STORAGE:"storage",DRAG_START:"dragstart",DRAG:"drag",DRAG_ENTER:"dragenter",DRAG_LEAVE:"dragleave",DRAG_OVER:"dragover",DROP:"drop",DRAG_END:"dragend",ANIMATION_START:d.isWebKit?"webkitAnimationStart":"animationstart",ANIMATION_END:d.isWebKit?"webkitAnimationEnd":"animationend",ANIMATION_ITERATION:d.isWebKit?"webkitAnimationIteration":"animationiteration"};function Le(De){const Ie=De;return!!(Ie&&typeof Ie.preventDefault=="function"&&typeof Ie.stopPropagation=="function")}e.EventHelper={stop:(De,Ie)=>(De.preventDefault(),Ie&&De.stopPropagation(),De)};function Ee(De){const Ie=[];for(let Re=0;De&&De.nodeType===De.ELEMENT_NODE;Re++)Ie[Re]=De.scrollTop,De=De.parentNode;return Ie}function Me(De,Ie){for(let Re=0;De&&De.nodeType===De.ELEMENT_NODE;Re++)De.scrollTop!==Ie[Re]&&(De.scrollTop=Ie[Re]),De=De.parentNode}class Ae extends p.Disposable{static hasFocusWithin(Ie){if(re(Ie)){const Re=K(Ie),Se=Re?Re.activeElement:Ie.ownerDocument.activeElement;return z(Se,Ie)}else{const Re=Ie;return z(Re.document.activeElement,Re.document)}}constructor(Ie){super(),this._onDidFocus=this._register(new _.Emitter),this.onDidFocus=this._onDidFocus.event,this._onDidBlur=this._register(new _.Emitter),this.onDidBlur=this._onDidBlur.event;let Re=Ae.hasFocusWithin(Ie),Se=!1;const We=()=>{Se=!1,Re||(Re=!0,this._onDidFocus.fire())},qe=()=>{Re&&(Se=!0,(re(Ie)?(0,e.getWindow)(Ie):Ie).setTimeout(()=>{Se&&(Se=!1,Re=!1,this._onDidBlur.fire())},0))};this._refreshStateHandler=()=>{Ae.hasFocusWithin(Ie)!==Re&&(Re?qe():We())},this._register(l(Ie,e.EventType.FOCUS,We,!0)),this._register(l(Ie,e.EventType.BLUR,qe,!0)),re(Ie)&&(this._register(l(Ie,e.EventType.FOCUS_IN,()=>this._refreshStateHandler())),this._register(l(Ie,e.EventType.FOCUS_OUT,()=>this._refreshStateHandler())))}}function Ne(De){return new Ae(De)}function Ke(De,Ie){return De.after(Ie),Ie}function ze(De,...Ie){if(De.append(...Ie),Ie.length===1&&typeof Ie[0]!="string")return Ie[0]}function Ge(De,Ie){return De.insertBefore(Ie,De.firstChild),Ie}function it(De,...Ie){De.innerText="",ze(De,...Ie)}const Oe=/([\w\-]+)?(#([\w\-]+))?((\.([\w\-]+))*)/;var Fe;(function(De){De.HTML="http://www.w3.org/1999/xhtml",De.SVG="http://www.w3.org/2000/svg"})(Fe||(e.Namespace=Fe={}));function fe(De,Ie,Re,...Se){const We=Oe.exec(Ie);if(!We)throw new Error("Bad use of emmet");const qe=We[1]||"div";let Ue;return De!==Fe.HTML?Ue=document.createElementNS(De,qe):Ue=document.createElement(qe),We[3]&&(Ue.id=We[3]),We[4]&&(Ue.className=We[4].replace(/\./g," ").trim()),Re&&Object.entries(Re).forEach(([Je,tt])=>{typeof tt>"u"||(/^on\w+$/.test(Je)?Ue[Je]=tt:Je==="selected"?tt&&Ue.setAttribute(Je,"true"):Ue.setAttribute(Je,tt))}),Ue.append(...Se),Ue}function _e(De,Ie,...Re){return fe(Fe.HTML,De,Ie,...Re)}_e.SVG=function(De,Ie,...Re){return fe(Fe.SVG,De,Ie,...Re)};function xe(De,...Ie){De?be(...Ie):ve(...Ie)}function be(...De){for(const Ie of De)Ie.style.display="",Ie.removeAttribute("aria-hidden")}function ve(...De){for(const Ie of De)Ie.style.display="none",Ie.setAttribute("aria-hidden","true")}function we(De,Ie){const Re=De.devicePixelRatio*Ie;return Math.max(1,Math.floor(Re))/De.devicePixelRatio}function Te(De){i.mainWindow.open(De,"_blank","noopener")}function Pe(De,Ie){const Re=()=>{Ie(),Se=(0,e.scheduleAtNextAnimationFrame)(De,Re)};let Se=(0,e.scheduleAtNextAnimationFrame)(De,Re);return(0,p.toDisposable)(()=>Se.dispose())}n.RemoteAuthorities.setPreferredWebSchema(/^https:/.test(i.mainWindow.location.href)?"https":"http");function Be(De){return De?`url('${n.FileAccess.uriToBrowserUri(De).toString(!0).replace(/'/g,"%27")}')`:"url('')"}function He(De){return`'${De.replace(/'/g,"%27")}'`}function $e(De,Ie){if(De!==void 0){const Re=De.match(/^\s*var\((.+)\)$/);if(Re){const Se=Re[1].split(",",2);return Se.length===2&&(Ie=$e(Se[1].trim(),Ie)),`var(${Se[0]}, ${Ie})`}return De}return Ie}function je(De,Ie=!1){const Re=document.createElement("a");return b.addHook("afterSanitizeAttributes",Se=>{for(const We of["href","src"])if(Se.hasAttribute(We)){const qe=Se.getAttribute(We);if(We==="href"&&qe.startsWith("#"))continue;if(Re.href=qe,!De.includes(Re.protocol.replace(/:$/,""))){if(Ie&&We==="src"&&Re.href.startsWith("data:"))continue;Se.removeAttribute(We)}}}),(0,p.toDisposable)(()=>{b.removeHook("afterSanitizeAttributes")})}e.basicMarkupHtmlTags=Object.freeze(["a","abbr","b","bdo","blockquote","br","caption","cite","code","col","colgroup","dd","del","details","dfn","div","dl","dt","em","figcaption","figure","h1","h2","h3","h4","h5","h6","hr","i","img","input","ins","kbd","label","li","mark","ol","p","pre","q","rp","rt","ruby","samp","small","small","source","span","strike","strong","sub","summary","sup","table","tbody","td","tfoot","th","thead","time","tr","tt","u","ul","var","video","wbr"]);const Xe=Object.freeze({ALLOWED_TAGS:["a","button","blockquote","code","div","h1","h2","h3","h4","h5","h6","hr","input","label","li","p","pre","select","small","span","strong","textarea","ul","ol"],ALLOWED_ATTR:["href","data-href","data-command","target","title","name","src","alt","class","id","role","tabindex","style","data-code","width","height","align","x-dispatch","required","checked","placeholder","type","start"],RETURN_DOM:!1,RETURN_DOM_FRAGMENT:!1,RETURN_TRUSTED_TYPE:!0});class et extends _.Emitter{constructor(){super(),this._subscriptions=new p.DisposableStore,this._keyStatus={altKey:!1,shiftKey:!1,ctrlKey:!1,metaKey:!1},this._subscriptions.add(_.Event.runAndSubscribe(e.onDidRegisterWindow,({window:Ie,disposables:Re})=>this.registerListeners(Ie,Re),{window:i.mainWindow,disposables:this._subscriptions}))}registerListeners(Ie,Re){Re.add(l(Ie,"keydown",Se=>{if(Se.defaultPrevented)return;const We=new I.StandardKeyboardEvent(Se);if(!(We.keyCode===6&&Se.repeat)){if(Se.altKey&&!this._keyStatus.altKey)this._keyStatus.lastKeyPressed="alt";else if(Se.ctrlKey&&!this._keyStatus.ctrlKey)this._keyStatus.lastKeyPressed="ctrl";else if(Se.metaKey&&!this._keyStatus.metaKey)this._keyStatus.lastKeyPressed="meta";else if(Se.shiftKey&&!this._keyStatus.shiftKey)this._keyStatus.lastKeyPressed="shift";else if(We.keyCode!==6)this._keyStatus.lastKeyPressed=void 0;else return;this._keyStatus.altKey=Se.altKey,this._keyStatus.ctrlKey=Se.ctrlKey,this._keyStatus.metaKey=Se.metaKey,this._keyStatus.shiftKey=Se.shiftKey,this._keyStatus.lastKeyPressed&&(this._keyStatus.event=Se,this.fire(this._keyStatus))}},!0)),Re.add(l(Ie,"keyup",Se=>{Se.defaultPrevented||(!Se.altKey&&this._keyStatus.altKey?this._keyStatus.lastKeyReleased="alt":!Se.ctrlKey&&this._keyStatus.ctrlKey?this._keyStatus.lastKeyReleased="ctrl":!Se.metaKey&&this._keyStatus.metaKey?this._keyStatus.lastKeyReleased="meta":!Se.shiftKey&&this._keyStatus.shiftKey?this._keyStatus.lastKeyReleased="shift":this._keyStatus.lastKeyReleased=void 0,this._keyStatus.lastKeyPressed!==this._keyStatus.lastKeyReleased&&(this._keyStatus.lastKeyPressed=void 0),this._keyStatus.altKey=Se.altKey,this._keyStatus.ctrlKey=Se.ctrlKey,this._keyStatus.metaKey=Se.metaKey,this._keyStatus.shiftKey=Se.shiftKey,this._keyStatus.lastKeyReleased&&(this._keyStatus.event=Se,this.fire(this._keyStatus)))},!0)),Re.add(l(Ie.document.body,"mousedown",()=>{this._keyStatus.lastKeyPressed=void 0},!0)),Re.add(l(Ie.document.body,"mouseup",()=>{this._keyStatus.lastKeyPressed=void 0},!0)),Re.add(l(Ie.document.body,"mousemove",Se=>{Se.buttons&&(this._keyStatus.lastKeyPressed=void 0)},!0)),Re.add(l(Ie,"blur",()=>{this.resetKeyStatus()}))}get keyStatus(){return this._keyStatus}resetKeyStatus(){this.doResetKeyStatus(),this.fire(this._keyStatus)}doResetKeyStatus(){this._keyStatus={altKey:!1,shiftKey:!1,ctrlKey:!1,metaKey:!1}}static getInstance(){return et.instance||(et.instance=new et),et.instance}dispose(){super.dispose(),this._subscriptions.dispose()}}e.ModifierKeyEmitter=et;class dt extends p.Disposable{constructor(Ie,Re){super(),this.element=Ie,this.callbacks=Re,this.counter=0,this.dragStartTime=0,this.registerListeners()}registerListeners(){this.callbacks.onDragStart&&this._register(l(this.element,e.EventType.DRAG_START,Ie=>{this.callbacks.onDragStart?.(Ie)})),this.callbacks.onDrag&&this._register(l(this.element,e.EventType.DRAG,Ie=>{this.callbacks.onDrag?.(Ie)})),this._register(l(this.element,e.EventType.DRAG_ENTER,Ie=>{this.counter++,this.dragStartTime=Ie.timeStamp,this.callbacks.onDragEnter?.(Ie)})),this._register(l(this.element,e.EventType.DRAG_OVER,Ie=>{Ie.preventDefault(),this.callbacks.onDragOver?.(Ie,Ie.timeStamp-this.dragStartTime)})),this._register(l(this.element,e.EventType.DRAG_LEAVE,Ie=>{this.counter--,this.counter===0&&(this.dragStartTime=0,this.callbacks.onDragLeave?.(Ie))})),this._register(l(this.element,e.EventType.DRAG_END,Ie=>{this.counter=0,this.dragStartTime=0,this.callbacks.onDragEnd?.(Ie)})),this._register(l(this.element,e.EventType.DROP,Ie=>{this.counter=0,this.dragStartTime=0,this.callbacks.onDrop?.(Ie)}))}}e.DragAndDropObserver=dt;const at=/(?[\w\-]+)?(?:#(?[\w\-]+))?(?(?:\.(?:[\w\-]+))*)(?:@(?(?:[\w\_])+))?/;function st(De,...Ie){let Re,Se;Array.isArray(Ie[0])?(Re={},Se=Ie[0]):(Re=Ie[0]||{},Se=Ie[1]);const We=at.exec(De);if(!We||!We.groups)throw new Error("Bad use of h");const qe=We.groups.tag||"div",Ue=document.createElement(qe);We.groups.id&&(Ue.id=We.groups.id);const Je=[];if(We.groups.class)for(const Qe of We.groups.class.split("."))Qe!==""&&Je.push(Qe);if(Re.className!==void 0)for(const Qe of Re.className.split("."))Qe!==""&&Je.push(Qe);Je.length>0&&(Ue.className=Je.join(" "));const tt={};if(We.groups.name&&(tt[We.groups.name]=Ue),Se)for(const Qe of Se)re(Qe)?Ue.appendChild(Qe):typeof Qe=="string"?Ue.append(Qe):"root"in Qe&&(Object.assign(tt,Qe),Ue.appendChild(Qe.root));for(const[Qe,rt]of Object.entries(Re))if(Qe!=="className")if(Qe==="style")for(const[Ct,ut]of Object.entries(rt))Ue.style.setProperty(bt(Ct),typeof ut=="number"?ut+"px":""+ut);else Qe==="tabIndex"?Ue.tabIndex=rt:Ue.setAttribute(bt(Qe),rt.toString());return tt.root=Ue,tt}function pt(De,...Ie){let Re,Se;Array.isArray(Ie[0])?(Re={},Se=Ie[0]):(Re=Ie[0]||{},Se=Ie[1]);const We=at.exec(De);if(!We||!We.groups)throw new Error("Bad use of h");const qe=We.groups.tag||"div",Ue=document.createElementNS("http://www.w3.org/2000/svg",qe);We.groups.id&&(Ue.id=We.groups.id);const Je=[];if(We.groups.class)for(const Qe of We.groups.class.split("."))Qe!==""&&Je.push(Qe);if(Re.className!==void 0)for(const Qe of Re.className.split("."))Qe!==""&&Je.push(Qe);Je.length>0&&(Ue.className=Je.join(" "));const tt={};if(We.groups.name&&(tt[We.groups.name]=Ue),Se)for(const Qe of Se)re(Qe)?Ue.appendChild(Qe):typeof Qe=="string"?Ue.append(Qe):"root"in Qe&&(Object.assign(tt,Qe),Ue.appendChild(Qe.root));for(const[Qe,rt]of Object.entries(Re))if(Qe!=="className")if(Qe==="style")for(const[Ct,ut]of Object.entries(rt))Ue.style.setProperty(bt(Ct),typeof ut=="number"?ut+"px":""+ut);else Qe==="tabIndex"?Ue.tabIndex=rt:Ue.setAttribute(bt(Qe),rt.toString());return tt.root=Ue,tt}function bt(De){return De.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}}),define(ne[630],se([1,0,5,2,21]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createStyleSheetFromObservable=E;function E(y){const m=new k.DisposableStore,_=m.add((0,d.createStyleSheet2)());return m.add((0,I.autorun)(b=>{_.setStyle(y.read(b))})),m}}),define(ne[352],se([1,0,5]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.renderText=k,e.renderFormattedText=I,e.createElement=E;function k(n,o={}){const t=E(o);return t.textContent=n,t}function I(n,o={}){const t=E(o);return m(t,_(n,!!o.renderCodeSegments),o.actionHandler,o.renderCodeSegments),t}function E(n){const o=n.inline?"span":"div",t=document.createElement(o);return n.className&&(t.className=n.className),t}class y{constructor(o){this.source=o,this.index=0}eos(){return this.index>=this.source.length}next(){const o=this.peek();return this.advance(),o}peek(){return this.source[this.index]}advance(){this.index++}}function m(n,o,t,i){let s;if(o.type===2)s=document.createTextNode(o.content||"");else if(o.type===3)s=document.createElement("b");else if(o.type===4)s=document.createElement("i");else if(o.type===7&&i)s=document.createElement("code");else if(o.type===5&&t){const g=document.createElement("a");t.disposables.add(d.addStandardDisposableListener(g,"click",c=>{t.callback(String(o.index),c)})),s=g}else o.type===8?s=document.createElement("br"):o.type===1&&(s=n);s&&n!==s&&n.appendChild(s),s&&Array.isArray(o.children)&&o.children.forEach(g=>{m(s,g,t,i)})}function _(n,o){const t={type:1,children:[]};let i=0,s=t;const g=[],c=new y(n);for(;!c.eos();){let l=c.next();const a=l==="\\"&&p(c.peek(),o)!==0;if(a&&(l=c.next()),!a&&b(l,o)&&l===c.peek()){c.advance(),s.type===2&&(s=g.pop());const r=p(l,o);if(s.type===r||s.type===5&&r===6)s=g.pop();else{const u={type:r,children:[]};r===5&&(u.index=i,i++),s.children.push(u),g.push(s),s=u}}else if(l===` -`)s.type===2&&(s=g.pop()),s.children.push({type:8});else if(s.type!==2){const r={type:2,content:l};s.children.push(r),g.push(s),s=r}else s.content+=l}return s.type===2&&(s=g.pop()),g.length,t}function b(n,o){return p(n,o)!==0}function p(n,o){switch(n){case"*":return 3;case"_":return 4;case"[":return 5;case"]":return 6;case"`":return o?7:0;default:return 0}}}),define(ne[172],se([1,0,5,2]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GlobalPointerMoveMonitor=void 0;class I{constructor(){this._hooks=new k.DisposableStore,this._pointerMoveCallback=null,this._onStopCallback=null}dispose(){this.stopMonitoring(!1),this._hooks.dispose()}stopMonitoring(y,m){if(!this.isMonitoring())return;this._hooks.clear(),this._pointerMoveCallback=null;const _=this._onStopCallback;this._onStopCallback=null,y&&_&&_(m)}isMonitoring(){return!!this._pointerMoveCallback}startMonitoring(y,m,_,b,p){this.isMonitoring()&&this.stopMonitoring(!1),this._pointerMoveCallback=b,this._onStopCallback=p;let n=y;try{y.setPointerCapture(m),this._hooks.add((0,k.toDisposable)(()=>{try{y.releasePointerCapture(m)}catch{}}))}catch{n=d.getWindow(y)}this._hooks.add(d.addDisposableListener(n,d.EventType.POINTER_MOVE,o=>{if(o.buttons!==_){this.stopMonitoring(!0);return}o.preventDefault(),this._pointerMoveCallback(o)})),this._hooks.add(d.addDisposableListener(n,d.EventType.POINTER_UP,o=>this.stopMonitoring(!0)))}}e.GlobalPointerMoveMonitor=I}),define(ne[253],se([1,0,5,6,2]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PixelRatio=void 0;class E extends I.Disposable{constructor(b){super(),this._onDidChange=this._register(new k.Emitter),this.onDidChange=this._onDidChange.event,this._listener=()=>this._handleChange(b,!0),this._mediaQueryList=null,this._handleChange(b,!1)}_handleChange(b,p){this._mediaQueryList?.removeEventListener("change",this._listener),this._mediaQueryList=b.matchMedia(`(resolution: ${b.devicePixelRatio}dppx)`),this._mediaQueryList.addEventListener("change",this._listener),p&&this._onDidChange.fire()}}class y extends I.Disposable{get value(){return this._value}constructor(b){super(),this._onDidChange=this._register(new k.Emitter),this.onDidChange=this._onDidChange.event,this._value=this._getPixelRatio(b);const p=this._register(new E(b));this._register(p.onDidChange(()=>{this._value=this._getPixelRatio(b),this._onDidChange.fire(this._value)}))}_getPixelRatio(b){const p=document.createElement("canvas").getContext("2d"),n=b.devicePixelRatio||1,o=p.webkitBackingStorePixelRatio||p.mozBackingStorePixelRatio||p.msBackingStorePixelRatio||p.oBackingStorePixelRatio||p.backingStorePixelRatio||1;return n/o}}class m{constructor(){this.mapWindowIdToPixelRatioMonitor=new Map}_getOrCreatePixelRatioMonitor(b){const p=(0,d.getWindowId)(b);let n=this.mapWindowIdToPixelRatioMonitor.get(p);return n||(n=(0,I.markAsSingleton)(new y(b)),this.mapWindowIdToPixelRatioMonitor.set(p,n),(0,I.markAsSingleton)(k.Event.once(d.onDidUnregisterWindow)(({vscodeWindowId:o})=>{o===p&&(n?.dispose(),this.mapWindowIdToPixelRatioMonitor.delete(p))}))),n}getInstance(b){return this._getOrCreatePixelRatioMonitor(b)}}e.PixelRatio=new m}),define(ne[69],se([1,0,5,52,13,126,6,2,73]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Gesture=e.EventType=void 0;var b;(function(n){n.Tap="-monaco-gesturetap",n.Change="-monaco-gesturechange",n.Start="-monaco-gesturestart",n.End="-monaco-gesturesend",n.Contextmenu="-monaco-gesturecontextmenu"})(b||(e.EventType=b={}));class p extends m.Disposable{static{this.SCROLL_FRICTION=-.005}static{this.HOLD_DELAY=700}static{this.CLEAR_TAP_COUNT_TIME=400}constructor(){super(),this.dispatched=!1,this.targets=new _.LinkedList,this.ignoreTargets=new _.LinkedList,this.activeTouches={},this.handle=null,this._lastSetTapCountTime=0,this._register(y.Event.runAndSubscribe(d.onDidRegisterWindow,({window:o,disposables:t})=>{t.add(d.addDisposableListener(o.document,"touchstart",i=>this.onTouchStart(i),{passive:!1})),t.add(d.addDisposableListener(o.document,"touchend",i=>this.onTouchEnd(o,i))),t.add(d.addDisposableListener(o.document,"touchmove",i=>this.onTouchMove(i),{passive:!1}))},{window:k.mainWindow,disposables:this._store}))}static addTarget(o){if(!p.isTouchDevice())return m.Disposable.None;p.INSTANCE||(p.INSTANCE=(0,m.markAsSingleton)(new p));const t=p.INSTANCE.targets.push(o);return(0,m.toDisposable)(t)}static ignoreTarget(o){if(!p.isTouchDevice())return m.Disposable.None;p.INSTANCE||(p.INSTANCE=(0,m.markAsSingleton)(new p));const t=p.INSTANCE.ignoreTargets.push(o);return(0,m.toDisposable)(t)}static isTouchDevice(){return"ontouchstart"in k.mainWindow||navigator.maxTouchPoints>0}dispose(){this.handle&&(this.handle.dispose(),this.handle=null),super.dispose()}onTouchStart(o){const t=Date.now();this.handle&&(this.handle.dispose(),this.handle=null);for(let i=0,s=o.targetTouches.length;i=p.HOLD_DELAY&&Math.abs(a.initialPageX-I.tail(a.rollingPageX))<30&&Math.abs(a.initialPageY-I.tail(a.rollingPageY))<30){const u=this.newGestureEvent(b.Contextmenu,a.initialTarget);u.pageX=I.tail(a.rollingPageX),u.pageY=I.tail(a.rollingPageY),this.dispatchEvent(u)}else if(s===1){const u=I.tail(a.rollingPageX),C=I.tail(a.rollingPageY),f=I.tail(a.rollingTimestamps)-a.rollingTimestamps[0],h=u-a.rollingPageX[0],v=C-a.rollingPageY[0],w=[...this.targets].filter(S=>a.initialTarget instanceof Node&&S.contains(a.initialTarget));this.inertia(o,w,i,Math.abs(h)/f,h>0?1:-1,u,Math.abs(v)/f,v>0?1:-1,C)}this.dispatchEvent(this.newGestureEvent(b.End,a.initialTarget)),delete this.activeTouches[l.identifier]}this.dispatched&&(t.preventDefault(),t.stopPropagation(),this.dispatched=!1)}newGestureEvent(o,t){const i=document.createEvent("CustomEvent");return i.initEvent(o,!1,!0),i.initialTarget=t,i.tapCount=0,i}dispatchEvent(o){if(o.type===b.Tap){const t=new Date().getTime();let i=0;t-this._lastSetTapCountTime>p.CLEAR_TAP_COUNT_TIME?i=1:i=2,this._lastSetTapCountTime=t,o.tapCount=i}else(o.type===b.Change||o.type===b.Contextmenu)&&(this._lastSetTapCountTime=0);if(o.initialTarget instanceof Node){for(const i of this.ignoreTargets)if(i.contains(o.initialTarget))return;const t=[];for(const i of this.targets)if(i.contains(o.initialTarget)){let s=0,g=o.initialTarget;for(;g&&g!==i;)s++,g=g.parentElement;t.push([s,i])}t.sort((i,s)=>i[0]-s[0]);for(const[i,s]of t)s.dispatchEvent(o),this.dispatched=!0}}inertia(o,t,i,s,g,c,l,a,r){this.handle=d.scheduleAtNextAnimationFrame(o,()=>{const u=Date.now(),C=u-i;let f=0,h=0,v=!0;s+=p.SCROLL_FRICTION*C,l+=p.SCROLL_FRICTION*C,s>0&&(v=!1,f=g*s*C),l>0&&(v=!1,h=a*l*C);const w=this.newGestureEvent(b.Change);w.translationX=f,w.translationY=h,t.forEach(S=>S.dispatchEvent(w)),v||this.inertia(o,t,u,s,g,c+f,l,a,r+h)})}onTouchMove(o){const t=Date.now();for(let i=0,s=o.changedTouches.length;i3&&(c.rollingPageX.shift(),c.rollingPageY.shift(),c.rollingTimestamps.shift()),c.rollingPageX.push(g.pageX),c.rollingPageY.push(g.pageY),c.rollingTimestamps.push(t)}this.dispatched&&(o.preventDefault(),o.stopPropagation(),this.dispatched=!1)}}e.Gesture=p,ke([E.memoize],p,"isTouchDevice",null)}),define(ne[46],se([1,0,5,458]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.setARIAContainer=b,e.alert=p,e.status=n;const k=2e4;let I,E,y,m,_;function b(t){I=document.createElement("div"),I.className="monaco-aria-container";const i=()=>{const g=document.createElement("div");return g.className="monaco-alert",g.setAttribute("role","alert"),g.setAttribute("aria-atomic","true"),I.appendChild(g),g};E=i(),y=i();const s=()=>{const g=document.createElement("div");return g.className="monaco-status",g.setAttribute("aria-live","polite"),g.setAttribute("aria-atomic","true"),I.appendChild(g),g};m=s(),_=s(),t.appendChild(I)}function p(t){I&&(E.textContent!==t?(d.clearNode(y),o(E,t)):(d.clearNode(E),o(y,t)))}function n(t){I&&(m.textContent!==t?(d.clearNode(_),o(m,t)):(d.clearNode(m),o(_,t)))}function o(t,i){d.clearNode(t),i.length>k&&(i=i.substr(0,k)),t.textContent=i,t.style.visibility="hidden",t.style.visibility="visible"}}),define(ne[353],se([1,0,248,5,2,16,188,462]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextView=e.LayoutAnchorMode=void 0,e.isAnchor=m,e.layout=b;function m(o){const t=o;return!!t&&typeof t.x=="number"&&typeof t.y=="number"}var _;(function(o){o[o.AVOID=0]="AVOID",o[o.ALIGN=1]="ALIGN"})(_||(e.LayoutAnchorMode=_={}));function b(o,t,i){const s=i.mode===_.ALIGN?i.offset:i.offset+i.size,g=i.mode===_.ALIGN?i.offset+i.size:i.offset;return i.position===0?t<=o-s?s:t<=g?g-t:Math.max(o-t,0):t<=g?g-t:t<=o-s?s:0}class p extends I.Disposable{static{this.BUBBLE_UP_EVENTS=["click","keydown","focus","blur"]}static{this.BUBBLE_DOWN_EVENTS=["click"]}constructor(t,i){super(),this.container=null,this.useFixedPosition=!1,this.useShadowDOM=!1,this.delegate=null,this.toDisposeOnClean=I.Disposable.None,this.toDisposeOnSetContainer=I.Disposable.None,this.shadowRoot=null,this.shadowRootHostElement=null,this.view=k.$(".context-view"),k.hide(this.view),this.setContainer(t,i),this._register((0,I.toDisposable)(()=>this.setContainer(null,1)))}setContainer(t,i){this.useFixedPosition=i!==1;const s=this.useShadowDOM;if(this.useShadowDOM=i===3,!(t===this.container&&s===this.useShadowDOM)&&(this.container&&(this.toDisposeOnSetContainer.dispose(),this.view.remove(),this.shadowRoot&&(this.shadowRoot=null,this.shadowRootHostElement?.remove(),this.shadowRootHostElement=null),this.container=null),t)){if(this.container=t,this.useShadowDOM){this.shadowRootHostElement=k.$(".shadow-root-host"),this.container.appendChild(this.shadowRootHostElement),this.shadowRoot=this.shadowRootHostElement.attachShadow({mode:"open"});const c=document.createElement("style");c.textContent=n,this.shadowRoot.appendChild(c),this.shadowRoot.appendChild(this.view),this.shadowRoot.appendChild(k.$("slot"))}else this.container.appendChild(this.view);const g=new I.DisposableStore;p.BUBBLE_UP_EVENTS.forEach(c=>{g.add(k.addStandardDisposableListener(this.container,c,l=>{this.onDOMEvent(l,!1)}))}),p.BUBBLE_DOWN_EVENTS.forEach(c=>{g.add(k.addStandardDisposableListener(this.container,c,l=>{this.onDOMEvent(l,!0)},!0))}),this.toDisposeOnSetContainer=g}}show(t){this.isVisible()&&this.hide(),k.clearNode(this.view),this.view.className="context-view monaco-component",this.view.style.top="0px",this.view.style.left="0px",this.view.style.zIndex=`${2575+(t.layer??0)}`,this.view.style.position=this.useFixedPosition?"fixed":"absolute",k.show(this.view),this.toDisposeOnClean=t.render(this.view)||I.Disposable.None,this.delegate=t,this.doLayout(),this.delegate.focus?.()}getViewElement(){return this.view}layout(){if(this.isVisible()){if(this.delegate.canRelayout===!1&&!(E.isIOS&&d.BrowserFeatures.pointerEvents)){this.hide();return}this.delegate?.layout?.(),this.doLayout()}}doLayout(){if(!this.isVisible())return;const t=this.delegate.getAnchor();let i;if(k.isHTMLElement(t)){const h=k.getDomNodePagePosition(t),v=k.getDomNodeZoomLevel(t);i={top:h.top*v,left:h.left*v,width:h.width*v,height:h.height*v}}else m(t)?i={top:t.y,left:t.x,width:t.width||1,height:t.height||2}:i={top:t.posy,left:t.posx,width:2,height:2};const s=k.getTotalWidth(this.view),g=k.getTotalHeight(this.view),c=this.delegate.anchorPosition||0,l=this.delegate.anchorAlignment||0,a=this.delegate.anchorAxisAlignment||0;let r,u;const C=k.getActiveWindow();if(a===0){const h={offset:i.top-C.pageYOffset,size:i.height,position:c===0?0:1},v={offset:i.left,size:i.width,position:l===0?0:1,mode:_.ALIGN};r=b(C.innerHeight,g,h)+C.pageYOffset,y.Range.intersects({start:r,end:r+g},{start:h.offset,end:h.offset+h.size})&&(v.mode=_.AVOID),u=b(C.innerWidth,s,v)}else{const h={offset:i.left,size:i.width,position:l===0?0:1},v={offset:i.top,size:i.height,position:c===0?0:1,mode:_.ALIGN};u=b(C.innerWidth,s,h),y.Range.intersects({start:u,end:u+s},{start:h.offset,end:h.offset+h.size})&&(v.mode=_.AVOID),r=b(C.innerHeight,g,v)+C.pageYOffset}this.view.classList.remove("top","bottom","left","right"),this.view.classList.add(c===0?"bottom":"top"),this.view.classList.add(l===0?"left":"right"),this.view.classList.toggle("fixed",this.useFixedPosition);const f=k.getDomNodePagePosition(this.container);this.view.style.top=`${r-(this.useFixedPosition?k.getDomNodePagePosition(this.view).top:f.top)}px`,this.view.style.left=`${u-(this.useFixedPosition?k.getDomNodePagePosition(this.view).left:f.left)}px`,this.view.style.width="initial"}hide(t){const i=this.delegate;this.delegate=null,i?.onHide&&i.onHide(t),this.toDisposeOnClean.dispose(),k.hide(this.view)}isVisible(){return!!this.delegate}onDOMEvent(t,i){this.delegate&&(this.delegate.onDOMEvent?this.delegate.onDOMEvent(t,k.getWindow(t).document.activeElement):i&&!k.isAncestor(t.target,this.container)&&this.hide())}dispose(){this.hide(),super.dispose()}}e.ContextView=p;const n=` - :host { - all: initial; /* 1st rule so subsequent properties are reset. */ - } - - .codicon[class*='codicon-'] { - font: normal normal normal 16px/1 codicon; - display: inline-block; - text-decoration: none; - text-rendering: auto; - text-align: center; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - } - - :host { - font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", system-ui, "Ubuntu", "Droid Sans", sans-serif; - } - - :host-context(.mac) { font-family: -apple-system, BlinkMacSystemFont, sans-serif; } - :host-context(.mac:lang(zh-Hans)) { font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", sans-serif; } - :host-context(.mac:lang(zh-Hant)) { font-family: -apple-system, BlinkMacSystemFont, "PingFang TC", sans-serif; } - :host-context(.mac:lang(ja)) { font-family: -apple-system, BlinkMacSystemFont, "Hiragino Kaku Gothic Pro", sans-serif; } - :host-context(.mac:lang(ko)) { font-family: -apple-system, BlinkMacSystemFont, "Nanum Gothic", "Apple SD Gothic Neo", "AppleGothic", sans-serif; } - - :host-context(.windows) { font-family: "Segoe WPC", "Segoe UI", sans-serif; } - :host-context(.windows:lang(zh-Hans)) { font-family: "Segoe WPC", "Segoe UI", "Microsoft YaHei", sans-serif; } - :host-context(.windows:lang(zh-Hant)) { font-family: "Segoe WPC", "Segoe UI", "Microsoft Jhenghei", sans-serif; } - :host-context(.windows:lang(ja)) { font-family: "Segoe WPC", "Segoe UI", "Yu Gothic UI", "Meiryo UI", sans-serif; } - :host-context(.windows:lang(ko)) { font-family: "Segoe WPC", "Segoe UI", "Malgun Gothic", "Dotom", sans-serif; } - - :host-context(.linux) { font-family: system-ui, "Ubuntu", "Droid Sans", sans-serif; } - :host-context(.linux:lang(zh-Hans)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans SC", "Source Han Sans CN", "Source Han Sans", sans-serif; } - :host-context(.linux:lang(zh-Hant)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans TC", "Source Han Sans TW", "Source Han Sans", sans-serif; } - :host-context(.linux:lang(ja)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans J", "Source Han Sans JP", "Source Han Sans", sans-serif; } - :host-context(.linux:lang(ko)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans K", "Source Han Sans JR", "Source Han Sans", "UnDotum", "FBaekmuk Gulim", sans-serif; } -`}),define(ne[354],se([1,0,5,11,463]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CountBadge=void 0;class I{constructor(y,m,_){this.options=m,this.styles=_,this.count=0,this.element=(0,d.append)(y,(0,d.$)(".monaco-count-badge")),this.countFormat=this.options.countFormat||"{0}",this.titleFormat=this.options.titleFormat||"",this.setCount(this.options.count||0)}setCount(y){this.count=y,this.render()}setTitleFormat(y){this.titleFormat=y,this.render()}render(){this.element.textContent=(0,k.format)(this.countFormat,this.count),this.element.title=(0,k.format)(this.titleFormat,this.count),this.element.style.backgroundColor=this.styles.badgeBackground??"",this.element.style.color=this.styles.badgeForeground??"",this.styles.badgeBorder&&(this.element.style.border=`1px solid ${this.styles.badgeBorder}`)}}e.CountBadge=I}),define(ne[631],se([1,0,5,47,69,41,6,303]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DropdownMenu=void 0;class m extends E.ActionRunner{constructor(p,n){super(),this._onDidChangeVisibility=this._register(new y.Emitter),this.onDidChangeVisibility=this._onDidChangeVisibility.event,this._element=(0,d.append)(p,(0,d.$)(".monaco-dropdown")),this._label=(0,d.append)(this._element,(0,d.$)(".dropdown-label"));let o=n.labelRenderer;o||(o=i=>(i.textContent=n.label||"",null));for(const i of[d.EventType.CLICK,d.EventType.MOUSE_DOWN,I.EventType.Tap])this._register((0,d.addDisposableListener)(this.element,i,s=>d.EventHelper.stop(s,!0)));for(const i of[d.EventType.MOUSE_DOWN,I.EventType.Tap])this._register((0,d.addDisposableListener)(this._label,i,s=>{(0,d.isMouseEvent)(s)&&(s.detail>1||s.button!==0)||(this.visible?this.hide():this.show())}));this._register((0,d.addDisposableListener)(this._label,d.EventType.KEY_UP,i=>{const s=new k.StandardKeyboardEvent(i);(s.equals(3)||s.equals(10))&&(d.EventHelper.stop(i,!0),this.visible?this.hide():this.show())}));const t=o(this._label);t&&this._register(t),this._register(I.Gesture.addTarget(this._label))}get element(){return this._element}show(){this.visible||(this.visible=!0,this._onDidChangeVisibility.fire(!0))}hide(){this.visible&&(this.visible=!1,this._onDidChangeVisibility.fire(!1))}dispose(){super.dispose(),this.hide(),this.boxContainer&&(this.boxContainer.remove(),this.boxContainer=void 0),this.contents&&(this.contents.remove(),this.contents=void 0),this._label&&(this._label.remove(),this._label=void 0)}}class _ extends m{constructor(p,n){super(p,n),this._options=n,this._actions=[],this.actions=n.actions||[]}set menuOptions(p){this._menuOptions=p}get menuOptions(){return this._menuOptions}get actions(){return this._options.actionProvider?this._options.actionProvider.getActions():this._actions}set actions(p){this._actions=p}show(){super.show(),this.element.classList.add("active"),this._options.contextMenuProvider.showContextMenu({getAnchor:()=>this.element,getActions:()=>this.actions,getActionsContext:()=>this.menuOptions?this.menuOptions.context:null,getActionViewItem:(p,n)=>this.menuOptions&&this.menuOptions.actionViewItemProvider?this.menuOptions.actionViewItemProvider(p,n):void 0,getKeyBinding:p=>this.menuOptions&&this.menuOptions.getKeyBinding?this.menuOptions.getKeyBinding(p):void 0,getMenuClassName:()=>this._options.menuClassName||"",onHide:()=>this.onHide(),actionRunner:this.menuOptions?this.menuOptions.actionRunner:void 0,anchorAlignment:this.menuOptions?this.menuOptions.anchorAlignment:0,domForShadowRoot:this._options.menuAsChild?this.element:void 0,skipTelemetry:this._options.skipTelemetry})}hide(){super.hide()}onHide(){this.hide(),this.element.classList.remove("active")}}e.DropdownMenu=_}),define(ne[114],se([1,0,5,30]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.renderLabelWithIcons=E,e.renderIcon=y;const I=new RegExp(`(\\\\)?\\$\\((${k.ThemeIcon.iconNameExpression}(?:${k.ThemeIcon.iconModifierExpression})?)\\)`,"g");function E(m){const _=new Array;let b,p=0,n=0;for(;(b=I.exec(m))!==null;){n=b.index||0,p{t=i===`\r -`?-1:0,s+=o;for(const g of n)g.end<=s||(g.start>=s&&(g.start+=t),g.end>=s&&(g.end+=t));return o+=t,"\u23CE"})}}e.HighlightedLabel=_}),define(ne[254],se([1,0,5,355,2,60,188,44,81,19,142,465]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IconLabel=void 0;class n{constructor(c){this._element=c}get element(){return this._element}set textContent(c){this.disposed||c===this._textContent||(this._textContent=c,this._element.textContent=c)}set classNames(c){this.disposed||(0,E.equals)(c,this._classNames)||(this._classNames=c,this._element.classList.value="",this._element.classList.add(...c))}set empty(c){this.disposed||c===this._empty||(this._empty=c,this._element.style.marginLeft=c?"0":"")}dispose(){this.disposed=!0}}class o extends I.Disposable{constructor(c,l){super(),this.customHovers=new Map,this.creationOptions=l,this.domNode=this._register(new n(d.append(c,d.$(".monaco-icon-label")))),this.labelContainer=d.append(this.domNode.element,d.$(".monaco-icon-label-container")),this.nameContainer=d.append(this.labelContainer,d.$("span.monaco-icon-name-container")),l?.supportHighlights||l?.supportIcons?this.nameNode=this._register(new s(this.nameContainer,!!l.supportIcons)):this.nameNode=new t(this.nameContainer),this.hoverDelegate=l?.hoverDelegate??(0,m.getDefaultHoverDelegate)("mouse")}get element(){return this.domNode.element}setLabel(c,l,a){const r=["monaco-icon-label"],u=["monaco-icon-label-container"];let C="";a&&(a.extraClasses&&r.push(...a.extraClasses),a.italic&&r.push("italic"),a.strikethrough&&r.push("strikethrough"),a.disabledCommand&&u.push("disabled"),a.title&&(typeof a.title=="string"?C+=a.title:C+=c));const f=this.domNode.element.querySelector(".monaco-icon-label-iconpath");if(a?.iconPath){let h;!f||!d.isHTMLElement(f)?(h=d.$(".monaco-icon-label-iconpath"),this.domNode.element.prepend(h)):h=f,h.style.backgroundImage=d.asCSSUrl(a?.iconPath)}else f&&f.remove();if(this.domNode.classNames=r,this.domNode.element.setAttribute("aria-label",C),this.labelContainer.classList.value="",this.labelContainer.classList.add(...u),this.setupHover(a?.descriptionTitle?this.labelContainer:this.element,a?.title),this.nameNode.setLabel(c,a),l||this.descriptionNode){const h=this.getOrCreateDescriptionNode();h instanceof k.HighlightedLabel?(h.set(l||"",a?a.descriptionMatches:void 0,void 0,a?.labelEscapeNewLines),this.setupHover(h.element,a?.descriptionTitle)):(h.textContent=l&&a?.labelEscapeNewLines?k.HighlightedLabel.escapeNewLines(l,[]):l||"",this.setupHover(h.element,a?.descriptionTitle||""),h.empty=!l)}if(a?.suffix||this.suffixNode){const h=this.getOrCreateSuffixNode();h.textContent=a?.suffix??""}}setupHover(c,l){const a=this.customHovers.get(c);if(a&&(a.dispose(),this.customHovers.delete(c)),!l){c.removeAttribute("title");return}if(this.hoverDelegate.showNativeHover)(function(u,C){(0,b.isString)(C)?u.title=(0,p.stripIcons)(C):C?.markdownNotSupportedFallback?u.title=C.markdownNotSupportedFallback:u.removeAttribute("title")})(c,l);else{const r=(0,_.getBaseLayerHoverDelegate)().setupManagedHover(this.hoverDelegate,c,l);r&&this.customHovers.set(c,r)}}dispose(){super.dispose();for(const c of this.customHovers.values())c.dispose();this.customHovers.clear()}getOrCreateSuffixNode(){if(!this.suffixNode){const c=this._register(new n(d.after(this.nameContainer,d.$("span.monaco-icon-suffix-container"))));this.suffixNode=this._register(new n(d.append(c.element,d.$("span.label-suffix"))))}return this.suffixNode}getOrCreateDescriptionNode(){if(!this.descriptionNode){const c=this._register(new n(d.append(this.labelContainer,d.$("span.monaco-icon-description-container"))));this.creationOptions?.supportDescriptionHighlights?this.descriptionNode=this._register(new k.HighlightedLabel(d.append(c.element,d.$("span.label-description")),{supportIcons:!!this.creationOptions.supportIcons})):this.descriptionNode=this._register(new n(d.append(c.element,d.$("span.label-description"))))}return this.descriptionNode}}e.IconLabel=o;class t{constructor(c){this.container=c,this.label=void 0,this.singleLabel=void 0}setLabel(c,l){if(!(this.label===c&&(0,E.equals)(this.options,l)))if(this.label=c,this.options=l,typeof c=="string")this.singleLabel||(this.container.innerText="",this.container.classList.remove("multiple"),this.singleLabel=d.append(this.container,d.$("a.label-name",{id:l?.domId}))),this.singleLabel.textContent=c;else{this.container.innerText="",this.container.classList.add("multiple"),this.singleLabel=void 0;for(let a=0;a{const u={start:a,end:a+r.length},C=l.map(f=>y.Range.intersect(u,f)).filter(f=>!y.Range.isEmpty(f)).map(({start:f,end:h})=>({start:f-a,end:h-a}));return a=u.end+c.length,C})}class s extends I.Disposable{constructor(c,l){super(),this.container=c,this.supportIcons=l,this.label=void 0,this.singleLabel=void 0}setLabel(c,l){if(!(this.label===c&&(0,E.equals)(this.options,l)))if(this.label=c,this.options=l,typeof c=="string")this.singleLabel||(this.container.innerText="",this.container.classList.remove("multiple"),this.singleLabel=this._register(new k.HighlightedLabel(d.append(this.container,d.$("a.label-name",{id:l?.domId})),{supportIcons:this.supportIcons}))),this.singleLabel.set(c,l?.matches,void 0,l?.labelEscapeNewLines);else{this.container.innerText="",this.container.classList.add("multiple"),this.singleLabel=void 0;const a=l?.separator||"/",r=i(c,a,l?.matches);for(let u=0;u{for(const m of E)this.getRenderer(y).disposeTemplate(m.templateData),m.templateData=null}),this.cache.clear(),this.transactionNodesPendingRemoval.clear()}getRenderer(E){const y=this.renderers.get(E);if(!y)throw new Error(`No renderer found for ${E}`);return y}}e.RowCache=k}),define(ne[633],se([1,0,5,14,2,469]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ProgressBar=void 0;const E="done",y="active",m="infinite",_="infinite-long-running",b="discrete";class p extends I.Disposable{static{this.LONG_RUNNING_INFINITE_THRESHOLD=1e4}constructor(o,t){super(),this.progressSignal=this._register(new I.MutableDisposable),this.workedVal=0,this.showDelayedScheduler=this._register(new k.RunOnceScheduler(()=>(0,d.show)(this.element),0)),this.longRunningScheduler=this._register(new k.RunOnceScheduler(()=>this.infiniteLongRunning(),p.LONG_RUNNING_INFINITE_THRESHOLD)),this.create(o,t)}create(o,t){this.element=document.createElement("div"),this.element.classList.add("monaco-progress-container"),this.element.setAttribute("role","progressbar"),this.element.setAttribute("aria-valuemin","0"),o.appendChild(this.element),this.bit=document.createElement("div"),this.bit.classList.add("progress-bit"),this.bit.style.backgroundColor=t?.progressBarBackground||"#0E70C0",this.element.appendChild(this.bit)}off(){this.bit.style.width="inherit",this.bit.style.opacity="1",this.element.classList.remove(y,m,_,b),this.workedVal=0,this.totalWork=void 0,this.longRunningScheduler.cancel(),this.progressSignal.clear()}stop(){return this.doDone(!1)}doDone(o){return this.element.classList.add(E),this.element.classList.contains(m)?(this.bit.style.opacity="0",o?setTimeout(()=>this.off(),200):this.off()):(this.bit.style.width="inherit",o?setTimeout(()=>this.off(),200):this.off()),this}infinite(){return this.bit.style.width="2%",this.bit.style.opacity="1",this.element.classList.remove(b,E,_),this.element.classList.add(y,m),this.longRunningScheduler.schedule(),this}infiniteLongRunning(){this.element.classList.add(_)}getContainer(){return this.element}}e.ProgressBar=p}),define(ne[173],se([1,0,5,93,69,14,126,6,2,16,470]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Sash=e.OrthogonalEdge=void 0;const p=!1;var n;(function(u){u.North="north",u.South="south",u.East="east",u.West="west"})(n||(e.OrthogonalEdge=n={}));let o=4;const t=new m.Emitter;let i=300;const s=new m.Emitter;class g{constructor(C){this.el=C,this.disposables=new _.DisposableStore}get onPointerMove(){return this.disposables.add(new k.DomEmitter((0,d.getWindow)(this.el),"mousemove")).event}get onPointerUp(){return this.disposables.add(new k.DomEmitter((0,d.getWindow)(this.el),"mouseup")).event}dispose(){this.disposables.dispose()}}ke([y.memoize],g.prototype,"onPointerMove",null),ke([y.memoize],g.prototype,"onPointerUp",null);class c{get onPointerMove(){return this.disposables.add(new k.DomEmitter(this.el,I.EventType.Change)).event}get onPointerUp(){return this.disposables.add(new k.DomEmitter(this.el,I.EventType.End)).event}constructor(C){this.el=C,this.disposables=new _.DisposableStore}dispose(){this.disposables.dispose()}}ke([y.memoize],c.prototype,"onPointerMove",null),ke([y.memoize],c.prototype,"onPointerUp",null);class l{get onPointerMove(){return this.factory.onPointerMove}get onPointerUp(){return this.factory.onPointerUp}constructor(C){this.factory=C}dispose(){}}ke([y.memoize],l.prototype,"onPointerMove",null),ke([y.memoize],l.prototype,"onPointerUp",null);const a="pointer-events-disabled";class r extends _.Disposable{get state(){return this._state}get orthogonalStartSash(){return this._orthogonalStartSash}get orthogonalEndSash(){return this._orthogonalEndSash}set state(C){this._state!==C&&(this.el.classList.toggle("disabled",C===0),this.el.classList.toggle("minimum",C===1),this.el.classList.toggle("maximum",C===2),this._state=C,this.onDidEnablementChange.fire(C))}set orthogonalStartSash(C){if(this._orthogonalStartSash!==C){if(this.orthogonalStartDragHandleDisposables.clear(),this.orthogonalStartSashDisposables.clear(),C){const f=h=>{this.orthogonalStartDragHandleDisposables.clear(),h!==0&&(this._orthogonalStartDragHandle=(0,d.append)(this.el,(0,d.$)(".orthogonal-drag-handle.start")),this.orthogonalStartDragHandleDisposables.add((0,_.toDisposable)(()=>this._orthogonalStartDragHandle.remove())),this.orthogonalStartDragHandleDisposables.add(new k.DomEmitter(this._orthogonalStartDragHandle,"mouseenter")).event(()=>r.onMouseEnter(C),void 0,this.orthogonalStartDragHandleDisposables),this.orthogonalStartDragHandleDisposables.add(new k.DomEmitter(this._orthogonalStartDragHandle,"mouseleave")).event(()=>r.onMouseLeave(C),void 0,this.orthogonalStartDragHandleDisposables))};this.orthogonalStartSashDisposables.add(C.onDidEnablementChange.event(f,this)),f(C.state)}this._orthogonalStartSash=C}}set orthogonalEndSash(C){if(this._orthogonalEndSash!==C){if(this.orthogonalEndDragHandleDisposables.clear(),this.orthogonalEndSashDisposables.clear(),C){const f=h=>{this.orthogonalEndDragHandleDisposables.clear(),h!==0&&(this._orthogonalEndDragHandle=(0,d.append)(this.el,(0,d.$)(".orthogonal-drag-handle.end")),this.orthogonalEndDragHandleDisposables.add((0,_.toDisposable)(()=>this._orthogonalEndDragHandle.remove())),this.orthogonalEndDragHandleDisposables.add(new k.DomEmitter(this._orthogonalEndDragHandle,"mouseenter")).event(()=>r.onMouseEnter(C),void 0,this.orthogonalEndDragHandleDisposables),this.orthogonalEndDragHandleDisposables.add(new k.DomEmitter(this._orthogonalEndDragHandle,"mouseleave")).event(()=>r.onMouseLeave(C),void 0,this.orthogonalEndDragHandleDisposables))};this.orthogonalEndSashDisposables.add(C.onDidEnablementChange.event(f,this)),f(C.state)}this._orthogonalEndSash=C}}constructor(C,f,h){super(),this.hoverDelay=i,this.hoverDelayer=this._register(new E.Delayer(this.hoverDelay)),this._state=3,this.onDidEnablementChange=this._register(new m.Emitter),this._onDidStart=this._register(new m.Emitter),this._onDidChange=this._register(new m.Emitter),this._onDidReset=this._register(new m.Emitter),this._onDidEnd=this._register(new m.Emitter),this.orthogonalStartSashDisposables=this._register(new _.DisposableStore),this.orthogonalStartDragHandleDisposables=this._register(new _.DisposableStore),this.orthogonalEndSashDisposables=this._register(new _.DisposableStore),this.orthogonalEndDragHandleDisposables=this._register(new _.DisposableStore),this.onDidStart=this._onDidStart.event,this.onDidChange=this._onDidChange.event,this.onDidReset=this._onDidReset.event,this.onDidEnd=this._onDidEnd.event,this.linkedSash=void 0,this.el=(0,d.append)(C,(0,d.$)(".monaco-sash")),h.orthogonalEdge&&this.el.classList.add(`orthogonal-edge-${h.orthogonalEdge}`),b.isMacintosh&&this.el.classList.add("mac");const v=this._register(new k.DomEmitter(this.el,"mousedown")).event;this._register(v(A=>this.onPointerStart(A,new g(C)),this));const w=this._register(new k.DomEmitter(this.el,"dblclick")).event;this._register(w(this.onPointerDoublePress,this));const S=this._register(new k.DomEmitter(this.el,"mouseenter")).event;this._register(S(()=>r.onMouseEnter(this)));const L=this._register(new k.DomEmitter(this.el,"mouseleave")).event;this._register(L(()=>r.onMouseLeave(this))),this._register(I.Gesture.addTarget(this.el));const D=this._register(new k.DomEmitter(this.el,I.EventType.Start)).event;this._register(D(A=>this.onPointerStart(A,new c(this.el)),this));const T=this._register(new k.DomEmitter(this.el,I.EventType.Tap)).event;let M;this._register(T(A=>{if(M){clearTimeout(M),M=void 0,this.onPointerDoublePress(A);return}clearTimeout(M),M=setTimeout(()=>M=void 0,250)},this)),typeof h.size=="number"?(this.size=h.size,h.orientation===0?this.el.style.width=`${this.size}px`:this.el.style.height=`${this.size}px`):(this.size=o,this._register(t.event(A=>{this.size=A,this.layout()}))),this._register(s.event(A=>this.hoverDelay=A)),this.layoutProvider=f,this.orthogonalStartSash=h.orthogonalStartSash,this.orthogonalEndSash=h.orthogonalEndSash,this.orientation=h.orientation||0,this.orientation===1?(this.el.classList.add("horizontal"),this.el.classList.remove("vertical")):(this.el.classList.remove("horizontal"),this.el.classList.add("vertical")),this.el.classList.toggle("debug",p),this.layout()}onPointerStart(C,f){d.EventHelper.stop(C);let h=!1;if(!C.__orthogonalSashEvent){const O=this.getOrthogonalSash(C);O&&(h=!0,C.__orthogonalSashEvent=!0,O.onPointerStart(C,new l(f)))}if(this.linkedSash&&!C.__linkedSashEvent&&(C.__linkedSashEvent=!0,this.linkedSash.onPointerStart(C,new l(f))),!this.state)return;const v=this.el.ownerDocument.getElementsByTagName("iframe");for(const O of v)O.classList.add(a);const w=C.pageX,S=C.pageY,L=C.altKey,D={startX:w,currentX:w,startY:S,currentY:S,altKey:L};this.el.classList.add("active"),this._onDidStart.fire(D);const T=(0,d.createStyleSheet)(this.el),M=()=>{let O="";h?O="all-scroll":this.orientation===1?this.state===1?O="s-resize":this.state===2?O="n-resize":O=b.isMacintosh?"row-resize":"ns-resize":this.state===1?O="e-resize":this.state===2?O="w-resize":O=b.isMacintosh?"col-resize":"ew-resize",T.textContent=`* { cursor: ${O} !important; }`},A=new _.DisposableStore;M(),h||this.onDidEnablementChange.event(M,null,A);const P=O=>{d.EventHelper.stop(O,!1);const F={startX:w,currentX:O.pageX,startY:S,currentY:O.pageY,altKey:L};this._onDidChange.fire(F)},N=O=>{d.EventHelper.stop(O,!1),T.remove(),this.el.classList.remove("active"),this._onDidEnd.fire(),A.dispose();for(const F of v)F.classList.remove(a)};f.onPointerMove(P,null,A),f.onPointerUp(N,null,A),A.add(f)}onPointerDoublePress(C){const f=this.getOrthogonalSash(C);f&&f._onDidReset.fire(),this.linkedSash&&this.linkedSash._onDidReset.fire(),this._onDidReset.fire()}static onMouseEnter(C,f=!1){C.el.classList.contains("active")?(C.hoverDelayer.cancel(),C.el.classList.add("hover")):C.hoverDelayer.trigger(()=>C.el.classList.add("hover"),C.hoverDelay).then(void 0,()=>{}),!f&&C.linkedSash&&r.onMouseEnter(C.linkedSash,!0)}static onMouseLeave(C,f=!1){C.hoverDelayer.cancel(),C.el.classList.remove("hover"),!f&&C.linkedSash&&r.onMouseLeave(C.linkedSash,!0)}clearSashHoverState(){r.onMouseLeave(this)}layout(){if(this.orientation===0){const C=this.layoutProvider;this.el.style.left=C.getVerticalSashLeft(this)-this.size/2+"px",C.getVerticalSashTop&&(this.el.style.top=C.getVerticalSashTop(this)+"px"),C.getVerticalSashHeight&&(this.el.style.height=C.getVerticalSashHeight(this)+"px")}else{const C=this.layoutProvider;this.el.style.top=C.getHorizontalSashTop(this)-this.size/2+"px",C.getHorizontalSashLeft&&(this.el.style.left=C.getHorizontalSashLeft(this)+"px"),C.getHorizontalSashWidth&&(this.el.style.width=C.getHorizontalSashWidth(this)+"px")}}getOrthogonalSash(C){const f=C.initialTarget??C.target;if(!(!f||!(0,d.isHTMLElement)(f))&&f.classList.contains("orthogonal-drag-handle"))return f.classList.contains("start")?this.orthogonalStartSash:this.orthogonalEndSash}dispose(){super.dispose(),this.el.remove()}}e.Sash=r}),define(ne[255],se([1,0,5,173,6,2]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ResizableHTMLElement=void 0;class y{constructor(){this._onDidWillResize=new I.Emitter,this.onDidWillResize=this._onDidWillResize.event,this._onDidResize=new I.Emitter,this.onDidResize=this._onDidResize.event,this._sashListener=new E.DisposableStore,this._size=new d.Dimension(0,0),this._minSize=new d.Dimension(0,0),this._maxSize=new d.Dimension(Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER),this.domNode=document.createElement("div"),this._eastSash=new k.Sash(this.domNode,{getVerticalSashLeft:()=>this._size.width},{orientation:0}),this._westSash=new k.Sash(this.domNode,{getVerticalSashLeft:()=>0},{orientation:0}),this._northSash=new k.Sash(this.domNode,{getHorizontalSashTop:()=>0},{orientation:1,orthogonalEdge:k.OrthogonalEdge.North}),this._southSash=new k.Sash(this.domNode,{getHorizontalSashTop:()=>this._size.height},{orientation:1,orthogonalEdge:k.OrthogonalEdge.South}),this._northSash.orthogonalStartSash=this._westSash,this._northSash.orthogonalEndSash=this._eastSash,this._southSash.orthogonalStartSash=this._westSash,this._southSash.orthogonalEndSash=this._eastSash;let _,b=0,p=0;this._sashListener.add(I.Event.any(this._northSash.onDidStart,this._eastSash.onDidStart,this._southSash.onDidStart,this._westSash.onDidStart)(()=>{_===void 0&&(this._onDidWillResize.fire(),_=this._size,b=0,p=0)})),this._sashListener.add(I.Event.any(this._northSash.onDidEnd,this._eastSash.onDidEnd,this._southSash.onDidEnd,this._westSash.onDidEnd)(()=>{_!==void 0&&(_=void 0,b=0,p=0,this._onDidResize.fire({dimension:this._size,done:!0}))})),this._sashListener.add(this._eastSash.onDidChange(n=>{_&&(p=n.currentX-n.startX,this.layout(_.height+b,_.width+p),this._onDidResize.fire({dimension:this._size,done:!1,east:!0}))})),this._sashListener.add(this._westSash.onDidChange(n=>{_&&(p=-(n.currentX-n.startX),this.layout(_.height+b,_.width+p),this._onDidResize.fire({dimension:this._size,done:!1,west:!0}))})),this._sashListener.add(this._northSash.onDidChange(n=>{_&&(b=-(n.currentY-n.startY),this.layout(_.height+b,_.width+p),this._onDidResize.fire({dimension:this._size,done:!1,north:!0}))})),this._sashListener.add(this._southSash.onDidChange(n=>{_&&(b=n.currentY-n.startY,this.layout(_.height+b,_.width+p),this._onDidResize.fire({dimension:this._size,done:!1,south:!0}))})),this._sashListener.add(I.Event.any(this._eastSash.onDidReset,this._westSash.onDidReset)(n=>{this._preferredSize&&(this.layout(this._size.height,this._preferredSize.width),this._onDidResize.fire({dimension:this._size,done:!0}))})),this._sashListener.add(I.Event.any(this._northSash.onDidReset,this._southSash.onDidReset)(n=>{this._preferredSize&&(this.layout(this._preferredSize.height,this._size.width),this._onDidResize.fire({dimension:this._size,done:!0}))}))}dispose(){this._northSash.dispose(),this._southSash.dispose(),this._eastSash.dispose(),this._westSash.dispose(),this._sashListener.dispose(),this._onDidResize.dispose(),this._onDidWillResize.dispose(),this.domNode.remove()}enableSashes(_,b,p,n){this._northSash.state=_?3:0,this._eastSash.state=b?3:0,this._southSash.state=p?3:0,this._westSash.state=n?3:0}layout(_=this.size.height,b=this.size.width){const{height:p,width:n}=this._minSize,{height:o,width:t}=this._maxSize;_=Math.max(p,Math.min(o,_)),b=Math.max(n,Math.min(t,b));const i=new d.Dimension(b,_);d.Dimension.equals(i,this._size)||(this.domNode.style.height=_+"px",this.domNode.style.width=b+"px",this._size=i,this._northSash.layout(),this._eastSash.layout(),this._southSash.layout(),this._westSash.layout())}clearSashHoverState(){this._eastSash.clearSashHoverState(),this._westSash.clearSashHoverState(),this._northSash.clearSashHoverState(),this._southSash.clearSashHoverState()}get size(){return this._size}set maxSize(_){this._maxSize=_}get maxSize(){return this._maxSize}set minSize(_){this._minSize=_}get minSize(){return this._minSize}set preferredSize(_){this._preferredSize=_}get preferredSize(){return this._preferredSize}}e.ResizableHTMLElement=y}),define(ne[634],se([1,0,5,69,13,6,2,16]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectBoxNative=void 0;class _ extends y.Disposable{constructor(p,n,o,t){super(),this.selected=0,this.selectBoxOptions=t||Object.create(null),this.options=[],this.selectElement=document.createElement("select"),this.selectElement.className="monaco-select-box",typeof this.selectBoxOptions.ariaLabel=="string"&&this.selectElement.setAttribute("aria-label",this.selectBoxOptions.ariaLabel),typeof this.selectBoxOptions.ariaDescription=="string"&&this.selectElement.setAttribute("aria-description",this.selectBoxOptions.ariaDescription),this._onDidSelect=this._register(new E.Emitter),this.styles=o,this.registerListeners(),this.setOptions(p,n)}registerListeners(){this._register(k.Gesture.addTarget(this.selectElement)),[k.EventType.Tap].forEach(p=>{this._register(d.addDisposableListener(this.selectElement,p,n=>{this.selectElement.focus()}))}),this._register(d.addStandardDisposableListener(this.selectElement,"click",p=>{d.EventHelper.stop(p,!0)})),this._register(d.addStandardDisposableListener(this.selectElement,"change",p=>{this.selectElement.title=p.target.value,this._onDidSelect.fire({index:p.target.selectedIndex,selected:p.target.value})})),this._register(d.addStandardDisposableListener(this.selectElement,"keydown",p=>{let n=!1;m.isMacintosh?(p.keyCode===18||p.keyCode===16||p.keyCode===10)&&(n=!0):(p.keyCode===18&&p.altKey||p.keyCode===10||p.keyCode===3)&&(n=!0),n&&p.stopPropagation()}))}get onDidSelect(){return this._onDidSelect.event}setOptions(p,n){(!this.options||!I.equals(this.options,p))&&(this.options=p,this.selectElement.options.length=0,this.options.forEach((o,t)=>{this.selectElement.add(this.createOption(o.text,t,o.isDisabled))})),n!==void 0&&this.select(n)}select(p){this.options.length===0?this.selected=0:p>=0&&pthis.options.length-1?this.select(this.options.length-1):this.selected<0&&(this.selected=0),this.selectElement.selectedIndex=this.selected,this.selectedp(new I.StandardMouseEvent(d.getWindow(b),n))))}onmousedown(b,p){this._register(d.addDisposableListener(b,d.EventType.MOUSE_DOWN,n=>p(new I.StandardMouseEvent(d.getWindow(b),n))))}onmouseover(b,p){this._register(d.addDisposableListener(b,d.EventType.MOUSE_OVER,n=>p(new I.StandardMouseEvent(d.getWindow(b),n))))}onmouseleave(b,p){this._register(d.addDisposableListener(b,d.EventType.MOUSE_LEAVE,n=>p(new I.StandardMouseEvent(d.getWindow(b),n))))}onkeydown(b,p){this._register(d.addDisposableListener(b,d.EventType.KEY_DOWN,n=>p(new k.StandardKeyboardEvent(n))))}onkeyup(b,p){this._register(d.addDisposableListener(b,d.EventType.KEY_UP,n=>p(new k.StandardKeyboardEvent(n))))}oninput(b,p){this._register(d.addDisposableListener(b,d.EventType.INPUT,p))}onblur(b,p){this._register(d.addDisposableListener(b,d.EventType.BLUR,p))}onfocus(b,p){this._register(d.addDisposableListener(b,d.EventType.FOCUS,p))}ignoreGesture(b){return E.Gesture.ignoreTarget(b)}}e.Widget=m}),define(ne[256],se([1,0,172,85,14,30,5]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ScrollbarArrow=e.ARROW_IMG_SIZE=void 0,e.ARROW_IMG_SIZE=11;class m extends k.Widget{constructor(b){super(),this._onActivate=b.onActivate,this.bgDomNode=document.createElement("div"),this.bgDomNode.className="arrow-background",this.bgDomNode.style.position="absolute",this.bgDomNode.style.width=b.bgWidth+"px",this.bgDomNode.style.height=b.bgHeight+"px",typeof b.top<"u"&&(this.bgDomNode.style.top="0px"),typeof b.left<"u"&&(this.bgDomNode.style.left="0px"),typeof b.bottom<"u"&&(this.bgDomNode.style.bottom="0px"),typeof b.right<"u"&&(this.bgDomNode.style.right="0px"),this.domNode=document.createElement("div"),this.domNode.className=b.className,this.domNode.classList.add(...E.ThemeIcon.asClassNameArray(b.icon)),this.domNode.style.position="absolute",this.domNode.style.width=e.ARROW_IMG_SIZE+"px",this.domNode.style.height=e.ARROW_IMG_SIZE+"px",typeof b.top<"u"&&(this.domNode.style.top=b.top+"px"),typeof b.left<"u"&&(this.domNode.style.left=b.left+"px"),typeof b.bottom<"u"&&(this.domNode.style.bottom=b.bottom+"px"),typeof b.right<"u"&&(this.domNode.style.right=b.right+"px"),this._pointerMoveMonitor=this._register(new d.GlobalPointerMoveMonitor),this._register(y.addStandardDisposableListener(this.bgDomNode,y.EventType.POINTER_DOWN,p=>this._arrowPointerDown(p))),this._register(y.addStandardDisposableListener(this.domNode,y.EventType.POINTER_DOWN,p=>this._arrowPointerDown(p))),this._pointerdownRepeatTimer=this._register(new y.WindowIntervalTimer),this._pointerdownScheduleRepeatTimer=this._register(new I.TimeoutTimer)}_arrowPointerDown(b){if(!b.target||!(b.target instanceof Element))return;const p=()=>{this._pointerdownRepeatTimer.cancelAndSet(()=>this._onActivate(),1e3/24,y.getWindow(b))};this._onActivate(),this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancelAndSet(p,200),this._pointerMoveMonitor.startMonitoring(b.target,b.pointerId,b.buttons,n=>{},()=>{this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancel()}),b.preventDefault()}}e.ScrollbarArrow=m}),define(ne[356],se([1,0,5,39,172,256,626,85,16]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractScrollbar=void 0;const b=140;class p extends m.Widget{constructor(o){super(),this._lazyRender=o.lazyRender,this._host=o.host,this._scrollable=o.scrollable,this._scrollByPage=o.scrollByPage,this._scrollbarState=o.scrollbarState,this._visibilityController=this._register(new y.ScrollbarVisibilityController(o.visibility,"visible scrollbar "+o.extraScrollbarClassName,"invisible scrollbar "+o.extraScrollbarClassName)),this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._pointerMoveMonitor=this._register(new I.GlobalPointerMoveMonitor),this._shouldRender=!0,this.domNode=(0,k.createFastDomNode)(document.createElement("div")),this.domNode.setAttribute("role","presentation"),this.domNode.setAttribute("aria-hidden","true"),this._visibilityController.setDomNode(this.domNode),this.domNode.setPosition("absolute"),this._register(d.addDisposableListener(this.domNode.domNode,d.EventType.POINTER_DOWN,t=>this._domNodePointerDown(t)))}_createArrow(o){const t=this._register(new E.ScrollbarArrow(o));this.domNode.domNode.appendChild(t.bgDomNode),this.domNode.domNode.appendChild(t.domNode)}_createSlider(o,t,i,s){this.slider=(0,k.createFastDomNode)(document.createElement("div")),this.slider.setClassName("slider"),this.slider.setPosition("absolute"),this.slider.setTop(o),this.slider.setLeft(t),typeof i=="number"&&this.slider.setWidth(i),typeof s=="number"&&this.slider.setHeight(s),this.slider.setLayerHinting(!0),this.slider.setContain("strict"),this.domNode.domNode.appendChild(this.slider.domNode),this._register(d.addDisposableListener(this.slider.domNode,d.EventType.POINTER_DOWN,g=>{g.button===0&&(g.preventDefault(),this._sliderPointerDown(g))})),this.onclick(this.slider.domNode,g=>{g.leftButton&&g.stopPropagation()})}_onElementSize(o){return this._scrollbarState.setVisibleSize(o)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_onElementScrollSize(o){return this._scrollbarState.setScrollSize(o)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_onElementScrollPosition(o){return this._scrollbarState.setScrollPosition(o)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}beginReveal(){this._visibilityController.setShouldBeVisible(!0)}beginHide(){this._visibilityController.setShouldBeVisible(!1)}render(){this._shouldRender&&(this._shouldRender=!1,this._renderDomNode(this._scrollbarState.getRectangleLargeSize(),this._scrollbarState.getRectangleSmallSize()),this._updateSlider(this._scrollbarState.getSliderSize(),this._scrollbarState.getArrowSize()+this._scrollbarState.getSliderPosition()))}_domNodePointerDown(o){o.target===this.domNode.domNode&&this._onPointerDown(o)}delegatePointerDown(o){const t=this.domNode.domNode.getClientRects()[0].top,i=t+this._scrollbarState.getSliderPosition(),s=t+this._scrollbarState.getSliderPosition()+this._scrollbarState.getSliderSize(),g=this._sliderPointerPosition(o);i<=g&&g<=s?o.button===0&&(o.preventDefault(),this._sliderPointerDown(o)):this._onPointerDown(o)}_onPointerDown(o){let t,i;if(o.target===this.domNode.domNode&&typeof o.offsetX=="number"&&typeof o.offsetY=="number")t=o.offsetX,i=o.offsetY;else{const g=d.getDomNodePagePosition(this.domNode.domNode);t=o.pageX-g.left,i=o.pageY-g.top}const s=this._pointerDownRelativePosition(t,i);this._setDesiredScrollPositionNow(this._scrollByPage?this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(s):this._scrollbarState.getDesiredScrollPositionFromOffset(s)),o.button===0&&(o.preventDefault(),this._sliderPointerDown(o))}_sliderPointerDown(o){if(!o.target||!(o.target instanceof Element))return;const t=this._sliderPointerPosition(o),i=this._sliderOrthogonalPointerPosition(o),s=this._scrollbarState.clone();this.slider.toggleClassName("active",!0),this._pointerMoveMonitor.startMonitoring(o.target,o.pointerId,o.buttons,g=>{const c=this._sliderOrthogonalPointerPosition(g),l=Math.abs(c-i);if(_.isWindows&&l>b){this._setDesiredScrollPositionNow(s.getScrollPosition());return}const r=this._sliderPointerPosition(g)-t;this._setDesiredScrollPositionNow(s.getDesiredScrollPositionFromDelta(r))},()=>{this.slider.toggleClassName("active",!1),this._host.onDragEnd()}),this._host.onDragStart()}_setDesiredScrollPositionNow(o){const t={};this.writeScrollPosition(t,o),this._scrollable.setScrollPositionNow(t)}updateScrollbarSize(o){this._updateScrollbarSize(o),this._scrollbarState.setScrollbarSize(o),this._shouldRender=!0,this._lazyRender||this.render()}isNeeded(){return this._scrollbarState.isNeeded()}}e.AbstractScrollbar=p}),define(ne[635],se([1,0,77,356,256,223,26]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HorizontalScrollbar=void 0;class m extends k.AbstractScrollbar{constructor(b,p,n){const o=b.getScrollDimensions(),t=b.getCurrentScrollPosition();if(super({lazyRender:p.lazyRender,host:n,scrollbarState:new E.ScrollbarState(p.horizontalHasArrows?p.arrowSize:0,p.horizontal===2?0:p.horizontalScrollbarSize,p.vertical===2?0:p.verticalScrollbarSize,o.width,o.scrollWidth,t.scrollLeft),visibility:p.horizontal,extraScrollbarClassName:"horizontal",scrollable:b,scrollByPage:p.scrollByPage}),p.horizontalHasArrows){const i=(p.arrowSize-I.ARROW_IMG_SIZE)/2,s=(p.horizontalScrollbarSize-I.ARROW_IMG_SIZE)/2;this._createArrow({className:"scra",icon:y.Codicon.scrollbarButtonLeft,top:s,left:i,bottom:void 0,right:void 0,bgWidth:p.arrowSize,bgHeight:p.horizontalScrollbarSize,onActivate:()=>this._host.onMouseWheel(new d.StandardWheelEvent(null,1,0))}),this._createArrow({className:"scra",icon:y.Codicon.scrollbarButtonRight,top:s,left:void 0,bottom:void 0,right:i,bgWidth:p.arrowSize,bgHeight:p.horizontalScrollbarSize,onActivate:()=>this._host.onMouseWheel(new d.StandardWheelEvent(null,-1,0))})}this._createSlider(Math.floor((p.horizontalScrollbarSize-p.horizontalSliderSize)/2),0,void 0,p.horizontalSliderSize)}_updateSlider(b,p){this.slider.setWidth(b),this.slider.setLeft(p)}_renderDomNode(b,p){this.domNode.setWidth(b),this.domNode.setHeight(p),this.domNode.setLeft(0),this.domNode.setBottom(0)}onDidScroll(b){return this._shouldRender=this._onElementScrollSize(b.scrollWidth)||this._shouldRender,this._shouldRender=this._onElementScrollPosition(b.scrollLeft)||this._shouldRender,this._shouldRender=this._onElementSize(b.width)||this._shouldRender,this._shouldRender}_pointerDownRelativePosition(b,p){return b}_sliderPointerPosition(b){return b.pageX}_sliderOrthogonalPointerPosition(b){return b.pageY}_updateScrollbarSize(b){this.slider.setHeight(b)}writeScrollPosition(b,p){b.scrollLeft=p}updateOptions(b){this.updateScrollbarSize(b.horizontal===2?0:b.horizontalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(b.vertical===2?0:b.verticalScrollbarSize),this._visibilityController.setVisibility(b.horizontal),this._scrollByPage=b.scrollByPage}}e.HorizontalScrollbar=m}),define(ne[636],se([1,0,77,356,256,223,26]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.VerticalScrollbar=void 0;class m extends k.AbstractScrollbar{constructor(b,p,n){const o=b.getScrollDimensions(),t=b.getCurrentScrollPosition();if(super({lazyRender:p.lazyRender,host:n,scrollbarState:new E.ScrollbarState(p.verticalHasArrows?p.arrowSize:0,p.vertical===2?0:p.verticalScrollbarSize,0,o.height,o.scrollHeight,t.scrollTop),visibility:p.vertical,extraScrollbarClassName:"vertical",scrollable:b,scrollByPage:p.scrollByPage}),p.verticalHasArrows){const i=(p.arrowSize-I.ARROW_IMG_SIZE)/2,s=(p.verticalScrollbarSize-I.ARROW_IMG_SIZE)/2;this._createArrow({className:"scra",icon:y.Codicon.scrollbarButtonUp,top:i,left:s,bottom:void 0,right:void 0,bgWidth:p.verticalScrollbarSize,bgHeight:p.arrowSize,onActivate:()=>this._host.onMouseWheel(new d.StandardWheelEvent(null,0,1))}),this._createArrow({className:"scra",icon:y.Codicon.scrollbarButtonDown,top:void 0,left:s,bottom:i,right:void 0,bgWidth:p.verticalScrollbarSize,bgHeight:p.arrowSize,onActivate:()=>this._host.onMouseWheel(new d.StandardWheelEvent(null,0,-1))})}this._createSlider(0,Math.floor((p.verticalScrollbarSize-p.verticalSliderSize)/2),p.verticalSliderSize,void 0)}_updateSlider(b,p){this.slider.setHeight(b),this.slider.setTop(p)}_renderDomNode(b,p){this.domNode.setWidth(p),this.domNode.setHeight(b),this.domNode.setRight(0),this.domNode.setTop(0)}onDidScroll(b){return this._shouldRender=this._onElementScrollSize(b.scrollHeight)||this._shouldRender,this._shouldRender=this._onElementScrollPosition(b.scrollTop)||this._shouldRender,this._shouldRender=this._onElementSize(b.height)||this._shouldRender,this._shouldRender}_pointerDownRelativePosition(b,p){return p}_sliderPointerPosition(b){return b.pageY}_sliderOrthogonalPointerPosition(b){return b.pageX}_updateScrollbarSize(b){this.slider.setWidth(b)}writeScrollPosition(b,p){b.scrollTop=p}updateOptions(b){this.updateScrollbarSize(b.vertical===2?0:b.verticalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(0),this._visibilityController.setVisibility(b.vertical),this._scrollByPage=b.scrollByPage}}e.VerticalScrollbar=m}),define(ne[86],se([1,0,64,5,39,77,635,636,85,14,6,2,16,163,471]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DomScrollableElement=e.SmoothScrollableElement=e.ScrollableElement=e.AbstractScrollableElement=e.MouseWheelClassifier=void 0;const i=500,s=50,g=!0;class c{constructor(v,w,S){this.timestamp=v,this.deltaX=w,this.deltaY=S,this.score=0}}class l{static{this.INSTANCE=new l}constructor(){this._capacity=5,this._memory=[],this._front=-1,this._rear=-1}isPhysicalMouseWheel(){if(this._front===-1&&this._rear===-1)return!1;let v=1,w=0,S=1,L=this._rear;do{const D=L===this._front?v:Math.pow(2,-S);if(v-=D,w+=this._memory[L].score*D,L===this._front)break;L=(this._capacity+L-1)%this._capacity,S++}while(!0);return w<=.5}acceptStandardWheelEvent(v){if(d.isChrome){const w=k.getWindow(v.browserEvent),S=(0,d.getZoomFactor)(w);this.accept(Date.now(),v.deltaX*S,v.deltaY*S)}else this.accept(Date.now(),v.deltaX,v.deltaY)}accept(v,w,S){let L=null;const D=new c(v,w,S);this._front===-1&&this._rear===-1?(this._memory[0]=D,this._front=0,this._rear=0):(L=this._memory[this._rear],this._rear=(this._rear+1)%this._capacity,this._rear===this._front&&(this._front=(this._front+1)%this._capacity),this._memory[this._rear]=D),D.score=this._computeScore(D,L)}_computeScore(v,w){if(Math.abs(v.deltaX)>0&&Math.abs(v.deltaY)>0)return 1;let S=.5;if((!this._isAlmostInt(v.deltaX)||!this._isAlmostInt(v.deltaY))&&(S+=.25),w){const L=Math.abs(v.deltaX),D=Math.abs(v.deltaY),T=Math.abs(w.deltaX),M=Math.abs(w.deltaY),A=Math.max(Math.min(L,T),1),P=Math.max(Math.min(D,M),1),N=Math.max(L,T),O=Math.max(D,M);N%A===0&&O%P===0&&(S-=.5)}return Math.min(Math.max(S,0),1)}_isAlmostInt(v){return Math.abs(Math.round(v)-v)<.01}}e.MouseWheelClassifier=l;class a extends _.Widget{get options(){return this._options}constructor(v,w,S){super(),this._onScroll=this._register(new p.Emitter),this.onScroll=this._onScroll.event,this._onWillScroll=this._register(new p.Emitter),v.style.overflow="hidden",this._options=f(w),this._scrollable=S,this._register(this._scrollable.onScroll(D=>{this._onWillScroll.fire(D),this._onDidScroll(D),this._onScroll.fire(D)}));const L={onMouseWheel:D=>this._onMouseWheel(D),onDragStart:()=>this._onDragStart(),onDragEnd:()=>this._onDragEnd()};this._verticalScrollbar=this._register(new m.VerticalScrollbar(this._scrollable,this._options,L)),this._horizontalScrollbar=this._register(new y.HorizontalScrollbar(this._scrollable,this._options,L)),this._domNode=document.createElement("div"),this._domNode.className="monaco-scrollable-element "+this._options.className,this._domNode.setAttribute("role","presentation"),this._domNode.style.position="relative",this._domNode.style.overflow="hidden",this._domNode.appendChild(v),this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode),this._domNode.appendChild(this._verticalScrollbar.domNode.domNode),this._options.useShadows?(this._leftShadowDomNode=(0,I.createFastDomNode)(document.createElement("div")),this._leftShadowDomNode.setClassName("shadow"),this._domNode.appendChild(this._leftShadowDomNode.domNode),this._topShadowDomNode=(0,I.createFastDomNode)(document.createElement("div")),this._topShadowDomNode.setClassName("shadow"),this._domNode.appendChild(this._topShadowDomNode.domNode),this._topLeftShadowDomNode=(0,I.createFastDomNode)(document.createElement("div")),this._topLeftShadowDomNode.setClassName("shadow"),this._domNode.appendChild(this._topLeftShadowDomNode.domNode)):(this._leftShadowDomNode=null,this._topShadowDomNode=null,this._topLeftShadowDomNode=null),this._listenOnDomNode=this._options.listenOnDomNode||this._domNode,this._mouseWheelToDispose=[],this._setListeningToMouseWheel(this._options.handleMouseWheel),this.onmouseover(this._listenOnDomNode,D=>this._onMouseOver(D)),this.onmouseleave(this._listenOnDomNode,D=>this._onMouseLeave(D)),this._hideTimeout=this._register(new b.TimeoutTimer),this._isDragging=!1,this._mouseIsOver=!1,this._shouldRender=!0,this._revealOnScroll=!0}dispose(){this._mouseWheelToDispose=(0,n.dispose)(this._mouseWheelToDispose),super.dispose()}getDomNode(){return this._domNode}getOverviewRulerLayoutInfo(){return{parent:this._domNode,insertBefore:this._verticalScrollbar.domNode.domNode}}delegateVerticalScrollbarPointerDown(v){this._verticalScrollbar.delegatePointerDown(v)}getScrollDimensions(){return this._scrollable.getScrollDimensions()}setScrollDimensions(v){this._scrollable.setScrollDimensions(v,!1)}updateClassName(v){this._options.className=v,o.isMacintosh&&(this._options.className+=" mac"),this._domNode.className="monaco-scrollable-element "+this._options.className}updateOptions(v){typeof v.handleMouseWheel<"u"&&(this._options.handleMouseWheel=v.handleMouseWheel,this._setListeningToMouseWheel(this._options.handleMouseWheel)),typeof v.mouseWheelScrollSensitivity<"u"&&(this._options.mouseWheelScrollSensitivity=v.mouseWheelScrollSensitivity),typeof v.fastScrollSensitivity<"u"&&(this._options.fastScrollSensitivity=v.fastScrollSensitivity),typeof v.scrollPredominantAxis<"u"&&(this._options.scrollPredominantAxis=v.scrollPredominantAxis),typeof v.horizontal<"u"&&(this._options.horizontal=v.horizontal),typeof v.vertical<"u"&&(this._options.vertical=v.vertical),typeof v.horizontalScrollbarSize<"u"&&(this._options.horizontalScrollbarSize=v.horizontalScrollbarSize),typeof v.verticalScrollbarSize<"u"&&(this._options.verticalScrollbarSize=v.verticalScrollbarSize),typeof v.scrollByPage<"u"&&(this._options.scrollByPage=v.scrollByPage),this._horizontalScrollbar.updateOptions(this._options),this._verticalScrollbar.updateOptions(this._options),this._options.lazyRender||this._render()}delegateScrollFromMouseWheelEvent(v){this._onMouseWheel(new E.StandardWheelEvent(v))}_setListeningToMouseWheel(v){if(this._mouseWheelToDispose.length>0!==v&&(this._mouseWheelToDispose=(0,n.dispose)(this._mouseWheelToDispose),v)){const S=L=>{this._onMouseWheel(new E.StandardWheelEvent(L))};this._mouseWheelToDispose.push(k.addDisposableListener(this._listenOnDomNode,k.EventType.MOUSE_WHEEL,S,{passive:!1}))}}_onMouseWheel(v){if(v.browserEvent?.defaultPrevented)return;const w=l.INSTANCE;g&&w.acceptStandardWheelEvent(v);let S=!1;if(v.deltaY||v.deltaX){let D=v.deltaY*this._options.mouseWheelScrollSensitivity,T=v.deltaX*this._options.mouseWheelScrollSensitivity;this._options.scrollPredominantAxis&&(this._options.scrollYToX&&T+D===0?T=D=0:Math.abs(D)>=Math.abs(T)?T=0:D=0),this._options.flipAxes&&([D,T]=[T,D]);const M=!o.isMacintosh&&v.browserEvent&&v.browserEvent.shiftKey;(this._options.scrollYToX||M)&&!T&&(T=D,D=0),v.browserEvent&&v.browserEvent.altKey&&(T=T*this._options.fastScrollSensitivity,D=D*this._options.fastScrollSensitivity);const A=this._scrollable.getFutureScrollPosition();let P={};if(D){const N=s*D,O=A.scrollTop-(N<0?Math.floor(N):Math.ceil(N));this._verticalScrollbar.writeScrollPosition(P,O)}if(T){const N=s*T,O=A.scrollLeft-(N<0?Math.floor(N):Math.ceil(N));this._horizontalScrollbar.writeScrollPosition(P,O)}P=this._scrollable.validateScrollPosition(P),(A.scrollLeft!==P.scrollLeft||A.scrollTop!==P.scrollTop)&&(g&&this._options.mouseWheelSmoothScroll&&w.isPhysicalMouseWheel()?this._scrollable.setScrollPositionSmooth(P):this._scrollable.setScrollPositionNow(P),S=!0)}let L=S;!L&&this._options.alwaysConsumeMouseWheel&&(L=!0),!L&&this._options.consumeMouseWheelIfScrollbarIsNeeded&&(this._verticalScrollbar.isNeeded()||this._horizontalScrollbar.isNeeded())&&(L=!0),L&&(v.preventDefault(),v.stopPropagation())}_onDidScroll(v){this._shouldRender=this._horizontalScrollbar.onDidScroll(v)||this._shouldRender,this._shouldRender=this._verticalScrollbar.onDidScroll(v)||this._shouldRender,this._options.useShadows&&(this._shouldRender=!0),this._revealOnScroll&&this._reveal(),this._options.lazyRender||this._render()}renderNow(){if(!this._options.lazyRender)throw new Error("Please use `lazyRender` together with `renderNow`!");this._render()}_render(){if(this._shouldRender&&(this._shouldRender=!1,this._horizontalScrollbar.render(),this._verticalScrollbar.render(),this._options.useShadows)){const v=this._scrollable.getCurrentScrollPosition(),w=v.scrollTop>0,S=v.scrollLeft>0,L=S?" left":"",D=w?" top":"",T=S||w?" top-left-corner":"";this._leftShadowDomNode.setClassName(`shadow${L}`),this._topShadowDomNode.setClassName(`shadow${D}`),this._topLeftShadowDomNode.setClassName(`shadow${T}${D}${L}`)}}_onDragStart(){this._isDragging=!0,this._reveal()}_onDragEnd(){this._isDragging=!1,this._hide()}_onMouseLeave(v){this._mouseIsOver=!1,this._hide()}_onMouseOver(v){this._mouseIsOver=!0,this._reveal()}_reveal(){this._verticalScrollbar.beginReveal(),this._horizontalScrollbar.beginReveal(),this._scheduleHide()}_hide(){!this._mouseIsOver&&!this._isDragging&&(this._verticalScrollbar.beginHide(),this._horizontalScrollbar.beginHide())}_scheduleHide(){!this._mouseIsOver&&!this._isDragging&&this._hideTimeout.cancelAndSet(()=>this._hide(),i)}}e.AbstractScrollableElement=a;class r extends a{constructor(v,w){w=w||{},w.mouseWheelSmoothScroll=!1;const S=new t.Scrollable({forceIntegerValues:!0,smoothScrollDuration:0,scheduleAtNextAnimationFrame:L=>k.scheduleAtNextAnimationFrame(k.getWindow(v),L)});super(v,w,S),this._register(S)}setScrollPosition(v){this._scrollable.setScrollPositionNow(v)}}e.ScrollableElement=r;class u extends a{constructor(v,w,S){super(v,w,S)}setScrollPosition(v){v.reuseAnimation?this._scrollable.setScrollPositionSmooth(v,v.reuseAnimation):this._scrollable.setScrollPositionNow(v)}getScrollPosition(){return this._scrollable.getCurrentScrollPosition()}}e.SmoothScrollableElement=u;class C extends a{constructor(v,w){w=w||{},w.mouseWheelSmoothScroll=!1;const S=new t.Scrollable({forceIntegerValues:!1,smoothScrollDuration:0,scheduleAtNextAnimationFrame:L=>k.scheduleAtNextAnimationFrame(k.getWindow(v),L)});super(v,w,S),this._register(S),this._element=v,this._register(this.onScroll(L=>{L.scrollTopChanged&&(this._element.scrollTop=L.scrollTop),L.scrollLeftChanged&&(this._element.scrollLeft=L.scrollLeft)})),this.scanDomNode()}setScrollPosition(v){this._scrollable.setScrollPositionNow(v)}getScrollPosition(){return this._scrollable.getCurrentScrollPosition()}scanDomNode(){this.setScrollDimensions({width:this._element.clientWidth,scrollWidth:this._element.scrollWidth,height:this._element.clientHeight,scrollHeight:this._element.scrollHeight}),this.setScrollPosition({scrollLeft:this._element.scrollLeft,scrollTop:this._element.scrollTop})}}e.DomScrollableElement=C;function f(h){const v={lazyRender:typeof h.lazyRender<"u"?h.lazyRender:!1,className:typeof h.className<"u"?h.className:"",useShadows:typeof h.useShadows<"u"?h.useShadows:!0,handleMouseWheel:typeof h.handleMouseWheel<"u"?h.handleMouseWheel:!0,flipAxes:typeof h.flipAxes<"u"?h.flipAxes:!1,consumeMouseWheelIfScrollbarIsNeeded:typeof h.consumeMouseWheelIfScrollbarIsNeeded<"u"?h.consumeMouseWheelIfScrollbarIsNeeded:!1,alwaysConsumeMouseWheel:typeof h.alwaysConsumeMouseWheel<"u"?h.alwaysConsumeMouseWheel:!1,scrollYToX:typeof h.scrollYToX<"u"?h.scrollYToX:!1,mouseWheelScrollSensitivity:typeof h.mouseWheelScrollSensitivity<"u"?h.mouseWheelScrollSensitivity:1,fastScrollSensitivity:typeof h.fastScrollSensitivity<"u"?h.fastScrollSensitivity:5,scrollPredominantAxis:typeof h.scrollPredominantAxis<"u"?h.scrollPredominantAxis:!0,mouseWheelSmoothScroll:typeof h.mouseWheelSmoothScroll<"u"?h.mouseWheelSmoothScroll:!0,arrowSize:typeof h.arrowSize<"u"?h.arrowSize:11,listenOnDomNode:typeof h.listenOnDomNode<"u"?h.listenOnDomNode:null,horizontal:typeof h.horizontal<"u"?h.horizontal:1,horizontalScrollbarSize:typeof h.horizontalScrollbarSize<"u"?h.horizontalScrollbarSize:10,horizontalSliderSize:typeof h.horizontalSliderSize<"u"?h.horizontalSliderSize:0,horizontalHasArrows:typeof h.horizontalHasArrows<"u"?h.horizontalHasArrows:!1,vertical:typeof h.vertical<"u"?h.vertical:1,verticalScrollbarSize:typeof h.verticalScrollbarSize<"u"?h.verticalScrollbarSize:10,verticalHasArrows:typeof h.verticalHasArrows<"u"?h.verticalHasArrows:!1,verticalSliderSize:typeof h.verticalSliderSize<"u"?h.verticalSliderSize:0,scrollByPage:typeof h.scrollByPage<"u"?h.scrollByPage:!1};return v.horizontalSliderSize=typeof h.horizontalSliderSize<"u"?h.horizontalSliderSize:v.horizontalScrollbarSize,v.verticalSliderSize=typeof h.verticalSliderSize<"u"?h.verticalSliderSize:v.verticalScrollbarSize,o.isMacintosh&&(v.className+=" mac"),v}}),define(ne[174],se([1,0,5,47,86,2,3,464]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.KeyDownAction=e.ClickAction=e.HoverAction=e.HoverWidget=void 0,e.getHoverAccessibleViewHint=p;const m=d.$;class _ extends E.Disposable{constructor(){super(),this.containerDomNode=document.createElement("div"),this.containerDomNode.className="monaco-hover",this.containerDomNode.tabIndex=0,this.containerDomNode.setAttribute("role","tooltip"),this.contentsDomNode=document.createElement("div"),this.contentsDomNode.className="monaco-hover-content",this.scrollbar=this._register(new I.DomScrollableElement(this.contentsDomNode,{consumeMouseWheelIfScrollbarIsNeeded:!0})),this.containerDomNode.appendChild(this.scrollbar.getDomNode())}onContentsChanged(){this.scrollbar.scanDomNode()}}e.HoverWidget=_;class b extends E.Disposable{static render(i,s,g){return new b(i,s,g)}constructor(i,s,g){super(),this.actionLabel=s.label,this.actionKeybindingLabel=g,this.actionContainer=d.append(i,m("div.action-container")),this.actionContainer.setAttribute("tabindex","0"),this.action=d.append(this.actionContainer,m("a.action")),this.action.setAttribute("role","button"),s.iconClass&&d.append(this.action,m(`span.icon.${s.iconClass}`));const c=d.append(this.action,m("span"));c.textContent=g?`${s.label} (${g})`:s.label,this._store.add(new n(this.actionContainer,s.run)),this._store.add(new o(this.actionContainer,s.run,[3,10])),this.setEnabled(!0)}setEnabled(i){i?(this.actionContainer.classList.remove("disabled"),this.actionContainer.removeAttribute("aria-disabled")):(this.actionContainer.classList.add("disabled"),this.actionContainer.setAttribute("aria-disabled","true"))}}e.HoverAction=b;function p(t,i){return t&&i?(0,y.localize)(7,"Inspect this in the accessible view with {0}.",i):t?(0,y.localize)(8,"Inspect this in the accessible view via the command Open Accessible View which is currently not triggerable via keybinding."):""}class n extends E.Disposable{constructor(i,s){super(),this._register(d.addDisposableListener(i,d.EventType.CLICK,g=>{g.stopPropagation(),g.preventDefault(),s(i)}))}}e.ClickAction=n;class o extends E.Disposable{constructor(i,s,g){super(),this._register(d.addDisposableListener(i,d.EventType.KEY_DOWN,c=>{const l=new k.StandardKeyboardEvent(c);g.some(a=>l.equals(a))&&(c.stopPropagation(),c.preventDefault(),s(i))}))}}e.KeyDownAction=o}),define(ne[257],se([1,0,224,5,93,69,86,13,14,126,6,2,188,163,454,632,8,141]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ListView=e.NativeDragAndDropData=e.ExternalElementsDragAndDropData=e.ElementsDragAndDropData=void 0;const l={CurrentDragAndDropData:void 0},a={useShadows:!0,verticalScrollMode:1,setRowLineHeight:!0,setRowHeight:!0,supportDynamicHeights:!1,dnd:{getDragElements(w){return[w]},getDragURI(){return null},onDragStart(){},onDragOver(){return!1},drop(){},dispose(){}},horizontalScrolling:!1,transformOptimization:!0,alwaysConsumeMouseWheel:!0};class r{constructor(S){this.elements=S}update(){}getData(){return this.elements}}e.ElementsDragAndDropData=r;class u{constructor(S){this.elements=S}update(){}getData(){return this.elements}}e.ExternalElementsDragAndDropData=u;class C{constructor(){this.types=[],this.files=[]}update(S){if(S.types&&this.types.splice(0,this.types.length,...S.types),S.files){this.files.splice(0,this.files.length);for(let L=0;LT,S?.getPosInSet?this.getPosInSet=S.getPosInSet.bind(S):this.getPosInSet=(L,D)=>D+1,S?.getRole?this.getRole=S.getRole.bind(S):this.getRole=L=>"listitem",S?.isChecked?this.isChecked=S.isChecked.bind(S):this.isChecked=L=>{}}}class v{static{this.InstanceCount=0}get contentHeight(){return this.rangeMap.size}get onDidScroll(){return this.scrollableElement.onScroll}get scrollableElementDomNode(){return this.scrollableElement.getDomNode()}get horizontalScrolling(){return this._horizontalScrolling}set horizontalScrolling(S){if(S!==this._horizontalScrolling){if(S&&this.supportDynamicHeights)throw new Error("Horizontal scrolling and dynamic heights not supported simultaneously");if(this._horizontalScrolling=S,this.domNode.classList.toggle("horizontal-scrolling",this._horizontalScrolling),this._horizontalScrolling){for(const L of this.items)this.measureItemWidth(L);this.updateScrollWidth(),this.scrollableElement.setScrollDimensions({width:(0,k.getContentWidth)(this.domNode)}),this.rowsContainer.style.width=`${Math.max(this.scrollWidth||0,this.renderWidth)}px`}else this.scrollableElementWidthDelayer.cancel(),this.scrollableElement.setScrollDimensions({width:this.renderWidth,scrollWidth:this.renderWidth}),this.rowsContainer.style.width=""}}constructor(S,L,D,T=a){if(this.virtualDelegate=L,this.domId=`list_id_${++v.InstanceCount}`,this.renderers=new Map,this.renderWidth=0,this._scrollHeight=0,this.scrollableElementUpdateDisposable=null,this.scrollableElementWidthDelayer=new _.Delayer(50),this.splicing=!1,this.dragOverAnimationStopDisposable=n.Disposable.None,this.dragOverMouseY=0,this.canDrop=!1,this.currentDragFeedbackDisposable=n.Disposable.None,this.onDragLeaveTimeout=n.Disposable.None,this.disposables=new n.DisposableStore,this._onDidChangeContentHeight=new p.Emitter,this._onDidChangeContentWidth=new p.Emitter,this.onDidChangeContentHeight=p.Event.latch(this._onDidChangeContentHeight.event,void 0,this.disposables),this._horizontalScrolling=!1,T.horizontalScrolling&&T.supportDynamicHeights)throw new Error("Horizontal scrolling and dynamic heights not supported simultaneously");this.items=[],this.itemId=0,this.rangeMap=this.createRangeMap(T.paddingTop??0);for(const A of D)this.renderers.set(A.templateId,A);this.cache=this.disposables.add(new s.RowCache(this.renderers)),this.lastRenderTop=0,this.lastRenderHeight=0,this.domNode=document.createElement("div"),this.domNode.className="monaco-list",this.domNode.classList.add(this.domId),this.domNode.tabIndex=0,this.domNode.classList.toggle("mouse-support",typeof T.mouseSupport=="boolean"?T.mouseSupport:!0),this._horizontalScrolling=T.horizontalScrolling??a.horizontalScrolling,this.domNode.classList.toggle("horizontal-scrolling",this._horizontalScrolling),this.paddingBottom=typeof T.paddingBottom>"u"?0:T.paddingBottom,this.accessibilityProvider=new h(T.accessibilityProvider),this.rowsContainer=document.createElement("div"),this.rowsContainer.className="monaco-list-rows",(T.transformOptimization??a.transformOptimization)&&(this.rowsContainer.style.transform="translate3d(0px, 0px, 0px)",this.rowsContainer.style.overflow="hidden",this.rowsContainer.style.contain="strict"),this.disposables.add(E.Gesture.addTarget(this.rowsContainer)),this.scrollable=this.disposables.add(new t.Scrollable({forceIntegerValues:!0,smoothScrollDuration:T.smoothScrolling??!1?125:0,scheduleAtNextAnimationFrame:A=>(0,k.scheduleAtNextAnimationFrame)((0,k.getWindow)(this.domNode),A)})),this.scrollableElement=this.disposables.add(new y.SmoothScrollableElement(this.rowsContainer,{alwaysConsumeMouseWheel:T.alwaysConsumeMouseWheel??a.alwaysConsumeMouseWheel,horizontal:1,vertical:T.verticalScrollMode??a.verticalScrollMode,useShadows:T.useShadows??a.useShadows,mouseWheelScrollSensitivity:T.mouseWheelScrollSensitivity,fastScrollSensitivity:T.fastScrollSensitivity,scrollByPage:T.scrollByPage},this.scrollable)),this.domNode.appendChild(this.scrollableElement.getDomNode()),S.appendChild(this.domNode),this.scrollableElement.onScroll(this.onScroll,this,this.disposables),this.disposables.add((0,k.addDisposableListener)(this.rowsContainer,E.EventType.Change,A=>this.onTouchChange(A))),this.disposables.add((0,k.addDisposableListener)(this.scrollableElement.getDomNode(),"scroll",A=>A.target.scrollTop=0)),this.disposables.add((0,k.addDisposableListener)(this.domNode,"dragover",A=>this.onDragOver(this.toDragEvent(A)))),this.disposables.add((0,k.addDisposableListener)(this.domNode,"drop",A=>this.onDrop(this.toDragEvent(A)))),this.disposables.add((0,k.addDisposableListener)(this.domNode,"dragleave",A=>this.onDragLeave(this.toDragEvent(A)))),this.disposables.add((0,k.addDisposableListener)(this.domNode,"dragend",A=>this.onDragEnd(A))),this.setRowLineHeight=T.setRowLineHeight??a.setRowLineHeight,this.setRowHeight=T.setRowHeight??a.setRowHeight,this.supportDynamicHeights=T.supportDynamicHeights??a.supportDynamicHeights,this.dnd=T.dnd??this.disposables.add(a.dnd),this.layout(T.initialSize?.height,T.initialSize?.width)}updateOptions(S){S.paddingBottom!==void 0&&(this.paddingBottom=S.paddingBottom,this.scrollableElement.setScrollDimensions({scrollHeight:this.scrollHeight})),S.smoothScrolling!==void 0&&this.scrollable.setSmoothScrollDuration(S.smoothScrolling?125:0),S.horizontalScrolling!==void 0&&(this.horizontalScrolling=S.horizontalScrolling);let L;if(S.scrollByPage!==void 0&&(L={...L??{},scrollByPage:S.scrollByPage}),S.mouseWheelScrollSensitivity!==void 0&&(L={...L??{},mouseWheelScrollSensitivity:S.mouseWheelScrollSensitivity}),S.fastScrollSensitivity!==void 0&&(L={...L??{},fastScrollSensitivity:S.fastScrollSensitivity}),L&&this.scrollableElement.updateOptions(L),S.paddingTop!==void 0&&S.paddingTop!==this.rangeMap.paddingTop){const D=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight),T=S.paddingTop-this.rangeMap.paddingTop;this.rangeMap.paddingTop=S.paddingTop,this.render(D,Math.max(0,this.lastRenderTop+T),this.lastRenderHeight,void 0,void 0,!0),this.setScrollTop(this.lastRenderTop),this.eventuallyUpdateScrollDimensions(),this.supportDynamicHeights&&this._rerender(this.lastRenderTop,this.lastRenderHeight)}}createRangeMap(S){return new i.RangeMap(S)}splice(S,L,D=[]){if(this.splicing)throw new Error("Can't run recursive splices.");this.splicing=!0;try{return this._splice(S,L,D)}finally{this.splicing=!1,this._onDidChangeContentHeight.fire(this.contentHeight)}}_splice(S,L,D=[]){const T=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight),M={start:S,end:S+L},A=o.Range.intersect(T,M),P=new Map;for(let K=A.end-1;K>=A.start;K--){const R=this.items[K];if(R.dragStartDisposable.dispose(),R.checkedDisposable.dispose(),R.row){let J=P.get(R.templateId);J||(J=[],P.set(R.templateId,J));const ie=this.renderers.get(R.templateId);ie&&ie.disposeElement&&ie.disposeElement(R.element,K,R.row.templateData,R.size),J.unshift(R.row)}R.row=null,R.stale=!0}const N={start:S+L,end:this.items.length},O=o.Range.intersect(N,T),F=o.Range.relativeComplement(N,T),x=D.map(K=>({id:String(this.itemId++),element:K,templateId:this.virtualDelegate.getTemplateId(K),size:this.virtualDelegate.getHeight(K),width:void 0,hasDynamicHeight:!!this.virtualDelegate.hasDynamicHeight&&this.virtualDelegate.hasDynamicHeight(K),lastDynamicHeightWidth:void 0,row:null,uri:void 0,dropTarget:!1,dragStartDisposable:n.Disposable.None,checkedDisposable:n.Disposable.None,stale:!1}));let W;S===0&&L>=this.items.length?(this.rangeMap=this.createRangeMap(this.rangeMap.paddingTop),this.rangeMap.splice(0,0,x),W=this.items,this.items=x):(this.rangeMap.splice(S,L,x),W=this.items.splice(S,L,...x));const V=D.length-L,q=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight),H=(0,i.shift)(O,V),z=o.Range.intersect(q,H);for(let K=z.start;K(0,i.shift)(K,V)),G=[{start:S,end:S+D.length},...j].map(K=>o.Range.intersect(q,K)).reverse();for(const K of G)for(let R=K.end-1;R>=K.start;R--){const J=this.items[R],ue=P.get(J.templateId)?.pop();this.insertItemInDOM(R,ue)}for(const K of P.values())for(const R of K)this.cache.release(R);return this.eventuallyUpdateScrollDimensions(),this.supportDynamicHeights&&this._rerender(this.scrollTop,this.renderHeight),W.map(K=>K.element)}eventuallyUpdateScrollDimensions(){this._scrollHeight=this.contentHeight,this.rowsContainer.style.height=`${this._scrollHeight}px`,this.scrollableElementUpdateDisposable||(this.scrollableElementUpdateDisposable=(0,k.scheduleAtNextAnimationFrame)((0,k.getWindow)(this.domNode),()=>{this.scrollableElement.setScrollDimensions({scrollHeight:this.scrollHeight}),this.updateScrollWidth(),this.scrollableElementUpdateDisposable=null}))}eventuallyUpdateScrollWidth(){if(!this.horizontalScrolling){this.scrollableElementWidthDelayer.cancel();return}this.scrollableElementWidthDelayer.trigger(()=>this.updateScrollWidth())}updateScrollWidth(){if(!this.horizontalScrolling)return;let S=0;for(const L of this.items)typeof L.width<"u"&&(S=Math.max(S,L.width));this.scrollWidth=S,this.scrollableElement.setScrollDimensions({scrollWidth:S===0?0:S+10}),this._onDidChangeContentWidth.fire(this.scrollWidth)}rerender(){if(this.supportDynamicHeights){for(const S of this.items)S.lastDynamicHeightWidth=void 0;this._rerender(this.lastRenderTop,this.lastRenderHeight)}}get length(){return this.items.length}get renderHeight(){return this.scrollableElement.getScrollDimensions().height}get firstVisibleIndex(){return this.getRenderRange(this.lastRenderTop,this.lastRenderHeight).start}element(S){return this.items[S].element}indexOf(S){return this.items.findIndex(L=>L.element===S)}domElement(S){const L=this.items[S].row;return L&&L.domNode}elementHeight(S){return this.items[S].size}elementTop(S){return this.rangeMap.positionAt(S)}indexAt(S){return this.rangeMap.indexAt(S)}indexAfter(S){return this.rangeMap.indexAfter(S)}layout(S,L){const D={height:typeof S=="number"?S:(0,k.getContentHeight)(this.domNode)};this.scrollableElementUpdateDisposable&&(this.scrollableElementUpdateDisposable.dispose(),this.scrollableElementUpdateDisposable=null,D.scrollHeight=this.scrollHeight),this.scrollableElement.setScrollDimensions(D),typeof L<"u"&&(this.renderWidth=L,this.supportDynamicHeights&&this._rerender(this.scrollTop,this.renderHeight)),this.horizontalScrolling&&this.scrollableElement.setScrollDimensions({width:typeof L=="number"?L:(0,k.getContentWidth)(this.domNode)})}render(S,L,D,T,M,A=!1){const P=this.getRenderRange(L,D),N=o.Range.relativeComplement(P,S).reverse(),O=o.Range.relativeComplement(S,P);if(A){const F=o.Range.intersect(S,P);for(let x=F.start;x{for(const F of O)for(let x=F.start;x=F.start;x--)this.insertItemInDOM(x)}),T!==void 0&&(this.rowsContainer.style.left=`-${T}px`),this.rowsContainer.style.top=`-${L}px`,this.horizontalScrolling&&M!==void 0&&(this.rowsContainer.style.width=`${Math.max(M,this.renderWidth)}px`),this.lastRenderTop=L,this.lastRenderHeight=D}insertItemInDOM(S,L){const D=this.items[S];if(!D.row)if(L)D.row=L,D.stale=!0;else{const N=this.cache.alloc(D.templateId);D.row=N.row,D.stale||=N.isReusingConnectedDomNode}const T=this.accessibilityProvider.getRole(D.element)||"listitem";D.row.domNode.setAttribute("role",T);const M=this.accessibilityProvider.isChecked(D.element);if(typeof M=="boolean")D.row.domNode.setAttribute("aria-checked",String(!!M));else if(M){const N=O=>D.row.domNode.setAttribute("aria-checked",String(!!O));N(M.value),D.checkedDisposable=M.onDidChange(()=>N(M.value))}if(D.stale||!D.row.domNode.parentElement){const N=this.items.at(S+1)?.row?.domNode??null;(D.row.domNode.parentElement!==this.rowsContainer||D.row.domNode.nextElementSibling!==N)&&this.rowsContainer.insertBefore(D.row.domNode,N),D.stale=!1}this.updateItemInDOM(D,S);const A=this.renderers.get(D.templateId);if(!A)throw new Error(`No renderer found for template id ${D.templateId}`);A?.renderElement(D.element,S,D.row.templateData,D.size);const P=this.dnd.getDragURI(D.element);D.dragStartDisposable.dispose(),D.row.domNode.draggable=!!P,P&&(D.dragStartDisposable=(0,k.addDisposableListener)(D.row.domNode,"dragstart",N=>this.onDragStart(D.element,P,N))),this.horizontalScrolling&&(this.measureItemWidth(D),this.eventuallyUpdateScrollWidth())}measureItemWidth(S){if(!S.row||!S.row.domNode)return;S.row.domNode.style.width="fit-content",S.width=(0,k.getContentWidth)(S.row.domNode);const L=(0,k.getWindow)(S.row.domNode).getComputedStyle(S.row.domNode);L.paddingLeft&&(S.width+=parseFloat(L.paddingLeft)),L.paddingRight&&(S.width+=parseFloat(L.paddingRight)),S.row.domNode.style.width=""}updateItemInDOM(S,L){S.row.domNode.style.top=`${this.elementTop(L)}px`,this.setRowHeight&&(S.row.domNode.style.height=`${S.size}px`),this.setRowLineHeight&&(S.row.domNode.style.lineHeight=`${S.size}px`),S.row.domNode.setAttribute("data-index",`${L}`),S.row.domNode.setAttribute("data-last-element",L===this.length-1?"true":"false"),S.row.domNode.setAttribute("data-parity",L%2===0?"even":"odd"),S.row.domNode.setAttribute("aria-setsize",String(this.accessibilityProvider.getSetSize(S.element,L,this.length))),S.row.domNode.setAttribute("aria-posinset",String(this.accessibilityProvider.getPosInSet(S.element,L))),S.row.domNode.setAttribute("id",this.getElementDomId(L)),S.row.domNode.classList.toggle("drop-target",S.dropTarget)}removeItemFromDOM(S){const L=this.items[S];if(L.dragStartDisposable.dispose(),L.checkedDisposable.dispose(),L.row){const D=this.renderers.get(L.templateId);D&&D.disposeElement&&D.disposeElement(L.element,S,L.row.templateData,L.size),this.cache.release(L.row),L.row=null}this.horizontalScrolling&&this.eventuallyUpdateScrollWidth()}getScrollTop(){return this.scrollableElement.getScrollPosition().scrollTop}setScrollTop(S,L){this.scrollableElementUpdateDisposable&&(this.scrollableElementUpdateDisposable.dispose(),this.scrollableElementUpdateDisposable=null,this.scrollableElement.setScrollDimensions({scrollHeight:this.scrollHeight})),this.scrollableElement.setScrollPosition({scrollTop:S,reuseAnimation:L})}get scrollTop(){return this.getScrollTop()}set scrollTop(S){this.setScrollTop(S)}get scrollHeight(){return this._scrollHeight+(this.horizontalScrolling?10:0)+this.paddingBottom}get onMouseClick(){return p.Event.map(this.disposables.add(new I.DomEmitter(this.domNode,"click")).event,S=>this.toMouseEvent(S),this.disposables)}get onMouseDblClick(){return p.Event.map(this.disposables.add(new I.DomEmitter(this.domNode,"dblclick")).event,S=>this.toMouseEvent(S),this.disposables)}get onMouseMiddleClick(){return p.Event.filter(p.Event.map(this.disposables.add(new I.DomEmitter(this.domNode,"auxclick")).event,S=>this.toMouseEvent(S),this.disposables),S=>S.browserEvent.button===1,this.disposables)}get onMouseDown(){return p.Event.map(this.disposables.add(new I.DomEmitter(this.domNode,"mousedown")).event,S=>this.toMouseEvent(S),this.disposables)}get onMouseOver(){return p.Event.map(this.disposables.add(new I.DomEmitter(this.domNode,"mouseover")).event,S=>this.toMouseEvent(S),this.disposables)}get onMouseOut(){return p.Event.map(this.disposables.add(new I.DomEmitter(this.domNode,"mouseout")).event,S=>this.toMouseEvent(S),this.disposables)}get onContextMenu(){return p.Event.any(p.Event.map(this.disposables.add(new I.DomEmitter(this.domNode,"contextmenu")).event,S=>this.toMouseEvent(S),this.disposables),p.Event.map(this.disposables.add(new I.DomEmitter(this.domNode,E.EventType.Contextmenu)).event,S=>this.toGestureEvent(S),this.disposables))}get onTouchStart(){return p.Event.map(this.disposables.add(new I.DomEmitter(this.domNode,"touchstart")).event,S=>this.toTouchEvent(S),this.disposables)}get onTap(){return p.Event.map(this.disposables.add(new I.DomEmitter(this.rowsContainer,E.EventType.Tap)).event,S=>this.toGestureEvent(S),this.disposables)}toMouseEvent(S){const L=this.getItemIndexFromEventTarget(S.target||null),D=typeof L>"u"?void 0:this.items[L],T=D&&D.element;return{browserEvent:S,index:L,element:T}}toTouchEvent(S){const L=this.getItemIndexFromEventTarget(S.target||null),D=typeof L>"u"?void 0:this.items[L],T=D&&D.element;return{browserEvent:S,index:L,element:T}}toGestureEvent(S){const L=this.getItemIndexFromEventTarget(S.initialTarget||null),D=typeof L>"u"?void 0:this.items[L],T=D&&D.element;return{browserEvent:S,index:L,element:T}}toDragEvent(S){const L=this.getItemIndexFromEventTarget(S.target||null),D=typeof L>"u"?void 0:this.items[L],T=D&&D.element,M=this.getTargetSector(S,L);return{browserEvent:S,index:L,element:T,sector:M}}onScroll(S){try{const L=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight);this.render(L,S.scrollTop,S.height,S.scrollLeft,S.scrollWidth),this.supportDynamicHeights&&this._rerender(S.scrollTop,S.height,S.inSmoothScrolling)}catch(L){throw console.error("Got bad scroll event:",S),L}}onTouchChange(S){S.preventDefault(),S.stopPropagation(),this.scrollTop-=S.translationY}onDragStart(S,L,D){if(!D.dataTransfer)return;const T=this.dnd.getDragElements(S);if(D.dataTransfer.effectAllowed="copyMove",D.dataTransfer.setData(d.DataTransfers.TEXT,L),D.dataTransfer.setDragImage){let M;this.dnd.getDragLabel&&(M=this.dnd.getDragLabel(T,D)),typeof M>"u"&&(M=String(T.length));const A=(0,k.$)(".monaco-drag-image");A.textContent=M,(O=>{for(;O&&!O.classList.contains("monaco-workbench");)O=O.parentElement;return O||this.domNode.ownerDocument})(this.domNode).appendChild(A),D.dataTransfer.setDragImage(A,-10,-10),setTimeout(()=>A.remove(),0)}this.domNode.classList.add("dragging"),this.currentDragData=new r(T),l.CurrentDragAndDropData=new u(T),this.dnd.onDragStart?.(this.currentDragData,D)}onDragOver(S){if(S.browserEvent.preventDefault(),this.onDragLeaveTimeout.dispose(),l.CurrentDragAndDropData&&l.CurrentDragAndDropData.getData()==="vscode-ui"||(this.setupDragAndDropScrollTopAnimation(S.browserEvent),!S.browserEvent.dataTransfer))return!1;if(!this.currentDragData)if(l.CurrentDragAndDropData)this.currentDragData=l.CurrentDragAndDropData;else{if(!S.browserEvent.dataTransfer.types)return!1;this.currentDragData=new C}const L=this.dnd.onDragOver(this.currentDragData,S.element,S.index,S.sector,S.browserEvent);if(this.canDrop=typeof L=="boolean"?L:L.accept,!this.canDrop)return this.currentDragFeedback=void 0,this.currentDragFeedbackDisposable.dispose(),!1;S.browserEvent.dataTransfer.dropEffect=typeof L!="boolean"&&L.effect?.type===0?"copy":"move";let D;typeof L!="boolean"&&L.feedback?D=L.feedback:typeof S.index>"u"?D=[-1]:D=[S.index],D=(0,m.distinct)(D).filter(M=>M>=-1&&MM-A),D=D[0]===-1?[-1]:D;let T=typeof L!="boolean"&&L.effect&&L.effect.position?L.effect.position:"drop-target";if(f(this.currentDragFeedback,D)&&this.currentDragFeedbackPosition===T)return!0;if(this.currentDragFeedback=D,this.currentDragFeedbackPosition=T,this.currentDragFeedbackDisposable.dispose(),D[0]===-1)this.domNode.classList.add(T),this.rowsContainer.classList.add(T),this.currentDragFeedbackDisposable=(0,n.toDisposable)(()=>{this.domNode.classList.remove(T),this.rowsContainer.classList.remove(T)});else{if(D.length>1&&T!=="drop-target")throw new Error("Can't use multiple feedbacks with position different than 'over'");T==="drop-target-after"&&D[0]{for(const M of D){const A=this.items[M];A.dropTarget=!1,A.row?.domNode.classList.remove(T)}})}return!0}onDragLeave(S){this.onDragLeaveTimeout.dispose(),this.onDragLeaveTimeout=(0,_.disposableTimeout)(()=>this.clearDragOverFeedback(),100,this.disposables),this.currentDragData&&this.dnd.onDragLeave?.(this.currentDragData,S.element,S.index,S.browserEvent)}onDrop(S){if(!this.canDrop)return;const L=this.currentDragData;this.teardownDragAndDropScrollTopAnimation(),this.clearDragOverFeedback(),this.domNode.classList.remove("dragging"),this.currentDragData=void 0,l.CurrentDragAndDropData=void 0,!(!L||!S.browserEvent.dataTransfer)&&(S.browserEvent.preventDefault(),L.update(S.browserEvent.dataTransfer),this.dnd.drop(L,S.element,S.index,S.sector,S.browserEvent))}onDragEnd(S){this.canDrop=!1,this.teardownDragAndDropScrollTopAnimation(),this.clearDragOverFeedback(),this.domNode.classList.remove("dragging"),this.currentDragData=void 0,l.CurrentDragAndDropData=void 0,this.dnd.onDragEnd?.(S)}clearDragOverFeedback(){this.currentDragFeedback=void 0,this.currentDragFeedbackPosition=void 0,this.currentDragFeedbackDisposable.dispose(),this.currentDragFeedbackDisposable=n.Disposable.None}setupDragAndDropScrollTopAnimation(S){if(!this.dragOverAnimationDisposable){const L=(0,k.getTopLeftOffset)(this.domNode).top;this.dragOverAnimationDisposable=(0,k.animate)((0,k.getWindow)(this.domNode),this.animateDragAndDropScrollTop.bind(this,L))}this.dragOverAnimationStopDisposable.dispose(),this.dragOverAnimationStopDisposable=(0,_.disposableTimeout)(()=>{this.dragOverAnimationDisposable&&(this.dragOverAnimationDisposable.dispose(),this.dragOverAnimationDisposable=void 0)},1e3,this.disposables),this.dragOverMouseY=S.pageY}animateDragAndDropScrollTop(S){if(this.dragOverMouseY===void 0)return;const L=this.dragOverMouseY-S,D=this.renderHeight-35;L<35?this.scrollTop+=Math.max(-14,Math.floor(.3*(L-35))):L>D&&(this.scrollTop+=Math.min(14,Math.floor(.3*(L-D))))}teardownDragAndDropScrollTopAnimation(){this.dragOverAnimationStopDisposable.dispose(),this.dragOverAnimationDisposable&&(this.dragOverAnimationDisposable.dispose(),this.dragOverAnimationDisposable=void 0)}getTargetSector(S,L){if(L===void 0)return;const D=S.offsetY/this.items[L].size,T=Math.floor(D/.25);return(0,c.clamp)(T,0,3)}getItemIndexFromEventTarget(S){const L=this.scrollableElement.getDomNode();let D=S;for(;((0,k.isHTMLElement)(D)||(0,k.isSVGElement)(D))&&D!==this.rowsContainer&&L.contains(D);){const T=D.getAttribute("data-index");if(T){const M=Number(T);if(!isNaN(M))return M}D=D.parentElement}}getRenderRange(S,L){return{start:this.rangeMap.indexAt(S),end:this.rangeMap.indexAfter(S+L-1)}}_rerender(S,L,D){const T=this.getRenderRange(S,L);let M,A;S===this.elementTop(T.start)?(M=T.start,A=0):T.end-T.start>1&&(M=T.start+1,A=this.elementTop(M)-S);let P=0;for(;;){const N=this.getRenderRange(S,L);let O=!1;for(let F=N.start;F=W.start;V--)this.insertItemInDOM(V);for(let W=N.start;WB.templateData===ge);if(X>=0){const B=this.renderedElements[X];this.trait.unrender(ge),B.index=de}else{const B={index:de,templateData:ge};this.renderedElements.push(B)}this.trait.renderIndex(de,ge)}splice(ee,de,ge){const X=[];for(const B of this.renderedElements)B.index=ee+de&&X.push({index:B.index+ge-de,templateData:B.templateData});this.renderedElements=X}renderIndexes(ee){for(const{index:de,templateData:ge}of this.renderedElements)ee.indexOf(de)>-1&&this.trait.renderIndex(de,ge)}disposeTemplate(ee){const de=this.renderedElements.findIndex(ge=>ge.templateData===ee);de<0||this.renderedElements.splice(de,1)}}class f{get name(){return this._trait}get renderer(){return new C(this)}constructor(ee){this._trait=ee,this.indexes=[],this.sortedIndexes=[],this._onChange=new o.Emitter,this.onChange=this._onChange.event}splice(ee,de,ge){const X=ge.length-de,B=ee+de,$=[];let Q=0;for(;Q=B;)$.push(this.sortedIndexes[Q++]+X);this.renderer.splice(ee,de,ge.length),this._set($,$)}renderIndex(ee,de){de.classList.toggle(this._trait,this.contains(ee))}unrender(ee){ee.classList.remove(this._trait)}set(ee,de){return this._set(ee,[...ee].sort(J),de)}_set(ee,de,ge){const X=this.indexes,B=this.sortedIndexes;this.indexes=ee,this.sortedIndexes=de;const $=K(B,ee);return this.renderer.renderIndexes($),this._onChange.fire({indexes:ee,browserEvent:ge}),X}get(){return this.indexes}contains(ee){return(0,_.binarySearch)(this.sortedIndexes,ee,J)>=0}dispose(){(0,i.dispose)(this._onChange)}}ke([n.memoize],f.prototype,"renderer",null);class h extends f{constructor(ee){super("selected"),this.setAriaSelected=ee}renderIndex(ee,de){super.renderIndex(ee,de),this.setAriaSelected&&(this.contains(ee)?de.setAttribute("aria-selected","true"):de.setAttribute("aria-selected","false"))}}class v{constructor(ee,de,ge){this.trait=ee,this.view=de,this.identityProvider=ge}splice(ee,de,ge){if(!this.identityProvider)return this.trait.splice(ee,de,new Array(ge.length).fill(!1));const X=this.trait.get().map(Q=>this.identityProvider.getId(this.view.element(Q)).toString());if(X.length===0)return this.trait.splice(ee,de,new Array(ge.length).fill(!1));const B=new Set(X),$=ge.map(Q=>B.has(this.identityProvider.getId(Q).toString()));this.trait.splice(ee,de,$)}}function w(ae){return ae.tagName==="INPUT"||ae.tagName==="TEXTAREA"}function S(ae,ee){return ae.classList.contains(ee)?!0:ae.classList.contains("monaco-list")||!ae.parentElement?!1:S(ae.parentElement,ee)}function L(ae){return S(ae,"monaco-editor")}function D(ae){return S(ae,"monaco-custom-toggle")}function T(ae){return S(ae,"action-item")}function M(ae){return S(ae,"monaco-tree-sticky-row")}function A(ae){return ae.classList.contains("monaco-tree-sticky-container")}function P(ae){return ae.tagName==="A"&&ae.classList.contains("monaco-button")||ae.tagName==="DIV"&&ae.classList.contains("monaco-button-dropdown")?!0:ae.classList.contains("monaco-list")||!ae.parentElement?!1:P(ae.parentElement)}class N{get onKeyDown(){return o.Event.chain(this.disposables.add(new k.DomEmitter(this.view.domNode,"keydown")).event,ee=>ee.filter(de=>!w(de.target)).map(de=>new I.StandardKeyboardEvent(de)))}constructor(ee,de,ge){this.list=ee,this.view=de,this.disposables=new i.DisposableStore,this.multipleSelectionDisposables=new i.DisposableStore,this.multipleSelectionSupport=ge.multipleSelectionSupport,this.disposables.add(this.onKeyDown(X=>{switch(X.keyCode){case 3:return this.onEnter(X);case 16:return this.onUpArrow(X);case 18:return this.onDownArrow(X);case 11:return this.onPageUpArrow(X);case 12:return this.onPageDownArrow(X);case 9:return this.onEscape(X);case 31:this.multipleSelectionSupport&&(g.isMacintosh?X.metaKey:X.ctrlKey)&&this.onCtrlA(X)}}))}updateOptions(ee){ee.multipleSelectionSupport!==void 0&&(this.multipleSelectionSupport=ee.multipleSelectionSupport)}onEnter(ee){ee.preventDefault(),ee.stopPropagation(),this.list.setSelection(this.list.getFocus(),ee.browserEvent)}onUpArrow(ee){ee.preventDefault(),ee.stopPropagation(),this.list.focusPrevious(1,!1,ee.browserEvent);const de=this.list.getFocus()[0];this.list.setAnchor(de),this.list.reveal(de),this.view.domNode.focus()}onDownArrow(ee){ee.preventDefault(),ee.stopPropagation(),this.list.focusNext(1,!1,ee.browserEvent);const de=this.list.getFocus()[0];this.list.setAnchor(de),this.list.reveal(de),this.view.domNode.focus()}onPageUpArrow(ee){ee.preventDefault(),ee.stopPropagation(),this.list.focusPreviousPage(ee.browserEvent);const de=this.list.getFocus()[0];this.list.setAnchor(de),this.list.reveal(de),this.view.domNode.focus()}onPageDownArrow(ee){ee.preventDefault(),ee.stopPropagation(),this.list.focusNextPage(ee.browserEvent);const de=this.list.getFocus()[0];this.list.setAnchor(de),this.list.reveal(de),this.view.domNode.focus()}onCtrlA(ee){ee.preventDefault(),ee.stopPropagation(),this.list.setSelection((0,_.range)(this.list.length),ee.browserEvent),this.list.setAnchor(void 0),this.view.domNode.focus()}onEscape(ee){this.list.getSelection().length&&(ee.preventDefault(),ee.stopPropagation(),this.list.setSelection([],ee.browserEvent),this.list.setAnchor(void 0),this.view.domNode.focus())}dispose(){this.disposables.dispose(),this.multipleSelectionDisposables.dispose()}}ke([n.memoize],N.prototype,"onKeyDown",null);var O;(function(ae){ae[ae.Automatic=0]="Automatic",ae[ae.Trigger=1]="Trigger"})(O||(e.TypeNavigationMode=O={}));var F;(function(ae){ae[ae.Idle=0]="Idle",ae[ae.Typing=1]="Typing"})(F||(F={})),e.DefaultKeyboardNavigationDelegate=new class{mightProducePrintableCharacter(ae){return ae.ctrlKey||ae.metaKey||ae.altKey?!1:ae.keyCode>=31&&ae.keyCode<=56||ae.keyCode>=21&&ae.keyCode<=30||ae.keyCode>=98&&ae.keyCode<=107||ae.keyCode>=85&&ae.keyCode<=95}};class x{constructor(ee,de,ge,X,B){this.list=ee,this.view=de,this.keyboardNavigationLabelProvider=ge,this.keyboardNavigationEventFilter=X,this.delegate=B,this.enabled=!1,this.state=F.Idle,this.mode=O.Automatic,this.triggered=!1,this.previouslyFocused=-1,this.enabledDisposables=new i.DisposableStore,this.disposables=new i.DisposableStore,this.updateOptions(ee.options)}updateOptions(ee){ee.typeNavigationEnabled??!0?this.enable():this.disable(),this.mode=ee.typeNavigationMode??O.Automatic}enable(){if(this.enabled)return;let ee=!1;const de=o.Event.chain(this.enabledDisposables.add(new k.DomEmitter(this.view.domNode,"keydown")).event,B=>B.filter($=>!w($.target)).filter(()=>this.mode===O.Automatic||this.triggered).map($=>new I.StandardKeyboardEvent($)).filter($=>ee||this.keyboardNavigationEventFilter($)).filter($=>this.delegate.mightProducePrintableCharacter($)).forEach($=>d.EventHelper.stop($,!0)).map($=>$.browserEvent.key)),ge=o.Event.debounce(de,()=>null,800,void 0,void 0,void 0,this.enabledDisposables);o.Event.reduce(o.Event.any(de,ge),(B,$)=>$===null?null:(B||"")+$,void 0,this.enabledDisposables)(this.onInput,this,this.enabledDisposables),ge(this.onClear,this,this.enabledDisposables),de(()=>ee=!0,void 0,this.enabledDisposables),ge(()=>ee=!1,void 0,this.enabledDisposables),this.enabled=!0,this.triggered=!1}disable(){this.enabled&&(this.enabledDisposables.clear(),this.enabled=!1,this.triggered=!1)}onClear(){const ee=this.list.getFocus();if(ee.length>0&&ee[0]===this.previouslyFocused){const de=this.list.options.accessibilityProvider?.getAriaLabel(this.list.element(ee[0]));typeof de=="string"?(0,y.alert)(de):de&&(0,y.alert)(de.get())}this.previouslyFocused=-1}onInput(ee){if(!ee){this.state=F.Idle,this.triggered=!1;return}const de=this.list.getFocus(),ge=de.length>0?de[0]:0,X=this.state===F.Idle?1:0;this.state=F.Typing;for(let B=0;B1&&te.length===1){this.previouslyFocused=ge,this.list.setFocus([$]),this.list.reveal($);return}}}else if(typeof Z>"u"||(0,t.matchesPrefix)(ee,Z)){this.previouslyFocused=ge,this.list.setFocus([$]),this.list.reveal($);return}}}dispose(){this.disable(),this.enabledDisposables.dispose(),this.disposables.dispose()}}class W{constructor(ee,de){this.list=ee,this.view=de,this.disposables=new i.DisposableStore;const ge=o.Event.chain(this.disposables.add(new k.DomEmitter(de.domNode,"keydown")).event,B=>B.filter($=>!w($.target)).map($=>new I.StandardKeyboardEvent($)));o.Event.chain(ge,B=>B.filter($=>$.keyCode===2&&!$.ctrlKey&&!$.metaKey&&!$.shiftKey&&!$.altKey))(this.onTab,this,this.disposables)}onTab(ee){if(ee.target!==this.view.domNode)return;const de=this.list.getFocus();if(de.length===0)return;const ge=this.view.domElement(de[0]);if(!ge)return;const X=ge.querySelector("[tabIndex]");if(!X||!(0,d.isHTMLElement)(X)||X.tabIndex===-1)return;const B=(0,d.getWindow)(X).getComputedStyle(X);B.visibility==="hidden"||B.display==="none"||(ee.preventDefault(),ee.stopPropagation(),X.focus())}dispose(){this.disposables.dispose()}}function V(ae){return g.isMacintosh?ae.browserEvent.metaKey:ae.browserEvent.ctrlKey}function q(ae){return ae.browserEvent.shiftKey}function H(ae){return(0,d.isMouseEvent)(ae)&&ae.button===2}const z={isSelectionSingleChangeEvent:V,isSelectionRangeChangeEvent:q};class U{constructor(ee){this.list=ee,this.disposables=new i.DisposableStore,this._onPointer=new o.Emitter,this.onPointer=this._onPointer.event,ee.options.multipleSelectionSupport!==!1&&(this.multipleSelectionController=this.list.options.multipleSelectionController||z),this.mouseSupport=typeof ee.options.mouseSupport>"u"||!!ee.options.mouseSupport,this.mouseSupport&&(ee.onMouseDown(this.onMouseDown,this,this.disposables),ee.onContextMenu(this.onContextMenu,this,this.disposables),ee.onMouseDblClick(this.onDoubleClick,this,this.disposables),ee.onTouchStart(this.onMouseDown,this,this.disposables),this.disposables.add(E.Gesture.addTarget(ee.getHTMLElement()))),o.Event.any(ee.onMouseClick,ee.onMouseMiddleClick,ee.onTap)(this.onViewPointer,this,this.disposables)}updateOptions(ee){ee.multipleSelectionSupport!==void 0&&(this.multipleSelectionController=void 0,ee.multipleSelectionSupport&&(this.multipleSelectionController=this.list.options.multipleSelectionController||z))}isSelectionSingleChangeEvent(ee){return this.multipleSelectionController?this.multipleSelectionController.isSelectionSingleChangeEvent(ee):!1}isSelectionRangeChangeEvent(ee){return this.multipleSelectionController?this.multipleSelectionController.isSelectionRangeChangeEvent(ee):!1}isSelectionChangeEvent(ee){return this.isSelectionSingleChangeEvent(ee)||this.isSelectionRangeChangeEvent(ee)}onMouseDown(ee){L(ee.browserEvent.target)||(0,d.getActiveElement)()!==ee.browserEvent.target&&this.list.domFocus()}onContextMenu(ee){if(w(ee.browserEvent.target)||L(ee.browserEvent.target))return;const de=typeof ee.index>"u"?[]:[ee.index];this.list.setFocus(de,ee.browserEvent)}onViewPointer(ee){if(!this.mouseSupport||w(ee.browserEvent.target)||L(ee.browserEvent.target)||ee.browserEvent.isHandledByList)return;ee.browserEvent.isHandledByList=!0;const de=ee.index;if(typeof de>"u"){this.list.setFocus([],ee.browserEvent),this.list.setSelection([],ee.browserEvent),this.list.setAnchor(void 0);return}if(this.isSelectionChangeEvent(ee))return this.changeSelection(ee);this.list.setFocus([de],ee.browserEvent),this.list.setAnchor(de),H(ee.browserEvent)||this.list.setSelection([de],ee.browserEvent),this._onPointer.fire(ee)}onDoubleClick(ee){if(w(ee.browserEvent.target)||L(ee.browserEvent.target)||this.isSelectionChangeEvent(ee)||ee.browserEvent.isHandledByList)return;ee.browserEvent.isHandledByList=!0;const de=this.list.getFocus();this.list.setSelection(de,ee.browserEvent)}changeSelection(ee){const de=ee.index;let ge=this.list.getAnchor();if(this.isSelectionRangeChangeEvent(ee)){typeof ge>"u"&&(ge=this.list.getFocus()[0]??de,this.list.setAnchor(ge));const X=Math.min(ge,de),B=Math.max(ge,de),$=(0,_.range)(X,B+1),Q=this.list.getSelection(),Z=G(K(Q,[ge]),ge);if(Z.length===0)return;const te=K($,R(Q,Z));this.list.setSelection(te,ee.browserEvent),this.list.setFocus([de],ee.browserEvent)}else if(this.isSelectionSingleChangeEvent(ee)){const X=this.list.getSelection(),B=X.filter($=>$!==de);this.list.setFocus([de]),this.list.setAnchor(de),X.length===B.length?this.list.setSelection([...B,de],ee.browserEvent):this.list.setSelection(B,ee.browserEvent)}}dispose(){this.disposables.dispose()}}e.MouseController=U;class j{constructor(ee,de){this.styleElement=ee,this.selectorSuffix=de}style(ee){const de=this.selectorSuffix&&`.${this.selectorSuffix}`,ge=[];ee.listBackground&&ge.push(`.monaco-list${de} .monaco-list-rows { background: ${ee.listBackground}; }`),ee.listFocusBackground&&(ge.push(`.monaco-list${de}:focus .monaco-list-row.focused { background-color: ${ee.listFocusBackground}; }`),ge.push(`.monaco-list${de}:focus .monaco-list-row.focused:hover { background-color: ${ee.listFocusBackground}; }`)),ee.listFocusForeground&&ge.push(`.monaco-list${de}:focus .monaco-list-row.focused { color: ${ee.listFocusForeground}; }`),ee.listActiveSelectionBackground&&(ge.push(`.monaco-list${de}:focus .monaco-list-row.selected { background-color: ${ee.listActiveSelectionBackground}; }`),ge.push(`.monaco-list${de}:focus .monaco-list-row.selected:hover { background-color: ${ee.listActiveSelectionBackground}; }`)),ee.listActiveSelectionForeground&&ge.push(`.monaco-list${de}:focus .monaco-list-row.selected { color: ${ee.listActiveSelectionForeground}; }`),ee.listActiveSelectionIconForeground&&ge.push(`.monaco-list${de}:focus .monaco-list-row.selected .codicon { color: ${ee.listActiveSelectionIconForeground}; }`),ee.listFocusAndSelectionBackground&&ge.push(` - .monaco-drag-image, - .monaco-list${de}:focus .monaco-list-row.selected.focused { background-color: ${ee.listFocusAndSelectionBackground}; } - `),ee.listFocusAndSelectionForeground&&ge.push(` - .monaco-drag-image, - .monaco-list${de}:focus .monaco-list-row.selected.focused { color: ${ee.listFocusAndSelectionForeground}; } - `),ee.listInactiveFocusForeground&&(ge.push(`.monaco-list${de} .monaco-list-row.focused { color: ${ee.listInactiveFocusForeground}; }`),ge.push(`.monaco-list${de} .monaco-list-row.focused:hover { color: ${ee.listInactiveFocusForeground}; }`)),ee.listInactiveSelectionIconForeground&&ge.push(`.monaco-list${de} .monaco-list-row.focused .codicon { color: ${ee.listInactiveSelectionIconForeground}; }`),ee.listInactiveFocusBackground&&(ge.push(`.monaco-list${de} .monaco-list-row.focused { background-color: ${ee.listInactiveFocusBackground}; }`),ge.push(`.monaco-list${de} .monaco-list-row.focused:hover { background-color: ${ee.listInactiveFocusBackground}; }`)),ee.listInactiveSelectionBackground&&(ge.push(`.monaco-list${de} .monaco-list-row.selected { background-color: ${ee.listInactiveSelectionBackground}; }`),ge.push(`.monaco-list${de} .monaco-list-row.selected:hover { background-color: ${ee.listInactiveSelectionBackground}; }`)),ee.listInactiveSelectionForeground&&ge.push(`.monaco-list${de} .monaco-list-row.selected { color: ${ee.listInactiveSelectionForeground}; }`),ee.listHoverBackground&&ge.push(`.monaco-list${de}:not(.drop-target):not(.dragging) .monaco-list-row:hover:not(.selected):not(.focused) { background-color: ${ee.listHoverBackground}; }`),ee.listHoverForeground&&ge.push(`.monaco-list${de}:not(.drop-target):not(.dragging) .monaco-list-row:hover:not(.selected):not(.focused) { color: ${ee.listHoverForeground}; }`);const X=(0,d.asCssValueWithDefault)(ee.listFocusAndSelectionOutline,(0,d.asCssValueWithDefault)(ee.listSelectionOutline,ee.listFocusOutline??""));X&&ge.push(`.monaco-list${de}:focus .monaco-list-row.focused.selected { outline: 1px solid ${X}; outline-offset: -1px;}`),ee.listFocusOutline&&ge.push(` - .monaco-drag-image, - .monaco-list${de}:focus .monaco-list-row.focused { outline: 1px solid ${ee.listFocusOutline}; outline-offset: -1px; } - .monaco-workbench.context-menu-visible .monaco-list${de}.last-focused .monaco-list-row.focused { outline: 1px solid ${ee.listFocusOutline}; outline-offset: -1px; } - `);const B=(0,d.asCssValueWithDefault)(ee.listSelectionOutline,ee.listInactiveFocusOutline??"");B&&ge.push(`.monaco-list${de} .monaco-list-row.focused.selected { outline: 1px dotted ${B}; outline-offset: -1px; }`),ee.listSelectionOutline&&ge.push(`.monaco-list${de} .monaco-list-row.selected { outline: 1px dotted ${ee.listSelectionOutline}; outline-offset: -1px; }`),ee.listInactiveFocusOutline&&ge.push(`.monaco-list${de} .monaco-list-row.focused { outline: 1px dotted ${ee.listInactiveFocusOutline}; outline-offset: -1px; }`),ee.listHoverOutline&&ge.push(`.monaco-list${de} .monaco-list-row:hover { outline: 1px dashed ${ee.listHoverOutline}; outline-offset: -1px; }`),ee.listDropOverBackground&&ge.push(` - .monaco-list${de}.drop-target, - .monaco-list${de} .monaco-list-rows.drop-target, - .monaco-list${de} .monaco-list-row.drop-target { background-color: ${ee.listDropOverBackground} !important; color: inherit !important; } - `),ee.listDropBetweenBackground&&(ge.push(` - .monaco-list${de} .monaco-list-rows.drop-target-before .monaco-list-row:first-child::before, - .monaco-list${de} .monaco-list-row.drop-target-before::before { - content: ""; position: absolute; top: 0px; left: 0px; width: 100%; height: 1px; - background-color: ${ee.listDropBetweenBackground}; - }`),ge.push(` - .monaco-list${de} .monaco-list-rows.drop-target-after .monaco-list-row:last-child::after, - .monaco-list${de} .monaco-list-row.drop-target-after::after { - content: ""; position: absolute; bottom: 0px; left: 0px; width: 100%; height: 1px; - background-color: ${ee.listDropBetweenBackground}; - }`)),ee.tableColumnsBorder&&ge.push(` - .monaco-table > .monaco-split-view2, - .monaco-table > .monaco-split-view2 .monaco-sash.vertical::before, - .monaco-workbench:not(.reduce-motion) .monaco-table:hover > .monaco-split-view2, - .monaco-workbench:not(.reduce-motion) .monaco-table:hover > .monaco-split-view2 .monaco-sash.vertical::before { - border-color: ${ee.tableColumnsBorder}; - } - - .monaco-workbench:not(.reduce-motion) .monaco-table > .monaco-split-view2, - .monaco-workbench:not(.reduce-motion) .monaco-table > .monaco-split-view2 .monaco-sash.vertical::before { - border-color: transparent; - } - `),ee.tableOddRowsBackgroundColor&&ge.push(` - .monaco-table .monaco-list-row[data-parity=odd]:not(.focused):not(.selected):not(:hover) .monaco-table-tr, - .monaco-table .monaco-list:not(:focus) .monaco-list-row[data-parity=odd].focused:not(.selected):not(:hover) .monaco-table-tr, - .monaco-table .monaco-list:not(.focused) .monaco-list-row[data-parity=odd].focused:not(.selected):not(:hover) .monaco-table-tr { - background-color: ${ee.tableOddRowsBackgroundColor}; - } - `),this.styleElement.textContent=ge.join(` -`)}}e.DefaultStyleController=j,e.unthemedListStyles={listFocusBackground:"#7FB0D0",listActiveSelectionBackground:"#0E639C",listActiveSelectionForeground:"#FFFFFF",listActiveSelectionIconForeground:"#FFFFFF",listFocusAndSelectionOutline:"#90C2F9",listFocusAndSelectionBackground:"#094771",listFocusAndSelectionForeground:"#FFFFFF",listInactiveSelectionBackground:"#3F3F46",listInactiveSelectionIconForeground:"#FFFFFF",listHoverBackground:"#2A2D2E",listDropOverBackground:"#383B3D",listDropBetweenBackground:"#EEEEEE",treeIndentGuidesStroke:"#a9a9a9",treeInactiveIndentGuidesStroke:p.Color.fromHex("#a9a9a9").transparent(.4).toString(),tableColumnsBorder:p.Color.fromHex("#cccccc").transparent(.2).toString(),tableOddRowsBackgroundColor:p.Color.fromHex("#cccccc").transparent(.04).toString(),listBackground:void 0,listFocusForeground:void 0,listInactiveSelectionForeground:void 0,listInactiveFocusForeground:void 0,listInactiveFocusBackground:void 0,listHoverForeground:void 0,listFocusOutline:void 0,listInactiveFocusOutline:void 0,listSelectionOutline:void 0,listHoverOutline:void 0,treeStickyScrollBackground:void 0,treeStickyScrollBorder:void 0,treeStickyScrollShadow:void 0};const Y={keyboardSupport:!0,mouseSupport:!0,multipleSelectionSupport:!0,dnd:{getDragURI(){return null},onDragStart(){},onDragOver(){return!1},drop(){},dispose(){}}};function G(ae,ee){const de=ae.indexOf(ee);if(de===-1)return[];const ge=[];let X=de-1;for(;X>=0&&ae[X]===ee-(de-X);)ge.push(ae[X--]);for(ge.reverse(),X=de;X=ae.length)de.push(ee[X++]);else if(X>=ee.length)de.push(ae[ge++]);else if(ae[ge]===ee[X]){de.push(ae[ge]),ge++,X++;continue}else ae[ge]=ae.length)de.push(ee[X++]);else if(X>=ee.length)de.push(ae[ge++]);else if(ae[ge]===ee[X]){ge++,X++;continue}else ae[ge]ae-ee;class ie{constructor(ee,de){this._templateId=ee,this.renderers=de}get templateId(){return this._templateId}renderTemplate(ee){return this.renderers.map(de=>de.renderTemplate(ee))}renderElement(ee,de,ge,X){let B=0;for(const $ of this.renderers)$.renderElement(ee,de,ge[B++],X)}disposeElement(ee,de,ge,X){let B=0;for(const $ of this.renderers)$.disposeElement?.(ee,de,ge[B],X),B+=1}disposeTemplate(ee){let de=0;for(const ge of this.renderers)ge.disposeTemplate(ee[de++])}}class ue{constructor(ee){this.accessibilityProvider=ee,this.templateId="a18n"}renderTemplate(ee){return{container:ee,disposables:new i.DisposableStore}}renderElement(ee,de,ge){const X=this.accessibilityProvider.getAriaLabel(ee),B=X&&typeof X!="string"?X:(0,u.constObservable)(X);ge.disposables.add((0,u.autorun)(Q=>{this.setAriaLabel(Q.readObservable(B),ge.container)}));const $=this.accessibilityProvider.getAriaLevel&&this.accessibilityProvider.getAriaLevel(ee);typeof $=="number"?ge.container.setAttribute("aria-level",`${$}`):ge.container.removeAttribute("aria-level")}setAriaLabel(ee,de){ee?de.setAttribute("aria-label",ee):de.removeAttribute("aria-label")}disposeElement(ee,de,ge,X){ge.disposables.clear()}disposeTemplate(ee){ee.disposables.dispose()}}class he{constructor(ee,de){this.list=ee,this.dnd=de}getDragElements(ee){const de=this.list.getSelectedElements();return de.indexOf(ee)>-1?de:[ee]}getDragURI(ee){return this.dnd.getDragURI(ee)}getDragLabel(ee,de){if(this.dnd.getDragLabel)return this.dnd.getDragLabel(ee,de)}onDragStart(ee,de){this.dnd.onDragStart?.(ee,de)}onDragOver(ee,de,ge,X,B){return this.dnd.onDragOver(ee,de,ge,X,B)}onDragLeave(ee,de,ge,X){this.dnd.onDragLeave?.(ee,de,ge,X)}onDragEnd(ee){this.dnd.onDragEnd?.(ee)}drop(ee,de,ge,X,B){this.dnd.drop(ee,de,ge,X,B)}dispose(){this.dnd.dispose()}}class pe{get onDidChangeFocus(){return o.Event.map(this.eventBufferer.wrapEvent(this.focus.onChange),ee=>this.toListEvent(ee),this.disposables)}get onDidChangeSelection(){return o.Event.map(this.eventBufferer.wrapEvent(this.selection.onChange),ee=>this.toListEvent(ee),this.disposables)}get domId(){return this.view.domId}get onDidScroll(){return this.view.onDidScroll}get onMouseClick(){return this.view.onMouseClick}get onMouseDblClick(){return this.view.onMouseDblClick}get onMouseMiddleClick(){return this.view.onMouseMiddleClick}get onPointer(){return this.mouseController.onPointer}get onMouseDown(){return this.view.onMouseDown}get onMouseOver(){return this.view.onMouseOver}get onMouseOut(){return this.view.onMouseOut}get onTouchStart(){return this.view.onTouchStart}get onTap(){return this.view.onTap}get onContextMenu(){let ee=!1;const de=o.Event.chain(this.disposables.add(new k.DomEmitter(this.view.domNode,"keydown")).event,B=>B.map($=>new I.StandardKeyboardEvent($)).filter($=>ee=$.keyCode===58||$.shiftKey&&$.keyCode===68).map($=>d.EventHelper.stop($,!0)).filter(()=>!1)),ge=o.Event.chain(this.disposables.add(new k.DomEmitter(this.view.domNode,"keyup")).event,B=>B.forEach(()=>ee=!1).map($=>new I.StandardKeyboardEvent($)).filter($=>$.keyCode===58||$.shiftKey&&$.keyCode===68).map($=>d.EventHelper.stop($,!0)).map(({browserEvent:$})=>{const Q=this.getFocus(),Z=Q.length?Q[0]:void 0,te=typeof Z<"u"?this.view.element(Z):void 0,re=typeof Z<"u"?this.view.domElement(Z):this.view.domNode;return{index:Z,element:te,anchor:re,browserEvent:$}})),X=o.Event.chain(this.view.onContextMenu,B=>B.filter($=>!ee).map(({element:$,index:Q,browserEvent:Z})=>({element:$,index:Q,anchor:new r.StandardMouseEvent((0,d.getWindow)(this.view.domNode),Z),browserEvent:Z})));return o.Event.any(de,ge,X)}get onKeyDown(){return this.disposables.add(new k.DomEmitter(this.view.domNode,"keydown")).event}get onDidFocus(){return o.Event.signal(this.disposables.add(new k.DomEmitter(this.view.domNode,"focus",!0)).event)}get onDidBlur(){return o.Event.signal(this.disposables.add(new k.DomEmitter(this.view.domNode,"blur",!0)).event)}constructor(ee,de,ge,X,B=Y){this.user=ee,this._options=B,this.focus=new f("focused"),this.anchor=new f("anchor"),this.eventBufferer=new o.EventBufferer,this._ariaLabel="",this.disposables=new i.DisposableStore,this._onDidDispose=new o.Emitter,this.onDidDispose=this._onDidDispose.event;const $=this._options.accessibilityProvider&&this._options.accessibilityProvider.getWidgetRole?this._options.accessibilityProvider?.getWidgetRole():"list";this.selection=new h($!=="listbox");const Q=[this.focus.renderer,this.selection.renderer];this.accessibilityProvider=B.accessibilityProvider,this.accessibilityProvider&&(Q.push(new ue(this.accessibilityProvider)),this.accessibilityProvider.onDidChangeActiveDescendant?.(this.onDidChangeActiveDescendant,this,this.disposables)),X=X.map(te=>new ie(te.templateId,[...Q,te]));const Z={...B,dnd:B.dnd&&new he(this,B.dnd)};if(this.view=this.createListView(de,ge,X,Z),this.view.domNode.setAttribute("role",$),B.styleController)this.styleController=B.styleController(this.view.domId);else{const te=(0,d.createStyleSheet)(this.view.domNode);this.styleController=new j(te,this.view.domId)}if(this.spliceable=new m.CombinedSpliceable([new v(this.focus,this.view,B.identityProvider),new v(this.selection,this.view,B.identityProvider),new v(this.anchor,this.view,B.identityProvider),this.view]),this.disposables.add(this.focus),this.disposables.add(this.selection),this.disposables.add(this.anchor),this.disposables.add(this.view),this.disposables.add(this._onDidDispose),this.disposables.add(new W(this,this.view)),(typeof B.keyboardSupport!="boolean"||B.keyboardSupport)&&(this.keyboardController=new N(this,this.view,B),this.disposables.add(this.keyboardController)),B.keyboardNavigationLabelProvider){const te=B.keyboardNavigationDelegate||e.DefaultKeyboardNavigationDelegate;this.typeNavigationController=new x(this,this.view,B.keyboardNavigationLabelProvider,B.keyboardNavigationEventFilter??(()=>!0),te),this.disposables.add(this.typeNavigationController)}this.mouseController=this.createMouseController(B),this.disposables.add(this.mouseController),this.onDidChangeFocus(this._onFocusChange,this,this.disposables),this.onDidChangeSelection(this._onSelectionChange,this,this.disposables),this.accessibilityProvider&&(this.ariaLabel=this.accessibilityProvider.getWidgetAriaLabel()),this._options.multipleSelectionSupport!==!1&&this.view.domNode.setAttribute("aria-multiselectable","true")}createListView(ee,de,ge,X){return new a.ListView(ee,de,ge,X)}createMouseController(ee){return new U(this)}updateOptions(ee={}){this._options={...this._options,...ee},this.typeNavigationController?.updateOptions(this._options),this._options.multipleSelectionController!==void 0&&(this._options.multipleSelectionSupport?this.view.domNode.setAttribute("aria-multiselectable","true"):this.view.domNode.removeAttribute("aria-multiselectable")),this.mouseController.updateOptions(ee),this.keyboardController?.updateOptions(ee),this.view.updateOptions(ee)}get options(){return this._options}splice(ee,de,ge=[]){if(ee<0||ee>this.view.length)throw new l.ListError(this.user,`Invalid start index: ${ee}`);if(de<0)throw new l.ListError(this.user,`Invalid delete count: ${de}`);de===0&&ge.length===0||this.eventBufferer.bufferEvents(()=>this.spliceable.splice(ee,de,ge))}rerender(){this.view.rerender()}element(ee){return this.view.element(ee)}indexOf(ee){return this.view.indexOf(ee)}indexAt(ee){return this.view.indexAt(ee)}get length(){return this.view.length}get contentHeight(){return this.view.contentHeight}get onDidChangeContentHeight(){return this.view.onDidChangeContentHeight}get scrollTop(){return this.view.getScrollTop()}set scrollTop(ee){this.view.setScrollTop(ee)}get scrollHeight(){return this.view.scrollHeight}get renderHeight(){return this.view.renderHeight}get firstVisibleIndex(){return this.view.firstVisibleIndex}get ariaLabel(){return this._ariaLabel}set ariaLabel(ee){this._ariaLabel=ee,this.view.domNode.setAttribute("aria-label",ee)}domFocus(){this.view.domNode.focus({preventScroll:!0})}layout(ee,de){this.view.layout(ee,de)}setSelection(ee,de){for(const ge of ee)if(ge<0||ge>=this.length)throw new l.ListError(this.user,`Invalid index ${ge}`);this.selection.set(ee,de)}getSelection(){return this.selection.get()}getSelectedElements(){return this.getSelection().map(ee=>this.view.element(ee))}setAnchor(ee){if(typeof ee>"u"){this.anchor.set([]);return}if(ee<0||ee>=this.length)throw new l.ListError(this.user,`Invalid index ${ee}`);this.anchor.set([ee])}getAnchor(){return(0,_.firstOrDefault)(this.anchor.get(),void 0)}getAnchorElement(){const ee=this.getAnchor();return typeof ee>"u"?void 0:this.element(ee)}setFocus(ee,de){for(const ge of ee)if(ge<0||ge>=this.length)throw new l.ListError(this.user,`Invalid index ${ge}`);this.focus.set(ee,de)}focusNext(ee=1,de=!1,ge,X){if(this.length===0)return;const B=this.focus.get(),$=this.findNextIndex(B.length>0?B[0]+ee:0,de,X);$>-1&&this.setFocus([$],ge)}focusPrevious(ee=1,de=!1,ge,X){if(this.length===0)return;const B=this.focus.get(),$=this.findPreviousIndex(B.length>0?B[0]-ee:0,de,X);$>-1&&this.setFocus([$],ge)}async focusNextPage(ee,de){let ge=this.view.indexAt(this.view.getScrollTop()+this.view.renderHeight);ge=ge===0?0:ge-1;const X=this.getFocus()[0];if(X!==ge&&(X===void 0||ge>X)){const B=this.findPreviousIndex(ge,!1,de);B>-1&&X!==B?this.setFocus([B],ee):this.setFocus([ge],ee)}else{const B=this.view.getScrollTop();let $=B+this.view.renderHeight;ge>X&&($-=this.view.elementHeight(ge)),this.view.setScrollTop($),this.view.getScrollTop()!==B&&(this.setFocus([]),await(0,b.timeout)(0),await this.focusNextPage(ee,de))}}async focusPreviousPage(ee,de,ge=()=>0){let X;const B=ge(),$=this.view.getScrollTop()+B;$===0?X=this.view.indexAt($):X=this.view.indexAfter($-1);const Q=this.getFocus()[0];if(Q!==X&&(Q===void 0||Q>=X)){const Z=this.findNextIndex(X,!1,de);Z>-1&&Q!==Z?this.setFocus([Z],ee):this.setFocus([X],ee)}else{const Z=$;this.view.setScrollTop($-this.view.renderHeight-B),this.view.getScrollTop()+ge()!==Z&&(this.setFocus([]),await(0,b.timeout)(0),await this.focusPreviousPage(ee,de,ge))}}focusLast(ee,de){if(this.length===0)return;const ge=this.findPreviousIndex(this.length-1,!1,de);ge>-1&&this.setFocus([ge],ee)}focusFirst(ee,de){this.focusNth(0,ee,de)}focusNth(ee,de,ge){if(this.length===0)return;const X=this.findNextIndex(ee,!1,ge);X>-1&&this.setFocus([X],de)}findNextIndex(ee,de=!1,ge){for(let X=0;X=this.length&&!de)return-1;if(ee=ee%this.length,!ge||ge(this.element(ee)))return ee;ee++}return-1}findPreviousIndex(ee,de=!1,ge){for(let X=0;Xthis.view.element(ee))}reveal(ee,de,ge=0){if(ee<0||ee>=this.length)throw new l.ListError(this.user,`Invalid index ${ee}`);const X=this.view.getScrollTop(),B=this.view.elementTop(ee),$=this.view.elementHeight(ee);if((0,c.isNumber)(de)){const Q=$-this.view.renderHeight+ge;this.view.setScrollTop(Q*(0,s.clamp)(de,0,1)+B-ge)}else{const Q=B+$,Z=X+this.view.renderHeight;B=Z||(B=Z&&$>=this.view.renderHeight?this.view.setScrollTop(B-ge):Q>=Z&&this.view.setScrollTop(Q-this.view.renderHeight))}}getRelativeTop(ee,de=0){if(ee<0||ee>=this.length)throw new l.ListError(this.user,`Invalid index ${ee}`);const ge=this.view.getScrollTop(),X=this.view.elementTop(ee),B=this.view.elementHeight(ee);if(Xge+this.view.renderHeight)return null;const $=B-this.view.renderHeight+de;return Math.abs((ge+de-X)/$)}getHTMLElement(){return this.view.domNode}getScrollableElement(){return this.view.scrollableElementDomNode}getElementID(ee){return this.view.getElementDomId(ee)}getElementTop(ee){return this.view.elementTop(ee)}style(ee){this.styleController.style(ee)}toListEvent({indexes:ee,browserEvent:de}){return{indexes:ee,elements:ee.map(ge=>this.view.element(ge)),browserEvent:de}}_onFocusChange(){const ee=this.focus.get();this.view.domNode.classList.toggle("element-focused",ee.length>0),this.onDidChangeActiveDescendant()}onDidChangeActiveDescendant(){const ee=this.focus.get();if(ee.length>0){let de;this.accessibilityProvider?.getActiveDescendantId&&(de=this.accessibilityProvider.getActiveDescendantId(this.view.element(ee[0]))),this.view.domNode.setAttribute("aria-activedescendant",de||this.view.getElementDomId(ee[0]))}else this.view.domNode.removeAttribute("aria-activedescendant")}_onSelectionChange(){const ee=this.selection.get();this.view.domNode.classList.toggle("selection-none",ee.length===0),this.view.domNode.classList.toggle("selection-single",ee.length===1),this.view.domNode.classList.toggle("selection-multiple",ee.length>1)}dispose(){this._onDidDispose.fire(),this.disposables.dispose(),this._onDidDispose.dispose()}}e.List=pe,ke([n.memoize],pe.prototype,"onDidChangeFocus",null),ke([n.memoize],pe.prototype,"onDidChangeSelection",null),ke([n.memoize],pe.prototype,"onContextMenu",null),ke([n.memoize],pe.prototype,"onKeyDown",null),ke([n.memoize],pe.prototype,"onDidFocus",null),ke([n.memoize],pe.prototype,"onDidBlur",null)}),define(ne[637],se([1,0,13,18,6,2,115,305]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PagedList=void 0;class m{get templateId(){return this.renderer.templateId}constructor(o,t){this.renderer=o,this.modelProvider=t}renderTemplate(o){return{data:this.renderer.renderTemplate(o),disposable:E.Disposable.None}}renderElement(o,t,i,s){if(i.disposable?.dispose(),!i.data)return;const g=this.modelProvider();if(g.isResolved(o))return this.renderer.renderElement(g.get(o),o,i.data,s);const c=new k.CancellationTokenSource,l=g.resolve(o,c.token);i.disposable={dispose:()=>c.cancel()},this.renderer.renderPlaceholder(o,i.data),l.then(a=>this.renderer.renderElement(a,o,i.data,s))}disposeTemplate(o){o.disposable&&(o.disposable.dispose(),o.disposable=void 0),o.data&&(this.renderer.disposeTemplate(o.data),o.data=void 0)}}class _{constructor(o,t){this.modelProvider=o,this.accessibilityProvider=t}getWidgetAriaLabel(){return this.accessibilityProvider.getWidgetAriaLabel()}getAriaLabel(o){const t=this.modelProvider();return t.isResolved(o)?this.accessibilityProvider.getAriaLabel(t.get(o)):null}}function b(n,o){return{...o,accessibilityProvider:o.accessibilityProvider&&new _(n,o.accessibilityProvider)}}class p{constructor(o,t,i,s,g={}){const c=()=>this.model,l=s.map(a=>new m(a,c));this.list=new y.List(o,t,i,l,b(c,g))}updateOptions(o){this.list.updateOptions(o)}getHTMLElement(){return this.list.getHTMLElement()}get onDidFocus(){return this.list.onDidFocus}get widget(){return this.list}get onDidDispose(){return this.list.onDidDispose}get onMouseDblClick(){return I.Event.map(this.list.onMouseDblClick,({element:o,index:t,browserEvent:i})=>({element:o===void 0?void 0:this._model.get(o),index:t,browserEvent:i}))}get onPointer(){return I.Event.map(this.list.onPointer,({element:o,index:t,browserEvent:i})=>({element:o===void 0?void 0:this._model.get(o),index:t,browserEvent:i}))}get onDidChangeSelection(){return I.Event.map(this.list.onDidChangeSelection,({elements:o,indexes:t,browserEvent:i})=>({elements:o.map(s=>this._model.get(s)),indexes:t,browserEvent:i}))}get model(){return this._model}set model(o){this._model=o,this.list.splice(0,this.list.length,(0,d.range)(o.length))}getFocus(){return this.list.getFocus()}getSelection(){return this.list.getSelection()}getSelectedElements(){return this.getSelection().map(o=>this.model.get(o))}style(o){this.list.style(o)}dispose(){this.list.dispose()}}e.PagedList=p}),define(ne[357],se([1,0,5,93,173,86,13,33,6,2,141,163,19,474]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SplitView=e.Sizing=void 0;const t={separatorBorder:m.Color.transparent};class i{set size(u){this._size=u}get size(){return this._size}get visible(){return typeof this._cachedVisibleSize>"u"}setVisible(u,C){if(u!==this.visible){u?(this.size=(0,p.clamp)(this._cachedVisibleSize,this.viewMinimumSize,this.viewMaximumSize),this._cachedVisibleSize=void 0):(this._cachedVisibleSize=typeof C=="number"?C:this.size,this.size=0),this.container.classList.toggle("visible",u);try{this.view.setVisible?.(u)}catch(f){console.error("Splitview: Failed to set visible view"),console.error(f)}}}get minimumSize(){return this.visible?this.view.minimumSize:0}get viewMinimumSize(){return this.view.minimumSize}get maximumSize(){return this.visible?this.view.maximumSize:0}get viewMaximumSize(){return this.view.maximumSize}get priority(){return this.view.priority}get proportionalLayout(){return this.view.proportionalLayout??!0}get snap(){return!!this.view.snap}set enabled(u){this.container.style.pointerEvents=u?"":"none"}constructor(u,C,f,h){this.container=u,this.view=C,this.disposable=h,this._cachedVisibleSize=void 0,typeof f=="number"?(this._size=f,this._cachedVisibleSize=void 0,u.classList.add("visible")):(this._size=0,this._cachedVisibleSize=f.cachedVisibleSize)}layout(u,C){this.layoutContainer(u);try{this.view.layout(this.size,u,C)}catch(f){console.error("Splitview: Failed to layout view"),console.error(f)}}dispose(){this.disposable.dispose()}}class s extends i{layoutContainer(u){this.container.style.top=`${u}px`,this.container.style.height=`${this.size}px`}}class g extends i{layoutContainer(u){this.container.style.left=`${u}px`,this.container.style.width=`${this.size}px`}}var c;(function(r){r[r.Idle=0]="Idle",r[r.Busy=1]="Busy"})(c||(c={}));var l;(function(r){r.Distribute={type:"distribute"};function u(h){return{type:"split",index:h}}r.Split=u;function C(h){return{type:"auto",index:h}}r.Auto=C;function f(h){return{type:"invisible",cachedVisibleSize:h}}r.Invisible=f})(l||(e.Sizing=l={}));class a extends b.Disposable{get orthogonalStartSash(){return this._orthogonalStartSash}get orthogonalEndSash(){return this._orthogonalEndSash}get startSnappingEnabled(){return this._startSnappingEnabled}get endSnappingEnabled(){return this._endSnappingEnabled}set orthogonalStartSash(u){for(const C of this.sashItems)C.sash.orthogonalStartSash=u;this._orthogonalStartSash=u}set orthogonalEndSash(u){for(const C of this.sashItems)C.sash.orthogonalEndSash=u;this._orthogonalEndSash=u}set startSnappingEnabled(u){this._startSnappingEnabled!==u&&(this._startSnappingEnabled=u,this.updateSashEnablement())}set endSnappingEnabled(u){this._endSnappingEnabled!==u&&(this._endSnappingEnabled=u,this.updateSashEnablement())}constructor(u,C={}){super(),this.size=0,this._contentSize=0,this.proportions=void 0,this.viewItems=[],this.sashItems=[],this.state=c.Idle,this._onDidSashChange=this._register(new _.Emitter),this._onDidSashReset=this._register(new _.Emitter),this._startSnappingEnabled=!0,this._endSnappingEnabled=!0,this.onDidSashChange=this._onDidSashChange.event,this.onDidSashReset=this._onDidSashReset.event,this.orientation=C.orientation??0,this.inverseAltBehavior=C.inverseAltBehavior??!1,this.proportionalLayout=C.proportionalLayout??!0,this.getSashOrthogonalSize=C.getSashOrthogonalSize,this.el=document.createElement("div"),this.el.classList.add("monaco-split-view2"),this.el.classList.add(this.orientation===0?"vertical":"horizontal"),u.appendChild(this.el),this.sashContainer=(0,d.append)(this.el,(0,d.$)(".sash-container")),this.viewContainer=(0,d.$)(".split-view-container"),this.scrollable=this._register(new n.Scrollable({forceIntegerValues:!0,smoothScrollDuration:125,scheduleAtNextAnimationFrame:h=>(0,d.scheduleAtNextAnimationFrame)((0,d.getWindow)(this.el),h)})),this.scrollableElement=this._register(new E.SmoothScrollableElement(this.viewContainer,{vertical:this.orientation===0?C.scrollbarVisibility??1:2,horizontal:this.orientation===1?C.scrollbarVisibility??1:2},this.scrollable));const f=this._register(new k.DomEmitter(this.viewContainer,"scroll")).event;this._register(f(h=>{const v=this.scrollableElement.getScrollPosition(),w=Math.abs(this.viewContainer.scrollLeft-v.scrollLeft)<=1?void 0:this.viewContainer.scrollLeft,S=Math.abs(this.viewContainer.scrollTop-v.scrollTop)<=1?void 0:this.viewContainer.scrollTop;(w!==void 0||S!==void 0)&&this.scrollableElement.setScrollPosition({scrollLeft:w,scrollTop:S})})),this.onDidScroll=this.scrollableElement.onScroll,this._register(this.onDidScroll(h=>{h.scrollTopChanged&&(this.viewContainer.scrollTop=h.scrollTop),h.scrollLeftChanged&&(this.viewContainer.scrollLeft=h.scrollLeft)})),(0,d.append)(this.el,this.scrollableElement.getDomNode()),this.style(C.styles||t),C.descriptor&&(this.size=C.descriptor.size,C.descriptor.views.forEach((h,v)=>{const w=o.isUndefined(h.visible)||h.visible?h.size:{type:"invisible",cachedVisibleSize:h.size},S=h.view;this.doAddView(S,w,v,!0)}),this._contentSize=this.viewItems.reduce((h,v)=>h+v.size,0),this.saveProportions())}style(u){u.separatorBorder.isTransparent()?(this.el.classList.remove("separator-border"),this.el.style.removeProperty("--separator-border")):(this.el.classList.add("separator-border"),this.el.style.setProperty("--separator-border",u.separatorBorder.toString()))}addView(u,C,f=this.viewItems.length,h){this.doAddView(u,C,f,h)}layout(u,C){const f=Math.max(this.size,this._contentSize);if(this.size=u,this.layoutContext=C,this.proportions){let h=0;for(let v=0;v0&&(w.size=(0,p.clamp)(Math.round(S*u/h),w.minimumSize,w.maximumSize))}}else{const h=(0,y.range)(this.viewItems.length),v=h.filter(S=>this.viewItems[S].priority===1),w=h.filter(S=>this.viewItems[S].priority===2);this.resize(this.viewItems.length-1,u-f,void 0,v,w)}this.distributeEmptySpace(),this.layoutViews()}saveProportions(){this.proportionalLayout&&this._contentSize>0&&(this.proportions=this.viewItems.map(u=>u.proportionalLayout&&u.visible?u.size/this._contentSize:void 0))}onSashStart({sash:u,start:C,alt:f}){for(const S of this.viewItems)S.enabled=!1;const h=this.sashItems.findIndex(S=>S.sash===u),v=(0,b.combinedDisposable)((0,d.addDisposableListener)(this.el.ownerDocument.body,"keydown",S=>w(this.sashDragState.current,S.altKey)),(0,d.addDisposableListener)(this.el.ownerDocument.body,"keyup",()=>w(this.sashDragState.current,!1))),w=(S,L)=>{const D=this.viewItems.map(N=>N.size);let T=Number.NEGATIVE_INFINITY,M=Number.POSITIVE_INFINITY;if(this.inverseAltBehavior&&(L=!L),L)if(h===this.sashItems.length-1){const O=this.viewItems[h];T=(O.minimumSize-O.size)/2,M=(O.maximumSize-O.size)/2}else{const O=this.viewItems[h+1];T=(O.size-O.maximumSize)/2,M=(O.size-O.minimumSize)/2}let A,P;if(!L){const N=(0,y.range)(h,-1),O=(0,y.range)(h+1,this.viewItems.length),F=N.reduce((j,Y)=>j+(this.viewItems[Y].minimumSize-D[Y]),0),x=N.reduce((j,Y)=>j+(this.viewItems[Y].viewMaximumSize-D[Y]),0),W=O.length===0?Number.POSITIVE_INFINITY:O.reduce((j,Y)=>j+(D[Y]-this.viewItems[Y].minimumSize),0),V=O.length===0?Number.NEGATIVE_INFINITY:O.reduce((j,Y)=>j+(D[Y]-this.viewItems[Y].viewMaximumSize),0),q=Math.max(F,V),H=Math.min(W,x),z=this.findFirstSnapIndex(N),U=this.findFirstSnapIndex(O);if(typeof z=="number"){const j=this.viewItems[z],Y=Math.floor(j.viewMinimumSize/2);A={index:z,limitDelta:j.visible?q-Y:q+Y,size:j.size}}if(typeof U=="number"){const j=this.viewItems[U],Y=Math.floor(j.viewMinimumSize/2);P={index:U,limitDelta:j.visible?H+Y:H-Y,size:j.size}}}this.sashDragState={start:S,current:S,index:h,sizes:D,minDelta:T,maxDelta:M,alt:L,snapBefore:A,snapAfter:P,disposable:v}};w(C,f)}onSashChange({current:u}){const{index:C,start:f,sizes:h,alt:v,minDelta:w,maxDelta:S,snapBefore:L,snapAfter:D}=this.sashDragState;this.sashDragState.current=u;const T=u-f,M=this.resize(C,T,h,void 0,void 0,w,S,L,D);if(v){const A=C===this.sashItems.length-1,P=this.viewItems.map(V=>V.size),N=A?C:C+1,O=this.viewItems[N],F=O.size-O.maximumSize,x=O.size-O.minimumSize,W=A?C-1:C+1;this.resize(W,-M,P,void 0,void 0,F,x)}this.distributeEmptySpace(),this.layoutViews()}onSashEnd(u){this._onDidSashChange.fire(u),this.sashDragState.disposable.dispose(),this.saveProportions();for(const C of this.viewItems)C.enabled=!0}onViewChange(u,C){const f=this.viewItems.indexOf(u);f<0||f>=this.viewItems.length||(C=typeof C=="number"?C:u.size,C=(0,p.clamp)(C,u.minimumSize,u.maximumSize),this.inverseAltBehavior&&f>0?(this.resize(f-1,Math.floor((u.size-C)/2)),this.distributeEmptySpace(),this.layoutViews()):(u.size=C,this.relayout([f],void 0)))}resizeView(u,C){if(!(u<0||u>=this.viewItems.length)){if(this.state!==c.Idle)throw new Error("Cant modify splitview");this.state=c.Busy;try{const f=(0,y.range)(this.viewItems.length).filter(S=>S!==u),h=[...f.filter(S=>this.viewItems[S].priority===1),u],v=f.filter(S=>this.viewItems[S].priority===2),w=this.viewItems[u];C=Math.round(C),C=(0,p.clamp)(C,w.minimumSize,Math.min(w.maximumSize,this.size)),w.size=C,this.relayout(h,v)}finally{this.state=c.Idle}}}distributeViewSizes(){const u=[];let C=0;for(const S of this.viewItems)S.maximumSize-S.minimumSize>0&&(u.push(S),C+=S.size);const f=Math.floor(C/u.length);for(const S of u)S.size=(0,p.clamp)(f,S.minimumSize,S.maximumSize);const h=(0,y.range)(this.viewItems.length),v=h.filter(S=>this.viewItems[S].priority===1),w=h.filter(S=>this.viewItems[S].priority===2);this.relayout(v,w)}getViewSize(u){return u<0||u>=this.viewItems.length?-1:this.viewItems[u].size}doAddView(u,C,f=this.viewItems.length,h){if(this.state!==c.Idle)throw new Error("Cant modify splitview");this.state=c.Busy;try{const v=(0,d.$)(".split-view-view");f===this.viewItems.length?this.viewContainer.appendChild(v):this.viewContainer.insertBefore(v,this.viewContainer.children.item(f));const w=u.onDidChange(A=>this.onViewChange(T,A)),S=(0,b.toDisposable)(()=>v.remove()),L=(0,b.combinedDisposable)(w,S);let D;typeof C=="number"?D=C:(C.type==="auto"&&(this.areViewsDistributed()?C={type:"distribute"}:C={type:"split",index:C.index}),C.type==="split"?D=this.getViewSize(C.index)/2:C.type==="invisible"?D={cachedVisibleSize:C.cachedVisibleSize}:D=u.minimumSize);const T=this.orientation===0?new s(v,u,D,L):new g(v,u,D,L);if(this.viewItems.splice(f,0,T),this.viewItems.length>1){const A={orthogonalStartSash:this.orthogonalStartSash,orthogonalEndSash:this.orthogonalEndSash},P=this.orientation===0?new I.Sash(this.sashContainer,{getHorizontalSashTop:j=>this.getSashPosition(j),getHorizontalSashWidth:this.getSashOrthogonalSize},{...A,orientation:1}):new I.Sash(this.sashContainer,{getVerticalSashLeft:j=>this.getSashPosition(j),getVerticalSashHeight:this.getSashOrthogonalSize},{...A,orientation:0}),N=this.orientation===0?j=>({sash:P,start:j.startY,current:j.currentY,alt:j.altKey}):j=>({sash:P,start:j.startX,current:j.currentX,alt:j.altKey}),F=_.Event.map(P.onDidStart,N)(this.onSashStart,this),W=_.Event.map(P.onDidChange,N)(this.onSashChange,this),q=_.Event.map(P.onDidEnd,()=>this.sashItems.findIndex(j=>j.sash===P))(this.onSashEnd,this),H=P.onDidReset(()=>{const j=this.sashItems.findIndex(J=>J.sash===P),Y=(0,y.range)(j,-1),G=(0,y.range)(j+1,this.viewItems.length),K=this.findFirstSnapIndex(Y),R=this.findFirstSnapIndex(G);typeof K=="number"&&!this.viewItems[K].visible||typeof R=="number"&&!this.viewItems[R].visible||this._onDidSashReset.fire(j)}),z=(0,b.combinedDisposable)(F,W,q,H,P),U={sash:P,disposable:z};this.sashItems.splice(f-1,0,U)}v.appendChild(u.element);let M;typeof C!="number"&&C.type==="split"&&(M=[C.index]),h||this.relayout([f],M),!h&&typeof C!="number"&&C.type==="distribute"&&this.distributeViewSizes()}finally{this.state=c.Idle}}relayout(u,C){const f=this.viewItems.reduce((h,v)=>h+v.size,0);this.resize(this.viewItems.length-1,this.size-f,void 0,u,C),this.distributeEmptySpace(),this.layoutViews(),this.saveProportions()}resize(u,C,f=this.viewItems.map(T=>T.size),h,v,w=Number.NEGATIVE_INFINITY,S=Number.POSITIVE_INFINITY,L,D){if(u<0||u>=this.viewItems.length)return 0;const T=(0,y.range)(u,-1),M=(0,y.range)(u+1,this.viewItems.length);if(v)for(const U of v)(0,y.pushToStart)(T,U),(0,y.pushToStart)(M,U);if(h)for(const U of h)(0,y.pushToEnd)(T,U),(0,y.pushToEnd)(M,U);const A=T.map(U=>this.viewItems[U]),P=T.map(U=>f[U]),N=M.map(U=>this.viewItems[U]),O=M.map(U=>f[U]),F=T.reduce((U,j)=>U+(this.viewItems[j].minimumSize-f[j]),0),x=T.reduce((U,j)=>U+(this.viewItems[j].maximumSize-f[j]),0),W=M.length===0?Number.POSITIVE_INFINITY:M.reduce((U,j)=>U+(f[j]-this.viewItems[j].minimumSize),0),V=M.length===0?Number.NEGATIVE_INFINITY:M.reduce((U,j)=>U+(f[j]-this.viewItems[j].maximumSize),0),q=Math.max(F,V,w),H=Math.min(W,x,S);let z=!1;if(L){const U=this.viewItems[L.index],j=C>=L.limitDelta;z=j!==U.visible,U.setVisible(j,L.size)}if(!z&&D){const U=this.viewItems[D.index],j=CS+L.size,0);let f=this.size-C;const h=(0,y.range)(this.viewItems.length-1,-1),v=h.filter(S=>this.viewItems[S].priority===1),w=h.filter(S=>this.viewItems[S].priority===2);for(const S of w)(0,y.pushToStart)(h,S);for(const S of v)(0,y.pushToEnd)(h,S);typeof u=="number"&&(0,y.pushToEnd)(h,u);for(let S=0;f!==0&&SC+f.size,0);let u=0;for(const C of this.viewItems)C.layout(u,this.layoutContext),u+=C.size;this.sashItems.forEach(C=>C.sash.layout()),this.updateSashEnablement(),this.updateScrollableElement()}updateScrollableElement(){this.orientation===0?this.scrollableElement.setScrollDimensions({height:this.size,scrollHeight:this._contentSize}):this.scrollableElement.setScrollDimensions({width:this.size,scrollWidth:this._contentSize})}updateSashEnablement(){let u=!1;const C=this.viewItems.map(L=>u=L.size-L.minimumSize>0||u);u=!1;const f=this.viewItems.map(L=>u=L.maximumSize-L.size>0||u),h=[...this.viewItems].reverse();u=!1;const v=h.map(L=>u=L.size-L.minimumSize>0||u).reverse();u=!1;const w=h.map(L=>u=L.maximumSize-L.size>0||u).reverse();let S=0;for(let L=0;L0||this.startSnappingEnabled)?D.state=1:W&&C[L]&&(S0)return;if(!f.visible&&f.snap)return C}}areViewsDistributed(){let u,C;for(const f of this.viewItems)if(u=u===void 0?f.size:Math.min(u,f.size),C=C===void 0?f.size:Math.max(C,f.size),C-u>2)return!1;return!0}dispose(){this.sashDragState?.disposable.dispose(),(0,b.dispose)(this.viewItems),this.viewItems=[],this.sashItems.forEach(u=>u.disposable.dispose()),this.sashItems=[],super.dispose()}}e.SplitView=a}),define(ne[638],se([1,0,5,81,44,115,357,6,2,475]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Table=void 0;class b{static{this.TemplateId="row"}constructor(i,s,g){this.columns=i,this.getColumnSize=g,this.templateId=b.TemplateId,this.renderedTemplates=new Set;const c=new Map(s.map(l=>[l.templateId,l]));this.renderers=[];for(const l of i){const a=c.get(l.templateId);if(!a)throw new Error(`Table cell renderer for template id ${l.templateId} not found.`);this.renderers.push(a)}}renderTemplate(i){const s=(0,d.append)(i,(0,d.$)(".monaco-table-tr")),g=[],c=[];for(let a=0;athis.disposables.add(new n(f,h))),u={size:r.reduce((f,h)=>f+h.column.weight,0),views:r.map(f=>({size:f.column.weight,view:f}))};this.splitview=this.disposables.add(new y.SplitView(this.domNode,{orientation:1,scrollbarVisibility:2,getSashOrthogonalSize:()=>this.cachedHeight,descriptor:u})),this.splitview.el.style.height=`${g.headerRowHeight}px`,this.splitview.el.style.lineHeight=`${g.headerRowHeight}px`;const C=new b(c,l,f=>this.splitview.getViewSize(f));this.list=this.disposables.add(new E.List(i,this.domNode,p(g),[C],a)),m.Event.any(...r.map(f=>f.onDidLayout))(([f,h])=>C.layoutColumn(f,h),null,this.disposables),this.splitview.onDidSashReset(f=>{const h=c.reduce((w,S)=>w+S.weight,0),v=c[f].weight/h*this.cachedWidth;this.splitview.resizeView(f,v)},null,this.disposables),this.styleElement=(0,d.createStyleSheet)(this.domNode),this.style(E.unthemedListStyles)}updateOptions(i){this.list.updateOptions(i)}splice(i,s,g=[]){this.list.splice(i,s,g)}getHTMLElement(){return this.domNode}style(i){const s=[];s.push(`.monaco-table.${this.domId} > .monaco-split-view2 .monaco-sash.vertical::before { - top: ${this.virtualDelegate.headerRowHeight+1}px; - height: calc(100% - ${this.virtualDelegate.headerRowHeight}px); - }`),this.styleElement.textContent=s.join(` -`),this.list.style(i)}getSelectedElements(){return this.list.getSelectedElements()}getSelection(){return this.list.getSelection()}getFocus(){return this.list.getFocus()}dispose(){this.disposables.dispose()}}e.Table=o}),define(ne[175],se([1,0,85,30,6,44,81,476]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Toggle=e.unthemedToggleStyles=void 0,e.unthemedToggleStyles={inputActiveOptionBorder:"#007ACC00",inputActiveOptionForeground:"#FFFFFF",inputActiveOptionBackground:"#0E639C50"};class m extends d.Widget{constructor(b){super(),this._onChange=this._register(new I.Emitter),this.onChange=this._onChange.event,this._onKeyDown=this._register(new I.Emitter),this.onKeyDown=this._onKeyDown.event,this._opts=b,this._checked=this._opts.isChecked;const p=["monaco-custom-toggle"];this._opts.icon&&(this._icon=this._opts.icon,p.push(...k.ThemeIcon.asClassNameArray(this._icon))),this._opts.actionClassName&&p.push(...this._opts.actionClassName.split(" ")),this._checked&&p.push("checked"),this.domNode=document.createElement("div"),this._hover=this._register((0,y.getBaseLayerHoverDelegate)().setupManagedHover(b.hoverDelegate??(0,E.getDefaultHoverDelegate)("mouse"),this.domNode,this._opts.title)),this.domNode.classList.add(...p),this._opts.notFocusable||(this.domNode.tabIndex=0),this.domNode.setAttribute("role","checkbox"),this.domNode.setAttribute("aria-checked",String(this._checked)),this.domNode.setAttribute("aria-label",this._opts.title),this.applyStyles(),this.onclick(this.domNode,n=>{this.enabled&&(this.checked=!this._checked,this._onChange.fire(!1),n.preventDefault())}),this._register(this.ignoreGesture(this.domNode)),this.onkeydown(this.domNode,n=>{if(n.keyCode===10||n.keyCode===3){this.checked=!this._checked,this._onChange.fire(!0),n.preventDefault(),n.stopPropagation();return}this._onKeyDown.fire(n)})}get enabled(){return this.domNode.getAttribute("aria-disabled")!=="true"}focus(){this.domNode.focus()}get checked(){return this._checked}set checked(b){this._checked=b,this.domNode.setAttribute("aria-checked",String(this._checked)),this.domNode.classList.toggle("checked",this._checked),this.applyStyles()}width(){return 22}applyStyles(){this.domNode&&(this.domNode.style.borderColor=this._checked&&this._opts.inputActiveOptionBorder||"",this.domNode.style.color=this._checked&&this._opts.inputActiveOptionForeground||"inherit",this.domNode.style.backgroundColor=this._checked&&this._opts.inputActiveOptionBackground||"")}enable(){this.domNode.setAttribute("aria-disabled",String(!1))}disable(){this.domNode.setAttribute("aria-disabled",String(!0))}}e.Toggle=m}),define(ne[358],se([1,0,44,175,26,3]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RegexToggle=e.WholeWordsToggle=e.CaseSensitiveToggle=void 0;const y=E.localize(2,"Match Case"),m=E.localize(3,"Match Whole Word"),_=E.localize(4,"Use Regular Expression");class b extends k.Toggle{constructor(t){super({icon:I.Codicon.caseSensitive,title:y+t.appendTitle,isChecked:t.isChecked,hoverDelegate:t.hoverDelegate??(0,d.getDefaultHoverDelegate)("element"),inputActiveOptionBorder:t.inputActiveOptionBorder,inputActiveOptionForeground:t.inputActiveOptionForeground,inputActiveOptionBackground:t.inputActiveOptionBackground})}}e.CaseSensitiveToggle=b;class p extends k.Toggle{constructor(t){super({icon:I.Codicon.wholeWord,title:m+t.appendTitle,isChecked:t.isChecked,hoverDelegate:t.hoverDelegate??(0,d.getDefaultHoverDelegate)("element"),inputActiveOptionBorder:t.inputActiveOptionBorder,inputActiveOptionForeground:t.inputActiveOptionForeground,inputActiveOptionBackground:t.inputActiveOptionBackground})}}e.WholeWordsToggle=p;class n extends k.Toggle{constructor(t){super({icon:I.Codicon.regex,title:_+t.appendTitle,isChecked:t.isChecked,hoverDelegate:t.hoverDelegate??(0,d.getDefaultHoverDelegate)("element"),inputActiveOptionBorder:t.inputActiveOptionBorder,inputActiveOptionForeground:t.inputActiveOptionForeground,inputActiveOptionBackground:t.inputActiveOptionBackground})}}e.RegexToggle=n}),define(ne[48],se([1,0,251,42,99,16,11,22]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DataUri=e.addTrailingPathSeparator=e.removeTrailingPathSeparator=e.hasTrailingPathSeparator=e.isEqualAuthority=e.isAbsolutePath=e.resolvePath=e.relativePath=e.normalizePath=e.joinPath=e.dirname=e.extname=e.basename=e.basenameOrAuthority=e.getComparisonKey=e.isEqualOrParent=e.isEqual=e.extUriIgnorePathCase=e.extUriBiasedIgnorePathCase=e.extUri=e.ExtUri=void 0,e.originalFSPath=_;function _(n){return(0,m.uriToFsPath)(n,!0)}class b{constructor(o){this._ignorePathCasing=o}compare(o,t,i=!1){return o===t?0:(0,y.compare)(this.getComparisonKey(o,i),this.getComparisonKey(t,i))}isEqual(o,t,i=!1){return o===t?!0:!o||!t?!1:this.getComparisonKey(o,i)===this.getComparisonKey(t,i)}getComparisonKey(o,t=!1){return o.with({path:this._ignorePathCasing(o)?o.path.toLowerCase():void 0,fragment:t?null:void 0}).toString()}isEqualOrParent(o,t,i=!1){if(o.scheme===t.scheme){if(o.scheme===k.Schemas.file)return d.isEqualOrParent(_(o),_(t),this._ignorePathCasing(o))&&o.query===t.query&&(i||o.fragment===t.fragment);if((0,e.isEqualAuthority)(o.authority,t.authority))return d.isEqualOrParent(o.path,t.path,this._ignorePathCasing(o),"/")&&o.query===t.query&&(i||o.fragment===t.fragment)}return!1}joinPath(o,...t){return m.URI.joinPath(o,...t)}basenameOrAuthority(o){return(0,e.basename)(o)||o.authority}basename(o){return I.posix.basename(o.path)}extname(o){return I.posix.extname(o.path)}dirname(o){if(o.path.length===0)return o;let t;return o.scheme===k.Schemas.file?t=m.URI.file(I.dirname(_(o))).path:(t=I.posix.dirname(o.path),o.authority&&t.length&&t.charCodeAt(0)!==47&&(console.error(`dirname("${o.toString})) resulted in a relative path`),t="/")),o.with({path:t})}normalizePath(o){if(!o.path.length)return o;let t;return o.scheme===k.Schemas.file?t=m.URI.file(I.normalize(_(o))).path:t=I.posix.normalize(o.path),o.with({path:t})}relativePath(o,t){if(o.scheme!==t.scheme||!(0,e.isEqualAuthority)(o.authority,t.authority))return;if(o.scheme===k.Schemas.file){const g=I.relative(_(o),_(t));return E.isWindows?d.toSlashes(g):g}let i=o.path||"/";const s=t.path||"/";if(this._ignorePathCasing(o)){let g=0;for(const c=Math.min(i.length,s.length);gd.getRoot(i).length&&i[i.length-1]===t}else{const i=o.path;return i.length>1&&i.charCodeAt(i.length-1)===47&&!/^[a-zA-Z]:(\/$|\\$)/.test(o.fsPath)}}removeTrailingPathSeparator(o,t=I.sep){return(0,e.hasTrailingPathSeparator)(o,t)?o.with({path:o.path.substr(0,o.path.length-1)}):o}addTrailingPathSeparator(o,t=I.sep){let i=!1;if(o.scheme===k.Schemas.file){const s=_(o);i=s!==void 0&&s.length===d.getRoot(s).length&&s[s.length-1]===t}else{t="/";const s=o.path;i=s.length===1&&s.charCodeAt(s.length-1)===47}return!i&&!(0,e.hasTrailingPathSeparator)(o,t)?o.with({path:o.path+"/"}):o}}e.ExtUri=b,e.extUri=new b(()=>!1),e.extUriBiasedIgnorePathCase=new b(n=>n.scheme===k.Schemas.file?!E.isLinux:!0),e.extUriIgnorePathCase=new b(n=>!0),e.isEqual=e.extUri.isEqual.bind(e.extUri),e.isEqualOrParent=e.extUri.isEqualOrParent.bind(e.extUri),e.getComparisonKey=e.extUri.getComparisonKey.bind(e.extUri),e.basenameOrAuthority=e.extUri.basenameOrAuthority.bind(e.extUri),e.basename=e.extUri.basename.bind(e.extUri),e.extname=e.extUri.extname.bind(e.extUri),e.dirname=e.extUri.dirname.bind(e.extUri),e.joinPath=e.extUri.joinPath.bind(e.extUri),e.normalizePath=e.extUri.normalizePath.bind(e.extUri),e.relativePath=e.extUri.relativePath.bind(e.extUri),e.resolvePath=e.extUri.resolvePath.bind(e.extUri),e.isAbsolutePath=e.extUri.isAbsolutePath.bind(e.extUri),e.isEqualAuthority=e.extUri.isEqualAuthority.bind(e.extUri),e.hasTrailingPathSeparator=e.extUri.hasTrailingPathSeparator.bind(e.extUri),e.removeTrailingPathSeparator=e.extUri.removeTrailingPathSeparator.bind(e.extUri),e.addTrailingPathSeparator=e.extUri.addTrailingPathSeparator.bind(e.extUri);var p;(function(n){n.META_DATA_LABEL="label",n.META_DATA_DESCRIPTION="description",n.META_DATA_SIZE="size",n.META_DATA_MIME="mime";function o(t){const i=new Map;t.path.substring(t.path.indexOf(";")+1,t.path.lastIndexOf(";")).split(";").forEach(c=>{const[l,a]=c.split(":");l&&a&&i.set(l,a)});const g=t.path.substring(0,t.path.indexOf(";"));return g&&i.set(n.META_DATA_MIME,g),i}n.parseMetaData=o})(p||(e.DataUri=p={}))}),define(ne[57],se([1,0,8,142,48,11,22]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarkdownString=void 0,e.isEmptyMarkdownString=_,e.isMarkdownString=b,e.markdownStringEqual=p,e.escapeMarkdownSyntaxTokens=n,e.appendEscapedMarkdownCodeBlockFence=o,e.escapeDoubleQuotes=t,e.removeMarkdownEscapes=i,e.parseHrefAndDimensions=s;class m{constructor(c="",l=!1){if(this.value=c,typeof this.value!="string")throw(0,d.illegalArgument)("value");typeof l=="boolean"?(this.isTrusted=l,this.supportThemeIcons=!1,this.supportHtml=!1):(this.isTrusted=l.isTrusted??void 0,this.supportThemeIcons=l.supportThemeIcons??!1,this.supportHtml=l.supportHtml??!1)}appendText(c,l=0){return this.value+=n(this.supportThemeIcons?(0,k.escapeIcons)(c):c).replace(/([ \t]+)/g,(a,r)=>" ".repeat(r.length)).replace(/\>/gm,"\\>").replace(/\n/g,l===1?`\\ -`:` - -`),this}appendMarkdown(c){return this.value+=c,this}appendCodeblock(c,l){return this.value+=` -${o(l,c)} -`,this}appendLink(c,l,a){return this.value+="[",this.value+=this._escape(l,"]"),this.value+="](",this.value+=this._escape(String(c),")"),a&&(this.value+=` "${this._escape(this._escape(a,'"'),")")}"`),this.value+=")",this}_escape(c,l){const a=new RegExp((0,E.escapeRegExpCharacters)(l),"g");return c.replace(a,(r,u)=>c.charAt(u-1)!=="\\"?`\\${r}`:r)}}e.MarkdownString=m;function _(g){return b(g)?!g.value:Array.isArray(g)?g.every(_):!0}function b(g){return g instanceof m?!0:g&&typeof g=="object"?typeof g.value=="string"&&(typeof g.isTrusted=="boolean"||typeof g.isTrusted=="object"||g.isTrusted===void 0)&&(typeof g.supportThemeIcons=="boolean"||g.supportThemeIcons===void 0):!1}function p(g,c){return g===c?!0:!g||!c?!1:g.value===c.value&&g.isTrusted===c.isTrusted&&g.supportThemeIcons===c.supportThemeIcons&&g.supportHtml===c.supportHtml&&(g.baseUri===c.baseUri||!!g.baseUri&&!!c.baseUri&&(0,I.isEqual)(y.URI.from(g.baseUri),y.URI.from(c.baseUri)))}function n(g){return g.replace(/[\\`*_{}[\]()#+\-!~]/g,"\\$&")}function o(g,c){const l=g.match(/^`+/gm)?.reduce((r,u)=>r.length>u.length?r:u).length??0,a=l>=3?l+1:3;return[`${"`".repeat(a)}${c}`,g,`${"`".repeat(a)}`].join(` -`)}function t(g){return g.replace(/"/g,""")}function i(g){return g&&g.replace(/\\([\\`*_{}[\]()#+\-.!~])/g,"$1")}function s(g){const c=[],l=g.split("|").map(r=>r.trim());g=l[0];const a=l[1];if(a){const r=/height=(\d+)/.exec(a),u=/width=(\d+)/.exec(a),C=r?r[1]:"",f=u?u[1]:"",h=isFinite(parseInt(f)),v=isFinite(parseInt(C));h&&c.push(`width="${f}"`),v&&c.push(`height="${C}"`)}return{href:g,dimensions:c}}}),define(ne[207],se([1,0,5,351,93,352,47,77,114,8,6,57,142,187,98,2,447,252,42,60,48,11,22]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.allowedMarkdownAttr=void 0,e.renderMarkdown=h,e.renderStringAsPlaintext=T,e.renderMarkdownAsPlaintext=M,e.fillInIncompleteTokens=z;const f=Object.freeze({image:({href:ee,title:de,text:ge})=>{let X=[],B=[];return ee&&({href:ee,dimensions:X}=(0,n.parseHrefAndDimensions)(ee),B.push(`src="${(0,n.escapeDoubleQuotes)(ee)}"`)),ge&&B.push(`alt="${(0,n.escapeDoubleQuotes)(ge)}"`),de&&B.push(`title="${(0,n.escapeDoubleQuotes)(de)}"`),X.length&&(B=B.concat(X)),""},paragraph({tokens:ee}){return`

    ${this.parser.parseInline(ee)}

    `},link({href:ee,title:de,tokens:ge}){let X=this.parser.parseInline(ge);return typeof ee!="string"?"":(ee===X&&(X=(0,n.removeMarkdownEscapes)(X)),de=typeof de=="string"?(0,n.escapeDoubleQuotes)((0,n.removeMarkdownEscapes)(de)):"",ee=(0,n.removeMarkdownEscapes)(ee),ee=ee.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'"),`
    ${X}`)}});function h(ee,de={},ge={}){const X=new s.DisposableStore;let B=!1;const $=(0,E.createElement)(de),Q=function(Ee){let Me;try{Me=(0,c.parse)(decodeURIComponent(Ee))}catch{}return Me?(Me=(0,a.cloneAndChange)(Me,Ae=>{if(ee.uris&&ee.uris[Ae])return C.URI.revive(ee.uris[Ae])}),encodeURIComponent(JSON.stringify(Me))):Ee},Z=function(Ee,Me){const Ae=ee.uris&&ee.uris[Ee];let Ne=C.URI.revive(Ae);return Me?Ee.startsWith(l.Schemas.data+":")?Ee:(Ne||(Ne=C.URI.parse(Ee)),l.FileAccess.uriToBrowserUri(Ne).toString(!0)):!Ne||C.URI.parse(Ee).toString()===Ne.toString()?Ee:(Ne.query&&(Ne=Ne.with({query:Q(Ne.query)})),Ne.toString())},te=new g.Renderer;te.image=f.image,te.link=f.link,te.paragraph=f.paragraph;const re=[],le=[];if(de.codeBlockRendererSync?te.code=({text:Ee,lang:Me})=>{const Ae=t.defaultGenerator.nextId(),Ne=de.codeBlockRendererSync(v(Me),Ee);return le.push([Ae,Ne]),`
    ${(0,u.escape)(Ee)}
    `}:de.codeBlockRenderer&&(te.code=({text:Ee,lang:Me})=>{const Ae=t.defaultGenerator.nextId(),Ne=de.codeBlockRenderer(v(Me),Ee);return re.push(Ne.then(Ke=>[Ae,Ke])),`
    ${(0,u.escape)(Ee)}
    `}),de.actionHandler){const Ee=function(Ne){let Ke=Ne.target;if(!(Ke.tagName!=="A"&&(Ke=Ke.parentElement,!Ke||Ke.tagName!=="A")))try{let ze=Ke.dataset.href;ze&&(ee.baseUri&&(ze=w(C.URI.from(ee.baseUri),ze)),de.actionHandler.callback(ze,Ne))}catch(ze){(0,b.onUnexpectedError)(ze)}finally{Ne.preventDefault()}},Me=de.actionHandler.disposables.add(new I.DomEmitter($,"click")),Ae=de.actionHandler.disposables.add(new I.DomEmitter($,"auxclick"));de.actionHandler.disposables.add(p.Event.any(Me.event,Ae.event)(Ne=>{const Ke=new m.StandardMouseEvent(d.getWindow($),Ne);!Ke.leftButton&&!Ke.middleButton||Ee(Ke)})),de.actionHandler.disposables.add(d.addDisposableListener($,"keydown",Ne=>{const Ke=new y.StandardKeyboardEvent(Ne);!Ke.equals(10)&&!Ke.equals(3)||Ee(Ke)}))}ee.supportHtml||(te.html=({text:Ee})=>de.sanitizerOptions?.replaceWithPlaintext?(0,u.escape)(Ee):(ee.isTrusted?Ee.match(/^(]+>)|(<\/\s*span>)$/):void 0)?Ee:""),ge.renderer=te;let me=ee.value??"";me.length>1e5&&(me=`${me.substr(0,1e5)}\u2026`),ee.supportThemeIcons&&(me=(0,o.markdownEscapeEscapedIcons)(me));let Ce;if(de.fillInIncompleteTokens){const Ee={...g.defaults,...ge},Me=g.lexer(me,Ee),Ae=z(Me);Ce=g.parser(Ae,Ee)}else Ce=g.parse(me,{...ge,async:!1});ee.supportThemeIcons&&(Ce=(0,_.renderLabelWithIcons)(Ce).map(Me=>typeof Me=="string"?Me:Me.outerHTML).join(""));const Le=new DOMParser().parseFromString(L({isTrusted:ee.isTrusted,...de.sanitizerOptions},Ce),"text/html");if(Le.body.querySelectorAll("img, audio, video, source").forEach(Ee=>{const Me=Ee.getAttribute("src");if(Me){let Ae=Me;try{ee.baseUri&&(Ae=w(C.URI.from(ee.baseUri),Ae))}catch{}if(Ee.setAttribute("src",Z(Ae,!0)),de.remoteImageIsAllowed){const Ne=C.URI.parse(Ae);Ne.scheme!==l.Schemas.file&&Ne.scheme!==l.Schemas.data&&!de.remoteImageIsAllowed(Ne)&&Ee.replaceWith(d.$("",void 0,Ee.outerHTML))}}}),Le.body.querySelectorAll("a").forEach(Ee=>{const Me=Ee.getAttribute("href");if(Ee.setAttribute("href",""),!Me||/^data:|javascript:/i.test(Me)||/^command:/i.test(Me)&&!ee.isTrusted||/^command:(\/\/\/)?_workbench\.downloadResource/i.test(Me))Ee.replaceWith(...Ee.childNodes);else{let Ae=Z(Me,!1);ee.baseUri&&(Ae=w(C.URI.from(ee.baseUri),Me)),Ee.dataset.href=Ae}}),$.innerHTML=L({isTrusted:ee.isTrusted,...de.sanitizerOptions},Le.body.innerHTML),re.length>0)Promise.all(re).then(Ee=>{if(B)return;const Me=new Map(Ee),Ae=$.querySelectorAll("div[data-code]");for(const Ne of Ae){const Ke=Me.get(Ne.dataset.code??"");Ke&&d.reset(Ne,Ke)}de.asyncRenderCallback?.()});else if(le.length>0){const Ee=new Map(le),Me=$.querySelectorAll("div[data-code]");for(const Ae of Me){const Ne=Ee.get(Ae.dataset.code??"");Ne&&d.reset(Ae,Ne)}}if(de.asyncRenderCallback)for(const Ee of $.getElementsByTagName("img")){const Me=X.add(d.addDisposableListener(Ee,"load",()=>{Me.dispose(),de.asyncRenderCallback()}))}return{element:$,dispose:()=>{B=!0,X.dispose()}}}function v(ee){if(!ee)return"";const de=ee.split(/[\s+|:|,|\{|\?]/,1);return de.length?de[0]:ee}function w(ee,de){return/^\w[\w\d+.-]*:/.test(de)?de:ee.path.endsWith("/")?(0,r.resolvePath)(ee,de).toString():(0,r.resolvePath)((0,r.dirname)(ee),de).toString()}const S=["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"];function L(ee,de){const{config:ge,allowedSchemes:X}=D(ee),B=new s.DisposableStore;B.add(ae("uponSanitizeAttribute",($,Q)=>{if(Q.attrName==="style"||Q.attrName==="class"){if($.tagName==="SPAN"){if(Q.attrName==="style"){Q.keepAttr=/^(color\:(#[0-9a-fA-F]+|var\(--vscode(-[a-zA-Z]+)+\));)?(background-color\:(#[0-9a-fA-F]+|var\(--vscode(-[a-zA-Z]+)+\));)?(border-radius:[0-9]+px;)?$/.test(Q.attrValue);return}else if(Q.attrName==="class"){Q.keepAttr=/^codicon codicon-[a-z\-]+( codicon-modifier-[a-z\-]+)?$/.test(Q.attrValue);return}}Q.keepAttr=!1;return}else if($.tagName==="INPUT"&&$.attributes.getNamedItem("type")?.value==="checkbox"){if(Q.attrName==="type"&&Q.attrValue==="checkbox"||Q.attrName==="disabled"||Q.attrName==="checked"){Q.keepAttr=!0;return}Q.keepAttr=!1}})),B.add(ae("uponSanitizeElement",($,Q)=>{if(Q.tagName==="input"&&($.attributes.getNamedItem("type")?.value==="checkbox"?$.setAttribute("disabled",""):ee.replaceWithPlaintext||$.remove()),ee.replaceWithPlaintext&&!Q.allowedTags[Q.tagName]&&Q.tagName!=="body"&&$.parentElement){let Z,te;if(Q.tagName==="#comment")Z=``;else{const Ce=S.includes(Q.tagName),ye=$.attributes.length?" "+Array.from($.attributes).map(Le=>`${Le.name}="${Le.value}"`).join(" "):"";Z=`<${Q.tagName}${ye}>`,Ce||(te=``)}const re=document.createDocumentFragment(),le=$.parentElement.ownerDocument.createTextNode(Z);re.appendChild(le);const me=te?$.parentElement.ownerDocument.createTextNode(te):void 0;for(;$.firstChild;)re.appendChild($.firstChild);me&&re.appendChild(me),$.nodeType===Node.COMMENT_NODE?$.parentElement.insertBefore(re,$):$.parentElement.replaceChild(re,$)}})),B.add(d.hookDomPurifyHrefAndSrcSanitizer(X));try{return k.sanitize(de,{...ge,RETURN_TRUSTED_TYPE:!0})}finally{B.dispose()}}e.allowedMarkdownAttr=["align","autoplay","alt","checked","class","colspan","controls","data-code","data-href","disabled","draggable","height","href","loop","muted","playsinline","poster","rowspan","src","style","target","title","type","width","start"];function D(ee){const de=[l.Schemas.http,l.Schemas.https,l.Schemas.mailto,l.Schemas.data,l.Schemas.file,l.Schemas.vscodeFileResource,l.Schemas.vscodeRemote,l.Schemas.vscodeRemoteResource];return ee.isTrusted&&de.push(l.Schemas.command),{config:{ALLOWED_TAGS:ee.allowedTags??[...d.basicMarkupHtmlTags],ALLOWED_ATTR:e.allowedMarkdownAttr,ALLOW_UNKNOWN_PROTOCOLS:!0},allowedSchemes:de}}function T(ee){return typeof ee=="string"?ee:M(ee)}function M(ee,de){let ge=ee.value??"";ge.length>1e5&&(ge=`${ge.substr(0,1e5)}\u2026`);const X=g.parse(ge,{async:!1,renderer:de?O.value:N.value}).replace(/&(#\d+|[a-zA-Z]+);/g,B=>A.get(B)??B);return L({isTrusted:!1},X).toString()}const A=new Map([[""",'"'],[" "," "],["&","&"],["'","'"],["<","<"],[">",">"]]);function P(){const ee=new g.Renderer;return ee.code=({text:de})=>de,ee.blockquote=({text:de})=>de+` -`,ee.html=de=>"",ee.heading=function({tokens:de}){return this.parser.parseInline(de)+` -`},ee.hr=()=>"",ee.list=function({items:de}){return de.map(ge=>this.listitem(ge)).join(` -`)+` -`},ee.listitem=({text:de})=>de+` -`,ee.paragraph=function({tokens:de}){return this.parser.parseInline(de)+` -`},ee.table=function({header:de,rows:ge}){return de.map(X=>this.tablecell(X)).join(" ")+` -`+ge.map(X=>X.map(B=>this.tablecell(B)).join(" ")).join(` -`)+` -`},ee.tablerow=({text:de})=>de,ee.tablecell=function({tokens:de}){return this.parser.parseInline(de)},ee.strong=({text:de})=>de,ee.em=({text:de})=>de,ee.codespan=({text:de})=>de,ee.br=de=>` -`,ee.del=({text:de})=>de,ee.image=de=>"",ee.text=({text:de})=>de,ee.link=({text:de})=>de,ee}const N=new i.Lazy(ee=>P()),O=new i.Lazy(()=>{const ee=P();return ee.code=({text:de})=>` -\`\`\` -${de} -\`\`\` -`,ee});function F(ee){let de="";return ee.forEach(ge=>{de+=ge.raw}),de}function x(ee){if(ee.tokens)for(let de=ee.tokens.length-1;de>=0;de--){const ge=ee.tokens[de];if(ge.type==="text"){const X=ge.raw.split(` -`),B=X[X.length-1];if(B.includes("`"))return j(ee);if(B.includes("**"))return ie(ee);if(B.match(/\*\w/))return Y(ee);if(B.match(/(^|\s)__\w/))return ue(ee);if(B.match(/(^|\s)_\w/))return G(ee);if(W(B)||V(B)&&ee.tokens.slice(0,de).some($=>$.type==="text"&&$.raw.match(/\[[^\]]*$/))){const $=ee.tokens.slice(de+1);return $[0]?.type==="link"&&$[1]?.type==="text"&&$[1].raw.match(/^ *"[^"]*$/)||B.match(/^[^"]* +"[^"]*$/)?R(ee):K(ee)}else if(B.match(/(^|\s)\[\w*/))return J(ee)}}}function W(ee){return!!ee.match(/(^|\s)\[.*\]\(\w*/)}function V(ee){return!!ee.match(/^[^\[]*\]\([^\)]*$/)}function q(ee){const de=ee.items[ee.items.length-1],ge=de.tokens?de.tokens[de.tokens.length-1]:void 0;let X;if(ge?.type==="text"&&!("inRawBlock"in de)&&(X=x(ge)),!X||X.type!=="paragraph")return;const B=F(ee.items.slice(0,-1)),$=de.raw.match(/^(\s*(-|\d+\.|\*) +)/)?.[0];if(!$)return;const Q=$+F(de.tokens.slice(0,-1))+X.raw,Z=g.lexer(B+Q)[0];if(Z.type==="list")return Z}const H=3;function z(ee){for(let de=0;de"u"&&Q.match(/^\s*\|/)){const Z=Q.match(/(\|[^\|]+)(?=\||$)/g);Z&&(X=Z.length)}else if(typeof X=="number")if(Q.match(/^\s*\|/)){if($!==ge.length-1)return;B=!0}else return}if(typeof X=="number"&&X>0){const $=B?ge.slice(0,-1).join(` -`):de,Q=!!$.match(/\|\s*$/),Z=$+(Q?"":"|")+` -|${" --- |".repeat(X)}`;return g.lexer(Z)}}function ae(ee,de){return k.addHook(ee,de),(0,s.toDisposable)(()=>k.removeHook(ee))}}),define(ne[258],se([1,0,5,351,47,207,69,44,114,33,6,57,2,30,81,459]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Button=e.unthemedButtonStyles=void 0,e.unthemedButtonStyles={buttonBackground:"#0E639C",buttonHoverBackground:"#006BB3",buttonSeparator:b.Color.white.toString(),buttonForeground:b.Color.white.toString(),buttonBorder:void 0,buttonSecondaryBackground:void 0,buttonSecondaryForeground:void 0,buttonSecondaryHoverBackground:void 0};class s extends o.Disposable{get onDidClick(){return this._onDidClick.event}constructor(c,l){super(),this._label="",this._onDidClick=this._register(new p.Emitter),this._onDidEscape=this._register(new p.Emitter),this.options=l,this._element=document.createElement("a"),this._element.classList.add("monaco-button"),this._element.tabIndex=0,this._element.setAttribute("role","button"),this._element.classList.toggle("secondary",!!l.secondary);const a=l.secondary?l.buttonSecondaryBackground:l.buttonBackground,r=l.secondary?l.buttonSecondaryForeground:l.buttonForeground;this._element.style.color=r||"",this._element.style.backgroundColor=a||"",l.supportShortLabel&&(this._labelShortElement=document.createElement("div"),this._labelShortElement.classList.add("monaco-button-label-short"),this._element.appendChild(this._labelShortElement),this._labelElement=document.createElement("div"),this._labelElement.classList.add("monaco-button-label"),this._element.appendChild(this._labelElement),this._element.classList.add("monaco-text-button-with-short-label")),typeof l.title=="string"&&this.setTitle(l.title),typeof l.ariaLabel=="string"&&this._element.setAttribute("aria-label",l.ariaLabel),c.appendChild(this._element),this._register(y.Gesture.addTarget(this._element)),[d.EventType.CLICK,y.EventType.Tap].forEach(u=>{this._register((0,d.addDisposableListener)(this._element,u,C=>{if(!this.enabled){d.EventHelper.stop(C);return}this._onDidClick.fire(C)}))}),this._register((0,d.addDisposableListener)(this._element,d.EventType.KEY_DOWN,u=>{const C=new I.StandardKeyboardEvent(u);let f=!1;this.enabled&&(C.equals(3)||C.equals(10))?(this._onDidClick.fire(u),f=!0):C.equals(9)&&(this._onDidEscape.fire(u),this._element.blur(),f=!0),f&&d.EventHelper.stop(C,!0)})),this._register((0,d.addDisposableListener)(this._element,d.EventType.MOUSE_OVER,u=>{this._element.classList.contains("disabled")||this.updateBackground(!0)})),this._register((0,d.addDisposableListener)(this._element,d.EventType.MOUSE_OUT,u=>{this.updateBackground(!1)})),this.focusTracker=this._register((0,d.trackFocus)(this._element)),this._register(this.focusTracker.onDidFocus(()=>{this.enabled&&this.updateBackground(!0)})),this._register(this.focusTracker.onDidBlur(()=>{this.enabled&&this.updateBackground(!1)}))}dispose(){super.dispose(),this._element.remove()}getContentElements(c){const l=[];for(let a of(0,_.renderLabelWithIcons)(c))if(typeof a=="string"){if(a=a.trim(),a==="")continue;const r=document.createElement("span");r.textContent=a,l.push(r)}else l.push(a);return l}updateBackground(c){let l;this.options.secondary?l=c?this.options.buttonSecondaryHoverBackground:this.options.buttonSecondaryBackground:l=c?this.options.buttonHoverBackground:this.options.buttonBackground,l&&(this._element.style.backgroundColor=l)}get element(){return this._element}set label(c){if(this._label===c||(0,n.isMarkdownString)(this._label)&&(0,n.isMarkdownString)(c)&&(0,n.markdownStringEqual)(this._label,c))return;this._element.classList.add("monaco-text-button");const l=this.options.supportShortLabel?this._labelElement:this._element;if((0,n.isMarkdownString)(c)){const r=(0,E.renderMarkdown)(c,{inline:!0});r.dispose();const u=r.element.querySelector("p")?.innerHTML;if(u){const C=(0,k.sanitize)(u,{ADD_TAGS:["b","i","u","code","span"],ALLOWED_ATTR:["class"],RETURN_TRUSTED_TYPE:!0});l.innerHTML=C}else(0,d.reset)(l)}else this.options.supportIcons?(0,d.reset)(l,...this.getContentElements(c)):l.textContent=c;let a="";typeof this.options.title=="string"?a=this.options.title:this.options.title&&(a=(0,E.renderStringAsPlaintext)(c)),this.setTitle(a),typeof this.options.ariaLabel=="string"?this._element.setAttribute("aria-label",this.options.ariaLabel):this.options.ariaLabel&&this._element.setAttribute("aria-label",a),this._label=c}get label(){return this._label}set icon(c){this._element.classList.add(...t.ThemeIcon.asClassNameArray(c))}set enabled(c){c?(this._element.classList.remove("disabled"),this._element.setAttribute("aria-disabled",String(!1)),this._element.tabIndex=0):(this._element.classList.add("disabled"),this._element.setAttribute("aria-disabled",String(!0)))}get enabled(){return!this._element.classList.contains("disabled")}setTitle(c){!this._hover&&c!==""?this._hover=this._register((0,i.getBaseLayerHoverDelegate)().setupManagedHover(this.options.hoverDelegate??(0,m.getDefaultHoverDelegate)("mouse"),this._element,c)):this._hover&&this._hover.update(c)}}e.Button=s}),define(ne[639],se([1,0,5,93,47,207,81,44,115,13,6,72,2,16,3,473]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectBoxList=void 0;const s=d.$,g="selectOption.entry.template";class c{get templateId(){return g}renderTemplate(r){const u=Object.create(null);return u.root=r,u.text=d.append(r,s(".option-text")),u.detail=d.append(r,s(".option-detail")),u.decoratorRight=d.append(r,s(".option-decorator-right")),u}renderElement(r,u,C){const f=C,h=r.text,v=r.detail,w=r.decoratorRight,S=r.isDisabled;f.text.textContent=h,f.detail.textContent=v||"",f.decoratorRight.innerText=w||"",S?f.root.classList.add("option-disabled"):f.root.classList.remove("option-disabled")}disposeTemplate(r){}}class l extends o.Disposable{static{this.DEFAULT_DROPDOWN_MINIMUM_BOTTOM_MARGIN=32}static{this.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN=2}static{this.DEFAULT_MINIMUM_VISIBLE_OPTIONS=3}constructor(r,u,C,f,h){super(),this.options=[],this._currentSelection=0,this._hasDetails=!1,this._skipLayout=!1,this._sticky=!1,this._isVisible=!1,this.styles=f,this.selectBoxOptions=h||Object.create(null),typeof this.selectBoxOptions.minBottomMargin!="number"?this.selectBoxOptions.minBottomMargin=l.DEFAULT_DROPDOWN_MINIMUM_BOTTOM_MARGIN:this.selectBoxOptions.minBottomMargin<0&&(this.selectBoxOptions.minBottomMargin=0),this.selectElement=document.createElement("select"),this.selectElement.className="monaco-select-box monaco-select-box-dropdown-padding",typeof this.selectBoxOptions.ariaLabel=="string"&&this.selectElement.setAttribute("aria-label",this.selectBoxOptions.ariaLabel),typeof this.selectBoxOptions.ariaDescription=="string"&&this.selectElement.setAttribute("aria-description",this.selectBoxOptions.ariaDescription),this._onDidSelect=new p.Emitter,this._register(this._onDidSelect),this.registerListeners(),this.constructSelectDropDown(C),this.selected=u||0,r&&this.setOptions(r,u),this.initStyleSheet()}setTitle(r){!this._hover&&r?this._hover=this._register((0,y.getBaseLayerHoverDelegate)().setupManagedHover((0,m.getDefaultHoverDelegate)("mouse"),this.selectElement,r)):this._hover&&this._hover.update(r)}getHeight(){return 22}getTemplateId(){return g}constructSelectDropDown(r){this.contextViewProvider=r,this.selectDropDownContainer=d.$(".monaco-select-box-dropdown-container"),this.selectDropDownContainer.classList.add("monaco-select-box-dropdown-padding"),this.selectionDetailsPane=d.append(this.selectDropDownContainer,s(".select-box-details-pane"));const u=d.append(this.selectDropDownContainer,s(".select-box-dropdown-container-width-control")),C=d.append(u,s(".width-control-div"));this.widthControlElement=document.createElement("span"),this.widthControlElement.className="option-text-width-control",d.append(C,this.widthControlElement),this._dropDownPosition=0,this.styleElement=d.createStyleSheet(this.selectDropDownContainer),this.selectDropDownContainer.setAttribute("draggable","true"),this._register(d.addDisposableListener(this.selectDropDownContainer,d.EventType.DRAG_START,f=>{d.EventHelper.stop(f,!0)}))}registerListeners(){this._register(d.addStandardDisposableListener(this.selectElement,"change",u=>{this.selected=u.target.selectedIndex,this._onDidSelect.fire({index:u.target.selectedIndex,selected:u.target.value}),this.options[this.selected]&&this.options[this.selected].text&&this.setTitle(this.options[this.selected].text)})),this._register(d.addDisposableListener(this.selectElement,d.EventType.CLICK,u=>{d.EventHelper.stop(u),this._isVisible?this.hideSelectDropDown(!0):this.showSelectDropDown()})),this._register(d.addDisposableListener(this.selectElement,d.EventType.MOUSE_DOWN,u=>{d.EventHelper.stop(u)}));let r;this._register(d.addDisposableListener(this.selectElement,"touchstart",u=>{r=this._isVisible})),this._register(d.addDisposableListener(this.selectElement,"touchend",u=>{d.EventHelper.stop(u),r?this.hideSelectDropDown(!0):this.showSelectDropDown()})),this._register(d.addDisposableListener(this.selectElement,d.EventType.KEY_DOWN,u=>{const C=new I.StandardKeyboardEvent(u);let f=!1;t.isMacintosh?(C.keyCode===18||C.keyCode===16||C.keyCode===10||C.keyCode===3)&&(f=!0):(C.keyCode===18&&C.altKey||C.keyCode===16&&C.altKey||C.keyCode===10||C.keyCode===3)&&(f=!0),f&&(this.showSelectDropDown(),d.EventHelper.stop(u,!0))}))}get onDidSelect(){return this._onDidSelect.event}setOptions(r,u){b.equals(this.options,r)||(this.options=r,this.selectElement.options.length=0,this._hasDetails=!1,this._cachedMaxDetailsHeight=void 0,this.options.forEach((C,f)=>{this.selectElement.add(this.createOption(C.text,f,C.isDisabled)),typeof C.description=="string"&&(this._hasDetails=!0)})),u!==void 0&&(this.select(u),this._currentSelection=this.selected)}setOptionsList(){this.selectList?.splice(0,this.selectList.length,this.options)}select(r){r>=0&&rthis.options.length-1?this.select(this.options.length-1):this.selected<0&&(this.selected=0),this.selectElement.selectedIndex=this.selected,this.options[this.selected]&&this.options[this.selected].text&&this.setTitle(this.options[this.selected].text)}focus(){this.selectElement&&(this.selectElement.tabIndex=0,this.selectElement.focus())}blur(){this.selectElement&&(this.selectElement.tabIndex=-1,this.selectElement.blur())}setFocusable(r){this.selectElement.tabIndex=r?0:-1}render(r){this.container=r,r.classList.add("select-container"),r.appendChild(this.selectElement),this.styleSelectElement()}initStyleSheet(){const r=[];this.styles.listFocusBackground&&r.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.focused { background-color: ${this.styles.listFocusBackground} !important; }`),this.styles.listFocusForeground&&r.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.focused { color: ${this.styles.listFocusForeground} !important; }`),this.styles.decoratorRightForeground&&r.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row:not(.focused) .option-decorator-right { color: ${this.styles.decoratorRightForeground}; }`),this.styles.selectBackground&&this.styles.selectBorder&&this.styles.selectBorder!==this.styles.selectBackground?(r.push(`.monaco-select-box-dropdown-container { border: 1px solid ${this.styles.selectBorder} } `),r.push(`.monaco-select-box-dropdown-container > .select-box-details-pane.border-top { border-top: 1px solid ${this.styles.selectBorder} } `),r.push(`.monaco-select-box-dropdown-container > .select-box-details-pane.border-bottom { border-bottom: 1px solid ${this.styles.selectBorder} } `)):this.styles.selectListBorder&&(r.push(`.monaco-select-box-dropdown-container > .select-box-details-pane.border-top { border-top: 1px solid ${this.styles.selectListBorder} } `),r.push(`.monaco-select-box-dropdown-container > .select-box-details-pane.border-bottom { border-bottom: 1px solid ${this.styles.selectListBorder} } `)),this.styles.listHoverForeground&&r.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row:not(.option-disabled):not(.focused):hover { color: ${this.styles.listHoverForeground} !important; }`),this.styles.listHoverBackground&&r.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row:not(.option-disabled):not(.focused):hover { background-color: ${this.styles.listHoverBackground} !important; }`),this.styles.listFocusOutline&&r.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.focused { outline: 1.6px dotted ${this.styles.listFocusOutline} !important; outline-offset: -1.6px !important; }`),this.styles.listHoverOutline&&r.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row:not(.option-disabled):not(.focused):hover { outline: 1.6px dashed ${this.styles.listHoverOutline} !important; outline-offset: -1.6px !important; }`),r.push(".monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.option-disabled.focused { background-color: transparent !important; color: inherit !important; outline: none !important; }"),r.push(".monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.option-disabled:hover { background-color: transparent !important; color: inherit !important; outline: none !important; }"),this.styleElement.textContent=r.join(` -`)}styleSelectElement(){const r=this.styles.selectBackground??"",u=this.styles.selectForeground??"",C=this.styles.selectBorder??"";this.selectElement.style.backgroundColor=r,this.selectElement.style.color=u,this.selectElement.style.borderColor=C}styleList(){const r=this.styles.selectBackground??"",u=d.asCssValueWithDefault(this.styles.selectListBackground,r);this.selectDropDownListContainer.style.backgroundColor=u,this.selectionDetailsPane.style.backgroundColor=u;const C=this.styles.focusBorder??"";this.selectDropDownContainer.style.outlineColor=C,this.selectDropDownContainer.style.outlineOffset="-1px",this.selectList.style(this.styles)}createOption(r,u,C){const f=document.createElement("option");return f.value=r,f.text=r,f.disabled=!!C,f}showSelectDropDown(){this.selectionDetailsPane.innerText="",!(!this.contextViewProvider||this._isVisible)&&(this.createSelectList(this.selectDropDownContainer),this.setOptionsList(),this.contextViewProvider.showContextView({getAnchor:()=>this.selectElement,render:r=>this.renderSelectDropDown(r,!0),layout:()=>{this.layoutSelectDropDown()},onHide:()=>{this.selectDropDownContainer.classList.remove("visible"),this.selectElement.classList.remove("synthetic-focus")},anchorPosition:this._dropDownPosition},this.selectBoxOptions.optionsAsChildren?this.container:void 0),this._isVisible=!0,this.hideSelectDropDown(!1),this.contextViewProvider.showContextView({getAnchor:()=>this.selectElement,render:r=>this.renderSelectDropDown(r),layout:()=>this.layoutSelectDropDown(),onHide:()=>{this.selectDropDownContainer.classList.remove("visible"),this.selectElement.classList.remove("synthetic-focus")},anchorPosition:this._dropDownPosition},this.selectBoxOptions.optionsAsChildren?this.container:void 0),this._currentSelection=this.selected,this._isVisible=!0,this.selectElement.setAttribute("aria-expanded","true"))}hideSelectDropDown(r){!this.contextViewProvider||!this._isVisible||(this._isVisible=!1,this.selectElement.setAttribute("aria-expanded","false"),r&&this.selectElement.focus(),this.contextViewProvider.hideContextView())}renderSelectDropDown(r,u){return r.appendChild(this.selectDropDownContainer),this.layoutSelectDropDown(u),{dispose:()=>{this.selectDropDownContainer.remove()}}}measureMaxDetailsHeight(){let r=0;return this.options.forEach((u,C)=>{this.updateDetail(C),this.selectionDetailsPane.offsetHeight>r&&(r=this.selectionDetailsPane.offsetHeight)}),r}layoutSelectDropDown(r){if(this._skipLayout)return!1;if(this.selectList){this.selectDropDownContainer.classList.add("visible");const u=d.getWindow(this.selectElement),C=d.getDomNodePagePosition(this.selectElement),f=d.getWindow(this.selectElement).getComputedStyle(this.selectElement),h=parseFloat(f.getPropertyValue("--dropdown-padding-top"))+parseFloat(f.getPropertyValue("--dropdown-padding-bottom")),v=u.innerHeight-C.top-C.height-(this.selectBoxOptions.minBottomMargin||0),w=C.top-l.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN,S=this.selectElement.offsetWidth,L=this.setWidthControlElement(this.widthControlElement),D=Math.max(L,Math.round(S)).toString()+"px";this.selectDropDownContainer.style.width=D,this.selectList.getHTMLElement().style.height="",this.selectList.layout();let T=this.selectList.contentHeight;this._hasDetails&&this._cachedMaxDetailsHeight===void 0&&(this._cachedMaxDetailsHeight=this.measureMaxDetailsHeight());const M=this._hasDetails?this._cachedMaxDetailsHeight:0,A=T+h+M,P=Math.floor((v-h-M)/this.getHeight()),N=Math.floor((w-h-M)/this.getHeight());if(r)return C.top+C.height>u.innerHeight-22||C.topP&&this.options.length>P?(this._dropDownPosition=1,this.selectDropDownListContainer.remove(),this.selectionDetailsPane.remove(),this.selectDropDownContainer.appendChild(this.selectionDetailsPane),this.selectDropDownContainer.appendChild(this.selectDropDownListContainer),this.selectionDetailsPane.classList.remove("border-top"),this.selectionDetailsPane.classList.add("border-bottom")):(this._dropDownPosition=0,this.selectDropDownListContainer.remove(),this.selectionDetailsPane.remove(),this.selectDropDownContainer.appendChild(this.selectDropDownListContainer),this.selectDropDownContainer.appendChild(this.selectionDetailsPane),this.selectionDetailsPane.classList.remove("border-bottom"),this.selectionDetailsPane.classList.add("border-top")),!0);if(C.top+C.height>u.innerHeight-22||C.topv&&(T=P*this.getHeight())}else A>w&&(T=N*this.getHeight());return this.selectList.layout(T),this.selectList.domFocus(),this.selectList.length>0&&(this.selectList.setFocus([this.selected||0]),this.selectList.reveal(this.selectList.getFocus()[0]||0)),this._hasDetails?(this.selectList.getHTMLElement().style.height=T+h+"px",this.selectDropDownContainer.style.height=""):this.selectDropDownContainer.style.height=T+h+"px",this.updateDetail(this.selected),this.selectDropDownContainer.style.width=D,this.selectDropDownListContainer.setAttribute("tabindex","0"),this.selectElement.classList.add("synthetic-focus"),this.selectDropDownContainer.classList.add("synthetic-focus"),!0}else return!1}setWidthControlElement(r){let u=0;if(r){let C=0,f=0;this.options.forEach((h,v)=>{const w=h.detail?h.detail.length:0,S=h.decoratorRight?h.decoratorRight.length:0,L=h.text.length+w+S;L>f&&(C=v,f=L)}),r.textContent=this.options[C].text+(this.options[C].decoratorRight?this.options[C].decoratorRight+" ":""),u=d.getTotalWidth(r)}return u}createSelectList(r){if(this.selectList)return;this.selectDropDownListContainer=d.append(r,s(".select-box-dropdown-list-container")),this.listRenderer=new c,this.selectList=this._register(new _.List("SelectBoxCustom",this.selectDropDownListContainer,this,[this.listRenderer],{useShadows:!1,verticalScrollMode:3,keyboardSupport:!1,mouseSupport:!1,accessibilityProvider:{getAriaLabel:f=>{let h=f.text;return f.detail&&(h+=`. ${f.detail}`),f.decoratorRight&&(h+=`. ${f.decoratorRight}`),f.description&&(h+=`. ${f.description}`),h},getWidgetAriaLabel:()=>(0,i.localize)(16,"Select Box"),getRole:()=>t.isMacintosh?"":"option",getWidgetRole:()=>"listbox"}})),this.selectBoxOptions.ariaLabel&&(this.selectList.ariaLabel=this.selectBoxOptions.ariaLabel);const u=this._register(new k.DomEmitter(this.selectDropDownListContainer,"keydown")),C=p.Event.chain(u.event,f=>f.filter(()=>this.selectList.length>0).map(h=>new I.StandardKeyboardEvent(h)));this._register(p.Event.chain(C,f=>f.filter(h=>h.keyCode===3))(this.onEnter,this)),this._register(p.Event.chain(C,f=>f.filter(h=>h.keyCode===2))(this.onEnter,this)),this._register(p.Event.chain(C,f=>f.filter(h=>h.keyCode===9))(this.onEscape,this)),this._register(p.Event.chain(C,f=>f.filter(h=>h.keyCode===16))(this.onUpArrow,this)),this._register(p.Event.chain(C,f=>f.filter(h=>h.keyCode===18))(this.onDownArrow,this)),this._register(p.Event.chain(C,f=>f.filter(h=>h.keyCode===12))(this.onPageDown,this)),this._register(p.Event.chain(C,f=>f.filter(h=>h.keyCode===11))(this.onPageUp,this)),this._register(p.Event.chain(C,f=>f.filter(h=>h.keyCode===14))(this.onHome,this)),this._register(p.Event.chain(C,f=>f.filter(h=>h.keyCode===13))(this.onEnd,this)),this._register(p.Event.chain(C,f=>f.filter(h=>h.keyCode>=21&&h.keyCode<=56||h.keyCode>=85&&h.keyCode<=113))(this.onCharacter,this)),this._register(d.addDisposableListener(this.selectList.getHTMLElement(),d.EventType.POINTER_UP,f=>this.onPointerUp(f))),this._register(this.selectList.onMouseOver(f=>typeof f.index<"u"&&this.selectList.setFocus([f.index]))),this._register(this.selectList.onDidChangeFocus(f=>this.onListFocus(f))),this._register(d.addDisposableListener(this.selectDropDownContainer,d.EventType.FOCUS_OUT,f=>{!this._isVisible||d.isAncestor(f.relatedTarget,this.selectDropDownContainer)||this.onListBlur()})),this.selectList.getHTMLElement().setAttribute("aria-label",this.selectBoxOptions.ariaLabel||""),this.selectList.getHTMLElement().setAttribute("aria-expanded","true"),this.styleList()}onPointerUp(r){if(!this.selectList.length)return;d.EventHelper.stop(r);const u=r.target;if(!u||u.classList.contains("slider"))return;const C=u.closest(".monaco-list-row");if(!C)return;const f=Number(C.getAttribute("data-index")),h=C.classList.contains("option-disabled");f>=0&&f{for(let v=0;vthis.selected+2)this.selected+=2;else{if(u)return;this.selected++}this.select(this.selected),this.selectList.setFocus([this.selected]),this.selectList.reveal(this.selectList.getFocus()[0])}}onUpArrow(r){this.selected>0&&(d.EventHelper.stop(r,!0),this.options[this.selected-1].isDisabled&&this.selected>1?this.selected-=2:this.selected--,this.select(this.selected),this.selectList.setFocus([this.selected]),this.selectList.reveal(this.selectList.getFocus()[0]))}onPageUp(r){d.EventHelper.stop(r),this.selectList.focusPreviousPage(),setTimeout(()=>{this.selected=this.selectList.getFocus()[0],this.options[this.selected].isDisabled&&this.selected{this.selected=this.selectList.getFocus()[0],this.options[this.selected].isDisabled&&this.selected>0&&(this.selected--,this.selectList.setFocus([this.selected])),this.selectList.reveal(this.selected),this.select(this.selected)},1)}onHome(r){d.EventHelper.stop(r),!(this.options.length<2)&&(this.selected=0,this.options[this.selected].isDisabled&&this.selected>1&&this.selected++,this.selectList.setFocus([this.selected]),this.selectList.reveal(this.selected),this.select(this.selected))}onEnd(r){d.EventHelper.stop(r),!(this.options.length<2)&&(this.selected=this.options.length-1,this.options[this.selected].isDisabled&&this.selected>1&&this.selected--,this.selectList.setFocus([this.selected]),this.selectList.reveal(this.selected),this.select(this.selected))}onCharacter(r){const u=n.KeyCodeUtils.toString(r.keyCode);let C=-1;for(let f=0;f{this.element&&this.handleActionChangeEvent(u)}))}handleActionChangeEvent(l){l.enabled!==void 0&&this.updateEnabled(),l.checked!==void 0&&this.updateChecked(),l.class!==void 0&&this.updateClass(),l.label!==void 0&&(this.updateLabel(),this.updateTooltip()),l.tooltip!==void 0&&this.updateTooltip()}get actionRunner(){return this._actionRunner||(this._actionRunner=this._register(new _.ActionRunner)),this._actionRunner}set actionRunner(l){this._actionRunner=l}isEnabled(){return this._action.enabled}setActionContext(l){this._context=l}render(l){const a=this.element=l;this._register(E.Gesture.addTarget(l));const r=this.options&&this.options.draggable;r&&(l.draggable=!0,d.isFirefox&&this._register((0,I.addDisposableListener)(l,I.EventType.DRAG_START,u=>u.dataTransfer?.setData(k.DataTransfers.TEXT,this._action.label)))),this._register((0,I.addDisposableListener)(a,E.EventType.Tap,u=>this.onClick(u,!0))),this._register((0,I.addDisposableListener)(a,I.EventType.MOUSE_DOWN,u=>{r||I.EventHelper.stop(u,!0),this._action.enabled&&u.button===0&&a.classList.add("active")})),p.isMacintosh&&this._register((0,I.addDisposableListener)(a,I.EventType.CONTEXT_MENU,u=>{u.button===0&&u.ctrlKey===!0&&this.onClick(u)})),this._register((0,I.addDisposableListener)(a,I.EventType.CLICK,u=>{I.EventHelper.stop(u,!0),this.options&&this.options.isMenu||this.onClick(u)})),this._register((0,I.addDisposableListener)(a,I.EventType.DBLCLICK,u=>{I.EventHelper.stop(u,!0)})),[I.EventType.MOUSE_UP,I.EventType.MOUSE_OUT].forEach(u=>{this._register((0,I.addDisposableListener)(a,u,C=>{I.EventHelper.stop(C),a.classList.remove("active")}))})}onClick(l,a=!1){I.EventHelper.stop(l,!0);const r=n.isUndefinedOrNull(this._context)?this.options?.useEventAsContext?l:{preserveFocus:a}:this._context;this.actionRunner.run(this._action,r)}focus(){this.element&&(this.element.tabIndex=0,this.element.focus(),this.element.classList.add("focused"))}blur(){this.element&&(this.element.blur(),this.element.tabIndex=-1,this.element.classList.remove("focused"))}setFocusable(l){this.element&&(this.element.tabIndex=l?0:-1)}get trapsArrowNavigation(){return!1}updateEnabled(){}updateLabel(){}getClass(){return this.action.class}getTooltip(){return this.action.tooltip}updateTooltip(){if(!this.element)return;const l=this.getTooltip()??"";if(this.updateAriaLabel(),this.options.hoverDelegate?.showNativeHover)this.element.title=l;else if(!this.customHover&&l!==""){const a=this.options.hoverDelegate??(0,y.getDefaultHoverDelegate)("element");this.customHover=this._store.add((0,t.getBaseLayerHoverDelegate)().setupManagedHover(a,this.element,l))}else this.customHover&&this.customHover.update(l)}updateAriaLabel(){if(this.element){const l=this.getTooltip()??"";this.element.setAttribute("aria-label",l)}}updateClass(){}updateChecked(){}dispose(){this.element&&(this.element.remove(),this.element=void 0),this._context=void 0,super.dispose()}}e.BaseActionViewItem=i;class s extends i{constructor(l,a,r){super(l,a,r),this.options=r,this.options.icon=r.icon!==void 0?r.icon:!1,this.options.label=r.label!==void 0?r.label:!0,this.cssClass=""}render(l){super.render(l),n.assertType(this.element);const a=document.createElement("a");if(a.classList.add("action-label"),a.setAttribute("role",this.getDefaultAriaRole()),this.label=a,this.element.appendChild(a),this.options.label&&this.options.keybinding){const r=document.createElement("span");r.classList.add("keybinding"),r.textContent=this.options.keybinding,this.element.appendChild(r)}this.updateClass(),this.updateLabel(),this.updateTooltip(),this.updateEnabled(),this.updateChecked()}getDefaultAriaRole(){return this._action.id===_.Separator.ID?"presentation":this.options.isMenu?"menuitem":this.options.isTabList?"tab":"button"}focus(){this.label&&(this.label.tabIndex=0,this.label.focus())}blur(){this.label&&(this.label.tabIndex=-1)}setFocusable(l){this.label&&(this.label.tabIndex=l?0:-1)}updateLabel(){this.options.label&&this.label&&(this.label.textContent=this.action.label)}getTooltip(){let l=null;return this.action.tooltip?l=this.action.tooltip:!this.options.label&&this.action.label&&this.options.icon&&(l=this.action.label,this.options.keybinding&&(l=o.localize(0,"{0} ({1})",l,this.options.keybinding))),l??void 0}updateClass(){this.cssClass&&this.label&&this.label.classList.remove(...this.cssClass.split(" ")),this.options.icon?(this.cssClass=this.getClass(),this.label&&(this.label.classList.add("codicon"),this.cssClass&&this.label.classList.add(...this.cssClass.split(" "))),this.updateEnabled()):this.label?.classList.remove("codicon")}updateEnabled(){this.action.enabled?(this.label&&(this.label.removeAttribute("aria-disabled"),this.label.classList.remove("disabled")),this.element?.classList.remove("disabled")):(this.label&&(this.label.setAttribute("aria-disabled","true"),this.label.classList.add("disabled")),this.element?.classList.add("disabled"))}updateAriaLabel(){if(this.label){const l=this.getTooltip()??"";this.label.setAttribute("aria-label",l)}}updateChecked(){this.label&&(this.action.checked!==void 0?(this.label.classList.toggle("checked",this.action.checked),this.options.isTabList?this.label.setAttribute("aria-selected",this.action.checked?"true":"false"):(this.label.setAttribute("aria-checked",this.action.checked?"true":"false"),this.label.setAttribute("role","checkbox"))):(this.label.classList.remove("checked"),this.label.removeAttribute(this.options.isTabList?"aria-selected":"aria-checked"),this.label.setAttribute("role",this.getDefaultAriaRole())))}}e.ActionViewItem=s;class g extends i{constructor(l,a,r,u,C,f,h){super(l,a),this.selectBox=new m.SelectBox(r,u,C,f,h),this.selectBox.setFocusable(!1),this._register(this.selectBox),this.registerListeners()}select(l){this.selectBox.select(l)}registerListeners(){this._register(this.selectBox.onDidSelect(l=>this.runAction(l.selected,l.index)))}runAction(l,a){this.actionRunner.run(this._action,this.getActionContext(l,a))}getActionContext(l,a){return l}setFocusable(l){this.selectBox.setFocusable(l)}focus(){this.selectBox?.focus()}blur(){this.selectBox?.blur()}render(l){this.selectBox.render(l)}}e.SelectActionViewItem=g}),define(ne[87],se([1,0,5,47,151,44,41,6,2,19,302]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ActionBar=void 0;class p extends _.Disposable{constructor(o,t={}){super(),this._actionRunnerDisposables=this._register(new _.DisposableStore),this.viewItemDisposables=this._register(new _.DisposableMap),this.triggerKeyDown=!1,this.focusable=!0,this._onDidBlur=this._register(new m.Emitter),this.onDidBlur=this._onDidBlur.event,this._onDidCancel=this._register(new m.Emitter({onWillAddFirstListener:()=>this.cancelHasListener=!0})),this.onDidCancel=this._onDidCancel.event,this.cancelHasListener=!1,this._onDidRun=this._register(new m.Emitter),this.onDidRun=this._onDidRun.event,this._onWillRun=this._register(new m.Emitter),this.onWillRun=this._onWillRun.event,this.options=t,this._context=t.context??null,this._orientation=this.options.orientation??0,this._triggerKeys={keyDown:this.options.triggerKeys?.keyDown??!1,keys:this.options.triggerKeys?.keys??[3,10]},this._hoverDelegate=t.hoverDelegate??this._register((0,E.createInstantHoverDelegate)()),this.options.actionRunner?this._actionRunner=this.options.actionRunner:(this._actionRunner=new y.ActionRunner,this._actionRunnerDisposables.add(this._actionRunner)),this._actionRunnerDisposables.add(this._actionRunner.onDidRun(g=>this._onDidRun.fire(g))),this._actionRunnerDisposables.add(this._actionRunner.onWillRun(g=>this._onWillRun.fire(g))),this.viewItems=[],this.focusedItem=void 0,this.domNode=document.createElement("div"),this.domNode.className="monaco-action-bar";let i,s;switch(this._orientation){case 0:i=[15],s=[17];break;case 1:i=[16],s=[18],this.domNode.className+=" vertical";break}this._register(d.addDisposableListener(this.domNode,d.EventType.KEY_DOWN,g=>{const c=new k.StandardKeyboardEvent(g);let l=!0;const a=typeof this.focusedItem=="number"?this.viewItems[this.focusedItem]:void 0;i&&(c.equals(i[0])||c.equals(i[1]))?l=this.focusPrevious():s&&(c.equals(s[0])||c.equals(s[1]))?l=this.focusNext():c.equals(9)&&this.cancelHasListener?this._onDidCancel.fire():c.equals(14)?l=this.focusFirst():c.equals(13)?l=this.focusLast():c.equals(2)&&a instanceof I.BaseActionViewItem&&a.trapsArrowNavigation?l=this.focusNext(void 0,!0):this.isTriggerKeyEvent(c)?this._triggerKeys.keyDown?this.doTrigger(c):this.triggerKeyDown=!0:l=!1,l&&(c.preventDefault(),c.stopPropagation())})),this._register(d.addDisposableListener(this.domNode,d.EventType.KEY_UP,g=>{const c=new k.StandardKeyboardEvent(g);this.isTriggerKeyEvent(c)?(!this._triggerKeys.keyDown&&this.triggerKeyDown&&(this.triggerKeyDown=!1,this.doTrigger(c)),c.preventDefault(),c.stopPropagation()):(c.equals(2)||c.equals(1026)||c.equals(16)||c.equals(18)||c.equals(15)||c.equals(17))&&this.updateFocusedItem()})),this.focusTracker=this._register(d.trackFocus(this.domNode)),this._register(this.focusTracker.onDidBlur(()=>{(d.getActiveElement()===this.domNode||!d.isAncestor(d.getActiveElement(),this.domNode))&&(this._onDidBlur.fire(),this.previouslyFocusedItem=this.focusedItem,this.focusedItem=void 0,this.triggerKeyDown=!1)})),this._register(this.focusTracker.onDidFocus(()=>this.updateFocusedItem())),this.actionsList=document.createElement("ul"),this.actionsList.className="actions-container",this.options.highlightToggledItems&&this.actionsList.classList.add("highlight-toggled"),this.actionsList.setAttribute("role",this.options.ariaRole||"toolbar"),this.options.ariaLabel&&this.actionsList.setAttribute("aria-label",this.options.ariaLabel),this.domNode.appendChild(this.actionsList),o.appendChild(this.domNode)}refreshRole(){this.length()>=1?this.actionsList.setAttribute("role",this.options.ariaRole||"toolbar"):this.actionsList.setAttribute("role","presentation")}setFocusable(o){if(this.focusable=o,this.focusable){const t=this.viewItems.find(i=>i instanceof I.BaseActionViewItem&&i.isEnabled());t instanceof I.BaseActionViewItem&&t.setFocusable(!0)}else this.viewItems.forEach(t=>{t instanceof I.BaseActionViewItem&&t.setFocusable(!1)})}isTriggerKeyEvent(o){let t=!1;return this._triggerKeys.keys.forEach(i=>{t=t||o.equals(i)}),t}updateFocusedItem(){for(let o=0;ot.setActionContext(o))}get actionRunner(){return this._actionRunner}set actionRunner(o){this._actionRunner=o,this._actionRunnerDisposables.clear(),this._actionRunnerDisposables.add(this._actionRunner.onDidRun(t=>this._onDidRun.fire(t))),this._actionRunnerDisposables.add(this._actionRunner.onWillRun(t=>this._onWillRun.fire(t))),this.viewItems.forEach(t=>t.actionRunner=o)}getContainer(){return this.domNode}getAction(o){if(typeof o=="number")return this.viewItems[o]?.action;if(d.isHTMLElement(o)){for(;o.parentElement!==this.actionsList;){if(!o.parentElement)return;o=o.parentElement}for(let t=0;t{const c=document.createElement("li");c.className="action-item",c.setAttribute("role","presentation");let l;const a={hoverDelegate:this._hoverDelegate,...t,isTabList:this.options.ariaRole==="tablist"};this.options.actionViewItemProvider&&(l=this.options.actionViewItemProvider(g,a)),l||(l=new I.ActionViewItem(this.context,g,a)),this.options.allowContextMenu||this.viewItemDisposables.set(l,d.addDisposableListener(c,d.EventType.CONTEXT_MENU,r=>{d.EventHelper.stop(r,!0)})),l.actionRunner=this._actionRunner,l.setActionContext(this.context),l.render(c),this.focusable&&l instanceof I.BaseActionViewItem&&this.viewItems.length===0&&l.setFocusable(!0),s===null||s<0||s>=this.actionsList.children.length?(this.actionsList.appendChild(c),this.viewItems.push(l)):(this.actionsList.insertBefore(c,this.actionsList.children[s]),this.viewItems.splice(s,0,l),s++)}),typeof this.focusedItem=="number"&&this.focus(this.focusedItem),this.refreshRole()}clear(){this.isEmpty()||(this.viewItems=(0,_.dispose)(this.viewItems),this.viewItemDisposables.clearAndDisposeAll(),d.clearNode(this.actionsList),this.refreshRole())}length(){return this.viewItems.length}isEmpty(){return this.viewItems.length===0}focus(o){let t=!1,i;if(o===void 0?t=!0:typeof o=="number"?i=o:typeof o=="boolean"&&(t=o),t&&typeof this.focusedItem>"u"){const s=this.viewItems.findIndex(g=>g.isEnabled());this.focusedItem=s===-1?void 0:s,this.updateFocus(void 0,void 0,!0)}else i!==void 0&&(this.focusedItem=i),this.updateFocus(void 0,void 0,!0)}focusFirst(){return this.focusedItem=this.length()-1,this.focusNext(!0)}focusLast(){return this.focusedItem=0,this.focusPrevious(!0)}focusNext(o,t){if(typeof this.focusedItem>"u")this.focusedItem=this.viewItems.length-1;else if(this.viewItems.length<=1)return!1;const i=this.focusedItem;let s;do{if(!o&&this.options.preventLoopNavigation&&this.focusedItem+1>=this.viewItems.length)return this.focusedItem=i,!1;this.focusedItem=(this.focusedItem+1)%this.viewItems.length,s=this.viewItems[this.focusedItem]}while(this.focusedItem!==i&&(this.options.focusOnlyEnabledItems&&!s.isEnabled()||s.action.id===y.Separator.ID));return this.updateFocus(void 0,void 0,t),!0}focusPrevious(o){if(typeof this.focusedItem>"u")this.focusedItem=0;else if(this.viewItems.length<=1)return!1;const t=this.focusedItem;let i;do{if(this.focusedItem=this.focusedItem-1,this.focusedItem<0){if(!o&&this.options.preventLoopNavigation)return this.focusedItem=t,!1;this.focusedItem=this.viewItems.length-1}i=this.viewItems[this.focusedItem]}while(this.focusedItem!==t&&(this.options.focusOnlyEnabledItems&&!i.isEnabled()||i.action.id===y.Separator.ID));return this.updateFocus(!0),!0}updateFocus(o,t,i=!1){typeof this.focusedItem>"u"&&this.actionsList.focus({preventScroll:t}),this.previouslyFocusedItem!==void 0&&this.previouslyFocusedItem!==this.focusedItem&&this.viewItems[this.previouslyFocusedItem]?.blur();const s=this.focusedItem!==void 0?this.viewItems[this.focusedItem]:void 0;if(s){let g=!0;b.isFunction(s.focus)||(g=!1),this.options.focusOnlyEnabledItems&&b.isFunction(s.isEnabled)&&!s.isEnabled()&&(g=!1),s.action.id===y.Separator.ID&&(g=!1),g?(i||this.previouslyFocusedItem!==this.focusedItem)&&(s.focus(o),this.previouslyFocusedItem=this.focusedItem):(this.actionsList.focus({preventScroll:t}),this.previouslyFocusedItem=void 0),g&&s.showHover?.()}}doTrigger(o){if(typeof this.focusedItem>"u")return;const t=this.viewItems[this.focusedItem];if(t instanceof I.BaseActionViewItem){const i=t._context===null||t._context===void 0?o:t._context;this.run(t._action,i)}}async run(o,t){await this._actionRunner.run(o,t)}dispose(){this._context=void 0,this.viewItems=(0,_.dispose)(this.viewItems),this.getContainer().remove(),super.dispose()}}e.ActionBar=p}),define(ne[359],se([1,0,5,151,631,6,44,81,303]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DropdownMenuActionViewItem=void 0;class _ extends k.BaseActionViewItem{constructor(p,n,o,t=Object.create(null)){super(null,p,t),this.actionItem=null,this._onDidChangeVisibility=this._register(new E.Emitter),this.onDidChangeVisibility=this._onDidChangeVisibility.event,this.menuActionsOrProvider=n,this.contextMenuProvider=o,this.options=t,this.options.actionRunner&&(this.actionRunner=this.options.actionRunner)}render(p){this.actionItem=p;const n=i=>{this.element=(0,d.append)(i,(0,d.$)("a.action-label"));let s=[];return typeof this.options.classNames=="string"?s=this.options.classNames.split(/\s+/g).filter(g=>!!g):this.options.classNames&&(s=this.options.classNames),s.find(g=>g==="icon")||s.push("codicon"),this.element.classList.add(...s),this.element.setAttribute("role","button"),this.element.setAttribute("aria-haspopup","true"),this.element.setAttribute("aria-expanded","false"),this._action.label&&this._register((0,m.getBaseLayerHoverDelegate)().setupManagedHover(this.options.hoverDelegate??(0,y.getDefaultHoverDelegate)("mouse"),this.element,this._action.label)),this.element.ariaLabel=this._action.label||"",null},o=Array.isArray(this.menuActionsOrProvider),t={contextMenuProvider:this.contextMenuProvider,labelRenderer:n,menuAsChild:this.options.menuAsChild,actions:o?this.menuActionsOrProvider:void 0,actionProvider:o?void 0:this.menuActionsOrProvider,skipTelemetry:this.options.skipTelemetry};if(this.dropdownMenu=this._register(new I.DropdownMenu(p,t)),this._register(this.dropdownMenu.onDidChangeVisibility(i=>{this.element?.setAttribute("aria-expanded",`${i}`),this._onDidChangeVisibility.fire(i)})),this.dropdownMenu.menuOptions={actionViewItemProvider:this.options.actionViewItemProvider,actionRunner:this.actionRunner,getKeyBinding:this.options.keybindingProvider,context:this._context},this.options.anchorAlignmentProvider){const i=this;this.dropdownMenu.menuOptions={...this.dropdownMenu.menuOptions,get anchorAlignment(){return i.options.anchorAlignmentProvider()}}}this.updateTooltip(),this.updateEnabled()}getTooltip(){let p=null;return this.action.tooltip?p=this.action.tooltip:this.action.label&&(p=this.action.label),p??void 0}setActionContext(p){super.setActionContext(p),this.dropdownMenu&&(this.dropdownMenu.menuOptions?this.dropdownMenu.menuOptions.context=p:this.dropdownMenu.menuOptions={context:p})}show(){this.dropdownMenu?.show()}updateEnabled(){const p=!this.action.enabled;this.actionItem?.classList.toggle("disabled",p),this.element?.classList.toggle("disabled",p)}}e.DropdownMenuActionViewItem=_}),define(ne[259],se([1,0,5,93,352,87,46,81,44,86,85,6,450,60,3,466]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HistoryInputBox=e.InputBox=e.unthemedInboxStyles=void 0;const s=d.$;e.unthemedInboxStyles={inputBackground:"#3C3C3C",inputForeground:"#CCCCCC",inputValidationInfoBorder:"#55AAFF",inputValidationInfoBackground:"#063B49",inputValidationWarningBorder:"#B89500",inputValidationWarningBackground:"#352A05",inputValidationErrorBorder:"#BE1100",inputValidationErrorBackground:"#5A1D1D",inputBorder:void 0,inputValidationErrorForeground:void 0,inputValidationInfoForeground:void 0,inputValidationWarningForeground:void 0};class g extends p.Widget{constructor(a,r,u){super(),this.state="idle",this.maxHeight=Number.POSITIVE_INFINITY,this._onDidChange=this._register(new n.Emitter),this.onDidChange=this._onDidChange.event,this._onDidHeightChange=this._register(new n.Emitter),this.onDidHeightChange=this._onDidHeightChange.event,this.contextViewProvider=r,this.options=u,this.message=null,this.placeholder=this.options.placeholder||"",this.tooltip=this.options.tooltip??(this.placeholder||""),this.ariaLabel=this.options.ariaLabel||"",this.options.validationOptions&&(this.validation=this.options.validationOptions.validation),this.element=d.append(a,s(".monaco-inputbox.idle"));const C=this.options.flexibleHeight?"textarea":"input",f=d.append(this.element,s(".ibwrapper"));if(this.input=d.append(f,s(C+".input.empty")),this.input.setAttribute("autocorrect","off"),this.input.setAttribute("autocapitalize","off"),this.input.setAttribute("spellcheck","false"),this.onfocus(this.input,()=>this.element.classList.add("synthetic-focus")),this.onblur(this.input,()=>this.element.classList.remove("synthetic-focus")),this.options.flexibleHeight){this.maxHeight=typeof this.options.flexibleMaxHeight=="number"?this.options.flexibleMaxHeight:Number.POSITIVE_INFINITY,this.mirror=d.append(f,s("div.mirror")),this.mirror.innerText="\xA0",this.scrollableElement=new b.ScrollableElement(this.element,{vertical:1}),this.options.flexibleWidth&&(this.input.setAttribute("wrap","off"),this.mirror.style.whiteSpace="pre",this.mirror.style.wordWrap="initial"),d.append(a,this.scrollableElement.getDomNode()),this._register(this.scrollableElement),this._register(this.scrollableElement.onScroll(w=>this.input.scrollTop=w.scrollTop));const h=this._register(new k.DomEmitter(a.ownerDocument,"selectionchange")),v=n.Event.filter(h.event,()=>a.ownerDocument.getSelection()?.anchorNode===f);this._register(v(this.updateScrollDimensions,this)),this._register(this.onDidHeightChange(this.updateScrollDimensions,this))}else this.input.type=this.options.type||"text",this.input.setAttribute("wrap","off");this.ariaLabel&&this.input.setAttribute("aria-label",this.ariaLabel),this.placeholder&&!this.options.showPlaceholderOnFocus&&this.setPlaceHolder(this.placeholder),this.tooltip&&this.setTooltip(this.tooltip),this.oninput(this.input,()=>this.onValueChange()),this.onblur(this.input,()=>this.onBlur()),this.onfocus(this.input,()=>this.onFocus()),this._register(this.ignoreGesture(this.input)),setTimeout(()=>this.updateMirror(),0),this.options.actions&&(this.actionbar=this._register(new E.ActionBar(this.element)),this.actionbar.push(this.options.actions,{icon:!0,label:!1})),this.applyStyles()}onBlur(){this._hideMessage(),this.options.showPlaceholderOnFocus&&this.input.setAttribute("placeholder","")}onFocus(){this._showMessage(),this.options.showPlaceholderOnFocus&&this.input.setAttribute("placeholder",this.placeholder||"")}setPlaceHolder(a){this.placeholder=a,this.input.setAttribute("placeholder",a)}setTooltip(a){this.tooltip=a,this.hover?this.hover.update(a):this.hover=this._register((0,m.getBaseLayerHoverDelegate)().setupManagedHover((0,_.getDefaultHoverDelegate)("mouse"),this.input,a))}get inputElement(){return this.input}get value(){return this.input.value}set value(a){this.input.value!==a&&(this.input.value=a,this.onValueChange())}get height(){return typeof this.cachedHeight=="number"?this.cachedHeight:d.getTotalHeight(this.element)}focus(){this.input.focus()}blur(){this.input.blur()}hasFocus(){return d.isActiveElement(this.input)}select(a=null){this.input.select(),a&&(this.input.setSelectionRange(a.start,a.end),a.end===this.input.value.length&&(this.input.scrollLeft=this.input.scrollWidth))}isSelectionAtEnd(){return this.input.selectionEnd===this.input.value.length&&this.input.selectionStart===this.input.selectionEnd}getSelection(){const a=this.input.selectionStart;if(a===null)return null;const r=this.input.selectionEnd??a;return{start:a,end:r}}enable(){this.input.removeAttribute("disabled")}disable(){this.blur(),this.input.disabled=!0,this._hideMessage()}set paddingRight(a){this.input.style.width=`calc(100% - ${a}px)`,this.mirror&&(this.mirror.style.paddingRight=a+"px")}updateScrollDimensions(){if(typeof this.cachedContentHeight!="number"||typeof this.cachedHeight!="number"||!this.scrollableElement)return;const a=this.cachedContentHeight,r=this.cachedHeight,u=this.input.scrollTop;this.scrollableElement.setScrollDimensions({scrollHeight:a,height:r}),this.scrollableElement.setScrollPosition({scrollTop:u})}showMessage(a,r){if(this.state==="open"&&(0,t.equals)(this.message,a))return;this.message=a,this.element.classList.remove("idle"),this.element.classList.remove("info"),this.element.classList.remove("warning"),this.element.classList.remove("error"),this.element.classList.add(this.classForType(a.type));const u=this.stylesForType(this.message.type);this.element.style.border=`1px solid ${d.asCssValueWithDefault(u.border,"transparent")}`,this.message.content&&(this.hasFocus()||r)&&this._showMessage()}hideMessage(){this.message=null,this.element.classList.remove("info"),this.element.classList.remove("warning"),this.element.classList.remove("error"),this.element.classList.add("idle"),this._hideMessage(),this.applyStyles()}validate(){let a=null;return this.validation&&(a=this.validation(this.value),a?(this.inputElement.setAttribute("aria-invalid","true"),this.showMessage(a)):this.inputElement.hasAttribute("aria-invalid")&&(this.inputElement.removeAttribute("aria-invalid"),this.hideMessage())),a?.type}stylesForType(a){const r=this.options.inputBoxStyles;switch(a){case 1:return{border:r.inputValidationInfoBorder,background:r.inputValidationInfoBackground,foreground:r.inputValidationInfoForeground};case 2:return{border:r.inputValidationWarningBorder,background:r.inputValidationWarningBackground,foreground:r.inputValidationWarningForeground};default:return{border:r.inputValidationErrorBorder,background:r.inputValidationErrorBackground,foreground:r.inputValidationErrorForeground}}}classForType(a){switch(a){case 1:return"info";case 2:return"warning";default:return"error"}}_showMessage(){if(!this.contextViewProvider||!this.message)return;let a;const r=()=>a.style.width=d.getTotalWidth(this.element)+"px";this.contextViewProvider.showContextView({getAnchor:()=>this.element,anchorAlignment:1,render:C=>{if(!this.message)return null;a=d.append(C,s(".monaco-inputbox-container")),r();const f={inline:!0,className:"monaco-inputbox-message"},h=this.message.formatContent?(0,I.renderFormattedText)(this.message.content,f):(0,I.renderText)(this.message.content,f);h.classList.add(this.classForType(this.message.type));const v=this.stylesForType(this.message.type);return h.style.backgroundColor=v.background??"",h.style.color=v.foreground??"",h.style.border=v.border?`1px solid ${v.border}`:"",d.append(a,h),null},onHide:()=>{this.state="closed"},layout:r});let u;this.message.type===3?u=i.localize(9,"Error: {0}",this.message.content):this.message.type===2?u=i.localize(10,"Warning: {0}",this.message.content):u=i.localize(11,"Info: {0}",this.message.content),y.alert(u),this.state="open"}_hideMessage(){this.contextViewProvider&&(this.state==="open"&&this.contextViewProvider.hideContextView(),this.state="idle")}onValueChange(){this._onDidChange.fire(this.value),this.validate(),this.updateMirror(),this.input.classList.toggle("empty",!this.value),this.state==="open"&&this.contextViewProvider&&this.contextViewProvider.layout()}updateMirror(){if(!this.mirror)return;const a=this.value,u=a.charCodeAt(a.length-1)===10?" ":"";(a+u).replace(/\u000c/g,"")?this.mirror.textContent=a+u:this.mirror.innerText="\xA0",this.layout()}applyStyles(){const a=this.options.inputBoxStyles,r=a.inputBackground??"",u=a.inputForeground??"",C=a.inputBorder??"";this.element.style.backgroundColor=r,this.element.style.color=u,this.input.style.backgroundColor="inherit",this.input.style.color=u,this.element.style.border=`1px solid ${d.asCssValueWithDefault(C,"transparent")}`}layout(){if(!this.mirror)return;const a=this.cachedContentHeight;this.cachedContentHeight=d.getTotalHeight(this.mirror),a!==this.cachedContentHeight&&(this.cachedHeight=Math.min(this.cachedContentHeight,this.maxHeight),this.input.style.height=this.cachedHeight+"px",this._onDidHeightChange.fire(this.cachedContentHeight))}insertAtCursor(a){const r=this.inputElement,u=r.selectionStart,C=r.selectionEnd,f=r.value;u!==null&&C!==null&&(this.value=f.substr(0,u)+a+f.substr(C),r.setSelectionRange(u+1,u+1),this.layout())}dispose(){this._hideMessage(),this.message=null,this.actionbar?.dispose(),super.dispose()}}e.InputBox=g;class c extends g{constructor(a,r,u){const C=i.localize(12," or {0} for history","\u21C5"),f=i.localize(13," ({0} for history)","\u21C5");super(a,r,u),this._onDidFocus=this._register(new n.Emitter),this.onDidFocus=this._onDidFocus.event,this._onDidBlur=this._register(new n.Emitter),this.onDidBlur=this._onDidBlur.event,this.history=new o.HistoryNavigator(u.history,100);const h=()=>{if(u.showHistoryHint&&u.showHistoryHint()&&!this.placeholder.endsWith(C)&&!this.placeholder.endsWith(f)&&this.history.getHistory().length){const v=this.placeholder.endsWith(")")?C:f,w=this.placeholder+v;u.showPlaceholderOnFocus&&!d.isActiveElement(this.input)?this.placeholder=w:this.setPlaceHolder(w)}};this.observer=new MutationObserver((v,w)=>{v.forEach(S=>{S.target.textContent||h()})}),this.observer.observe(this.input,{attributeFilter:["class"]}),this.onfocus(this.input,()=>h()),this.onblur(this.input,()=>{const v=w=>{if(this.placeholder.endsWith(w)){const S=this.placeholder.slice(0,this.placeholder.length-w.length);return u.showPlaceholderOnFocus?this.placeholder=S:this.setPlaceHolder(S),!0}else return!1};v(f)||v(C)})}dispose(){super.dispose(),this.observer&&(this.observer.disconnect(),this.observer=void 0)}addToHistory(a){this.value&&(a||this.value!==this.getCurrentValue())&&this.history.add(this.value)}isAtLastInHistory(){return this.history.isLast()}isNowhereInHistory(){return this.history.isNowhere()}showNextValue(){this.history.has(this.value)||this.addToHistory();let a=this.getNextValue();a&&(a=a===this.value?this.getNextValue():a),this.value=a??"",y.status(this.value?this.value:i.localize(14,"Cleared Input"))}showPreviousValue(){this.history.has(this.value)||this.addToHistory();let a=this.getPreviousValue();a&&(a=a===this.value?this.getPreviousValue():a),a&&(this.value=a,y.status(this.value))}setPlaceHolder(a){super.setPlaceHolder(a),this.setTooltip(a)}onBlur(){super.onBlur(),this._onDidBlur.fire()}onFocus(){super.onFocus(),this._onDidFocus.fire()}getCurrentValue(){let a=this.history.current();return a||(a=this.history.last(),this.history.next()),a}getPreviousValue(){return this.history.previous()||this.history.first()}getNextValue(){return this.history.next()}}e.HistoryInputBox=c}),define(ne[260],se([1,0,5,358,259,85,6,3,2,44,304]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FindInput=void 0;const p=m.localize(1,"input");class n extends E.Widget{constructor(t,i,s){super(),this.fixFocusOnOptionClickEnabled=!0,this.imeSessionInProgress=!1,this.additionalTogglesDisposables=this._register(new _.MutableDisposable),this.additionalToggles=[],this._onDidOptionChange=this._register(new y.Emitter),this.onDidOptionChange=this._onDidOptionChange.event,this._onKeyDown=this._register(new y.Emitter),this.onKeyDown=this._onKeyDown.event,this._onMouseDown=this._register(new y.Emitter),this.onMouseDown=this._onMouseDown.event,this._onInput=this._register(new y.Emitter),this._onKeyUp=this._register(new y.Emitter),this._onCaseSensitiveKeyDown=this._register(new y.Emitter),this.onCaseSensitiveKeyDown=this._onCaseSensitiveKeyDown.event,this._onRegexKeyDown=this._register(new y.Emitter),this.onRegexKeyDown=this._onRegexKeyDown.event,this._lastHighlightFindOptions=0,this.placeholder=s.placeholder||"",this.validation=s.validation,this.label=s.label||p,this.showCommonFindToggles=!!s.showCommonFindToggles;const g=s.appendCaseSensitiveLabel||"",c=s.appendWholeWordsLabel||"",l=s.appendRegexLabel||"",a=s.history||[],r=!!s.flexibleHeight,u=!!s.flexibleWidth,C=s.flexibleMaxHeight;this.domNode=document.createElement("div"),this.domNode.classList.add("monaco-findInput"),this.inputBox=this._register(new I.HistoryInputBox(this.domNode,i,{placeholder:this.placeholder||"",ariaLabel:this.label||"",validationOptions:{validation:this.validation},history:a,showHistoryHint:s.showHistoryHint,flexibleHeight:r,flexibleWidth:u,flexibleMaxHeight:C,inputBoxStyles:s.inputBoxStyles}));const f=this._register((0,b.createInstantHoverDelegate)());if(this.showCommonFindToggles){this.regex=this._register(new k.RegexToggle({appendTitle:l,isChecked:!1,hoverDelegate:f,...s.toggleStyles})),this._register(this.regex.onChange(v=>{this._onDidOptionChange.fire(v),!v&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this._register(this.regex.onKeyDown(v=>{this._onRegexKeyDown.fire(v)})),this.wholeWords=this._register(new k.WholeWordsToggle({appendTitle:c,isChecked:!1,hoverDelegate:f,...s.toggleStyles})),this._register(this.wholeWords.onChange(v=>{this._onDidOptionChange.fire(v),!v&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this.caseSensitive=this._register(new k.CaseSensitiveToggle({appendTitle:g,isChecked:!1,hoverDelegate:f,...s.toggleStyles})),this._register(this.caseSensitive.onChange(v=>{this._onDidOptionChange.fire(v),!v&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this._register(this.caseSensitive.onKeyDown(v=>{this._onCaseSensitiveKeyDown.fire(v)}));const h=[this.caseSensitive.domNode,this.wholeWords.domNode,this.regex.domNode];this.onkeydown(this.domNode,v=>{if(v.equals(15)||v.equals(17)||v.equals(9)){const w=h.indexOf(this.domNode.ownerDocument.activeElement);if(w>=0){let S=-1;v.equals(17)?S=(w+1)%h.length:v.equals(15)&&(w===0?S=h.length-1:S=w-1),v.equals(9)?(h[w].blur(),this.inputBox.focus()):S>=0&&h[S].focus(),d.EventHelper.stop(v,!0)}}})}this.controls=document.createElement("div"),this.controls.className="controls",this.controls.style.display=this.showCommonFindToggles?"":"none",this.caseSensitive&&this.controls.append(this.caseSensitive.domNode),this.wholeWords&&this.controls.appendChild(this.wholeWords.domNode),this.regex&&this.controls.appendChild(this.regex.domNode),this.setAdditionalToggles(s?.additionalToggles),this.controls&&this.domNode.appendChild(this.controls),t?.appendChild(this.domNode),this._register(d.addDisposableListener(this.inputBox.inputElement,"compositionstart",h=>{this.imeSessionInProgress=!0})),this._register(d.addDisposableListener(this.inputBox.inputElement,"compositionend",h=>{this.imeSessionInProgress=!1,this._onInput.fire()})),this.onkeydown(this.inputBox.inputElement,h=>this._onKeyDown.fire(h)),this.onkeyup(this.inputBox.inputElement,h=>this._onKeyUp.fire(h)),this.oninput(this.inputBox.inputElement,h=>this._onInput.fire()),this.onmousedown(this.inputBox.inputElement,h=>this._onMouseDown.fire(h))}get onDidChange(){return this.inputBox.onDidChange}layout(t){this.inputBox.layout(),this.updateInputBoxPadding(t.collapsedFindWidget)}enable(){this.domNode.classList.remove("disabled"),this.inputBox.enable(),this.regex?.enable(),this.wholeWords?.enable(),this.caseSensitive?.enable();for(const t of this.additionalToggles)t.enable()}disable(){this.domNode.classList.add("disabled"),this.inputBox.disable(),this.regex?.disable(),this.wholeWords?.disable(),this.caseSensitive?.disable();for(const t of this.additionalToggles)t.disable()}setFocusInputOnOptionClick(t){this.fixFocusOnOptionClickEnabled=t}setEnabled(t){t?this.enable():this.disable()}setAdditionalToggles(t){for(const i of this.additionalToggles)i.domNode.remove();this.additionalToggles=[],this.additionalTogglesDisposables.value=new _.DisposableStore;for(const i of t??[])this.additionalTogglesDisposables.value.add(i),this.controls.appendChild(i.domNode),this.additionalTogglesDisposables.value.add(i.onChange(s=>{this._onDidOptionChange.fire(s),!s&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus()})),this.additionalToggles.push(i);this.additionalToggles.length>0&&(this.controls.style.display=""),this.updateInputBoxPadding()}updateInputBoxPadding(t=!1){t?this.inputBox.paddingRight=0:this.inputBox.paddingRight=(this.caseSensitive?.width()??0)+(this.wholeWords?.width()??0)+(this.regex?.width()??0)+this.additionalToggles.reduce((i,s)=>i+s.width(),0)}getValue(){return this.inputBox.value}setValue(t){this.inputBox.value!==t&&(this.inputBox.value=t)}select(){this.inputBox.select()}focus(){this.inputBox.focus()}getCaseSensitive(){return this.caseSensitive?.checked??!1}setCaseSensitive(t){this.caseSensitive&&(this.caseSensitive.checked=t)}getWholeWords(){return this.wholeWords?.checked??!1}setWholeWords(t){this.wholeWords&&(this.wholeWords.checked=t)}getRegex(){return this.regex?.checked??!1}setRegex(t){this.regex&&(this.regex.checked=t,this.validate())}focusOnCaseSensitive(){this.caseSensitive?.focus()}highlightFindOptions(){this.domNode.classList.remove("highlight-"+this._lastHighlightFindOptions),this._lastHighlightFindOptions=1-this._lastHighlightFindOptions,this.domNode.classList.add("highlight-"+this._lastHighlightFindOptions)}validate(){this.inputBox.validate()}showMessage(t){this.inputBox.showMessage(t)}clearMessage(){this.inputBox.hideMessage()}}e.FindInput=n}),define(ne[641],se([1,0,5,175,259,85,26,6,3,44,304]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReplaceInput=void 0;const p=_.localize(5,"input"),n=_.localize(6,"Preserve Case");class o extends k.Toggle{constructor(s){super({icon:y.Codicon.preserveCase,title:n+s.appendTitle,isChecked:s.isChecked,hoverDelegate:s.hoverDelegate??(0,b.getDefaultHoverDelegate)("element"),inputActiveOptionBorder:s.inputActiveOptionBorder,inputActiveOptionForeground:s.inputActiveOptionForeground,inputActiveOptionBackground:s.inputActiveOptionBackground})}}class t extends E.Widget{constructor(s,g,c,l){super(),this._showOptionButtons=c,this.fixFocusOnOptionClickEnabled=!0,this.cachedOptionsWidth=0,this._onDidOptionChange=this._register(new m.Emitter),this.onDidOptionChange=this._onDidOptionChange.event,this._onKeyDown=this._register(new m.Emitter),this.onKeyDown=this._onKeyDown.event,this._onMouseDown=this._register(new m.Emitter),this._onInput=this._register(new m.Emitter),this._onKeyUp=this._register(new m.Emitter),this._onPreserveCaseKeyDown=this._register(new m.Emitter),this.onPreserveCaseKeyDown=this._onPreserveCaseKeyDown.event,this.contextViewProvider=g,this.placeholder=l.placeholder||"",this.validation=l.validation,this.label=l.label||p;const a=l.appendPreserveCaseLabel||"",r=l.history||[],u=!!l.flexibleHeight,C=!!l.flexibleWidth,f=l.flexibleMaxHeight;this.domNode=document.createElement("div"),this.domNode.classList.add("monaco-findInput"),this.inputBox=this._register(new I.HistoryInputBox(this.domNode,this.contextViewProvider,{ariaLabel:this.label||"",placeholder:this.placeholder||"",validationOptions:{validation:this.validation},history:r,showHistoryHint:l.showHistoryHint,flexibleHeight:u,flexibleWidth:C,flexibleMaxHeight:f,inputBoxStyles:l.inputBoxStyles})),this.preserveCase=this._register(new o({appendTitle:a,isChecked:!1,...l.toggleStyles})),this._register(this.preserveCase.onChange(w=>{this._onDidOptionChange.fire(w),!w&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this._register(this.preserveCase.onKeyDown(w=>{this._onPreserveCaseKeyDown.fire(w)})),this._showOptionButtons?this.cachedOptionsWidth=this.preserveCase.width():this.cachedOptionsWidth=0;const h=[this.preserveCase.domNode];this.onkeydown(this.domNode,w=>{if(w.equals(15)||w.equals(17)||w.equals(9)){const S=h.indexOf(this.domNode.ownerDocument.activeElement);if(S>=0){let L=-1;w.equals(17)?L=(S+1)%h.length:w.equals(15)&&(S===0?L=h.length-1:L=S-1),w.equals(9)?(h[S].blur(),this.inputBox.focus()):L>=0&&h[L].focus(),d.EventHelper.stop(w,!0)}}});const v=document.createElement("div");v.className="controls",v.style.display=this._showOptionButtons?"block":"none",v.appendChild(this.preserveCase.domNode),this.domNode.appendChild(v),s?.appendChild(this.domNode),this.onkeydown(this.inputBox.inputElement,w=>this._onKeyDown.fire(w)),this.onkeyup(this.inputBox.inputElement,w=>this._onKeyUp.fire(w)),this.oninput(this.inputBox.inputElement,w=>this._onInput.fire()),this.onmousedown(this.inputBox.inputElement,w=>this._onMouseDown.fire(w))}enable(){this.domNode.classList.remove("disabled"),this.inputBox.enable(),this.preserveCase.enable()}disable(){this.domNode.classList.add("disabled"),this.inputBox.disable(),this.preserveCase.disable()}setEnabled(s){s?this.enable():this.disable()}select(){this.inputBox.select()}focus(){this.inputBox.focus()}getPreserveCase(){return this.preserveCase.checked}setPreserveCase(s){this.preserveCase.checked=s}focusOnPreserve(){this.preserveCase.focus()}validate(){this.inputBox?.validate()}set width(s){this.inputBox.paddingRight=this.cachedOptionsWidth,this.domNode.style.width=s+"px"}dispose(){super.dispose()}}e.ReplaceInput=t}),define(ne[642],se([1,0,64,69,5,47,77,87,151,353,86,41,14,26,191,30,142,2,16,11]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Menu=e.VerticalDirection=e.HorizontalDirection=e.MENU_ESCAPED_MNEMONIC_REGEX=e.MENU_MNEMONIC_REGEX=void 0,e.cleanMnemonic=w,e.formatRule=S,e.MENU_MNEMONIC_REGEX=/\(&([^\s&])\)|(^|[^&])&([^\s&])/,e.MENU_ESCAPED_MNEMONIC_REGEX=/(&)?(&)([^\s&])/g;var r;(function(D){D[D.Right=0]="Right",D[D.Left=1]="Left"})(r||(e.HorizontalDirection=r={}));var u;(function(D){D[D.Above=0]="Above",D[D.Below=1]="Below"})(u||(e.VerticalDirection=u={}));class C extends m.ActionBar{constructor(T,M,A,P){T.classList.add("monaco-menu-container"),T.setAttribute("role","presentation");const N=document.createElement("div");N.classList.add("monaco-menu"),N.setAttribute("role","presentation"),super(N,{orientation:1,actionViewItemProvider:W=>this.doGetActionViewItem(W,A,O),context:A.context,actionRunner:A.actionRunner,ariaLabel:A.ariaLabel,ariaRole:"menu",focusOnlyEnabledItems:!0,triggerKeys:{keys:[3,...l.isMacintosh||l.isLinux?[10]:[]],keyDown:!0}}),this.menuStyles=P,this.menuElement=N,this.actionsList.tabIndex=0,this.initializeOrUpdateStyleSheet(T,P),this._register(k.Gesture.addTarget(N)),this._register((0,I.addDisposableListener)(N,I.EventType.KEY_DOWN,W=>{new E.StandardKeyboardEvent(W).equals(2)&&W.preventDefault()})),A.enableMnemonics&&this._register((0,I.addDisposableListener)(N,I.EventType.KEY_DOWN,W=>{const V=W.key.toLocaleLowerCase();if(this.mnemonics.has(V)){I.EventHelper.stop(W,!0);const q=this.mnemonics.get(V);if(q.length===1&&(q[0]instanceof h&&q[0].container&&this.focusItemByElement(q[0].container),q[0].onClick(W)),q.length>1){const H=q.shift();H&&H.container&&(this.focusItemByElement(H.container),q.push(H)),this.mnemonics.set(V,q)}}})),l.isLinux&&this._register((0,I.addDisposableListener)(N,I.EventType.KEY_DOWN,W=>{const V=new E.StandardKeyboardEvent(W);V.equals(14)||V.equals(11)?(this.focusedItem=this.viewItems.length-1,this.focusNext(),I.EventHelper.stop(W,!0)):(V.equals(13)||V.equals(12))&&(this.focusedItem=0,this.focusPrevious(),I.EventHelper.stop(W,!0))})),this._register((0,I.addDisposableListener)(this.domNode,I.EventType.MOUSE_OUT,W=>{const V=W.relatedTarget;(0,I.isAncestor)(V,this.domNode)||(this.focusedItem=void 0,this.updateFocus(),W.stopPropagation())})),this._register((0,I.addDisposableListener)(this.actionsList,I.EventType.MOUSE_OVER,W=>{let V=W.target;if(!(!V||!(0,I.isAncestor)(V,this.actionsList)||V===this.actionsList)){for(;V.parentElement!==this.actionsList&&V.parentElement!==null;)V=V.parentElement;if(V.classList.contains("action-item")){const q=this.focusedItem;this.setFocusedItem(V),q!==this.focusedItem&&this.updateFocus()}}})),this._register(k.Gesture.addTarget(this.actionsList)),this._register((0,I.addDisposableListener)(this.actionsList,k.EventType.Tap,W=>{let V=W.initialTarget;if(!(!V||!(0,I.isAncestor)(V,this.actionsList)||V===this.actionsList)){for(;V.parentElement!==this.actionsList&&V.parentElement!==null;)V=V.parentElement;if(V.classList.contains("action-item")){const q=this.focusedItem;this.setFocusedItem(V),q!==this.focusedItem&&this.updateFocus()}}}));const O={parent:this};this.mnemonics=new Map,this.scrollableElement=this._register(new p.DomScrollableElement(N,{alwaysConsumeMouseWheel:!0,horizontal:2,vertical:3,verticalScrollbarSize:7,handleMouseWheel:!0,useShadows:!0}));const F=this.scrollableElement.getDomNode();F.style.position="",this.styleScrollElement(F,P),this._register((0,I.addDisposableListener)(N,k.EventType.Change,W=>{I.EventHelper.stop(W,!0);const V=this.scrollableElement.getScrollPosition().scrollTop;this.scrollableElement.setScrollPosition({scrollTop:V-W.translationY})})),this._register((0,I.addDisposableListener)(F,I.EventType.MOUSE_UP,W=>{W.preventDefault()}));const x=(0,I.getWindow)(T);N.style.maxHeight=`${Math.max(10,x.innerHeight-T.getBoundingClientRect().top-35)}px`,M=M.filter((W,V)=>A.submenuIds?.has(W.id)?(console.warn(`Found submenu cycle: ${W.id}`),!1):!(W instanceof n.Separator&&(V===M.length-1||V===0||M[V-1]instanceof n.Separator))),this.push(M,{icon:!0,label:!0,isMenu:!0}),T.appendChild(this.scrollableElement.getDomNode()),this.scrollableElement.scanDomNode(),this.viewItems.filter(W=>!(W instanceof v)).forEach((W,V,q)=>{W.updatePositionInSet(V+1,q.length)})}initializeOrUpdateStyleSheet(T,M){this.styleSheet||((0,I.isInShadowDOM)(T)?this.styleSheet=(0,I.createStyleSheet)(T):(C.globalStyleSheet||(C.globalStyleSheet=(0,I.createStyleSheet)()),this.styleSheet=C.globalStyleSheet)),this.styleSheet.textContent=L(M,(0,I.isInShadowDOM)(T))}styleScrollElement(T,M){const A=M.foregroundColor??"",P=M.backgroundColor??"",N=M.borderColor?`1px solid ${M.borderColor}`:"",O="5px",F=M.shadowColor?`0 2px 8px ${M.shadowColor}`:"";T.style.outline=N,T.style.borderRadius=O,T.style.color=A,T.style.backgroundColor=P,T.style.boxShadow=F}getContainer(){return this.scrollableElement.getDomNode()}get onScroll(){return this.scrollableElement.onScroll}focusItemByElement(T){const M=this.focusedItem;this.setFocusedItem(T),M!==this.focusedItem&&this.updateFocus()}setFocusedItem(T){for(let M=0;M{this.element&&(this._register((0,I.addDisposableListener)(this.element,I.EventType.MOUSE_UP,N=>{if(I.EventHelper.stop(N,!0),d.isFirefox){if(new y.StandardMouseEvent((0,I.getWindow)(this.element),N).rightButton)return;this.onClick(N)}else setTimeout(()=>{this.onClick(N)},0)})),this._register((0,I.addDisposableListener)(this.element,I.EventType.CONTEXT_MENU,N=>{I.EventHelper.stop(N,!0)})))},100),this._register(this.runOnceToEnableMouseUp)}render(T){super.render(T),this.element&&(this.container=T,this.item=(0,I.append)(this.element,(0,I.$)("a.action-menu-item")),this._action.id===n.Separator.ID?this.item.setAttribute("role","presentation"):(this.item.setAttribute("role","menuitem"),this.mnemonic&&this.item.setAttribute("aria-keyshortcuts",`${this.mnemonic}`)),this.check=(0,I.append)(this.item,(0,I.$)("span.menu-item-check"+s.ThemeIcon.asCSSSelector(t.Codicon.menuSelection))),this.check.setAttribute("role","none"),this.label=(0,I.append)(this.item,(0,I.$)("span.action-label")),this.options.label&&this.options.keybinding&&((0,I.append)(this.item,(0,I.$)("span.keybinding")).textContent=this.options.keybinding),this.runOnceToEnableMouseUp.schedule(),this.updateClass(),this.updateLabel(),this.updateTooltip(),this.updateEnabled(),this.updateChecked(),this.applyStyle())}blur(){super.blur(),this.applyStyle()}focus(){super.focus(),this.item?.focus(),this.applyStyle()}updatePositionInSet(T,M){this.item&&(this.item.setAttribute("aria-posinset",`${T}`),this.item.setAttribute("aria-setsize",`${M}`))}updateLabel(){if(this.label&&this.options.label){(0,I.clearNode)(this.label);let T=(0,g.stripIcons)(this.action.label);if(T){const M=w(T);this.options.enableMnemonics||(T=M),this.label.setAttribute("aria-label",M.replace(/&&/g,"&"));const A=e.MENU_MNEMONIC_REGEX.exec(T);if(A){T=a.escape(T),e.MENU_ESCAPED_MNEMONIC_REGEX.lastIndex=0;let P=e.MENU_ESCAPED_MNEMONIC_REGEX.exec(T);for(;P&&P[1];)P=e.MENU_ESCAPED_MNEMONIC_REGEX.exec(T);const N=O=>O.replace(/&&/g,"&");P?this.label.append(a.ltrim(N(T.substr(0,P.index))," "),(0,I.$)("u",{"aria-hidden":"true"},P[3]),a.rtrim(N(T.substr(P.index+P[0].length))," ")):this.label.innerText=N(T).trim(),this.item?.setAttribute("aria-keyshortcuts",(A[1]?A[1]:A[3]).toLocaleLowerCase())}else this.label.innerText=T.replace(/&&/g,"&").trim()}}}updateTooltip(){}updateClass(){this.cssClass&&this.item&&this.item.classList.remove(...this.cssClass.split(" ")),this.options.icon&&this.label?(this.cssClass=this.action.class||"",this.label.classList.add("icon"),this.cssClass&&this.label.classList.add(...this.cssClass.split(" ")),this.updateEnabled()):this.label&&this.label.classList.remove("icon")}updateEnabled(){this.action.enabled?(this.element&&(this.element.classList.remove("disabled"),this.element.removeAttribute("aria-disabled")),this.item&&(this.item.classList.remove("disabled"),this.item.removeAttribute("aria-disabled"),this.item.tabIndex=0)):(this.element&&(this.element.classList.add("disabled"),this.element.setAttribute("aria-disabled","true")),this.item&&(this.item.classList.add("disabled"),this.item.setAttribute("aria-disabled","true")))}updateChecked(){if(!this.item)return;const T=this.action.checked;this.item.classList.toggle("checked",!!T),T!==void 0?(this.item.setAttribute("role","menuitemcheckbox"),this.item.setAttribute("aria-checked",T?"true":"false")):(this.item.setAttribute("role","menuitem"),this.item.setAttribute("aria-checked",""))}getMnemonic(){return this.mnemonic}applyStyle(){const T=this.element&&this.element.classList.contains("focused"),M=T&&this.menuStyle.selectionForegroundColor?this.menuStyle.selectionForegroundColor:this.menuStyle.foregroundColor,A=T&&this.menuStyle.selectionBackgroundColor?this.menuStyle.selectionBackgroundColor:void 0,P=T&&this.menuStyle.selectionBorderColor?`1px solid ${this.menuStyle.selectionBorderColor}`:"",N=T&&this.menuStyle.selectionBorderColor?"-1px":"";this.item&&(this.item.style.color=M??"",this.item.style.backgroundColor=A??"",this.item.style.outline=P,this.item.style.outlineOffset=N),this.check&&(this.check.style.color=M??"")}}class h extends f{constructor(T,M,A,P,N){super(T,T,P,N),this.submenuActions=M,this.parentData=A,this.submenuOptions=P,this.mysubmenu=null,this.submenuDisposables=this._register(new c.DisposableStore),this.mouseOver=!1,this.expandDirection=P&&P.expandDirection!==void 0?P.expandDirection:{horizontal:r.Right,vertical:u.Below},this.showScheduler=new o.RunOnceScheduler(()=>{this.mouseOver&&(this.cleanupExistingSubmenu(!1),this.createSubmenu(!1))},250),this.hideScheduler=new o.RunOnceScheduler(()=>{this.element&&!(0,I.isAncestor)((0,I.getActiveElement)(),this.element)&&this.parentData.submenu===this.mysubmenu&&(this.parentData.parent.focus(!1),this.cleanupExistingSubmenu(!0))},750)}render(T){super.render(T),this.element&&(this.item&&(this.item.classList.add("monaco-submenu-item"),this.item.tabIndex=0,this.item.setAttribute("aria-haspopup","true"),this.updateAriaExpanded("false"),this.submenuIndicator=(0,I.append)(this.item,(0,I.$)("span.submenu-indicator"+s.ThemeIcon.asCSSSelector(t.Codicon.menuSubmenu))),this.submenuIndicator.setAttribute("aria-hidden","true")),this._register((0,I.addDisposableListener)(this.element,I.EventType.KEY_UP,M=>{const A=new E.StandardKeyboardEvent(M);(A.equals(17)||A.equals(3))&&(I.EventHelper.stop(M,!0),this.createSubmenu(!0))})),this._register((0,I.addDisposableListener)(this.element,I.EventType.KEY_DOWN,M=>{const A=new E.StandardKeyboardEvent(M);(0,I.getActiveElement)()===this.item&&(A.equals(17)||A.equals(3))&&I.EventHelper.stop(M,!0)})),this._register((0,I.addDisposableListener)(this.element,I.EventType.MOUSE_OVER,M=>{this.mouseOver||(this.mouseOver=!0,this.showScheduler.schedule())})),this._register((0,I.addDisposableListener)(this.element,I.EventType.MOUSE_LEAVE,M=>{this.mouseOver=!1})),this._register((0,I.addDisposableListener)(this.element,I.EventType.FOCUS_OUT,M=>{this.element&&!(0,I.isAncestor)((0,I.getActiveElement)(),this.element)&&this.hideScheduler.schedule()})),this._register(this.parentData.parent.onScroll(()=>{this.parentData.submenu===this.mysubmenu&&(this.parentData.parent.focus(!1),this.cleanupExistingSubmenu(!0))})))}updateEnabled(){}onClick(T){I.EventHelper.stop(T,!0),this.cleanupExistingSubmenu(!1),this.createSubmenu(!0)}cleanupExistingSubmenu(T){if(this.parentData.submenu&&(T||this.parentData.submenu!==this.mysubmenu)){try{this.parentData.submenu.dispose()}catch{}this.parentData.submenu=void 0,this.updateAriaExpanded("false"),this.submenuContainer&&(this.submenuDisposables.clear(),this.submenuContainer=void 0)}}calculateSubmenuMenuLayout(T,M,A,P){const N={top:0,left:0};return N.left=(0,b.layout)(T.width,M.width,{position:P.horizontal===r.Right?0:1,offset:A.left,size:A.width}),N.left>=A.left&&N.left{new E.StandardKeyboardEvent(V).equals(15)&&(I.EventHelper.stop(V,!0),this.parentData.parent.focus(),this.cleanupExistingSubmenu(!0))})),this.submenuDisposables.add((0,I.addDisposableListener)(this.submenuContainer,I.EventType.KEY_DOWN,V=>{new E.StandardKeyboardEvent(V).equals(15)&&I.EventHelper.stop(V,!0)})),this.submenuDisposables.add(this.parentData.submenu.onDidCancel(()=>{this.parentData.parent.focus(),this.cleanupExistingSubmenu(!0)})),this.parentData.submenu.focus(T),this.mysubmenu=this.parentData.submenu}}updateAriaExpanded(T){this.item&&this.item?.setAttribute("aria-expanded",T)}applyStyle(){super.applyStyle();const M=this.element&&this.element.classList.contains("focused")&&this.menuStyle.selectionForegroundColor?this.menuStyle.selectionForegroundColor:this.menuStyle.foregroundColor;this.submenuIndicator&&(this.submenuIndicator.style.color=M??"")}dispose(){super.dispose(),this.hideScheduler.dispose(),this.mysubmenu&&(this.mysubmenu.dispose(),this.mysubmenu=null),this.submenuContainer&&(this.submenuContainer=void 0)}}class v extends _.ActionViewItem{constructor(T,M,A,P){super(T,M,A),this.menuStyles=P}render(T){super.render(T),this.label&&(this.label.style.borderBottomColor=this.menuStyles.separatorColor?`${this.menuStyles.separatorColor}`:"")}}function w(D){const T=e.MENU_MNEMONIC_REGEX,M=T.exec(D);if(!M)return D;const A=!M[1];return D.replace(T,A?"$2$3":"").trim()}function S(D){const T=(0,i.getCodiconFontCharacters)()[D.id];return`.codicon-${D.id}:before { content: '\\${T.toString(16)}'; }`}function L(D,T){let M=` -.monaco-menu { - font-size: 13px; - border-radius: 5px; - min-width: 160px; -} - -${S(t.Codicon.menuSelection)} -${S(t.Codicon.menuSubmenu)} - -.monaco-menu .monaco-action-bar { - text-align: right; - overflow: hidden; - white-space: nowrap; -} - -.monaco-menu .monaco-action-bar .actions-container { - display: flex; - margin: 0 auto; - padding: 0; - width: 100%; - justify-content: flex-end; -} - -.monaco-menu .monaco-action-bar.vertical .actions-container { - display: inline-block; -} - -.monaco-menu .monaco-action-bar.reverse .actions-container { - flex-direction: row-reverse; -} - -.monaco-menu .monaco-action-bar .action-item { - cursor: pointer; - display: inline-block; - transition: transform 50ms ease; - position: relative; /* DO NOT REMOVE - this is the key to preventing the ghosting icon bug in Chrome 42 */ -} - -.monaco-menu .monaco-action-bar .action-item.disabled { - cursor: default; -} - -.monaco-menu .monaco-action-bar .action-item .icon, -.monaco-menu .monaco-action-bar .action-item .codicon { - display: inline-block; -} - -.monaco-menu .monaco-action-bar .action-item .codicon { - display: flex; - align-items: center; -} - -.monaco-menu .monaco-action-bar .action-label { - font-size: 11px; - margin-right: 4px; -} - -.monaco-menu .monaco-action-bar .action-item.disabled .action-label, -.monaco-menu .monaco-action-bar .action-item.disabled .action-label:hover { - color: var(--vscode-disabledForeground); -} - -/* Vertical actions */ - -.monaco-menu .monaco-action-bar.vertical { - text-align: left; -} - -.monaco-menu .monaco-action-bar.vertical .action-item { - display: block; -} - -.monaco-menu .monaco-action-bar.vertical .action-label.separator { - display: block; - border-bottom: 1px solid var(--vscode-menu-separatorBackground); - padding-top: 1px; - padding: 30px; -} - -.monaco-menu .secondary-actions .monaco-action-bar .action-label { - margin-left: 6px; -} - -/* Action Items */ -.monaco-menu .monaco-action-bar .action-item.select-container { - overflow: hidden; /* somehow the dropdown overflows its container, we prevent it here to not push */ - flex: 1; - max-width: 170px; - min-width: 60px; - display: flex; - align-items: center; - justify-content: center; - margin-right: 10px; -} - -.monaco-menu .monaco-action-bar.vertical { - margin-left: 0; - overflow: visible; -} - -.monaco-menu .monaco-action-bar.vertical .actions-container { - display: block; -} - -.monaco-menu .monaco-action-bar.vertical .action-item { - padding: 0; - transform: none; - display: flex; -} - -.monaco-menu .monaco-action-bar.vertical .action-item.active { - transform: none; -} - -.monaco-menu .monaco-action-bar.vertical .action-menu-item { - flex: 1 1 auto; - display: flex; - height: 2em; - align-items: center; - position: relative; - margin: 0 4px; - border-radius: 4px; -} - -.monaco-menu .monaco-action-bar.vertical .action-menu-item:hover .keybinding, -.monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .keybinding { - opacity: unset; -} - -.monaco-menu .monaco-action-bar.vertical .action-label { - flex: 1 1 auto; - text-decoration: none; - padding: 0 1em; - background: none; - font-size: 12px; - line-height: 1; -} - -.monaco-menu .monaco-action-bar.vertical .keybinding, -.monaco-menu .monaco-action-bar.vertical .submenu-indicator { - display: inline-block; - flex: 2 1 auto; - padding: 0 1em; - text-align: right; - font-size: 12px; - line-height: 1; -} - -.monaco-menu .monaco-action-bar.vertical .submenu-indicator { - height: 100%; -} - -.monaco-menu .monaco-action-bar.vertical .submenu-indicator.codicon { - font-size: 16px !important; - display: flex; - align-items: center; -} - -.monaco-menu .monaco-action-bar.vertical .submenu-indicator.codicon::before { - margin-left: auto; - margin-right: -20px; -} - -.monaco-menu .monaco-action-bar.vertical .action-item.disabled .keybinding, -.monaco-menu .monaco-action-bar.vertical .action-item.disabled .submenu-indicator { - opacity: 0.4; -} - -.monaco-menu .monaco-action-bar.vertical .action-label:not(.separator) { - display: inline-block; - box-sizing: border-box; - margin: 0; -} - -.monaco-menu .monaco-action-bar.vertical .action-item { - position: static; - overflow: visible; -} - -.monaco-menu .monaco-action-bar.vertical .action-item .monaco-submenu { - position: absolute; -} - -.monaco-menu .monaco-action-bar.vertical .action-label.separator { - width: 100%; - height: 0px !important; - opacity: 1; -} - -.monaco-menu .monaco-action-bar.vertical .action-label.separator.text { - padding: 0.7em 1em 0.1em 1em; - font-weight: bold; - opacity: 1; -} - -.monaco-menu .monaco-action-bar.vertical .action-label:hover { - color: inherit; -} - -.monaco-menu .monaco-action-bar.vertical .menu-item-check { - position: absolute; - visibility: hidden; - width: 1em; - height: 100%; -} - -.monaco-menu .monaco-action-bar.vertical .action-menu-item.checked .menu-item-check { - visibility: visible; - display: flex; - align-items: center; - justify-content: center; -} - -/* Context Menu */ - -.context-view.monaco-menu-container { - outline: 0; - border: none; - animation: fadeIn 0.083s linear; - -webkit-app-region: no-drag; -} - -.context-view.monaco-menu-container :focus, -.context-view.monaco-menu-container .monaco-action-bar.vertical:focus, -.context-view.monaco-menu-container .monaco-action-bar.vertical :focus { - outline: 0; -} - -.hc-black .context-view.monaco-menu-container, -.hc-light .context-view.monaco-menu-container, -:host-context(.hc-black) .context-view.monaco-menu-container, -:host-context(.hc-light) .context-view.monaco-menu-container { - box-shadow: none; -} - -.hc-black .monaco-menu .monaco-action-bar.vertical .action-item.focused, -.hc-light .monaco-menu .monaco-action-bar.vertical .action-item.focused, -:host-context(.hc-black) .monaco-menu .monaco-action-bar.vertical .action-item.focused, -:host-context(.hc-light) .monaco-menu .monaco-action-bar.vertical .action-item.focused { - background: none; -} - -/* Vertical Action Bar Styles */ - -.monaco-menu .monaco-action-bar.vertical { - padding: 4px 0; -} - -.monaco-menu .monaco-action-bar.vertical .action-menu-item { - height: 2em; -} - -.monaco-menu .monaco-action-bar.vertical .action-label:not(.separator), -.monaco-menu .monaco-action-bar.vertical .keybinding { - font-size: inherit; - padding: 0 2em; - max-height: 100%; -} - -.monaco-menu .monaco-action-bar.vertical .menu-item-check { - font-size: inherit; - width: 2em; -} - -.monaco-menu .monaco-action-bar.vertical .action-label.separator { - font-size: inherit; - margin: 5px 0 !important; - padding: 0; - border-radius: 0; -} - -.linux .monaco-menu .monaco-action-bar.vertical .action-label.separator, -:host-context(.linux) .monaco-menu .monaco-action-bar.vertical .action-label.separator { - margin-left: 0; - margin-right: 0; -} - -.monaco-menu .monaco-action-bar.vertical .submenu-indicator { - font-size: 60%; - padding: 0 1.8em; -} - -.linux .monaco-menu .monaco-action-bar.vertical .submenu-indicator, -:host-context(.linux) .monaco-menu .monaco-action-bar.vertical .submenu-indicator { - height: 100%; - mask-size: 10px 10px; - -webkit-mask-size: 10px 10px; -} - -.monaco-menu .action-item { - cursor: default; -}`;if(T){M+=` - /* Arrows */ - .monaco-scrollable-element > .scrollbar > .scra { - cursor: pointer; - font-size: 11px !important; - } - - .monaco-scrollable-element > .visible { - opacity: 1; - - /* Background rule added for IE9 - to allow clicks on dom node */ - background:rgba(0,0,0,0); - - transition: opacity 100ms linear; - } - .monaco-scrollable-element > .invisible { - opacity: 0; - pointer-events: none; - } - .monaco-scrollable-element > .invisible.fade { - transition: opacity 800ms linear; - } - - /* Scrollable Content Inset Shadow */ - .monaco-scrollable-element > .shadow { - position: absolute; - display: none; - } - .monaco-scrollable-element > .shadow.top { - display: block; - top: 0; - left: 3px; - height: 3px; - width: 100%; - } - .monaco-scrollable-element > .shadow.left { - display: block; - top: 3px; - left: 0; - height: 100%; - width: 3px; - } - .monaco-scrollable-element > .shadow.top-left-corner { - display: block; - top: 0; - left: 0; - height: 3px; - width: 3px; - } - `;const A=D.scrollbarShadow;A&&(M+=` - .monaco-scrollable-element > .shadow.top { - box-shadow: ${A} 0 6px 6px -6px inset; - } - - .monaco-scrollable-element > .shadow.left { - box-shadow: ${A} 6px 0 6px -6px inset; - } - - .monaco-scrollable-element > .shadow.top.left { - box-shadow: ${A} 6px 6px 6px -6px inset; - } - `);const P=D.scrollbarSliderBackground;P&&(M+=` - .monaco-scrollable-element > .scrollbar > .slider { - background: ${P}; - } - `);const N=D.scrollbarSliderHoverBackground;N&&(M+=` - .monaco-scrollable-element > .scrollbar > .slider:hover { - background: ${N}; - } - `);const O=D.scrollbarSliderActiveBackground;O&&(M+=` - .monaco-scrollable-element > .scrollbar > .slider.active { - background: ${O}; - } - `)}return M}}),define(ne[643],se([1,0,87,359,41,26,30,6,2,3,44,477]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ToggleMenuAction=e.ToolBar=void 0;class n extends _.Disposable{constructor(i,s,g={orientation:0}){super(),this.submenuActionViewItems=[],this.hasSecondaryActions=!1,this._onDidChangeDropdownVisibility=this._register(new m.EventMultiplexer),this.onDidChangeDropdownVisibility=this._onDidChangeDropdownVisibility.event,this.disposables=this._register(new _.DisposableStore),g.hoverDelegate=g.hoverDelegate??this._register((0,p.createInstantHoverDelegate)()),this.options=g,this.toggleMenuAction=this._register(new o(()=>this.toggleMenuActionViewItem?.show(),g.toggleMenuTitle)),this.element=document.createElement("div"),this.element.className="monaco-toolbar",i.appendChild(this.element),this.actionBar=this._register(new d.ActionBar(this.element,{orientation:g.orientation,ariaLabel:g.ariaLabel,actionRunner:g.actionRunner,allowContextMenu:g.allowContextMenu,highlightToggledItems:g.highlightToggledItems,hoverDelegate:g.hoverDelegate,actionViewItemProvider:(c,l)=>{if(c.id===o.ID)return this.toggleMenuActionViewItem=new k.DropdownMenuActionViewItem(c,c.menuActions,s,{actionViewItemProvider:this.options.actionViewItemProvider,actionRunner:this.actionRunner,keybindingProvider:this.options.getKeyBinding,classNames:y.ThemeIcon.asClassNameArray(g.moreIcon??E.Codicon.toolBarMore),anchorAlignmentProvider:this.options.anchorAlignmentProvider,menuAsChild:!!this.options.renderDropdownAsChildElement,skipTelemetry:this.options.skipTelemetry,isMenu:!0,hoverDelegate:this.options.hoverDelegate}),this.toggleMenuActionViewItem.setActionContext(this.actionBar.context),this.disposables.add(this._onDidChangeDropdownVisibility.add(this.toggleMenuActionViewItem.onDidChangeVisibility)),this.toggleMenuActionViewItem;if(g.actionViewItemProvider){const a=g.actionViewItemProvider(c,l);if(a)return a}if(c instanceof I.SubmenuAction){const a=new k.DropdownMenuActionViewItem(c,c.actions,s,{actionViewItemProvider:this.options.actionViewItemProvider,actionRunner:this.actionRunner,keybindingProvider:this.options.getKeyBinding,classNames:c.class,anchorAlignmentProvider:this.options.anchorAlignmentProvider,menuAsChild:!!this.options.renderDropdownAsChildElement,skipTelemetry:this.options.skipTelemetry,hoverDelegate:this.options.hoverDelegate});return a.setActionContext(this.actionBar.context),this.submenuActionViewItems.push(a),this.disposables.add(this._onDidChangeDropdownVisibility.add(a.onDidChangeVisibility)),a}}}))}set actionRunner(i){this.actionBar.actionRunner=i}get actionRunner(){return this.actionBar.actionRunner}getElement(){return this.element}getItemAction(i){return this.actionBar.getAction(i)}setActions(i,s){this.clear();const g=i?i.slice(0):[];this.hasSecondaryActions=!!(s&&s.length>0),this.hasSecondaryActions&&s&&(this.toggleMenuAction.menuActions=s.slice(0),g.push(this.toggleMenuAction)),g.forEach(c=>{this.actionBar.push(c,{icon:this.options.icon??!0,label:this.options.label??!1,keybinding:this.getKeybindingLabel(c)})})}getKeybindingLabel(i){return this.options.getKeyBinding?.(i)?.getLabel()??void 0}clear(){this.submenuActionViewItems=[],this.disposables.clear(),this.actionBar.clear()}dispose(){this.clear(),this.disposables.dispose(),super.dispose()}}e.ToolBar=n;class o extends I.Action{static{this.ID="toolbar.toggle.more"}constructor(i,s){s=s||b.localize(17,"More Actions..."),super(o.ID,s,void 0,!0),this._menuActions=[],this.toggleDropdownMenu=i}async run(){this.toggleDropdownMenu()}get menuActions(){return this._menuActions}set menuActions(i){this._menuActions=i}}e.ToggleMenuAction=o}),define(ne[176],se([1,0,5,93,47,87,260,259,257,115,175,249,159,41,13,14,26,30,45,6,82,2,141,19,3,44,21,46,478]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractTree=e.TreeFindMatchType=e.TreeFindMode=e.FuzzyToggle=e.ModeToggle=e.TreeRenderer=e.RenderIndentGuides=e.ComposedTreeDelegate=void 0;class L extends _.ElementsDragAndDropData{constructor(B){super(B.elements.map($=>$.element)),this.data=B}}function D(X){return X instanceof _.ElementsDragAndDropData?new L(X):X}class T{constructor(B,$){this.modelProvider=B,this.dnd=$,this.autoExpandDisposable=u.Disposable.None,this.disposables=new u.DisposableStore}getDragURI(B){return this.dnd.getDragURI(B.element)}getDragLabel(B,$){if(this.dnd.getDragLabel)return this.dnd.getDragLabel(B.map(Q=>Q.element),$)}onDragStart(B,$){this.dnd.onDragStart?.(D(B),$)}onDragOver(B,$,Q,Z,te,re=!0){const le=this.dnd.onDragOver(D(B),$&&$.element,Q,Z,te),me=this.autoExpandNode!==$;if(me&&(this.autoExpandDisposable.dispose(),this.autoExpandNode=$),typeof $>"u")return le;if(me&&typeof le!="boolean"&&le.autoExpand&&(this.autoExpandDisposable=(0,s.disposableTimeout)(()=>{const Me=this.modelProvider(),Ae=Me.getNodeLocation($);Me.isCollapsed(Ae)&&Me.setCollapsed(Ae,!1),this.autoExpandNode=void 0},500,this.disposables)),typeof le=="boolean"||!le.accept||typeof le.bubble>"u"||le.feedback){if(!re){const Me=typeof le=="boolean"?le:le.accept,Ae=typeof le=="boolean"?void 0:le.effect;return{accept:Me,effect:Ae,feedback:[Q]}}return le}if(le.bubble===1){const Me=this.modelProvider(),Ae=Me.getNodeLocation($),Ne=Me.getParentNodeLocation(Ae),Ke=Me.getNode(Ne),ze=Ne&&Me.getListIndex(Ne);return this.onDragOver(B,Ke,ze,Z,te,!1)}const Ce=this.modelProvider(),ye=Ce.getNodeLocation($),Le=Ce.getListIndex(ye),Ee=Ce.getListRenderCount(ye);return{...le,feedback:(0,i.range)(Le,Le+Ee)}}drop(B,$,Q,Z,te){this.autoExpandDisposable.dispose(),this.autoExpandNode=void 0,this.dnd.drop(D(B),$&&$.element,Q,Z,te)}onDragEnd(B){this.dnd.onDragEnd?.(B)}dispose(){this.disposables.dispose(),this.dnd.dispose()}}function M(X,B){return B&&{...B,identityProvider:B.identityProvider&&{getId($){return B.identityProvider.getId($.element)}},dnd:B.dnd&&new T(X,B.dnd),multipleSelectionController:B.multipleSelectionController&&{isSelectionSingleChangeEvent($){return B.multipleSelectionController.isSelectionSingleChangeEvent({...$,element:$.element})},isSelectionRangeChangeEvent($){return B.multipleSelectionController.isSelectionRangeChangeEvent({...$,element:$.element})}},accessibilityProvider:B.accessibilityProvider&&{...B.accessibilityProvider,getSetSize($){const Q=X(),Z=Q.getNodeLocation($),te=Q.getParentNodeLocation(Z);return Q.getNode(te).visibleChildrenCount},getPosInSet($){return $.visibleChildIndex+1},isChecked:B.accessibilityProvider&&B.accessibilityProvider.isChecked?$=>B.accessibilityProvider.isChecked($.element):void 0,getRole:B.accessibilityProvider&&B.accessibilityProvider.getRole?$=>B.accessibilityProvider.getRole($.element):()=>"treeitem",getAriaLabel($){return B.accessibilityProvider.getAriaLabel($.element)},getWidgetAriaLabel(){return B.accessibilityProvider.getWidgetAriaLabel()},getWidgetRole:B.accessibilityProvider&&B.accessibilityProvider.getWidgetRole?()=>B.accessibilityProvider.getWidgetRole():()=>"tree",getAriaLevel:B.accessibilityProvider&&B.accessibilityProvider.getAriaLevel?$=>B.accessibilityProvider.getAriaLevel($.element):$=>$.depth,getActiveDescendantId:B.accessibilityProvider.getActiveDescendantId&&($=>B.accessibilityProvider.getActiveDescendantId($.element))},keyboardNavigationLabelProvider:B.keyboardNavigationLabelProvider&&{...B.keyboardNavigationLabelProvider,getKeyboardNavigationLabel($){return B.keyboardNavigationLabelProvider.getKeyboardNavigationLabel($.element)}}}}class A{constructor(B){this.delegate=B}getHeight(B){return this.delegate.getHeight(B.element)}getTemplateId(B){return this.delegate.getTemplateId(B.element)}hasDynamicHeight(B){return!!this.delegate.hasDynamicHeight&&this.delegate.hasDynamicHeight(B.element)}setDynamicHeight(B,$){this.delegate.setDynamicHeight?.(B.element,$)}}e.ComposedTreeDelegate=A;var P;(function(X){X.None="none",X.OnHover="onHover",X.Always="always"})(P||(e.RenderIndentGuides=P={}));class N{get elements(){return this._elements}constructor(B,$=[]){this._elements=$,this.disposables=new u.DisposableStore,this.onDidChange=a.Event.forEach(B,Q=>this._elements=Q,this.disposables)}dispose(){this.disposables.dispose()}}class O{static{this.DefaultIndent=8}constructor(B,$,Q,Z,te,re={}){this.renderer=B,this.modelProvider=$,this.activeNodes=Z,this.renderedIndentGuides=te,this.renderedElements=new Map,this.renderedNodes=new Map,this.indent=O.DefaultIndent,this.hideTwistiesOfChildlessElements=!1,this.shouldRenderIndentGuides=!1,this.activeIndentNodes=new Set,this.indentGuidesDisposable=u.Disposable.None,this.disposables=new u.DisposableStore,this.templateId=B.templateId,this.updateOptions(re),a.Event.map(Q,le=>le.node)(this.onDidChangeNodeTwistieState,this,this.disposables),B.onDidChangeTwistieState?.(this.onDidChangeTwistieState,this,this.disposables)}updateOptions(B={}){if(typeof B.indent<"u"){const $=(0,C.clamp)(B.indent,0,40);if($!==this.indent){this.indent=$;for(const[Q,Z]of this.renderedNodes)this.renderTreeElement(Q,Z)}}if(typeof B.renderIndentGuides<"u"){const $=B.renderIndentGuides!==P.None;if($!==this.shouldRenderIndentGuides){this.shouldRenderIndentGuides=$;for(const[Q,Z]of this.renderedNodes)this._renderIndentGuides(Q,Z);if(this.indentGuidesDisposable.dispose(),$){const Q=new u.DisposableStore;this.activeNodes.onDidChange(this._onDidChangeActiveNodes,this,Q),this.indentGuidesDisposable=Q,this._onDidChangeActiveNodes(this.activeNodes.elements)}}}typeof B.hideTwistiesOfChildlessElements<"u"&&(this.hideTwistiesOfChildlessElements=B.hideTwistiesOfChildlessElements)}renderTemplate(B){const $=(0,d.append)(B,(0,d.$)(".monaco-tl-row")),Q=(0,d.append)($,(0,d.$)(".monaco-tl-indent")),Z=(0,d.append)($,(0,d.$)(".monaco-tl-twistie")),te=(0,d.append)($,(0,d.$)(".monaco-tl-contents")),re=this.renderer.renderTemplate(te);return{container:B,indent:Q,twistie:Z,indentGuidesDisposable:u.Disposable.None,templateData:re}}renderElement(B,$,Q,Z){this.renderedNodes.set(B,Q),this.renderedElements.set(B.element,B),this.renderTreeElement(B,Q),this.renderer.renderElement(B,$,Q.templateData,Z)}disposeElement(B,$,Q,Z){Q.indentGuidesDisposable.dispose(),this.renderer.disposeElement?.(B,$,Q.templateData,Z),typeof Z=="number"&&(this.renderedNodes.delete(B),this.renderedElements.delete(B.element))}disposeTemplate(B){this.renderer.disposeTemplate(B.templateData)}onDidChangeTwistieState(B){const $=this.renderedElements.get(B);$&&this.onDidChangeNodeTwistieState($)}onDidChangeNodeTwistieState(B){const $=this.renderedNodes.get(B);$&&(this._onDidChangeActiveNodes(this.activeNodes.elements),this.renderTreeElement(B,$))}renderTreeElement(B,$){const Q=O.DefaultIndent+(B.depth-1)*this.indent;$.twistie.style.paddingLeft=`${Q}px`,$.indent.style.width=`${Q+this.indent-16}px`,B.collapsible?$.container.setAttribute("aria-expanded",String(!B.collapsed)):$.container.removeAttribute("aria-expanded"),$.twistie.classList.remove(...c.ThemeIcon.asClassNameArray(g.Codicon.treeItemExpanded));let Z=!1;this.renderer.renderTwistie&&(Z=this.renderer.renderTwistie(B.element,$.twistie)),B.collapsible&&(!this.hideTwistiesOfChildlessElements||B.visibleChildrenCount>0)?(Z||$.twistie.classList.add(...c.ThemeIcon.asClassNameArray(g.Codicon.treeItemExpanded)),$.twistie.classList.add("collapsible"),$.twistie.classList.toggle("collapsed",B.collapsed)):$.twistie.classList.remove("collapsible","collapsed"),this._renderIndentGuides(B,$)}_renderIndentGuides(B,$){if((0,d.clearNode)($.indent),$.indentGuidesDisposable.dispose(),!this.shouldRenderIndentGuides)return;const Q=new u.DisposableStore,Z=this.modelProvider();for(;;){const te=Z.getNodeLocation(B),re=Z.getParentNodeLocation(te);if(!re)break;const le=Z.getNode(re),me=(0,d.$)(".indent-guide",{style:`width: ${this.indent}px`});this.activeIndentNodes.has(le)&&me.classList.add("active"),$.indent.childElementCount===0?$.indent.appendChild(me):$.indent.insertBefore(me,$.indent.firstElementChild),this.renderedIndentGuides.add(le,me),Q.add((0,u.toDisposable)(()=>this.renderedIndentGuides.delete(le,me))),B=le}$.indentGuidesDisposable=Q}_onDidChangeActiveNodes(B){if(!this.shouldRenderIndentGuides)return;const $=new Set,Q=this.modelProvider();B.forEach(Z=>{const te=Q.getNodeLocation(Z);try{const re=Q.getParentNodeLocation(te);Z.collapsible&&Z.children.length>0&&!Z.collapsed?$.add(Z):re&&$.add(Q.getNode(re))}catch{}}),this.activeIndentNodes.forEach(Z=>{$.has(Z)||this.renderedIndentGuides.forEach(Z,te=>te.classList.remove("active"))}),$.forEach(Z=>{this.activeIndentNodes.has(Z)||this.renderedIndentGuides.forEach(Z,te=>te.classList.add("active"))}),this.activeIndentNodes=$}dispose(){this.renderedNodes.clear(),this.renderedElements.clear(),this.indentGuidesDisposable.dispose(),(0,u.dispose)(this.disposables)}}e.TreeRenderer=O;class F{get totalCount(){return this._totalCount}get matchCount(){return this._matchCount}constructor(B,$,Q){this.tree=B,this.keyboardNavigationLabelProvider=$,this._filter=Q,this._totalCount=0,this._matchCount=0,this._pattern="",this._lowercasePattern="",this.disposables=new u.DisposableStore,B.onWillRefilter(this.reset,this,this.disposables)}filter(B,$){let Q=1;if(this._filter){const re=this._filter.filter(B,$);if(typeof re=="boolean"?Q=re?1:0:(0,n.isFilterResult)(re)?Q=(0,n.getVisibleState)(re.visibility):Q=re,Q===0)return!1}if(this._totalCount++,!this._pattern)return this._matchCount++,{data:r.FuzzyScore.Default,visibility:Q};const Z=this.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(B),te=Array.isArray(Z)?Z:[Z];for(const re of te){const le=re&&re.toString();if(typeof le>"u")return{data:r.FuzzyScore.Default,visibility:Q};let me;if(this.tree.findMatchType===H.Contiguous){const Ce=le.toLowerCase().indexOf(this._lowercasePattern);if(Ce>-1){me=[Number.MAX_SAFE_INTEGER,0];for(let ye=this._lowercasePattern.length;ye>0;ye--)me.push(Ce+ye-1)}}else me=(0,r.fuzzyScore)(this._pattern,this._lowercasePattern,0,le,le.toLowerCase(),0,{firstMatchCanBeWeak:!0,boostFullMatch:!0});if(me)return this._matchCount++,te.length===1?{data:me,visibility:Q}:{data:{label:le,score:me},visibility:Q}}return this.tree.findMode===q.Filter?typeof this.tree.options.defaultFindVisibility=="number"?this.tree.options.defaultFindVisibility:this.tree.options.defaultFindVisibility?this.tree.options.defaultFindVisibility(B):2:{data:r.FuzzyScore.Default,visibility:Q}}reset(){this._totalCount=0,this._matchCount=0}dispose(){(0,u.dispose)(this.disposables)}}class x extends p.Toggle{constructor(B){super({icon:g.Codicon.listFilter,title:(0,h.localize)(18,"Filter"),isChecked:B.isChecked??!1,hoverDelegate:B.hoverDelegate??(0,v.getDefaultHoverDelegate)("element"),inputActiveOptionBorder:B.inputActiveOptionBorder,inputActiveOptionForeground:B.inputActiveOptionForeground,inputActiveOptionBackground:B.inputActiveOptionBackground})}}e.ModeToggle=x;class W extends p.Toggle{constructor(B){super({icon:g.Codicon.searchFuzzy,title:(0,h.localize)(19,"Fuzzy Match"),isChecked:B.isChecked??!1,hoverDelegate:B.hoverDelegate??(0,v.getDefaultHoverDelegate)("element"),inputActiveOptionBorder:B.inputActiveOptionBorder,inputActiveOptionForeground:B.inputActiveOptionForeground,inputActiveOptionBackground:B.inputActiveOptionBackground})}}e.FuzzyToggle=W;const V={inputBoxStyles:m.unthemedInboxStyles,toggleStyles:p.unthemedToggleStyles,listFilterWidgetBackground:void 0,listFilterWidgetNoMatchesOutline:void 0,listFilterWidgetOutline:void 0,listFilterWidgetShadow:void 0};var q;(function(X){X[X.Highlight=0]="Highlight",X[X.Filter=1]="Filter"})(q||(e.TreeFindMode=q={}));var H;(function(X){X[X.Fuzzy=0]="Fuzzy",X[X.Contiguous=1]="Contiguous"})(H||(e.TreeFindMatchType=H={}));class z extends u.Disposable{set mode(B){this.modeToggle.checked=B===q.Filter,this.findInput.inputBox.setPlaceHolder(B===q.Filter?(0,h.localize)(20,"Type to filter"):(0,h.localize)(21,"Type to search"))}set matchType(B){this.matchTypeToggle.checked=B===H.Fuzzy}constructor(B,$,Q,Z,te,re){super(),this.tree=$,this.elements=(0,d.h)(".monaco-tree-type-filter",[(0,d.h)(".monaco-tree-type-filter-grab.codicon.codicon-debug-gripper@grab",{tabIndex:0}),(0,d.h)(".monaco-tree-type-filter-input@findInput"),(0,d.h)(".monaco-tree-type-filter-actionbar@actionbar")]),this.width=0,this.right=0,this.top=0,this._onDidDisable=new a.Emitter,B.appendChild(this.elements.root),this._register((0,u.toDisposable)(()=>this.elements.root.remove()));const le=re?.styles??V;le.listFilterWidgetBackground&&(this.elements.root.style.backgroundColor=le.listFilterWidgetBackground),le.listFilterWidgetShadow&&(this.elements.root.style.boxShadow=`0 0 8px 2px ${le.listFilterWidgetShadow}`);const me=this._register((0,v.createInstantHoverDelegate)());this.modeToggle=this._register(new x({...le.toggleStyles,isChecked:Z===q.Filter,hoverDelegate:me})),this.matchTypeToggle=this._register(new W({...le.toggleStyles,isChecked:te===H.Fuzzy,hoverDelegate:me})),this.onDidChangeMode=a.Event.map(this.modeToggle.onChange,()=>this.modeToggle.checked?q.Filter:q.Highlight,this._store),this.onDidChangeMatchType=a.Event.map(this.matchTypeToggle.onChange,()=>this.matchTypeToggle.checked?H.Fuzzy:H.Contiguous,this._store),this.findInput=this._register(new y.FindInput(this.elements.findInput,Q,{label:(0,h.localize)(22,"Type to search"),additionalToggles:[this.modeToggle,this.matchTypeToggle],showCommonFindToggles:!1,inputBoxStyles:le.inputBoxStyles,toggleStyles:le.toggleStyles,history:re?.history})),this.actionbar=this._register(new E.ActionBar(this.elements.actionbar)),this.mode=Z;const Ce=this._register(new k.DomEmitter(this.findInput.inputBox.inputElement,"keydown")),ye=a.Event.chain(Ce.event,Ae=>Ae.map(Ne=>new I.StandardKeyboardEvent(Ne)));this._register(ye(Ae=>{if(Ae.equals(3)){Ae.preventDefault(),Ae.stopPropagation(),this.findInput.inputBox.addToHistory(),this.tree.domFocus();return}if(Ae.equals(18)){Ae.preventDefault(),Ae.stopPropagation(),this.findInput.inputBox.isAtLastInHistory()||this.findInput.inputBox.isNowhereInHistory()?(this.findInput.inputBox.addToHistory(),this.tree.domFocus()):this.findInput.inputBox.showNextValue();return}if(Ae.equals(16)){Ae.preventDefault(),Ae.stopPropagation(),this.findInput.inputBox.showPreviousValue();return}}));const Le=this._register(new t.Action("close",(0,h.localize)(23,"Close"),"codicon codicon-close",!0,()=>this.dispose()));this.actionbar.push(Le,{icon:!0,label:!1});const Ee=this._register(new k.DomEmitter(this.elements.grab,"mousedown"));this._register(Ee.event(Ae=>{const Ne=new u.DisposableStore,Ke=Ne.add(new k.DomEmitter((0,d.getWindow)(Ae),"mousemove")),ze=Ne.add(new k.DomEmitter((0,d.getWindow)(Ae),"mouseup")),Ge=this.right,it=Ae.pageX,Oe=this.top,Fe=Ae.pageY;this.elements.grab.classList.add("grabbing");const fe=this.elements.root.style.transition;this.elements.root.style.transition="unset";const _e=xe=>{const be=xe.pageX-it;this.right=Ge-be;const ve=xe.pageY-Fe;this.top=Oe+ve,this.layout()};Ne.add(Ke.event(_e)),Ne.add(ze.event(xe=>{_e(xe),this.elements.grab.classList.remove("grabbing"),this.elements.root.style.transition=fe,Ne.dispose()}))}));const Me=a.Event.chain(this._register(new k.DomEmitter(this.elements.grab,"keydown")).event,Ae=>Ae.map(Ne=>new I.StandardKeyboardEvent(Ne)));this._register(Me(Ae=>{let Ne,Ke;if(Ae.keyCode===15?Ne=Number.POSITIVE_INFINITY:Ae.keyCode===17?Ne=0:Ae.keyCode===10&&(Ne=this.right===0?Number.POSITIVE_INFINITY:0),Ae.keyCode===16?Ke=0:Ae.keyCode===18&&(Ke=Number.POSITIVE_INFINITY),Ne!==void 0&&(Ae.preventDefault(),Ae.stopPropagation(),this.right=Ne,this.layout()),Ke!==void 0){Ae.preventDefault(),Ae.stopPropagation(),this.top=Ke;const ze=this.elements.root.style.transition;this.elements.root.style.transition="unset",this.layout(),setTimeout(()=>{this.elements.root.style.transition=ze},0)}})),this.onDidChangeValue=this.findInput.onDidChange}layout(B=this.width){this.width=B,this.right=(0,C.clamp)(this.right,0,Math.max(0,B-212)),this.elements.root.style.right=`${this.right}px`,this.top=(0,C.clamp)(this.top,0,24),this.elements.root.style.top=`${this.top}px`}showMessage(B){this.findInput.showMessage(B)}clearMessage(){this.findInput.clearMessage()}async dispose(){this._onDidDisable.fire(),this.elements.root.classList.add("disabled"),await(0,s.timeout)(300),super.dispose()}}class U{get pattern(){return this._pattern}get mode(){return this._mode}set mode(B){B!==this._mode&&(this._mode=B,this.widget&&(this.widget.mode=this._mode),this.tree.refilter(),this.render(),this._onDidChangeMode.fire(B))}get matchType(){return this._matchType}set matchType(B){B!==this._matchType&&(this._matchType=B,this.widget&&(this.widget.matchType=this._matchType),this.tree.refilter(),this.render(),this._onDidChangeMatchType.fire(B))}constructor(B,$,Q,Z,te,re={}){this.tree=B,this.view=Q,this.filter=Z,this.contextViewProvider=te,this.options=re,this._pattern="",this.width=0,this._onDidChangeMode=new a.Emitter,this.onDidChangeMode=this._onDidChangeMode.event,this._onDidChangeMatchType=new a.Emitter,this.onDidChangeMatchType=this._onDidChangeMatchType.event,this._onDidChangePattern=new a.Emitter,this._onDidChangeOpenState=new a.Emitter,this.onDidChangeOpenState=this._onDidChangeOpenState.event,this.enabledDisposables=new u.DisposableStore,this.disposables=new u.DisposableStore,this._mode=B.options.defaultFindMode??q.Highlight,this._matchType=B.options.defaultFindMatchType??H.Fuzzy,$.onDidSplice(this.onDidSpliceModel,this,this.disposables)}updateOptions(B={}){B.defaultFindMode!==void 0&&(this.mode=B.defaultFindMode),B.defaultFindMatchType!==void 0&&(this.matchType=B.defaultFindMatchType)}onDidSpliceModel(){!this.widget||this.pattern.length===0||(this.tree.refilter(),this.render())}render(){const B=this.filter.totalCount>0&&this.filter.matchCount===0;this.pattern&&B?((0,S.alert)((0,h.localize)(24,"No results")),this.tree.options.showNotFoundMessage??!0?this.widget?.showMessage({type:2,content:(0,h.localize)(25,"No elements found.")}):this.widget?.showMessage({type:2})):(this.widget?.clearMessage(),this.pattern&&(0,S.alert)((0,h.localize)(26,"{0} results",this.filter.matchCount)))}shouldAllowFocus(B){return!this.widget||!this.pattern||this.filter.totalCount>0&&this.filter.matchCount<=1?!0:!r.FuzzyScore.isDefault(B.filterData)}layout(B){this.width=B,this.widget?.layout(B)}dispose(){this._history=void 0,this._onDidChangePattern.dispose(),this.enabledDisposables.dispose(),this.disposables.dispose()}}function j(X,B){return X.position===B.position&&Y(X,B)}function Y(X,B){return X.node.element===B.node.element&&X.startIndex===B.startIndex&&X.height===B.height&&X.endIndex===B.endIndex}class G{constructor(B=[]){this.stickyNodes=B}get count(){return this.stickyNodes.length}equal(B){return(0,i.equals)(this.stickyNodes,B.stickyNodes,j)}lastNodePartiallyVisible(){if(this.count===0)return!1;const B=this.stickyNodes[this.count-1];if(this.count===1)return B.position!==0;const $=this.stickyNodes[this.count-2];return $.position+$.height!==B.position}animationStateChanged(B){if(!(0,i.equals)(this.stickyNodes,B.stickyNodes,Y)||this.count===0)return!1;const $=this.stickyNodes[this.count-1],Q=B.stickyNodes[B.count-1];return $.position!==Q.position}}class K{constrainStickyScrollNodes(B,$,Q){for(let Z=0;ZQ||Z>=$)return B.slice(0,Z)}return B}}class R extends u.Disposable{constructor(B,$,Q,Z,te,re={}){super(),this.tree=B,this.model=$,this.view=Q,this.treeDelegate=te,this.maxWidgetViewRatio=.4;const le=this.validateStickySettings(re);this.stickyScrollMaxItemCount=le.stickyScrollMaxItemCount,this.stickyScrollDelegate=re.stickyScrollDelegate??new K,this._widget=this._register(new J(Q.getScrollableElement(),Q,B,Z,te,re.accessibilityProvider)),this.onDidChangeHasFocus=this._widget.onDidChangeHasFocus,this.onContextMenu=this._widget.onContextMenu,this._register(Q.onDidScroll(()=>this.update())),this._register(Q.onDidChangeContentHeight(()=>this.update())),this._register(B.onDidChangeCollapseState(()=>this.update())),this.update()}get height(){return this._widget.height}getNodeAtHeight(B){let $;if(B===0?$=this.view.firstVisibleIndex:$=this.view.indexAt(B+this.view.scrollTop),!($<0||$>=this.view.length))return this.view.element($)}update(){const B=this.getNodeAtHeight(0);if(!B||this.tree.scrollTop===0){this._widget.setState(void 0);return}const $=this.findStickyState(B);this._widget.setState($)}findStickyState(B){const $=[];let Q=B,Z=0,te=this.getNextStickyNode(Q,void 0,Z);for(;te&&($.push(te),Z+=te.height,!($.length<=this.stickyScrollMaxItemCount&&(Q=this.getNextVisibleNode(te),!Q)));)te=this.getNextStickyNode(Q,te.node,Z);const re=this.constrainStickyNodes($);return re.length?new G(re):void 0}getNextVisibleNode(B){return this.getNodeAtHeight(B.position+B.height)}getNextStickyNode(B,$,Q){const Z=this.getAncestorUnderPrevious(B,$);if(Z&&!(Z===B&&(!this.nodeIsUncollapsedParent(B)||this.nodeTopAlignsWithStickyNodesBottom(B,Q))))return this.createStickyScrollNode(Z,Q)}nodeTopAlignsWithStickyNodesBottom(B,$){const Q=this.getNodeIndex(B),Z=this.view.getElementTop(Q),te=$;return this.view.scrollTop===Z-te}createStickyScrollNode(B,$){const Q=this.treeDelegate.getHeight(B),{startIndex:Z,endIndex:te}=this.getNodeRange(B),re=this.calculateStickyNodePosition(te,$,Q);return{node:B,position:re,height:Q,startIndex:Z,endIndex:te}}getAncestorUnderPrevious(B,$=void 0){let Q=B,Z=this.getParentNode(Q);for(;Z;){if(Z===$)return Q;Q=Z,Z=this.getParentNode(Q)}if($===void 0)return Q}calculateStickyNodePosition(B,$,Q){let Z=this.view.getRelativeTop(B);if(Z===null&&this.view.firstVisibleIndex===B&&B+1me&&$<=me?me-Q:$}constrainStickyNodes(B){if(B.length===0)return[];const $=this.view.renderHeight*this.maxWidgetViewRatio,Q=B[B.length-1];if(B.length<=this.stickyScrollMaxItemCount&&Q.position+Q.height<=$)return B;const Z=this.stickyScrollDelegate.constrainStickyScrollNodes(B,this.stickyScrollMaxItemCount,$);if(!Z.length)return[];const te=Z[Z.length-1];if(Z.length>this.stickyScrollMaxItemCount||te.position+te.height>$)throw new Error("stickyScrollDelegate violates constraints");return Z}getParentNode(B){const $=this.model.getNodeLocation(B),Q=this.model.getParentNodeLocation($);return Q?this.model.getNode(Q):void 0}nodeIsUncollapsedParent(B){const $=this.model.getNodeLocation(B);return this.model.getListRenderCount($)>1}getNodeIndex(B){const $=this.model.getNodeLocation(B);return this.model.getListIndex($)}getNodeRange(B){const $=this.model.getNodeLocation(B),Q=this.model.getListIndex($);if(Q<0)throw new Error("Node not found in tree");const Z=this.model.getListRenderCount($),te=Q+Z-1;return{startIndex:Q,endIndex:te}}nodePositionTopBelowWidget(B){const $=[];let Q=this.getParentNode(B);for(;Q;)$.push(Q),Q=this.getParentNode(Q);let Z=0;for(let te=0;te<$.length&&te0,Q=!!B&&B.count>0;if(!$&&!Q||$&&Q&&this._previousState.equal(B))return;if($!==Q&&this.setVisible(Q),!Q){this._previousState=void 0,this._previousElements=[],this._previousStateDisposables.clear();return}const Z=B.stickyNodes[B.count-1];if(this._previousState&&B.animationStateChanged(this._previousState))this._previousElements[this._previousState.count-1].style.top=`${Z.position}px`;else{this._previousStateDisposables.clear();const te=Array(B.count);for(let re=B.count-1;re>=0;re--){const le=B.stickyNodes[re],{element:me,disposable:Ce}=this.createElement(le,re,B.count);te[re]=me,this._rootDomNode.appendChild(me),this._previousStateDisposables.add(Ce)}this.stickyScrollFocus.updateElements(te,B),this._previousElements=te}this._previousState=B,this._rootDomNode.style.height=`${Z.position+Z.height}px`}createElement(B,$,Q){const Z=B.startIndex,te=document.createElement("div");te.style.top=`${B.position}px`,this.tree.options.setRowHeight!==!1&&(te.style.height=`${B.height}px`),this.tree.options.setRowLineHeight!==!1&&(te.style.lineHeight=`${B.height}px`),te.classList.add("monaco-tree-sticky-row"),te.classList.add("monaco-list-row"),te.setAttribute("data-index",`${Z}`),te.setAttribute("data-parity",Z%2===0?"even":"odd"),te.setAttribute("id",this.view.getElementID(Z));const re=this.setAccessibilityAttributes(te,B.node.element,$,Q),le=this.treeDelegate.getTemplateId(B.node),me=this.treeRenderers.find(Ee=>Ee.templateId===le);if(!me)throw new Error(`No renderer found for template id ${le}`);let Ce=B.node;Ce===this.tree.getNode(this.tree.getNodeLocation(B.node))&&(Ce=new Proxy(B.node,{}));const ye=me.renderTemplate(te);me.renderElement(Ce,B.startIndex,ye,B.height);const Le=(0,u.toDisposable)(()=>{re.dispose(),me.disposeElement(Ce,B.startIndex,ye,B.height),me.disposeTemplate(ye),te.remove()});return{element:te,disposable:Le}}setAccessibilityAttributes(B,$,Q,Z){if(!this.accessibilityProvider)return u.Disposable.None;this.accessibilityProvider.getSetSize&&B.setAttribute("aria-setsize",String(this.accessibilityProvider.getSetSize($,Q,Z))),this.accessibilityProvider.getPosInSet&&B.setAttribute("aria-posinset",String(this.accessibilityProvider.getPosInSet($,Q))),this.accessibilityProvider.getRole&&B.setAttribute("role",this.accessibilityProvider.getRole($)??"treeitem");const te=this.accessibilityProvider.getAriaLabel($),re=te&&typeof te!="string"?te:(0,w.constObservable)(te),le=(0,w.autorun)(Ce=>{const ye=Ce.readObservable(re);ye?B.setAttribute("aria-label",ye):B.removeAttribute("aria-label")});typeof te=="string"||te&&B.setAttribute("aria-label",te.get());const me=this.accessibilityProvider.getAriaLevel&&this.accessibilityProvider.getAriaLevel($);return typeof me=="number"&&B.setAttribute("aria-level",`${me}`),B.setAttribute("aria-selected",String(!1)),le}setVisible(B){this._rootDomNode.classList.toggle("empty",!B),B||this.stickyScrollFocus.updateElements([],void 0)}domFocus(){this.stickyScrollFocus.domFocus()}focusedLast(){return this.stickyScrollFocus.focusedLast()}dispose(){this.stickyScrollFocus.dispose(),this._previousStateDisposables.dispose(),this._rootDomNode.remove()}}class ie extends u.Disposable{get domHasFocus(){return this._domHasFocus}set domHasFocus(B){B!==this._domHasFocus&&(this._onDidChangeHasFocus.fire(B),this._domHasFocus=B)}constructor(B,$){super(),this.container=B,this.view=$,this.focusedIndex=-1,this.elements=[],this._onDidChangeHasFocus=new a.Emitter,this.onDidChangeHasFocus=this._onDidChangeHasFocus.event,this._onContextMenu=new a.Emitter,this.onContextMenu=this._onContextMenu.event,this._domHasFocus=!1,this._register((0,d.addDisposableListener)(this.container,"focus",()=>this.onFocus())),this._register((0,d.addDisposableListener)(this.container,"blur",()=>this.onBlur())),this._register(this.view.onDidFocus(()=>this.toggleStickyScrollFocused(!1))),this._register(this.view.onKeyDown(Q=>this.onKeyDown(Q))),this._register(this.view.onMouseDown(Q=>this.onMouseDown(Q))),this._register(this.view.onContextMenu(Q=>this.handleContextMenu(Q)))}handleContextMenu(B){const $=B.browserEvent.target;if(!(0,b.isStickyScrollContainer)($)&&!(0,b.isStickyScrollElement)($)){this.focusedLast()&&this.view.domFocus();return}if(!(0,d.isKeyboardEvent)(B.browserEvent)){if(!this.state)throw new Error("Context menu should not be triggered when state is undefined");const re=this.state.stickyNodes.findIndex(le=>le.node.element===B.element?.element);if(re===-1)throw new Error("Context menu should not be triggered when element is not in sticky scroll widget");this.container.focus(),this.setFocus(re);return}if(!this.state||this.focusedIndex<0)throw new Error("Context menu key should not be triggered when focus is not in sticky scroll widget");const Z=this.state.stickyNodes[this.focusedIndex].node.element,te=this.elements[this.focusedIndex];this._onContextMenu.fire({element:Z,anchor:te,browserEvent:B.browserEvent,isStickyScroll:!0})}onKeyDown(B){if(this.domHasFocus&&this.state){if(B.key==="ArrowUp")this.setFocusedElement(Math.max(0,this.focusedIndex-1)),B.preventDefault(),B.stopPropagation();else if(B.key==="ArrowDown"||B.key==="ArrowRight"){if(this.focusedIndex>=this.state.count-1){const $=this.state.stickyNodes[this.state.count-1].startIndex+1;this.view.domFocus(),this.view.setFocus([$]),this.scrollNodeUnderWidget($,this.state)}else this.setFocusedElement(this.focusedIndex+1);B.preventDefault(),B.stopPropagation()}}}onMouseDown(B){const $=B.browserEvent.target;!(0,b.isStickyScrollContainer)($)&&!(0,b.isStickyScrollElement)($)||(B.browserEvent.preventDefault(),B.browserEvent.stopPropagation())}updateElements(B,$){if($&&$.count===0)throw new Error("Sticky scroll state must be undefined when there are no sticky nodes");if($&&$.count!==B.length)throw new Error("Sticky scroll focus received illigel state");const Q=this.focusedIndex;if(this.removeFocus(),this.elements=B,this.state=$,$){const Z=(0,C.clamp)(Q,0,$.count-1);this.setFocus(Z)}else this.domHasFocus&&this.view.domFocus();this.container.tabIndex=$?0:-1}setFocusedElement(B){const $=this.state;if(!$)throw new Error("Cannot set focus when state is undefined");if(this.setFocus(B),!(B<$.count-1)&&$.lastNodePartiallyVisible()){const Q=$.stickyNodes[B];this.scrollNodeUnderWidget(Q.endIndex+1,$)}}scrollNodeUnderWidget(B,$){const Q=$.stickyNodes[$.count-1],Z=$.count>1?$.stickyNodes[$.count-2]:void 0,te=this.view.getElementTop(B),re=Z?Z.position+Z.height+Q.height:Q.height;this.view.scrollTop=te-re}domFocus(){if(!this.state)throw new Error("Cannot focus when state is undefined");this.container.focus()}focusedLast(){return this.state?this.view.getHTMLElement().classList.contains("sticky-scroll-focused"):!1}removeFocus(){this.focusedIndex!==-1&&(this.toggleElementFocus(this.elements[this.focusedIndex],!1),this.focusedIndex=-1)}setFocus(B){if(0>B)throw new Error("addFocus() can not remove focus");if(!this.state&&B>=0)throw new Error("Cannot set focus index when state is undefined");if(this.state&&B>=this.state.count)throw new Error("Cannot set focus index to an index that does not exist");const $=this.focusedIndex;$>=0&&this.toggleElementFocus(this.elements[$],!1),B>=0&&this.toggleElementFocus(this.elements[B],!0),this.focusedIndex=B}toggleElementFocus(B,$){this.toggleElementActiveFocus(B,$&&this.domHasFocus),this.toggleElementPassiveFocus(B,$)}toggleCurrentElementActiveFocus(B){this.focusedIndex!==-1&&this.toggleElementActiveFocus(this.elements[this.focusedIndex],B)}toggleElementActiveFocus(B,$){B.classList.toggle("focused",$)}toggleElementPassiveFocus(B,$){B.classList.toggle("passive-focused",$)}toggleStickyScrollFocused(B){this.view.getHTMLElement().classList.toggle("sticky-scroll-focused",B)}onFocus(){if(!this.state||this.elements.length===0)throw new Error("Cannot focus when state is undefined or elements are empty");this.domHasFocus=!0,this.toggleStickyScrollFocused(!0),this.toggleCurrentElementActiveFocus(!0),this.focusedIndex===-1&&this.setFocus(0)}onBlur(){this.domHasFocus=!1,this.toggleCurrentElementActiveFocus(!1)}dispose(){this.toggleStickyScrollFocused(!1),this._onDidChangeHasFocus.fire(!1),super.dispose()}}function ue(X){let B=o.TreeMouseEventTarget.Unknown;return(0,d.hasParentWithClass)(X.browserEvent.target,"monaco-tl-twistie","monaco-tl-row")?B=o.TreeMouseEventTarget.Twistie:(0,d.hasParentWithClass)(X.browserEvent.target,"monaco-tl-contents","monaco-tl-row")?B=o.TreeMouseEventTarget.Element:(0,d.hasParentWithClass)(X.browserEvent.target,"monaco-tree-type-filter","monaco-list")&&(B=o.TreeMouseEventTarget.Filter),{browserEvent:X.browserEvent,element:X.element?X.element.element:null,target:B}}function he(X){const B=(0,b.isStickyScrollContainer)(X.browserEvent.target);return{element:X.element?X.element.element:null,browserEvent:X.browserEvent,anchor:X.anchor,isStickyScroll:B}}function pe(X,B){B(X),X.children.forEach($=>pe($,B))}class ae{get nodeSet(){return this._nodeSet||(this._nodeSet=this.createNodeSet()),this._nodeSet}constructor(B,$){this.getFirstViewElementWithTrait=B,this.identityProvider=$,this.nodes=[],this._onDidChange=new a.Emitter,this.onDidChange=this._onDidChange.event}set(B,$){!$?.__forceEvent&&(0,i.equals)(this.nodes,B)||this._set(B,!1,$)}_set(B,$,Q){if(this.nodes=[...B],this.elements=void 0,this._nodeSet=void 0,!$){const Z=this;this._onDidChange.fire({get elements(){return Z.get()},browserEvent:Q})}}get(){return this.elements||(this.elements=this.nodes.map(B=>B.element)),[...this.elements]}getNodes(){return this.nodes}has(B){return this.nodeSet.has(B)}onDidModelSplice({insertedNodes:B,deletedNodes:$}){if(!this.identityProvider){const me=this.createNodeSet(),Ce=ye=>me.delete(ye);$.forEach(ye=>pe(ye,Ce)),this.set([...me.values()]);return}const Q=new Set,Z=me=>Q.add(this.identityProvider.getId(me.element).toString());$.forEach(me=>pe(me,Z));const te=new Map,re=me=>te.set(this.identityProvider.getId(me.element).toString(),me);B.forEach(me=>pe(me,re));const le=[];for(const me of this.nodes){const Ce=this.identityProvider.getId(me.element).toString();if(!Q.has(Ce))le.push(me);else{const Le=te.get(Ce);Le&&Le.visible&&le.push(Le)}}if(this.nodes.length>0&&le.length===0){const me=this.getFirstViewElementWithTrait();me&&le.push(me)}this._set(le,!0)}createNodeSet(){const B=new Set;for(const $ of this.nodes)B.add($);return B}}class ee extends b.MouseController{constructor(B,$,Q){super(B),this.tree=$,this.stickyScrollProvider=Q}onViewPointer(B){if((0,b.isButton)(B.browserEvent.target)||(0,b.isInputElement)(B.browserEvent.target)||(0,b.isMonacoEditor)(B.browserEvent.target)||B.browserEvent.isHandledByList)return;const $=B.element;if(!$)return super.onViewPointer(B);if(this.isSelectionRangeChangeEvent(B)||this.isSelectionSingleChangeEvent(B))return super.onViewPointer(B);const Q=B.browserEvent.target,Z=Q.classList.contains("monaco-tl-twistie")||Q.classList.contains("monaco-icon-label")&&Q.classList.contains("folder-icon")&&B.browserEvent.offsetX<16,te=(0,b.isStickyScrollElement)(B.browserEvent.target);let re=!1;if(te?re=!0:typeof this.tree.expandOnlyOnTwistieClick=="function"?re=this.tree.expandOnlyOnTwistieClick($.element):re=!!this.tree.expandOnlyOnTwistieClick,te)this.handleStickyScrollMouseEvent(B,$);else{if(re&&!Z&&B.browserEvent.detail!==2)return super.onViewPointer(B);if(!this.tree.expandOnDoubleClick&&B.browserEvent.detail===2)return super.onViewPointer(B)}if($.collapsible&&(!te||Z)){const le=this.tree.getNodeLocation($),me=B.browserEvent.altKey;if(this.tree.setFocus([le]),this.tree.toggleCollapsed(le,me),Z){B.browserEvent.isHandledByList=!0;return}}te||super.onViewPointer(B)}handleStickyScrollMouseEvent(B,$){if((0,b.isMonacoCustomToggle)(B.browserEvent.target)||(0,b.isActionItem)(B.browserEvent.target))return;const Q=this.stickyScrollProvider();if(!Q)throw new Error("Sticky scroll controller not found");const Z=this.list.indexOf($),te=this.list.getElementTop(Z),re=Q.nodePositionTopBelowWidget($);this.tree.scrollTop=te-re,this.list.domFocus(),this.list.setFocus([Z]),this.list.setSelection([Z])}onDoubleClick(B){B.browserEvent.target.classList.contains("monaco-tl-twistie")||!this.tree.expandOnDoubleClick||B.browserEvent.isHandledByList||super.onDoubleClick(B)}onMouseDown(B){const $=B.browserEvent.target;if(!(0,b.isStickyScrollContainer)($)&&!(0,b.isStickyScrollElement)($)){super.onMouseDown(B);return}}onContextMenu(B){const $=B.browserEvent.target;if(!(0,b.isStickyScrollContainer)($)&&!(0,b.isStickyScrollElement)($)){super.onContextMenu(B);return}}}class de extends b.List{constructor(B,$,Q,Z,te,re,le,me){super(B,$,Q,Z,me),this.focusTrait=te,this.selectionTrait=re,this.anchorTrait=le}createMouseController(B){return new ee(this,B.tree,B.stickyScrollProvider)}splice(B,$,Q=[]){if(super.splice(B,$,Q),Q.length===0)return;const Z=[],te=[];let re;Q.forEach((le,me)=>{this.focusTrait.has(le)&&Z.push(B+me),this.selectionTrait.has(le)&&te.push(B+me),this.anchorTrait.has(le)&&(re=B+me)}),Z.length>0&&super.setFocus((0,i.distinct)([...super.getFocus(),...Z])),te.length>0&&super.setSelection((0,i.distinct)([...super.getSelection(),...te])),typeof re=="number"&&super.setAnchor(re)}setFocus(B,$,Q=!1){super.setFocus(B,$),Q||this.focusTrait.set(B.map(Z=>this.element(Z)),$)}setSelection(B,$,Q=!1){super.setSelection(B,$),Q||this.selectionTrait.set(B.map(Z=>this.element(Z)),$)}setAnchor(B,$=!1){super.setAnchor(B),$||(typeof B>"u"?this.anchorTrait.set([]):this.anchorTrait.set([this.element(B)]))}}class ge{get onDidScroll(){return this.view.onDidScroll}get onDidChangeFocus(){return this.eventBufferer.wrapEvent(this.focus.onDidChange)}get onDidChangeSelection(){return this.eventBufferer.wrapEvent(this.selection.onDidChange)}get onMouseDblClick(){return a.Event.filter(a.Event.map(this.view.onMouseDblClick,ue),B=>B.target!==o.TreeMouseEventTarget.Filter)}get onMouseOver(){return a.Event.map(this.view.onMouseOver,ue)}get onMouseOut(){return a.Event.map(this.view.onMouseOut,ue)}get onContextMenu(){return a.Event.any(a.Event.filter(a.Event.map(this.view.onContextMenu,he),B=>!B.isStickyScroll),this.stickyScrollController?.onContextMenu??a.Event.None)}get onPointer(){return a.Event.map(this.view.onPointer,ue)}get onKeyDown(){return this.view.onKeyDown}get onDidFocus(){return this.view.onDidFocus}get onDidChangeModel(){return a.Event.signal(this.model.onDidSplice)}get onDidChangeCollapseState(){return this.model.onDidChangeCollapseState}get findMode(){return this.findController?.mode??q.Highlight}set findMode(B){this.findController&&(this.findController.mode=B)}get findMatchType(){return this.findController?.matchType??H.Fuzzy}set findMatchType(B){this.findController&&(this.findController.matchType=B)}get expandOnDoubleClick(){return typeof this._options.expandOnDoubleClick>"u"?!0:this._options.expandOnDoubleClick}get expandOnlyOnTwistieClick(){return typeof this._options.expandOnlyOnTwistieClick>"u"?!0:this._options.expandOnlyOnTwistieClick}get onDidDispose(){return this.view.onDidDispose}constructor(B,$,Q,Z,te={}){this._user=B,this._options=te,this.eventBufferer=new a.EventBufferer,this.onDidChangeFindOpenState=a.Event.None,this.onDidChangeStickyScrollFocused=a.Event.None,this.disposables=new u.DisposableStore,this._onWillRefilter=new a.Emitter,this.onWillRefilter=this._onWillRefilter.event,this._onDidUpdateOptions=new a.Emitter,this.treeDelegate=new A(Q);const re=new a.Relay,le=new a.Relay,me=this.disposables.add(new N(le.event)),Ce=new l.SetMap;this.renderers=Z.map(Ae=>new O(Ae,()=>this.model,re.event,me,Ce,te));for(const Ae of this.renderers)this.disposables.add(Ae);let ye;te.keyboardNavigationLabelProvider&&(ye=new F(this,te.keyboardNavigationLabelProvider,te.filter),te={...te,filter:ye},this.disposables.add(ye)),this.focus=new ae(()=>this.view.getFocusedElements()[0],te.identityProvider),this.selection=new ae(()=>this.view.getSelectedElements()[0],te.identityProvider),this.anchor=new ae(()=>this.view.getAnchorElement(),te.identityProvider),this.view=new de(B,$,this.treeDelegate,this.renderers,this.focus,this.selection,this.anchor,{...M(()=>this.model,te),tree:this,stickyScrollProvider:()=>this.stickyScrollController}),this.model=this.createModel(B,this.view,te),re.input=this.model.onDidChangeCollapseState;const Le=a.Event.forEach(this.model.onDidSplice,Ae=>{this.eventBufferer.bufferEvents(()=>{this.focus.onDidModelSplice(Ae),this.selection.onDidModelSplice(Ae)})},this.disposables);Le(()=>null,null,this.disposables);const Ee=this.disposables.add(new a.Emitter),Me=this.disposables.add(new s.Delayer(0));if(this.disposables.add(a.Event.any(Le,this.focus.onDidChange,this.selection.onDidChange)(()=>{Me.trigger(()=>{const Ae=new Set;for(const Ne of this.focus.getNodes())Ae.add(Ne);for(const Ne of this.selection.getNodes())Ae.add(Ne);Ee.fire([...Ae.values()])})})),le.input=Ee.event,te.keyboardSupport!==!1){const Ae=a.Event.chain(this.view.onKeyDown,Ne=>Ne.filter(Ke=>!(0,b.isInputElement)(Ke.target)).map(Ke=>new I.StandardKeyboardEvent(Ke)));a.Event.chain(Ae,Ne=>Ne.filter(Ke=>Ke.keyCode===15))(this.onLeftArrow,this,this.disposables),a.Event.chain(Ae,Ne=>Ne.filter(Ke=>Ke.keyCode===17))(this.onRightArrow,this,this.disposables),a.Event.chain(Ae,Ne=>Ne.filter(Ke=>Ke.keyCode===10))(this.onSpace,this,this.disposables)}if((te.findWidgetEnabled??!0)&&te.keyboardNavigationLabelProvider&&te.contextViewProvider){const Ae=this.options.findWidgetStyles?{styles:this.options.findWidgetStyles}:void 0;this.findController=new U(this,this.model,this.view,ye,te.contextViewProvider,Ae),this.focusNavigationFilter=Ne=>this.findController.shouldAllowFocus(Ne),this.onDidChangeFindOpenState=this.findController.onDidChangeOpenState,this.disposables.add(this.findController),this.onDidChangeFindMode=this.findController.onDidChangeMode,this.onDidChangeFindMatchType=this.findController.onDidChangeMatchType}else this.onDidChangeFindMode=a.Event.None,this.onDidChangeFindMatchType=a.Event.None;te.enableStickyScroll&&(this.stickyScrollController=new R(this,this.model,this.view,this.renderers,this.treeDelegate,te),this.onDidChangeStickyScrollFocused=this.stickyScrollController.onDidChangeHasFocus),this.styleElement=(0,d.createStyleSheet)(this.view.getHTMLElement()),this.getHTMLElement().classList.toggle("always",this._options.renderIndentGuides===P.Always)}updateOptions(B={}){this._options={...this._options,...B};for(const $ of this.renderers)$.updateOptions(B);this.view.updateOptions(this._options),this.findController?.updateOptions(B),this.updateStickyScroll(B),this._onDidUpdateOptions.fire(this._options),this.getHTMLElement().classList.toggle("always",this._options.renderIndentGuides===P.Always)}get options(){return this._options}updateStickyScroll(B){!this.stickyScrollController&&this._options.enableStickyScroll?(this.stickyScrollController=new R(this,this.model,this.view,this.renderers,this.treeDelegate,this._options),this.onDidChangeStickyScrollFocused=this.stickyScrollController.onDidChangeHasFocus):this.stickyScrollController&&!this._options.enableStickyScroll&&(this.onDidChangeStickyScrollFocused=a.Event.None,this.stickyScrollController.dispose(),this.stickyScrollController=void 0),this.stickyScrollController?.updateOptions(B)}getHTMLElement(){return this.view.getHTMLElement()}get scrollTop(){return this.view.scrollTop}set scrollTop(B){this.view.scrollTop=B}get scrollHeight(){return this.view.scrollHeight}get renderHeight(){return this.view.renderHeight}get ariaLabel(){return this.view.ariaLabel}set ariaLabel(B){this.view.ariaLabel=B}domFocus(){this.stickyScrollController?.focusedLast()?this.stickyScrollController.domFocus():this.view.domFocus()}layout(B,$){this.view.layout(B,$),(0,f.isNumber)($)&&this.findController?.layout($)}style(B){const $=`.${this.view.domId}`,Q=[];B.treeIndentGuidesStroke&&(Q.push(`.monaco-list${$}:hover .monaco-tl-indent > .indent-guide, .monaco-list${$}.always .monaco-tl-indent > .indent-guide { border-color: ${B.treeInactiveIndentGuidesStroke}; }`),Q.push(`.monaco-list${$} .monaco-tl-indent > .indent-guide.active { border-color: ${B.treeIndentGuidesStroke}; }`));const Z=B.treeStickyScrollBackground??B.listBackground;Z&&(Q.push(`.monaco-list${$} .monaco-scrollable-element .monaco-tree-sticky-container { background-color: ${Z}; }`),Q.push(`.monaco-list${$} .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-row { background-color: ${Z}; }`)),B.treeStickyScrollBorder&&Q.push(`.monaco-list${$} .monaco-scrollable-element .monaco-tree-sticky-container { border-bottom: 1px solid ${B.treeStickyScrollBorder}; }`),B.treeStickyScrollShadow&&Q.push(`.monaco-list${$} .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-container-shadow { box-shadow: ${B.treeStickyScrollShadow} 0 6px 6px -6px inset; height: 3px; }`),B.listFocusForeground&&(Q.push(`.monaco-list${$}.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container:focus .monaco-list-row.focused { color: ${B.listFocusForeground}; }`),Q.push(`.monaco-list${$}:not(.sticky-scroll-focused) .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.focused { color: inherit; }`));const te=(0,d.asCssValueWithDefault)(B.listFocusAndSelectionOutline,(0,d.asCssValueWithDefault)(B.listSelectionOutline,B.listFocusOutline??""));te&&(Q.push(`.monaco-list${$}.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container:focus .monaco-list-row.focused.selected { outline: 1px solid ${te}; outline-offset: -1px;}`),Q.push(`.monaco-list${$}:not(.sticky-scroll-focused) .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.focused.selected { outline: inherit;}`)),B.listFocusOutline&&(Q.push(`.monaco-list${$}.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container:focus .monaco-list-row.focused { outline: 1px solid ${B.listFocusOutline}; outline-offset: -1px; }`),Q.push(`.monaco-list${$}:not(.sticky-scroll-focused) .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.focused { outline: inherit; }`),Q.push(`.monaco-workbench.context-menu-visible .monaco-list${$}.last-focused.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.passive-focused { outline: 1px solid ${B.listFocusOutline}; outline-offset: -1px; }`),Q.push(`.monaco-workbench.context-menu-visible .monaco-list${$}.last-focused.sticky-scroll-focused .monaco-list-rows .monaco-list-row.focused { outline: inherit; }`),Q.push(`.monaco-workbench.context-menu-visible .monaco-list${$}.last-focused:not(.sticky-scroll-focused) .monaco-tree-sticky-container .monaco-list-rows .monaco-list-row.focused { outline: inherit; }`)),this.styleElement.textContent=Q.join(` -`),this.view.style(B)}getParentElement(B){const $=this.model.getParentNodeLocation(B);return this.model.getNode($).element}getFirstElementChild(B){return this.model.getFirstElementChild(B)}getNode(B){return this.model.getNode(B)}getNodeLocation(B){return this.model.getNodeLocation(B)}collapse(B,$=!1){return this.model.setCollapsed(B,!0,$)}expand(B,$=!1){return this.model.setCollapsed(B,!1,$)}toggleCollapsed(B,$=!1){return this.model.setCollapsed(B,void 0,$)}isCollapsible(B){return this.model.isCollapsible(B)}setCollapsible(B,$){return this.model.setCollapsible(B,$)}isCollapsed(B){return this.model.isCollapsed(B)}refilter(){this._onWillRefilter.fire(void 0),this.model.refilter()}setSelection(B,$){this.eventBufferer.bufferEvents(()=>{const Q=B.map(te=>this.model.getNode(te));this.selection.set(Q,$);const Z=B.map(te=>this.model.getListIndex(te)).filter(te=>te>-1);this.view.setSelection(Z,$,!0)})}getSelection(){return this.selection.get()}setFocus(B,$){this.eventBufferer.bufferEvents(()=>{const Q=B.map(te=>this.model.getNode(te));this.focus.set(Q,$);const Z=B.map(te=>this.model.getListIndex(te)).filter(te=>te>-1);this.view.setFocus(Z,$,!0)})}focusNext(B=1,$=!1,Q,Z=(0,d.isKeyboardEvent)(Q)&&Q.altKey?void 0:this.focusNavigationFilter){this.view.focusNext(B,$,Q,Z)}focusPrevious(B=1,$=!1,Q,Z=(0,d.isKeyboardEvent)(Q)&&Q.altKey?void 0:this.focusNavigationFilter){this.view.focusPrevious(B,$,Q,Z)}focusNextPage(B,$=(0,d.isKeyboardEvent)(B)&&B.altKey?void 0:this.focusNavigationFilter){return this.view.focusNextPage(B,$)}focusPreviousPage(B,$=(0,d.isKeyboardEvent)(B)&&B.altKey?void 0:this.focusNavigationFilter){return this.view.focusPreviousPage(B,$,()=>this.stickyScrollController?.height??0)}focusLast(B,$=(0,d.isKeyboardEvent)(B)&&B.altKey?void 0:this.focusNavigationFilter){this.view.focusLast(B,$)}focusFirst(B,$=(0,d.isKeyboardEvent)(B)&&B.altKey?void 0:this.focusNavigationFilter){this.view.focusFirst(B,$)}getFocus(){return this.focus.get()}reveal(B,$){this.model.expandTo(B);const Q=this.model.getListIndex(B);if(Q!==-1)if(!this.stickyScrollController)this.view.reveal(Q,$);else{const Z=this.stickyScrollController.nodePositionTopBelowWidget(this.getNode(B));this.view.reveal(Q,$,Z)}}onLeftArrow(B){B.preventDefault(),B.stopPropagation();const $=this.view.getFocusedElements();if($.length===0)return;const Q=$[0],Z=this.model.getNodeLocation(Q);if(!this.model.setCollapsed(Z,!0)){const re=this.model.getParentNodeLocation(Z);if(!re)return;const le=this.model.getListIndex(re);this.view.reveal(le),this.view.setFocus([le])}}onRightArrow(B){B.preventDefault(),B.stopPropagation();const $=this.view.getFocusedElements();if($.length===0)return;const Q=$[0],Z=this.model.getNodeLocation(Q);if(!this.model.setCollapsed(Z,!1)){if(!Q.children.some(me=>me.visible))return;const[re]=this.view.getFocus(),le=re+1;this.view.reveal(le),this.view.setFocus([le])}}onSpace(B){B.preventDefault(),B.stopPropagation();const $=this.view.getFocusedElements();if($.length===0)return;const Q=$[0],Z=this.model.getNodeLocation(Q),te=B.browserEvent.altKey;this.model.setCollapsed(Z,void 0,te)}dispose(){(0,u.dispose)(this.disposables),this.stickyScrollController?.dispose(),this.view.dispose()}}e.AbstractTree=ge}),define(ne[644],se([1,0,176,250]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DataTree=void 0;class I extends d.AbstractTree{constructor(y,m,_,b,p,n={}){super(y,m,_,b,n),this.user=y,this.dataSource=p,this.identityProvider=n.identityProvider}createModel(y,m,_){return new k.ObjectTreeModel(y,m,_)}}e.DataTree=I}),define(ne[360],se([1,0,176,627,250,126,53]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompressibleObjectTree=e.ObjectTree=void 0;class m extends d.AbstractTree{get onDidChangeCollapseState(){return this.model.onDidChangeCollapseState}constructor(t,i,s,g,c={}){super(t,i,s,g,c),this.user=t}setChildren(t,i=y.Iterable.empty(),s){this.model.setChildren(t,i,s)}rerender(t){if(t===void 0){this.view.rerender();return}this.model.rerender(t)}hasElement(t){return this.model.has(t)}createModel(t,i,s){return new I.ObjectTreeModel(t,i,s)}}e.ObjectTree=m;class _{get compressedTreeNodeProvider(){return this._compressedTreeNodeProvider()}constructor(t,i,s){this._compressedTreeNodeProvider=t,this.stickyScrollDelegate=i,this.renderer=s,this.templateId=s.templateId,s.onDidChangeTwistieState&&(this.onDidChangeTwistieState=s.onDidChangeTwistieState)}renderTemplate(t){return{compressedTreeNode:void 0,data:this.renderer.renderTemplate(t)}}renderElement(t,i,s,g){let c=this.stickyScrollDelegate.getCompressedNode(t);c||(c=this.compressedTreeNodeProvider.getCompressedTreeNode(t.element)),c.element.elements.length===1?(s.compressedTreeNode=void 0,this.renderer.renderElement(t,i,s.data,g)):(s.compressedTreeNode=c,this.renderer.renderCompressedElements(c,i,s.data,g))}disposeElement(t,i,s,g){s.compressedTreeNode?this.renderer.disposeCompressedElements?.(s.compressedTreeNode,i,s.data,g):this.renderer.disposeElement?.(t,i,s.data,g)}disposeTemplate(t){this.renderer.disposeTemplate(t.data)}renderTwistie(t,i){return this.renderer.renderTwistie?this.renderer.renderTwistie(t,i):!1}}ke([E.memoize],_.prototype,"compressedTreeNodeProvider",null);class b{constructor(t){this.modelProvider=t,this.compressedStickyNodes=new Map}getCompressedNode(t){return this.compressedStickyNodes.get(t)}constrainStickyScrollNodes(t,i,s){if(this.compressedStickyNodes.clear(),t.length===0)return[];for(let g=0;gs||g>=i-1&&ithis,a=new b(()=>this.model),r=g.map(u=>new _(l,a,u));super(t,i,s,r,{...p(l,c),stickyScrollDelegate:a})}setChildren(t,i=y.Iterable.empty(),s){this.model.setChildren(t,i,s)}createModel(t,i,s){return new k.CompressibleObjectTreeModel(t,i,s)}updateOptions(t={}){super.updateOptions(t),typeof t.compressionEnabled<"u"&&this.model.setCompressionEnabled(t.compressionEnabled)}getCompressedTreeNode(t=null){return this.model.getCompressedTreeNode(t)}}e.CompressibleObjectTree=n}),define(ne[645],se([1,0,257,176,249,360,159,14,26,30,8,6,53,2,19]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompressibleAsyncDataTree=e.AsyncDataTree=void 0;function s(P){return{...P,children:[],refreshPromise:void 0,stale:!0,slow:!1,forceExpanded:!1}}function g(P,N){return N.parent?N.parent===P?!0:g(P,N.parent):!1}function c(P,N){return P===N||g(P,N)||g(N,P)}class l{get element(){return this.node.element.element}get children(){return this.node.children.map(N=>new l(N))}get depth(){return this.node.depth}get visibleChildrenCount(){return this.node.visibleChildrenCount}get visibleChildIndex(){return this.node.visibleChildIndex}get collapsible(){return this.node.collapsible}get collapsed(){return this.node.collapsed}get visible(){return this.node.visible}get filterData(){return this.node.filterData}constructor(N){this.node=N}}class a{constructor(N,O,F){this.renderer=N,this.nodeMapper=O,this.onDidChangeTwistieState=F,this.renderedNodes=new Map,this.templateId=N.templateId}renderTemplate(N){return{templateData:this.renderer.renderTemplate(N)}}renderElement(N,O,F,x){this.renderer.renderElement(this.nodeMapper.map(N),O,F.templateData,x)}renderTwistie(N,O){return N.slow?(O.classList.add(...b.ThemeIcon.asClassNameArray(_.Codicon.treeItemLoading)),!0):(O.classList.remove(...b.ThemeIcon.asClassNameArray(_.Codicon.treeItemLoading)),!1)}disposeElement(N,O,F,x){this.renderer.disposeElement?.(this.nodeMapper.map(N),O,F.templateData,x)}disposeTemplate(N){this.renderer.disposeTemplate(N.templateData)}dispose(){this.renderedNodes.clear()}}function r(P){return{browserEvent:P.browserEvent,elements:P.elements.map(N=>N.element)}}function u(P){return{browserEvent:P.browserEvent,element:P.element&&P.element.element,target:P.target}}class C extends d.ElementsDragAndDropData{constructor(N){super(N.elements.map(O=>O.element)),this.data=N}}function f(P){return P instanceof d.ElementsDragAndDropData?new C(P):P}class h{constructor(N){this.dnd=N}getDragURI(N){return this.dnd.getDragURI(N.element)}getDragLabel(N,O){if(this.dnd.getDragLabel)return this.dnd.getDragLabel(N.map(F=>F.element),O)}onDragStart(N,O){this.dnd.onDragStart?.(f(N),O)}onDragOver(N,O,F,x,W,V=!0){return this.dnd.onDragOver(f(N),O&&O.element,F,x,W)}drop(N,O,F,x,W){this.dnd.drop(f(N),O&&O.element,F,x,W)}onDragEnd(N){this.dnd.onDragEnd?.(N)}dispose(){this.dnd.dispose()}}function v(P){return P&&{...P,collapseByDefault:!0,identityProvider:P.identityProvider&&{getId(N){return P.identityProvider.getId(N.element)}},dnd:P.dnd&&new h(P.dnd),multipleSelectionController:P.multipleSelectionController&&{isSelectionSingleChangeEvent(N){return P.multipleSelectionController.isSelectionSingleChangeEvent({...N,element:N.element})},isSelectionRangeChangeEvent(N){return P.multipleSelectionController.isSelectionRangeChangeEvent({...N,element:N.element})}},accessibilityProvider:P.accessibilityProvider&&{...P.accessibilityProvider,getPosInSet:void 0,getSetSize:void 0,getRole:P.accessibilityProvider.getRole?N=>P.accessibilityProvider.getRole(N.element):()=>"treeitem",isChecked:P.accessibilityProvider.isChecked?N=>!!P.accessibilityProvider?.isChecked(N.element):void 0,getAriaLabel(N){return P.accessibilityProvider.getAriaLabel(N.element)},getWidgetAriaLabel(){return P.accessibilityProvider.getWidgetAriaLabel()},getWidgetRole:P.accessibilityProvider.getWidgetRole?()=>P.accessibilityProvider.getWidgetRole():()=>"tree",getAriaLevel:P.accessibilityProvider.getAriaLevel&&(N=>P.accessibilityProvider.getAriaLevel(N.element)),getActiveDescendantId:P.accessibilityProvider.getActiveDescendantId&&(N=>P.accessibilityProvider.getActiveDescendantId(N.element))},filter:P.filter&&{filter(N,O){return P.filter.filter(N.element,O)}},keyboardNavigationLabelProvider:P.keyboardNavigationLabelProvider&&{...P.keyboardNavigationLabelProvider,getKeyboardNavigationLabel(N){return P.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(N.element)}},sorter:void 0,expandOnlyOnTwistieClick:typeof P.expandOnlyOnTwistieClick>"u"?void 0:typeof P.expandOnlyOnTwistieClick!="function"?P.expandOnlyOnTwistieClick:N=>P.expandOnlyOnTwistieClick(N.element),defaultFindVisibility:N=>N.hasChildren&&N.stale?1:typeof P.defaultFindVisibility=="number"?P.defaultFindVisibility:typeof P.defaultFindVisibility>"u"?2:P.defaultFindVisibility(N.element)}}function w(P,N){N(P),P.children.forEach(O=>w(O,N))}class S{get onDidScroll(){return this.tree.onDidScroll}get onDidChangeFocus(){return n.Event.map(this.tree.onDidChangeFocus,r)}get onDidChangeSelection(){return n.Event.map(this.tree.onDidChangeSelection,r)}get onMouseDblClick(){return n.Event.map(this.tree.onMouseDblClick,u)}get onPointer(){return n.Event.map(this.tree.onPointer,u)}get onDidFocus(){return this.tree.onDidFocus}get onDidChangeModel(){return this.tree.onDidChangeModel}get onDidChangeCollapseState(){return this.tree.onDidChangeCollapseState}get onDidChangeFindOpenState(){return this.tree.onDidChangeFindOpenState}get onDidChangeStickyScrollFocused(){return this.tree.onDidChangeStickyScrollFocused}get onDidDispose(){return this.tree.onDidDispose}constructor(N,O,F,x,W,V={}){this.user=N,this.dataSource=W,this.nodes=new Map,this.subTreeRefreshPromises=new Map,this.refreshPromises=new Map,this._onDidRender=new n.Emitter,this._onDidChangeNodeSlowState=new n.Emitter,this.nodeMapper=new y.WeakMapper(q=>new l(q)),this.disposables=new t.DisposableStore,this.identityProvider=V.identityProvider,this.autoExpandSingleChildren=typeof V.autoExpandSingleChildren>"u"?!1:V.autoExpandSingleChildren,this.sorter=V.sorter,this.getDefaultCollapseState=q=>V.collapseByDefault?V.collapseByDefault(q)?y.ObjectTreeElementCollapseState.PreserveOrCollapsed:y.ObjectTreeElementCollapseState.PreserveOrExpanded:void 0,this.tree=this.createTree(N,O,F,x,V),this.onDidChangeFindMode=this.tree.onDidChangeFindMode,this.onDidChangeFindMatchType=this.tree.onDidChangeFindMatchType,this.root=s({element:void 0,parent:null,hasChildren:!0,defaultCollapseState:void 0}),this.identityProvider&&(this.root={...this.root,id:null}),this.nodes.set(null,this.root),this.tree.onDidChangeCollapseState(this._onDidChangeCollapseState,this,this.disposables)}createTree(N,O,F,x,W){const V=new k.ComposedTreeDelegate(F),q=x.map(z=>new a(z,this.nodeMapper,this._onDidChangeNodeSlowState.event)),H=v(W)||{};return new E.ObjectTree(N,O,V,q,H)}updateOptions(N={}){this.tree.updateOptions(N)}getHTMLElement(){return this.tree.getHTMLElement()}get scrollTop(){return this.tree.scrollTop}set scrollTop(N){this.tree.scrollTop=N}get scrollHeight(){return this.tree.scrollHeight}get renderHeight(){return this.tree.renderHeight}domFocus(){this.tree.domFocus()}layout(N,O){this.tree.layout(N,O)}style(N){this.tree.style(N)}getInput(){return this.root.element}async setInput(N,O){this.refreshPromises.forEach(x=>x.cancel()),this.refreshPromises.clear(),this.root.element=N;const F=O&&{viewState:O,focus:[],selection:[]};await this._updateChildren(N,!0,!1,F),F&&(this.tree.setFocus(F.focus),this.tree.setSelection(F.selection)),O&&typeof O.scrollTop=="number"&&(this.scrollTop=O.scrollTop)}async _updateChildren(N=this.root.element,O=!0,F=!1,x,W){if(typeof this.root.element>"u")throw new y.TreeError(this.user,"Tree input not set");this.root.refreshPromise&&(await this.root.refreshPromise,await n.Event.toPromise(this._onDidRender.event));const V=this.getDataNode(N);if(await this.refreshAndRenderNode(V,O,x,W),F)try{this.tree.rerender(V)}catch{}}rerender(N){if(N===void 0||N===this.root.element){this.tree.rerender();return}const O=this.getDataNode(N);this.tree.rerender(O)}getNode(N=this.root.element){const O=this.getDataNode(N),F=this.tree.getNode(O===this.root?null:O);return this.nodeMapper.map(F)}collapse(N,O=!1){const F=this.getDataNode(N);return this.tree.collapse(F===this.root?null:F,O)}async expand(N,O=!1){if(typeof this.root.element>"u")throw new y.TreeError(this.user,"Tree input not set");this.root.refreshPromise&&(await this.root.refreshPromise,await n.Event.toPromise(this._onDidRender.event));const F=this.getDataNode(N);if(this.tree.hasElement(F)&&!this.tree.isCollapsible(F)||(F.refreshPromise&&(await this.root.refreshPromise,await n.Event.toPromise(this._onDidRender.event)),F!==this.root&&!F.refreshPromise&&!this.tree.isCollapsed(F)))return!1;const x=this.tree.expand(F===this.root?null:F,O);return F.refreshPromise&&(await this.root.refreshPromise,await n.Event.toPromise(this._onDidRender.event)),x}setSelection(N,O){const F=N.map(x=>this.getDataNode(x));this.tree.setSelection(F,O)}getSelection(){return this.tree.getSelection().map(O=>O.element)}setFocus(N,O){const F=N.map(x=>this.getDataNode(x));this.tree.setFocus(F,O)}getFocus(){return this.tree.getFocus().map(O=>O.element)}reveal(N,O){this.tree.reveal(this.getDataNode(N),O)}getParentElement(N){const O=this.tree.getParentElement(this.getDataNode(N));return O&&O.element}getFirstElementChild(N=this.root.element){const O=this.getDataNode(N),F=this.tree.getFirstElementChild(O===this.root?null:O);return F&&F.element}getDataNode(N){const O=this.nodes.get(N===this.root.element?null:N);if(!O)throw new y.TreeError(this.user,`Data tree node not found: ${N}`);return O}async refreshAndRenderNode(N,O,F,x){await this.refreshNode(N,O,F),!this.disposables.isDisposed&&this.render(N,F,x)}async refreshNode(N,O,F){let x;if(this.subTreeRefreshPromises.forEach((W,V)=>{!x&&c(V,N)&&(x=W.then(()=>this.refreshNode(N,O,F)))}),x)return x;if(N!==this.root&&this.tree.getNode(N).collapsed){N.hasChildren=!!this.dataSource.hasChildren(N.element),N.stale=!0,this.setChildren(N,[],O,F);return}return this.doRefreshSubTree(N,O,F)}async doRefreshSubTree(N,O,F){let x;N.refreshPromise=new Promise(W=>x=W),this.subTreeRefreshPromises.set(N,N.refreshPromise),N.refreshPromise.finally(()=>{N.refreshPromise=void 0,this.subTreeRefreshPromises.delete(N)});try{const W=await this.doRefreshNode(N,O,F);N.stale=!1,await m.Promises.settled(W.map(V=>this.doRefreshSubTree(V,O,F)))}finally{x()}}async doRefreshNode(N,O,F){N.hasChildren=!!this.dataSource.hasChildren(N.element);let x;if(!N.hasChildren)x=Promise.resolve(o.Iterable.empty());else{const W=this.doGetChildren(N);if((0,i.isIterable)(W))x=Promise.resolve(W);else{const V=(0,m.timeout)(800);V.then(()=>{N.slow=!0,this._onDidChangeNodeSlowState.fire(N)},q=>null),x=W.finally(()=>V.cancel())}}try{const W=await x;return this.setChildren(N,W,O,F)}catch(W){if(N!==this.root&&this.tree.hasElement(N)&&this.tree.collapse(N),(0,p.isCancellationError)(W))return[];throw W}finally{N.slow&&(N.slow=!1,this._onDidChangeNodeSlowState.fire(N))}}doGetChildren(N){let O=this.refreshPromises.get(N);if(O)return O;const F=this.dataSource.getChildren(N.element);return(0,i.isIterable)(F)?this.processChildren(F):(O=(0,m.createCancelablePromise)(async()=>this.processChildren(await F)),this.refreshPromises.set(N,O),O.finally(()=>{this.refreshPromises.delete(N)}))}_onDidChangeCollapseState({node:N,deep:O}){N.element!==null&&!N.collapsed&&N.element.stale&&(O?this.collapse(N.element.element):this.refreshAndRenderNode(N.element,!1).catch(p.onUnexpectedError))}setChildren(N,O,F,x){const W=[...O];if(N.children.length===0&&W.length===0)return[];const V=new Map,q=new Map;for(const U of N.children)V.set(U.element,U),this.identityProvider&&q.set(U.id,{node:U,collapsed:this.tree.hasElement(U)&&this.tree.isCollapsed(U)});const H=[],z=W.map(U=>{const j=!!this.dataSource.hasChildren(U);if(!this.identityProvider){const R=s({element:U,parent:N,hasChildren:j,defaultCollapseState:this.getDefaultCollapseState(U)});return j&&R.defaultCollapseState===y.ObjectTreeElementCollapseState.PreserveOrExpanded&&H.push(R),R}const Y=this.identityProvider.getId(U).toString(),G=q.get(Y);if(G){const R=G.node;return V.delete(R.element),this.nodes.delete(R.element),this.nodes.set(U,R),R.element=U,R.hasChildren=j,F?G.collapsed?(R.children.forEach(J=>w(J,ie=>this.nodes.delete(ie.element))),R.children.splice(0,R.children.length),R.stale=!0):H.push(R):j&&!G.collapsed&&H.push(R),R}const K=s({element:U,parent:N,id:Y,hasChildren:j,defaultCollapseState:this.getDefaultCollapseState(U)});return x&&x.viewState.focus&&x.viewState.focus.indexOf(Y)>-1&&x.focus.push(K),x&&x.viewState.selection&&x.viewState.selection.indexOf(Y)>-1&&x.selection.push(K),(x&&x.viewState.expanded&&x.viewState.expanded.indexOf(Y)>-1||j&&K.defaultCollapseState===y.ObjectTreeElementCollapseState.PreserveOrExpanded)&&H.push(K),K});for(const U of V.values())w(U,j=>this.nodes.delete(j.element));for(const U of z)this.nodes.set(U.element,U);return N.children.splice(0,N.children.length,...z),N!==this.root&&this.autoExpandSingleChildren&&z.length===1&&H.length===0&&(z[0].forceExpanded=!0,H.push(z[0])),H}render(N,O,F){const x=N.children.map(V=>this.asTreeElement(V,O)),W=F&&{...F,diffIdentityProvider:F.diffIdentityProvider&&{getId(V){return F.diffIdentityProvider.getId(V.element)}}};this.tree.setChildren(N===this.root?null:N,x,W),N!==this.root&&this.tree.setCollapsible(N,N.hasChildren),this._onDidRender.fire()}asTreeElement(N,O){if(N.stale)return{element:N,collapsible:N.hasChildren,collapsed:!0};let F;return O&&O.viewState.expanded&&N.id&&O.viewState.expanded.indexOf(N.id)>-1?F=!1:N.forceExpanded?(F=!1,N.forceExpanded=!1):F=N.defaultCollapseState,{element:N,children:N.hasChildren?o.Iterable.map(N.children,x=>this.asTreeElement(x,O)):[],collapsible:N.hasChildren,collapsed:F}}processChildren(N){return this.sorter&&(N=[...N].sort(this.sorter.compare.bind(this.sorter))),N}dispose(){this.disposables.dispose(),this.tree.dispose()}}e.AsyncDataTree=S;class L{get element(){return{elements:this.node.element.elements.map(N=>N.element),incompressible:this.node.element.incompressible}}get children(){return this.node.children.map(N=>new L(N))}get depth(){return this.node.depth}get visibleChildrenCount(){return this.node.visibleChildrenCount}get visibleChildIndex(){return this.node.visibleChildIndex}get collapsible(){return this.node.collapsible}get collapsed(){return this.node.collapsed}get visible(){return this.node.visible}get filterData(){return this.node.filterData}constructor(N){this.node=N}}class D{constructor(N,O,F,x){this.renderer=N,this.nodeMapper=O,this.compressibleNodeMapperProvider=F,this.onDidChangeTwistieState=x,this.renderedNodes=new Map,this.disposables=[],this.templateId=N.templateId}renderTemplate(N){return{templateData:this.renderer.renderTemplate(N)}}renderElement(N,O,F,x){this.renderer.renderElement(this.nodeMapper.map(N),O,F.templateData,x)}renderCompressedElements(N,O,F,x){this.renderer.renderCompressedElements(this.compressibleNodeMapperProvider().map(N),O,F.templateData,x)}renderTwistie(N,O){return N.slow?(O.classList.add(...b.ThemeIcon.asClassNameArray(_.Codicon.treeItemLoading)),!0):(O.classList.remove(...b.ThemeIcon.asClassNameArray(_.Codicon.treeItemLoading)),!1)}disposeElement(N,O,F,x){this.renderer.disposeElement?.(this.nodeMapper.map(N),O,F.templateData,x)}disposeCompressedElements(N,O,F,x){this.renderer.disposeCompressedElements?.(this.compressibleNodeMapperProvider().map(N),O,F.templateData,x)}disposeTemplate(N){this.renderer.disposeTemplate(N.templateData)}dispose(){this.renderedNodes.clear(),this.disposables=(0,t.dispose)(this.disposables)}}function T(P){const N=P&&v(P);return N&&{...N,keyboardNavigationLabelProvider:N.keyboardNavigationLabelProvider&&{...N.keyboardNavigationLabelProvider,getCompressedNodeKeyboardNavigationLabel(O){return P.keyboardNavigationLabelProvider.getCompressedNodeKeyboardNavigationLabel(O.map(F=>F.element))}}}}class M extends S{constructor(N,O,F,x,W,V,q={}){super(N,O,F,W,V,q),this.compressionDelegate=x,this.compressibleNodeMapper=new y.WeakMapper(H=>new L(H)),this.filter=q.filter}createTree(N,O,F,x,W){const V=new k.ComposedTreeDelegate(F),q=x.map(z=>new D(z,this.nodeMapper,()=>this.compressibleNodeMapper,this._onDidChangeNodeSlowState.event)),H=T(W)||{};return new E.CompressibleObjectTree(N,O,V,q,H)}asTreeElement(N,O){return{incompressible:this.compressionDelegate.isIncompressible(N.element),...super.asTreeElement(N,O)}}updateOptions(N={}){this.tree.updateOptions(N)}render(N,O,F){if(!this.identityProvider)return super.render(N,O);const x=G=>this.identityProvider.getId(G).toString(),W=G=>{const K=new Set;for(const R of G){const J=this.tree.getCompressedTreeNode(R===this.root?null:R);if(J.element)for(const ie of J.element.elements)K.add(x(ie.element))}return K},V=W(this.tree.getSelection()),q=W(this.tree.getFocus());super.render(N,O,F);const H=this.getSelection();let z=!1;const U=this.getFocus();let j=!1;const Y=G=>{const K=G.element;if(K)for(let R=0;R{const F=this.filter.filter(O,1),x=A(F);if(x===2)throw new Error("Recursive tree visibility not supported in async data compressed trees");return x===1})),super.processChildren(N)}}e.CompressibleAsyncDataTree=M;function A(P){return typeof P=="boolean"?P?1:0:(0,I.isFilterResult)(P)?(0,I.getVisibleState)(P.visibility):(0,I.getVisibleState)(P)}}),define(ne[361],se([1,0,8,6,2,42,16,11]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SimpleWorkerServer=e.SimpleWorkerClient=void 0,e.logOnceWebWorkerWarning=o,e.create=f;const _=!1,b="default",p="$initialize";let n=!1;function o(h){y.isWeb&&(n||(n=!0,console.warn("Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/microsoft/monaco-editor#faq")),console.warn(h.message))}class t{constructor(v,w,S,L,D){this.vsWorker=v,this.req=w,this.channel=S,this.method=L,this.args=D,this.type=0}}class i{constructor(v,w,S,L){this.vsWorker=v,this.seq=w,this.res=S,this.err=L,this.type=1}}class s{constructor(v,w,S,L,D){this.vsWorker=v,this.req=w,this.channel=S,this.eventName=L,this.arg=D,this.type=2}}class g{constructor(v,w,S){this.vsWorker=v,this.req=w,this.event=S,this.type=3}}class c{constructor(v,w){this.vsWorker=v,this.req=w,this.type=4}}class l{constructor(v){this._workerId=-1,this._handler=v,this._lastSentReq=0,this._pendingReplies=Object.create(null),this._pendingEmitters=new Map,this._pendingEvents=new Map}setWorkerId(v){this._workerId=v}sendMessage(v,w,S){const L=String(++this._lastSentReq);return new Promise((D,T)=>{this._pendingReplies[L]={resolve:D,reject:T},this._send(new t(this._workerId,L,v,w,S))})}listen(v,w,S){let L=null;const D=new k.Emitter({onWillAddFirstListener:()=>{L=String(++this._lastSentReq),this._pendingEmitters.set(L,D),this._send(new s(this._workerId,L,v,w,S))},onDidRemoveLastListener:()=>{this._pendingEmitters.delete(L),this._send(new c(this._workerId,L)),L=null}});return D.event}handleMessage(v){!v||!v.vsWorker||this._workerId!==-1&&v.vsWorker!==this._workerId||this._handleMessage(v)}createProxyToRemoteChannel(v,w){const S={get:(L,D)=>(typeof D=="string"&&!L[D]&&(u(D)?L[D]=T=>this.listen(v,D,T):r(D)?L[D]=this.listen(v,D,void 0):D.charCodeAt(0)===36&&(L[D]=async(...T)=>(await w?.(),this.sendMessage(v,D,T)))),L[D])};return new Proxy(Object.create(null),S)}_handleMessage(v){switch(v.type){case 1:return this._handleReplyMessage(v);case 0:return this._handleRequestMessage(v);case 2:return this._handleSubscribeEventMessage(v);case 3:return this._handleEventMessage(v);case 4:return this._handleUnsubscribeEventMessage(v)}}_handleReplyMessage(v){if(!this._pendingReplies[v.seq]){console.warn("Got reply to unknown seq");return}const w=this._pendingReplies[v.seq];if(delete this._pendingReplies[v.seq],v.err){let S=v.err;v.err.$isError&&(S=new Error,S.name=v.err.name,S.message=v.err.message,S.stack=v.err.stack),w.reject(S);return}w.resolve(v.res)}_handleRequestMessage(v){const w=v.req;this._handler.handleMessage(v.channel,v.method,v.args).then(L=>{this._send(new i(this._workerId,w,L,void 0))},L=>{L.detail instanceof Error&&(L.detail=(0,d.transformErrorForSerialization)(L.detail)),this._send(new i(this._workerId,w,void 0,(0,d.transformErrorForSerialization)(L)))})}_handleSubscribeEventMessage(v){const w=v.req,S=this._handler.handleEvent(v.channel,v.eventName,v.arg)(L=>{this._send(new g(this._workerId,w,L))});this._pendingEvents.set(w,S)}_handleEventMessage(v){if(!this._pendingEmitters.has(v.req)){console.warn("Got event for unknown req");return}this._pendingEmitters.get(v.req).fire(v.event)}_handleUnsubscribeEventMessage(v){if(!this._pendingEvents.has(v.req)){console.warn("Got unsubscribe for unknown req");return}this._pendingEvents.get(v.req).dispose(),this._pendingEvents.delete(v.req)}_send(v){const w=[];if(v.type===0)for(let S=0;S{this._protocol.handleMessage(D)},D=>{(0,d.onUnexpectedError)(D)})),this._protocol=new l({sendMessage:(D,T)=>{this._worker.postMessage(D,T)},handleMessage:(D,T,M)=>this._handleMessage(D,T,M),handleEvent:(D,T,M)=>this._handleEvent(D,T,M)}),this._protocol.setWorkerId(this._worker.getId());let S=null;const L=globalThis.require;typeof L<"u"&&typeof L.getConfig=="function"?S=L.getConfig():typeof globalThis.requirejs<"u"&&(S=globalThis.requirejs.s.contexts._.config),this._onModuleLoaded=this._protocol.sendMessage(b,p,[this._worker.getId(),JSON.parse(JSON.stringify(S)),w.amdModuleId]),this.proxy=this._protocol.createProxyToRemoteChannel(b,async()=>{await this._onModuleLoaded}),this._onModuleLoaded.catch(D=>{this._onError("Worker failed to load "+w.amdModuleId,D)})}_handleMessage(v,w,S){const L=this._localChannels.get(v);if(!L)return Promise.reject(new Error(`Missing channel ${v} on main thread`));if(typeof L[w]!="function")return Promise.reject(new Error(`Missing method ${w} on main thread channel ${v}`));try{return Promise.resolve(L[w].apply(L,S))}catch(D){return Promise.reject(D)}}_handleEvent(v,w,S){const L=this._localChannels.get(v);if(!L)throw new Error(`Missing channel ${v} on main thread`);if(u(w)){const D=L[w].call(L,S);if(typeof D!="function")throw new Error(`Missing dynamic event ${w} on main thread channel ${v}.`);return D}if(r(w)){const D=L[w];if(typeof D!="function")throw new Error(`Missing event ${w} on main thread channel ${v}.`);return D}throw new Error(`Malformed event name ${w}`)}setChannel(v,w){this._localChannels.set(v,w)}_onError(v,w){console.error(v),console.info(w)}}e.SimpleWorkerClient=a;function r(h){return h[0]==="o"&&h[1]==="n"&&m.isUpperAsciiLetter(h.charCodeAt(2))}function u(h){return/^onDynamic/.test(h)&&m.isUpperAsciiLetter(h.charCodeAt(9))}class C{constructor(v,w){this._localChannels=new Map,this._remoteChannels=new Map,this._requestHandlerFactory=w,this._requestHandler=null,this._protocol=new l({sendMessage:(S,L)=>{v(S,L)},handleMessage:(S,L,D)=>this._handleMessage(S,L,D),handleEvent:(S,L,D)=>this._handleEvent(S,L,D)})}onmessage(v){this._protocol.handleMessage(v)}_handleMessage(v,w,S){if(v===b&&w===p)return this.initialize(S[0],S[1],S[2]);const L=v===b?this._requestHandler:this._localChannels.get(v);if(!L)return Promise.reject(new Error(`Missing channel ${v} on worker thread`));if(typeof L[w]!="function")return Promise.reject(new Error(`Missing method ${w} on worker thread channel ${v}`));try{return Promise.resolve(L[w].apply(L,S))}catch(D){return Promise.reject(D)}}_handleEvent(v,w,S){const L=v===b?this._requestHandler:this._localChannels.get(v);if(!L)throw new Error(`Missing channel ${v} on worker thread`);if(u(w)){const D=L[w].call(L,S);if(typeof D!="function")throw new Error(`Missing dynamic event ${w} on request handler.`);return D}if(r(w)){const D=L[w];if(typeof D!="function")throw new Error(`Missing event ${w} on request handler.`);return D}throw new Error(`Malformed event name ${w}`)}getChannel(v){if(!this._remoteChannels.has(v)){const w=this._protocol.createProxyToRemoteChannel(v);this._remoteChannels.set(v,w)}return this._remoteChannels.get(v)}async initialize(v,w,S){if(this._protocol.setWorkerId(v),this._requestHandlerFactory){this._requestHandler=this._requestHandlerFactory(this);return}if(w&&(typeof w.baseUrl<"u"&&delete w.baseUrl,typeof w.paths<"u"&&typeof w.paths.vs<"u"&&delete w.paths.vs,typeof w.trustedTypesPolicy<"u"&&delete w.trustedTypesPolicy,w.catchError=!0,globalThis.require.config(w)),_){const L=E.FileAccess.asBrowserUri(`${S}.js`).toString(!0);return new Promise((D,T)=>{oe([`${L}`],D,T)}).then(D=>{if(this._requestHandler=D.create(this),!this._requestHandler)throw new Error("No RequestHandler!")})}return new Promise((L,D)=>{(globalThis.require||oe)([S],M=>{if(this._requestHandler=M.create(this),!this._requestHandler){D(new Error("No RequestHandler!"));return}L()},D)})}}e.SimpleWorkerServer=C;function f(h){return new C(h,null)}}),define(ne[646],se([1,0,103,8,42,361,2,13,3]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WorkerDescriptor=void 0,e.createWebWorker=l;const b=!1;let p;typeof self=="object"&&self.constructor&&self.constructor.name==="DedicatedWorkerGlobalScope"&&globalThis.workerttPolicy!==void 0?p=globalThis.workerttPolicy:p=(0,d.createTrustedTypesPolicy)("defaultWorkerFactory",{createScriptURL:a=>a});function n(a,r){const u=globalThis.MonacoEnvironment;if(u){if(typeof u.getWorker=="function")return u.getWorker("workerMain.js",r);if(typeof u.getWorkerUrl=="function"){const C=u.getWorkerUrl("workerMain.js",r);return new Worker(p?p.createScriptURL(C):C,{name:r,type:b?"module":void 0})}}if(typeof oe=="function"){const C=oe.toUrl("vs/base/worker/workerMain.js"),f="vs/base/worker/defaultWorkerFactory.js",h=oe.toUrl(f).slice(0,-f.length),v=o(r,C,h);return new Worker(p?p.createScriptURL(v):v,{name:r,type:b?"module":void 0})}if(a){const C=o(r,a.toString(!0)),f=new Worker(p?p.createScriptURL(C):C,{name:r,type:b?"module":void 0});return b?t(f):f}throw new Error("You must define a function MonacoEnvironment.getWorkerUrl or MonacoEnvironment.getWorker")}function o(a,r,u){const C=/^((http:)|(https:)|(file:)|(vscode-file:))/.test(r);if(!(C&&r.substring(0,globalThis.origin.length)!==globalThis.origin)){const h=r.lastIndexOf("?"),v=r.lastIndexOf("#",h),w=h>0?new URLSearchParams(r.substring(h+1,~v?v:void 0)):new URLSearchParams;I.COI.addSearchParam(w,!0,!0),w.toString()?r=`${r}?${w.toString()}#${a}`:r=`${r}#${a}`}!b&&!C&&(r=new URL(r,globalThis.origin).toString());const f=new Blob([(0,m.coalesce)([`/*${a}*/`,u?`globalThis.MonacoEnvironment = { baseUrl: '${u}' };`:void 0,`globalThis._VSCODE_NLS_MESSAGES = ${JSON.stringify((0,_.getNLSMessages)())};`,`globalThis._VSCODE_NLS_LANGUAGE = ${JSON.stringify((0,_.getNLSLanguage)())};`,`globalThis._VSCODE_FILE_ROOT = '${globalThis._VSCODE_FILE_ROOT}';`,"const ttPolicy = globalThis.trustedTypes?.createPolicy('defaultWorkerFactory', { createScriptURL: value => value });","globalThis.workerttPolicy = ttPolicy;",b?`await import(ttPolicy?.createScriptURL('${r}') ?? '${r}');`:`importScripts(ttPolicy?.createScriptURL('${r}') ?? '${r}');`,b?"globalThis.postMessage({ type: 'vscode-worker-ready' });":void 0,`/*${a}*/`]).join("")],{type:"application/javascript"});return URL.createObjectURL(f)}function t(a){return new Promise((r,u)=>{a.onmessage=function(C){C.data.type==="vscode-worker-ready"&&(a.onmessage=null,r(a))},a.onerror=u})}function i(a){return typeof a.then=="function"}class s extends y.Disposable{constructor(r,u,C,f,h,v){super(),this.id=C,this.label=f;const w=n(r,f);i(w)?this.worker=w:this.worker=Promise.resolve(w),this.postMessage(u,[]),this.worker.then(S=>{S.onmessage=function(L){h(L.data)},S.onmessageerror=v,typeof S.addEventListener=="function"&&S.addEventListener("error",v)}),this._register((0,y.toDisposable)(()=>{this.worker?.then(S=>{S.onmessage=null,S.onmessageerror=null,S.removeEventListener("error",v),S.terminate()}),this.worker=null}))}getId(){return this.id}postMessage(r,u){this.worker?.then(C=>{try{C.postMessage(r,u)}catch(f){(0,k.onUnexpectedError)(f),(0,k.onUnexpectedError)(new Error(`FAILED to post message to '${this.label}'-worker`,{cause:f}))}})}}class g{constructor(r,u){this.amdModuleId=r,this.label=u,this.esmModuleLocation=b?I.FileAccess.asBrowserUri(`${r}.esm.js`):void 0}}e.WorkerDescriptor=g;class c{static{this.LAST_WORKER_ID=0}constructor(){this._webWorkerFailedBeforeError=!1}create(r,u,C){const f=++c.LAST_WORKER_ID;if(this._webWorkerFailedBeforeError)throw this._webWorkerFailedBeforeError;return new s(r.esmModuleLocation,r.amdModuleId,f,r.label||"anonymous"+f,u,h=>{(0,E.logOnceWebWorkerWarning)(h),this._webWorkerFailedBeforeError=h,C(h)})}}function l(a,r){const u=typeof a=="string"?new g(a,r):a;return new E.SimpleWorkerClient(new c,u)}}),define(ne[647],se([1,0,14,6,2,252,19]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InMemoryStorageDatabase=e.Storage=e.StorageState=e.StorageHint=void 0;var m;(function(n){n[n.STORAGE_DOES_NOT_EXIST=0]="STORAGE_DOES_NOT_EXIST",n[n.STORAGE_IN_MEMORY=1]="STORAGE_IN_MEMORY"})(m||(e.StorageHint=m={}));var _;(function(n){n[n.None=0]="None",n[n.Initialized=1]="Initialized",n[n.Closed=2]="Closed"})(_||(e.StorageState=_={}));class b extends I.Disposable{static{this.DEFAULT_FLUSH_DELAY=100}constructor(o,t=Object.create(null)){super(),this.database=o,this.options=t,this._onDidChangeStorage=this._register(new k.PauseableEmitter),this.onDidChangeStorage=this._onDidChangeStorage.event,this.state=_.None,this.cache=new Map,this.flushDelayer=this._register(new d.ThrottledDelayer(b.DEFAULT_FLUSH_DELAY)),this.pendingDeletes=new Set,this.pendingInserts=new Map,this.whenFlushedCallbacks=[],this.registerListeners()}registerListeners(){this._register(this.database.onDidChangeItemsExternal(o=>this.onDidChangeItemsExternal(o)))}onDidChangeItemsExternal(o){this._onDidChangeStorage.pause();try{o.changed?.forEach((t,i)=>this.acceptExternal(i,t)),o.deleted?.forEach(t=>this.acceptExternal(t,void 0))}finally{this._onDidChangeStorage.resume()}}acceptExternal(o,t){if(this.state===_.Closed)return;let i=!1;(0,y.isUndefinedOrNull)(t)?i=this.cache.delete(o):this.cache.get(o)!==t&&(this.cache.set(o,t),i=!0),i&&this._onDidChangeStorage.fire({key:o,external:!0})}get(o,t){const i=this.cache.get(o);return(0,y.isUndefinedOrNull)(i)?t:i}getBoolean(o,t){const i=this.get(o);return(0,y.isUndefinedOrNull)(i)?t:i==="true"}getNumber(o,t){const i=this.get(o);return(0,y.isUndefinedOrNull)(i)?t:parseInt(i,10)}async set(o,t,i=!1){if(this.state===_.Closed)return;if((0,y.isUndefinedOrNull)(t))return this.delete(o,i);const s=(0,y.isObject)(t)||Array.isArray(t)?(0,E.stringify)(t):String(t);if(this.cache.get(o)!==s)return this.cache.set(o,s),this.pendingInserts.set(o,s),this.pendingDeletes.delete(o),this._onDidChangeStorage.fire({key:o,external:i}),this.doFlush()}async delete(o,t=!1){if(!(this.state===_.Closed||!this.cache.delete(o)))return this.pendingDeletes.has(o)||this.pendingDeletes.add(o),this.pendingInserts.delete(o),this._onDidChangeStorage.fire({key:o,external:t}),this.doFlush()}get hasPending(){return this.pendingInserts.size>0||this.pendingDeletes.size>0}async flushPending(){if(!this.hasPending)return;const o={insert:this.pendingInserts,delete:this.pendingDeletes};return this.pendingDeletes=new Set,this.pendingInserts=new Map,this.database.updateItems(o).finally(()=>{if(!this.hasPending)for(;this.whenFlushedCallbacks.length;)this.whenFlushedCallbacks.pop()?.()})}async doFlush(o){return this.options.hint===m.STORAGE_IN_MEMORY?this.flushPending():this.flushDelayer.trigger(()=>this.flushPending(),o)}}e.Storage=b;class p{constructor(){this.onDidChangeItemsExternal=k.Event.None,this.items=new Map}async updateItems(o){o.insert?.forEach((t,i)=>this.items.set(i,t)),o.delete?.forEach(t=>this.items.delete(t))}}e.InMemoryStorageDatabase=p}),define(ne[362],se([1,0,2,6,5]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ElementSizeObserver=void 0;class E extends d.Disposable{constructor(m,_){super(),this._onDidChange=this._register(new k.Emitter),this.onDidChange=this._onDidChange.event,this._referenceDomElement=m,this._width=-1,this._height=-1,this._resizeObserver=null,this.measureReferenceDomElement(!1,_)}dispose(){this.stopObserving(),super.dispose()}getWidth(){return this._width}getHeight(){return this._height}startObserving(){if(!this._resizeObserver&&this._referenceDomElement){let m=null;const _=()=>{m?this.observe({width:m.width,height:m.height}):this.observe()};let b=!1,p=!1;const n=()=>{if(b&&!p)try{b=!1,p=!0,_()}finally{(0,I.scheduleAtNextAnimationFrame)((0,I.getWindow)(this._referenceDomElement),()=>{p=!1,n()})}};this._resizeObserver=new ResizeObserver(o=>{o&&o[0]&&o[0].contentRect?m={width:o[0].contentRect.width,height:o[0].contentRect.height}:m=null,b=!0,n()}),this._resizeObserver.observe(this._referenceDomElement)}}stopObserving(){this._resizeObserver&&(this._resizeObserver.disconnect(),this._resizeObserver=null)}observe(m){this.measureReferenceDomElement(!0,m)}measureReferenceDomElement(m,_){let b=0,p=0;_?(b=_.width,p=_.height):this._referenceDomElement&&(b=this._referenceDomElement.clientWidth,p=this._referenceDomElement.clientHeight),b=Math.max(5,b),p=Math.max(5,p),(this._width!==b||this._height!==p)&&(this._width=b,this._height=p,m&&this._onDidChange.fire())}}e.ElementSizeObserver=E}),define(ne[648],se([1,0,5,18,57,19,3]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ManagedHoverWidget=void 0;class m{constructor(b,p,n){this.hoverDelegate=b,this.target=p,this.fadeInAnimation=n}async update(b,p,n){if(this._cancellationTokenSource&&(this._cancellationTokenSource.dispose(!0),this._cancellationTokenSource=void 0),this.isDisposed)return;let o;if(b===void 0||(0,E.isString)(b)||(0,d.isHTMLElement)(b))o=b;else if(!(0,E.isFunction)(b.markdown))o=b.markdown??b.markdownNotSupportedFallback;else{this._hoverWidget||this.show((0,y.localize)(69,"Loading..."),p,n),this._cancellationTokenSource=new k.CancellationTokenSource;const t=this._cancellationTokenSource.token;if(o=await b.markdown(t),o===void 0&&(o=b.markdownNotSupportedFallback),this.isDisposed||t.isCancellationRequested)return}this.show(o,p,n)}show(b,p,n){const o=this._hoverWidget;if(this.hasContent(b)){const t={content:b,target:this.target,actions:n?.actions,linkHandler:n?.linkHandler,trapFocus:n?.trapFocus,appearance:{showPointer:this.hoverDelegate.placement==="element",skipFadeInAnimation:!this.fadeInAnimation||!!o,showHoverHint:n?.appearance?.showHoverHint},position:{hoverPosition:2}};this._hoverWidget=this.hoverDelegate.showHover(t,p)}o?.dispose()}hasContent(b){return b?(0,I.isMarkdownString)(b)?!!b.value:!0:!1}get isDisposed(){return this._hoverWidget?.isDisposed}dispose(){this._hoverWidget?.dispose(),this._cancellationTokenSource?.dispose(!0),this._cancellationTokenSource=void 0}}e.ManagedHoverWidget=m}),define(ne[649],se([1,0,5,39,56]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewContentWidgets=void 0;class E extends I.ViewPart{constructor(o,t){super(o),this._viewDomNode=t,this._widgets={},this.domNode=(0,k.createFastDomNode)(document.createElement("div")),I.PartFingerprints.write(this.domNode,1),this.domNode.setClassName("contentWidgets"),this.domNode.setPosition("absolute"),this.domNode.setTop(0),this.overflowingContentWidgetsDomNode=(0,k.createFastDomNode)(document.createElement("div")),I.PartFingerprints.write(this.overflowingContentWidgetsDomNode,2),this.overflowingContentWidgetsDomNode.setClassName("overflowingContentWidgets")}dispose(){super.dispose(),this._widgets={}}onConfigurationChanged(o){const t=Object.keys(this._widgets);for(const i of t)this._widgets[i].onConfigurationChanged(o);return!0}onDecorationsChanged(o){return!0}onFlushed(o){return!0}onLineMappingChanged(o){return this._updateAnchorsViewPositions(),!0}onLinesChanged(o){return this._updateAnchorsViewPositions(),!0}onLinesDeleted(o){return this._updateAnchorsViewPositions(),!0}onLinesInserted(o){return this._updateAnchorsViewPositions(),!0}onScrollChanged(o){return!0}onZonesChanged(o){return!0}_updateAnchorsViewPositions(){const o=Object.keys(this._widgets);for(const t of o)this._widgets[t].updateAnchorViewPosition()}addWidget(o){const t=new y(this._context,this._viewDomNode,o);this._widgets[t.id]=t,t.allowEditorOverflow?this.overflowingContentWidgetsDomNode.appendChild(t.domNode):this.domNode.appendChild(t.domNode),this.setShouldRender()}setWidgetPosition(o,t,i,s,g){this._widgets[o.getId()].setPosition(t,i,s,g),this.setShouldRender()}removeWidget(o){const t=o.getId();if(this._widgets.hasOwnProperty(t)){const i=this._widgets[t];delete this._widgets[t];const s=i.domNode.domNode;s.remove(),s.removeAttribute("monaco-visible-content-widget"),this.setShouldRender()}}shouldSuppressMouseDownOnWidget(o){return this._widgets.hasOwnProperty(o)?this._widgets[o].suppressMouseDown:!1}onBeforeRender(o){const t=Object.keys(this._widgets);for(const i of t)this._widgets[i].onBeforeRender(o)}prepareRender(o){const t=Object.keys(this._widgets);for(const i of t)this._widgets[i].prepareRender(o)}render(o){const t=Object.keys(this._widgets);for(const i of t)this._widgets[i].render(o)}}e.ViewContentWidgets=E;class y{constructor(o,t,i){this._primaryAnchor=new m(null,null),this._secondaryAnchor=new m(null,null),this._context=o,this._viewDomNode=t,this._actual=i,this.domNode=(0,k.createFastDomNode)(this._actual.getDomNode()),this.id=this._actual.getId(),this.allowEditorOverflow=this._actual.allowEditorOverflow||!1,this.suppressMouseDown=this._actual.suppressMouseDown||!1;const s=this._context.configuration.options,g=s.get(146);this._fixedOverflowWidgets=s.get(42),this._contentWidth=g.contentWidth,this._contentLeft=g.contentLeft,this._lineHeight=s.get(67),this._affinity=null,this._preference=[],this._cachedDomNodeOffsetWidth=-1,this._cachedDomNodeOffsetHeight=-1,this._maxWidth=this._getMaxWidth(),this._isVisible=!1,this._renderData=null,this.domNode.setPosition(this._fixedOverflowWidgets&&this.allowEditorOverflow?"fixed":"absolute"),this.domNode.setDisplay("none"),this.domNode.setVisibility("hidden"),this.domNode.setAttribute("widgetId",this.id),this.domNode.setMaxWidth(this._maxWidth)}onConfigurationChanged(o){const t=this._context.configuration.options;if(this._lineHeight=t.get(67),o.hasChanged(146)){const i=t.get(146);this._contentLeft=i.contentLeft,this._contentWidth=i.contentWidth,this._maxWidth=this._getMaxWidth()}}updateAnchorViewPosition(){this._setPosition(this._affinity,this._primaryAnchor.modelPosition,this._secondaryAnchor.modelPosition)}_setPosition(o,t,i){this._affinity=o,this._primaryAnchor=s(t,this._context.viewModel,this._affinity),this._secondaryAnchor=s(i,this._context.viewModel,this._affinity);function s(g,c,l){if(!g)return new m(null,null);const a=c.model.validatePosition(g);if(c.coordinatesConverter.modelPositionIsVisible(a)){const r=c.coordinatesConverter.convertModelPositionToViewPosition(a,l??void 0);return new m(g,r)}return new m(g,null)}}_getMaxWidth(){const o=this.domNode.domNode.ownerDocument,t=o.defaultView;return this.allowEditorOverflow?t?.innerWidth||o.documentElement.offsetWidth||o.body.offsetWidth:this._contentWidth}setPosition(o,t,i,s){this._setPosition(s,o,t),this._preference=i,this._primaryAnchor.viewPosition&&this._preference&&this._preference.length>0?this.domNode.setDisplay("block"):this.domNode.setDisplay("none"),this._cachedDomNodeOffsetWidth=-1,this._cachedDomNodeOffsetHeight=-1}_layoutBoxInViewport(o,t,i,s){const g=o.top,c=g,l=o.top+o.height,a=s.viewportHeight-l,r=g-i,u=c>=i,C=l,f=a>=i;let h=o.left;return h+t>s.scrollLeft+s.viewportWidth&&(h=s.scrollLeft+s.viewportWidth-t),ha){const f=C-(a-s);C-=f,i-=f}if(C=w,D=C+i<=f.height-S;return this._fixedOverflowWidgets?{fitsAbove:L,aboveTop:Math.max(u,w),fitsBelow:D,belowTop:C,left:v}:{fitsAbove:L,aboveTop:g,fitsBelow:D,belowTop:c,left:h}}_prepareRenderWidgetAtExactPositionOverflowing(o){return new _(o.top,o.left+this._contentLeft)}_getAnchorsCoordinates(o){const t=g(this._primaryAnchor.viewPosition,this._affinity,this._lineHeight),i=this._secondaryAnchor.viewPosition?.lineNumber===this._primaryAnchor.viewPosition?.lineNumber?this._secondaryAnchor.viewPosition:null,s=g(i,this._affinity,this._lineHeight);return{primary:t,secondary:s};function g(c,l,a){if(!c)return null;const r=o.visibleRangeForPosition(c);if(!r)return null;const u=c.column===1&&l===3?0:r.left,C=o.getVerticalOffsetForLineNumber(c.lineNumber)-o.scrollTop;return new b(C,u,a)}}_reduceAnchorCoordinates(o,t,i){if(!t)return o;const s=this._context.configuration.options.get(50);let g=t.left;return go.endLineNumber||this.domNode.setMaxWidth(this._maxWidth)}prepareRender(o){this._renderData=this._prepareRenderWidget(o)}render(o){if(!this._renderData||this._renderData.kind==="offViewport"){this._isVisible&&(this.domNode.removeAttribute("monaco-visible-content-widget"),this._isVisible=!1,this._renderData?.kind==="offViewport"&&this._renderData.preserveFocus?this.domNode.setTop(-1e3):this.domNode.setVisibility("hidden")),typeof this._actual.afterRender=="function"&&p(this._actual.afterRender,this._actual,null);return}this.allowEditorOverflow?(this.domNode.setTop(this._renderData.coordinate.top),this.domNode.setLeft(this._renderData.coordinate.left)):(this.domNode.setTop(this._renderData.coordinate.top+o.scrollTop-o.bigNumbersDelta),this.domNode.setLeft(this._renderData.coordinate.left)),this._isVisible||(this.domNode.setVisibility("inherit"),this.domNode.setAttribute("monaco-visible-content-widget","true"),this._isVisible=!0),typeof this._actual.afterRender=="function"&&p(this._actual.afterRender,this._actual,this._renderData.position)}}class m{constructor(o,t){this.modelPosition=o,this.viewPosition=t}}class _{constructor(o,t){this.top=o,this.left=t,this._coordinateBrand=void 0}}class b{constructor(o,t,i){this.top=o,this.left=t,this.height=i,this._anchorCoordinateBrand=void 0}}function p(n,o,...t){try{return n.call(o,...t)}catch{return null}}}),define(ne[650],se([1,0,39,56,5,492]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewOverlayWidgets=void 0;class E extends k.ViewPart{constructor(m,_){super(m),this._viewDomNode=_;const p=this._context.configuration.options.get(146);this._widgets={},this._verticalScrollbarWidth=p.verticalScrollbarWidth,this._minimapWidth=p.minimap.minimapWidth,this._horizontalScrollbarHeight=p.horizontalScrollbarHeight,this._editorHeight=p.height,this._editorWidth=p.width,this._viewDomNodeRect={top:0,left:0,width:0,height:0},this._domNode=(0,d.createFastDomNode)(document.createElement("div")),k.PartFingerprints.write(this._domNode,4),this._domNode.setClassName("overlayWidgets"),this.overflowingOverlayWidgetsDomNode=(0,d.createFastDomNode)(document.createElement("div")),k.PartFingerprints.write(this.overflowingOverlayWidgetsDomNode,5),this.overflowingOverlayWidgetsDomNode.setClassName("overflowingOverlayWidgets")}dispose(){super.dispose(),this._widgets={}}getDomNode(){return this._domNode}onConfigurationChanged(m){const b=this._context.configuration.options.get(146);return this._verticalScrollbarWidth=b.verticalScrollbarWidth,this._minimapWidth=b.minimap.minimapWidth,this._horizontalScrollbarHeight=b.horizontalScrollbarHeight,this._editorHeight=b.height,this._editorWidth=b.width,!0}addWidget(m){const _=(0,d.createFastDomNode)(m.getDomNode());this._widgets[m.getId()]={widget:m,preference:null,domNode:_},_.setPosition("absolute"),_.setAttribute("widgetId",m.getId()),m.allowEditorOverflow?this.overflowingOverlayWidgetsDomNode.appendChild(_):this._domNode.appendChild(_),this.setShouldRender(),this._updateMaxMinWidth()}setWidgetPosition(m,_){const b=this._widgets[m.getId()],p=_?_.preference:null,n=_?.stackOridinal;return b.preference===p&&b.stack===n?(this._updateMaxMinWidth(),!1):(b.preference=p,b.stack=n,this.setShouldRender(),this._updateMaxMinWidth(),!0)}removeWidget(m){const _=m.getId();if(this._widgets.hasOwnProperty(_)){const p=this._widgets[_].domNode.domNode;delete this._widgets[_],p.remove(),this.setShouldRender(),this._updateMaxMinWidth()}}_updateMaxMinWidth(){let m=0;const _=Object.keys(this._widgets);for(let b=0,p=_.length;b0);_.sort((p,n)=>(this._widgets[p].stack||0)-(this._widgets[n].stack||0));for(let p=0,n=_.length;p{this._instantiateSome(1)})),this._register((0,d.runWhenWindowIdle)((0,d.getWindow)(this._editor.getDomNode()),()=>{this._instantiateSome(2)})),this._register((0,d.runWhenWindowIdle)((0,d.getWindow)(this._editor.getDomNode()),()=>{this._instantiateSome(3)},5e3))}saveViewState(){const m={};for(const[_,b]of this._instances)typeof b.saveViewState=="function"&&(m[_]=b.saveViewState());return m}restoreViewState(m){for(const[_,b]of this._instances)typeof b.restoreViewState=="function"&&b.restoreViewState(m[_])}get(m){return this._instantiateById(m),this._instances.get(m)||null}onBeforeInteractionEvent(){this._instantiateSome(2)}onAfterModelAttached(){return(0,d.runWhenWindowIdle)((0,d.getWindow)(this._editor?.getDomNode()),()=>{this._instantiateSome(1)},50)}_instantiateSome(m){if(this._finishedInstantiation[m])return;this._finishedInstantiation[m]=!0;const _=this._findPendingContributionsByInstantiation(m);for(const b of _)this._instantiateById(b.id)}_findPendingContributionsByInstantiation(m){const _=[];for(const[,b]of this._pending)b.instantiation===m&&_.push(b);return _}_instantiateById(m){const _=this._pending.get(m);if(_){if(this._pending.delete(m),!this._instantiationService||!this._editor)throw new Error("Cannot instantiate contributions before being initialized!");try{const b=this._instantiationService.createInstance(_.ctor,this._editor);this._instances.set(_.id,b),typeof b.restoreViewState=="function"&&_.instantiation!==0&&console.warn(`Editor contribution '${_.id}' should be eager instantiated because it uses saveViewState / restoreViewState.`)}catch(b){(0,k.onUnexpectedError)(b)}}}}e.CodeEditorContributions=E}),define(ne[363],se([1,0,173,2,21,65]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffEditorSash=e.SashLayout=void 0;class y{resetSash(){this._sashRatio.set(void 0,void 0)}constructor(b,p){this._options=b,this.dimensions=p,this.sashLeft=(0,E.derivedWithSetter)(this,n=>{const o=this._sashRatio.read(n)??this._options.splitViewDefaultRatio.read(n);return this._computeSashLeft(o,n)},(n,o)=>{const t=this.dimensions.width.get();this._sashRatio.set(n/t,o)}),this._sashRatio=(0,I.observableValue)(this,void 0)}_computeSashLeft(b,p){const n=this.dimensions.width.read(p),o=Math.floor(this._options.splitViewDefaultRatio.read(p)*n),t=this._options.enableSplitViewResizing.read(p)?Math.floor(b*n):o,i=100;return n<=i*2?o:tn-i?n-i:t}}e.SashLayout=y;class m extends k.Disposable{constructor(b,p,n,o,t,i){super(),this._domNode=b,this._dimensions=p,this._enabled=n,this._boundarySashes=o,this.sashLeft=t,this._resetSash=i,this._sash=this._register(new d.Sash(this._domNode,{getVerticalSashTop:s=>0,getVerticalSashLeft:s=>this.sashLeft.get(),getVerticalSashHeight:s=>this._dimensions.height.get()},{orientation:0})),this._startSashPosition=void 0,this._register(this._sash.onDidStart(()=>{this._startSashPosition=this.sashLeft.get()})),this._register(this._sash.onDidChange(s=>{this.sashLeft.set(this._startSashPosition+(s.currentX-s.startX),void 0)})),this._register(this._sash.onDidEnd(()=>this._sash.layout())),this._register(this._sash.onDidReset(()=>this._resetSash())),this._register((0,I.autorun)(s=>{const g=this._boundarySashes.read(s);g&&(this._sash.orthogonalEndSash=g.bottom)})),this._register((0,I.autorun)(s=>{const g=this._enabled.read(s);this._sash.state=g?3:0,this.sashLeft.read(s),this._dimensions.height.read(s),this._sash.layout()}))}}e.DiffEditorSash=m}),define(ne[652],se([1,0,5,41,26,2,16,30,3]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlineDiffDeletedCodeMargin=void 0;class b extends E.Disposable{get visibility(){return this._visibility}set visibility(n){this._visibility!==n&&(this._visibility=n,this._diffActions.style.visibility=n?"visible":"hidden")}constructor(n,o,t,i,s,g,c,l,a){super(),this._getViewZoneId=n,this._marginDomNode=o,this._modifiedEditor=t,this._diff=i,this._editor=s,this._viewLineCounts=g,this._originalTextModel=c,this._contextMenuService=l,this._clipboardService=a,this._visibility=!1,this._marginDomNode.style.zIndex="10",this._diffActions=document.createElement("div"),this._diffActions.className=m.ThemeIcon.asClassName(I.Codicon.lightBulb)+" lightbulb-glyph",this._diffActions.style.position="absolute";const r=this._modifiedEditor.getOption(67);this._diffActions.style.right="0px",this._diffActions.style.visibility="hidden",this._diffActions.style.height=`${r}px`,this._diffActions.style.lineHeight=`${r}px`,this._marginDomNode.appendChild(this._diffActions);let u=0;const C=t.getOption(128)&&!y.isIOS,f=(h,v)=>{this._contextMenuService.showContextMenu({domForShadowRoot:C?t.getDomNode()??void 0:void 0,getAnchor:()=>({x:h,y:v}),getActions:()=>{const w=[],S=i.modified.isEmpty;return w.push(new k.Action("diff.clipboard.copyDeletedContent",S?i.original.length>1?(0,_.localize)(99,"Copy deleted lines"):(0,_.localize)(100,"Copy deleted line"):i.original.length>1?(0,_.localize)(101,"Copy changed lines"):(0,_.localize)(102,"Copy changed line"),void 0,!0,async()=>{const D=this._originalTextModel.getValueInRange(i.original.toExclusiveRange());await this._clipboardService.writeText(D)})),i.original.length>1&&w.push(new k.Action("diff.clipboard.copyDeletedLineContent",S?(0,_.localize)(103,"Copy deleted line ({0})",i.original.startLineNumber+u):(0,_.localize)(104,"Copy changed line ({0})",i.original.startLineNumber+u),void 0,!0,async()=>{let D=this._originalTextModel.getLineContent(i.original.startLineNumber+u);D===""&&(D=this._originalTextModel.getEndOfLineSequence()===0?` -`:`\r -`),await this._clipboardService.writeText(D)})),t.getOption(92)||w.push(new k.Action("diff.inline.revertChange",(0,_.localize)(105,"Revert this change"),void 0,!0,async()=>{this._editor.revert(this._diff)})),w},autoSelectFirstItem:!0})};this._register((0,d.addStandardDisposableListener)(this._diffActions,"mousedown",h=>{if(!h.leftButton)return;const{top:v,height:w}=(0,d.getDomNodePagePosition)(this._diffActions),S=Math.floor(r/3);h.preventDefault(),f(h.posx,v+w+S)})),this._register(t.onMouseMove(h=>{(h.target.type===8||h.target.type===5)&&h.target.detail.viewZoneId===this._getViewZoneId()?(u=this._updateLightBulbPosition(this._marginDomNode,h.event.browserEvent.y,r),this.visibility=!0):this.visibility=!1})),this._register(t.onMouseDown(h=>{h.event.leftButton&&(h.target.type===8||h.target.type===5)&&h.target.detail.viewZoneId===this._getViewZoneId()&&(h.event.preventDefault(),u=this._updateLightBulbPosition(this._marginDomNode,h.event.browserEvent.y,r),f(h.event.posx,h.event.posy+r))}))}_updateLightBulbPosition(n,o,t){const{top:i}=(0,d.getDomNodePagePosition)(n),s=o-i,g=Math.floor(s/t),c=g*t;if(this._diffActions.style.top=`${c}px`,this._viewLineCounts){let l=0;for(let a=0;a{const C=this._diffModel.read(r)?.diff.read(r);if(!C)return o;const f=this._editors.modifiedSelections.read(r);if(f.every(S=>S.isEmpty()))return o;const h=new m.LineRangeSet(f.map(S=>m.LineRange.fromRangeInclusive(S))),w=C.mappings.filter(S=>S.lineRangeMapping.innerChanges&&h.intersects(S.lineRangeMapping.modified)).map(S=>({mapping:S,rangeMappings:S.lineRangeMapping.innerChanges.filter(L=>f.some(D=>_.Range.areIntersecting(L.modifiedRange,D)))}));return w.length===0||w.every(S=>S.rangeMappings.length===0)?o:w}),this._register((0,y.autorunWithStore)((r,u)=>{if(!this._options.shouldRenderOldRevertArrows.read(r))return;const C=this._diffModel.read(r),f=C?.diff.read(r);if(!C||!f||C.movedTextToCompare.read(r))return;const h=[],v=this._selectedDiffs.read(r),w=new Set(v.map(S=>S.mapping));if(v.length>0){const S=this._editors.modifiedSelections.read(r),L=u.add(new i(S[S.length-1].positionLineNumber,this._widget,v.flatMap(D=>D.rangeMappings),!0));this._editors.modified.addGlyphMarginWidget(L),h.push(L)}for(const S of f.mappings)if(!w.has(S)&&!S.lineRangeMapping.modified.isEmpty&&S.lineRangeMapping.innerChanges){const L=u.add(new i(S.lineRangeMapping.modified.startLineNumber,this._widget,S.lineRangeMapping,!1));this._editors.modified.addGlyphMarginWidget(L),h.push(L)}u.add((0,E.toDisposable)(()=>{for(const S of h)this._editors.modified.removeGlyphMarginWidget(S)}))}))}}e.RevertButtonsFeature=t;class i extends E.Disposable{static{this.counter=0}getId(){return this._id}constructor(g,c,l,a){super(),this._lineNumber=g,this._widget=c,this._diffs=l,this._revertSelection=a,this._id=`revertButton${i.counter++}`,this._domNode=(0,d.h)("div.revertButton",{title:this._revertSelection?(0,n.localize)(122,"Revert Selected Changes"):(0,n.localize)(123,"Revert Change")},[(0,k.renderIcon)(I.Codicon.arrowRight)]).root,this._register((0,d.addDisposableListener)(this._domNode,d.EventType.MOUSE_DOWN,r=>{r.button!==2&&(r.stopPropagation(),r.preventDefault())})),this._register((0,d.addDisposableListener)(this._domNode,d.EventType.MOUSE_UP,r=>{r.stopPropagation(),r.preventDefault()})),this._register((0,d.addDisposableListener)(this._domNode,d.EventType.CLICK,r=>{this._diffs instanceof b.LineRangeMapping?this._widget.revert(this._diffs):this._widget.revertRangeMappings(this._diffs),r.stopPropagation(),r.preventDefault()}))}getDomNode(){return this._domNode}getPosition(){return{lane:p.GlyphMarginLane.Right,range:{startColumn:1,startLineNumber:this._lineNumber,endColumn:1,endLineNumber:this._lineNumber},zIndex:10001}}}e.RevertButton=i}),define(ne[88],se([1,0,67,18,2,21,362,9,4,113]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RefCounted=e.DisposableCancellationTokenSource=e.ManagedOverlayWidget=e.PlaceholderViewZone=e.ViewZoneOverlayWidget=e.ObservableElementSizeObserver=void 0,e.joinCombine=p,e.applyObservableDecorations=n,e.appendRemoveOnDispose=o,e.prependRemoveOnDispose=t,e.animatedObservable=s,e.applyStyle=r,e.applyViewZones=u,e.translatePosition=f,e.filterWithPrevious=v;function p(D,T,M,A){if(D.length===0)return T;if(T.length===0)return D;const P=[];let N=0,O=0;for(;NV?(P.push(x),O++):(P.push(A(F,x)),N++,O++)}for(;N`Apply decorations from ${T.debugName}`},P=>{const N=T.read(P);A.set(N)})),M.add({dispose:()=>{A.clear()}}),M}function o(D,T){return D.appendChild(T),(0,I.toDisposable)(()=>{T.remove()})}function t(D,T){return D.prepend(T),(0,I.toDisposable)(()=>{T.remove()})}class i extends I.Disposable{get width(){return this._width}get height(){return this._height}get automaticLayout(){return this._automaticLayout}constructor(T,M){super(),this._automaticLayout=!1,this.elementSizeObserver=this._register(new y.ElementSizeObserver(T,M)),this._width=(0,E.observableValue)(this,this.elementSizeObserver.getWidth()),this._height=(0,E.observableValue)(this,this.elementSizeObserver.getHeight()),this._register(this.elementSizeObserver.onDidChange(A=>(0,E.transaction)(P=>{this._width.set(this.elementSizeObserver.getWidth(),P),this._height.set(this.elementSizeObserver.getHeight(),P)})))}observe(T){this.elementSizeObserver.observe(T)}setAutomaticLayout(T){this._automaticLayout=T,T?this.elementSizeObserver.startObserving():this.elementSizeObserver.stopObserving()}}e.ObservableElementSizeObserver=i;function s(D,T,M){let A=T.get(),P=A,N=A;const O=(0,E.observableValue)("animatedValue",A);let F=-1;const x=300;let W;M.add((0,E.autorunHandleChanges)({createEmptyChangeSummary:()=>({animate:!1}),handleChange:(q,H)=>(q.didChange(T)&&(H.animate=H.animate||q.change),!0)},(q,H)=>{W!==void 0&&(D.cancelAnimationFrame(W),W=void 0),P=N,A=T.read(q),F=Date.now()-(H.animate?0:x),V()}));function V(){const q=Date.now()-F;N=Math.floor(g(q,P,A-P,x)),q{this._actualTop.set(A,void 0)},this.onComputedHeight=A=>{this._actualHeight.set(A,void 0)}}}e.PlaceholderViewZone=l;class a{static{this._counter=0}constructor(T,M){this._editor=T,this._domElement=M,this._overlayWidgetId=`managedOverlayWidget-${a._counter++}`,this._overlayWidget={getId:()=>this._overlayWidgetId,getDomNode:()=>this._domElement,getPosition:()=>null},this._editor.addOverlayWidget(this._overlayWidget)}dispose(){this._editor.removeOverlayWidget(this._overlayWidget)}}e.ManagedOverlayWidget=a;function r(D,T){return(0,E.autorun)(M=>{for(let[A,P]of Object.entries(T))P&&typeof P=="object"&&"read"in P&&(P=P.read(M)),typeof P=="number"&&(P=`${P}px`),A=A.replace(/[A-Z]/g,N=>"-"+N.toLowerCase()),D.style[A]=P})}function u(D,T,M,A){const P=new I.DisposableStore,N=[];return P.add((0,E.autorunWithStore)((O,F)=>{const x=T.read(O),W=new Map,V=new Map;M&&M(!0),D.changeViewZones(q=>{for(const H of N)q.removeZone(H),A?.delete(H);N.length=0;for(const H of x){const z=q.addZone(H);H.setZoneId&&H.setZoneId(z),N.push(z),A?.add(z),W.set(H,z)}}),M&&M(!1),F.add((0,E.autorunHandleChanges)({createEmptyChangeSummary(){return{zoneIds:[]}},handleChange(q,H){const z=V.get(q.changedObservable);return z!==void 0&&H.zoneIds.push(z),!0}},(q,H)=>{for(const z of x)z.onChange&&(V.set(z.onChange,W.get(z)),z.onChange.read(q));M&&M(!0),D.changeViewZones(z=>{for(const U of H.zoneIds)z.layoutZone(U)}),M&&M(!1)}))})),P.add({dispose(){M&&M(!0),D.changeViewZones(O=>{for(const F of N)O.removeZone(F)}),A?.clear(),M&&M(!1)}}),P}class C extends k.CancellationTokenSource{dispose(){super.dispose(!0)}}e.DisposableCancellationTokenSource=C;function f(D,T){const M=(0,d.findLast)(T,P=>P.original.startLineNumber<=D.lineNumber);if(!M)return _.Range.fromPositions(D);if(M.original.endLineNumberExclusive<=D.lineNumber){const P=D.lineNumber-M.original.endLineNumberExclusive+M.modified.endLineNumberExclusive;return _.Range.fromPositions(new m.Position(P,D.column))}if(!M.innerChanges)return _.Range.fromPositions(new m.Position(M.modified.startLineNumber,1));const A=(0,d.findLast)(M.innerChanges,P=>P.originalRange.getStartPosition().isBeforeOrEqual(D));if(!A){const P=D.lineNumber-M.original.startLineNumber+M.modified.startLineNumber;return _.Range.fromPositions(new m.Position(P,D.column))}if(A.originalRange.containsPosition(D))return A.modifiedRange;{const P=h(A.originalRange.getEndPosition(),D);return _.Range.fromPositions(P.addToPosition(A.modifiedRange.getEndPosition()))}}function h(D,T){return D.lineNumber===T.lineNumber?new b.TextLength(0,T.column-D.column):new b.TextLength(T.lineNumber-D.lineNumber,T.column-1)}function v(D,T){let M;return D.filter(A=>{const P=T(A,M);return M=A,P})}class w{static create(T,M=void 0){return new S(T,T,M)}static createWithDisposable(T,M,A=void 0){const P=new I.DisposableStore;return P.add(M),P.add(T),new S(T,P,A)}}e.RefCounted=w;class S extends w{constructor(T,M,A){super(),this.object=T,this._disposable=M,this._debugOwner=A,this._refCount=1,this._isDisposed=!1,this._owners=[],A&&this._addOwner(A)}_addOwner(T){T&&this._owners.push(T)}createNewRef(T){return this._refCount++,T&&this._addOwner(T),new L(this,T)}dispose(){this._isDisposed||(this._isDisposed=!0,this._decreaseRefCount(this._debugOwner))}_decreaseRefCount(T){if(this._refCount--,this._refCount===0&&this._disposable.dispose(),T){const M=this._owners.indexOf(T);M!==-1&&this._owners.splice(M,1)}}}class L extends w{constructor(T,M){super(),this._base=T,this._debugOwner=M,this._isDisposed=!1}get object(){return this._base.object}createNewRef(T){return this._base.createNewRef(T)}dispose(){this._isDisposed||(this._isDisposed=!0,this._base._decreaseRefCount(this._debugOwner))}}}),define(ne[364],se([1,0,5,87,41,13,67,26,2,21,30,88,68,3]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MovedBlocksLinesFeature=void 0;class i extends _.Disposable{static{this.movedCodeBlockPadding=4}constructor(l,a,r,u,C){super(),this._rootElement=l,this._diffModel=a,this._originalEditorLayoutInfo=r,this._modifiedEditorLayoutInfo=u,this._editors=C,this._originalScrollTop=(0,b.observableFromEvent)(this,this._editors.original.onDidScrollChange,()=>this._editors.original.getScrollTop()),this._modifiedScrollTop=(0,b.observableFromEvent)(this,this._editors.modified.onDidScrollChange,()=>this._editors.modified.getScrollTop()),this._viewZonesChanged=(0,b.observableSignalFromEvent)("onDidChangeViewZones",this._editors.modified.onDidChangeViewZones),this.width=(0,b.observableValue)(this,0),this._modifiedViewZonesChangedSignal=(0,b.observableSignalFromEvent)("modified.onDidChangeViewZones",this._editors.modified.onDidChangeViewZones),this._originalViewZonesChangedSignal=(0,b.observableSignalFromEvent)("original.onDidChangeViewZones",this._editors.original.onDidChangeViewZones),this._state=(0,b.derivedWithStore)(this,(S,L)=>{this._element.replaceChildren();const D=this._diffModel.read(S),T=D?.diff.read(S)?.movedTexts;if(!T||T.length===0){this.width.set(0,void 0);return}this._viewZonesChanged.read(S);const M=this._originalEditorLayoutInfo.read(S),A=this._modifiedEditorLayoutInfo.read(S);if(!M||!A){this.width.set(0,void 0);return}this._modifiedViewZonesChangedSignal.read(S),this._originalViewZonesChangedSignal.read(S);const P=T.map(q=>{function H(ie,ue){const he=ue.getTopForLineNumber(ie.startLineNumber,!0),pe=ue.getTopForLineNumber(ie.endLineNumberExclusive,!0);return(he+pe)/2}const z=H(q.lineRangeMapping.original,this._editors.original),U=this._originalScrollTop.read(S),j=H(q.lineRangeMapping.modified,this._editors.modified),Y=this._modifiedScrollTop.read(S),G=z-U,K=j-Y,R=Math.min(z,j),J=Math.max(z,j);return{range:new o.OffsetRange(R,J),from:G,to:K,fromWithoutScroll:z,toWithoutScroll:j,move:q}});P.sort((0,E.tieBreakComparators)((0,E.compareBy)(q=>q.fromWithoutScroll>q.toWithoutScroll,E.booleanComparator),(0,E.compareBy)(q=>q.fromWithoutScroll>q.toWithoutScroll?q.fromWithoutScroll:-q.toWithoutScroll,E.numberComparator)));const N=s.compute(P.map(q=>q.range)),O=10,F=M.verticalScrollbarWidth,x=(N.getTrackCount()-1)*10+O*2,W=F+x+(A.contentLeft-i.movedCodeBlockPadding);let V=0;for(const q of P){const H=N.getTrack(V),z=F+O+H*10,U=15,j=15,Y=W,G=A.glyphMarginWidth+A.lineNumbersWidth,K=18,R=document.createElementNS("http://www.w3.org/2000/svg","rect");R.classList.add("arrow-rectangle"),R.setAttribute("x",`${Y-G}`),R.setAttribute("y",`${q.to-K/2}`),R.setAttribute("width",`${G}`),R.setAttribute("height",`${K}`),this._element.appendChild(R);const J=document.createElementNS("http://www.w3.org/2000/svg","g"),ie=document.createElementNS("http://www.w3.org/2000/svg","path");ie.setAttribute("d",`M 0 ${q.from} L ${z} ${q.from} L ${z} ${q.to} L ${Y-j} ${q.to}`),ie.setAttribute("fill","none"),J.appendChild(ie);const ue=document.createElementNS("http://www.w3.org/2000/svg","polygon");ue.classList.add("arrow"),L.add((0,b.autorun)(he=>{ie.classList.toggle("currentMove",q.move===D.activeMovedText.read(he)),ue.classList.toggle("currentMove",q.move===D.activeMovedText.read(he))})),ue.setAttribute("points",`${Y-j},${q.to-U/2} ${Y},${q.to} ${Y-j},${q.to+U/2}`),J.appendChild(ue),this._element.appendChild(J),V++}this.width.set(x,void 0)}),this._element=document.createElementNS("http://www.w3.org/2000/svg","svg"),this._element.setAttribute("class","moved-blocks-lines"),this._rootElement.appendChild(this._element),this._register((0,_.toDisposable)(()=>this._element.remove())),this._register((0,b.autorun)(S=>{const L=this._originalEditorLayoutInfo.read(S),D=this._modifiedEditorLayoutInfo.read(S);!L||!D||(this._element.style.left=`${L.width-L.verticalScrollbarWidth}px`,this._element.style.height=`${L.height}px`,this._element.style.width=`${L.verticalScrollbarWidth+L.contentLeft-i.movedCodeBlockPadding+this.width.read(S)}px`)})),this._register((0,b.recomputeInitiallyAndOnChange)(this._state));const f=(0,b.derived)(S=>{const D=this._diffModel.read(S)?.diff.read(S);return D?D.movedTexts.map(T=>({move:T,original:new n.PlaceholderViewZone((0,b.constObservable)(T.lineRangeMapping.original.startLineNumber-1),18),modified:new n.PlaceholderViewZone((0,b.constObservable)(T.lineRangeMapping.modified.startLineNumber-1),18)})):[]});this._register((0,n.applyViewZones)(this._editors.original,f.map(S=>S.map(L=>L.original)))),this._register((0,n.applyViewZones)(this._editors.modified,f.map(S=>S.map(L=>L.modified)))),this._register((0,b.autorunWithStore)((S,L)=>{const D=f.read(S);for(const T of D)L.add(new g(this._editors.original,T.original,T.move,"original",this._diffModel.get())),L.add(new g(this._editors.modified,T.modified,T.move,"modified",this._diffModel.get()))}));const h=(0,b.observableSignalFromEvent)("original.onDidFocusEditorWidget",S=>this._editors.original.onDidFocusEditorWidget(()=>setTimeout(()=>S(void 0),0))),v=(0,b.observableSignalFromEvent)("modified.onDidFocusEditorWidget",S=>this._editors.modified.onDidFocusEditorWidget(()=>setTimeout(()=>S(void 0),0)));let w="modified";this._register((0,b.autorunHandleChanges)({createEmptyChangeSummary:()=>{},handleChange:(S,L)=>(S.didChange(h)&&(w="original"),S.didChange(v)&&(w="modified"),!0)},S=>{h.read(S),v.read(S);const L=this._diffModel.read(S);if(!L)return;const D=L.diff.read(S);let T;if(D&&w==="original"){const M=this._editors.originalCursor.read(S);M&&(T=D.movedTexts.find(A=>A.lineRangeMapping.original.contains(M.lineNumber)))}if(D&&w==="modified"){const M=this._editors.modifiedCursor.read(S);M&&(T=D.movedTexts.find(A=>A.lineRangeMapping.modified.contains(M.lineNumber)))}T!==L.movedTextToCompare.get()&&L.movedTextToCompare.set(void 0,void 0),L.setActiveMovedText(T)}))}}e.MovedBlocksLinesFeature=i;class s{static compute(l){const a=[],r=[];for(const u of l){let C=a.findIndex(f=>!f.intersectsStrict(u));C===-1&&(a.length>=6?C=(0,y.findMaxIdx)(a,(0,E.compareBy)(h=>h.intersectWithRangeLength(u),E.numberComparator)):(C=a.length,a.push(new o.OffsetRangeSet))),a[C].addRange(u),r.push(C)}return new s(a.length,r)}constructor(l,a){this._trackCount=l,this.trackPerLineIdx=a}getTrack(l){return this.trackPerLineIdx[l]}getTrackCount(){return this._trackCount}}class g extends n.ViewZoneOverlayWidget{constructor(l,a,r,u,C){const f=(0,d.h)("div.diff-hidden-lines-widget");super(l,a,f.root),this._editor=l,this._move=r,this._kind=u,this._diffModel=C,this._nodes=(0,d.h)("div.diff-moved-code-block",{style:{marginRight:"4px"}},[(0,d.h)("div.text-content@textContent"),(0,d.h)("div.action-bar@actionBar")]),f.root.appendChild(this._nodes.root);const h=(0,b.observableFromEvent)(this._editor.onDidLayoutChange,()=>this._editor.getLayoutInfo());this._register((0,n.applyStyle)(this._nodes.root,{paddingRight:h.map(D=>D.verticalScrollbarWidth)}));let v;r.changes.length>0?v=this._kind==="original"?(0,t.localize)(118,"Code moved with changes to line {0}-{1}",this._move.lineRangeMapping.modified.startLineNumber,this._move.lineRangeMapping.modified.endLineNumberExclusive-1):(0,t.localize)(119,"Code moved with changes from line {0}-{1}",this._move.lineRangeMapping.original.startLineNumber,this._move.lineRangeMapping.original.endLineNumberExclusive-1):v=this._kind==="original"?(0,t.localize)(120,"Code moved to line {0}-{1}",this._move.lineRangeMapping.modified.startLineNumber,this._move.lineRangeMapping.modified.endLineNumberExclusive-1):(0,t.localize)(121,"Code moved from line {0}-{1}",this._move.lineRangeMapping.original.startLineNumber,this._move.lineRangeMapping.original.endLineNumberExclusive-1);const w=this._register(new k.ActionBar(this._nodes.actionBar,{highlightToggledItems:!0})),S=new I.Action("",v,"",!1);w.push(S,{icon:!1,label:!0});const L=new I.Action("","Compare",p.ThemeIcon.asClassName(m.Codicon.compareChanges),!0,()=>{this._editor.focus(),this._diffModel.movedTextToCompare.set(this._diffModel.movedTextToCompare.get()===r?void 0:this._move,void 0)});this._register((0,b.autorun)(D=>{const T=this._diffModel.movedTextToCompare.read(D)===r;L.checked=T})),w.push(L,{icon:!1,label:!0})}}}),define(ne[654],se([1,0,5,2,21,55,68]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorGutter=void 0;class m extends k.Disposable{constructor(p,n,o){super(),this._editor=p,this._domNode=n,this.itemProvider=o,this.scrollTop=(0,I.observableFromEvent)(this,this._editor.onDidScrollChange,s=>this._editor.getScrollTop()),this.isScrollTopZero=this.scrollTop.map(s=>s===0),this.modelAttached=(0,I.observableFromEvent)(this,this._editor.onDidChangeModel,s=>this._editor.hasModel()),this.editorOnDidChangeViewZones=(0,I.observableSignalFromEvent)("onDidChangeViewZones",this._editor.onDidChangeViewZones),this.editorOnDidContentSizeChange=(0,I.observableSignalFromEvent)("onDidContentSizeChange",this._editor.onDidContentSizeChange),this.domNodeSizeChanged=(0,I.observableSignal)("domNodeSizeChanged"),this.views=new Map,this._domNode.className="gutter monaco-editor";const t=this._domNode.appendChild((0,d.h)("div.scroll-decoration",{role:"presentation",ariaHidden:"true",style:{width:"100%"}}).root),i=new ResizeObserver(()=>{(0,I.transaction)(s=>{this.domNodeSizeChanged.trigger(s)})});i.observe(this._domNode),this._register((0,k.toDisposable)(()=>i.disconnect())),this._register((0,I.autorun)(s=>{t.className=this.isScrollTopZero.read(s)?"":"scroll-decoration"})),this._register((0,I.autorun)(s=>this.render(s)))}dispose(){super.dispose(),(0,d.reset)(this._domNode)}render(p){if(!this.modelAttached.read(p))return;this.domNodeSizeChanged.read(p),this.editorOnDidChangeViewZones.read(p),this.editorOnDidContentSizeChange.read(p);const n=this.scrollTop.read(p),o=this._editor.getVisibleRanges(),t=new Set(this.views.keys()),i=y.OffsetRange.ofStartAndLength(0,this._domNode.clientHeight);if(!i.isEmpty)for(const s of o){const g=new E.LineRange(s.startLineNumber,s.endLineNumber+1),c=this.itemProvider.getIntersectingGutterItems(g,p);(0,I.transaction)(l=>{for(const a of c){if(!a.range.intersect(g))continue;t.delete(a.id);let r=this.views.get(a.id);if(r)r.item.set(a,l);else{const h=document.createElement("div");this._domNode.appendChild(h);const v=(0,I.observableValue)("item",a),w=this.itemProvider.createView(v,h);r=new _(v,w,h),this.views.set(a.id,r)}const u=a.range.startLineNumber<=this._editor.getModel().getLineCount()?this._editor.getTopForLineNumber(a.range.startLineNumber,!0)-n:this._editor.getBottomForLineNumber(a.range.startLineNumber-1,!1)-n,f=(a.range.endLineNumberExclusive===1?Math.max(u,this._editor.getTopForLineNumber(a.range.startLineNumber,!1)-n):Math.max(u,this._editor.getBottomForLineNumber(a.range.endLineNumberExclusive-1,!0)-n))-u;r.domNode.style.top=`${u}px`,r.domNode.style.height=`${f}px`,r.gutterItemView.layout(y.OffsetRange.ofStartAndLength(u,f),i)}})}for(const s of t){const g=this.views.get(s);g.gutterItemView.dispose(),g.domNode.remove(),this.views.delete(s)}}}e.EditorGutter=m;class _{constructor(p,n,o){this.item=p,this.gutterItemView=n,this.domNode=o}}}),define(ne[365],se([1,0,41]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ActionRunnerWithContext=void 0;class k extends d.ActionRunner{constructor(E){super(),this._getContext=E}runAction(E,y){const m=this._getContext();return super.runAction(E,m)}}e.ActionRunnerWithContext=k}),define(ne[37],se([1,0,13,60,16,197,147,3]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorOptions=e.editorOptionsRegistry=e.EDITOR_FONT_DEFAULTS=e.unicodeHighlightConfigKeys=e.inUntrustedWorkspace=e.ShowLightbulbIconMode=e.EditorLayoutInfoComputer=e.EditorFontVariations=e.EditorFontLigatures=e.TextEditorCursorStyle=e.ApplyUpdateResult=e.ComputeOptionsMemory=e.ConfigurationChangedEvent=e.MINIMAP_GUTTER_WIDTH=void 0,e.boolean=s,e.clampedInt=c,e.clampedFloat=a,e.stringSet=C,e.filterValidationDecorations=ge,e.MINIMAP_GUTTER_WIDTH=8;class _{constructor(fe){this._values=fe}hasChanged(fe){return this._values[fe]}}e.ConfigurationChangedEvent=_;class b{constructor(){this.stableMinimapLayoutInput=null,this.stableFitMaxMinimapScale=0,this.stableFitRemainingWidth=0}}e.ComputeOptionsMemory=b;class p{constructor(fe,_e,xe,be){this.id=fe,this.name=_e,this.defaultValue=xe,this.schema=be}applyUpdate(fe,_e){return o(fe,_e)}compute(fe,_e,xe){return xe}}class n{constructor(fe,_e){this.newValue=fe,this.didChange=_e}}e.ApplyUpdateResult=n;function o(Fe,fe){if(typeof Fe!="object"||typeof fe!="object"||!Fe||!fe)return new n(fe,Fe!==fe);if(Array.isArray(Fe)||Array.isArray(fe)){const xe=Array.isArray(Fe)&&Array.isArray(fe)&&d.equals(Fe,fe);return new n(fe,!xe)}let _e=!1;for(const xe in fe)if(fe.hasOwnProperty(xe)){const be=o(Fe[xe],fe[xe]);be.didChange&&(Fe[xe]=be.newValue,_e=!0)}return new n(Fe,_e)}class t{constructor(fe){this.schema=void 0,this.id=fe,this.name="_never_",this.defaultValue=void 0}applyUpdate(fe,_e){return o(fe,_e)}validate(fe){return this.defaultValue}}class i{constructor(fe,_e,xe,be){this.id=fe,this.name=_e,this.defaultValue=xe,this.schema=be}applyUpdate(fe,_e){return o(fe,_e)}validate(fe){return typeof fe>"u"?this.defaultValue:fe}compute(fe,_e,xe){return xe}}function s(Fe,fe){return typeof Fe>"u"?fe:Fe==="false"?!1:!!Fe}class g extends i{constructor(fe,_e,xe,be=void 0){typeof be<"u"&&(be.type="boolean",be.default=xe),super(fe,_e,xe,be)}validate(fe){return s(fe,this.defaultValue)}}function c(Fe,fe,_e,xe){if(typeof Fe>"u")return fe;let be=parseInt(Fe,10);return isNaN(be)?fe:(be=Math.max(_e,be),be=Math.min(xe,be),be|0)}class l extends i{static clampedInt(fe,_e,xe,be){return c(fe,_e,xe,be)}constructor(fe,_e,xe,be,ve,we=void 0){typeof we<"u"&&(we.type="integer",we.default=xe,we.minimum=be,we.maximum=ve),super(fe,_e,xe,we),this.minimum=be,this.maximum=ve}validate(fe){return l.clampedInt(fe,this.defaultValue,this.minimum,this.maximum)}}function a(Fe,fe,_e,xe){if(typeof Fe>"u")return fe;const be=r.float(Fe,fe);return r.clamp(be,_e,xe)}class r extends i{static clamp(fe,_e,xe){return fe<_e?_e:fe>xe?xe:fe}static float(fe,_e){if(typeof fe=="number")return fe;if(typeof fe>"u")return _e;const xe=parseFloat(fe);return isNaN(xe)?_e:xe}constructor(fe,_e,xe,be,ve){typeof ve<"u"&&(ve.type="number",ve.default=xe),super(fe,_e,xe,ve),this.validationFn=be}validate(fe){return this.validationFn(r.float(fe,this.defaultValue))}}class u extends i{static string(fe,_e){return typeof fe!="string"?_e:fe}constructor(fe,_e,xe,be=void 0){typeof be<"u"&&(be.type="string",be.default=xe),super(fe,_e,xe,be)}validate(fe){return u.string(fe,this.defaultValue)}}function C(Fe,fe,_e,xe){return typeof Fe!="string"?fe:xe&&Fe in xe?xe[Fe]:_e.indexOf(Fe)===-1?fe:Fe}class f extends i{constructor(fe,_e,xe,be,ve=void 0){typeof ve<"u"&&(ve.type="string",ve.enum=be,ve.default=xe),super(fe,_e,xe,ve),this._allowedValues=be}validate(fe){return C(fe,this.defaultValue,this._allowedValues)}}class h extends p{constructor(fe,_e,xe,be,ve,we,Te=void 0){typeof Te<"u"&&(Te.type="string",Te.enum=ve,Te.default=be),super(fe,_e,xe,Te),this._allowedValues=ve,this._convert=we}validate(fe){return typeof fe!="string"?this.defaultValue:this._allowedValues.indexOf(fe)===-1?this.defaultValue:this._convert(fe)}}function v(Fe){switch(Fe){case"none":return 0;case"keep":return 1;case"brackets":return 2;case"advanced":return 3;case"full":return 4}}class w extends p{constructor(){super(2,"accessibilitySupport",0,{type:"string",enum:["auto","on","off"],enumDescriptions:[m.localize(183,"Use platform APIs to detect when a Screen Reader is attached."),m.localize(184,"Optimize for usage with a Screen Reader."),m.localize(185,"Assume a screen reader is not attached.")],default:"auto",tags:["accessibility"],description:m.localize(186,"Controls if the UI should run in a mode where it is optimized for screen readers.")})}validate(fe){switch(fe){case"auto":return 0;case"off":return 1;case"on":return 2}return this.defaultValue}compute(fe,_e,xe){return xe===0?fe.accessibilitySupport:xe}}class S extends p{constructor(){const fe={insertSpace:!0,ignoreEmptyLines:!0};super(23,"comments",fe,{"editor.comments.insertSpace":{type:"boolean",default:fe.insertSpace,description:m.localize(187,"Controls whether a space character is inserted when commenting.")},"editor.comments.ignoreEmptyLines":{type:"boolean",default:fe.ignoreEmptyLines,description:m.localize(188,"Controls if empty lines should be ignored with toggle, add or remove actions for line comments.")}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe;return{insertSpace:s(_e.insertSpace,this.defaultValue.insertSpace),ignoreEmptyLines:s(_e.ignoreEmptyLines,this.defaultValue.ignoreEmptyLines)}}}function L(Fe){switch(Fe){case"blink":return 1;case"smooth":return 2;case"phase":return 3;case"expand":return 4;case"solid":return 5}}var D;(function(Fe){Fe[Fe.Line=1]="Line",Fe[Fe.Block=2]="Block",Fe[Fe.Underline=3]="Underline",Fe[Fe.LineThin=4]="LineThin",Fe[Fe.BlockOutline=5]="BlockOutline",Fe[Fe.UnderlineThin=6]="UnderlineThin"})(D||(e.TextEditorCursorStyle=D={}));function T(Fe){switch(Fe){case"line":return D.Line;case"block":return D.Block;case"underline":return D.Underline;case"line-thin":return D.LineThin;case"block-outline":return D.BlockOutline;case"underline-thin":return D.UnderlineThin}}class M extends t{constructor(){super(143)}compute(fe,_e,xe){const be=["monaco-editor"];return _e.get(39)&&be.push(_e.get(39)),fe.extraEditorClassName&&be.push(fe.extraEditorClassName),_e.get(74)==="default"?be.push("mouse-default"):_e.get(74)==="copy"&&be.push("mouse-copy"),_e.get(112)&&be.push("showUnused"),_e.get(141)&&be.push("showDeprecated"),be.join(" ")}}class A extends g{constructor(){super(37,"emptySelectionClipboard",!0,{description:m.localize(189,"Controls whether copying without a selection copies the current line.")})}compute(fe,_e,xe){return xe&&fe.emptySelectionClipboard}}class P extends p{constructor(){const fe={cursorMoveOnType:!0,seedSearchStringFromSelection:"always",autoFindInSelection:"never",globalFindClipboard:!1,addExtraSpaceOnTop:!0,loop:!0};super(41,"find",fe,{"editor.find.cursorMoveOnType":{type:"boolean",default:fe.cursorMoveOnType,description:m.localize(190,"Controls whether the cursor should jump to find matches while typing.")},"editor.find.seedSearchStringFromSelection":{type:"string",enum:["never","always","selection"],default:fe.seedSearchStringFromSelection,enumDescriptions:[m.localize(191,"Never seed search string from the editor selection."),m.localize(192,"Always seed search string from the editor selection, including word at cursor position."),m.localize(193,"Only seed search string from the editor selection.")],description:m.localize(194,"Controls whether the search string in the Find Widget is seeded from the editor selection.")},"editor.find.autoFindInSelection":{type:"string",enum:["never","always","multiline"],default:fe.autoFindInSelection,enumDescriptions:[m.localize(195,"Never turn on Find in Selection automatically (default)."),m.localize(196,"Always turn on Find in Selection automatically."),m.localize(197,"Turn on Find in Selection automatically when multiple lines of content are selected.")],description:m.localize(198,"Controls the condition for turning on Find in Selection automatically.")},"editor.find.globalFindClipboard":{type:"boolean",default:fe.globalFindClipboard,description:m.localize(199,"Controls whether the Find Widget should read or modify the shared find clipboard on macOS."),included:I.isMacintosh},"editor.find.addExtraSpaceOnTop":{type:"boolean",default:fe.addExtraSpaceOnTop,description:m.localize(200,"Controls whether the Find Widget should add extra lines on top of the editor. When true, you can scroll beyond the first line when the Find Widget is visible.")},"editor.find.loop":{type:"boolean",default:fe.loop,description:m.localize(201,"Controls whether the search automatically restarts from the beginning (or the end) when no further matches can be found.")}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe;return{cursorMoveOnType:s(_e.cursorMoveOnType,this.defaultValue.cursorMoveOnType),seedSearchStringFromSelection:typeof fe.seedSearchStringFromSelection=="boolean"?fe.seedSearchStringFromSelection?"always":"never":C(_e.seedSearchStringFromSelection,this.defaultValue.seedSearchStringFromSelection,["never","always","selection"]),autoFindInSelection:typeof fe.autoFindInSelection=="boolean"?fe.autoFindInSelection?"always":"never":C(_e.autoFindInSelection,this.defaultValue.autoFindInSelection,["never","always","multiline"]),globalFindClipboard:s(_e.globalFindClipboard,this.defaultValue.globalFindClipboard),addExtraSpaceOnTop:s(_e.addExtraSpaceOnTop,this.defaultValue.addExtraSpaceOnTop),loop:s(_e.loop,this.defaultValue.loop)}}}class N extends p{static{this.OFF='"liga" off, "calt" off'}static{this.ON='"liga" on, "calt" on'}constructor(){super(51,"fontLigatures",N.OFF,{anyOf:[{type:"boolean",description:m.localize(202,"Enables/Disables font ligatures ('calt' and 'liga' font features). Change this to a string for fine-grained control of the 'font-feature-settings' CSS property.")},{type:"string",description:m.localize(203,"Explicit 'font-feature-settings' CSS property. A boolean can be passed instead if one only needs to turn on/off ligatures.")}],description:m.localize(204,"Configures font ligatures or font features. Can be either a boolean to enable/disable ligatures or a string for the value of the CSS 'font-feature-settings' property."),default:!1})}validate(fe){return typeof fe>"u"?this.defaultValue:typeof fe=="string"?fe==="false"||fe.length===0?N.OFF:fe==="true"?N.ON:fe:fe?N.ON:N.OFF}}e.EditorFontLigatures=N;class O extends p{static{this.OFF="normal"}static{this.TRANSLATE="translate"}constructor(){super(54,"fontVariations",O.OFF,{anyOf:[{type:"boolean",description:m.localize(205,"Enables/Disables the translation from font-weight to font-variation-settings. Change this to a string for fine-grained control of the 'font-variation-settings' CSS property.")},{type:"string",description:m.localize(206,"Explicit 'font-variation-settings' CSS property. A boolean can be passed instead if one only needs to translate font-weight to font-variation-settings.")}],description:m.localize(207,"Configures font variations. Can be either a boolean to enable/disable the translation from font-weight to font-variation-settings or a string for the value of the CSS 'font-variation-settings' property."),default:!1})}validate(fe){return typeof fe>"u"?this.defaultValue:typeof fe=="string"?fe==="false"?O.OFF:fe==="true"?O.TRANSLATE:fe:fe?O.TRANSLATE:O.OFF}compute(fe,_e,xe){return fe.fontInfo.fontVariationSettings}}e.EditorFontVariations=O;class F extends t{constructor(){super(50)}compute(fe,_e,xe){return fe.fontInfo}}class x extends i{constructor(){super(52,"fontSize",e.EDITOR_FONT_DEFAULTS.fontSize,{type:"number",minimum:6,maximum:100,default:e.EDITOR_FONT_DEFAULTS.fontSize,description:m.localize(208,"Controls the font size in pixels.")})}validate(fe){const _e=r.float(fe,this.defaultValue);return _e===0?e.EDITOR_FONT_DEFAULTS.fontSize:r.clamp(_e,6,100)}compute(fe,_e,xe){return fe.fontInfo.fontSize}}class W extends p{static{this.SUGGESTION_VALUES=["normal","bold","100","200","300","400","500","600","700","800","900"]}static{this.MINIMUM_VALUE=1}static{this.MAXIMUM_VALUE=1e3}constructor(){super(53,"fontWeight",e.EDITOR_FONT_DEFAULTS.fontWeight,{anyOf:[{type:"number",minimum:W.MINIMUM_VALUE,maximum:W.MAXIMUM_VALUE,errorMessage:m.localize(209,'Only "normal" and "bold" keywords or numbers between 1 and 1000 are allowed.')},{type:"string",pattern:"^(normal|bold|1000|[1-9][0-9]{0,2})$"},{enum:W.SUGGESTION_VALUES}],default:e.EDITOR_FONT_DEFAULTS.fontWeight,description:m.localize(210,'Controls the font weight. Accepts "normal" and "bold" keywords or numbers between 1 and 1000.')})}validate(fe){return fe==="normal"||fe==="bold"?fe:String(l.clampedInt(fe,e.EDITOR_FONT_DEFAULTS.fontWeight,W.MINIMUM_VALUE,W.MAXIMUM_VALUE))}}class V extends p{constructor(){const fe={multiple:"peek",multipleDefinitions:"peek",multipleTypeDefinitions:"peek",multipleDeclarations:"peek",multipleImplementations:"peek",multipleReferences:"peek",multipleTests:"peek",alternativeDefinitionCommand:"editor.action.goToReferences",alternativeTypeDefinitionCommand:"editor.action.goToReferences",alternativeDeclarationCommand:"editor.action.goToReferences",alternativeImplementationCommand:"",alternativeReferenceCommand:"",alternativeTestsCommand:""},_e={type:"string",enum:["peek","gotoAndPeek","goto"],default:fe.multiple,enumDescriptions:[m.localize(211,"Show Peek view of the results (default)"),m.localize(212,"Go to the primary result and show a Peek view"),m.localize(213,"Go to the primary result and enable Peek-less navigation to others")]},xe=["","editor.action.referenceSearch.trigger","editor.action.goToReferences","editor.action.peekImplementation","editor.action.goToImplementation","editor.action.peekTypeDefinition","editor.action.goToTypeDefinition","editor.action.peekDeclaration","editor.action.revealDeclaration","editor.action.peekDefinition","editor.action.revealDefinitionAside","editor.action.revealDefinition"];super(58,"gotoLocation",fe,{"editor.gotoLocation.multiple":{deprecationMessage:m.localize(214,"This setting is deprecated, please use separate settings like 'editor.editor.gotoLocation.multipleDefinitions' or 'editor.editor.gotoLocation.multipleImplementations' instead.")},"editor.gotoLocation.multipleDefinitions":{description:m.localize(215,"Controls the behavior the 'Go to Definition'-command when multiple target locations exist."),..._e},"editor.gotoLocation.multipleTypeDefinitions":{description:m.localize(216,"Controls the behavior the 'Go to Type Definition'-command when multiple target locations exist."),..._e},"editor.gotoLocation.multipleDeclarations":{description:m.localize(217,"Controls the behavior the 'Go to Declaration'-command when multiple target locations exist."),..._e},"editor.gotoLocation.multipleImplementations":{description:m.localize(218,"Controls the behavior the 'Go to Implementations'-command when multiple target locations exist."),..._e},"editor.gotoLocation.multipleReferences":{description:m.localize(219,"Controls the behavior the 'Go to References'-command when multiple target locations exist."),..._e},"editor.gotoLocation.alternativeDefinitionCommand":{type:"string",default:fe.alternativeDefinitionCommand,enum:xe,description:m.localize(220,"Alternative command id that is being executed when the result of 'Go to Definition' is the current location.")},"editor.gotoLocation.alternativeTypeDefinitionCommand":{type:"string",default:fe.alternativeTypeDefinitionCommand,enum:xe,description:m.localize(221,"Alternative command id that is being executed when the result of 'Go to Type Definition' is the current location.")},"editor.gotoLocation.alternativeDeclarationCommand":{type:"string",default:fe.alternativeDeclarationCommand,enum:xe,description:m.localize(222,"Alternative command id that is being executed when the result of 'Go to Declaration' is the current location.")},"editor.gotoLocation.alternativeImplementationCommand":{type:"string",default:fe.alternativeImplementationCommand,enum:xe,description:m.localize(223,"Alternative command id that is being executed when the result of 'Go to Implementation' is the current location.")},"editor.gotoLocation.alternativeReferenceCommand":{type:"string",default:fe.alternativeReferenceCommand,enum:xe,description:m.localize(224,"Alternative command id that is being executed when the result of 'Go to Reference' is the current location.")}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe;return{multiple:C(_e.multiple,this.defaultValue.multiple,["peek","gotoAndPeek","goto"]),multipleDefinitions:_e.multipleDefinitions??C(_e.multipleDefinitions,"peek",["peek","gotoAndPeek","goto"]),multipleTypeDefinitions:_e.multipleTypeDefinitions??C(_e.multipleTypeDefinitions,"peek",["peek","gotoAndPeek","goto"]),multipleDeclarations:_e.multipleDeclarations??C(_e.multipleDeclarations,"peek",["peek","gotoAndPeek","goto"]),multipleImplementations:_e.multipleImplementations??C(_e.multipleImplementations,"peek",["peek","gotoAndPeek","goto"]),multipleReferences:_e.multipleReferences??C(_e.multipleReferences,"peek",["peek","gotoAndPeek","goto"]),multipleTests:_e.multipleTests??C(_e.multipleTests,"peek",["peek","gotoAndPeek","goto"]),alternativeDefinitionCommand:u.string(_e.alternativeDefinitionCommand,this.defaultValue.alternativeDefinitionCommand),alternativeTypeDefinitionCommand:u.string(_e.alternativeTypeDefinitionCommand,this.defaultValue.alternativeTypeDefinitionCommand),alternativeDeclarationCommand:u.string(_e.alternativeDeclarationCommand,this.defaultValue.alternativeDeclarationCommand),alternativeImplementationCommand:u.string(_e.alternativeImplementationCommand,this.defaultValue.alternativeImplementationCommand),alternativeReferenceCommand:u.string(_e.alternativeReferenceCommand,this.defaultValue.alternativeReferenceCommand),alternativeTestsCommand:u.string(_e.alternativeTestsCommand,this.defaultValue.alternativeTestsCommand)}}}class q extends p{constructor(){const fe={enabled:!0,delay:300,hidingDelay:300,sticky:!0,above:!0};super(60,"hover",fe,{"editor.hover.enabled":{type:"boolean",default:fe.enabled,description:m.localize(225,"Controls whether the hover is shown.")},"editor.hover.delay":{type:"number",default:fe.delay,minimum:0,maximum:1e4,description:m.localize(226,"Controls the delay in milliseconds after which the hover is shown.")},"editor.hover.sticky":{type:"boolean",default:fe.sticky,description:m.localize(227,"Controls whether the hover should remain visible when mouse is moved over it.")},"editor.hover.hidingDelay":{type:"integer",minimum:0,default:fe.hidingDelay,description:m.localize(228,"Controls the delay in milliseconds after which the hover is hidden. Requires `editor.hover.sticky` to be enabled.")},"editor.hover.above":{type:"boolean",default:fe.above,description:m.localize(229,"Prefer showing hovers above the line, if there's space.")}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe;return{enabled:s(_e.enabled,this.defaultValue.enabled),delay:l.clampedInt(_e.delay,this.defaultValue.delay,0,1e4),sticky:s(_e.sticky,this.defaultValue.sticky),hidingDelay:l.clampedInt(_e.hidingDelay,this.defaultValue.hidingDelay,0,6e5),above:s(_e.above,this.defaultValue.above)}}}class H extends t{constructor(){super(146)}compute(fe,_e,xe){return H.computeLayout(_e,{memory:fe.memory,outerWidth:fe.outerWidth,outerHeight:fe.outerHeight,isDominatedByLongLines:fe.isDominatedByLongLines,lineHeight:fe.fontInfo.lineHeight,viewLineCount:fe.viewLineCount,lineNumbersDigitCount:fe.lineNumbersDigitCount,typicalHalfwidthCharacterWidth:fe.fontInfo.typicalHalfwidthCharacterWidth,maxDigitWidth:fe.fontInfo.maxDigitWidth,pixelRatio:fe.pixelRatio,glyphMarginDecorationLaneCount:fe.glyphMarginDecorationLaneCount})}static computeContainedMinimapLineCount(fe){const _e=fe.height/fe.lineHeight,xe=Math.floor(fe.paddingTop/fe.lineHeight);let be=Math.floor(fe.paddingBottom/fe.lineHeight);fe.scrollBeyondLastLine&&(be=Math.max(be,_e-1));const ve=(xe+fe.viewLineCount+be)/(fe.pixelRatio*fe.height),we=Math.floor(fe.viewLineCount/ve);return{typicalViewportLineCount:_e,extraLinesBeforeFirstLine:xe,extraLinesBeyondLastLine:be,desiredRatio:ve,minimapLineCount:we}}static _computeMinimapLayout(fe,_e){const xe=fe.outerWidth,be=fe.outerHeight,ve=fe.pixelRatio;if(!fe.minimap.enabled)return{renderMinimap:0,minimapLeft:0,minimapWidth:0,minimapHeightIsEditorHeight:!1,minimapIsSampling:!1,minimapScale:1,minimapLineHeight:1,minimapCanvasInnerWidth:0,minimapCanvasInnerHeight:Math.floor(ve*be),minimapCanvasOuterWidth:0,minimapCanvasOuterHeight:be};const we=_e.stableMinimapLayoutInput,Te=we&&fe.outerHeight===we.outerHeight&&fe.lineHeight===we.lineHeight&&fe.typicalHalfwidthCharacterWidth===we.typicalHalfwidthCharacterWidth&&fe.pixelRatio===we.pixelRatio&&fe.scrollBeyondLastLine===we.scrollBeyondLastLine&&fe.paddingTop===we.paddingTop&&fe.paddingBottom===we.paddingBottom&&fe.minimap.enabled===we.minimap.enabled&&fe.minimap.side===we.minimap.side&&fe.minimap.size===we.minimap.size&&fe.minimap.showSlider===we.minimap.showSlider&&fe.minimap.renderCharacters===we.minimap.renderCharacters&&fe.minimap.maxColumn===we.minimap.maxColumn&&fe.minimap.scale===we.minimap.scale&&fe.verticalScrollbarWidth===we.verticalScrollbarWidth&&fe.isViewportWrapping===we.isViewportWrapping,Pe=fe.lineHeight,Be=fe.typicalHalfwidthCharacterWidth,He=fe.scrollBeyondLastLine,$e=fe.minimap.renderCharacters;let je=ve>=2?Math.round(fe.minimap.scale*2):fe.minimap.scale;const Xe=fe.minimap.maxColumn,et=fe.minimap.size,dt=fe.minimap.side,at=fe.verticalScrollbarWidth,st=fe.viewLineCount,pt=fe.remainingWidth,bt=fe.isViewportWrapping,De=$e?2:3;let Ie=Math.floor(ve*be);const Re=Ie/ve;let Se=!1,We=!1,qe=De*je,Ue=je/ve,Je=1;if(et==="fill"||et==="fit"){const{typicalViewportLineCount:Ve,extraLinesBeforeFirstLine:Ye,extraLinesBeyondLastLine:Ze,desiredRatio:nt,minimapLineCount:ct}=H.computeContainedMinimapLineCount({viewLineCount:st,scrollBeyondLastLine:He,paddingTop:fe.paddingTop,paddingBottom:fe.paddingBottom,height:be,lineHeight:Pe,pixelRatio:ve});if(st/ct>1)Se=!0,We=!0,je=1,qe=1,Ue=je/ve;else{let ft=!1,gt=je+1;if(et==="fit"){const mt=Math.ceil((Ye+st+Ze)*qe);bt&&Te&&pt<=_e.stableFitRemainingWidth?(ft=!0,gt=_e.stableFitMaxMinimapScale):ft=mt>Ie}if(et==="fill"||ft){Se=!0;const mt=je;qe=Math.min(Pe*ve,Math.max(1,Math.floor(1/nt))),bt&&Te&&pt<=_e.stableFitRemainingWidth&&(gt=_e.stableFitMaxMinimapScale),je=Math.min(gt,Math.max(1,Math.floor(qe/De))),je>mt&&(Je=Math.min(2,je/mt)),Ue=je/ve/Je,Ie=Math.ceil(Math.max(Ve,Ye+st+Ze)*qe),bt?(_e.stableMinimapLayoutInput=fe,_e.stableFitRemainingWidth=pt,_e.stableFitMaxMinimapScale=je):(_e.stableMinimapLayoutInput=null,_e.stableFitRemainingWidth=0)}}}const tt=Math.floor(Xe*Ue),Qe=Math.min(tt,Math.max(0,Math.floor((pt-at-2)*Ue/(Be+Ue)))+e.MINIMAP_GUTTER_WIDTH);let rt=Math.floor(ve*Qe);const Ct=rt/ve;rt=Math.floor(rt*Je);const ut=$e?1:2,ot=dt==="left"?0:xe-Qe-at;return{renderMinimap:ut,minimapLeft:ot,minimapWidth:Qe,minimapHeightIsEditorHeight:Se,minimapIsSampling:We,minimapScale:je,minimapLineHeight:qe,minimapCanvasInnerWidth:rt,minimapCanvasInnerHeight:Ie,minimapCanvasOuterWidth:Ct,minimapCanvasOuterHeight:Re}}static computeLayout(fe,_e){const xe=_e.outerWidth|0,be=_e.outerHeight|0,ve=_e.lineHeight|0,we=_e.lineNumbersDigitCount|0,Te=_e.typicalHalfwidthCharacterWidth,Pe=_e.maxDigitWidth,Be=_e.pixelRatio,He=_e.viewLineCount,$e=fe.get(138),je=$e==="inherit"?fe.get(137):$e,Xe=je==="inherit"?fe.get(133):je,et=fe.get(136),dt=_e.isDominatedByLongLines,at=fe.get(57),st=fe.get(68).renderType!==0,pt=fe.get(69),bt=fe.get(106),De=fe.get(84),Ie=fe.get(73),Re=fe.get(104),Se=Re.verticalScrollbarSize,We=Re.verticalHasArrows,qe=Re.arrowSize,Ue=Re.horizontalScrollbarSize,Je=fe.get(43),tt=fe.get(111)!=="never";let Qe=fe.get(66);Je&&tt&&(Qe+=16);let rt=0;if(st){const Dt=Math.max(we,pt);rt=Math.round(Dt*Pe)}let Ct=0;at&&(Ct=ve*_e.glyphMarginDecorationLaneCount);let ut=0,ot=ut+Ct,Ve=ot+rt,Ye=Ve+Qe;const Ze=xe-Ct-rt-Qe;let nt=!1,ct=!1,ht=-1;je==="inherit"&&dt?(nt=!0,ct=!0):Xe==="on"||Xe==="bounded"?ct=!0:Xe==="wordWrapColumn"&&(ht=et);const ft=H._computeMinimapLayout({outerWidth:xe,outerHeight:be,lineHeight:ve,typicalHalfwidthCharacterWidth:Te,pixelRatio:Be,scrollBeyondLastLine:bt,paddingTop:De.top,paddingBottom:De.bottom,minimap:Ie,verticalScrollbarWidth:Se,viewLineCount:He,remainingWidth:Ze,isViewportWrapping:ct},_e.memory||new b);ft.renderMinimap!==0&&ft.minimapLeft===0&&(ut+=ft.minimapWidth,ot+=ft.minimapWidth,Ve+=ft.minimapWidth,Ye+=ft.minimapWidth);const gt=Ze-ft.minimapWidth,mt=Math.max(1,Math.floor((gt-Se-2)/Te)),vt=We?qe:0;return ct&&(ht=Math.max(1,mt),Xe==="bounded"&&(ht=Math.min(ht,et))),{width:xe,height:be,glyphMarginLeft:ut,glyphMarginWidth:Ct,glyphMarginDecorationLaneCount:_e.glyphMarginDecorationLaneCount,lineNumbersLeft:ot,lineNumbersWidth:rt,decorationsLeft:Ve,decorationsWidth:Qe,contentLeft:Ye,contentWidth:gt,minimap:ft,viewportColumn:mt,isWordWrapMinified:nt,isViewportWrapping:ct,wrappingColumn:ht,verticalScrollbarWidth:Se,horizontalScrollbarHeight:Ue,overviewRuler:{top:vt,width:Se,height:be-2*vt,right:0}}}}e.EditorLayoutInfoComputer=H;class z extends p{constructor(){super(140,"wrappingStrategy","simple",{"editor.wrappingStrategy":{enumDescriptions:[m.localize(230,"Assumes that all characters are of the same width. This is a fast algorithm that works correctly for monospace fonts and certain scripts (like Latin characters) where glyphs are of equal width."),m.localize(231,"Delegates wrapping points computation to the browser. This is a slow algorithm, that might cause freezes for large files, but it works correctly in all cases.")],type:"string",enum:["simple","advanced"],default:"simple",description:m.localize(232,"Controls the algorithm that computes wrapping points. Note that when in accessibility mode, advanced will be used for the best experience.")}})}validate(fe){return C(fe,"simple",["simple","advanced"])}compute(fe,_e,xe){return _e.get(2)===2?"advanced":xe}}var U;(function(Fe){Fe.Off="off",Fe.OnCode="onCode",Fe.On="on"})(U||(e.ShowLightbulbIconMode=U={}));class j extends p{constructor(){const fe={enabled:U.OnCode};super(65,"lightbulb",fe,{"editor.lightbulb.enabled":{type:"string",tags:["experimental"],enum:[U.Off,U.OnCode,U.On],default:fe.enabled,enumDescriptions:[m.localize(233,"Disable the code action menu."),m.localize(234,"Show the code action menu when the cursor is on lines with code."),m.localize(235,"Show the code action menu when the cursor is on lines with code or on empty lines.")],description:m.localize(236,"Enables the Code Action lightbulb in the editor.")}})}validate(fe){return!fe||typeof fe!="object"?this.defaultValue:{enabled:C(fe.enabled,this.defaultValue.enabled,[U.Off,U.OnCode,U.On])}}}class Y extends p{constructor(){const fe={enabled:!0,maxLineCount:5,defaultModel:"outlineModel",scrollWithEditor:!0};super(116,"stickyScroll",fe,{"editor.stickyScroll.enabled":{type:"boolean",default:fe.enabled,description:m.localize(237,"Shows the nested current scopes during the scroll at the top of the editor."),tags:["experimental"]},"editor.stickyScroll.maxLineCount":{type:"number",default:fe.maxLineCount,minimum:1,maximum:20,description:m.localize(238,"Defines the maximum number of sticky lines to show.")},"editor.stickyScroll.defaultModel":{type:"string",enum:["outlineModel","foldingProviderModel","indentationModel"],default:fe.defaultModel,description:m.localize(239,"Defines the model to use for determining which lines to stick. If the outline model does not exist, it will fall back on the folding provider model which falls back on the indentation model. This order is respected in all three cases.")},"editor.stickyScroll.scrollWithEditor":{type:"boolean",default:fe.scrollWithEditor,description:m.localize(240,"Enable scrolling of Sticky Scroll with the editor's horizontal scrollbar.")}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe;return{enabled:s(_e.enabled,this.defaultValue.enabled),maxLineCount:l.clampedInt(_e.maxLineCount,this.defaultValue.maxLineCount,1,20),defaultModel:C(_e.defaultModel,this.defaultValue.defaultModel,["outlineModel","foldingProviderModel","indentationModel"]),scrollWithEditor:s(_e.scrollWithEditor,this.defaultValue.scrollWithEditor)}}}class G extends p{constructor(){const fe={enabled:"on",fontSize:0,fontFamily:"",padding:!1};super(142,"inlayHints",fe,{"editor.inlayHints.enabled":{type:"string",default:fe.enabled,description:m.localize(241,"Enables the inlay hints in the editor."),enum:["on","onUnlessPressed","offUnlessPressed","off"],markdownEnumDescriptions:[m.localize(242,"Inlay hints are enabled"),m.localize(243,"Inlay hints are showing by default and hide when holding {0}",I.isMacintosh?"Ctrl+Option":"Ctrl+Alt"),m.localize(244,"Inlay hints are hidden by default and show when holding {0}",I.isMacintosh?"Ctrl+Option":"Ctrl+Alt"),m.localize(245,"Inlay hints are disabled")]},"editor.inlayHints.fontSize":{type:"number",default:fe.fontSize,markdownDescription:m.localize(246,"Controls font size of inlay hints in the editor. As default the {0} is used when the configured value is less than {1} or greater than the editor font size.","`#editor.fontSize#`","`5`")},"editor.inlayHints.fontFamily":{type:"string",default:fe.fontFamily,markdownDescription:m.localize(247,"Controls font family of inlay hints in the editor. When set to empty, the {0} is used.","`#editor.fontFamily#`")},"editor.inlayHints.padding":{type:"boolean",default:fe.padding,description:m.localize(248,"Enables the padding around the inlay hints in the editor.")}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe;return typeof _e.enabled=="boolean"&&(_e.enabled=_e.enabled?"on":"off"),{enabled:C(_e.enabled,this.defaultValue.enabled,["on","off","offUnlessPressed","onUnlessPressed"]),fontSize:l.clampedInt(_e.fontSize,this.defaultValue.fontSize,0,100),fontFamily:u.string(_e.fontFamily,this.defaultValue.fontFamily),padding:s(_e.padding,this.defaultValue.padding)}}}class K extends p{constructor(){super(66,"lineDecorationsWidth",10)}validate(fe){return typeof fe=="string"&&/^\d+(\.\d+)?ch$/.test(fe)?-parseFloat(fe.substring(0,fe.length-2)):l.clampedInt(fe,this.defaultValue,0,1e3)}compute(fe,_e,xe){return xe<0?l.clampedInt(-xe*fe.fontInfo.typicalHalfwidthCharacterWidth,this.defaultValue,0,1e3):xe}}class R extends r{constructor(){super(67,"lineHeight",e.EDITOR_FONT_DEFAULTS.lineHeight,fe=>r.clamp(fe,0,150),{markdownDescription:m.localize(249,`Controls the line height. - - Use 0 to automatically compute the line height from the font size. - - Values between 0 and 8 will be used as a multiplier with the font size. - - Values greater than or equal to 8 will be used as effective values.`)})}compute(fe,_e,xe){return fe.fontInfo.lineHeight}}class J extends p{constructor(){const fe={enabled:!0,size:"proportional",side:"right",showSlider:"mouseover",autohide:!1,renderCharacters:!0,maxColumn:120,scale:1,showRegionSectionHeaders:!0,showMarkSectionHeaders:!0,sectionHeaderFontSize:9,sectionHeaderLetterSpacing:1};super(73,"minimap",fe,{"editor.minimap.enabled":{type:"boolean",default:fe.enabled,description:m.localize(250,"Controls whether the minimap is shown.")},"editor.minimap.autohide":{type:"boolean",default:fe.autohide,description:m.localize(251,"Controls whether the minimap is hidden automatically.")},"editor.minimap.size":{type:"string",enum:["proportional","fill","fit"],enumDescriptions:[m.localize(252,"The minimap has the same size as the editor contents (and might scroll)."),m.localize(253,"The minimap will stretch or shrink as necessary to fill the height of the editor (no scrolling)."),m.localize(254,"The minimap will shrink as necessary to never be larger than the editor (no scrolling).")],default:fe.size,description:m.localize(255,"Controls the size of the minimap.")},"editor.minimap.side":{type:"string",enum:["left","right"],default:fe.side,description:m.localize(256,"Controls the side where to render the minimap.")},"editor.minimap.showSlider":{type:"string",enum:["always","mouseover"],default:fe.showSlider,description:m.localize(257,"Controls when the minimap slider is shown.")},"editor.minimap.scale":{type:"number",default:fe.scale,minimum:1,maximum:3,enum:[1,2,3],description:m.localize(258,"Scale of content drawn in the minimap: 1, 2 or 3.")},"editor.minimap.renderCharacters":{type:"boolean",default:fe.renderCharacters,description:m.localize(259,"Render the actual characters on a line as opposed to color blocks.")},"editor.minimap.maxColumn":{type:"number",default:fe.maxColumn,description:m.localize(260,"Limit the width of the minimap to render at most a certain number of columns.")},"editor.minimap.showRegionSectionHeaders":{type:"boolean",default:fe.showRegionSectionHeaders,description:m.localize(261,"Controls whether named regions are shown as section headers in the minimap.")},"editor.minimap.showMarkSectionHeaders":{type:"boolean",default:fe.showMarkSectionHeaders,description:m.localize(262,"Controls whether MARK: comments are shown as section headers in the minimap.")},"editor.minimap.sectionHeaderFontSize":{type:"number",default:fe.sectionHeaderFontSize,description:m.localize(263,"Controls the font size of section headers in the minimap.")},"editor.minimap.sectionHeaderLetterSpacing":{type:"number",default:fe.sectionHeaderLetterSpacing,description:m.localize(264,"Controls the amount of space (in pixels) between characters of section header. This helps the readability of the header in small font sizes.")}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe;return{enabled:s(_e.enabled,this.defaultValue.enabled),autohide:s(_e.autohide,this.defaultValue.autohide),size:C(_e.size,this.defaultValue.size,["proportional","fill","fit"]),side:C(_e.side,this.defaultValue.side,["right","left"]),showSlider:C(_e.showSlider,this.defaultValue.showSlider,["always","mouseover"]),renderCharacters:s(_e.renderCharacters,this.defaultValue.renderCharacters),scale:l.clampedInt(_e.scale,1,1,3),maxColumn:l.clampedInt(_e.maxColumn,this.defaultValue.maxColumn,1,1e4),showRegionSectionHeaders:s(_e.showRegionSectionHeaders,this.defaultValue.showRegionSectionHeaders),showMarkSectionHeaders:s(_e.showMarkSectionHeaders,this.defaultValue.showMarkSectionHeaders),sectionHeaderFontSize:r.clamp(_e.sectionHeaderFontSize??this.defaultValue.sectionHeaderFontSize,4,32),sectionHeaderLetterSpacing:r.clamp(_e.sectionHeaderLetterSpacing??this.defaultValue.sectionHeaderLetterSpacing,0,5)}}}function ie(Fe){return Fe==="ctrlCmd"?I.isMacintosh?"metaKey":"ctrlKey":"altKey"}class ue extends p{constructor(){super(84,"padding",{top:0,bottom:0},{"editor.padding.top":{type:"number",default:0,minimum:0,maximum:1e3,description:m.localize(265,"Controls the amount of space between the top edge of the editor and the first line.")},"editor.padding.bottom":{type:"number",default:0,minimum:0,maximum:1e3,description:m.localize(266,"Controls the amount of space between the bottom edge of the editor and the last line.")}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe;return{top:l.clampedInt(_e.top,0,0,1e3),bottom:l.clampedInt(_e.bottom,0,0,1e3)}}}class he extends p{constructor(){const fe={enabled:!0,cycle:!0};super(86,"parameterHints",fe,{"editor.parameterHints.enabled":{type:"boolean",default:fe.enabled,description:m.localize(267,"Enables a pop-up that shows parameter documentation and type information as you type.")},"editor.parameterHints.cycle":{type:"boolean",default:fe.cycle,description:m.localize(268,"Controls whether the parameter hints menu cycles or closes when reaching the end of the list.")}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe;return{enabled:s(_e.enabled,this.defaultValue.enabled),cycle:s(_e.cycle,this.defaultValue.cycle)}}}class pe extends t{constructor(){super(144)}compute(fe,_e,xe){return fe.pixelRatio}}class ae extends p{constructor(){super(88,"placeholder",void 0)}validate(fe){return typeof fe>"u"?this.defaultValue:typeof fe=="string"?fe:this.defaultValue}}class ee extends p{constructor(){const fe={other:"on",comments:"off",strings:"off"},_e=[{type:"boolean"},{type:"string",enum:["on","inline","off"],enumDescriptions:[m.localize(269,"Quick suggestions show inside the suggest widget"),m.localize(270,"Quick suggestions show as ghost text"),m.localize(271,"Quick suggestions are disabled")]}];super(90,"quickSuggestions",fe,{type:"object",additionalProperties:!1,properties:{strings:{anyOf:_e,default:fe.strings,description:m.localize(272,"Enable quick suggestions inside strings.")},comments:{anyOf:_e,default:fe.comments,description:m.localize(273,"Enable quick suggestions inside comments.")},other:{anyOf:_e,default:fe.other,description:m.localize(274,"Enable quick suggestions outside of strings and comments.")}},default:fe,markdownDescription:m.localize(275,"Controls whether suggestions should automatically show up while typing. This can be controlled for typing in comments, strings, and other code. Quick suggestion can be configured to show as ghost text or with the suggest widget. Also be aware of the {0}-setting which controls if suggestions are triggered by special characters.","`#editor.suggestOnTriggerCharacters#`")}),this.defaultValue=fe}validate(fe){if(typeof fe=="boolean"){const Be=fe?"on":"off";return{comments:Be,strings:Be,other:Be}}if(!fe||typeof fe!="object")return this.defaultValue;const{other:_e,comments:xe,strings:be}=fe,ve=["on","inline","off"];let we,Te,Pe;return typeof _e=="boolean"?we=_e?"on":"off":we=C(_e,this.defaultValue.other,ve),typeof xe=="boolean"?Te=xe?"on":"off":Te=C(xe,this.defaultValue.comments,ve),typeof be=="boolean"?Pe=be?"on":"off":Pe=C(be,this.defaultValue.strings,ve),{other:we,comments:Te,strings:Pe}}}class de extends p{constructor(){super(68,"lineNumbers",{renderType:1,renderFn:null},{type:"string",enum:["off","on","relative","interval"],enumDescriptions:[m.localize(276,"Line numbers are not rendered."),m.localize(277,"Line numbers are rendered as absolute number."),m.localize(278,"Line numbers are rendered as distance in lines to cursor position."),m.localize(279,"Line numbers are rendered every 10 lines.")],default:"on",description:m.localize(280,"Controls the display of line numbers.")})}validate(fe){let _e=this.defaultValue.renderType,xe=this.defaultValue.renderFn;return typeof fe<"u"&&(typeof fe=="function"?(_e=4,xe=fe):fe==="interval"?_e=3:fe==="relative"?_e=2:fe==="on"?_e=1:_e=0),{renderType:_e,renderFn:xe}}}function ge(Fe){const fe=Fe.get(99);return fe==="editable"?Fe.get(92):fe!=="on"}class X extends p{constructor(){const fe=[],_e={type:"number",description:m.localize(281,"Number of monospace characters at which this editor ruler will render.")};super(103,"rulers",fe,{type:"array",items:{anyOf:[_e,{type:["object"],properties:{column:_e,color:{type:"string",description:m.localize(282,"Color of this editor ruler."),format:"color-hex"}}}]},default:fe,description:m.localize(283,"Render vertical rulers after a certain number of monospace characters. Use multiple values for multiple rulers. No rulers are drawn if array is empty.")})}validate(fe){if(Array.isArray(fe)){const _e=[];for(const xe of fe)if(typeof xe=="number")_e.push({column:l.clampedInt(xe,0,0,1e4),color:null});else if(xe&&typeof xe=="object"){const be=xe;_e.push({column:l.clampedInt(be.column,0,0,1e4),color:be.color})}return _e.sort((xe,be)=>xe.column-be.column),_e}return this.defaultValue}}class B extends p{constructor(){super(93,"readOnlyMessage",void 0)}validate(fe){return!fe||typeof fe!="object"?this.defaultValue:fe}}function $(Fe,fe){if(typeof Fe!="string")return fe;switch(Fe){case"hidden":return 2;case"visible":return 3;default:return 1}}class Q extends p{constructor(){const fe={vertical:1,horizontal:1,arrowSize:11,useShadows:!0,verticalHasArrows:!1,horizontalHasArrows:!1,horizontalScrollbarSize:12,horizontalSliderSize:12,verticalScrollbarSize:14,verticalSliderSize:14,handleMouseWheel:!0,alwaysConsumeMouseWheel:!0,scrollByPage:!1,ignoreHorizontalScrollbarInContentHeight:!1};super(104,"scrollbar",fe,{"editor.scrollbar.vertical":{type:"string",enum:["auto","visible","hidden"],enumDescriptions:[m.localize(284,"The vertical scrollbar will be visible only when necessary."),m.localize(285,"The vertical scrollbar will always be visible."),m.localize(286,"The vertical scrollbar will always be hidden.")],default:"auto",description:m.localize(287,"Controls the visibility of the vertical scrollbar.")},"editor.scrollbar.horizontal":{type:"string",enum:["auto","visible","hidden"],enumDescriptions:[m.localize(288,"The horizontal scrollbar will be visible only when necessary."),m.localize(289,"The horizontal scrollbar will always be visible."),m.localize(290,"The horizontal scrollbar will always be hidden.")],default:"auto",description:m.localize(291,"Controls the visibility of the horizontal scrollbar.")},"editor.scrollbar.verticalScrollbarSize":{type:"number",default:fe.verticalScrollbarSize,description:m.localize(292,"The width of the vertical scrollbar.")},"editor.scrollbar.horizontalScrollbarSize":{type:"number",default:fe.horizontalScrollbarSize,description:m.localize(293,"The height of the horizontal scrollbar.")},"editor.scrollbar.scrollByPage":{type:"boolean",default:fe.scrollByPage,description:m.localize(294,"Controls whether clicks scroll by page or jump to click position.")},"editor.scrollbar.ignoreHorizontalScrollbarInContentHeight":{type:"boolean",default:fe.ignoreHorizontalScrollbarInContentHeight,description:m.localize(295,"When set, the horizontal scrollbar will not increase the size of the editor's content.")}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe,xe=l.clampedInt(_e.horizontalScrollbarSize,this.defaultValue.horizontalScrollbarSize,0,1e3),be=l.clampedInt(_e.verticalScrollbarSize,this.defaultValue.verticalScrollbarSize,0,1e3);return{arrowSize:l.clampedInt(_e.arrowSize,this.defaultValue.arrowSize,0,1e3),vertical:$(_e.vertical,this.defaultValue.vertical),horizontal:$(_e.horizontal,this.defaultValue.horizontal),useShadows:s(_e.useShadows,this.defaultValue.useShadows),verticalHasArrows:s(_e.verticalHasArrows,this.defaultValue.verticalHasArrows),horizontalHasArrows:s(_e.horizontalHasArrows,this.defaultValue.horizontalHasArrows),handleMouseWheel:s(_e.handleMouseWheel,this.defaultValue.handleMouseWheel),alwaysConsumeMouseWheel:s(_e.alwaysConsumeMouseWheel,this.defaultValue.alwaysConsumeMouseWheel),horizontalScrollbarSize:xe,horizontalSliderSize:l.clampedInt(_e.horizontalSliderSize,xe,0,1e3),verticalScrollbarSize:be,verticalSliderSize:l.clampedInt(_e.verticalSliderSize,be,0,1e3),scrollByPage:s(_e.scrollByPage,this.defaultValue.scrollByPage),ignoreHorizontalScrollbarInContentHeight:s(_e.ignoreHorizontalScrollbarInContentHeight,this.defaultValue.ignoreHorizontalScrollbarInContentHeight)}}}e.inUntrustedWorkspace="inUntrustedWorkspace",e.unicodeHighlightConfigKeys={allowedCharacters:"editor.unicodeHighlight.allowedCharacters",invisibleCharacters:"editor.unicodeHighlight.invisibleCharacters",nonBasicASCII:"editor.unicodeHighlight.nonBasicASCII",ambiguousCharacters:"editor.unicodeHighlight.ambiguousCharacters",includeComments:"editor.unicodeHighlight.includeComments",includeStrings:"editor.unicodeHighlight.includeStrings",allowedLocales:"editor.unicodeHighlight.allowedLocales"};class Z extends p{constructor(){const fe={nonBasicASCII:e.inUntrustedWorkspace,invisibleCharacters:!0,ambiguousCharacters:!0,includeComments:e.inUntrustedWorkspace,includeStrings:!0,allowedCharacters:{},allowedLocales:{_os:!0,_vscode:!0}};super(126,"unicodeHighlight",fe,{[e.unicodeHighlightConfigKeys.nonBasicASCII]:{restricted:!0,type:["boolean","string"],enum:[!0,!1,e.inUntrustedWorkspace],default:fe.nonBasicASCII,description:m.localize(296,"Controls whether all non-basic ASCII characters are highlighted. Only characters between U+0020 and U+007E, tab, line-feed and carriage-return are considered basic ASCII.")},[e.unicodeHighlightConfigKeys.invisibleCharacters]:{restricted:!0,type:"boolean",default:fe.invisibleCharacters,description:m.localize(297,"Controls whether characters that just reserve space or have no width at all are highlighted.")},[e.unicodeHighlightConfigKeys.ambiguousCharacters]:{restricted:!0,type:"boolean",default:fe.ambiguousCharacters,description:m.localize(298,"Controls whether characters are highlighted that can be confused with basic ASCII characters, except those that are common in the current user locale.")},[e.unicodeHighlightConfigKeys.includeComments]:{restricted:!0,type:["boolean","string"],enum:[!0,!1,e.inUntrustedWorkspace],default:fe.includeComments,description:m.localize(299,"Controls whether characters in comments should also be subject to Unicode highlighting.")},[e.unicodeHighlightConfigKeys.includeStrings]:{restricted:!0,type:["boolean","string"],enum:[!0,!1,e.inUntrustedWorkspace],default:fe.includeStrings,description:m.localize(300,"Controls whether characters in strings should also be subject to Unicode highlighting.")},[e.unicodeHighlightConfigKeys.allowedCharacters]:{restricted:!0,type:"object",default:fe.allowedCharacters,description:m.localize(301,"Defines allowed characters that are not being highlighted."),additionalProperties:{type:"boolean"}},[e.unicodeHighlightConfigKeys.allowedLocales]:{restricted:!0,type:"object",additionalProperties:{type:"boolean"},default:fe.allowedLocales,description:m.localize(302,"Unicode characters that are common in allowed locales are not being highlighted.")}})}applyUpdate(fe,_e){let xe=!1;_e.allowedCharacters&&fe&&(k.equals(fe.allowedCharacters,_e.allowedCharacters)||(fe={...fe,allowedCharacters:_e.allowedCharacters},xe=!0)),_e.allowedLocales&&fe&&(k.equals(fe.allowedLocales,_e.allowedLocales)||(fe={...fe,allowedLocales:_e.allowedLocales},xe=!0));const be=super.applyUpdate(fe,_e);return xe?new n(be.newValue,!0):be}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe;return{nonBasicASCII:Ce(_e.nonBasicASCII,e.inUntrustedWorkspace,[!0,!1,e.inUntrustedWorkspace]),invisibleCharacters:s(_e.invisibleCharacters,this.defaultValue.invisibleCharacters),ambiguousCharacters:s(_e.ambiguousCharacters,this.defaultValue.ambiguousCharacters),includeComments:Ce(_e.includeComments,e.inUntrustedWorkspace,[!0,!1,e.inUntrustedWorkspace]),includeStrings:Ce(_e.includeStrings,e.inUntrustedWorkspace,[!0,!1,e.inUntrustedWorkspace]),allowedCharacters:this.validateBooleanMap(fe.allowedCharacters,this.defaultValue.allowedCharacters),allowedLocales:this.validateBooleanMap(fe.allowedLocales,this.defaultValue.allowedLocales)}}validateBooleanMap(fe,_e){if(typeof fe!="object"||!fe)return _e;const xe={};for(const[be,ve]of Object.entries(fe))ve===!0&&(xe[be]=!0);return xe}}class te extends p{constructor(){const fe={enabled:!0,mode:"subwordSmart",showToolbar:"onHover",suppressSuggestions:!1,keepOnBlur:!1,fontFamily:"default"};super(62,"inlineSuggest",fe,{"editor.inlineSuggest.enabled":{type:"boolean",default:fe.enabled,description:m.localize(303,"Controls whether to automatically show inline suggestions in the editor.")},"editor.inlineSuggest.showToolbar":{type:"string",default:fe.showToolbar,enum:["always","onHover","never"],enumDescriptions:[m.localize(304,"Show the inline suggestion toolbar whenever an inline suggestion is shown."),m.localize(305,"Show the inline suggestion toolbar when hovering over an inline suggestion."),m.localize(306,"Never show the inline suggestion toolbar.")],description:m.localize(307,"Controls when to show the inline suggestion toolbar.")},"editor.inlineSuggest.suppressSuggestions":{type:"boolean",default:fe.suppressSuggestions,description:m.localize(308,"Controls how inline suggestions interact with the suggest widget. If enabled, the suggest widget is not shown automatically when inline suggestions are available.")},"editor.inlineSuggest.fontFamily":{type:"string",default:fe.fontFamily,description:m.localize(309,"Controls the font family of the inline suggestions.")}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe;return{enabled:s(_e.enabled,this.defaultValue.enabled),mode:C(_e.mode,this.defaultValue.mode,["prefix","subword","subwordSmart"]),showToolbar:C(_e.showToolbar,this.defaultValue.showToolbar,["always","onHover","never"]),suppressSuggestions:s(_e.suppressSuggestions,this.defaultValue.suppressSuggestions),keepOnBlur:s(_e.keepOnBlur,this.defaultValue.keepOnBlur),fontFamily:u.string(_e.fontFamily,this.defaultValue.fontFamily)}}}class re extends p{constructor(){const fe={enabled:!1,showToolbar:"onHover",fontFamily:"default",keepOnBlur:!1};super(63,"experimentalInlineEdit",fe,{"editor.experimentalInlineEdit.enabled":{type:"boolean",default:fe.enabled,description:m.localize(310,"Controls whether to show inline edits in the editor.")},"editor.experimentalInlineEdit.showToolbar":{type:"string",default:fe.showToolbar,enum:["always","onHover","never"],enumDescriptions:[m.localize(311,"Show the inline edit toolbar whenever an inline suggestion is shown."),m.localize(312,"Show the inline edit toolbar when hovering over an inline suggestion."),m.localize(313,"Never show the inline edit toolbar.")],description:m.localize(314,"Controls when to show the inline edit toolbar.")},"editor.experimentalInlineEdit.fontFamily":{type:"string",default:fe.fontFamily,description:m.localize(315,"Controls the font family of the inline edit.")}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe;return{enabled:s(_e.enabled,this.defaultValue.enabled),showToolbar:C(_e.showToolbar,this.defaultValue.showToolbar,["always","onHover","never"]),fontFamily:u.string(_e.fontFamily,this.defaultValue.fontFamily),keepOnBlur:s(_e.keepOnBlur,this.defaultValue.keepOnBlur)}}}class le extends p{constructor(){const fe={enabled:E.EDITOR_MODEL_DEFAULTS.bracketPairColorizationOptions.enabled,independentColorPoolPerBracketType:E.EDITOR_MODEL_DEFAULTS.bracketPairColorizationOptions.independentColorPoolPerBracketType};super(15,"bracketPairColorization",fe,{"editor.bracketPairColorization.enabled":{type:"boolean",default:fe.enabled,markdownDescription:m.localize(316,"Controls whether bracket pair colorization is enabled or not. Use {0} to override the bracket highlight colors.","`#workbench.colorCustomizations#`")},"editor.bracketPairColorization.independentColorPoolPerBracketType":{type:"boolean",default:fe.independentColorPoolPerBracketType,description:m.localize(317,"Controls whether each bracket type has its own independent color pool.")}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe;return{enabled:s(_e.enabled,this.defaultValue.enabled),independentColorPoolPerBracketType:s(_e.independentColorPoolPerBracketType,this.defaultValue.independentColorPoolPerBracketType)}}}class me extends p{constructor(){const fe={bracketPairs:!1,bracketPairsHorizontal:"active",highlightActiveBracketPair:!0,indentation:!0,highlightActiveIndentation:!0};super(16,"guides",fe,{"editor.guides.bracketPairs":{type:["boolean","string"],enum:[!0,"active",!1],enumDescriptions:[m.localize(318,"Enables bracket pair guides."),m.localize(319,"Enables bracket pair guides only for the active bracket pair."),m.localize(320,"Disables bracket pair guides.")],default:fe.bracketPairs,description:m.localize(321,"Controls whether bracket pair guides are enabled or not.")},"editor.guides.bracketPairsHorizontal":{type:["boolean","string"],enum:[!0,"active",!1],enumDescriptions:[m.localize(322,"Enables horizontal guides as addition to vertical bracket pair guides."),m.localize(323,"Enables horizontal guides only for the active bracket pair."),m.localize(324,"Disables horizontal bracket pair guides.")],default:fe.bracketPairsHorizontal,description:m.localize(325,"Controls whether horizontal bracket pair guides are enabled or not.")},"editor.guides.highlightActiveBracketPair":{type:"boolean",default:fe.highlightActiveBracketPair,description:m.localize(326,"Controls whether the editor should highlight the active bracket pair.")},"editor.guides.indentation":{type:"boolean",default:fe.indentation,description:m.localize(327,"Controls whether the editor should render indent guides.")},"editor.guides.highlightActiveIndentation":{type:["boolean","string"],enum:[!0,"always",!1],enumDescriptions:[m.localize(328,"Highlights the active indent guide."),m.localize(329,"Highlights the active indent guide even if bracket guides are highlighted."),m.localize(330,"Do not highlight the active indent guide.")],default:fe.highlightActiveIndentation,description:m.localize(331,"Controls whether the editor should highlight the active indent guide.")}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe;return{bracketPairs:Ce(_e.bracketPairs,this.defaultValue.bracketPairs,[!0,!1,"active"]),bracketPairsHorizontal:Ce(_e.bracketPairsHorizontal,this.defaultValue.bracketPairsHorizontal,[!0,!1,"active"]),highlightActiveBracketPair:s(_e.highlightActiveBracketPair,this.defaultValue.highlightActiveBracketPair),indentation:s(_e.indentation,this.defaultValue.indentation),highlightActiveIndentation:Ce(_e.highlightActiveIndentation,this.defaultValue.highlightActiveIndentation,[!0,!1,"always"])}}}function Ce(Fe,fe,_e){const xe=_e.indexOf(Fe);return xe===-1?fe:_e[xe]}class ye extends p{constructor(){const fe={insertMode:"insert",filterGraceful:!0,snippetsPreventQuickSuggestions:!1,localityBonus:!1,shareSuggestSelections:!1,selectionMode:"always",showIcons:!0,showStatusBar:!1,preview:!1,previewMode:"subwordSmart",showInlineDetails:!0,showMethods:!0,showFunctions:!0,showConstructors:!0,showDeprecated:!0,matchOnWordStartOnly:!0,showFields:!0,showVariables:!0,showClasses:!0,showStructs:!0,showInterfaces:!0,showModules:!0,showProperties:!0,showEvents:!0,showOperators:!0,showUnits:!0,showValues:!0,showConstants:!0,showEnums:!0,showEnumMembers:!0,showKeywords:!0,showWords:!0,showColors:!0,showFiles:!0,showReferences:!0,showFolders:!0,showTypeParameters:!0,showSnippets:!0,showUsers:!0,showIssues:!0};super(119,"suggest",fe,{"editor.suggest.insertMode":{type:"string",enum:["insert","replace"],enumDescriptions:[m.localize(332,"Insert suggestion without overwriting text right of the cursor."),m.localize(333,"Insert suggestion and overwrite text right of the cursor.")],default:fe.insertMode,description:m.localize(334,"Controls whether words are overwritten when accepting completions. Note that this depends on extensions opting into this feature.")},"editor.suggest.filterGraceful":{type:"boolean",default:fe.filterGraceful,description:m.localize(335,"Controls whether filtering and sorting suggestions accounts for small typos.")},"editor.suggest.localityBonus":{type:"boolean",default:fe.localityBonus,description:m.localize(336,"Controls whether sorting favors words that appear close to the cursor.")},"editor.suggest.shareSuggestSelections":{type:"boolean",default:fe.shareSuggestSelections,markdownDescription:m.localize(337,"Controls whether remembered suggestion selections are shared between multiple workspaces and windows (needs `#editor.suggestSelection#`).")},"editor.suggest.selectionMode":{type:"string",enum:["always","never","whenTriggerCharacter","whenQuickSuggestion"],enumDescriptions:[m.localize(338,"Always select a suggestion when automatically triggering IntelliSense."),m.localize(339,"Never select a suggestion when automatically triggering IntelliSense."),m.localize(340,"Select a suggestion only when triggering IntelliSense from a trigger character."),m.localize(341,"Select a suggestion only when triggering IntelliSense as you type.")],default:fe.selectionMode,markdownDescription:m.localize(342,"Controls whether a suggestion is selected when the widget shows. Note that this only applies to automatically triggered suggestions ({0} and {1}) and that a suggestion is always selected when explicitly invoked, e.g via `Ctrl+Space`.","`#editor.quickSuggestions#`","`#editor.suggestOnTriggerCharacters#`")},"editor.suggest.snippetsPreventQuickSuggestions":{type:"boolean",default:fe.snippetsPreventQuickSuggestions,description:m.localize(343,"Controls whether an active snippet prevents quick suggestions.")},"editor.suggest.showIcons":{type:"boolean",default:fe.showIcons,description:m.localize(344,"Controls whether to show or hide icons in suggestions.")},"editor.suggest.showStatusBar":{type:"boolean",default:fe.showStatusBar,description:m.localize(345,"Controls the visibility of the status bar at the bottom of the suggest widget.")},"editor.suggest.preview":{type:"boolean",default:fe.preview,description:m.localize(346,"Controls whether to preview the suggestion outcome in the editor.")},"editor.suggest.showInlineDetails":{type:"boolean",default:fe.showInlineDetails,description:m.localize(347,"Controls whether suggest details show inline with the label or only in the details widget.")},"editor.suggest.maxVisibleSuggestions":{type:"number",deprecationMessage:m.localize(348,"This setting is deprecated. The suggest widget can now be resized.")},"editor.suggest.filteredTypes":{type:"object",deprecationMessage:m.localize(349,"This setting is deprecated, please use separate settings like 'editor.suggest.showKeywords' or 'editor.suggest.showSnippets' instead.")},"editor.suggest.showMethods":{type:"boolean",default:!0,markdownDescription:m.localize(350,"When enabled IntelliSense shows `method`-suggestions.")},"editor.suggest.showFunctions":{type:"boolean",default:!0,markdownDescription:m.localize(351,"When enabled IntelliSense shows `function`-suggestions.")},"editor.suggest.showConstructors":{type:"boolean",default:!0,markdownDescription:m.localize(352,"When enabled IntelliSense shows `constructor`-suggestions.")},"editor.suggest.showDeprecated":{type:"boolean",default:!0,markdownDescription:m.localize(353,"When enabled IntelliSense shows `deprecated`-suggestions.")},"editor.suggest.matchOnWordStartOnly":{type:"boolean",default:!0,markdownDescription:m.localize(354,"When enabled IntelliSense filtering requires that the first character matches on a word start. For example, `c` on `Console` or `WebContext` but _not_ on `description`. When disabled IntelliSense will show more results but still sorts them by match quality.")},"editor.suggest.showFields":{type:"boolean",default:!0,markdownDescription:m.localize(355,"When enabled IntelliSense shows `field`-suggestions.")},"editor.suggest.showVariables":{type:"boolean",default:!0,markdownDescription:m.localize(356,"When enabled IntelliSense shows `variable`-suggestions.")},"editor.suggest.showClasses":{type:"boolean",default:!0,markdownDescription:m.localize(357,"When enabled IntelliSense shows `class`-suggestions.")},"editor.suggest.showStructs":{type:"boolean",default:!0,markdownDescription:m.localize(358,"When enabled IntelliSense shows `struct`-suggestions.")},"editor.suggest.showInterfaces":{type:"boolean",default:!0,markdownDescription:m.localize(359,"When enabled IntelliSense shows `interface`-suggestions.")},"editor.suggest.showModules":{type:"boolean",default:!0,markdownDescription:m.localize(360,"When enabled IntelliSense shows `module`-suggestions.")},"editor.suggest.showProperties":{type:"boolean",default:!0,markdownDescription:m.localize(361,"When enabled IntelliSense shows `property`-suggestions.")},"editor.suggest.showEvents":{type:"boolean",default:!0,markdownDescription:m.localize(362,"When enabled IntelliSense shows `event`-suggestions.")},"editor.suggest.showOperators":{type:"boolean",default:!0,markdownDescription:m.localize(363,"When enabled IntelliSense shows `operator`-suggestions.")},"editor.suggest.showUnits":{type:"boolean",default:!0,markdownDescription:m.localize(364,"When enabled IntelliSense shows `unit`-suggestions.")},"editor.suggest.showValues":{type:"boolean",default:!0,markdownDescription:m.localize(365,"When enabled IntelliSense shows `value`-suggestions.")},"editor.suggest.showConstants":{type:"boolean",default:!0,markdownDescription:m.localize(366,"When enabled IntelliSense shows `constant`-suggestions.")},"editor.suggest.showEnums":{type:"boolean",default:!0,markdownDescription:m.localize(367,"When enabled IntelliSense shows `enum`-suggestions.")},"editor.suggest.showEnumMembers":{type:"boolean",default:!0,markdownDescription:m.localize(368,"When enabled IntelliSense shows `enumMember`-suggestions.")},"editor.suggest.showKeywords":{type:"boolean",default:!0,markdownDescription:m.localize(369,"When enabled IntelliSense shows `keyword`-suggestions.")},"editor.suggest.showWords":{type:"boolean",default:!0,markdownDescription:m.localize(370,"When enabled IntelliSense shows `text`-suggestions.")},"editor.suggest.showColors":{type:"boolean",default:!0,markdownDescription:m.localize(371,"When enabled IntelliSense shows `color`-suggestions.")},"editor.suggest.showFiles":{type:"boolean",default:!0,markdownDescription:m.localize(372,"When enabled IntelliSense shows `file`-suggestions.")},"editor.suggest.showReferences":{type:"boolean",default:!0,markdownDescription:m.localize(373,"When enabled IntelliSense shows `reference`-suggestions.")},"editor.suggest.showCustomcolors":{type:"boolean",default:!0,markdownDescription:m.localize(374,"When enabled IntelliSense shows `customcolor`-suggestions.")},"editor.suggest.showFolders":{type:"boolean",default:!0,markdownDescription:m.localize(375,"When enabled IntelliSense shows `folder`-suggestions.")},"editor.suggest.showTypeParameters":{type:"boolean",default:!0,markdownDescription:m.localize(376,"When enabled IntelliSense shows `typeParameter`-suggestions.")},"editor.suggest.showSnippets":{type:"boolean",default:!0,markdownDescription:m.localize(377,"When enabled IntelliSense shows `snippet`-suggestions.")},"editor.suggest.showUsers":{type:"boolean",default:!0,markdownDescription:m.localize(378,"When enabled IntelliSense shows `user`-suggestions.")},"editor.suggest.showIssues":{type:"boolean",default:!0,markdownDescription:m.localize(379,"When enabled IntelliSense shows `issues`-suggestions.")}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe;return{insertMode:C(_e.insertMode,this.defaultValue.insertMode,["insert","replace"]),filterGraceful:s(_e.filterGraceful,this.defaultValue.filterGraceful),snippetsPreventQuickSuggestions:s(_e.snippetsPreventQuickSuggestions,this.defaultValue.filterGraceful),localityBonus:s(_e.localityBonus,this.defaultValue.localityBonus),shareSuggestSelections:s(_e.shareSuggestSelections,this.defaultValue.shareSuggestSelections),selectionMode:C(_e.selectionMode,this.defaultValue.selectionMode,["always","never","whenQuickSuggestion","whenTriggerCharacter"]),showIcons:s(_e.showIcons,this.defaultValue.showIcons),showStatusBar:s(_e.showStatusBar,this.defaultValue.showStatusBar),preview:s(_e.preview,this.defaultValue.preview),previewMode:C(_e.previewMode,this.defaultValue.previewMode,["prefix","subword","subwordSmart"]),showInlineDetails:s(_e.showInlineDetails,this.defaultValue.showInlineDetails),showMethods:s(_e.showMethods,this.defaultValue.showMethods),showFunctions:s(_e.showFunctions,this.defaultValue.showFunctions),showConstructors:s(_e.showConstructors,this.defaultValue.showConstructors),showDeprecated:s(_e.showDeprecated,this.defaultValue.showDeprecated),matchOnWordStartOnly:s(_e.matchOnWordStartOnly,this.defaultValue.matchOnWordStartOnly),showFields:s(_e.showFields,this.defaultValue.showFields),showVariables:s(_e.showVariables,this.defaultValue.showVariables),showClasses:s(_e.showClasses,this.defaultValue.showClasses),showStructs:s(_e.showStructs,this.defaultValue.showStructs),showInterfaces:s(_e.showInterfaces,this.defaultValue.showInterfaces),showModules:s(_e.showModules,this.defaultValue.showModules),showProperties:s(_e.showProperties,this.defaultValue.showProperties),showEvents:s(_e.showEvents,this.defaultValue.showEvents),showOperators:s(_e.showOperators,this.defaultValue.showOperators),showUnits:s(_e.showUnits,this.defaultValue.showUnits),showValues:s(_e.showValues,this.defaultValue.showValues),showConstants:s(_e.showConstants,this.defaultValue.showConstants),showEnums:s(_e.showEnums,this.defaultValue.showEnums),showEnumMembers:s(_e.showEnumMembers,this.defaultValue.showEnumMembers),showKeywords:s(_e.showKeywords,this.defaultValue.showKeywords),showWords:s(_e.showWords,this.defaultValue.showWords),showColors:s(_e.showColors,this.defaultValue.showColors),showFiles:s(_e.showFiles,this.defaultValue.showFiles),showReferences:s(_e.showReferences,this.defaultValue.showReferences),showFolders:s(_e.showFolders,this.defaultValue.showFolders),showTypeParameters:s(_e.showTypeParameters,this.defaultValue.showTypeParameters),showSnippets:s(_e.showSnippets,this.defaultValue.showSnippets),showUsers:s(_e.showUsers,this.defaultValue.showUsers),showIssues:s(_e.showIssues,this.defaultValue.showIssues)}}}class Le extends p{constructor(){super(114,"smartSelect",{selectLeadingAndTrailingWhitespace:!0,selectSubwords:!0},{"editor.smartSelect.selectLeadingAndTrailingWhitespace":{description:m.localize(380,"Whether leading and trailing whitespace should always be selected."),default:!0,type:"boolean"},"editor.smartSelect.selectSubwords":{description:m.localize(381,"Whether subwords (like 'foo' in 'fooBar' or 'foo_bar') should be selected."),default:!0,type:"boolean"}})}validate(fe){return!fe||typeof fe!="object"?this.defaultValue:{selectLeadingAndTrailingWhitespace:s(fe.selectLeadingAndTrailingWhitespace,this.defaultValue.selectLeadingAndTrailingWhitespace),selectSubwords:s(fe.selectSubwords,this.defaultValue.selectSubwords)}}}class Ee extends p{constructor(){const fe=[];super(131,"wordSegmenterLocales",fe,{anyOf:[{description:m.localize(382,"Locales to be used for word segmentation when doing word related navigations or operations. Specify the BCP 47 language tag of the word you wish to recognize (e.g., ja, zh-CN, zh-Hant-TW, etc.)."),type:"string"},{description:m.localize(383,"Locales to be used for word segmentation when doing word related navigations or operations. Specify the BCP 47 language tag of the word you wish to recognize (e.g., ja, zh-CN, zh-Hant-TW, etc.)."),type:"array",items:{type:"string"}}]})}validate(fe){if(typeof fe=="string"&&(fe=[fe]),Array.isArray(fe)){const _e=[];for(const xe of fe)if(typeof xe=="string")try{Intl.Segmenter.supportedLocalesOf(xe).length>0&&_e.push(xe)}catch{}return _e}return this.defaultValue}}class Me extends p{constructor(){super(139,"wrappingIndent",1,{"editor.wrappingIndent":{type:"string",enum:["none","same","indent","deepIndent"],enumDescriptions:[m.localize(384,"No indentation. Wrapped lines begin at column 1."),m.localize(385,"Wrapped lines get the same indentation as the parent."),m.localize(386,"Wrapped lines get +1 indentation toward the parent."),m.localize(387,"Wrapped lines get +2 indentation toward the parent.")],description:m.localize(388,"Controls the indentation of wrapped lines."),default:"same"}})}validate(fe){switch(fe){case"none":return 0;case"same":return 1;case"indent":return 2;case"deepIndent":return 3}return 1}compute(fe,_e,xe){return _e.get(2)===2?0:xe}}class Ae extends t{constructor(){super(147)}compute(fe,_e,xe){const be=_e.get(146);return{isDominatedByLongLines:fe.isDominatedByLongLines,isWordWrapMinified:be.isWordWrapMinified,isViewportWrapping:be.isViewportWrapping,wrappingColumn:be.wrappingColumn}}}class Ne extends p{constructor(){const fe={enabled:!0,showDropSelector:"afterDrop"};super(36,"dropIntoEditor",fe,{"editor.dropIntoEditor.enabled":{type:"boolean",default:fe.enabled,markdownDescription:m.localize(389,"Controls whether you can drag and drop a file into a text editor by holding down the `Shift` key (instead of opening the file in an editor).")},"editor.dropIntoEditor.showDropSelector":{type:"string",markdownDescription:m.localize(390,"Controls if a widget is shown when dropping files into the editor. This widget lets you control how the file is dropped."),enum:["afterDrop","never"],enumDescriptions:[m.localize(391,"Show the drop selector widget after a file is dropped into the editor."),m.localize(392,"Never show the drop selector widget. Instead the default drop provider is always used.")],default:"afterDrop"}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe;return{enabled:s(_e.enabled,this.defaultValue.enabled),showDropSelector:C(_e.showDropSelector,this.defaultValue.showDropSelector,["afterDrop","never"])}}}class Ke extends p{constructor(){const fe={enabled:!0,showPasteSelector:"afterPaste"};super(85,"pasteAs",fe,{"editor.pasteAs.enabled":{type:"boolean",default:fe.enabled,markdownDescription:m.localize(393,"Controls whether you can paste content in different ways.")},"editor.pasteAs.showPasteSelector":{type:"string",markdownDescription:m.localize(394,"Controls if a widget is shown when pasting content in to the editor. This widget lets you control how the file is pasted."),enum:["afterPaste","never"],enumDescriptions:[m.localize(395,"Show the paste selector widget after content is pasted into the editor."),m.localize(396,"Never show the paste selector widget. Instead the default pasting behavior is always used.")],default:"afterPaste"}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const _e=fe;return{enabled:s(_e.enabled,this.defaultValue.enabled),showPasteSelector:C(_e.showPasteSelector,this.defaultValue.showPasteSelector,["afterPaste","never"])}}}const ze="Consolas, 'Courier New', monospace",Ge="Menlo, Monaco, 'Courier New', monospace",it="'Droid Sans Mono', 'monospace', monospace";e.EDITOR_FONT_DEFAULTS={fontFamily:I.isMacintosh?Ge:I.isLinux?it:ze,fontWeight:"normal",fontSize:I.isMacintosh?12:14,lineHeight:0,letterSpacing:0},e.editorOptionsRegistry=[];function Oe(Fe){return e.editorOptionsRegistry[Fe.id]=Fe,Fe}e.EditorOptions={acceptSuggestionOnCommitCharacter:Oe(new g(0,"acceptSuggestionOnCommitCharacter",!0,{markdownDescription:m.localize(397,"Controls whether suggestions should be accepted on commit characters. For example, in JavaScript, the semi-colon (`;`) can be a commit character that accepts a suggestion and types that character.")})),acceptSuggestionOnEnter:Oe(new f(1,"acceptSuggestionOnEnter","on",["on","smart","off"],{markdownEnumDescriptions:["",m.localize(398,"Only accept a suggestion with `Enter` when it makes a textual change."),""],markdownDescription:m.localize(399,"Controls whether suggestions should be accepted on `Enter`, in addition to `Tab`. Helps to avoid ambiguity between inserting new lines or accepting suggestions.")})),accessibilitySupport:Oe(new w),accessibilityPageSize:Oe(new l(3,"accessibilityPageSize",10,1,1073741824,{description:m.localize(400,"Controls the number of lines in the editor that can be read out by a screen reader at once. When we detect a screen reader we automatically set the default to be 500. Warning: this has a performance implication for numbers larger than the default."),tags:["accessibility"]})),ariaLabel:Oe(new u(4,"ariaLabel",m.localize(401,"Editor content"))),ariaRequired:Oe(new g(5,"ariaRequired",!1,void 0)),screenReaderAnnounceInlineSuggestion:Oe(new g(8,"screenReaderAnnounceInlineSuggestion",!0,{description:m.localize(402,"Control whether inline suggestions are announced by a screen reader."),tags:["accessibility"]})),autoClosingBrackets:Oe(new f(6,"autoClosingBrackets","languageDefined",["always","languageDefined","beforeWhitespace","never"],{enumDescriptions:["",m.localize(403,"Use language configurations to determine when to autoclose brackets."),m.localize(404,"Autoclose brackets only when the cursor is to the left of whitespace."),""],description:m.localize(405,"Controls whether the editor should automatically close brackets after the user adds an opening bracket.")})),autoClosingComments:Oe(new f(7,"autoClosingComments","languageDefined",["always","languageDefined","beforeWhitespace","never"],{enumDescriptions:["",m.localize(406,"Use language configurations to determine when to autoclose comments."),m.localize(407,"Autoclose comments only when the cursor is to the left of whitespace."),""],description:m.localize(408,"Controls whether the editor should automatically close comments after the user adds an opening comment.")})),autoClosingDelete:Oe(new f(9,"autoClosingDelete","auto",["always","auto","never"],{enumDescriptions:["",m.localize(409,"Remove adjacent closing quotes or brackets only if they were automatically inserted."),""],description:m.localize(410,"Controls whether the editor should remove adjacent closing quotes or brackets when deleting.")})),autoClosingOvertype:Oe(new f(10,"autoClosingOvertype","auto",["always","auto","never"],{enumDescriptions:["",m.localize(411,"Type over closing quotes or brackets only if they were automatically inserted."),""],description:m.localize(412,"Controls whether the editor should type over closing quotes or brackets.")})),autoClosingQuotes:Oe(new f(11,"autoClosingQuotes","languageDefined",["always","languageDefined","beforeWhitespace","never"],{enumDescriptions:["",m.localize(413,"Use language configurations to determine when to autoclose quotes."),m.localize(414,"Autoclose quotes only when the cursor is to the left of whitespace."),""],description:m.localize(415,"Controls whether the editor should automatically close quotes after the user adds an opening quote.")})),autoIndent:Oe(new h(12,"autoIndent",4,"full",["none","keep","brackets","advanced","full"],v,{enumDescriptions:[m.localize(416,"The editor will not insert indentation automatically."),m.localize(417,"The editor will keep the current line's indentation."),m.localize(418,"The editor will keep the current line's indentation and honor language defined brackets."),m.localize(419,"The editor will keep the current line's indentation, honor language defined brackets and invoke special onEnterRules defined by languages."),m.localize(420,"The editor will keep the current line's indentation, honor language defined brackets, invoke special onEnterRules defined by languages, and honor indentationRules defined by languages.")],description:m.localize(421,"Controls whether the editor should automatically adjust the indentation when users type, paste, move or indent lines.")})),automaticLayout:Oe(new g(13,"automaticLayout",!1)),autoSurround:Oe(new f(14,"autoSurround","languageDefined",["languageDefined","quotes","brackets","never"],{enumDescriptions:[m.localize(422,"Use language configurations to determine when to automatically surround selections."),m.localize(423,"Surround with quotes but not brackets."),m.localize(424,"Surround with brackets but not quotes."),""],description:m.localize(425,"Controls whether the editor should automatically surround selections when typing quotes or brackets.")})),bracketPairColorization:Oe(new le),bracketPairGuides:Oe(new me),stickyTabStops:Oe(new g(117,"stickyTabStops",!1,{description:m.localize(426,"Emulate selection behavior of tab characters when using spaces for indentation. Selection will stick to tab stops.")})),codeLens:Oe(new g(17,"codeLens",!0,{description:m.localize(427,"Controls whether the editor shows CodeLens.")})),codeLensFontFamily:Oe(new u(18,"codeLensFontFamily","",{description:m.localize(428,"Controls the font family for CodeLens.")})),codeLensFontSize:Oe(new l(19,"codeLensFontSize",0,0,100,{type:"number",default:0,minimum:0,maximum:100,markdownDescription:m.localize(429,"Controls the font size in pixels for CodeLens. When set to 0, 90% of `#editor.fontSize#` is used.")})),colorDecorators:Oe(new g(20,"colorDecorators",!0,{description:m.localize(430,"Controls whether the editor should render the inline color decorators and color picker.")})),colorDecoratorActivatedOn:Oe(new f(149,"colorDecoratorsActivatedOn","clickAndHover",["clickAndHover","hover","click"],{enumDescriptions:[m.localize(431,"Make the color picker appear both on click and hover of the color decorator"),m.localize(432,"Make the color picker appear on hover of the color decorator"),m.localize(433,"Make the color picker appear on click of the color decorator")],description:m.localize(434,"Controls the condition to make a color picker appear from a color decorator")})),colorDecoratorsLimit:Oe(new l(21,"colorDecoratorsLimit",500,1,1e6,{markdownDescription:m.localize(435,"Controls the max number of color decorators that can be rendered in an editor at once.")})),columnSelection:Oe(new g(22,"columnSelection",!1,{description:m.localize(436,"Enable that the selection with the mouse and keys is doing column selection.")})),comments:Oe(new S),contextmenu:Oe(new g(24,"contextmenu",!0)),copyWithSyntaxHighlighting:Oe(new g(25,"copyWithSyntaxHighlighting",!0,{description:m.localize(437,"Controls whether syntax highlighting should be copied into the clipboard.")})),cursorBlinking:Oe(new h(26,"cursorBlinking",1,"blink",["blink","smooth","phase","expand","solid"],L,{description:m.localize(438,"Control the cursor animation style.")})),cursorSmoothCaretAnimation:Oe(new f(27,"cursorSmoothCaretAnimation","off",["off","explicit","on"],{enumDescriptions:[m.localize(439,"Smooth caret animation is disabled."),m.localize(440,"Smooth caret animation is enabled only when the user moves the cursor with an explicit gesture."),m.localize(441,"Smooth caret animation is always enabled.")],description:m.localize(442,"Controls whether the smooth caret animation should be enabled.")})),cursorStyle:Oe(new h(28,"cursorStyle",D.Line,"line",["line","block","underline","line-thin","block-outline","underline-thin"],T,{description:m.localize(443,"Controls the cursor style.")})),cursorSurroundingLines:Oe(new l(29,"cursorSurroundingLines",0,0,1073741824,{description:m.localize(444,"Controls the minimal number of visible leading lines (minimum 0) and trailing lines (minimum 1) surrounding the cursor. Known as 'scrollOff' or 'scrollOffset' in some other editors.")})),cursorSurroundingLinesStyle:Oe(new f(30,"cursorSurroundingLinesStyle","default",["default","all"],{enumDescriptions:[m.localize(445,"`cursorSurroundingLines` is enforced only when triggered via the keyboard or API."),m.localize(446,"`cursorSurroundingLines` is enforced always.")],markdownDescription:m.localize(447,"Controls when `#editor.cursorSurroundingLines#` should be enforced.")})),cursorWidth:Oe(new l(31,"cursorWidth",0,0,1073741824,{markdownDescription:m.localize(448,"Controls the width of the cursor when `#editor.cursorStyle#` is set to `line`.")})),disableLayerHinting:Oe(new g(32,"disableLayerHinting",!1)),disableMonospaceOptimizations:Oe(new g(33,"disableMonospaceOptimizations",!1)),domReadOnly:Oe(new g(34,"domReadOnly",!1)),dragAndDrop:Oe(new g(35,"dragAndDrop",!0,{description:m.localize(449,"Controls whether the editor should allow moving selections via drag and drop.")})),emptySelectionClipboard:Oe(new A),dropIntoEditor:Oe(new Ne),stickyScroll:Oe(new Y),experimentalWhitespaceRendering:Oe(new f(38,"experimentalWhitespaceRendering","svg",["svg","font","off"],{enumDescriptions:[m.localize(450,"Use a new rendering method with svgs."),m.localize(451,"Use a new rendering method with font characters."),m.localize(452,"Use the stable rendering method.")],description:m.localize(453,"Controls whether whitespace is rendered with a new, experimental method.")})),extraEditorClassName:Oe(new u(39,"extraEditorClassName","")),fastScrollSensitivity:Oe(new r(40,"fastScrollSensitivity",5,Fe=>Fe<=0?5:Fe,{markdownDescription:m.localize(454,"Scrolling speed multiplier when pressing `Alt`.")})),find:Oe(new P),fixedOverflowWidgets:Oe(new g(42,"fixedOverflowWidgets",!1)),folding:Oe(new g(43,"folding",!0,{description:m.localize(455,"Controls whether the editor has code folding enabled.")})),foldingStrategy:Oe(new f(44,"foldingStrategy","auto",["auto","indentation"],{enumDescriptions:[m.localize(456,"Use a language-specific folding strategy if available, else the indentation-based one."),m.localize(457,"Use the indentation-based folding strategy.")],description:m.localize(458,"Controls the strategy for computing folding ranges.")})),foldingHighlight:Oe(new g(45,"foldingHighlight",!0,{description:m.localize(459,"Controls whether the editor should highlight folded ranges.")})),foldingImportsByDefault:Oe(new g(46,"foldingImportsByDefault",!1,{description:m.localize(460,"Controls whether the editor automatically collapses import ranges.")})),foldingMaximumRegions:Oe(new l(47,"foldingMaximumRegions",5e3,10,65e3,{description:m.localize(461,"The maximum number of foldable regions. Increasing this value may result in the editor becoming less responsive when the current source has a large number of foldable regions.")})),unfoldOnClickAfterEndOfLine:Oe(new g(48,"unfoldOnClickAfterEndOfLine",!1,{description:m.localize(462,"Controls whether clicking on the empty content after a folded line will unfold the line.")})),fontFamily:Oe(new u(49,"fontFamily",e.EDITOR_FONT_DEFAULTS.fontFamily,{description:m.localize(463,"Controls the font family.")})),fontInfo:Oe(new F),fontLigatures2:Oe(new N),fontSize:Oe(new x),fontWeight:Oe(new W),fontVariations:Oe(new O),formatOnPaste:Oe(new g(55,"formatOnPaste",!1,{description:m.localize(464,"Controls whether the editor should automatically format the pasted content. A formatter must be available and the formatter should be able to format a range in a document.")})),formatOnType:Oe(new g(56,"formatOnType",!1,{description:m.localize(465,"Controls whether the editor should automatically format the line after typing.")})),glyphMargin:Oe(new g(57,"glyphMargin",!0,{description:m.localize(466,"Controls whether the editor should render the vertical glyph margin. Glyph margin is mostly used for debugging.")})),gotoLocation:Oe(new V),hideCursorInOverviewRuler:Oe(new g(59,"hideCursorInOverviewRuler",!1,{description:m.localize(467,"Controls whether the cursor should be hidden in the overview ruler.")})),hover:Oe(new q),inDiffEditor:Oe(new g(61,"inDiffEditor",!1)),letterSpacing:Oe(new r(64,"letterSpacing",e.EDITOR_FONT_DEFAULTS.letterSpacing,Fe=>r.clamp(Fe,-5,20),{description:m.localize(468,"Controls the letter spacing in pixels.")})),lightbulb:Oe(new j),lineDecorationsWidth:Oe(new K),lineHeight:Oe(new R),lineNumbers:Oe(new de),lineNumbersMinChars:Oe(new l(69,"lineNumbersMinChars",5,1,300)),linkedEditing:Oe(new g(70,"linkedEditing",!1,{description:m.localize(469,"Controls whether the editor has linked editing enabled. Depending on the language, related symbols such as HTML tags, are updated while editing.")})),links:Oe(new g(71,"links",!0,{description:m.localize(470,"Controls whether the editor should detect links and make them clickable.")})),matchBrackets:Oe(new f(72,"matchBrackets","always",["always","near","never"],{description:m.localize(471,"Highlight matching brackets.")})),minimap:Oe(new J),mouseStyle:Oe(new f(74,"mouseStyle","text",["text","default","copy"])),mouseWheelScrollSensitivity:Oe(new r(75,"mouseWheelScrollSensitivity",1,Fe=>Fe===0?1:Fe,{markdownDescription:m.localize(472,"A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.")})),mouseWheelZoom:Oe(new g(76,"mouseWheelZoom",!1,{markdownDescription:I.isMacintosh?m.localize(473,"Zoom the font of the editor when using mouse wheel and holding `Cmd`."):m.localize(474,"Zoom the font of the editor when using mouse wheel and holding `Ctrl`.")})),multiCursorMergeOverlapping:Oe(new g(77,"multiCursorMergeOverlapping",!0,{description:m.localize(475,"Merge multiple cursors when they are overlapping.")})),multiCursorModifier:Oe(new h(78,"multiCursorModifier","altKey","alt",["ctrlCmd","alt"],ie,{markdownEnumDescriptions:[m.localize(476,"Maps to `Control` on Windows and Linux and to `Command` on macOS."),m.localize(477,"Maps to `Alt` on Windows and Linux and to `Option` on macOS.")],markdownDescription:m.localize(478,"The modifier to be used to add multiple cursors with the mouse. The Go to Definition and Open Link mouse gestures will adapt such that they do not conflict with the [multicursor modifier](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).")})),multiCursorPaste:Oe(new f(79,"multiCursorPaste","spread",["spread","full"],{markdownEnumDescriptions:[m.localize(479,"Each cursor pastes a single line of the text."),m.localize(480,"Each cursor pastes the full text.")],markdownDescription:m.localize(481,"Controls pasting when the line count of the pasted text matches the cursor count.")})),multiCursorLimit:Oe(new l(80,"multiCursorLimit",1e4,1,1e5,{markdownDescription:m.localize(482,"Controls the max number of cursors that can be in an active editor at once.")})),occurrencesHighlight:Oe(new f(81,"occurrencesHighlight","singleFile",["off","singleFile","multiFile"],{markdownEnumDescriptions:[m.localize(483,"Does not highlight occurrences."),m.localize(484,"Highlights occurrences only in the current file."),m.localize(485,"Experimental: Highlights occurrences across all valid open files.")],markdownDescription:m.localize(486,"Controls whether occurrences should be highlighted across open files.")})),overviewRulerBorder:Oe(new g(82,"overviewRulerBorder",!0,{description:m.localize(487,"Controls whether a border should be drawn around the overview ruler.")})),overviewRulerLanes:Oe(new l(83,"overviewRulerLanes",3,0,3)),padding:Oe(new ue),pasteAs:Oe(new Ke),parameterHints:Oe(new he),peekWidgetDefaultFocus:Oe(new f(87,"peekWidgetDefaultFocus","tree",["tree","editor"],{enumDescriptions:[m.localize(488,"Focus the tree when opening peek"),m.localize(489,"Focus the editor when opening peek")],description:m.localize(490,"Controls whether to focus the inline editor or the tree in the peek widget.")})),placeholder:Oe(new ae),definitionLinkOpensInPeek:Oe(new g(89,"definitionLinkOpensInPeek",!1,{description:m.localize(491,"Controls whether the Go to Definition mouse gesture always opens the peek widget.")})),quickSuggestions:Oe(new ee),quickSuggestionsDelay:Oe(new l(91,"quickSuggestionsDelay",10,0,1073741824,{description:m.localize(492,"Controls the delay in milliseconds after which quick suggestions will show up.")})),readOnly:Oe(new g(92,"readOnly",!1)),readOnlyMessage:Oe(new B),renameOnType:Oe(new g(94,"renameOnType",!1,{description:m.localize(493,"Controls whether the editor auto renames on type."),markdownDeprecationMessage:m.localize(494,"Deprecated, use `editor.linkedEditing` instead.")})),renderControlCharacters:Oe(new g(95,"renderControlCharacters",!0,{description:m.localize(495,"Controls whether the editor should render control characters."),restricted:!0})),renderFinalNewline:Oe(new f(96,"renderFinalNewline",I.isLinux?"dimmed":"on",["off","on","dimmed"],{description:m.localize(496,"Render last line number when the file ends with a newline.")})),renderLineHighlight:Oe(new f(97,"renderLineHighlight","line",["none","gutter","line","all"],{enumDescriptions:["","","",m.localize(497,"Highlights both the gutter and the current line.")],description:m.localize(498,"Controls how the editor should render the current line highlight.")})),renderLineHighlightOnlyWhenFocus:Oe(new g(98,"renderLineHighlightOnlyWhenFocus",!1,{description:m.localize(499,"Controls if the editor should render the current line highlight only when the editor is focused.")})),renderValidationDecorations:Oe(new f(99,"renderValidationDecorations","editable",["editable","on","off"])),renderWhitespace:Oe(new f(100,"renderWhitespace","selection",["none","boundary","selection","trailing","all"],{enumDescriptions:["",m.localize(500,"Render whitespace characters except for single spaces between words."),m.localize(501,"Render whitespace characters only on selected text."),m.localize(502,"Render only trailing whitespace characters."),""],description:m.localize(503,"Controls how the editor should render whitespace characters.")})),revealHorizontalRightPadding:Oe(new l(101,"revealHorizontalRightPadding",15,0,1e3)),roundedSelection:Oe(new g(102,"roundedSelection",!0,{description:m.localize(504,"Controls whether selections should have rounded corners.")})),rulers:Oe(new X),scrollbar:Oe(new Q),scrollBeyondLastColumn:Oe(new l(105,"scrollBeyondLastColumn",4,0,1073741824,{description:m.localize(505,"Controls the number of extra characters beyond which the editor will scroll horizontally.")})),scrollBeyondLastLine:Oe(new g(106,"scrollBeyondLastLine",!0,{description:m.localize(506,"Controls whether the editor will scroll beyond the last line.")})),scrollPredominantAxis:Oe(new g(107,"scrollPredominantAxis",!0,{description:m.localize(507,"Scroll only along the predominant axis when scrolling both vertically and horizontally at the same time. Prevents horizontal drift when scrolling vertically on a trackpad.")})),selectionClipboard:Oe(new g(108,"selectionClipboard",!0,{description:m.localize(508,"Controls whether the Linux primary clipboard should be supported."),included:I.isLinux})),selectionHighlight:Oe(new g(109,"selectionHighlight",!0,{description:m.localize(509,"Controls whether the editor should highlight matches similar to the selection.")})),selectOnLineNumbers:Oe(new g(110,"selectOnLineNumbers",!0)),showFoldingControls:Oe(new f(111,"showFoldingControls","mouseover",["always","never","mouseover"],{enumDescriptions:[m.localize(510,"Always show the folding controls."),m.localize(511,"Never show the folding controls and reduce the gutter size."),m.localize(512,"Only show the folding controls when the mouse is over the gutter.")],description:m.localize(513,"Controls when the folding controls on the gutter are shown.")})),showUnused:Oe(new g(112,"showUnused",!0,{description:m.localize(514,"Controls fading out of unused code.")})),showDeprecated:Oe(new g(141,"showDeprecated",!0,{description:m.localize(515,"Controls strikethrough deprecated variables.")})),inlayHints:Oe(new G),snippetSuggestions:Oe(new f(113,"snippetSuggestions","inline",["top","bottom","inline","none"],{enumDescriptions:[m.localize(516,"Show snippet suggestions on top of other suggestions."),m.localize(517,"Show snippet suggestions below other suggestions."),m.localize(518,"Show snippets suggestions with other suggestions."),m.localize(519,"Do not show snippet suggestions.")],description:m.localize(520,"Controls whether snippets are shown with other suggestions and how they are sorted.")})),smartSelect:Oe(new Le),smoothScrolling:Oe(new g(115,"smoothScrolling",!1,{description:m.localize(521,"Controls whether the editor will scroll using an animation.")})),stopRenderingLineAfter:Oe(new l(118,"stopRenderingLineAfter",1e4,-1,1073741824)),suggest:Oe(new ye),inlineSuggest:Oe(new te),inlineEdit:Oe(new re),inlineCompletionsAccessibilityVerbose:Oe(new g(150,"inlineCompletionsAccessibilityVerbose",!1,{description:m.localize(522,"Controls whether the accessibility hint should be provided to screen reader users when an inline completion is shown.")})),suggestFontSize:Oe(new l(120,"suggestFontSize",0,0,1e3,{markdownDescription:m.localize(523,"Font size for the suggest widget. When set to {0}, the value of {1} is used.","`0`","`#editor.fontSize#`")})),suggestLineHeight:Oe(new l(121,"suggestLineHeight",0,0,1e3,{markdownDescription:m.localize(524,"Line height for the suggest widget. When set to {0}, the value of {1} is used. The minimum value is 8.","`0`","`#editor.lineHeight#`")})),suggestOnTriggerCharacters:Oe(new g(122,"suggestOnTriggerCharacters",!0,{description:m.localize(525,"Controls whether suggestions should automatically show up when typing trigger characters.")})),suggestSelection:Oe(new f(123,"suggestSelection","first",["first","recentlyUsed","recentlyUsedByPrefix"],{markdownEnumDescriptions:[m.localize(526,"Always select the first suggestion."),m.localize(527,"Select recent suggestions unless further typing selects one, e.g. `console.| -> console.log` because `log` has been completed recently."),m.localize(528,"Select suggestions based on previous prefixes that have completed those suggestions, e.g. `co -> console` and `con -> const`.")],description:m.localize(529,"Controls how suggestions are pre-selected when showing the suggest list.")})),tabCompletion:Oe(new f(124,"tabCompletion","off",["on","off","onlySnippets"],{enumDescriptions:[m.localize(530,"Tab complete will insert the best matching suggestion when pressing tab."),m.localize(531,"Disable tab completions."),m.localize(532,"Tab complete snippets when their prefix match. Works best when 'quickSuggestions' aren't enabled.")],description:m.localize(533,"Enables tab completions.")})),tabIndex:Oe(new l(125,"tabIndex",0,-1,1073741824)),unicodeHighlight:Oe(new Z),unusualLineTerminators:Oe(new f(127,"unusualLineTerminators","prompt",["auto","off","prompt"],{enumDescriptions:[m.localize(534,"Unusual line terminators are automatically removed."),m.localize(535,"Unusual line terminators are ignored."),m.localize(536,"Unusual line terminators prompt to be removed.")],description:m.localize(537,"Remove unusual line terminators that might cause problems.")})),useShadowDOM:Oe(new g(128,"useShadowDOM",!0)),useTabStops:Oe(new g(129,"useTabStops",!0,{description:m.localize(538,"Spaces and tabs are inserted and deleted in alignment with tab stops.")})),wordBreak:Oe(new f(130,"wordBreak","normal",["normal","keepAll"],{markdownEnumDescriptions:[m.localize(539,"Use the default line break rule."),m.localize(540,"Word breaks should not be used for Chinese/Japanese/Korean (CJK) text. Non-CJK text behavior is the same as for normal.")],description:m.localize(541,"Controls the word break rules used for Chinese/Japanese/Korean (CJK) text.")})),wordSegmenterLocales:Oe(new Ee),wordSeparators:Oe(new u(132,"wordSeparators",y.USUAL_WORD_SEPARATORS,{description:m.localize(542,"Characters that will be used as word separators when doing word related navigations or operations.")})),wordWrap:Oe(new f(133,"wordWrap","off",["off","on","wordWrapColumn","bounded"],{markdownEnumDescriptions:[m.localize(543,"Lines will never wrap."),m.localize(544,"Lines will wrap at the viewport width."),m.localize(545,"Lines will wrap at `#editor.wordWrapColumn#`."),m.localize(546,"Lines will wrap at the minimum of viewport and `#editor.wordWrapColumn#`.")],description:m.localize(547,"Controls how lines should wrap.")})),wordWrapBreakAfterCharacters:Oe(new u(134,"wordWrapBreakAfterCharacters"," })]?|/&.,;\xA2\xB0\u2032\u2033\u2030\u2103\u3001\u3002\uFF61\uFF64\uFFE0\uFF0C\uFF0E\uFF1A\uFF1B\uFF1F\uFF01\uFF05\u30FB\uFF65\u309D\u309E\u30FD\u30FE\u30FC\u30A1\u30A3\u30A5\u30A7\u30A9\u30C3\u30E3\u30E5\u30E7\u30EE\u30F5\u30F6\u3041\u3043\u3045\u3047\u3049\u3063\u3083\u3085\u3087\u308E\u3095\u3096\u31F0\u31F1\u31F2\u31F3\u31F4\u31F5\u31F6\u31F7\u31F8\u31F9\u31FA\u31FB\u31FC\u31FD\u31FE\u31FF\u3005\u303B\uFF67\uFF68\uFF69\uFF6A\uFF6B\uFF6C\uFF6D\uFF6E\uFF6F\uFF70\u201D\u3009\u300B\u300D\u300F\u3011\u3015\uFF09\uFF3D\uFF5D\uFF63")),wordWrapBreakBeforeCharacters:Oe(new u(135,"wordWrapBreakBeforeCharacters","([{\u2018\u201C\u3008\u300A\u300C\u300E\u3010\u3014\uFF08\uFF3B\uFF5B\uFF62\xA3\xA5\uFF04\uFFE1\uFFE5+\uFF0B")),wordWrapColumn:Oe(new l(136,"wordWrapColumn",80,1,1073741824,{markdownDescription:m.localize(548,"Controls the wrapping column of the editor when `#editor.wordWrap#` is `wordWrapColumn` or `bounded`.")})),wordWrapOverride1:Oe(new f(137,"wordWrapOverride1","inherit",["off","on","inherit"])),wordWrapOverride2:Oe(new f(138,"wordWrapOverride2","inherit",["off","on","inherit"])),editorClassName:Oe(new M),defaultColorDecorators:Oe(new g(148,"defaultColorDecorators",!1,{markdownDescription:m.localize(549,"Controls whether inline color decorations should be shown using the default document color provider")})),pixelRatio:Oe(new pe),tabFocusMode:Oe(new g(145,"tabFocusMode",!1,{markdownDescription:m.localize(550,"Controls whether the editor receives tabs or defers them to the workbench for navigation.")})),layoutInfo:Oe(new H),wrappingInfo:Oe(new Ae),wrappingIndent:Oe(new Me),wrappingStrategy:Oe(new z)}}),define(ne[655],se([1,0,5,39,11,74,37,9,4,226]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewCursor=e.CursorPlurality=void 0;class p{constructor(i,s,g,c,l,a,r){this.top=i,this.left=s,this.paddingLeft=g,this.width=c,this.height=l,this.textContent=a,this.textContentClassName=r}}var n;(function(t){t[t.Single=0]="Single",t[t.MultiPrimary=1]="MultiPrimary",t[t.MultiSecondary=2]="MultiSecondary"})(n||(e.CursorPlurality=n={}));class o{constructor(i,s){this._context=i;const g=this._context.configuration.options,c=g.get(50);this._cursorStyle=g.get(28),this._lineHeight=g.get(67),this._typicalHalfwidthCharacterWidth=c.typicalHalfwidthCharacterWidth,this._lineCursorWidth=Math.min(g.get(31),this._typicalHalfwidthCharacterWidth),this._isVisible=!0,this._domNode=(0,k.createFastDomNode)(document.createElement("div")),this._domNode.setClassName(`cursor ${b.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`),this._domNode.setHeight(this._lineHeight),this._domNode.setTop(0),this._domNode.setLeft(0),(0,E.applyFontInfo)(this._domNode,c),this._domNode.setDisplay("none"),this._position=new m.Position(1,1),this._pluralityClass="",this.setPlurality(s),this._lastRenderedContent="",this._renderData=null}getDomNode(){return this._domNode}getPosition(){return this._position}setPlurality(i){switch(i){default:case n.Single:this._pluralityClass="";break;case n.MultiPrimary:this._pluralityClass="cursor-primary";break;case n.MultiSecondary:this._pluralityClass="cursor-secondary";break}}show(){this._isVisible||(this._domNode.setVisibility("inherit"),this._isVisible=!0)}hide(){this._isVisible&&(this._domNode.setVisibility("hidden"),this._isVisible=!1)}onConfigurationChanged(i){const s=this._context.configuration.options,g=s.get(50);return this._cursorStyle=s.get(28),this._lineHeight=s.get(67),this._typicalHalfwidthCharacterWidth=g.typicalHalfwidthCharacterWidth,this._lineCursorWidth=Math.min(s.get(31),this._typicalHalfwidthCharacterWidth),(0,E.applyFontInfo)(this._domNode,g),!0}onCursorPositionChanged(i,s){return s?this._domNode.domNode.style.transitionProperty="none":this._domNode.domNode.style.transitionProperty="",this._position=i,!0}_getGraphemeAwarePosition(){const{lineNumber:i,column:s}=this._position,g=this._context.viewModel.getLineContent(i),[c,l]=I.getCharContainingOffset(g,s-1);return[new m.Position(i,c+1),g.substring(c,l)]}_prepareRender(i){let s="",g="";const[c,l]=this._getGraphemeAwarePosition();if(this._cursorStyle===y.TextEditorCursorStyle.Line||this._cursorStyle===y.TextEditorCursorStyle.LineThin){const v=i.visibleRangeForPosition(c);if(!v||v.outsideRenderedLine)return null;const w=d.getWindow(this._domNode.domNode);let S;this._cursorStyle===y.TextEditorCursorStyle.Line?(S=d.computeScreenAwareSize(w,this._lineCursorWidth>0?this._lineCursorWidth:2),S>2&&(s=l,g=this._getTokenClassName(c))):S=d.computeScreenAwareSize(w,1);let L=v.left,D=0;S>=2&&L>=1&&(D=1,L-=D);const T=i.getVerticalOffsetForLineNumber(c.lineNumber)-i.bigNumbersDelta;return new p(T,L,D,S,this._lineHeight,s,g)}const a=i.linesVisibleRangesForRange(new _.Range(c.lineNumber,c.column,c.lineNumber,c.column+l.length),!1);if(!a||a.length===0)return null;const r=a[0];if(r.outsideRenderedLine||r.ranges.length===0)return null;const u=r.ranges[0],C=l===" "?this._typicalHalfwidthCharacterWidth:u.width<1?this._typicalHalfwidthCharacterWidth:u.width;this._cursorStyle===y.TextEditorCursorStyle.Block&&(s=l,g=this._getTokenClassName(c));let f=i.getVerticalOffsetForLineNumber(c.lineNumber)-i.bigNumbersDelta,h=this._lineHeight;return(this._cursorStyle===y.TextEditorCursorStyle.Underline||this._cursorStyle===y.TextEditorCursorStyle.UnderlineThin)&&(f+=this._lineHeight-2,h=2),new p(f,u.left,0,C,h,s,g)}_getTokenClassName(i){const s=this._context.viewModel.getViewLineData(i.lineNumber),g=s.tokens.findTokenIndexAtOffset(i.column-1);return s.tokens.getClassName(g)}prepareRender(i){this._renderData=this._prepareRender(i)}render(i){return this._renderData?(this._lastRenderedContent!==this._renderData.textContent&&(this._lastRenderedContent=this._renderData.textContent,this._domNode.domNode.textContent=this._lastRenderedContent),this._domNode.setClassName(`cursor ${this._pluralityClass} ${b.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME} ${this._renderData.textContentClassName}`),this._domNode.setDisplay("block"),this._domNode.setTop(this._renderData.top),this._domNode.setLeft(this._renderData.left),this._domNode.setPaddingLeft(this._renderData.paddingLeft),this._domNode.setWidth(this._renderData.width),this._domNode.setLineHeight(this._renderData.height),this._domNode.setHeight(this._renderData.height),{domNode:this._domNode.domNode,position:this._position,contentLeft:this._renderData.left,height:this._renderData.height,width:2}):(this._domNode.setDisplay("none"),null)}}e.ViewCursor=o}),define(ne[261],se([1,0,16,37,165]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FontInfo=e.SERIALIZED_FONT_INFO_VERSION=e.BareFontInfo=void 0;const E=d.isMacintosh?1.5:1.35,y=8;class m{static createFromValidatedSettings(p,n,o){const t=p.get(49),i=p.get(53),s=p.get(52),g=p.get(51),c=p.get(54),l=p.get(67),a=p.get(64);return m._create(t,i,s,g,c,l,a,n,o)}static _create(p,n,o,t,i,s,g,c,l){s===0?s=E*o:s{this._evictUntrustedReadingsTimeout=-1,this._evictUntrustedReadings(o)},5e3))}_evictUntrustedReadings(o){const t=this._ensureCache(o),i=t.getValues();let s=!1;for(const g of i)g.isTrusted||(s=!0,t.remove(g));s&&this._onDidChange.fire()}readFontInfo(o,t){const i=this._ensureCache(o);if(!i.has(t)){let s=this._actualReadFontInfo(o,t);(s.typicalHalfwidthCharacterWidth<=2||s.typicalFullwidthCharacterWidth<=2||s.spaceWidth<=2||s.maxDigitWidth<=2)&&(s=new _.FontInfo({pixelRatio:k.PixelRatio.getInstance(o).value,fontFamily:s.fontFamily,fontWeight:s.fontWeight,fontSize:s.fontSize,fontFeatureSettings:s.fontFeatureSettings,fontVariationSettings:s.fontVariationSettings,lineHeight:s.lineHeight,letterSpacing:s.letterSpacing,isMonospace:s.isMonospace,typicalHalfwidthCharacterWidth:Math.max(s.typicalHalfwidthCharacterWidth,5),typicalFullwidthCharacterWidth:Math.max(s.typicalFullwidthCharacterWidth,5),canUseHalfwidthRightwardsArrow:s.canUseHalfwidthRightwardsArrow,spaceWidth:Math.max(s.spaceWidth,5),middotWidth:Math.max(s.middotWidth,5),wsmiddotWidth:Math.max(s.wsmiddotWidth,5),maxDigitWidth:Math.max(s.maxDigitWidth,5)},!1)),this._writeToCache(o,t,s)}return i.get(t)}_createRequest(o,t,i,s){const g=new y.CharWidthRequest(o,t);return i.push(g),s?.push(g),g}_actualReadFontInfo(o,t){const i=[],s=[],g=this._createRequest("n",0,i,s),c=this._createRequest("\uFF4D",0,i,null),l=this._createRequest(" ",0,i,s),a=this._createRequest("0",0,i,s),r=this._createRequest("1",0,i,s),u=this._createRequest("2",0,i,s),C=this._createRequest("3",0,i,s),f=this._createRequest("4",0,i,s),h=this._createRequest("5",0,i,s),v=this._createRequest("6",0,i,s),w=this._createRequest("7",0,i,s),S=this._createRequest("8",0,i,s),L=this._createRequest("9",0,i,s),D=this._createRequest("\u2192",0,i,s),T=this._createRequest("\uFFEB",0,i,null),M=this._createRequest("\xB7",0,i,s),A=this._createRequest("\u2E31",0,i,null),P="|/-_ilm%";for(let W=0,V=P.length;W.001){O=!1;break}}let x=!0;return O&&T.width!==F&&(x=!1),T.width>D.width&&(x=!1),new _.FontInfo({pixelRatio:k.PixelRatio.getInstance(o).value,fontFamily:t.fontFamily,fontWeight:t.fontWeight,fontSize:t.fontSize,fontFeatureSettings:t.fontFeatureSettings,fontVariationSettings:t.fontVariationSettings,lineHeight:t.lineHeight,letterSpacing:t.letterSpacing,isMonospace:O,typicalHalfwidthCharacterWidth:g.width,typicalFullwidthCharacterWidth:c.width,canUseHalfwidthRightwardsArrow:x,spaceWidth:l.width,middotWidth:M.width,wsmiddotWidth:A.width,maxDigitWidth:N},!0)}}e.FontMeasurementsImpl=b;class p{constructor(){this._keys=Object.create(null),this._values=Object.create(null)}has(o){const t=o.getId();return!!this._values[t]}get(o){const t=o.getId();return this._values[t]}put(o,t){const i=o.getId();this._keys[i]=o,this._values[i]=t}remove(o){const t=o.getId();delete this._keys[t],delete this._values[t]}getValues(){return Object.keys(this._keys).map(o=>this._values[o])}}e.FontMeasurements=new b}),define(ne[116],se([1,0,11,16,160]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StringBuilder=void 0,e.getPlatformTextDecoder=p,e.decodeUTF16LE=n;let E;function y(){return E||(E=new TextDecoder("UTF-16LE")),E}let m;function _(){return m||(m=new TextDecoder("UTF-16BE")),m}let b;function p(){return b||(b=k.isLittleEndian()?y():_()),b}function n(i,s,g){const c=new Uint16Array(i.buffer,s,g);return g>0&&(c[0]===65279||c[0]===65534)?o(i,s,g):y().decode(c)}function o(i,s,g){const c=[];let l=0;for(let a=0;a=this._capacity){this._flushBuffer(),this._completedStrings[this._completedStrings.length]=s;return}for(let c=0;cg});class p{static create(c){return new p(new WeakRef(c))}constructor(c){this.targetWindow=c}createLineBreaksComputer(c,l,a,r,u){const C=[],f=[];return{addRequest:(h,v,w)=>{C.push(h),f.push(v)},finalize:()=>n((0,I.assertIsDefined)(this.targetWindow.deref()),C,c,l,a,r,u,f)}}}e.DOMLineBreaksComputerFactory=p;function n(g,c,l,a,r,u,C,f){function h(H){const z=f[H];if(z){const U=_.LineInjectedText.applyInjectedText(c[H],z),j=z.map(G=>G.options),Y=z.map(G=>G.column-1);return new m.ModelLineProjectionData(Y,j,[U.length],[],0)}else return null}if(r===-1){const H=[];for(let z=0,U=c.length;zv?(U=0,j=0):Y=v-R}const G=z.substr(U),K=o(G,j,a,Y,T,L);M[H]=U,A[H]=j,P[H]=G,N[H]=K[0],O[H]=K[1]}const F=T.build(),x=b?.createHTML(F)??F;D.innerHTML=x,D.style.position="absolute",D.style.top="10000",C==="keepAll"?(D.style.wordBreak="keep-all",D.style.overflowWrap="anywhere"):(D.style.wordBreak="inherit",D.style.overflowWrap="break-word"),g.document.body.appendChild(D);const W=document.createRange(),V=Array.prototype.slice.call(D.children,0),q=[];for(let H=0;Hue.options),J=ie.map(ue=>ue.column-1)):(R=null,J=null),q[H]=new m.ModelLineProjectionData(J,R,U,K,Y)}return D.remove(),q}function o(g,c,l,a,r,u){if(u!==0){const L=String(u);r.appendString('
    ');const C=g.length;let f=c,h=0;const v=[],w=[];let S=0");for(let L=0;L"),v[L]=h,w[L]=f;const D=S;S=L+1"),v[g.length]=h,w[g.length]=f,r.appendString("
    "),[v,w]}function t(g,c,l,a){if(l.length<=1)return null;const r=Array.prototype.slice.call(c.children,0),u=[];try{i(g,r,a,0,null,l.length-1,null,u)}catch(C){return console.log(C),null}return u.length===0?null:(u.push(l.length),u)}function i(g,c,l,a,r,u,C,f){if(a===u||(r=r||s(g,c,l[a],l[a+1]),C=C||s(g,c,l[u],l[u+1]),Math.abs(r[0].top-C[0].top)<=.1))return;if(a+1===u){f.push(u);return}const h=a+(u-a)/2|0,v=s(g,c,l[h],l[h+1]);i(g,c,l,a,r,h,v,f),i(g,c,l,h,v,u,C,f)}function s(g,c,l,a){return g.setStart(c[l/16384|0].firstChild,l%16384),g.setEnd(c[a/16384|0].firstChild,a%16384),g.getClientRects()}}),define(ne[262],se([1,0,39,103,8,116]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.VisibleLinesCollection=e.RenderedLinesCollection=void 0;class y{constructor(p){this._lineFactory=p,this._set(1,[])}flush(){this._set(1,[])}_set(p,n){this._lines=n,this._rendLineNumberStart=p}_get(){return{rendLineNumberStart:this._rendLineNumberStart,lines:this._lines}}getStartLineNumber(){return this._rendLineNumberStart}getEndLineNumber(){return this._rendLineNumberStart+this._lines.length-1}getCount(){return this._lines.length}getLine(p){const n=p-this._rendLineNumberStart;if(n<0||n>=this._lines.length)throw new I.BugIndicatingError("Illegal value for lineNumber");return this._lines[n]}onLinesDeleted(p,n){if(this.getCount()===0)return null;const o=this.getStartLineNumber(),t=this.getEndLineNumber();if(nt)return null;let i=0,s=0;for(let c=o;c<=t;c++){const l=c-this._rendLineNumberStart;p<=c&&c<=n&&(s===0?(i=l,s=1):s++)}if(p=t&&g<=i&&(this._lines[g-this._rendLineNumberStart].onContentChanged(),s=!0);return s}onLinesInserted(p,n){if(this.getCount()===0)return null;const o=n-p+1,t=this.getStartLineNumber(),i=this.getEndLineNumber();if(p<=t)return this._rendLineNumberStart+=o,null;if(p>i)return null;if(o+p>i)return this._lines.splice(p-this._rendLineNumberStart,i-p+1);const s=[];for(let r=0;ro)continue;const c=Math.max(n,g.fromLineNumber),l=Math.min(o,g.toLineNumber);for(let a=c;a<=l;a++){const r=a-this._rendLineNumberStart;this._lines[r].onTokensChanged(),t=!0}}return t}}e.RenderedLinesCollection=y;class m{constructor(p){this._lineFactory=p,this.domNode=this._createDomNode(),this._linesCollection=new y(this._lineFactory)}_createDomNode(){const p=(0,d.createFastDomNode)(document.createElement("div"));return p.setClassName("view-layer"),p.setPosition("absolute"),p.domNode.setAttribute("role","presentation"),p.domNode.setAttribute("aria-hidden","true"),p}onConfigurationChanged(p){return!!p.hasChanged(146)}onFlushed(p){return this._linesCollection.flush(),!0}onLinesChanged(p){return this._linesCollection.onLinesChanged(p.fromLineNumber,p.count)}onLinesDeleted(p){const n=this._linesCollection.onLinesDeleted(p.fromLineNumber,p.toLineNumber);if(n)for(let o=0,t=n.length;op})}constructor(p,n,o){this._domNode=p,this._lineFactory=n,this._viewportData=o}render(p,n,o,t){const i={rendLineNumberStart:p.rendLineNumberStart,lines:p.lines.slice(0),linesLength:p.linesLength};if(i.rendLineNumberStart+i.linesLength-1n){const s=n,g=Math.min(o,i.rendLineNumberStart-1);s<=g&&(this._insertLinesBefore(i,s,g,t,n),i.linesLength+=g-s+1)}else if(i.rendLineNumberStart0&&(this._removeLinesBefore(i,s),i.linesLength-=s)}if(i.rendLineNumberStart=n,i.rendLineNumberStart+i.linesLength-1o){const s=Math.max(0,o-i.rendLineNumberStart+1),c=i.linesLength-1-s+1;c>0&&(this._removeLinesAfter(i,c),i.linesLength-=c)}return this._finishRendering(i,!1,t),i}_renderUntouchedLines(p,n,o,t,i){const s=p.rendLineNumberStart,g=p.lines;for(let c=n;c<=o;c++){const l=s+c;g[c].layoutLine(l,t[l-i],this._viewportData.lineHeight)}}_insertLinesBefore(p,n,o,t,i){const s=[];let g=0;for(let c=n;c<=o;c++)s[g++]=this._lineFactory.createLine();p.lines=s.concat(p.lines)}_removeLinesBefore(p,n){for(let o=0;o=0;g--){const c=p.lines[g];t[g]&&(c.setDomNode(s),s=s.previousSibling)}}_finishRenderingInvalidLines(p,n,o){const t=document.createElement("div");_._ttPolicy&&(n=_._ttPolicy.createHTML(n)),t.innerHTML=n;for(let i=0;inew m(this._dynamicOverlays)}),this.domNode=this._visibleLines.domNode;const t=this._context.configuration.options.get(50);(0,k.applyFontInfo)(this.domNode,t),this.domNode.setClassName("view-overlays")}shouldRender(){if(super.shouldRender())return!0;for(let n=0,o=this._dynamicOverlays.length;nt.shouldRender());for(let t=0,i=o.length;t'),s.appendString(g),s.appendString(""),!0)}layoutLine(n,o,t){this._domNode&&(this._domNode.setTop(o),this._domNode.setHeight(t))}}e.ViewOverlayLine=m;class _ extends y{constructor(n){super(n);const t=this._context.configuration.options.get(146);this._contentWidth=t.contentWidth,this.domNode.setHeight(0)}onConfigurationChanged(n){const t=this._context.configuration.options.get(146);return this._contentWidth=t.contentWidth,super.onConfigurationChanged(n)||!0}onScrollChanged(n){return super.onScrollChanged(n)||n.scrollWidthChanged}_viewOverlaysRender(n){super._viewOverlaysRender(n),this.domNode.setWidth(Math.max(n.scrollWidth,this._contentWidth))}}e.ContentViewOverlays=_;class b extends y{constructor(n){super(n);const o=this._context.configuration.options,t=o.get(146);this._contentLeft=t.contentLeft,this.domNode.setClassName("margin-view-overlays"),this.domNode.setWidth(1),(0,k.applyFontInfo)(this.domNode,o.get(50))}onConfigurationChanged(n){const o=this._context.configuration.options;(0,k.applyFontInfo)(this.domNode,o.get(50));const t=o.get(146);return this._contentLeft=t.contentLeft,super.onConfigurationChanged(n)||!0}onScrollChanged(n){return super.onScrollChanged(n)||n.scrollHeightChanged}_viewOverlaysRender(n){super._viewOverlaysRender(n);const o=Math.min(n.scrollHeight,1e6);this.domNode.setHeight(o),this.domNode.setWidth(this._contentLeft)}}e.MarginViewOverlays=b}),define(ne[367],se([1,0,160,116]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TextChange=void 0,e.compressConsecutiveTextChanges=y;function I(_){return _.replace(/\n/g,"\\n").replace(/\r/g,"\\r")}class E{get oldLength(){return this.oldText.length}get oldEnd(){return this.oldPosition+this.oldText.length}get newLength(){return this.newText.length}get newEnd(){return this.newPosition+this.newText.length}constructor(b,p,n,o){this.oldPosition=b,this.oldText=p,this.newPosition=n,this.newText=o}toString(){return this.oldText.length===0?`(insert@${this.oldPosition} "${I(this.newText)}")`:this.newText.length===0?`(delete@${this.oldPosition} "${I(this.oldText)}")`:`(replace@${this.oldPosition} "${I(this.oldText)}" with "${I(this.newText)}")`}static _writeStringSize(b){return 4+2*b.length}static _writeString(b,p,n){const o=p.length;d.writeUInt32BE(b,o,n),n+=4;for(let t=0;tn&&(n=t)}return n}else{if(typeof E=="string")return _?E==="*"?5:E===m?10:0:0;if(E){const{language:n,pattern:o,scheme:t,hasAccessToAllModels:i,notebookType:s}=E;if(!_&&!i)return 0;s&&b&&(y=b);let g=0;if(t)if(t===y.scheme)g=10;else if(t==="*")g=5;else return 0;if(n)if(n===m)g=10;else if(n==="*")g=Math.max(g,5);else return 0;if(s)if(s===p)g=10;else if(s==="*"&&p!==void 0)g=Math.max(g,5);else return 0;if(o){let c;if(typeof o=="string"?c=o:c={...o,base:(0,k.normalize)(o.base)},c===y.fsPath||(0,d.match)(c,y.fsPath))g=10;else return 0}return g}else return 0}}}),define(ne[658],se([1,0,6,2,40,368]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LanguageFeatureRegistry=void 0;function y(p){return typeof p=="string"?!1:Array.isArray(p)?p.every(y):!!p.exclusive}class m{constructor(n,o,t,i,s){this.uri=n,this.languageId=o,this.notebookUri=t,this.notebookType=i,this.recursive=s}equals(n){return this.notebookType===n.notebookType&&this.languageId===n.languageId&&this.uri.toString()===n.uri.toString()&&this.notebookUri?.toString()===n.notebookUri?.toString()&&this.recursive===n.recursive}}class _{constructor(n){this._notebookInfoResolver=n,this._clock=0,this._entries=[],this._onDidChange=new d.Emitter,this.onDidChange=this._onDidChange.event}register(n,o){let t={selector:n,provider:o,_score:-1,_time:this._clock++};return this._entries.push(t),this._lastCandidate=void 0,this._onDidChange.fire(this._entries.length),(0,k.toDisposable)(()=>{if(t){const i=this._entries.indexOf(t);i>=0&&(this._entries.splice(i,1),this._lastCandidate=void 0,this._onDidChange.fire(this._entries.length),t=void 0)}})}has(n){return this.all(n).length>0}all(n){if(!n)return[];this._updateScores(n,!1);const o=[];for(const t of this._entries)t._score>0&&o.push(t.provider);return o}ordered(n,o=!1){const t=[];return this._orderedForEach(n,o,i=>t.push(i.provider)),t}orderedGroups(n){const o=[];let t,i;return this._orderedForEach(n,!1,s=>{t&&i===s._score?t.push(s.provider):(i=s._score,t=[s.provider],o.push(t))}),o}_orderedForEach(n,o,t){this._updateScores(n,o);for(const i of this._entries)i._score>0&&t(i)}_updateScores(n,o){const t=this._notebookInfoResolver?.(n.uri),i=t?new m(n.uri,n.getLanguageId(),t.uri,t.type,o):new m(n.uri,n.getLanguageId(),void 0,void 0,o);if(!this._lastCandidate?.equals(i)){this._lastCandidate=i;for(const s of this._entries)if(s._score=(0,E.score)(s.selector,i.uri,i.languageId,(0,I.shouldSynchronizeModel)(n),i.notebookUri,i.notebookType),y(s.selector)&&s._score>0)if(o)s._score=0;else{for(const g of this._entries)g._score=0;s._score=1e3;break}this._entries.sort(_._compareByScoreAndTime)}}static _compareByScoreAndTime(n,o){return n._scoreo._score?-1:b(n.selector)&&!b(o.selector)?1:!b(n.selector)&&b(o.selector)?-1:n._timeo._time?-1:0}}e.LanguageFeatureRegistry=_;function b(p){return typeof p=="string"?!1:Array.isArray(p)?p.some(b):!!p.isBuiltin}}),define(ne[27],se([1,0,26,22,4,585,3]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlineEditTriggerKind=e.TreeSitterTokenizationRegistry=e.TokenizationRegistry=e.LazyTokenizationSupport=e.InlayHintKind=e.Command=e.NewSymbolNameTriggerKind=e.NewSymbolNameTag=e.FoldingRangeKind=e.TextEdit=e.SymbolKinds=e.symbolKindNames=e.DocumentHighlightKind=e.SignatureHelpTriggerKind=e.DocumentPasteTriggerKind=e.SelectedSuggestionInfo=e.InlineCompletionTriggerKind=e.CompletionItemKinds=e.HoverVerbosityAction=e.EncodedTokenizationResult=e.TokenizationResult=e.Token=void 0,e.isLocationLink=c,e.getAriaLabelForSymbol=l;class m{constructor(D,T,M){this.offset=D,this.type=T,this.language=M,this._tokenBrand=void 0}toString(){return"("+this.offset+", "+this.type+")"}}e.Token=m;class _{constructor(D,T){this.tokens=D,this.endState=T,this._tokenizationResultBrand=void 0}}e.TokenizationResult=_;class b{constructor(D,T){this.tokens=D,this.endState=T,this._encodedTokenizationResultBrand=void 0}}e.EncodedTokenizationResult=b;var p;(function(L){L[L.Increase=0]="Increase",L[L.Decrease=1]="Decrease"})(p||(e.HoverVerbosityAction=p={}));var n;(function(L){const D=new Map;D.set(0,d.Codicon.symbolMethod),D.set(1,d.Codicon.symbolFunction),D.set(2,d.Codicon.symbolConstructor),D.set(3,d.Codicon.symbolField),D.set(4,d.Codicon.symbolVariable),D.set(5,d.Codicon.symbolClass),D.set(6,d.Codicon.symbolStruct),D.set(7,d.Codicon.symbolInterface),D.set(8,d.Codicon.symbolModule),D.set(9,d.Codicon.symbolProperty),D.set(10,d.Codicon.symbolEvent),D.set(11,d.Codicon.symbolOperator),D.set(12,d.Codicon.symbolUnit),D.set(13,d.Codicon.symbolValue),D.set(15,d.Codicon.symbolEnum),D.set(14,d.Codicon.symbolConstant),D.set(15,d.Codicon.symbolEnum),D.set(16,d.Codicon.symbolEnumMember),D.set(17,d.Codicon.symbolKeyword),D.set(27,d.Codicon.symbolSnippet),D.set(18,d.Codicon.symbolText),D.set(19,d.Codicon.symbolColor),D.set(20,d.Codicon.symbolFile),D.set(21,d.Codicon.symbolReference),D.set(22,d.Codicon.symbolCustomColor),D.set(23,d.Codicon.symbolFolder),D.set(24,d.Codicon.symbolTypeParameter),D.set(25,d.Codicon.account),D.set(26,d.Codicon.issues);function T(P){let N=D.get(P);return N||(console.info("No codicon found for CompletionItemKind "+P),N=d.Codicon.symbolProperty),N}L.toIcon=T;const M=new Map;M.set("method",0),M.set("function",1),M.set("constructor",2),M.set("field",3),M.set("variable",4),M.set("class",5),M.set("struct",6),M.set("interface",7),M.set("module",8),M.set("property",9),M.set("event",10),M.set("operator",11),M.set("unit",12),M.set("value",13),M.set("constant",14),M.set("enum",15),M.set("enum-member",16),M.set("enumMember",16),M.set("keyword",17),M.set("snippet",27),M.set("text",18),M.set("color",19),M.set("file",20),M.set("reference",21),M.set("customcolor",22),M.set("folder",23),M.set("type-parameter",24),M.set("typeParameter",24),M.set("account",25),M.set("issue",26);function A(P,N){let O=M.get(P);return typeof O>"u"&&!N&&(O=9),O}L.fromString=A})(n||(e.CompletionItemKinds=n={}));var o;(function(L){L[L.Automatic=0]="Automatic",L[L.Explicit=1]="Explicit"})(o||(e.InlineCompletionTriggerKind=o={}));class t{constructor(D,T,M,A){this.range=D,this.text=T,this.completionKind=M,this.isSnippetText=A}equals(D){return I.Range.lift(this.range).equalsRange(D.range)&&this.text===D.text&&this.completionKind===D.completionKind&&this.isSnippetText===D.isSnippetText}}e.SelectedSuggestionInfo=t;var i;(function(L){L[L.Automatic=0]="Automatic",L[L.PasteAs=1]="PasteAs"})(i||(e.DocumentPasteTriggerKind=i={}));var s;(function(L){L[L.Invoke=1]="Invoke",L[L.TriggerCharacter=2]="TriggerCharacter",L[L.ContentChange=3]="ContentChange"})(s||(e.SignatureHelpTriggerKind=s={}));var g;(function(L){L[L.Text=0]="Text",L[L.Read=1]="Read",L[L.Write=2]="Write"})(g||(e.DocumentHighlightKind=g={}));function c(L){return L&&k.URI.isUri(L.uri)&&I.Range.isIRange(L.range)&&(I.Range.isIRange(L.originSelectionRange)||I.Range.isIRange(L.targetSelectionRange))}e.symbolKindNames={17:(0,y.localize)(669,"array"),16:(0,y.localize)(670,"boolean"),4:(0,y.localize)(671,"class"),13:(0,y.localize)(672,"constant"),8:(0,y.localize)(673,"constructor"),9:(0,y.localize)(674,"enumeration"),21:(0,y.localize)(675,"enumeration member"),23:(0,y.localize)(676,"event"),7:(0,y.localize)(677,"field"),0:(0,y.localize)(678,"file"),11:(0,y.localize)(679,"function"),10:(0,y.localize)(680,"interface"),19:(0,y.localize)(681,"key"),5:(0,y.localize)(682,"method"),1:(0,y.localize)(683,"module"),2:(0,y.localize)(684,"namespace"),20:(0,y.localize)(685,"null"),15:(0,y.localize)(686,"number"),18:(0,y.localize)(687,"object"),24:(0,y.localize)(688,"operator"),3:(0,y.localize)(689,"package"),6:(0,y.localize)(690,"property"),14:(0,y.localize)(691,"string"),22:(0,y.localize)(692,"struct"),25:(0,y.localize)(693,"type parameter"),12:(0,y.localize)(694,"variable")};function l(L,D){return(0,y.localize)(695,"{0} ({1})",L,e.symbolKindNames[D])}var a;(function(L){const D=new Map;D.set(0,d.Codicon.symbolFile),D.set(1,d.Codicon.symbolModule),D.set(2,d.Codicon.symbolNamespace),D.set(3,d.Codicon.symbolPackage),D.set(4,d.Codicon.symbolClass),D.set(5,d.Codicon.symbolMethod),D.set(6,d.Codicon.symbolProperty),D.set(7,d.Codicon.symbolField),D.set(8,d.Codicon.symbolConstructor),D.set(9,d.Codicon.symbolEnum),D.set(10,d.Codicon.symbolInterface),D.set(11,d.Codicon.symbolFunction),D.set(12,d.Codicon.symbolVariable),D.set(13,d.Codicon.symbolConstant),D.set(14,d.Codicon.symbolString),D.set(15,d.Codicon.symbolNumber),D.set(16,d.Codicon.symbolBoolean),D.set(17,d.Codicon.symbolArray),D.set(18,d.Codicon.symbolObject),D.set(19,d.Codicon.symbolKey),D.set(20,d.Codicon.symbolNull),D.set(21,d.Codicon.symbolEnumMember),D.set(22,d.Codicon.symbolStruct),D.set(23,d.Codicon.symbolEvent),D.set(24,d.Codicon.symbolOperator),D.set(25,d.Codicon.symbolTypeParameter);function T(M){let A=D.get(M);return A||(console.info("No codicon found for SymbolKind "+M),A=d.Codicon.symbolProperty),A}L.toIcon=T})(a||(e.SymbolKinds=a={}));class r{}e.TextEdit=r;class u{static{this.Comment=new u("comment")}static{this.Imports=new u("imports")}static{this.Region=new u("region")}static fromValue(D){switch(D){case"comment":return u.Comment;case"imports":return u.Imports;case"region":return u.Region}return new u(D)}constructor(D){this.value=D}}e.FoldingRangeKind=u;var C;(function(L){L[L.AIGenerated=1]="AIGenerated"})(C||(e.NewSymbolNameTag=C={}));var f;(function(L){L[L.Invoke=0]="Invoke",L[L.Automatic=1]="Automatic"})(f||(e.NewSymbolNameTriggerKind=f={}));var h;(function(L){function D(T){return!T||typeof T!="object"?!1:typeof T.id=="string"&&typeof T.title=="string"}L.is=D})(h||(e.Command=h={}));var v;(function(L){L[L.Type=1]="Type",L[L.Parameter=2]="Parameter"})(v||(e.InlayHintKind=v={}));class w{constructor(D){this.createSupport=D,this._tokenizationSupport=null}dispose(){this._tokenizationSupport&&this._tokenizationSupport.then(D=>{D&&D.dispose()})}get tokenizationSupport(){return this._tokenizationSupport||(this._tokenizationSupport=this.createSupport()),this._tokenizationSupport}}e.LazyTokenizationSupport=w,e.TokenizationRegistry=new E.TokenizationRegistry,e.TreeSitterTokenizationRegistry=new E.TokenizationRegistry;var S;(function(L){L[L.Invoke=0]="Invoke",L[L.Automatic=1]="Automatic"})(S||(e.InlineEditTriggerKind=S={}))}),define(ne[177],se([1,0,27]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.NullState=void 0,e.nullTokenize=k,e.nullTokenizeEncoded=I,e.NullState=new class{clone(){return this}equals(E){return this===E}};function k(E,y){return new d.TokenizationResult([new d.Token(0,"",E)],y)}function I(E,y){const m=new Uint32Array(2);return m[0]=0,m[1]=(E<<0|0|0|32768|2<<24)>>>0,new d.EncodedTokenizationResult(m,y===null?e.NullState:y)}}),define(ne[208],se([1,0,11,116,4]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketsUtils=e.RichEditBrackets=e.RichEditBracket=void 0,e.createBracketOrRegExp=g;class E{constructor(r,u,C,f,h,v){this._richEditBracketBrand=void 0,this.languageId=r,this.index=u,this.open=C,this.close=f,this.forwardRegex=h,this.reversedRegex=v,this._openSet=E._toSet(this.open),this._closeSet=E._toSet(this.close)}isOpen(r){return this._openSet.has(r)}isClose(r){return this._closeSet.has(r)}static _toSet(r){const u=new Set;for(const C of r)u.add(C);return u}}e.RichEditBracket=E;function y(a){const r=a.length;a=a.map(v=>[v[0].toLowerCase(),v[1].toLowerCase()]);const u=[];for(let v=0;v{const[S,L]=v,[D,T]=w;return S===D||S===T||L===D||L===T},f=(v,w)=>{const S=Math.min(v,w),L=Math.max(v,w);for(let D=0;D0&&h.push({open:w,close:S})}return h}class m{constructor(r,u){this._richEditBracketsBrand=void 0;const C=y(u);this.brackets=C.map((f,h)=>new E(r,h,f.open,f.close,n(f.open,f.close,C,h),o(f.open,f.close,C,h))),this.forwardRegex=t(this.brackets),this.reversedRegex=i(this.brackets),this.textIsBracket={},this.textIsOpenBracket={},this.maxBracketLength=0;for(const f of this.brackets){for(const h of f.open)this.textIsBracket[h]=f,this.textIsOpenBracket[h]=!0,this.maxBracketLength=Math.max(this.maxBracketLength,h.length);for(const h of f.close)this.textIsBracket[h]=f,this.textIsOpenBracket[h]=!1,this.maxBracketLength=Math.max(this.maxBracketLength,h.length)}}}e.RichEditBrackets=m;function _(a,r,u,C){for(let f=0,h=r.length;f=0&&C.push(w);for(const w of v.close)w.indexOf(a)>=0&&C.push(w)}}function b(a,r){return a.length-r.length}function p(a){if(a.length<=1)return a;const r=[],u=new Set;for(const C of a)u.has(C)||(r.push(C),u.add(C));return r}function n(a,r,u,C){let f=[];f=f.concat(a),f=f.concat(r);for(let h=0,v=f.length;h=0;v--)f[h++]=C.charCodeAt(v);return k.getPlatformTextDecoder().decode(f)}let r=null,u=null;return function(f){return r!==f&&(r=f,u=a(r)),u}}();class l{static _findPrevBracketInText(r,u,C,f){const h=C.match(r);if(!h)return null;const v=C.length-(h.index||0),w=h[0].length,S=f+v;return new I.Range(u,S-w+1,u,S+1)}static findPrevBracketInRange(r,u,C,f,h){const w=c(C).substring(C.length-h,C.length-f);return this._findPrevBracketInText(r,u,w,f)}static findNextBracketInText(r,u,C,f){const h=C.match(r);if(!h)return null;const v=h.index||0,w=h[0].length;if(w===0)return null;const S=f+v;return new I.Range(u,S+1,u,S+1+w)}static findNextBracketInRange(r,u,C,f,h){const v=C.substring(f,h);return this.findNextBracketInText(r,u,v,f)}}e.BracketsUtils=l}),define(ne[659],se([1,0,13,169,208]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketElectricCharacterSupport=void 0;class E{constructor(m){this._richEditBrackets=m}getElectricCharacters(){const m=[];if(this._richEditBrackets)for(const _ of this._richEditBrackets.brackets)for(const b of _.close){const p=b.charAt(b.length-1);m.push(p)}return(0,d.distinct)(m)}onElectricCharacter(m,_,b){if(!this._richEditBrackets||this._richEditBrackets.brackets.length===0)return null;const p=_.findTokenIndexAtOffset(b-1);if((0,k.ignoreBracketsInToken)(_.getStandardTokenType(p)))return null;const n=this._richEditBrackets.reversedRegex,o=_.getLineContent().substring(0,b-1)+m,t=I.BracketsUtils.findPrevBracketInRange(n,1,o,0,o.length);if(!t)return null;const i=o.substring(t.startColumn-1,t.endColumn-1).toLowerCase();if(this._richEditBrackets.textIsOpenBracket[i])return null;const g=_.getActualLineContentBefore(t.startColumn-1);return/^\s*$/.test(g)?{matchOpenBracket:i}:null}}e.BracketElectricCharacterSupport=E}),define(ne[660],se([1,0,297,208]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ClosingBracketKind=e.OpeningBracketKind=e.BracketKindBase=e.LanguageBracketsConfiguration=void 0;class I{constructor(p,n){this.languageId=p;const o=n.brackets?E(n.brackets):[],t=new d.CachedFunction(g=>{const c=new Set;return{info:new m(this,g,c),closing:c}}),i=new d.CachedFunction(g=>{const c=new Set,l=new Set;return{info:new _(this,g,c,l),opening:c,openingColorized:l}});for(const[g,c]of o){const l=t.get(g),a=i.get(c);l.closing.add(a.info),a.opening.add(l.info)}const s=n.colorizedBracketPairs?E(n.colorizedBracketPairs):o.filter(g=>!(g[0]==="<"&&g[1]===">"));for(const[g,c]of s){const l=t.get(g),a=i.get(c);l.closing.add(a.info),a.openingColorized.add(l.info),a.opening.add(l.info)}this._openingBrackets=new Map([...t.cachedValues].map(([g,c])=>[g,c.info])),this._closingBrackets=new Map([...i.cachedValues].map(([g,c])=>[g,c.info]))}get openingBrackets(){return[...this._openingBrackets.values()]}get closingBrackets(){return[...this._closingBrackets.values()]}getOpeningBracketInfo(p){return this._openingBrackets.get(p)}getClosingBracketInfo(p){return this._closingBrackets.get(p)}getBracketInfo(p){return this.getOpeningBracketInfo(p)||this.getClosingBracketInfo(p)}getBracketRegExp(p){const n=Array.from([...this._openingBrackets.keys(),...this._closingBrackets.keys()]);return(0,k.createBracketOrRegExp)(n,p)}}e.LanguageBracketsConfiguration=I;function E(b){return b.filter(([p,n])=>p!==""&&n!=="")}class y{constructor(p,n){this.config=p,this.bracketText=n}get languageId(){return this.config.languageId}}e.BracketKindBase=y;class m extends y{constructor(p,n,o){super(p,n),this.openedBrackets=o,this.isOpeningBracket=!0}}e.OpeningBracketKind=m;class _ extends y{constructor(p,n,o,t){super(p,n),this.openingBrackets=o,this.openingColorizedBrackets=t,this.isOpeningBracket=!1}closes(p){return p.config!==this.config?!1:this.openingBrackets.has(p)}closesColorized(p){return p.config!==this.config?!1:this.openingColorizedBrackets.has(p)}getOpeningBrackets(){return[...this.openingBrackets]}}e.ClosingBracketKind=_}),define(ne[369],se([1,0,11,83,27,177]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.tokenizeToString=m,e.tokenizeLineToHTML=_,e._tokenizeToString=b;const y={getInitialState:()=>E.NullState,tokenizeEncoded:(p,n,o)=>(0,E.nullTokenizeEncoded)(0,o)};async function m(p,n,o){if(!o)return b(n,p.languageIdCodec,y);const t=await I.TokenizationRegistry.getOrCreate(o);return b(n,p.languageIdCodec,t||y)}function _(p,n,o,t,i,s,g){let c="
    ",l=t,a=0,r=!0;for(let u=0,C=n.getCount();u0;)g&&r?(h+=" ",r=!1):(h+=" ",r=!0),w--;break}case 60:h+="<",r=!1;break;case 62:h+=">",r=!1;break;case 38:h+="&",r=!1;break;case 0:h+="�",r=!1;break;case 65279:case 8232:case 8233:case 133:h+="\uFFFD",r=!1;break;case 13:h+="​",r=!1;break;case 32:g&&r?(h+=" ",r=!1):(h+=" ",r=!0);break;default:h+=String.fromCharCode(v),r=!1}}if(c+=`${h}`,f>i||l>=i)break}return c+="
    ",c}function b(p,n,o){let t='
    ';const i=d.splitLines(p);let s=o.getInitialState();for(let g=0,c=i.length;g0&&(t+="
    ");const a=o.tokenizeEncoded(l,!0,s);k.LineTokens.convertToEndOffset(a.tokens,l.length);const u=new k.LineTokens(a.tokens,l,n).inflate();let C=0;for(let f=0,h=u.getCount();f${d.escape(l.substring(C,w))}`,C=w}s=a.endState}return t+="
    ",t}}),define(ne[661],se([1,0,13,6,2,4,169,208,584]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketPairsTextModelPart=void 0;class b extends I.Disposable{get canBuildAST(){return this.textModel.getValueLength()<=5e6}constructor(s,g){super(),this.textModel=s,this.languageConfigurationService=g,this.bracketPairsTree=this._register(new I.MutableDisposable),this.onDidChangeEmitter=new k.Emitter,this.onDidChange=this.onDidChangeEmitter.event,this.bracketsRequested=!1}handleLanguageConfigurationServiceChange(s){(!s.languageId||this.bracketPairsTree.value?.object.didLanguageChange(s.languageId))&&(this.bracketPairsTree.clear(),this.updateBracketPairsTree())}handleDidChangeOptions(s){this.bracketPairsTree.clear(),this.updateBracketPairsTree()}handleDidChangeLanguage(s){this.bracketPairsTree.clear(),this.updateBracketPairsTree()}handleDidChangeContent(s){this.bracketPairsTree.value?.object.handleContentChanged(s)}handleDidChangeBackgroundTokenizationState(){this.bracketPairsTree.value?.object.handleDidChangeBackgroundTokenizationState()}handleDidChangeTokens(s){this.bracketPairsTree.value?.object.handleDidChangeTokens(s)}updateBracketPairsTree(){if(this.bracketsRequested&&this.canBuildAST){if(!this.bracketPairsTree.value){const s=new I.DisposableStore;this.bracketPairsTree.value=p(s.add(new _.BracketPairsTree(this.textModel,g=>this.languageConfigurationService.getLanguageConfiguration(g))),s),s.add(this.bracketPairsTree.value.object.onDidChange(g=>this.onDidChangeEmitter.fire(g))),this.onDidChangeEmitter.fire()}}else this.bracketPairsTree.value&&(this.bracketPairsTree.clear(),this.onDidChangeEmitter.fire())}getBracketPairsInRange(s){return this.bracketsRequested=!0,this.updateBracketPairsTree(),this.bracketPairsTree.value?.object.getBracketPairsInRange(s,!1)||d.CallbackIterable.empty}getBracketPairsInRangeWithMinIndentation(s){return this.bracketsRequested=!0,this.updateBracketPairsTree(),this.bracketPairsTree.value?.object.getBracketPairsInRange(s,!0)||d.CallbackIterable.empty}getBracketsInRange(s,g=!1){return this.bracketsRequested=!0,this.updateBracketPairsTree(),this.bracketPairsTree.value?.object.getBracketsInRange(s,g)||d.CallbackIterable.empty}findMatchingBracketUp(s,g,c){const l=this.textModel.validatePosition(g),a=this.textModel.getLanguageIdAtPosition(l.lineNumber,l.column);if(this.canBuildAST){const r=this.languageConfigurationService.getLanguageConfiguration(a).bracketsNew.getClosingBracketInfo(s);if(!r)return null;const u=this.getBracketPairsInRange(E.Range.fromPositions(g,g)).findLast(C=>r.closes(C.openingBracketInfo));return u?u.openingBracketRange:null}else{const r=s.toLowerCase(),u=this.languageConfigurationService.getLanguageConfiguration(a).brackets;if(!u)return null;const C=u.textIsBracket[r];return C?t(this._findMatchingBracketUp(C,l,n(c))):null}}matchBracket(s,g){if(this.canBuildAST){const c=this.getBracketPairsInRange(E.Range.fromPositions(s,s)).filter(l=>l.closingBracketRange!==void 0&&(l.openingBracketRange.containsPosition(s)||l.closingBracketRange.containsPosition(s))).findLastMaxBy((0,d.compareBy)(l=>l.openingBracketRange.containsPosition(s)?l.openingBracketRange:l.closingBracketRange,E.Range.compareRangesUsingStarts));return c?[c.openingBracketRange,c.closingBracketRange]:null}else{const c=n(g);return this._matchBracket(this.textModel.validatePosition(s),c)}}_establishBracketSearchOffsets(s,g,c,l){const a=g.getCount(),r=g.getLanguageId(l);let u=Math.max(0,s.column-1-c.maxBracketLength);for(let f=l-1;f>=0;f--){const h=g.getEndOffset(f);if(h<=u)break;if((0,y.ignoreBracketsInToken)(g.getStandardTokenType(f))||g.getLanguageId(f)!==r){u=h;break}}let C=Math.min(g.getLineContent().length,s.column-1+c.maxBracketLength);for(let f=l+1;f=C)break;if((0,y.ignoreBracketsInToken)(g.getStandardTokenType(f))||g.getLanguageId(f)!==r){C=h;break}}return{searchStartOffset:u,searchEndOffset:C}}_matchBracket(s,g){const c=s.lineNumber,l=this.textModel.tokenization.getLineTokens(c),a=this.textModel.getLineContent(c),r=l.findTokenIndexAtOffset(s.column-1);if(r<0)return null;const u=this.languageConfigurationService.getLanguageConfiguration(l.getLanguageId(r)).brackets;if(u&&!(0,y.ignoreBracketsInToken)(l.getStandardTokenType(r))){let{searchStartOffset:C,searchEndOffset:f}=this._establishBracketSearchOffsets(s,l,u,r),h=null;for(;;){const v=m.BracketsUtils.findNextBracketInRange(u.forwardRegex,c,a,C,f);if(!v)break;if(v.startColumn<=s.column&&s.column<=v.endColumn){const w=a.substring(v.startColumn-1,v.endColumn-1).toLowerCase(),S=this._matchFoundBracket(v,u.textIsBracket[w],u.textIsOpenBracket[w],g);if(S){if(S instanceof o)return null;h=S}}C=v.endColumn-1}if(h)return h}if(r>0&&l.getStartOffset(r)===s.column-1){const C=r-1,f=this.languageConfigurationService.getLanguageConfiguration(l.getLanguageId(C)).brackets;if(f&&!(0,y.ignoreBracketsInToken)(l.getStandardTokenType(C))){const{searchStartOffset:h,searchEndOffset:v}=this._establishBracketSearchOffsets(s,l,f,C),w=m.BracketsUtils.findPrevBracketInRange(f.reversedRegex,c,a,h,v);if(w&&w.startColumn<=s.column&&s.column<=w.endColumn){const S=a.substring(w.startColumn-1,w.endColumn-1).toLowerCase(),L=this._matchFoundBracket(w,f.textIsBracket[S],f.textIsOpenBracket[S],g);if(L)return L instanceof o?null:L}}}return null}_matchFoundBracket(s,g,c,l){if(!g)return null;const a=c?this._findMatchingBracketDown(g,s.getEndPosition(),l):this._findMatchingBracketUp(g,s.getStartPosition(),l);return a?a instanceof o?a:[s,a]:null}_findMatchingBracketUp(s,g,c){const l=s.languageId,a=s.reversedRegex;let r=-1,u=0;const C=(f,h,v,w)=>{for(;;){if(c&&++u%100===0&&!c())return o.INSTANCE;const S=m.BracketsUtils.findPrevBracketInRange(a,f,h,v,w);if(!S)break;const L=h.substring(S.startColumn-1,S.endColumn-1).toLowerCase();if(s.isOpen(L)?r++:s.isClose(L)&&r--,r===0)return S;w=S.startColumn-1}return null};for(let f=g.lineNumber;f>=1;f--){const h=this.textModel.tokenization.getLineTokens(f),v=h.getCount(),w=this.textModel.getLineContent(f);let S=v-1,L=w.length,D=w.length;f===g.lineNumber&&(S=h.findTokenIndexAtOffset(g.column-1),L=g.column-1,D=g.column-1);let T=!0;for(;S>=0;S--){const M=h.getLanguageId(S)===l&&!(0,y.ignoreBracketsInToken)(h.getStandardTokenType(S));if(M)T?L=h.getStartOffset(S):(L=h.getStartOffset(S),D=h.getEndOffset(S));else if(T&&L!==D){const A=C(f,w,L,D);if(A)return A}T=M}if(T&&L!==D){const M=C(f,w,L,D);if(M)return M}}return null}_findMatchingBracketDown(s,g,c){const l=s.languageId,a=s.forwardRegex;let r=1,u=0;const C=(h,v,w,S)=>{for(;;){if(c&&++u%100===0&&!c())return o.INSTANCE;const L=m.BracketsUtils.findNextBracketInRange(a,h,v,w,S);if(!L)break;const D=v.substring(L.startColumn-1,L.endColumn-1).toLowerCase();if(s.isOpen(D)?r++:s.isClose(D)&&r--,r===0)return L;w=L.endColumn-1}return null},f=this.textModel.getLineCount();for(let h=g.lineNumber;h<=f;h++){const v=this.textModel.tokenization.getLineTokens(h),w=v.getCount(),S=this.textModel.getLineContent(h);let L=0,D=0,T=0;h===g.lineNumber&&(L=v.findTokenIndexAtOffset(g.column-1),D=g.column-1,T=g.column-1);let M=!0;for(;L=1;r--){const u=this.textModel.tokenization.getLineTokens(r),C=u.getCount(),f=this.textModel.getLineContent(r);let h=C-1,v=f.length,w=f.length;if(r===g.lineNumber){h=u.findTokenIndexAtOffset(g.column-1),v=g.column-1,w=g.column-1;const L=u.getLanguageId(h);c!==L&&(c=L,l=this.languageConfigurationService.getLanguageConfiguration(c).brackets,a=this.languageConfigurationService.getLanguageConfiguration(c).bracketsNew)}let S=!0;for(;h>=0;h--){const L=u.getLanguageId(h);if(c!==L){if(l&&a&&S&&v!==w){const T=m.BracketsUtils.findPrevBracketInRange(l.reversedRegex,r,f,v,w);if(T)return this._toFoundBracket(a,T);S=!1}c=L,l=this.languageConfigurationService.getLanguageConfiguration(c).brackets,a=this.languageConfigurationService.getLanguageConfiguration(c).bracketsNew}const D=!!l&&!(0,y.ignoreBracketsInToken)(u.getStandardTokenType(h));if(D)S?v=u.getStartOffset(h):(v=u.getStartOffset(h),w=u.getEndOffset(h));else if(a&&l&&S&&v!==w){const T=m.BracketsUtils.findPrevBracketInRange(l.reversedRegex,r,f,v,w);if(T)return this._toFoundBracket(a,T)}S=D}if(a&&l&&S&&v!==w){const L=m.BracketsUtils.findPrevBracketInRange(l.reversedRegex,r,f,v,w);if(L)return this._toFoundBracket(a,L)}}return null}findNextBracket(s){const g=this.textModel.validatePosition(s);if(this.canBuildAST)return this.bracketsRequested=!0,this.updateBracketPairsTree(),this.bracketPairsTree.value?.object.getFirstBracketAfter(g)||null;const c=this.textModel.getLineCount();let l=null,a=null,r=null;for(let u=g.lineNumber;u<=c;u++){const C=this.textModel.tokenization.getLineTokens(u),f=C.getCount(),h=this.textModel.getLineContent(u);let v=0,w=0,S=0;if(u===g.lineNumber){v=C.findTokenIndexAtOffset(g.column-1),w=g.column-1,S=g.column-1;const D=C.getLanguageId(v);l!==D&&(l=D,a=this.languageConfigurationService.getLanguageConfiguration(l).brackets,r=this.languageConfigurationService.getLanguageConfiguration(l).bracketsNew)}let L=!0;for(;vD.closingBracketRange!==void 0&&D.range.strictContainsRange(S));return L?[L.openingBracketRange,L.closingBracketRange]:null}const l=n(g),a=this.textModel.getLineCount(),r=new Map;let u=[];const C=(S,L)=>{if(!r.has(S)){const D=[];for(let T=0,M=L?L.brackets.length:0;T{for(;;){if(l&&++f%100===0&&!l())return o.INSTANCE;const A=m.BracketsUtils.findNextBracketInRange(S.forwardRegex,L,D,T,M);if(!A)break;const P=D.substring(A.startColumn-1,A.endColumn-1).toLowerCase(),N=S.textIsBracket[P];if(N&&(N.isOpen(P)?u[N.index]++:N.isClose(P)&&u[N.index]--,u[N.index]===-1))return this._matchFoundBracket(A,N,!1,l);T=A.endColumn-1}return null};let v=null,w=null;for(let S=c.lineNumber;S<=a;S++){const L=this.textModel.tokenization.getLineTokens(S),D=L.getCount(),T=this.textModel.getLineContent(S);let M=0,A=0,P=0;if(S===c.lineNumber){M=L.findTokenIndexAtOffset(c.column-1),A=c.column-1,P=c.column-1;const O=L.getLanguageId(M);v!==O&&(v=O,w=this.languageConfigurationService.getLanguageConfiguration(v).brackets,C(v,w))}let N=!0;for(;Ms?.dispose()}}function n(i){if(typeof i>"u")return()=>!0;{const s=Date.now();return()=>Date.now()-s<=i}}class o{static{this.INSTANCE=new o}constructor(){this._searchCanceledBrand=void 0}}function t(i){return i instanceof o?null:i}}),define(ne[370],se([1,0,3,8,23,22,367,160,48]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditStack=e.MultiModelEditStackElement=e.SingleModelEditStackElement=e.SingleModelEditStackData=void 0,e.isEditStackElement=i;function b(g){return g.toString()}class p{static create(c,l){const a=c.getAlternativeVersionId(),r=t(c);return new p(a,a,r,r,l,l,[])}constructor(c,l,a,r,u,C,f){this.beforeVersionId=c,this.afterVersionId=l,this.beforeEOL=a,this.afterEOL=r,this.beforeCursorState=u,this.afterCursorState=C,this.changes=f}append(c,l,a,r,u){l.length>0&&(this.changes=(0,y.compressConsecutiveTextChanges)(this.changes,l)),this.afterEOL=a,this.afterVersionId=r,this.afterCursorState=u}static _writeSelectionsSize(c){return 4+4*4*(c?c.length:0)}static _writeSelections(c,l,a){if(m.writeUInt32BE(c,l?l.length:0,a),a+=4,l)for(const r of l)m.writeUInt32BE(c,r.selectionStartLineNumber,a),a+=4,m.writeUInt32BE(c,r.selectionStartColumn,a),a+=4,m.writeUInt32BE(c,r.positionLineNumber,a),a+=4,m.writeUInt32BE(c,r.positionColumn,a),a+=4;return a}static _readSelections(c,l,a){const r=m.readUInt32BE(c,l);l+=4;for(let u=0;ul.toString()).join(", ")}matchesResource(c){return(E.URI.isUri(this.model)?this.model:this.model.uri).toString()===c.toString()}setModel(c){this.model=c}canAppend(c){return this.model===c&&this._data instanceof p}append(c,l,a,r,u){this._data instanceof p&&this._data.append(c,l,a,r,u)}close(){this._data instanceof p&&(this._data=this._data.serialize())}open(){this._data instanceof p||(this._data=p.deserialize(this._data))}undo(){if(E.URI.isUri(this.model))throw new Error("Invalid SingleModelEditStackElement");this._data instanceof p&&(this._data=this._data.serialize());const c=p.deserialize(this._data);this.model._applyUndo(c.changes,c.beforeEOL,c.beforeVersionId,c.beforeCursorState)}redo(){if(E.URI.isUri(this.model))throw new Error("Invalid SingleModelEditStackElement");this._data instanceof p&&(this._data=this._data.serialize());const c=p.deserialize(this._data);this.model._applyRedo(c.changes,c.afterEOL,c.afterVersionId,c.afterCursorState)}heapSize(){return this._data instanceof p&&(this._data=this._data.serialize()),this._data.byteLength+168}}e.SingleModelEditStackElement=n;class o{get resources(){return this._editStackElementsArr.map(c=>c.resource)}constructor(c,l,a){this.label=c,this.code=l,this.type=1,this._isOpen=!0,this._editStackElementsArr=a.slice(0),this._editStackElementsMap=new Map;for(const r of this._editStackElementsArr){const u=b(r.resource);this._editStackElementsMap.set(u,r)}this._delegate=null}prepareUndoRedo(){if(this._delegate)return this._delegate.prepareUndoRedo(this)}matchesResource(c){const l=b(c);return this._editStackElementsMap.has(l)}setModel(c){const l=b(E.URI.isUri(c)?c:c.uri);this._editStackElementsMap.has(l)&&this._editStackElementsMap.get(l).setModel(c)}canAppend(c){if(!this._isOpen)return!1;const l=b(c.uri);return this._editStackElementsMap.has(l)?this._editStackElementsMap.get(l).canAppend(c):!1}append(c,l,a,r,u){const C=b(c.uri);this._editStackElementsMap.get(C).append(c,l,a,r,u)}close(){this._isOpen=!1}open(){}undo(){this._isOpen=!1;for(const c of this._editStackElementsArr)c.undo()}redo(){for(const c of this._editStackElementsArr)c.redo()}heapSize(c){const l=b(c);return this._editStackElementsMap.has(l)?this._editStackElementsMap.get(l).heapSize():0}split(){return this._editStackElementsArr}toString(){const c=[];for(const l of this._editStackElementsArr)c.push(`${(0,_.basename)(l.resource)}: ${l}`);return`{${c.join(", ")}}`}}e.MultiModelEditStackElement=o;function t(g){return g.getEOL()===` -`?0:1}function i(g){return g?g instanceof n||g instanceof o:!1}class s{constructor(c,l){this._model=c,this._undoRedoService=l}pushStackElement(){const c=this._undoRedoService.getLastElement(this._model.uri);i(c)&&c.close()}popStackElement(){const c=this._undoRedoService.getLastElement(this._model.uri);i(c)&&c.open()}clear(){this._undoRedoService.removeElements(this._model.uri)}_getOrCreateEditStackElement(c,l){const a=this._undoRedoService.getLastElement(this._model.uri);if(i(a)&&a.canAppend(this._model))return a;const r=new n(d.localize(697,"Typing"),"undoredo.textBufferEdit",this._model,c);return this._undoRedoService.pushElement(r,l),r}pushEOL(c){const l=this._getOrCreateEditStackElement(null,void 0);this._model.setEOL(c),l.append(this._model,[],t(this._model),this._model.getAlternativeVersionId(),null)}pushEditOperation(c,l,a,r){const u=this._getOrCreateEditStackElement(c,r),C=this._model.applyEdits(l,!0),f=s._computeCursorState(a,C),h=C.map((v,w)=>({index:w,textChange:v.textChange}));return h.sort((v,w)=>v.textChange.oldPosition===w.textChange.oldPosition?v.index-w.index:v.textChange.oldPosition-w.textChange.oldPosition),u.append(this._model,h.map(v=>v.textChange),t(this._model),this._model.getAlternativeVersionId(),f),f}static _computeCursorState(c,l){try{return c?c(l):null}catch(a){return(0,k.onUnexpectedError)(a),null}}}e.EditStack=s}),define(ne[371],se([1,0,6,11,4,40,324,145,367,2]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PieceTreeTextBuffer=void 0;class p extends b.Disposable{constructor(o,t,i,s,g,c,l){super(),this._onDidChangeContent=this._register(new d.Emitter),this._BOM=t,this._mightContainNonBasicASCII=!c,this._mightContainRTL=s,this._mightContainUnusualLineTerminators=g,this._pieceTree=new y.PieceTreeBase(o,i,l)}mightContainRTL(){return this._mightContainRTL}mightContainUnusualLineTerminators(){return this._mightContainUnusualLineTerminators}resetMightContainUnusualLineTerminators(){this._mightContainUnusualLineTerminators=!1}mightContainNonBasicASCII(){return this._mightContainNonBasicASCII}getBOM(){return this._BOM}getEOL(){return this._pieceTree.getEOL()}createSnapshot(o){return this._pieceTree.createSnapshot(o?this._BOM:"")}getOffsetAt(o,t){return this._pieceTree.getOffsetAt(o,t)}getPositionAt(o){return this._pieceTree.getPositionAt(o)}getRangeAt(o,t){const i=o+t,s=this.getPositionAt(o),g=this.getPositionAt(i);return new I.Range(s.lineNumber,s.column,g.lineNumber,g.column)}getValueInRange(o,t=0){if(o.isEmpty())return"";const i=this._getEndOfLine(t);return this._pieceTree.getValueInRange(o,i)}getValueLengthInRange(o,t=0){if(o.isEmpty())return 0;if(o.startLineNumber===o.endLineNumber)return o.endColumn-o.startColumn;const i=this.getOffsetAt(o.startLineNumber,o.startColumn),s=this.getOffsetAt(o.endLineNumber,o.endColumn);let g=0;const c=this._getEndOfLine(t),l=this.getEOL();if(c.length!==l.length){const a=c.length-l.length,r=o.endLineNumber-o.startLineNumber;g=a*r}return s-i+g}getCharacterCountInRange(o,t=0){if(this._mightContainNonBasicASCII){let i=0;const s=o.startLineNumber,g=o.endLineNumber;for(let c=s;c<=g;c++){const l=this.getLineContent(c),a=c===s?o.startColumn-1:0,r=c===g?o.endColumn-1:l.length;for(let u=a;uS.sortIndex-L.sortIndex)}this._mightContainRTL=s,this._mightContainUnusualLineTerminators=g,this._mightContainNonBasicASCII=c;const h=this._doApplyEdits(a);let v=null;if(t&&C.length>0){C.sort((w,S)=>S.lineNumber-w.lineNumber),v=[];for(let w=0,S=C.length;w0&&C[w-1].lineNumber===L)continue;const D=C[w].oldContent,T=this.getLineContent(L);T.length===0||T===D||k.firstNonWhitespaceIndex(T)!==-1||v.push(L)}}return this._onDidChangeContent.fire(),new E.ApplyEditsResult(f,h,v)}_reduceOperations(o){return o.length<1e3?o:[this._toSingleEditOperation(o)]}_toSingleEditOperation(o){let t=!1;const i=o[0].range,s=o[o.length-1].range,g=new I.Range(i.startLineNumber,i.startColumn,s.endLineNumber,s.endColumn);let c=i.startLineNumber,l=i.startColumn;const a=[];for(let h=0,v=o.length;h0&&a.push(w.text),c=S.endLineNumber,l=S.endColumn}const r=a.join(""),[u,C,f]=(0,m.countEOL)(r);return{sortIndex:0,identifier:o[0].identifier,range:g,rangeOffset:this.getOffsetAt(g.startLineNumber,g.startColumn),rangeLength:this.getValueLengthInRange(g,0),text:r,eolCount:u,firstLineLength:C,lastLineLength:f,forceMoveMarkers:t,isAutoWhitespaceEdit:!1}}_doApplyEdits(o){o.sort(p._sortOpsDescending);const t=[];for(let i=0;i0){const f=a.eolCount+1;f===1?C=new I.Range(r,u,r,u+a.firstLineLength):C=new I.Range(r,u,r+f-1,a.lastLineLength+1)}else C=new I.Range(r,u,r,u);i=C.endLineNumber,s=C.endColumn,t.push(C),g=a}return t}static _sortOpsAscending(o,t){const i=I.Range.compareRangesUsingEnds(o.range,t.range);return i===0?o.sortIndex-t.sortIndex:i}static _sortOpsDescending(o,t){const i=I.Range.compareRangesUsingEnds(o.range,t.range);return i===0?t.sortIndex-o.sortIndex:-i}}e.PieceTreeTextBuffer=p}),define(ne[662],se([1,0,11,324,371]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PieceTreeTextBufferBuilder=void 0;class E{constructor(_,b,p,n,o,t,i,s,g){this._chunks=_,this._bom=b,this._cr=p,this._lf=n,this._crlf=o,this._containsRTL=t,this._containsUnusualLineTerminators=i,this._isBasicASCII=s,this._normalizeEOL=g}_getEOL(_){const b=this._cr+this._lf+this._crlf,p=this._cr+this._crlf;return b===0?_===1?` -`:`\r -`:p>b/2?`\r -`:` -`}create(_){const b=this._getEOL(_),p=this._chunks;if(this._normalizeEOL&&(b===`\r -`&&(this._cr>0||this._lf>0)||b===` -`&&(this._cr>0||this._crlf>0)))for(let o=0,t=p.length;o=55296&&b<=56319?(this._acceptChunk1(_.substr(0,_.length-1),!1),this._hasPreviousChar=!0,this._previousChar=b):(this._acceptChunk1(_,!1),this._hasPreviousChar=!1,this._previousChar=b)}_acceptChunk1(_,b){!b&&_.length===0||(this._hasPreviousChar?this._acceptChunk2(String.fromCharCode(this._previousChar)+_):this._acceptChunk2(_))}_acceptChunk2(_){const b=(0,k.createLineStarts)(this._tmpLineStarts,_);this.chunks.push(new k.StringBuffer(_,b.lineStarts)),this.cr+=b.cr,this.lf+=b.lf,this.crlf+=b.crlf,b.isBasicASCII||(this.isBasicASCII=!1,this.containsRTL||(this.containsRTL=d.containsRTL(_)),this.containsUnusualLineTerminators||(this.containsUnusualLineTerminators=d.containsUnusualLineTerminators(_)))}finish(_=!0){return this._finish(),new E(this.chunks,this.BOM,this.cr,this.lf,this.crlf,this.containsRTL,this.containsUnusualLineTerminators,this.isBasicASCII,_)}_finish(){if(this.chunks.length===0&&this._acceptChunk1("",!0),this._hasPreviousChar){this._hasPreviousChar=!1;const _=this.chunks[this.chunks.length-1];_.buffer+=String.fromCharCode(this._previousChar);const b=(0,k.createLineStartsFast)(_.buffer);_.lineStarts=b,this._previousChar===13&&this.cr++}}}e.PieceTreeTextBufferBuilder=y}),define(ne[663],se([1,0,14,8,16,54,145,55,68,177,576,330,83]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DefaultBackgroundTokenizer=e.RangePriorityQueueImpl=e.TokenizationStateStore=e.TrackingTokenizationStateStore=e.TokenizerWithStateStoreAndTextModel=e.TokenizerWithStateStore=void 0;class t{constructor(u,C){this.tokenizationSupport=C,this.initialState=this.tokenizationSupport.getInitialState(),this.store=new s(u)}getStartState(u){return this.store.getStartState(u,this.initialState)}getFirstInvalidLine(){return this.store.getFirstInvalidLine(this.initialState)}}e.TokenizerWithStateStore=t;class i extends t{constructor(u,C,f,h){super(u,C),this._textModel=f,this._languageIdCodec=h}updateTokensUntilLine(u,C){const f=this._textModel.getLanguageId();for(;;){const h=this.getFirstInvalidLine();if(!h||h.lineNumber>C)break;const v=this._textModel.getLineContent(h.lineNumber),w=l(this._languageIdCodec,f,this.tokenizationSupport,v,!0,h.startState);u.add(h.lineNumber,w.tokens),this.store.setEndState(h.lineNumber,w.endState)}}getTokenTypeIfInsertingCharacter(u,C){const f=this.getStartState(u.lineNumber);if(!f)return 0;const h=this._textModel.getLanguageId(),v=this._textModel.getLineContent(u.lineNumber),w=v.substring(0,u.column-1)+C+v.substring(u.column-1),S=l(this._languageIdCodec,h,this.tokenizationSupport,w,!0,f),L=new o.LineTokens(S.tokens,w,this._languageIdCodec);if(L.getCount()===0)return 0;const D=L.findTokenIndexAtOffset(u.column-1);return L.getStandardTokenType(D)}tokenizeLineWithEdit(u,C,f){const h=u.lineNumber,v=u.column,w=this.getStartState(h);if(!w)return null;const S=this._textModel.getLineContent(h),L=S.substring(0,v-1)+f+S.substring(v-1+C),D=this._textModel.getLanguageIdAtPosition(h,0),T=l(this._languageIdCodec,D,this.tokenizationSupport,L,!0,w);return new o.LineTokens(T.tokens,L,this._languageIdCodec)}hasAccurateTokensForLine(u){const C=this.store.getFirstInvalidEndStateLineNumberOrMax();return u1&&S>=1;S--){const L=this._textModel.getLineFirstNonWhitespaceColumn(S);if(L!==0&&L0&&f>0&&(f--,C--),this._lineEndStates.replace(u.startLineNumber,f,C)}}e.TokenizationStateStore=g;class c{constructor(){this._ranges=[]}get min(){return this._ranges.length===0?null:this._ranges[0].start}delete(u){const C=this._ranges.findIndex(f=>f.contains(u));if(C!==-1){const f=this._ranges[C];f.start===u?f.endExclusive===u+1?this._ranges.splice(C,1):this._ranges[C]=new _.OffsetRange(u+1,f.endExclusive):f.endExclusive===u+1?this._ranges[C]=new _.OffsetRange(f.start,u):this._ranges.splice(C,1,new _.OffsetRange(f.start,u),new _.OffsetRange(u+1,f.endExclusive))}}addRange(u){_.OffsetRange.addRange(u,this._ranges)}addRangeAndResize(u,C){let f=0;for(;!(f>=this._ranges.length||u.start<=this._ranges[f].endExclusive);)f++;let h=f;for(;!(h>=this._ranges.length||u.endExclusiveu.toString()).join(" + ")}}e.RangePriorityQueueImpl=c;function l(r,u,C,f,h,v){let w=null;if(C)try{w=C.tokenizeEncoded(f,h,v.clone())}catch(S){(0,k.onUnexpectedError)(S)}return w||(w=(0,b.nullTokenizeEncoded)(r.encodeLanguageId(u),v)),o.LineTokens.convertToEndOffset(w.tokens,f.length),w}class a{constructor(u,C){this._tokenizerWithStateStore=u,this._backgroundTokenStore=C,this._isDisposed=!1,this._isScheduled=!1}dispose(){this._isDisposed=!0}handleChanges(){this._beginBackgroundTokenization()}_beginBackgroundTokenization(){this._isScheduled||!this._tokenizerWithStateStore._textModel.isAttachedToEditor()||!this._hasLinesToTokenize()||(this._isScheduled=!0,(0,d.runWhenGlobalIdle)(u=>{this._isScheduled=!1,this._backgroundTokenizeWithDeadline(u)}))}_backgroundTokenizeWithDeadline(u){const C=Date.now()+u.timeRemaining(),f=()=>{this._isDisposed||!this._tokenizerWithStateStore._textModel.isAttachedToEditor()||!this._hasLinesToTokenize()||(this._backgroundTokenizeForAtLeast1ms(),Date.now()1||this._tokenizeOneInvalidLine(C)>=u)break;while(this._hasLinesToTokenize());this._backgroundTokenStore.setTokens(C.finalize()),this.checkFinished()}_hasLinesToTokenize(){return this._tokenizerWithStateStore?!this._tokenizerWithStateStore.store.allStatesValid():!1}_tokenizeOneInvalidLine(u){const C=this._tokenizerWithStateStore?.getFirstInvalidLine();return C?(this._tokenizerWithStateStore.updateTokensUntilLine(u,C.lineNumber),C.lineNumber):this._tokenizerWithStateStore._textModel.getLineCount()+1}checkFinished(){this._isDisposed||this._tokenizerWithStateStore.store.allStatesValid()&&this._backgroundTokenStore.backgroundTokenizationFinished()}requestTokens(u,C){this._tokenizerWithStateStore.store.invalidateEndStateRange(new m.LineRange(u,C))}}e.DefaultBackgroundTokenizer=a}),define(ne[263],se([1,0,13,14,6,2,55]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractTokens=e.AttachedViewHandler=e.AttachedViews=void 0;class m{constructor(){this._onDidChangeVisibleRanges=new I.Emitter,this.onDidChangeVisibleRanges=this._onDidChangeVisibleRanges.event,this._views=new Set}attachView(){const o=new _(t=>{this._onDidChangeVisibleRanges.fire({view:o,state:t})});return this._views.add(o),o}detachView(o){this._views.delete(o),this._onDidChangeVisibleRanges.fire({view:o,state:void 0})}}e.AttachedViews=m;class _{constructor(o){this.handleStateChange=o}setVisibleLines(o,t){const i=o.map(s=>new y.LineRange(s.startLineNumber,s.endLineNumber+1));this.handleStateChange({visibleLineRanges:i,stabilized:t})}}class b extends E.Disposable{get lineRanges(){return this._lineRanges}constructor(o){super(),this._refreshTokens=o,this.runner=this._register(new k.RunOnceScheduler(()=>this.update(),50)),this._computedLineRanges=[],this._lineRanges=[]}update(){(0,d.equals)(this._computedLineRanges,this._lineRanges,(o,t)=>o.equals(t))||(this._computedLineRanges=this._lineRanges,this._refreshTokens())}handleStateChange(o){this._lineRanges=o.visibleLineRanges,o.stabilized?(this.runner.cancel(),this.update()):this.runner.schedule()}}e.AttachedViewHandler=b;class p extends E.Disposable{get backgroundTokenizationState(){return this._backgroundTokenizationState}constructor(o,t,i){super(),this._languageIdCodec=o,this._textModel=t,this.getLanguageId=i,this._backgroundTokenizationState=1,this._onDidChangeBackgroundTokenizationState=this._register(new I.Emitter),this.onDidChangeBackgroundTokenizationState=this._onDidChangeBackgroundTokenizationState.event,this._onDidChangeTokens=this._register(new I.Emitter),this.onDidChangeTokens=this._onDidChangeTokens.event}tokenizeIfCheap(o){this.isCheapToTokenize(o)&&this.forceTokenization(o)}}e.AbstractTokens=p}),define(ne[664],se([1,0,27,83,263]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TreeSitterTokens=void 0;class E extends I.AbstractTokens{constructor(m,_,b,p){super(_,b,p),this._treeSitterService=m,this._tokenizationSupport=null,this._initialize()}_initialize(){const m=this.getLanguageId();(!this._tokenizationSupport||this._lastLanguageId!==m)&&(this._lastLanguageId=m,this._tokenizationSupport=d.TreeSitterTokenizationRegistry.get(m))}getLineTokens(m){const _=this._textModel.getLineContent(m);if(this._tokenizationSupport){const b=this._tokenizationSupport.tokenizeEncoded(m,this._textModel);if(b)return new k.LineTokens(b,_,this._languageIdCodec)}return k.LineTokens.createEmpty(_,this._languageIdCodec)}resetTokenization(m=!0){m&&this._onDidChangeTokens.fire({semanticTokensApplied:!1,ranges:[{fromLineNumber:1,toLineNumber:this._textModel.getLineCount()}]}),this._initialize()}handleDidChangeAttached(){}handleDidChangeContent(m){m.isFlush&&this.resetTokenization(!1)}forceTokenization(m){}hasAccurateTokensForLine(m){return!0}isCheapToTokenize(m){return!0}getTokenTypeIfInsertingCharacter(m,_,b){return 0}tokenizeLineWithEdit(m,_,b){return null}get hasTokens(){return this._treeSitterService.getParseResult(this._textModel)!==void 0}}e.TreeSitterTokens=E}),define(ne[372],se([1,0,18,6,72,22,9,4,23,27,238]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.KeyMod=void 0,e.createMonacoBaseAPI=o;class n{static{this.CtrlCmd=2048}static{this.Shift=1024}static{this.Alt=512}static{this.WinCtrl=256}static chord(i,s){return(0,I.KeyChord)(i,s)}}e.KeyMod=n;function o(){return{editor:void 0,languages:void 0,CancellationTokenSource:d.CancellationTokenSource,Emitter:k.Emitter,KeyCode:p.KeyCode,KeyMod:n,Position:y.Position,Range:m.Range,Selection:_.Selection,SelectionDirection:p.SelectionDirection,MarkerSeverity:p.MarkerSeverity,MarkerTag:p.MarkerTag,Uri:E.URI,Token:b.Token}}}),define(ne[665],se([1,0,160,16]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.encodeSemanticTokensDto=y;function I(_){for(let b=0,p=_.length;bthis._checkStopModelSync(),Math.round(e.STOP_SYNC_MODEL_DELTA_TIME_MS/2)),this._register(g)}}dispose(){for(const t in this._syncedModels)(0,k.dispose)(this._syncedModels[t]);this._syncedModels=Object.create(null),this._syncedModelsLastUsedTime=Object.create(null),super.dispose()}ensureSyncedResources(t,i=!1){for(const s of t){const g=s.toString();this._syncedModels[g]||this._beginModelSync(s,i),this._syncedModels[g]&&(this._syncedModelsLastUsedTime[g]=new Date().getTime())}}_checkStopModelSync(){const t=new Date().getTime(),i=[];for(const s in this._syncedModelsLastUsedTime)t-this._syncedModelsLastUsedTime[s]>e.STOP_SYNC_MODEL_DELTA_TIME_MS&&i.push(s);for(const s of i)this._stopModelSync(s)}_beginModelSync(t,i){const s=this._modelService.getModel(t);if(!s||!i&&s.isTooLargeForSyncing())return;const g=t.toString();this._proxy.$acceptNewModel({url:s.uri.toString(),lines:s.getLinesContent(),EOL:s.getEOL(),versionId:s.getVersionId()});const c=new k.DisposableStore;c.add(s.onDidChangeContent(l=>{this._proxy.$acceptModelChanged(g.toString(),l)})),c.add(s.onWillDispose(()=>{this._stopModelSync(g)})),c.add((0,k.toDisposable)(()=>{this._proxy.$acceptRemovedModel(g)})),this._syncedModels[g]=c}_stopModelSync(t){const i=this._syncedModels[t];delete this._syncedModels[t],delete this._syncedModelsLastUsedTime[t],(0,k.dispose)(i)}}e.WorkerTextModelSyncClient=b;class p{constructor(){this._models=Object.create(null)}getModel(t){return this._models[t]}getModels(){const t=[];return Object.keys(this._models).forEach(i=>t.push(this._models[i])),t}$acceptNewModel(t){this._models[t.url]=new n(I.URI.parse(t.url),t.lines,t.EOL,t.versionId)}$acceptModelChanged(t,i){if(!this._models[t])return;this._models[t].onEvents(i)}$acceptRemovedModel(t){this._models[t]&&delete this._models[t]}}e.WorkerTextModelSyncServer=p;class n extends _.MirrorTextModel{get uri(){return this._uri}get eol(){return this._eol}getValue(){return this.getText()}findMatches(t){const i=[];for(let s=0;sthis._lines.length)i=this._lines.length,s=this._lines[i-1].length+1,g=!0;else{const c=this._lines[i-1].length+1;s<1?(s=1,g=!0):s>c&&(s=c,g=!0)}return g?{lineNumber:i,column:s}:t}}e.MirrorModel=n}),define(ne[666],se([1,0,190,4,564,570,372,326,54,328,561,60,42,563,582,373]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorSimpleWorker=e.BaseEditorSimpleWorker=void 0,e.create=a;const g=!1;class c{constructor(){this._workerTextModelSyncServer=new s.WorkerTextModelSyncServer}dispose(){}_getModel(u){return this._workerTextModelSyncServer.getModel(u)}_getModels(){return this._workerTextModelSyncServer.getModels()}$acceptNewModel(u){this._workerTextModelSyncServer.$acceptNewModel(u)}$acceptModelChanged(u,C){this._workerTextModelSyncServer.$acceptModelChanged(u,C)}$acceptRemovedModel(u){this._workerTextModelSyncServer.$acceptRemovedModel(u)}async $computeUnicodeHighlights(u,C,f){const h=this._getModel(u);return h?b.UnicodeTextModelHighlighter.computeUnicodeHighlights(h,C,f):{ranges:[],hasMore:!1,ambiguousCharacterCount:0,invisibleCharacterCount:0,nonBasicAsciiCharacterCount:0}}async $findSectionHeaders(u,C){const f=this._getModel(u);return f?(0,i.findSectionHeaders)(f,C):[]}async $computeDiff(u,C,f,h){const v=this._getModel(u),w=this._getModel(C);return!v||!w?null:l.computeDiff(v,w,f,h)}static computeDiff(u,C,f,h){const v=h==="advanced"?p.linesDiffComputers.getDefault():p.linesDiffComputers.getLegacy(),w=u.getLinesContent(),S=C.getLinesContent(),L=v.computeDiff(w,S,f),D=L.changes.length>0?!1:this._modelsAreIdentical(u,C);function T(M){return M.map(A=>[A.original.startLineNumber,A.original.endLineNumberExclusive,A.modified.startLineNumber,A.modified.endLineNumberExclusive,A.innerChanges?.map(P=>[P.originalRange.startLineNumber,P.originalRange.startColumn,P.originalRange.endLineNumber,P.originalRange.endColumn,P.modifiedRange.startLineNumber,P.modifiedRange.startColumn,P.modifiedRange.endLineNumber,P.modifiedRange.endColumn])])}return{identical:D,quitEarly:L.hitTimeout,changes:T(L.changes),moves:L.moves.map(M=>[M.lineRangeMapping.original.startLineNumber,M.lineRangeMapping.original.endLineNumberExclusive,M.lineRangeMapping.modified.startLineNumber,M.lineRangeMapping.modified.endLineNumberExclusive,T(M.changes)])}}static _modelsAreIdentical(u,C){const f=u.getLineCount(),h=C.getLineCount();if(f!==h)return!1;for(let v=1;v<=f;v++){const w=u.getLineContent(v),S=C.getLineContent(v);if(w!==S)return!1}return!0}static{this._diffLimit=1e5}async $computeMoreMinimalEdits(u,C,f){const h=this._getModel(u);if(!h)return C;const v=[];let w;C=C.slice(0).sort((L,D)=>{if(L.range&&D.range)return k.Range.compareRangesUsingStarts(L.range,D.range);const T=L.range?0:1,M=D.range?0:1;return T-M});let S=0;for(let L=1;Ll._diffLimit){v.push({range:L,text:D});continue}const A=(0,d.stringDiff)(M,D,f),P=h.offsetAt(k.Range.lift(L).getStartPosition());for(const N of A){const O=h.positionAt(P+N.originalStart),F=h.positionAt(P+N.originalStart+N.originalLength),x={text:D.substr(N.modifiedStart,N.modifiedLength),range:{startLineNumber:O.lineNumber,startColumn:O.column,endLineNumber:F.lineNumber,endColumn:F.column}};h.getValueInRange(x.range)!==x.text&&v.push(x)}}return typeof w=="number"&&v.push({eol:w,text:"",range:{startLineNumber:0,startColumn:0,endLineNumber:0,endColumn:0}}),v}async $computeLinks(u){const C=this._getModel(u);return C?(0,I.computeLinks)(C):null}async $computeDefaultDocumentColors(u){const C=this._getModel(u);return C?(0,t.computeDefaultDocumentColors)(C):null}static{this._suggestionsLimit=1e4}async $textualSuggest(u,C,f,h){const v=new _.StopWatch,w=new RegExp(f,h),S=new Set;e:for(const L of u){const D=this._getModel(L);if(D){for(const T of D.words(w))if(!(T===C||!isNaN(Number(T)))&&(S.add(T),S.size>l._suggestionsLimit))break e}}return{words:Array.from(S),duration:v.elapsed()}}async $computeWordRanges(u,C,f,h){const v=this._getModel(u);if(!v)return Object.create(null);const w=new RegExp(f,h),S=Object.create(null);for(let L=C.startLineNumber;Lthis._host.$fhr(S,L),w={host:(0,n.createProxyObject)(f,h),getMirrorModels:()=>this._getModels()};return this._foreignModuleFactory?(this._foreignModule=this._foreignModuleFactory(w,C),Promise.resolve((0,n.getAllMethodNames)(this._foreignModule))):new Promise((S,L)=>{const D=T=>{this._foreignModule=T.create(w,C),S((0,n.getAllMethodNames)(this._foreignModule))};if(!g)oe([`${u}`],D,L);else{const T=o.FileAccess.asBrowserUri(`${u}.js`).toString(!0);new Promise((M,A)=>{oe([`${T}`],M,A)}).then(D).catch(L)}})}$fmr(u,C){if(!this._foreignModule||typeof this._foreignModule[u]!="function")return Promise.reject(new Error("Missing requestHandler or method: "+u));try{return Promise.resolve(this._foreignModule[u].apply(this._foreignModule,C))}catch(f){return Promise.reject(f)}}}e.EditorSimpleWorker=l;function a(r){return new l(m.EditorWorkerHost.getChannel(r),null)}typeof importScripts=="function"&&(globalThis.monaco=(0,y.createMonacoBaseAPI)())}),define(ne[107],se([1,0,3]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneServicesNLS=e.ToggleHighContrastNLS=e.StandaloneCodeEditorNLS=e.QuickOutlineNLS=e.QuickCommandNLS=e.QuickHelpNLS=e.GoToLineNLS=e.InspectTokensNLS=void 0;var k;(function(n){n.inspectTokensAction=d.localize(698,"Developer: Inspect Tokens")})(k||(e.InspectTokensNLS=k={}));var I;(function(n){n.gotoLineActionLabel=d.localize(699,"Go to Line/Column...")})(I||(e.GoToLineNLS=I={}));var E;(function(n){n.helpQuickAccessActionLabel=d.localize(700,"Show all Quick Access Providers")})(E||(e.QuickHelpNLS=E={}));var y;(function(n){n.quickCommandActionLabel=d.localize(701,"Command Palette"),n.quickCommandHelp=d.localize(702,"Show And Run Commands")})(y||(e.QuickCommandNLS=y={}));var m;(function(n){n.quickOutlineActionLabel=d.localize(703,"Go to Symbol..."),n.quickOutlineByCategoryActionLabel=d.localize(704,"Go to Symbol by Category...")})(m||(e.QuickOutlineNLS=m={}));var _;(function(n){n.editorViewAccessibleLabel=d.localize(705,"Editor content")})(_||(e.StandaloneCodeEditorNLS=_={}));var b;(function(n){n.toggleHighContrast=d.localize(706,"Toggle High Contrast Theme")})(b||(e.ToggleHighContrastNLS=b={}));var p;(function(n){n.bulkEditServiceSummary=d.localize(707,"Made {0} edits in {1} files")})(p||(e.StandaloneServicesNLS=p={}))}),define(ne[136],se([1,0,3,11,116,150,598]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RenderLineOutput2=e.RenderLineOutput=e.CharacterMapping=e.DomPosition=e.RenderLineInput=e.LineRange=void 0,e.renderViewLine=o,e.renderViewLine2=i;class m{constructor(S,L){this.startOffset=S,this.endOffset=L}equals(S){return this.startOffset===S.startOffset&&this.endOffset===S.endOffset}}e.LineRange=m;class _{constructor(S,L,D,T,M,A,P,N,O,F,x,W,V,q,H,z,U,j,Y){this.useMonospaceOptimizations=S,this.canUseHalfwidthRightwardsArrow=L,this.lineContent=D,this.continuesWithWrappedLine=T,this.isBasicASCII=M,this.containsRTL=A,this.fauxIndentLength=P,this.lineTokens=N,this.lineDecorations=O.sort(E.LineDecoration.compare),this.tabSize=F,this.startVisibleColumn=x,this.spaceWidth=W,this.stopRenderingLineAfter=H,this.renderWhitespace=z==="all"?4:z==="boundary"?1:z==="selection"?2:z==="trailing"?3:0,this.renderControlCharacters=U,this.fontLigatures=j,this.selectionsOnLine=Y&&Y.sort((R,J)=>R.startOffset>>16}static getCharIndex(S){return(S&65535)>>>0}constructor(S,L){this.length=S,this._data=new Uint32Array(this.length),this._horizontalOffset=new Uint32Array(this.length)}setColumnInfo(S,L,D,T){const M=(L<<16|D<<0)>>>0;this._data[S-1]=M,this._horizontalOffset[S-1]=T}getHorizontalOffset(S){return this._horizontalOffset.length===0?0:this._horizontalOffset[S-1]}charOffsetToPartData(S){return this.length===0?0:S<0?this._data[0]:S>=this.length?this._data[this.length-1]:this._data[S]}getDomPosition(S){const L=this.charOffsetToPartData(S-1),D=p.getPartIndex(L),T=p.getCharIndex(L);return new b(D,T)}getColumn(S,L){return this.partDataToCharOffset(S.partIndex,L,S.charIndex)+1}partDataToCharOffset(S,L,D){if(this.length===0)return 0;const T=(S<<16|D<<0)>>>0;let M=0,A=this.length-1;for(;M+1>>1,z=this._data[H];if(z===T)return H;z>T?A=H:M=H}if(M===A)return M;const P=this._data[M],N=this._data[A];if(P===T)return M;if(N===T)return A;const O=p.getPartIndex(P),F=p.getCharIndex(P),x=p.getPartIndex(N);let W;O!==x?W=L:W=p.getCharIndex(N);const V=D-F,q=W-D;return V<=q?M:A}}e.CharacterMapping=p;class n{constructor(S,L,D){this._renderLineOutputBrand=void 0,this.characterMapping=S,this.containsRTL=L,this.containsForeignElements=D}}e.RenderLineOutput=n;function o(w,S){if(w.lineContent.length===0){if(w.lineDecorations.length>0){S.appendString("");let L=0,D=0,T=0;for(const A of w.lineDecorations)(A.type===1||A.type===2)&&(S.appendString(''),A.type===1&&(T|=1,L++),A.type===2&&(T|=2,D++));S.appendString("");const M=new p(1,L+D);return M.setColumnInfo(1,L,0,0),new n(M,!1,T)}return S.appendString(""),new n(new p(0,0),!1,0)}return f(g(w),S)}class t{constructor(S,L,D,T){this.characterMapping=S,this.html=L,this.containsRTL=D,this.containsForeignElements=T}}e.RenderLineOutput2=t;function i(w){const S=new I.StringBuilder(1e4),L=o(w,S);return new t(L.characterMapping,S.build(),L.containsRTL,L.containsForeignElements)}class s{constructor(S,L,D,T,M,A,P,N,O,F,x,W,V,q,H,z){this.fontIsMonospace=S,this.canUseHalfwidthRightwardsArrow=L,this.lineContent=D,this.len=T,this.isOverflowing=M,this.overflowingCharCount=A,this.parts=P,this.containsForeignElements=N,this.fauxIndentLength=O,this.tabSize=F,this.startVisibleColumn=x,this.containsRTL=W,this.spaceWidth=V,this.renderSpaceCharCode=q,this.renderWhitespace=H,this.renderControlCharacters=z}}function g(w){const S=w.lineContent;let L,D,T;w.stopRenderingLineAfter!==-1&&w.stopRenderingLineAfter0){for(let P=0,N=w.lineDecorations.length;P0&&(M[A++]=new y.LinePart(D,"",0,!1));let P=D;for(let N=0,O=L.getCount();N=T){const V=S?k.containsRTL(w.substring(P,T)):!1;M[A++]=new y.LinePart(T,x,0,V);break}const W=S?k.containsRTL(w.substring(P,F)):!1;M[A++]=new y.LinePart(F,x,0,W),P=F}return M}function l(w,S,L){let D=0;const T=[];let M=0;if(L)for(let A=0,P=S.length;A=50&&(T[M++]=new y.LinePart(V+1,F,x,W),q=V+1,V=-1);q!==O&&(T[M++]=new y.LinePart(O,F,x,W))}else T[M++]=N;D=O}else for(let A=0,P=S.length;A50){const x=N.type,W=N.metadata,V=N.containsRTL,q=Math.ceil(F/50);for(let H=1;H=8234&&w<=8238||w>=8294&&w<=8297||w>=8206&&w<=8207||w===1564}function r(w,S){const L=[];let D=new y.LinePart(0,"",0,!1),T=0;for(const M of S){const A=M.endIndex;for(;TD.endIndex&&(D=new y.LinePart(T,M.type,M.metadata,M.containsRTL),L.push(D)),D=new y.LinePart(T+1,"mtkcontrol",M.metadata,!1),L.push(D))}T>D.endIndex&&(D=new y.LinePart(A,M.type,M.metadata,M.containsRTL),L.push(D))}return L}function u(w,S,L,D){const T=w.continuesWithWrappedLine,M=w.fauxIndentLength,A=w.tabSize,P=w.startVisibleColumn,N=w.useMonospaceOptimizations,O=w.selectionsOnLine,F=w.renderWhitespace===1,x=w.renderWhitespace===3,W=w.renderSpaceWidth!==w.spaceWidth,V=[];let q=0,H=0,z=D[H].type,U=D[H].containsRTL,j=D[H].endIndex;const Y=D.length;let G=!1,K=k.firstNonWhitespaceIndex(S),R;K===-1?(G=!0,K=L,R=L):R=k.lastNonWhitespaceIndex(S);let J=!1,ie=0,ue=O&&O[ie],he=P%A;for(let ae=M;ae=ue.endOffset&&(ie++,ue=O&&O[ie]);let de;if(aeR)de=!0;else if(ee===9)de=!0;else if(ee===32)if(F)if(J)de=!0;else{const ge=ae+1ae),de&&x&&(de=G||ae>R),de&&U&&ae>=K&&ae<=R&&(de=!1),J){if(!de||!N&&he>=A){if(W){const ge=q>0?V[q-1].endIndex:M;for(let X=ge+1;X<=ae;X++)V[q++]=new y.LinePart(X,"mtkw",1,!1)}else V[q++]=new y.LinePart(ae,"mtkw",1,!1);he=he%A}}else(ae===j||de&&ae>M)&&(V[q++]=new y.LinePart(ae,z,0,U),he=he%A);for(ee===9?he=A:k.isFullWidthCharacter(ee)?he+=2:he++,J=de;ae===j&&(H++,H0?S.charCodeAt(L-1):0,ee=L>1?S.charCodeAt(L-2):0;ae===32&&ee!==32&&ee!==9||(pe=!0)}else pe=!0;if(pe)if(W){const ae=q>0?V[q-1].endIndex:M;for(let ee=ae+1;ee<=L;ee++)V[q++]=new y.LinePart(ee,"mtkw",1,!1)}else V[q++]=new y.LinePart(L,"mtkw",1,!1);else V[q++]=new y.LinePart(L,z,0,U);return V}function C(w,S,L,D){D.sort(E.LineDecoration.compare);const T=E.LineDecorationsNormalizer.normalize(w,D),M=T.length;let A=0;const P=[];let N=0,O=0;for(let x=0,W=L.length;xO&&(O=j.startOffset,P[N++]=new y.LinePart(O,H,z,U)),j.endOffset+1<=q)O=j.endOffset+1,P[N++]=new y.LinePart(O,H+" "+j.className,z|j.metadata,U),A++;else{O=q,P[N++]=new y.LinePart(O,H+" "+j.className,z|j.metadata,U);break}}q>O&&(O=q,P[N++]=new y.LinePart(O,H,z,U))}const F=L[L.length-1].endIndex;if(A'):S.appendString("");for(let ue=0,he=O.length;ue=F&&(Z+=re)}}for(X&&(S.appendString(' style="width:'),S.appendString(String(q*$)),S.appendString('px"')),S.appendASCIICharCode(62);G1?S.appendCharCode(8594):S.appendCharCode(65515);for(let re=2;re<=te;re++)S.appendCharCode(160)}else Z=2,te=1,S.appendCharCode(H),S.appendCharCode(8204);R+=Z,J+=te,G>=F&&(K+=te)}}else for(S.appendASCIICharCode(62);G=F&&(K+=Z)}B?ie++:ie=0,G>=A&&!Y&&pe.isPseudoAfter()&&(Y=!0,j.setColumnInfo(G+1,ue,R,J)),S.appendString("")}return Y||j.setColumnInfo(A+1,O.length-1,R,J),P&&(S.appendString(''),S.appendString(d.localize(708,"Show more ({0})",v(N))),S.appendString("")),S.appendString(""),new n(j,V,T)}function h(w){return w.toString(16).toUpperCase().padStart(4,"0")}function v(w){return w<1024?d.localize(709,"{0} chars",w):w<1024*1024?`${(w/1024).toFixed(1)} KB`:`${(w/1024/1024).toFixed(1)} MB`}}),define(ne[667],se([1,0,103,74,37,116,150,136,95]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RenderOptions=e.LineSource=void 0,e.renderLines=p;const b=(0,d.createTrustedTypesPolicy)("diffEditorWidget",{createHTML:i=>i});function p(i,s,g,c){(0,k.applyFontInfo)(c,s.fontInfo);const l=g.length>0,a=new E.StringBuilder(1e4);let r=0,u=0;const C=[];for(let w=0;w');const C=s.getLineContent(),f=_.ViewLineRenderingData.isBasicASCII(C,l),h=_.ViewLineRenderingData.containsRTL(C,f,a),v=(0,m.renderViewLine)(new m.RenderLineInput(r.fontInfo.isMonospace&&!r.disableMonospaceOptimizations,r.fontInfo.canUseHalfwidthRightwardsArrow,C,!1,f,h,0,s,g,r.tabSize,0,r.fontInfo.spaceWidth,r.fontInfo.middotWidth,r.fontInfo.wsmiddotWidth,r.stopRenderingLineAfter,r.renderWhitespace,r.renderControlCharacters,r.fontLigatures!==I.EditorFontLigatures.OFF,null),u);return u.appendString(""),v.characterMapping.getHorizontalOffset(v.characterMapping.length)}}),define(ne[374],se([1,0,6,2,311,27]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MinimapTokensColorTracker=void 0;class y extends k.Disposable{static{this._INSTANCE=null}static getInstance(){return this._INSTANCE||(this._INSTANCE=(0,k.markAsSingleton)(new y)),this._INSTANCE}constructor(){super(),this._onDidChange=new d.Emitter,this.onDidChange=this._onDidChange.event,this._updateColorMap(),this._register(E.TokenizationRegistry.onDidChange(_=>{_.changedColorMap&&this._updateColorMap()}))}_updateColorMap(){const _=E.TokenizationRegistry.getColorMap();if(!_){this._colors=[I.RGBA8.Empty],this._backgroundIsLight=!0;return}this._colors=[I.RGBA8.Empty];for(let p=1;p<_.length;p++){const n=_[p].rgba;this._colors[p]=new I.RGBA8(n.r,n.g,n.b,Math.round(n.a*255))}const b=_[2].getRelativeLuminance();this._backgroundIsLight=b>=.5,this._onDidChange.fire(void 0)}getColor(_){return(_<1||_>=this._colors.length)&&(_=2),this._colors[_]}backgroundIsLight(){return this._backgroundIsLight}}e.MinimapTokensColorTracker=y}),define(ne[375],se([1,0,9,4,95,37]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewModelDecorations=void 0,e.isModelDecorationVisible=m,e.isModelDecorationInComment=_,e.isModelDecorationInString=b;class y{constructor(o,t,i,s,g){this.editorId=o,this.model=t,this.configuration=i,this._linesCollection=s,this._coordinatesConverter=g,this._decorationsCache=Object.create(null),this._cachedModelDecorationsResolver=null,this._cachedModelDecorationsResolverViewRange=null}_clearCachedModelDecorationsResolver(){this._cachedModelDecorationsResolver=null,this._cachedModelDecorationsResolverViewRange=null}dispose(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}reset(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}onModelDecorationsChanged(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}onLineMappingChanged(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}_getOrCreateViewModelDecoration(o){const t=o.id;let i=this._decorationsCache[t];if(!i){const s=o.range,g=o.options;let c;if(g.isWholeLine){const l=this._coordinatesConverter.convertModelPositionToViewPosition(new d.Position(s.startLineNumber,1),0,!1,!0),a=this._coordinatesConverter.convertModelPositionToViewPosition(new d.Position(s.endLineNumber,this.model.getLineMaxColumn(s.endLineNumber)),1);c=new k.Range(l.lineNumber,l.column,a.lineNumber,a.column)}else c=this._coordinatesConverter.convertModelRangeToViewRange(s,1);i=new I.ViewModelDecoration(c,g),this._decorationsCache[t]=i}return i}getMinimapDecorationsInRange(o){return this._getDecorationsInRange(o,!0,!1).decorations}getDecorationsViewportData(o){let t=this._cachedModelDecorationsResolver!==null;return t=t&&o.equalsRange(this._cachedModelDecorationsResolverViewRange),t||(this._cachedModelDecorationsResolver=this._getDecorationsInRange(o,!1,!1),this._cachedModelDecorationsResolverViewRange=o),this._cachedModelDecorationsResolver}getInlineDecorationsOnLine(o,t=!1,i=!1){const s=new k.Range(o,this._linesCollection.getViewLineMinColumn(o),o,this._linesCollection.getViewLineMaxColumn(o));return this._getDecorationsInRange(s,t,i).inlineDecorations[0]}_getDecorationsInRange(o,t,i){const s=this._linesCollection.getDecorationsInRange(o,this.editorId,(0,E.filterValidationDecorations)(this.configuration.options),t,i),g=o.startLineNumber,c=o.endLineNumber,l=[];let a=0;const r=[];for(let u=g;u<=c;u++)r[u-g]=[];for(let u=0,C=s.length;ut===1)}function b(n,o){return p(n,o.range,t=>t===2)}function p(n,o,t){for(let i=o.startLineNumber;i<=o.endLineNumber;i++){const s=n.tokenization.getLineTokens(i),g=i===o.startLineNumber,c=i===o.endLineNumber;let l=g?s.findTokenIndexAtOffset(o.startColumn-1):0;for(;lo.endColumn-1);){if(!t(s.getStandardTokenType(l)))return!1;l++}}return!0}}),define(ne[209],se([1,0,6,2,16]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ClickLinkGesture=e.ClickLinkOptions=e.ClickLinkKeyboardEvent=e.ClickLinkMouseEvent=void 0;function E(n,o){return!!n[o]}class y{constructor(o,t){this.target=o.target,this.isLeftClick=o.event.leftButton,this.isMiddleClick=o.event.middleButton,this.isRightClick=o.event.rightButton,this.hasTriggerModifier=E(o.event,t.triggerModifier),this.hasSideBySideModifier=E(o.event,t.triggerSideBySideModifier),this.isNoneOrSingleMouseDown=o.event.detail<=1}}e.ClickLinkMouseEvent=y;class m{constructor(o,t){this.keyCodeIsTriggerKey=o.keyCode===t.triggerKey,this.keyCodeIsSideBySideKey=o.keyCode===t.triggerSideBySideKey,this.hasTriggerModifier=E(o,t.triggerModifier)}}e.ClickLinkKeyboardEvent=m;class _{constructor(o,t,i,s){this.triggerKey=o,this.triggerModifier=t,this.triggerSideBySideKey=i,this.triggerSideBySideModifier=s}equals(o){return this.triggerKey===o.triggerKey&&this.triggerModifier===o.triggerModifier&&this.triggerSideBySideKey===o.triggerSideBySideKey&&this.triggerSideBySideModifier===o.triggerSideBySideModifier}}e.ClickLinkOptions=_;function b(n){return n==="altKey"?I.isMacintosh?new _(57,"metaKey",6,"altKey"):new _(5,"ctrlKey",6,"altKey"):I.isMacintosh?new _(6,"altKey",57,"metaKey"):new _(6,"altKey",5,"ctrlKey")}class p extends k.Disposable{constructor(o,t){super(),this._onMouseMoveOrRelevantKeyDown=this._register(new d.Emitter),this.onMouseMoveOrRelevantKeyDown=this._onMouseMoveOrRelevantKeyDown.event,this._onExecute=this._register(new d.Emitter),this.onExecute=this._onExecute.event,this._onCancel=this._register(new d.Emitter),this.onCancel=this._onCancel.event,this._editor=o,this._extractLineNumberFromMouseEvent=t?.extractLineNumberFromMouseEvent??(i=>i.target.position?i.target.position.lineNumber:0),this._opts=b(this._editor.getOption(78)),this._lastMouseMoveEvent=null,this._hasTriggerKeyOnMouseDown=!1,this._lineNumberOnMouseDown=0,this._register(this._editor.onDidChangeConfiguration(i=>{if(i.hasChanged(78)){const s=b(this._editor.getOption(78));if(this._opts.equals(s))return;this._opts=s,this._lastMouseMoveEvent=null,this._hasTriggerKeyOnMouseDown=!1,this._lineNumberOnMouseDown=0,this._onCancel.fire()}})),this._register(this._editor.onMouseMove(i=>this._onEditorMouseMove(new y(i,this._opts)))),this._register(this._editor.onMouseDown(i=>this._onEditorMouseDown(new y(i,this._opts)))),this._register(this._editor.onMouseUp(i=>this._onEditorMouseUp(new y(i,this._opts)))),this._register(this._editor.onKeyDown(i=>this._onEditorKeyDown(new m(i,this._opts)))),this._register(this._editor.onKeyUp(i=>this._onEditorKeyUp(new m(i,this._opts)))),this._register(this._editor.onMouseDrag(()=>this._resetHandler())),this._register(this._editor.onDidChangeCursorSelection(i=>this._onDidChangeCursorSelection(i))),this._register(this._editor.onDidChangeModel(i=>this._resetHandler())),this._register(this._editor.onDidChangeModelContent(()=>this._resetHandler())),this._register(this._editor.onDidScrollChange(i=>{(i.scrollTopChanged||i.scrollLeftChanged)&&this._resetHandler()}))}_onDidChangeCursorSelection(o){o.selection&&o.selection.startColumn!==o.selection.endColumn&&this._resetHandler()}_onEditorMouseMove(o){this._lastMouseMoveEvent=o,this._onMouseMoveOrRelevantKeyDown.fire([o,null])}_onEditorMouseDown(o){this._hasTriggerKeyOnMouseDown=o.hasTriggerModifier,this._lineNumberOnMouseDown=this._extractLineNumberFromMouseEvent(o)}_onEditorMouseUp(o){const t=this._extractLineNumberFromMouseEvent(o);this._hasTriggerKeyOnMouseDown&&this._lineNumberOnMouseDown&&this._lineNumberOnMouseDown===t&&this._onExecute.fire(o)}_onEditorKeyDown(o){this._lastMouseMoveEvent&&(o.keyCodeIsTriggerKey||o.keyCodeIsSideBySideKey&&o.hasTriggerModifier)?this._onMouseMoveOrRelevantKeyDown.fire([this._lastMouseMoveEvent,o]):o.hasTriggerModifier&&this._onCancel.fire()}_onEditorKeyUp(o){o.keyCodeIsTriggerKey&&this._onCancel.fire()}_resetHandler(){this._lastMouseMoveEvent=null,this._hasTriggerKeyOnMouseDown=!1,this._onCancel.fire()}}e.ClickLinkGesture=p}),define(ne[178],se([1,0,8,6,187,2,45,48,11,4,3]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReferencesModel=e.FileReferences=e.FilePreview=e.OneReference=void 0;class n{constructor(g,c,l,a){this.isProviderFirst=g,this.parent=c,this.link=l,this._rangeCallback=a,this.id=I.defaultGenerator.nextId()}get uri(){return this.link.uri}get range(){return this._range??this.link.targetSelectionRange??this.link.range}set range(g){this._range=g,this._rangeCallback(this)}get ariaMessage(){const g=this.parent.getPreview(this)?.preview(this.range);return g?(0,p.localize)(996,"{0} in {1} on line {2} at column {3}",g.value,(0,m.basename)(this.uri),this.range.startLineNumber,this.range.startColumn):(0,p.localize)(995,"in {0} on line {1} at column {2}",(0,m.basename)(this.uri),this.range.startLineNumber,this.range.startColumn)}}e.OneReference=n;class o{constructor(g){this._modelReference=g}dispose(){this._modelReference.dispose()}preview(g,c=8){const l=this._modelReference.object.textEditorModel;if(!l)return;const{startLineNumber:a,startColumn:r,endLineNumber:u,endColumn:C}=g,f=l.getWordUntilPosition({lineNumber:a,column:r-c}),h=new b.Range(a,f.startColumn,a,r),v=new b.Range(u,C,u,1073741824),w=l.getValueInRange(h).replace(/^\s+/,""),S=l.getValueInRange(g),L=l.getValueInRange(v).replace(/\s+$/,"");return{value:w+S+L,highlight:{start:w.length,end:w.length+S.length}}}}e.FilePreview=o;class t{constructor(g,c){this.parent=g,this.uri=c,this.children=[],this._previews=new y.ResourceMap}dispose(){(0,E.dispose)(this._previews.values()),this._previews.clear()}getPreview(g){return this._previews.get(g.uri)}get ariaMessage(){const g=this.children.length;return g===1?(0,p.localize)(997,"1 symbol in {0}, full path {1}",(0,m.basename)(this.uri),this.uri.fsPath):(0,p.localize)(998,"{0} symbols in {1}, full path {2}",g,(0,m.basename)(this.uri),this.uri.fsPath)}async resolve(g){if(this._previews.size!==0)return this;for(const c of this.children)if(!this._previews.has(c.uri))try{const l=await g.createModelReference(c.uri);this._previews.set(c.uri,new o(l))}catch(l){(0,d.onUnexpectedError)(l)}return this}}e.FileReferences=t;class i{constructor(g,c){this.groups=[],this.references=[],this._onDidChangeReferenceRange=new k.Emitter,this.onDidChangeReferenceRange=this._onDidChangeReferenceRange.event,this._links=g,this._title=c;const[l]=g;g.sort(i._compareReferences);let a;for(const r of g)if((!a||!m.extUri.isEqual(a.uri,r.uri,!0))&&(a=new t(this,r.uri),this.groups.push(a)),a.children.length===0||i._compareReferences(r,a.children[a.children.length-1])!==0){const u=new n(l===r,a,r,C=>this._onDidChangeReferenceRange.fire(C));this.references.push(u),a.children.push(u)}}dispose(){(0,E.dispose)(this.groups),this._onDidChangeReferenceRange.dispose(),this.groups.length=0}clone(){return new i(this._links,this._title)}get title(){return this._title}get isEmpty(){return this.groups.length===0}get ariaMessage(){return this.isEmpty?(0,p.localize)(999,"No results found"):this.references.length===1?(0,p.localize)(1e3,"Found 1 symbol in {0}",this.references[0].uri.fsPath):this.groups.length===1?(0,p.localize)(1001,"Found {0} symbols in {1}",this.references.length,this.groups[0].uri.fsPath):(0,p.localize)(1002,"Found {0} symbols in {1} files",this.references.length,this.groups.length)}nextOrPreviousReference(g,c){const{parent:l}=g;let a=l.children.indexOf(g);const r=l.children.length,u=l.parent.groups.length;return u===1||c&&a+10?(c?a=(a+1)%r:a=(a+r-1)%r,l.children[a]):(a=l.parent.groups.indexOf(l),c?(a=(a+1)%u,l.parent.groups[a].children[0]):(a=(a+u-1)%u,l.parent.groups[a].children[l.parent.groups[a].children.length-1]))}nearestReference(g,c){const l=this.references.map((a,r)=>({idx:r,prefixLen:_.commonPrefixLength(a.uri.toString(),g.toString()),offsetDist:Math.abs(a.range.startLineNumber-c.lineNumber)*100+Math.abs(a.range.startColumn-c.column)})).sort((a,r)=>a.prefixLen>r.prefixLen?-1:a.prefixLenr.offsetDist?1:0)[0];if(l)return this.references[l.idx]}referenceAt(g,c){for(const l of this.references)if(l.uri.toString()===g.toString()&&b.Range.containsPosition(l.range,c))return l}firstReference(){for(const g of this.references)if(g.isProviderFirst)return g;return this.references[0]}static _compareReferences(g,c){return m.extUri.compare(g.uri,c.uri)||b.Range.compareRangesUsingStarts(g.range,c.range)}}e.ReferencesModel=i}),define(ne[668],se([1,0,13,14]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContentHoverComputer=void 0;class I{get anchor(){return this._anchor}set anchor(y){this._anchor=y}get shouldFocus(){return this._shouldFocus}set shouldFocus(y){this._shouldFocus=y}get source(){return this._source}set source(y){this._source=y}get insistOnKeepingHoverVisible(){return this._insistOnKeepingHoverVisible}set insistOnKeepingHoverVisible(y){this._insistOnKeepingHoverVisible=y}constructor(y,m){this._editor=y,this._participants=m,this._anchor=null,this._shouldFocus=!1,this._source=0,this._insistOnKeepingHoverVisible=!1}static _getLineDecorations(y,m){if(m.type!==1&&!m.supportsMarkerHover)return[];const _=y.getModel(),b=m.range.startLineNumber;if(b>_.getLineCount())return[];const p=_.getLineMaxColumn(b);return y.getLineDecorations(b).filter(n=>{if(n.options.isWholeLine)return!0;const o=n.range.startLineNumber===b?n.range.startColumn:1,t=n.range.endLineNumber===b?n.range.endColumn:p;if(n.options.showIfCollapsed){if(o>m.range.startColumn+1||m.range.endColumn-1>t)return!1}else if(o>m.range.startColumn||m.range.endColumn>t)return!1;return!0})}computeAsync(y){const m=this._anchor;if(!this._editor.hasModel()||!m)return k.AsyncIterableObject.EMPTY;const _=I._getLineDecorations(this._editor,m);return k.AsyncIterableObject.merge(this._participants.map(b=>b.computeAsync?b.computeAsync(m,_,y):k.AsyncIterableObject.EMPTY))}computeSync(){if(!this._editor.hasModel()||!this._anchor)return[];const y=I._getLineDecorations(this._editor,this._anchor);let m=[];for(const _ of this._participants)m=m.concat(_.computeSync(this._anchor,y));return(0,d.coalesce)(m)}}e.ContentHoverComputer=I}),define(ne[264],se([1,0,3]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DECREASE_HOVER_VERBOSITY_ACTION_LABEL=e.DECREASE_HOVER_VERBOSITY_ACTION_ID=e.INCREASE_HOVER_VERBOSITY_ACTION_LABEL=e.INCREASE_HOVER_VERBOSITY_ACTION_ID=e.GO_TO_BOTTOM_HOVER_ACTION_ID=e.GO_TO_TOP_HOVER_ACTION_ID=e.PAGE_DOWN_HOVER_ACTION_ID=e.PAGE_UP_HOVER_ACTION_ID=e.SCROLL_RIGHT_HOVER_ACTION_ID=e.SCROLL_LEFT_HOVER_ACTION_ID=e.SCROLL_DOWN_HOVER_ACTION_ID=e.SCROLL_UP_HOVER_ACTION_ID=e.SHOW_DEFINITION_PREVIEW_HOVER_ACTION_ID=e.SHOW_OR_FOCUS_HOVER_ACTION_ID=void 0,e.SHOW_OR_FOCUS_HOVER_ACTION_ID="editor.action.showHover",e.SHOW_DEFINITION_PREVIEW_HOVER_ACTION_ID="editor.action.showDefinitionPreviewHover",e.SCROLL_UP_HOVER_ACTION_ID="editor.action.scrollUpHover",e.SCROLL_DOWN_HOVER_ACTION_ID="editor.action.scrollDownHover",e.SCROLL_LEFT_HOVER_ACTION_ID="editor.action.scrollLeftHover",e.SCROLL_RIGHT_HOVER_ACTION_ID="editor.action.scrollRightHover",e.PAGE_UP_HOVER_ACTION_ID="editor.action.pageUpHover",e.PAGE_DOWN_HOVER_ACTION_ID="editor.action.pageDownHover",e.GO_TO_TOP_HOVER_ACTION_ID="editor.action.goToTopHover",e.GO_TO_BOTTOM_HOVER_ACTION_ID="editor.action.goToBottomHover",e.INCREASE_HOVER_VERBOSITY_ACTION_ID="editor.action.increaseHoverVerbosityLevel",e.INCREASE_HOVER_VERBOSITY_ACTION_LABEL=d.localize(1006,"Increase Hover Verbosity Level"),e.DECREASE_HOVER_VERBOSITY_ACTION_ID="editor.action.decreaseHoverVerbosityLevel",e.DECREASE_HOVER_VERBOSITY_ACTION_LABEL=d.localize(1007,"Decrease Hover Verbosity Level")}),define(ne[376],se([1,0,14,8,6,2]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HoverOperation=e.HoverResult=void 0;class y{constructor(b,p,n){this.value=b,this.isComplete=p,this.hasLoadingMessage=n}}e.HoverResult=y;class m extends E.Disposable{constructor(b,p){super(),this._editor=b,this._computer=p,this._onResult=this._register(new I.Emitter),this.onResult=this._onResult.event,this._firstWaitScheduler=this._register(new d.RunOnceScheduler(()=>this._triggerAsyncComputation(),0)),this._secondWaitScheduler=this._register(new d.RunOnceScheduler(()=>this._triggerSyncComputation(),0)),this._loadingMessageScheduler=this._register(new d.RunOnceScheduler(()=>this._triggerLoadingMessage(),0)),this._state=0,this._asyncIterable=null,this._asyncIterableDone=!1,this._result=[]}dispose(){this._asyncIterable&&(this._asyncIterable.cancel(),this._asyncIterable=null),super.dispose()}get _hoverTime(){return this._editor.getOption(60).delay}get _firstWaitTime(){return this._hoverTime/2}get _secondWaitTime(){return this._hoverTime-this._firstWaitTime}get _loadingMessageTime(){return 3*this._hoverTime}_setState(b,p=!0){this._state=b,p&&this._fireResult()}_triggerAsyncComputation(){this._setState(2),this._secondWaitScheduler.schedule(this._secondWaitTime),this._computer.computeAsync?(this._asyncIterableDone=!1,this._asyncIterable=(0,d.createCancelableAsyncIterable)(b=>this._computer.computeAsync(b)),(async()=>{try{for await(const b of this._asyncIterable)b&&(this._result.push(b),this._fireResult());this._asyncIterableDone=!0,(this._state===3||this._state===4)&&this._setState(0)}catch(b){(0,k.onUnexpectedError)(b)}})()):this._asyncIterableDone=!0}_triggerSyncComputation(){this._computer.computeSync&&(this._result=this._result.concat(this._computer.computeSync())),this._setState(this._asyncIterableDone?0:3)}_triggerLoadingMessage(){this._state===3&&this._setState(4)}_fireResult(){if(this._state===1||this._state===2)return;const b=this._state===0,p=this._state===4;this._onResult.fire(new y(this._result.slice(0),b,p))}start(b){if(b===0)this._state===0&&(this._setState(1),this._firstWaitScheduler.schedule(this._firstWaitTime),this._loadingMessageScheduler.schedule(this._loadingMessageTime));else switch(this._state){case 0:this._triggerAsyncComputation(),this._secondWaitScheduler.cancel(),this._triggerSyncComputation();break;case 2:this._secondWaitScheduler.cancel(),this._triggerSyncComputation();break}}cancel(){this._firstWaitScheduler.cancel(),this._secondWaitScheduler.cancel(),this._loadingMessageScheduler.cancel(),this._asyncIterable&&(this._asyncIterable.cancel(),this._asyncIterable=null),this._result=[],this._setState(0,!1)}}e.HoverOperation=m}),define(ne[210],se([1,0,5]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isMousePositionWithinElement=k;function k(I,E,y){const m=d.getDomNodePagePosition(I);return!(Em.left+m.width||ym.top+m.height)}}),define(ne[669],se([1,0,13,57,40]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarginHoverComputer=void 0;class E{get lineNumber(){return this._lineNumber}set lineNumber(m){this._lineNumber=m}get lane(){return this._laneOrLine}set lane(m){this._laneOrLine=m}constructor(m){this._editor=m,this._lineNumber=-1,this._laneOrLine=I.GlyphMarginLane.Center}computeSync(){const m=n=>({value:n}),_=this._editor.getLineDecorations(this._lineNumber),b=[],p=this._laneOrLine==="lineNo";if(!_)return b;for(const n of _){const o=n.options.glyphMargin?.position??I.GlyphMarginLane.Center;if(!p&&o!==this._laneOrLine)continue;const t=p?n.options.lineNumberHoverMessage:n.options.glyphMarginHoverMessage;!t||(0,k.isEmptyMarkdownString)(t)||b.push(...(0,d.asArray)(t).map(m))}return b}}e.MarginHoverComputer=E}),define(ne[670],se([1,0,255,2,9,5]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ResizableContentWidget=void 0;const y=30,m=24;class _ extends k.Disposable{constructor(p,n=new E.Dimension(10,10)){super(),this._editor=p,this.allowEditorOverflow=!0,this.suppressMouseDown=!1,this._resizableNode=this._register(new d.ResizableHTMLElement),this._contentPosition=null,this._isResizing=!1,this._resizableNode.domNode.style.position="absolute",this._resizableNode.minSize=E.Dimension.lift(n),this._resizableNode.layout(n.height,n.width),this._resizableNode.enableSashes(!0,!0,!0,!0),this._register(this._resizableNode.onDidResize(o=>{this._resize(new E.Dimension(o.dimension.width,o.dimension.height)),o.done&&(this._isResizing=!1)})),this._register(this._resizableNode.onDidWillResize(()=>{this._isResizing=!0}))}get isResizing(){return this._isResizing}getDomNode(){return this._resizableNode.domNode}getPosition(){return this._contentPosition}get position(){return this._contentPosition?.position?I.Position.lift(this._contentPosition.position):void 0}_availableVerticalSpaceAbove(p){const n=this._editor.getDomNode(),o=this._editor.getScrolledVisiblePosition(p);return!n||!o?void 0:E.getDomNodePagePosition(n).top+o.top-y}_availableVerticalSpaceBelow(p){const n=this._editor.getDomNode(),o=this._editor.getScrolledVisiblePosition(p);if(!n||!o)return;const t=E.getDomNodePagePosition(n),i=E.getClientArea(n.ownerDocument.body),s=t.top+o.top+o.height;return i.height-s-m}_findPositionPreference(p,n){const o=Math.min(this._availableVerticalSpaceBelow(n)??1/0,p),t=Math.min(this._availableVerticalSpaceAbove(n)??1/0,p),i=Math.min(Math.max(t,o),p),s=Math.min(p,i);let g;return this._editor.getOption(60).above?g=s<=t?1:2:g=s<=o?2:1,g===1?this._resizableNode.enableSashes(!0,!0,!1,!1):this._resizableNode.enableSashes(!1,!0,!0,!1),g}_resize(p){this._resizableNode.layout(p.height,p.width)}}e.ResizableContentWidget=_}),define(ne[377],se([1,0,8,2,9,4,42,22]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlayHintsFragments=e.InlayHintItem=e.InlayHintAnchor=void 0,e.asCommandLink=n;class _{constructor(t,i){this.range=t,this.direction=i}}e.InlayHintAnchor=_;class b{constructor(t,i,s){this.hint=t,this.anchor=i,this.provider=s,this._isResolved=!1}with(t){const i=new b(this.hint,t.anchor,this.provider);return i._isResolved=this._isResolved,i._currentResolve=this._currentResolve,i}async resolve(t){if(typeof this.provider.resolveInlayHint=="function"){if(this._currentResolve)return await this._currentResolve,t.isCancellationRequested?void 0:this.resolve(t);this._isResolved||(this._currentResolve=this._doResolve(t).finally(()=>this._currentResolve=void 0)),await this._currentResolve}}async _doResolve(t){try{const i=await Promise.resolve(this.provider.resolveInlayHint(this.hint,t));this.hint.tooltip=i?.tooltip??this.hint.tooltip,this.hint.label=i?.label??this.hint.label,this.hint.textEdits=i?.textEdits??this.hint.textEdits,this._isResolved=!0}catch(i){(0,d.onUnexpectedExternalError)(i),this._isResolved=!1}}}e.InlayHintItem=b;class p{static{this._emptyInlayHintList=Object.freeze({dispose(){},hints:[]})}static async create(t,i,s,g){const c=[],l=t.ordered(i).reverse().map(a=>s.map(async r=>{try{const u=await a.provideInlayHints(i,r,g);(u?.hints.length||a.onDidChangeInlayHints)&&c.push([u??p._emptyInlayHintList,a])}catch(u){(0,d.onUnexpectedExternalError)(u)}}));if(await Promise.all(l.flat()),g.isCancellationRequested||i.isDisposed())throw new d.CancellationError;return new p(s,c,i)}constructor(t,i,s){this._disposables=new k.DisposableStore,this.ranges=t,this.provider=new Set;const g=[];for(const[c,l]of i){this._disposables.add(c),this.provider.add(l);for(const a of c.hints){const r=s.validatePosition(a.position);let u="before";const C=p._getRangeAtPosition(s,r);let f;C.getStartPosition().isBefore(r)?(f=E.Range.fromPositions(C.getStartPosition(),r),u="after"):(f=E.Range.fromPositions(r,C.getEndPosition()),u="before"),g.push(new b(a,new _(f,u),l))}}this.items=g.sort((c,l)=>I.Position.compare(c.hint.position,l.hint.position))}dispose(){this._disposables.dispose()}static _getRangeAtPosition(t,i){const s=i.lineNumber,g=t.getWordAtPosition(i);if(g)return new E.Range(s,g.startColumn,s,g.endColumn);t.tokenization.tokenizeIfCheap(s);const c=t.tokenization.getLineTokens(s),l=i.column-1,a=c.findTokenIndexAtOffset(l);let r=c.getStartOffset(a),u=c.getEndOffset(a);return u-r===1&&(r===l&&a>1?(r=c.getStartOffset(a-1),u=c.getEndOffset(a-1)):u===l&&aq.toString?q.toString():""+q).join(" -> ")}`));const V=new k.DeferredPromise;return D.set(F,V.p),(async()=>{if(!W){const q=L(F);for(const H of q){const z=await A(H);if(z&&z.items.length>0)return}}try{return r instanceof m.Position?await F.provideInlineCompletions(u,r,C,f):await F.provideInlineEdits?.(u,r,C,f)}catch(q){(0,y.onUnexpectedExternalError)(q);return}})().then(q=>V.complete(q),q=>V.error(q)),V.p}const P=await Promise.all(w.map(async F=>({provider:F,completions:await A(F)}))),N=new Map,O=[];for(const F of P){const x=F.completions;if(!x)continue;const W=new s(x,F.provider);O.push(W);for(const V of x.items){const q=g.from(V,W,v,u,h);N.set(q.hash(),q)}}return new i(Array.from(N.values()),new Set(N.keys()),O)}class i{constructor(r,u,C){this.completions=r,this.hashs=u,this.providerResults=C}has(r){return this.hashs.has(r.hash())}dispose(){for(const r of this.providerResults)r.removeRef()}}e.InlineCompletionProviderResult=i;class s{constructor(r,u){this.inlineCompletions=r,this.provider=u,this.refCount=1}addRef(){this.refCount++}removeRef(){this.refCount--,this.refCount===0&&this.provider.freeInlineCompletions(this.inlineCompletions)}}e.InlineCompletionList=s;class g{static from(r,u,C,f,h){let v,w,S=r.range?_.Range.lift(r.range):C;if(typeof r.insertText=="string"){if(v=r.insertText,h&&r.completeBracketPairs){v=l(v,S.getStartPosition(),f,h);const L=v.length-r.insertText.length;L!==0&&(S=new _.Range(S.startLineNumber,S.startColumn,S.endLineNumber,S.endColumn+L))}w=void 0}else if("snippet"in r.insertText){const L=r.insertText.snippet.length;if(h&&r.completeBracketPairs){r.insertText.snippet=l(r.insertText.snippet,S.getStartPosition(),f,h);const T=r.insertText.snippet.length-L;T!==0&&(S=new _.Range(S.startLineNumber,S.startColumn,S.endLineNumber,S.endColumn+T))}const D=new o.SnippetParser().parse(r.insertText.snippet);D.children.length===1&&D.children[0]instanceof o.Text?(v=D.children[0].value,w=void 0):(v=D.toString(),w={snippet:r.insertText.snippet,range:S})}else(0,d.assertNever)(r.insertText);return new g(v,r.command,S,v,w,r.additionalTextEdits||(0,n.getReadonlyEmptyArray)(),r,u)}constructor(r,u,C,f,h,v,w,S){this.filterText=r,this.command=u,this.range=C,this.insertText=f,this.snippetInfo=h,this.additionalTextEdits=v,this.sourceInlineCompletion=w,this.source=S,r=r.replace(/\r\n|\r/g,` -`),f=r.replace(/\r\n|\r/g,` -`)}withRange(r){return new g(this.filterText,this.command,r,this.insertText,this.snippetInfo,this.additionalTextEdits,this.sourceInlineCompletion,this.source)}hash(){return JSON.stringify({insertText:this.insertText,range:this.range.toString()})}toSingleTextEdit(){return new p.SingleTextEdit(this.range,this.insertText)}}e.InlineCompletionItem=g;function c(a,r){const u=r.getWordAtPosition(a),C=r.getLineMaxColumn(a.lineNumber);return u?new _.Range(a.lineNumber,u.startColumn,a.lineNumber,C):_.Range.fromPositions(a,a.with(void 0,C))}function l(a,r,u,C){const h=u.getLineContent(r.lineNumber).substring(0,r.column-1)+a,w=u.tokenization.tokenizeLineWithEdit(r,h.length-(r.column-1),a)?.sliceAndInflate(r.column-1,h.length,0);return w?(0,b.fixBracketsInLine)(w,C):a}}),define(ne[379],se([1,0,5,102,2,21,65,112]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PlaceholderTextContribution=void 0;class _ extends I.Disposable{static{this.ID="editor.contrib.placeholderText"}constructor(n){super(),this._editor=n,this._editorObs=(0,m.observableCodeEditor)(this._editor),this._placeholderText=this._editorObs.getOption(88),this._state=(0,E.derivedOpts)({owner:this,equalsFn:k.structuralEquals},o=>{const t=this._placeholderText.read(o);if(t&&this._editorObs.valueIsEmpty.read(o))return{placeholder:t}}),this._shouldViewBeAlive=b(this,o=>this._state.read(o)?.placeholder!==void 0),this._view=(0,y.derivedWithStore)((o,t)=>{if(!this._shouldViewBeAlive.read(o))return;const i=(0,d.h)("div.editorPlaceholder");t.add((0,E.autorun)(s=>{const g=this._state.read(s),c=g?.placeholder!==void 0;i.root.style.display=c?"block":"none",i.root.innerText=g?.placeholder??""})),t.add((0,E.autorun)(s=>{const g=this._editorObs.layoutInfo.read(s);i.root.style.left=`${g.contentLeft}px`,i.root.style.width=g.contentWidth-g.verticalScrollbarWidth+"px",i.root.style.top=`${this._editor.getTopForLineNumber(0)}px`})),t.add((0,E.autorun)(s=>{i.root.style.fontFamily=this._editorObs.getOption(49).read(s),i.root.style.fontSize=this._editorObs.getOption(52).read(s)+"px",i.root.style.lineHeight=this._editorObs.getOption(67).read(s)+"px"})),t.add(this._editorObs.createOverlayWidget({allowEditorOverflow:!1,minContentWidthInPx:(0,E.constObservable)(0),position:(0,E.constObservable)(null),domNode:i.root}))}),this._view.recomputeInitiallyAndOnChange(this._store)}}e.PlaceholderTextContribution=_;function b(p,n){return(0,E.derivedObservableWithCache)(p,(o,t)=>t===!0?!0:n(o))}}),define(ne[380],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AccessibleViewRegistry=void 0,e.AccessibleViewRegistry=new class{constructor(){this._implementations=[]}register(k){return this._implementations.push(k),{dispose:()=>{const I=this._implementations.indexOf(k);I!==-1&&this._implementations.splice(I,1)}}}getImplementations(){return this._implementations}}}),define(ne[381],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isLocalizedString=d,e.isICommandActionToggleInfo=k;function d(I){return I&&typeof I=="object"&&typeof I.original=="string"&&typeof I.value=="string"}function k(I){return I?I.condition!==void 0:!1}}),define(ne[671],se([1,0,3]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Categories=void 0,e.Categories=Object.freeze({View:(0,d.localize2)(1477,"View"),Help:(0,d.localize2)(1478,"Help"),Test:(0,d.localize2)(1479,"Test"),File:(0,d.localize2)(1480,"File"),Preferences:(0,d.localize2)(1481,"Preferences"),Developer:(0,d.localize2)(1482,"Developer")})}),define(ne[672],se([1,0,8,3]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Scanner=void 0;function I(..._){switch(_.length){case 1:return(0,k.localize)(1532,"Did you mean {0}?",_[0]);case 2:return(0,k.localize)(1533,"Did you mean {0} or {1}?",_[0],_[1]);case 3:return(0,k.localize)(1534,"Did you mean {0}, {1} or {2}?",_[0],_[1],_[2]);default:return}}const E=(0,k.localize)(1535,"Did you forget to open or close the quote?"),y=(0,k.localize)(1536,"Did you forget to escape the '/' (slash) character? Put two backslashes before it to escape, e.g., '\\\\/'.");class m{constructor(){this._input="",this._start=0,this._current=0,this._tokens=[],this._errors=[],this.stringRe=/[a-zA-Z0-9_<>\-\./\\:\*\?\+\[\]\^,#@;"%\$\p{L}-]+/uy}static getLexeme(b){switch(b.type){case 0:return"(";case 1:return")";case 2:return"!";case 3:return b.isTripleEq?"===":"==";case 4:return b.isTripleEq?"!==":"!=";case 5:return"<";case 6:return"<=";case 7:return">=";case 8:return">=";case 9:return"=~";case 10:return b.lexeme;case 11:return"true";case 12:return"false";case 13:return"in";case 14:return"not";case 15:return"&&";case 16:return"||";case 17:return b.lexeme;case 18:return b.lexeme;case 19:return b.lexeme;case 20:return"EOF";default:throw(0,d.illegalState)(`unhandled token type: ${JSON.stringify(b)}; have you forgotten to add a case?`)}}static{this._regexFlags=new Set(["i","g","s","m","y","u"].map(b=>b.charCodeAt(0)))}static{this._keywords=new Map([["not",14],["in",13],["false",12],["true",11]])}reset(b){return this._input=b,this._start=0,this._current=0,this._tokens=[],this._errors=[],this}scan(){for(;!this._isAtEnd();)switch(this._start=this._current,this._advance()){case 40:this._addToken(0);break;case 41:this._addToken(1);break;case 33:if(this._match(61)){const p=this._match(61);this._tokens.push({type:4,offset:this._start,isTripleEq:p})}else this._addToken(2);break;case 39:this._quotedString();break;case 47:this._regex();break;case 61:if(this._match(61)){const p=this._match(61);this._tokens.push({type:3,offset:this._start,isTripleEq:p})}else this._match(126)?this._addToken(9):this._error(I("==","=~"));break;case 60:this._addToken(this._match(61)?6:5);break;case 62:this._addToken(this._match(61)?8:7);break;case 38:this._match(38)?this._addToken(15):this._error(I("&&"));break;case 124:this._match(124)?this._addToken(16):this._error(I("||"));break;case 32:case 13:case 9:case 10:case 160:break;default:this._string()}return this._start=this._current,this._addToken(20),Array.from(this._tokens)}_match(b){return this._isAtEnd()||this._input.charCodeAt(this._current)!==b?!1:(this._current++,!0)}_advance(){return this._input.charCodeAt(this._current++)}_peek(){return this._isAtEnd()?0:this._input.charCodeAt(this._current)}_addToken(b){this._tokens.push({type:b,offset:this._start})}_error(b){const p=this._start,n=this._input.substring(this._start,this._current),o={type:19,offset:this._start,lexeme:n};this._errors.push({offset:p,lexeme:n,additionalInfo:b}),this._tokens.push(o)}_string(){this.stringRe.lastIndex=this._start;const b=this.stringRe.exec(this._input);if(b){this._current=this._start+b[0].length;const p=this._input.substring(this._start,this._current),n=m._keywords.get(p);n?this._addToken(n):this._tokens.push({type:17,lexeme:p,offset:this._start})}}_quotedString(){for(;this._peek()!==39&&!this._isAtEnd();)this._advance();if(this._isAtEnd()){this._error(E);return}this._advance(),this._tokens.push({type:18,lexeme:this._input.substring(this._start+1,this._current-1),offset:this._start+1})}_regex(){let b=this._current,p=!1,n=!1;for(;;){if(b>=this._input.length){this._current=b,this._error(y);return}const t=this._input.charCodeAt(b);if(p)p=!1;else if(t===47&&!n){b++;break}else t===91?n=!0:t===92?p=!0:t===93&&(n=!1);b++}for(;b=this._input.length}}e.Scanner=m}),define(ne[673],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorOpenSource=void 0;var d;(function(k){k[k.API=0]="API",k[k.USER=1]="USER"})(d||(e.EditorOpenSource=d={}))}),define(ne[674],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ExtensionIdentifierSet=e.ExtensionIdentifier=void 0;class d{constructor(E){this.value=E,this._lower=E.toLowerCase()}static toKey(E){return typeof E=="string"?E.toLowerCase():E._lower}}e.ExtensionIdentifier=d;class k{constructor(E){if(this._set=new Set,E)for(const y of E)this.add(y)}add(E){this._set.add(d.toKey(E))}has(E){return this._set.has(d.toKey(E))}}e.ExtensionIdentifierSet=k}),define(ne[382],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FileKind=void 0;var d;(function(k){k[k.FILE=0]="FILE",k[k.FOLDER=1]="FOLDER",k[k.ROOT_FOLDER=2]="ROOT_FOLDER"})(d||(e.FileKind=d={}))}),define(ne[675],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.showHistoryKeybindingHint=d;function d(k){return k.lookupKeybinding("history.showPrevious")?.getElectronAccelerator()==="Up"&&k.lookupKeybinding("history.showNext")?.getElectronAccelerator()==="Down"}}),define(ne[265],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SyncDescriptor=void 0;class d{constructor(I,E=[],y=!1){this.ctor=I,this.staticArguments=E,this.supportsDelayedInstantiation=y}}e.SyncDescriptor=d}),define(ne[49],se([1,0,265]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.registerSingleton=I,e.getSingletonServiceDescriptors=E;const k=[];function I(y,m,_){m instanceof d.SyncDescriptor||(m=new d.SyncDescriptor(m,[],!!_)),k.push([y,m])}function E(){return k}}),define(ne[676],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Graph=e.Node=void 0;class d{constructor(E,y){this.key=E,this.data=y,this.incoming=new Map,this.outgoing=new Map}}e.Node=d;class k{constructor(E){this._hashFn=E,this._nodes=new Map}roots(){const E=[];for(const y of this._nodes.values())y.outgoing.size===0&&E.push(y);return E}insertEdge(E,y){const m=this.lookupOrInsertNode(E),_=this.lookupOrInsertNode(y);m.outgoing.set(_.key,_),_.incoming.set(m.key,m)}removeNode(E){const y=this._hashFn(E);this._nodes.delete(y);for(const m of this._nodes.values())m.outgoing.delete(y),m.incoming.delete(y)}lookupOrInsertNode(E){const y=this._hashFn(E);let m=this._nodes.get(y);return m||(m=new d(y,E),this._nodes.set(y,m)),m}isEmpty(){return this._nodes.size===0}toString(){const E=[];for(const[y,m]of this._nodes)E.push(`${y} - (-> incoming)[${[...m.incoming.keys()].join(", ")}] - (outgoing ->)[${[...m.outgoing.keys()].join(",")}] -`);return E.join(` -`)}findCycleSlow(){for(const[E,y]of this._nodes){const m=new Set([E]),_=this._findCycle(y,m);if(_)return _}}_findCycle(E,y){for(const[m,_]of E.outgoing){if(y.has(m))return[...y,m].join(" -> ");y.add(m);const b=this._findCycle(_,y);if(b)return b;y.delete(m)}}}e.Graph=k}),define(ne[7],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IInstantiationService=e._util=void 0,e.createDecorator=I;var d;(function(E){E.serviceIds=new Map,E.DI_TARGET="$di$target",E.DI_DEPENDENCIES="$di$dependencies";function y(m){return m[E.DI_DEPENDENCIES]||[]}E.getServiceDependencies=y})(d||(e._util=d={})),e.IInstantiationService=I("instantiationService");function k(E,y,m){y[d.DI_TARGET]===y?y[d.DI_DEPENDENCIES].push({id:E,index:m}):(y[d.DI_DEPENDENCIES]=[{id:E,index:m}],y[d.DI_TARGET]=y)}function I(E){if(d.serviceIds.has(E))return d.serviceIds.get(E);const y=function(m,_,b){if(arguments.length!==3)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");k(y,m,b)};return y.toString=()=>E,d.serviceIds.set(E,y),y}}),define(ne[152],se([1,0,7,22,19]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ResourceFileEdit=e.ResourceTextEdit=e.ResourceEdit=e.IBulkEditService=void 0,e.IBulkEditService=(0,d.createDecorator)("IWorkspaceEditService");class E{constructor(b){this.metadata=b}static convert(b){return b.edits.map(p=>{if(y.is(p))return y.lift(p);if(m.is(p))return m.lift(p);throw new Error("Unsupported edit")})}}e.ResourceEdit=E;class y extends E{static is(b){return b instanceof y?!0:(0,I.isObject)(b)&&k.URI.isUri(b.resource)&&(0,I.isObject)(b.textEdit)}static lift(b){return b instanceof y?b:new y(b.resource,b.textEdit,b.versionId,b.metadata)}constructor(b,p,n=void 0,o){super(o),this.resource=b,this.textEdit=p,this.versionId=n}}e.ResourceTextEdit=y;class m extends E{static is(b){return b instanceof m?!0:(0,I.isObject)(b)&&(!!b.newResource||!!b.oldResource)}static lift(b){return b instanceof m?b:new m(b.oldResource,b.newResource,b.options,b.metadata)}constructor(b,p,n={},o){super(o),this.oldResource=b,this.newResource=p,this.options=n}}e.ResourceFileEdit=m}),define(ne[34],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ICodeEditorService=void 0,e.ICodeEditorService=(0,d.createDecorator)("codeEditorService")});var ce=this&&this.__param||function(oe,e){return function(d,k){e(d,k,oe)}};define(ne[383],se([1,0,5,114,26,57,2,21,65,30,19,112,88,55,9,4,27,3,7]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l){"use strict";var a;Object.defineProperty(e,"__esModule",{value:!0}),e.HideUnchangedRegionsFeature=void 0;let r=class extends y.Disposable{static{a=this}static{this._breadcrumbsSourceFactory=(0,m.observableValue)(a,()=>({dispose(){},getBreadcrumbItems(h,v){return[]}}))}static setBreadcrumbsSourceFactory(h){this._breadcrumbsSourceFactory.set(h,void 0)}get isUpdatingHiddenAreas(){return this._isUpdatingHiddenAreas}constructor(h,v,w,S){super(),this._editors=h,this._diffModel=v,this._options=w,this._instantiationService=S,this._modifiedOutlineSource=(0,_.derivedDisposable)(this,M=>{const A=this._editors.modifiedModel.read(M),P=a._breadcrumbsSourceFactory.read(M);return!A||!P?void 0:P(A,this._instantiationService)}),this._isUpdatingHiddenAreas=!1,this._register(this._editors.original.onDidChangeCursorPosition(M=>{if(M.reason===1)return;const A=this._diffModel.get();(0,m.transaction)(P=>{for(const N of this._editors.original.getSelections()||[])A?.ensureOriginalLineIsVisible(N.getStartPosition().lineNumber,0,P),A?.ensureOriginalLineIsVisible(N.getEndPosition().lineNumber,0,P)})})),this._register(this._editors.modified.onDidChangeCursorPosition(M=>{if(M.reason===1)return;const A=this._diffModel.get();(0,m.transaction)(P=>{for(const N of this._editors.modified.getSelections()||[])A?.ensureModifiedLineIsVisible(N.getStartPosition().lineNumber,0,P),A?.ensureModifiedLineIsVisible(N.getEndPosition().lineNumber,0,P)})}));const L=this._diffModel.map((M,A)=>{const P=M?.unchangedRegions.read(A)??[];return P.length===1&&P[0].modifiedLineNumber===1&&P[0].lineCount===this._editors.modifiedModel.read(A)?.getLineCount()?[]:P});this.viewZones=(0,m.derivedWithStore)(this,(M,A)=>{const P=this._modifiedOutlineSource.read(M);if(!P)return{origViewZones:[],modViewZones:[]};const N=[],O=[],F=this._options.renderSideBySide.read(M),x=this._options.compactMode.read(M),W=L.read(M);for(let V=0;Vq.getHiddenOriginalRange(U).startLineNumber-1),z=new o.PlaceholderViewZone(H,12);N.push(z),A.add(new u(this._editors.original,z,q,!F))}{const H=(0,m.derived)(this,U=>q.getHiddenModifiedRange(U).startLineNumber-1),z=new o.PlaceholderViewZone(H,12);O.push(z),A.add(new u(this._editors.modified,z,q))}}else{{const H=(0,m.derived)(this,U=>q.getHiddenOriginalRange(U).startLineNumber-1),z=new o.PlaceholderViewZone(H,24);N.push(z),A.add(new C(this._editors.original,z,q,q.originalUnchangedRange,!F,P,U=>this._diffModel.get().ensureModifiedLineIsVisible(U,2,void 0),this._options))}{const H=(0,m.derived)(this,U=>q.getHiddenModifiedRange(U).startLineNumber-1),z=new o.PlaceholderViewZone(H,24);O.push(z),A.add(new C(this._editors.modified,z,q,q.modifiedUnchangedRange,!1,P,U=>this._diffModel.get().ensureModifiedLineIsVisible(U,2,void 0),this._options))}}}return{origViewZones:N,modViewZones:O}});const D={description:"unchanged lines",className:"diff-unchanged-lines",isWholeLine:!0},T={description:"Fold Unchanged",glyphMarginHoverMessage:new E.MarkdownString(void 0,{isTrusted:!0,supportThemeIcons:!0}).appendMarkdown((0,c.localize)(111,"Fold Unchanged Region")),glyphMarginClassName:"fold-unchanged "+b.ThemeIcon.asClassName(I.Codicon.fold),zIndex:10001};this._register((0,o.applyObservableDecorations)(this._editors.original,(0,m.derived)(this,M=>{const A=L.read(M),P=A.map(N=>({range:N.originalUnchangedRange.toInclusiveRange(),options:D}));for(const N of A)N.shouldHideControls(M)&&P.push({range:s.Range.fromPositions(new i.Position(N.originalLineNumber,1)),options:T});return P}))),this._register((0,o.applyObservableDecorations)(this._editors.modified,(0,m.derived)(this,M=>{const A=L.read(M),P=A.map(N=>({range:N.modifiedUnchangedRange.toInclusiveRange(),options:D}));for(const N of A)N.shouldHideControls(M)&&P.push({range:t.LineRange.ofLength(N.modifiedLineNumber,1).toInclusiveRange(),options:T});return P}))),this._register((0,m.autorun)(M=>{const A=L.read(M);this._isUpdatingHiddenAreas=!0;try{this._editors.original.setHiddenAreas(A.map(P=>P.getHiddenOriginalRange(M).toInclusiveRange()).filter(p.isDefined)),this._editors.modified.setHiddenAreas(A.map(P=>P.getHiddenModifiedRange(M).toInclusiveRange()).filter(p.isDefined))}finally{this._isUpdatingHiddenAreas=!1}})),this._register(this._editors.modified.onMouseUp(M=>{if(!M.event.rightButton&&M.target.position&&M.target.element?.className.includes("fold-unchanged")){const A=M.target.position.lineNumber,P=this._diffModel.get();if(!P)return;const N=P.unchangedRegions.get().find(O=>O.modifiedUnchangedRange.includes(A));if(!N)return;N.collapseAll(void 0),M.event.stopPropagation(),M.event.preventDefault()}})),this._register(this._editors.original.onMouseUp(M=>{if(!M.event.rightButton&&M.target.position&&M.target.element?.className.includes("fold-unchanged")){const A=M.target.position.lineNumber,P=this._diffModel.get();if(!P)return;const N=P.unchangedRegions.get().find(O=>O.originalUnchangedRange.includes(A));if(!N)return;N.collapseAll(void 0),M.event.stopPropagation(),M.event.preventDefault()}}))}};e.HideUnchangedRegionsFeature=r,e.HideUnchangedRegionsFeature=r=a=ke([ce(3,l.IInstantiationService)],r);class u extends o.ViewZoneOverlayWidget{constructor(h,v,w,S=!1){const L=(0,d.h)("div.diff-hidden-lines-widget");super(h,v,L.root),this._unchangedRegion=w,this._hide=S,this._nodes=(0,d.h)("div.diff-hidden-lines-compact",[(0,d.h)("div.line-left",[]),(0,d.h)("div.text@text",[]),(0,d.h)("div.line-right",[])]),L.root.appendChild(this._nodes.root),this._hide&&this._nodes.root.replaceChildren(),this._register((0,m.autorun)(D=>{if(!this._hide){const T=this._unchangedRegion.getHiddenModifiedRange(D).length,M=(0,c.localize)(112,"{0} hidden lines",T);this._nodes.text.innerText=M}}))}}class C extends o.ViewZoneOverlayWidget{constructor(h,v,w,S,L,D,T,M){const A=(0,d.h)("div.diff-hidden-lines-widget");super(h,v,A.root),this._editor=h,this._unchangedRegion=w,this._unchangedRegionRange=S,this._hide=L,this._modifiedOutlineSource=D,this._revealModifiedHiddenLine=T,this._options=M,this._nodes=(0,d.h)("div.diff-hidden-lines",[(0,d.h)("div.top@top",{title:(0,c.localize)(113,"Click or drag to show more above")}),(0,d.h)("div.center@content",{style:{display:"flex"}},[(0,d.h)("div@first",{style:{display:"flex",justifyContent:"center",alignItems:"center",flexShrink:"0"}},[(0,d.$)("a",{title:(0,c.localize)(114,"Show Unchanged Region"),role:"button",onclick:()=>{this._unchangedRegion.showAll(void 0)}},...(0,k.renderLabelWithIcons)("$(unfold)"))]),(0,d.h)("div@others",{style:{display:"flex",justifyContent:"center",alignItems:"center"}})]),(0,d.h)("div.bottom@bottom",{title:(0,c.localize)(115,"Click or drag to show more below"),role:"button"})]),A.root.appendChild(this._nodes.root),this._hide?(0,d.reset)(this._nodes.first):this._register((0,o.applyStyle)(this._nodes.first,{width:(0,n.observableCodeEditor)(this._editor).layoutInfoContentLeft})),this._register((0,m.autorun)(N=>{const O=this._unchangedRegion.visibleLineCountTop.read(N)+this._unchangedRegion.visibleLineCountBottom.read(N)===this._unchangedRegion.lineCount;this._nodes.bottom.classList.toggle("canMoveTop",!O),this._nodes.bottom.classList.toggle("canMoveBottom",this._unchangedRegion.visibleLineCountBottom.read(N)>0),this._nodes.top.classList.toggle("canMoveTop",this._unchangedRegion.visibleLineCountTop.read(N)>0),this._nodes.top.classList.toggle("canMoveBottom",!O);const F=this._unchangedRegion.isDragged.read(N),x=this._editor.getDomNode();x&&(x.classList.toggle("draggingUnchangedRegion",!!F),F==="top"?(x.classList.toggle("canMoveTop",this._unchangedRegion.visibleLineCountTop.read(N)>0),x.classList.toggle("canMoveBottom",!O)):F==="bottom"?(x.classList.toggle("canMoveTop",!O),x.classList.toggle("canMoveBottom",this._unchangedRegion.visibleLineCountBottom.read(N)>0)):(x.classList.toggle("canMoveTop",!1),x.classList.toggle("canMoveBottom",!1)))}));const P=this._editor;this._register((0,d.addDisposableListener)(this._nodes.top,"mousedown",N=>{if(N.button!==0)return;this._nodes.top.classList.toggle("dragging",!0),this._nodes.root.classList.toggle("dragging",!0),N.preventDefault();const O=N.clientY;let F=!1;const x=this._unchangedRegion.visibleLineCountTop.get();this._unchangedRegion.isDragged.set("top",void 0);const W=(0,d.getWindow)(this._nodes.top),V=(0,d.addDisposableListener)(W,"mousemove",H=>{const U=H.clientY-O;F=F||Math.abs(U)>2;const j=Math.round(U/P.getOption(67)),Y=Math.max(0,Math.min(x+j,this._unchangedRegion.getMaxVisibleLineCountTop()));this._unchangedRegion.visibleLineCountTop.set(Y,void 0)}),q=(0,d.addDisposableListener)(W,"mouseup",H=>{F||this._unchangedRegion.showMoreAbove(this._options.hideUnchangedRegionsRevealLineCount.get(),void 0),this._nodes.top.classList.toggle("dragging",!1),this._nodes.root.classList.toggle("dragging",!1),this._unchangedRegion.isDragged.set(void 0,void 0),V.dispose(),q.dispose()})})),this._register((0,d.addDisposableListener)(this._nodes.bottom,"mousedown",N=>{if(N.button!==0)return;this._nodes.bottom.classList.toggle("dragging",!0),this._nodes.root.classList.toggle("dragging",!0),N.preventDefault();const O=N.clientY;let F=!1;const x=this._unchangedRegion.visibleLineCountBottom.get();this._unchangedRegion.isDragged.set("bottom",void 0);const W=(0,d.getWindow)(this._nodes.bottom),V=(0,d.addDisposableListener)(W,"mousemove",H=>{const U=H.clientY-O;F=F||Math.abs(U)>2;const j=Math.round(U/P.getOption(67)),Y=Math.max(0,Math.min(x-j,this._unchangedRegion.getMaxVisibleLineCountBottom())),G=this._unchangedRegionRange.endLineNumberExclusive>P.getModel().getLineCount()?P.getContentHeight():P.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive);this._unchangedRegion.visibleLineCountBottom.set(Y,void 0);const K=this._unchangedRegionRange.endLineNumberExclusive>P.getModel().getLineCount()?P.getContentHeight():P.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive);P.setScrollTop(P.getScrollTop()+(K-G))}),q=(0,d.addDisposableListener)(W,"mouseup",H=>{if(this._unchangedRegion.isDragged.set(void 0,void 0),!F){const z=P.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive);this._unchangedRegion.showMoreBelow(this._options.hideUnchangedRegionsRevealLineCount.get(),void 0);const U=P.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive);P.setScrollTop(P.getScrollTop()+(U-z))}this._nodes.bottom.classList.toggle("dragging",!1),this._nodes.root.classList.toggle("dragging",!1),V.dispose(),q.dispose()})})),this._register((0,m.autorun)(N=>{const O=[];if(!this._hide){const F=w.getHiddenModifiedRange(N).length,x=(0,c.localize)(116,"{0} hidden lines",F),W=(0,d.$)("span",{title:(0,c.localize)(117,"Double click to unfold")},x);W.addEventListener("dblclick",H=>{H.button===0&&(H.preventDefault(),this._unchangedRegion.showAll(void 0))}),O.push(W);const V=this._unchangedRegion.getHiddenModifiedRange(N),q=this._modifiedOutlineSource.getBreadcrumbItems(V,N);if(q.length>0){O.push((0,d.$)("span",void 0,"\xA0\xA0|\xA0\xA0"));for(let H=0;H{this._revealModifiedHiddenLine(z.startLineNumber)}}}}(0,d.reset)(this._nodes.others,...O)}))}}}),define(ne[43],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ILanguageService=void 0,e.ILanguageService=(0,d.createDecorator)("languageService")}),define(ne[100],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IEditorWorkerService=void 0,e.IEditorWorkerService=(0,d.createDecorator)("editorWorkerService")}),define(ne[17],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ILanguageFeaturesService=void 0,e.ILanguageFeaturesService=(0,d.createDecorator)("ILanguageFeaturesService")}),define(ne[677],se([1,0,658,17,49]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LanguageFeaturesService=void 0;class E{constructor(){this.referenceProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.renameProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.newSymbolNamesProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.codeActionProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.definitionProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.typeDefinitionProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.declarationProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.implementationProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.documentSymbolProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.inlayHintsProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.colorProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.codeLensProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.documentFormattingEditProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.documentRangeFormattingEditProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.onTypeFormattingEditProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.signatureHelpProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.hoverProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.documentHighlightProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.multiDocumentHighlightProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.selectionRangeProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.foldingRangeProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.linkProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.inlineCompletionsProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.inlineEditProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.completionProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.linkedEditingRangeProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.documentRangeSemanticTokensProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.documentSemanticTokensProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.documentDropEditProvider=new d.LanguageFeatureRegistry(this._score.bind(this)),this.documentPasteEditProvider=new d.LanguageFeatureRegistry(this._score.bind(this))}_score(m){return this._notebookTypeResolver?.(m)}}e.LanguageFeaturesService=E,(0,I.registerSingleton)(k.ILanguageFeaturesService,E,1)}),define(ne[266],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IMarkerDecorationsService=void 0,e.IMarkerDecorationsService=(0,d.createDecorator)("markerDecorationsService")}),define(ne[51],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IModelService=void 0,e.IModelService=(0,d.createDecorator)("modelService")}),define(ne[78],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ITextModelService=void 0,e.ITextModelService=(0,d.createDecorator)("textModelService")}),define(ne[267],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ISemanticTokensStylingService=void 0,e.ISemanticTokensStylingService=(0,d.createDecorator)("semanticTokensStylingService")}),define(ne[211],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ITextResourcePropertiesService=e.ITextResourceConfigurationService=void 0,e.ITextResourceConfigurationService=(0,d.createDecorator)("textResourceConfigurationService"),e.ITextResourcePropertiesService=(0,d.createDecorator)("textResourcePropertiesService")}),define(ne[384],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ITreeSitterParserService=void 0,e.ITreeSitterParserService=(0,d.createDecorator)("treeSitterParserService")}),define(ne[678],se([1,0,49,7,327]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ITreeViewsDnDService=void 0,e.ITreeViewsDnDService=(0,k.createDecorator)("treeViewsDndService"),(0,d.registerSingleton)(e.ITreeViewsDnDService,I.TreeViewsDnDService,1)}),define(ne[385],se([1,0,33,2,17,130,100]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DefaultDocumentColorProvider=void 0;let m=class{constructor(p){this._editorWorkerService=p}async provideDocumentColors(p,n){return this._editorWorkerService.computeDefaultDocumentColors(p.uri)}provideColorPresentations(p,n,o){const t=n.range,i=n.color,s=i.alpha,g=new d.Color(new d.RGBA(Math.round(255*i.red),Math.round(255*i.green),Math.round(255*i.blue),s)),c=s?d.Color.Format.CSS.formatRGB(g):d.Color.Format.CSS.formatRGBA(g),l=s?d.Color.Format.CSS.formatHSL(g):d.Color.Format.CSS.formatHSLA(g),a=s?d.Color.Format.CSS.formatHex(g):d.Color.Format.CSS.formatHexA(g),r=[];return r.push({label:c,textEdit:{range:t,text:c}}),r.push({label:l,textEdit:{range:t,text:l}}),r.push({label:a,textEdit:{range:t,text:a}}),r}};e.DefaultDocumentColorProvider=m,e.DefaultDocumentColorProvider=m=ke([ce(0,y.IEditorWorkerService)],m);let _=class extends k.Disposable{constructor(p,n){super(),this._register(p.colorProvider.register("*",new m(n)))}};_=ke([ce(0,I.ILanguageFeaturesService),ce(1,y.IEditorWorkerService)],_),(0,E.registerEditorFeature)(_)}),define(ne[268],se([1,0,152,135]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createCombinedWorkspaceEdit=I,e.sortEditsByYieldTo=E;function I(y,m,_){return(typeof _.insertText=="string"?_.insertText==="":_.insertText.snippet==="")?{edits:_.additionalEdit?.edits??[]}:{edits:[...m.map(b=>new d.ResourceTextEdit(y,{range:b,text:typeof _.insertText=="string"?k.SnippetParser.escape(_.insertText)+"$0":_.insertText.snippet,insertAsSnippet:!0})),..._.additionalEdit?.edits??[]]}}function E(y){function m(o,t){return"mimeType"in o?o.mimeType===t.handledMimeType:!!t.kind&&o.kind.contains(t.kind)}const _=new Map;for(const o of y)for(const t of o.yieldTo??[])for(const i of y)if(i!==o&&m(t,i)){let s=_.get(o);s||(s=[],_.set(o,s)),s.push(i)}if(!_.size)return Array.from(y);const b=new Set,p=[];function n(o){if(!o.length)return[];const t=o[0];if(p.includes(t))return console.warn("Yield to cycle detected",t),o;if(b.has(t))return n(o.slice(1));let i=[];const s=_.get(t);return s&&(p.push(t),i=n(s),p.pop()),b.add(t),[...i,t,...n(o.slice(1))]}return n(Array.from(y))}}),define(ne[679],se([1,0,103,6,2,21,11,74,37,9,4,116,43,40,83,150,136,204,205,517]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ttPolicy=e.AdditionalLinesWidget=e.GhostTextView=e.GHOST_TEXT_DESCRIPTION=void 0,e.GHOST_TEXT_DESCRIPTION="ghost-text";let a=class extends I.Disposable{constructor(f,h,v){super(),this.editor=f,this.model=h,this.languageService=v,this.isDisposed=(0,E.observableValue)(this,!1),this.currentTextModel=(0,E.observableFromEvent)(this,this.editor.onDidChangeModel,()=>this.editor.getModel()),this.uiState=(0,E.derived)(this,w=>{if(this.isDisposed.read(w))return;const S=this.currentTextModel.read(w);if(S!==this.model.targetTextModel.read(w))return;const L=this.model.ghostText.read(w);if(!L)return;const D=L instanceof c.GhostTextReplacement?L.columnRange:void 0,T=[],M=[];function A(x,W){if(M.length>0){const V=M[M.length-1];W&&V.decorations.push(new s.LineDecoration(V.content.length+1,V.content.length+1+x[0].length,W,0)),V.content+=x[0],x=x.slice(1)}for(const V of x)M.push({content:V,decorations:W?[new s.LineDecoration(1,V.length+1,W,0)]:[]})}const P=S.getLineContent(L.lineNumber);let N,O=0;for(const x of L.parts){let W=x.lines;N===void 0?(T.push({column:x.column,text:W[0],preview:x.preview}),W=W.slice(1)):A([P.substring(O,x.column-1)],void 0),W.length>0&&(A(W,e.GHOST_TEXT_DESCRIPTION),N===void 0&&x.column<=P.length&&(N=x.column)),O=x.column-1}N!==void 0&&A([P.substring(O)],void 0);const F=N!==void 0?new l.ColumnRange(N,P.length+1):void 0;return{replacedRange:D,inlineTexts:T,additionalLines:M,hiddenRange:F,lineNumber:L.lineNumber,additionalReservedLineCount:this.model.minReservedLineCount.read(w),targetTextModel:S}}),this.decorations=(0,E.derived)(this,w=>{const S=this.uiState.read(w);if(!S)return[];const L=[];S.replacedRange&&L.push({range:S.replacedRange.toRange(S.lineNumber),options:{inlineClassName:"inline-completion-text-to-replace",description:"GhostTextReplacement"}}),S.hiddenRange&&L.push({range:S.hiddenRange.toRange(S.lineNumber),options:{inlineClassName:"ghost-text-hidden",description:"ghost-text-hidden"}});for(const D of S.inlineTexts)L.push({range:p.Range.fromPositions(new b.Position(S.lineNumber,D.column)),options:{description:e.GHOST_TEXT_DESCRIPTION,after:{content:D.text,inlineClassName:D.preview?"ghost-text-decoration-preview":"ghost-text-decoration",cursorStops:t.InjectedTextCursorStops.Left},showIfCollapsed:!0}});return L}),this.additionalLinesWidget=this._register(new r(this.editor,this.languageService.languageIdCodec,(0,E.derived)(w=>{const S=this.uiState.read(w);return S?{lineNumber:S.lineNumber,additionalLines:S.additionalLines,minReservedLineCount:S.additionalReservedLineCount,targetTextModel:S.targetTextModel}:void 0}))),this._register((0,I.toDisposable)(()=>{this.isDisposed.set(!0,void 0)})),this._register((0,l.applyObservableDecorations)(this.editor,this.decorations))}ownsViewZone(f){return this.additionalLinesWidget.viewZoneId===f}};e.GhostTextView=a,e.GhostTextView=a=ke([ce(2,o.ILanguageService)],a);class r extends I.Disposable{get viewZoneId(){return this._viewZoneId}constructor(f,h,v){super(),this.editor=f,this.languageIdCodec=h,this.lines=v,this._viewZoneId=void 0,this.editorOptionsChanged=(0,E.observableSignalFromEvent)("editorOptionChanged",k.Event.filter(this.editor.onDidChangeConfiguration,w=>w.hasChanged(33)||w.hasChanged(118)||w.hasChanged(100)||w.hasChanged(95)||w.hasChanged(51)||w.hasChanged(50)||w.hasChanged(67))),this._register((0,E.autorun)(w=>{const S=this.lines.read(w);this.editorOptionsChanged.read(w),S?this.updateLines(S.lineNumber,S.additionalLines,S.minReservedLineCount):this.clear()}))}dispose(){super.dispose(),this.clear()}clear(){this.editor.changeViewZones(f=>{this._viewZoneId&&(f.removeZone(this._viewZoneId),this._viewZoneId=void 0)})}updateLines(f,h,v){const w=this.editor.getModel();if(!w)return;const{tabSize:S}=w.getOptions();this.editor.changeViewZones(L=>{this._viewZoneId&&(L.removeZone(this._viewZoneId),this._viewZoneId=void 0);const D=Math.max(h.length,v);if(D>0){const T=document.createElement("div");u(T,S,h,this.editor.getOptions(),this.languageIdCodec),this._viewZoneId=L.addZone({afterLineNumber:f,heightInLines:D,domNode:T,afterColumnAffinity:1})}})}}e.AdditionalLinesWidget=r;function u(C,f,h,v,w){const S=v.get(33),L=v.get(118),D="none",T=v.get(95),M=v.get(51),A=v.get(50),P=v.get(67),N=new n.StringBuilder(1e4);N.appendString('
    ');for(let x=0,W=h.length;x');const H=y.isBasicASCII(q),z=y.containsRTL(q),U=i.LineTokens.createEmpty(q,w);(0,g.renderViewLine)(new g.RenderLineInput(A.isMonospace&&!S,A.canUseHalfwidthRightwardsArrow,q,!1,H,z,0,U,V.decorations,f,0,A.spaceWidth,A.middotWidth,A.wsmiddotWidth,L,D,T,M!==_.EditorFontLigatures.OFF,null),N),N.appendString("
    ")}N.appendString(""),(0,m.applyFontInfo)(C,A);const O=N.build(),F=e.ttPolicy?e.ttPolicy.createHTML(O):O;C.innerHTML=F}e.ttPolicy=(0,d.createTrustedTypesPolicy)("editorGhostText",{createHTML:C=>C})}),define(ne[680],se([1,0,147,17,27,2,45]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TextualMultiDocumentHighlightFeature=void 0;class m{constructor(){this.selector={language:"*"}}provideDocumentHighlights(p,n,o){const t=[],i=p.getWordAtPosition({lineNumber:n.lineNumber,column:n.column});return i?p.isDisposed()?void 0:p.findMatches(i.word,!0,!1,!0,d.USUAL_WORD_SEPARATORS,!1).map(g=>({range:g.range,kind:I.DocumentHighlightKind.Text})):Promise.resolve(t)}provideMultiDocumentHighlights(p,n,o,t){const i=new y.ResourceMap,s=p.getWordAtPosition({lineNumber:n.lineNumber,column:n.column});if(!s)return Promise.resolve(i);for(const g of[p,...o]){if(g.isDisposed())continue;const l=g.findMatches(s.word,!0,!1,!0,d.USUAL_WORD_SEPARATORS,!1).map(a=>({range:a.range,kind:I.DocumentHighlightKind.Text}));l&&i.set(g.uri,l)}return i}}let _=class extends E.Disposable{constructor(p){super(),this._register(p.documentHighlightProvider.register("*",new m)),this._register(p.multiDocumentHighlightProvider.register("*",new m))}};e.TextualMultiDocumentHighlightFeature=_,e.TextualMultiDocumentHighlightFeature=_=ke([ce(0,k.ILanguageFeaturesService)],_)}),define(ne[153],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IStandaloneThemeService=void 0,e.IStandaloneThemeService=(0,d.createDecorator)("themeService")}),define(ne[137],se([1,0,3,7]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AccessibilitySignal=e.SoundSource=e.Sound=e.AcknowledgeDocCommentsToken=e.IAccessibilitySignalService=void 0,e.IAccessibilitySignalService=(0,k.createDecorator)("accessibilitySignalService"),e.AcknowledgeDocCommentsToken=Symbol("AcknowledgeDocCommentsToken");class I{static register(_){return new I(_.fileName)}static{this.error=I.register({fileName:"error.mp3"})}static{this.warning=I.register({fileName:"warning.mp3"})}static{this.success=I.register({fileName:"success.mp3"})}static{this.foldedArea=I.register({fileName:"foldedAreas.mp3"})}static{this.break=I.register({fileName:"break.mp3"})}static{this.quickFixes=I.register({fileName:"quickFixes.mp3"})}static{this.taskCompleted=I.register({fileName:"taskCompleted.mp3"})}static{this.taskFailed=I.register({fileName:"taskFailed.mp3"})}static{this.terminalBell=I.register({fileName:"terminalBell.mp3"})}static{this.diffLineInserted=I.register({fileName:"diffLineInserted.mp3"})}static{this.diffLineDeleted=I.register({fileName:"diffLineDeleted.mp3"})}static{this.diffLineModified=I.register({fileName:"diffLineModified.mp3"})}static{this.chatRequestSent=I.register({fileName:"chatRequestSent.mp3"})}static{this.chatResponseReceived1=I.register({fileName:"chatResponseReceived1.mp3"})}static{this.chatResponseReceived2=I.register({fileName:"chatResponseReceived2.mp3"})}static{this.chatResponseReceived3=I.register({fileName:"chatResponseReceived3.mp3"})}static{this.chatResponseReceived4=I.register({fileName:"chatResponseReceived4.mp3"})}static{this.clear=I.register({fileName:"clear.mp3"})}static{this.save=I.register({fileName:"save.mp3"})}static{this.format=I.register({fileName:"format.mp3"})}static{this.voiceRecordingStarted=I.register({fileName:"voiceRecordingStarted.mp3"})}static{this.voiceRecordingStopped=I.register({fileName:"voiceRecordingStopped.mp3"})}static{this.progress=I.register({fileName:"progress.mp3"})}constructor(_){this.fileName=_}}e.Sound=I;class E{constructor(_){this.randomOneOf=_}}e.SoundSource=E;class y{constructor(_,b,p,n,o,t){this.sound=_,this.name=b,this.legacySoundSettingsKey=p,this.settingsKey=n,this.legacyAnnouncementSettingsKey=o,this.announcementMessage=t}static{this._signals=new Set}static register(_){const b=new E("randomOneOf"in _.sound?_.sound.randomOneOf:[_.sound]),p=new y(b,_.name,_.legacySoundSettingsKey,_.settingsKey,_.legacyAnnouncementSettingsKey,_.announcementMessage);return y._signals.add(p),p}static{this.errorAtPosition=y.register({name:(0,d.localize)(1428,"Error at Position"),sound:I.error,announcementMessage:(0,d.localize)(1429,"Error"),settingsKey:"accessibility.signals.positionHasError",delaySettingsKey:"accessibility.signalOptions.delays.errorAtPosition"})}static{this.warningAtPosition=y.register({name:(0,d.localize)(1430,"Warning at Position"),sound:I.warning,announcementMessage:(0,d.localize)(1431,"Warning"),settingsKey:"accessibility.signals.positionHasWarning",delaySettingsKey:"accessibility.signalOptions.delays.warningAtPosition"})}static{this.errorOnLine=y.register({name:(0,d.localize)(1432,"Error on Line"),sound:I.error,legacySoundSettingsKey:"audioCues.lineHasError",legacyAnnouncementSettingsKey:"accessibility.alert.error",announcementMessage:(0,d.localize)(1433,"Error on Line"),settingsKey:"accessibility.signals.lineHasError"})}static{this.warningOnLine=y.register({name:(0,d.localize)(1434,"Warning on Line"),sound:I.warning,legacySoundSettingsKey:"audioCues.lineHasWarning",legacyAnnouncementSettingsKey:"accessibility.alert.warning",announcementMessage:(0,d.localize)(1435,"Warning on Line"),settingsKey:"accessibility.signals.lineHasWarning"})}static{this.foldedArea=y.register({name:(0,d.localize)(1436,"Folded Area on Line"),sound:I.foldedArea,legacySoundSettingsKey:"audioCues.lineHasFoldedArea",legacyAnnouncementSettingsKey:"accessibility.alert.foldedArea",announcementMessage:(0,d.localize)(1437,"Folded"),settingsKey:"accessibility.signals.lineHasFoldedArea"})}static{this.break=y.register({name:(0,d.localize)(1438,"Breakpoint on Line"),sound:I.break,legacySoundSettingsKey:"audioCues.lineHasBreakpoint",legacyAnnouncementSettingsKey:"accessibility.alert.breakpoint",announcementMessage:(0,d.localize)(1439,"Breakpoint"),settingsKey:"accessibility.signals.lineHasBreakpoint"})}static{this.inlineSuggestion=y.register({name:(0,d.localize)(1440,"Inline Suggestion on Line"),sound:I.quickFixes,legacySoundSettingsKey:"audioCues.lineHasInlineSuggestion",settingsKey:"accessibility.signals.lineHasInlineSuggestion"})}static{this.terminalQuickFix=y.register({name:(0,d.localize)(1441,"Terminal Quick Fix"),sound:I.quickFixes,legacySoundSettingsKey:"audioCues.terminalQuickFix",legacyAnnouncementSettingsKey:"accessibility.alert.terminalQuickFix",announcementMessage:(0,d.localize)(1442,"Quick Fix"),settingsKey:"accessibility.signals.terminalQuickFix"})}static{this.onDebugBreak=y.register({name:(0,d.localize)(1443,"Debugger Stopped on Breakpoint"),sound:I.break,legacySoundSettingsKey:"audioCues.onDebugBreak",legacyAnnouncementSettingsKey:"accessibility.alert.onDebugBreak",announcementMessage:(0,d.localize)(1444,"Breakpoint"),settingsKey:"accessibility.signals.onDebugBreak"})}static{this.noInlayHints=y.register({name:(0,d.localize)(1445,"No Inlay Hints on Line"),sound:I.error,legacySoundSettingsKey:"audioCues.noInlayHints",legacyAnnouncementSettingsKey:"accessibility.alert.noInlayHints",announcementMessage:(0,d.localize)(1446,"No Inlay Hints"),settingsKey:"accessibility.signals.noInlayHints"})}static{this.taskCompleted=y.register({name:(0,d.localize)(1447,"Task Completed"),sound:I.taskCompleted,legacySoundSettingsKey:"audioCues.taskCompleted",legacyAnnouncementSettingsKey:"accessibility.alert.taskCompleted",announcementMessage:(0,d.localize)(1448,"Task Completed"),settingsKey:"accessibility.signals.taskCompleted"})}static{this.taskFailed=y.register({name:(0,d.localize)(1449,"Task Failed"),sound:I.taskFailed,legacySoundSettingsKey:"audioCues.taskFailed",legacyAnnouncementSettingsKey:"accessibility.alert.taskFailed",announcementMessage:(0,d.localize)(1450,"Task Failed"),settingsKey:"accessibility.signals.taskFailed"})}static{this.terminalCommandFailed=y.register({name:(0,d.localize)(1451,"Terminal Command Failed"),sound:I.error,legacySoundSettingsKey:"audioCues.terminalCommandFailed",legacyAnnouncementSettingsKey:"accessibility.alert.terminalCommandFailed",announcementMessage:(0,d.localize)(1452,"Command Failed"),settingsKey:"accessibility.signals.terminalCommandFailed"})}static{this.terminalCommandSucceeded=y.register({name:(0,d.localize)(1453,"Terminal Command Succeeded"),sound:I.success,announcementMessage:(0,d.localize)(1454,"Command Succeeded"),settingsKey:"accessibility.signals.terminalCommandSucceeded"})}static{this.terminalBell=y.register({name:(0,d.localize)(1455,"Terminal Bell"),sound:I.terminalBell,legacySoundSettingsKey:"audioCues.terminalBell",legacyAnnouncementSettingsKey:"accessibility.alert.terminalBell",announcementMessage:(0,d.localize)(1456,"Terminal Bell"),settingsKey:"accessibility.signals.terminalBell"})}static{this.notebookCellCompleted=y.register({name:(0,d.localize)(1457,"Notebook Cell Completed"),sound:I.taskCompleted,legacySoundSettingsKey:"audioCues.notebookCellCompleted",legacyAnnouncementSettingsKey:"accessibility.alert.notebookCellCompleted",announcementMessage:(0,d.localize)(1458,"Notebook Cell Completed"),settingsKey:"accessibility.signals.notebookCellCompleted"})}static{this.notebookCellFailed=y.register({name:(0,d.localize)(1459,"Notebook Cell Failed"),sound:I.taskFailed,legacySoundSettingsKey:"audioCues.notebookCellFailed",legacyAnnouncementSettingsKey:"accessibility.alert.notebookCellFailed",announcementMessage:(0,d.localize)(1460,"Notebook Cell Failed"),settingsKey:"accessibility.signals.notebookCellFailed"})}static{this.diffLineInserted=y.register({name:(0,d.localize)(1461,"Diff Line Inserted"),sound:I.diffLineInserted,legacySoundSettingsKey:"audioCues.diffLineInserted",settingsKey:"accessibility.signals.diffLineInserted"})}static{this.diffLineDeleted=y.register({name:(0,d.localize)(1462,"Diff Line Deleted"),sound:I.diffLineDeleted,legacySoundSettingsKey:"audioCues.diffLineDeleted",settingsKey:"accessibility.signals.diffLineDeleted"})}static{this.diffLineModified=y.register({name:(0,d.localize)(1463,"Diff Line Modified"),sound:I.diffLineModified,legacySoundSettingsKey:"audioCues.diffLineModified",settingsKey:"accessibility.signals.diffLineModified"})}static{this.chatRequestSent=y.register({name:(0,d.localize)(1464,"Chat Request Sent"),sound:I.chatRequestSent,legacySoundSettingsKey:"audioCues.chatRequestSent",legacyAnnouncementSettingsKey:"accessibility.alert.chatRequestSent",announcementMessage:(0,d.localize)(1465,"Chat Request Sent"),settingsKey:"accessibility.signals.chatRequestSent"})}static{this.chatResponseReceived=y.register({name:(0,d.localize)(1466,"Chat Response Received"),legacySoundSettingsKey:"audioCues.chatResponseReceived",sound:{randomOneOf:[I.chatResponseReceived1,I.chatResponseReceived2,I.chatResponseReceived3,I.chatResponseReceived4]},settingsKey:"accessibility.signals.chatResponseReceived"})}static{this.progress=y.register({name:(0,d.localize)(1467,"Progress"),sound:I.progress,legacySoundSettingsKey:"audioCues.chatResponsePending",legacyAnnouncementSettingsKey:"accessibility.alert.progress",announcementMessage:(0,d.localize)(1468,"Progress"),settingsKey:"accessibility.signals.progress"})}static{this.clear=y.register({name:(0,d.localize)(1469,"Clear"),sound:I.clear,legacySoundSettingsKey:"audioCues.clear",legacyAnnouncementSettingsKey:"accessibility.alert.clear",announcementMessage:(0,d.localize)(1470,"Clear"),settingsKey:"accessibility.signals.clear"})}static{this.save=y.register({name:(0,d.localize)(1471,"Save"),sound:I.save,legacySoundSettingsKey:"audioCues.save",legacyAnnouncementSettingsKey:"accessibility.alert.save",announcementMessage:(0,d.localize)(1472,"Save"),settingsKey:"accessibility.signals.save"})}static{this.format=y.register({name:(0,d.localize)(1473,"Format"),sound:I.format,legacySoundSettingsKey:"audioCues.format",legacyAnnouncementSettingsKey:"accessibility.alert.format",announcementMessage:(0,d.localize)(1474,"Format"),settingsKey:"accessibility.signals.format"})}static{this.voiceRecordingStarted=y.register({name:(0,d.localize)(1475,"Voice Recording Started"),sound:I.voiceRecordingStarted,legacySoundSettingsKey:"audioCues.voiceRecordingStarted",settingsKey:"accessibility.signals.voiceRecordingStarted"})}static{this.voiceRecordingStopped=y.register({name:(0,d.localize)(1476,"Voice Recording Stopped"),sound:I.voiceRecordingStopped,legacySoundSettingsKey:"audioCues.voiceRecordingStopped",settingsKey:"accessibility.signals.voiceRecordingStopped"})}}e.AccessibilitySignal=y}),define(ne[117],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IClipboardService=void 0,e.IClipboardService=(0,d.createDecorator)("clipboardService")}),define(ne[24],se([1,0,6,53,2,73,19,7]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CommandsRegistry=e.ICommandService=void 0,e.ICommandService=(0,m.createDecorator)("commandService"),e.CommandsRegistry=new class{constructor(){this._commands=new Map,this._onDidRegisterCommand=new d.Emitter,this.onDidRegisterCommand=this._onDidRegisterCommand.event}registerCommand(_,b){if(!_)throw new Error("invalid command");if(typeof _=="string"){if(!b)throw new Error("invalid command");return this.registerCommand({id:_,handler:b})}if(_.metadata&&Array.isArray(_.metadata.args)){const i=[];for(const g of _.metadata.args)i.push(g.constraint);const s=_.handler;_.handler=function(g,...c){return(0,y.validateConstraints)(c,i),s(g,...c)}}const{id:p}=_;let n=this._commands.get(p);n||(n=new E.LinkedList,this._commands.set(p,n));const o=n.unshift(_),t=(0,I.toDisposable)(()=>{o(),this._commands.get(p)?.isEmpty()&&this._commands.delete(p)});return this._onDidRegisterCommand.fire(p),t}registerCommandAlias(_,b){return e.CommandsRegistry.registerCommand(_,(p,...n)=>p.get(e.ICommandService).executeCommand(b,...n))}getCommand(_){const b=this._commands.get(_);if(!(!b||b.isEmpty()))return k.Iterable.first(b)}getCommands(){const _=new Map;for(const b of this._commands.keys()){const p=this.getCommand(b);p&&_.set(b,p)}return _}},e.CommandsRegistry.registerCommand("noop",()=>{})}),define(ne[386],se([1,0,18,8,2,19,22,51,24,17]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeLensModel=void 0,e.getCodeLensModel=n;class p{constructor(){this.lenses=[],this._disposables=new I.DisposableStore}dispose(){this._disposables.dispose()}get isDisposed(){return this._disposables.isDisposed}add(t,i){this._disposables.add(t);for(const s of t.lenses)this.lenses.push({symbol:s,provider:i})}}e.CodeLensModel=p;async function n(o,t,i){const s=o.ordered(t),g=new Map,c=new p,l=s.map(async(a,r)=>{g.set(a,r);try{const u=await Promise.resolve(a.provideCodeLenses(t,i));u&&c.add(u,a)}catch(u){(0,k.onUnexpectedExternalError)(u)}});return await Promise.all(l),c.lenses=c.lenses.sort((a,r)=>a.symbol.range.startLineNumberr.symbol.range.startLineNumber?1:g.get(a.provider)g.get(r.provider)?1:a.symbol.range.startColumnr.symbol.range.startColumn?1:0),c}_.CommandsRegistry.registerCommand("_executeCodeLensProvider",function(o,...t){let[i,s]=t;(0,E.assertType)(y.URI.isUri(i)),(0,E.assertType)(typeof s=="number"||!s);const{codeLensProvider:g}=o.get(b.ILanguageFeaturesService),c=o.get(m.IModelService).getModel(i);if(!c)throw(0,k.illegalArgument)();const l=[],a=new I.DisposableStore;return n(g,c,d.CancellationToken.None).then(r=>{a.add(r);const u=[];for(const C of r.lenses)s==null||C.symbol.command?l.push(C.symbol):s-- >0&&C.provider.resolveCodeLens&&u.push(Promise.resolve(C.provider.resolveCodeLens(c,C.symbol,d.CancellationToken.None)).then(f=>l.push(f||C.symbol)));return Promise.all(u)}).then(()=>l).finally(()=>{setTimeout(()=>a.dispose(),100)})})}),define(ne[681],se([1,0,13,18,8,2,19,22,4,51,24,17]),function(oe,e,d,k,I,E,y,m,_,b,p,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinksList=e.Link=void 0,e.getLinks=i;class o{constructor(g,c){this._link=g,this._provider=c}toJSON(){return{range:this.range,url:this.url,tooltip:this.tooltip}}get range(){return this._link.range}get url(){return this._link.url}get tooltip(){return this._link.tooltip}async resolve(g){return this._link.url?this._link.url:typeof this._provider.resolveLink=="function"?Promise.resolve(this._provider.resolveLink(this._link,g)).then(c=>(this._link=c||this._link,this._link.url?this.resolve(g):Promise.reject(new Error("missing")))):Promise.reject(new Error("missing"))}}e.Link=o;class t{constructor(g){this._disposables=new E.DisposableStore;let c=[];for(const[l,a]of g){const r=l.links.map(u=>new o(u,a));c=t._union(c,r),(0,E.isDisposable)(l)&&this._disposables.add(l)}this.links=c}dispose(){this._disposables.dispose(),this.links.length=0}static _union(g,c){const l=[];let a,r,u,C;for(a=0,u=0,r=g.length,C=c.length;aPromise.resolve(r.provideLinks(g,c)).then(C=>{C&&(l[u]=[C,r])},I.onUnexpectedExternalError));return Promise.all(a).then(()=>{const r=new t((0,d.coalesce)(l));return c.isCancellationRequested?(r.dispose(),new t([])):r})}p.CommandsRegistry.registerCommand("_executeLinkProvider",async(s,...g)=>{let[c,l]=g;(0,y.assertType)(c instanceof m.URI),typeof l!="number"&&(l=0);const{linkProvider:a}=s.get(n.ILanguageFeaturesService),r=s.get(b.IModelService).getModel(c);if(!r)return[];const u=await i(a,r,k.CancellationToken.None);if(!u)return[];for(let f=0;f0?h[0]:[]}async function g(C,f,h,v,w){const S=s(C,f),L=await Promise.all(S.map(async D=>{let T,M=null;try{T=await D.provideDocumentSemanticTokens(f,D===h?v:null,w)}catch(A){M=A,T=null}return(!T||!n(T)&&!o(T))&&(T=null),new t(D,T,M)}));for(const D of L){if(D.error)throw D.error;if(D.tokens)return D}return L.length>0?L[0]:null}function c(C,f){const h=C.orderedGroups(f);return h.length>0?h[0]:null}class l{constructor(f,h){this.provider=f,this.tokens=h}}function a(C,f){return C.has(f)}function r(C,f){const h=C.orderedGroups(f);return h.length>0?h[0]:[]}async function u(C,f,h,v){const w=r(C,f),S=await Promise.all(w.map(async L=>{let D;try{D=await L.provideDocumentRangeSemanticTokens(f,h,v)}catch(T){(0,k.onUnexpectedExternalError)(T),D=null}return(!D||!n(D))&&(D=null),new l(L,D)}));for(const L of S)if(L.tokens)return L;return S.length>0?S[0]:null}y.CommandsRegistry.registerCommand("_provideDocumentSemanticTokensLegend",async(C,...f)=>{const[h]=f;(0,m.assertType)(h instanceof I.URI);const v=C.get(E.IModelService).getModel(h);if(!v)return;const{documentSemanticTokensProvider:w}=C.get(p.ILanguageFeaturesService),S=c(w,v);return S?S[0].getLegend():C.get(y.ICommandService).executeCommand("_provideDocumentRangeSemanticTokensLegend",h)}),y.CommandsRegistry.registerCommand("_provideDocumentSemanticTokens",async(C,...f)=>{const[h]=f;(0,m.assertType)(h instanceof I.URI);const v=C.get(E.IModelService).getModel(h);if(!v)return;const{documentSemanticTokensProvider:w}=C.get(p.ILanguageFeaturesService);if(!i(w,v))return C.get(y.ICommandService).executeCommand("_provideDocumentRangeSemanticTokens",h,v.getFullModelRange());const S=await g(w,v,null,null,d.CancellationToken.None);if(!S)return;const{provider:L,tokens:D}=S;if(!D||!n(D))return;const T=(0,_.encodeSemanticTokensDto)({id:0,type:"full",data:D.data});return D.resultId&&L.releaseDocumentSemanticTokens(D.resultId),T}),y.CommandsRegistry.registerCommand("_provideDocumentRangeSemanticTokensLegend",async(C,...f)=>{const[h,v]=f;(0,m.assertType)(h instanceof I.URI);const w=C.get(E.IModelService).getModel(h);if(!w)return;const{documentRangeSemanticTokensProvider:S}=C.get(p.ILanguageFeaturesService),L=r(S,w);if(L.length===0)return;if(L.length===1)return L[0].getLegend();if(!v||!b.Range.isIRange(v))return console.warn("provideDocumentRangeSemanticTokensLegend might be out-of-sync with provideDocumentRangeSemanticTokens unless a range argument is passed in"),L[0].getLegend();const D=await u(S,w,b.Range.lift(v),d.CancellationToken.None);if(D)return D.provider.getLegend()}),y.CommandsRegistry.registerCommand("_provideDocumentRangeSemanticTokens",async(C,...f)=>{const[h,v]=f;(0,m.assertType)(h instanceof I.URI),(0,m.assertType)(b.Range.isIRange(v));const w=C.get(E.IModelService).getModel(h);if(!w)return;const{documentRangeSemanticTokensProvider:S}=C.get(p.ILanguageFeaturesService),L=await u(S,w,b.Range.lift(v),d.CancellationToken.None);if(!(!L||!L.tokens))return(0,_.encodeSemanticTokensDto)({id:0,type:"full",data:L.tokens.data})})}),define(ne[28],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IConfigurationService=void 0,e.toValuesTree=k,e.addToValueTree=I,e.removeFromValueTree=E,e.getConfigurationValue=m,e.getLanguageTagSettingPlainKey=_,e.IConfigurationService=(0,d.createDecorator)("configurationService");function k(b,p){const n=Object.create(null);for(const o in b)I(n,o,b[o],p);return n}function I(b,p,n,o){const t=p.split("."),i=t.pop();let s=b;for(let g=0;g"u"?n:i}function _(b){return b.replace(/[\[\]]/g,"")}}),define(ne[388],se([1,0,18,8,22,4,51,24,17,385,28]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getColors=n,e.getColorPresentations=o;async function n(l,a,r,u=!0){return g(new t,l,a,r,u)}function o(l,a,r,u){return Promise.resolve(r.provideColorPresentations(l,a,u))}class t{constructor(){}async compute(a,r,u,C){const f=await a.provideDocumentColors(r,u);if(Array.isArray(f))for(const h of f)C.push({colorInfo:h,provider:a});return Array.isArray(f)}}class i{constructor(){}async compute(a,r,u,C){const f=await a.provideDocumentColors(r,u);if(Array.isArray(f))for(const h of f)C.push({range:h.range,color:[h.color.red,h.color.green,h.color.blue,h.color.alpha]});return Array.isArray(f)}}class s{constructor(a){this.colorInfo=a}async compute(a,r,u,C){const f=await a.provideColorPresentations(r,this.colorInfo,d.CancellationToken.None);return Array.isArray(f)&&C.push(...f),Array.isArray(f)}}async function g(l,a,r,u,C){let f=!1,h;const v=[],w=a.ordered(r);for(let S=w.length-1;S>=0;S--){const L=w[S];if(L instanceof b.DefaultDocumentColorProvider)h=L;else try{await l.compute(L,r,u,v)&&(f=!0)}catch(D){(0,k.onUnexpectedExternalError)(D)}}return f?v:h&&C?(await l.compute(h,r,u,v),v):[]}function c(l,a){const{colorProvider:r}=l.get(_.ILanguageFeaturesService),u=l.get(y.IModelService).getModel(a);if(!u)throw(0,k.illegalArgument)();const C=l.get(p.IConfigurationService).getValue("editor.defaultColorDecorators",{resource:a});return{model:u,colorProviderRegistry:r,isDefaultColorDecoratorsEnabled:C}}m.CommandsRegistry.registerCommand("_executeDocumentColorProvider",function(l,...a){const[r]=a;if(!(r instanceof I.URI))throw(0,k.illegalArgument)();const{model:u,colorProviderRegistry:C,isDefaultColorDecoratorsEnabled:f}=c(l,r);return g(new i,C,u,d.CancellationToken.None,f)}),m.CommandsRegistry.registerCommand("_executeColorPresentationProvider",function(l,...a){const[r,u]=a,{uri:C,range:f}=u;if(!(C instanceof I.URI)||!Array.isArray(r)||r.length!==4||!E.Range.isIRange(f))throw(0,k.illegalArgument)();const{model:h,colorProviderRegistry:v,isDefaultColorDecoratorsEnabled:w}=c(l,C),[S,L,D,T]=r;return g(new s({range:f,color:{red:S,green:L,blue:D,alpha:T}}),v,h,d.CancellationToken.None,w)})}),define(ne[389],se([1,0,2,27,177,344,28]),function(oe,e,d,k,I,E,y){"use strict";var m;Object.defineProperty(e,"__esModule",{value:!0}),e.MonarchTokenizer=void 0;const _=5;class b{static{this._INSTANCE=new b(_)}static create(a,r){return this._INSTANCE.create(a,r)}constructor(a){this._maxCacheDepth=a,this._entries=Object.create(null)}create(a,r){if(a!==null&&a.depth>=this._maxCacheDepth)return new p(a,r);let u=p.getStackElementId(a);u.length>0&&(u+="|"),u+=r;let C=this._entries[u];return C||(C=new p(a,r),this._entries[u]=C,C)}}class p{constructor(a,r){this.parent=a,this.state=r,this.depth=(this.parent?this.parent.depth:0)+1}static getStackElementId(a){let r="";for(;a!==null;)r.length>0&&(r+="|"),r+=a.state,a=a.parent;return r}static _equals(a,r){for(;a!==null&&r!==null;){if(a===r)return!0;if(a.state!==r.state)return!1;a=a.parent,r=r.parent}return a===null&&r===null}equals(a){return p._equals(this,a)}push(a){return b.create(this,a)}pop(){return this.parent}popall(){let a=this;for(;a.parent;)a=a.parent;return a}switchTo(a){return b.create(this.parent,a)}}class n{constructor(a,r){this.languageId=a,this.state=r}equals(a){return this.languageId===a.languageId&&this.state.equals(a.state)}clone(){return this.state.clone()===this.state?this:new n(this.languageId,this.state)}}class o{static{this._INSTANCE=new o(_)}static create(a,r){return this._INSTANCE.create(a,r)}constructor(a){this._maxCacheDepth=a,this._entries=Object.create(null)}create(a,r){if(r!==null)return new t(a,r);if(a!==null&&a.depth>=this._maxCacheDepth)return new t(a,r);const u=p.getStackElementId(a);let C=this._entries[u];return C||(C=new t(a,null),this._entries[u]=C,C)}}class t{constructor(a,r){this.stack=a,this.embeddedLanguageData=r}clone(){return(this.embeddedLanguageData?this.embeddedLanguageData.clone():null)===this.embeddedLanguageData?this:o.create(this.stack,this.embeddedLanguageData)}equals(a){return!(a instanceof t)||!this.stack.equals(a.stack)?!1:this.embeddedLanguageData===null&&a.embeddedLanguageData===null?!0:this.embeddedLanguageData===null||a.embeddedLanguageData===null?!1:this.embeddedLanguageData.equals(a.embeddedLanguageData)}}class i{constructor(){this._tokens=[],this._languageId=null,this._lastTokenType=null,this._lastTokenLanguage=null}enterLanguage(a){this._languageId=a}emit(a,r){this._lastTokenType===r&&this._lastTokenLanguage===this._languageId||(this._lastTokenType=r,this._lastTokenLanguage=this._languageId,this._tokens.push(new k.Token(a,r,this._languageId)))}nestedLanguageTokenize(a,r,u,C){const f=u.languageId,h=u.state,v=k.TokenizationRegistry.get(f);if(!v)return this.enterLanguage(f),this.emit(C,""),h;const w=v.tokenize(a,r,h);if(C!==0)for(const S of w.tokens)this._tokens.push(new k.Token(S.offset+C,S.type,S.language));else this._tokens=this._tokens.concat(w.tokens);return this._lastTokenType=null,this._lastTokenLanguage=null,this._languageId=null,w.endState}finalize(a){return new k.TokenizationResult(this._tokens,a)}}class s{constructor(a,r){this._languageService=a,this._theme=r,this._prependTokens=null,this._tokens=[],this._currentLanguageId=0,this._lastTokenMetadata=0}enterLanguage(a){this._currentLanguageId=this._languageService.languageIdCodec.encodeLanguageId(a)}emit(a,r){const u=this._theme.match(this._currentLanguageId,r)|1024;this._lastTokenMetadata!==u&&(this._lastTokenMetadata=u,this._tokens.push(a),this._tokens.push(u))}static _merge(a,r,u){const C=a!==null?a.length:0,f=r.length,h=u!==null?u.length:0;if(C===0&&f===0&&h===0)return new Uint32Array(0);if(C===0&&f===0)return u;if(f===0&&h===0)return a;const v=new Uint32Array(C+f+h);a!==null&&v.set(a);for(let w=0;w{if(h)return;let w=!1;for(let S=0,L=v.changedLanguages.length;S{v.affectsConfiguration("editor.maxTokenizationLineLength")&&(this._maxTokenizationLineLength=this._configurationService.getValue("editor.maxTokenizationLineLength",{overrideIdentifier:this._languageId}))}))}getLoadStatus(){const a=[];for(const r in this._embeddedLanguages){const u=k.TokenizationRegistry.get(r);if(u){if(u instanceof m){const C=u.getLoadStatus();C.loaded===!1&&a.push(C.promise)}continue}k.TokenizationRegistry.isResolved(r)||a.push(k.TokenizationRegistry.getOrCreate(r))}return a.length===0?{loaded:!0}:{loaded:!1,promise:Promise.all(a).then(r=>{})}}getInitialState(){const a=b.create(null,this._lexer.start);return o.create(a,null)}tokenize(a,r,u){if(a.length>=this._maxTokenizationLineLength)return(0,I.nullTokenize)(this._languageId,u);const C=new i,f=this._tokenize(a,r,u,C);return C.finalize(f)}tokenizeEncoded(a,r,u){if(a.length>=this._maxTokenizationLineLength)return(0,I.nullTokenizeEncoded)(this._languageService.languageIdCodec.encodeLanguageId(this._languageId),u);const C=new s(this._languageService,this._standaloneThemeService.getColorTheme().tokenTheme),f=this._tokenize(a,r,u,C);return C.finalize(f)}_tokenize(a,r,u,C){return u.embeddedLanguageData?this._nestedTokenize(a,r,u,0,C):this._myTokenize(a,r,u,0,C)}_findLeavingNestedLanguageOffset(a,r){let u=this._lexer.tokenizer[r.stack.state];if(!u&&(u=E.findRules(this._lexer,r.stack.state),!u))throw E.createError(this._lexer,"tokenizer state is not defined: "+r.stack.state);let C=-1,f=!1;for(const h of u){if(!E.isIAction(h.action)||h.action.nextEmbedded!=="@pop")continue;f=!0;let v=h.resolveRegex(r.stack.state);const w=v.source;if(w.substr(0,4)==="^(?:"&&w.substr(w.length-1,1)===")"){const L=(v.ignoreCase?"i":"")+(v.unicode?"u":"");v=new RegExp(w.substr(4,w.length-5),L)}const S=a.search(v);S===-1||S!==0&&h.matchOnlyAtLineStart||(C===-1||S0&&f.nestedLanguageTokenize(v,!1,u.embeddedLanguageData,C);const w=a.substring(h);return this._myTokenize(w,r,u,C+h,f)}_safeRuleName(a){return a?a.name:"(unknown)"}_myTokenize(a,r,u,C,f){f.enterLanguage(this._languageId);const h=a.length,v=r&&this._lexer.includeLF?a+` -`:a,w=v.length;let S=u.embeddedLanguageData,L=u.stack,D=0,T=null,M=!0;for(;M||D=w)break;M=!1;let U=this._lexer.tokenizer[O];if(!U&&(U=E.findRules(this._lexer,O),!U))throw E.createError(this._lexer,"tokenizer state is not defined: "+O);const j=v.substr(D);for(const Y of U)if((D===0||!Y.matchOnlyAtLineStart)&&(F=j.match(Y.resolveRegex(O)),F)){x=F[0],W=Y.action;break}}if(F||(F=[""],x=""),W||(D=this._lexer.maxStack)throw E.createError(this._lexer,"maximum tokenizer stack size reached: ["+L.state+","+L.parent.state+",...]");L=L.push(O)}else if(W.next==="@pop"){if(L.depth<=1)throw E.createError(this._lexer,"trying to pop an empty stack in rule: "+this._safeRuleName(V));L=L.pop()}else if(W.next==="@popall")L=L.popall();else{let U=E.substituteMatches(this._lexer,W.next,x,F,O);if(U[0]==="@"&&(U=U.substr(1)),E.findRules(this._lexer,U))L=L.push(U);else throw E.createError(this._lexer,"trying to set a next state '"+U+"' that is undefined in rule: "+this._safeRuleName(V))}}W.log&&typeof W.log=="string"&&E.log(this._lexer,this._lexer.languageId+": "+E.substituteMatches(this._lexer,W.log,x,F,O))}if(H===null)throw E.createError(this._lexer,"lexer rule has no well-defined action in rule: "+this._safeRuleName(V));const z=U=>{const j=this._languageService.getLanguageIdByLanguageName(U)||this._languageService.getLanguageIdByMimeType(U)||U,Y=this._getNestedEmbeddedLanguageData(j);if(D0)throw E.createError(this._lexer,"groups cannot be nested: "+this._safeRuleName(V));if(F.length!==H.length+1)throw E.createError(this._lexer,"matched number of groups does not match the number of actions in rule: "+this._safeRuleName(V));let U=0;for(let j=1;ji});class p{static colorizeElement(s,g,c,l){l=l||{};const a=l.theme||"vs",r=l.mimeType||c.getAttribute("lang")||c.getAttribute("data-lang");if(!r)return console.error("Mode not detected"),Promise.resolve();const u=g.getLanguageIdByMimeType(r)||r;s.setTheme(a);const C=c.firstChild?c.firstChild.nodeValue:"";c.className+=" "+a;const f=h=>{const v=b?.createHTML(h)??h;c.innerHTML=v};return this.colorize(g,C||"",u,l).then(f,h=>console.error(h))}static async colorize(s,g,c,l){const a=s.languageIdCodec;let r=4;l&&typeof l.tabSize=="number"&&(r=l.tabSize),k.startsWithUTF8BOM(g)&&(g=g.substr(1));const u=k.splitLines(g);if(!s.isRegisteredLanguageId(c))return o(u,r,a);const C=await I.TokenizationRegistry.getOrCreate(c);return C?n(u,r,C,a):o(u,r,a)}static colorizeLine(s,g,c,l,a=4){const r=m.ViewLineRenderingData.isBasicASCII(s,g),u=m.ViewLineRenderingData.containsRTL(s,r,c);return(0,y.renderViewLine2)(new y.RenderLineInput(!1,!0,s,!1,r,u,0,l,[],a,0,0,0,0,-1,"none",!1,!1,null)).html}static colorizeModelLine(s,g,c=4){const l=s.getLineContent(g);s.tokenization.forceTokenization(g);const r=s.tokenization.getLineTokens(g).inflate();return this.colorizeLine(l,s.mightContainNonBasicASCII(),s.mightContainRTL(),r,c)}}e.Colorizer=p;function n(i,s,g,c){return new Promise((l,a)=>{const r=()=>{const u=t(i,s,g,c);if(g instanceof _.MonarchTokenizer){const C=g.getLoadStatus();if(C.loaded===!1){C.promise.then(r,a);return}}l(u)};r()})}function o(i,s,g){let c=[];const a=new Uint32Array(2);a[0]=0,a[1]=33587200;for(let r=0,u=i.length;r")}return c.join("")}function t(i,s,g,c){let l=[],a=g.getInitialState();for(let r=0,u=i.length;r"),a=f.endState}return l.join("")}}),define(ne[12],se([1,0,16,11,672,7,3]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IContextKeyService=e.RawContextKey=e.ContextKeyOrExpr=e.ContextKeyAndExpr=e.ContextKeyNotRegexExpr=e.ContextKeyRegexExpr=e.ContextKeySmallerEqualsExpr=e.ContextKeySmallerExpr=e.ContextKeyGreaterEqualsExpr=e.ContextKeyGreaterExpr=e.ContextKeyNotExpr=e.ContextKeyNotEqualsExpr=e.ContextKeyNotInExpr=e.ContextKeyInExpr=e.ContextKeyEqualsExpr=e.ContextKeyDefinedExpr=e.ContextKeyTrueExpr=e.ContextKeyFalseExpr=e.ContextKeyExpr=e.Parser=void 0,e.expressionsAreEqualWithConstantSubstitution=r,e.implies=U;const m=new Map;m.set("false",!1),m.set("true",!0),m.set("isMac",d.isMacintosh),m.set("isLinux",d.isLinux),m.set("isWindows",d.isWindows),m.set("isWeb",d.isWeb),m.set("isMacNative",d.isMacintosh&&!d.isWeb),m.set("isEdge",d.isEdge),m.set("isFirefox",d.isFirefox),m.set("isChrome",d.isChrome),m.set("isSafari",d.isSafari);const _=Object.prototype.hasOwnProperty,b={regexParsingWithErrorRecovery:!0},p=(0,y.localize)(1514,"Empty context key expression"),n=(0,y.localize)(1515,"Did you forget to write an expression? You can also put 'false' or 'true' to always evaluate to false or true, respectively."),o=(0,y.localize)(1516,"'in' after 'not'."),t=(0,y.localize)(1517,"closing parenthesis ')'"),i=(0,y.localize)(1518,"Unexpected token"),s=(0,y.localize)(1519,"Did you forget to put && or || before the token?"),g=(0,y.localize)(1520,"Unexpected end of expression"),c=(0,y.localize)(1521,"Did you forget to put a context key?");class l{static{this._parseError=new Error}constructor(K=b){this._config=K,this._scanner=new I.Scanner,this._tokens=[],this._current=0,this._parsingErrors=[],this._flagsGYRe=/g|y/g}parse(K){if(K===""){this._parsingErrors.push({message:p,offset:0,lexeme:"",additionalInfo:n});return}this._tokens=this._scanner.reset(K).scan(),this._current=0,this._parsingErrors=[];try{const R=this._expr();if(!this._isAtEnd()){const J=this._peek(),ie=J.type===17?s:void 0;throw this._parsingErrors.push({message:i,offset:J.offset,lexeme:I.Scanner.getLexeme(J),additionalInfo:ie}),l._parseError}return R}catch(R){if(R!==l._parseError)throw R;return}}_expr(){return this._or()}_or(){const K=[this._and()];for(;this._matchOne(16);){const R=this._and();K.push(R)}return K.length===1?K[0]:a.or(...K)}_and(){const K=[this._term()];for(;this._matchOne(15);){const R=this._term();K.push(R)}return K.length===1?K[0]:a.and(...K)}_term(){if(this._matchOne(2)){const K=this._peek();switch(K.type){case 11:return this._advance(),C.INSTANCE;case 12:return this._advance(),f.INSTANCE;case 0:{this._advance();const R=this._expr();return this._consume(1,t),R?.negate()}case 17:return this._advance(),D.create(K.lexeme);default:throw this._errExpectedButGot("KEY | true | false | '(' expression ')'",K)}}return this._primary()}_primary(){const K=this._peek();switch(K.type){case 11:return this._advance(),a.true();case 12:return this._advance(),a.false();case 0:{this._advance();const R=this._expr();return this._consume(1,t),R}case 17:{const R=K.lexeme;if(this._advance(),this._matchOne(9)){const ie=this._peek();if(!this._config.regexParsingWithErrorRecovery){if(this._advance(),ie.type!==10)throw this._errExpectedButGot("REGEX",ie);const ue=ie.lexeme,he=ue.lastIndexOf("/"),pe=he===ue.length-1?void 0:this._removeFlagsGY(ue.substring(he+1));let ae;try{ae=new RegExp(ue.substring(1,he),pe)}catch{throw this._errExpectedButGot("REGEX",ie)}return O.create(R,ae)}switch(ie.type){case 10:case 19:{const ue=[ie.lexeme];this._advance();let he=this._peek(),pe=0;for(let X=0;X=0){const ee=ue.slice(pe+1,ae),de=ue[ae+1]==="i"?"i":"";try{he=new RegExp(ee,de)}catch{throw this._errExpectedButGot("REGEX",ie)}}}if(he===null)throw this._errExpectedButGot("REGEX",ie);return O.create(R,he)}default:throw this._errExpectedButGot("REGEX",this._peek())}}if(this._matchOne(14)){this._consume(13,o);const ie=this._value();return a.notIn(R,ie)}switch(this._peek().type){case 3:{this._advance();const ie=this._value();if(this._previous().type===18)return a.equals(R,ie);switch(ie){case"true":return a.has(R);case"false":return a.not(R);default:return a.equals(R,ie)}}case 4:{this._advance();const ie=this._value();if(this._previous().type===18)return a.notEquals(R,ie);switch(ie){case"true":return a.not(R);case"false":return a.has(R);default:return a.notEquals(R,ie)}}case 5:return this._advance(),P.create(R,this._value());case 6:return this._advance(),N.create(R,this._value());case 7:return this._advance(),M.create(R,this._value());case 8:return this._advance(),A.create(R,this._value());case 13:return this._advance(),a.in(R,this._value());default:return a.has(R)}}case 20:throw this._parsingErrors.push({message:g,offset:K.offset,lexeme:"",additionalInfo:c}),l._parseError;default:throw this._errExpectedButGot(`true | false | KEY - | KEY '=~' REGEX - | KEY ('==' | '!=' | '<' | '<=' | '>' | '>=' | 'in' | 'not' 'in') value`,this._peek())}}_value(){const K=this._peek();switch(K.type){case 17:case 18:return this._advance(),K.lexeme;case 11:return this._advance(),"true";case 12:return this._advance(),"false";case 13:return this._advance(),"in";default:return""}}_removeFlagsGY(K){return K.replaceAll(this._flagsGYRe,"")}_previous(){return this._tokens[this._current-1]}_matchOne(K){return this._check(K)?(this._advance(),!0):!1}_advance(){return this._isAtEnd()||this._current++,this._previous()}_consume(K,R){if(this._check(K))return this._advance();throw this._errExpectedButGot(R,this._peek())}_errExpectedButGot(K,R,J){const ie=(0,y.localize)(1522,`Expected: {0} -Received: '{1}'.`,K,I.Scanner.getLexeme(R)),ue=R.offset,he=I.Scanner.getLexeme(R);return this._parsingErrors.push({message:ie,offset:ue,lexeme:he,additionalInfo:J}),l._parseError}_check(K){return this._peek().type===K}_peek(){return this._tokens[this._current]}_isAtEnd(){return this._peek().type===20}}e.Parser=l;class a{static false(){return C.INSTANCE}static true(){return f.INSTANCE}static has(K){return h.create(K)}static equals(K,R){return v.create(K,R)}static notEquals(K,R){return L.create(K,R)}static regex(K,R){return O.create(K,R)}static in(K,R){return w.create(K,R)}static notIn(K,R){return S.create(K,R)}static not(K){return D.create(K)}static and(...K){return W.create(K,null,!0)}static or(...K){return V.create(K,null,!0)}static{this._parser=new l({regexParsingWithErrorRecovery:!1})}static deserialize(K){return K==null?void 0:this._parser.parse(K)}}e.ContextKeyExpr=a;function r(G,K){const R=G?G.substituteConstants():void 0,J=K?K.substituteConstants():void 0;return!R&&!J?!0:!R||!J?!1:R.equals(J)}function u(G,K){return G.cmp(K)}class C{static{this.INSTANCE=new C}constructor(){this.type=0}cmp(K){return this.type-K.type}equals(K){return K.type===this.type}substituteConstants(){return this}evaluate(K){return!1}serialize(){return"false"}keys(){return[]}negate(){return f.INSTANCE}}e.ContextKeyFalseExpr=C;class f{static{this.INSTANCE=new f}constructor(){this.type=1}cmp(K){return this.type-K.type}equals(K){return K.type===this.type}substituteConstants(){return this}evaluate(K){return!0}serialize(){return"true"}keys(){return[]}negate(){return C.INSTANCE}}e.ContextKeyTrueExpr=f;class h{static create(K,R=null){const J=m.get(K);return typeof J=="boolean"?J?f.INSTANCE:C.INSTANCE:new h(K,R)}constructor(K,R){this.key=K,this.negated=R,this.type=2}cmp(K){return K.type!==this.type?this.type-K.type:H(this.key,K.key)}equals(K){return K.type===this.type?this.key===K.key:!1}substituteConstants(){const K=m.get(this.key);return typeof K=="boolean"?K?f.INSTANCE:C.INSTANCE:this}evaluate(K){return!!K.getValue(this.key)}serialize(){return this.key}keys(){return[this.key]}negate(){return this.negated||(this.negated=D.create(this.key,this)),this.negated}}e.ContextKeyDefinedExpr=h;class v{static create(K,R,J=null){if(typeof R=="boolean")return R?h.create(K,J):D.create(K,J);const ie=m.get(K);return typeof ie=="boolean"?R===(ie?"true":"false")?f.INSTANCE:C.INSTANCE:new v(K,R,J)}constructor(K,R,J){this.key=K,this.value=R,this.negated=J,this.type=4}cmp(K){return K.type!==this.type?this.type-K.type:z(this.key,this.value,K.key,K.value)}equals(K){return K.type===this.type?this.key===K.key&&this.value===K.value:!1}substituteConstants(){const K=m.get(this.key);if(typeof K=="boolean"){const R=K?"true":"false";return this.value===R?f.INSTANCE:C.INSTANCE}return this}evaluate(K){return K.getValue(this.key)==this.value}serialize(){return`${this.key} == '${this.value}'`}keys(){return[this.key]}negate(){return this.negated||(this.negated=L.create(this.key,this.value,this)),this.negated}}e.ContextKeyEqualsExpr=v;class w{static create(K,R){return new w(K,R)}constructor(K,R){this.key=K,this.valueKey=R,this.type=10,this.negated=null}cmp(K){return K.type!==this.type?this.type-K.type:z(this.key,this.valueKey,K.key,K.valueKey)}equals(K){return K.type===this.type?this.key===K.key&&this.valueKey===K.valueKey:!1}substituteConstants(){return this}evaluate(K){const R=K.getValue(this.valueKey),J=K.getValue(this.key);return Array.isArray(R)?R.includes(J):typeof J=="string"&&typeof R=="object"&&R!==null?_.call(R,J):!1}serialize(){return`${this.key} in '${this.valueKey}'`}keys(){return[this.key,this.valueKey]}negate(){return this.negated||(this.negated=S.create(this.key,this.valueKey)),this.negated}}e.ContextKeyInExpr=w;class S{static create(K,R){return new S(K,R)}constructor(K,R){this.key=K,this.valueKey=R,this.type=11,this._negated=w.create(K,R)}cmp(K){return K.type!==this.type?this.type-K.type:this._negated.cmp(K._negated)}equals(K){return K.type===this.type?this._negated.equals(K._negated):!1}substituteConstants(){return this}evaluate(K){return!this._negated.evaluate(K)}serialize(){return`${this.key} not in '${this.valueKey}'`}keys(){return this._negated.keys()}negate(){return this._negated}}e.ContextKeyNotInExpr=S;class L{static create(K,R,J=null){if(typeof R=="boolean")return R?D.create(K,J):h.create(K,J);const ie=m.get(K);return typeof ie=="boolean"?R===(ie?"true":"false")?C.INSTANCE:f.INSTANCE:new L(K,R,J)}constructor(K,R,J){this.key=K,this.value=R,this.negated=J,this.type=5}cmp(K){return K.type!==this.type?this.type-K.type:z(this.key,this.value,K.key,K.value)}equals(K){return K.type===this.type?this.key===K.key&&this.value===K.value:!1}substituteConstants(){const K=m.get(this.key);if(typeof K=="boolean"){const R=K?"true":"false";return this.value===R?C.INSTANCE:f.INSTANCE}return this}evaluate(K){return K.getValue(this.key)!=this.value}serialize(){return`${this.key} != '${this.value}'`}keys(){return[this.key]}negate(){return this.negated||(this.negated=v.create(this.key,this.value,this)),this.negated}}e.ContextKeyNotEqualsExpr=L;class D{static create(K,R=null){const J=m.get(K);return typeof J=="boolean"?J?C.INSTANCE:f.INSTANCE:new D(K,R)}constructor(K,R){this.key=K,this.negated=R,this.type=3}cmp(K){return K.type!==this.type?this.type-K.type:H(this.key,K.key)}equals(K){return K.type===this.type?this.key===K.key:!1}substituteConstants(){const K=m.get(this.key);return typeof K=="boolean"?K?C.INSTANCE:f.INSTANCE:this}evaluate(K){return!K.getValue(this.key)}serialize(){return`!${this.key}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=h.create(this.key,this)),this.negated}}e.ContextKeyNotExpr=D;function T(G,K){if(typeof G=="string"){const R=parseFloat(G);isNaN(R)||(G=R)}return typeof G=="string"||typeof G=="number"?K(G):C.INSTANCE}class M{static create(K,R,J=null){return T(R,ie=>new M(K,ie,J))}constructor(K,R,J){this.key=K,this.value=R,this.negated=J,this.type=12}cmp(K){return K.type!==this.type?this.type-K.type:z(this.key,this.value,K.key,K.value)}equals(K){return K.type===this.type?this.key===K.key&&this.value===K.value:!1}substituteConstants(){return this}evaluate(K){return typeof this.value=="string"?!1:parseFloat(K.getValue(this.key))>this.value}serialize(){return`${this.key} > ${this.value}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=N.create(this.key,this.value,this)),this.negated}}e.ContextKeyGreaterExpr=M;class A{static create(K,R,J=null){return T(R,ie=>new A(K,ie,J))}constructor(K,R,J){this.key=K,this.value=R,this.negated=J,this.type=13}cmp(K){return K.type!==this.type?this.type-K.type:z(this.key,this.value,K.key,K.value)}equals(K){return K.type===this.type?this.key===K.key&&this.value===K.value:!1}substituteConstants(){return this}evaluate(K){return typeof this.value=="string"?!1:parseFloat(K.getValue(this.key))>=this.value}serialize(){return`${this.key} >= ${this.value}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=P.create(this.key,this.value,this)),this.negated}}e.ContextKeyGreaterEqualsExpr=A;class P{static create(K,R,J=null){return T(R,ie=>new P(K,ie,J))}constructor(K,R,J){this.key=K,this.value=R,this.negated=J,this.type=14}cmp(K){return K.type!==this.type?this.type-K.type:z(this.key,this.value,K.key,K.value)}equals(K){return K.type===this.type?this.key===K.key&&this.value===K.value:!1}substituteConstants(){return this}evaluate(K){return typeof this.value=="string"?!1:parseFloat(K.getValue(this.key))new N(K,ie,J))}constructor(K,R,J){this.key=K,this.value=R,this.negated=J,this.type=15}cmp(K){return K.type!==this.type?this.type-K.type:z(this.key,this.value,K.key,K.value)}equals(K){return K.type===this.type?this.key===K.key&&this.value===K.value:!1}substituteConstants(){return this}evaluate(K){return typeof this.value=="string"?!1:parseFloat(K.getValue(this.key))<=this.value}serialize(){return`${this.key} <= ${this.value}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=M.create(this.key,this.value,this)),this.negated}}e.ContextKeySmallerEqualsExpr=N;class O{static create(K,R){return new O(K,R)}constructor(K,R){this.key=K,this.regexp=R,this.type=7,this.negated=null}cmp(K){if(K.type!==this.type)return this.type-K.type;if(this.keyK.key)return 1;const R=this.regexp?this.regexp.source:"",J=K.regexp?K.regexp.source:"";return RJ?1:0}equals(K){if(K.type===this.type){const R=this.regexp?this.regexp.source:"",J=K.regexp?K.regexp.source:"";return this.key===K.key&&R===J}return!1}substituteConstants(){return this}evaluate(K){const R=K.getValue(this.key);return this.regexp?this.regexp.test(R):!1}serialize(){const K=this.regexp?`/${this.regexp.source}/${this.regexp.flags}`:"/invalid/";return`${this.key} =~ ${K}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=F.create(this)),this.negated}}e.ContextKeyRegexExpr=O;class F{static create(K){return new F(K)}constructor(K){this._actual=K,this.type=8}cmp(K){return K.type!==this.type?this.type-K.type:this._actual.cmp(K._actual)}equals(K){return K.type===this.type?this._actual.equals(K._actual):!1}substituteConstants(){return this}evaluate(K){return!this._actual.evaluate(K)}serialize(){return`!(${this._actual.serialize()})`}keys(){return this._actual.keys()}negate(){return this._actual}}e.ContextKeyNotRegexExpr=F;function x(G){let K=null;for(let R=0,J=G.length;RK.expr.length)return 1;for(let R=0,J=this.expr.length;R1;){const he=ie[ie.length-1];if(he.type!==9)break;ie.pop();const pe=ie.pop(),ae=ie.length===0,ee=V.create(he.expr.map(de=>W.create([de,pe],null,J)),null,ae);ee&&(ie.push(ee),ie.sort(u))}if(ie.length===1)return ie[0];if(J){for(let he=0;heK.serialize()).join(" && ")}keys(){const K=[];for(const R of this.expr)K.push(...R.keys());return K}negate(){if(!this.negated){const K=[];for(const R of this.expr)K.push(R.negate());this.negated=V.create(K,this,!0)}return this.negated}}e.ContextKeyAndExpr=W;class V{static create(K,R,J){return V._normalizeArr(K,R,J)}constructor(K,R){this.expr=K,this.negated=R,this.type=9}cmp(K){if(K.type!==this.type)return this.type-K.type;if(this.expr.lengthK.expr.length)return 1;for(let R=0,J=this.expr.length;RK.serialize()).join(" || ")}keys(){const K=[];for(const R of this.expr)K.push(...R.keys());return K}negate(){if(!this.negated){const K=[];for(const R of this.expr)K.push(R.negate());for(;K.length>1;){const R=K.shift(),J=K.shift(),ie=[];for(const ue of Y(R))for(const he of Y(J))ie.push(W.create([ue,he],null,!1));K.unshift(V.create(ie,null,!1))}this.negated=V.create(K,this,!0)}return this.negated}}e.ContextKeyOrExpr=V;class q extends h{static{this._info=[]}static all(){return q._info.values()}constructor(K,R,J){super(K,null),this._defaultValue=R,typeof J=="object"?q._info.push({...J,key:K}):J!==!0&&q._info.push({key:K,description:J,type:R!=null?typeof R:void 0})}bindTo(K){return K.createKey(this.key,this._defaultValue)}getValue(K){return K.getContextKeyValue(this.key)}toNegated(){return this.negate()}isEqualTo(K){return v.create(this.key,K)}}e.RawContextKey=q,e.IContextKeyService=(0,E.createDecorator)("contextKeyService");function H(G,K){return GK?1:0}function z(G,K,R,J){return GR?1:KJ?1:0}function U(G,K){if(G.type===0||K.type===1)return!0;if(G.type===9)return K.type===9?j(G.expr,K.expr):!1;if(K.type===9){for(const R of K.expr)if(U(G,R))return!0;return!1}if(G.type===6){if(K.type===6)return j(K.expr,G.expr);for(const R of G.expr)if(U(R,K))return!0;return!1}return G.equals(K)}function j(G,K){let R=0,J=0;for(;R{const i=this.model.read(o)?.state.read(o),s=!!i?.inlineCompletion&&i?.primaryGhostText!==void 0&&!i?.primaryGhostText.isEmpty();this.inlineCompletionVisible.set(s),i?.primaryGhostText&&i?.inlineCompletion&&this.suppressSuggestions.set(i.inlineCompletion.inlineCompletion.source.inlineCompletions.suppressSuggestions)})),this._register((0,d.autorun)(o=>{const t=this.model.read(o);let i=!1,s=!0;const g=t?.primaryGhostText.read(o);if(t?.selectedSuggestItem&&g&&g.parts.length>0){const{column:c,lines:l}=g.parts[0],a=l[0],r=t.textModel.getLineIndentColumn(g.lineNumber);if(c<=r){let C=(0,k.firstNonWhitespaceIndex)(a);C===-1&&(C=a.length-1),i=C>0;const f=t.textModel.getOptions().tabSize;s=I.CursorColumns.visibleColumnFromColumn(a,C+1,f){const[s,g,c]=i;(0,I.assertType)(E.URI.isUri(s)),(0,I.assertType)(y.Position.isIPosition(g)),(0,I.assertType)(typeof c=="string"||!c);const l=t.get(_.ILanguageFeaturesService),a=await t.get(b.ITextModelService).createModelReference(s);try{const r=await o(l.signatureHelpProvider,a.object.textEditorModel,y.Position.lift(g),{triggerKind:m.SignatureHelpTriggerKind.Invoke,isRetrigger:!1,triggerCharacter:c},d.CancellationToken.None);return r?(setTimeout(()=>r.dispose(),0),r.value):void 0}finally{a.dispose()}})}),define(ne[683],se([1,0,14,8,6,2,144,27,270]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ParameterHintsModel=void 0;var b;(function(o){o.Default={type:0};class t{constructor(g,c){this.request=g,this.previouslyActiveHints=c,this.type=2}}o.Pending=t;class i{constructor(g){this.hints=g,this.type=1}}o.Active=i})(b||(b={}));class p extends E.Disposable{static{this.DEFAULT_DELAY=120}constructor(t,i,s=p.DEFAULT_DELAY){super(),this._onChangedHints=this._register(new I.Emitter),this.onChangedHints=this._onChangedHints.event,this.triggerOnType=!1,this._state=b.Default,this._pendingTriggers=[],this._lastSignatureHelpResult=this._register(new E.MutableDisposable),this.triggerChars=new y.CharacterSet,this.retriggerChars=new y.CharacterSet,this.triggerId=0,this.editor=t,this.providers=i,this.throttledDelayer=new d.Delayer(s),this._register(this.editor.onDidBlurEditorWidget(()=>this.cancel())),this._register(this.editor.onDidChangeConfiguration(()=>this.onEditorConfigurationChange())),this._register(this.editor.onDidChangeModel(g=>this.onModelChanged())),this._register(this.editor.onDidChangeModelLanguage(g=>this.onModelChanged())),this._register(this.editor.onDidChangeCursorSelection(g=>this.onCursorChange(g))),this._register(this.editor.onDidChangeModelContent(g=>this.onModelContentChange())),this._register(this.providers.onDidChange(this.onModelChanged,this)),this._register(this.editor.onDidType(g=>this.onDidType(g))),this.onEditorConfigurationChange(),this.onModelChanged()}get state(){return this._state}set state(t){this._state.type===2&&this._state.request.cancel(),this._state=t}cancel(t=!1){this.state=b.Default,this.throttledDelayer.cancel(),t||this._onChangedHints.fire(void 0)}trigger(t,i){const s=this.editor.getModel();if(!s||!this.providers.has(s))return;const g=++this.triggerId;this._pendingTriggers.push(t),this.throttledDelayer.trigger(()=>this.doTrigger(g),i).catch(k.onUnexpectedError)}next(){if(this.state.type!==1)return;const t=this.state.hints.signatures.length,i=this.state.hints.activeSignature,s=i%t===t-1,g=this.editor.getOption(86).cycle;if((t<2||s)&&!g){this.cancel();return}this.updateActiveSignature(s&&g?0:i+1)}previous(){if(this.state.type!==1)return;const t=this.state.hints.signatures.length,i=this.state.hints.activeSignature,s=i===0,g=this.editor.getOption(86).cycle;if((t<2||s)&&!g){this.cancel();return}this.updateActiveSignature(s&&g?t-1:i-1)}updateActiveSignature(t){this.state.type===1&&(this.state=new b.Active({...this.state.hints,activeSignature:t}),this._onChangedHints.fire(this.state.hints))}async doTrigger(t){const i=this.state.type===1||this.state.type===2,s=this.getLastActiveHints();if(this.cancel(!0),this._pendingTriggers.length===0)return!1;const g=this._pendingTriggers.reduce(n);this._pendingTriggers=[];const c={triggerKind:g.triggerKind,triggerCharacter:g.triggerCharacter,isRetrigger:i,activeSignatureHelp:s};if(!this.editor.hasModel())return!1;const l=this.editor.getModel(),a=this.editor.getPosition();this.state=new b.Pending((0,d.createCancelablePromise)(r=>(0,_.provideSignatureHelp)(this.providers,l,a,c,r)),s);try{const r=await this.state.request;return t!==this.triggerId?(r?.dispose(),!1):!r||!r.value.signatures||r.value.signatures.length===0?(r?.dispose(),this._lastSignatureHelpResult.clear(),this.cancel(),!1):(this.state=new b.Active(r.value),this._lastSignatureHelpResult.value=r,this._onChangedHints.fire(this.state.hints),!0)}catch(r){return t===this.triggerId&&(this.state=b.Default),(0,k.onUnexpectedError)(r),!1}}getLastActiveHints(){switch(this.state.type){case 1:return this.state.hints;case 2:return this.state.previouslyActiveHints;default:return}}get isTriggered(){return this.state.type===1||this.state.type===2||this.throttledDelayer.isTriggered()}onModelChanged(){this.cancel(),this.triggerChars.clear(),this.retriggerChars.clear();const t=this.editor.getModel();if(t)for(const i of this.providers.ordered(t)){for(const s of i.signatureHelpTriggerCharacters||[])if(s.length){const g=s.charCodeAt(0);this.triggerChars.add(g),this.retriggerChars.add(g)}for(const s of i.signatureHelpRetriggerCharacters||[])s.length&&this.retriggerChars.add(s.charCodeAt(0))}}onDidType(t){if(!this.triggerOnType)return;const i=t.length-1,s=t.charCodeAt(i);(this.triggerChars.has(s)||this.isTriggered&&this.retriggerChars.has(s))&&this.trigger({triggerKind:m.SignatureHelpTriggerKind.TriggerCharacter,triggerCharacter:t.charAt(i)})}onCursorChange(t){t.source==="mouse"?this.cancel():this.isTriggered&&this.trigger({triggerKind:m.SignatureHelpTriggerKind.ContentChange})}onModelContentChange(){this.isTriggered&&this.trigger({triggerKind:m.SignatureHelpTriggerKind.ContentChange})}onEditorConfigurationChange(){this.triggerOnType=this.editor.getOption(86).enabled,this.triggerOnType||this.cancel()}dispose(){this.cancel(!0),super.dispose()}}e.ParameterHintsModel=p;function n(o,t){switch(t.triggerKind){case m.SignatureHelpTriggerKind.Invoke:return t;case m.SignatureHelpTriggerKind.ContentChange:return o;case m.SignatureHelpTriggerKind.TriggerCharacter:default:return t}}}),define(ne[684],se([1,0,12]),function(oe,e,d){"use strict";var k;Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestAlternatives=void 0;let I=class{static{k=this}static{this.OtherSuggestions=new d.RawContextKey("hasOtherSuggestions",!1)}constructor(y,m){this._editor=y,this._index=0,this._ckOtherSuggestions=k.OtherSuggestions.bindTo(m)}dispose(){this.reset()}reset(){this._ckOtherSuggestions.reset(),this._listener?.dispose(),this._model=void 0,this._acceptNext=void 0,this._ignore=!1}set({model:y,index:m},_){if(y.items.length===0){this.reset();return}if(k._moveIndex(!0,y,m)===m){this.reset();return}this._acceptNext=_,this._model=y,this._index=m,this._listener=this._editor.onDidChangeCursorPosition(()=>{this._ignore||this.reset()}),this._ckOtherSuggestions.set(!0)}static _moveIndex(y,m,_){let b=_;for(let p=m.items.length;p>0&&(b=(b+m.items.length+(y?1:-1))%m.items.length,!(b===_||!m.items[b].completion.additionalTextEdits));p--);return b}next(){this._move(!0)}prev(){this._move(!1)}_move(y){if(this._model)try{this._ignore=!0,this._index=k._moveIndex(y,this._model,this._index),this._acceptNext({index:this._index,item:this._model.items[this._index],model:this._model})}finally{this._ignore=!1}}};e.SuggestAlternatives=I,e.SuggestAlternatives=I=k=ke([ce(1,d.IContextKeyService)],I)}),define(ne[685],se([1,0,12]),function(oe,e,d){"use strict";var k;Object.defineProperty(e,"__esModule",{value:!0}),e.WordContextKey=void 0;let I=class{static{k=this}static{this.AtEnd=new d.RawContextKey("atEndOfWord",!1)}constructor(y,m){this._editor=y,this._enabled=!1,this._ckAtEnd=k.AtEnd.bindTo(m),this._configListener=this._editor.onDidChangeConfiguration(_=>_.hasChanged(124)&&this._update()),this._update()}dispose(){this._configListener.dispose(),this._selectionListener?.dispose(),this._ckAtEnd.reset()}_update(){const y=this._editor.getOption(124)==="on";if(this._enabled!==y)if(this._enabled=y,this._enabled){const m=()=>{if(!this._editor.hasModel()){this._ckAtEnd.set(!1);return}const _=this._editor.getModel(),b=this._editor.getSelection(),p=_.getWordAtPosition(b.getStartPosition());if(!p){this._ckAtEnd.set(!1);return}this._ckAtEnd.set(p.endColumn===b.getStartPosition().column)};this._selectionListener=this._editor.onDidChangeCursorSelection(m),m()}else this._selectionListener&&(this._ckAtEnd.reset(),this._selectionListener.dispose(),this._selectionListener=void 0)}};e.WordContextKey=I,e.WordContextKey=I=k=ke([ce(1,d.IContextKeyService)],I)}),define(ne[61],se([1,0,12,7]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CONTEXT_ACCESSIBILITY_MODE_ENABLED=e.IAccessibilityService=void 0,e.IAccessibilityService=(0,k.createDecorator)("accessibilityService"),e.CONTEXT_ACCESSIBILITY_MODE_ENABLED=new d.RawContextKey("accessibilityModeEnabled",!1)}),define(ne[686],se([1,0,64,13,6,2,60,16,362,366,546,229,37,165,261,61,5,253]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ComputedEditorOptions=e.EditorConfiguration=void 0;let l=class extends E.Disposable{constructor(w,S,L,D,T){super(),this._accessibilityService=T,this._onDidChange=this._register(new I.Emitter),this.onDidChange=this._onDidChange.event,this._onDidChangeFast=this._register(new I.Emitter),this.onDidChangeFast=this._onDidChangeFast.event,this._isDominatedByLongLines=!1,this._viewLineCount=1,this._lineNumbersDigitCount=1,this._reservedHeight=0,this._glyphMarginDecorationLaneCount=1,this._computeOptionsMemory=new o.ComputeOptionsMemory,this.isSimpleWidget=w,this.contextMenuId=S,this._containerObserver=this._register(new _.ElementSizeObserver(D,L.dimension)),this._targetWindowId=(0,g.getWindow)(D).vscodeWindowId,this._rawOptions=h(L),this._validatedOptions=f.validateOptions(this._rawOptions),this.options=this._computeOptions(),this.options.get(13)&&this._containerObserver.startObserving(),this._register(t.EditorZoom.onDidChangeZoomLevel(()=>this._recomputeOptions())),this._register(n.TabFocus.onDidChangeTabFocus(()=>this._recomputeOptions())),this._register(this._containerObserver.onDidChange(()=>this._recomputeOptions())),this._register(b.FontMeasurements.onDidChange(()=>this._recomputeOptions())),this._register(c.PixelRatio.getInstance((0,g.getWindow)(D)).onDidChange(()=>this._recomputeOptions())),this._register(this._accessibilityService.onDidChangeScreenReaderOptimized(()=>this._recomputeOptions()))}_recomputeOptions(){const w=this._computeOptions(),S=f.checkEquals(this.options,w);S!==null&&(this.options=w,this._onDidChangeFast.fire(S),this._onDidChange.fire(S))}_computeOptions(){const w=this._readEnvConfiguration(),S=i.BareFontInfo.createFromValidatedSettings(this._validatedOptions,w.pixelRatio,this.isSimpleWidget),L=this._readFontInfo(S),D={memory:this._computeOptionsMemory,outerWidth:w.outerWidth,outerHeight:w.outerHeight-this._reservedHeight,fontInfo:L,extraEditorClassName:w.extraEditorClassName,isDominatedByLongLines:this._isDominatedByLongLines,viewLineCount:this._viewLineCount,lineNumbersDigitCount:this._lineNumbersDigitCount,emptySelectionClipboard:w.emptySelectionClipboard,pixelRatio:w.pixelRatio,tabFocusMode:n.TabFocus.getTabFocusMode(),accessibilitySupport:w.accessibilitySupport,glyphMarginDecorationLaneCount:this._glyphMarginDecorationLaneCount};return f.computeOptions(this._validatedOptions,D)}_readEnvConfiguration(){return{extraEditorClassName:r(),outerWidth:this._containerObserver.getWidth(),outerHeight:this._containerObserver.getHeight(),emptySelectionClipboard:d.isWebKit||d.isFirefox,pixelRatio:c.PixelRatio.getInstance((0,g.getWindowById)(this._targetWindowId,!0).window).value,accessibilitySupport:this._accessibilityService.isScreenReaderOptimized()?2:this._accessibilityService.getAccessibilitySupport()}}_readFontInfo(w){return b.FontMeasurements.readFontInfo((0,g.getWindowById)(this._targetWindowId,!0).window,w)}getRawOptions(){return this._rawOptions}updateOptions(w){const S=h(w);f.applyUpdate(this._rawOptions,S)&&(this._validatedOptions=f.validateOptions(this._rawOptions),this._recomputeOptions())}observeContainer(w){this._containerObserver.observe(w)}setIsDominatedByLongLines(w){this._isDominatedByLongLines!==w&&(this._isDominatedByLongLines=w,this._recomputeOptions())}setModelLineCount(w){const S=a(w);this._lineNumbersDigitCount!==S&&(this._lineNumbersDigitCount=S,this._recomputeOptions())}setViewLineCount(w){this._viewLineCount!==w&&(this._viewLineCount=w,this._recomputeOptions())}setReservedHeight(w){this._reservedHeight!==w&&(this._reservedHeight=w,this._recomputeOptions())}setGlyphMarginDecorationLaneCount(w){this._glyphMarginDecorationLaneCount!==w&&(this._glyphMarginDecorationLaneCount=w,this._recomputeOptions())}};e.EditorConfiguration=l,e.EditorConfiguration=l=ke([ce(4,s.IAccessibilityService)],l);function a(v){let w=0;for(;v;)v=Math.floor(v/10),w++;return w||1}function r(){let v="";return!d.isSafari&&!d.isWebkitWebView&&(v+="no-user-select "),d.isSafari&&(v+="no-minimap-shadow ",v+="enable-user-select "),m.isMacintosh&&(v+="mac "),v}class u{constructor(){this._values=[]}_read(w){return this._values[w]}get(w){return this._values[w]}_write(w,S){this._values[w]=S}}class C{constructor(){this._values=[]}_read(w){if(w>=this._values.length)throw new Error("Cannot read uninitialized value");return this._values[w]}get(w){return this._read(w)}_write(w,S){this._values[w]=S}}e.ComputedEditorOptions=C;class f{static validateOptions(w){const S=new u;for(const L of o.editorOptionsRegistry){const D=L.name==="_never_"?void 0:w[L.name];S._write(L.id,L.validate(D))}return S}static computeOptions(w,S){const L=new C;for(const D of o.editorOptionsRegistry)L._write(D.id,D.compute(S,L,w._read(D.id)));return L}static _deepEquals(w,S){if(typeof w!="object"||typeof S!="object"||!w||!S)return w===S;if(Array.isArray(w)||Array.isArray(S))return Array.isArray(w)&&Array.isArray(S)?k.equals(w,S):!1;if(Object.keys(w).length!==Object.keys(S).length)return!1;for(const L in w)if(!f._deepEquals(w[L],S[L]))return!1;return!0}static checkEquals(w,S){const L=[];let D=!1;for(const T of o.editorOptionsRegistry){const M=!f._deepEquals(w._read(T.id),S._read(T.id));L[T.id]=M,M&&(D=!0)}return D?new o.ConfigurationChangedEvent(L):null}static applyUpdate(w,S){let L=!1;for(const D of o.editorOptionsRegistry)if(S.hasOwnProperty(D.name)){const T=D.applyUpdate(w[D.name],S[D.name]);w[D.name]=T.newValue,L=L||T.didChange}return L}}function h(v){const w=y.deepClone(v);return(0,p.migrateOptions)(w),w}}),define(ne[687],se([1,0,6,53,2,60,225,22,3,24,28,12]),function(oe,e,d,k,I,E,y,m,_,b,p,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextKeyService=e.AbstractContextKeyService=e.Context=void 0,e.setContext=v;const o="data-keybinding-context";class t{constructor(L,D){this._id=L,this._parent=D,this._value=Object.create(null),this._value._contextId=L}get value(){return{...this._value}}setValue(L,D){return this._value[L]!==D?(this._value[L]=D,!0):!1}removeValue(L){return L in this._value?(delete this._value[L],!0):!1}getValue(L){const D=this._value[L];return typeof D>"u"&&this._parent?this._parent.getValue(L):D}}e.Context=t;class i extends t{static{this.INSTANCE=new i}constructor(){super(-1,null)}setValue(L,D){return!1}removeValue(L){return!1}getValue(L){}}class s extends t{static{this._keyPrefix="config."}constructor(L,D,T){super(L,null),this._configurationService=D,this._values=y.TernarySearchTree.forConfigKeys(),this._listener=this._configurationService.onDidChangeConfiguration(M=>{if(M.source===7){const A=Array.from(this._values,([P])=>P);this._values.clear(),T.fire(new l(A))}else{const A=[];for(const P of M.affectedKeys){const N=`config.${P}`,O=this._values.findSuperstr(N);O!==void 0&&(A.push(...k.Iterable.map(O,([F])=>F)),this._values.deleteSuperstr(N)),this._values.has(N)&&(A.push(N),this._values.delete(N))}T.fire(new l(A))}})}dispose(){this._listener.dispose()}getValue(L){if(L.indexOf(s._keyPrefix)!==0)return super.getValue(L);if(this._values.has(L))return this._values.get(L);const D=L.substr(s._keyPrefix.length),T=this._configurationService.getValue(D);let M;switch(typeof T){case"number":case"boolean":case"string":M=T;break;default:Array.isArray(T)?M=JSON.stringify(T):M=T}return this._values.set(L,M),M}setValue(L,D){return super.setValue(L,D)}removeValue(L){return super.removeValue(L)}}class g{constructor(L,D,T){this._service=L,this._key=D,this._defaultValue=T,this.reset()}set(L){this._service.setContext(this._key,L)}reset(){typeof this._defaultValue>"u"?this._service.removeContext(this._key):this._service.setContext(this._key,this._defaultValue)}get(){return this._service.getContextKeyValue(this._key)}}class c{constructor(L){this.key=L}affectsSome(L){return L.has(this.key)}allKeysContainedIn(L){return this.affectsSome(L)}}class l{constructor(L){this.keys=L}affectsSome(L){for(const D of this.keys)if(L.has(D))return!0;return!1}allKeysContainedIn(L){return this.keys.every(D=>L.has(D))}}class a{constructor(L){this.events=L}affectsSome(L){for(const D of this.events)if(D.affectsSome(L))return!0;return!1}allKeysContainedIn(L){return this.events.every(D=>D.allKeysContainedIn(L))}}function r(S,L){return S.allKeysContainedIn(new Set(Object.keys(L)))}class u extends I.Disposable{constructor(L){super(),this._onDidChangeContext=this._register(new d.PauseableEmitter({merge:D=>new a(D)})),this.onDidChangeContext=this._onDidChangeContext.event,this._isDisposed=!1,this._myContextId=L}createKey(L,D){if(this._isDisposed)throw new Error("AbstractContextKeyService has been disposed");return new g(this,L,D)}bufferChangeEvents(L){this._onDidChangeContext.pause();try{L()}finally{this._onDidChangeContext.resume()}}createScoped(L){if(this._isDisposed)throw new Error("AbstractContextKeyService has been disposed");return new f(this,L)}contextMatchesRules(L){if(this._isDisposed)throw new Error("AbstractContextKeyService has been disposed");const D=this.getContextValuesContainer(this._myContextId);return L?L.evaluate(D):!0}getContextKeyValue(L){if(!this._isDisposed)return this.getContextValuesContainer(this._myContextId).getValue(L)}setContext(L,D){if(this._isDisposed)return;const T=this.getContextValuesContainer(this._myContextId);T&&T.setValue(L,D)&&this._onDidChangeContext.fire(new c(L))}removeContext(L){this._isDisposed||this.getContextValuesContainer(this._myContextId).removeValue(L)&&this._onDidChangeContext.fire(new c(L))}getContext(L){return this._isDisposed?i.INSTANCE:this.getContextValuesContainer(h(L))}dispose(){super.dispose(),this._isDisposed=!0}}e.AbstractContextKeyService=u;let C=class extends u{constructor(L){super(0),this._contexts=new Map,this._lastContextId=0;const D=this._register(new s(this._myContextId,L,this._onDidChangeContext));this._contexts.set(this._myContextId,D)}getContextValuesContainer(L){return this._isDisposed?i.INSTANCE:this._contexts.get(L)||i.INSTANCE}createChildContext(L=this._myContextId){if(this._isDisposed)throw new Error("ContextKeyService has been disposed");const D=++this._lastContextId;return this._contexts.set(D,new t(D,this.getContextValuesContainer(L))),D}disposeContext(L){this._isDisposed||this._contexts.delete(L)}};e.ContextKeyService=C,e.ContextKeyService=C=ke([ce(0,p.IConfigurationService)],C);class f extends u{constructor(L,D){if(super(L.createChildContext()),this._parentChangeListener=this._register(new I.MutableDisposable),this._parent=L,this._updateParentChangeListener(),this._domNode=D,this._domNode.hasAttribute(o)){let T="";this._domNode.classList&&(T=Array.from(this._domNode.classList.values()).join(", ")),console.error(`Element already has context attribute${T?": "+T:""}`)}this._domNode.setAttribute(o,String(this._myContextId))}_updateParentChangeListener(){this._parentChangeListener.value=this._parent.onDidChangeContext(L=>{const T=this._parent.getContextValuesContainer(this._myContextId).value;r(L,T)||this._onDidChangeContext.fire(L)})}dispose(){this._isDisposed||(this._parent.disposeContext(this._myContextId),this._domNode.removeAttribute(o),super.dispose())}getContextValuesContainer(L){return this._isDisposed?i.INSTANCE:this._parent.getContextValuesContainer(L)}createChildContext(L=this._myContextId){if(this._isDisposed)throw new Error("ScopedContextKeyService has been disposed");return this._parent.createChildContext(L)}disposeContext(L){this._isDisposed||this._parent.disposeContext(L)}}function h(S){for(;S;){if(S.hasAttribute(o)){const L=S.getAttribute(o);return L?parseInt(L,10):NaN}S=S.parentElement}return 0}function v(S,L,D){S.get(n.IContextKeyService).createKey(String(L),w(D))}function w(S){return(0,E.cloneAndChange)(S,L=>{if(typeof L=="object"&&L.$mid===1)return m.URI.revive(L).toString();if(L instanceof m.URI)return L.toString()})}b.CommandsRegistry.registerCommand("_setContext",v),b.CommandsRegistry.registerCommand({id:"getContextKeyInfo",handler(){return[...n.RawContextKey.all()].sort((S,L)=>S.key.localeCompare(L.key))},metadata:{description:(0,_.localize)(1513,"A command that returns information about context keys"),args:[]}}),b.CommandsRegistry.registerCommand("_generateContextKeyInfo",function(){const S=[],L=new Set;for(const D of n.RawContextKey.all())L.has(D.key)||(L.add(D.key),S.push(D));S.sort((D,T)=>D.key.localeCompare(T.key)),console.log(JSON.stringify(S,void 0,2))})}),define(ne[179],se([1,0,16,3,12]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InputFocusedContext=e.InputFocusedContextKey=e.ProductQualityContext=e.IsDevelopmentContext=e.IsMobileContext=e.IsIOSContext=e.IsMacNativeContext=e.IsWebContext=e.IsWindowsContext=e.IsLinuxContext=e.IsMacContext=void 0,e.IsMacContext=new I.RawContextKey("isMac",d.isMacintosh,(0,k.localize)(1523,"Whether the operating system is macOS")),e.IsLinuxContext=new I.RawContextKey("isLinux",d.isLinux,(0,k.localize)(1524,"Whether the operating system is Linux")),e.IsWindowsContext=new I.RawContextKey("isWindows",d.isWindows,(0,k.localize)(1525,"Whether the operating system is Windows")),e.IsWebContext=new I.RawContextKey("isWeb",d.isWeb,(0,k.localize)(1526,"Whether the platform is a web browser")),e.IsMacNativeContext=new I.RawContextKey("isMacNative",d.isMacintosh&&!d.isWeb,(0,k.localize)(1527,"Whether the operating system is macOS on a non-browser platform")),e.IsIOSContext=new I.RawContextKey("isIOS",d.isIOS,(0,k.localize)(1528,"Whether the operating system is iOS")),e.IsMobileContext=new I.RawContextKey("isMobile",d.isMobile,(0,k.localize)(1529,"Whether the platform is a mobile web browser")),e.IsDevelopmentContext=new I.RawContextKey("isDevelopment",!1,!0),e.ProductQualityContext=new I.RawContextKey("productQualityType","",(0,k.localize)(1530,"Quality type of VS Code")),e.InputFocusedContextKey="inputFocus",e.InputFocusedContext=new I.RawContextKey(e.InputFocusedContextKey,!1,(0,k.localize)(1531,"Whether keyboard focus is inside an input box"))}),define(ne[58],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IContextMenuService=e.IContextViewService=void 0,e.IContextViewService=(0,d.createDecorator)("contextViewService"),e.IContextMenuService=(0,d.createDecorator)("contextMenuService")}),define(ne[180],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IDialogService=void 0,e.IDialogService=(0,d.createDecorator)("dialogService")}),define(ne[271],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IEnvironmentService=void 0,e.IEnvironmentService=(0,d.createDecorator)("environmentService")}),define(ne[118],se([1,0,7,2,28,5]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.nativeHoverDelegate=e.WorkbenchHoverDelegate=e.IHoverService=void 0,e.IHoverService=(0,d.createDecorator)("hoverService");let y=class extends k.Disposable{get delay(){return this.isInstantlyHovering()?0:this._delay}constructor(_,b,p={},n,o){super(),this.placement=_,this.instantHover=b,this.overrideOptions=p,this.configurationService=n,this.hoverService=o,this.lastHoverHideTime=0,this.timeLimit=200,this.hoverDisposables=this._register(new k.DisposableStore),this._delay=this.configurationService.getValue("workbench.hover.delay"),this._register(this.configurationService.onDidChangeConfiguration(t=>{t.affectsConfiguration("workbench.hover.delay")&&(this._delay=this.configurationService.getValue("workbench.hover.delay"))}))}showHover(_,b){const p=typeof this.overrideOptions=="function"?this.overrideOptions(_,b):this.overrideOptions;this.hoverDisposables.clear();const n=(0,E.isHTMLElement)(_.target)?[_.target]:_.target.targetElements;for(const t of n)this.hoverDisposables.add((0,E.addStandardDisposableListener)(t,"keydown",i=>{i.equals(9)&&this.hoverService.hideHover()}));const o=(0,E.isHTMLElement)(_.content)?void 0:_.content.toString();return this.hoverService.showHover({..._,...p,persistence:{hideOnKeyDown:!0,...p.persistence},id:o,appearance:{..._.appearance,compact:!0,skipFadeInAnimation:this.isInstantlyHovering(),...p.appearance}},b)}isInstantlyHovering(){return this.instantHover&&Date.now()-this.lastHoverHideTimea):void 0}dispose(){if(!this._isDisposed){this._isDisposed=!0,(0,I.dispose)(this._children),this._children.clear();for(const s of this._servicesToMaybeDispose)(0,I.isDisposable)(s)&&s.dispose();this._servicesToMaybeDispose.clear()}}_throwIfDisposed(){if(this._isDisposed)throw new Error("InstantiationService has been disposed")}createChild(s,g){this._throwIfDisposed();const c=this,l=new class extends o{dispose(){c._children.delete(l),super.dispose()}}(s,this._strict,this,this._enableTracing);return this._children.add(l),g?.add(l),l}invokeFunction(s,...g){this._throwIfDisposed();const c=t.traceInvocation(this._enableTracing,s);let l=!1;try{return s({get:r=>{if(l)throw(0,k.illegalState)("service accessor is only valid during the invocation of its target method");const u=this._getOrCreateServiceInstance(r,c);if(!u)throw new Error(`[invokeFunction] unknown service '${r}'`);return u}},...g)}finally{l=!0,c.stop()}}createInstance(s,...g){this._throwIfDisposed();let c,l;return s instanceof E.SyncDescriptor?(c=t.traceCreation(this._enableTracing,s.ctor),l=this._createInstance(s.ctor,s.staticArguments.concat(g),c)):(c=t.traceCreation(this._enableTracing,s),l=this._createInstance(s,g,c)),c.stop(),l}_createInstance(s,g=[],c){const l=m._util.getServiceDependencies(s).sort((u,C)=>u.index-C.index),a=[];for(const u of l){const C=this._getOrCreateServiceInstance(u.id,c);C||this._throwIfStrict(`[createInstance] ${s.name} depends on UNKNOWN service ${u.id}.`,!1),a.push(C)}const r=l.length>0?l[0].index:g.length;if(g.length!==r){console.trace(`[createInstance] First service dependency of ${s.name} at position ${r+1} conflicts with ${g.length} static arguments`);const u=r-g.length;u>0?g=g.concat(new Array(u)):g=g.slice(0,r)}return Reflect.construct(s,g.concat(a))}_setCreatedServiceInstance(s,g){if(this._services.get(s)instanceof E.SyncDescriptor)this._services.set(s,g);else if(this._parent)this._parent._setCreatedServiceInstance(s,g);else throw new Error("illegalState - setting UNKNOWN service instance")}_getServiceInstanceOrDescriptor(s){const g=this._services.get(s);return!g&&this._parent?this._parent._getServiceInstanceOrDescriptor(s):g}_getOrCreateServiceInstance(s,g){this._globalGraph&&this._globalGraphImplicitDependency&&this._globalGraph.insertEdge(this._globalGraphImplicitDependency,String(s));const c=this._getServiceInstanceOrDescriptor(s);return c instanceof E.SyncDescriptor?this._safeCreateAndCacheServiceInstance(s,c,g.branch(s,!0)):(g.branch(s,!1),c)}_safeCreateAndCacheServiceInstance(s,g,c){if(this._activeInstantiations.has(s))throw new Error(`illegal state - RECURSIVELY instantiating service '${s}'`);this._activeInstantiations.add(s);try{return this._createAndCacheServiceInstance(s,g,c)}finally{this._activeInstantiations.delete(s)}}_createAndCacheServiceInstance(s,g,c){const l=new y.Graph(C=>C.id.toString());let a=0;const r=[{id:s,desc:g,_trace:c}],u=new Set;for(;r.length;){const C=r.pop();if(!u.has(String(C.id))){if(u.add(String(C.id)),l.lookupOrInsertNode(C),a++>1e3)throw new n(l);for(const f of m._util.getServiceDependencies(C.desc.ctor)){const h=this._getServiceInstanceOrDescriptor(f.id);if(h||this._throwIfStrict(`[createInstance] ${s} depends on ${f.id} which is NOT registered.`,!0),this._globalGraph?.insertEdge(String(C.id),String(f.id)),h instanceof E.SyncDescriptor){const v={id:f.id,desc:h,_trace:C._trace.branch(f.id,!0)};l.insertEdge(C,v),r.push(v)}}}}for(;;){const C=l.roots();if(C.length===0){if(!l.isEmpty())throw new n(l);break}for(const{data:f}of C){if(this._getServiceInstanceOrDescriptor(f.id)instanceof E.SyncDescriptor){const v=this._createServiceInstanceWithOwner(f.id,f.desc.ctor,f.desc.staticArguments,f.desc.supportsDelayedInstantiation,f._trace);this._setCreatedServiceInstance(f.id,v)}l.removeNode(f)}}return this._getServiceInstanceOrDescriptor(s)}_createServiceInstanceWithOwner(s,g,c=[],l,a){if(this._services.get(s)instanceof E.SyncDescriptor)return this._createServiceInstance(s,g,c,l,a,this._servicesToMaybeDispose);if(this._parent)return this._parent._createServiceInstanceWithOwner(s,g,c,l,a);throw new Error(`illegalState - creating UNKNOWN service instance ${g.name}`)}_createServiceInstance(s,g,c=[],l,a,r){if(l){const u=new o(void 0,this._strict,this,this._enableTracing);u._globalGraphImplicitDependency=String(s);const C=new Map,f=new d.GlobalIdleValue(()=>{const h=u._createInstance(g,c,a);for(const[v,w]of C){const S=h[v];if(typeof S=="function")for(const L of w)L.disposable=S.apply(h,L.listener)}return C.clear(),r.add(h),h});return new Proxy(Object.create(null),{get(h,v){if(!f.isInitialized&&typeof v=="string"&&(v.startsWith("onDid")||v.startsWith("onWill"))){let L=C.get(v);return L||(L=new b.LinkedList,C.set(v,L)),(T,M,A)=>{if(f.isInitialized)return f.value[v](T,M,A);{const P={listener:[T,M,A],disposable:void 0},N=L.push(P);return(0,I.toDisposable)(()=>{N(),P.disposable?.dispose()})}}}if(v in h)return h[v];const w=f.value;let S=w[v];return typeof S!="function"||(S=S.bind(w),h[v]=S),S},set(h,v,w){return f.value[v]=w,!0},getPrototypeOf(h){return g.prototype}})}else{const u=this._createInstance(g,c,a);return r.add(u),u}}_throwIfStrict(s,g){if(g&&console.warn(s),this._strict)throw new Error(s)}}e.InstantiationService=o;class t{static{this.all=new Set}static{this._None=new class extends t{constructor(){super(0,null)}stop(){}branch(){return this}}}static traceInvocation(s,g){return s?new t(2,g.name||new Error().stack.split(` -`).slice(3,4).join(` -`)):t._None}static traceCreation(s,g){return s?new t(1,g.name):t._None}static{this._totals=0}constructor(s,g){this.type=s,this.name=g,this._start=Date.now(),this._dep=[]}branch(s,g){const c=new t(3,s.toString());return this._dep.push([s,g,c]),c}stop(){const s=Date.now()-this._start;t._totals+=s;let g=!1;function c(a,r){const u=[],C=new Array(a+1).join(" ");for(const[f,h,v]of r._dep)if(h&&v){g=!0,u.push(`${C}CREATES -> ${f}`);const w=c(a+1,v);w&&u.push(w)}else u.push(`${C}uses -> ${f}`);return u.join(` -`)}const l=[`${this.type===1?"CREATE":"CALL"} ${this.name}`,`${c(1,this)}`,`DONE, took ${s.toFixed(2)}ms (grand total ${t._totals.toFixed(2)}ms)`];(s>2||g)&&t.all.add(l.join(` -`))}}e.Trace=t}),define(ne[689],se([1,0,8,247,140]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BaseResolvedKeybinding=void 0;class E extends I.ResolvedKeybinding{constructor(m,_){if(super(),_.length===0)throw(0,d.illegalArgument)("chords");this._os=m,this._chords=_}getLabel(){return k.UILabelProvider.toLabel(this._os,this._chords,m=>this._getLabel(m))}getAriaLabel(){return k.AriaLabelProvider.toLabel(this._os,this._chords,m=>this._getAriaLabel(m))}getElectronAccelerator(){return this._chords.length>1||this._chords[0].isDuplicateModifierCase()?null:k.ElectronAcceleratorLabelProvider.toLabel(this._os,this._chords,m=>this._getElectronAccelerator(m))}getUserSettingsLabel(){return k.UserSettingsLabelProvider.toLabel(this._os,this._chords,m=>this._getUserSettingsLabel(m))}hasMultipleChords(){return this._chords.length>1}getChords(){return this._chords.map(m=>this._getChord(m))}_getChord(m){return new I.ResolvedChord(m.ctrlKey,m.shiftKey,m.altKey,m.metaKey,this._getLabel(m),this._getAriaLabel(m))}getDispatchChords(){return this._chords.map(m=>this._getChordDispatch(m))}getSingleModifierDispatchChords(){return this._chords.map(m=>this._getSingleModifierChordDispatch(m))}}e.BaseResolvedKeybinding=E}),define(ne[31],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IKeybindingService=void 0,e.IKeybindingService=(0,d.createDecorator)("keybindingService")}),define(ne[391],se([1,0,5,174,2,31]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorHoverStatusBar=void 0;const y=d.$;let m=class extends I.Disposable{get hasContent(){return this._hasContent}constructor(b){super(),this._keybindingService=b,this.actions=[],this._hasContent=!1,this.hoverElement=y("div.hover-row.status-bar"),this.hoverElement.tabIndex=0,this.actionsElement=d.append(this.hoverElement,y("div.actions"))}addAction(b){const p=this._keybindingService.lookupKeybinding(b.commandId),n=p?p.getLabel():null;this._hasContent=!0;const o=this._register(k.HoverAction.render(this.actionsElement,b,n));return this.actions.push(o),o}append(b){const p=d.append(this.actionsElement,b);return this._hasContent=!0,p}};e.EditorHoverStatusBar=m,e.EditorHoverStatusBar=m=ke([ce(0,E.IKeybindingService)],m)}),define(ne[690],se([1,0,5,31,670,12,28,61,20,174,6]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";var n;Object.defineProperty(e,"__esModule",{value:!0}),e.ContentHoverWidget=void 0;const o=30,t=6;let i=class extends I.ResizableContentWidget{static{n=this}static{this.ID="editor.contrib.resizableContentHoverWidget"}static{this._lastDimensions=new d.Dimension(0,0)}get isVisibleFromKeyboard(){return this._renderedHover?.source===1}get isVisible(){return this._hoverVisibleKey.get()??!1}get isFocused(){return this._hoverFocusedKey.get()??!1}constructor(c,l,a,r,u){const C=c.getOption(67)+8,f=150,h=new d.Dimension(f,C);super(c,h),this._configurationService=a,this._accessibilityService=r,this._keybindingService=u,this._hover=this._register(new b.HoverWidget),this._onDidResize=this._register(new p.Emitter),this.onDidResize=this._onDidResize.event,this._minimumSize=h,this._hoverVisibleKey=_.EditorContextKeys.hoverVisible.bindTo(l),this._hoverFocusedKey=_.EditorContextKeys.hoverFocused.bindTo(l),d.append(this._resizableNode.domNode,this._hover.containerDomNode),this._resizableNode.domNode.style.zIndex="50",this._register(this._editor.onDidLayoutChange(()=>{this.isVisible&&this._updateMaxDimensions()})),this._register(this._editor.onDidChangeConfiguration(w=>{w.hasChanged(50)&&this._updateFont()}));const v=this._register(d.trackFocus(this._resizableNode.domNode));this._register(v.onDidFocus(()=>{this._hoverFocusedKey.set(!0)})),this._register(v.onDidBlur(()=>{this._hoverFocusedKey.set(!1)})),this._setRenderedHover(void 0),this._editor.addContentWidget(this)}dispose(){super.dispose(),this._renderedHover?.dispose(),this._editor.removeContentWidget(this)}getId(){return n.ID}static _applyDimensions(c,l,a){const r=typeof l=="number"?`${l}px`:l,u=typeof a=="number"?`${a}px`:a;c.style.width=r,c.style.height=u}_setContentsDomNodeDimensions(c,l){const a=this._hover.contentsDomNode;return n._applyDimensions(a,c,l)}_setContainerDomNodeDimensions(c,l){const a=this._hover.containerDomNode;return n._applyDimensions(a,c,l)}_setHoverWidgetDimensions(c,l){this._setContentsDomNodeDimensions(c,l),this._setContainerDomNodeDimensions(c,l),this._layoutContentWidget()}static _applyMaxDimensions(c,l,a){const r=typeof l=="number"?`${l}px`:l,u=typeof a=="number"?`${a}px`:a;c.style.maxWidth=r,c.style.maxHeight=u}_setHoverWidgetMaxDimensions(c,l){n._applyMaxDimensions(this._hover.contentsDomNode,c,l),n._applyMaxDimensions(this._hover.containerDomNode,c,l),this._hover.containerDomNode.style.setProperty("--vscode-hover-maxWidth",typeof c=="number"?`${c}px`:c),this._layoutContentWidget()}_setAdjustedHoverWidgetDimensions(c){this._setHoverWidgetMaxDimensions("none","none");const l=c.width,a=c.height;this._setHoverWidgetDimensions(l,a)}_updateResizableNodeMaxDimensions(){const c=this._findMaximumRenderingWidth()??1/0,l=this._findMaximumRenderingHeight()??1/0;this._resizableNode.maxSize=new d.Dimension(c,l),this._setHoverWidgetMaxDimensions(c,l)}_resize(c){n._lastDimensions=new d.Dimension(c.width,c.height),this._setAdjustedHoverWidgetDimensions(c),this._resizableNode.layout(c.height,c.width),this._updateResizableNodeMaxDimensions(),this._hover.scrollbar.scanDomNode(),this._editor.layoutContentWidget(this),this._onDidResize.fire()}_findAvailableSpaceVertically(){const c=this._renderedHover?.showAtPosition;if(c)return this._positionPreference===1?this._availableVerticalSpaceAbove(c):this._availableVerticalSpaceBelow(c)}_findMaximumRenderingHeight(){const c=this._findAvailableSpaceVertically();if(!c)return;let l=t;return Array.from(this._hover.contentsDomNode.children).forEach(a=>{l+=a.clientHeight}),Math.min(c,l)}_isHoverTextOverflowing(){this._hover.containerDomNode.style.setProperty("--vscode-hover-whiteSpace","nowrap"),this._hover.containerDomNode.style.setProperty("--vscode-hover-sourceWhiteSpace","nowrap");const c=Array.from(this._hover.contentsDomNode.children).some(l=>l.scrollWidth>l.clientWidth);return this._hover.containerDomNode.style.removeProperty("--vscode-hover-whiteSpace"),this._hover.containerDomNode.style.removeProperty("--vscode-hover-sourceWhiteSpace"),c}_findMaximumRenderingWidth(){if(!this._editor||!this._editor.hasModel())return;const c=this._isHoverTextOverflowing(),l=typeof this._contentWidth>"u"?0:this._contentWidth-2;return c||this._hover.containerDomNode.clientWidththis._renderedHover.closestMouseDistance+4?!1:(this._renderedHover.closestMouseDistance=Math.min(this._renderedHover.closestMouseDistance,r),!0)}_setRenderedHover(c){this._renderedHover?.dispose(),this._renderedHover=c,this._hoverVisibleKey.set(!!c),this._hover.containerDomNode.classList.toggle("hidden",!c)}_updateFont(){const{fontSize:c,lineHeight:l}=this._editor.getOption(50),a=this._hover.contentsDomNode;a.style.fontSize=`${c}px`,a.style.lineHeight=`${l/c}`,Array.prototype.slice.call(this._hover.contentsDomNode.getElementsByClassName("code")).forEach(u=>this._editor.applyFontInfo(u))}_updateContent(c){const l=this._hover.contentsDomNode;l.style.paddingBottom="",l.textContent="",l.appendChild(c)}_layoutContentWidget(){this._editor.layoutContentWidget(this),this._hover.onContentsChanged()}_updateMaxDimensions(){const c=Math.max(this._editor.getLayoutInfo().height/4,250,n._lastDimensions.height),l=Math.max(this._editor.getLayoutInfo().width*.66,500,n._lastDimensions.width);this._setHoverWidgetMaxDimensions(l,c)}_render(c){this._setRenderedHover(c),this._updateFont(),this._updateContent(c.domNode),this._updateMaxDimensions(),this.onContentsChanged(),this._editor.render()}getPosition(){return this._renderedHover?{position:this._renderedHover.showAtPosition,secondaryPosition:this._renderedHover.showAtSecondaryPosition,positionAffinity:this._renderedHover.shouldAppearBeforeContent?3:void 0,preference:[this._positionPreference??1]}:null}show(c){if(!this._editor||!this._editor.hasModel())return;this._render(c);const l=d.getTotalHeight(this._hover.containerDomNode),a=c.showAtPosition;this._positionPreference=this._findPositionPreference(l,a)??1,this.onContentsChanged(),c.shouldFocus&&this._hover.containerDomNode.focus(),this._onDidResize.fire();const u=this._hover.containerDomNode.ownerDocument.activeElement===this._hover.containerDomNode&&(0,b.getHoverAccessibleViewHint)(this._configurationService.getValue("accessibility.verbosity.hover")===!0&&this._accessibilityService.isScreenReaderOptimized(),this._keybindingService.lookupKeybinding("editor.action.accessibleView")?.getAriaLabel()??"");u&&(this._hover.contentsDomNode.ariaLabel=this._hover.contentsDomNode.textContent+", "+u)}hide(){if(!this._renderedHover)return;const c=this._renderedHover.shouldFocus||this._hoverFocusedKey.get();this._setRenderedHover(void 0),this._resizableNode.maxSize=new d.Dimension(1/0,1/0),this._resizableNode.clearSashHoverState(),this._hoverFocusedKey.set(!1),this._editor.layoutContentWidget(this),c&&this._editor.focus()}_removeConstraintsRenderNormally(){const c=this._editor.getLayoutInfo();this._resizableNode.layout(c.height,c.width),this._setHoverWidgetDimensions("auto","auto")}setMinimumDimensions(c){this._minimumSize=new d.Dimension(Math.max(this._minimumSize.width,c.width),Math.max(this._minimumSize.height,c.height)),this._updateMinimumWidth()}_updateMinimumWidth(){const c=typeof this._contentWidth>"u"?this._minimumSize.width:Math.min(this._contentWidth,this._minimumSize.width);this._resizableNode.minSize=new d.Dimension(c,this._minimumSize.height)}onContentsChanged(){this._removeConstraintsRenderNormally();const c=this._hover.containerDomNode;let l=d.getTotalHeight(c),a=d.getTotalWidth(c);if(this._resizableNode.layout(l,a),this._setHoverWidgetDimensions(a,l),l=d.getTotalHeight(c),a=d.getTotalWidth(c),this._contentWidth=a,this._updateMinimumWidth(),this._resizableNode.layout(l,a),this._renderedHover?.showAtPosition){const r=d.getTotalHeight(this._hover.containerDomNode);this._positionPreference=this._findPositionPreference(r,this._renderedHover.showAtPosition)}this._layoutContentWidget()}focus(){this._hover.containerDomNode.focus()}scrollUp(){const c=this._hover.scrollbar.getScrollPosition().scrollTop,l=this._editor.getOption(50);this._hover.scrollbar.setScrollPosition({scrollTop:c-l.lineHeight})}scrollDown(){const c=this._hover.scrollbar.getScrollPosition().scrollTop,l=this._editor.getOption(50);this._hover.scrollbar.setScrollPosition({scrollTop:c+l.lineHeight})}scrollLeft(){const c=this._hover.scrollbar.getScrollPosition().scrollLeft;this._hover.scrollbar.setScrollPosition({scrollLeft:c-o})}scrollRight(){const c=this._hover.scrollbar.getScrollPosition().scrollLeft;this._hover.scrollbar.setScrollPosition({scrollLeft:c+o})}pageUp(){const c=this._hover.scrollbar.getScrollPosition().scrollTop,l=this._hover.scrollbar.getScrollDimensions().height;this._hover.scrollbar.setScrollPosition({scrollTop:c-l})}pageDown(){const c=this._hover.scrollbar.getScrollPosition().scrollTop,l=this._hover.scrollbar.getScrollDimensions().height;this._hover.scrollbar.setScrollPosition({scrollTop:c+l})}goToTop(){this._hover.scrollbar.setScrollPosition({scrollTop:0})}goToBottom(){this._hover.scrollbar.setScrollPosition({scrollTop:this._hover.scrollbar.getScrollDimensions().scrollHeight})}};e.ContentHoverWidget=i,e.ContentHoverWidget=i=n=ke([ce(1,E.IContextKeyService),ce(2,y.IConfigurationService),ce(3,m.IAccessibilityService),ce(4,k.IKeybindingService)],i);function s(g,c,l,a,r,u){const C=l+r/2,f=a+u/2,h=Math.max(Math.abs(g-C)-r/2,0),v=Math.max(Math.abs(c-f)-u/2,0);return Math.sqrt(h*h+v*v)}}),define(ne[392],se([1,0,12]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.KeybindingResolver=e.NoMatchingKb=void 0,e.NoMatchingKb={kind:0};const k={kind:1};function I(_,b,p){return{kind:2,commandId:_,commandArgs:b,isBubble:p}}class E{constructor(b,p,n){this._log=n,this._defaultKeybindings=b,this._defaultBoundCommands=new Map;for(const o of b){const t=o.command;t&&t.charAt(0)!=="-"&&this._defaultBoundCommands.set(t,!0)}this._map=new Map,this._lookupMap=new Map,this._keybindings=E.handleRemovals([].concat(b).concat(p));for(let o=0,t=this._keybindings.length;o"u"){this._map.set(b,[p]),this._addToLookupMap(p);return}for(let o=n.length-1;o>=0;o--){const t=n[o];if(t.command===p.command)continue;let i=!0;for(let s=1;s"u"?(p=[b],this._lookupMap.set(b.command,p)):p.push(b)}_removeFromLookupMap(b){if(!b.command)return;const p=this._lookupMap.get(b.command);if(!(typeof p>"u")){for(let n=0,o=p.length;n"u"||n.length===0)return null;if(n.length===1)return n[0];for(let o=n.length-1;o>=0;o--){const t=n[o];if(p.contextMatchesRules(t.when))return t}return n[n.length-1]}resolve(b,p,n){const o=[...p,n];this._log(`| Resolving ${o}`);const t=this._map.get(o[0]);if(t===void 0)return this._log("\\ No keybinding entries."),e.NoMatchingKb;let i=null;if(o.length<2)i=t;else{i=[];for(let g=0,c=t.length;gl.chords.length)continue;let a=!0;for(let r=1;r=0;n--){const o=p[n];if(E._contextMatchesRules(b,o.when))return o}return null}static _contextMatchesRules(b,p){return p?p.evaluate(b):!0}}e.KeybindingResolver=E;function y(_){return _?`${_.serialize()}`:"no when condition"}function m(_){return _.extensionId?_.isBuiltinExtension?`built-in extension ${_.extensionId}`:`user extension ${_.extensionId}`:_.isDefault?"built-in":"user"}}),define(ne[691],se([1,0,14,8,6,300,2,3,392]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractKeybindingService=void 0;const b=/^(cursor|delete|undo|redo|tab|editor\.action\.clipboard)/;class p extends y.Disposable{get onDidUpdateKeybindings(){return this._onDidUpdateKeybindings?this._onDidUpdateKeybindings.event:I.Event.None}get inChordMode(){return this._currentChords.length>0}constructor(t,i,s,g,c){super(),this._contextKeyService=t,this._commandService=i,this._telemetryService=s,this._notificationService=g,this._logService=c,this._onDidUpdateKeybindings=this._register(new I.Emitter),this._currentChords=[],this._currentChordChecker=new d.IntervalTimer,this._currentChordStatusMessage=null,this._ignoreSingleModifiers=n.EMPTY,this._currentSingleModifier=null,this._currentSingleModifierClearTimeout=new d.TimeoutTimer,this._currentlyDispatchingCommandId=null,this._logging=!1}dispose(){super.dispose()}_log(t){this._logging&&this._logService.info(`[KeybindingService]: ${t}`)}getKeybindings(){return this._getResolver().getKeybindings()}lookupKeybinding(t,i){const s=this._getResolver().lookupPrimaryKeybinding(t,i||this._contextKeyService);if(s)return s.resolvedKeybinding}dispatchEvent(t,i){return this._dispatch(t,i)}softDispatch(t,i){this._log("/ Soft dispatching keyboard event");const s=this.resolveKeyboardEvent(t);if(s.hasMultipleChords())return console.warn("keyboard event should not be mapped to multiple chords"),_.NoMatchingKb;const[g]=s.getDispatchChords();if(g===null)return this._log("\\ Keyboard event cannot be dispatched"),_.NoMatchingKb;const c=this._contextKeyService.getContext(i),l=this._currentChords.map(({keypress:a})=>a);return this._getResolver().resolve(c,l,g)}_scheduleLeaveChordMode(){const t=Date.now();this._currentChordChecker.cancelAndSet(()=>{if(!this._documentHasFocus()){this._leaveChordMode();return}Date.now()-t>5e3&&this._leaveChordMode()},500)}_expectAnotherChord(t,i){switch(this._currentChords.push({keypress:t,label:i}),this._currentChords.length){case 0:throw(0,k.illegalState)("impossible");case 1:this._currentChordStatusMessage=this._notificationService.status(m.localize(1538,"({0}) was pressed. Waiting for second key of chord...",i));break;default:{const s=this._currentChords.map(({label:g})=>g).join(", ");this._currentChordStatusMessage=this._notificationService.status(m.localize(1539,"({0}) was pressed. Waiting for next key of chord...",s))}}this._scheduleLeaveChordMode(),E.IME.enabled&&E.IME.disable()}_leaveChordMode(){this._currentChordStatusMessage&&(this._currentChordStatusMessage.dispose(),this._currentChordStatusMessage=null),this._currentChordChecker.cancel(),this._currentChords=[],E.IME.enable()}_dispatch(t,i){return this._doDispatch(this.resolveKeyboardEvent(t),i,!1)}_singleModifierDispatch(t,i){const s=this.resolveKeyboardEvent(t),[g]=s.getSingleModifierDispatchChords();if(g)return this._ignoreSingleModifiers.has(g)?(this._log(`+ Ignoring single modifier ${g} due to it being pressed together with other keys.`),this._ignoreSingleModifiers=n.EMPTY,this._currentSingleModifierClearTimeout.cancel(),this._currentSingleModifier=null,!1):(this._ignoreSingleModifiers=n.EMPTY,this._currentSingleModifier===null?(this._log(`+ Storing single modifier for possible chord ${g}.`),this._currentSingleModifier=g,this._currentSingleModifierClearTimeout.cancelAndSet(()=>{this._log("+ Clearing single modifier due to 300ms elapsed."),this._currentSingleModifier=null},300),!1):g===this._currentSingleModifier?(this._log(`/ Dispatching single modifier chord ${g} ${g}`),this._currentSingleModifierClearTimeout.cancel(),this._currentSingleModifier=null,this._doDispatch(s,i,!0)):(this._log(`+ Clearing single modifier due to modifier mismatch: ${this._currentSingleModifier} ${g}`),this._currentSingleModifierClearTimeout.cancel(),this._currentSingleModifier=null,!1));const[c]=s.getChords();return this._ignoreSingleModifiers=new n(c),this._currentSingleModifier!==null&&this._log("+ Clearing single modifier due to other key up."),this._currentSingleModifierClearTimeout.cancel(),this._currentSingleModifier=null,!1}_doDispatch(t,i,s=!1){let g=!1;if(t.hasMultipleChords())return console.warn("Unexpected keyboard event mapped to multiple chords"),!1;let c=null,l=null;if(s){const[C]=t.getSingleModifierDispatchChords();c=C,l=C?[C]:[]}else[c]=t.getDispatchChords(),l=this._currentChords.map(({keypress:C})=>C);if(c===null)return this._log("\\ Keyboard event cannot be dispatched in keydown phase."),g;const a=this._contextKeyService.getContext(i),r=t.getLabel(),u=this._getResolver().resolve(a,l,c);switch(u.kind){case 0:{if(this._logService.trace("KeybindingService#dispatch",r,"[ No matching keybinding ]"),this.inChordMode){const C=this._currentChords.map(({label:f})=>f).join(", ");this._log(`+ Leaving multi-chord mode: Nothing bound to "${C}, ${r}".`),this._notificationService.status(m.localize(1540,"The key combination ({0}, {1}) is not a command.",C,r),{hideAfter:10*1e3}),this._leaveChordMode(),g=!0}return g}case 1:return this._logService.trace("KeybindingService#dispatch",r,"[ Several keybindings match - more chords needed ]"),g=!0,this._expectAnotherChord(c,r),this._log(this._currentChords.length===1?"+ Entering multi-chord mode...":"+ Continuing multi-chord mode..."),g;case 2:{if(this._logService.trace("KeybindingService#dispatch",r,`[ Will dispatch command ${u.commandId} ]`),u.commandId===null||u.commandId===""){if(this.inChordMode){const C=this._currentChords.map(({label:f})=>f).join(", ");this._log(`+ Leaving chord mode: Nothing bound to "${C}, ${r}".`),this._notificationService.status(m.localize(1541,"The key combination ({0}, {1}) is not a command.",C,r),{hideAfter:10*1e3}),this._leaveChordMode(),g=!0}}else{this.inChordMode&&this._leaveChordMode(),u.isBubble||(g=!0),this._log(`+ Invoking command ${u.commandId}.`),this._currentlyDispatchingCommandId=u.commandId;try{typeof u.commandArgs>"u"?this._commandService.executeCommand(u.commandId).then(void 0,C=>this._notificationService.warn(C)):this._commandService.executeCommand(u.commandId,u.commandArgs).then(void 0,C=>this._notificationService.warn(C))}finally{this._currentlyDispatchingCommandId=null}b.test(u.commandId)||this._telemetryService.publicLog2("workbenchActionExecuted",{id:u.commandId,from:"keybinding",detail:t.getUserSettingsLabel()??void 0})}return g}}}mightProducePrintableCharacter(t){return t.ctrlKey||t.metaKey?!1:t.keyCode>=31&&t.keyCode<=56||t.keyCode>=21&&t.keyCode<=30}}e.AbstractKeybindingService=p;class n{static{this.EMPTY=new n(null)}constructor(t){this._ctrlKey=t?t.ctrlKey:!1,this._shiftKey=t?t.shiftKey:!1,this._altKey=t?t.altKey:!1,this._metaKey=t?t.metaKey:!1}has(t){switch(t){case"ctrl":return this._ctrlKey;case"shift":return this._shiftKey;case"alt":return this._altKey;case"meta":return this._metaKey}}}}),define(ne[393],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ResolvedKeybindingItem=void 0,e.toEmptyArrayIfContainsNull=k;class d{constructor(E,y,m,_,b,p,n){this._resolvedKeybindingItemBrand=void 0,this.resolvedKeybinding=E,this.chords=E?k(E.getDispatchChords()):[],E&&this.chords.length===0&&(this.chords=k(E.getSingleModifierDispatchChords())),this.bubble=y?y.charCodeAt(0)===94:!1,this.command=this.bubble?y.substr(1):y,this.commandArgs=m,this.when=_,this.isDefault=b,this.extensionId=p,this.isBuiltinExtension=n}}e.ResolvedKeybindingItem=d;function k(I){const E=[];for(let y=0,m=I.length;ythis._toKeyCodeChord(n)));return p.length>0?[new y(p,b)]:[]}}e.USLayoutResolvedKeybinding=y}),define(ne[181],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ILabelService=void 0,e.ILabelService=(0,d.createDecorator)("labelService")}),define(ne[119],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ILayoutService=void 0,e.ILayoutService=(0,d.createDecorator)("layoutService")}),define(ne[394],se([1,0,5,52,13,6,34,49,119]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorScopedLayoutService=void 0;let b=class{get mainContainer(){return(0,I.firstOrDefault)(this._codeEditorService.listCodeEditors())?.getContainerDomNode()??k.mainWindow.document.body}get activeContainer(){return(this._codeEditorService.getFocusedCodeEditor()??this._codeEditorService.getActiveCodeEditor())?.getContainerDomNode()??this.mainContainer}get mainContainerDimension(){return d.getClientArea(this.mainContainer)}get activeContainerDimension(){return d.getClientArea(this.activeContainer)}get containers(){return(0,I.coalesce)(this._codeEditorService.listCodeEditors().map(o=>o.getContainerDomNode()))}getContainer(){return this.activeContainer}whenContainerStylesLoaded(){}focus(){this._codeEditorService.getFocusedCodeEditor()?.focus()}constructor(o){this._codeEditorService=o,this.onDidLayoutMainContainer=E.Event.None,this.onDidLayoutActiveContainer=E.Event.None,this.onDidLayoutContainer=E.Event.None,this.onDidChangeActiveContainer=E.Event.None,this.onDidAddContainer=E.Event.None,this.mainContainerOffset={top:0,quickPickTop:0},this.activeContainerOffset={top:0,quickPickTop:0}}};b=ke([ce(0,y.ICodeEditorService)],b);let p=class extends b{get mainContainer(){return this._container}constructor(o,t){super(t),this._container=o}};e.EditorScopedLayoutService=p,e.EditorScopedLayoutService=p=ke([ce(1,y.ICodeEditorService)],p),(0,m.registerSingleton)(_.ILayoutService,b,1)}),define(ne[693],se([1,0,5,52,6,2,61,28,12,119]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AccessibilityService=void 0;let p=class extends E.Disposable{constructor(o,t,i){super(),this._contextKeyService=o,this._layoutService=t,this._configurationService=i,this._accessibilitySupport=0,this._onDidChangeScreenReaderOptimized=new I.Emitter,this._onDidChangeReducedMotion=new I.Emitter,this._onDidChangeLinkUnderline=new I.Emitter,this._accessibilityModeEnabledContext=y.CONTEXT_ACCESSIBILITY_MODE_ENABLED.bindTo(this._contextKeyService);const s=()=>this._accessibilityModeEnabledContext.set(this.isScreenReaderOptimized());this._register(this._configurationService.onDidChangeConfiguration(c=>{c.affectsConfiguration("editor.accessibilitySupport")&&(s(),this._onDidChangeScreenReaderOptimized.fire()),c.affectsConfiguration("workbench.reduceMotion")&&(this._configMotionReduced=this._configurationService.getValue("workbench.reduceMotion"),this._onDidChangeReducedMotion.fire())})),s(),this._register(this.onDidChangeScreenReaderOptimized(()=>s()));const g=k.mainWindow.matchMedia("(prefers-reduced-motion: reduce)");this._systemMotionReduced=g.matches,this._configMotionReduced=this._configurationService.getValue("workbench.reduceMotion"),this._linkUnderlinesEnabled=this._configurationService.getValue("accessibility.underlineLinks"),this.initReducedMotionListeners(g),this.initLinkUnderlineListeners()}initReducedMotionListeners(o){this._register((0,d.addDisposableListener)(o,"change",()=>{this._systemMotionReduced=o.matches,this._configMotionReduced==="auto"&&this._onDidChangeReducedMotion.fire()}));const t=()=>{const i=this.isMotionReduced();this._layoutService.mainContainer.classList.toggle("reduce-motion",i),this._layoutService.mainContainer.classList.toggle("enable-motion",!i)};t(),this._register(this.onDidChangeReducedMotion(()=>t()))}initLinkUnderlineListeners(){this._register(this._configurationService.onDidChangeConfiguration(t=>{if(t.affectsConfiguration("accessibility.underlineLinks")){const i=this._configurationService.getValue("accessibility.underlineLinks");this._linkUnderlinesEnabled=i,this._onDidChangeLinkUnderline.fire()}}));const o=()=>{const t=this._linkUnderlinesEnabled;this._layoutService.mainContainer.classList.toggle("underline-links",t)};o(),this._register(this.onDidChangeLinkUnderlines(()=>o()))}onDidChangeLinkUnderlines(o){return this._onDidChangeLinkUnderline.event(o)}get onDidChangeScreenReaderOptimized(){return this._onDidChangeScreenReaderOptimized.event}isScreenReaderOptimized(){const o=this._configurationService.getValue("editor.accessibilitySupport");return o==="on"||o==="auto"&&this._accessibilitySupport===2}get onDidChangeReducedMotion(){return this._onDidChangeReducedMotion.event}isMotionReduced(){const o=this._configMotionReduced;return o==="on"||o==="auto"&&this._systemMotionReduced}getAccessibilitySupport(){return this._accessibilitySupport}};e.AccessibilityService=p,e.AccessibilityService=p=ke([ce(0,_.IContextKeyService),ce(1,b.ILayoutService),ce(2,m.IConfigurationService)],p)}),define(ne[395],se([1,0,353,2,119,5]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextViewService=e.ContextViewHandler=void 0;let y=class extends k.Disposable{constructor(b){super(),this.layoutService=b,this.contextView=this._register(new d.ContextView(this.layoutService.mainContainer,1)),this.layout(),this._register(b.onDidLayoutContainer(()=>this.layout()))}showContextView(b,p,n){let o;p?p===this.layoutService.getContainer((0,E.getWindow)(p))?o=1:n?o=3:o=2:o=1,this.contextView.setContainer(p??this.layoutService.activeContainer,o),this.contextView.show(b);const t={close:()=>{this.openContextView===t&&this.hideContextView()}};return this.openContextView=t,t}layout(){this.contextView.layout()}hideContextView(b){this.contextView.hide(b),this.openContextView=void 0}};e.ContextViewHandler=y,e.ContextViewHandler=y=ke([ce(0,I.ILayoutService)],y);class m extends y{getContextViewElement(){return this.contextView.getViewElement()}}e.ContextViewService=m}),define(ne[62],se([1,0,6,2,12,7]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CONTEXT_LOG_LEVEL=e.MultiplexLogger=e.ConsoleLogger=e.AbstractLogger=e.DEFAULT_LOG_LEVEL=e.LogLevel=e.ILogService=void 0,e.LogLevelToString=p,e.ILogService=(0,E.createDecorator)("logService");var y;(function(n){n[n.Off=0]="Off",n[n.Trace=1]="Trace",n[n.Debug=2]="Debug",n[n.Info=3]="Info",n[n.Warning=4]="Warning",n[n.Error=5]="Error"})(y||(e.LogLevel=y={})),e.DEFAULT_LOG_LEVEL=y.Info;class m extends k.Disposable{constructor(){super(...arguments),this.level=e.DEFAULT_LOG_LEVEL,this._onDidChangeLogLevel=this._register(new d.Emitter),this.onDidChangeLogLevel=this._onDidChangeLogLevel.event}setLevel(o){this.level!==o&&(this.level=o,this._onDidChangeLogLevel.fire(this.level))}getLevel(){return this.level}checkLogLevel(o){return this.level!==y.Off&&this.level<=o}}e.AbstractLogger=m;class _ extends m{constructor(o=e.DEFAULT_LOG_LEVEL,t=!0){super(),this.useColors=t,this.setLevel(o)}trace(o,...t){this.checkLogLevel(y.Trace)&&(this.useColors?console.log("%cTRACE","color: #888",o,...t):console.log(o,...t))}debug(o,...t){this.checkLogLevel(y.Debug)&&(this.useColors?console.log("%cDEBUG","background: #eee; color: #888",o,...t):console.log(o,...t))}info(o,...t){this.checkLogLevel(y.Info)&&(this.useColors?console.log("%c INFO","color: #33f",o,...t):console.log(o,...t))}warn(o,...t){this.checkLogLevel(y.Warning)&&(this.useColors?console.log("%c WARN","color: #993",o,...t):console.log(o,...t))}error(o,...t){this.checkLogLevel(y.Error)&&(this.useColors?console.log("%c ERR","color: #f33",o,...t):console.error(o,...t))}}e.ConsoleLogger=_;class b extends m{constructor(o){super(),this.loggers=o,o.length&&this.setLevel(o[0].getLevel())}setLevel(o){for(const t of this.loggers)t.setLevel(o);super.setLevel(o)}trace(o,...t){for(const i of this.loggers)i.trace(o,...t)}debug(o,...t){for(const i of this.loggers)i.debug(o,...t)}info(o,...t){for(const i of this.loggers)i.info(o,...t)}warn(o,...t){for(const i of this.loggers)i.warn(o,...t)}error(o,...t){for(const i of this.loggers)i.error(o,...t)}dispose(){for(const o of this.loggers)o.dispose();super.dispose()}}e.MultiplexLogger=b;function p(n){switch(n){case y.Trace:return"trace";case y.Debug:return"debug";case y.Info:return"info";case y.Warning:return"warn";case y.Error:return"error";case y.Off:return"off"}}e.CONTEXT_LOG_LEVEL=new I.RawContextKey("logLevel",p(y.Info))}),define(ne[212],se([1,0,64,5,93,47,296,14,6,2,128,11,310,23,61,62]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TextAreaWrapper=e.ClipboardEventUtils=e.TextAreaInput=e.InMemoryClipboardMetadataManager=e.CopyOptions=e.TextAreaSyntethicEvents=void 0;var g;(function(u){u.Tap="-monaco-textarea-synthetic-tap"})(g||(e.TextAreaSyntethicEvents=g={})),e.CopyOptions={forceCopyWithSyntaxHighlighting:!1};class c{static{this.INSTANCE=new c}constructor(){this._lastState=null}set(C,f){this._lastState={lastCopiedValue:C,data:f}}get(C){return this._lastState&&this._lastState.lastCopiedValue===C?this._lastState.data:(this._lastState=null,null)}}e.InMemoryClipboardMetadataManager=c;class l{constructor(){this._lastTypeTextLength=0}handleCompositionUpdate(C){C=C||"";const f={text:C,replacePrevCharCnt:this._lastTypeTextLength,replaceNextCharCnt:0,positionDelta:0};return this._lastTypeTextLength=C.length,f}}let a=class extends b.Disposable{get textAreaState(){return this._textAreaState}constructor(C,f,h,v,w,S){super(),this._host=C,this._textArea=f,this._OS=h,this._browser=v,this._accessibilityService=w,this._logService=S,this._onFocus=this._register(new _.Emitter),this.onFocus=this._onFocus.event,this._onBlur=this._register(new _.Emitter),this.onBlur=this._onBlur.event,this._onKeyDown=this._register(new _.Emitter),this.onKeyDown=this._onKeyDown.event,this._onKeyUp=this._register(new _.Emitter),this.onKeyUp=this._onKeyUp.event,this._onCut=this._register(new _.Emitter),this.onCut=this._onCut.event,this._onPaste=this._register(new _.Emitter),this.onPaste=this._onPaste.event,this._onType=this._register(new _.Emitter),this.onType=this._onType.event,this._onCompositionStart=this._register(new _.Emitter),this.onCompositionStart=this._onCompositionStart.event,this._onCompositionUpdate=this._register(new _.Emitter),this.onCompositionUpdate=this._onCompositionUpdate.event,this._onCompositionEnd=this._register(new _.Emitter),this.onCompositionEnd=this._onCompositionEnd.event,this._onSelectionChangeRequest=this._register(new _.Emitter),this.onSelectionChangeRequest=this._onSelectionChangeRequest.event,this._asyncFocusGainWriteScreenReaderContent=this._register(new b.MutableDisposable),this._asyncTriggerCut=this._register(new m.RunOnceScheduler(()=>this._onCut.fire(),0)),this._textAreaState=o.TextAreaState.EMPTY,this._selectionChangeListener=null,this._accessibilityService.isScreenReaderOptimized()&&this.writeNativeTextAreaContent("ctor"),this._register(_.Event.runAndSubscribe(this._accessibilityService.onDidChangeScreenReaderOptimized,()=>{this._accessibilityService.isScreenReaderOptimized()&&!this._asyncFocusGainWriteScreenReaderContent.value?this._asyncFocusGainWriteScreenReaderContent.value=this._register(new m.RunOnceScheduler(()=>this.writeNativeTextAreaContent("asyncFocusGain"),0)):this._asyncFocusGainWriteScreenReaderContent.clear()})),this._hasFocus=!1,this._currentComposition=null;let L=null;this._register(this._textArea.onKeyDown(D=>{const T=new E.StandardKeyboardEvent(D);(T.keyCode===114||this._currentComposition&&T.keyCode===1)&&T.stopPropagation(),T.equals(9)&&T.preventDefault(),L=T,this._onKeyDown.fire(T)})),this._register(this._textArea.onKeyUp(D=>{const T=new E.StandardKeyboardEvent(D);this._onKeyUp.fire(T)})),this._register(this._textArea.onCompositionStart(D=>{o._debugComposition&&console.log("[compositionstart]",D);const T=new l;if(this._currentComposition){this._currentComposition=T;return}if(this._currentComposition=T,this._OS===2&&L&&L.equals(114)&&this._textAreaState.selectionStart===this._textAreaState.selectionEnd&&this._textAreaState.selectionStart>0&&this._textAreaState.value.substr(this._textAreaState.selectionStart-1,1)===D.data&&(L.code==="ArrowRight"||L.code==="ArrowLeft")){o._debugComposition&&console.log("[compositionstart] Handling long press case on macOS + arrow key",D),T.handleCompositionUpdate("x"),this._onCompositionStart.fire({data:D.data});return}if(this._browser.isAndroid){this._onCompositionStart.fire({data:D.data});return}this._onCompositionStart.fire({data:D.data})})),this._register(this._textArea.onCompositionUpdate(D=>{o._debugComposition&&console.log("[compositionupdate]",D);const T=this._currentComposition;if(!T)return;if(this._browser.isAndroid){const A=o.TextAreaState.readFromTextArea(this._textArea,this._textAreaState),P=o.TextAreaState.deduceAndroidCompositionInput(this._textAreaState,A);this._textAreaState=A,this._onType.fire(P),this._onCompositionUpdate.fire(D);return}const M=T.handleCompositionUpdate(D.data);this._textAreaState=o.TextAreaState.readFromTextArea(this._textArea,this._textAreaState),this._onType.fire(M),this._onCompositionUpdate.fire(D)})),this._register(this._textArea.onCompositionEnd(D=>{o._debugComposition&&console.log("[compositionend]",D);const T=this._currentComposition;if(!T)return;if(this._currentComposition=null,this._browser.isAndroid){const A=o.TextAreaState.readFromTextArea(this._textArea,this._textAreaState),P=o.TextAreaState.deduceAndroidCompositionInput(this._textAreaState,A);this._textAreaState=A,this._onType.fire(P),this._onCompositionEnd.fire();return}const M=T.handleCompositionUpdate(D.data);this._textAreaState=o.TextAreaState.readFromTextArea(this._textArea,this._textAreaState),this._onType.fire(M),this._onCompositionEnd.fire()})),this._register(this._textArea.onInput(D=>{if(o._debugComposition&&console.log("[input]",D),this._textArea.setIgnoreSelectionChangeTime("received input event"),this._currentComposition)return;const T=o.TextAreaState.readFromTextArea(this._textArea,this._textAreaState),M=o.TextAreaState.deduceInput(this._textAreaState,T,this._OS===2);M.replacePrevCharCnt===0&&M.text.length===1&&(n.isHighSurrogate(M.text.charCodeAt(0))||M.text.charCodeAt(0)===127)||(this._textAreaState=T,(M.text!==""||M.replacePrevCharCnt!==0||M.replaceNextCharCnt!==0||M.positionDelta!==0)&&this._onType.fire(M))})),this._register(this._textArea.onCut(D=>{this._textArea.setIgnoreSelectionChangeTime("received cut event"),this._ensureClipboardGetsEditorSelection(D),this._asyncTriggerCut.schedule()})),this._register(this._textArea.onCopy(D=>{this._ensureClipboardGetsEditorSelection(D)})),this._register(this._textArea.onPaste(D=>{if(this._textArea.setIgnoreSelectionChangeTime("received paste event"),D.preventDefault(),!D.clipboardData)return;let[T,M]=e.ClipboardEventUtils.getTextData(D.clipboardData);T&&(M=M||c.INSTANCE.get(T),this._onPaste.fire({text:T,metadata:M}))})),this._register(this._textArea.onFocus(()=>{const D=this._hasFocus;this._setHasFocus(!0),this._accessibilityService.isScreenReaderOptimized()&&this._browser.isSafari&&!D&&this._hasFocus&&(this._asyncFocusGainWriteScreenReaderContent.value||(this._asyncFocusGainWriteScreenReaderContent.value=new m.RunOnceScheduler(()=>this.writeNativeTextAreaContent("asyncFocusGain"),0)),this._asyncFocusGainWriteScreenReaderContent.value.schedule())})),this._register(this._textArea.onBlur(()=>{this._currentComposition&&(this._currentComposition=null,this.writeNativeTextAreaContent("blurWithoutCompositionEnd"),this._onCompositionEnd.fire()),this._setHasFocus(!1)})),this._register(this._textArea.onSyntheticTap(()=>{this._browser.isAndroid&&this._currentComposition&&(this._currentComposition=null,this.writeNativeTextAreaContent("tapWithoutCompositionEnd"),this._onCompositionEnd.fire())}))}_installSelectionChangeListener(){let C=0;return k.addDisposableListener(this._textArea.ownerDocument,"selectionchange",f=>{if(y.inputLatency.onSelectionChange(),!this._hasFocus||this._currentComposition||!this._browser.isChrome)return;const h=Date.now(),v=h-C;if(C=h,v<5)return;const w=h-this._textArea.getIgnoreSelectionChangeTime();if(this._textArea.resetSelectionChangeTime(),w<100||!this._textAreaState.selection)return;const S=this._textArea.getValue();if(this._textAreaState.value!==S)return;const L=this._textArea.getSelectionStart(),D=this._textArea.getSelectionEnd();if(this._textAreaState.selectionStart===L&&this._textAreaState.selectionEnd===D)return;const T=this._textAreaState.deduceEditorPosition(L),M=this._host.deduceModelPosition(T[0],T[1],T[2]),A=this._textAreaState.deduceEditorPosition(D),P=this._host.deduceModelPosition(A[0],A[1],A[2]),N=new t.Selection(M.lineNumber,M.column,P.lineNumber,P.column);this._onSelectionChangeRequest.fire(N)})}dispose(){super.dispose(),this._selectionChangeListener&&(this._selectionChangeListener.dispose(),this._selectionChangeListener=null)}focusTextArea(){this._setHasFocus(!0),this.refreshFocusState()}isFocused(){return this._hasFocus}refreshFocusState(){this._setHasFocus(this._textArea.hasFocus())}_setHasFocus(C){this._hasFocus!==C&&(this._hasFocus=C,this._selectionChangeListener&&(this._selectionChangeListener.dispose(),this._selectionChangeListener=null),this._hasFocus&&(this._selectionChangeListener=this._installSelectionChangeListener()),this._hasFocus&&this.writeNativeTextAreaContent("focusgain"),this._hasFocus?this._onFocus.fire():this._onBlur.fire())}_setAndWriteTextAreaState(C,f){this._hasFocus||(f=f.collapseSelection()),f.writeToTextArea(C,this._textArea,this._hasFocus),this._textAreaState=f}writeNativeTextAreaContent(C){!this._accessibilityService.isScreenReaderOptimized()&&C==="render"||this._currentComposition||(this._logService.trace(`writeTextAreaState(reason: ${C})`),this._setAndWriteTextAreaState(C,this._host.getScreenReaderContent()))}_ensureClipboardGetsEditorSelection(C){const f=this._host.getDataToCopy(),h={version:1,isFromEmptySelection:f.isFromEmptySelection,multicursorText:f.multicursorText,mode:f.mode};c.INSTANCE.set(this._browser.isFirefox?f.text.replace(/\r\n/g,` -`):f.text,h),C.preventDefault(),C.clipboardData&&e.ClipboardEventUtils.setTextData(C.clipboardData,f.text,f.html,h)}};e.TextAreaInput=a,e.TextAreaInput=a=ke([ce(4,i.IAccessibilityService),ce(5,s.ILogService)],a),e.ClipboardEventUtils={getTextData(u){const C=u.getData(p.Mimes.text);let f=null;const h=u.getData("vscode-editor-data");if(typeof h=="string")try{f=JSON.parse(h),f.version!==1&&(f=null)}catch{}return C.length===0&&f===null&&u.files.length>0?[Array.prototype.slice.call(u.files,0).map(w=>w.name).join(` -`),null]:[C,f]},setTextData(u,C,f,h){u.setData(p.Mimes.text,C),typeof f=="string"&&u.setData("text/html",f),u.setData("vscode-editor-data",JSON.stringify(h))}};class r extends b.Disposable{get ownerDocument(){return this._actual.ownerDocument}constructor(C){super(),this._actual=C,this.onKeyDown=this._register(new I.DomEmitter(this._actual,"keydown")).event,this.onKeyUp=this._register(new I.DomEmitter(this._actual,"keyup")).event,this.onCompositionStart=this._register(new I.DomEmitter(this._actual,"compositionstart")).event,this.onCompositionUpdate=this._register(new I.DomEmitter(this._actual,"compositionupdate")).event,this.onCompositionEnd=this._register(new I.DomEmitter(this._actual,"compositionend")).event,this.onBeforeInput=this._register(new I.DomEmitter(this._actual,"beforeinput")).event,this.onInput=this._register(new I.DomEmitter(this._actual,"input")).event,this.onCut=this._register(new I.DomEmitter(this._actual,"cut")).event,this.onCopy=this._register(new I.DomEmitter(this._actual,"copy")).event,this.onPaste=this._register(new I.DomEmitter(this._actual,"paste")).event,this.onFocus=this._register(new I.DomEmitter(this._actual,"focus")).event,this.onBlur=this._register(new I.DomEmitter(this._actual,"blur")).event,this._onSyntheticTap=this._register(new _.Emitter),this.onSyntheticTap=this._onSyntheticTap.event,this._ignoreSelectionChangeTime=0,this._register(this.onKeyDown(()=>y.inputLatency.onKeyDown())),this._register(this.onBeforeInput(()=>y.inputLatency.onBeforeInput())),this._register(this.onInput(()=>y.inputLatency.onInput())),this._register(this.onKeyUp(()=>y.inputLatency.onKeyUp())),this._register(k.addDisposableListener(this._actual,g.Tap,()=>this._onSyntheticTap.fire()))}hasFocus(){const C=k.getShadowRoot(this._actual);return C?C.activeElement===this._actual:this._actual.isConnected?k.getActiveElement()===this._actual:!1}setIgnoreSelectionChangeTime(C){this._ignoreSelectionChangeTime=Date.now()}getIgnoreSelectionChangeTime(){return this._ignoreSelectionChangeTime}resetSelectionChangeTime(){this._ignoreSelectionChangeTime=0}getValue(){return this._actual.value}setValue(C,f){const h=this._actual;h.value!==f&&(this.setIgnoreSelectionChangeTime("setValue"),h.value=f)}getSelectionStart(){return this._actual.selectionDirection==="backward"?this._actual.selectionEnd:this._actual.selectionStart}getSelectionEnd(){return this._actual.selectionDirection==="backward"?this._actual.selectionStart:this._actual.selectionEnd}setSelectionRange(C,f,h){const v=this._actual;let w=null;const S=k.getShadowRoot(v);S?w=S.activeElement:w=k.getActiveElement();const L=k.getWindow(w),D=w===v,T=v.selectionStart,M=v.selectionEnd;if(D&&T===f&&M===h){d.isFirefox&&L.parent!==L&&v.focus();return}if(D){this.setIgnoreSelectionChangeTime("setSelectionRange"),v.setSelectionRange(f,h),d.isFirefox&&L.parent!==L&&v.focus();return}try{const A=k.saveParentsScrollTop(v);this.setIgnoreSelectionChangeTime("setSelectionRange"),v.focus(),v.setSelectionRange(f,h),k.restoreParentsScrollTop(v,A)}catch{}}}e.TextAreaWrapper=r}),define(ne[79],se([1,0,129,45,141,271,49,7,62,42]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LanguageFeatureDebounceService=e.ILanguageFeatureDebounceService=void 0,e.ILanguageFeatureDebounceService=(0,m.createDecorator)("ILanguageFeatureDebounceService");var p;(function(i){const s=new WeakMap;let g=0;function c(l){let a=s.get(l);return a===void 0&&(a=++g,s.set(l,a)),a}i.of=c})(p||(p={}));class n{constructor(s){this._default=s}get(s){return this._default}update(s,g){return this._default}default(){return this._default}}class o{constructor(s,g,c,l,a,r){this._logService=s,this._name=g,this._registry=c,this._default=l,this._min=a,this._max=r,this._cache=new k.LRUCache(50,.7)}_key(s){return s.id+this._registry.all(s).reduce((g,c)=>(0,d.doHash)(p.of(c),g),0)}get(s){const g=this._key(s),c=this._cache.get(g);return c?(0,I.clamp)(c.value,this._min,this._max):this.default()}update(s,g){const c=this._key(s);let l=this._cache.get(c);l||(l=new I.SlidingWindowAverage(6),this._cache.set(c,l));const a=(0,I.clamp)(l.update(g),this._min,this._max);return(0,b.matchesScheme)(s.uri,"output")||this._logService.trace(`[DEBOUNCE: ${this._name}] for ${s.uri.toString()} is ${a}ms`),a}_overall(){const s=new I.MovingAverage;for(const[,g]of this._cache)s.update(g.value);return s.value}default(){const s=this._overall()|0||this._default;return(0,I.clamp)(s,this._min,this._max)}}let t=class{constructor(s,g){this._logService=s,this._data=new Map,this._isDev=g.isExtensionDevelopment||!g.isBuilt}for(s,g,c){const l=c?.min??50,a=c?.max??l**2,r=c?.key??void 0,u=`${p.of(s)},${l}${r?","+r:""}`;let C=this._data.get(u);return C||(this._isDev?(this._logService.debug(`[DEBOUNCE: ${g}] is disabled in developed mode`),C=new n(l*1.5)):C=new o(this._logService,g,s,this._overallAverage()|0||l*1.5,l,a),this._data.set(u,C)),C}_overallAverage(){const s=new I.MovingAverage;for(const g of this._data.values())s.update(g.default());return s.value}};e.LanguageFeatureDebounceService=t,e.LanguageFeatureDebounceService=t=ke([ce(0,_.ILogService),ce(1,E.IEnvironmentService)],t),(0,y.registerSingleton)(e.ILanguageFeatureDebounceService,t,1)}),define(ne[182],se([1,0,13,18,8,53,45,9,4,79,7,49,51,2,17]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OutlineModelService=e.IOutlineModelService=e.OutlineModel=e.OutlineGroup=e.OutlineElement=e.TreeElement=void 0;class s{remove(){this.parent?.children.delete(this.id)}static findId(u,C){let f;typeof u=="string"?f=`${C.id}/${u}`:(f=`${C.id}/${u.name}`,C.children.get(f)!==void 0&&(f=`${C.id}/${u.name}_${u.range.startLineNumber}_${u.range.startColumn}`));let h=f;for(let v=0;C.children.get(h)!==void 0;v++)h=`${f}_${v}`;return h}static empty(u){return u.children.size===0}}e.TreeElement=s;class g extends s{constructor(u,C,f){super(),this.id=u,this.parent=C,this.symbol=f,this.children=new Map}}e.OutlineElement=g;class c extends s{constructor(u,C,f,h){super(),this.id=u,this.parent=C,this.label=f,this.order=h,this.children=new Map}}e.OutlineGroup=c;class l extends s{static create(u,C,f){const h=new k.CancellationTokenSource(f),v=new l(C.uri),w=u.ordered(C),S=w.map((D,T)=>{const M=s.findId(`provider_${T}`,v),A=new c(M,v,D.displayName??"Unknown Outline Provider",T);return Promise.resolve(D.provideDocumentSymbols(C,h.token)).then(P=>{for(const N of P||[])l._makeOutlineElement(N,A);return A},P=>((0,I.onUnexpectedExternalError)(P),A)).then(P=>{s.empty(P)?P.remove():v._groups.set(M,P)})}),L=u.onDidChange(()=>{const D=u.ordered(C);(0,d.equals)(D,w)||h.cancel()});return Promise.all(S).then(()=>h.token.isCancellationRequested&&!f.isCancellationRequested?l.create(u,C,f):v._compact()).finally(()=>{h.dispose(),L.dispose(),h.dispose()})}static _makeOutlineElement(u,C){const f=s.findId(u,C),h=new g(f,C,u);if(u.children)for(const v of u.children)l._makeOutlineElement(v,h);C.children.set(h.id,h)}constructor(u){super(),this.uri=u,this.id="root",this.parent=void 0,this._groups=new Map,this.children=new Map,this.id="root",this.parent=void 0}_compact(){let u=0;for(const[C,f]of this._groups)f.children.size===0?this._groups.delete(C):u+=1;if(u!==1)this.children=this._groups;else{const C=E.Iterable.first(this._groups.values());for(const[,f]of C.children)f.parent=this,this.children.set(f.id,f)}return this}getTopLevelSymbols(){const u=[];for(const C of this.children.values())C instanceof g?u.push(C.symbol):u.push(...E.Iterable.map(C.children.values(),f=>f.symbol));return u.sort((C,f)=>_.Range.compareRangesUsingStarts(C.range,f.range))}asListOfDocumentSymbols(){const u=this.getTopLevelSymbols(),C=[];return l._flattenDocumentSymbols(C,u,""),C.sort((f,h)=>m.Position.compare(_.Range.getStartPosition(f.range),_.Range.getStartPosition(h.range))||m.Position.compare(_.Range.getEndPosition(h.range),_.Range.getEndPosition(f.range)))}static _flattenDocumentSymbols(u,C,f){for(const h of C)u.push({kind:h.kind,tags:h.tags,name:h.name,detail:h.detail,containerName:h.containerName||f,range:h.range,selectionRange:h.selectionRange,children:void 0}),h.children&&l._flattenDocumentSymbols(u,h.children,h.name)}}e.OutlineModel=l,e.IOutlineModelService=(0,p.createDecorator)("IOutlineModelService");let a=class{constructor(u,C,f){this._languageFeaturesService=u,this._disposables=new t.DisposableStore,this._cache=new y.LRUCache(10,.7),this._debounceInformation=C.for(u.documentSymbolProvider,"DocumentSymbols",{min:350}),this._disposables.add(f.onModelRemoved(h=>{this._cache.delete(h.id)}))}dispose(){this._disposables.dispose()}async getOrCreate(u,C){const f=this._languageFeaturesService.documentSymbolProvider,h=f.ordered(u);let v=this._cache.get(u.id);if(!v||v.versionId!==u.getVersionId()||!(0,d.equals)(v.provider,h)){const S=new k.CancellationTokenSource;v={versionId:u.getVersionId(),provider:h,promiseCnt:0,source:S,promise:l.create(f,u,S.token),model:void 0},this._cache.set(u.id,v);const L=Date.now();v.promise.then(D=>{v.model=D,this._debounceInformation.update(u,Date.now()-L)}).catch(D=>{this._cache.delete(u.id)})}if(v.model)return v.model;v.promiseCnt+=1;const w=C.onCancellationRequested(()=>{--v.promiseCnt===0&&(v.source.cancel(),this._cache.delete(u.id))});try{return await v.promise}finally{w.dispose()}}};e.OutlineModelService=a,e.OutlineModelService=a=ke([ce(0,i.ILanguageFeaturesService),ce(1,b.ILanguageFeatureDebounceService),ce(2,o.IModelService)],a),(0,n.registerSingleton)(e.IOutlineModelService,a,1)}),define(ne[694],se([1,0,13,21,383,88,17,182,2,6]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0});let p=class extends _.Disposable{constructor(o,t,i){super(),this._textModel=o,this._languageFeaturesService=t,this._outlineModelService=i,this._currentModel=(0,k.observableValue)(this,void 0);const s=(0,k.observableSignalFromEvent)("documentSymbolProvider.onDidChange",this._languageFeaturesService.documentSymbolProvider.onDidChange),g=(0,k.observableSignalFromEvent)("_textModel.onDidChangeContent",b.Event.debounce(c=>this._textModel.onDidChangeContent(c),()=>{},100));this._register((0,k.autorunWithStore)(async(c,l)=>{s.read(c),g.read(c);const a=l.add(new E.DisposableCancellationTokenSource),r=await this._outlineModelService.getOrCreate(this._textModel,a.token);l.isDisposed||this._currentModel.set(r,void 0)}))}getBreadcrumbItems(o,t){const i=this._currentModel.read(t);if(!i)return[];const s=i.asListOfDocumentSymbols().filter(g=>o.contains(g.range.startLineNumber)&&!o.contains(g.range.endLineNumber));return s.sort((0,d.reverseOrder)((0,d.compareBy)(g=>g.range.endLineNumber-g.range.startLineNumber,d.numberComparator))),s.map(g=>({name:g.name,kind:g.kind,startLineNumber:g.range.startLineNumber}))}};p=ke([ce(1,y.ILanguageFeaturesService),ce(2,m.IOutlineModelService)],p),I.HideUnchangedRegionsFeature.setBreadcrumbsSourceFactory((n,o)=>o.createInstance(p,n))}),define(ne[695],se([1,0,18,19,22,78,182,24]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),m.CommandsRegistry.registerCommand("_executeDocumentSymbolProvider",async function(_,...b){const[p]=b;(0,k.assertType)(I.URI.isUri(p));const n=_.get(y.IOutlineModelService),t=await _.get(E.ITextModelService).createModelReference(p);try{return(await n.getOrCreate(t.object.textEditorModel,d.CancellationToken.None)).getTopLevelSymbols()}finally{t.dispose()}})}),define(ne[696],se([1,0,64,5,52,14,6,129,2,22,119,62]),function(oe,e,d,k,I,E,y,m,_,b,p,n){"use strict";var o;Object.defineProperty(e,"__esModule",{value:!0}),e.BrowserClipboardService=void 0;const t="application/vnd.code.resources";let i=class extends _.Disposable{static{o=this}constructor(g,c){super(),this.layoutService=g,this.logService=c,this.mapTextToType=new Map,this.findText="",this.resources=[],this.resourcesStateHash=void 0,(d.isSafari||d.isWebkitWebView)&&this.installWebKitWriteTextWorkaround(),this._register(y.Event.runAndSubscribe(k.onDidRegisterWindow,({window:l,disposables:a})=>{a.add((0,k.addDisposableListener)(l.document,"copy",()=>this.clearResourcesState()))},{window:I.mainWindow,disposables:this._store}))}installWebKitWriteTextWorkaround(){const g=()=>{const c=new E.DeferredPromise;this.webKitPendingClipboardWritePromise&&!this.webKitPendingClipboardWritePromise.isSettled&&this.webKitPendingClipboardWritePromise.cancel(),this.webKitPendingClipboardWritePromise=c,(0,k.getActiveWindow)().navigator.clipboard.write([new ClipboardItem({"text/plain":c.p})]).catch(async l=>{(!(l instanceof Error)||l.name!=="NotAllowedError"||!c.isRejected)&&this.logService.error(l)})};this._register(y.Event.runAndSubscribe(this.layoutService.onDidAddContainer,({container:c,disposables:l})=>{l.add((0,k.addDisposableListener)(c,"click",g)),l.add((0,k.addDisposableListener)(c,"keydown",g))},{container:this.layoutService.mainContainer,disposables:this._store}))}async writeText(g,c){if(this.clearResourcesState(),c){this.mapTextToType.set(c,g);return}if(this.webKitPendingClipboardWritePromise)return this.webKitPendingClipboardWritePromise.complete(g);try{return await(0,k.getActiveWindow)().navigator.clipboard.writeText(g)}catch(l){console.error(l)}this.fallbackWriteText(g)}fallbackWriteText(g){const c=(0,k.getActiveDocument)(),l=c.activeElement,a=c.body.appendChild((0,k.$)("textarea",{"aria-hidden":!0}));a.style.height="1px",a.style.width="1px",a.style.position="absolute",a.value=g,a.focus(),a.select(),c.execCommand("copy"),(0,k.isHTMLElement)(l)&&l.focus(),a.remove()}async readText(g){if(g)return this.mapTextToType.get(g)||"";try{return await(0,k.getActiveWindow)().navigator.clipboard.readText()}catch(c){console.error(c)}return""}async readFindText(){return this.findText}async writeFindText(g){this.findText=g}static{this.MAX_RESOURCE_STATE_SOURCE_LENGTH=1e3}async readResources(){try{const c=await(0,k.getActiveWindow)().navigator.clipboard.read();for(const l of c)if(l.types.includes(`web ${t}`)){const a=await l.getType(`web ${t}`);return JSON.parse(await a.text()).map(u=>b.URI.from(u))}}catch{}const g=await this.computeResourcesStateHash();return this.resourcesStateHash!==g&&this.clearResourcesState(),this.resources}async computeResourcesStateHash(){if(this.resources.length===0)return;const g=await this.readText();return(0,m.hash)(g.substring(0,o.MAX_RESOURCE_STATE_SOURCE_LENGTH))}clearInternalState(){this.clearResourcesState()}clearResourcesState(){this.resources=[],this.resourcesStateHash=void 0}};e.BrowserClipboardService=i,e.BrowserClipboardService=i=o=ke([ce(0,p.ILayoutService),ce(1,n.ILogService)],i)}),define(ne[697],se([1,0,2,62]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LogService=void 0;class I extends d.Disposable{constructor(y,m=[]){super(),this.logger=new k.MultiplexLogger([y,...m]),this._register(y.onDidChangeLogLevel(_=>this.setLevel(_)))}get onDidChangeLogLevel(){return this.logger.onDidChangeLogLevel}setLevel(y){this.logger.setLevel(y)}getLevel(){return this.logger.getLevel()}trace(y,...m){this.logger.trace(y,...m)}debug(y,...m){this.logger.debug(y,...m)}info(y,...m){this.logger.info(y,...m)}warn(y,...m){this.logger.warn(y,...m)}error(y,...m){this.logger.error(y,...m)}}e.LogService=I}),define(ne[108],se([1,0,111,3,7]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IMarkerService=e.IMarkerData=e.MarkerSeverity=void 0;var E;(function(m){m[m.Hint=1]="Hint",m[m.Info=2]="Info",m[m.Warning=4]="Warning",m[m.Error=8]="Error"})(E||(e.MarkerSeverity=E={})),function(m){function _(t,i){return i-t}m.compare=_;const b=Object.create(null);b[m.Error]=(0,k.localize)(1569,"Error"),b[m.Warning]=(0,k.localize)(1570,"Warning"),b[m.Info]=(0,k.localize)(1571,"Info");function p(t){return b[t]||""}m.toString=p;function n(t){switch(t){case d.default.Error:return m.Error;case d.default.Warning:return m.Warning;case d.default.Info:return m.Info;case d.default.Ignore:return m.Hint}}m.fromSeverity=n;function o(t){switch(t){case m.Error:return d.default.Error;case m.Warning:return d.default.Warning;case m.Info:return d.default.Info;case m.Hint:return d.default.Ignore}}m.toSeverity=o}(E||(e.MarkerSeverity=E={}));var y;(function(m){const _="";function b(n){return p(n,!0)}m.makeKey=b;function p(n,o){const t=[_];return n.source?t.push(n.source.replace("\xA6","\\\xA6")):t.push(_),n.code?typeof n.code=="string"?t.push(n.code.replace("\xA6","\\\xA6")):t.push(n.code.value.replace("\xA6","\\\xA6")):t.push(_),n.severity!==void 0&&n.severity!==null?t.push(E.toString(n.severity)):t.push(_),n.message&&o?t.push(n.message.replace("\xA6","\\\xA6")):t.push(_),n.startLineNumber!==void 0&&n.startLineNumber!==null?t.push(n.startLineNumber.toString()):t.push(_),n.startColumn!==void 0&&n.startColumn!==null?t.push(n.startColumn.toString()):t.push(_),n.endLineNumber!==void 0&&n.endLineNumber!==null?t.push(n.endLineNumber.toString()):t.push(_),n.endColumn!==void 0&&n.endColumn!==null?t.push(n.endColumn.toString()):t.push(_),t.push(_),t.join("\xA6")}m.makeKeyOptionalMessage=p})(y||(e.IMarkerData=y={})),e.IMarkerService=(0,I.createDecorator)("markerService")}),define(ne[698],se([1,0,13,6,2,73,11,22,4,49,7,108,28]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IMarkerNavigationService=e.MarkerList=e.MarkerCoordinate=void 0;class t{constructor(c,l,a){this.marker=c,this.index=l,this.total=a}}e.MarkerCoordinate=t;let i=class{constructor(c,l,a){this._markerService=l,this._configService=a,this._onDidChange=new k.Emitter,this.onDidChange=this._onDidChange.event,this._dispoables=new I.DisposableStore,this._markers=[],this._nextIdx=-1,m.URI.isUri(c)?this._resourceFilter=f=>f.toString()===c.toString():c&&(this._resourceFilter=c);const r=this._configService.getValue("problems.sortOrder"),u=(f,h)=>{let v=(0,y.compare)(f.resource.toString(),h.resource.toString());return v===0&&(r==="position"?v=_.Range.compareRangesUsingStarts(f,h)||n.MarkerSeverity.compare(f.severity,h.severity):v=n.MarkerSeverity.compare(f.severity,h.severity)||_.Range.compareRangesUsingStarts(f,h)),v},C=()=>{this._markers=this._markerService.read({resource:m.URI.isUri(c)?c:void 0,severities:n.MarkerSeverity.Error|n.MarkerSeverity.Warning|n.MarkerSeverity.Info}),typeof c=="function"&&(this._markers=this._markers.filter(f=>this._resourceFilter(f.resource))),this._markers.sort(u)};C(),this._dispoables.add(l.onMarkerChanged(f=>{(!this._resourceFilter||f.some(h=>this._resourceFilter(h)))&&(C(),this._nextIdx=-1,this._onDidChange.fire())}))}dispose(){this._dispoables.dispose(),this._onDidChange.dispose()}matches(c){return!this._resourceFilter&&!c?!0:!this._resourceFilter||!c?!1:this._resourceFilter(c)}get selected(){const c=this._markers[this._nextIdx];return c&&new t(c,this._nextIdx+1,this._markers.length)}_initIdx(c,l,a){let r=!1,u=this._markers.findIndex(C=>C.resource.toString()===c.uri.toString());u<0&&(u=(0,d.binarySearch)(this._markers,{resource:c.uri},(C,f)=>(0,y.compare)(C.resource.toString(),f.resource.toString())),u<0&&(u=~u));for(let C=u;Cr.resource.toString()===c.toString());if(!(a<0)){for(;ai[1])}}class p{constructor(t){this.errors=0,this.infos=0,this.warnings=0,this.unknowns=0,this._data=new E.ResourceMap,this._service=t,this._subscription=t.onMarkerChanged(this._update,this)}dispose(){this._subscription.dispose()}_update(t){for(const i of t){const s=this._data.get(i);s&&this._substract(s);const g=this._resourceStats(i);this._add(g),this._data.set(i,g)}}_resourceStats(t){const i={errors:0,warnings:0,infos:0,unknowns:0};if(e.unsupportedSchemas.has(t.scheme))return i;for(const{severity:s}of this._service.read({resource:t}))s===_.MarkerSeverity.Error?i.errors+=1:s===_.MarkerSeverity.Warning?i.warnings+=1:s===_.MarkerSeverity.Info?i.infos+=1:i.unknowns+=1;return i}_substract(t){this.errors-=t.errors,this.warnings-=t.warnings,this.infos-=t.infos,this.unknowns-=t.unknowns}_add(t){this.errors+=t.errors,this.warnings+=t.warnings,this.infos+=t.infos,this.unknowns+=t.unknowns}}class n{constructor(){this._onMarkerChanged=new k.DebounceEmitter({delay:0,merge:n._merge}),this.onMarkerChanged=this._onMarkerChanged.event,this._data=new b,this._stats=new p(this)}dispose(){this._stats.dispose(),this._onMarkerChanged.dispose()}remove(t,i){for(const s of i||[])this.changeOne(t,s,[])}changeOne(t,i,s){if((0,d.isFalsyOrEmpty)(s))this._data.delete(i,t)&&this._onMarkerChanged.fire([i]);else{const g=[];for(const c of s){const l=n._toMarker(t,i,c);l&&g.push(l)}this._data.set(i,t,g),this._onMarkerChanged.fire([i])}}static _toMarker(t,i,s){let{code:g,severity:c,message:l,source:a,startLineNumber:r,startColumn:u,endLineNumber:C,endColumn:f,relatedInformation:h,tags:v}=s;if(l)return r=r>0?r:1,u=u>0?u:1,C=C>=r?C:r,f=f>0?f:u,{resource:i,owner:t,code:g,severity:c,message:l,source:a,startLineNumber:r,startColumn:u,endLineNumber:C,endColumn:f,relatedInformation:h,tags:v}}changeAll(t,i){const s=[],g=this._data.values(t);if(g)for(const c of g){const l=I.Iterable.first(c);l&&(s.push(l.resource),this._data.delete(l.resource,t))}if((0,d.isNonEmptyArray)(i)){const c=new E.ResourceMap;for(const{resource:l,marker:a}of i){const r=n._toMarker(t,l,a);if(!r)continue;const u=c.get(l);u?u.push(r):(c.set(l,[r]),s.push(l))}for(const[l,a]of c)this._data.set(l,t,a)}s.length>0&&this._onMarkerChanged.fire(s)}read(t=Object.create(null)){let{owner:i,resource:s,severities:g,take:c}=t;if((!c||c<0)&&(c=-1),i&&s){const l=this._data.get(s,i);if(l){const a=[];for(const r of l)if(n._accept(r,g)){const u=a.push(r);if(c>0&&u===c)break}return a}else return[]}else if(!i&&!s){const l=[];for(const a of this._data.values())for(const r of a)if(n._accept(r,g)){const u=l.push(r);if(c>0&&u===c)return l}return l}else{const l=this._data.values(s??i),a=[];for(const r of l)for(const u of r)if(n._accept(u,g)){const C=a.push(u);if(c>0&&C===c)return a}return a}}static _accept(t,i){return i===void 0||(i&t.severity)===t.severity}static _merge(t){const i=new E.ResourceMap;for(const s of t)for(const g of s)i.set(g,!0);return Array.from(i.keys())}}e.MarkerService=n}),define(ne[50],se([1,0,111,7]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.NoOpNotification=e.INotificationService=e.Severity=void 0,e.Severity=d.default,e.INotificationService=(0,k.createDecorator)("notificationService");class I{}e.NoOpNotification=I}),define(ne[396],se([1,0,5,258,41,346,8,6,2,152,268,3,12,58,7,31,50,508]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g){"use strict";var c;Object.defineProperty(e,"__esModule",{value:!0}),e.PostEditWidgetManager=void 0;let l=class extends _.Disposable{static{c=this}static{this.baseId="editor.widget.postEditWidget"}constructor(u,C,f,h,v,w,S,L,D,T){super(),this.typeId=u,this.editor=C,this.showCommand=h,this.range=v,this.edits=w,this.onSelectNewEdit=S,this._contextMenuService=L,this._keybindingService=T,this.allowEditorOverflow=!0,this.suppressMouseDown=!0,this.create(),this.visibleContext=f.bindTo(D),this.visibleContext.set(!0),this._register((0,_.toDisposable)(()=>this.visibleContext.reset())),this.editor.addContentWidget(this),this.editor.layoutContentWidget(this),this._register((0,_.toDisposable)(()=>this.editor.removeContentWidget(this))),this._register(this.editor.onDidChangeCursorPosition(M=>{v.containsPosition(M.position)||this.dispose()})),this._register(m.Event.runAndSubscribe(T.onDidUpdateKeybindings,()=>{this._updateButtonTitle()}))}_updateButtonTitle(){const u=this._keybindingService.lookupKeybinding(this.showCommand.id)?.getLabel();this.button.element.title=this.showCommand.label+(u?` (${u})`:"")}create(){this.domNode=d.$(".post-edit-widget"),this.button=this._register(new k.Button(this.domNode,{supportIcons:!0})),this.button.label="$(insert)",this._register(d.addDisposableListener(this.domNode,d.EventType.CLICK,()=>this.showSelector()))}getId(){return c.baseId+"."+this.typeId}getDomNode(){return this.domNode}getPosition(){return{position:this.range.getEndPosition(),preference:[2]}}showSelector(){this._contextMenuService.showContextMenu({getAnchor:()=>{const u=d.getDomNodePagePosition(this.button.element);return{x:u.left+u.width,y:u.top+u.height}},getActions:()=>this.edits.allEdits.map((u,C)=>(0,I.toAction)({id:"",label:u.title,checked:C===this.edits.activeEditIndex,run:()=>{if(C!==this.edits.activeEditIndex)return this.onSelectNewEdit(C)}}))})}};l=c=ke([ce(7,t.IContextMenuService),ce(8,o.IContextKeyService),ce(9,s.IKeybindingService)],l);let a=class extends _.Disposable{constructor(u,C,f,h,v,w,S){super(),this._id=u,this._editor=C,this._visibleContext=f,this._showCommand=h,this._instantiationService=v,this._bulkEditService=w,this._notificationService=S,this._currentWidget=this._register(new _.MutableDisposable),this._register(m.Event.any(C.onDidChangeModel,C.onDidChangeModelContent)(()=>this.clear()))}async applyEditAndShowIfNeeded(u,C,f,h,v){const w=this._editor.getModel();if(!w||!u.length)return;const S=C.allEdits.at(C.activeEditIndex);if(!S)return;const L=async F=>{const x=this._editor.getModel();x&&(await x.undo(),this.applyEditAndShowIfNeeded(u,{activeEditIndex:F,allEdits:C.allEdits},f,h,v))},D=(F,x)=>{(0,y.isCancellationError)(F)||(this._notificationService.error(x),f&&this.show(u[0],C,L))};let T;try{T=await h(S,v)}catch(F){return D(F,(0,n.localize)(845,`Error resolving edit '{0}': -{1}`,S.title,(0,E.toErrorMessage)(F)))}if(v.isCancellationRequested)return;const M=(0,p.createCombinedWorkspaceEdit)(w.uri,u,T),A=u[0],P=w.deltaDecorations([],[{range:A,options:{description:"paste-line-suffix",stickiness:0}}]);this._editor.focus();let N,O;try{N=await this._bulkEditService.apply(M,{editor:this._editor,token:v}),O=w.getDecorationRange(P[0])}catch(F){return D(F,(0,n.localize)(846,`Error applying edit '{0}': -{1}`,S.title,(0,E.toErrorMessage)(F)))}finally{w.deltaDecorations(P,[])}v.isCancellationRequested||f&&N.isApplied&&C.allEdits.length>1&&this.show(O??A,C,L)}show(u,C,f){this.clear(),this._editor.hasModel()&&(this._currentWidget.value=this._instantiationService.createInstance(l,this._id,this._editor,this._visibleContext,this._showCommand,u,C,f))}clear(){this._currentWidget.clear()}tryShowSelector(){this._currentWidget.value?.showSelector()}};e.PostEditWidgetManager=a,e.PostEditWidgetManager=a=ke([ce(4,i.IInstantiationService),ce(5,b.IBulkEditService),ce(6,g.INotificationService)],a)}),define(ne[397],se([1,0,21,189]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.observableConfigValue=I,e.bindContextKey=E;function I(y,m,_){return(0,k.observableFromEventOpts)({debugName:()=>`Configuration Key "${y}"`},b=>_.onDidChangeConfiguration(p=>{p.affectsConfiguration(y)&&b(p)}),()=>_.getValue(y)??m)}function E(y,m,_){const b=y.bindTo(m);return(0,d.autorunOpts)({debugName:()=>`Set Context Key "${y.key}"`},p=>{b.set(_(p))})}}),define(ne[700],se([1,0,349,171,21,7]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.wrapInReloadableClass1=_;class y{constructor(n){this.instantiationService=n}init(...n){}}function m(p,n){return class extends n{constructor(){super(...arguments),this._autorun=void 0}init(...t){this._autorun=(0,I.autorunWithStore)((i,s)=>{const g=(0,k.readHotReloadableExport)(p(),i);s.add(this.instantiationService.createInstance(g,...t))})}dispose(){this._autorun?.dispose()}}}function _(p){return(0,d.isHotReloadEnabled)()?m(p,b):p()}let b=class extends y{constructor(n,o){super(o),this.init(n)}};b=ke([ce(1,E.IInstantiationService)],b)}),define(ne[59],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IOpenerService=void 0,e.extractSelection=k,e.IOpenerService=(0,d.createDecorator)("openerService");function k(I){let E;const y=/^L?(\d+)(?:,(\d+))?(-L?(\d+)(?:,(\d+))?)?/.exec(I.fragment);return y&&(E={startLineNumber:parseInt(y[1]),startColumn:y[2]?parseInt(y[2]):1,endLineNumber:y[4]?parseInt(y[4]):void 0,endColumn:y[4]?y[5]?parseInt(y[5]):1:void 0},I=I.with({fragment:""})),{selection:E,uri:I}}}),define(ne[701],se([1,0,5,52,18,73,45,252,42,48,22,34,24,673,59]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OpenerService=void 0;let s=class{constructor(a){this._commandService=a}async open(a,r){if(!(0,_.matchesScheme)(a,_.Schemas.command))return!1;if(!r?.allowCommands||(typeof a=="string"&&(a=p.URI.parse(a)),Array.isArray(r.allowCommands)&&!r.allowCommands.includes(a.path)))return!0;let u=[];try{u=(0,m.parse)(decodeURIComponent(a.query))}catch{try{u=(0,m.parse)(a.query)}catch{}}return Array.isArray(u)||(u=[u]),await this._commandService.executeCommand(a.path,...u),!0}};s=ke([ce(0,o.ICommandService)],s);let g=class{constructor(a){this._editorService=a}async open(a,r){typeof a=="string"&&(a=p.URI.parse(a));const{selection:u,uri:C}=(0,i.extractSelection)(a);return a=C,a.scheme===_.Schemas.file&&(a=(0,b.normalizePath)(a)),await this._editorService.openCodeEditor({resource:a,options:{selection:u,source:r?.fromUserGesture?t.EditorOpenSource.USER:t.EditorOpenSource.API,...r?.editorOptions}},this._editorService.getFocusedCodeEditor(),r?.openToSide),!0}};g=ke([ce(0,n.ICodeEditorService)],g);let c=class{constructor(a,r){this._openers=new E.LinkedList,this._validators=new E.LinkedList,this._resolvers=new E.LinkedList,this._resolvedUriTargets=new y.ResourceMap(u=>u.with({path:null,fragment:null,query:null}).toString()),this._externalOpeners=new E.LinkedList,this._defaultExternalOpener={openExternal:async u=>((0,_.matchesSomeScheme)(u,_.Schemas.http,_.Schemas.https)?d.windowOpenNoOpener(u):k.mainWindow.location.href=u,!0)},this._openers.push({open:async(u,C)=>C?.openExternal||(0,_.matchesSomeScheme)(u,_.Schemas.mailto,_.Schemas.http,_.Schemas.https,_.Schemas.vsls)?(await this._doOpenExternal(u,C),!0):!1}),this._openers.push(new s(r)),this._openers.push(new g(a))}registerOpener(a){return{dispose:this._openers.unshift(a)}}async open(a,r){const u=typeof a=="string"?p.URI.parse(a):a,C=this._resolvedUriTargets.get(u)??a;for(const f of this._validators)if(!await f.shouldOpen(C,r))return!1;for(const f of this._openers)if(await f.open(a,r))return!0;return!1}async resolveExternalUri(a,r){for(const u of this._resolvers)try{const C=await u.resolveExternalUri(a,r);if(C)return this._resolvedUriTargets.has(C.resolved)||this._resolvedUriTargets.set(C.resolved,a),C}catch{}throw new Error("Could not resolve external URI: "+a.toString())}async _doOpenExternal(a,r){const u=typeof a=="string"?p.URI.parse(a):a;let C;try{C=(await this.resolveExternalUri(u,r)).resolved}catch{C=u}let f;if(typeof a=="string"&&u.toString()===C.toString()?f=a:f=encodeURI(C.toString(!0)),r?.allowContributedOpeners){const h=typeof r?.allowContributedOpeners=="string"?r?.allowContributedOpeners:void 0;for(const v of this._externalOpeners)if(await v.openExternal(f,{sourceUri:u,preferredOpenerId:h},I.CancellationToken.None))return!0}return this._defaultExternalOpener.openExternal(f,{sourceUri:u},I.CancellationToken.None)}dispose(){this._validators.clear()}};e.OpenerService=c,e.OpenerService=c=ke([ce(0,n.ICodeEditorService),ce(1,o.ICommandService)],c)}),define(ne[702],se([1,0,5,93,47,69,6,2,59,44,118,543]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Link=void 0;let n=class extends m.Disposable{get enabled(){return this._enabled}set enabled(t){t?(this.el.setAttribute("aria-disabled","false"),this.el.tabIndex=0,this.el.style.pointerEvents="auto",this.el.style.opacity="1",this.el.style.cursor="pointer",this._enabled=!1):(this.el.setAttribute("aria-disabled","true"),this.el.tabIndex=-1,this.el.style.pointerEvents="none",this.el.style.opacity="0.4",this.el.style.cursor="default",this._enabled=!0),this._enabled=t}constructor(t,i,s={},g,c){super(),this._link=i,this._hoverService=g,this._enabled=!0,this.el=(0,d.append)(t,(0,d.$)("a.monaco-link",{tabIndex:i.tabIndex??0,href:i.href},i.label)),this.hoverDelegate=s.hoverDelegate??(0,b.getDefaultHoverDelegate)("mouse"),this.setTooltip(i.title),this.el.setAttribute("role","button");const l=this._register(new k.DomEmitter(this.el,"click")),a=this._register(new k.DomEmitter(this.el,"keypress")),r=y.Event.chain(a.event,f=>f.map(h=>new I.StandardKeyboardEvent(h)).filter(h=>h.keyCode===3)),u=this._register(new k.DomEmitter(this.el,E.EventType.Tap)).event;this._register(E.Gesture.addTarget(this.el));const C=y.Event.any(l.event,r,u);this._register(C(f=>{this.enabled&&(d.EventHelper.stop(f,!0),s?.opener?s.opener(this._link.href):c.open(this._link.href,{allowCommands:!0}))})),this.enabled=!0}setTooltip(t){this.hoverDelegate.showNativeHover?this.el.title=t??"":!this.hover&&t?this.hover=this._register(this._hoverService.setupManagedHover(this.hoverDelegate,this.el,t)):this.hover&&this.hover.update(t)}};e.Link=n,e.Link=n=ke([ce(3,p.IHoverService),ce(4,_.IOpenerService)],n)}),define(ne[96],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IEditorProgressService=e.Progress=e.emptyProgressRunner=e.IProgressService=void 0,e.IProgressService=(0,d.createDecorator)("progressService"),e.emptyProgressRunner=Object.freeze({total(){},worked(){},done(){}});class k{static{this.None=Object.freeze({report(){}})}constructor(E){this.callback=E}report(E){this._value=E,this.callback(this._value)}}e.Progress=k,e.IEditorProgressService=(0,d.createDecorator)("editorProgressService")}),define(ne[703],se([1,0,14,18,2,19]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PickerQuickAccessProvider=e.TriggerAction=void 0;var y;(function(p){p[p.NO_ACTION=0]="NO_ACTION",p[p.CLOSE_PICKER=1]="CLOSE_PICKER",p[p.REFRESH_PICKER=2]="REFRESH_PICKER",p[p.REMOVE_ITEM=3]="REMOVE_ITEM"})(y||(e.TriggerAction=y={}));function m(p){const n=p;return Array.isArray(n.items)}function _(p){const n=p;return!!n.picks&&n.additionalPicks instanceof Promise}class b extends I.Disposable{constructor(n,o){super(),this.prefix=n,this.options=o}provide(n,o,t){const i=new I.DisposableStore;n.canAcceptInBackground=!!this.options?.canAcceptInBackground,n.matchOnLabel=n.matchOnDescription=n.matchOnDetail=n.sortByLabel=!1;let s;const g=i.add(new I.MutableDisposable),c=async()=>{const a=g.value=new I.DisposableStore;s?.dispose(!0),n.busy=!1,s=new k.CancellationTokenSource(o);const r=s.token;let u=n.value.substring(this.prefix.length);this.options?.shouldSkipTrimPickFilter||(u=u.trim());const C=this._getPicks(u,a,r,t),f=(v,w)=>{let S,L;if(m(v)?(S=v.items,L=v.active):S=v,S.length===0){if(w)return!1;(u.length>0||n.hideInput)&&this.options?.noResultsPick&&((0,E.isFunction)(this.options.noResultsPick)?S=[this.options.noResultsPick(u)]:S=[this.options.noResultsPick])}return n.items=S,L&&(n.activeItems=[L]),!0},h=async v=>{let w=!1,S=!1;await Promise.all([(async()=>{typeof v.mergeDelay=="number"&&(await(0,d.timeout)(v.mergeDelay),r.isCancellationRequested)||S||(w=f(v.picks,!0))})(),(async()=>{n.busy=!0;try{const L=await v.additionalPicks;if(r.isCancellationRequested)return;let D,T;m(v.picks)?(D=v.picks.items,T=v.picks.active):D=v.picks;let M,A;if(m(L)?(M=L.items,A=L.active):M=L,M.length>0||!w){let P;if(!T&&!A){const N=n.activeItems[0];N&&D.indexOf(N)!==-1&&(P=N)}f({items:[...D,...M],active:T||A||P})}}finally{r.isCancellationRequested||(n.busy=!1),S=!0}})()])};if(C!==null)if(_(C))await h(C);else if(!(C instanceof Promise))f(C);else{n.busy=!0;try{const v=await C;if(r.isCancellationRequested)return;_(v)?await h(v):f(v)}finally{r.isCancellationRequested||(n.busy=!1)}}};i.add(n.onDidChangeValue(()=>c())),c(),i.add(n.onDidAccept(a=>{if(t?.handleAccept){a.inBackground||n.hide(),t.handleAccept?.(n.activeItems[0]);return}const[r]=n.selectedItems;typeof r?.accept=="function"&&(a.inBackground||n.hide(),r.accept(n.keyMods,a))}));const l=async(a,r)=>{if(typeof r.trigger!="function")return;const u=r.buttons?.indexOf(a)??-1;if(u>=0){const C=r.trigger(u,n.keyMods),f=typeof C=="number"?C:await C;if(o.isCancellationRequested)return;switch(f){case y.NO_ACTION:break;case y.CLOSE_PICKER:n.hide();break;case y.REFRESH_PICKER:c();break;case y.REMOVE_ITEM:{const h=n.items.indexOf(r);if(h!==-1){const v=n.items.slice(),w=v.splice(h,1),S=n.activeItems.filter(D=>D!==w[0]),L=n.keepScrollPosition;n.keepScrollPosition=!0,n.items=v,S&&(n.activeItems=S),n.keepScrollPosition=L}break}}}};return i.add(n.onDidTriggerItemButton(({button:a,item:r})=>l(a,r))),i.add(n.onDidTriggerSeparatorButton(({button:a,separator:r})=>l(a,r))),i}}e.PickerQuickAccessProvider=b}),define(ne[704],se([1,0,5,260,2,111,228]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputBox=void 0;const y=d.$;class m extends I.Disposable{constructor(b,p,n){super(),this.parent=b,this.onKeyDown=t=>d.addStandardDisposableListener(this.findInput.inputBox.inputElement,d.EventType.KEY_DOWN,t),this.onDidChange=t=>this.findInput.onDidChange(t),this.container=d.append(this.parent,y(".quick-input-box")),this.findInput=this._register(new k.FindInput(this.container,void 0,{label:"",inputBoxStyles:p,toggleStyles:n}));const o=this.findInput.inputBox.inputElement;o.role="combobox",o.ariaHasPopup="menu",o.ariaAutoComplete="list",o.ariaExpanded="true"}get value(){return this.findInput.getValue()}set value(b){this.findInput.setValue(b)}select(b=null){this.findInput.inputBox.select(b)}getSelection(){return this.findInput.inputBox.getSelection()}isSelectionAtEnd(){return this.findInput.inputBox.isSelectionAtEnd()}get placeholder(){return this.findInput.inputBox.inputElement.getAttribute("placeholder")||""}set placeholder(b){this.findInput.inputBox.setPlaceHolder(b)}get password(){return this.findInput.inputBox.inputElement.type==="password"}set password(b){this.findInput.inputBox.inputElement.type=b?"password":"text"}set enabled(b){this.findInput.inputBox.inputElement.toggleAttribute("readonly",!b)}set toggles(b){this.findInput.setAdditionalToggles(b)}setAttribute(b,p){this.findInput.inputBox.inputElement.setAttribute(b,p)}showDecoration(b){b===E.default.Ignore?this.findInput.clearMessage():this.findInput.showMessage({type:b===E.default.Info?1:b===E.default.Warning?2:3,content:""})}stylesForType(b){return this.findInput.inputBox.stylesForType(b===E.default.Info?1:b===E.default.Warning?2:3)}setFocus(){this.findInput.focus()}layout(){this.findInput.inputBox.layout()}}e.QuickInputBox=m}),define(ne[398],se([1,0,5,93,6,47,69,114,187,446,3,228]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.quickInputButtonToAction=i,e.renderQuickInputDescription=s;const n={},o=new _.IdGenerator("quick-input-button-icon-");function t(g){if(!g)return;let c;const l=g.dark.toString();return n[l]?c=n[l]:(c=o.nextId(),d.createCSSRule(`.${c}, .hc-light .${c}`,`background-image: ${d.asCSSUrl(g.light||g.dark)}`),d.createCSSRule(`.vs-dark .${c}, .hc-black .${c}`,`background-image: ${d.asCSSUrl(g.dark)}`),n[l]=c),c}function i(g,c,l){let a=g.iconClass||t(g.iconPath);return g.alwaysVisible&&(a=a?`${a} always-visible`:"always-visible"),{id:c,label:"",tooltip:g.tooltip||"",class:a,enabled:!0,run:l}}function s(g,c,l){d.reset(c);const a=(0,b.parseLinkedText)(g);let r=0;for(const u of a.nodes)if(typeof u=="string")c.append(...(0,m.renderLabelWithIcons)(u));else{let C=u.title;!C&&u.href.startsWith("command:")?C=(0,p.localize)(1598,"Click to execute command '{0}'",u.href.substring(8)):C||(C=u.href);const f=d.$("a",{href:u.href,title:C,tabIndex:r++},u.label);f.style.textDecoration="underline";const h=D=>{d.isEventLike(D)&&d.EventHelper.stop(D,!0),l.callback(u.href)},v=l.disposables.add(new k.DomEmitter(f,d.EventType.CLICK)).event,w=l.disposables.add(new k.DomEmitter(f,d.EventType.KEY_DOWN)).event,S=I.Event.chain(w,D=>D.filter(T=>{const M=new E.StandardKeyboardEvent(T);return M.equals(10)||M.equals(3)}));l.disposables.add(y.Gesture.addTarget(f));const L=l.disposables.add(new k.DomEmitter(f,y.EventType.Tap)).event;I.Event.any(v,L,S)(h,null,l.disposables),c.appendChild(f)}}}),define(ne[66],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IQuickInputService=e.quickPickItemScorerAccessor=e.QuickPickItemScorerAccessor=e.QuickInputButtonLocation=e.QuickPickFocus=e.ItemActivation=e.QuickInputHideReason=e.NO_KEY_MODS=void 0,e.NO_KEY_MODS={ctrlCmd:!1,alt:!1};var k;(function(_){_[_.Blur=1]="Blur",_[_.Gesture=2]="Gesture",_[_.Other=3]="Other"})(k||(e.QuickInputHideReason=k={}));var I;(function(_){_[_.NONE=0]="NONE",_[_.FIRST=1]="FIRST",_[_.SECOND=2]="SECOND",_[_.LAST=3]="LAST"})(I||(e.ItemActivation=I={}));var E;(function(_){_[_.First=1]="First",_[_.Second=2]="Second",_[_.Last=3]="Last",_[_.Next=4]="Next",_[_.Previous=5]="Previous",_[_.NextPage=6]="NextPage",_[_.PreviousPage=7]="PreviousPage",_[_.NextSeparator=8]="NextSeparator",_[_.PreviousSeparator=9]="PreviousSeparator"})(E||(e.QuickPickFocus=E={}));var y;(function(_){_[_.Title=1]="Title",_[_.Inline=2]="Inline"})(y||(e.QuickInputButtonLocation=y={}));class m{constructor(b){this.options=b}}e.QuickPickItemScorerAccessor=m,e.quickPickItemScorerAccessor=new m,e.IQuickInputService=(0,d.createDecorator)("quickInputService")}),define(ne[272],se([1,0,5,47,175,13,14,26,6,2,16,111,30,3,66,398,28,118,12,228]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputHoverDelegate=e.InputBox=e.QuickPick=e.backButton=e.endOfQuickInputBoxContext=e.EndOfQuickInputBoxContextKey=e.endOfQuickInputBoxContextKeyValue=e.QuickInputTypeContextKey=e.quickInputTypeContextKeyValue=e.inQuickInputContext=e.InQuickInputContextKey=e.inQuickInputContextKeyValue=void 0,e.inQuickInputContextKeyValue="inQuickInput",e.InQuickInputContextKey=new l.RawContextKey(e.inQuickInputContextKeyValue,!1,(0,t.localize)(1580,"Whether keyboard focus is inside the quick input control")),e.inQuickInputContext=l.ContextKeyExpr.has(e.inQuickInputContextKeyValue),e.quickInputTypeContextKeyValue="quickInputType",e.QuickInputTypeContextKey=new l.RawContextKey(e.quickInputTypeContextKeyValue,void 0,(0,t.localize)(1581,"The type of the currently visible quick input")),e.endOfQuickInputBoxContextKeyValue="cursorAtEndOfQuickInputBox",e.EndOfQuickInputBoxContextKey=new l.RawContextKey(e.endOfQuickInputBoxContextKeyValue,!1,(0,t.localize)(1582,"Whether the cursor in the quick input is at the end of the input box")),e.endOfQuickInputBoxContext=l.ContextKeyExpr.has(e.endOfQuickInputBoxContextKeyValue),e.backButton={iconClass:o.ThemeIcon.asClassName(m.Codicon.quickInputBack),tooltip:(0,t.localize)(1583,"Back"),handle:-1};class a extends b.Disposable{static{this.noPromptMessage=(0,t.localize)(1584,"Press 'Enter' to confirm your input or 'Escape' to cancel")}constructor(h){super(),this.ui=h,this._widgetUpdated=!1,this.visible=!1,this._enabled=!0,this._busy=!1,this._ignoreFocusOut=!1,this._leftButtons=[],this._rightButtons=[],this._inlineButtons=[],this.buttonsUpdated=!1,this._toggles=[],this.togglesUpdated=!1,this.noValidationMessage=a.noPromptMessage,this._severity=n.default.Ignore,this.onDidTriggerButtonEmitter=this._register(new _.Emitter),this.onDidHideEmitter=this._register(new _.Emitter),this.onWillHideEmitter=this._register(new _.Emitter),this.onDisposeEmitter=this._register(new _.Emitter),this.visibleDisposables=this._register(new b.DisposableStore),this.onDidHide=this.onDidHideEmitter.event}get title(){return this._title}set title(h){this._title=h,this.update()}get description(){return this._description}set description(h){this._description=h,this.update()}get step(){return this._steps}set step(h){this._steps=h,this.update()}get totalSteps(){return this._totalSteps}set totalSteps(h){this._totalSteps=h,this.update()}get enabled(){return this._enabled}set enabled(h){this._enabled=h,this.update()}get contextKey(){return this._contextKey}set contextKey(h){this._contextKey=h,this.update()}get busy(){return this._busy}set busy(h){this._busy=h,this.update()}get ignoreFocusOut(){return this._ignoreFocusOut}set ignoreFocusOut(h){const v=this._ignoreFocusOut!==h&&!p.isIOS;this._ignoreFocusOut=h&&!p.isIOS,v&&this.update()}get titleButtons(){return this._leftButtons.length?[...this._leftButtons,this._rightButtons]:this._rightButtons}get buttons(){return[...this._leftButtons,...this._rightButtons,...this._inlineButtons]}set buttons(h){this._leftButtons=h.filter(v=>v===e.backButton),this._rightButtons=h.filter(v=>v!==e.backButton&&v.location!==i.QuickInputButtonLocation.Inline),this._inlineButtons=h.filter(v=>v.location===i.QuickInputButtonLocation.Inline),this.buttonsUpdated=!0,this.update()}get toggles(){return this._toggles}set toggles(h){this._toggles=h??[],this.togglesUpdated=!0,this.update()}get validationMessage(){return this._validationMessage}set validationMessage(h){this._validationMessage=h,this.update()}get severity(){return this._severity}set severity(h){this._severity=h,this.update()}show(){this.visible||(this.visibleDisposables.add(this.ui.onDidTriggerButton(h=>{this.buttons.indexOf(h)!==-1&&this.onDidTriggerButtonEmitter.fire(h)})),this.ui.show(this),this.visible=!0,this._lastValidationMessage=void 0,this._lastSeverity=void 0,this.buttons.length&&(this.buttonsUpdated=!0),this.toggles.length&&(this.togglesUpdated=!0),this.update())}hide(){this.visible&&this.ui.hide()}didHide(h=i.QuickInputHideReason.Other){this.visible=!1,this.visibleDisposables.clear(),this.onDidHideEmitter.fire({reason:h})}willHide(h=i.QuickInputHideReason.Other){this.onWillHideEmitter.fire({reason:h})}update(){if(!this.visible)return;const h=this.getTitle();h&&this.ui.title.textContent!==h?this.ui.title.textContent=h:!h&&this.ui.title.innerHTML!==" "&&(this.ui.title.innerText="\xA0");const v=this.getDescription();if(this.ui.description1.textContent!==v&&(this.ui.description1.textContent=v),this.ui.description2.textContent!==v&&(this.ui.description2.textContent=v),this._widgetUpdated&&(this._widgetUpdated=!1,this._widget?d.reset(this.ui.widget,this._widget):d.reset(this.ui.widget)),this.busy&&!this.busyDelay&&(this.busyDelay=new y.TimeoutTimer,this.busyDelay.setIfNotSet(()=>{this.visible&&this.ui.progressBar.infinite()},800)),!this.busy&&this.busyDelay&&(this.ui.progressBar.stop(),this.busyDelay.cancel(),this.busyDelay=void 0),this.buttonsUpdated){this.buttonsUpdated=!1,this.ui.leftActionBar.clear();const S=this._leftButtons.map((T,M)=>(0,s.quickInputButtonToAction)(T,`id-${M}`,async()=>this.onDidTriggerButtonEmitter.fire(T)));this.ui.leftActionBar.push(S,{icon:!0,label:!1}),this.ui.rightActionBar.clear();const L=this._rightButtons.map((T,M)=>(0,s.quickInputButtonToAction)(T,`id-${M}`,async()=>this.onDidTriggerButtonEmitter.fire(T)));this.ui.rightActionBar.push(L,{icon:!0,label:!1}),this.ui.inlineActionBar.clear();const D=this._inlineButtons.map((T,M)=>(0,s.quickInputButtonToAction)(T,`id-${M}`,async()=>this.onDidTriggerButtonEmitter.fire(T)));this.ui.inlineActionBar.push(D,{icon:!0,label:!1})}if(this.togglesUpdated){this.togglesUpdated=!1;const S=this.toggles?.filter(L=>L instanceof I.Toggle)??[];this.ui.inputBox.toggles=S}this.ui.ignoreFocusOut=this.ignoreFocusOut,this.ui.setEnabled(this.enabled),this.ui.setContextKey(this.contextKey);const w=this.validationMessage||this.noValidationMessage;this._lastValidationMessage!==w&&(this._lastValidationMessage=w,d.reset(this.ui.message),(0,s.renderQuickInputDescription)(w,this.ui.message,{callback:S=>{this.ui.linkOpenerDelegate(S)},disposables:this.visibleDisposables})),this._lastSeverity!==this.severity&&(this._lastSeverity=this.severity,this.showMessageDecoration(this.severity))}getTitle(){return this.title&&this.step?`${this.title} (${this.getSteps()})`:this.title?this.title:this.step?this.getSteps():""}getDescription(){return this.description||""}getSteps(){return this.step&&this.totalSteps?(0,t.localize)(1585,"{0}/{1}",this.step,this.totalSteps):this.step?String(this.step):""}showMessageDecoration(h){if(this.ui.inputBox.showDecoration(h),h!==n.default.Ignore){const v=this.ui.inputBox.stylesForType(h);this.ui.message.style.color=v.foreground?`${v.foreground}`:"",this.ui.message.style.backgroundColor=v.background?`${v.background}`:"",this.ui.message.style.border=v.border?`1px solid ${v.border}`:"",this.ui.message.style.marginBottom="-2px"}else this.ui.message.style.color="",this.ui.message.style.backgroundColor="",this.ui.message.style.border="",this.ui.message.style.marginBottom=""}dispose(){this.hide(),this.onDisposeEmitter.fire(),super.dispose()}}class r extends a{constructor(){super(...arguments),this._value="",this.onDidChangeValueEmitter=this._register(new _.Emitter),this.onWillAcceptEmitter=this._register(new _.Emitter),this.onDidAcceptEmitter=this._register(new _.Emitter),this.onDidCustomEmitter=this._register(new _.Emitter),this._items=[],this.itemsUpdated=!1,this._canSelectMany=!1,this._canAcceptInBackground=!1,this._matchOnDescription=!1,this._matchOnDetail=!1,this._matchOnLabel=!0,this._matchOnLabelMode="fuzzy",this._sortByLabel=!0,this._keepScrollPosition=!1,this._itemActivation=i.ItemActivation.FIRST,this._activeItems=[],this.activeItemsUpdated=!1,this.activeItemsToConfirm=[],this.onDidChangeActiveEmitter=this._register(new _.Emitter),this._selectedItems=[],this.selectedItemsUpdated=!1,this.selectedItemsToConfirm=[],this.onDidChangeSelectionEmitter=this._register(new _.Emitter),this.onDidTriggerItemButtonEmitter=this._register(new _.Emitter),this.onDidTriggerSeparatorButtonEmitter=this._register(new _.Emitter),this.valueSelectionUpdated=!0,this._ok="default",this._customButton=!1,this._focusEventBufferer=new _.EventBufferer,this.type="quickPick",this.filterValue=h=>h,this.onDidChangeValue=this.onDidChangeValueEmitter.event,this.onWillAccept=this.onWillAcceptEmitter.event,this.onDidAccept=this.onDidAcceptEmitter.event,this.onDidChangeActive=this.onDidChangeActiveEmitter.event,this.onDidChangeSelection=this.onDidChangeSelectionEmitter.event,this.onDidTriggerItemButton=this.onDidTriggerItemButtonEmitter.event,this.onDidTriggerSeparatorButton=this.onDidTriggerSeparatorButtonEmitter.event}static{this.DEFAULT_ARIA_LABEL=(0,t.localize)(1586,"Type to narrow down results.")}get quickNavigate(){return this._quickNavigate}set quickNavigate(h){this._quickNavigate=h,this.update()}get value(){return this._value}set value(h){this.doSetValue(h)}doSetValue(h,v){this._value!==h&&(this._value=h,v||this.update(),this.visible&&this.ui.list.filter(this.filterValue(this._value))&&this.trySelectFirst(),this.onDidChangeValueEmitter.fire(this._value))}set ariaLabel(h){this._ariaLabel=h,this.update()}get ariaLabel(){return this._ariaLabel}get placeholder(){return this._placeholder}set placeholder(h){this._placeholder=h,this.update()}get items(){return this._items}get scrollTop(){return this.ui.list.scrollTop}set scrollTop(h){this.ui.list.scrollTop=h}set items(h){this._items=h,this.itemsUpdated=!0,this.update()}get canSelectMany(){return this._canSelectMany}set canSelectMany(h){this._canSelectMany=h,this.update()}get canAcceptInBackground(){return this._canAcceptInBackground}set canAcceptInBackground(h){this._canAcceptInBackground=h}get matchOnDescription(){return this._matchOnDescription}set matchOnDescription(h){this._matchOnDescription=h,this.update()}get matchOnDetail(){return this._matchOnDetail}set matchOnDetail(h){this._matchOnDetail=h,this.update()}get matchOnLabel(){return this._matchOnLabel}set matchOnLabel(h){this._matchOnLabel=h,this.update()}get matchOnLabelMode(){return this._matchOnLabelMode}set matchOnLabelMode(h){this._matchOnLabelMode=h,this.update()}get sortByLabel(){return this._sortByLabel}set sortByLabel(h){this._sortByLabel=h,this.update()}get keepScrollPosition(){return this._keepScrollPosition}set keepScrollPosition(h){this._keepScrollPosition=h}get itemActivation(){return this._itemActivation}set itemActivation(h){this._itemActivation=h}get activeItems(){return this._activeItems}set activeItems(h){this._activeItems=h,this.activeItemsUpdated=!0,this.update()}get selectedItems(){return this._selectedItems}set selectedItems(h){this._selectedItems=h,this.selectedItemsUpdated=!0,this.update()}get keyMods(){return this._quickNavigate?i.NO_KEY_MODS:this.ui.keyMods}get valueSelection(){const h=this.ui.inputBox.getSelection();if(h)return[h.start,h.end]}set valueSelection(h){this._valueSelection=h,this.valueSelectionUpdated=!0,this.update()}get customButton(){return this._customButton}set customButton(h){this._customButton=h,this.update()}get customLabel(){return this._customButtonLabel}set customLabel(h){this._customButtonLabel=h,this.update()}get customHover(){return this._customButtonHover}set customHover(h){this._customButtonHover=h,this.update()}get ok(){return this._ok}set ok(h){this._ok=h,this.update()}get hideInput(){return!!this._hideInput}set hideInput(h){this._hideInput=h,this.update()}trySelectFirst(){this.canSelectMany||this.ui.list.focus(i.QuickPickFocus.First)}show(){this.visible||(this.visibleDisposables.add(this.ui.inputBox.onDidChange(h=>{this.doSetValue(h,!0)})),this.visibleDisposables.add(this.ui.onDidAccept(()=>{this.canSelectMany?this.ui.list.getCheckedElements().length||(this._selectedItems=[],this.onDidChangeSelectionEmitter.fire(this.selectedItems)):this.activeItems[0]&&(this._selectedItems=[this.activeItems[0]],this.onDidChangeSelectionEmitter.fire(this.selectedItems)),this.handleAccept(!1)})),this.visibleDisposables.add(this.ui.onDidCustom(()=>{this.onDidCustomEmitter.fire()})),this.visibleDisposables.add(this._focusEventBufferer.wrapEvent(this.ui.list.onDidChangeFocus,(h,v)=>v)(h=>{this.activeItemsUpdated||this.activeItemsToConfirm!==this._activeItems&&(0,E.equals)(h,this._activeItems,(v,w)=>v===w)||(this._activeItems=h,this.onDidChangeActiveEmitter.fire(h))})),this.visibleDisposables.add(this.ui.list.onDidChangeSelection(({items:h,event:v})=>{if(this.canSelectMany){h.length&&this.ui.list.setSelectedElements([]);return}this.selectedItemsToConfirm!==this._selectedItems&&(0,E.equals)(h,this._selectedItems,(w,S)=>w===S)||(this._selectedItems=h,this.onDidChangeSelectionEmitter.fire(h),h.length&&this.handleAccept(d.isMouseEvent(v)&&v.button===1))})),this.visibleDisposables.add(this.ui.list.onChangedCheckedElements(h=>{!this.canSelectMany||!this.visible||this.selectedItemsToConfirm!==this._selectedItems&&(0,E.equals)(h,this._selectedItems,(v,w)=>v===w)||(this._selectedItems=h,this.onDidChangeSelectionEmitter.fire(h))})),this.visibleDisposables.add(this.ui.list.onButtonTriggered(h=>this.onDidTriggerItemButtonEmitter.fire(h))),this.visibleDisposables.add(this.ui.list.onSeparatorButtonTriggered(h=>this.onDidTriggerSeparatorButtonEmitter.fire(h))),this.visibleDisposables.add(this.registerQuickNavigation()),this.valueSelectionUpdated=!0),super.show()}handleAccept(h){let v=!1;this.onWillAcceptEmitter.fire({veto:()=>v=!0}),v||this.onDidAcceptEmitter.fire({inBackground:h})}registerQuickNavigation(){return d.addDisposableListener(this.ui.container,d.EventType.KEY_UP,h=>{if(this.canSelectMany||!this._quickNavigate)return;const v=new k.StandardKeyboardEvent(h),w=v.keyCode;this._quickNavigate.keybindings.some(D=>{const T=D.getChords();return T.length>1?!1:T[0].shiftKey&&w===4?!(v.ctrlKey||v.altKey||v.metaKey):!!(T[0].altKey&&w===6||T[0].ctrlKey&&w===5||T[0].metaKey&&w===57)})&&(this.activeItems[0]&&(this._selectedItems=[this.activeItems[0]],this.onDidChangeSelectionEmitter.fire(this.selectedItems),this.handleAccept(!1)),this._quickNavigate=void 0)})}update(){if(!this.visible)return;const h=this.keepScrollPosition?this.scrollTop:0,v=!!this.description,w={title:!!this.title||!!this.step||!!this.titleButtons.length,description:v,checkAll:this.canSelectMany&&!this._hideCheckAll,checkBox:this.canSelectMany,inputBox:!this._hideInput,progressBar:!this._hideInput||v,visibleCount:!0,count:this.canSelectMany&&!this._hideCountBadge,ok:this.ok==="default"?this.canSelectMany:this.ok,list:!0,message:!!this.validationMessage,customButton:this.customButton};this.ui.setVisibilities(w),super.update(),this.ui.inputBox.value!==this.value&&(this.ui.inputBox.value=this.value),this.valueSelectionUpdated&&(this.valueSelectionUpdated=!1,this.ui.inputBox.select(this._valueSelection&&{start:this._valueSelection[0],end:this._valueSelection[1]})),this.ui.inputBox.placeholder!==(this.placeholder||"")&&(this.ui.inputBox.placeholder=this.placeholder||"");let S=this.ariaLabel;!S&&w.inputBox&&(S=this.placeholder||r.DEFAULT_ARIA_LABEL,this.title&&(S+=` - ${this.title}`)),this.ui.list.ariaLabel!==S&&(this.ui.list.ariaLabel=S??null),this.ui.list.matchOnDescription=this.matchOnDescription,this.ui.list.matchOnDetail=this.matchOnDetail,this.ui.list.matchOnLabel=this.matchOnLabel,this.ui.list.matchOnLabelMode=this.matchOnLabelMode,this.ui.list.sortByLabel=this.sortByLabel,this.itemsUpdated&&(this.itemsUpdated=!1,this._focusEventBufferer.bufferEvents(()=>{switch(this.ui.list.setElements(this.items),this.ui.list.shouldLoop=!this.canSelectMany,this.ui.list.filter(this.filterValue(this.ui.inputBox.value)),this._itemActivation){case i.ItemActivation.NONE:this._itemActivation=i.ItemActivation.FIRST;break;case i.ItemActivation.SECOND:this.ui.list.focus(i.QuickPickFocus.Second),this._itemActivation=i.ItemActivation.FIRST;break;case i.ItemActivation.LAST:this.ui.list.focus(i.QuickPickFocus.Last),this._itemActivation=i.ItemActivation.FIRST;break;default:this.trySelectFirst();break}})),this.ui.container.classList.contains("show-checkboxes")!==!!this.canSelectMany&&(this.canSelectMany?this.ui.list.clearFocus():this.trySelectFirst()),this.activeItemsUpdated&&(this.activeItemsUpdated=!1,this.activeItemsToConfirm=this._activeItems,this.ui.list.setFocusedElements(this.activeItems),this.activeItemsToConfirm===this._activeItems&&(this.activeItemsToConfirm=null)),this.selectedItemsUpdated&&(this.selectedItemsUpdated=!1,this.selectedItemsToConfirm=this._selectedItems,this.canSelectMany?this.ui.list.setCheckedElements(this.selectedItems):this.ui.list.setSelectedElements(this.selectedItems),this.selectedItemsToConfirm===this._selectedItems&&(this.selectedItemsToConfirm=null)),this.ui.customButton.label=this.customLabel||"",this.ui.customButton.element.title=this.customHover||"",w.inputBox||(this.ui.list.domFocus(),this.canSelectMany&&this.ui.list.focus(i.QuickPickFocus.First)),this.keepScrollPosition&&(this.scrollTop=h)}focus(h){this.ui.list.focus(h),this.canSelectMany&&this.ui.list.domFocus()}accept(h){h&&!this._canAcceptInBackground||this.activeItems[0]&&(this._selectedItems=[this.activeItems[0]],this.onDidChangeSelectionEmitter.fire(this.selectedItems),this.handleAccept(h??!1))}}e.QuickPick=r;class u extends a{constructor(){super(...arguments),this._value="",this.valueSelectionUpdated=!0,this._password=!1,this.onDidValueChangeEmitter=this._register(new _.Emitter),this.onDidAcceptEmitter=this._register(new _.Emitter),this.type="inputBox",this.onDidChangeValue=this.onDidValueChangeEmitter.event,this.onDidAccept=this.onDidAcceptEmitter.event}get value(){return this._value}set value(h){this._value=h||"",this.update()}get placeholder(){return this._placeholder}set placeholder(h){this._placeholder=h,this.update()}get password(){return this._password}set password(h){this._password=h,this.update()}show(){this.visible||(this.visibleDisposables.add(this.ui.inputBox.onDidChange(h=>{h!==this.value&&(this._value=h,this.onDidValueChangeEmitter.fire(h))})),this.visibleDisposables.add(this.ui.onDidAccept(()=>this.onDidAcceptEmitter.fire())),this.valueSelectionUpdated=!0),super.show()}update(){if(!this.visible)return;this.ui.container.classList.remove("hidden-input");const h={title:!!this.title||!!this.step||!!this.titleButtons.length,description:!!this.description||!!this.step,inputBox:!0,message:!0,progressBar:!0};this.ui.setVisibilities(h),super.update(),this.ui.inputBox.value!==this.value&&(this.ui.inputBox.value=this.value),this.valueSelectionUpdated&&(this.valueSelectionUpdated=!1,this.ui.inputBox.select(this._valueSelection&&{start:this._valueSelection[0],end:this._valueSelection[1]})),this.ui.inputBox.placeholder!==(this.placeholder||"")&&(this.ui.inputBox.placeholder=this.placeholder||""),this.ui.inputBox.password!==this.password&&(this.ui.inputBox.password=this.password)}}e.InputBox=u;let C=class extends c.WorkbenchHoverDelegate{constructor(h,v){super("element",!1,w=>this.getOverrideOptions(w),h,v)}getOverrideOptions(h){const v=(d.isHTMLElement(h.content)?h.content.textContent??"":typeof h.content=="string"?h.content:h.content.value).includes(` -`);return{persistence:{hideOnKeyDown:!1},appearance:{showHoverHint:v,skipFadeInAnimation:!0}}}};e.QuickInputHoverDelegate=C,e.QuickInputHoverDelegate=C=ke([ce(0,g.IConfigurationService),ce(1,c.IHoverService)],C)}),define(ne[38],se([1,0,90,19]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Registry=void 0;class I{constructor(){this.data=new Map}add(y,m){d.ok(k.isString(y)),d.ok(k.isObject(m)),d.ok(!this.data.has(y),"There is already an extension with this id"),this.data.set(y,m)}as(y){return this.data.get(y)||null}}e.Registry=new I}),define(ne[399],se([1,0,38]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LocalSelectionTransfer=e.Extensions=e.CodeDataTransfers=void 0,e.CodeDataTransfers={EDITORS:"CodeEditors",FILES:"CodeFiles"};class k{}e.Extensions={DragAndDropContribution:"workbench.contributions.dragAndDrop"},d.Registry.add(e.Extensions.DragAndDropContribution,new k);class I{static{this.INSTANCE=new I}constructor(){}static getInstance(){return I.INSTANCE}hasData(y){return y&&y===this.proto}getData(y){if(this.hasData(y))return this.data}}e.LocalSelectionTransfer=I}),define(ne[400],se([1,0,224,194,128,22,399]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toVSDataTransfer=m,e.toExternalVSDataTransfer=p;function m(n){const o=new k.VSDataTransfer;for(const t of n.items){const i=t.type;if(t.kind==="string"){const s=new Promise(g=>t.getAsString(g));o.append(i,(0,k.createStringDataTransferItem)(s))}else if(t.kind==="file"){const s=t.getAsFile();s&&o.append(i,_(s))}}return o}function _(n){const o=n.path?E.URI.parse(n.path):void 0;return(0,k.createFileDataTransferItem)(n.name,o,async()=>new Uint8Array(await n.arrayBuffer()))}const b=Object.freeze([y.CodeDataTransfers.EDITORS,y.CodeDataTransfers.FILES,d.DataTransfers.RESOURCES,d.DataTransfers.INTERNAL_URI_LIST]);function p(n,o=!1){const t=m(n),i=t.get(d.DataTransfers.INTERNAL_URI_LIST);if(i)t.replace(I.Mimes.uriList,i);else if(o||!t.has(I.Mimes.uriList)){const s=[];for(const g of n.items){const c=g.getAsFile();if(c){const l=c.path;try{l?s.push(E.URI.file(l).toString()):s.push(E.URI.parse(c.name,!0).toString())}catch{}}}s.length&&t.replace(I.Mimes.uriList,(0,k.createStringDataTransferItem)(k.UriList.create(s)))}for(const s of b)t.delete(s);return t}}),define(ne[273],se([1,0,6,38]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Extensions=void 0,e.Extensions={JSONContribution:"base.contributions.json"};function I(m){return m.length>0&&m.charAt(m.length-1)==="#"?m.substring(0,m.length-1):m}class E{constructor(){this._onDidChangeSchema=new d.Emitter,this.schemasById={}}registerSchema(_,b){this.schemasById[I(_)]=b,this._onDidChangeSchema.fire(_)}notifySchemaChanged(_){this._onDidChangeSchema.fire(_)}}const y=new E;k.Registry.add(e.Extensions.JSONContribution,y)}),define(ne[109],se([1,0,13,6,19,3,28,273,38]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OVERRIDE_PROPERTY_REGEX=e.OVERRIDE_PROPERTY_PATTERN=e.resourceLanguageSettingsSchemaId=e.resourceSettings=e.windowSettings=e.machineOverridableSettings=e.machineSettings=e.applicationSettings=e.allSettings=e.Extensions=void 0,e.overrideIdentifiersFromKey=t,e.getDefaultValue=i,e.validateProperty=g,e.Extensions={Configuration:"base.contributions.configuration"},e.allSettings={properties:{},patternProperties:{}},e.applicationSettings={properties:{},patternProperties:{}},e.machineSettings={properties:{},patternProperties:{}},e.machineOverridableSettings={properties:{},patternProperties:{}},e.windowSettings={properties:{},patternProperties:{}},e.resourceSettings={properties:{},patternProperties:{}},e.resourceLanguageSettingsSchemaId="vscode://schemas/settings/resourceLanguage";const b=_.Registry.as(m.Extensions.JSONContribution);class p{constructor(){this.registeredConfigurationDefaults=[],this.overrideIdentifiers=new Set,this._onDidSchemaChange=new k.Emitter,this._onDidUpdateConfiguration=new k.Emitter,this.configurationDefaultsOverrides=new Map,this.defaultLanguageConfigurationOverridesNode={id:"defaultOverrides",title:E.localize(1503,"Default Language Configuration Overrides"),properties:{}},this.configurationContributors=[this.defaultLanguageConfigurationOverridesNode],this.resourceLanguageSettingsSchema={properties:{},patternProperties:{},additionalProperties:!0,allowTrailingCommas:!0,allowComments:!0},this.configurationProperties={},this.policyConfigurations=new Map,this.excludedConfigurationProperties={},b.registerSchema(e.resourceLanguageSettingsSchemaId,this.resourceLanguageSettingsSchema),this.registerOverridePropertyPatternKey()}registerConfiguration(l,a=!0){this.registerConfigurations([l],a)}registerConfigurations(l,a=!0){const r=new Set;this.doRegisterConfigurations(l,a,r),b.registerSchema(e.resourceLanguageSettingsSchemaId,this.resourceLanguageSettingsSchema),this._onDidSchemaChange.fire(),this._onDidUpdateConfiguration.fire({properties:r})}registerDefaultConfigurations(l){const a=new Set;this.doRegisterDefaultConfigurations(l,a),this._onDidSchemaChange.fire(),this._onDidUpdateConfiguration.fire({properties:a,defaultsOverrides:!0})}doRegisterDefaultConfigurations(l,a){this.registeredConfigurationDefaults.push(...l);const r=[];for(const{overrides:u,source:C}of l)for(const f in u){a.add(f);const h=this.configurationDefaultsOverrides.get(f)??this.configurationDefaultsOverrides.set(f,{configurationDefaultOverrides:[]}).get(f),v=u[f];if(h.configurationDefaultOverrides.push({value:v,source:C}),e.OVERRIDE_PROPERTY_REGEX.test(f)){const w=this.mergeDefaultConfigurationsForOverrideIdentifier(f,v,C,h.configurationDefaultOverrideValue);if(!w)continue;h.configurationDefaultOverrideValue=w,this.updateDefaultOverrideProperty(f,w,C),r.push(...t(f))}else{const w=this.mergeDefaultConfigurationsForConfigurationProperty(f,v,C,h.configurationDefaultOverrideValue);if(!w)continue;h.configurationDefaultOverrideValue=w;const S=this.configurationProperties[f];S&&(this.updatePropertyDefaultValue(f,S),this.updateSchema(f,S))}}this.doRegisterOverrideIdentifiers(r)}updateDefaultOverrideProperty(l,a,r){const u={type:"object",default:a.value,description:E.localize(1504,"Configure settings to be overridden for the {0} language.",(0,y.getLanguageTagSettingPlainKey)(l)),$ref:e.resourceLanguageSettingsSchemaId,defaultDefaultValue:a.value,source:r,defaultValueSource:r};this.configurationProperties[l]=u,this.defaultLanguageConfigurationOverridesNode.properties[l]=u}mergeDefaultConfigurationsForOverrideIdentifier(l,a,r,u){const C=u?.value||{},f=u?.source??new Map;if(!(f instanceof Map)){console.error("objectConfigurationSources is not a Map");return}for(const h of Object.keys(a)){const v=a[h];if(I.isObject(v)&&(I.isUndefined(C[h])||I.isObject(C[h]))){if(C[h]={...C[h]??{},...v},r)for(const S in v)f.set(`${h}.${S}`,r)}else C[h]=v,r?f.set(h,r):f.delete(h)}return{value:C,source:f}}mergeDefaultConfigurationsForConfigurationProperty(l,a,r,u){const C=this.configurationProperties[l],f=u?.value??C?.defaultDefaultValue;let h=r;if(I.isObject(a)&&(C!==void 0&&C.type==="object"||C===void 0&&(I.isUndefined(f)||I.isObject(f)))){if(h=u?.source??new Map,!(h instanceof Map)){console.error("defaultValueSource is not a Map");return}for(const w in a)r&&h.set(`${l}.${w}`,r);a={...I.isObject(f)?f:{},...a}}return{value:a,source:h}}registerOverrideIdentifiers(l){this.doRegisterOverrideIdentifiers(l),this._onDidSchemaChange.fire()}doRegisterOverrideIdentifiers(l){for(const a of l)this.overrideIdentifiers.add(a);this.updateOverridePropertyPatternKey()}doRegisterConfigurations(l,a,r){l.forEach(u=>{this.validateAndRegisterProperties(u,a,u.extensionInfo,u.restrictedProperties,void 0,r),this.configurationContributors.push(u),this.registerJSONConfiguration(u)})}validateAndRegisterProperties(l,a=!0,r,u,C=3,f){C=I.isUndefinedOrNull(l.scope)?C:l.scope;const h=l.properties;if(h)for(const w in h){const S=h[w];if(a&&g(w,S)){delete h[w];continue}if(S.source=r,S.defaultDefaultValue=h[w].default,this.updatePropertyDefaultValue(w,S),e.OVERRIDE_PROPERTY_REGEX.test(w)?S.scope=void 0:(S.scope=I.isUndefinedOrNull(S.scope)?C:S.scope,S.restricted=I.isUndefinedOrNull(S.restricted)?!!u?.includes(w):S.restricted),h[w].hasOwnProperty("included")&&!h[w].included){this.excludedConfigurationProperties[w]=h[w],delete h[w];continue}else this.configurationProperties[w]=h[w],h[w].policy?.name&&this.policyConfigurations.set(h[w].policy.name,w);!h[w].deprecationMessage&&h[w].markdownDeprecationMessage&&(h[w].deprecationMessage=h[w].markdownDeprecationMessage),f.add(w)}const v=l.allOf;if(v)for(const w of v)this.validateAndRegisterProperties(w,a,r,u,C,f)}getConfigurationProperties(){return this.configurationProperties}getPolicyConfigurations(){return this.policyConfigurations}registerJSONConfiguration(l){const a=r=>{const u=r.properties;if(u)for(const f in u)this.updateSchema(f,u[f]);r.allOf?.forEach(a)};a(l)}updateSchema(l,a){switch(e.allSettings.properties[l]=a,a.scope){case 1:e.applicationSettings.properties[l]=a;break;case 2:e.machineSettings.properties[l]=a;break;case 6:e.machineOverridableSettings.properties[l]=a;break;case 3:e.windowSettings.properties[l]=a;break;case 4:e.resourceSettings.properties[l]=a;break;case 5:e.resourceSettings.properties[l]=a,this.resourceLanguageSettingsSchema.properties[l]=a;break}}updateOverridePropertyPatternKey(){for(const l of this.overrideIdentifiers.values()){const a=`[${l}]`,r={type:"object",description:E.localize(1505,"Configure editor settings to be overridden for a language."),errorMessage:E.localize(1506,"This setting does not support per-language configuration."),$ref:e.resourceLanguageSettingsSchemaId};this.updatePropertyDefaultValue(a,r),e.allSettings.properties[a]=r,e.applicationSettings.properties[a]=r,e.machineSettings.properties[a]=r,e.machineOverridableSettings.properties[a]=r,e.windowSettings.properties[a]=r,e.resourceSettings.properties[a]=r}}registerOverridePropertyPatternKey(){const l={type:"object",description:E.localize(1507,"Configure editor settings to be overridden for a language."),errorMessage:E.localize(1508,"This setting does not support per-language configuration."),$ref:e.resourceLanguageSettingsSchemaId};e.allSettings.patternProperties[e.OVERRIDE_PROPERTY_PATTERN]=l,e.applicationSettings.patternProperties[e.OVERRIDE_PROPERTY_PATTERN]=l,e.machineSettings.patternProperties[e.OVERRIDE_PROPERTY_PATTERN]=l,e.machineOverridableSettings.patternProperties[e.OVERRIDE_PROPERTY_PATTERN]=l,e.windowSettings.patternProperties[e.OVERRIDE_PROPERTY_PATTERN]=l,e.resourceSettings.patternProperties[e.OVERRIDE_PROPERTY_PATTERN]=l,this._onDidSchemaChange.fire()}updatePropertyDefaultValue(l,a){const r=this.configurationDefaultsOverrides.get(l)?.configurationDefaultOverrideValue;let u,C;r&&(!a.disallowConfigurationDefault||!r.source)&&(u=r.value,C=r.source),I.isUndefined(u)&&(u=a.defaultDefaultValue,C=void 0),I.isUndefined(u)&&(u=i(a.type)),a.default=u,a.defaultValueSource=C}}const n="\\[([^\\]]+)\\]",o=new RegExp(n,"g");e.OVERRIDE_PROPERTY_PATTERN=`^(${n})+$`,e.OVERRIDE_PROPERTY_REGEX=new RegExp(e.OVERRIDE_PROPERTY_PATTERN);function t(c){const l=[];if(e.OVERRIDE_PROPERTY_REGEX.test(c)){let a=o.exec(c);for(;a?.length;){const r=a[1].trim();r&&l.push(r),a=o.exec(c)}}return(0,d.distinct)(l)}function i(c){switch(Array.isArray(c)?c[0]:c){case"boolean":return!1;case"integer":case"number":return 0;case"string":return"";case"array":return[];case"object":return{};default:return null}}const s=new p;_.Registry.add(e.Extensions.Configuration,s);function g(c,l){return c.trim()?e.OVERRIDE_PROPERTY_REGEX.test(c)?E.localize(1510,"Cannot register '{0}'. This matches property pattern '\\\\[.*\\\\]$' for describing language specific editor settings. Use 'configurationDefaults' contribution.",c):s.getConfigurationProperties()[c]!==void 0?E.localize(1511,"Cannot register '{0}'. This property is already registered.",c):l.policy?.name&&s.getPolicyConfigurations().get(l.policy?.name)!==void 0?E.localize(1512,"Cannot register '{0}'. The associated policy {1} is already registered with {2}.",c,l.policy?.name,s.getPolicyConfigurations().get(l.policy?.name)):null:E.localize(1509,"Cannot register an empty property")}}),define(ne[274],se([1,0,308,37,197,3,109,38]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.editorConfigurationBaseNode=void 0,e.isEditorConfigurationKey=o,e.isDiffEditorConfigurationKey=t,e.editorConfigurationBaseNode=Object.freeze({id:"editor",order:5,type:"object",title:E.localize(133,"Editor"),scope:5});const _={...e.editorConfigurationBaseNode,properties:{"editor.tabSize":{type:"number",default:I.EDITOR_MODEL_DEFAULTS.tabSize,minimum:1,markdownDescription:E.localize(134,"The number of spaces a tab is equal to. This setting is overridden based on the file contents when {0} is on.","`#editor.detectIndentation#`")},"editor.indentSize":{anyOf:[{type:"string",enum:["tabSize"]},{type:"number",minimum:1}],default:"tabSize",markdownDescription:E.localize(135,'The number of spaces used for indentation or `"tabSize"` to use the value from `#editor.tabSize#`. This setting is overridden based on the file contents when `#editor.detectIndentation#` is on.')},"editor.insertSpaces":{type:"boolean",default:I.EDITOR_MODEL_DEFAULTS.insertSpaces,markdownDescription:E.localize(136,"Insert spaces when pressing `Tab`. This setting is overridden based on the file contents when {0} is on.","`#editor.detectIndentation#`")},"editor.detectIndentation":{type:"boolean",default:I.EDITOR_MODEL_DEFAULTS.detectIndentation,markdownDescription:E.localize(137,"Controls whether {0} and {1} will be automatically detected when a file is opened based on the file contents.","`#editor.tabSize#`","`#editor.insertSpaces#`")},"editor.trimAutoWhitespace":{type:"boolean",default:I.EDITOR_MODEL_DEFAULTS.trimAutoWhitespace,description:E.localize(138,"Remove trailing auto inserted whitespace.")},"editor.largeFileOptimizations":{type:"boolean",default:I.EDITOR_MODEL_DEFAULTS.largeFileOptimizations,description:E.localize(139,"Special handling for large files to disable certain memory intensive features.")},"editor.wordBasedSuggestions":{enum:["off","currentDocument","matchingDocuments","allDocuments"],default:"matchingDocuments",enumDescriptions:[E.localize(140,"Turn off Word Based Suggestions."),E.localize(141,"Only suggest words from the active document."),E.localize(142,"Suggest words from all open documents of the same language."),E.localize(143,"Suggest words from all open documents.")],description:E.localize(144,"Controls whether completions should be computed based on words in the document and from which documents they are computed.")},"editor.semanticHighlighting.enabled":{enum:[!0,!1,"configuredByTheme"],enumDescriptions:[E.localize(145,"Semantic highlighting enabled for all color themes."),E.localize(146,"Semantic highlighting disabled for all color themes."),E.localize(147,"Semantic highlighting is configured by the current color theme's `semanticHighlighting` setting.")],default:"configuredByTheme",description:E.localize(148,"Controls whether the semanticHighlighting is shown for the languages that support it.")},"editor.stablePeek":{type:"boolean",default:!1,markdownDescription:E.localize(149,"Keep peek editors open even when double-clicking their content or when hitting `Escape`.")},"editor.maxTokenizationLineLength":{type:"integer",default:2e4,description:E.localize(150,"Lines above this length will not be tokenized for performance reasons")},"editor.experimental.asyncTokenization":{type:"boolean",default:!0,description:E.localize(151,"Controls whether the tokenization should happen asynchronously on a web worker."),tags:["experimental"]},"editor.experimental.asyncTokenizationLogging":{type:"boolean",default:!1,description:E.localize(152,"Controls whether async tokenization should be logged. For debugging only.")},"editor.experimental.asyncTokenizationVerification":{type:"boolean",default:!1,description:E.localize(153,"Controls whether async tokenization should be verified against legacy background tokenization. Might slow down tokenization. For debugging only."),tags:["experimental"]},"editor.experimental.treeSitterTelemetry":{type:"boolean",default:!1,markdownDescription:E.localize(154,"Controls whether tree sitter parsing should be turned on and telemetry collected. Setting `editor.experimental.preferTreeSitter` for specific languages will take precedence."),tags:["experimental"]},"editor.language.brackets":{type:["array","null"],default:null,description:E.localize(155,"Defines the bracket symbols that increase or decrease the indentation."),items:{type:"array",items:[{type:"string",description:E.localize(156,"The opening bracket character or string sequence.")},{type:"string",description:E.localize(157,"The closing bracket character or string sequence.")}]}},"editor.language.colorizedBracketPairs":{type:["array","null"],default:null,description:E.localize(158,"Defines the bracket pairs that are colorized by their nesting level if bracket pair colorization is enabled."),items:{type:"array",items:[{type:"string",description:E.localize(159,"The opening bracket character or string sequence.")},{type:"string",description:E.localize(160,"The closing bracket character or string sequence.")}]}},"diffEditor.maxComputationTime":{type:"number",default:d.diffEditorDefaultOptions.maxComputationTime,description:E.localize(161,"Timeout in milliseconds after which diff computation is cancelled. Use 0 for no timeout.")},"diffEditor.maxFileSize":{type:"number",default:d.diffEditorDefaultOptions.maxFileSize,description:E.localize(162,"Maximum file size in MB for which to compute diffs. Use 0 for no limit.")},"diffEditor.renderSideBySide":{type:"boolean",default:d.diffEditorDefaultOptions.renderSideBySide,description:E.localize(163,"Controls whether the diff editor shows the diff side by side or inline.")},"diffEditor.renderSideBySideInlineBreakpoint":{type:"number",default:d.diffEditorDefaultOptions.renderSideBySideInlineBreakpoint,description:E.localize(164,"If the diff editor width is smaller than this value, the inline view is used.")},"diffEditor.useInlineViewWhenSpaceIsLimited":{type:"boolean",default:d.diffEditorDefaultOptions.useInlineViewWhenSpaceIsLimited,description:E.localize(165,"If enabled and the editor width is too small, the inline view is used.")},"diffEditor.renderMarginRevertIcon":{type:"boolean",default:d.diffEditorDefaultOptions.renderMarginRevertIcon,description:E.localize(166,"When enabled, the diff editor shows arrows in its glyph margin to revert changes.")},"diffEditor.renderGutterMenu":{type:"boolean",default:d.diffEditorDefaultOptions.renderGutterMenu,description:E.localize(167,"When enabled, the diff editor shows a special gutter for revert and stage actions.")},"diffEditor.ignoreTrimWhitespace":{type:"boolean",default:d.diffEditorDefaultOptions.ignoreTrimWhitespace,description:E.localize(168,"When enabled, the diff editor ignores changes in leading or trailing whitespace.")},"diffEditor.renderIndicators":{type:"boolean",default:d.diffEditorDefaultOptions.renderIndicators,description:E.localize(169,"Controls whether the diff editor shows +/- indicators for added/removed changes.")},"diffEditor.codeLens":{type:"boolean",default:d.diffEditorDefaultOptions.diffCodeLens,description:E.localize(170,"Controls whether the editor shows CodeLens.")},"diffEditor.wordWrap":{type:"string",enum:["off","on","inherit"],default:d.diffEditorDefaultOptions.diffWordWrap,markdownEnumDescriptions:[E.localize(171,"Lines will never wrap."),E.localize(172,"Lines will wrap at the viewport width."),E.localize(173,"Lines will wrap according to the {0} setting.","`#editor.wordWrap#`")]},"diffEditor.diffAlgorithm":{type:"string",enum:["legacy","advanced"],default:d.diffEditorDefaultOptions.diffAlgorithm,markdownEnumDescriptions:[E.localize(174,"Uses the legacy diffing algorithm."),E.localize(175,"Uses the advanced diffing algorithm.")],tags:["experimental"]},"diffEditor.hideUnchangedRegions.enabled":{type:"boolean",default:d.diffEditorDefaultOptions.hideUnchangedRegions.enabled,markdownDescription:E.localize(176,"Controls whether the diff editor shows unchanged regions.")},"diffEditor.hideUnchangedRegions.revealLineCount":{type:"integer",default:d.diffEditorDefaultOptions.hideUnchangedRegions.revealLineCount,markdownDescription:E.localize(177,"Controls how many lines are used for unchanged regions."),minimum:1},"diffEditor.hideUnchangedRegions.minimumLineCount":{type:"integer",default:d.diffEditorDefaultOptions.hideUnchangedRegions.minimumLineCount,markdownDescription:E.localize(178,"Controls how many lines are used as a minimum for unchanged regions."),minimum:1},"diffEditor.hideUnchangedRegions.contextLineCount":{type:"integer",default:d.diffEditorDefaultOptions.hideUnchangedRegions.contextLineCount,markdownDescription:E.localize(179,"Controls how many lines are used as context when comparing unchanged regions."),minimum:1},"diffEditor.experimental.showMoves":{type:"boolean",default:d.diffEditorDefaultOptions.experimental.showMoves,markdownDescription:E.localize(180,"Controls whether the diff editor should show detected code moves.")},"diffEditor.experimental.showEmptyDecorations":{type:"boolean",default:d.diffEditorDefaultOptions.experimental.showEmptyDecorations,description:E.localize(181,"Controls whether the diff editor shows empty decorations to see where characters got inserted or deleted.")},"diffEditor.experimental.useTrueInlineView":{type:"boolean",default:d.diffEditorDefaultOptions.experimental.useTrueInlineView,description:E.localize(182,"If enabled and the editor uses the inline view, word changes are rendered inline.")}}};function b(s){return typeof s.type<"u"||typeof s.anyOf<"u"}for(const s of k.editorOptionsRegistry){const g=s.schema;if(typeof g<"u")if(b(g))_.properties[`editor.${s.name}`]=g;else for(const c in g)Object.hasOwnProperty.call(g,c)&&(_.properties[c]=g[c])}let p=null;function n(){return p===null&&(p=Object.create(null),Object.keys(_.properties).forEach(s=>{p[s]=!0})),p}function o(s){return n()[`editor.${s}`]||!1}function t(s){return n()[`diffEditor.${s}`]||!1}m.Registry.as(y.Extensions.Configuration).registerConfiguration(_)}),define(ne[70],se([1,0,3,6,38,128,109]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PLAINTEXT_EXTENSION=e.PLAINTEXT_LANGUAGE_ID=e.ModesRegistry=e.EditorModesRegistry=e.Extensions=void 0,e.Extensions={ModesRegistry:"editor.modesRegistry"};class m{constructor(){this._onDidChangeLanguages=new k.Emitter,this.onDidChangeLanguages=this._onDidChangeLanguages.event,this._languages=[]}registerLanguage(b){return this._languages.push(b),this._onDidChangeLanguages.fire(void 0),{dispose:()=>{for(let p=0,n=this._languages.length;p{}};const r=new y.DisposableStore,u=r.add((0,d.renderMarkdown)(c,{...this._getRenderOptions(c,r),...l},a));return u.element.classList.add("rendered-markdown"),{element:u.element,dispose:()=>r.dispose()}}_getRenderOptions(c,l){return{codeBlockRenderer:async(a,r)=>{let u;a?u=this._languageService.getLanguageIdByLanguageName(a):this._options.editor&&(u=this._options.editor.getModel()?.getLanguageId()),u||(u=b.PLAINTEXT_LANGUAGE_ID);const C=await(0,p.tokenizeToString)(this._languageService,r,u),f=document.createElement("span");if(f.innerHTML=o._ttpTokenizer?.createHTML(C)??C,this._options.editor){const h=this._options.editor.getOption(50);(0,m.applyFontInfo)(f,h)}else this._options.codeBlockFontFamily&&(f.style.fontFamily=this._options.codeBlockFontFamily);return this._options.codeBlockFontSize!==void 0&&(f.style.fontSize=this._options.codeBlockFontSize),f},asyncRenderCallback:()=>this._onDidRenderAsync.fire(),actionHandler:{callback:a=>i(this._openerService,a,c.isTrusted),disposables:l}}}};e.MarkdownRenderer=t,e.MarkdownRenderer=t=o=ke([ce(1,_.ILanguageService),ce(2,n.IOpenerService)],t);async function i(g,c,l){try{return await g.open(c,{fromUserGesture:!0,allowContributedOpeners:!0,allowCommands:s(l)})}catch(a){return(0,I.onUnexpectedError)(a),!1}}function s(g){return g===!0?!0:g&&Array.isArray(g.enabledCommands)?g.enabledCommands:!1}}),define(ne[705],se([1,0,2,6,5,31,28,37,174,85,59,7,120,57,3,16,61,46,480]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HoverWidget=void 0;const l=I.$;let a=class extends b.Widget{get _targetWindow(){return I.getWindow(this._target.targetElements[0])}get _targetDocumentElement(){return I.getWindow(this._target.targetElements[0]).document.documentElement}get isDisposed(){return this._isDisposed}get isMouseIn(){return this._lockMouseTracker.isMouseIn}get domNode(){return this._hover.containerDomNode}get onDispose(){return this._onDispose.event}get onRequestLayout(){return this._onRequestLayout.event}get anchor(){return this._hoverPosition===2?0:1}get x(){return this._x}get y(){return this._y}get isLocked(){return this._isLocked}set isLocked(f){this._isLocked!==f&&(this._isLocked=f,this._hoverContainer.classList.toggle("locked",this._isLocked))}constructor(f,h,v,w,S,L){super(),this._keybindingService=h,this._configurationService=v,this._openerService=w,this._instantiationService=S,this._accessibilityService=L,this._messageListeners=new d.DisposableStore,this._isDisposed=!1,this._forcePosition=!1,this._x=0,this._y=0,this._isLocked=!1,this._enableFocusTraps=!1,this._addedFocusTrap=!1,this._onDispose=this._register(new k.Emitter),this._onRequestLayout=this._register(new k.Emitter),this._linkHandler=f.linkHandler||(N=>(0,o.openLinkFromMarkdown)(this._openerService,N,(0,t.isMarkdownString)(f.content)?f.content.isTrusted:void 0)),this._target="targetElements"in f.target?f.target:new u(f.target),this._hoverPointer=f.appearance?.showPointer?l("div.workbench-hover-pointer"):void 0,this._hover=this._register(new _.HoverWidget),this._hover.containerDomNode.classList.add("workbench-hover","fadeIn"),f.appearance?.compact&&this._hover.containerDomNode.classList.add("workbench-hover","compact"),f.appearance?.skipFadeInAnimation&&this._hover.containerDomNode.classList.add("skip-fade-in"),f.additionalClasses&&this._hover.containerDomNode.classList.add(...f.additionalClasses),f.position?.forcePosition&&(this._forcePosition=!0),f.trapFocus&&(this._enableFocusTraps=!0),this._hoverPosition=f.position?.hoverPosition??3,this.onmousedown(this._hover.containerDomNode,N=>N.stopPropagation()),this.onkeydown(this._hover.containerDomNode,N=>{N.equals(9)&&this.dispose()}),this._register(I.addDisposableListener(this._targetWindow,"blur",()=>this.dispose()));const D=l("div.hover-row.markdown-hover"),T=l("div.hover-contents");if(typeof f.content=="string")T.textContent=f.content,T.style.whiteSpace="pre-wrap";else if(I.isHTMLElement(f.content))T.appendChild(f.content),T.classList.add("html-hover-contents");else{const N=f.content,O=this._instantiationService.createInstance(o.MarkdownRenderer,{codeBlockFontFamily:this._configurationService.getValue("editor").fontFamily||m.EDITOR_FONT_DEFAULTS.fontFamily}),{element:F}=O.render(N,{actionHandler:{callback:x=>this._linkHandler(x),disposables:this._messageListeners},asyncRenderCallback:()=>{T.classList.add("code-hover-contents"),this.layout(),this._onRequestLayout.fire()}});T.appendChild(F)}if(D.appendChild(T),this._hover.contentsDomNode.appendChild(D),f.actions&&f.actions.length>0){const N=l("div.hover-row.status-bar"),O=l("div.actions");f.actions.forEach(F=>{const x=this._keybindingService.lookupKeybinding(F.commandId),W=x?x.getLabel():null;_.HoverAction.render(O,{label:F.label,commandId:F.commandId,run:V=>{F.run(V),this.dispose()},iconClass:F.iconClass},W)}),N.appendChild(O),this._hover.containerDomNode.appendChild(N)}this._hoverContainer=l("div.workbench-hover-container"),this._hoverPointer&&this._hoverContainer.appendChild(this._hoverPointer),this._hoverContainer.appendChild(this._hover.containerDomNode);let M;if(f.actions&&f.actions.length>0?M=!1:f.persistence?.hideOnHover===void 0?M=typeof f.content=="string"||(0,t.isMarkdownString)(f.content)&&!f.content.value.includes("](")&&!f.content.value.includes(""):M=f.persistence.hideOnHover,f.appearance?.showHoverHint){const N=l("div.hover-row.status-bar"),O=l("div.info");O.textContent=(0,i.localize)(68,"Hold {0} key to mouse over",s.isMacintosh?"Option":"Alt"),N.appendChild(O),this._hover.containerDomNode.appendChild(N)}const A=[...this._target.targetElements];M||A.push(this._hoverContainer);const P=this._register(new r(A));if(this._register(P.onMouseOut(()=>{this._isLocked||this.dispose()})),M){const N=[...this._target.targetElements,this._hoverContainer];this._lockMouseTracker=this._register(new r(N)),this._register(this._lockMouseTracker.onMouseOut(()=>{this._isLocked||this.dispose()}))}else this._lockMouseTracker=P}addFocusTrap(){if(!this._enableFocusTraps||this._addedFocusTrap)return;this._addedFocusTrap=!0;const f=this._hover.containerDomNode,h=this.findLastFocusableChild(this._hover.containerDomNode);if(h){const v=I.prepend(this._hoverContainer,l("div")),w=I.append(this._hoverContainer,l("div"));v.tabIndex=0,w.tabIndex=0,this._register(I.addDisposableListener(w,"focus",S=>{f.focus(),S.preventDefault()})),this._register(I.addDisposableListener(v,"focus",S=>{h.focus(),S.preventDefault()}))}}findLastFocusableChild(f){if(f.hasChildNodes())for(let h=0;h=0)return S}const w=this.findLastFocusableChild(v);if(w)return w}}render(f){f.appendChild(this._hoverContainer);const v=this._hoverContainer.contains(this._hoverContainer.ownerDocument.activeElement)&&(0,_.getHoverAccessibleViewHint)(this._configurationService.getValue("accessibility.verbosity.hover")===!0&&this._accessibilityService.isScreenReaderOptimized(),this._keybindingService.lookupKeybinding("editor.action.accessibleView")?.getAriaLabel());v&&(0,c.status)(v),this.layout(),this.addFocusTrap()}layout(){this._hover.containerDomNode.classList.remove("right-aligned"),this._hover.contentsDomNode.style.maxHeight="";const f=A=>{const P=I.getDomNodeZoomLevel(A),N=A.getBoundingClientRect();return{top:N.top*P,bottom:N.bottom*P,right:N.right*P,left:N.left*P}},h=this._target.targetElements.map(A=>f(A)),{top:v,right:w,bottom:S,left:L}=h[0],D=w-L,T=S-v,M={top:v,right:w,bottom:S,left:L,width:D,height:T,center:{x:L+D/2,y:v+T/2}};if(this.adjustHorizontalHoverPosition(M),this.adjustVerticalHoverPosition(M),this.adjustHoverMaxHeight(M),this._hoverContainer.style.padding="",this._hoverContainer.style.margin="",this._hoverPointer){switch(this._hoverPosition){case 1:M.left+=3,M.right+=3,this._hoverContainer.style.paddingLeft="3px",this._hoverContainer.style.marginLeft="-3px";break;case 0:M.left-=3,M.right-=3,this._hoverContainer.style.paddingRight="3px",this._hoverContainer.style.marginRight="-3px";break;case 2:M.top+=3,M.bottom+=3,this._hoverContainer.style.paddingTop="3px",this._hoverContainer.style.marginTop="-3px";break;case 3:M.top-=3,M.bottom-=3,this._hoverContainer.style.paddingBottom="3px",this._hoverContainer.style.marginBottom="-3px";break}M.center.x=M.left+D/2,M.center.y=M.top+T/2}this.computeXCordinate(M),this.computeYCordinate(M),this._hoverPointer&&(this._hoverPointer.classList.remove("top"),this._hoverPointer.classList.remove("left"),this._hoverPointer.classList.remove("right"),this._hoverPointer.classList.remove("bottom"),this.setHoverPointerPosition(M)),this._hover.onContentsChanged()}computeXCordinate(f){const h=this._hover.containerDomNode.clientWidth+2;this._target.x!==void 0?this._x=this._target.x:this._hoverPosition===1?this._x=f.right:this._hoverPosition===0?this._x=f.left-h:(this._hoverPointer?this._x=f.center.x-this._hover.containerDomNode.clientWidth/2:this._x=f.left,this._x+h>=this._targetDocumentElement.clientWidth&&(this._hover.containerDomNode.classList.add("right-aligned"),this._x=Math.max(this._targetDocumentElement.clientWidth-h-2,this._targetDocumentElement.clientLeft))),this._xthis._targetWindow.innerHeight&&(this._y=f.bottom)}adjustHorizontalHoverPosition(f){if(this._target.x!==void 0)return;const h=this._hoverPointer?3:0;if(this._forcePosition){const v=h+2;this._hoverPosition===1?this._hover.containerDomNode.style.maxWidth=`${this._targetDocumentElement.clientWidth-f.right-v}px`:this._hoverPosition===0&&(this._hover.containerDomNode.style.maxWidth=`${f.left-v}px`);return}this._hoverPosition===1?this._targetDocumentElement.clientWidth-f.right=this._hover.containerDomNode.clientWidth+h?this._hoverPosition=0:this._hoverPosition=2):this._hoverPosition===0&&(f.left=this._hover.containerDomNode.clientWidth+h?this._hoverPosition=1:this._hoverPosition=2),f.left-this._hover.containerDomNode.clientWidth-h<=this._targetDocumentElement.clientLeft&&(this._hoverPosition=1))}adjustVerticalHoverPosition(f){if(this._target.y!==void 0||this._forcePosition)return;const h=this._hoverPointer?3:0;this._hoverPosition===3?f.top-this._hover.containerDomNode.clientHeight-h<0&&(this._hoverPosition=2):this._hoverPosition===2&&f.bottom+this._hover.containerDomNode.clientHeight+h>this._targetWindow.innerHeight&&(this._hoverPosition=3)}adjustHoverMaxHeight(f){let h=this._targetWindow.innerHeight/2;if(this._forcePosition){const v=(this._hoverPointer?3:0)+2;this._hoverPosition===3?h=Math.min(h,f.top-v):this._hoverPosition===2&&(h=Math.min(h,this._targetWindow.innerHeight-f.bottom-v))}if(this._hover.containerDomNode.style.maxHeight=`${h}px`,this._hover.contentsDomNode.clientHeightf.height?this._hoverPointer.style.top=`${f.center.y-(this._y-h)-3}px`:this._hoverPointer.style.top=`${Math.round(h/2)-3}px`;break}case 3:case 2:{this._hoverPointer.classList.add(this._hoverPosition===3?"bottom":"top");const h=this._hover.containerDomNode.clientWidth;let v=Math.round(h/2)-3;const w=this._x+v;(wf.right)&&(v=f.center.x-this._x-3),this._hoverPointer.style.left=`${v}px`;break}}}focus(){this._hover.containerDomNode.focus()}dispose(){this._isDisposed||(this._onDispose.fire(),this._hoverContainer.remove(),this._messageListeners.dispose(),this._target.dispose(),super.dispose()),this._isDisposed=!0}};e.HoverWidget=a,e.HoverWidget=a=ke([ce(1,E.IKeybindingService),ce(2,y.IConfigurationService),ce(3,p.IOpenerService),ce(4,n.IInstantiationService),ce(5,g.IAccessibilityService)],a);class r extends b.Widget{get onMouseOut(){return this._onMouseOut.event}get isMouseIn(){return this._isMouseIn}constructor(f){super(),this._elements=f,this._isMouseIn=!0,this._onMouseOut=this._register(new k.Emitter),this._elements.forEach(h=>this.onmouseover(h,()=>this._onTargetMouseOver(h))),this._elements.forEach(h=>this.onmouseleave(h,()=>this._onTargetMouseLeave(h)))}_onTargetMouseOver(f){this._isMouseIn=!0,this._clearEvaluateMouseStateTimeout(f)}_onTargetMouseLeave(f){this._isMouseIn=!1,this._evaluateMouseState(f)}_evaluateMouseState(f){this._clearEvaluateMouseStateTimeout(f),this._mouseTimeout=I.getWindow(f).setTimeout(()=>this._fireIfMouseOutside(),0)}_clearEvaluateMouseStateTimeout(f){this._mouseTimeout&&(I.getWindow(f).clearTimeout(this._mouseTimeout),this._mouseTimeout=void 0)}_fireIfMouseOutside(){this._isMouseIn||this._onMouseOut.fire()}}class u{constructor(f){this._element=f,this.targetElements=[this._element]}dispose(){}}}),define(ne[36],se([1,0,6,2,11,147,131,568,659,569,571,208,7,28,43,49,70,660]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ResolvedLanguageConfiguration=e.LanguageConfigurationRegistry=e.LanguageConfigurationChangeEvent=e.LanguageConfigurationService=e.ILanguageConfigurationService=e.LanguageConfigurationServiceChangeEvent=void 0,e.getIndentationAtPosition=h;class l{constructor(A){this.languageId=A}affects(A){return this.languageId?this.languageId===A:!0}}e.LanguageConfigurationServiceChangeEvent=l,e.ILanguageConfigurationService=(0,o.createDecorator)("languageConfigurationService");let a=class extends k.Disposable{constructor(A,P){super(),this.configurationService=A,this.languageService=P,this._registry=this._register(new D),this.onDidChangeEmitter=this._register(new d.Emitter),this.onDidChange=this.onDidChangeEmitter.event,this.configurations=new Map;const N=new Set(Object.values(u));this._register(this.configurationService.onDidChangeConfiguration(O=>{const F=O.change.keys.some(W=>N.has(W)),x=O.change.overrides.filter(([W,V])=>V.some(q=>N.has(q))).map(([W])=>W);if(F)this.configurations.clear(),this.onDidChangeEmitter.fire(new l(void 0));else for(const W of x)this.languageService.isRegisteredLanguageId(W)&&(this.configurations.delete(W),this.onDidChangeEmitter.fire(new l(W)))})),this._register(this._registry.onDidChange(O=>{this.configurations.delete(O.languageId),this.onDidChangeEmitter.fire(new l(O.languageId))}))}register(A,P,N){return this._registry.register(A,P,N)}getLanguageConfiguration(A){let P=this.configurations.get(A);return P||(P=r(A,this._registry,this.configurationService,this.languageService),this.configurations.set(A,P)),P}};e.LanguageConfigurationService=a,e.LanguageConfigurationService=a=ke([ce(0,t.IConfigurationService),ce(1,i.ILanguageService)],a);function r(M,A,P,N){let O=A.getLanguageConfiguration(M);if(!O){if(!N.isRegisteredLanguageId(M))return new T(M,{});O=new T(M,{})}const F=C(O.languageId,P),x=w([O.underlyingConfig,F]);return new T(O.languageId,x)}const u={brackets:"editor.language.brackets",colorizedBracketPairs:"editor.language.colorizedBracketPairs"};function C(M,A){const P=A.getValue(u.brackets,{overrideIdentifier:M}),N=A.getValue(u.colorizedBracketPairs,{overrideIdentifier:M});return{brackets:f(P),colorizedBracketPairs:f(N)}}function f(M){if(Array.isArray(M))return M.map(A=>{if(!(!Array.isArray(A)||A.length!==2))return[A[0],A[1]]}).filter(A=>!!A)}function h(M,A,P){const N=M.getLineContent(A);let O=I.getLeadingWhitespace(N);return O.length>P-1&&(O=O.substring(0,P-1)),O}class v{constructor(A){this.languageId=A,this._resolved=null,this._entries=[],this._order=0,this._resolved=null}register(A,P){const N=new S(A,P,++this._order);return this._entries.push(N),this._resolved=null,(0,k.toDisposable)(()=>{for(let O=0;OA.configuration)))}}function w(M){let A={comments:void 0,brackets:void 0,wordPattern:void 0,indentationRules:void 0,onEnterRules:void 0,autoClosingPairs:void 0,surroundingPairs:void 0,autoCloseBefore:void 0,folding:void 0,colorizedBracketPairs:void 0,__electricCharacterSupport:void 0};for(const P of M)A={comments:P.comments||A.comments,brackets:P.brackets||A.brackets,wordPattern:P.wordPattern||A.wordPattern,indentationRules:P.indentationRules||A.indentationRules,onEnterRules:P.onEnterRules||A.onEnterRules,autoClosingPairs:P.autoClosingPairs||A.autoClosingPairs,surroundingPairs:P.surroundingPairs||A.surroundingPairs,autoCloseBefore:P.autoCloseBefore||A.autoCloseBefore,folding:P.folding||A.folding,colorizedBracketPairs:P.colorizedBracketPairs||A.colorizedBracketPairs,__electricCharacterSupport:P.__electricCharacterSupport||A.__electricCharacterSupport};return A}class S{constructor(A,P,N){this.configuration=A,this.priority=P,this.order=N}static cmp(A,P){return A.priority===P.priority?A.order-P.order:A.priority-P.priority}}class L{constructor(A){this.languageId=A}}e.LanguageConfigurationChangeEvent=L;class D extends k.Disposable{constructor(){super(),this._entries=new Map,this._onDidChange=this._register(new d.Emitter),this.onDidChange=this._onDidChange.event,this._register(this.register(g.PLAINTEXT_LANGUAGE_ID,{brackets:[["(",")"],["[","]"],["{","}"]],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],colorizedBracketPairs:[],folding:{offSide:!0}},0))}register(A,P,N=0){let O=this._entries.get(A);O||(O=new v(A),this._entries.set(A,O));const F=O.register(P,N);return this._onDidChange.fire(new L(A)),(0,k.toDisposable)(()=>{F.dispose(),this._onDidChange.fire(new L(A))})}getLanguageConfiguration(A){return this._entries.get(A)?.getResolvedConfiguration()||null}}e.LanguageConfigurationRegistry=D;class T{constructor(A,P){this.languageId=A,this.underlyingConfig=P,this._brackets=null,this._electricCharacter=null,this._onEnterSupport=this.underlyingConfig.brackets||this.underlyingConfig.indentationRules||this.underlyingConfig.onEnterRules?new p.OnEnterSupport(this.underlyingConfig):null,this.comments=T._handleComments(this.underlyingConfig),this.characterPair=new m.CharacterPairSupport(this.underlyingConfig),this.wordDefinition=this.underlyingConfig.wordPattern||E.DEFAULT_WORD_REGEXP,this.indentationRules=this.underlyingConfig.indentationRules,this.underlyingConfig.indentationRules?this.indentRulesSupport=new b.IndentRulesSupport(this.underlyingConfig.indentationRules):this.indentRulesSupport=null,this.foldingRules=this.underlyingConfig.folding||{},this.bracketsNew=new c.LanguageBracketsConfiguration(A,this.underlyingConfig)}getWordDefinition(){return(0,E.ensureValidWordDefinition)(this.wordDefinition)}get brackets(){return!this._brackets&&this.underlyingConfig.brackets&&(this._brackets=new n.RichEditBrackets(this.languageId,this.underlyingConfig.brackets)),this._brackets}get electricCharacter(){return this._electricCharacter||(this._electricCharacter=new _.BracketElectricCharacterSupport(this.brackets)),this._electricCharacter}onEnter(A,P,N,O){return this._onEnterSupport?this._onEnterSupport.onEnter(A,P,N,O):null}getAutoClosingPairs(){return new y.AutoClosingPairs(this.characterPair.getAutoClosingPairs())}getAutoCloseBeforeSet(A){return this.characterPair.getAutoCloseBeforeSet(A)}getSurroundingPairs(){return this.characterPair.getSurroundingPairs()}static _handleComments(A){const P=A.comments;if(!P)return null;const N={};if(P.lineComment&&(N.lineCommentToken=P.lineComment),P.blockComment){const[O,F]=P.blockComment;N.blockCommentStartToken=O,N.blockCommentEndToken=F}return N}}e.ResolvedLanguageConfiguration=T,(0,s.registerSingleton)(e.ILanguageConfigurationService,a,1)}),define(ne[401],se([1,0,14,2,361,646,4,36,666,51,211,13,62,54,8,17,232,105,55,52,5,373,326]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorWorkerClient=e.EditorWorkerService=void 0;const f=5*60*1e3;function h(T,M){const A=T.getModel(M);return!(!A||A.isTooLargeForSyncing())}let v=class extends k.Disposable{constructor(M,A,P,N,O,F){super(),this._languageConfigurationService=O,this._modelService=A,this._workerManager=this._register(new S(M,this._modelService)),this._logService=N,this._register(F.linkProvider.register({language:"*",hasAccessToAllModels:!0},{provideLinks:async(x,W)=>{if(!h(this._modelService,x.uri))return Promise.resolve({links:[]});const q=await(await this._workerWithResources([x.uri])).$computeLinks(x.uri.toString());return q&&{links:q}}})),this._register(F.completionProvider.register("*",new w(this._workerManager,P,this._modelService,this._languageConfigurationService)))}dispose(){super.dispose()}canComputeUnicodeHighlights(M){return h(this._modelService,M)}async computedUnicodeHighlights(M,A,P){return(await this._workerWithResources([M])).$computeUnicodeHighlights(M.toString(),A,P)}async computeDiff(M,A,P,N){const F=await(await this._workerWithResources([M,A],!0)).$computeDiff(M.toString(),A.toString(),P,N);if(!F)return null;return{identical:F.identical,quitEarly:F.quitEarly,changes:W(F.changes),moves:F.moves.map(V=>new g.MovedText(new c.LineRangeMapping(new l.LineRange(V[0],V[1]),new l.LineRange(V[2],V[3])),W(V[4])))};function W(V){return V.map(q=>new c.DetailedLineRangeMapping(new l.LineRange(q[0],q[1]),new l.LineRange(q[2],q[3]),q[4]?.map(H=>new c.RangeMapping(new y.Range(H[0],H[1],H[2],H[3]),new y.Range(H[4],H[5],H[6],H[7])))))}}async computeMoreMinimalEdits(M,A,P=!1){if((0,n.isNonEmptyArray)(A)){if(!h(this._modelService,M))return Promise.resolve(A);const N=t.StopWatch.create(),O=this._workerWithResources([M]).then(F=>F.$computeMoreMinimalEdits(M.toString(),A,P));return O.finally(()=>this._logService.trace("FORMAT#computeMoreMinimalEdits",M.toString(!0),N.elapsed())),Promise.race([O,(0,d.timeout)(1e3).then(()=>A)])}else return Promise.resolve(void 0)}canNavigateValueSet(M){return h(this._modelService,M)}async navigateValueSet(M,A,P){const N=this._modelService.getModel(M);if(!N)return null;const O=this._languageConfigurationService.getLanguageConfiguration(N.getLanguageId()).getWordDefinition(),F=O.source,x=O.flags;return(await this._workerWithResources([M])).$navigateValueSet(M.toString(),A,P,F,x)}canComputeWordRanges(M){return h(this._modelService,M)}async computeWordRanges(M,A){const P=this._modelService.getModel(M);if(!P)return Promise.resolve(null);const N=this._languageConfigurationService.getLanguageConfiguration(P.getLanguageId()).getWordDefinition(),O=N.source,F=N.flags;return(await this._workerWithResources([M])).$computeWordRanges(M.toString(),A,O,F)}async findSectionHeaders(M,A){return(await this._workerWithResources([M])).$findSectionHeaders(M.toString(),A)}async computeDefaultDocumentColors(M){return(await this._workerWithResources([M])).$computeDefaultDocumentColors(M.toString())}async _workerWithResources(M,A=!1){return await(await this._workerManager.withWorker()).workerWithSyncedResources(M,A)}};e.EditorWorkerService=v,e.EditorWorkerService=v=ke([ce(1,b.IModelService),ce(2,p.ITextResourceConfigurationService),ce(3,o.ILogService),ce(4,m.ILanguageConfigurationService),ce(5,s.ILanguageFeaturesService)],v);class w{constructor(M,A,P,N){this.languageConfigurationService=N,this._debugDisplayName="wordbasedCompletions",this._workerManager=M,this._configurationService=A,this._modelService=P}async provideCompletionItems(M,A){const P=this._configurationService.getValue(M.uri,A,"editor");if(P.wordBasedSuggestions==="off")return;const N=[];if(P.wordBasedSuggestions==="currentDocument")h(this._modelService,M.uri)&&N.push(M.uri);else for(const H of this._modelService.getModels())h(this._modelService,H.uri)&&(H===M?N.unshift(H.uri):(P.wordBasedSuggestions==="allDocuments"||H.getLanguageId()===M.getLanguageId())&&N.push(H.uri));if(N.length===0)return;const O=this.languageConfigurationService.getLanguageConfiguration(M.getLanguageId()).getWordDefinition(),F=M.getWordAtPosition(A),x=F?new y.Range(A.lineNumber,F.startColumn,A.lineNumber,F.endColumn):y.Range.fromPositions(A),W=x.setEndPosition(A.lineNumber,A.column),q=await(await this._workerManager.withWorker()).textualSuggest(N,F?.word,O);if(q)return{duration:q.duration,suggestions:q.words.map(H=>({kind:18,label:H,insertText:H,range:{insert:W,replace:x}}))}}}let S=class extends k.Disposable{constructor(M,A){super(),this._workerDescriptor=M,this._modelService=A,this._editorWorkerClient=null,this._lastWorkerUsedTime=new Date().getTime(),this._register(new r.WindowIntervalTimer).cancelAndSet(()=>this._checkStopIdleWorker(),Math.round(f/2),a.mainWindow),this._register(this._modelService.onModelRemoved(N=>this._checkStopEmptyWorker()))}dispose(){this._editorWorkerClient&&(this._editorWorkerClient.dispose(),this._editorWorkerClient=null),super.dispose()}_checkStopEmptyWorker(){if(!this._editorWorkerClient)return;this._modelService.getModels().length===0&&(this._editorWorkerClient.dispose(),this._editorWorkerClient=null)}_checkStopIdleWorker(){if(!this._editorWorkerClient)return;new Date().getTime()-this._lastWorkerUsedTime>f&&(this._editorWorkerClient.dispose(),this._editorWorkerClient=null)}withWorker(){return this._lastWorkerUsedTime=new Date().getTime(),this._editorWorkerClient||(this._editorWorkerClient=new D(this._workerDescriptor,!1,this._modelService)),Promise.resolve(this._editorWorkerClient)}};S=ke([ce(1,b.IModelService)],S);class L{constructor(M){this._instance=M,this.proxy=this._instance}dispose(){this._instance.dispose()}setChannel(M,A){throw new Error("Not supported")}}let D=class extends k.Disposable{constructor(M,A,P){super(),this._workerDescriptor=M,this._disposed=!1,this._modelService=P,this._keepIdleModels=A,this._worker=null,this._modelManager=null}fhr(M,A){throw new Error("Not implemented!")}_getOrCreateWorker(){if(!this._worker)try{this._worker=this._register((0,E.createWebWorker)(this._workerDescriptor)),C.EditorWorkerHost.setChannel(this._worker,this._createEditorWorkerHost())}catch(M){(0,I.logOnceWebWorkerWarning)(M),this._worker=this._createFallbackLocalWorker()}return this._worker}async _getProxy(){try{const M=this._getOrCreateWorker().proxy;return await M.$ping(),M}catch(M){return(0,I.logOnceWebWorkerWarning)(M),this._worker=this._createFallbackLocalWorker(),this._worker.proxy}}_createFallbackLocalWorker(){return new L(new _.EditorSimpleWorker(this._createEditorWorkerHost(),null))}_createEditorWorkerHost(){return{$fhr:(M,A)=>this.fhr(M,A)}}_getOrCreateModelManager(M){return this._modelManager||(this._modelManager=this._register(new u.WorkerTextModelSyncClient(M,this._modelService,this._keepIdleModels))),this._modelManager}async workerWithSyncedResources(M,A=!1){if(this._disposed)return Promise.reject((0,i.canceled)());const P=await this._getProxy();return this._getOrCreateModelManager(P).ensureSyncedResources(M,A),P}async textualSuggest(M,A,P){const N=await this.workerWithSyncedResources(M),O=P.source,F=P.flags;return N.$textualSuggest(M.map(x=>x.toString()),A,O,F)}dispose(){super.dispose(),this._disposed=!0}};e.EditorWorkerClient=D,e.EditorWorkerClient=D=ke([ce(2,b.IModelService)],D)}),define(ne[275],se([1,0,131,36,240]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getEnterAction=E;function E(y,m,_,b){m.tokenization.forceTokenization(_.startLineNumber);const p=m.getLanguageIdAtPosition(_.startLineNumber,_.startColumn),n=b.getLanguageConfiguration(p);if(!n)return null;const t=new I.IndentationContextProcessor(m,b).getProcessedTokenContextAroundRange(_),i=t.previousLineProcessedTokens.getLineContent(),s=t.beforeRangeProcessedTokens.getLineContent(),g=t.afterRangeProcessedTokens.getLineContent(),c=n.onEnter(y,i,s,g);if(!c)return null;const l=c.indentAction;let a=c.appendText;const r=c.removeText||0;a?l===d.IndentAction.Indent&&(a=" "+a):l===d.IndentAction.Indent||l===d.IndentAction.IndentOutdent?a=" ":a="";let u=(0,k.getIndentationAtPosition)(m,_.startLineNumber,_.startColumn);return r&&(u=u.substring(0,u.length-r)),{indentAction:l,appendText:a,removeText:r,indentation:u}}}),define(ne[183],se([1,0,11,94,4,23,275,36]),function(oe,e,d,k,I,E,y,m){"use strict";var _;Object.defineProperty(e,"__esModule",{value:!0}),e.ShiftCommand=void 0;const b=Object.create(null);function p(o,t){if(t<=0)return"";b[o]||(b[o]=["",o]);const i=b[o];for(let s=i.length;s<=t;s++)i[s]=i[s-1]+o;return i[t]}let n=_=class{static unshiftIndent(t,i,s,g,c){const l=k.CursorColumns.visibleColumnFromColumn(t,i,s);if(c){const a=p(" ",g),u=k.CursorColumns.prevIndentTabStop(l,g)/g;return p(a,u)}else{const a=" ",u=k.CursorColumns.prevRenderTabStop(l,s)/s;return p(a,u)}}static shiftIndent(t,i,s,g,c){const l=k.CursorColumns.visibleColumnFromColumn(t,i,s);if(c){const a=p(" ",g),u=k.CursorColumns.nextIndentTabStop(l,g)/g;return p(a,u)}else{const a=" ",u=k.CursorColumns.nextRenderTabStop(l,s)/s;return p(a,u)}}constructor(t,i,s){this._languageConfigurationService=s,this._opts=i,this._selection=t,this._selectionId=null,this._useLastEditRangeForCursorEndPosition=!1,this._selectionStartColumnStaysPut=!1}_addEditOperation(t,i,s){this._useLastEditRangeForCursorEndPosition?t.addTrackedEditOperation(i,s):t.addEditOperation(i,s)}getEditOperations(t,i){const s=this._selection.startLineNumber;let g=this._selection.endLineNumber;this._selection.endColumn===1&&s!==g&&(g=g-1);const{tabSize:c,indentSize:l,insertSpaces:a}=this._opts,r=s===g;if(this._opts.useTabStops){this._selection.isEmpty()&&/^\s*$/.test(t.getLineContent(s))&&(this._useLastEditRangeForCursorEndPosition=!0);let u=0,C=0;for(let f=s;f<=g;f++,u=C){C=0;const h=t.getLineContent(f);let v=d.firstNonWhitespaceIndex(h);if(this._opts.isUnshift&&(h.length===0||v===0)||!r&&!this._opts.isUnshift&&h.length===0)continue;if(v===-1&&(v=h.length),f>1&&k.CursorColumns.visibleColumnFromColumn(h,v+1,c)%l!==0&&t.tokenization.isCheapToTokenize(f-1)){const L=(0,y.getEnterAction)(this._opts.autoIndent,t,new I.Range(f-1,t.getLineMaxColumn(f-1),f-1,t.getLineMaxColumn(f-1)),this._languageConfigurationService);if(L){if(C=u,L.appendText)for(let D=0,T=L.appendText.length;Dx(H,K),unshiftIndent:K=>W(H,K)},H.languageConfigurationService);if(Y===null)return null;const G=(0,o.getIndentationAtPosition)(z,U.startLineNumber,U.startColumn);return Y===H.normalizeIndentation(G)?null:Y}static _getIndentationAndAutoClosingPairEdits(H,z,U,j,Y){const G=U.map(({selection:R,indentation:J})=>{if(Y!==null){const ie=this._getEditFromIndentationAndSelection(H,z,J,R,j,!1);return new T(ie,R,j,Y)}else{const ie=this._getEditFromIndentationAndSelection(H,z,J,R,j,!0);return F(ie.range,ie.text,!1)}}),K={shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!1};return new m.EditOperationResult(4,G,K)}static _getEditFromIndentationAndSelection(H,z,U,j,Y,G=!0){const K=j.startLineNumber,R=z.getLineFirstNonWhitespaceColumn(K);let J=H.normalizeIndentation(U);if(R!==0){const ue=z.getLineContent(K);J+=ue.substring(R-1,j.startColumn-1)}return J+=G?Y:"",{range:new b.Range(K,1,j.endLineNumber,j.endColumn),text:J}}}e.AutoIndentOperation=g;class c{static getEdits(H,z,U,j,Y,G){if(O(z,U,j,Y,G))return this._runAutoClosingOvertype(H,j,G)}static _runAutoClosingOvertype(H,z,U){const j=[];for(let Y=0,G=z.length;Ynew I.ReplaceCommand(new b.Range(K.positionLineNumber,K.positionColumn,K.positionLineNumber,K.positionColumn+1),"",!1));return new m.EditOperationResult(4,G,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!1})}}}e.AutoClosingOvertypeWithInterceptorsOperation=l;class a{static getEdits(H,z,U,j,Y,G){if(!G){const K=this.getAutoClosingPairClose(H,z,U,j,Y);if(K!==null)return this._runAutoClosingOpenCharType(U,j,Y,K)}}static _runAutoClosingOpenCharType(H,z,U,j){const Y=[];for(let G=0,K=H.length;G{const ee=ae.getPosition();return Y?{lineNumber:ee.lineNumber,beforeColumn:ee.column-j.length,afterColumn:ee.column}:{lineNumber:ee.lineNumber,beforeColumn:ee.column,afterColumn:ee.column}}),K=this._findAutoClosingPairOpen(H,z,G.map(ae=>new p.Position(ae.lineNumber,ae.beforeColumn)),j);if(!K)return null;let R,J;if((0,m.isQuote)(j)?(R=H.autoClosingQuotes,J=H.shouldAutoCloseBefore.quote):(H.blockCommentStartToken?K.open.includes(H.blockCommentStartToken):!1)?(R=H.autoClosingComments,J=H.shouldAutoCloseBefore.comment):(R=H.autoClosingBrackets,J=H.shouldAutoCloseBefore.bracket),R==="never")return null;const ue=this._findContainedAutoClosingPair(H,K),he=ue?ue.close:"";let pe=!0;for(const ae of G){const{lineNumber:ee,beforeColumn:de,afterColumn:ge}=ae,X=z.getLineContent(ee),B=X.substring(0,de-1),$=X.substring(ge-1);if($.startsWith(he)||(pe=!1),$.length>0){const re=$.charAt(0);if(!this._isBeforeClosingBrace(H,$)&&!J(re))return null}if(K.open.length===1&&(j==="'"||j==='"')&&R!=="always"){const re=(0,_.getMapForWordSeparators)(H.wordSeparators,[]);if(B.length>0){const le=B.charCodeAt(B.length-1);if(re.get(le)===0)return null}}if(!z.tokenization.isCheapToTokenize(ee))return null;z.tokenization.forceTokenization(ee);const Q=z.tokenization.getLineTokens(ee),Z=(0,t.createScopedLineTokens)(Q,de-1);if(!K.shouldAutoClose(Z,de-Z.firstCharOffset))return null;const te=K.findNeutralCharacter();if(te){const re=z.tokenization.getTokenTypeIfInsertingCharacter(ee,de,te);if(!K.isOK(re))return null}}return pe?K.close.substring(0,K.close.length-he.length):K.close}static _findContainedAutoClosingPair(H,z){if(z.open.length<=1)return null;const U=z.close.charAt(z.close.length-1),j=H.autoClosingPairs.autoClosingPairsCloseByEnd.get(U)||[];let Y=null;for(const G of j)G.open!==z.open&&z.open.includes(G.open)&&z.close.endsWith(G.close)&&(!Y||G.open.length>Y.open.length)&&(Y=G);return Y}static _findAutoClosingPairOpen(H,z,U,j){const Y=H.autoClosingPairs.autoClosingPairsOpenByEnd.get(j);if(!Y)return null;let G=null;for(const K of Y)if(G===null||K.open.length>G.open.length){let R=!0;for(const J of U)if(z.getValueInRange(new b.Range(J.lineNumber,J.column-K.open.length+1,J.lineNumber,J.column))+j!==K.open){R=!1;break}R&&(G=K)}return G}static _isBeforeClosingBrace(H,z){const U=z.charAt(0),j=H.autoClosingPairs.autoClosingPairsOpenByStart.get(U)||[],Y=H.autoClosingPairs.autoClosingPairsCloseByStart.get(U)||[],G=j.some(R=>z.startsWith(R.open)),K=Y.some(R=>z.startsWith(R.close));return!G&&K}}e.AutoClosingOpenCharTypeOperation=a;class r{static getEdits(H,z,U,j,Y){if(!Y&&this._isSurroundSelectionType(H,z,U,j))return this._runSurroundSelectionType(H,U,j)}static _runSurroundSelectionType(H,z,U){const j=[];for(let Y=0,G=z.length;Y=4){const R=(0,i.getIndentForEnter)(H.autoIndent,z,j,{unshiftIndent:J=>W(H,J),shiftIndent:J=>x(H,J),normalizeIndentation:J=>H.normalizeIndentation(J)},H.languageConfigurationService);if(R){let J=H.visibleColumnFromColumn(z,j.getEndPosition());const ie=j.endColumn,ue=z.getLineContent(j.endLineNumber),he=k.firstNonWhitespaceIndex(ue);if(he>=0?j=j.setEndPosition(j.endLineNumber,Math.max(j.endColumn,he+1)):j=j.setEndPosition(j.endLineNumber,z.getLineMaxColumn(j.endLineNumber)),U)return new I.ReplaceCommandWithoutChangingPosition(j,` -`+H.normalizeIndentation(R.afterEnter),!0);{let pe=0;return ie<=he+1&&(H.insertSpaces||(J=Math.ceil(J/H.indentSize)),pe=Math.min(J+1-H.normalizeIndentation(R.afterEnter).length-1,0)),new I.ReplaceCommandWithOffsetCursorState(j,` -`+H.normalizeIndentation(R.afterEnter),0,pe,!0)}}}return F(j,` -`+H.normalizeIndentation(K),U)}static lineInsertBefore(H,z,U){if(z===null||U===null)return[];const j=[];for(let Y=0,G=U.length;Ythis._compositionType(U,ie,Y,G,K,R));return new m.EditOperationResult(4,J,{shouldPushStackElementBefore:A(H,4),shouldPushStackElementAfter:!1})}static _compositionType(H,z,U,j,Y,G){if(!z.isEmpty())return null;const K=z.getPosition(),R=Math.max(1,K.column-j),J=Math.min(H.getLineMaxColumn(K.lineNumber),K.column+Y),ie=new b.Range(K.lineNumber,R,K.lineNumber,J);return H.getValueInRange(ie)===U&&G===0?null:new I.ReplaceCommandWithOffsetCursorState(ie,U,0,G)}}e.CompositionOperation=v;class w{static getEdits(H,z,U){const j=[];for(let G=0,K=z.length;G1){let K;for(K=U-1;K>=1;K--){const ie=z.getLineContent(K);if(k.lastNonWhitespaceIndex(ie)>=0)break}if(K<1)return null;const R=z.getLineMaxColumn(K),J=(0,s.getEnterAction)(H.autoIndent,z,new b.Range(K,R,K,R),H.languageConfigurationService);J&&(Y=J.indentation+J.appendText)}return j&&(j===n.IndentAction.Indent&&(Y=x(H,Y)),j===n.IndentAction.Outdent&&(Y=W(H,Y)),Y=H.normalizeIndentation(Y)),Y||null}static _replaceJumpToNextIndent(H,z,U,j){let Y="";const G=U.getStartPosition();if(H.insertSpaces){const K=H.visibleColumnFromColumn(z,G),R=H.indentSize,J=R-K%R;for(let ie=0;ie2?J.charCodeAt(R.column-2):0)===92&&ue)return!1;if(q.autoClosingOvertype==="auto"){let pe=!1;for(let ae=0,ee=U.length;ae0){const f=this._cursors.getSelections();for(let h=0;hL&&(w=w.slice(0,L),S=!0);const D=c.from(this._model,this);return this._cursors.setStates(w),this._cursors.normalize(),this._columnSelectData=null,this._validateAutoClosedActions(),this._emitStateChangedIfNecessary(f,h,v,D,S)}setCursorColumnSelectData(f){this._columnSelectData=f}revealAll(f,h,v,w,S,L){const D=this._cursors.getViewPositions();let T=null,M=null;D.length>1?M=this._cursors.getViewSelections():T=p.Range.fromPositions(D[0],D[0]),f.emitViewEvent(new t.ViewRevealRangeRequestEvent(h,v,T,M,w,S,L))}revealPrimary(f,h,v,w,S,L){const T=[this._cursors.getPrimaryCursor().viewState.selection];f.emitViewEvent(new t.ViewRevealRangeRequestEvent(h,v,null,T,w,S,L))}saveState(){const f=[],h=this._cursors.getSelections();for(let v=0,w=h.length;v0){const S=E.CursorState.fromModelSelections(v.resultingSelection);this.setStates(f,"modelChange",v.isUndoing?5:v.isRedoing?6:2,S)&&this.revealAll(f,"modelChange",!1,0,!0,0)}else{const S=this._cursors.readSelectionFromMarkers();this.setStates(f,"modelChange",2,E.CursorState.fromModelSelections(S))}}}getSelection(){return this._cursors.getPrimaryCursor().modelState.selection}getTopMostViewPosition(){return this._cursors.getTopMostViewPosition()}getBottomMostViewPosition(){return this._cursors.getBottomMostViewPosition()}getCursorColumnSelectData(){if(this._columnSelectData)return this._columnSelectData;const f=this._cursors.getPrimaryCursor(),h=f.viewState.selectionStart.getStartPosition(),v=f.viewState.position;return{isReal:!1,fromViewLineNumber:h.lineNumber,fromViewVisualColumn:this.context.cursorConfig.visibleColumnFromColumn(this._viewModel,h),toViewLineNumber:v.lineNumber,toViewVisualColumn:this.context.cursorConfig.visibleColumnFromColumn(this._viewModel,v)}}getSelections(){return this._cursors.getSelections()}setSelections(f,h,v,w){this.setStates(f,h,w,E.CursorState.fromModelSelections(v))}getPrevEditOperationType(){return this._prevEditOperationType}setPrevEditOperationType(f){this._prevEditOperationType=f}_pushAutoClosedAction(f,h){const v=[],w=[];for(let D=0,T=f.length;D0&&this._pushAutoClosedAction(v,w),this._prevEditOperationType=f.type}f.shouldPushStackElementAfter&&this._model.pushStackElement()}_interpretCommandResult(f){(!f||f.length===0)&&(f=this._cursors.readSelectionFromMarkers()),this._columnSelectData=null,this._cursors.setSelections(f),this._cursors.normalize()}_emitStateChangedIfNecessary(f,h,v,w,S){const L=c.from(this._model,this);if(L.equals(w))return!1;const D=this._cursors.getSelections(),T=this._cursors.getViewSelections();if(f.emitViewEvent(new t.ViewCursorStateChangedEvent(T,D,v)),!w||w.cursorState.length!==L.cursorState.length||L.cursorState.some((M,A)=>!M.modelState.equals(w.cursorState[A].modelState))){const M=w?w.cursorState.map(P=>P.modelState.selection):null,A=w?w.modelVersionId:0;f.emitOutgoingEvent(new s.CursorStateChangedEvent(M,D,A,L.modelVersionId,h||"keyboard",v,S))}return!0}_findAutoClosingPairs(f){if(!f.length)return null;const h=[];for(let v=0,w=f.length;v=0)return null;const L=S.text.match(/([)\]}>'"`])([^)\]}>'"`]*)$/);if(!L)return null;const D=L[1],T=this.context.cursorConfig.autoClosingPairs.autoClosingPairsCloseSingleChar.get(D);if(!T||T.length!==1)return null;const M=T[0].open,A=S.text.length-L[2].length-1,P=S.text.lastIndexOf(M,A-1);if(P===-1)return null;h.push([P,A])}return h}executeEdits(f,h,v,w){let S=null;h==="snippet"&&(S=this._findAutoClosingPairs(v)),S&&(v[0]._isTracked=!0);const L=[],D=[],T=this._model.pushEditOperations(this.getSelections(),v,M=>{if(S)for(let P=0,N=S.length;P0&&this._pushAutoClosedAction(L,D)}_executeEdit(f,h,v,w=0){if(this.context.cursorConfig.readOnly)return;const S=c.from(this._model,this);this._cursors.stopTrackingSelections(),this._isHandling=!0;try{this._cursors.ensureValidState(),f()}catch(L){(0,d.onUnexpectedError)(L)}this._isHandling=!1,this._cursors.startTrackingSelections(),this._validateAutoClosedActions(),this._emitStateChangedIfNecessary(h,v,w,S,!1)&&this.revealAll(h,v,!1,0,!0,0)}getAutoClosedCharacters(){return l.getAllAutoClosedCharacters(this._autoClosedActions)}startComposition(f){this._compositionState=new u(this._model,this.getSelections())}endComposition(f,h){const v=this._compositionState?this._compositionState.deduceOutcome(this._model,this.getSelections()):null;this._compositionState=null,this._executeEdit(()=>{h==="keyboard"&&this._executeEditOperation(_.TypeOperations.compositionEndWithInterceptors(this._prevEditOperationType,this.context.cursorConfig,this._model,v,this.getSelections(),this.getAutoClosedCharacters()))},f,h)}type(f,h,v){this._executeEdit(()=>{if(v==="keyboard"){const w=h.length;let S=0;for(;S{const M=T.getPosition();return new n.Selection(M.lineNumber,M.column+S,M.lineNumber,M.column+S)});this.setSelections(f,L,D,0)}return}this._executeEdit(()=>{this._executeEditOperation(_.TypeOperations.compositionType(this._prevEditOperationType,this.context.cursorConfig,this._model,this.getSelections(),h,v,w,S))},f,L)}paste(f,h,v,w,S){this._executeEdit(()=>{this._executeEditOperation(_.TypeOperations.paste(this.context.cursorConfig,this._model,this.getSelections(),h,v,w||[]))},f,S,4)}cut(f,h){this._executeEdit(()=>{this._executeEditOperation(m.DeleteOperations.cut(this.context.cursorConfig,this._model,this.getSelections()))},f,h)}executeCommand(f,h,v){this._executeEdit(()=>{this._cursors.killSecondaryCursors(),this._executeEditOperation(new E.EditOperationResult(0,[h],{shouldPushStackElementBefore:!1,shouldPushStackElementAfter:!1}))},f,v)}executeCommands(f,h,v){this._executeEdit(()=>{this._executeEditOperation(new E.EditOperationResult(0,h,{shouldPushStackElementBefore:!1,shouldPushStackElementAfter:!1}))},f,v)}}e.CursorsController=g;class c{static from(f,h){return new c(f.getVersionId(),h.getCursorStates())}constructor(f,h){this.modelVersionId=f,this.cursorState=h}equals(f){if(!f||this.modelVersionId!==f.modelVersionId||this.cursorState.length!==f.cursorState.length)return!1;for(let h=0,v=this.cursorState.length;h=h.length||!h[v].strictContainsRange(f[v]))return!1;return!0}}class a{static executeCommands(f,h,v){const w={model:f,selectionsBefore:h,trackedRanges:[],trackedRangesDirection:[]},S=this._innerExecuteCommands(w,v);for(let L=0,D=w.trackedRanges.length;L0&&(L[0]._isTracked=!0);let D=f.model.pushEditOperations(f.selectionsBefore,L,M=>{const A=[];for(let O=0;OO.identifier.minor-F.identifier.minor,N=[];for(let O=0;O0?(A[O].sort(P),N[O]=h[O].computeCursorState(f.model,{getInverseEditOperations:()=>A[O],getTrackedSelection:F=>{const x=parseInt(F,10),W=f.model._getTrackedRange(f.trackedRanges[x]);return f.trackedRangesDirection[x]===0?new n.Selection(W.startLineNumber,W.startColumn,W.endLineNumber,W.endColumn):new n.Selection(W.endLineNumber,W.endColumn,W.startLineNumber,W.startColumn)}})):N[O]=f.selectionsBefore[O];return N});D||(D=f.selectionsBefore);const T=[];for(const M in S)S.hasOwnProperty(M)&&T.push(parseInt(M,10));T.sort((M,A)=>A-M);for(const M of T)D.splice(M,1);return D}static _arrayIsEmpty(f){for(let h=0,v=f.length;h{p.Range.isEmpty(P)&&N===""||w.push({identifier:{major:h,minor:S++},range:P,text:N,forceMoveMarkers:O,isAutoWhitespaceEdit:v.insertsAutoWhitespace})};let D=!1;const A={addEditOperation:L,addTrackedEditOperation:(P,N,O)=>{D=!0,L(P,N,O)},trackSelection:(P,N)=>{const O=n.Selection.liftSelection(P);let F;if(O.isEmpty())if(typeof N=="boolean")N?F=2:F=3;else{const V=f.model.getLineMaxColumn(O.startLineNumber);O.startColumn===V?F=2:F=3}else F=1;const x=f.trackedRanges.length,W=f.model._setTrackedRange(null,O,F);return f.trackedRanges[x]=W,f.trackedRangesDirection[x]=O.getDirection(),x.toString()}};try{v.getEditOperations(f.model,A)}catch(P){return(0,d.onUnexpectedError)(P),{operations:[],hadTrackedEditOperation:!1}}return{operations:w,hadTrackedEditOperation:D}}static _getLoserCursorMap(f){f=f.slice(0),f.sort((v,w)=>-p.Range.compareRangesUsingEnds(v.range,w.range));const h={};for(let v=1;vS.identifier.major?L=w.identifier.major:L=S.identifier.major,h[L.toString()]=!0;for(let D=0;D0&&v--}}return h}}e.CommandExecutor=a;class r{constructor(f,h,v){this.text=f,this.startSelection=h,this.endSelection=v}}class u{static _capture(f,h){const v=[];for(const w of h){if(w.startLineNumber!==w.endLineNumber)return null;v.push(new r(f.getLineContent(w.startLineNumber),w.startColumn-1,w.endColumn-1))}return v}constructor(f,h){this._original=u._capture(f,h)}deduceOutcome(f,h){if(!this._original)return null;const v=u._capture(f,h);if(!v||this._original.length!==v.length)return null;const w=[];for(let S=0,L=this._original.length;S{M.affects(this._languageId)&&this._onDidChangeLanguageConfiguration.fire({})})),this._register(k.Event.filter(b.TreeSitterTokenizationRegistry.onDidChange,M=>M.changedLanguages.includes(this._languageId))(()=>{this.createPreferredTokenProvider()})),this.createPreferredTokenProvider()}createGrammarTokens(){return this._register(new C(this._languageService.languageIdCodec,this._textModel,()=>this._languageId,this._attachedViews))}createTreeSitterTokens(){return this._register(new s.TreeSitterTokens(this._treeSitterService,this._languageService.languageIdCodec,this._textModel,()=>this._languageId))}createTokens(h){const v=this._tokens!==void 0;this._tokens?.dispose(),this._tokens=h?this.createTreeSitterTokens():this.createGrammarTokens(),this._tokensDisposables.clear(),this._tokensDisposables.add(this._tokens.onDidChangeTokens(w=>{this._emitModelTokensChangedEvent(w)})),this._tokensDisposables.add(this._tokens.onDidChangeBackgroundTokenizationState(w=>{this._bracketPairsTextModelPart.handleDidChangeBackgroundTokenizationState()})),v&&this._tokens.resetTokenization()}createPreferredTokenProvider(){b.TreeSitterTokenizationRegistry.get(this._languageId)?this._tokens instanceof s.TreeSitterTokens||this.createTokens(!0):this._tokens instanceof C||this.createTokens(!1)}handleLanguageConfigurationServiceChange(h){h.affects(this._languageId)&&this._onDidChangeLanguageConfiguration.fire({})}handleDidChangeContent(h){if(h.isFlush)this._semanticTokens.flush();else if(!h.isEolChange)for(const v of h.changes){const[w,S,L]=(0,E.countEOL)(v.text);this._semanticTokens.acceptEdit(v.range,w,S,L,v.text.length>0?v.text.charCodeAt(0):0)}this._tokens.handleDidChangeContent(h)}handleDidChangeAttached(){this._tokens.handleDidChangeAttached()}getLineTokens(h){this.validateLineNumber(h);const v=this._tokens.getLineTokens(h);return this._semanticTokens.addSparseTokens(h,v)}_emitModelTokensChangedEvent(h){this._textModel._isDisposing()||(this._bracketPairsTextModelPart.handleDidChangeTokens(h),this._onDidChangeTokens.fire(h))}validateLineNumber(h){if(h<1||h>this._textModel.getLineCount())throw new d.BugIndicatingError("Illegal value for lineNumber")}get hasTokens(){return this._tokens.hasTokens}resetTokenization(){this._tokens.resetTokenization()}get backgroundTokenizationState(){return this._tokens.backgroundTokenizationState}forceTokenization(h){this.validateLineNumber(h),this._tokens.forceTokenization(h)}hasAccurateTokensForLine(h){return this.validateLineNumber(h),this._tokens.hasAccurateTokensForLine(h)}isCheapToTokenize(h){return this.validateLineNumber(h),this._tokens.isCheapToTokenize(h)}tokenizeIfCheap(h){this.validateLineNumber(h),this._tokens.tokenizeIfCheap(h)}getTokenTypeIfInsertingCharacter(h,v,w){return this._tokens.getTokenTypeIfInsertingCharacter(h,v,w)}tokenizeLineWithEdit(h,v,w){return this._tokens.tokenizeLineWithEdit(h,v,w)}setSemanticTokens(h,v){this._semanticTokens.set(h,v),this._emitModelTokensChangedEvent({semanticTokensApplied:h!==null,ranges:[{fromLineNumber:1,toLineNumber:this._textModel.getLineCount()}]})}hasCompleteSemanticTokens(){return this._semanticTokens.isComplete()}hasSomeSemanticTokens(){return!this._semanticTokens.isEmpty()}setPartialSemanticTokens(h,v){if(this.hasCompleteSemanticTokens())return;const w=this._textModel.validateRange(this._semanticTokens.setPartial(h,v));this._emitModelTokensChangedEvent({semanticTokensApplied:!0,ranges:[{fromLineNumber:w.startLineNumber,toLineNumber:w.endLineNumber}]})}getWordAtPosition(h){this.assertNotDisposed();const v=this._textModel.validatePosition(h),w=this._textModel.getLineContent(v.lineNumber),S=this.getLineTokens(v.lineNumber),L=S.findTokenIndexAtOffset(v.column-1),[D,T]=r._findLanguageBoundaries(S,L),M=(0,_.getWordAtText)(v.column,this.getLanguageConfiguration(S.getLanguageId(L)).getWordDefinition(),w.substring(D,T),D);if(M&&M.startColumn<=h.column&&h.column<=M.endColumn)return M;if(L>0&&D===v.column-1){const[A,P]=r._findLanguageBoundaries(S,L-1),N=(0,_.getWordAtText)(v.column,this.getLanguageConfiguration(S.getLanguageId(L-1)).getWordDefinition(),w.substring(A,P),A);if(N&&N.startColumn<=h.column&&h.column<=N.endColumn)return N}return null}getLanguageConfiguration(h){return this._languageConfigurationService.getLanguageConfiguration(h)}static _findLanguageBoundaries(h,v){const w=h.getLanguageId(v);let S=0;for(let D=v;D>=0&&h.getLanguageId(D)===w;D--)S=h.getStartOffset(D);let L=h.getLineContent().length;for(let D=v,T=h.getCount();D{const D=this.getLanguageId();L.changedLanguages.indexOf(D)!==-1&&this.resetTokenization()})),this.resetTokenization(),this._register(S.onDidChangeVisibleRanges(({view:L,state:D})=>{if(D){let T=this._attachedViewStates.get(L);T||(T=new i.AttachedViewHandler(()=>this.refreshRanges(T.lineRanges)),this._attachedViewStates.set(L,T)),T.handleStateChange(D)}else this._attachedViewStates.deleteAndDispose(L)}))}resetTokenization(h=!0){this._tokens.flush(),this._debugBackgroundTokens?.flush(),this._debugBackgroundStates&&(this._debugBackgroundStates=new t.TrackingTokenizationStateStore(this._textModel.getLineCount())),h&&this._onDidChangeTokens.fire({semanticTokensApplied:!1,ranges:[{fromLineNumber:1,toLineNumber:this._textModel.getLineCount()}]});const v=()=>{if(this._textModel.isTooLargeForTokenization())return[null,null];const L=b.TokenizationRegistry.get(this.getLanguageId());if(!L)return[null,null];let D;try{D=L.getInitialState()}catch(T){return(0,d.onUnexpectedError)(T),[null,null]}return[L,D]},[w,S]=v();if(w&&S?this._tokenizer=new t.TokenizerWithStateStoreAndTextModel(this._textModel.getLineCount(),w,this._textModel,this._languageIdCodec):this._tokenizer=null,this._backgroundTokenizer.clear(),this._defaultBackgroundTokenizer=null,this._tokenizer){const L={setTokens:D=>{this.setTokens(D)},backgroundTokenizationFinished:()=>{if(this._backgroundTokenizationState===2)return;const D=2;this._backgroundTokenizationState=D,this._onDidChangeBackgroundTokenizationState.fire()},setEndState:(D,T)=>{if(!this._tokenizer)return;const M=this._tokenizer.store.getFirstInvalidEndStateLineNumber();M!==null&&D>=M&&this._tokenizer?.store.setEndState(D,T)}};w&&w.createBackgroundTokenizer&&!w.backgroundTokenizerShouldOnlyVerifyTokens&&(this._backgroundTokenizer.value=w.createBackgroundTokenizer(this._textModel,L)),!this._backgroundTokenizer.value&&!this._textModel.isTooLargeForTokenization()&&(this._backgroundTokenizer.value=this._defaultBackgroundTokenizer=new t.DefaultBackgroundTokenizer(this._tokenizer,L),this._defaultBackgroundTokenizer.handleChanges()),w?.backgroundTokenizerShouldOnlyVerifyTokens&&w.createBackgroundTokenizer?(this._debugBackgroundTokens=new l.ContiguousTokensStore(this._languageIdCodec),this._debugBackgroundStates=new t.TrackingTokenizationStateStore(this._textModel.getLineCount()),this._debugBackgroundTokenizer.clear(),this._debugBackgroundTokenizer.value=w.createBackgroundTokenizer(this._textModel,{setTokens:D=>{this._debugBackgroundTokens?.setMultilineTokens(D,this._textModel)},backgroundTokenizationFinished(){},setEndState:(D,T)=>{this._debugBackgroundStates?.setEndState(D,T)}})):(this._debugBackgroundTokens=void 0,this._debugBackgroundStates=void 0,this._debugBackgroundTokenizer.value=void 0)}this.refreshAllVisibleLineTokens()}handleDidChangeAttached(){this._defaultBackgroundTokenizer?.handleChanges()}handleDidChangeContent(h){if(h.isFlush)this.resetTokenization(!1);else if(!h.isEolChange){for(const v of h.changes){const[w,S]=(0,E.countEOL)(v.text);this._tokens.acceptEdit(v.range,w,S),this._debugBackgroundTokens?.acceptEdit(v.range,w,S)}this._debugBackgroundStates?.acceptChanges(h.changes),this._tokenizer&&this._tokenizer.store.acceptChanges(h.changes),this._defaultBackgroundTokenizer?.handleChanges()}}setTokens(h){const{changes:v}=this._tokens.setMultilineTokens(h,this._textModel);return v.length>0&&this._onDidChangeTokens.fire({semanticTokensApplied:!1,ranges:v}),{changes:v}}refreshAllVisibleLineTokens(){const h=y.LineRange.joinMany([...this._attachedViewStates].map(([v,w])=>w.lineRanges));this.refreshRanges(h)}refreshRanges(h){for(const v of h)this.refreshRange(v.startLineNumber,v.endLineNumberExclusive-1)}refreshRange(h,v){if(!this._tokenizer)return;h=Math.max(1,Math.min(this._textModel.getLineCount(),h)),v=Math.min(this._textModel.getLineCount(),v);const w=new c.ContiguousMultilineTokensBuilder,{heuristicTokens:S}=this._tokenizer.tokenizeHeuristically(w,h,v),L=this.setTokens(w.finalize());if(S)for(const D of L.changes)this._backgroundTokenizer.value?.requestTokens(D.fromLineNumber,D.toLineNumber+1);this._defaultBackgroundTokenizer?.checkFinished()}forceTokenization(h){const v=new c.ContiguousMultilineTokensBuilder;this._tokenizer?.updateTokensUntilLine(v,h),this.setTokens(v.finalize()),this._defaultBackgroundTokenizer?.checkFinished()}hasAccurateTokensForLine(h){return this._tokenizer?this._tokenizer.hasAccurateTokensForLine(h):!0}isCheapToTokenize(h){return this._tokenizer?this._tokenizer.isCheapToTokenize(h):!0}getLineTokens(h){const v=this._textModel.getLineContent(h),w=this._tokens.getTokens(this._textModel.getLanguageId(),h-1,v);if(this._debugBackgroundTokens&&this._debugBackgroundStates&&this._tokenizer&&this._debugBackgroundStates.getFirstInvalidEndStateLineNumberOrMax()>h&&this._tokenizer.store.getFirstInvalidEndStateLineNumberOrMax()>h){const S=this._debugBackgroundTokens.getTokens(this._textModel.getLanguageId(),h-1,v);!w.equals(S)&&this._debugBackgroundTokenizer.value?.reportMismatchingTokens&&this._debugBackgroundTokenizer.value.reportMismatchingTokens(h)}return w}getTokenTypeIfInsertingCharacter(h,v,w){if(!this._tokenizer)return 0;const S=this._textModel.validatePosition(new m.Position(h,v));return this.forceTokenization(S.lineNumber),this._tokenizer.getTokenTypeIfInsertingCharacter(S,w)}tokenizeLineWithEdit(h,v,w){if(!this._tokenizer)return null;const S=this._textModel.validatePosition(h);return this.forceTokenization(S.lineNumber),this._tokenizer.tokenizeLineWithEdit(S,v,w)}get hasTokens(){return this._tokens.hasTokens}}}),define(ne[708],se([1,0,42,48,22,70,382,30]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getIconClasses=b;const _=/(?:\/|^)(?:([^\/]+)\/)?([^\/]+)$/;function b(o,t,i,s,g){if(m.ThemeIcon.isThemeIcon(g))return[`codicon-${g.id}`,"predefined-file-icon"];if(I.URI.isUri(g))return[];const c=s===y.FileKind.ROOT_FOLDER?["rootfolder-icon"]:s===y.FileKind.FOLDER?["folder-icon"]:["file-icon"];if(i){let l;if(i.scheme===d.Schemas.data)l=k.DataUri.parseMetaData(i).get(k.DataUri.META_DATA_LABEL);else{const a=i.path.match(_);a?(l=n(a[2].toLowerCase()),a[1]&&c.push(`${n(a[1].toLowerCase())}-name-dir-icon`)):l=n(i.authority.toLowerCase())}if(s===y.FileKind.ROOT_FOLDER)c.push(`${l}-root-name-folder-icon`);else if(s===y.FileKind.FOLDER)c.push(`${l}-name-folder-icon`);else{if(l){if(c.push(`${l}-name-file-icon`),c.push("name-file-icon"),l.length<=255){const r=l.split(".");for(let u=1;u{h.mime===f.mime||h.userConfigured||(f.extension&&h.extension===f.extension&&console.warn(`Overwriting extension <<${f.extension}>> to now point to mime <<${f.mime}>>`),f.filename&&h.filename===f.filename&&console.warn(`Overwriting filename <<${f.filename}>> to now point to mime <<${f.mime}>>`),f.filepattern&&h.filepattern===f.filepattern&&console.warn(`Overwriting filepattern <<${f.filepattern}>> to now point to mime <<${f.mime}>>`),f.firstline&&h.firstline===f.firstline&&console.warn(`Overwriting firstline <<${f.firstline}>> to now point to mime <<${f.mime}>>`))})}function i(r,u){return{id:r.id,mime:r.mime,filename:r.filename,extension:r.extension,filepattern:r.filepattern,firstline:r.firstline,userConfigured:u,filenameLowercase:r.filename?r.filename.toLowerCase():void 0,extensionLowercase:r.extension?r.extension.toLowerCase():void 0,filepatternLowercase:r.filepattern?(0,d.parse)(r.filepattern.toLowerCase()):void 0,filepatternOnPath:r.filepattern?r.filepattern.indexOf(E.posix.sep)>=0:!1}}function s(){b=b.filter(r=>r.userConfigured),p=[]}function g(r,u){return c(r,u).map(C=>C.id)}function c(r,u){let C;if(r)switch(r.scheme){case I.Schemas.file:C=r.fsPath;break;case I.Schemas.data:{C=y.DataUri.parseMetaData(r).get(y.DataUri.META_DATA_LABEL);break}case I.Schemas.vscodeNotebookCell:C=void 0;break;default:C=r.path}if(!C)return[{id:"unknown",mime:k.Mimes.unknown}];C=C.toLowerCase();const f=(0,E.basename)(C),h=l(C,f,n);if(h)return[h,{id:_.PLAINTEXT_LANGUAGE_ID,mime:k.Mimes.text}];const v=l(C,f,p);if(v)return[v,{id:_.PLAINTEXT_LANGUAGE_ID,mime:k.Mimes.text}];if(u){const w=a(u);if(w)return[w,{id:_.PLAINTEXT_LANGUAGE_ID,mime:k.Mimes.text}]}return[{id:"unknown",mime:k.Mimes.unknown}]}function l(r,u,C){let f,h,v;for(let w=C.length-1;w>=0;w--){const S=C[w];if(u===S.filenameLowercase){f=S;break}if(S.filepattern&&(!h||S.filepattern.length>h.filepattern.length)){const L=S.filepatternOnPath?r:u;S.filepatternLowercase?.(L)&&(h=S)}S.extension&&(!v||S.extension.length>v.extension.length)&&u.endsWith(S.extensionLowercase)&&(v=S)}if(f)return f;if(h)return h;if(v)return v}function a(r){if((0,m.startsWithUTF8BOM)(r)&&(r=r.substr(1)),r.length>0)for(let u=b.length-1;u>=0;u--){const C=b[u];if(!C.firstline)continue;const f=r.match(C.firstline);if(f&&f.length>0)return C}}}),define(ne[710],se([1,0,6,2,11,709,70,109,38]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LanguagesRegistry=e.LanguageIdCodec=void 0;const b=Object.prototype.hasOwnProperty,p="vs.editor.nullLanguage";class n{constructor(){this._languageIdToLanguage=[],this._languageToLanguageId=new Map,this._register(p,0),this._register(y.PLAINTEXT_LANGUAGE_ID,1),this._nextLanguageId=2}_register(i,s){this._languageIdToLanguage[s]=i,this._languageToLanguageId.set(i,s)}register(i){if(this._languageToLanguageId.has(i))return;const s=this._nextLanguageId++;this._register(i,s)}encodeLanguageId(i){return this._languageToLanguageId.get(i)||0}decodeLanguageId(i){return this._languageIdToLanguage[i]||p}}e.LanguageIdCodec=n;class o extends k.Disposable{static{this.instanceCount=0}constructor(i=!0,s=!1){super(),this._onDidChange=this._register(new d.Emitter),this.onDidChange=this._onDidChange.event,o.instanceCount++,this._warnOnOverwrite=s,this.languageIdCodec=new n,this._dynamicLanguages=[],this._languages={},this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={},i&&(this._initializeFromRegistry(),this._register(y.ModesRegistry.onDidChangeLanguages(g=>{this._initializeFromRegistry()})))}dispose(){o.instanceCount--,super.dispose()}_initializeFromRegistry(){this._languages={},this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={},(0,E.clearPlatformLanguageAssociations)();const i=[].concat(y.ModesRegistry.getLanguages()).concat(this._dynamicLanguages);this._registerLanguages(i)}_registerLanguages(i){for(const s of i)this._registerLanguage(s);this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={},Object.keys(this._languages).forEach(s=>{const g=this._languages[s];g.name&&(this._nameMap[g.name]=g.identifier),g.aliases.forEach(c=>{this._lowercaseNameMap[c.toLowerCase()]=g.identifier}),g.mimetypes.forEach(c=>{this._mimeTypesMap[c]=g.identifier})}),_.Registry.as(m.Extensions.Configuration).registerOverrideIdentifiers(this.getRegisteredLanguageIds()),this._onDidChange.fire()}_registerLanguage(i){const s=i.id;let g;b.call(this._languages,s)?g=this._languages[s]:(this.languageIdCodec.register(s),g={identifier:s,name:null,mimetypes:[],aliases:[],extensions:[],filenames:[],configurationFiles:[],icons:[]},this._languages[s]=g),this._mergeLanguage(g,i)}_mergeLanguage(i,s){const g=s.id;let c=null;if(Array.isArray(s.mimetypes)&&s.mimetypes.length>0&&(i.mimetypes.push(...s.mimetypes),c=s.mimetypes[0]),c||(c=`text/x-${g}`,i.mimetypes.push(c)),Array.isArray(s.extensions)){s.configuration?i.extensions=s.extensions.concat(i.extensions):i.extensions=i.extensions.concat(s.extensions);for(const r of s.extensions)(0,E.registerPlatformLanguageAssociation)({id:g,mime:c,extension:r},this._warnOnOverwrite)}if(Array.isArray(s.filenames))for(const r of s.filenames)(0,E.registerPlatformLanguageAssociation)({id:g,mime:c,filename:r},this._warnOnOverwrite),i.filenames.push(r);if(Array.isArray(s.filenamePatterns))for(const r of s.filenamePatterns)(0,E.registerPlatformLanguageAssociation)({id:g,mime:c,filepattern:r},this._warnOnOverwrite);if(typeof s.firstLine=="string"&&s.firstLine.length>0){let r=s.firstLine;r.charAt(0)!=="^"&&(r="^"+r);try{const u=new RegExp(r);(0,I.regExpLeadsToEndlessLoop)(u)||(0,E.registerPlatformLanguageAssociation)({id:g,mime:c,firstline:u},this._warnOnOverwrite)}catch(u){console.warn(`[${s.id}]: Invalid regular expression \`${r}\`: `,u)}}i.aliases.push(g);let l=null;if(typeof s.aliases<"u"&&Array.isArray(s.aliases)&&(s.aliases.length===0?l=[null]:l=s.aliases),l!==null)for(const r of l)!r||r.length===0||i.aliases.push(r);const a=l!==null&&l.length>0;if(!(a&&l[0]===null)){const r=(a?l[0]:null)||g;(a||!i.name)&&(i.name=r)}s.configuration&&i.configurationFiles.push(s.configuration),s.icon&&i.icons.push(s.icon)}isRegisteredLanguageId(i){return i?b.call(this._languages,i):!1}getRegisteredLanguageIds(){return Object.keys(this._languages)}getLanguageIdByLanguageName(i){const s=i.toLowerCase();return b.call(this._lowercaseNameMap,s)?this._lowercaseNameMap[s]:null}getLanguageIdByMimeType(i){return i&&b.call(this._mimeTypesMap,i)?this._mimeTypesMap[i]:null}guessLanguageIdByFilepathOrFirstLine(i,s){return!i&&!s?[]:(0,E.getLanguageIds)(i,s)}}e.LanguagesRegistry=o}),define(ne[711],se([1,0,6,2,710,13,27,70,21]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LanguageService=void 0;class b extends k.Disposable{static{this.instanceCount=0}constructor(o=!1){super(),this._onDidRequestBasicLanguageFeatures=this._register(new d.Emitter),this.onDidRequestBasicLanguageFeatures=this._onDidRequestBasicLanguageFeatures.event,this._onDidRequestRichLanguageFeatures=this._register(new d.Emitter),this.onDidRequestRichLanguageFeatures=this._onDidRequestRichLanguageFeatures.event,this._onDidChange=this._register(new d.Emitter({leakWarningThreshold:200})),this.onDidChange=this._onDidChange.event,this._requestedBasicLanguages=new Set,this._requestedRichLanguages=new Set,b.instanceCount++,this._registry=this._register(new I.LanguagesRegistry(!0,o)),this.languageIdCodec=this._registry.languageIdCodec,this._register(this._registry.onDidChange(()=>this._onDidChange.fire()))}dispose(){b.instanceCount--,super.dispose()}isRegisteredLanguageId(o){return this._registry.isRegisteredLanguageId(o)}getLanguageIdByLanguageName(o){return this._registry.getLanguageIdByLanguageName(o)}getLanguageIdByMimeType(o){return this._registry.getLanguageIdByMimeType(o)}guessLanguageIdByFilepathOrFirstLine(o,t){const i=this._registry.guessLanguageIdByFilepathOrFirstLine(o,t);return(0,E.firstOrDefault)(i,null)}createById(o){return new p(this.onDidChange,()=>this._createAndGetLanguageIdentifier(o))}createByFilepathOrFirstLine(o,t){return new p(this.onDidChange,()=>{const i=this.guessLanguageIdByFilepathOrFirstLine(o,t);return this._createAndGetLanguageIdentifier(i)})}_createAndGetLanguageIdentifier(o){return(!o||!this.isRegisteredLanguageId(o))&&(o=m.PLAINTEXT_LANGUAGE_ID),o}requestBasicLanguageFeatures(o){this._requestedBasicLanguages.has(o)||(this._requestedBasicLanguages.add(o),this._onDidRequestBasicLanguageFeatures.fire(o))}requestRichLanguageFeatures(o){this._requestedRichLanguages.has(o)||(this._requestedRichLanguages.add(o),this.requestBasicLanguageFeatures(o),y.TokenizationRegistry.getOrCreate(o),this._onDidRequestRichLanguageFeatures.fire(o))}}e.LanguageService=b;class p{constructor(o,t){this._value=(0,_.observableFromEvent)(this,o,()=>t()),this.onDidChange=d.Event.fromObservable(this._value)}get languageId(){return this._value.get()}}}),define(ne[712],se([1,0,5,2,120,43,376,59,174,669,210]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";var n;Object.defineProperty(e,"__esModule",{value:!0}),e.MarginHoverWidget=void 0;const o=d.$;let t=class extends k.Disposable{static{n=this}static{this.ID="editor.contrib.modesGlyphHoverWidget"}constructor(s,g,c){super(),this._renderDisposeables=this._register(new k.DisposableStore),this._editor=s,this._isVisible=!1,this._messages=[],this._hover=this._register(new _.HoverWidget),this._hover.containerDomNode.classList.toggle("hidden",!this._isVisible),this._markdownRenderer=this._register(new I.MarkdownRenderer({editor:this._editor},g,c)),this._computer=new b.MarginHoverComputer(this._editor),this._hoverOperation=this._register(new y.HoverOperation(this._editor,this._computer)),this._register(this._hoverOperation.onResult(l=>{this._withResult(l.value)})),this._register(this._editor.onDidChangeModelDecorations(()=>this._onModelDecorationsChanged())),this._register(this._editor.onDidChangeConfiguration(l=>{l.hasChanged(50)&&this._updateFont()})),this._register(d.addStandardDisposableListener(this._hover.containerDomNode,"mouseleave",l=>{this._onMouseLeave(l)})),this._editor.addOverlayWidget(this)}dispose(){this._editor.removeOverlayWidget(this),super.dispose()}getId(){return n.ID}getDomNode(){return this._hover.containerDomNode}getPosition(){return null}_updateFont(){Array.prototype.slice.call(this._hover.contentsDomNode.getElementsByClassName("code")).forEach(g=>this._editor.applyFontInfo(g))}_onModelDecorationsChanged(){this._isVisible&&(this._hoverOperation.cancel(),this._hoverOperation.start(0))}showsOrWillShow(s){const g=s.target;return g.type===2&&g.detail.glyphMarginLane?(this._startShowingAt(g.position.lineNumber,g.detail.glyphMarginLane),!0):g.type===3?(this._startShowingAt(g.position.lineNumber,"lineNo"),!0):!1}_startShowingAt(s,g){this._computer.lineNumber===s&&this._computer.lane===g||(this._hoverOperation.cancel(),this.hide(),this._computer.lineNumber=s,this._computer.lane=g,this._hoverOperation.start(0))}hide(){this._computer.lineNumber=-1,this._hoverOperation.cancel(),this._isVisible&&(this._isVisible=!1,this._hover.containerDomNode.classList.toggle("hidden",!this._isVisible))}_withResult(s){this._messages=s,this._messages.length>0?this._renderMessages(this._computer.lineNumber,this._messages):this.hide()}_renderMessages(s,g){this._renderDisposeables.clear();const c=document.createDocumentFragment();for(const l of g){const a=o("div.hover-row.markdown-hover"),r=d.append(a,o("div.hover-contents")),u=this._renderDisposeables.add(this._markdownRenderer.render(l.value));r.appendChild(u.element),c.appendChild(a)}this._updateContents(c),this._showAt(s)}_updateContents(s){this._hover.contentsDomNode.textContent="",this._hover.contentsDomNode.appendChild(s),this._updateFont()}_showAt(s){this._isVisible||(this._isVisible=!0,this._hover.containerDomNode.classList.toggle("hidden",!this._isVisible));const g=this._editor.getLayoutInfo(),c=this._editor.getTopForLineNumber(s),l=this._editor.getScrollTop(),a=this._editor.getOption(67),r=this._hover.containerDomNode.clientHeight,u=c-l-(r-a)/2,C=g.glyphMarginLeft+g.glyphMarginWidth+(this._computer.lane==="lineNo"?g.lineNumbersWidth:0);this._hover.containerDomNode.style.left=`${C}px`,this._hover.containerDomNode.style.top=`${Math.max(Math.round(u),0)}px`}_onMouseLeave(s){const g=this._editor.getDomNode();(!g||!(0,p.isMousePositionWithinElement)(g,s.x,s.y))&&this.hide()}};e.MarginHoverWidget=t,e.MarginHoverWidget=t=n=ke([ce(1,E.ILanguageService),ce(2,m.IOpenerService)],t)}),define(ne[713],se([1,0,2,7,14,210,712,196]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarginHoverController=void 0;const m=!1;let _=class extends d.Disposable{static{this.ID="editor.contrib.marginHover"}constructor(p,n){super(),this._editor=p,this._instantiationService=n,this.shouldKeepOpenOnEditorMouseMoveOrLeave=!1,this._listenersStore=new d.DisposableStore,this._hoverState={mouseDown:!1},this._reactToEditorMouseMoveRunner=this._register(new I.RunOnceScheduler(()=>this._reactToEditorMouseMove(this._mouseMoveEvent),0)),this._hookListeners(),this._register(this._editor.onDidChangeConfiguration(o=>{o.hasChanged(60)&&(this._unhookListeners(),this._hookListeners())}))}_hookListeners(){const p=this._editor.getOption(60);this._hoverSettings={enabled:p.enabled,sticky:p.sticky,hidingDelay:p.hidingDelay},p.enabled?(this._listenersStore.add(this._editor.onMouseDown(n=>this._onEditorMouseDown(n))),this._listenersStore.add(this._editor.onMouseUp(()=>this._onEditorMouseUp())),this._listenersStore.add(this._editor.onMouseMove(n=>this._onEditorMouseMove(n))),this._listenersStore.add(this._editor.onKeyDown(n=>this._onKeyDown(n)))):(this._listenersStore.add(this._editor.onMouseMove(n=>this._onEditorMouseMove(n))),this._listenersStore.add(this._editor.onKeyDown(n=>this._onKeyDown(n)))),this._listenersStore.add(this._editor.onMouseLeave(n=>this._onEditorMouseLeave(n))),this._listenersStore.add(this._editor.onDidChangeModel(()=>{this._cancelScheduler(),this._hideWidgets()})),this._listenersStore.add(this._editor.onDidChangeModelContent(()=>this._cancelScheduler())),this._listenersStore.add(this._editor.onDidScrollChange(n=>this._onEditorScrollChanged(n)))}_unhookListeners(){this._listenersStore.clear()}_cancelScheduler(){this._mouseMoveEvent=void 0,this._reactToEditorMouseMoveRunner.cancel()}_onEditorScrollChanged(p){(p.scrollTopChanged||p.scrollLeftChanged)&&this._hideWidgets()}_onEditorMouseDown(p){this._hoverState.mouseDown=!0,!this._isMouseOnMarginHoverWidget(p)&&this._hideWidgets()}_isMouseOnMarginHoverWidget(p){const n=this._glyphWidget?.getDomNode();return n?(0,E.isMousePositionWithinElement)(n,p.event.posx,p.event.posy):!1}_onEditorMouseUp(){this._hoverState.mouseDown=!1}_onEditorMouseLeave(p){this.shouldKeepOpenOnEditorMouseMoveOrLeave||(this._cancelScheduler(),this._isMouseOnMarginHoverWidget(p))||m||this._hideWidgets()}_shouldNotRecomputeCurrentHoverWidget(p){const n=this._hoverSettings.sticky,o=this._isMouseOnMarginHoverWidget(p);return n&&o}_onEditorMouseMove(p){if(this.shouldKeepOpenOnEditorMouseMoveOrLeave)return;if(this._mouseMoveEvent=p,this._shouldNotRecomputeCurrentHoverWidget(p)){this._reactToEditorMouseMoveRunner.cancel();return}this._reactToEditorMouseMove(p)}_reactToEditorMouseMove(p){!p||this._tryShowHoverWidget(p)||m||this._hideWidgets()}_tryShowHoverWidget(p){return this._getOrCreateGlyphWidget().showsOrWillShow(p)}_onKeyDown(p){this._editor.hasModel()&&(p.keyCode===5||p.keyCode===6||p.keyCode===57||p.keyCode===4||this._hideWidgets())}_hideWidgets(){m||this._glyphWidget?.hide()}_getOrCreateGlyphWidget(){return this._glyphWidget||(this._glyphWidget=this._instantiationService.createInstance(y.MarginHoverWidget,this._editor)),this._glyphWidget}dispose(){super.dispose(),this._unhookListeners(),this._listenersStore.dispose(),this._glyphWidget?.dispose()}};e.MarginHoverController=_,e.MarginHoverController=_=ke([ce(1,k.IInstantiationService)],_)}),define(ne[714],se([1,0,11,183,75,230,23,240]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getReindentEditOperations=_;function _(p,n,o,t){if(p.getLineCount()===1&&p.getLineMaxColumn(1)===1)return[];const i=n.getLanguageConfiguration(p.getLanguageId()).indentRulesSupport;if(!i)return[];const s=new m.ProcessedIndentRulesSupport(p,i,n);for(t=Math.min(t,p.getLineCount());o<=t&&s.shouldIgnore(o);)o++;if(o>t-1)return[];const{tabSize:g,indentSize:c,insertSpaces:l}=p.getOptions(),a=(v,w)=>(w=w||1,k.ShiftCommand.shiftIndent(v,v.length+w,g,c,l)),r=(v,w)=>(w=w||1,k.ShiftCommand.unshiftIndent(v,v.length+w,g,c,l)),u=[],C=p.getLineContent(o);let f=d.getLeadingWhitespace(C),h=f;s.shouldIncrease(o)?(h=a(h),f=a(f)):s.shouldIndentNextLine(o)&&(h=a(h)),o++;for(let v=o;v<=t;v++){if(b(p,v))continue;const w=p.getLineContent(v),S=d.getLeadingWhitespace(w),L=h;s.shouldDecrease(v,L)&&(h=r(h),f=r(f)),S!==h&&u.push(I.EditOperation.replaceMove(new y.Selection(v,1,v,S.length+1),(0,E.normalizeIndentation)(h,c,l))),!s.shouldIgnore(v)&&(s.shouldIncrease(v,L)?(f=a(f),h=f):s.shouldIndentNextLine(v,L)?h=a(h):h=f)}return u}function b(p,n){return p.tokenization.isCheapToTokenize(n)?p.tokenization.getLineTokens(n).getStandardTokenType(0)===2:!1}}),define(ne[715],se([1,0,18,102,82,2,21,4,104,113,27,36,17,378,246]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlineCompletionWithUpdatedRange=e.UpToDateInlineCompletions=e.InlineCompletionsSource=void 0;let s=class extends E.Disposable{constructor(f,h,v,w,S){super(),this.textModel=f,this.versionId=h,this._debounceValue=v,this.languageFeaturesService=w,this.languageConfigurationService=S,this._updateOperation=this._register(new E.MutableDisposable),this.inlineCompletions=(0,y.disposableObservableValue)("inlineCompletions",void 0),this.suggestWidgetInlineCompletions=(0,y.disposableObservableValue)("suggestWidgetInlineCompletions",void 0),this._register(this.textModel.onDidChangeContent(()=>{this._updateOperation.clear()}))}fetch(f,h,v){const w=new c(f,h,this.textModel.getVersionId()),S=h.selectedSuggestionInfo?this.suggestWidgetInlineCompletions:this.inlineCompletions;if(this._updateOperation.value?.request.satisfies(w))return this._updateOperation.value.promise;if(S.get()?.request.satisfies(w))return Promise.resolve(!0);const L=!!this._updateOperation.value;this._updateOperation.clear();const D=new d.CancellationTokenSource,T=(async()=>{if((L||h.triggerKind===p.InlineCompletionTriggerKind.Automatic)&&await g(this._debounceValue.get(this.textModel),D.token),D.token.isCancellationRequested||this._store.isDisposed||this.textModel.getVersionId()!==w.versionId)return!1;const P=new Date,N=await(0,t.provideInlineCompletions)(this.languageFeaturesService.inlineCompletionsProvider,f,this.textModel,h,D.token,this.languageConfigurationService);if(D.token.isCancellationRequested||this._store.isDisposed||this.textModel.getVersionId()!==w.versionId)return!1;const O=new Date;this._debounceValue.update(this.textModel,O.getTime()-P.getTime());const F=new a(N,w,this.textModel,this.versionId);if(v){const x=v.toInlineCompletion(void 0);v.canBeReused(this.textModel,f)&&!N.has(x)&&F.prepend(v.inlineCompletion,x.range,!0)}return this._updateOperation.clear(),(0,y.transaction)(x=>{S.set(F,x)}),!0})(),M=new l(w,D,T);return this._updateOperation.value=M,T}clear(f){this._updateOperation.clear(),this.inlineCompletions.set(void 0,f),this.suggestWidgetInlineCompletions.set(void 0,f)}clearSuggestWidgetInlineCompletions(f){this._updateOperation.value?.request.context.selectedSuggestionInfo&&this._updateOperation.clear(),this.suggestWidgetInlineCompletions.set(void 0,f)}cancelUpdate(){this._updateOperation.clear()}};e.InlineCompletionsSource=s,e.InlineCompletionsSource=s=ke([ce(3,o.ILanguageFeaturesService),ce(4,n.ILanguageConfigurationService)],s);function g(C,f){return new Promise(h=>{let v;const w=setTimeout(()=>{v&&v.dispose(),h()},C);f&&(v=f.onCancellationRequested(()=>{clearTimeout(w),v&&v.dispose(),h()}))})}class c{constructor(f,h,v){this.position=f,this.context=h,this.versionId=v}satisfies(f){return this.position.equals(f.position)&&(0,k.equalsIfDefined)(this.context.selectedSuggestionInfo,f.context.selectedSuggestionInfo,(0,k.itemEquals)())&&(f.context.triggerKind===p.InlineCompletionTriggerKind.Automatic||this.context.triggerKind===p.InlineCompletionTriggerKind.Explicit)&&this.versionId===f.versionId}}class l{constructor(f,h,v){this.request=f,this.cancellationTokenSource=h,this.promise=v}dispose(){this.cancellationTokenSource.cancel()}}class a{get inlineCompletions(){return this._inlineCompletions}constructor(f,h,v,w){this.inlineCompletionProviderResult=f,this.request=h,this._textModel=v,this._versionId=w,this._refCount=1,this._prependedInlineCompletionItems=[];const S=v.deltaDecorations([],f.completions.map(L=>({range:L.range,options:{description:"inline-completion-tracking-range"}})));this._inlineCompletions=f.completions.map((L,D)=>new r(L,S[D],this._textModel,this._versionId))}clone(){return this._refCount++,this}dispose(){if(this._refCount--,this._refCount===0){setTimeout(()=>{this._textModel.isDisposed()||this._textModel.deltaDecorations(this._inlineCompletions.map(f=>f.decorationId),[])},0),this.inlineCompletionProviderResult.dispose();for(const f of this._prependedInlineCompletionItems)f.source.removeRef()}}prepend(f,h,v){v&&f.source.addRef();const w=this._textModel.deltaDecorations([],[{range:h,options:{description:"inline-completion-tracking-range"}}])[0];this._inlineCompletions.unshift(new r(f,w,this._textModel,this._versionId)),this._prependedInlineCompletionItems.push(f)}}e.UpToDateInlineCompletions=a;class r{get forwardStable(){return this.inlineCompletion.source.inlineCompletions.enableForwardStability??!1}constructor(f,h,v,w){this.inlineCompletion=f,this.decorationId=h,this._textModel=v,this._modelVersion=w,this.semanticId=JSON.stringify([this.inlineCompletion.filterText,this.inlineCompletion.insertText,this.inlineCompletion.range.getStartPosition().toString()]),this._updatedRange=(0,y.derivedOpts)({owner:this,equalsFn:m.Range.equalsRange},S=>(this._modelVersion.read(S),this._textModel.getDecorationRange(this.decorationId)))}toInlineCompletion(f){return this.inlineCompletion.withRange(this._updatedRange.read(f)??u)}toSingleTextEdit(f){return new _.SingleTextEdit(this._updatedRange.read(f)??u,this.inlineCompletion.insertText)}isVisible(f,h,v){const w=(0,i.singleTextRemoveCommonPrefix)(this._toFilterTextReplacement(v),f),S=this._updatedRange.read(v);if(!S||!this.inlineCompletion.range.getStartPosition().equals(S.getStartPosition())||h.lineNumber!==w.range.startLineNumber)return!1;const L=f.getValueInRange(w.range,1),D=w.text,T=Math.max(0,h.column-w.range.startColumn);let M=D.substring(0,T),A=D.substring(T),P=L.substring(0,T),N=L.substring(T);const O=f.getLineIndentColumn(w.range.startLineNumber);return w.range.startColumn<=O&&(P=P.trimStart(),P.length===0&&(N=N.trimStart()),M=M.trimStart(),M.length===0&&(A=A.trimStart())),M.startsWith(P)&&!!(0,I.matchesSubString)(N,A)}canBeReused(f,h){const v=this._updatedRange.read(void 0);return!!v&&v.containsPosition(h)&&this.isVisible(f,h,void 0)&&b.TextLength.ofRange(v).isGreaterThanOrEqualTo(b.TextLength.ofRange(this.inlineCompletion.range))}_toFilterTextReplacement(f){return new _.SingleTextEdit(this._updatedRange.read(f)??u,this.inlineCompletion.filterText)}}e.InlineCompletionWithUpdatedRange=r;const u=new m.Range(1,1,1,1)}),define(ne[716],se([1,0,11,183,4,23,131,36,338,241,275]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MoveLinesCommand=void 0;let n=class{constructor(t,i,s,g){this._languageConfigurationService=g,this._selection=t,this._isMovingDown=i,this._autoIndent=s,this._selectionId=null,this._moveEndLineSelectionShrink=!1}getEditOperations(t,i){const s=()=>t.getLanguageId(),g=(f,h)=>t.getLanguageIdAtPosition(f,h),c=t.getLineCount();if(this._isMovingDown&&this._selection.endLineNumber===c){this._selectionId=i.trackSelection(this._selection);return}if(!this._isMovingDown&&this._selection.startLineNumber===1){this._selectionId=i.trackSelection(this._selection);return}this._moveEndPositionDown=!1;let l=this._selection;l.startLineNumberT===l.startLineNumber?t.tokenization.getLineTokens(f):t.tokenization.getLineTokens(T),getLanguageId:s,getLanguageIdAtPosition:g},getLineContent:T=>T===l.startLineNumber?t.getLineContent(f):t.getLineContent(T)},D=(0,b.getGoodIndentForLine)(this._autoIndent,L,t.getLanguageIdAtPosition(f,1),l.startLineNumber,C,this._languageConfigurationService);if(D!==null){const T=d.getLeadingWhitespace(t.getLineContent(f)),M=_.getSpaceCnt(D,a),A=_.getSpaceCnt(T,a);M!==A&&(v=_.generateIndent(M,a,u)+this.trimStart(h))}}i.addEditOperation(new I.Range(l.startLineNumber,1,l.startLineNumber,1),v+` -`);const S=this.matchEnterRuleMovingDown(t,C,a,l.startLineNumber,f,v);if(S!==null)S!==0&&this.getIndentEditsOfMovingBlock(t,i,l,a,u,S);else{const L={tokenization:{getLineTokens:T=>T===l.startLineNumber?t.tokenization.getLineTokens(f):T>=l.startLineNumber+1&&T<=l.endLineNumber+1?t.tokenization.getLineTokens(T-1):t.tokenization.getLineTokens(T),getLanguageId:s,getLanguageIdAtPosition:g},getLineContent:T=>T===l.startLineNumber?v:T>=l.startLineNumber+1&&T<=l.endLineNumber+1?t.getLineContent(T-1):t.getLineContent(T)},D=(0,b.getGoodIndentForLine)(this._autoIndent,L,t.getLanguageIdAtPosition(f,1),l.startLineNumber+1,C,this._languageConfigurationService);if(D!==null){const T=d.getLeadingWhitespace(t.getLineContent(l.startLineNumber)),M=_.getSpaceCnt(D,a),A=_.getSpaceCnt(T,a);if(M!==A){const P=M-A;this.getIndentEditsOfMovingBlock(t,i,l,a,u,P)}}}}else i.addEditOperation(new I.Range(l.startLineNumber,1,l.startLineNumber,1),v+` -`)}else if(f=l.startLineNumber-1,h=t.getLineContent(f),i.addEditOperation(new I.Range(f,1,f+1,1),null),i.addEditOperation(new I.Range(l.endLineNumber,t.getLineMaxColumn(l.endLineNumber),l.endLineNumber,t.getLineMaxColumn(l.endLineNumber)),` -`+h),this.shouldAutoIndent(t,l)){const v={tokenization:{getLineTokens:S=>S===f?t.tokenization.getLineTokens(l.startLineNumber):t.tokenization.getLineTokens(S),getLanguageId:s,getLanguageIdAtPosition:g},getLineContent:S=>S===f?t.getLineContent(l.startLineNumber):t.getLineContent(S)},w=this.matchEnterRule(t,C,a,l.startLineNumber,l.startLineNumber-2);if(w!==null)w!==0&&this.getIndentEditsOfMovingBlock(t,i,l,a,u,w);else{const S=(0,b.getGoodIndentForLine)(this._autoIndent,v,t.getLanguageIdAtPosition(l.startLineNumber,1),f,C,this._languageConfigurationService);if(S!==null){const L=d.getLeadingWhitespace(t.getLineContent(l.startLineNumber)),D=_.getSpaceCnt(S,a),T=_.getSpaceCnt(L,a);if(D!==T){const M=D-T;this.getIndentEditsOfMovingBlock(t,i,l,a,u,M)}}}}}this._selectionId=i.trackSelection(l)}buildIndentConverter(t,i,s){return{shiftIndent:g=>k.ShiftCommand.shiftIndent(g,g.length+1,t,i,s),unshiftIndent:g=>k.ShiftCommand.unshiftIndent(g,g.length+1,t,i,s)}}parseEnterResult(t,i,s,g,c){if(c){let l=c.indentation;c.indentAction===y.IndentAction.None||c.indentAction===y.IndentAction.Indent?l=c.indentation+c.appendText:c.indentAction===y.IndentAction.IndentOutdent?l=c.indentation:c.indentAction===y.IndentAction.Outdent&&(l=i.unshiftIndent(c.indentation)+c.appendText);const a=t.getLineContent(g);if(this.trimStart(a).indexOf(this.trimStart(l))>=0){const r=d.getLeadingWhitespace(t.getLineContent(g));let u=d.getLeadingWhitespace(l);const C=(0,b.getIndentMetadata)(t,g,this._languageConfigurationService);C!==null&&C&2&&(u=i.unshiftIndent(u));const f=_.getSpaceCnt(u,s),h=_.getSpaceCnt(r,s);return f-h}}return null}matchEnterRuleMovingDown(t,i,s,g,c,l){if(d.lastNonWhitespaceIndex(l)>=0){const a=t.getLineMaxColumn(c),r=(0,p.getEnterAction)(this._autoIndent,t,new I.Range(c,a,c,a),this._languageConfigurationService);return this.parseEnterResult(t,i,s,g,r)}else{let a=g-1;for(;a>=1;){const C=t.getLineContent(a);if(d.lastNonWhitespaceIndex(C)>=0)break;a--}if(a<1||g>t.getLineCount())return null;const r=t.getLineMaxColumn(a),u=(0,p.getEnterAction)(this._autoIndent,t,new I.Range(a,r,a,r),this._languageConfigurationService);return this.parseEnterResult(t,i,s,g,u)}}matchEnterRule(t,i,s,g,c,l){let a=c;for(;a>=1;){let C;if(a===c&&l!==void 0?C=l:C=t.getLineContent(a),d.lastNonWhitespaceIndex(C)>=0)break;a--}if(a<1||g>t.getLineCount())return null;const r=t.getLineMaxColumn(a),u=(0,p.getEnterAction)(this._autoIndent,t,new I.Range(a,r,a,r),this._languageConfigurationService);return this.parseEnterResult(t,i,s,g,u)}trimStart(t){return t.replace(/^\s+/,"")}shouldAutoIndent(t,i){if(this._autoIndent<4||!t.tokenization.isCheapToTokenize(i.startLineNumber))return!1;const s=t.getLanguageIdAtPosition(i.startLineNumber,1),g=t.getLanguageIdAtPosition(i.endLineNumber,1);return!(s!==g||this._languageConfigurationService.getLanguageConfiguration(s).indentRulesSupport===null)}getIndentEditsOfMovingBlock(t,i,s,g,c,l){for(let a=s.startLineNumber;a<=s.endLineNumber;a++){const r=t.getLineContent(a),u=d.getLeadingWhitespace(r),f=_.getSpaceCnt(u,g)+l,h=_.generateIndent(f,g,c);h!==u&&(i.addEditOperation(new I.Range(a,1,a,u.length+1),h),a===s.endLineNumber&&s.endColumn<=u.length+1&&h===""&&(this._moveEndLineSelectionShrink=!0))}}computeCursorState(t,i){let s=i.getTrackedSelection(this._selectionId);return this._moveEndPositionDown&&(s=s.setEndPosition(s.endLineNumber+1,1)),this._moveEndLineSelectionShrink&&s.startLineNumber{a.hasChanged(50)&&this._configureFont()}))}dispose(){this._disposables.dispose(),this._renderDisposeable.dispose()}_configureFont(){const c=this._editor.getOptions(),l=c.get(50),a=l.getMassagedFontFamily(),r=c.get(120)||l.fontSize,u=c.get(121)||l.lineHeight,C=l.fontWeight,f=`${r}px`,h=`${u}px`;this.domNode.style.fontSize=f,this.domNode.style.lineHeight=`${u/r}`,this.domNode.style.fontWeight=C,this.domNode.style.fontFeatureSettings=l.fontFeatureSettings,this._type.style.fontFamily=a,this._close.style.height=h,this._close.style.width=h}getLayoutInfo(){const c=this._editor.getOption(121)||this._editor.getOption(50).lineHeight,l=this._borderWidth,a=l*2;return{lineHeight:c,borderWidth:l,borderHeight:a,verticalPadding:22,horizontalPadding:14}}renderLoading(){this._type.textContent=n.localize(1345,"Loading..."),this._docs.textContent="",this.domNode.classList.remove("no-docs","no-type"),this.layout(this.size.width,this.getLayoutInfo().lineHeight*2),this._onDidChangeContents.fire(this)}renderItem(c,l){this._renderDisposeable.clear();let{detail:a,documentation:r}=c.completion;if(l){let u="";u+=`score: ${c.score[0]} -`,u+=`prefix: ${c.word??"(no prefix)"} -`,u+=`word: ${c.completion.filterText?c.completion.filterText+" (filterText)":c.textLabel} -`,u+=`distance: ${c.distance} (localityBonus-setting) -`,u+=`index: ${c.idx}, based on ${c.completion.sortText&&`sortText: "${c.completion.sortText}"`||"label"} -`,u+=`commit_chars: ${c.completion.commitCharacters?.join("")} -`,r=new m.MarkdownString().appendCodeblock("empty",u),a=`Provider: ${c.provider._debugDisplayName}`}if(!l&&!t(c)){this.clearContents();return}if(this.domNode.classList.remove("no-docs","no-type"),a){const u=a.length>1e5?`${a.substr(0,1e5)}\u2026`:a;this._type.textContent=u,this._type.title=u,d.show(this._type),this._type.classList.toggle("auto-wrap",!/\r?\n^\s+/gmi.test(u))}else d.clearNode(this._type),this._type.title="",d.hide(this._type),this.domNode.classList.add("no-type");if(d.clearNode(this._docs),typeof r=="string")this._docs.classList.remove("markdown-docs"),this._docs.textContent=r;else if(r){this._docs.classList.add("markdown-docs"),d.clearNode(this._docs);const u=this._markdownRenderer.render(r);this._docs.appendChild(u.element),this._renderDisposeable.add(u),this._renderDisposeable.add(this._markdownRenderer.onDidRenderAsync(()=>{this.layout(this._size.width,this._type.clientHeight+this._docs.clientHeight),this._onDidChangeContents.fire(this)}))}this.domNode.style.userSelect="text",this.domNode.tabIndex=-1,this._close.onmousedown=u=>{u.preventDefault(),u.stopPropagation()},this._close.onclick=u=>{u.preventDefault(),u.stopPropagation(),this._onDidClose.fire()},this._body.scrollTop=0,this.layout(this._size.width,this._type.clientHeight+this._docs.clientHeight),this._onDidChangeContents.fire(this)}clearContents(){this.domNode.classList.add("no-docs"),this._type.textContent="",this._docs.textContent=""}get isEmpty(){return this.domNode.classList.contains("no-docs")}get size(){return this._size}layout(c,l){const a=new d.Dimension(c,l);d.Dimension.equals(a,this._size)||(this._size=a,d.size(this.domNode,c,l)),this._scrollbar.scanDomNode()}scrollDown(c=8){this._body.scrollTop+=c}scrollUp(c=8){this._body.scrollTop-=c}scrollTop(){this._body.scrollTop=0}scrollBottom(){this._body.scrollTop=this._body.scrollHeight}pageDown(){this.scrollDown(80)}pageUp(){this.scrollUp(80)}set borderWidth(c){this._borderWidth=c}get borderWidth(){return this._borderWidth}};e.SuggestDetailsWidget=i,e.SuggestDetailsWidget=i=ke([ce(1,o.IInstantiationService)],i);class s{constructor(c,l){this.widget=c,this._editor=l,this.allowEditorOverflow=!0,this._disposables=new _.DisposableStore,this._added=!1,this._preferAlignAtTop=!0,this._resizable=new p.ResizableHTMLElement,this._resizable.domNode.classList.add("suggest-details-container"),this._resizable.domNode.appendChild(c.domNode),this._resizable.enableSashes(!1,!0,!0,!1);let a,r,u=0,C=0;this._disposables.add(this._resizable.onDidWillResize(()=>{a=this._topLeft,r=this._resizable.size})),this._disposables.add(this._resizable.onDidResize(f=>{if(a&&r){this.widget.layout(f.dimension.width,f.dimension.height);let h=!1;f.west&&(C=r.width-f.dimension.width,h=!0),f.north&&(u=r.height-f.dimension.height,h=!0),h&&this._applyTopLeft({top:a.top+u,left:a.left+C})}f.done&&(a=void 0,r=void 0,u=0,C=0,this._userSize=f.dimension)})),this._disposables.add(this.widget.onDidChangeContents(()=>{this._anchorBox&&this._placeAtAnchor(this._anchorBox,this._userSize??this.widget.size,this._preferAlignAtTop)}))}dispose(){this._resizable.dispose(),this._disposables.dispose(),this.hide()}getId(){return"suggest.details"}getDomNode(){return this._resizable.domNode}getPosition(){return this._topLeft?{preference:this._topLeft}:null}show(){this._added||(this._editor.addOverlayWidget(this),this._added=!0)}hide(c=!1){this._resizable.clearSashHoverState(),this._added&&(this._editor.removeOverlayWidget(this),this._added=!1,this._anchorBox=void 0,this._topLeft=void 0),c&&(this._userSize=void 0,this.widget.clearContents())}placeAtAnchor(c,l){const a=c.getBoundingClientRect();this._anchorBox=a,this._preferAlignAtTop=l,this._placeAtAnchor(this._anchorBox,this._userSize??this.widget.size,l)}_placeAtAnchor(c,l,a){const r=d.getClientArea(this.getDomNode().ownerDocument.body),u=this.widget.getLayoutInfo(),C=new d.Dimension(220,2*u.lineHeight),f=c.top,h=function(){const x=r.width-(c.left+c.width+u.borderWidth+u.horizontalPadding),W=-u.borderWidth+c.left+c.width,V=new d.Dimension(x,r.height-c.top-u.borderHeight-u.verticalPadding),q=V.with(void 0,c.top+c.height-u.borderHeight-u.verticalPadding);return{top:f,left:W,fit:x-l.width,maxSizeTop:V,maxSizeBottom:q,minSize:C.with(Math.min(x,C.width))}}(),v=function(){const x=c.left-u.borderWidth-u.horizontalPadding,W=Math.max(u.horizontalPadding,c.left-l.width-u.borderWidth),V=new d.Dimension(x,r.height-c.top-u.borderHeight-u.verticalPadding),q=V.with(void 0,c.top+c.height-u.borderHeight-u.verticalPadding);return{top:f,left:W,fit:x-l.width,maxSizeTop:V,maxSizeBottom:q,minSize:C.with(Math.min(x,C.width))}}(),w=function(){const x=c.left,W=-u.borderWidth+c.top+c.height,V=new d.Dimension(c.width-u.borderHeight,r.height-c.top-c.height-u.verticalPadding);return{top:W,left:x,fit:V.height-l.height,maxSizeBottom:V,maxSizeTop:V,minSize:C.with(V.width)}}(),S=[h,v,w],L=S.find(x=>x.fit>=0)??S.sort((x,W)=>W.fit-x.fit)[0],D=c.top+c.height-u.borderHeight;let T,M=l.height;const A=Math.max(L.maxSizeTop.height,L.maxSizeBottom.height);M>A&&(M=A);let P;a?M<=L.maxSizeTop.height?(T=!0,P=L.maxSizeTop):(T=!1,P=L.maxSizeBottom):M<=L.maxSizeBottom.height?(T=!1,P=L.maxSizeBottom):(T=!0,P=L.maxSizeTop);let{top:N,left:O}=L;!T&&M>c.height&&(N=D-M);const F=this._editor.getDomNode();if(F){const x=F.getBoundingClientRect();N-=x.top,O-=x.left}this._applyTopLeft({left:O,top:N}),this._resizable.enableSashes(!T,L===h,T,L!==h),this._resizable.minSize=L.minSize,this._resizable.maxSize=P,this._resizable.layout(M,Math.min(P.width,l.width)),this.widget.layout(this._resizable.size.width,this._resizable.size.height)}_applyTopLeft(c){this._topLeft=c,this._editor.layoutOverlayWidget(this)}}e.SuggestDetailsOverlay=s}),define(ne[403],se([1,0,13,45,60,19,22,28,109,38]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ConfigurationChangeEvent=e.Configuration=e.ConfigurationModelParser=e.ConfigurationModel=void 0;function p(g){return Object.isFrozen(g)?g:I.deepFreeze(g)}class n{static createEmptyModel(c){return new n({},[],[],void 0,c)}constructor(c,l,a,r,u){this._contents=c,this._keys=l,this._overrides=a,this.raw=r,this.logService=u,this.overrideConfigurations=new Map}get rawConfiguration(){if(!this._rawConfiguration)if(this.raw?.length){const c=this.raw.map(l=>{if(l instanceof n)return l;const a=new o("",this.logService);return a.parseRaw(l),a.configurationModel});this._rawConfiguration=c.reduce((l,a)=>a===l?a:l.merge(a),c[0])}else this._rawConfiguration=this;return this._rawConfiguration}get contents(){return this._contents}get overrides(){return this._overrides}get keys(){return this._keys}isEmpty(){return this._keys.length===0&&Object.keys(this._contents).length===0&&this._overrides.length===0}getValue(c){return c?(0,m.getConfigurationValue)(this.contents,c):this.contents}inspect(c,l){const a=this;return{get value(){return p(a.rawConfiguration.getValue(c))},get override(){return l?p(a.rawConfiguration.getOverrideValue(c,l)):void 0},get merged(){return p(l?a.rawConfiguration.override(l).getValue(c):a.rawConfiguration.getValue(c))},get overrides(){const r=[];for(const{contents:u,identifiers:C,keys:f}of a.rawConfiguration.overrides){const h=new n(u,f,[],void 0,a.logService).getValue(c);h!==void 0&&r.push({identifiers:C,value:h})}return r.length?p(r):void 0}}}getOverrideValue(c,l){const a=this.getContentsForOverrideIdentifer(l);return a?c?(0,m.getConfigurationValue)(a,c):a:void 0}override(c){let l=this.overrideConfigurations.get(c);return l||(l=this.createOverrideConfigurationModel(c),this.overrideConfigurations.set(c,l)),l}merge(...c){const l=I.deepClone(this.contents),a=I.deepClone(this.overrides),r=[...this.keys],u=this.raw?.length?[...this.raw]:[this];for(const C of c)if(u.push(...C.raw?.length?C.raw:[C]),!C.isEmpty()){this.mergeContents(l,C.contents);for(const f of C.overrides){const[h]=a.filter(v=>d.equals(v.identifiers,f.identifiers));h?(this.mergeContents(h.contents,f.contents),h.keys.push(...f.keys),h.keys=d.distinct(h.keys)):a.push(I.deepClone(f))}for(const f of C.keys)r.indexOf(f)===-1&&r.push(f)}return new n(l,r,a,u.every(C=>C instanceof n)?void 0:u,this.logService)}createOverrideConfigurationModel(c){const l=this.getContentsForOverrideIdentifer(c);if(!l||typeof l!="object"||!Object.keys(l).length)return this;const a={};for(const r of d.distinct([...Object.keys(this.contents),...Object.keys(l)])){let u=this.contents[r];const C=l[r];C&&(typeof u=="object"&&typeof C=="object"?(u=I.deepClone(u),this.mergeContents(u,C)):u=C),a[r]=u}return new n(a,this.keys,this.overrides,void 0,this.logService)}mergeContents(c,l){for(const a of Object.keys(l)){if(a in c&&E.isObject(c[a])&&E.isObject(l[a])){this.mergeContents(c[a],l[a]);continue}c[a]=I.deepClone(l[a])}}getContentsForOverrideIdentifer(c){let l=null,a=null;const r=u=>{u&&(a?this.mergeContents(a,u):a=I.deepClone(u))};for(const u of this.overrides)u.identifiers.length===1&&u.identifiers[0]===c?l=u.contents:u.identifiers.includes(c)&&r(u.contents);return r(l),a}toJSON(){return{contents:this.contents,overrides:this.overrides,keys:this.keys}}setValue(c,l){this.updateValue(c,l,!1)}removeValue(c){const l=this.keys.indexOf(c);l!==-1&&(this.keys.splice(l,1),(0,m.removeFromValueTree)(this.contents,c),_.OVERRIDE_PROPERTY_REGEX.test(c)&&this.overrides.splice(this.overrides.findIndex(a=>d.equals(a.identifiers,(0,_.overrideIdentifiersFromKey)(c))),1))}updateValue(c,l,a){if((0,m.addToValueTree)(this.contents,c,l,r=>this.logService.error(r)),a=a||this.keys.indexOf(c)===-1,a&&this.keys.push(c),_.OVERRIDE_PROPERTY_REGEX.test(c)){const r=(0,_.overrideIdentifiersFromKey)(c),u={identifiers:r,keys:Object.keys(this.contents[c]),contents:(0,m.toValuesTree)(this.contents[c],f=>this.logService.error(f))},C=this.overrides.findIndex(f=>d.equals(f.identifiers,r));C!==-1?this.overrides[C]=u:this.overrides.push(u)}}}e.ConfigurationModel=n;class o{constructor(c,l){this._name=c,this.logService=l,this._raw=null,this._configurationModel=null,this._restrictedConfigurations=[]}get configurationModel(){return this._configurationModel||n.createEmptyModel(this.logService)}parseRaw(c,l){this._raw=c;const{contents:a,keys:r,overrides:u,restricted:C,hasExcludedProperties:f}=this.doParseRaw(c,l);this._configurationModel=new n(a,r,u,f?[c]:void 0,this.logService),this._restrictedConfigurations=C||[]}doParseRaw(c,l){const a=b.Registry.as(_.Extensions.Configuration).getConfigurationProperties(),r=this.filter(c,a,!0,l);c=r.raw;const u=(0,m.toValuesTree)(c,h=>this.logService.error(`Conflict in settings file ${this._name}: ${h}`)),C=Object.keys(c),f=this.toOverrides(c,h=>this.logService.error(`Conflict in settings file ${this._name}: ${h}`));return{contents:u,keys:C,overrides:f,restricted:r.restricted,hasExcludedProperties:r.hasExcludedProperties}}filter(c,l,a,r){let u=!1;if(!r?.scopes&&!r?.skipRestricted&&!r?.exclude?.length)return{raw:c,restricted:[],hasExcludedProperties:u};const C={},f=[];for(const h in c)if(_.OVERRIDE_PROPERTY_REGEX.test(h)&&a){const v=this.filter(c[h],l,!1,r);C[h]=v.raw,u=u||v.hasExcludedProperties,f.push(...v.restricted)}else{const v=l[h],w=v?typeof v.scope<"u"?v.scope:3:void 0;v?.restricted&&f.push(h),!r.exclude?.includes(h)&&(r.include?.includes(h)||(w===void 0||r.scopes===void 0||r.scopes.includes(w))&&!(r.skipRestricted&&v?.restricted))?C[h]=c[h]:u=!0}return{raw:C,restricted:f,hasExcludedProperties:u}}toOverrides(c,l){const a=[];for(const r of Object.keys(c))if(_.OVERRIDE_PROPERTY_REGEX.test(r)){const u={};for(const C in c[r])u[C]=c[r][C];a.push({identifiers:(0,_.overrideIdentifiersFromKey)(r),keys:Object.keys(u),contents:(0,m.toValuesTree)(u,l)})}return a}}e.ConfigurationModelParser=o;class t{constructor(c,l,a,r,u,C,f,h,v,w,S,L,D){this.key=c,this.overrides=l,this._value=a,this.overrideIdentifiers=r,this.defaultConfiguration=u,this.policyConfiguration=C,this.applicationConfiguration=f,this.userConfiguration=h,this.localUserConfiguration=v,this.remoteUserConfiguration=w,this.workspaceConfiguration=S,this.folderConfigurationModel=L,this.memoryConfigurationModel=D}toInspectValue(c){return c?.value!==void 0||c?.override!==void 0||c?.overrides!==void 0?c:void 0}get userInspectValue(){return this._userInspectValue||(this._userInspectValue=this.userConfiguration.inspect(this.key,this.overrides.overrideIdentifier)),this._userInspectValue}get user(){return this.toInspectValue(this.userInspectValue)}}class i{constructor(c,l,a,r,u,C,f,h,v,w){this._defaultConfiguration=c,this._policyConfiguration=l,this._applicationConfiguration=a,this._localUserConfiguration=r,this._remoteUserConfiguration=u,this._workspaceConfiguration=C,this._folderConfigurations=f,this._memoryConfiguration=h,this._memoryConfigurationByResource=v,this.logService=w,this._workspaceConsolidatedConfiguration=null,this._foldersConsolidatedConfigurations=new k.ResourceMap,this._userConfiguration=null}getValue(c,l,a){return this.getConsolidatedConfigurationModel(c,l,a).getValue(c)}updateValue(c,l,a={}){let r;a.resource?(r=this._memoryConfigurationByResource.get(a.resource),r||(r=n.createEmptyModel(this.logService),this._memoryConfigurationByResource.set(a.resource,r))):r=this._memoryConfiguration,l===void 0?r.removeValue(c):r.setValue(c,l),a.resource||(this._workspaceConsolidatedConfiguration=null)}inspect(c,l,a){const r=this.getConsolidatedConfigurationModel(c,l,a),u=this.getFolderConfigurationModelForResource(l.resource,a),C=l.resource?this._memoryConfigurationByResource.get(l.resource)||this._memoryConfiguration:this._memoryConfiguration,f=new Set;for(const h of r.overrides)for(const v of h.identifiers)r.getOverrideValue(c,v)!==void 0&&f.add(v);return new t(c,l,r.getValue(c),f.size?[...f]:void 0,this._defaultConfiguration,this._policyConfiguration.isEmpty()?void 0:this._policyConfiguration,this.applicationConfiguration.isEmpty()?void 0:this.applicationConfiguration,this.userConfiguration,this.localUserConfiguration,this.remoteUserConfiguration,a?this._workspaceConfiguration:void 0,u||void 0,C)}get applicationConfiguration(){return this._applicationConfiguration}get userConfiguration(){return this._userConfiguration||(this._userConfiguration=this._remoteUserConfiguration.isEmpty()?this._localUserConfiguration:this._localUserConfiguration.merge(this._remoteUserConfiguration)),this._userConfiguration}get localUserConfiguration(){return this._localUserConfiguration}get remoteUserConfiguration(){return this._remoteUserConfiguration}getConsolidatedConfigurationModel(c,l,a){let r=this.getConsolidatedConfigurationModelForResource(l,a);return l.overrideIdentifier&&(r=r.override(l.overrideIdentifier)),!this._policyConfiguration.isEmpty()&&this._policyConfiguration.getValue(c)!==void 0&&(r=r.merge(this._policyConfiguration)),r}getConsolidatedConfigurationModelForResource({resource:c},l){let a=this.getWorkspaceConsolidatedConfiguration();if(l&&c){const r=l.getFolder(c);r&&(a=this.getFolderConsolidatedConfiguration(r.uri)||a);const u=this._memoryConfigurationByResource.get(c);u&&(a=a.merge(u))}return a}getWorkspaceConsolidatedConfiguration(){return this._workspaceConsolidatedConfiguration||(this._workspaceConsolidatedConfiguration=this._defaultConfiguration.merge(this.applicationConfiguration,this.userConfiguration,this._workspaceConfiguration,this._memoryConfiguration)),this._workspaceConsolidatedConfiguration}getFolderConsolidatedConfiguration(c){let l=this._foldersConsolidatedConfigurations.get(c);if(!l){const a=this.getWorkspaceConsolidatedConfiguration(),r=this._folderConfigurations.get(c);r?(l=a.merge(r),this._foldersConsolidatedConfigurations.set(c,l)):l=a}return l}getFolderConfigurationModelForResource(c,l){if(l&&c){const a=l.getFolder(c);if(a)return this._folderConfigurations.get(a.uri)}}toData(){return{defaults:{contents:this._defaultConfiguration.contents,overrides:this._defaultConfiguration.overrides,keys:this._defaultConfiguration.keys},policy:{contents:this._policyConfiguration.contents,overrides:this._policyConfiguration.overrides,keys:this._policyConfiguration.keys},application:{contents:this.applicationConfiguration.contents,overrides:this.applicationConfiguration.overrides,keys:this.applicationConfiguration.keys},user:{contents:this.userConfiguration.contents,overrides:this.userConfiguration.overrides,keys:this.userConfiguration.keys},workspace:{contents:this._workspaceConfiguration.contents,overrides:this._workspaceConfiguration.overrides,keys:this._workspaceConfiguration.keys},folders:[...this._folderConfigurations.keys()].reduce((c,l)=>{const{contents:a,overrides:r,keys:u}=this._folderConfigurations.get(l);return c.push([l,{contents:a,overrides:r,keys:u}]),c},[])}}static parse(c,l){const a=this.parseConfigurationModel(c.defaults,l),r=this.parseConfigurationModel(c.policy,l),u=this.parseConfigurationModel(c.application,l),C=this.parseConfigurationModel(c.user,l),f=this.parseConfigurationModel(c.workspace,l),h=c.folders.reduce((v,w)=>(v.set(y.URI.revive(w[0]),this.parseConfigurationModel(w[1],l)),v),new k.ResourceMap);return new i(a,r,u,C,n.createEmptyModel(l),f,h,n.createEmptyModel(l),new k.ResourceMap,l)}static parseConfigurationModel(c,l){return new n(c.contents,c.keys,c.overrides,void 0,l)}}e.Configuration=i;class s{constructor(c,l,a,r,u){this.change=c,this.previous=l,this.currentConfiguraiton=a,this.currentWorkspace=r,this.logService=u,this._marker=` -`,this._markerCode1=this._marker.charCodeAt(0),this._markerCode2=46,this.affectedKeys=new Set,this._previousConfiguration=void 0;for(const C of c.keys)this.affectedKeys.add(C);for(const[,C]of c.overrides)for(const f of C)this.affectedKeys.add(f);this._affectsConfigStr=this._marker;for(const C of this.affectedKeys)this._affectsConfigStr+=C+this._marker}get previousConfiguration(){return!this._previousConfiguration&&this.previous&&(this._previousConfiguration=i.parse(this.previous.data,this.logService)),this._previousConfiguration}affectsConfiguration(c,l){const a=this._marker+c,r=this._affectsConfigStr.indexOf(a);if(r<0)return!1;const u=r+a.length;if(u>=this._affectsConfigStr.length)return!1;const C=this._affectsConfigStr.charCodeAt(u);if(C!==this._markerCode1&&C!==this._markerCode2)return!1;if(l){const f=this.previousConfiguration?this.previousConfiguration.getValue(c,l,this.previous?.workspace):void 0,h=this.currentConfiguraiton.getValue(c,l,this.currentWorkspace);return!I.equals(f,h)}return!0}}e.ConfigurationChangeEvent=s}),define(ne[717],se([1,0,2,403,109,38]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DefaultConfiguration=void 0;class y extends d.Disposable{get configurationModel(){return this._configurationModel}constructor(_){super(),this.logService=_,this._configurationModel=k.ConfigurationModel.createEmptyModel(this.logService)}reload(){return this.resetConfigurationModel(),this.configurationModel}getConfigurationDefaultOverrides(){return{}}resetConfigurationModel(){this._configurationModel=k.ConfigurationModel.createEmptyModel(this.logService);const _=E.Registry.as(I.Extensions.Configuration).getConfigurationProperties();this.updateConfigurationModel(Object.keys(_),_)}updateConfigurationModel(_,b){const p=this.getConfigurationDefaultOverrides();for(const n of _){const o=p[n],t=b[n];o!==void 0?this._configurationModel.setValue(n,o):t?this._configurationModel.setValue(n,t.default):this._configurationModel.removeValue(n)}}}e.DefaultConfiguration=y}),define(ne[121],se([1,0,140,16,24,38,2,73]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Extensions=e.KeybindingsRegistry=void 0;class _{constructor(){this._coreKeybindings=new m.LinkedList,this._extensionKeybindings=[],this._cachedMergedKeybindings=null}static bindToCurrentPlatform(n){if(k.OS===1){if(n&&n.win)return n.win}else if(k.OS===2){if(n&&n.mac)return n.mac}else if(n&&n.linux)return n.linux;return n}registerKeybindingRule(n){const o=_.bindToCurrentPlatform(n),t=new y.DisposableStore;if(o&&o.primary){const i=(0,d.decodeKeybinding)(o.primary,k.OS);i&&t.add(this._registerDefaultKeybinding(i,n.id,n.args,n.weight,0,n.when))}if(o&&Array.isArray(o.secondary))for(let i=0,s=o.secondary.length;i{c(),this._cachedMergedKeybindings=null})}getDefaultKeybindings(){return this._cachedMergedKeybindings||(this._cachedMergedKeybindings=Array.from(this._coreKeybindings).concat(this._extensionKeybindings),this._cachedMergedKeybindings.sort(b)),this._cachedMergedKeybindings.slice(0)}}e.KeybindingsRegistry=new _,e.Extensions={EditorModes:"platform.keybindingsRegistry"},E.Registry.add(e.Extensions.EditorModes,e.KeybindingsRegistry);function b(p,n){if(p.weight1!==n.weight1)return p.weight1-n.weight1;if(p.command&&n.command){if(p.commandn.command)return 1}return p.weight2-n.weight2}}),define(ne[29],se([1,0,41,30,6,2,73,24,12,7,121]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";var n;Object.defineProperty(e,"__esModule",{value:!0}),e.Action2=e.MenuItemAction=e.SubmenuItemAction=e.MenuRegistry=e.IMenuService=e.MenuId=void 0,e.isIMenuItem=o,e.isISubmenuItem=t,e.registerAction2=a;function o(r){return r.command!==void 0}function t(r){return r.submenu!==void 0}class i{static{this._instances=new Map}static{this.CommandPalette=new i("CommandPalette")}static{this.DebugBreakpointsContext=new i("DebugBreakpointsContext")}static{this.DebugCallStackContext=new i("DebugCallStackContext")}static{this.DebugConsoleContext=new i("DebugConsoleContext")}static{this.DebugVariablesContext=new i("DebugVariablesContext")}static{this.NotebookVariablesContext=new i("NotebookVariablesContext")}static{this.DebugHoverContext=new i("DebugHoverContext")}static{this.DebugWatchContext=new i("DebugWatchContext")}static{this.DebugToolBar=new i("DebugToolBar")}static{this.DebugToolBarStop=new i("DebugToolBarStop")}static{this.DebugCallStackToolbar=new i("DebugCallStackToolbar")}static{this.DebugCreateConfiguration=new i("DebugCreateConfiguration")}static{this.EditorContext=new i("EditorContext")}static{this.SimpleEditorContext=new i("SimpleEditorContext")}static{this.EditorContent=new i("EditorContent")}static{this.EditorLineNumberContext=new i("EditorLineNumberContext")}static{this.EditorContextCopy=new i("EditorContextCopy")}static{this.EditorContextPeek=new i("EditorContextPeek")}static{this.EditorContextShare=new i("EditorContextShare")}static{this.EditorTitle=new i("EditorTitle")}static{this.EditorTitleRun=new i("EditorTitleRun")}static{this.EditorTitleContext=new i("EditorTitleContext")}static{this.EditorTitleContextShare=new i("EditorTitleContextShare")}static{this.EmptyEditorGroup=new i("EmptyEditorGroup")}static{this.EmptyEditorGroupContext=new i("EmptyEditorGroupContext")}static{this.EditorTabsBarContext=new i("EditorTabsBarContext")}static{this.EditorTabsBarShowTabsSubmenu=new i("EditorTabsBarShowTabsSubmenu")}static{this.EditorTabsBarShowTabsZenModeSubmenu=new i("EditorTabsBarShowTabsZenModeSubmenu")}static{this.EditorActionsPositionSubmenu=new i("EditorActionsPositionSubmenu")}static{this.ExplorerContext=new i("ExplorerContext")}static{this.ExplorerContextShare=new i("ExplorerContextShare")}static{this.ExtensionContext=new i("ExtensionContext")}static{this.GlobalActivity=new i("GlobalActivity")}static{this.CommandCenter=new i("CommandCenter")}static{this.CommandCenterCenter=new i("CommandCenterCenter")}static{this.LayoutControlMenuSubmenu=new i("LayoutControlMenuSubmenu")}static{this.LayoutControlMenu=new i("LayoutControlMenu")}static{this.MenubarMainMenu=new i("MenubarMainMenu")}static{this.MenubarAppearanceMenu=new i("MenubarAppearanceMenu")}static{this.MenubarDebugMenu=new i("MenubarDebugMenu")}static{this.MenubarEditMenu=new i("MenubarEditMenu")}static{this.MenubarCopy=new i("MenubarCopy")}static{this.MenubarFileMenu=new i("MenubarFileMenu")}static{this.MenubarGoMenu=new i("MenubarGoMenu")}static{this.MenubarHelpMenu=new i("MenubarHelpMenu")}static{this.MenubarLayoutMenu=new i("MenubarLayoutMenu")}static{this.MenubarNewBreakpointMenu=new i("MenubarNewBreakpointMenu")}static{this.PanelAlignmentMenu=new i("PanelAlignmentMenu")}static{this.PanelPositionMenu=new i("PanelPositionMenu")}static{this.ActivityBarPositionMenu=new i("ActivityBarPositionMenu")}static{this.MenubarPreferencesMenu=new i("MenubarPreferencesMenu")}static{this.MenubarRecentMenu=new i("MenubarRecentMenu")}static{this.MenubarSelectionMenu=new i("MenubarSelectionMenu")}static{this.MenubarShare=new i("MenubarShare")}static{this.MenubarSwitchEditorMenu=new i("MenubarSwitchEditorMenu")}static{this.MenubarSwitchGroupMenu=new i("MenubarSwitchGroupMenu")}static{this.MenubarTerminalMenu=new i("MenubarTerminalMenu")}static{this.MenubarViewMenu=new i("MenubarViewMenu")}static{this.MenubarHomeMenu=new i("MenubarHomeMenu")}static{this.OpenEditorsContext=new i("OpenEditorsContext")}static{this.OpenEditorsContextShare=new i("OpenEditorsContextShare")}static{this.ProblemsPanelContext=new i("ProblemsPanelContext")}static{this.SCMInputBox=new i("SCMInputBox")}static{this.SCMChangesSeparator=new i("SCMChangesSeparator")}static{this.SCMChangesContext=new i("SCMChangesContext")}static{this.SCMIncomingChanges=new i("SCMIncomingChanges")}static{this.SCMIncomingChangesContext=new i("SCMIncomingChangesContext")}static{this.SCMIncomingChangesSetting=new i("SCMIncomingChangesSetting")}static{this.SCMOutgoingChanges=new i("SCMOutgoingChanges")}static{this.SCMOutgoingChangesContext=new i("SCMOutgoingChangesContext")}static{this.SCMOutgoingChangesSetting=new i("SCMOutgoingChangesSetting")}static{this.SCMIncomingChangesAllChangesContext=new i("SCMIncomingChangesAllChangesContext")}static{this.SCMIncomingChangesHistoryItemContext=new i("SCMIncomingChangesHistoryItemContext")}static{this.SCMOutgoingChangesAllChangesContext=new i("SCMOutgoingChangesAllChangesContext")}static{this.SCMOutgoingChangesHistoryItemContext=new i("SCMOutgoingChangesHistoryItemContext")}static{this.SCMChangeContext=new i("SCMChangeContext")}static{this.SCMResourceContext=new i("SCMResourceContext")}static{this.SCMResourceContextShare=new i("SCMResourceContextShare")}static{this.SCMResourceFolderContext=new i("SCMResourceFolderContext")}static{this.SCMResourceGroupContext=new i("SCMResourceGroupContext")}static{this.SCMSourceControl=new i("SCMSourceControl")}static{this.SCMSourceControlInline=new i("SCMSourceControlInline")}static{this.SCMSourceControlTitle=new i("SCMSourceControlTitle")}static{this.SCMHistoryTitle=new i("SCMHistoryTitle")}static{this.SCMTitle=new i("SCMTitle")}static{this.SearchContext=new i("SearchContext")}static{this.SearchActionMenu=new i("SearchActionContext")}static{this.StatusBarWindowIndicatorMenu=new i("StatusBarWindowIndicatorMenu")}static{this.StatusBarRemoteIndicatorMenu=new i("StatusBarRemoteIndicatorMenu")}static{this.StickyScrollContext=new i("StickyScrollContext")}static{this.TestItem=new i("TestItem")}static{this.TestItemGutter=new i("TestItemGutter")}static{this.TestProfilesContext=new i("TestProfilesContext")}static{this.TestMessageContext=new i("TestMessageContext")}static{this.TestMessageContent=new i("TestMessageContent")}static{this.TestPeekElement=new i("TestPeekElement")}static{this.TestPeekTitle=new i("TestPeekTitle")}static{this.TestCallStack=new i("TestCallStack")}static{this.TouchBarContext=new i("TouchBarContext")}static{this.TitleBarContext=new i("TitleBarContext")}static{this.TitleBarTitleContext=new i("TitleBarTitleContext")}static{this.TunnelContext=new i("TunnelContext")}static{this.TunnelPrivacy=new i("TunnelPrivacy")}static{this.TunnelProtocol=new i("TunnelProtocol")}static{this.TunnelPortInline=new i("TunnelInline")}static{this.TunnelTitle=new i("TunnelTitle")}static{this.TunnelLocalAddressInline=new i("TunnelLocalAddressInline")}static{this.TunnelOriginInline=new i("TunnelOriginInline")}static{this.ViewItemContext=new i("ViewItemContext")}static{this.ViewContainerTitle=new i("ViewContainerTitle")}static{this.ViewContainerTitleContext=new i("ViewContainerTitleContext")}static{this.ViewTitle=new i("ViewTitle")}static{this.ViewTitleContext=new i("ViewTitleContext")}static{this.CommentEditorActions=new i("CommentEditorActions")}static{this.CommentThreadTitle=new i("CommentThreadTitle")}static{this.CommentThreadActions=new i("CommentThreadActions")}static{this.CommentThreadAdditionalActions=new i("CommentThreadAdditionalActions")}static{this.CommentThreadTitleContext=new i("CommentThreadTitleContext")}static{this.CommentThreadCommentContext=new i("CommentThreadCommentContext")}static{this.CommentTitle=new i("CommentTitle")}static{this.CommentActions=new i("CommentActions")}static{this.CommentsViewThreadActions=new i("CommentsViewThreadActions")}static{this.InteractiveToolbar=new i("InteractiveToolbar")}static{this.InteractiveCellTitle=new i("InteractiveCellTitle")}static{this.InteractiveCellDelete=new i("InteractiveCellDelete")}static{this.InteractiveCellExecute=new i("InteractiveCellExecute")}static{this.InteractiveInputExecute=new i("InteractiveInputExecute")}static{this.InteractiveInputConfig=new i("InteractiveInputConfig")}static{this.ReplInputExecute=new i("ReplInputExecute")}static{this.IssueReporter=new i("IssueReporter")}static{this.NotebookToolbar=new i("NotebookToolbar")}static{this.NotebookStickyScrollContext=new i("NotebookStickyScrollContext")}static{this.NotebookCellTitle=new i("NotebookCellTitle")}static{this.NotebookCellDelete=new i("NotebookCellDelete")}static{this.NotebookCellInsert=new i("NotebookCellInsert")}static{this.NotebookCellBetween=new i("NotebookCellBetween")}static{this.NotebookCellListTop=new i("NotebookCellTop")}static{this.NotebookCellExecute=new i("NotebookCellExecute")}static{this.NotebookCellExecuteGoTo=new i("NotebookCellExecuteGoTo")}static{this.NotebookCellExecutePrimary=new i("NotebookCellExecutePrimary")}static{this.NotebookDiffCellInputTitle=new i("NotebookDiffCellInputTitle")}static{this.NotebookDiffCellMetadataTitle=new i("NotebookDiffCellMetadataTitle")}static{this.NotebookDiffCellOutputsTitle=new i("NotebookDiffCellOutputsTitle")}static{this.NotebookOutputToolbar=new i("NotebookOutputToolbar")}static{this.NotebookOutlineFilter=new i("NotebookOutlineFilter")}static{this.NotebookOutlineActionMenu=new i("NotebookOutlineActionMenu")}static{this.NotebookEditorLayoutConfigure=new i("NotebookEditorLayoutConfigure")}static{this.NotebookKernelSource=new i("NotebookKernelSource")}static{this.BulkEditTitle=new i("BulkEditTitle")}static{this.BulkEditContext=new i("BulkEditContext")}static{this.TimelineItemContext=new i("TimelineItemContext")}static{this.TimelineTitle=new i("TimelineTitle")}static{this.TimelineTitleContext=new i("TimelineTitleContext")}static{this.TimelineFilterSubMenu=new i("TimelineFilterSubMenu")}static{this.AccountsContext=new i("AccountsContext")}static{this.SidebarTitle=new i("SidebarTitle")}static{this.PanelTitle=new i("PanelTitle")}static{this.AuxiliaryBarTitle=new i("AuxiliaryBarTitle")}static{this.AuxiliaryBarHeader=new i("AuxiliaryBarHeader")}static{this.TerminalInstanceContext=new i("TerminalInstanceContext")}static{this.TerminalEditorInstanceContext=new i("TerminalEditorInstanceContext")}static{this.TerminalNewDropdownContext=new i("TerminalNewDropdownContext")}static{this.TerminalTabContext=new i("TerminalTabContext")}static{this.TerminalTabEmptyAreaContext=new i("TerminalTabEmptyAreaContext")}static{this.TerminalStickyScrollContext=new i("TerminalStickyScrollContext")}static{this.WebviewContext=new i("WebviewContext")}static{this.InlineCompletionsActions=new i("InlineCompletionsActions")}static{this.InlineEditsActions=new i("InlineEditsActions")}static{this.InlineEditActions=new i("InlineEditActions")}static{this.NewFile=new i("NewFile")}static{this.MergeInput1Toolbar=new i("MergeToolbar1Toolbar")}static{this.MergeInput2Toolbar=new i("MergeToolbar2Toolbar")}static{this.MergeBaseToolbar=new i("MergeBaseToolbar")}static{this.MergeInputResultToolbar=new i("MergeToolbarResultToolbar")}static{this.InlineSuggestionToolbar=new i("InlineSuggestionToolbar")}static{this.InlineEditToolbar=new i("InlineEditToolbar")}static{this.ChatContext=new i("ChatContext")}static{this.ChatCodeBlock=new i("ChatCodeblock")}static{this.ChatCompareBlock=new i("ChatCompareBlock")}static{this.ChatMessageTitle=new i("ChatMessageTitle")}static{this.ChatExecute=new i("ChatExecute")}static{this.ChatExecuteSecondary=new i("ChatExecuteSecondary")}static{this.ChatInputSide=new i("ChatInputSide")}static{this.AccessibleView=new i("AccessibleView")}static{this.MultiDiffEditorFileToolbar=new i("MultiDiffEditorFileToolbar")}static{this.DiffEditorHunkToolbar=new i("DiffEditorHunkToolbar")}static{this.DiffEditorSelectionToolbar=new i("DiffEditorSelectionToolbar")}constructor(u){if(i._instances.has(u))throw new TypeError(`MenuId with identifier '${u}' already exists. Use MenuId.for(ident) or a unique identifier`);i._instances.set(u,this),this.id=u}}e.MenuId=i,e.IMenuService=(0,b.createDecorator)("menuService");class s{static{this._all=new Map}static for(u){let C=this._all.get(u);return C||(C=new s(u),this._all.set(u,C)),C}static merge(u){const C=new Set;for(const f of u)f instanceof s&&C.add(f.id);return C}constructor(u){this.id=u,this.has=C=>C===u}}e.MenuRegistry=new class{constructor(){this._commands=new Map,this._menuItems=new Map,this._onDidChangeMenu=new I.MicrotaskEmitter({merge:s.merge}),this.onDidChangeMenu=this._onDidChangeMenu.event}addCommand(r){return this._commands.set(r.id,r),this._onDidChangeMenu.fire(s.for(i.CommandPalette)),(0,E.toDisposable)(()=>{this._commands.delete(r.id)&&this._onDidChangeMenu.fire(s.for(i.CommandPalette))})}getCommand(r){return this._commands.get(r)}getCommands(){const r=new Map;return this._commands.forEach((u,C)=>r.set(C,u)),r}appendMenuItem(r,u){let C=this._menuItems.get(r);C||(C=new y.LinkedList,this._menuItems.set(r,C));const f=C.push(u);return this._onDidChangeMenu.fire(s.for(r)),(0,E.toDisposable)(()=>{f(),this._onDidChangeMenu.fire(s.for(r))})}appendMenuItems(r){const u=new E.DisposableStore;for(const{id:C,item:f}of r)u.add(this.appendMenuItem(C,f));return u}getMenuItems(r){let u;return this._menuItems.has(r)?u=[...this._menuItems.get(r)]:u=[],r===i.CommandPalette&&this._appendImplicitItems(u),u}_appendImplicitItems(r){const u=new Set;for(const C of r)o(C)&&(u.add(C.command.id),C.alt&&u.add(C.alt.id));this._commands.forEach((C,f)=>{u.has(f)||r.push({command:C})})}};class g extends d.SubmenuAction{constructor(u,C,f){super(`submenuitem.${u.submenu.id}`,typeof u.title=="string"?u.title:u.title.value,f,"submenu"),this.item=u,this.hideActions=C}}e.SubmenuItemAction=g;let c=n=class{static label(u,C){return C?.renderShortTitle&&u.shortTitle?typeof u.shortTitle=="string"?u.shortTitle:u.shortTitle.value:typeof u.title=="string"?u.title:u.title.value}constructor(u,C,f,h,v,w,S){this.hideActions=h,this.menuKeybinding=v,this._commandService=S,this.id=u.id,this.label=n.label(u,f),this.tooltip=(typeof u.tooltip=="string"?u.tooltip:u.tooltip?.value)??"",this.enabled=!u.precondition||w.contextMatchesRules(u.precondition),this.checked=void 0;let L;if(u.toggled){const D=u.toggled.condition?u.toggled:{condition:u.toggled};this.checked=w.contextMatchesRules(D.condition),this.checked&&D.tooltip&&(this.tooltip=typeof D.tooltip=="string"?D.tooltip:D.tooltip.value),this.checked&&k.ThemeIcon.isThemeIcon(D.icon)&&(L=D.icon),this.checked&&D.title&&(this.label=typeof D.title=="string"?D.title:D.title.value)}L||(L=k.ThemeIcon.isThemeIcon(u.icon)?u.icon:void 0),this.item=u,this.alt=C?new n(C,void 0,f,h,void 0,w,S):void 0,this._options=f,this.class=L&&k.ThemeIcon.asClassName(L)}run(...u){let C=[];return this._options?.arg&&(C=[...C,this._options.arg]),this._options?.shouldForwardArgs&&(C=[...C,...u]),this._commandService.executeCommand(this.id,...C)}};e.MenuItemAction=c,e.MenuItemAction=c=n=ke([ce(5,_.IContextKeyService),ce(6,m.ICommandService)],c);class l{constructor(u){this.desc=u}}e.Action2=l;function a(r){const u=[],C=new r,{f1:f,menu:h,keybinding:v,...w}=C.desc;if(m.CommandsRegistry.getCommand(w.id))throw new Error(`Cannot register two commands with the same id: ${w.id}`);if(u.push(m.CommandsRegistry.registerCommand({id:w.id,handler:(S,...L)=>C.run(S,...L),metadata:w.metadata})),Array.isArray(h))for(const S of h)u.push(e.MenuRegistry.appendMenuItem(S.id,{command:{...w,precondition:S.precondition===null?void 0:w.precondition},...S}));else h&&u.push(e.MenuRegistry.appendMenuItem(h.id,{command:{...w,precondition:h.precondition===null?void 0:w.precondition},...h}));if(f&&(u.push(e.MenuRegistry.appendMenuItem(i.CommandPalette,{command:w,when:w.precondition})),u.push(e.MenuRegistry.addCommand(w))),Array.isArray(v))for(const S of v)u.push(p.KeybindingsRegistry.registerKeybindingRule({...S,id:w.id,when:w.precondition?_.ContextKeyExpr.and(w.precondition,S.when):S.when}));else v&&u.push(p.KeybindingsRegistry.registerKeybindingRule({...v,id:w.id,when:w.precondition?_.ContextKeyExpr.and(w.precondition,v.when):v.when}));return{dispose(){(0,E.dispose)(u)}}}}),define(ne[718],se([1,0,46,229,3,29]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ToggleTabFocusModeAction=void 0;class y extends E.Action2{static{this.ID="editor.action.toggleTabFocusMode"}constructor(){super({id:y.ID,title:I.localize2(1383,"Toggle Tab Key Moves Focus"),precondition:void 0,keybinding:{primary:2091,mac:{primary:1323},weight:100},metadata:{description:I.localize2(1384,"Determines whether the tab key moves focus around the workbench or inserts the tab character in the current editor. This is also called tab trapping, tab navigation, or tab focus mode.")},f1:!0})}run(){const b=!k.TabFocus.getTabFocusMode();k.TabFocus.setTabFocusMode(b),b?(0,d.alert)(I.localize(1381,"Pressing Tab will now move focus to the next focusable element")):(0,d.alert)(I.localize(1382,"Pressing Tab will now insert the tab character"))}}e.ToggleTabFocusModeAction=y,(0,E.registerAction2)(y)}),define(ne[404],se([1,0,260,641,12,121,3,2,5]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextScopedReplaceInput=e.ContextScopedFindInput=e.historyNavigationVisible=void 0,e.registerAndCreateHistoryNavigationContext=i,e.historyNavigationVisible=new I.RawContextKey("suggestWidgetVisible",!1,(0,y.localize)(1537,"Whether suggestion are visible"));const b="historyNavigationWidgetFocus",p="historyNavigationForwardsEnabled",n="historyNavigationBackwardsEnabled";let o;const t=[];function i(c,l){if(t.includes(l))throw new Error("Cannot register the same widget multiple times");t.push(l);const a=new m.DisposableStore,r=new I.RawContextKey(b,!1).bindTo(c),u=new I.RawContextKey(p,!0).bindTo(c),C=new I.RawContextKey(n,!0).bindTo(c),f=()=>{r.set(!0),o=l},h=()=>{r.set(!1),o===l&&(o=void 0)};return(0,_.isActiveElement)(l.element)&&f(),a.add(l.onDidFocus(()=>f())),a.add(l.onDidBlur(()=>h())),a.add((0,m.toDisposable)(()=>{t.splice(t.indexOf(l),1),h()})),{historyNavigationForwardsEnablement:u,historyNavigationBackwardsEnablement:C,dispose(){a.dispose()}}}let s=class extends d.FindInput{constructor(l,a,r,u){super(l,a,r);const C=this._register(u.createScoped(this.inputBox.element));this._register(i(C,this.inputBox))}};e.ContextScopedFindInput=s,e.ContextScopedFindInput=s=ke([ce(3,I.IContextKeyService)],s);let g=class extends k.ReplaceInput{constructor(l,a,r,u,C=!1){super(l,a,C,r);const f=this._register(u.createScoped(this.inputBox.element));this._register(i(f,this.inputBox))}};e.ContextScopedReplaceInput=g,e.ContextScopedReplaceInput=g=ke([ce(3,I.IContextKeyService)],g),E.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"history.showPrevious",weight:200,when:I.ContextKeyExpr.and(I.ContextKeyExpr.has(b),I.ContextKeyExpr.equals(n,!0),I.ContextKeyExpr.not("isComposing"),e.historyNavigationVisible.isEqualTo(!1)),primary:16,secondary:[528],handler:c=>{o?.showPreviousValue()}}),E.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"history.showNext",weight:200,when:I.ContextKeyExpr.and(I.ContextKeyExpr.has(b),I.ContextKeyExpr.equals(p,!0),I.ContextKeyExpr.not("isComposing"),e.historyNavigationVisible.isEqualTo(!1)),primary:18,secondary:[530],handler:c=>{o?.showNextValue()}})}),define(ne[155],se([1,0,18,8,82,2,54,19,22,9,4,78,135,3,29,24,12,17,404]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickSuggestionsOptions=e.CompletionItemModel=e.CompletionOptions=e.CompletionItem=e.suggestWidgetStatusbarMenu=e.Context=void 0,e.getSnippetSuggestSupport=C,e.provideSuggestionItems=h,e.getSuggestionComparator=D,e.showSimpleSuggestions=T,e.Context={Visible:l.historyNavigationVisible,HasFocusedSuggestion:new g.RawContextKey("suggestWidgetHasFocusedSuggestion",!1,(0,t.localize)(1310,"Whether any suggestion is focused")),DetailsVisible:new g.RawContextKey("suggestWidgetDetailsVisible",!1,(0,t.localize)(1311,"Whether suggestion details are visible")),MultipleSuggestions:new g.RawContextKey("suggestWidgetMultipleSuggestions",!1,(0,t.localize)(1312,"Whether there are multiple suggestions to pick from")),MakesTextEdit:new g.RawContextKey("suggestionMakesTextEdit",!0,(0,t.localize)(1313,"Whether inserting the current suggestion yields in a change or has everything already been typed")),AcceptSuggestionsOnEnter:new g.RawContextKey("acceptSuggestionOnEnter",!0,(0,t.localize)(1314,"Whether suggestions are inserted when pressing Enter")),HasInsertAndReplaceRange:new g.RawContextKey("suggestionHasInsertAndReplaceRange",!1,(0,t.localize)(1315,"Whether the current suggestion has insert and replace behaviour")),InsertMode:new g.RawContextKey("suggestionInsertMode",void 0,{type:"string",description:(0,t.localize)(1316,"Whether the default behaviour is to insert or replace")}),CanResolve:new g.RawContextKey("suggestionCanResolve",!1,(0,t.localize)(1317,"Whether the current suggestion supports to resolve further details"))},e.suggestWidgetStatusbarMenu=new i.MenuId("suggestWidgetStatusBar");class a{constructor(P,N,O,F){this.position=P,this.completion=N,this.container=O,this.provider=F,this.isInvalid=!1,this.score=I.FuzzyScore.Default,this.distance=0,this.textLabel=typeof N.label=="string"?N.label:N.label?.label,this.labelLow=this.textLabel.toLowerCase(),this.isInvalid=!this.textLabel,this.sortTextLow=N.sortText&&N.sortText.toLowerCase(),this.filterTextLow=N.filterText&&N.filterText.toLowerCase(),this.extensionId=N.extensionId,p.Range.isIRange(N.range)?(this.editStart=new b.Position(N.range.startLineNumber,N.range.startColumn),this.editInsertEnd=new b.Position(N.range.endLineNumber,N.range.endColumn),this.editReplaceEnd=new b.Position(N.range.endLineNumber,N.range.endColumn),this.isInvalid=this.isInvalid||p.Range.spansMultipleLines(N.range)||N.range.startLineNumber!==P.lineNumber):(this.editStart=new b.Position(N.range.insert.startLineNumber,N.range.insert.startColumn),this.editInsertEnd=new b.Position(N.range.insert.endLineNumber,N.range.insert.endColumn),this.editReplaceEnd=new b.Position(N.range.replace.endLineNumber,N.range.replace.endColumn),this.isInvalid=this.isInvalid||p.Range.spansMultipleLines(N.range.insert)||p.Range.spansMultipleLines(N.range.replace)||N.range.insert.startLineNumber!==P.lineNumber||N.range.replace.startLineNumber!==P.lineNumber||N.range.insert.startColumn!==N.range.replace.startColumn),typeof F.resolveCompletionItem!="function"&&(this._resolveCache=Promise.resolve(),this._resolveDuration=0)}get isResolved(){return this._resolveDuration!==void 0}get resolveDuration(){return this._resolveDuration!==void 0?this._resolveDuration:-1}async resolve(P){if(!this._resolveCache){const N=P.onCancellationRequested(()=>{this._resolveCache=void 0,this._resolveDuration=void 0}),O=new y.StopWatch(!0);this._resolveCache=Promise.resolve(this.provider.resolveCompletionItem(this.completion,P)).then(F=>{Object.assign(this.completion,F),this._resolveDuration=O.elapsed()},F=>{(0,k.isCancellationError)(F)&&(this._resolveCache=void 0,this._resolveDuration=void 0)}).finally(()=>{N.dispose()})}return this._resolveCache}}e.CompletionItem=a;class r{static{this.default=new r}constructor(P=2,N=new Set,O=new Set,F=new Map,x=!0){this.snippetSortOrder=P,this.kindFilter=N,this.providerFilter=O,this.providerItemsToReuse=F,this.showDeprecated=x}}e.CompletionOptions=r;let u;function C(){return u}class f{constructor(P,N,O,F){this.items=P,this.needsClipboard=N,this.durations=O,this.disposable=F}}e.CompletionItemModel=f;async function h(A,P,N,O=r.default,F={triggerKind:0},x=d.CancellationToken.None){const W=new y.StopWatch;N=N.clone();const V=P.getWordAtPosition(N),q=V?new p.Range(N.lineNumber,V.startColumn,N.lineNumber,V.endColumn):p.Range.fromPositions(N),H={replace:q,insert:q.setEndPosition(N.lineNumber,N.column)},z=[],U=new E.DisposableStore,j=[];let Y=!1;const G=(R,J,ie)=>{let ue=!1;if(!J)return ue;for(const he of J.suggestions)if(!O.kindFilter.has(he.kind)){if(!O.showDeprecated&&he?.tags?.includes(1))continue;he.range||(he.range=H),he.sortText||(he.sortText=typeof he.label=="string"?he.label:he.label.label),!Y&&he.insertTextRules&&he.insertTextRules&4&&(Y=o.SnippetParser.guessNeedsClipboard(he.insertText)),z.push(new a(N,he,J,R)),ue=!0}return(0,E.isDisposable)(J)&&U.add(J),j.push({providerName:R._debugDisplayName??"unknown_provider",elapsedProvider:J.duration??-1,elapsedOverall:ie.elapsed()}),ue},K=(async()=>{if(!u||O.kindFilter.has(27))return;const R=O.providerItemsToReuse.get(u);if(R){R.forEach(ue=>z.push(ue));return}if(O.providerFilter.size>0&&!O.providerFilter.has(u))return;const J=new y.StopWatch,ie=await u.provideCompletionItems(P,N,F,x);G(u,ie,J)})();for(const R of A.orderedGroups(P)){let J=!1;if(await Promise.all(R.map(async ie=>{if(O.providerItemsToReuse.has(ie)){const ue=O.providerItemsToReuse.get(ie);ue.forEach(he=>z.push(he)),J=J||ue.length>0;return}if(!(O.providerFilter.size>0&&!O.providerFilter.has(ie)))try{const ue=new y.StopWatch,he=await ie.provideCompletionItems(P,N,F,x);J=G(ie,he,ue)||J}catch(ue){(0,k.onUnexpectedExternalError)(ue)}})),J||x.isCancellationRequested)break}return await K,x.isCancellationRequested?(U.dispose(),Promise.reject(new k.CancellationError)):new f(z.sort(D(O.snippetSortOrder)),Y,{entries:j,elapsed:W.elapsed()},U)}function v(A,P){if(A.sortTextLow&&P.sortTextLow){if(A.sortTextLowP.sortTextLow)return 1}return A.textLabelP.textLabel?1:A.completion.kind-P.completion.kind}function w(A,P){if(A.completion.kind!==P.completion.kind){if(A.completion.kind===27)return-1;if(P.completion.kind===27)return 1}return v(A,P)}function S(A,P){if(A.completion.kind!==P.completion.kind){if(A.completion.kind===27)return 1;if(P.completion.kind===27)return-1}return v(A,P)}const L=new Map;L.set(0,w),L.set(2,S),L.set(1,v);function D(A){return L.get(A)}s.CommandsRegistry.registerCommand("_executeCompletionItemProvider",async(A,...P)=>{const[N,O,F,x]=P;(0,m.assertType)(_.URI.isUri(N)),(0,m.assertType)(b.Position.isIPosition(O)),(0,m.assertType)(typeof F=="string"||!F),(0,m.assertType)(typeof x=="number"||!x);const{completionProvider:W}=A.get(c.ILanguageFeaturesService),V=await A.get(n.ITextModelService).createModelReference(N);try{const q={incomplete:!1,suggestions:[]},H=[],z=V.object.textEditorModel.validatePosition(O),U=await h(W,V.object.textEditorModel,z,void 0,{triggerCharacter:F??void 0,triggerKind:F?1:0});for(const j of U.items)H.length<(x??0)&&H.push(j.resolve(d.CancellationToken.None)),q.incomplete=q.incomplete||j.container.incomplete,q.suggestions.push(j.completion);try{return await Promise.all(H),q}finally{setTimeout(()=>U.disposable.dispose(),100)}}finally{V.dispose()}});function T(A,P){A.getContribution("editor.contrib.suggestController")?.triggerSuggest(new Set().add(P),void 0,!0)}class M{static isAllOff(P){return P.other==="off"&&P.comments==="off"&&P.strings==="off"}static isAllOn(P){return P.other==="on"&&P.comments==="on"&&P.strings==="on"}static valueFor(P,N){switch(N){case 1:return P.comments;case 2:return P.strings;default:return P.other}}}e.QuickSuggestionsOptions=M}),define(ne[719],se([1,0,16,3,12,179,121,272,66]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0});const b={weight:200,when:I.ContextKeyExpr.and(I.ContextKeyExpr.equals(m.quickInputTypeContextKeyValue,"quickPick"),m.inQuickInputContext),metadata:{description:(0,k.localize)(1587,"Used while in the context of the quick pick. If you change one keybinding for this command, you should change all of the other keybindings (modifier variants) of this command as well.")}};function p(g,c={}){y.KeybindingsRegistry.registerCommandAndKeybindingRule({...b,...g,secondary:o(g.primary,g.secondary??[],c)})}const n=d.isMacintosh?256:2048;function o(g,c,l={}){return l.withAltMod&&c.push(512+g),l.withCtrlMod&&(c.push(n+g),l.withAltMod&&c.push(512+n+g)),l.withCmdMod&&d.isMacintosh&&(c.push(2048+g),l.withCtrlMod&&c.push(2304+g),l.withAltMod&&(c.push(2560+g),l.withCtrlMod&&c.push(2816+g))),c}function t(g,c){return l=>{const a=l.get(_.IQuickInputService).currentQuickInput;if(a)return c&&a.quickNavigate?a.focus(c):a.focus(g)}}p({id:"quickInput.pageNext",primary:12,handler:t(_.QuickPickFocus.NextPage)},{withAltMod:!0,withCtrlMod:!0,withCmdMod:!0}),p({id:"quickInput.pagePrevious",primary:11,handler:t(_.QuickPickFocus.PreviousPage)},{withAltMod:!0,withCtrlMod:!0,withCmdMod:!0}),p({id:"quickInput.first",primary:n+14,handler:t(_.QuickPickFocus.First)},{withAltMod:!0,withCmdMod:!0}),p({id:"quickInput.last",primary:n+13,handler:t(_.QuickPickFocus.Last)},{withAltMod:!0,withCmdMod:!0}),p({id:"quickInput.next",primary:18,handler:t(_.QuickPickFocus.Next)},{withCtrlMod:!0}),p({id:"quickInput.previous",primary:16,handler:t(_.QuickPickFocus.Previous)},{withCtrlMod:!0});const i=(0,k.localize)(1588,"If we're in quick access mode, this will navigate to the next item. If we are not in quick access mode, this will navigate to the next separator."),s=(0,k.localize)(1589,"If we're in quick access mode, this will navigate to the previous item. If we are not in quick access mode, this will navigate to the previous separator.");d.isMacintosh?(p({id:"quickInput.nextSeparatorWithQuickAccessFallback",primary:2066,handler:t(_.QuickPickFocus.NextSeparator,_.QuickPickFocus.Next),metadata:{description:i}}),p({id:"quickInput.nextSeparator",primary:2578,secondary:[2322],handler:t(_.QuickPickFocus.NextSeparator)},{withCtrlMod:!0}),p({id:"quickInput.previousSeparatorWithQuickAccessFallback",primary:2064,handler:t(_.QuickPickFocus.PreviousSeparator,_.QuickPickFocus.Previous),metadata:{description:s}}),p({id:"quickInput.previousSeparator",primary:2576,secondary:[2320],handler:t(_.QuickPickFocus.PreviousSeparator)},{withCtrlMod:!0})):(p({id:"quickInput.nextSeparatorWithQuickAccessFallback",primary:530,handler:t(_.QuickPickFocus.NextSeparator,_.QuickPickFocus.Next),metadata:{description:i}}),p({id:"quickInput.nextSeparator",primary:2578,handler:t(_.QuickPickFocus.NextSeparator)}),p({id:"quickInput.previousSeparatorWithQuickAccessFallback",primary:528,handler:t(_.QuickPickFocus.PreviousSeparator,_.QuickPickFocus.Previous),metadata:{description:s}}),p({id:"quickInput.previousSeparator",primary:2576,handler:t(_.QuickPickFocus.PreviousSeparator)})),p({id:"quickInput.acceptInBackground",when:I.ContextKeyExpr.and(b.when,I.ContextKeyExpr.or(E.InputFocusedContext.negate(),m.endOfQuickInputBoxContext)),primary:17,weight:250,handler:g=>{g.get(_.IQuickInputService).currentQuickInput?.accept(!0)}},{withAltMod:!0,withCtrlMod:!0,withCmdMod:!0})}),define(ne[156],se([1,0,13,2,38]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickAccessRegistry=e.Extensions=e.DefaultQuickAccessFilterValue=void 0;var E;(function(m){m[m.PRESERVE=0]="PRESERVE",m[m.LAST=1]="LAST"})(E||(e.DefaultQuickAccessFilterValue=E={})),e.Extensions={Quickaccess:"workbench.contributions.quickaccess"};class y{constructor(){this.providers=[],this.defaultProvider=void 0}registerQuickAccessProvider(_){return _.prefix.length===0?this.defaultProvider=_:this.providers.push(_),this.providers.sort((b,p)=>p.prefix.length-b.prefix.length),(0,k.toDisposable)(()=>{this.providers.splice(this.providers.indexOf(_),1),this.defaultProvider===_&&(this.defaultProvider=void 0)})}getQuickAccessProviders(){return(0,d.coalesce)([this.defaultProvider,...this.providers])}getQuickAccessProvider(_){return _&&this.providers.find(p=>_.startsWith(p.prefix))||void 0||this.defaultProvider}}e.QuickAccessRegistry=y,I.Registry.add(e.Extensions.Quickaccess,new y)}),define(ne[720],se([1,0,3,38,2,31,156,66]),function(oe,e,d,k,I,E,y,m){"use strict";var _;Object.defineProperty(e,"__esModule",{value:!0}),e.HelpQuickAccessProvider=void 0;let b=class{static{_=this}static{this.PREFIX="?"}constructor(n,o){this.quickInputService=n,this.keybindingService=o,this.registry=k.Registry.as(y.Extensions.Quickaccess)}provide(n){const o=new I.DisposableStore;return o.add(n.onDidAccept(()=>{const[t]=n.selectedItems;t&&this.quickInputService.quickAccess.show(t.prefix,{preserveValue:!0})})),o.add(n.onDidChangeValue(t=>{const i=this.registry.getQuickAccessProvider(t.substr(_.PREFIX.length));i&&i.prefix&&i.prefix!==_.PREFIX&&this.quickInputService.quickAccess.show(i.prefix,{preserveValue:!0})})),n.items=this.getQuickAccessProviders().filter(t=>t.prefix!==_.PREFIX),o}getQuickAccessProviders(){return this.registry.getQuickAccessProviders().sort((o,t)=>o.prefix.localeCompare(t.prefix)).flatMap(o=>this.createPicks(o))}createPicks(n){return n.helpEntries.map(o=>{const t=o.prefix||n.prefix,i=t||"\u2026";return{prefix:t,label:i,keybinding:o.commandId?this.keybindingService.lookupKeybinding(o.commandId):void 0,ariaLabel:(0,d.localize)(1579,"{0}, {1}",i,o.description),description:o.description}})}};e.HelpQuickAccessProvider=b,e.HelpQuickAccessProvider=b=_=ke([ce(0,m.IQuickInputService),ce(1,E.IKeybindingService)],b)}),define(ne[721],se([1,0,38,156,107,720]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),d.Registry.as(k.Extensions.Quickaccess).registerQuickAccessProvider({ctor:E.HelpQuickAccessProvider,prefix:"",helpEntries:[{description:I.QuickHelpNLS.helpQuickAccessActionLabel}]})}),define(ne[722],se([1,0,14,18,6,2,7,156,66,38]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickAccessController=void 0;let p=class extends E.Disposable{constructor(o,t){super(),this.quickInputService=o,this.instantiationService=t,this.registry=b.Registry.as(m.Extensions.Quickaccess),this.mapProviderToDescriptor=new Map,this.lastAcceptedPickerValues=new Map,this.visibleQuickAccess=void 0}show(o="",t){this.doShowOrPick(o,!1,t)}doShowOrPick(o,t,i){const[s,g]=this.getOrInstantiateProvider(o,i?.enabledProviderPrefixes),c=this.visibleQuickAccess,l=c?.descriptor;if(c&&g&&l===g){o!==g.prefix&&!i?.preserveValue&&(c.picker.value=o),this.adjustValueSelection(c.picker,g,i);return}if(g&&!i?.preserveValue){let v;if(c&&l&&l!==g){const w=c.value.substr(l.prefix.length);w&&(v=`${g.prefix}${w}`)}if(!v){const w=s?.defaultFilterValue;w===m.DefaultQuickAccessFilterValue.LAST?v=this.lastAcceptedPickerValues.get(g):typeof w=="string"&&(v=`${g.prefix}${w}`)}typeof v=="string"&&(o=v)}const a=c?.picker?.valueSelection,r=c?.picker?.value,u=new E.DisposableStore,C=u.add(this.quickInputService.createQuickPick({useSeparators:!0}));C.value=o,this.adjustValueSelection(C,g,i),C.placeholder=i?.placeholder??g?.placeholder,C.quickNavigate=i?.quickNavigateConfiguration,C.hideInput=!!C.quickNavigate&&!c,(typeof i?.itemActivation=="number"||i?.quickNavigateConfiguration)&&(C.itemActivation=i?.itemActivation??_.ItemActivation.SECOND),C.contextKey=g?.contextKey,C.filterValue=v=>v.substring(g?g.prefix.length:0);let f;t&&(f=new d.DeferredPromise,u.add(I.Event.once(C.onWillAccept)(v=>{v.veto(),C.hide()}))),u.add(this.registerPickerListeners(C,s,g,o,i));const h=u.add(new k.CancellationTokenSource);if(s&&u.add(s.provide(C,h.token,i?.providerOptions)),I.Event.once(C.onDidHide)(()=>{C.selectedItems.length===0&&h.cancel(),u.dispose(),f?.complete(C.selectedItems.slice(0))}),C.show(),a&&r===o&&(C.valueSelection=a),t)return f?.p}adjustValueSelection(o,t,i){let s;i?.preserveValue?s=[o.value.length,o.value.length]:s=[t?.prefix.length??0,o.value.length],o.valueSelection=s}registerPickerListeners(o,t,i,s,g){const c=new E.DisposableStore,l=this.visibleQuickAccess={picker:o,descriptor:i,value:s};return c.add((0,E.toDisposable)(()=>{l===this.visibleQuickAccess&&(this.visibleQuickAccess=void 0)})),c.add(o.onDidChangeValue(a=>{const[r]=this.getOrInstantiateProvider(a,g?.enabledProviderPrefixes);r!==t?this.show(a,{enabledProviderPrefixes:g?.enabledProviderPrefixes,preserveValue:!0,providerOptions:g?.providerOptions}):l.value=a})),i&&c.add(o.onDidAccept(()=>{this.lastAcceptedPickerValues.set(i,o.value)})),c}getOrInstantiateProvider(o,t){const i=this.registry.getQuickAccessProvider(o);if(!i||t&&!t?.includes(i.prefix))return[void 0,void 0];let s=this.mapProviderToDescriptor.get(i);return s||(s=this.instantiationService.createInstance(i.ctor),this.mapProviderToDescriptor.set(i,s)),[s,i]}};e.QuickAccessController=p,e.QuickAccessController=p=ke([ce(0,_.IQuickInputService),ce(1,y.IInstantiationService)],p)}),define(ne[723],se([1,0,26,30,111,544]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SeverityIcon=void 0;var E;(function(y){function m(_){switch(_){case I.default.Ignore:return"severity-ignore "+k.ThemeIcon.asClassName(d.Codicon.info);case I.default.Info:return k.ThemeIcon.asClassName(d.Codicon.info);case I.default.Warning:return k.ThemeIcon.asClassName(d.Codicon.warning);case I.default.Error:return k.ThemeIcon.asClassName(d.Codicon.error);default:return""}}y.className=m})(E||(e.SeverityIcon=E={}))}),define(ne[101],se([1,0,6,2,19,647,7]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InMemoryStorageService=e.AbstractStorageService=e.WillSaveStateReason=e.IStorageService=e.TARGET_KEY=void 0,e.loadKeyTargets=_,e.TARGET_KEY="__$__targetStorageMarker",e.IStorageService=(0,y.createDecorator)("storageService");var m;(function(n){n[n.NONE=0]="NONE",n[n.SHUTDOWN=1]="SHUTDOWN"})(m||(e.WillSaveStateReason=m={}));function _(n){const o=n.get(e.TARGET_KEY);if(o)try{return JSON.parse(o)}catch{}return Object.create(null)}class b extends k.Disposable{static{this.DEFAULT_FLUSH_INTERVAL=60*1e3}constructor(o={flushInterval:b.DEFAULT_FLUSH_INTERVAL}){super(),this.options=o,this._onDidChangeValue=this._register(new d.PauseableEmitter),this._onDidChangeTarget=this._register(new d.PauseableEmitter),this._onWillSaveState=this._register(new d.Emitter),this.onWillSaveState=this._onWillSaveState.event,this._workspaceKeyTargets=void 0,this._profileKeyTargets=void 0,this._applicationKeyTargets=void 0}onDidChangeValue(o,t,i){return d.Event.filter(this._onDidChangeValue.event,s=>s.scope===o&&(t===void 0||s.key===t),i)}emitDidChangeValue(o,t){const{key:i,external:s}=t;if(i===e.TARGET_KEY){switch(o){case-1:this._applicationKeyTargets=void 0;break;case 0:this._profileKeyTargets=void 0;break;case 1:this._workspaceKeyTargets=void 0;break}this._onDidChangeTarget.fire({scope:o})}else this._onDidChangeValue.fire({scope:o,key:i,target:this.getKeyTargets(o)[i],external:s})}get(o,t,i){return this.getStorage(t)?.get(o,i)}getBoolean(o,t,i){return this.getStorage(t)?.getBoolean(o,i)}getNumber(o,t,i){return this.getStorage(t)?.getNumber(o,i)}store(o,t,i,s,g=!1){if((0,I.isUndefinedOrNull)(t)){this.remove(o,i,g);return}this.withPausedEmitters(()=>{this.updateKeyTarget(o,i,s),this.getStorage(i)?.set(o,t,g)})}remove(o,t,i=!1){this.withPausedEmitters(()=>{this.updateKeyTarget(o,t,void 0),this.getStorage(t)?.delete(o,i)})}withPausedEmitters(o){this._onDidChangeValue.pause(),this._onDidChangeTarget.pause();try{o()}finally{this._onDidChangeValue.resume(),this._onDidChangeTarget.resume()}}updateKeyTarget(o,t,i,s=!1){const g=this.getKeyTargets(t);typeof i=="number"?g[o]!==i&&(g[o]=i,this.getStorage(t)?.set(e.TARGET_KEY,JSON.stringify(g),s)):typeof g[o]=="number"&&(delete g[o],this.getStorage(t)?.set(e.TARGET_KEY,JSON.stringify(g),s))}get workspaceKeyTargets(){return this._workspaceKeyTargets||(this._workspaceKeyTargets=this.loadKeyTargets(1)),this._workspaceKeyTargets}get profileKeyTargets(){return this._profileKeyTargets||(this._profileKeyTargets=this.loadKeyTargets(0)),this._profileKeyTargets}get applicationKeyTargets(){return this._applicationKeyTargets||(this._applicationKeyTargets=this.loadKeyTargets(-1)),this._applicationKeyTargets}getKeyTargets(o){switch(o){case-1:return this.applicationKeyTargets;case 0:return this.profileKeyTargets;default:return this.workspaceKeyTargets}}loadKeyTargets(o){const t=this.getStorage(o);return t?_(t):Object.create(null)}}e.AbstractStorageService=b;class p extends b{constructor(){super(),this.applicationStorage=this._register(new E.Storage(new E.InMemoryStorageDatabase,{hint:E.StorageHint.STORAGE_IN_MEMORY})),this.profileStorage=this._register(new E.Storage(new E.InMemoryStorageDatabase,{hint:E.StorageHint.STORAGE_IN_MEMORY})),this.workspaceStorage=this._register(new E.Storage(new E.InMemoryStorageDatabase,{hint:E.StorageHint.STORAGE_IN_MEMORY})),this._register(this.workspaceStorage.onDidChangeStorage(o=>this.emitDidChangeValue(1,o))),this._register(this.profileStorage.onDidChangeStorage(o=>this.emitDidChangeValue(0,o))),this._register(this.applicationStorage.onDidChangeStorage(o=>this.emitDidChangeValue(-1,o)))}getStorage(o){switch(o){case-1:return this.applicationStorage;case 0:return this.profileStorage;default:return this.workspaceStorage}}}e.InMemoryStorageService=p}),define(ne[724],se([1,0,6,45,4,386,49,7,101,52,5]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeLensCache=e.ICodeLensCache=void 0,e.ICodeLensCache=(0,m.createDecorator)("ICodeLensCache");class n{constructor(i,s){this.lineCount=i,this.data=s}}let o=class{constructor(i){this._fakeProvider=new class{provideCodeLenses(){throw new Error("not supported")}},this._cache=new k.LRUCache(20,.75);const s="codelens/cache";(0,p.runWhenWindowIdle)(b.mainWindow,()=>i.remove(s,1));const g="codelens/cache2",c=i.get(g,1,"{}");this._deserialize(c);const l=d.Event.filter(i.onWillSaveState,a=>a.reason===_.WillSaveStateReason.SHUTDOWN);d.Event.once(l)(a=>{i.store(g,this._serialize(),1,1)})}put(i,s){const g=s.lenses.map(a=>({range:a.symbol.range,command:a.symbol.command&&{id:"",title:a.symbol.command?.title}})),c=new E.CodeLensModel;c.add({lenses:g,dispose:()=>{}},this._fakeProvider);const l=new n(i.getLineCount(),c);this._cache.set(i.uri.toString(),l)}get(i){const s=this._cache.get(i.uri.toString());return s&&s.lineCount===i.getLineCount()?s.data:void 0}delete(i){this._cache.delete(i.uri.toString())}_serialize(){const i=Object.create(null);for(const[s,g]of this._cache){const c=new Set;for(const l of g.data.lenses)c.add(l.symbol.range.startLineNumber);i[s]={lineCount:g.lineCount,lines:[...c.values()]}}return JSON.stringify(i)}_deserialize(i){try{const s=JSON.parse(i);for(const g in s){const c=s[g],l=[];for(const r of c.lines)l.push({range:new I.Range(r,1,r,11)});const a=new E.CodeLensModel;a.add({lenses:l,dispose(){}},this._fakeProvider),this._cache.set(g,new n(c.lineCount,a))}}catch{}}};e.CodeLensCache=o,e.CodeLensCache=o=ke([ce(0,_.IStorageService)],o),(0,y.registerSingleton)(e.ICodeLensCache,o,1)}),define(ne[405],se([1,0,14,2,45,225,27,28,49,7,101]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";var n;Object.defineProperty(e,"__esModule",{value:!0}),e.ISuggestMemoryService=e.SuggestMemoryService=e.PrefixMemory=e.LRUMemory=e.NoMemory=e.Memory=void 0;class o{constructor(l){this.name=l}select(l,a,r){if(r.length===0)return 0;const u=r[0].score[0];for(let C=0;Cv&&L.type===r[w].completion.kind&&L.insertText===r[w].completion.insertText&&(v=L.touch,h=w),r[w].completion.preselect&&f===-1)return f=w}return h!==-1?h:f!==-1?f:0}toJSON(){return this._cache.toJSON()}fromJSON(l){this._cache.clear();const a=0;for(const[r,u]of l)u.touch=a,u.type=typeof u.type=="number"?u.type:y.CompletionItemKinds.fromString(u.type),this._cache.set(r,u);this._seq=this._cache.size}}e.LRUMemory=i;class s extends o{constructor(){super("recentlyUsedByPrefix"),this._trie=E.TernarySearchTree.forStrings(),this._seq=0}memorize(l,a,r){const{word:u}=l.getWordUntilPosition(a),C=`${l.getLanguageId()}/${u}`;this._trie.set(C,{type:r.completion.kind,insertText:r.completion.insertText,touch:this._seq++})}select(l,a,r){const{word:u}=l.getWordUntilPosition(a);if(!u)return super.select(l,a,r);const C=`${l.getLanguageId()}/${u}`;let f=this._trie.get(C);if(f||(f=this._trie.findSubstr(C)),f)for(let h=0;hl.push([r,a])),l.sort((a,r)=>-(a[1].touch-r[1].touch)).forEach((a,r)=>a[1].touch=r),l.slice(0,200)}fromJSON(l){if(this._trie.clear(),l.length>0){this._seq=l[0][1].touch+1;for(const[a,r]of l)r.type=typeof r.type=="number"?r.type:y.CompletionItemKinds.fromString(r.type),this._trie.set(a,r)}}}e.PrefixMemory=s;let g=class{static{n=this}static{this._strategyCtors=new Map([["recentlyUsedByPrefix",s],["recentlyUsed",i],["first",t]])}static{this._storagePrefix="suggest/memories"}constructor(l,a){this._storageService=l,this._configService=a,this._disposables=new k.DisposableStore,this._persistSoon=new d.RunOnceScheduler(()=>this._saveState(),500),this._disposables.add(l.onWillSaveState(r=>{r.reason===p.WillSaveStateReason.SHUTDOWN&&this._saveState()}))}dispose(){this._disposables.dispose(),this._persistSoon.dispose()}memorize(l,a,r){this._withStrategy(l,a).memorize(l,a,r),this._persistSoon.schedule()}select(l,a,r){return this._withStrategy(l,a).select(l,a,r)}_withStrategy(l,a){const r=this._configService.getValue("editor.suggestSelection",{overrideIdentifier:l.getLanguageIdAtPosition(a.lineNumber,a.column),resource:l.uri});if(this._strategy?.name!==r){this._saveState();const u=n._strategyCtors.get(r)||t;this._strategy=new u;try{const f=this._configService.getValue("editor.suggest.shareSuggestSelections")?0:1,h=this._storageService.get(`${n._storagePrefix}/${r}`,f);h&&this._strategy.fromJSON(JSON.parse(h))}catch{}}return this._strategy}_saveState(){if(this._strategy){const a=this._configService.getValue("editor.suggest.shareSuggestSelections")?0:1,r=JSON.stringify(this._strategy);this._storageService.store(`${n._storagePrefix}/${this._strategy.name}`,r,a,1)}}};e.SuggestMemoryService=g,e.SuggestMemoryService=g=n=ke([ce(0,p.IStorageService),ce(1,m.IConfigurationService)],g),e.ISuggestMemoryService=(0,b.createDecorator)("ISuggestMemories"),(0,_.registerSingleton)(e.ISuggestMemoryService,g,1)}),define(ne[406],se([1,0,14,6,2,29,24,12,41,101,13,3,31]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o){"use strict";var t,i;Object.defineProperty(e,"__esModule",{value:!0}),e.MenuService=void 0,e.createConfigureKeybindingAction=u;let s=class{constructor(f,h,v){this._commandService=f,this._keybindingService=h,this._hiddenStates=new g(v)}createMenu(f,h,v){return new a(f,this._hiddenStates,{emitEventsForSubmenuChanges:!1,eventDebounceDelay:50,...v},this._commandService,this._keybindingService,h)}getMenuActions(f,h,v){const w=new a(f,this._hiddenStates,{emitEventsForSubmenuChanges:!1,eventDebounceDelay:50,...v},this._commandService,this._keybindingService,h),S=w.getActions(v);return w.dispose(),S}resetHiddenStates(f){this._hiddenStates.reset(f)}};e.MenuService=s,e.MenuService=s=ke([ce(0,y.ICommandService),ce(1,o.IKeybindingService),ce(2,b.IStorageService)],s);let g=class{static{t=this}static{this._key="menu.hiddenCommands"}constructor(f){this._storageService=f,this._disposables=new I.DisposableStore,this._onDidChange=new k.Emitter,this.onDidChange=this._onDidChange.event,this._ignoreChangeEvent=!1,this._hiddenByDefaultCache=new Map;try{const h=f.get(t._key,0,"{}");this._data=JSON.parse(h)}catch{this._data=Object.create(null)}this._disposables.add(f.onDidChangeValue(0,t._key,this._disposables)(()=>{if(!this._ignoreChangeEvent)try{const h=f.get(t._key,0,"{}");this._data=JSON.parse(h)}catch(h){console.log("FAILED to read storage after UPDATE",h)}this._onDidChange.fire()}))}dispose(){this._onDidChange.dispose(),this._disposables.dispose()}_isHiddenByDefault(f,h){return this._hiddenByDefaultCache.get(`${f.id}/${h}`)??!1}setDefaultState(f,h,v){this._hiddenByDefaultCache.set(`${f.id}/${h}`,v)}isHidden(f,h){const v=this._isHiddenByDefault(f,h),w=this._data[f.id]?.includes(h)??!1;return v?!w:w}updateHidden(f,h,v){this._isHiddenByDefault(f,h)&&(v=!v);const S=this._data[f.id];if(v)S?S.indexOf(h)<0&&S.push(h):this._data[f.id]=[h];else if(S){const L=S.indexOf(h);L>=0&&(0,p.removeFastWithoutKeepingOrder)(S,L),S.length===0&&delete this._data[f.id]}this._persist()}reset(f){if(f===void 0)this._data=Object.create(null),this._persist();else{for(const{id:h}of f)this._data[h]&&delete this._data[h];this._persist()}}_persist(){try{this._ignoreChangeEvent=!0;const f=JSON.stringify(this._data);this._storageService.store(t._key,f,0,0)}finally{this._ignoreChangeEvent=!1}}};g=t=ke([ce(0,b.IStorageService)],g);class c{constructor(f,h){this._id=f,this._collectContextKeysForSubmenus=h,this._menuGroups=[],this._allMenuIds=new Set,this._structureContextKeys=new Set,this._preconditionContextKeys=new Set,this._toggledContextKeys=new Set,this.refresh()}get allMenuIds(){return this._allMenuIds}get structureContextKeys(){return this._structureContextKeys}get preconditionContextKeys(){return this._preconditionContextKeys}get toggledContextKeys(){return this._toggledContextKeys}refresh(){this._menuGroups.length=0,this._allMenuIds.clear(),this._structureContextKeys.clear(),this._preconditionContextKeys.clear(),this._toggledContextKeys.clear();const f=this._sort(E.MenuRegistry.getMenuItems(this._id));let h;for(const v of f){const w=v.group||"";(!h||h[0]!==w)&&(h=[w,[]],this._menuGroups.push(h)),h[1].push(v),this._collectContextKeysAndSubmenuIds(v)}this._allMenuIds.add(this._id)}_sort(f){return f}_collectContextKeysAndSubmenuIds(f){if(c._fillInKbExprKeys(f.when,this._structureContextKeys),(0,E.isIMenuItem)(f)){if(f.command.precondition&&c._fillInKbExprKeys(f.command.precondition,this._preconditionContextKeys),f.command.toggled){const h=f.command.toggled.condition||f.command.toggled;c._fillInKbExprKeys(h,this._toggledContextKeys)}}else this._collectContextKeysForSubmenus&&(E.MenuRegistry.getMenuItems(f.submenu).forEach(this._collectContextKeysAndSubmenuIds,this),this._allMenuIds.add(f.submenu))}static _fillInKbExprKeys(f,h){if(f)for(const v of f.keys())h.add(v)}}let l=i=class extends c{constructor(f,h,v,w,S,L){super(f,v),this._hiddenStates=h,this._commandService=w,this._keybindingService=S,this._contextKeyService=L,this.refresh()}createActionGroups(f){const h=[];for(const v of this._menuGroups){const[w,S]=v;let L;for(const D of S)if(this._contextKeyService.contextMatchesRules(D.when)){const T=(0,E.isIMenuItem)(D);T&&this._hiddenStates.setDefaultState(this._id,D.command.id,!!D.isHiddenByDefault);const M=r(this._id,T?D.command:D,this._hiddenStates);if(T){const A=u(this._commandService,this._keybindingService,D.command.id,D.when);(L??=[]).push(new E.MenuItemAction(D.command,D.alt,f,M,A,this._contextKeyService,this._commandService))}else{const A=new i(D.submenu,this._hiddenStates,this._collectContextKeysForSubmenus,this._commandService,this._keybindingService,this._contextKeyService).createActionGroups(f),P=_.Separator.join(...A.map(N=>N[1]));P.length>0&&(L??=[]).push(new E.SubmenuItemAction(D,M,P))}}L&&L.length>0&&h.push([w,L])}return h}_sort(f){return f.sort(i._compareMenuItems)}static _compareMenuItems(f,h){const v=f.group,w=h.group;if(v!==w){if(v){if(!w)return-1}else return 1;if(v==="navigation")return-1;if(w==="navigation")return 1;const D=v.localeCompare(w);if(D!==0)return D}const S=f.order||0,L=h.order||0;return SL?1:i._compareTitles((0,E.isIMenuItem)(f)?f.command.title:f.title,(0,E.isIMenuItem)(h)?h.command.title:h.title)}static _compareTitles(f,h){const v=typeof f=="string"?f:f.original,w=typeof h=="string"?h:h.original;return v.localeCompare(w)}};l=i=ke([ce(3,y.ICommandService),ce(4,o.IKeybindingService),ce(5,m.IContextKeyService)],l);let a=class{constructor(f,h,v,w,S,L){this._disposables=new I.DisposableStore,this._menuInfo=new l(f,h,v.emitEventsForSubmenuChanges,w,S,L);const D=new d.RunOnceScheduler(()=>{this._menuInfo.refresh(),this._onDidChange.fire({menu:this,isStructuralChange:!0,isEnablementChange:!0,isToggleChange:!0})},v.eventDebounceDelay);this._disposables.add(D),this._disposables.add(E.MenuRegistry.onDidChangeMenu(P=>{for(const N of this._menuInfo.allMenuIds)if(P.has(N)){D.schedule();break}}));const T=this._disposables.add(new I.DisposableStore),M=P=>{let N=!1,O=!1,F=!1;for(const x of P)if(N=N||x.isStructuralChange,O=O||x.isEnablementChange,F=F||x.isToggleChange,N&&O&&F)break;return{menu:this,isStructuralChange:N,isEnablementChange:O,isToggleChange:F}},A=()=>{T.add(L.onDidChangeContext(P=>{const N=P.affectsSome(this._menuInfo.structureContextKeys),O=P.affectsSome(this._menuInfo.preconditionContextKeys),F=P.affectsSome(this._menuInfo.toggledContextKeys);(N||O||F)&&this._onDidChange.fire({menu:this,isStructuralChange:N,isEnablementChange:O,isToggleChange:F})})),T.add(h.onDidChange(P=>{this._onDidChange.fire({menu:this,isStructuralChange:!0,isEnablementChange:!1,isToggleChange:!1})}))};this._onDidChange=new k.DebounceEmitter({onWillAddFirstListener:A,onDidRemoveLastListener:T.clear.bind(T),delay:v.eventDebounceDelay,merge:M}),this.onDidChange=this._onDidChange.event}getActions(f){return this._menuInfo.createActionGroups(f)}dispose(){this._disposables.dispose(),this._onDidChange.dispose()}};a=ke([ce(3,y.ICommandService),ce(4,o.IKeybindingService),ce(5,m.IContextKeyService)],a);function r(C,f,h){const v=(0,E.isISubmenuItem)(f)?f.submenu.id:f.id,w=typeof f.title=="string"?f.title:f.title.value,S=(0,_.toAction)({id:`hide/${C.id}/${v}`,label:(0,n.localize)(1490,"Hide '{0}'",w),run(){h.updateHidden(C,v,!0)}}),L=(0,_.toAction)({id:`toggle/${C.id}/${v}`,label:w,get checked(){return!h.isHidden(C,v)},run(){h.updateHidden(C,v,!!this.checked)}});return{hide:S,toggle:L,get isHidden(){return!L.checked}}}function u(C,f,h,v=void 0,w=!0){return(0,_.toAction)({id:`configureKeybinding/${h}`,label:(0,n.localize)(1491,"Configure Keybinding"),enabled:w,run(){const L=!!!f.lookupKeybinding(h)&&v?v.serialize():void 0;C.executeCommand("workbench.action.openGlobalKeybindings",`@command:${h}`+(L?` +when:${L}`:""))}})}}),define(ne[63],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ITelemetryService=void 0,e.ITelemetryService=(0,d.createDecorator)("telemetryService")}),define(ne[15],se([1,0,3,22,34,9,51,78,29,24,12,7,121,38,63,19,62,5]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectAllCommand=e.RedoCommand=e.UndoCommand=e.EditorExtensionsRegistry=e.EditorAction2=e.MultiEditorAction=e.EditorAction=e.EditorCommand=e.ProxyCommand=e.MultiCommand=e.Command=void 0,e.registerModelAndPositionCommand=v,e.registerEditorCommand=w,e.registerEditorAction=S,e.registerMultiEditorAction=L,e.registerInstantiatedEditorAction=D,e.registerEditorContribution=T;class l{constructor(F){this.id=F.id,this.precondition=F.precondition,this._kbOpts=F.kbOpts,this._menuOpts=F.menuOpts,this.metadata=F.metadata}register(){if(Array.isArray(this._menuOpts)?this._menuOpts.forEach(this._registerMenuItem,this):this._menuOpts&&this._registerMenuItem(this._menuOpts),this._kbOpts){const F=Array.isArray(this._kbOpts)?this._kbOpts:[this._kbOpts];for(const x of F){let W=x.kbExpr;this.precondition&&(W?W=p.ContextKeyExpr.and(W,this.precondition):W=this.precondition);const V={id:this.id,weight:x.weight,args:x.args,when:W,primary:x.primary,secondary:x.secondary,win:x.win,linux:x.linux,mac:x.mac};o.KeybindingsRegistry.registerKeybindingRule(V)}}b.CommandsRegistry.registerCommand({id:this.id,handler:(F,x)=>this.runCommand(F,x),metadata:this.metadata})}_registerMenuItem(F){_.MenuRegistry.appendMenuItem(F.menuId,{group:F.group,command:{id:this.id,title:F.title,icon:F.icon,precondition:this.precondition},when:F.when,order:F.order})}}e.Command=l;class a extends l{constructor(){super(...arguments),this._implementations=[]}addImplementation(F,x,W,V){return this._implementations.push({priority:F,name:x,implementation:W,when:V}),this._implementations.sort((q,H)=>H.priority-q.priority),{dispose:()=>{for(let q=0;q{if(z.get(p.IContextKeyService).contextMatchesRules(W??void 0))return V(z,H,x)})}runCommand(F,x){return u.runEditorCommand(F,x,this.precondition,(W,V,q)=>this.runEditorCommand(W,V,q))}}e.EditorCommand=u;class C extends u{static convertOptions(F){let x;Array.isArray(F.menuOpts)?x=F.menuOpts:F.menuOpts?x=[F.menuOpts]:x=[];function W(V){return V.menuId||(V.menuId=_.MenuId.EditorContext),V.title||(V.title=F.label),V.when=p.ContextKeyExpr.and(F.precondition,V.when),V}return Array.isArray(F.contextMenuOpts)?x.push(...F.contextMenuOpts.map(W)):F.contextMenuOpts&&x.push(W(F.contextMenuOpts)),F.menuOpts=x,F}constructor(F){super(C.convertOptions(F)),this.label=F.label,this.alias=F.alias}runEditorCommand(F,x,W){return this.reportTelemetry(F,x),this.run(F,x,W||{})}reportTelemetry(F,x){F.get(i.ITelemetryService).publicLog2("editorActionInvoked",{name:this.label,id:this.id})}}e.EditorAction=C;class f extends C{constructor(){super(...arguments),this._implementations=[]}addImplementation(F,x){return this._implementations.push([F,x]),this._implementations.sort((W,V)=>V[0]-W[0]),{dispose:()=>{for(let W=0;W{const H=q.get(p.IContextKeyService),z=q.get(g.ILogService);if(!H.contextMatchesRules(this.desc.precondition??void 0)){z.debug("[EditorAction2] NOT running command because its precondition is FALSE",this.desc.id,this.desc.precondition?.serialize());return}return this.runEditorCommand(q,V,...x)})}}e.EditorAction2=h;function v(O,F){b.CommandsRegistry.registerCommand(O,function(x,...W){const V=x.get(n.IInstantiationService),[q,H]=W;(0,s.assertType)(k.URI.isUri(q)),(0,s.assertType)(E.Position.isIPosition(H));const z=x.get(y.IModelService).getModel(q);if(z){const U=E.Position.lift(H);return V.invokeFunction(F,z,U,...W.slice(2))}return x.get(m.ITextModelService).createModelReference(q).then(U=>new Promise((j,Y)=>{try{const G=V.invokeFunction(F,U.object.textEditorModel,E.Position.lift(H),W.slice(2));j(G)}catch(G){Y(G)}}).finally(()=>{U.dispose()}))})}function w(O){return P.INSTANCE.registerEditorCommand(O),O}function S(O){const F=new O;return P.INSTANCE.registerEditorAction(F),F}function L(O){return P.INSTANCE.registerEditorAction(O),O}function D(O){P.INSTANCE.registerEditorAction(O)}function T(O,F,x){P.INSTANCE.registerEditorContribution(O,F,x)}var M;(function(O){function F(H){return P.INSTANCE.getEditorCommand(H)}O.getEditorCommand=F;function x(){return P.INSTANCE.getEditorActions()}O.getEditorActions=x;function W(){return P.INSTANCE.getEditorContributions()}O.getEditorContributions=W;function V(H){return P.INSTANCE.getEditorContributions().filter(z=>H.indexOf(z.id)>=0)}O.getSomeEditorContributions=V;function q(){return P.INSTANCE.getDiffEditorContributions()}O.getDiffEditorContributions=q})(M||(e.EditorExtensionsRegistry=M={}));const A={EditorCommonContributions:"editor.contributions"};class P{static{this.INSTANCE=new P}constructor(){this.editorContributions=[],this.diffEditorContributions=[],this.editorActions=[],this.editorCommands=Object.create(null)}registerEditorContribution(F,x,W){this.editorContributions.push({id:F,ctor:x,instantiation:W})}getEditorContributions(){return this.editorContributions.slice(0)}getDiffEditorContributions(){return this.diffEditorContributions.slice(0)}registerEditorAction(F){F.register(),this.editorActions.push(F)}getEditorActions(){return this.editorActions}registerEditorCommand(F){F.register(),this.editorCommands[F.id]=F}getEditorCommand(F){return this.editorCommands[F]||null}}t.Registry.add(A.EditorCommonContributions,P.INSTANCE);function N(O){return O.register(),O}e.UndoCommand=N(new a({id:"undo",precondition:void 0,kbOpts:{weight:0,primary:2104},menuOpts:[{menuId:_.MenuId.MenubarEditMenu,group:"1_do",title:d.localize(62,"&&Undo"),order:1},{menuId:_.MenuId.CommandPalette,group:"",title:d.localize(63,"Undo"),order:1}]})),N(new r(e.UndoCommand,{id:"default:undo",precondition:void 0})),e.RedoCommand=N(new a({id:"redo",precondition:void 0,kbOpts:{weight:0,primary:2103,secondary:[3128],mac:{primary:3128}},menuOpts:[{menuId:_.MenuId.MenubarEditMenu,group:"1_do",title:d.localize(64,"&&Redo"),order:2},{menuId:_.MenuId.CommandPalette,group:"",title:d.localize(65,"Redo"),order:1}]})),N(new r(e.RedoCommand,{id:"default:redo",precondition:void 0})),e.SelectAllCommand=N(new a({id:"editor.action.selectAll",precondition:void 0,kbOpts:{weight:0,kbExpr:null,primary:2079},menuOpts:[{menuId:_.MenuId.MenubarSelectionMenu,group:"1_basic",title:d.localize(66,"&&Select All"),order:1},{menuId:_.MenuId.CommandPalette,group:"",title:d.localize(67,"Select All"),order:1}]}))}),define(ne[214],se([1,0,3,64,19,46,15,34,565,76,234,235,276,9,4,20,12,121,5,213]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CoreEditingCommands=e.CoreNavigationCommands=e.RevealLine_=e.EditorScroll_=e.CoreEditorCommand=void 0;const r=0;class u extends y.EditorCommand{runEditorCommand(P,N,O){const F=N._getViewModel();F&&this.runCoreEditorCommand(F,O||{})}}e.CoreEditorCommand=u;var C;(function(A){const P=function(O){if(!I.isObject(O))return!1;const F=O;return!(!I.isString(F.to)||!I.isUndefined(F.by)&&!I.isString(F.by)||!I.isUndefined(F.value)&&!I.isNumber(F.value)||!I.isUndefined(F.revealCursor)&&!I.isBoolean(F.revealCursor))};A.metadata={description:"Scroll editor in the given direction",args:[{name:"Editor scroll argument object",description:"Property-value pairs that can be passed through this argument:\n * 'to': A mandatory direction value.\n ```\n 'up', 'down'\n ```\n * 'by': Unit to move. Default is computed based on 'to' value.\n ```\n 'line', 'wrappedLine', 'page', 'halfPage', 'editor'\n ```\n * 'value': Number of units to move. Default is '1'.\n * 'revealCursor': If 'true' reveals the cursor if it is outside view port.\n ",constraint:P,schema:{type:"object",required:["to"],properties:{to:{type:"string",enum:["up","down"]},by:{type:"string",enum:["line","wrappedLine","page","halfPage","editor"]},value:{type:"number",default:1},revealCursor:{type:"boolean"}}}}]},A.RawDirection={Up:"up",Right:"right",Down:"down",Left:"left"},A.RawUnit={Line:"line",WrappedLine:"wrappedLine",Page:"page",HalfPage:"halfPage",Editor:"editor",Column:"column"};function N(O){let F;switch(O.to){case A.RawDirection.Up:F=1;break;case A.RawDirection.Right:F=2;break;case A.RawDirection.Down:F=3;break;case A.RawDirection.Left:F=4;break;default:return null}let x;switch(O.by){case A.RawUnit.Line:x=1;break;case A.RawUnit.WrappedLine:x=2;break;case A.RawUnit.Page:x=3;break;case A.RawUnit.HalfPage:x=4;break;case A.RawUnit.Editor:x=5;break;case A.RawUnit.Column:x=6;break;default:x=2}const W=Math.floor(O.value||1),V=!!O.revealCursor;return{direction:F,unit:x,value:W,revealCursor:V,select:!!O.select}}A.parse=N})(C||(e.EditorScroll_=C={}));var f;(function(A){const P=function(N){if(!I.isObject(N))return!1;const O=N;return!(!I.isNumber(O.lineNumber)&&!I.isString(O.lineNumber)||!I.isUndefined(O.at)&&!I.isString(O.at))};A.metadata={description:"Reveal the given line at the given logical position",args:[{name:"Reveal line argument object",description:"Property-value pairs that can be passed through this argument:\n * 'lineNumber': A mandatory line number value.\n * 'at': Logical position at which line has to be revealed.\n ```\n 'top', 'center', 'bottom'\n ```\n ",constraint:P,schema:{type:"object",required:["lineNumber"],properties:{lineNumber:{type:["number","string"]},at:{type:"string",enum:["top","center","bottom"]}}}}]},A.RawAtArgument={Top:"top",Center:"center",Bottom:"bottom"}})(f||(e.RevealLine_=f={}));class h{constructor(P){P.addImplementation(1e4,"code-editor",(N,O)=>{const F=N.get(m.ICodeEditorService).getFocusedCodeEditor();return F&&F.hasTextFocus()?this._runEditorCommand(N,F,O):!1}),P.addImplementation(1e3,"generic-dom-input-textarea",(N,O)=>{const F=(0,l.getActiveElement)();return F&&["input","textarea"].indexOf(F.tagName.toLowerCase())>=0?(this.runDOMCommand(F),!0):!1}),P.addImplementation(0,"generic-dom",(N,O)=>{const F=N.get(m.ICodeEditorService).getActiveCodeEditor();return F?(F.focus(),this._runEditorCommand(N,F,O)):!1})}_runEditorCommand(P,N,O){const F=this.runEditorCommand(P,N,O);return F||!0}}var v;(function(A){class P extends u{constructor(ie){super(ie),this._inSelectionMode=ie.inSelectionMode}runCoreEditorCommand(ie,ue){if(!ue.position)return;ie.model.pushStackElement(),ie.setCursorStates(ue.source,3,[n.CursorMoveCommands.moveTo(ie,ie.getPrimaryCursorState(),this._inSelectionMode,ue.position,ue.viewPosition)])&&ue.revealType!==2&&ie.revealAllCursors(ue.source,!0,!0)}}A.MoveTo=(0,y.registerEditorCommand)(new P({id:"_moveTo",inSelectionMode:!1,precondition:void 0})),A.MoveToSelect=(0,y.registerEditorCommand)(new P({id:"_moveToSelect",inSelectionMode:!0,precondition:void 0}));class N extends u{runCoreEditorCommand(ie,ue){ie.model.pushStackElement();const he=this._getColumnSelectResult(ie,ie.getPrimaryCursorState(),ie.getCursorColumnSelectData(),ue);he!==null&&(ie.setCursorStates(ue.source,3,he.viewStates.map(pe=>b.CursorState.fromViewState(pe))),ie.setCursorColumnSelectData({isReal:!0,fromViewLineNumber:he.fromLineNumber,fromViewVisualColumn:he.fromVisualColumn,toViewLineNumber:he.toLineNumber,toViewVisualColumn:he.toVisualColumn}),he.reversed?ie.revealTopMostCursor(ue.source):ie.revealBottomMostCursor(ue.source))}}A.ColumnSelect=(0,y.registerEditorCommand)(new class extends N{constructor(){super({id:"columnSelect",precondition:void 0})}_getColumnSelectResult(J,ie,ue,he){if(typeof he.position>"u"||typeof he.viewPosition>"u"||typeof he.mouseColumn>"u")return null;const pe=J.model.validatePosition(he.position),ae=J.coordinatesConverter.validateViewPosition(new t.Position(he.viewPosition.lineNumber,he.viewPosition.column),pe),ee=he.doColumnSelect?ue.fromViewLineNumber:ae.lineNumber,de=he.doColumnSelect?ue.fromViewVisualColumn:he.mouseColumn-1;return _.ColumnSelection.columnSelect(J.cursorConfig,J,ee,de,ae.lineNumber,he.mouseColumn-1)}}),A.CursorColumnSelectLeft=(0,y.registerEditorCommand)(new class extends N{constructor(){super({id:"cursorColumnSelectLeft",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:3599,linux:{primary:0}}})}_getColumnSelectResult(J,ie,ue,he){return _.ColumnSelection.columnSelectLeft(J.cursorConfig,J,ue)}}),A.CursorColumnSelectRight=(0,y.registerEditorCommand)(new class extends N{constructor(){super({id:"cursorColumnSelectRight",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:3601,linux:{primary:0}}})}_getColumnSelectResult(J,ie,ue,he){return _.ColumnSelection.columnSelectRight(J.cursorConfig,J,ue)}});class O extends N{constructor(ie){super(ie),this._isPaged=ie.isPaged}_getColumnSelectResult(ie,ue,he,pe){return _.ColumnSelection.columnSelectUp(ie.cursorConfig,ie,he,this._isPaged)}}A.CursorColumnSelectUp=(0,y.registerEditorCommand)(new O({isPaged:!1,id:"cursorColumnSelectUp",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:3600,linux:{primary:0}}})),A.CursorColumnSelectPageUp=(0,y.registerEditorCommand)(new O({isPaged:!0,id:"cursorColumnSelectPageUp",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:3595,linux:{primary:0}}}));class F extends N{constructor(ie){super(ie),this._isPaged=ie.isPaged}_getColumnSelectResult(ie,ue,he,pe){return _.ColumnSelection.columnSelectDown(ie.cursorConfig,ie,he,this._isPaged)}}A.CursorColumnSelectDown=(0,y.registerEditorCommand)(new F({isPaged:!1,id:"cursorColumnSelectDown",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:3602,linux:{primary:0}}})),A.CursorColumnSelectPageDown=(0,y.registerEditorCommand)(new F({isPaged:!0,id:"cursorColumnSelectPageDown",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:3596,linux:{primary:0}}}));class x extends u{constructor(){super({id:"cursorMove",precondition:void 0,metadata:n.CursorMove.metadata})}runCoreEditorCommand(ie,ue){const he=n.CursorMove.parse(ue);he&&this._runCursorMove(ie,ue.source,he)}_runCursorMove(ie,ue,he){ie.model.pushStackElement(),ie.setCursorStates(ue,3,x._move(ie,ie.getCursorStates(),he)),ie.revealAllCursors(ue,!0)}static _move(ie,ue,he){const pe=he.select,ae=he.value;switch(he.direction){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:return n.CursorMoveCommands.simpleMove(ie,ue,he.direction,pe,ae,he.unit);case 11:case 13:case 12:case 14:return n.CursorMoveCommands.viewportMove(ie,ue,he.direction,pe,ae);default:return null}}}A.CursorMoveImpl=x,A.CursorMove=(0,y.registerEditorCommand)(new x);class W extends u{constructor(ie){super(ie),this._staticArgs=ie.args}runCoreEditorCommand(ie,ue){let he=this._staticArgs;this._staticArgs.value===-1&&(he={direction:this._staticArgs.direction,unit:this._staticArgs.unit,select:this._staticArgs.select,value:ue.pageSize||ie.cursorConfig.pageSize}),ie.model.pushStackElement(),ie.setCursorStates(ue.source,3,n.CursorMoveCommands.simpleMove(ie,ie.getCursorStates(),he.direction,he.select,he.value,he.unit)),ie.revealAllCursors(ue.source,!0)}}A.CursorLeft=(0,y.registerEditorCommand)(new W({args:{direction:0,unit:0,select:!1,value:1},id:"cursorLeft",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:15,mac:{primary:15,secondary:[288]}}})),A.CursorLeftSelect=(0,y.registerEditorCommand)(new W({args:{direction:0,unit:0,select:!0,value:1},id:"cursorLeftSelect",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:1039}})),A.CursorRight=(0,y.registerEditorCommand)(new W({args:{direction:1,unit:0,select:!1,value:1},id:"cursorRight",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:17,mac:{primary:17,secondary:[292]}}})),A.CursorRightSelect=(0,y.registerEditorCommand)(new W({args:{direction:1,unit:0,select:!0,value:1},id:"cursorRightSelect",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:1041}})),A.CursorUp=(0,y.registerEditorCommand)(new W({args:{direction:2,unit:2,select:!1,value:1},id:"cursorUp",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:16,mac:{primary:16,secondary:[302]}}})),A.CursorUpSelect=(0,y.registerEditorCommand)(new W({args:{direction:2,unit:2,select:!0,value:1},id:"cursorUpSelect",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:1040,secondary:[3088],mac:{primary:1040},linux:{primary:1040}}})),A.CursorPageUp=(0,y.registerEditorCommand)(new W({args:{direction:2,unit:2,select:!1,value:-1},id:"cursorPageUp",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:11}})),A.CursorPageUpSelect=(0,y.registerEditorCommand)(new W({args:{direction:2,unit:2,select:!0,value:-1},id:"cursorPageUpSelect",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:1035}})),A.CursorDown=(0,y.registerEditorCommand)(new W({args:{direction:3,unit:2,select:!1,value:1},id:"cursorDown",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:18,mac:{primary:18,secondary:[300]}}})),A.CursorDownSelect=(0,y.registerEditorCommand)(new W({args:{direction:3,unit:2,select:!0,value:1},id:"cursorDownSelect",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:1042,secondary:[3090],mac:{primary:1042},linux:{primary:1042}}})),A.CursorPageDown=(0,y.registerEditorCommand)(new W({args:{direction:3,unit:2,select:!1,value:-1},id:"cursorPageDown",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:12}})),A.CursorPageDownSelect=(0,y.registerEditorCommand)(new W({args:{direction:3,unit:2,select:!0,value:-1},id:"cursorPageDownSelect",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:1036}})),A.CreateCursor=(0,y.registerEditorCommand)(new class extends u{constructor(){super({id:"createCursor",precondition:void 0})}runCoreEditorCommand(J,ie){if(!ie.position)return;let ue;ie.wholeLine?ue=n.CursorMoveCommands.line(J,J.getPrimaryCursorState(),!1,ie.position,ie.viewPosition):ue=n.CursorMoveCommands.moveTo(J,J.getPrimaryCursorState(),!1,ie.position,ie.viewPosition);const he=J.getCursorStates();if(he.length>1){const pe=ue.modelState?ue.modelState.position:null,ae=ue.viewState?ue.viewState.position:null;for(let ee=0,de=he.length;eeae&&(pe=ae);const ee=new i.Range(pe,1,pe,J.model.getLineMaxColumn(pe));let de=0;if(ue.at)switch(ue.at){case f.RawAtArgument.Top:de=3;break;case f.RawAtArgument.Center:de=1;break;case f.RawAtArgument.Bottom:de=4;break;default:break}const ge=J.coordinatesConverter.convertModelRangeToViewRange(ee);J.revealRange(ie.source,!1,ge,de,0)}}),A.SelectAll=new class extends h{constructor(){super(y.SelectAllCommand)}runDOMCommand(J){k.isFirefox&&(J.focus(),J.select()),J.ownerDocument.execCommand("selectAll")}runEditorCommand(J,ie,ue){const he=ie._getViewModel();he&&this.runCoreEditorCommand(he,ue)}runCoreEditorCommand(J,ie){J.model.pushStackElement(),J.setCursorStates("keyboard",3,[n.CursorMoveCommands.selectAll(J,J.getPrimaryCursorState())])}},A.SetSelection=(0,y.registerEditorCommand)(new class extends u{constructor(){super({id:"setSelection",precondition:void 0})}runCoreEditorCommand(J,ie){ie.selection&&(J.model.pushStackElement(),J.setCursorStates(ie.source,3,[b.CursorState.fromModelSelection(ie.selection)]))}})})(v||(e.CoreNavigationCommands=v={}));const w=g.ContextKeyExpr.and(s.EditorContextKeys.textInputFocus,s.EditorContextKeys.columnSelection);function S(A,P){c.KeybindingsRegistry.registerKeybindingRule({id:A,primary:P,when:w,weight:r+1})}S(v.CursorColumnSelectLeft.id,1039),S(v.CursorColumnSelectRight.id,1041),S(v.CursorColumnSelectUp.id,1040),S(v.CursorColumnSelectPageUp.id,1035),S(v.CursorColumnSelectDown.id,1042),S(v.CursorColumnSelectPageDown.id,1036);function L(A){return A.register(),A}var D;(function(A){class P extends y.EditorCommand{runEditorCommand(O,F,x){const W=F._getViewModel();W&&this.runCoreEditingCommand(F,W,x||{})}}A.CoreEditingCommand=P,A.LineBreakInsert=(0,y.registerEditorCommand)(new class extends P{constructor(){super({id:"lineBreakInsert",precondition:s.EditorContextKeys.writable,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:0,mac:{primary:301}}})}runCoreEditingCommand(N,O,F){N.pushUndoStop(),N.executeCommands(this.id,a.EnterOperation.lineBreakInsert(O.cursorConfig,O.model,O.getCursorStates().map(x=>x.modelState.selection)))}}),A.Outdent=(0,y.registerEditorCommand)(new class extends P{constructor(){super({id:"outdent",precondition:s.EditorContextKeys.writable,kbOpts:{weight:r,kbExpr:g.ContextKeyExpr.and(s.EditorContextKeys.editorTextFocus,s.EditorContextKeys.tabDoesNotMoveFocus),primary:1026}})}runCoreEditingCommand(N,O,F){N.pushUndoStop(),N.executeCommands(this.id,o.TypeOperations.outdent(O.cursorConfig,O.model,O.getCursorStates().map(x=>x.modelState.selection))),N.pushUndoStop()}}),A.Tab=(0,y.registerEditorCommand)(new class extends P{constructor(){super({id:"tab",precondition:s.EditorContextKeys.writable,kbOpts:{weight:r,kbExpr:g.ContextKeyExpr.and(s.EditorContextKeys.editorTextFocus,s.EditorContextKeys.tabDoesNotMoveFocus),primary:2}})}runCoreEditingCommand(N,O,F){N.pushUndoStop(),N.executeCommands(this.id,o.TypeOperations.tab(O.cursorConfig,O.model,O.getCursorStates().map(x=>x.modelState.selection))),N.pushUndoStop()}}),A.DeleteLeft=(0,y.registerEditorCommand)(new class extends P{constructor(){super({id:"deleteLeft",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:1,secondary:[1025],mac:{primary:1,secondary:[1025,294,257]}}})}runCoreEditingCommand(N,O,F){const[x,W]=p.DeleteOperations.deleteLeft(O.getPrevEditOperationType(),O.cursorConfig,O.model,O.getCursorStates().map(V=>V.modelState.selection),O.getCursorAutoClosedCharacters());x&&N.pushUndoStop(),N.executeCommands(this.id,W),O.setPrevEditOperationType(2)}}),A.DeleteRight=(0,y.registerEditorCommand)(new class extends P{constructor(){super({id:"deleteRight",precondition:void 0,kbOpts:{weight:r,kbExpr:s.EditorContextKeys.textInputFocus,primary:20,mac:{primary:20,secondary:[290,276]}}})}runCoreEditingCommand(N,O,F){const[x,W]=p.DeleteOperations.deleteRight(O.getPrevEditOperationType(),O.cursorConfig,O.model,O.getCursorStates().map(V=>V.modelState.selection));x&&N.pushUndoStop(),N.executeCommands(this.id,W),O.setPrevEditOperationType(3)}}),A.Undo=new class extends h{constructor(){super(y.UndoCommand)}runDOMCommand(N){N.ownerDocument.execCommand("undo")}runEditorCommand(N,O,F){if(!(!O.hasModel()||O.getOption(92)===!0))return O.getModel().undo()}},A.Redo=new class extends h{constructor(){super(y.RedoCommand)}runDOMCommand(N){N.ownerDocument.execCommand("redo")}runEditorCommand(N,O,F){if(!(!O.hasModel()||O.getOption(92)===!0))return O.getModel().redo()}}})(D||(e.CoreEditingCommands=D={}));class T extends y.Command{constructor(P,N,O){super({id:P,precondition:void 0,metadata:O}),this._handlerId=N}runCommand(P,N){const O=P.get(m.ICodeEditorService).getFocusedCodeEditor();O&&O.trigger("keyboard",this._handlerId,N)}}function M(A,P){L(new T("default:"+A,A)),L(new T(A,A,P))}M("type",{description:"Type",args:[{name:"args",schema:{type:"object",required:["text"],properties:{text:{type:"string"}}}}]}),M("replacePreviousChar"),M("compositionType"),M("compositionStart"),M("compositionEnd"),M("paste"),M("cut")}),define(ne[725],se([1,0,266,15]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarkerDecorationsContribution=void 0;let I=class{static{this.ID="editor.contrib.markerDecorations"}constructor(y,m){}dispose(){}};e.MarkerDecorationsContribution=I,e.MarkerDecorationsContribution=I=ke([ce(1,d.IMarkerDecorationsService)],I),(0,k.registerEditorContribution)(I.ID,I,0)}),define(ne[726],se([1,0,214,9,16]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewController=void 0;class E{constructor(m,_,b,p){this.configuration=m,this.viewModel=_,this.userInputEvents=b,this.commandDelegate=p}paste(m,_,b,p){this.commandDelegate.paste(m,_,b,p)}type(m){this.commandDelegate.type(m)}compositionType(m,_,b,p){this.commandDelegate.compositionType(m,_,b,p)}compositionStart(){this.commandDelegate.startComposition()}compositionEnd(){this.commandDelegate.endComposition()}cut(){this.commandDelegate.cut()}setSelection(m){d.CoreNavigationCommands.SetSelection.runCoreEditorCommand(this.viewModel,{source:"keyboard",selection:m})}_validateViewColumn(m){const _=this.viewModel.getLineMinColumn(m.lineNumber);return m.column<_?new k.Position(m.lineNumber,_):m}_hasMulticursorModifier(m){switch(this.configuration.options.get(78)){case"altKey":return m.altKey;case"ctrlKey":return m.ctrlKey;case"metaKey":return m.metaKey;default:return!1}}_hasNonMulticursorModifier(m){switch(this.configuration.options.get(78)){case"altKey":return m.ctrlKey||m.metaKey;case"ctrlKey":return m.altKey||m.metaKey;case"metaKey":return m.ctrlKey||m.altKey;default:return!1}}dispatchMouse(m){const _=this.configuration.options,b=I.isLinux&&_.get(108),p=_.get(22);m.middleButton&&!b?this._columnSelect(m.position,m.mouseColumn,m.inSelectionMode):m.startedOnLineNumbers?this._hasMulticursorModifier(m)?m.inSelectionMode?this._lastCursorLineSelect(m.position,m.revealType):this._createCursor(m.position,!0):m.inSelectionMode?this._lineSelectDrag(m.position,m.revealType):this._lineSelect(m.position,m.revealType):m.mouseDownCount>=4?this._selectAll():m.mouseDownCount===3?this._hasMulticursorModifier(m)?m.inSelectionMode?this._lastCursorLineSelectDrag(m.position,m.revealType):this._lastCursorLineSelect(m.position,m.revealType):m.inSelectionMode?this._lineSelectDrag(m.position,m.revealType):this._lineSelect(m.position,m.revealType):m.mouseDownCount===2?m.onInjectedText||(this._hasMulticursorModifier(m)?this._lastCursorWordSelect(m.position,m.revealType):m.inSelectionMode?this._wordSelectDrag(m.position,m.revealType):this._wordSelect(m.position,m.revealType)):this._hasMulticursorModifier(m)?this._hasNonMulticursorModifier(m)||(m.shiftKey?this._columnSelect(m.position,m.mouseColumn,!0):m.inSelectionMode?this._lastCursorMoveToSelect(m.position,m.revealType):this._createCursor(m.position,!1)):m.inSelectionMode?m.altKey?this._columnSelect(m.position,m.mouseColumn,!0):p?this._columnSelect(m.position,m.mouseColumn,!0):this._moveToSelect(m.position,m.revealType):this.moveTo(m.position,m.revealType)}_usualArgs(m,_){return m=this._validateViewColumn(m),{source:"mouse",position:this._convertViewToModelPosition(m),viewPosition:m,revealType:_}}moveTo(m,_){d.CoreNavigationCommands.MoveTo.runCoreEditorCommand(this.viewModel,this._usualArgs(m,_))}_moveToSelect(m,_){d.CoreNavigationCommands.MoveToSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(m,_))}_columnSelect(m,_,b){m=this._validateViewColumn(m),d.CoreNavigationCommands.ColumnSelect.runCoreEditorCommand(this.viewModel,{source:"mouse",position:this._convertViewToModelPosition(m),viewPosition:m,mouseColumn:_,doColumnSelect:b})}_createCursor(m,_){m=this._validateViewColumn(m),d.CoreNavigationCommands.CreateCursor.runCoreEditorCommand(this.viewModel,{source:"mouse",position:this._convertViewToModelPosition(m),viewPosition:m,wholeLine:_})}_lastCursorMoveToSelect(m,_){d.CoreNavigationCommands.LastCursorMoveToSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(m,_))}_wordSelect(m,_){d.CoreNavigationCommands.WordSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(m,_))}_wordSelectDrag(m,_){d.CoreNavigationCommands.WordSelectDrag.runCoreEditorCommand(this.viewModel,this._usualArgs(m,_))}_lastCursorWordSelect(m,_){d.CoreNavigationCommands.LastCursorWordSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(m,_))}_lineSelect(m,_){d.CoreNavigationCommands.LineSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(m,_))}_lineSelectDrag(m,_){d.CoreNavigationCommands.LineSelectDrag.runCoreEditorCommand(this.viewModel,this._usualArgs(m,_))}_lastCursorLineSelect(m,_){d.CoreNavigationCommands.LastCursorLineSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(m,_))}_lastCursorLineSelectDrag(m,_){d.CoreNavigationCommands.LastCursorLineSelectDrag.runCoreEditorCommand(this.viewModel,this._usualArgs(m,_))}_selectAll(){d.CoreNavigationCommands.SelectAll.runCoreEditorCommand(this.viewModel,{source:"mouse"})}_convertViewToModelPosition(m){return this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(m)}emitKeyDown(m){this.userInputEvents.emitKeyDown(m)}emitKeyUp(m){this.userInputEvents.emitKeyUp(m)}emitContextMenu(m){this.userInputEvents.emitContextMenu(m)}emitMouseMove(m){this.userInputEvents.emitMouseMove(m)}emitMouseLeave(m){this.userInputEvents.emitMouseLeave(m)}emitMouseUp(m){this.userInputEvents.emitMouseUp(m)}emitMouseDown(m){this.userInputEvents.emitMouseDown(m)}emitMouseDrag(m){this.userInputEvents.emitMouseDrag(m)}emitMouseDrop(m){this.userInputEvents.emitMouseDrop(m)}emitMouseDropCanceled(){this.userInputEvents.emitMouseDropCanceled()}emitMouseWheel(m){this.userInputEvents.emitMouseWheel(m)}}e.ViewController=E}),define(ne[215],se([1,0,49,7,6,54,55,105,100,63]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";var p;Object.defineProperty(e,"__esModule",{value:!0}),e.WorkerBasedDocumentDiffProvider=e.WorkerBasedDiffProviderFactoryService=e.IDiffProviderFactoryService=void 0,e.IDiffProviderFactoryService=(0,k.createDecorator)("diffProviderFactoryService");let n=class{constructor(i){this.instantiationService=i}createDiffProvider(i){return this.instantiationService.createInstance(o,i)}};e.WorkerBasedDiffProviderFactoryService=n,e.WorkerBasedDiffProviderFactoryService=n=ke([ce(0,k.IInstantiationService)],n),(0,d.registerSingleton)(e.IDiffProviderFactoryService,n,1);let o=class{static{p=this}static{this.diffCache=new Map}constructor(i,s,g){this.editorWorkerService=s,this.telemetryService=g,this.onDidChangeEventEmitter=new I.Emitter,this.onDidChange=this.onDidChangeEventEmitter.event,this.diffAlgorithm="advanced",this.diffAlgorithmOnDidChangeSubscription=void 0,this.setOptions(i)}dispose(){this.diffAlgorithmOnDidChangeSubscription?.dispose()}async computeDiff(i,s,g,c){if(typeof this.diffAlgorithm!="string")return this.diffAlgorithm.computeDiff(i,s,g,c);if(i.isDisposed()||s.isDisposed())return{changes:[],identical:!0,quitEarly:!1,moves:[]};if(i.getLineCount()===1&&i.getLineMaxColumn(1)===1)return s.getLineCount()===1&&s.getLineMaxColumn(1)===1?{changes:[],identical:!0,quitEarly:!1,moves:[]}:{changes:[new m.DetailedLineRangeMapping(new y.LineRange(1,2),new y.LineRange(1,s.getLineCount()+1),[new m.RangeMapping(i.getFullModelRange(),s.getFullModelRange())])],identical:!1,quitEarly:!1,moves:[]};const l=JSON.stringify([i.uri.toString(),s.uri.toString()]),a=JSON.stringify([i.id,s.id,i.getAlternativeVersionId(),s.getAlternativeVersionId(),JSON.stringify(g)]),r=p.diffCache.get(l);if(r&&r.context===a)return r.result;const u=E.StopWatch.create(),C=await this.editorWorkerService.computeDiff(i.uri,s.uri,g,this.diffAlgorithm),f=u.elapsed();if(this.telemetryService.publicLog2("diffEditor.computeDiff",{timeMs:f,timedOut:C?.quitEarly??!0,detectedMoves:g.computeMoves?C?.moves.length??0:-1}),c.isCancellationRequested)return{changes:[],identical:!1,quitEarly:!0,moves:[]};if(!C)throw new Error("no diff result available");return p.diffCache.size>10&&p.diffCache.delete(p.diffCache.keys().next().value),p.diffCache.set(l,{result:C,context:a}),C}setOptions(i){let s=!1;i.diffAlgorithm&&this.diffAlgorithm!==i.diffAlgorithm&&(this.diffAlgorithmOnDidChangeSubscription?.dispose(),this.diffAlgorithmOnDidChangeSubscription=void 0,this.diffAlgorithm=i.diffAlgorithm,typeof i.diffAlgorithm!="string"&&(this.diffAlgorithmOnDidChangeSubscription=i.diffAlgorithm.onDidChange(()=>this.onDidChangeEventEmitter.fire())),s=!0),s&&this.onDidChangeEventEmitter.fire()}};e.WorkerBasedDocumentDiffProvider=o,e.WorkerBasedDocumentDiffProvider=o=p=ke([ce(1,_.IEditorWorkerService),ce(2,b.ITelemetryService)],o)}),define(ne[407],se([1,0,14,18,2,21,215,88,171,55,317,105,200,319,315,19,13,90]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UnchangedRegion=e.DiffMapping=e.DiffState=e.DiffEditorViewModel=void 0;let l=class extends I.Disposable{setActiveMovedText(S){this._activeMovedText.set(S,void 0)}constructor(S,L,D){super(),this.model=S,this._options=L,this._diffProviderFactoryService=D,this._isDiffUpToDate=(0,E.observableValue)(this,!1),this.isDiffUpToDate=this._isDiffUpToDate,this._diff=(0,E.observableValue)(this,void 0),this.diff=this._diff,this._unchangedRegions=(0,E.observableValue)(this,void 0),this.unchangedRegions=(0,E.derived)(this,P=>this._options.hideUnchangedRegions.read(P)?this._unchangedRegions.read(P)?.regions??[]:((0,E.transaction)(N=>{for(const O of this._unchangedRegions.get()?.regions||[])O.collapseAll(N)}),[])),this.movedTextToCompare=(0,E.observableValue)(this,void 0),this._activeMovedText=(0,E.observableValue)(this,void 0),this._hoveredMovedText=(0,E.observableValue)(this,void 0),this.activeMovedText=(0,E.derived)(this,P=>this.movedTextToCompare.read(P)??this._hoveredMovedText.read(P)??this._activeMovedText.read(P)),this._cancellationTokenSource=new k.CancellationTokenSource,this._diffProvider=(0,E.derived)(this,P=>{const N=this._diffProviderFactoryService.createDiffProvider({diffAlgorithm:this._options.diffAlgorithm.read(P)}),O=(0,E.observableSignalFromEvent)("onDidChange",N.onDidChange);return{diffProvider:N,onChangeSignal:O}}),this._register((0,I.toDisposable)(()=>this._cancellationTokenSource.cancel()));const T=(0,E.observableSignal)("contentChangedSignal"),M=this._register(new d.RunOnceScheduler(()=>T.trigger(void 0),200));this._register((0,E.autorun)(P=>{const N=this._unchangedRegions.read(P);if(!N||N.regions.some(q=>q.isDragged.read(P)))return;const O=N.originalDecorationIds.map(q=>S.original.getDecorationRange(q)).map(q=>q?b.LineRange.fromRangeInclusive(q):void 0),F=N.modifiedDecorationIds.map(q=>S.modified.getDecorationRange(q)).map(q=>q?b.LineRange.fromRangeInclusive(q):void 0),x=N.regions.map((q,H)=>!O[H]||!F[H]?void 0:new f(O[H].startLineNumber,F[H].startLineNumber,O[H].length,q.visibleLineCountTop.read(P),q.visibleLineCountBottom.read(P))).filter(s.isDefined),W=[];let V=!1;for(const q of(0,g.groupAdjacentBy)(x,(H,z)=>H.getHiddenModifiedRange(P).endLineNumberExclusive===z.getHiddenModifiedRange(P).startLineNumber))if(q.length>1){V=!0;const H=q.reduce((U,j)=>U+j.lineCount,0),z=new f(q[0].originalLineNumber,q[0].modifiedLineNumber,H,q[0].visibleLineCountTop.get(),q[q.length-1].visibleLineCountBottom.get());W.push(z)}else W.push(q[0]);if(V){const q=S.original.deltaDecorations(N.originalDecorationIds,W.map(z=>({range:z.originalUnchangedRange.toInclusiveRange(),options:{description:"unchanged"}}))),H=S.modified.deltaDecorations(N.modifiedDecorationIds,W.map(z=>({range:z.modifiedUnchangedRange.toInclusiveRange(),options:{description:"unchanged"}})));(0,E.transaction)(z=>{this._unchangedRegions.set({regions:W,originalDecorationIds:q,modifiedDecorationIds:H},z)})}}));const A=(P,N,O)=>{const F=f.fromDiffs(P.changes,S.original.getLineCount(),S.modified.getLineCount(),this._options.hideUnchangedRegionsMinimumLineCount.read(O),this._options.hideUnchangedRegionsContextLineCount.read(O));let x;const W=this._unchangedRegions.get();if(W){const z=W.originalDecorationIds.map(G=>S.original.getDecorationRange(G)).map(G=>G?b.LineRange.fromRangeInclusive(G):void 0),U=W.modifiedDecorationIds.map(G=>S.modified.getDecorationRange(G)).map(G=>G?b.LineRange.fromRangeInclusive(G):void 0);let Y=(0,m.filterWithPrevious)(W.regions.map((G,K)=>{if(!z[K]||!U[K])return;const R=z[K].length;return new f(z[K].startLineNumber,U[K].startLineNumber,R,Math.min(G.visibleLineCountTop.get(),R),Math.min(G.visibleLineCountBottom.get(),R-G.visibleLineCountTop.get()))}).filter(s.isDefined),(G,K)=>!K||G.modifiedLineNumber>=K.modifiedLineNumber+K.lineCount&&G.originalLineNumber>=K.originalLineNumber+K.lineCount).map(G=>new n.LineRangeMapping(G.getHiddenOriginalRange(O),G.getHiddenModifiedRange(O)));Y=n.LineRangeMapping.clip(Y,b.LineRange.ofLength(1,S.original.getLineCount()),b.LineRange.ofLength(1,S.modified.getLineCount())),x=n.LineRangeMapping.inverse(Y,S.original.getLineCount(),S.modified.getLineCount())}const V=[];if(x)for(const z of F){const U=x.filter(j=>j.original.intersectsStrict(z.originalUnchangedRange)&&j.modified.intersectsStrict(z.modifiedUnchangedRange));V.push(...z.setVisibleRanges(U,N))}else V.push(...F);const q=S.original.deltaDecorations(W?.originalDecorationIds||[],V.map(z=>({range:z.originalUnchangedRange.toInclusiveRange(),options:{description:"unchanged"}}))),H=S.modified.deltaDecorations(W?.modifiedDecorationIds||[],V.map(z=>({range:z.modifiedUnchangedRange.toInclusiveRange(),options:{description:"unchanged"}})));this._unchangedRegions.set({regions:V,originalDecorationIds:q,modifiedDecorationIds:H},N)};this._register(S.modified.onDidChangeContent(P=>{if(this._diff.get()){const O=o.TextEditInfo.fromModelContentChanges(P.changes),F=(this._lastDiff,S.original,S.modified,void 0);F&&(this._lastDiff=F,(0,E.transaction)(x=>{this._diff.set(u.fromDiffResult(this._lastDiff),x),A(F,x);const W=this.movedTextToCompare.get();this.movedTextToCompare.set(W?this._lastDiff.moves.find(V=>V.lineRangeMapping.modified.intersect(W.lineRangeMapping.modified)):void 0,x)}))}this._isDiffUpToDate.set(!1,void 0),M.schedule()})),this._register(S.original.onDidChangeContent(P=>{if(this._diff.get()){const O=o.TextEditInfo.fromModelContentChanges(P.changes),F=(this._lastDiff,S.original,S.modified,void 0);F&&(this._lastDiff=F,(0,E.transaction)(x=>{this._diff.set(u.fromDiffResult(this._lastDiff),x),A(F,x);const W=this.movedTextToCompare.get();this.movedTextToCompare.set(W?this._lastDiff.moves.find(V=>V.lineRangeMapping.modified.intersect(W.lineRangeMapping.modified)):void 0,x)}))}this._isDiffUpToDate.set(!1,void 0),M.schedule()})),this._register((0,E.autorunWithStore)(async(P,N)=>{this._options.hideUnchangedRegionsMinimumLineCount.read(P),this._options.hideUnchangedRegionsContextLineCount.read(P),M.cancel(),T.read(P);const O=this._diffProvider.read(P);O.onChangeSignal.read(P),(0,_.readHotReloadableExport)(p.DefaultLinesDiffComputer,P),(0,_.readHotReloadableExport)(i.optimizeSequenceDiffs,P),this._isDiffUpToDate.set(!1,void 0);let F=[];N.add(S.original.onDidChangeContent(V=>{const q=o.TextEditInfo.fromModelContentChanges(V.changes);F=(0,t.combineTextEditInfos)(F,q)}));let x=[];N.add(S.modified.onDidChangeContent(V=>{const q=o.TextEditInfo.fromModelContentChanges(V.changes);x=(0,t.combineTextEditInfos)(x,q)}));let W=await O.diffProvider.computeDiff(S.original,S.modified,{ignoreTrimWhitespace:this._options.ignoreTrimWhitespace.read(P),maxComputationTimeMs:this._options.maxComputationTimeMs.read(P),computeMoves:this._options.showMoves.read(P)},this._cancellationTokenSource.token);this._cancellationTokenSource.token.isCancellationRequested||S.original.isDisposed()||S.modified.isDisposed()||(W=a(W,S.original,S.modified),W=(S.original,S.modified,void 0)??W,W=(S.original,S.modified,void 0)??W,(0,E.transaction)(V=>{A(W,V),this._lastDiff=W;const q=u.fromDiffResult(W);this._diff.set(q,V),this._isDiffUpToDate.set(!0,V);const H=this.movedTextToCompare.get();this.movedTextToCompare.set(H?this._lastDiff.moves.find(z=>z.lineRangeMapping.modified.intersect(H.lineRangeMapping.modified)):void 0,V)}))}))}ensureModifiedLineIsVisible(S,L,D){if(this.diff.get()?.mappings.length===0)return;const T=this._unchangedRegions.get()?.regions||[];for(const M of T)if(M.getHiddenModifiedRange(void 0).contains(S)){M.showModifiedLine(S,L,D);return}}ensureOriginalLineIsVisible(S,L,D){if(this.diff.get()?.mappings.length===0)return;const T=this._unchangedRegions.get()?.regions||[];for(const M of T)if(M.getHiddenOriginalRange(void 0).contains(S)){M.showOriginalLine(S,L,D);return}}async waitForDiff(){await(0,E.waitForState)(this.isDiffUpToDate,S=>S)}serializeState(){return{collapsedRegions:this._unchangedRegions.get()?.regions.map(L=>({range:L.getHiddenModifiedRange(void 0).serialize()}))}}restoreSerializedState(S){const L=S.collapsedRegions?.map(T=>b.LineRange.deserialize(T.range)),D=this._unchangedRegions.get();!D||!L||(0,E.transaction)(T=>{for(const M of D.regions)for(const A of L)if(M.modifiedUnchangedRange.intersect(A)){M.setHiddenModifiedRange(A,T);break}})}};e.DiffEditorViewModel=l,e.DiffEditorViewModel=l=ke([ce(2,y.IDiffProviderFactoryService)],l);function a(w,S,L){return{changes:w.changes.map(D=>new n.DetailedLineRangeMapping(D.original,D.modified,D.innerChanges?D.innerChanges.map(T=>r(T,S,L)):void 0)),moves:w.moves,identical:w.identical,quitEarly:w.quitEarly}}function r(w,S,L){let D=w.originalRange,T=w.modifiedRange;return D.startColumn===1&&T.startColumn===1&&(D.endColumn!==1||T.endColumn!==1)&&D.endColumn===S.getLineMaxColumn(D.endLineNumber)&&T.endColumn===L.getLineMaxColumn(T.endLineNumber)&&D.endLineNumbernew C(L)),S.moves||[],S.identical,S.quitEarly)}constructor(S,L,D,T){this.mappings=S,this.movedTexts=L,this.identical=D,this.quitEarly=T}}e.DiffState=u;class C{constructor(S){this.lineRangeMapping=S}}e.DiffMapping=C;class f{static fromDiffs(S,L,D,T,M){const A=n.DetailedLineRangeMapping.inverse(S,L,D),P=[];for(const N of A){let O=N.original.startLineNumber,F=N.modified.startLineNumber,x=N.original.length;const W=O===1&&F===1,V=O+x===L+1&&F+x===D+1;(W||V)&&x>=M+T?(W&&!V&&(x-=M),V&&!W&&(O+=M,F+=M,x-=M),P.push(new f(O,F,x,0,0))):x>=M*2+T&&(O+=M,F+=M,x-=M*2,P.push(new f(O,F,x,0,0)))}return P}get originalUnchangedRange(){return b.LineRange.ofLength(this.originalLineNumber,this.lineCount)}get modifiedUnchangedRange(){return b.LineRange.ofLength(this.modifiedLineNumber,this.lineCount)}constructor(S,L,D,T,M){this.originalLineNumber=S,this.modifiedLineNumber=L,this.lineCount=D,this._visibleLineCountTop=(0,E.observableValue)(this,0),this.visibleLineCountTop=this._visibleLineCountTop,this._visibleLineCountBottom=(0,E.observableValue)(this,0),this.visibleLineCountBottom=this._visibleLineCountBottom,this._shouldHideControls=(0,E.derived)(this,N=>this.visibleLineCountTop.read(N)+this.visibleLineCountBottom.read(N)===this.lineCount&&!this.isDragged.read(N)),this.isDragged=(0,E.observableValue)(this,void 0);const A=Math.max(Math.min(T,this.lineCount),0),P=Math.max(Math.min(M,this.lineCount-T),0);(0,c.softAssert)(T===A),(0,c.softAssert)(M===P),this._visibleLineCountTop.set(A,void 0),this._visibleLineCountBottom.set(P,void 0)}setVisibleRanges(S,L){const D=[],T=new b.LineRangeSet(S.map(N=>N.modified)).subtractFrom(this.modifiedUnchangedRange);let M=this.originalLineNumber,A=this.modifiedLineNumber;const P=this.modifiedLineNumber+this.lineCount;if(T.ranges.length===0)this.showAll(L),D.push(this);else{let N=0;for(const O of T.ranges){const F=N===T.ranges.length-1;N++;const x=(F?P:O.endLineNumberExclusive)-A,W=new f(M,A,x,0,0);W.setHiddenModifiedRange(O,L),D.push(W),M=W.originalUnchangedRange.endLineNumberExclusive,A=W.modifiedUnchangedRange.endLineNumberExclusive}}return D}shouldHideControls(S){return this._shouldHideControls.read(S)}getHiddenOriginalRange(S){return b.LineRange.ofLength(this.originalLineNumber+this._visibleLineCountTop.read(S),this.lineCount-this._visibleLineCountTop.read(S)-this._visibleLineCountBottom.read(S))}getHiddenModifiedRange(S){return b.LineRange.ofLength(this.modifiedLineNumber+this._visibleLineCountTop.read(S),this.lineCount-this._visibleLineCountTop.read(S)-this._visibleLineCountBottom.read(S))}setHiddenModifiedRange(S,L){const D=S.startLineNumber-this.modifiedLineNumber,T=this.modifiedLineNumber+this.lineCount-S.endLineNumberExclusive;this.setState(D,T,L)}getMaxVisibleLineCountTop(){return this.lineCount-this._visibleLineCountBottom.get()}getMaxVisibleLineCountBottom(){return this.lineCount-this._visibleLineCountTop.get()}showMoreAbove(S=10,L){const D=this.getMaxVisibleLineCountTop();this._visibleLineCountTop.set(Math.min(this._visibleLineCountTop.get()+S,D),L)}showMoreBelow(S=10,L){const D=this.lineCount-this._visibleLineCountTop.get();this._visibleLineCountBottom.set(Math.min(this._visibleLineCountBottom.get()+S,D),L)}showAll(S){this._visibleLineCountBottom.set(this.lineCount-this._visibleLineCountTop.get(),S)}showModifiedLine(S,L,D){const T=S+1-(this.modifiedLineNumber+this._visibleLineCountTop.get()),M=this.modifiedLineNumber-this._visibleLineCountBottom.get()+this.lineCount-S;L===0&&Tthis.selectionAnchorSetContextKey.reset())}setSelectionAnchor(){if(this.editor.hasModel()){const c=this.editor.getPosition();this.editor.changeDecorations(l=>{this.decorationId&&l.removeDecoration(this.decorationId),this.decorationId=l.addDecoration(y.Selection.fromPositions(c,c),{description:"selection-anchor",stickiness:1,hoverMessage:new k.MarkdownString().appendText((0,_.localize)(710,"Selection Anchor")),className:"selection-anchor"})}),this.selectionAnchorSetContextKey.set(!!this.decorationId),(0,d.alert)((0,_.localize)(711,"Anchor set at {0}:{1}",c.lineNumber,c.column))}}goToSelectionAnchor(){if(this.editor.hasModel()&&this.decorationId){const c=this.editor.getModel().getDecorationRange(this.decorationId);c&&this.editor.setPosition(c.getStartPosition())}}selectFromAnchorToCursor(){if(this.editor.hasModel()&&this.decorationId){const c=this.editor.getModel().getDecorationRange(this.decorationId);if(c){const l=this.editor.getPosition();this.editor.setSelection(y.Selection.fromPositions(c.getStartPosition(),l)),this.cancelSelectionAnchor()}}}cancelSelectionAnchor(){if(this.decorationId){const c=this.decorationId;this.editor.changeDecorations(l=>{l.removeDecoration(c),this.decorationId=void 0}),this.selectionAnchorSetContextKey.set(!1)}}dispose(){this.cancelSelectionAnchor(),this.modelChangeListener.dispose()}};n=p=ke([ce(1,b.IContextKeyService)],n);class o extends E.EditorAction{constructor(){super({id:"editor.action.setSelectionAnchor",label:(0,_.localize)(712,"Set Selection Anchor"),alias:"Set Selection Anchor",precondition:void 0,kbOpts:{kbExpr:m.EditorContextKeys.editorTextFocus,primary:(0,I.KeyChord)(2089,2080),weight:100}})}async run(c,l){n.get(l)?.setSelectionAnchor()}}class t extends E.EditorAction{constructor(){super({id:"editor.action.goToSelectionAnchor",label:(0,_.localize)(713,"Go to Selection Anchor"),alias:"Go to Selection Anchor",precondition:e.SelectionAnchorSet})}async run(c,l){n.get(l)?.goToSelectionAnchor()}}class i extends E.EditorAction{constructor(){super({id:"editor.action.selectFromAnchorToCursor",label:(0,_.localize)(714,"Select from Anchor to Cursor"),alias:"Select from Anchor to Cursor",precondition:e.SelectionAnchorSet,kbOpts:{kbExpr:m.EditorContextKeys.editorTextFocus,primary:(0,I.KeyChord)(2089,2089),weight:100}})}async run(c,l){n.get(l)?.selectFromAnchorToCursor()}}class s extends E.EditorAction{constructor(){super({id:"editor.action.cancelSelectionAnchor",label:(0,_.localize)(715,"Cancel Selection Anchor"),alias:"Cancel Selection Anchor",precondition:e.SelectionAnchorSet,kbOpts:{kbExpr:m.EditorContextKeys.editorTextFocus,primary:9,weight:100}})}async run(c,l){n.get(l)?.cancelSelectionAnchor()}}(0,E.registerEditorContribution)(n.ID,n,4),(0,E.registerEditorAction)(o),(0,E.registerEditorAction)(t),(0,E.registerEditorAction)(i),(0,E.registerEditorAction)(s)}),define(ne[728],se([1,0,15,20,607,3]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class y extends d.EditorAction{constructor(p,n){super(n),this.left=p}run(p,n){if(!n.hasModel())return;const o=[],t=n.getSelections();for(const i of t)o.push(new I.MoveCaretCommand(i,this.left));n.pushUndoStop(),n.executeCommands(this.id,o),n.pushUndoStop()}}class m extends y{constructor(){super(!0,{id:"editor.action.moveCarretLeftAction",label:E.localize(722,"Move Selected Text Left"),alias:"Move Selected Text Left",precondition:k.EditorContextKeys.writable})}}class _ extends y{constructor(){super(!1,{id:"editor.action.moveCarretRightAction",label:E.localize(723,"Move Selected Text Right"),alias:"Move Selected Text Right",precondition:k.EditorContextKeys.writable})}}(0,d.registerEditorAction)(m),(0,d.registerEditorAction)(_)}),define(ne[729],se([1,0,15,146,233,4,20,3]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class _ extends d.EditorAction{constructor(){super({id:"editor.action.transposeLetters",label:m.localize(724,"Transpose Letters"),alias:"Transpose Letters",precondition:y.EditorContextKeys.writable,kbOpts:{kbExpr:y.EditorContextKeys.textInputFocus,primary:0,mac:{primary:306},weight:100}})}run(p,n){if(!n.hasModel())return;const o=n.getModel(),t=[],i=n.getSelections();for(const s of i){if(!s.isEmpty())continue;const g=s.startLineNumber,c=s.startColumn,l=o.getLineMaxColumn(g);if(g===1&&(c===1||c===2&&l===2))continue;const a=c===l?s.getPosition():I.MoveOperations.rightPosition(o,s.getPosition().lineNumber,s.getPosition().column),r=I.MoveOperations.leftPosition(o,a),u=I.MoveOperations.leftPosition(o,r),C=o.getValueInRange(E.Range.fromPositions(u,r)),f=o.getValueInRange(E.Range.fromPositions(r,a)),h=E.Range.fromPositions(u,a);t.push(new k.ReplaceCommand(h,f+C))}t.length>0&&(n.pushUndoStop(),n.executeCommands(this.id,t),n.pushUndoStop())}}(0,d.registerEditorAction)(_)}),define(ne[730],se([1,0,72,15,4,20,36,333,609,3,29]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class n extends k.EditorAction{constructor(c,l){super(l),this._type=c}run(c,l){const a=c.get(y.ILanguageConfigurationService);if(!l.hasModel())return;const r=l.getModel(),u=[],C=r.getOptions(),f=l.getOption(23),h=l.getSelections().map((w,S)=>({selection:w,index:S,ignoreFirstLine:!1}));h.sort((w,S)=>I.Range.compareRangesUsingStarts(w.selection,S.selection));let v=h[0];for(let w=1;w{this._undoStack=[],this._redoStack=[]})),this._register(o.onDidChangeModelContent(t=>{this._undoStack=[],this._redoStack=[]})),this._register(o.onDidChangeCursorSelection(t=>{if(this._isCursorUndoRedo||!t.oldSelections||t.oldModelVersionId!==t.modelVersionId)return;const i=new y(t.oldSelections);this._undoStack.length>0&&this._undoStack[this._undoStack.length-1].cursorState.equals(i)||(this._undoStack.push(new m(i,o.getScrollTop(),o.getScrollLeft())),this._redoStack=[],this._undoStack.length>50&&this._undoStack.shift())}))}cursorUndo(){!this._editor.hasModel()||this._undoStack.length===0||(this._redoStack.push(new m(new y(this._editor.getSelections()),this._editor.getScrollTop(),this._editor.getScrollLeft())),this._applyState(this._undoStack.pop()))}cursorRedo(){!this._editor.hasModel()||this._redoStack.length===0||(this._undoStack.push(new m(new y(this._editor.getSelections()),this._editor.getScrollTop(),this._editor.getScrollLeft())),this._applyState(this._redoStack.pop()))}_applyState(o){this._isCursorUndoRedo=!0,this._editor.setSelections(o.cursorState.selections),this._editor.setScrollPosition({scrollTop:o.scrollTop,scrollLeft:o.scrollLeft}),this._isCursorUndoRedo=!1}}e.CursorUndoRedoController=_;class b extends k.EditorAction{constructor(){super({id:"cursorUndo",label:E.localize(821,"Cursor Undo"),alias:"Cursor Undo",precondition:void 0,kbOpts:{kbExpr:I.EditorContextKeys.textInputFocus,primary:2099,weight:100}})}run(o,t,i){_.get(t)?.cursorUndo()}}e.CursorUndo=b;class p extends k.EditorAction{constructor(){super({id:"cursorRedo",label:E.localize(822,"Cursor Redo"),alias:"Cursor Redo",precondition:void 0})}run(o,t,i){_.get(t)?.cursorRedo()}}e.CursorRedo=p,(0,k.registerEditorContribution)(_.ID,_,0),(0,k.registerEditorAction)(b),(0,k.registerEditorAction)(p)}),define(ne[732],se([1,0,15,12,18,73,7,49,3]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorKeybindingCancellationTokenSource=void 0;const b=(0,y.createDecorator)("IEditorCancelService"),p=new k.RawContextKey("cancellableOperation",!1,(0,_.localize)(847,"Whether the editor runs a cancellable operation, e.g. like 'Peek References'"));(0,m.registerSingleton)(b,class{constructor(){this._tokens=new WeakMap}add(o,t){let i=this._tokens.get(o);i||(i=o.invokeWithinContext(g=>{const c=p.bindTo(g.get(k.IContextKeyService)),l=new E.LinkedList;return{key:c,tokens:l}}),this._tokens.set(o,i));let s;return i.key.set(!0),s=i.tokens.push(t),()=>{s&&(s(),i.key.set(!i.tokens.isEmpty()),s=void 0)}}cancel(o){const t=this._tokens.get(o);if(!t)return;const i=t.tokens.pop();i&&(i.cancel(),t.key.set(!t.tokens.isEmpty()))}},1);class n extends I.CancellationTokenSource{constructor(t,i){super(i),this.editor=t,this._unregister=t.invokeWithinContext(s=>s.get(b).add(t,this))}dispose(){this._unregister(),super.dispose()}}e.EditorKeybindingCancellationTokenSource=n,(0,d.registerEditorCommand)(new class extends d.EditorCommand{constructor(){super({id:"editor.cancelOperation",kbOpts:{weight:100,primary:9},precondition:p})}runEditorCommand(o,t){o.get(b).cancel(t)}})}),define(ne[122],se([1,0,11,4,18,2,732]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TextModelCancellationTokenSource=e.EditorStateCancellationTokenSource=e.EditorState=void 0;class m{constructor(n,o){if(this.flags=o,this.flags&1){const t=n.getModel();this.modelVersionId=t?d.format("{0}#{1}",t.uri.toString(),t.getVersionId()):null}else this.modelVersionId=null;this.flags&4?this.position=n.getPosition():this.position=null,this.flags&2?this.selection=n.getSelection():this.selection=null,this.flags&8?(this.scrollLeft=n.getScrollLeft(),this.scrollTop=n.getScrollTop()):(this.scrollLeft=-1,this.scrollTop=-1)}_equals(n){if(!(n instanceof m))return!1;const o=n;return!(this.modelVersionId!==o.modelVersionId||this.scrollLeft!==o.scrollLeft||this.scrollTop!==o.scrollTop||!this.position&&o.position||this.position&&!o.position||this.position&&o.position&&!this.position.equals(o.position)||!this.selection&&o.selection||this.selection&&!o.selection||this.selection&&o.selection&&!this.selection.equalsRange(o.selection))}validate(n){return this._equals(new m(n,this.flags))}}e.EditorState=m;class _ extends y.EditorKeybindingCancellationTokenSource{constructor(n,o,t,i){super(n,i),this._listener=new E.DisposableStore,o&4&&this._listener.add(n.onDidChangeCursorPosition(s=>{(!t||!k.Range.containsPosition(t,s.position))&&this.cancel()})),o&2&&this._listener.add(n.onDidChangeCursorSelection(s=>{(!t||!k.Range.containsRange(t,s.selection))&&this.cancel()})),o&8&&this._listener.add(n.onDidScrollChange(s=>this.cancel())),o&1&&(this._listener.add(n.onDidChangeModel(s=>this.cancel())),this._listener.add(n.onDidChangeModelContent(s=>this.cancel())))}dispose(){this._listener.dispose(),super.dispose()}}e.EditorStateCancellationTokenSource=_;class b extends I.CancellationTokenSource{constructor(n,o){super(o),this._listener=n.onDidChangeContent(()=>this.cancel())}dispose(){this._listener.dispose(),super.dispose()}}e.TextModelCancellationTokenSource=b}),define(ne[157],se([1,0,13,18,8,2,22,152,4,23,17,51,122,3,24,50,96,63,134,91]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ApplyCodeActionReason=e.fixAllCommandId=e.organizeImportsCommandId=e.sourceActionCommandId=e.refactorCommandId=e.autoFixCommandId=e.quickFixCommandId=e.codeActionCommandId=void 0,e.getCodeActions=C,e.applyCodeAction=S,e.codeActionCommandId="editor.action.codeAction",e.quickFixCommandId="editor.action.quickFix",e.autoFixCommandId="editor.action.autoFix",e.refactorCommandId="editor.action.refactor",e.sourceActionCommandId="editor.action.sourceAction",e.organizeImportsCommandId="editor.action.organizeImports",e.fixAllCommandId="editor.action.fixAll";class r extends E.Disposable{static codeActionsPreferredComparator(T,M){return T.isPreferred&&!M.isPreferred?-1:!T.isPreferred&&M.isPreferred?1:0}static codeActionsComparator({action:T},{action:M}){return T.isAI&&!M.isAI?1:!T.isAI&&M.isAI?-1:(0,d.isNonEmptyArray)(T.diagnostics)?(0,d.isNonEmptyArray)(M.diagnostics)?r.codeActionsPreferredComparator(T,M):-1:(0,d.isNonEmptyArray)(M.diagnostics)?1:r.codeActionsPreferredComparator(T,M)}constructor(T,M,A){super(),this.documentation=M,this._register(A),this.allActions=[...T].sort(r.codeActionsComparator),this.validActions=this.allActions.filter(({action:P})=>!P.disabled)}get hasAutoFix(){return this.validActions.some(({action:T})=>!!T.kind&&l.CodeActionKind.QuickFix.contains(new a.HierarchicalKind(T.kind))&&!!T.isPreferred)}get hasAIFix(){return this.validActions.some(({action:T})=>!!T.isAI)}get allAIFixes(){return this.validActions.every(({action:T})=>!!T.isAI)}}const u={actions:[],documentation:void 0};async function C(D,T,M,A,P,N){const O=A.filter||{},F={...O,excludes:[...O.excludes||[],l.CodeActionKind.Notebook]},x={only:O.include?.value,trigger:A.type},W=new o.TextModelCancellationTokenSource(T,N),V=A.type===2,q=f(D,T,V?F:O),H=new E.DisposableStore,z=q.map(async j=>{try{P.report(j);const Y=await j.provideCodeActions(T,M,x,W.token);if(Y&&H.add(Y),W.token.isCancellationRequested)return u;const G=(Y?.actions||[]).filter(R=>R&&(0,l.filtersAction)(O,R)),K=v(j,G,O.include);return{actions:G.map(R=>new l.CodeActionItem(R,j)),documentation:K}}catch(Y){if((0,I.isCancellationError)(Y))throw Y;return(0,I.onUnexpectedExternalError)(Y),u}}),U=D.onDidChange(()=>{const j=D.all(T);(0,d.equals)(j,q)||W.cancel()});try{const j=await Promise.all(z),Y=j.map(K=>K.actions).flat(),G=[...(0,d.coalesce)(j.map(K=>K.documentation)),...h(D,T,A,Y)];return new r(Y,G,H)}finally{U.dispose(),W.dispose()}}function f(D,T,M){return D.all(T).filter(A=>A.providedCodeActionKinds?A.providedCodeActionKinds.some(P=>(0,l.mayIncludeActionsOfKind)(M,new a.HierarchicalKind(P))):!0)}function*h(D,T,M,A){if(T&&A.length)for(const P of D.all(T))P._getAdditionalMenuItems&&(yield*P._getAdditionalMenuItems?.({trigger:M.type,only:M.filter?.include?.value},A.map(N=>N.action)))}function v(D,T,M){if(!D.documentation)return;const A=D.documentation.map(P=>({kind:new a.HierarchicalKind(P.kind),command:P.command}));if(M){let P;for(const N of A)N.kind.contains(M)&&(P?P.kind.contains(N.kind)&&(P=N):P=N);if(P)return P?.command}for(const P of T)if(P.kind){for(const N of A)if(N.kind.contains(new a.HierarchicalKind(P.kind)))return N.command}}var w;(function(D){D.OnSave="onSave",D.FromProblemsView="fromProblemsView",D.FromCodeActions="fromCodeActions",D.FromAILightbulb="fromAILightbulb"})(w||(e.ApplyCodeActionReason=w={}));async function S(D,T,M,A,P=k.CancellationToken.None){const N=D.get(m.IBulkEditService),O=D.get(i.ICommandService),F=D.get(c.ITelemetryService),x=D.get(s.INotificationService);if(F.publicLog2("codeAction.applyCodeAction",{codeActionTitle:T.action.title,codeActionKind:T.action.kind,codeActionIsPreferred:!!T.action.isPreferred,reason:M}),await T.resolve(P),!P.isCancellationRequested&&!(T.action.edit?.edits.length&&!(await N.apply(T.action.edit,{editor:A?.editor,label:T.action.title,quotableLabel:T.action.title,code:"undoredo.codeAction",respectAutoSaveConfig:M!==w.OnSave,showPreview:A?.preview})).isApplied)&&T.action.command)try{await O.executeCommand(T.action.command.id,...T.action.command.arguments||[])}catch(W){const V=L(W);x.error(typeof V=="string"?V:t.localize(742,"An unknown error occurred while applying the code action"))}}function L(D){return typeof D=="string"?D:D instanceof Error&&typeof D.message=="string"?D.message:void 0}i.CommandsRegistry.registerCommand("_executeCodeActionProvider",async function(D,T,M,A,P){if(!(T instanceof y.URI))throw(0,I.illegalArgument)();const{codeActionProvider:N}=D.get(p.ILanguageFeaturesService),O=D.get(n.IModelService).getModel(T);if(!O)throw(0,I.illegalArgument)();const F=b.Selection.isISelection(M)?b.Selection.liftSelection(M):_.Range.isIRange(M)?O.validateRange(M):void 0;if(!F)throw(0,I.illegalArgument)();const x=typeof A=="string"?new a.HierarchicalKind(A):void 0,W=await C(N,O,F,{type:1,triggerAction:l.CodeActionTriggerSource.Default,filter:{includeSourceActions:!0,include:x}},g.Progress.None,k.CancellationToken.None),V=[],q=Math.min(W.validActions.length,typeof P=="number"?P:0);for(let H=0;HH.action)}finally{setTimeout(()=>W.dispose(),100)}})}),define(ne[733],se([1,0,91,98,157,134,31]),function(oe,e,d,k,I,E,y){"use strict";var m;Object.defineProperty(e,"__esModule",{value:!0}),e.CodeActionKeybindingResolver=void 0;let _=class{static{m=this}static{this.codeActionCommands=[I.refactorCommandId,I.codeActionCommandId,I.sourceActionCommandId,I.organizeImportsCommandId,I.fixAllCommandId]}constructor(p){this.keybindingService=p}getResolver(){const p=new k.Lazy(()=>this.keybindingService.getKeybindings().filter(n=>m.codeActionCommands.indexOf(n.command)>=0).filter(n=>n.resolvedKeybinding).map(n=>{let o=n.commandArgs;return n.command===I.organizeImportsCommandId?o={kind:E.CodeActionKind.SourceOrganizeImports.value}:n.command===I.fixAllCommandId&&(o={kind:E.CodeActionKind.SourceFixAll.value}),{resolvedKeybinding:n.resolvedKeybinding,...E.CodeActionCommandArgs.fromUser(o,{kind:d.HierarchicalKind.None,apply:"never"})}}));return n=>{if(n.kind)return this.bestKeybindingForCodeAction(n,p.value)?.resolvedKeybinding}}bestKeybindingForCodeAction(p,n){if(!p.kind)return;const o=new d.HierarchicalKind(p.kind);return n.filter(t=>t.kind.contains(o)).filter(t=>t.preferred?p.isPreferred:!0).reduceRight((t,i)=>t?t.kind.contains(i.kind)?i:t:i,void 0)}};e.CodeActionKeybindingResolver=_,e.CodeActionKeybindingResolver=_=m=ke([ce(0,y.IKeybindingService)],_)}),define(ne[408],se([1,0,14,8,6,2,48,37,9,23,12,96,134,157,91,54]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeActionModel=e.CodeActionsState=e.APPLY_FIX_ALL_COMMAND_ID=e.SUPPORTED_CODE_ACTIONS=void 0,e.SUPPORTED_CODE_ACTIONS=new p.RawContextKey("supportedCodeAction",""),e.APPLY_FIX_ALL_COMMAND_ID="_typescript.applyFixAllCodeAction";class g extends E.Disposable{constructor(u,C,f,h=250){super(),this._editor=u,this._markerService=C,this._signalChange=f,this._delay=h,this._autoTriggerTimer=this._register(new d.TimeoutTimer),this._register(this._markerService.onMarkerChanged(v=>this._onMarkerChanges(v))),this._register(this._editor.onDidChangeCursorPosition(()=>this._tryAutoTrigger()))}trigger(u){const C=this._getRangeOfSelectionUnlessWhitespaceEnclosed(u);this._signalChange(C?{trigger:u,selection:C}:void 0)}_onMarkerChanges(u){const C=this._editor.getModel();C&&u.some(f=>(0,y.isEqual)(f,C.uri))&&this._tryAutoTrigger()}_tryAutoTrigger(){this._autoTriggerTimer.cancelAndSet(()=>{this.trigger({type:2,triggerAction:o.CodeActionTriggerSource.Default})},this._delay)}_getRangeOfSelectionUnlessWhitespaceEnclosed(u){if(!this._editor.hasModel())return;const C=this._editor.getSelection();if(u.type===1)return C;const f=this._editor.getOption(65).enabled;if(f!==m.ShowLightbulbIconMode.Off){{if(f===m.ShowLightbulbIconMode.On)return C;if(f===m.ShowLightbulbIconMode.OnCode){if(!C.isEmpty())return C;const v=this._editor.getModel(),{lineNumber:w,column:S}=C.getPosition(),L=v.getLineContent(w);if(L.length===0)return;if(S===1){if(/\s/.test(L[0]))return}else if(S===v.getLineMaxColumn(w)){if(/\s/.test(L[L.length-1]))return}else if(/\s/.test(L[S-2])&&/\s/.test(L[S-1]))return}}return C}}}var c;(function(r){r.Empty={type:0};class u{constructor(f,h,v){this.trigger=f,this.position=h,this._cancellablePromise=v,this.type=1,this.actions=v.catch(w=>{if((0,k.isCancellationError)(w))return l;throw w})}cancel(){this._cancellablePromise.cancel()}}r.Triggered=u})(c||(e.CodeActionsState=c={}));const l=Object.freeze({allActions:[],validActions:[],dispose:()=>{},documentation:[],hasAutoFix:!1,hasAIFix:!1,allAIFixes:!1});class a extends E.Disposable{constructor(u,C,f,h,v,w,S){super(),this._editor=u,this._registry=C,this._markerService=f,this._progressService=v,this._configurationService=w,this._telemetryService=S,this._codeActionOracle=this._register(new E.MutableDisposable),this._state=c.Empty,this._onDidChangeState=this._register(new I.Emitter),this.onDidChangeState=this._onDidChangeState.event,this._disposed=!1,this._supportedCodeActions=e.SUPPORTED_CODE_ACTIONS.bindTo(h),this._register(this._editor.onDidChangeModel(()=>this._update())),this._register(this._editor.onDidChangeModelLanguage(()=>this._update())),this._register(this._registry.onDidChange(()=>this._update())),this._register(this._editor.onDidChangeConfiguration(L=>{L.hasChanged(65)&&this._update()})),this._update()}dispose(){this._disposed||(this._disposed=!0,super.dispose(),this.setState(c.Empty,!0))}_settingEnabledNearbyQuickfixes(){const u=this._editor?.getModel();return this._configurationService?this._configurationService.getValue("editor.codeActionWidget.includeNearbyQuickFixes",{resource:u?.uri}):!1}_update(){if(this._disposed)return;this._codeActionOracle.value=void 0,this.setState(c.Empty);const u=this._editor.getModel();if(u&&this._registry.has(u)&&!this._editor.getOption(92)){const C=this._registry.all(u).flatMap(f=>f.providedCodeActionKinds??[]);this._supportedCodeActions.set(C.join(" ")),this._codeActionOracle.value=new g(this._editor,this._markerService,f=>{if(!f){this.setState(c.Empty);return}const h=f.selection.getStartPosition(),v=(0,d.createCancelablePromise)(async L=>{if(this._settingEnabledNearbyQuickfixes()&&f.trigger.type===1&&(f.trigger.triggerAction===o.CodeActionTriggerSource.QuickFix||f.trigger.filter?.include?.contains(o.CodeActionKind.QuickFix))){const D=await(0,t.getCodeActions)(this._registry,u,f.selection,f.trigger,n.Progress.None,L),T=[...D.allActions];if(L.isCancellationRequested)return l;const M=D.validActions?.some(P=>P.action.kind?o.CodeActionKind.QuickFix.contains(new i.HierarchicalKind(P.action.kind)):!1),A=this._markerService.read({resource:u.uri});if(M){for(const P of D.validActions)P.action.command?.arguments?.some(N=>typeof N=="string"&&N.includes(e.APPLY_FIX_ALL_COMMAND_ID))&&(P.action.diagnostics=[...A.filter(N=>N.relatedInformation)]);return{validActions:D.validActions,allActions:T,documentation:D.documentation,hasAutoFix:D.hasAutoFix,hasAIFix:D.hasAIFix,allAIFixes:D.allAIFixes,dispose:()=>{D.dispose()}}}else if(!M&&A.length>0){const P=f.selection.getPosition();let N=P,O=Number.MAX_VALUE;const F=[...D.validActions];for(const W of A){const V=W.endColumn,q=W.endLineNumber,H=W.startLineNumber;if(q===P.lineNumber||H===P.lineNumber){N=new _.Position(q,V);const z={type:f.trigger.type,triggerAction:f.trigger.triggerAction,filter:{include:f.trigger.filter?.include?f.trigger.filter?.include:o.CodeActionKind.QuickFix},autoApply:f.trigger.autoApply,context:{notAvailableMessage:f.trigger.context?.notAvailableMessage||"",position:N}},U=new b.Selection(N.lineNumber,N.column,N.lineNumber,N.column),j=await(0,t.getCodeActions)(this._registry,u,U,z,n.Progress.None,L);if(j.validActions.length!==0){for(const Y of j.validActions)Y.action.command?.arguments?.some(G=>typeof G=="string"&&G.includes(e.APPLY_FIX_ALL_COMMAND_ID))&&(Y.action.diagnostics=[...A.filter(G=>G.relatedInformation)]);D.allActions.length===0&&T.push(...j.allActions),Math.abs(P.column-V)q.findIndex(H=>H.action.title===W.action.title)===V);return x.sort((W,V)=>W.action.isPreferred&&!V.action.isPreferred?-1:!W.action.isPreferred&&V.action.isPreferred||W.action.isAI&&!V.action.isAI?1:!W.action.isAI&&V.action.isAI?-1:0),{validActions:x,allActions:T,documentation:D.documentation,hasAutoFix:D.hasAutoFix,hasAIFix:D.hasAIFix,allAIFixes:D.allAIFixes,dispose:()=>{D.dispose()}}}}if(f.trigger.type===1){const D=new s.StopWatch,T=await(0,t.getCodeActions)(this._registry,u,f.selection,f.trigger,n.Progress.None,L);return this._telemetryService&&this._telemetryService.publicLog2("codeAction.invokedDurations",{codeActions:T.validActions.length,duration:D.elapsed()}),T}return(0,t.getCodeActions)(this._registry,u,f.selection,f.trigger,n.Progress.None,L)});f.trigger.type===1&&this._progressService?.showWhile(v,250);const w=new c.Triggered(f.trigger,h,v);let S=!1;this._state.type===1&&(S=this._state.trigger.type===1&&w.type===1&&w.trigger.type===2&&this._state.position!==w.position),S?setTimeout(()=>{this.setState(w)},500):this.setState(w)},void 0),this._codeActionOracle.value.trigger({type:2,triggerAction:o.CodeActionTriggerSource.Default})}else this._supportedCodeActions.reset()}trigger(u){this._codeActionOracle.value?.trigger(u)}setState(u,C){u!==this._state&&(this._state.type===1&&this._state.cancel(),this._state=u,!C&&!this._disposed&&this._onDidChangeState.fire(u))}}e.CodeActionModel=a}),define(ne[734],se([1,0,15,165,3]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class E extends d.EditorAction{constructor(){super({id:"editor.action.fontZoomIn",label:I.localize(919,"Increase Editor Font Size"),alias:"Increase Editor Font Size",precondition:void 0})}run(b,p){k.EditorZoom.setZoomLevel(k.EditorZoom.getZoomLevel()+1)}}class y extends d.EditorAction{constructor(){super({id:"editor.action.fontZoomOut",label:I.localize(920,"Decrease Editor Font Size"),alias:"Decrease Editor Font Size",precondition:void 0})}run(b,p){k.EditorZoom.setZoomLevel(k.EditorZoom.getZoomLevel()-1)}}class m extends d.EditorAction{constructor(){super({id:"editor.action.fontZoomReset",label:I.localize(921,"Reset Editor Font Size"),alias:"Reset Editor Font Size",precondition:void 0})}run(b,p){k.EditorZoom.setZoomLevel(0)}}(0,d.registerEditorAction)(E),(0,d.registerEditorAction)(y),(0,d.registerEditorAction)(m)}),define(ne[409],se([1,0,13,18,8,53,73,19,22,122,168,9,4,23,100,78,337,24,674,7,17,62,137]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FormattingConflicts=void 0,e.getRealAndSyntheticDocumentFormattersOrdered=f,e.formatDocumentRangesWithSelectedProvider=v,e.formatDocumentRangesWithProvider=w,e.formatDocumentWithSelectedProvider=S,e.formatDocumentWithProvider=L,e.getDocumentRangeFormattingEditsUntilResult=D,e.getDocumentFormattingEditsUntilResult=T,e.getOnTypeFormattingEdits=M;function f(A,P,N){const O=[],F=new l.ExtensionIdentifierSet,x=A.ordered(N);for(const V of x)O.push(V),V.extensionId&&F.add(V.extensionId);const W=P.ordered(N);for(const V of W){if(V.extensionId){if(F.has(V.extensionId))continue;F.add(V.extensionId)}O.push({displayName:V.displayName,extensionId:V.extensionId,provideDocumentFormattingEdits(q,H,z){return V.provideDocumentRangeFormattingEdits(q,q.getFullModelRange(),H,z)}})}return O}class h{static{this._selectors=new y.LinkedList}static setFormatterSelector(P){return{dispose:h._selectors.unshift(P)}}static async select(P,N,O,F){if(P.length===0)return;const x=E.Iterable.first(h._selectors);if(x)return await x(P,N,O,F)}}e.FormattingConflicts=h;async function v(A,P,N,O,F,x,W){const V=A.get(a.IInstantiationService),{documentRangeFormattingEditProvider:q}=A.get(r.ILanguageFeaturesService),H=(0,p.isCodeEditor)(P)?P.getModel():P,z=q.ordered(H),U=await h.select(z,H,O,2);U&&(F.report(U),await V.invokeFunction(w,U,P,N,x,W))}async function w(A,P,N,O,F,x){const W=A.get(i.IEditorWorkerService),V=A.get(u.ILogService),q=A.get(C.IAccessibilitySignalService);let H,z;(0,p.isCodeEditor)(N)?(H=N.getModel(),z=new b.EditorStateCancellationTokenSource(N,5,void 0,F)):(H=N,z=new b.TextModelCancellationTokenSource(N,F));const U=[];let j=0;for(const J of(0,d.asArray)(O).sort(o.Range.compareRangesUsingStarts))j>0&&o.Range.areIntersectingOrTouching(U[j-1],J)?U[j-1]=o.Range.fromPositions(U[j-1].getStartPosition(),J.getEndPosition()):j=U.push(J);const Y=async J=>{V.trace("[format][provideDocumentRangeFormattingEdits] (request)",P.extensionId?.value,J);const ie=await P.provideDocumentRangeFormattingEdits(H,J,H.getFormattingOptions(),z.token)||[];return V.trace("[format][provideDocumentRangeFormattingEdits] (response)",P.extensionId?.value,ie),ie},G=(J,ie)=>{if(!J.length||!ie.length)return!1;const ue=J.reduce((he,pe)=>o.Range.plusRange(he,pe.range),J[0].range);if(!ie.some(he=>o.Range.intersectRanges(ue,he.range)))return!1;for(const he of J)for(const pe of ie)if(o.Range.intersectRanges(he.range,pe.range))return!0;return!1},K=[],R=[];try{if(typeof P.provideDocumentRangesFormattingEdits=="function"){V.trace("[format][provideDocumentRangeFormattingEdits] (request)",P.extensionId?.value,U);const J=await P.provideDocumentRangesFormattingEdits(H,U,H.getFormattingOptions(),z.token)||[];V.trace("[format][provideDocumentRangeFormattingEdits] (response)",P.extensionId?.value,J),R.push(J)}else{for(const J of U){if(z.token.isCancellationRequested)return!0;R.push(await Y(J))}for(let J=0;J({text:ue.text,range:o.Range.lift(ue.range),forceMoveMarkers:!0})),ue=>{for(const{range:he}of ue)if(o.Range.areIntersectingOrTouching(he,ie))return[new t.Selection(he.startLineNumber,he.startColumn,he.endLineNumber,he.endColumn)];return null})}return q.playSignal(C.AccessibilitySignal.format,{userGesture:x}),!0}async function S(A,P,N,O,F,x){const W=A.get(a.IInstantiationService),V=A.get(r.ILanguageFeaturesService),q=(0,p.isCodeEditor)(P)?P.getModel():P,H=f(V.documentFormattingEditProvider,V.documentRangeFormattingEditProvider,q),z=await h.select(H,q,N,1);z&&(O.report(z),await W.invokeFunction(L,z,P,N,F,x))}async function L(A,P,N,O,F,x){const W=A.get(i.IEditorWorkerService),V=A.get(C.IAccessibilitySignalService);let q,H;(0,p.isCodeEditor)(N)?(q=N.getModel(),H=new b.EditorStateCancellationTokenSource(N,5,void 0,F)):(q=N,H=new b.TextModelCancellationTokenSource(N,F));let z;try{const U=await P.provideDocumentFormattingEdits(q,q.getFormattingOptions(),H.token);if(z=await W.computeMoreMinimalEdits(q.uri,U),H.token.isCancellationRequested)return!0}finally{H.dispose()}if(!z||z.length===0)return!1;if((0,p.isCodeEditor)(N))g.FormattingEdit.execute(N,z,O!==2),O!==2&&N.revealPositionInCenterIfOutsideViewport(N.getPosition(),1);else{const[{range:U}]=z,j=new t.Selection(U.startLineNumber,U.startColumn,U.endLineNumber,U.endColumn);q.pushEditOperations([j],z.map(Y=>({text:Y.text,range:o.Range.lift(Y.range),forceMoveMarkers:!0})),Y=>{for(const{range:G}of Y)if(o.Range.areIntersectingOrTouching(G,j))return[new t.Selection(G.startLineNumber,G.startColumn,G.endLineNumber,G.endColumn)];return null})}return V.playSignal(C.AccessibilitySignal.format,{userGesture:x}),!0}async function D(A,P,N,O,F,x){const W=P.documentRangeFormattingEditProvider.ordered(N);for(const V of W){const q=await Promise.resolve(V.provideDocumentRangeFormattingEdits(N,O,F,x)).catch(I.onUnexpectedExternalError);if((0,d.isNonEmptyArray)(q))return await A.computeMoreMinimalEdits(N.uri,q)}}async function T(A,P,N,O,F){const x=f(P.documentFormattingEditProvider,P.documentRangeFormattingEditProvider,N);for(const W of x){const V=await Promise.resolve(W.provideDocumentFormattingEdits(N,O,F)).catch(I.onUnexpectedExternalError);if((0,d.isNonEmptyArray)(V))return await A.computeMoreMinimalEdits(N.uri,V)}}function M(A,P,N,O,F,x,W){const V=P.onTypeFormattingEditProvider.ordered(N);return V.length===0||V[0].autoFormatTriggerCharacters.indexOf(F)<0?Promise.resolve(void 0):Promise.resolve(V[0].provideOnTypeFormattingEdits(N,O,F,x,W)).catch(I.onUnexpectedExternalError).then(q=>A.computeMoreMinimalEdits(N.uri,q))}c.CommandsRegistry.registerCommand("_executeFormatRangeProvider",async function(A,...P){const[N,O,F]=P;(0,m.assertType)(_.URI.isUri(N)),(0,m.assertType)(o.Range.isIRange(O));const x=A.get(s.ITextModelService),W=A.get(i.IEditorWorkerService),V=A.get(r.ILanguageFeaturesService),q=await x.createModelReference(N);try{return D(W,V,q.object.textEditorModel,o.Range.lift(O),F,k.CancellationToken.None)}finally{q.dispose()}}),c.CommandsRegistry.registerCommand("_executeFormatDocumentProvider",async function(A,...P){const[N,O]=P;(0,m.assertType)(_.URI.isUri(N));const F=A.get(s.ITextModelService),x=A.get(i.IEditorWorkerService),W=A.get(r.ILanguageFeaturesService),V=await F.createModelReference(N);try{return T(x,W,V.object.textEditorModel,O,k.CancellationToken.None)}finally{V.dispose()}}),c.CommandsRegistry.registerCommand("_executeFormatOnTypeProvider",async function(A,...P){const[N,O,F,x]=P;(0,m.assertType)(_.URI.isUri(N)),(0,m.assertType)(n.Position.isIPosition(O)),(0,m.assertType)(typeof F=="string");const W=A.get(s.ITextModelService),V=A.get(i.IEditorWorkerService),q=A.get(r.ILanguageFeaturesService),H=await W.createModelReference(N);try{return M(V,q,H.object.textEditorModel,n.Position.lift(O),F,x,k.CancellationToken.None)}finally{H.dispose()}})}),define(ne[735],se([1,0,13,18,8,72,2,15,34,144,4,20,100,17,409,337,3,137,24,12,7,96]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FormatOnType=void 0;let C=class{static{this.ID="editor.contrib.autoFormat"}constructor(S,L,D,T){this._editor=S,this._languageFeaturesService=L,this._workerService=D,this._accessibilitySignalService=T,this._disposables=new y.DisposableStore,this._sessionDisposables=new y.DisposableStore,this._disposables.add(L.onTypeFormattingEditProvider.onDidChange(this._update,this)),this._disposables.add(S.onDidChangeModel(()=>this._update())),this._disposables.add(S.onDidChangeModelLanguage(()=>this._update())),this._disposables.add(S.onDidChangeConfiguration(M=>{M.hasChanged(56)&&this._update()})),this._update()}dispose(){this._disposables.dispose(),this._sessionDisposables.dispose()}_update(){if(this._sessionDisposables.clear(),!this._editor.getOption(56)||!this._editor.hasModel())return;const S=this._editor.getModel(),[L]=this._languageFeaturesService.onTypeFormattingEditProvider.ordered(S);if(!L||!L.autoFormatTriggerCharacters)return;const D=new b.CharacterSet;for(const T of L.autoFormatTriggerCharacters)D.add(T.charCodeAt(0));this._sessionDisposables.add(this._editor.onDidType(T=>{const M=T.charCodeAt(T.length-1);D.has(M)&&this._trigger(String.fromCharCode(M))}))}_trigger(S){if(!this._editor.hasModel()||this._editor.getSelections().length>1||!this._editor.getSelection().isEmpty())return;const L=this._editor.getModel(),D=this._editor.getPosition(),T=new k.CancellationTokenSource,M=this._editor.onDidChangeModelContent(A=>{if(A.isFlush){T.cancel(),M.dispose();return}for(let P=0,N=A.changes.length;P{T.token.isCancellationRequested||(0,d.isNonEmptyArray)(A)&&(this._accessibilitySignalService.playSignal(c.AccessibilitySignal.format,{userGesture:!1}),s.FormattingEdit.execute(this._editor,A,!0))}).finally(()=>{M.dispose()})}};e.FormatOnType=C,e.FormatOnType=C=ke([ce(1,t.ILanguageFeaturesService),ce(2,o.IEditorWorkerService),ce(3,c.IAccessibilitySignalService)],C);let f=class{static{this.ID="editor.contrib.formatOnPaste"}constructor(S,L,D){this.editor=S,this._languageFeaturesService=L,this._instantiationService=D,this._callOnDispose=new y.DisposableStore,this._callOnModel=new y.DisposableStore,this._callOnDispose.add(S.onDidChangeConfiguration(()=>this._update())),this._callOnDispose.add(S.onDidChangeModel(()=>this._update())),this._callOnDispose.add(S.onDidChangeModelLanguage(()=>this._update())),this._callOnDispose.add(L.documentRangeFormattingEditProvider.onDidChange(this._update,this))}dispose(){this._callOnDispose.dispose(),this._callOnModel.dispose()}_update(){this._callOnModel.clear(),this.editor.getOption(55)&&this.editor.hasModel()&&this._languageFeaturesService.documentRangeFormattingEditProvider.has(this.editor.getModel())&&this._callOnModel.add(this.editor.onDidPaste(({range:S})=>this._trigger(S)))}_trigger(S){this.editor.hasModel()&&(this.editor.getSelections().length>1||this._instantiationService.invokeFunction(i.formatDocumentRangesWithSelectedProvider,this.editor,S,2,u.Progress.None,k.CancellationToken.None,!1).catch(I.onUnexpectedError))}};f=ke([ce(1,t.ILanguageFeaturesService),ce(2,r.IInstantiationService)],f);class h extends m.EditorAction{constructor(){super({id:"editor.action.formatDocument",label:g.localize(922,"Format Document"),alias:"Format Document",precondition:a.ContextKeyExpr.and(n.EditorContextKeys.notInCompositeEditor,n.EditorContextKeys.writable,n.EditorContextKeys.hasDocumentFormattingProvider),kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:1572,linux:{primary:3111},weight:100},contextMenuOpts:{group:"1_modification",order:1.3}})}async run(S,L){if(L.hasModel()){const D=S.get(r.IInstantiationService);await S.get(u.IEditorProgressService).showWhile(D.invokeFunction(i.formatDocumentWithSelectedProvider,L,1,u.Progress.None,k.CancellationToken.None,!0),250)}}}class v extends m.EditorAction{constructor(){super({id:"editor.action.formatSelection",label:g.localize(923,"Format Selection"),alias:"Format Selection",precondition:a.ContextKeyExpr.and(n.EditorContextKeys.writable,n.EditorContextKeys.hasDocumentSelectionFormattingProvider),kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2084),weight:100},contextMenuOpts:{when:n.EditorContextKeys.hasNonEmptySelection,group:"1_modification",order:1.31}})}async run(S,L){if(!L.hasModel())return;const D=S.get(r.IInstantiationService),T=L.getModel(),M=L.getSelections().map(P=>P.isEmpty()?new p.Range(P.startLineNumber,1,P.startLineNumber,T.getLineMaxColumn(P.startLineNumber)):P);await S.get(u.IEditorProgressService).showWhile(D.invokeFunction(i.formatDocumentRangesWithSelectedProvider,L,M,1,u.Progress.None,k.CancellationToken.None,!0),250)}}(0,m.registerEditorContribution)(C.ID,C,2),(0,m.registerEditorContribution)(f.ID,f,2),(0,m.registerEditorAction)(h),(0,m.registerEditorAction)(v),l.CommandsRegistry.registerCommand("editor.action.format",async w=>{const S=w.get(_.ICodeEditorService).getFocusedCodeEditor();if(!S||!S.hasModel())return;const L=w.get(l.ICommandService);S.getSelection().isEmpty()?await L.executeCommand("editor.action.formatDocument"):await L.executeCommand("editor.action.formatSelection")})}),define(ne[277],se([1,0,13,18,8,42,15,17,178]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getDefinitionsAtPosition=n,e.getDeclarationsAtPosition=o,e.getImplementationsAtPosition=t,e.getTypeDefinitionsAtPosition=i,e.getReferencesAtPosition=s;function b(c,l){return l.uri.scheme===c.uri.scheme?!0:!(0,E.matchesSomeScheme)(l.uri,E.Schemas.walkThroughSnippet,E.Schemas.vscodeChatCodeBlock,E.Schemas.vscodeChatCodeCompareBlock)}async function p(c,l,a,r,u){const f=a.ordered(c,r).map(v=>Promise.resolve(u(v,c,l)).then(void 0,w=>{(0,I.onUnexpectedExternalError)(w)})),h=await Promise.all(f);return(0,d.coalesce)(h.flat()).filter(v=>b(c,v))}function n(c,l,a,r,u){return p(l,a,c,r,(C,f,h)=>C.provideDefinition(f,h,u))}function o(c,l,a,r,u){return p(l,a,c,r,(C,f,h)=>C.provideDeclaration(f,h,u))}function t(c,l,a,r,u){return p(l,a,c,r,(C,f,h)=>C.provideImplementation(f,h,u))}function i(c,l,a,r,u){return p(l,a,c,r,(C,f,h)=>C.provideTypeDefinition(f,h,u))}function s(c,l,a,r,u,C){return p(l,a,c,u,async(f,h,v)=>{const w=(await f.provideReferences(h,v,{includeDeclaration:!0},C))?.filter(L=>b(h,L));if(!r||!w||w.length!==2)return w;const S=(await f.provideReferences(h,v,{includeDeclaration:!1},C))?.filter(L=>b(h,L));return S&&S.length===1?S:w})}async function g(c){const l=await c(),a=new _.ReferencesModel(l,""),r=a.references.map(u=>u.link);return a.dispose(),r}(0,y.registerModelAndPositionCommand)("_executeDefinitionProvider",(c,l,a)=>{const r=c.get(m.ILanguageFeaturesService),u=n(r.definitionProvider,l,a,!1,k.CancellationToken.None);return g(()=>u)}),(0,y.registerModelAndPositionCommand)("_executeDefinitionProvider_recursive",(c,l,a)=>{const r=c.get(m.ILanguageFeaturesService),u=n(r.definitionProvider,l,a,!0,k.CancellationToken.None);return g(()=>u)}),(0,y.registerModelAndPositionCommand)("_executeTypeDefinitionProvider",(c,l,a)=>{const r=c.get(m.ILanguageFeaturesService),u=i(r.typeDefinitionProvider,l,a,!1,k.CancellationToken.None);return g(()=>u)}),(0,y.registerModelAndPositionCommand)("_executeTypeDefinitionProvider_recursive",(c,l,a)=>{const r=c.get(m.ILanguageFeaturesService),u=i(r.typeDefinitionProvider,l,a,!0,k.CancellationToken.None);return g(()=>u)}),(0,y.registerModelAndPositionCommand)("_executeDeclarationProvider",(c,l,a)=>{const r=c.get(m.ILanguageFeaturesService),u=o(r.declarationProvider,l,a,!1,k.CancellationToken.None);return g(()=>u)}),(0,y.registerModelAndPositionCommand)("_executeDeclarationProvider_recursive",(c,l,a)=>{const r=c.get(m.ILanguageFeaturesService),u=o(r.declarationProvider,l,a,!0,k.CancellationToken.None);return g(()=>u)}),(0,y.registerModelAndPositionCommand)("_executeReferenceProvider",(c,l,a)=>{const r=c.get(m.ILanguageFeaturesService),u=s(r.referenceProvider,l,a,!1,!1,k.CancellationToken.None);return g(()=>u)}),(0,y.registerModelAndPositionCommand)("_executeReferenceProvider_recursive",(c,l,a)=>{const r=c.get(m.ILanguageFeaturesService),u=s(r.referenceProvider,l,a,!1,!0,k.CancellationToken.None);return g(()=>u)}),(0,y.registerModelAndPositionCommand)("_executeImplementationProvider",(c,l,a)=>{const r=c.get(m.ILanguageFeaturesService),u=t(r.implementationProvider,l,a,!1,k.CancellationToken.None);return g(()=>u)}),(0,y.registerModelAndPositionCommand)("_executeImplementationProvider_recursive",(c,l,a)=>{const r=c.get(m.ILanguageFeaturesService),u=t(r.implementationProvider,l,a,!0,k.CancellationToken.None);return g(()=>u)})}),define(ne[736],se([1,0,6,2,48,15,34,4,3,12,49,7,31,121,50]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ISymbolNavigationService=e.ctxHasSymbols=void 0,e.ctxHasSymbols=new b.RawContextKey("hasSymbols",!1,(0,_.localize)(1003,"Whether there are symbol locations that can be navigated via keyboard-only.")),e.ISymbolNavigationService=(0,n.createDecorator)("ISymbolNavigationService");let s=class{constructor(l,a,r,u){this._editorService=a,this._notificationService=r,this._keybindingService=u,this._currentModel=void 0,this._currentIdx=-1,this._ignoreEditorChange=!1,this._ctxHasSymbols=e.ctxHasSymbols.bindTo(l)}reset(){this._ctxHasSymbols.reset(),this._currentState?.dispose(),this._currentMessage?.dispose(),this._currentModel=void 0,this._currentIdx=-1}put(l){const a=l.parent.parent;if(a.references.length<=1){this.reset();return}this._currentModel=a,this._currentIdx=a.references.indexOf(l),this._ctxHasSymbols.set(!0),this._showMessage();const r=new g(this._editorService),u=r.onDidChange(C=>{if(this._ignoreEditorChange)return;const f=this._editorService.getActiveCodeEditor();if(!f)return;const h=f.getModel(),v=f.getPosition();if(!h||!v)return;let w=!1,S=!1;for(const L of a.references)if((0,I.isEqual)(L.uri,h.uri))w=!0,S=S||m.Range.containsPosition(L.range,v);else if(w)break;(!w||!S)&&this.reset()});this._currentState=(0,k.combinedDisposable)(r,u)}revealNext(l){if(!this._currentModel)return Promise.resolve();this._currentIdx+=1,this._currentIdx%=this._currentModel.references.length;const a=this._currentModel.references[this._currentIdx];return this._showMessage(),this._ignoreEditorChange=!0,this._editorService.openCodeEditor({resource:a.uri,options:{selection:m.Range.collapseToStart(a.range),selectionRevealType:3}},l).finally(()=>{this._ignoreEditorChange=!1})}_showMessage(){this._currentMessage?.dispose();const l=this._keybindingService.lookupKeybinding("editor.gotoNextSymbolFromResult"),a=l?(0,_.localize)(1004,"Symbol {0} of {1}, {2} for next",this._currentIdx+1,this._currentModel.references.length,l.getLabel()):(0,_.localize)(1005,"Symbol {0} of {1}",this._currentIdx+1,this._currentModel.references.length);this._currentMessage=this._notificationService.status(a)}};s=ke([ce(0,b.IContextKeyService),ce(1,y.ICodeEditorService),ce(2,i.INotificationService),ce(3,o.IKeybindingService)],s),(0,p.registerSingleton)(e.ISymbolNavigationService,s,1),(0,E.registerEditorCommand)(new class extends E.EditorCommand{constructor(){super({id:"editor.gotoNextSymbolFromResult",precondition:e.ctxHasSymbols,kbOpts:{weight:100,primary:70}})}runEditorCommand(c,l){return c.get(e.ISymbolNavigationService).revealNext(l)}}),t.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"editor.gotoNextSymbolFromResult.cancel",weight:100,when:e.ctxHasSymbols,primary:9,handler(c){c.get(e.ISymbolNavigationService).reset()}});let g=class{constructor(l){this._listener=new Map,this._disposables=new k.DisposableStore,this._onDidChange=new d.Emitter,this.onDidChange=this._onDidChange.event,this._disposables.add(l.onCodeEditorRemove(this._onDidRemoveEditor,this)),this._disposables.add(l.onCodeEditorAdd(this._onDidAddEditor,this)),l.listCodeEditors().forEach(this._onDidAddEditor,this)}dispose(){this._disposables.dispose(),this._onDidChange.dispose(),(0,k.dispose)(this._listener.values())}_onDidAddEditor(l){this._listener.set(l,(0,k.combinedDisposable)(l.onDidChangeCursorPosition(a=>this._onDidChange.fire({editor:l})),l.onDidChangeModelContent(a=>this._onDidChange.fire({editor:l}))))}_onDidRemoveEditor(l){this._listener.get(l)?.dispose(),this._listener.delete(l)}};g=ke([ce(0,y.ICodeEditorService)],g)}),define(ne[410],se([1,0,14,18,8,15,17]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HoverProviderResult=void 0,e.getHoverProviderResultsAsAsyncIterable=b,e.getHoversPromise=p;class m{constructor(t,i,s){this.provider=t,this.hover=i,this.ordinal=s}}e.HoverProviderResult=m;async function _(o,t,i,s,g){const c=await Promise.resolve(o.provideHover(i,s,g)).catch(I.onUnexpectedExternalError);if(!(!c||!n(c)))return new m(o,c,t)}function b(o,t,i,s,g=!1){const l=o.ordered(t,g).map((a,r)=>_(a,r,t,i,s));return d.AsyncIterableObject.fromPromises(l).coalesce()}function p(o,t,i,s,g=!1){return b(o,t,i,s,g).map(c=>c.hover).toPromise()}(0,E.registerModelAndPositionCommand)("_executeHoverProvider",(o,t,i)=>{const s=o.get(y.ILanguageFeaturesService);return p(s.hoverProvider,t,i,k.CancellationToken.None)}),(0,E.registerModelAndPositionCommand)("_executeHoverProvider_recursive",(o,t,i)=>{const s=o.get(y.ILanguageFeaturesService);return p(s.hoverProvider,t,i,k.CancellationToken.None,!0)});function n(o){const t=typeof o.range<"u",i=typeof o.contents<"u"&&o.contents&&o.contents.length>0;return t&&i}}),define(ne[737],se([1,0,2,11,15,183,4,20,36,51,338,3,66,241,714,83]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IndentationToTabsCommand=e.IndentationToSpacesCommand=e.AutoIndentOnPaste=e.AutoIndentOnPasteCommand=e.ReindentSelectedLinesAction=e.ReindentLinesAction=e.DetectIndentation=e.ChangeTabDisplaySize=e.IndentUsingSpaces=e.IndentUsingTabs=e.ChangeIndentationSizeAction=e.IndentationToTabsAction=e.IndentationToSpacesAction=void 0;class g extends I.EditorAction{static{this.ID="editor.action.indentationToSpaces"}constructor(){super({id:g.ID,label:n.localize(1045,"Convert Indentation to Spaces"),alias:"Convert Indentation to Spaces",precondition:m.EditorContextKeys.writable,metadata:{description:n.localize2(1057,"Convert the tab indentation to spaces.")}})}run(A,P){const N=P.getModel();if(!N)return;const O=N.getOptions(),F=P.getSelection();if(!F)return;const x=new D(F,O.tabSize);P.pushUndoStop(),P.executeCommands(this.id,[x]),P.pushUndoStop(),N.updateOptions({insertSpaces:!0})}}e.IndentationToSpacesAction=g;class c extends I.EditorAction{static{this.ID="editor.action.indentationToTabs"}constructor(){super({id:c.ID,label:n.localize(1046,"Convert Indentation to Tabs"),alias:"Convert Indentation to Tabs",precondition:m.EditorContextKeys.writable,metadata:{description:n.localize2(1058,"Convert the spaces indentation to tabs.")}})}run(A,P){const N=P.getModel();if(!N)return;const O=N.getOptions(),F=P.getSelection();if(!F)return;const x=new T(F,O.tabSize);P.pushUndoStop(),P.executeCommands(this.id,[x]),P.pushUndoStop(),N.updateOptions({insertSpaces:!1})}}e.IndentationToTabsAction=c;class l extends I.EditorAction{constructor(A,P,N){super(N),this.insertSpaces=A,this.displaySizeOnly=P}run(A,P){const N=A.get(o.IQuickInputService),O=A.get(b.IModelService),F=P.getModel();if(!F)return;const x=O.getCreationOptions(F.getLanguageId(),F.uri,F.isForSimpleWidget),W=F.getOptions(),V=[1,2,3,4,5,6,7,8].map(H=>({id:H.toString(),label:H.toString(),description:H===x.tabSize&&H===W.tabSize?n.localize(1047,"Configured Tab Size"):H===x.tabSize?n.localize(1048,"Default Tab Size"):H===W.tabSize?n.localize(1049,"Current Tab Size"):void 0})),q=Math.min(F.getOptions().tabSize-1,7);setTimeout(()=>{N.pick(V,{placeHolder:n.localize(1050,"Select Tab Size for Current File"),activeItem:V[q]}).then(H=>{if(H&&F&&!F.isDisposed()){const z=parseInt(H.label,10);this.displaySizeOnly?F.updateOptions({tabSize:z}):F.updateOptions({tabSize:z,indentSize:z,insertSpaces:this.insertSpaces})}})},50)}}e.ChangeIndentationSizeAction=l;class a extends l{static{this.ID="editor.action.indentUsingTabs"}constructor(){super(!1,!1,{id:a.ID,label:n.localize(1051,"Indent Using Tabs"),alias:"Indent Using Tabs",precondition:void 0,metadata:{description:n.localize2(1059,"Use indentation with tabs.")}})}}e.IndentUsingTabs=a;class r extends l{static{this.ID="editor.action.indentUsingSpaces"}constructor(){super(!0,!1,{id:r.ID,label:n.localize(1052,"Indent Using Spaces"),alias:"Indent Using Spaces",precondition:void 0,metadata:{description:n.localize2(1060,"Use indentation with spaces.")}})}}e.IndentUsingSpaces=r;class u extends l{static{this.ID="editor.action.changeTabDisplaySize"}constructor(){super(!0,!0,{id:u.ID,label:n.localize(1053,"Change Tab Display Size"),alias:"Change Tab Display Size",precondition:void 0,metadata:{description:n.localize2(1061,"Change the space size equivalent of the tab.")}})}}e.ChangeTabDisplaySize=u;class C extends I.EditorAction{static{this.ID="editor.action.detectIndentation"}constructor(){super({id:C.ID,label:n.localize(1054,"Detect Indentation from Content"),alias:"Detect Indentation from Content",precondition:void 0,metadata:{description:n.localize2(1062,"Detect the indentation from content.")}})}run(A,P){const N=A.get(b.IModelService),O=P.getModel();if(!O)return;const F=N.getCreationOptions(O.getLanguageId(),O.uri,O.isForSimpleWidget);O.detectIndentation(F.insertSpaces,F.tabSize)}}e.DetectIndentation=C;class f extends I.EditorAction{constructor(){super({id:"editor.action.reindentlines",label:n.localize(1055,"Reindent Lines"),alias:"Reindent Lines",precondition:m.EditorContextKeys.writable,metadata:{description:n.localize2(1063,"Reindent the lines of the editor.")}})}run(A,P){const N=A.get(_.ILanguageConfigurationService),O=P.getModel();if(!O)return;const F=(0,i.getReindentEditOperations)(O,N,1,O.getLineCount());F.length>0&&(P.pushUndoStop(),P.executeEdits(this.id,F),P.pushUndoStop())}}e.ReindentLinesAction=f;class h extends I.EditorAction{constructor(){super({id:"editor.action.reindentselectedlines",label:n.localize(1056,"Reindent Selected Lines"),alias:"Reindent Selected Lines",precondition:m.EditorContextKeys.writable,metadata:{description:n.localize2(1064,"Reindent the selected lines of the editor.")}})}run(A,P){const N=A.get(_.ILanguageConfigurationService),O=P.getModel();if(!O)return;const F=P.getSelections();if(F===null)return;const x=[];for(const W of F){let V=W.startLineNumber,q=W.endLineNumber;if(V!==q&&W.endColumn===1&&q--,V===1){if(V===q)continue}else V--;const H=(0,i.getReindentEditOperations)(O,N,V,q);x.push(...H)}x.length>0&&(P.pushUndoStop(),P.executeEdits(this.id,x),P.pushUndoStop())}}e.ReindentSelectedLinesAction=h;class v{constructor(A,P){this._initialSelection=P,this._edits=[],this._selectionId=null;for(const N of A)N.range&&typeof N.text=="string"&&this._edits.push(N)}getEditOperations(A,P){for(const O of this._edits)P.addEditOperation(y.Range.lift(O.range),O.text);let N=!1;Array.isArray(this._edits)&&this._edits.length===1&&this._initialSelection.isEmpty()&&(this._edits[0].range.startColumn===this._initialSelection.endColumn&&this._edits[0].range.startLineNumber===this._initialSelection.endLineNumber?(N=!0,this._selectionId=P.trackSelection(this._initialSelection,!0)):this._edits[0].range.endColumn===this._initialSelection.startColumn&&this._edits[0].range.endLineNumber===this._initialSelection.startLineNumber&&(N=!0,this._selectionId=P.trackSelection(this._initialSelection,!1))),N||(this._selectionId=P.trackSelection(this._initialSelection))}computeCursorState(A,P){return P.getTrackedSelection(this._selectionId)}}e.AutoIndentOnPasteCommand=v;let w=class{static{this.ID="editor.contrib.autoIndentOnPaste"}constructor(A,P){this.editor=A,this._languageConfigurationService=P,this.callOnDispose=new d.DisposableStore,this.callOnModel=new d.DisposableStore,this.callOnDispose.add(A.onDidChangeConfiguration(()=>this.update())),this.callOnDispose.add(A.onDidChangeModel(()=>this.update())),this.callOnDispose.add(A.onDidChangeModelLanguage(()=>this.update()))}update(){this.callOnModel.clear(),!(this.editor.getOption(12)<4||this.editor.getOption(55))&&this.editor.hasModel()&&this.callOnModel.add(this.editor.onDidPaste(({range:A})=>{this.trigger(A)}))}trigger(A){const P=this.editor.getSelections();if(P===null||P.length>1)return;const N=this.editor.getModel();if(!N||this.rangeContainsOnlyWhitespaceCharacters(N,A)||S(N,A)||!N.tokenization.isCheapToTokenize(A.getStartPosition().lineNumber))return;const F=this.editor.getOption(12),{tabSize:x,indentSize:W,insertSpaces:V}=N.getOptions(),q=[],H={shiftIndent:Y=>E.ShiftCommand.shiftIndent(Y,Y.length+1,x,W,V),unshiftIndent:Y=>E.ShiftCommand.unshiftIndent(Y,Y.length+1,x,W,V)};let z=A.startLineNumber;for(;z<=A.endLineNumber;){if(this.shouldIgnoreLine(N,z)){z++;continue}break}if(z>A.endLineNumber)return;let U=N.getLineContent(z);if(!/\S/.test(U.substring(0,A.startColumn-1))){const Y=(0,t.getGoodIndentForLine)(F,N,N.getLanguageId(),z,H,this._languageConfigurationService);if(Y!==null){const G=k.getLeadingWhitespace(U),K=p.getSpaceCnt(Y,x),R=p.getSpaceCnt(G,x);if(K!==R){const J=p.generateIndent(K,x,V);q.push({range:new y.Range(z,1,z,G.length+1),text:J}),U=J+U.substring(G.length)}else{const J=(0,t.getIndentMetadata)(N,z,this._languageConfigurationService);if(J===0||J===8)return}}}const j=z;for(;zN.tokenization.getLineTokens(K),getLanguageId:()=>N.getLanguageId(),getLanguageIdAtPosition:(K,R)=>N.getLanguageIdAtPosition(K,R)},getLineContent:K=>K===j?U:N.getLineContent(K)},G=(0,t.getGoodIndentForLine)(F,Y,N.getLanguageId(),z+1,H,this._languageConfigurationService);if(G!==null){const K=p.getSpaceCnt(G,x),R=p.getSpaceCnt(k.getLeadingWhitespace(N.getLineContent(z+1)),x);if(K!==R){const J=K-R;for(let ie=z+1;ie<=A.endLineNumber;ie++){const ue=N.getLineContent(ie),he=k.getLeadingWhitespace(ue),ae=p.getSpaceCnt(he,x)+J,ee=p.generateIndent(ae,x,V);ee!==he&&q.push({range:new y.Range(ie,1,ie,he.length+1),text:ee})}}}}if(q.length>0){this.editor.pushUndoStop();const Y=new v(q,this.editor.getSelection());this.editor.executeCommand("autoIndentOnPaste",Y),this.editor.pushUndoStop()}}rangeContainsOnlyWhitespaceCharacters(A,P){const N=F=>F.trim().length===0;let O=!0;if(P.startLineNumber===P.endLineNumber){const x=A.getLineContent(P.startLineNumber).substring(P.startColumn-1,P.endColumn-1);O=N(x)}else for(let F=P.startLineNumber;F<=P.endLineNumber;F++){const x=A.getLineContent(F);if(F===P.startLineNumber){const W=x.substring(P.startColumn-1);O=N(W)}else if(F===P.endLineNumber){const W=x.substring(0,P.endColumn-1);O=N(W)}else O=A.getLineFirstNonWhitespaceColumn(F)===0;if(!O)break}return O}shouldIgnoreLine(A,P){A.tokenization.forceTokenization(P);const N=A.getLineFirstNonWhitespaceColumn(P);if(N===0)return!0;const O=A.tokenization.getLineTokens(P);if(O.getCount()>0){const F=O.findTokenIndexAtOffset(N);if(F>=0&&O.getStandardTokenType(F)===1)return!0}return!1}dispose(){this.callOnDispose.dispose(),this.callOnModel.dispose()}};e.AutoIndentOnPaste=w,e.AutoIndentOnPaste=w=ke([ce(1,_.ILanguageConfigurationService)],w);function S(M,A){const P=N=>(0,s.getStandardTokenTypeAtPosition)(M,N)===2;return P(A.getStartPosition())||P(A.getEndPosition())}function L(M,A,P,N){if(M.getLineCount()===1&&M.getLineMaxColumn(1)===1)return;let O="";for(let x=0;x({selection:X,index:B,ignore:!1}));ee.sort((X,B)=>n.Range.compareRangesUsingStarts(X.selection,B.selection));let de=ee[0];for(let X=1;Xnew p.Position(Z.positionLineNumber,Z.positionColumn)));const ge=ae.getSelection();if(ge===null)return;const X=pe.get(r.IConfigurationService),B=ae.getModel(),$=X.getValue("files.trimTrailingWhitespaceInRegexAndStrings",{overrideIdentifier:B?.getLanguageId(),resource:B?.uri}),Q=new y.TrimTrailingWhitespaceCommand(ge,de,$);ae.pushUndoStop(),ae.executeCommands(this.id,[Q]),ae.pushUndoStop()}}e.TrimTrailingWhitespaceAction=A;class P extends I.EditorAction{constructor(){super({id:"editor.action.deleteLines",label:c.localize(1120,"Delete Line"),alias:"Delete Line",precondition:t.EditorContextKeys.writable,kbOpts:{kbExpr:t.EditorContextKeys.textInputFocus,primary:3113,weight:100}})}run(pe,ae){if(!ae.hasModel())return;const ee=this._getLinesToRemove(ae),de=ae.getModel();if(de.getLineCount()===1&&de.getLineMaxColumn(1)===1)return;let ge=0;const X=[],B=[];for(let $=0,Q=ee.length;$1&&(te-=1,le=de.getLineMaxColumn(te)),X.push(b.EditOperation.replace(new o.Selection(te,le,re,me),"")),B.push(new o.Selection(te-ge,Z.positionColumn,te-ge,Z.positionColumn)),ge+=Z.endLineNumber-Z.startLineNumber+1}ae.pushUndoStop(),ae.executeEdits(this.id,X,B),ae.pushUndoStop()}_getLinesToRemove(pe){const ae=pe.getSelections().map(ge=>{let X=ge.endLineNumber;return ge.startLineNumberge.startLineNumber===X.startLineNumber?ge.endLineNumber-X.endLineNumber:ge.startLineNumber-X.startLineNumber);const ee=[];let de=ae[0];for(let ge=1;ge=ae[ge].startLineNumber?de.endLineNumber=ae[ge].endLineNumber:(ee.push(de),de=ae[ge]);return ee.push(de),ee}}e.DeleteLinesAction=P;class N extends I.EditorAction{constructor(){super({id:"editor.action.indentLines",label:c.localize(1121,"Indent Line"),alias:"Indent Line",precondition:t.EditorContextKeys.writable,kbOpts:{kbExpr:t.EditorContextKeys.editorTextFocus,primary:2142,weight:100}})}run(pe,ae){const ee=ae._getViewModel();ee&&(ae.pushUndoStop(),ae.executeCommands(this.id,m.TypeOperations.indent(ee.cursorConfig,ae.getModel(),ae.getSelections())),ae.pushUndoStop())}}e.IndentLinesAction=N;class O extends I.EditorAction{constructor(){super({id:"editor.action.outdentLines",label:c.localize(1122,"Outdent Line"),alias:"Outdent Line",precondition:t.EditorContextKeys.writable,kbOpts:{kbExpr:t.EditorContextKeys.editorTextFocus,primary:2140,weight:100}})}run(pe,ae){k.CoreEditingCommands.Outdent.runEditorCommand(pe,ae,null)}}class F extends I.EditorAction{constructor(){super({id:"editor.action.insertLineBefore",label:c.localize(1123,"Insert Line Above"),alias:"Insert Line Above",precondition:t.EditorContextKeys.writable,kbOpts:{kbExpr:t.EditorContextKeys.editorTextFocus,primary:3075,weight:100}})}run(pe,ae){const ee=ae._getViewModel();ee&&(ae.pushUndoStop(),ae.executeCommands(this.id,_.EnterOperation.lineInsertBefore(ee.cursorConfig,ae.getModel(),ae.getSelections())))}}e.InsertLineBeforeAction=F;class x extends I.EditorAction{constructor(){super({id:"editor.action.insertLineAfter",label:c.localize(1124,"Insert Line Below"),alias:"Insert Line Below",precondition:t.EditorContextKeys.writable,kbOpts:{kbExpr:t.EditorContextKeys.editorTextFocus,primary:2051,weight:100}})}run(pe,ae){const ee=ae._getViewModel();ee&&(ae.pushUndoStop(),ae.executeCommands(this.id,_.EnterOperation.lineInsertAfter(ee.cursorConfig,ae.getModel(),ae.getSelections())))}}e.InsertLineAfterAction=x;class W extends I.EditorAction{run(pe,ae){if(!ae.hasModel())return;const ee=ae.getSelection(),de=this._getRangesToDelete(ae),ge=[];for(let $=0,Q=de.length-1;$b.EditOperation.replace($,""));ae.pushUndoStop(),ae.executeEdits(this.id,B,X),ae.pushUndoStop()}}e.AbstractDeleteAllToBoundaryAction=W;class V extends W{constructor(){super({id:"deleteAllLeft",label:c.localize(1125,"Delete All Left"),alias:"Delete All Left",precondition:t.EditorContextKeys.writable,kbOpts:{kbExpr:t.EditorContextKeys.textInputFocus,primary:0,mac:{primary:2049},weight:100}})}_getEndCursorState(pe,ae){let ee=null;const de=[];let ge=0;return ae.forEach(X=>{let B;if(X.endColumn===1&&ge>0){const $=X.startLineNumber-ge;B=new o.Selection($,X.startColumn,$,X.startColumn)}else B=new o.Selection(X.startLineNumber,X.startColumn,X.startLineNumber,X.startColumn);ge+=X.endLineNumber-X.startLineNumber,X.intersectRanges(pe)?ee=B:de.push(B)}),ee&&de.unshift(ee),de}_getRangesToDelete(pe){const ae=pe.getSelections();if(ae===null)return[];let ee=ae;const de=pe.getModel();return de===null?[]:(ee.sort(n.Range.compareRangesUsingStarts),ee=ee.map(ge=>{if(ge.isEmpty())if(ge.startColumn===1){const X=Math.max(1,ge.startLineNumber-1),B=ge.startLineNumber===1?1:de.getLineLength(X)+1;return new n.Range(X,B,ge.startLineNumber,1)}else return new n.Range(ge.startLineNumber,1,ge.startLineNumber,ge.startColumn);else return new n.Range(ge.startLineNumber,1,ge.endLineNumber,ge.endColumn)}),ee)}}e.DeleteAllLeftAction=V;class q extends W{constructor(){super({id:"deleteAllRight",label:c.localize(1126,"Delete All Right"),alias:"Delete All Right",precondition:t.EditorContextKeys.writable,kbOpts:{kbExpr:t.EditorContextKeys.textInputFocus,primary:0,mac:{primary:297,secondary:[2068]},weight:100}})}_getEndCursorState(pe,ae){let ee=null;const de=[];for(let ge=0,X=ae.length,B=0;ge{if(ge.isEmpty()){const X=ae.getLineMaxColumn(ge.startLineNumber);return ge.startColumn===X?new n.Range(ge.startLineNumber,ge.startColumn,ge.startLineNumber+1,1):new n.Range(ge.startLineNumber,ge.startColumn,ge.startLineNumber,X)}return ge});return de.sort(n.Range.compareRangesUsingStarts),de}}e.DeleteAllRightAction=q;class H extends I.EditorAction{constructor(){super({id:"editor.action.joinLines",label:c.localize(1127,"Join Lines"),alias:"Join Lines",precondition:t.EditorContextKeys.writable,kbOpts:{kbExpr:t.EditorContextKeys.editorTextFocus,primary:0,mac:{primary:296},weight:100}})}run(pe,ae){const ee=ae.getSelections();if(ee===null)return;let de=ae.getSelection();if(de===null)return;ee.sort(n.Range.compareRangesUsingStarts);const ge=[],X=ee.reduce((re,le)=>re.isEmpty()?re.endLineNumber===le.startLineNumber?(de.equalsSelection(re)&&(de=le),le):le.startLineNumber>re.endLineNumber+1?(ge.push(re),le):new o.Selection(re.startLineNumber,re.startColumn,le.endLineNumber,le.endColumn):le.startLineNumber>re.endLineNumber?(ge.push(re),le):new o.Selection(re.startLineNumber,re.startColumn,le.endLineNumber,le.endColumn));ge.push(X);const B=ae.getModel();if(B===null)return;const $=[],Q=[];let Z=de,te=0;for(let re=0,le=ge.length;re=1){let Oe=!0;Ne===""&&(Oe=!1),Oe&&(Ne.charAt(Ne.length-1)===" "||Ne.charAt(Ne.length-1)===" ")&&(Oe=!1,Ne=Ne.replace(/[\s\uFEFF\xA0]+$/g," "));const Fe=Ge.substr(it-1);Ne+=(Oe?" ":"")+Fe,Oe?Le=Fe.length+1:Le=Fe.length}else Le=0}const Ke=new n.Range(Ce,ye,Ee,Me);if(!Ke.isEmpty()){let ze;me.isEmpty()?($.push(b.EditOperation.replace(Ke,Ne)),ze=new o.Selection(Ke.startLineNumber-te,Ne.length-Le+1,Ce-te,Ne.length-Le+1)):me.startLineNumber===me.endLineNumber?($.push(b.EditOperation.replace(Ke,Ne)),ze=new o.Selection(me.startLineNumber-te,me.startColumn,me.endLineNumber-te,me.endColumn)):($.push(b.EditOperation.replace(Ke,Ne)),ze=new o.Selection(me.startLineNumber-te,me.startColumn,me.startLineNumber-te,Ne.length-Ae)),n.Range.intersectRanges(Ke,de)!==null?Z=ze:Q.push(ze)}te+=Ke.endLineNumber-Ke.startLineNumber}Q.unshift(Z),ae.pushUndoStop(),ae.executeEdits(this.id,$,Q),ae.pushUndoStop()}}e.JoinLinesAction=H;class z extends I.EditorAction{constructor(){super({id:"editor.action.transpose",label:c.localize(1128,"Transpose Characters around the Cursor"),alias:"Transpose Characters around the Cursor",precondition:t.EditorContextKeys.writable})}run(pe,ae){const ee=ae.getSelections();if(ee===null)return;const de=ae.getModel();if(de===null)return;const ge=[];for(let X=0,B=ee.length;X=Z){if(Q.lineNumber===de.getLineCount())continue;const te=new n.Range(Q.lineNumber,Math.max(1,Q.column-1),Q.lineNumber+1,1),re=de.getValueInRange(te).split("").reverse().join("");ge.push(new E.ReplaceCommand(new o.Selection(Q.lineNumber,Math.max(1,Q.column-1),Q.lineNumber+1,1),re))}else{const te=new n.Range(Q.lineNumber,Math.max(1,Q.column-1),Q.lineNumber,Q.column+1),re=de.getValueInRange(te).split("").reverse().join("");ge.push(new E.ReplaceCommandThatPreservesSelection(te,re,new o.Selection(Q.lineNumber,Q.column+1,Q.lineNumber,Q.column+1)))}}ae.pushUndoStop(),ae.executeCommands(this.id,ge),ae.pushUndoStop()}}e.TransposeAction=z;class U extends I.EditorAction{run(pe,ae){const ee=ae.getSelections();if(ee===null)return;const de=ae.getModel();if(de===null)return;const ge=ae.getOption(132),X=[];for(const B of ee)if(B.isEmpty()){const $=B.getStartPosition(),Q=ae.getConfiguredWordAtPosition($);if(!Q)continue;const Z=new n.Range($.lineNumber,Q.startColumn,$.lineNumber,Q.endColumn),te=de.getValueInRange(Z);X.push(b.EditOperation.replace(Z,this._modifyText(te,ge)))}else{const $=de.getValueInRange(B);X.push(b.EditOperation.replace(B,this._modifyText($,ge)))}ae.pushUndoStop(),ae.executeEdits(this.id,X),ae.pushUndoStop()}}e.AbstractCaseAction=U;class j extends U{constructor(){super({id:"editor.action.transformToUppercase",label:c.localize(1129,"Transform to Uppercase"),alias:"Transform to Uppercase",precondition:t.EditorContextKeys.writable})}_modifyText(pe,ae){return pe.toLocaleUpperCase()}}e.UpperCaseAction=j;class Y extends U{constructor(){super({id:"editor.action.transformToLowercase",label:c.localize(1130,"Transform to Lowercase"),alias:"Transform to Lowercase",precondition:t.EditorContextKeys.writable})}_modifyText(pe,ae){return pe.toLocaleLowerCase()}}e.LowerCaseAction=Y;class G{constructor(pe,ae){this._pattern=pe,this._flags=ae,this._actual=null,this._evaluated=!1}get(){if(!this._evaluated){this._evaluated=!0;try{this._actual=new RegExp(this._pattern,this._flags)}catch{}}return this._actual}isSupported(){return this.get()!==null}}class K extends U{static{this.titleBoundary=new G("(^|[^\\p{L}\\p{N}']|((^|\\P{L})'))\\p{L}","gmu")}constructor(){super({id:"editor.action.transformToTitlecase",label:c.localize(1131,"Transform to Title Case"),alias:"Transform to Title Case",precondition:t.EditorContextKeys.writable})}_modifyText(pe,ae){const ee=K.titleBoundary.get();return ee?pe.toLocaleLowerCase().replace(ee,de=>de.toLocaleUpperCase()):pe}}e.TitleCaseAction=K;class R extends U{static{this.caseBoundary=new G("(\\p{Ll})(\\p{Lu})","gmu")}static{this.singleLetters=new G("(\\p{Lu}|\\p{N})(\\p{Lu})(\\p{Ll})","gmu")}constructor(){super({id:"editor.action.transformToSnakecase",label:c.localize(1132,"Transform to Snake Case"),alias:"Transform to Snake Case",precondition:t.EditorContextKeys.writable})}_modifyText(pe,ae){const ee=R.caseBoundary.get(),de=R.singleLetters.get();return!ee||!de?pe:pe.replace(ee,"$1_$2").replace(de,"$1_$2$3").toLocaleLowerCase()}}e.SnakeCaseAction=R;class J extends U{static{this.wordBoundary=new G("[_\\s-]","gm")}constructor(){super({id:"editor.action.transformToCamelcase",label:c.localize(1133,"Transform to Camel Case"),alias:"Transform to Camel Case",precondition:t.EditorContextKeys.writable})}_modifyText(pe,ae){const ee=J.wordBoundary.get();if(!ee)return pe;const de=pe.split(ee);return de.shift()+de.map(X=>X.substring(0,1).toLocaleUpperCase()+X.substring(1)).join("")}}e.CamelCaseAction=J;class ie extends U{static{this.wordBoundary=new G("[_\\s-]","gm")}static{this.wordBoundaryToMaintain=new G("(?<=\\.)","gm")}constructor(){super({id:"editor.action.transformToPascalcase",label:c.localize(1134,"Transform to Pascal Case"),alias:"Transform to Pascal Case",precondition:t.EditorContextKeys.writable})}_modifyText(pe,ae){const ee=ie.wordBoundary.get(),de=ie.wordBoundaryToMaintain.get();return!ee||!de?pe:pe.split(de).map(B=>B.split(ee)).flat().map(B=>B.substring(0,1).toLocaleUpperCase()+B.substring(1)).join("")}}e.PascalCaseAction=ie;class ue extends U{static isSupported(){return[this.caseBoundary,this.singleLetters,this.underscoreBoundary].every(ae=>ae.isSupported())}static{this.caseBoundary=new G("(\\p{Ll})(\\p{Lu})","gmu")}static{this.singleLetters=new G("(\\p{Lu}|\\p{N})(\\p{Lu}\\p{Ll})","gmu")}static{this.underscoreBoundary=new G("(\\S)(_)(\\S)","gm")}constructor(){super({id:"editor.action.transformToKebabcase",label:c.localize(1135,"Transform to Kebab Case"),alias:"Transform to Kebab Case",precondition:t.EditorContextKeys.writable})}_modifyText(pe,ae){const ee=ue.caseBoundary.get(),de=ue.singleLetters.get(),ge=ue.underscoreBoundary.get();return!ee||!de||!ge?pe:pe.replace(ge,"$1-$3").replace(ee,"$1-$2").replace(de,"$1-$2").toLocaleLowerCase()}}e.KebabCaseAction=ue,(0,I.registerEditorAction)(C),(0,I.registerEditorAction)(f),(0,I.registerEditorAction)(h),(0,I.registerEditorAction)(w),(0,I.registerEditorAction)(S),(0,I.registerEditorAction)(D),(0,I.registerEditorAction)(T),(0,I.registerEditorAction)(M),(0,I.registerEditorAction)(A),(0,I.registerEditorAction)(P),(0,I.registerEditorAction)(N),(0,I.registerEditorAction)(O),(0,I.registerEditorAction)(F),(0,I.registerEditorAction)(x),(0,I.registerEditorAction)(V),(0,I.registerEditorAction)(q),(0,I.registerEditorAction)(H),(0,I.registerEditorAction)(z),(0,I.registerEditorAction)(j),(0,I.registerEditorAction)(Y),R.caseBoundary.isSupported()&&R.singleLetters.isSupported()&&(0,I.registerEditorAction)(R),J.wordBoundary.isSupported()&&(0,I.registerEditorAction)(J),ie.wordBoundary.isSupported()&&(0,I.registerEditorAction)(ie),K.titleBoundary.isSupported()&&(0,I.registerEditorAction)(K),ue.isSupported()&&(0,I.registerEditorAction)(ue)}),define(ne[740],se([1,0,2,15]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class I extends d.Disposable{static{this.ID="editor.contrib.longLinesHelper"}constructor(y){super(),this._editor=y,this._register(this._editor.onMouseDown(m=>{const _=this._editor.getOption(118);_>=0&&m.target.type===6&&m.target.position.column>=_&&this._editor.updateOptions({stopRenderingLineAfter:-1})}))}}(0,k.registerEditorContribution)(I.ID,I,2)}),define(ne[184],se([1,0,207,46,6,57,2,15,4,120,3,12,59,5,525]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t){"use strict";var i;Object.defineProperty(e,"__esModule",{value:!0}),e.MessageController=void 0;let s=class{static{i=this}static{this.ID="editor.contrib.messageController"}static{this.MESSAGE_VISIBLE=new n.RawContextKey("messageVisible",!1,p.localize(1148,"Whether the editor is currently showing an inline message"))}static get(a){return a.getContribution(i.ID)}constructor(a,r,u){this._openerService=u,this._messageWidget=new y.MutableDisposable,this._messageListeners=new y.DisposableStore,this._mouseOverMessage=!1,this._editor=a,this._visible=i.MESSAGE_VISIBLE.bindTo(r)}dispose(){this._message?.dispose(),this._messageListeners.dispose(),this._messageWidget.dispose(),this._visible.reset()}showMessage(a,r){(0,k.alert)((0,E.isMarkdownString)(a)?a.value:a),this._visible.set(!0),this._messageWidget.clear(),this._messageListeners.clear(),this._message=(0,E.isMarkdownString)(a)?(0,d.renderMarkdown)(a,{actionHandler:{callback:C=>{this.closeMessage(),(0,b.openLinkFromMarkdown)(this._openerService,C,(0,E.isMarkdownString)(a)?a.isTrusted:void 0)},disposables:this._messageListeners}}):void 0,this._messageWidget.value=new c(this._editor,r,typeof a=="string"?a:this._message.element),this._messageListeners.add(I.Event.debounce(this._editor.onDidBlurEditorText,(C,f)=>f,0)(()=>{this._mouseOverMessage||this._messageWidget.value&&t.isAncestor(t.getActiveElement(),this._messageWidget.value.getDomNode())||this.closeMessage()})),this._messageListeners.add(this._editor.onDidChangeCursorPosition(()=>this.closeMessage())),this._messageListeners.add(this._editor.onDidDispose(()=>this.closeMessage())),this._messageListeners.add(this._editor.onDidChangeModel(()=>this.closeMessage())),this._messageListeners.add(t.addDisposableListener(this._messageWidget.value.getDomNode(),t.EventType.MOUSE_ENTER,()=>this._mouseOverMessage=!0,!0)),this._messageListeners.add(t.addDisposableListener(this._messageWidget.value.getDomNode(),t.EventType.MOUSE_LEAVE,()=>this._mouseOverMessage=!1,!0));let u;this._messageListeners.add(this._editor.onMouseMove(C=>{C.target.position&&(u?u.containsPosition(C.target.position)||this.closeMessage():u=new _.Range(r.lineNumber-3,1,C.target.position.lineNumber+3,1))}))}closeMessage(){this._visible.reset(),this._messageListeners.clear(),this._messageWidget.value&&this._messageListeners.add(c.fadeOut(this._messageWidget.value))}};e.MessageController=s,e.MessageController=s=i=ke([ce(1,n.IContextKeyService),ce(2,o.IOpenerService)],s);const g=m.EditorCommand.bindToContribution(s.get);(0,m.registerEditorCommand)(new g({id:"leaveEditorMessage",precondition:s.MESSAGE_VISIBLE,handler:l=>l.closeMessage(),kbOpts:{weight:130,primary:9}}));class c{static fadeOut(a){const r=()=>{a.dispose(),clearTimeout(u),a.getDomNode().removeEventListener("animationend",r)},u=setTimeout(r,110);return a.getDomNode().addEventListener("animationend",r),a.getDomNode().classList.add("fadeOut"),{dispose:r}}constructor(a,{lineNumber:r,column:u},C){this.allowEditorOverflow=!0,this.suppressMouseDown=!1,this._editor=a,this._editor.revealLinesInCenterIfOutsideViewport(r,r,0),this._position={lineNumber:r,column:u},this._domNode=document.createElement("div"),this._domNode.classList.add("monaco-editor-overlaymessage"),this._domNode.style.marginLeft="-6px";const f=document.createElement("div");f.classList.add("anchor","top"),this._domNode.appendChild(f);const h=document.createElement("div");typeof C=="string"?(h.classList.add("message"),h.textContent=C):(C.classList.add("message"),h.appendChild(C)),this._domNode.appendChild(h);const v=document.createElement("div");v.classList.add("anchor","below"),this._domNode.appendChild(v),this._editor.addContentWidget(this),this._domNode.classList.add("fadeIn")}dispose(){this._editor.removeContentWidget(this)}getId(){return"messageoverlay"}getDomNode(){return this._domNode}getPosition(){return{position:this._position,preference:[1,2],positionAffinity:1}}afterRender(a){this._domNode.classList.toggle("below",a===2)}}(0,m.registerEditorContribution)(s.ID,s,4)}),define(ne[741],se([1,0,57,2,15,184,3]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReadOnlyMessageController=void 0;class m extends k.Disposable{static{this.ID="editor.contrib.readOnlyMessageController"}constructor(b){super(),this.editor=b,this._register(this.editor.onDidAttemptReadOnlyEdit(()=>this._onDidAttemptReadOnlyEdit()))}_onDidAttemptReadOnlyEdit(){const b=E.MessageController.get(this.editor);if(b&&this.editor.hasModel()){let p=this.editor.getOptions().get(93);p||(this.editor.isSimpleWidget?p=new d.MarkdownString(y.localize(1233,"Cannot edit in read-only input")):p=new d.MarkdownString(y.localize(1234,"Cannot edit in read-only editor"))),b.showMessage(p,this.editor.getPosition())}}}e.ReadOnlyMessageController=m,(0,I.registerEditorContribution)(m.ID,m,2)}),define(ne[742],se([1,0,13,18,8,15,9,4,23,20,340,621,3,29,24,17,78,19,22]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l){"use strict";var a;Object.defineProperty(e,"__esModule",{value:!0}),e.SmartSelectController=void 0,e.provideSelectionRanges=v;class r{constructor(S,L){this.index=S,this.ranges=L}mov(S){const L=this.index+(S?1:-1);if(L<0||L>=this.ranges.length)return this;const D=new r(L,this.ranges);return D.ranges[L].equalsRange(this.ranges[this.index])?D.mov(S):D}}let u=class{static{a=this}static{this.ID="editor.contrib.smartSelectController"}static get(S){return S.getContribution(a.ID)}constructor(S,L){this._editor=S,this._languageFeaturesService=L,this._ignoreSelection=!1}dispose(){this._selectionListener?.dispose()}async run(S){if(!this._editor.hasModel())return;const L=this._editor.getSelections(),D=this._editor.getModel();if(this._state||await v(this._languageFeaturesService.selectionRangeProvider,D,L.map(M=>M.getPosition()),this._editor.getOption(114),k.CancellationToken.None).then(M=>{if(!(!d.isNonEmptyArray(M)||M.length!==L.length)&&!(!this._editor.hasModel()||!d.equals(this._editor.getSelections(),L,(A,P)=>A.equalsSelection(P)))){for(let A=0;AP.containsPosition(L[A].getStartPosition())&&P.containsPosition(L[A].getEndPosition())),M[A].unshift(L[A]);this._state=M.map(A=>new r(0,A)),this._selectionListener?.dispose(),this._selectionListener=this._editor.onDidChangeCursorPosition(()=>{this._ignoreSelection||(this._selectionListener?.dispose(),this._state=void 0)})}}),!this._state)return;this._state=this._state.map(M=>M.mov(S));const T=this._state.map(M=>_.Selection.fromPositions(M.ranges[M.index].getStartPosition(),M.ranges[M.index].getEndPosition()));this._ignoreSelection=!0;try{this._editor.setSelections(T)}finally{this._ignoreSelection=!1}}};e.SmartSelectController=u,e.SmartSelectController=u=a=ke([ce(1,s.ILanguageFeaturesService)],u);class C extends E.EditorAction{constructor(S,L){super(L),this._forward=S}async run(S,L){const D=u.get(L);D&&await D.run(this._forward)}}class f extends C{constructor(){super(!0,{id:"editor.action.smartSelect.expand",label:o.localize(1253,"Expand Selection"),alias:"Expand Selection",precondition:void 0,kbOpts:{kbExpr:b.EditorContextKeys.editorTextFocus,primary:1553,mac:{primary:3345,secondary:[1297]},weight:100},menuOpts:{menuId:t.MenuId.MenubarSelectionMenu,group:"1_basic",title:o.localize(1254,"&&Expand Selection"),order:2}})}}i.CommandsRegistry.registerCommandAlias("editor.action.smartSelect.grow","editor.action.smartSelect.expand");class h extends C{constructor(){super(!1,{id:"editor.action.smartSelect.shrink",label:o.localize(1255,"Shrink Selection"),alias:"Shrink Selection",precondition:void 0,kbOpts:{kbExpr:b.EditorContextKeys.editorTextFocus,primary:1551,mac:{primary:3343,secondary:[1295]},weight:100},menuOpts:{menuId:t.MenuId.MenubarSelectionMenu,group:"1_basic",title:o.localize(1256,"&&Shrink Selection"),order:3}})}}(0,E.registerEditorContribution)(u.ID,u,4),(0,E.registerEditorAction)(f),(0,E.registerEditorAction)(h);async function v(w,S,L,D,T){const M=w.all(S).concat(new n.WordSelectionRangeProvider(D.selectSubwords));M.length===1&&M.unshift(new p.BracketSelectionRangeProvider);const A=[],P=[];for(const N of M)A.push(Promise.resolve(N.provideSelectionRanges(S,L,T)).then(O=>{if(d.isNonEmptyArray(O)&&O.length===L.length)for(let F=0;F{if(N.length===0)return[];N.sort((W,V)=>y.Position.isBefore(W.getStartPosition(),V.getStartPosition())?1:y.Position.isBefore(V.getStartPosition(),W.getStartPosition())||y.Position.isBefore(W.getEndPosition(),V.getEndPosition())?-1:y.Position.isBefore(V.getEndPosition(),W.getEndPosition())?1:0);const O=[];let F;for(const W of N)(!F||m.Range.containsRange(W,F)&&!m.Range.equalsRange(W,F))&&(O.push(W),F=W);if(!D.selectLeadingAndTrailingWhitespace)return O;const x=[O[0]];for(let W=1;W{g.hasChanged(127)&&(this._config=this._editor.getOption(127),this._checkForUnusualLineTerminators())})),this._register(this._editor.onDidChangeModel(()=>{this._checkForUnusualLineTerminators()})),this._register(this._editor.onDidChangeModelContent(g=>{g.isUndoing||this._checkForUnusualLineTerminators()})),this._checkForUnusualLineTerminators()}async _checkForUnusualLineTerminators(){if(this._config==="off"||!this._editor.hasModel())return;const t=this._editor.getModel();if(!t.mightContainUnusualLineTerminators()||p(this._codeEditorService,t)===!0||this._editor.getOption(92))return;if(this._config==="auto"){t.removeUnusualLineTerminators(this._editor.getSelections());return}if(this._isPresentingDialog)return;let s;try{this._isPresentingDialog=!0,s=await this._dialogService.confirm({title:y.localize(1410,"Unusual Line Terminators"),message:y.localize(1411,"Detected unusual line terminators"),detail:y.localize(1412,"The file '{0}' contains one or more unusual line terminator characters, like Line Separator (LS) or Paragraph Separator (PS).\n\nIt is recommended to remove them from the file. This can be configured via `editor.unusualLineTerminators`.",(0,k.basename)(t.uri)),primaryButton:y.localize(1413,"&&Remove Unusual Line Terminators"),cancelButton:y.localize(1414,"Ignore")})}finally{this._isPresentingDialog=!1}if(!s.confirmed){b(this._codeEditorService,t,!0);return}t.removeUnusualLineTerminators(this._editor.getSelections())}};e.UnusualLineTerminatorsDetector=n,e.UnusualLineTerminatorsDetector=n=ke([ce(1,m.IDialogService),ce(2,E.ICodeEditorService)],n),(0,I.registerEditorContribution)(n.ID,n,1)}),define(ne[411],se([1,0,15,146,37,76,199,166,9,4,23,20,36,3,61,12,179]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DeleteInsideWord=e.DeleteWordRight=e.DeleteWordEndRight=e.DeleteWordStartRight=e.DeleteWordLeft=e.DeleteWordEndLeft=e.DeleteWordStartLeft=e.DeleteWordRightCommand=e.DeleteWordLeftCommand=e.DeleteWordCommand=e.CursorWordAccessibilityRightSelect=e.CursorWordAccessibilityRight=e.CursorWordRightSelect=e.CursorWordEndRightSelect=e.CursorWordStartRightSelect=e.CursorWordRight=e.CursorWordEndRight=e.CursorWordStartRight=e.CursorWordAccessibilityLeftSelect=e.CursorWordAccessibilityLeft=e.CursorWordLeftSelect=e.CursorWordEndLeftSelect=e.CursorWordStartLeftSelect=e.CursorWordLeft=e.CursorWordEndLeft=e.CursorWordStartLeft=e.WordRightCommand=e.WordLeftCommand=e.MoveWordCommand=void 0;class c extends d.EditorCommand{constructor(K){super(K),this._inSelectionMode=K.inSelectionMode,this._wordNavigationType=K.wordNavigationType}runEditorCommand(K,R,J){if(!R.hasModel())return;const ie=(0,m.getMapForWordSeparators)(R.getOption(132),R.getOption(131)),ue=R.getModel(),he=R.getSelections(),pe=he.length>1,ae=he.map(ee=>{const de=new _.Position(ee.positionLineNumber,ee.positionColumn),ge=this._move(ie,ue,de,this._wordNavigationType,pe);return this._moveTo(ee,ge,this._inSelectionMode)});if(ue.pushStackElement(),R._getViewModel().setCursorStates("moveWordCommand",3,ae.map(ee=>E.CursorState.fromModelSelection(ee))),ae.length===1){const ee=new _.Position(ae[0].positionLineNumber,ae[0].positionColumn);R.revealPosition(ee,0)}}_moveTo(K,R,J){return J?new p.Selection(K.selectionStartLineNumber,K.selectionStartColumn,R.lineNumber,R.column):new p.Selection(R.lineNumber,R.column,R.lineNumber,R.column)}}e.MoveWordCommand=c;class l extends c{_move(K,R,J,ie,ue){return y.WordOperations.moveWordLeft(K,R,J,ie,ue)}}e.WordLeftCommand=l;class a extends c{_move(K,R,J,ie,ue){return y.WordOperations.moveWordRight(K,R,J,ie)}}e.WordRightCommand=a;class r extends l{constructor(){super({inSelectionMode:!1,wordNavigationType:0,id:"cursorWordStartLeft",precondition:void 0})}}e.CursorWordStartLeft=r;class u extends l{constructor(){super({inSelectionMode:!1,wordNavigationType:2,id:"cursorWordEndLeft",precondition:void 0})}}e.CursorWordEndLeft=u;class C extends l{constructor(){super({inSelectionMode:!1,wordNavigationType:1,id:"cursorWordLeft",precondition:void 0,kbOpts:{kbExpr:s.ContextKeyExpr.and(n.EditorContextKeys.textInputFocus,s.ContextKeyExpr.and(i.CONTEXT_ACCESSIBILITY_MODE_ENABLED,g.IsWindowsContext)?.negate()),primary:2063,mac:{primary:527},weight:100}})}}e.CursorWordLeft=C;class f extends l{constructor(){super({inSelectionMode:!0,wordNavigationType:0,id:"cursorWordStartLeftSelect",precondition:void 0})}}e.CursorWordStartLeftSelect=f;class h extends l{constructor(){super({inSelectionMode:!0,wordNavigationType:2,id:"cursorWordEndLeftSelect",precondition:void 0})}}e.CursorWordEndLeftSelect=h;class v extends l{constructor(){super({inSelectionMode:!0,wordNavigationType:1,id:"cursorWordLeftSelect",precondition:void 0,kbOpts:{kbExpr:s.ContextKeyExpr.and(n.EditorContextKeys.textInputFocus,s.ContextKeyExpr.and(i.CONTEXT_ACCESSIBILITY_MODE_ENABLED,g.IsWindowsContext)?.negate()),primary:3087,mac:{primary:1551},weight:100}})}}e.CursorWordLeftSelect=v;class w extends l{constructor(){super({inSelectionMode:!1,wordNavigationType:3,id:"cursorWordAccessibilityLeft",precondition:void 0})}_move(K,R,J,ie,ue){return super._move((0,m.getMapForWordSeparators)(I.EditorOptions.wordSeparators.defaultValue,K.intlSegmenterLocales),R,J,ie,ue)}}e.CursorWordAccessibilityLeft=w;class S extends l{constructor(){super({inSelectionMode:!0,wordNavigationType:3,id:"cursorWordAccessibilityLeftSelect",precondition:void 0})}_move(K,R,J,ie,ue){return super._move((0,m.getMapForWordSeparators)(I.EditorOptions.wordSeparators.defaultValue,K.intlSegmenterLocales),R,J,ie,ue)}}e.CursorWordAccessibilityLeftSelect=S;class L extends a{constructor(){super({inSelectionMode:!1,wordNavigationType:0,id:"cursorWordStartRight",precondition:void 0})}}e.CursorWordStartRight=L;class D extends a{constructor(){super({inSelectionMode:!1,wordNavigationType:2,id:"cursorWordEndRight",precondition:void 0,kbOpts:{kbExpr:s.ContextKeyExpr.and(n.EditorContextKeys.textInputFocus,s.ContextKeyExpr.and(i.CONTEXT_ACCESSIBILITY_MODE_ENABLED,g.IsWindowsContext)?.negate()),primary:2065,mac:{primary:529},weight:100}})}}e.CursorWordEndRight=D;class T extends a{constructor(){super({inSelectionMode:!1,wordNavigationType:2,id:"cursorWordRight",precondition:void 0})}}e.CursorWordRight=T;class M extends a{constructor(){super({inSelectionMode:!0,wordNavigationType:0,id:"cursorWordStartRightSelect",precondition:void 0})}}e.CursorWordStartRightSelect=M;class A extends a{constructor(){super({inSelectionMode:!0,wordNavigationType:2,id:"cursorWordEndRightSelect",precondition:void 0,kbOpts:{kbExpr:s.ContextKeyExpr.and(n.EditorContextKeys.textInputFocus,s.ContextKeyExpr.and(i.CONTEXT_ACCESSIBILITY_MODE_ENABLED,g.IsWindowsContext)?.negate()),primary:3089,mac:{primary:1553},weight:100}})}}e.CursorWordEndRightSelect=A;class P extends a{constructor(){super({inSelectionMode:!0,wordNavigationType:2,id:"cursorWordRightSelect",precondition:void 0})}}e.CursorWordRightSelect=P;class N extends a{constructor(){super({inSelectionMode:!1,wordNavigationType:3,id:"cursorWordAccessibilityRight",precondition:void 0})}_move(K,R,J,ie,ue){return super._move((0,m.getMapForWordSeparators)(I.EditorOptions.wordSeparators.defaultValue,K.intlSegmenterLocales),R,J,ie,ue)}}e.CursorWordAccessibilityRight=N;class O extends a{constructor(){super({inSelectionMode:!0,wordNavigationType:3,id:"cursorWordAccessibilityRightSelect",precondition:void 0})}_move(K,R,J,ie,ue){return super._move((0,m.getMapForWordSeparators)(I.EditorOptions.wordSeparators.defaultValue,K.intlSegmenterLocales),R,J,ie,ue)}}e.CursorWordAccessibilityRightSelect=O;class F extends d.EditorCommand{constructor(K){super(K),this._whitespaceHeuristics=K.whitespaceHeuristics,this._wordNavigationType=K.wordNavigationType}runEditorCommand(K,R,J){const ie=K.get(o.ILanguageConfigurationService);if(!R.hasModel())return;const ue=(0,m.getMapForWordSeparators)(R.getOption(132),R.getOption(131)),he=R.getModel(),pe=R.getSelections(),ae=R.getOption(6),ee=R.getOption(11),de=ie.getLanguageConfiguration(he.getLanguageId()).getAutoClosingPairs(),ge=R._getViewModel(),X=pe.map(B=>{const $=this._delete({wordSeparators:ue,model:he,selection:B,whitespaceHeuristics:this._whitespaceHeuristics,autoClosingDelete:R.getOption(9),autoClosingBrackets:ae,autoClosingQuotes:ee,autoClosingPairs:de,autoClosedCharacters:ge.getCursorAutoClosedCharacters()},this._wordNavigationType);return new k.ReplaceCommand($,"")});R.pushUndoStop(),R.executeCommands(this.id,X),R.pushUndoStop()}}e.DeleteWordCommand=F;class x extends F{_delete(K,R){const J=y.WordOperations.deleteWordLeft(K,R);return J||new b.Range(1,1,1,1)}}e.DeleteWordLeftCommand=x;class W extends F{_delete(K,R){const J=y.WordOperations.deleteWordRight(K,R);if(J)return J;const ie=K.model.getLineCount(),ue=K.model.getLineMaxColumn(ie);return new b.Range(ie,ue,ie,ue)}}e.DeleteWordRightCommand=W;class V extends x{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:0,id:"deleteWordStartLeft",precondition:n.EditorContextKeys.writable})}}e.DeleteWordStartLeft=V;class q extends x{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:2,id:"deleteWordEndLeft",precondition:n.EditorContextKeys.writable})}}e.DeleteWordEndLeft=q;class H extends x{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:0,id:"deleteWordLeft",precondition:n.EditorContextKeys.writable,kbOpts:{kbExpr:n.EditorContextKeys.textInputFocus,primary:2049,mac:{primary:513},weight:100}})}}e.DeleteWordLeft=H;class z extends W{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:0,id:"deleteWordStartRight",precondition:n.EditorContextKeys.writable})}}e.DeleteWordStartRight=z;class U extends W{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:2,id:"deleteWordEndRight",precondition:n.EditorContextKeys.writable})}}e.DeleteWordEndRight=U;class j extends W{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:2,id:"deleteWordRight",precondition:n.EditorContextKeys.writable,kbOpts:{kbExpr:n.EditorContextKeys.textInputFocus,primary:2068,mac:{primary:532},weight:100}})}}e.DeleteWordRight=j;class Y extends d.EditorAction{constructor(){super({id:"deleteInsideWord",precondition:n.EditorContextKeys.writable,label:t.localize(1427,"Delete Word"),alias:"Delete Word"})}run(K,R,J){if(!R.hasModel())return;const ie=(0,m.getMapForWordSeparators)(R.getOption(132),R.getOption(131)),ue=R.getModel(),pe=R.getSelections().map(ae=>{const ee=y.WordOperations.deleteInsideWord(ie,ue,ae);return new k.ReplaceCommand(ee,"")});R.pushUndoStop(),R.executeCommands(this.id,pe),R.pushUndoStop()}}e.DeleteInsideWord=Y,(0,d.registerEditorCommand)(new r),(0,d.registerEditorCommand)(new u),(0,d.registerEditorCommand)(new C),(0,d.registerEditorCommand)(new f),(0,d.registerEditorCommand)(new h),(0,d.registerEditorCommand)(new v),(0,d.registerEditorCommand)(new L),(0,d.registerEditorCommand)(new D),(0,d.registerEditorCommand)(new T),(0,d.registerEditorCommand)(new M),(0,d.registerEditorCommand)(new A),(0,d.registerEditorCommand)(new P),(0,d.registerEditorCommand)(new w),(0,d.registerEditorCommand)(new S),(0,d.registerEditorCommand)(new N),(0,d.registerEditorCommand)(new O),(0,d.registerEditorCommand)(new V),(0,d.registerEditorCommand)(new q),(0,d.registerEditorCommand)(new H),(0,d.registerEditorCommand)(new z),(0,d.registerEditorCommand)(new U),(0,d.registerEditorCommand)(new j),(0,d.registerEditorAction)(Y)}),define(ne[745],se([1,0,15,199,4,20,411,24]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CursorWordPartRightSelect=e.CursorWordPartRight=e.WordPartRightCommand=e.CursorWordPartLeftSelect=e.CursorWordPartLeft=e.WordPartLeftCommand=e.DeleteWordPartRight=e.DeleteWordPartLeft=void 0;class _ extends y.DeleteWordCommand{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:0,id:"deleteWordPartLeft",precondition:E.EditorContextKeys.writable,kbOpts:{kbExpr:E.EditorContextKeys.textInputFocus,primary:0,mac:{primary:769},weight:100}})}_delete(c,l){const a=k.WordPartOperations.deleteWordPartLeft(c);return a||new I.Range(1,1,1,1)}}e.DeleteWordPartLeft=_;class b extends y.DeleteWordCommand{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:2,id:"deleteWordPartRight",precondition:E.EditorContextKeys.writable,kbOpts:{kbExpr:E.EditorContextKeys.textInputFocus,primary:0,mac:{primary:788},weight:100}})}_delete(c,l){const a=k.WordPartOperations.deleteWordPartRight(c);if(a)return a;const r=c.model.getLineCount(),u=c.model.getLineMaxColumn(r);return new I.Range(r,u,r,u)}}e.DeleteWordPartRight=b;class p extends y.MoveWordCommand{_move(c,l,a,r,u){return k.WordPartOperations.moveWordPartLeft(c,l,a,u)}}e.WordPartLeftCommand=p;class n extends p{constructor(){super({inSelectionMode:!1,wordNavigationType:0,id:"cursorWordPartLeft",precondition:void 0,kbOpts:{kbExpr:E.EditorContextKeys.textInputFocus,primary:0,mac:{primary:783},weight:100}})}}e.CursorWordPartLeft=n,m.CommandsRegistry.registerCommandAlias("cursorWordPartStartLeft","cursorWordPartLeft");class o extends p{constructor(){super({inSelectionMode:!0,wordNavigationType:0,id:"cursorWordPartLeftSelect",precondition:void 0,kbOpts:{kbExpr:E.EditorContextKeys.textInputFocus,primary:0,mac:{primary:1807},weight:100}})}}e.CursorWordPartLeftSelect=o,m.CommandsRegistry.registerCommandAlias("cursorWordPartStartLeftSelect","cursorWordPartLeftSelect");class t extends y.MoveWordCommand{_move(c,l,a,r,u){return k.WordPartOperations.moveWordPartRight(c,l,a)}}e.WordPartRightCommand=t;class i extends t{constructor(){super({inSelectionMode:!1,wordNavigationType:2,id:"cursorWordPartRight",precondition:void 0,kbOpts:{kbExpr:E.EditorContextKeys.textInputFocus,primary:0,mac:{primary:785},weight:100}})}}e.CursorWordPartRight=i;class s extends t{constructor(){super({inSelectionMode:!0,wordNavigationType:2,id:"cursorWordPartRightSelect",precondition:void 0,kbOpts:{kbExpr:E.EditorContextKeys.textInputFocus,primary:0,mac:{primary:1809},weight:100}})}}e.CursorWordPartRightSelect=s,(0,d.registerEditorCommand)(new _),(0,d.registerEditorCommand)(new b),(0,d.registerEditorCommand)(new n),(0,d.registerEditorCommand)(new o),(0,d.registerEditorCommand)(new i),(0,d.registerEditorCommand)(new s)}),define(ne[746],se([1,0,5,2,15,16,538]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IPadShowKeyboard=void 0;class y extends k.Disposable{static{this.ID="editor.contrib.iPadShowKeyboard"}constructor(b){super(),this.editor=b,this.widget=null,E.isIOS&&(this._register(b.onDidChangeConfiguration(()=>this.update())),this.update())}update(){const b=!this.editor.getOption(92);!this.widget&&b?this.widget=new m(this.editor):this.widget&&!b&&(this.widget.dispose(),this.widget=null)}dispose(){super.dispose(),this.widget&&(this.widget.dispose(),this.widget=null)}}e.IPadShowKeyboard=y;class m extends k.Disposable{static{this.ID="editor.contrib.ShowKeyboardWidget"}constructor(b){super(),this.editor=b,this._domNode=document.createElement("textarea"),this._domNode.className="iPadShowKeyboard",this._register(d.addDisposableListener(this._domNode,"touchstart",p=>{this.editor.focus()})),this._register(d.addDisposableListener(this._domNode,"focus",p=>{this.editor.focus()})),this.editor.addOverlayWidget(this)}dispose(){this.editor.removeOverlayWidget(this),super.dispose()}getId(){return m.ID}getDomNode(){return this._domNode}getPosition(){return{preference:1}}}(0,I.registerEditorContribution)(y.ID,y,3)}),define(ne[747],se([1,0,5,33,2,15,27,148,177,43,153,107,539]),function(oe,e,d,k,I,E,y,m,_,b,p,n){"use strict";var o;Object.defineProperty(e,"__esModule",{value:!0});let t=class extends I.Disposable{static{o=this}static{this.ID="editor.contrib.inspectTokens"}static get(a){return a.getContribution(o.ID)}constructor(a,r,u){super(),this._editor=a,this._languageService=u,this._widget=null,this._register(this._editor.onDidChangeModel(C=>this.stop())),this._register(this._editor.onDidChangeModelLanguage(C=>this.stop())),this._register(y.TokenizationRegistry.onDidChange(C=>this.stop())),this._register(this._editor.onKeyUp(C=>C.keyCode===9&&this.stop()))}dispose(){this.stop(),super.dispose()}launch(){this._widget||this._editor.hasModel()&&(this._widget=new c(this._editor,this._languageService))}stop(){this._widget&&(this._widget.dispose(),this._widget=null)}};t=o=ke([ce(1,p.IStandaloneThemeService),ce(2,b.ILanguageService)],t);class i extends E.EditorAction{constructor(){super({id:"editor.action.inspectTokens",label:n.InspectTokensNLS.inspectTokensAction,alias:"Developer: Inspect Tokens",precondition:void 0})}run(a,r){t.get(r)?.launch()}}function s(l){let a="";for(let r=0,u=l.length;r_.NullState,tokenize:(C,f,h)=>(0,_.nullTokenize)(a,h),tokenizeEncoded:(C,f,h)=>(0,_.nullTokenizeEncoded)(u,h)}}class c extends I.Disposable{static{this._ID="editor.contrib.inspectTokensWidget"}constructor(a,r){super(),this.allowEditorOverflow=!0,this._editor=a,this._languageService=r,this._model=this._editor.getModel(),this._domNode=document.createElement("div"),this._domNode.className="tokens-inspect-widget",this._tokenizationSupport=g(this._languageService.languageIdCodec,this._model.getLanguageId()),this._compute(this._editor.getPosition()),this._register(this._editor.onDidChangeCursorPosition(u=>this._compute(this._editor.getPosition()))),this._editor.addContentWidget(this)}dispose(){this._editor.removeContentWidget(this),super.dispose()}getId(){return c._ID}_compute(a){const r=this._getTokensAtLine(a.lineNumber);let u=0;for(let w=r.tokens1.length-1;w>=0;w--){const S=r.tokens1[w];if(a.column-1>=S.offset){u=w;break}}let C=0;for(let w=r.tokens2.length>>>1;w>=0;w--)if(a.column-1>=r.tokens2[w<<1]){C=w;break}const f=this._model.getLineContent(a.lineNumber);let h="";if(u"}static{this.TFIDF_THRESHOLD=.5}static{this.TFIDF_MAX_RESULTS=5}static{this.WORD_FILTER=(0,I.or)(I.matchesPrefix,I.matchesWords,I.matchesContiguousSubString)}constructor(h,v,w,S,L,D){super(a.PREFIX,h),this.instantiationService=v,this.keybindingService=w,this.commandService=S,this.telemetryService=L,this.dialogService=D,this.commandsHistory=this._register(this.instantiationService.createInstance(C)),this.options=h}async _getPicks(h,v,w,S){const L=await this.getCommandPicks(w);if(w.isCancellationRequested)return[];const D=(0,E.createSingleCallFunction)(()=>{const F=new _.TfIdfCalculator;F.updateDocuments(L.map(W=>({key:W.commandId,textChunks:[this.getTfIdfChunk(W)]})));const x=F.calculateScores(h,w);return(0,_.normalizeTfIdfScores)(x).filter(W=>W.score>a.TFIDF_THRESHOLD).slice(0,a.TFIDF_MAX_RESULTS)}),T=[];for(const F of L){const x=a.WORD_FILTER(h,F.label)??void 0,W=F.commandAlias?a.WORD_FILTER(h,F.commandAlias)??void 0:void 0;if(x||W)F.highlights={label:x,detail:this.options.showAlias?W:void 0},T.push(F);else if(h===F.commandId)T.push(F);else if(h.length>=3){const V=D();if(w.isCancellationRequested)return[];const q=V.find(H=>H.key===F.commandId);q&&(F.tfIdfScore=q.score,T.push(F))}}const M=new Map;for(const F of T){const x=M.get(F.label);x?(F.description=F.commandId,x.description=x.commandId):M.set(F.label,F)}T.sort((F,x)=>{if(F.tfIdfScore&&x.tfIdfScore)return F.tfIdfScore===x.tfIdfScore?F.label.localeCompare(x.label):x.tfIdfScore-F.tfIdfScore;if(F.tfIdfScore)return 1;if(x.tfIdfScore)return-1;const W=this.commandsHistory.peek(F.commandId),V=this.commandsHistory.peek(x.commandId);if(W&&V)return W>V?-1:1;if(W)return-1;if(V)return 1;if(this.options.suggestedCommandIds){const q=this.options.suggestedCommandIds.has(F.commandId),H=this.options.suggestedCommandIds.has(x.commandId);if(q&&H)return 0;if(q)return-1;if(H)return 1}return F.label.localeCompare(x.label)});const A=[];let P=!1,N=!0,O=!!this.options.suggestedCommandIds;for(let F=0;F{const F=await this.getAdditionalCommandPicks(L,T,h,w);if(w.isCancellationRequested)return[];const x=F.map(W=>this.toCommandPick(W,S));return N&&x[0]?.type!=="separator"&&x.unshift({type:"separator",label:(0,b.localize)(1576,"similar commands")}),x})()}:A}toCommandPick(h,v){if(h.type==="separator")return h;const w=this.keybindingService.lookupKeybinding(h.commandId),S=w?(0,b.localize)(1577,"{0}, {1}",h.label,w.getAriaLabel()):h.label;return{...h,ariaLabel:S,detail:this.options.showAlias&&h.commandAlias!==h.label?h.commandAlias:void 0,keybinding:w,accept:async()=>{this.commandsHistory.push(h.commandId),this.telemetryService.publicLog2("workbenchActionExecuted",{id:h.commandId,from:v?.from??"quick open"});try{h.args?.length?await this.commandService.executeCommand(h.commandId,...h.args):await this.commandService.executeCommand(h.commandId)}catch(L){(0,k.isCancellationError)(L)||this.dialogService.error((0,b.localize)(1578,"Command '{0}' resulted in an error",h.label),(0,d.toErrorMessage)(L))}}}}getTfIdfChunk({label:h,commandAlias:v,commandDescription:w}){let S=h;return v&&v!==h&&(S+=` - ${v}`),w&&w.value!==h&&(S+=` - ${w.value===w.original?w.value:`${w.value} (${w.original})`}`),S}};e.AbstractCommandsQuickAccessProvider=u,e.AbstractCommandsQuickAccessProvider=u=a=ke([ce(1,t.IInstantiationService),ce(2,i.IKeybindingService),ce(3,p.ICommandService),ce(4,l.ITelemetryService),ce(5,o.IDialogService)],u);let C=class extends y.Disposable{static{r=this}static{this.DEFAULT_COMMANDS_HISTORY_LENGTH=50}static{this.PREF_KEY_CACHE="commandPalette.mru.cache"}static{this.PREF_KEY_COUNTER="commandPalette.mru.counter"}static{this.counter=1}static{this.hasChanges=!1}constructor(h,v,w){super(),this.storageService=h,this.configurationService=v,this.logService=w,this.configuredCommandsHistoryLength=0,this.updateConfiguration(),this.load(),this.registerListeners()}registerListeners(){this._register(this.configurationService.onDidChangeConfiguration(h=>this.updateConfiguration(h))),this._register(this.storageService.onWillSaveState(h=>{h.reason===c.WillSaveStateReason.SHUTDOWN&&this.saveState()}))}updateConfiguration(h){h&&!h.affectsConfiguration("workbench.commandPalette.history")||(this.configuredCommandsHistoryLength=r.getConfiguredCommandHistoryLength(this.configurationService),r.cache&&r.cache.limit!==this.configuredCommandsHistoryLength&&(r.cache.limit=this.configuredCommandsHistoryLength,r.hasChanges=!0))}load(){const h=this.storageService.get(r.PREF_KEY_CACHE,0);let v;if(h)try{v=JSON.parse(h)}catch(S){this.logService.error(`[CommandsHistory] invalid data: ${S}`)}const w=r.cache=new m.LRUCache(this.configuredCommandsHistoryLength,1);if(v){let S;v.usesLRU?S=v.entries:S=v.entries.sort((L,D)=>L.value-D.value),S.forEach(L=>w.set(L.key,L.value))}r.counter=this.storageService.getNumber(r.PREF_KEY_COUNTER,0,r.counter)}push(h){r.cache&&(r.cache.set(h,r.counter++),r.hasChanges=!0)}peek(h){return r.cache?.peek(h)}saveState(){if(!r.cache||!r.hasChanges)return;const h={usesLRU:!0,entries:[]};r.cache.forEach((v,w)=>h.entries.push({key:w,value:v})),this.storageService.store(r.PREF_KEY_CACHE,JSON.stringify(h),0,0),this.storageService.store(r.PREF_KEY_COUNTER,r.counter,0,0),r.hasChanges=!1}static getConfiguredCommandHistoryLength(h){const w=h.getValue().workbench?.commandPalette?.history;return typeof w=="number"?w:r.DEFAULT_COMMANDS_HISTORY_LENGTH}};e.CommandsHistory=C,e.CommandsHistory=C=r=ke([ce(0,c.IStorageService),ce(1,n.IConfigurationService),ce(2,s.ILogService)],C)}),define(ne[749],se([1,0,142,381,748]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractEditorCommandsQuickAccessProvider=void 0;class E extends I.AbstractCommandsQuickAccessProvider{constructor(m,_,b,p,n,o){super(m,_,b,p,n,o)}getCodeEditorCommandPicks(){const m=this.activeTextEditorControl;if(!m)return[];const _=[];for(const b of m.getSupportedActions()){let p;b.metadata?.description&&((0,k.isLocalizedString)(b.metadata.description)?p=b.metadata.description:p={original:b.metadata.description,value:b.metadata.description}),_.push({commandId:b.id,commandAlias:b.alias,commandDescription:p,label:(0,d.stripIcons)(b.label)||b.id})}return _}}e.AbstractEditorCommandsQuickAccessProvider=E}),define(ne[750],se([1,0,38,156,107,34,749,7,31,24,63,180,15,20,66]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GotoLineAction=e.StandaloneCommandsQuickAccessProvider=void 0;let s=class extends y.AbstractEditorCommandsQuickAccessProvider{get activeTextEditorControl(){return this.codeEditorService.getFocusedCodeEditor()??void 0}constructor(l,a,r,u,C,f){super({showAlias:!1},l,r,u,C,f),this.codeEditorService=a}async getCommandPicks(){return this.getCodeEditorCommandPicks()}hasAdditionalCommandPicks(){return!1}async getAdditionalCommandPicks(){return[]}};e.StandaloneCommandsQuickAccessProvider=s,e.StandaloneCommandsQuickAccessProvider=s=ke([ce(0,m.IInstantiationService),ce(1,E.ICodeEditorService),ce(2,_.IKeybindingService),ce(3,b.ICommandService),ce(4,p.ITelemetryService),ce(5,n.IDialogService)],s);class g extends o.EditorAction{static{this.ID="editor.action.quickCommand"}constructor(){super({id:g.ID,label:I.QuickCommandNLS.quickCommandActionLabel,alias:"Command Palette",precondition:void 0,kbOpts:{kbExpr:t.EditorContextKeys.focus,primary:59,weight:100},contextMenuOpts:{group:"z_commands",order:1}})}run(l){l.get(i.IQuickInputService).quickAccess.show(s.PREFIX)}}e.GotoLineAction=g,(0,o.registerEditorAction)(g),d.Registry.as(k.Extensions.Quickaccess).registerQuickAccessProvider({ctor:s,prefix:s.PREFIX,helpEntries:[{description:I.QuickCommandNLS.quickCommandHelp,commandId:g.ID}]})}),define(ne[89],se([1,0,90,14,33,6,273,38,3]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.workbenchColorsSchemaId=e.DEFAULT_COLOR_CONFIG_VALUE=e.Extensions=void 0,e.asCssVariableName=b,e.asCssVariable=p,e.asCssVariableWithDefault=n,e.isColorDefaults=o,e.registerColor=s,e.executeTransform=g,e.darken=c,e.lighten=l,e.transparent=a,e.oneOf=r,e.ifDefinedThenElse=u,e.lessProminent=C,e.resolveColorValue=f;function b(w){return`--vscode-${w.replace(/\./g,"-")}`}function p(w){return`var(${b(w)})`}function n(w,S){return`var(${b(w)}, ${S})`}function o(w){return w!==null&&typeof w=="object"&&"light"in w&&"dark"in w}e.Extensions={ColorContribution:"base.contributions.colors"},e.DEFAULT_COLOR_CONFIG_VALUE="default";class t{constructor(){this._onDidChangeSchema=new E.Emitter,this.onDidChangeSchema=this._onDidChangeSchema.event,this.colorSchema={type:"object",properties:{}},this.colorReferenceSchema={type:"string",enum:[],enumDescriptions:[]},this.colorsById={}}registerColor(S,L,D,T=!1,M){const A={id:S,description:D,defaults:L,needsTransparency:T,deprecationMessage:M};this.colorsById[S]=A;const P={type:"string",format:"color-hex",defaultSnippets:[{body:"${1:#ff0000}"}]};return M&&(P.deprecationMessage=M),T&&(P.pattern="^#(?:(?[0-9a-fA-f]{3}[0-9a-eA-E])|(?:[0-9a-fA-F]{6}(?:(?![fF]{2})(?:[0-9a-fA-F]{2}))))?$",P.patternErrorMessage=_.localize(1836,"This color must be transparent or it will obscure content")),this.colorSchema.properties[S]={description:D,oneOf:[P,{type:"string",const:e.DEFAULT_COLOR_CONFIG_VALUE,description:_.localize(1837,"Use the default color.")}]},this.colorReferenceSchema.enum.push(S),this.colorReferenceSchema.enumDescriptions.push(D),this._onDidChangeSchema.fire(),S}getColors(){return Object.keys(this.colorsById).map(S=>this.colorsById[S])}resolveDefaultColor(S,L){const D=this.colorsById[S];if(D?.defaults){const T=o(D.defaults)?D.defaults[L.type]:D.defaults;return f(T,L)}}getColorSchema(){return this.colorSchema}toString(){const S=(L,D)=>{const T=L.indexOf(".")===-1?0:1,M=D.indexOf(".")===-1?0:1;return T!==M?T-M:L.localeCompare(D)};return Object.keys(this.colorsById).sort(S).map(L=>`- \`${L}\`: ${this.colorsById[L].description}`).join(` -`)}}const i=new t;m.Registry.add(e.Extensions.ColorContribution,i);function s(w,S,L,D,T){return i.registerColor(w,S,L,D,T)}function g(w,S){switch(w.op){case 0:return f(w.value,S)?.darken(w.factor);case 1:return f(w.value,S)?.lighten(w.factor);case 2:return f(w.value,S)?.transparent(w.factor);case 3:{const L=f(w.background,S);return L?f(w.value,S)?.makeOpaque(L):f(w.value,S)}case 4:for(const L of w.values){const D=f(L,S);if(D)return D}return;case 6:return f(S.defines(w.if)?w.then:w.else,S);case 5:{const L=f(w.value,S);if(!L)return;const D=f(w.background,S);return D?L.isDarkerThan(D)?I.Color.getLighterColor(L,D,w.factor).transparent(w.transparency):I.Color.getDarkerColor(L,D,w.factor).transparent(w.transparency):L.transparent(w.factor*w.transparency)}default:throw(0,d.assertNever)(w)}}function c(w,S){return{op:0,value:w,factor:S}}function l(w,S){return{op:1,value:w,factor:S}}function a(w,S){return{op:2,value:w,factor:S}}function r(...w){return{op:4,values:w}}function u(w,S,L){return{op:6,if:w,then:S,else:L}}function C(w,S,L,D){return{op:5,value:w,background:S,factor:L,transparency:D}}function f(w,S){if(w!==null){if(typeof w=="string")return w[0]==="#"?I.Color.fromHex(w):S.getColor(w);if(w instanceof I.Color)return w;if(typeof w=="object")return g(w,S)}}e.workbenchColorsSchemaId="vscode://schemas/workbench-colors";const h=m.Registry.as(y.Extensions.JSONContribution);h.registerSchema(e.workbenchColorsSchemaId,i.getColorSchema());const v=new k.RunOnceScheduler(()=>h.notifySchemaChanged(e.workbenchColorsSchemaId),200);i.onDidChangeSchema(()=>{v.isScheduled()||v.schedule()})}),define(ne[123],se([1,0,3,33,89]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.textCodeBlockBackground=e.textBlockQuoteBorder=e.textBlockQuoteBackground=e.textPreformatBackground=e.textPreformatForeground=e.textSeparatorForeground=e.textLinkActiveForeground=e.textLinkForeground=e.selectionBackground=e.activeContrastBorder=e.contrastBorder=e.focusBorder=e.iconForeground=e.descriptionForeground=e.errorForeground=e.disabledForeground=e.foreground=void 0,e.foreground=(0,I.registerColor)("foreground",{dark:"#CCCCCC",light:"#616161",hcDark:"#FFFFFF",hcLight:"#292929"},d.localize(1599,"Overall foreground color. This color is only used if not overridden by a component.")),e.disabledForeground=(0,I.registerColor)("disabledForeground",{dark:"#CCCCCC80",light:"#61616180",hcDark:"#A5A5A5",hcLight:"#7F7F7F"},d.localize(1600,"Overall foreground for disabled elements. This color is only used if not overridden by a component.")),e.errorForeground=(0,I.registerColor)("errorForeground",{dark:"#F48771",light:"#A1260D",hcDark:"#F48771",hcLight:"#B5200D"},d.localize(1601,"Overall foreground color for error messages. This color is only used if not overridden by a component.")),e.descriptionForeground=(0,I.registerColor)("descriptionForeground",{light:"#717171",dark:(0,I.transparent)(e.foreground,.7),hcDark:(0,I.transparent)(e.foreground,.7),hcLight:(0,I.transparent)(e.foreground,.7)},d.localize(1602,"Foreground color for description text providing additional information, for example for a label.")),e.iconForeground=(0,I.registerColor)("icon.foreground",{dark:"#C5C5C5",light:"#424242",hcDark:"#FFFFFF",hcLight:"#292929"},d.localize(1603,"The default color for icons in the workbench.")),e.focusBorder=(0,I.registerColor)("focusBorder",{dark:"#007FD4",light:"#0090F1",hcDark:"#F38518",hcLight:"#006BBD"},d.localize(1604,"Overall border color for focused elements. This color is only used if not overridden by a component.")),e.contrastBorder=(0,I.registerColor)("contrastBorder",{light:null,dark:null,hcDark:"#6FC3DF",hcLight:"#0F4A85"},d.localize(1605,"An extra border around elements to separate them from others for greater contrast.")),e.activeContrastBorder=(0,I.registerColor)("contrastActiveBorder",{light:null,dark:null,hcDark:e.focusBorder,hcLight:e.focusBorder},d.localize(1606,"An extra border around active elements to separate them from others for greater contrast.")),e.selectionBackground=(0,I.registerColor)("selection.background",null,d.localize(1607,"The background color of text selections in the workbench (e.g. for input fields or text areas). Note that this does not apply to selections within the editor.")),e.textLinkForeground=(0,I.registerColor)("textLink.foreground",{light:"#006AB1",dark:"#3794FF",hcDark:"#21A6FF",hcLight:"#0F4A85"},d.localize(1608,"Foreground color for links in text.")),e.textLinkActiveForeground=(0,I.registerColor)("textLink.activeForeground",{light:"#006AB1",dark:"#3794FF",hcDark:"#21A6FF",hcLight:"#0F4A85"},d.localize(1609,"Foreground color for links in text when clicked on and on mouse hover.")),e.textSeparatorForeground=(0,I.registerColor)("textSeparator.foreground",{light:"#0000002e",dark:"#ffffff2e",hcDark:k.Color.black,hcLight:"#292929"},d.localize(1610,"Color for text separators.")),e.textPreformatForeground=(0,I.registerColor)("textPreformat.foreground",{light:"#A31515",dark:"#D7BA7D",hcDark:"#000000",hcLight:"#FFFFFF"},d.localize(1611,"Foreground color for preformatted text segments.")),e.textPreformatBackground=(0,I.registerColor)("textPreformat.background",{light:"#0000001A",dark:"#FFFFFF1A",hcDark:"#FFFFFF",hcLight:"#09345f"},d.localize(1612,"Background color for preformatted text segments.")),e.textBlockQuoteBackground=(0,I.registerColor)("textBlockQuote.background",{light:"#f2f2f2",dark:"#222222",hcDark:null,hcLight:"#F2F2F2"},d.localize(1613,"Background color for block quotes in text.")),e.textBlockQuoteBorder=(0,I.registerColor)("textBlockQuote.border",{light:"#007acc80",dark:"#007acc80",hcDark:k.Color.white,hcLight:"#292929"},d.localize(1614,"Border color for block quotes in text.")),e.textCodeBlockBackground=(0,I.registerColor)("textCodeBlock.background",{light:"#dcdcdc66",dark:"#0a0a0a66",hcDark:k.Color.black,hcLight:"#F2F2F2"},d.localize(1615,"Background color for code blocks in text."))}),define(ne[278],se([1,0,3,33,89,123]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.progressBarBackground=e.scrollbarSliderActiveBackground=e.scrollbarSliderHoverBackground=e.scrollbarSliderBackground=e.scrollbarShadow=e.badgeForeground=e.badgeBackground=e.sashHoverBorder=void 0,e.sashHoverBorder=(0,I.registerColor)("sash.hoverBorder",E.focusBorder,d.localize(1816,"Border color of active sashes.")),e.badgeBackground=(0,I.registerColor)("badge.background",{dark:"#4D4D4D",light:"#C4C4C4",hcDark:k.Color.black,hcLight:"#0F4A85"},d.localize(1817,"Badge background color. Badges are small information labels, e.g. for search results count.")),e.badgeForeground=(0,I.registerColor)("badge.foreground",{dark:k.Color.white,light:"#333",hcDark:k.Color.white,hcLight:k.Color.white},d.localize(1818,"Badge foreground color. Badges are small information labels, e.g. for search results count.")),e.scrollbarShadow=(0,I.registerColor)("scrollbar.shadow",{dark:"#000000",light:"#DDDDDD",hcDark:null,hcLight:null},d.localize(1819,"Scrollbar shadow to indicate that the view is scrolled.")),e.scrollbarSliderBackground=(0,I.registerColor)("scrollbarSlider.background",{dark:k.Color.fromHex("#797979").transparent(.4),light:k.Color.fromHex("#646464").transparent(.4),hcDark:(0,I.transparent)(E.contrastBorder,.6),hcLight:(0,I.transparent)(E.contrastBorder,.4)},d.localize(1820,"Scrollbar slider background color.")),e.scrollbarSliderHoverBackground=(0,I.registerColor)("scrollbarSlider.hoverBackground",{dark:k.Color.fromHex("#646464").transparent(.7),light:k.Color.fromHex("#646464").transparent(.7),hcDark:(0,I.transparent)(E.contrastBorder,.8),hcLight:(0,I.transparent)(E.contrastBorder,.8)},d.localize(1821,"Scrollbar slider background color when hovering.")),e.scrollbarSliderActiveBackground=(0,I.registerColor)("scrollbarSlider.activeBackground",{dark:k.Color.fromHex("#BFBFBF").transparent(.4),light:k.Color.fromHex("#000000").transparent(.6),hcDark:E.contrastBorder,hcLight:E.contrastBorder},d.localize(1822,"Scrollbar slider background color when clicked on.")),e.progressBarBackground=(0,I.registerColor)("progressBar.background",{dark:k.Color.fromHex("#0E70C0"),light:k.Color.fromHex("#0E70C0"),hcDark:E.contrastBorder,hcLight:E.contrastBorder},d.localize(1823,"Background color of the progress bar that can show for long running operations."))}),define(ne[138],se([1,0,3,33,89,123,278]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.problemsInfoIconForeground=e.problemsWarningIconForeground=e.problemsErrorIconForeground=e.overviewRulerSelectionHighlightForeground=e.overviewRulerFindMatchForeground=e.overviewRulerCommonContentForeground=e.overviewRulerIncomingContentForeground=e.overviewRulerCurrentContentForeground=e.mergeBorder=e.mergeCommonContentBackground=e.mergeCommonHeaderBackground=e.mergeIncomingContentBackground=e.mergeIncomingHeaderBackground=e.mergeCurrentContentBackground=e.mergeCurrentHeaderBackground=e.breadcrumbsPickerBackground=e.breadcrumbsActiveSelectionForeground=e.breadcrumbsFocusForeground=e.breadcrumbsBackground=e.breadcrumbsForeground=e.toolbarActiveBackground=e.toolbarHoverOutline=e.toolbarHoverBackground=e.widgetBorder=e.widgetShadow=e.diffUnchangedTextBackground=e.diffUnchangedRegionForeground=e.diffUnchangedRegionBackground=e.diffDiagonalFill=e.diffBorder=e.diffRemovedOutline=e.diffInsertedOutline=e.diffOverviewRulerRemoved=e.diffOverviewRulerInserted=e.diffRemovedLineGutter=e.diffInsertedLineGutter=e.diffRemovedLine=e.diffInsertedLine=e.diffRemoved=e.diffInserted=e.defaultRemoveColor=e.defaultInsertColor=e.snippetFinalTabstopHighlightBorder=e.snippetFinalTabstopHighlightBackground=e.snippetTabstopHighlightBorder=e.snippetTabstopHighlightBackground=e.editorLightBulbAiForeground=e.editorLightBulbAutoFixForeground=e.editorLightBulbForeground=e.editorInlayHintParameterBackground=e.editorInlayHintParameterForeground=e.editorInlayHintTypeBackground=e.editorInlayHintTypeForeground=e.editorInlayHintBackground=e.editorInlayHintForeground=e.editorHoverStatusBarBackground=e.editorHoverBorder=e.editorHoverForeground=e.editorHoverBackground=e.editorHoverHighlight=e.editorFindRangeHighlightBorder=e.editorFindMatchHighlightBorder=e.editorFindMatchBorder=e.editorFindRangeHighlight=e.editorFindMatchHighlightForeground=e.editorFindMatchHighlight=e.editorFindMatchForeground=e.editorFindMatch=e.editorSelectionHighlightBorder=e.editorSelectionHighlight=e.editorInactiveSelection=e.editorSelectionForeground=e.editorSelectionBackground=e.editorActiveLinkForeground=e.editorHintBorder=e.editorHintForeground=e.editorInfoBorder=e.editorInfoForeground=e.editorInfoBackground=e.editorWarningBorder=e.editorWarningForeground=e.editorWarningBackground=e.editorErrorBorder=e.editorErrorForeground=e.editorErrorBackground=e.editorWidgetResizeBorder=e.editorWidgetBorder=e.editorWidgetForeground=e.editorWidgetBackground=e.editorStickyScrollShadow=e.editorStickyScrollBorder=e.editorStickyScrollHoverBackground=e.editorStickyScrollBackground=e.editorForeground=e.editorBackground=void 0,e.editorBackground=(0,I.registerColor)("editor.background",{light:"#ffffff",dark:"#1E1E1E",hcDark:k.Color.black,hcLight:k.Color.white},d.localize(1624,"Editor background color.")),e.editorForeground=(0,I.registerColor)("editor.foreground",{light:"#333333",dark:"#BBBBBB",hcDark:k.Color.white,hcLight:E.foreground},d.localize(1625,"Editor default foreground color.")),e.editorStickyScrollBackground=(0,I.registerColor)("editorStickyScroll.background",e.editorBackground,d.localize(1626,"Background color of sticky scroll in the editor")),e.editorStickyScrollHoverBackground=(0,I.registerColor)("editorStickyScrollHover.background",{dark:"#2A2D2E",light:"#F0F0F0",hcDark:null,hcLight:k.Color.fromHex("#0F4A85").transparent(.1)},d.localize(1627,"Background color of sticky scroll on hover in the editor")),e.editorStickyScrollBorder=(0,I.registerColor)("editorStickyScroll.border",{dark:null,light:null,hcDark:E.contrastBorder,hcLight:E.contrastBorder},d.localize(1628,"Border color of sticky scroll in the editor")),e.editorStickyScrollShadow=(0,I.registerColor)("editorStickyScroll.shadow",y.scrollbarShadow,d.localize(1629," Shadow color of sticky scroll in the editor")),e.editorWidgetBackground=(0,I.registerColor)("editorWidget.background",{dark:"#252526",light:"#F3F3F3",hcDark:"#0C141F",hcLight:k.Color.white},d.localize(1630,"Background color of editor widgets, such as find/replace.")),e.editorWidgetForeground=(0,I.registerColor)("editorWidget.foreground",E.foreground,d.localize(1631,"Foreground color of editor widgets, such as find/replace.")),e.editorWidgetBorder=(0,I.registerColor)("editorWidget.border",{dark:"#454545",light:"#C8C8C8",hcDark:E.contrastBorder,hcLight:E.contrastBorder},d.localize(1632,"Border color of editor widgets. The color is only used if the widget chooses to have a border and if the color is not overridden by a widget.")),e.editorWidgetResizeBorder=(0,I.registerColor)("editorWidget.resizeBorder",null,d.localize(1633,"Border color of the resize bar of editor widgets. The color is only used if the widget chooses to have a resize border and if the color is not overridden by a widget.")),e.editorErrorBackground=(0,I.registerColor)("editorError.background",null,d.localize(1634,"Background color of error text in the editor. The color must not be opaque so as not to hide underlying decorations."),!0),e.editorErrorForeground=(0,I.registerColor)("editorError.foreground",{dark:"#F14C4C",light:"#E51400",hcDark:"#F48771",hcLight:"#B5200D"},d.localize(1635,"Foreground color of error squigglies in the editor.")),e.editorErrorBorder=(0,I.registerColor)("editorError.border",{dark:null,light:null,hcDark:k.Color.fromHex("#E47777").transparent(.8),hcLight:"#B5200D"},d.localize(1636,"If set, color of double underlines for errors in the editor.")),e.editorWarningBackground=(0,I.registerColor)("editorWarning.background",null,d.localize(1637,"Background color of warning text in the editor. The color must not be opaque so as not to hide underlying decorations."),!0),e.editorWarningForeground=(0,I.registerColor)("editorWarning.foreground",{dark:"#CCA700",light:"#BF8803",hcDark:"#FFD370",hcLight:"#895503"},d.localize(1638,"Foreground color of warning squigglies in the editor.")),e.editorWarningBorder=(0,I.registerColor)("editorWarning.border",{dark:null,light:null,hcDark:k.Color.fromHex("#FFCC00").transparent(.8),hcLight:k.Color.fromHex("#FFCC00").transparent(.8)},d.localize(1639,"If set, color of double underlines for warnings in the editor.")),e.editorInfoBackground=(0,I.registerColor)("editorInfo.background",null,d.localize(1640,"Background color of info text in the editor. The color must not be opaque so as not to hide underlying decorations."),!0),e.editorInfoForeground=(0,I.registerColor)("editorInfo.foreground",{dark:"#3794FF",light:"#1a85ff",hcDark:"#3794FF",hcLight:"#1a85ff"},d.localize(1641,"Foreground color of info squigglies in the editor.")),e.editorInfoBorder=(0,I.registerColor)("editorInfo.border",{dark:null,light:null,hcDark:k.Color.fromHex("#3794FF").transparent(.8),hcLight:"#292929"},d.localize(1642,"If set, color of double underlines for infos in the editor.")),e.editorHintForeground=(0,I.registerColor)("editorHint.foreground",{dark:k.Color.fromHex("#eeeeee").transparent(.7),light:"#6c6c6c",hcDark:null,hcLight:null},d.localize(1643,"Foreground color of hint squigglies in the editor.")),e.editorHintBorder=(0,I.registerColor)("editorHint.border",{dark:null,light:null,hcDark:k.Color.fromHex("#eeeeee").transparent(.8),hcLight:"#292929"},d.localize(1644,"If set, color of double underlines for hints in the editor.")),e.editorActiveLinkForeground=(0,I.registerColor)("editorLink.activeForeground",{dark:"#4E94CE",light:k.Color.blue,hcDark:k.Color.cyan,hcLight:"#292929"},d.localize(1645,"Color of active links.")),e.editorSelectionBackground=(0,I.registerColor)("editor.selectionBackground",{light:"#ADD6FF",dark:"#264F78",hcDark:"#f3f518",hcLight:"#0F4A85"},d.localize(1646,"Color of the editor selection.")),e.editorSelectionForeground=(0,I.registerColor)("editor.selectionForeground",{light:null,dark:null,hcDark:"#000000",hcLight:k.Color.white},d.localize(1647,"Color of the selected text for high contrast.")),e.editorInactiveSelection=(0,I.registerColor)("editor.inactiveSelectionBackground",{light:(0,I.transparent)(e.editorSelectionBackground,.5),dark:(0,I.transparent)(e.editorSelectionBackground,.5),hcDark:(0,I.transparent)(e.editorSelectionBackground,.7),hcLight:(0,I.transparent)(e.editorSelectionBackground,.5)},d.localize(1648,"Color of the selection in an inactive editor. The color must not be opaque so as not to hide underlying decorations."),!0),e.editorSelectionHighlight=(0,I.registerColor)("editor.selectionHighlightBackground",{light:(0,I.lessProminent)(e.editorSelectionBackground,e.editorBackground,.3,.6),dark:(0,I.lessProminent)(e.editorSelectionBackground,e.editorBackground,.3,.6),hcDark:null,hcLight:null},d.localize(1649,"Color for regions with the same content as the selection. The color must not be opaque so as not to hide underlying decorations."),!0),e.editorSelectionHighlightBorder=(0,I.registerColor)("editor.selectionHighlightBorder",{light:null,dark:null,hcDark:E.activeContrastBorder,hcLight:E.activeContrastBorder},d.localize(1650,"Border color for regions with the same content as the selection.")),e.editorFindMatch=(0,I.registerColor)("editor.findMatchBackground",{light:"#A8AC94",dark:"#515C6A",hcDark:null,hcLight:null},d.localize(1651,"Color of the current search match.")),e.editorFindMatchForeground=(0,I.registerColor)("editor.findMatchForeground",null,d.localize(1652,"Text color of the current search match.")),e.editorFindMatchHighlight=(0,I.registerColor)("editor.findMatchHighlightBackground",{light:"#EA5C0055",dark:"#EA5C0055",hcDark:null,hcLight:null},d.localize(1653,"Color of the other search matches. The color must not be opaque so as not to hide underlying decorations."),!0),e.editorFindMatchHighlightForeground=(0,I.registerColor)("editor.findMatchHighlightForeground",null,d.localize(1654,"Foreground color of the other search matches."),!0),e.editorFindRangeHighlight=(0,I.registerColor)("editor.findRangeHighlightBackground",{dark:"#3a3d4166",light:"#b4b4b44d",hcDark:null,hcLight:null},d.localize(1655,"Color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations."),!0),e.editorFindMatchBorder=(0,I.registerColor)("editor.findMatchBorder",{light:null,dark:null,hcDark:E.activeContrastBorder,hcLight:E.activeContrastBorder},d.localize(1656,"Border color of the current search match.")),e.editorFindMatchHighlightBorder=(0,I.registerColor)("editor.findMatchHighlightBorder",{light:null,dark:null,hcDark:E.activeContrastBorder,hcLight:E.activeContrastBorder},d.localize(1657,"Border color of the other search matches.")),e.editorFindRangeHighlightBorder=(0,I.registerColor)("editor.findRangeHighlightBorder",{dark:null,light:null,hcDark:(0,I.transparent)(E.activeContrastBorder,.4),hcLight:(0,I.transparent)(E.activeContrastBorder,.4)},d.localize(1658,"Border color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations."),!0),e.editorHoverHighlight=(0,I.registerColor)("editor.hoverHighlightBackground",{light:"#ADD6FF26",dark:"#264f7840",hcDark:"#ADD6FF26",hcLight:null},d.localize(1659,"Highlight below the word for which a hover is shown. The color must not be opaque so as not to hide underlying decorations."),!0),e.editorHoverBackground=(0,I.registerColor)("editorHoverWidget.background",e.editorWidgetBackground,d.localize(1660,"Background color of the editor hover.")),e.editorHoverForeground=(0,I.registerColor)("editorHoverWidget.foreground",e.editorWidgetForeground,d.localize(1661,"Foreground color of the editor hover.")),e.editorHoverBorder=(0,I.registerColor)("editorHoverWidget.border",e.editorWidgetBorder,d.localize(1662,"Border color of the editor hover.")),e.editorHoverStatusBarBackground=(0,I.registerColor)("editorHoverWidget.statusBarBackground",{dark:(0,I.lighten)(e.editorHoverBackground,.2),light:(0,I.darken)(e.editorHoverBackground,.05),hcDark:e.editorWidgetBackground,hcLight:e.editorWidgetBackground},d.localize(1663,"Background color of the editor hover status bar.")),e.editorInlayHintForeground=(0,I.registerColor)("editorInlayHint.foreground",{dark:"#969696",light:"#969696",hcDark:k.Color.white,hcLight:k.Color.black},d.localize(1664,"Foreground color of inline hints")),e.editorInlayHintBackground=(0,I.registerColor)("editorInlayHint.background",{dark:(0,I.transparent)(y.badgeBackground,.1),light:(0,I.transparent)(y.badgeBackground,.1),hcDark:(0,I.transparent)(k.Color.white,.1),hcLight:(0,I.transparent)(y.badgeBackground,.1)},d.localize(1665,"Background color of inline hints")),e.editorInlayHintTypeForeground=(0,I.registerColor)("editorInlayHint.typeForeground",e.editorInlayHintForeground,d.localize(1666,"Foreground color of inline hints for types")),e.editorInlayHintTypeBackground=(0,I.registerColor)("editorInlayHint.typeBackground",e.editorInlayHintBackground,d.localize(1667,"Background color of inline hints for types")),e.editorInlayHintParameterForeground=(0,I.registerColor)("editorInlayHint.parameterForeground",e.editorInlayHintForeground,d.localize(1668,"Foreground color of inline hints for parameters")),e.editorInlayHintParameterBackground=(0,I.registerColor)("editorInlayHint.parameterBackground",e.editorInlayHintBackground,d.localize(1669,"Background color of inline hints for parameters")),e.editorLightBulbForeground=(0,I.registerColor)("editorLightBulb.foreground",{dark:"#FFCC00",light:"#DDB100",hcDark:"#FFCC00",hcLight:"#007ACC"},d.localize(1670,"The color used for the lightbulb actions icon.")),e.editorLightBulbAutoFixForeground=(0,I.registerColor)("editorLightBulbAutoFix.foreground",{dark:"#75BEFF",light:"#007ACC",hcDark:"#75BEFF",hcLight:"#007ACC"},d.localize(1671,"The color used for the lightbulb auto fix actions icon.")),e.editorLightBulbAiForeground=(0,I.registerColor)("editorLightBulbAi.foreground",e.editorLightBulbForeground,d.localize(1672,"The color used for the lightbulb AI icon.")),e.snippetTabstopHighlightBackground=(0,I.registerColor)("editor.snippetTabstopHighlightBackground",{dark:new k.Color(new k.RGBA(124,124,124,.3)),light:new k.Color(new k.RGBA(10,50,100,.2)),hcDark:new k.Color(new k.RGBA(124,124,124,.3)),hcLight:new k.Color(new k.RGBA(10,50,100,.2))},d.localize(1673,"Highlight background color of a snippet tabstop.")),e.snippetTabstopHighlightBorder=(0,I.registerColor)("editor.snippetTabstopHighlightBorder",null,d.localize(1674,"Highlight border color of a snippet tabstop.")),e.snippetFinalTabstopHighlightBackground=(0,I.registerColor)("editor.snippetFinalTabstopHighlightBackground",null,d.localize(1675,"Highlight background color of the final tabstop of a snippet.")),e.snippetFinalTabstopHighlightBorder=(0,I.registerColor)("editor.snippetFinalTabstopHighlightBorder",{dark:"#525252",light:new k.Color(new k.RGBA(10,50,100,.5)),hcDark:"#525252",hcLight:"#292929"},d.localize(1676,"Highlight border color of the final tabstop of a snippet.")),e.defaultInsertColor=new k.Color(new k.RGBA(155,185,85,.2)),e.defaultRemoveColor=new k.Color(new k.RGBA(255,0,0,.2)),e.diffInserted=(0,I.registerColor)("diffEditor.insertedTextBackground",{dark:"#9ccc2c33",light:"#9ccc2c40",hcDark:null,hcLight:null},d.localize(1677,"Background color for text that got inserted. The color must not be opaque so as not to hide underlying decorations."),!0),e.diffRemoved=(0,I.registerColor)("diffEditor.removedTextBackground",{dark:"#ff000033",light:"#ff000033",hcDark:null,hcLight:null},d.localize(1678,"Background color for text that got removed. The color must not be opaque so as not to hide underlying decorations."),!0),e.diffInsertedLine=(0,I.registerColor)("diffEditor.insertedLineBackground",{dark:e.defaultInsertColor,light:e.defaultInsertColor,hcDark:null,hcLight:null},d.localize(1679,"Background color for lines that got inserted. The color must not be opaque so as not to hide underlying decorations."),!0),e.diffRemovedLine=(0,I.registerColor)("diffEditor.removedLineBackground",{dark:e.defaultRemoveColor,light:e.defaultRemoveColor,hcDark:null,hcLight:null},d.localize(1680,"Background color for lines that got removed. The color must not be opaque so as not to hide underlying decorations."),!0),e.diffInsertedLineGutter=(0,I.registerColor)("diffEditorGutter.insertedLineBackground",null,d.localize(1681,"Background color for the margin where lines got inserted.")),e.diffRemovedLineGutter=(0,I.registerColor)("diffEditorGutter.removedLineBackground",null,d.localize(1682,"Background color for the margin where lines got removed.")),e.diffOverviewRulerInserted=(0,I.registerColor)("diffEditorOverview.insertedForeground",null,d.localize(1683,"Diff overview ruler foreground for inserted content.")),e.diffOverviewRulerRemoved=(0,I.registerColor)("diffEditorOverview.removedForeground",null,d.localize(1684,"Diff overview ruler foreground for removed content.")),e.diffInsertedOutline=(0,I.registerColor)("diffEditor.insertedTextBorder",{dark:null,light:null,hcDark:"#33ff2eff",hcLight:"#374E06"},d.localize(1685,"Outline color for the text that got inserted.")),e.diffRemovedOutline=(0,I.registerColor)("diffEditor.removedTextBorder",{dark:null,light:null,hcDark:"#FF008F",hcLight:"#AD0707"},d.localize(1686,"Outline color for text that got removed.")),e.diffBorder=(0,I.registerColor)("diffEditor.border",{dark:null,light:null,hcDark:E.contrastBorder,hcLight:E.contrastBorder},d.localize(1687,"Border color between the two text editors.")),e.diffDiagonalFill=(0,I.registerColor)("diffEditor.diagonalFill",{dark:"#cccccc33",light:"#22222233",hcDark:null,hcLight:null},d.localize(1688,"Color of the diff editor's diagonal fill. The diagonal fill is used in side-by-side diff views.")),e.diffUnchangedRegionBackground=(0,I.registerColor)("diffEditor.unchangedRegionBackground","sideBar.background",d.localize(1689,"The background color of unchanged blocks in the diff editor.")),e.diffUnchangedRegionForeground=(0,I.registerColor)("diffEditor.unchangedRegionForeground","foreground",d.localize(1690,"The foreground color of unchanged blocks in the diff editor.")),e.diffUnchangedTextBackground=(0,I.registerColor)("diffEditor.unchangedCodeBackground",{dark:"#74747429",light:"#b8b8b829",hcDark:null,hcLight:null},d.localize(1691,"The background color of unchanged code in the diff editor.")),e.widgetShadow=(0,I.registerColor)("widget.shadow",{dark:(0,I.transparent)(k.Color.black,.36),light:(0,I.transparent)(k.Color.black,.16),hcDark:null,hcLight:null},d.localize(1692,"Shadow color of widgets such as find/replace inside the editor.")),e.widgetBorder=(0,I.registerColor)("widget.border",{dark:null,light:null,hcDark:E.contrastBorder,hcLight:E.contrastBorder},d.localize(1693,"Border color of widgets such as find/replace inside the editor.")),e.toolbarHoverBackground=(0,I.registerColor)("toolbar.hoverBackground",{dark:"#5a5d5e50",light:"#b8b8b850",hcDark:null,hcLight:null},d.localize(1694,"Toolbar background when hovering over actions using the mouse")),e.toolbarHoverOutline=(0,I.registerColor)("toolbar.hoverOutline",{dark:null,light:null,hcDark:E.activeContrastBorder,hcLight:E.activeContrastBorder},d.localize(1695,"Toolbar outline when hovering over actions using the mouse")),e.toolbarActiveBackground=(0,I.registerColor)("toolbar.activeBackground",{dark:(0,I.lighten)(e.toolbarHoverBackground,.1),light:(0,I.darken)(e.toolbarHoverBackground,.1),hcDark:null,hcLight:null},d.localize(1696,"Toolbar background when holding the mouse over actions")),e.breadcrumbsForeground=(0,I.registerColor)("breadcrumb.foreground",(0,I.transparent)(E.foreground,.8),d.localize(1697,"Color of focused breadcrumb items.")),e.breadcrumbsBackground=(0,I.registerColor)("breadcrumb.background",e.editorBackground,d.localize(1698,"Background color of breadcrumb items.")),e.breadcrumbsFocusForeground=(0,I.registerColor)("breadcrumb.focusForeground",{light:(0,I.darken)(E.foreground,.2),dark:(0,I.lighten)(E.foreground,.1),hcDark:(0,I.lighten)(E.foreground,.1),hcLight:(0,I.lighten)(E.foreground,.1)},d.localize(1699,"Color of focused breadcrumb items.")),e.breadcrumbsActiveSelectionForeground=(0,I.registerColor)("breadcrumb.activeSelectionForeground",{light:(0,I.darken)(E.foreground,.2),dark:(0,I.lighten)(E.foreground,.1),hcDark:(0,I.lighten)(E.foreground,.1),hcLight:(0,I.lighten)(E.foreground,.1)},d.localize(1700,"Color of selected breadcrumb items.")),e.breadcrumbsPickerBackground=(0,I.registerColor)("breadcrumbPicker.background",e.editorWidgetBackground,d.localize(1701,"Background color of breadcrumb item picker."));const m=.5,_=k.Color.fromHex("#40C8AE").transparent(m),b=k.Color.fromHex("#40A6FF").transparent(m),p=k.Color.fromHex("#606060").transparent(.4),n=.4,o=1;e.mergeCurrentHeaderBackground=(0,I.registerColor)("merge.currentHeaderBackground",{dark:_,light:_,hcDark:null,hcLight:null},d.localize(1702,"Current header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."),!0),e.mergeCurrentContentBackground=(0,I.registerColor)("merge.currentContentBackground",(0,I.transparent)(e.mergeCurrentHeaderBackground,n),d.localize(1703,"Current content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."),!0),e.mergeIncomingHeaderBackground=(0,I.registerColor)("merge.incomingHeaderBackground",{dark:b,light:b,hcDark:null,hcLight:null},d.localize(1704,"Incoming header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."),!0),e.mergeIncomingContentBackground=(0,I.registerColor)("merge.incomingContentBackground",(0,I.transparent)(e.mergeIncomingHeaderBackground,n),d.localize(1705,"Incoming content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."),!0),e.mergeCommonHeaderBackground=(0,I.registerColor)("merge.commonHeaderBackground",{dark:p,light:p,hcDark:null,hcLight:null},d.localize(1706,"Common ancestor header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."),!0),e.mergeCommonContentBackground=(0,I.registerColor)("merge.commonContentBackground",(0,I.transparent)(e.mergeCommonHeaderBackground,n),d.localize(1707,"Common ancestor content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."),!0),e.mergeBorder=(0,I.registerColor)("merge.border",{dark:null,light:null,hcDark:"#C3DF6F",hcLight:"#007ACC"},d.localize(1708,"Border color on headers and the splitter in inline merge-conflicts.")),e.overviewRulerCurrentContentForeground=(0,I.registerColor)("editorOverviewRuler.currentContentForeground",{dark:(0,I.transparent)(e.mergeCurrentHeaderBackground,o),light:(0,I.transparent)(e.mergeCurrentHeaderBackground,o),hcDark:e.mergeBorder,hcLight:e.mergeBorder},d.localize(1709,"Current overview ruler foreground for inline merge-conflicts.")),e.overviewRulerIncomingContentForeground=(0,I.registerColor)("editorOverviewRuler.incomingContentForeground",{dark:(0,I.transparent)(e.mergeIncomingHeaderBackground,o),light:(0,I.transparent)(e.mergeIncomingHeaderBackground,o),hcDark:e.mergeBorder,hcLight:e.mergeBorder},d.localize(1710,"Incoming overview ruler foreground for inline merge-conflicts.")),e.overviewRulerCommonContentForeground=(0,I.registerColor)("editorOverviewRuler.commonContentForeground",{dark:(0,I.transparent)(e.mergeCommonHeaderBackground,o),light:(0,I.transparent)(e.mergeCommonHeaderBackground,o),hcDark:e.mergeBorder,hcLight:e.mergeBorder},d.localize(1711,"Common ancestor overview ruler foreground for inline merge-conflicts.")),e.overviewRulerFindMatchForeground=(0,I.registerColor)("editorOverviewRuler.findMatchForeground",{dark:"#d186167e",light:"#d186167e",hcDark:"#AB5A00",hcLight:"#AB5A00"},d.localize(1712,"Overview ruler marker color for find matches. The color must not be opaque so as not to hide underlying decorations."),!0),e.overviewRulerSelectionHighlightForeground=(0,I.registerColor)("editorOverviewRuler.selectionHighlightForeground","#A0A0A0CC",d.localize(1713,"Overview ruler marker color for selection highlights. The color must not be opaque so as not to hide underlying decorations."),!0),e.problemsErrorIconForeground=(0,I.registerColor)("problemsErrorIcon.foreground",e.editorErrorForeground,d.localize(1714,"The color used for the problems error icon.")),e.problemsWarningIconForeground=(0,I.registerColor)("problemsWarningIcon.foreground",e.editorWarningForeground,d.localize(1715,"The color used for the problems warning icon.")),e.problemsInfoIconForeground=(0,I.registerColor)("problemsInfoIcon.foreground",e.editorInfoForeground,d.localize(1716,"The color used for the problems info icon."))}),define(ne[412],se([1,0,3,33,89,123,138]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.keybindingLabelBottomBorder=e.keybindingLabelBorder=e.keybindingLabelForeground=e.keybindingLabelBackground=e.checkboxSelectBorder=e.checkboxBorder=e.checkboxForeground=e.checkboxSelectBackground=e.checkboxBackground=e.radioInactiveHoverBackground=e.radioInactiveBorder=e.radioInactiveBackground=e.radioInactiveForeground=e.radioActiveBorder=e.radioActiveBackground=e.radioActiveForeground=e.buttonSecondaryHoverBackground=e.buttonSecondaryBackground=e.buttonSecondaryForeground=e.buttonBorder=e.buttonHoverBackground=e.buttonBackground=e.buttonSeparator=e.buttonForeground=e.selectBorder=e.selectForeground=e.selectListBackground=e.selectBackground=e.inputValidationErrorBorder=e.inputValidationErrorForeground=e.inputValidationErrorBackground=e.inputValidationWarningBorder=e.inputValidationWarningForeground=e.inputValidationWarningBackground=e.inputValidationInfoBorder=e.inputValidationInfoForeground=e.inputValidationInfoBackground=e.inputPlaceholderForeground=e.inputActiveOptionForeground=e.inputActiveOptionBackground=e.inputActiveOptionHoverBackground=e.inputActiveOptionBorder=e.inputBorder=e.inputForeground=e.inputBackground=void 0,e.inputBackground=(0,I.registerColor)("input.background",{dark:"#3C3C3C",light:k.Color.white,hcDark:k.Color.black,hcLight:k.Color.white},d.localize(1717,"Input box background.")),e.inputForeground=(0,I.registerColor)("input.foreground",E.foreground,d.localize(1718,"Input box foreground.")),e.inputBorder=(0,I.registerColor)("input.border",{dark:null,light:null,hcDark:E.contrastBorder,hcLight:E.contrastBorder},d.localize(1719,"Input box border.")),e.inputActiveOptionBorder=(0,I.registerColor)("inputOption.activeBorder",{dark:"#007ACC",light:"#007ACC",hcDark:E.contrastBorder,hcLight:E.contrastBorder},d.localize(1720,"Border color of activated options in input fields.")),e.inputActiveOptionHoverBackground=(0,I.registerColor)("inputOption.hoverBackground",{dark:"#5a5d5e80",light:"#b8b8b850",hcDark:null,hcLight:null},d.localize(1721,"Background color of activated options in input fields.")),e.inputActiveOptionBackground=(0,I.registerColor)("inputOption.activeBackground",{dark:(0,I.transparent)(E.focusBorder,.4),light:(0,I.transparent)(E.focusBorder,.2),hcDark:k.Color.transparent,hcLight:k.Color.transparent},d.localize(1722,"Background hover color of options in input fields.")),e.inputActiveOptionForeground=(0,I.registerColor)("inputOption.activeForeground",{dark:k.Color.white,light:k.Color.black,hcDark:E.foreground,hcLight:E.foreground},d.localize(1723,"Foreground color of activated options in input fields.")),e.inputPlaceholderForeground=(0,I.registerColor)("input.placeholderForeground",{light:(0,I.transparent)(E.foreground,.5),dark:(0,I.transparent)(E.foreground,.5),hcDark:(0,I.transparent)(E.foreground,.7),hcLight:(0,I.transparent)(E.foreground,.7)},d.localize(1724,"Input box foreground color for placeholder text.")),e.inputValidationInfoBackground=(0,I.registerColor)("inputValidation.infoBackground",{dark:"#063B49",light:"#D6ECF2",hcDark:k.Color.black,hcLight:k.Color.white},d.localize(1725,"Input validation background color for information severity.")),e.inputValidationInfoForeground=(0,I.registerColor)("inputValidation.infoForeground",{dark:null,light:null,hcDark:null,hcLight:E.foreground},d.localize(1726,"Input validation foreground color for information severity.")),e.inputValidationInfoBorder=(0,I.registerColor)("inputValidation.infoBorder",{dark:"#007acc",light:"#007acc",hcDark:E.contrastBorder,hcLight:E.contrastBorder},d.localize(1727,"Input validation border color for information severity.")),e.inputValidationWarningBackground=(0,I.registerColor)("inputValidation.warningBackground",{dark:"#352A05",light:"#F6F5D2",hcDark:k.Color.black,hcLight:k.Color.white},d.localize(1728,"Input validation background color for warning severity.")),e.inputValidationWarningForeground=(0,I.registerColor)("inputValidation.warningForeground",{dark:null,light:null,hcDark:null,hcLight:E.foreground},d.localize(1729,"Input validation foreground color for warning severity.")),e.inputValidationWarningBorder=(0,I.registerColor)("inputValidation.warningBorder",{dark:"#B89500",light:"#B89500",hcDark:E.contrastBorder,hcLight:E.contrastBorder},d.localize(1730,"Input validation border color for warning severity.")),e.inputValidationErrorBackground=(0,I.registerColor)("inputValidation.errorBackground",{dark:"#5A1D1D",light:"#F2DEDE",hcDark:k.Color.black,hcLight:k.Color.white},d.localize(1731,"Input validation background color for error severity.")),e.inputValidationErrorForeground=(0,I.registerColor)("inputValidation.errorForeground",{dark:null,light:null,hcDark:null,hcLight:E.foreground},d.localize(1732,"Input validation foreground color for error severity.")),e.inputValidationErrorBorder=(0,I.registerColor)("inputValidation.errorBorder",{dark:"#BE1100",light:"#BE1100",hcDark:E.contrastBorder,hcLight:E.contrastBorder},d.localize(1733,"Input validation border color for error severity.")),e.selectBackground=(0,I.registerColor)("dropdown.background",{dark:"#3C3C3C",light:k.Color.white,hcDark:k.Color.black,hcLight:k.Color.white},d.localize(1734,"Dropdown background.")),e.selectListBackground=(0,I.registerColor)("dropdown.listBackground",{dark:null,light:null,hcDark:k.Color.black,hcLight:k.Color.white},d.localize(1735,"Dropdown list background.")),e.selectForeground=(0,I.registerColor)("dropdown.foreground",{dark:"#F0F0F0",light:E.foreground,hcDark:k.Color.white,hcLight:E.foreground},d.localize(1736,"Dropdown foreground.")),e.selectBorder=(0,I.registerColor)("dropdown.border",{dark:e.selectBackground,light:"#CECECE",hcDark:E.contrastBorder,hcLight:E.contrastBorder},d.localize(1737,"Dropdown border.")),e.buttonForeground=(0,I.registerColor)("button.foreground",k.Color.white,d.localize(1738,"Button foreground color.")),e.buttonSeparator=(0,I.registerColor)("button.separator",(0,I.transparent)(e.buttonForeground,.4),d.localize(1739,"Button separator color.")),e.buttonBackground=(0,I.registerColor)("button.background",{dark:"#0E639C",light:"#007ACC",hcDark:null,hcLight:"#0F4A85"},d.localize(1740,"Button background color.")),e.buttonHoverBackground=(0,I.registerColor)("button.hoverBackground",{dark:(0,I.lighten)(e.buttonBackground,.2),light:(0,I.darken)(e.buttonBackground,.2),hcDark:e.buttonBackground,hcLight:e.buttonBackground},d.localize(1741,"Button background color when hovering.")),e.buttonBorder=(0,I.registerColor)("button.border",E.contrastBorder,d.localize(1742,"Button border color.")),e.buttonSecondaryForeground=(0,I.registerColor)("button.secondaryForeground",{dark:k.Color.white,light:k.Color.white,hcDark:k.Color.white,hcLight:E.foreground},d.localize(1743,"Secondary button foreground color.")),e.buttonSecondaryBackground=(0,I.registerColor)("button.secondaryBackground",{dark:"#3A3D41",light:"#5F6A79",hcDark:null,hcLight:k.Color.white},d.localize(1744,"Secondary button background color.")),e.buttonSecondaryHoverBackground=(0,I.registerColor)("button.secondaryHoverBackground",{dark:(0,I.lighten)(e.buttonSecondaryBackground,.2),light:(0,I.darken)(e.buttonSecondaryBackground,.2),hcDark:null,hcLight:null},d.localize(1745,"Secondary button background color when hovering.")),e.radioActiveForeground=(0,I.registerColor)("radio.activeForeground",e.inputActiveOptionForeground,d.localize(1746,"Foreground color of active radio option.")),e.radioActiveBackground=(0,I.registerColor)("radio.activeBackground",e.inputActiveOptionBackground,d.localize(1747,"Background color of active radio option.")),e.radioActiveBorder=(0,I.registerColor)("radio.activeBorder",e.inputActiveOptionBorder,d.localize(1748,"Border color of the active radio option.")),e.radioInactiveForeground=(0,I.registerColor)("radio.inactiveForeground",null,d.localize(1749,"Foreground color of inactive radio option.")),e.radioInactiveBackground=(0,I.registerColor)("radio.inactiveBackground",null,d.localize(1750,"Background color of inactive radio option.")),e.radioInactiveBorder=(0,I.registerColor)("radio.inactiveBorder",{light:(0,I.transparent)(e.radioActiveForeground,.2),dark:(0,I.transparent)(e.radioActiveForeground,.2),hcDark:(0,I.transparent)(e.radioActiveForeground,.4),hcLight:(0,I.transparent)(e.radioActiveForeground,.2)},d.localize(1751,"Border color of the inactive radio option.")),e.radioInactiveHoverBackground=(0,I.registerColor)("radio.inactiveHoverBackground",e.inputActiveOptionHoverBackground,d.localize(1752,"Background color of inactive active radio option when hovering.")),e.checkboxBackground=(0,I.registerColor)("checkbox.background",e.selectBackground,d.localize(1753,"Background color of checkbox widget.")),e.checkboxSelectBackground=(0,I.registerColor)("checkbox.selectBackground",y.editorWidgetBackground,d.localize(1754,"Background color of checkbox widget when the element it's in is selected.")),e.checkboxForeground=(0,I.registerColor)("checkbox.foreground",e.selectForeground,d.localize(1755,"Foreground color of checkbox widget.")),e.checkboxBorder=(0,I.registerColor)("checkbox.border",e.selectBorder,d.localize(1756,"Border color of checkbox widget.")),e.checkboxSelectBorder=(0,I.registerColor)("checkbox.selectBorder",E.iconForeground,d.localize(1757,"Border color of checkbox widget when the element it's in is selected.")),e.keybindingLabelBackground=(0,I.registerColor)("keybindingLabel.background",{dark:new k.Color(new k.RGBA(128,128,128,.17)),light:new k.Color(new k.RGBA(221,221,221,.4)),hcDark:k.Color.transparent,hcLight:k.Color.transparent},d.localize(1758,"Keybinding label background color. The keybinding label is used to represent a keyboard shortcut.")),e.keybindingLabelForeground=(0,I.registerColor)("keybindingLabel.foreground",{dark:k.Color.fromHex("#CCCCCC"),light:k.Color.fromHex("#555555"),hcDark:k.Color.white,hcLight:E.foreground},d.localize(1759,"Keybinding label foreground color. The keybinding label is used to represent a keyboard shortcut.")),e.keybindingLabelBorder=(0,I.registerColor)("keybindingLabel.border",{dark:new k.Color(new k.RGBA(51,51,51,.6)),light:new k.Color(new k.RGBA(204,204,204,.4)),hcDark:new k.Color(new k.RGBA(111,195,223)),hcLight:E.contrastBorder},d.localize(1760,"Keybinding label border color. The keybinding label is used to represent a keyboard shortcut.")),e.keybindingLabelBottomBorder=(0,I.registerColor)("keybindingLabel.bottomBorder",{dark:new k.Color(new k.RGBA(68,68,68,.6)),light:new k.Color(new k.RGBA(187,187,187,.4)),hcDark:new k.Color(new k.RGBA(111,195,223)),hcLight:E.foreground},d.localize(1761,"Keybinding label border bottom color. The keybinding label is used to represent a keyboard shortcut."))}),define(ne[279],se([1,0,3,33,89,123,138]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.editorActionListFocusBackground=e.editorActionListFocusForeground=e.editorActionListForeground=e.editorActionListBackground=e.tableOddRowsBackgroundColor=e.tableColumnsBorder=e.treeInactiveIndentGuidesStroke=e.treeIndentGuidesStroke=e.listDeemphasizedForeground=e.listFilterMatchHighlightBorder=e.listFilterMatchHighlight=e.listFilterWidgetShadow=e.listFilterWidgetNoMatchesOutline=e.listFilterWidgetOutline=e.listFilterWidgetBackground=e.listWarningForeground=e.listErrorForeground=e.listInvalidItemForeground=e.listFocusHighlightForeground=e.listHighlightForeground=e.listDropBetweenBackground=e.listDropOverBackground=e.listHoverForeground=e.listHoverBackground=e.listInactiveFocusOutline=e.listInactiveFocusBackground=e.listInactiveSelectionIconForeground=e.listInactiveSelectionForeground=e.listInactiveSelectionBackground=e.listActiveSelectionIconForeground=e.listActiveSelectionForeground=e.listActiveSelectionBackground=e.listFocusAndSelectionOutline=e.listFocusOutline=e.listFocusForeground=e.listFocusBackground=void 0,e.listFocusBackground=(0,I.registerColor)("list.focusBackground",null,d.localize(1762,"List/Tree background color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")),e.listFocusForeground=(0,I.registerColor)("list.focusForeground",null,d.localize(1763,"List/Tree foreground color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")),e.listFocusOutline=(0,I.registerColor)("list.focusOutline",{dark:E.focusBorder,light:E.focusBorder,hcDark:E.activeContrastBorder,hcLight:E.activeContrastBorder},d.localize(1764,"List/Tree outline color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")),e.listFocusAndSelectionOutline=(0,I.registerColor)("list.focusAndSelectionOutline",null,d.localize(1765,"List/Tree outline color for the focused item when the list/tree is active and selected. An active list/tree has keyboard focus, an inactive does not.")),e.listActiveSelectionBackground=(0,I.registerColor)("list.activeSelectionBackground",{dark:"#04395E",light:"#0060C0",hcDark:null,hcLight:k.Color.fromHex("#0F4A85").transparent(.1)},d.localize(1766,"List/Tree background color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")),e.listActiveSelectionForeground=(0,I.registerColor)("list.activeSelectionForeground",{dark:k.Color.white,light:k.Color.white,hcDark:null,hcLight:null},d.localize(1767,"List/Tree foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")),e.listActiveSelectionIconForeground=(0,I.registerColor)("list.activeSelectionIconForeground",null,d.localize(1768,"List/Tree icon foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")),e.listInactiveSelectionBackground=(0,I.registerColor)("list.inactiveSelectionBackground",{dark:"#37373D",light:"#E4E6F1",hcDark:null,hcLight:k.Color.fromHex("#0F4A85").transparent(.1)},d.localize(1769,"List/Tree background color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")),e.listInactiveSelectionForeground=(0,I.registerColor)("list.inactiveSelectionForeground",null,d.localize(1770,"List/Tree foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")),e.listInactiveSelectionIconForeground=(0,I.registerColor)("list.inactiveSelectionIconForeground",null,d.localize(1771,"List/Tree icon foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")),e.listInactiveFocusBackground=(0,I.registerColor)("list.inactiveFocusBackground",null,d.localize(1772,"List/Tree background color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")),e.listInactiveFocusOutline=(0,I.registerColor)("list.inactiveFocusOutline",null,d.localize(1773,"List/Tree outline color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")),e.listHoverBackground=(0,I.registerColor)("list.hoverBackground",{dark:"#2A2D2E",light:"#F0F0F0",hcDark:k.Color.white.transparent(.1),hcLight:k.Color.fromHex("#0F4A85").transparent(.1)},d.localize(1774,"List/Tree background when hovering over items using the mouse.")),e.listHoverForeground=(0,I.registerColor)("list.hoverForeground",null,d.localize(1775,"List/Tree foreground when hovering over items using the mouse.")),e.listDropOverBackground=(0,I.registerColor)("list.dropBackground",{dark:"#062F4A",light:"#D6EBFF",hcDark:null,hcLight:null},d.localize(1776,"List/Tree drag and drop background when moving items over other items when using the mouse.")),e.listDropBetweenBackground=(0,I.registerColor)("list.dropBetweenBackground",{dark:E.iconForeground,light:E.iconForeground,hcDark:null,hcLight:null},d.localize(1777,"List/Tree drag and drop border color when moving items between items when using the mouse.")),e.listHighlightForeground=(0,I.registerColor)("list.highlightForeground",{dark:"#2AAAFF",light:"#0066BF",hcDark:E.focusBorder,hcLight:E.focusBorder},d.localize(1778,"List/Tree foreground color of the match highlights when searching inside the list/tree.")),e.listFocusHighlightForeground=(0,I.registerColor)("list.focusHighlightForeground",{dark:e.listHighlightForeground,light:(0,I.ifDefinedThenElse)(e.listActiveSelectionBackground,e.listHighlightForeground,"#BBE7FF"),hcDark:e.listHighlightForeground,hcLight:e.listHighlightForeground},d.localize(1779,"List/Tree foreground color of the match highlights on actively focused items when searching inside the list/tree.")),e.listInvalidItemForeground=(0,I.registerColor)("list.invalidItemForeground",{dark:"#B89500",light:"#B89500",hcDark:"#B89500",hcLight:"#B5200D"},d.localize(1780,"List/Tree foreground color for invalid items, for example an unresolved root in explorer.")),e.listErrorForeground=(0,I.registerColor)("list.errorForeground",{dark:"#F88070",light:"#B01011",hcDark:null,hcLight:null},d.localize(1781,"Foreground color of list items containing errors.")),e.listWarningForeground=(0,I.registerColor)("list.warningForeground",{dark:"#CCA700",light:"#855F00",hcDark:null,hcLight:null},d.localize(1782,"Foreground color of list items containing warnings.")),e.listFilterWidgetBackground=(0,I.registerColor)("listFilterWidget.background",{light:(0,I.darken)(y.editorWidgetBackground,0),dark:(0,I.lighten)(y.editorWidgetBackground,0),hcDark:y.editorWidgetBackground,hcLight:y.editorWidgetBackground},d.localize(1783,"Background color of the type filter widget in lists and trees.")),e.listFilterWidgetOutline=(0,I.registerColor)("listFilterWidget.outline",{dark:k.Color.transparent,light:k.Color.transparent,hcDark:"#f38518",hcLight:"#007ACC"},d.localize(1784,"Outline color of the type filter widget in lists and trees.")),e.listFilterWidgetNoMatchesOutline=(0,I.registerColor)("listFilterWidget.noMatchesOutline",{dark:"#BE1100",light:"#BE1100",hcDark:E.contrastBorder,hcLight:E.contrastBorder},d.localize(1785,"Outline color of the type filter widget in lists and trees, when there are no matches.")),e.listFilterWidgetShadow=(0,I.registerColor)("listFilterWidget.shadow",y.widgetShadow,d.localize(1786,"Shadow color of the type filter widget in lists and trees.")),e.listFilterMatchHighlight=(0,I.registerColor)("list.filterMatchBackground",{dark:y.editorFindMatchHighlight,light:y.editorFindMatchHighlight,hcDark:null,hcLight:null},d.localize(1787,"Background color of the filtered match.")),e.listFilterMatchHighlightBorder=(0,I.registerColor)("list.filterMatchBorder",{dark:y.editorFindMatchHighlightBorder,light:y.editorFindMatchHighlightBorder,hcDark:E.contrastBorder,hcLight:E.activeContrastBorder},d.localize(1788,"Border color of the filtered match.")),e.listDeemphasizedForeground=(0,I.registerColor)("list.deemphasizedForeground",{dark:"#8C8C8C",light:"#8E8E90",hcDark:"#A7A8A9",hcLight:"#666666"},d.localize(1789,"List/Tree foreground color for items that are deemphasized.")),e.treeIndentGuidesStroke=(0,I.registerColor)("tree.indentGuidesStroke",{dark:"#585858",light:"#a9a9a9",hcDark:"#a9a9a9",hcLight:"#a5a5a5"},d.localize(1790,"Tree stroke color for the indentation guides.")),e.treeInactiveIndentGuidesStroke=(0,I.registerColor)("tree.inactiveIndentGuidesStroke",(0,I.transparent)(e.treeIndentGuidesStroke,.4),d.localize(1791,"Tree stroke color for the indentation guides that are not active.")),e.tableColumnsBorder=(0,I.registerColor)("tree.tableColumnsBorder",{dark:"#CCCCCC20",light:"#61616120",hcDark:null,hcLight:null},d.localize(1792,"Table border color between columns.")),e.tableOddRowsBackgroundColor=(0,I.registerColor)("tree.tableOddRowsBackground",{dark:(0,I.transparent)(E.foreground,.04),light:(0,I.transparent)(E.foreground,.04),hcDark:null,hcLight:null},d.localize(1793,"Background color for odd table rows.")),e.editorActionListBackground=(0,I.registerColor)("editorActionList.background",y.editorWidgetBackground,d.localize(1794,"Action List background color.")),e.editorActionListForeground=(0,I.registerColor)("editorActionList.foreground",y.editorWidgetForeground,d.localize(1795,"Action List foreground color.")),e.editorActionListFocusForeground=(0,I.registerColor)("editorActionList.focusForeground",e.listActiveSelectionForeground,d.localize(1796,"Action List foreground color for the focused item.")),e.editorActionListFocusBackground=(0,I.registerColor)("editorActionList.focusBackground",e.listActiveSelectionBackground,d.localize(1797,"Action List background color for the focused item."))}),define(ne[751],se([1,0,3,89,123,412,279]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.menuSeparatorBackground=e.menuSelectionBorder=e.menuSelectionBackground=e.menuSelectionForeground=e.menuBackground=e.menuForeground=e.menuBorder=void 0,e.menuBorder=(0,k.registerColor)("menu.border",{dark:null,light:null,hcDark:I.contrastBorder,hcLight:I.contrastBorder},d.localize(1798,"Border color of menus.")),e.menuForeground=(0,k.registerColor)("menu.foreground",E.selectForeground,d.localize(1799,"Foreground color of menu items.")),e.menuBackground=(0,k.registerColor)("menu.background",E.selectBackground,d.localize(1800,"Background color of menu items.")),e.menuSelectionForeground=(0,k.registerColor)("menu.selectionForeground",y.listActiveSelectionForeground,d.localize(1801,"Foreground color of the selected menu item in menus.")),e.menuSelectionBackground=(0,k.registerColor)("menu.selectionBackground",y.listActiveSelectionBackground,d.localize(1802,"Background color of the selected menu item in menus.")),e.menuSelectionBorder=(0,k.registerColor)("menu.selectionBorder",{dark:null,light:null,hcDark:I.activeContrastBorder,hcLight:I.activeContrastBorder},d.localize(1803,"Border color of the selected menu item in menus.")),e.menuSeparatorBackground=(0,k.registerColor)("menu.separatorBackground",{dark:"#606060",light:"#D4D4D4",hcDark:I.contrastBorder,hcLight:I.contrastBorder},d.localize(1804,"Color of a separator menu item in menus."))}),define(ne[413],se([1,0,3,33,89,138,278]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.minimapSliderActiveBackground=e.minimapSliderHoverBackground=e.minimapSliderBackground=e.minimapForegroundOpacity=e.minimapBackground=e.minimapError=e.minimapWarning=e.minimapInfo=e.minimapSelection=e.minimapSelectionOccurrenceHighlight=e.minimapFindMatch=void 0,e.minimapFindMatch=(0,I.registerColor)("minimap.findMatchHighlight",{light:"#d18616",dark:"#d18616",hcDark:"#AB5A00",hcLight:"#0F4A85"},d.localize(1805,"Minimap marker color for find matches."),!0),e.minimapSelectionOccurrenceHighlight=(0,I.registerColor)("minimap.selectionOccurrenceHighlight",{light:"#c9c9c9",dark:"#676767",hcDark:"#ffffff",hcLight:"#0F4A85"},d.localize(1806,"Minimap marker color for repeating editor selections."),!0),e.minimapSelection=(0,I.registerColor)("minimap.selectionHighlight",{light:"#ADD6FF",dark:"#264F78",hcDark:"#ffffff",hcLight:"#0F4A85"},d.localize(1807,"Minimap marker color for the editor selection."),!0),e.minimapInfo=(0,I.registerColor)("minimap.infoHighlight",{dark:E.editorInfoForeground,light:E.editorInfoForeground,hcDark:E.editorInfoBorder,hcLight:E.editorInfoBorder},d.localize(1808,"Minimap marker color for infos.")),e.minimapWarning=(0,I.registerColor)("minimap.warningHighlight",{dark:E.editorWarningForeground,light:E.editorWarningForeground,hcDark:E.editorWarningBorder,hcLight:E.editorWarningBorder},d.localize(1809,"Minimap marker color for warnings.")),e.minimapError=(0,I.registerColor)("minimap.errorHighlight",{dark:new k.Color(new k.RGBA(255,18,18,.7)),light:new k.Color(new k.RGBA(255,18,18,.7)),hcDark:new k.Color(new k.RGBA(255,50,50,1)),hcLight:"#B5200D"},d.localize(1810,"Minimap marker color for errors.")),e.minimapBackground=(0,I.registerColor)("minimap.background",null,d.localize(1811,"Minimap background color.")),e.minimapForegroundOpacity=(0,I.registerColor)("minimap.foregroundOpacity",k.Color.fromHex("#000f"),d.localize(1812,'Opacity of foreground elements rendered in the minimap. For example, "#000000c0" will render the elements with 75% opacity.')),e.minimapSliderBackground=(0,I.registerColor)("minimapSlider.background",(0,I.transparent)(y.scrollbarSliderBackground,.5),d.localize(1813,"Minimap slider background color.")),e.minimapSliderHoverBackground=(0,I.registerColor)("minimapSlider.hoverBackground",(0,I.transparent)(y.scrollbarSliderHoverBackground,.5),d.localize(1814,"Minimap slider background color when hovering.")),e.minimapSliderActiveBackground=(0,I.registerColor)("minimapSlider.activeBackground",(0,I.transparent)(y.scrollbarSliderActiveBackground,.5),d.localize(1815,"Minimap slider background color when clicked on."))}),define(ne[752],se([1,0,3,89,123,138,413]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.chartsPurple=e.chartsGreen=e.chartsOrange=e.chartsYellow=e.chartsBlue=e.chartsRed=e.chartsLines=e.chartsForeground=void 0,e.chartsForeground=(0,k.registerColor)("charts.foreground",I.foreground,d.localize(1616,"The foreground color used in charts.")),e.chartsLines=(0,k.registerColor)("charts.lines",(0,k.transparent)(I.foreground,.5),d.localize(1617,"The color used for horizontal lines in charts.")),e.chartsRed=(0,k.registerColor)("charts.red",E.editorErrorForeground,d.localize(1618,"The red color used in chart visualizations.")),e.chartsBlue=(0,k.registerColor)("charts.blue",E.editorInfoForeground,d.localize(1619,"The blue color used in chart visualizations.")),e.chartsYellow=(0,k.registerColor)("charts.yellow",E.editorWarningForeground,d.localize(1620,"The yellow color used in chart visualizations.")),e.chartsOrange=(0,k.registerColor)("charts.orange",y.minimapFindMatch,d.localize(1621,"The orange color used in chart visualizations.")),e.chartsGreen=(0,k.registerColor)("charts.green",{dark:"#89D185",light:"#388A34",hcDark:"#89D185",hcLight:"#374e06"},d.localize(1622,"The green color used in chart visualizations.")),e.chartsPurple=(0,k.registerColor)("charts.purple",{dark:"#B180D7",light:"#652D90",hcDark:"#B180D7",hcLight:"#652D90"},d.localize(1623,"The purple color used in chart visualizations."))}),define(ne[753],se([1,0,3,33,89,138,279]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.quickInputListFocusBackground=e.quickInputListFocusIconForeground=e.quickInputListFocusForeground=e._deprecatedQuickInputListFocusBackground=e.pickerGroupBorder=e.pickerGroupForeground=e.quickInputTitleBackground=e.quickInputForeground=e.quickInputBackground=void 0,e.quickInputBackground=(0,I.registerColor)("quickInput.background",E.editorWidgetBackground,d.localize(1824,"Quick picker background color. The quick picker widget is the container for pickers like the command palette.")),e.quickInputForeground=(0,I.registerColor)("quickInput.foreground",E.editorWidgetForeground,d.localize(1825,"Quick picker foreground color. The quick picker widget is the container for pickers like the command palette.")),e.quickInputTitleBackground=(0,I.registerColor)("quickInputTitle.background",{dark:new k.Color(new k.RGBA(255,255,255,.105)),light:new k.Color(new k.RGBA(0,0,0,.06)),hcDark:"#000000",hcLight:k.Color.white},d.localize(1826,"Quick picker title background color. The quick picker widget is the container for pickers like the command palette.")),e.pickerGroupForeground=(0,I.registerColor)("pickerGroup.foreground",{dark:"#3794FF",light:"#0066BF",hcDark:k.Color.white,hcLight:"#0F4A85"},d.localize(1827,"Quick picker color for grouping labels.")),e.pickerGroupBorder=(0,I.registerColor)("pickerGroup.border",{dark:"#3F3F46",light:"#CCCEDB",hcDark:k.Color.white,hcLight:"#0F4A85"},d.localize(1828,"Quick picker color for grouping borders.")),e._deprecatedQuickInputListFocusBackground=(0,I.registerColor)("quickInput.list.focusBackground",null,"",void 0,d.localize(1829,"Please use quickInputList.focusBackground instead")),e.quickInputListFocusForeground=(0,I.registerColor)("quickInputList.focusForeground",y.listActiveSelectionForeground,d.localize(1830,"Quick picker foreground color for the focused item.")),e.quickInputListFocusIconForeground=(0,I.registerColor)("quickInputList.focusIconForeground",y.listActiveSelectionIconForeground,d.localize(1831,"Quick picker icon foreground color for the focused item.")),e.quickInputListFocusBackground=(0,I.registerColor)("quickInputList.focusBackground",{dark:(0,I.oneOf)(e._deprecatedQuickInputListFocusBackground,y.listActiveSelectionBackground),light:(0,I.oneOf)(e._deprecatedQuickInputListFocusBackground,y.listActiveSelectionBackground),hcDark:null,hcLight:null},d.localize(1832,"Quick picker background color for the focused item."))}),define(ne[754],se([1,0,3,89,123,138]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.searchEditorFindMatchBorder=e.searchEditorFindMatch=e.searchResultsInfoForeground=void 0,e.searchResultsInfoForeground=(0,k.registerColor)("search.resultsInfoForeground",{light:I.foreground,dark:(0,k.transparent)(I.foreground,.65),hcDark:I.foreground,hcLight:I.foreground},d.localize(1833,"Color of the text in the search viewlet's completion message.")),e.searchEditorFindMatch=(0,k.registerColor)("searchEditor.findMatchBackground",{light:(0,k.transparent)(E.editorFindMatchHighlight,.66),dark:(0,k.transparent)(E.editorFindMatchHighlight,.66),hcDark:E.editorFindMatchHighlight,hcLight:E.editorFindMatchHighlight},d.localize(1834,"Color of the Search Editor query matches.")),e.searchEditorFindMatchBorder=(0,k.registerColor)("searchEditor.findMatchBorder",{light:(0,k.transparent)(E.editorFindMatchHighlightBorder,.66),dark:(0,k.transparent)(E.editorFindMatchHighlightBorder,.66),hcDark:E.editorFindMatchHighlightBorder,hcLight:E.editorFindMatchHighlightBorder},d.localize(1835,"Border color of the Search Editor query matches."))});var ci=this&&this.__createBinding||(Object.create?function(oe,e,d,k){k===void 0&&(k=d);var I=Object.getOwnPropertyDescriptor(e,d);(!I||("get"in I?!e.__esModule:I.writable||I.configurable))&&(I={enumerable:!0,get:function(){return e[d]}}),Object.defineProperty(oe,k,I)}:function(oe,e,d,k){k===void 0&&(k=d),oe[k]=e[d]}),Lt=this&&this.__exportStar||function(oe,e){for(var d in oe)d!=="default"&&!Object.prototype.hasOwnProperty.call(e,d)&&ci(e,oe,d)};define(ne[32],se([1,0,89,123,752,138,412,279,751,413,278,753,754]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),Lt(d,e),Lt(k,e),Lt(I,e),Lt(E,e),Lt(y,e),Lt(m,e),Lt(_,e),Lt(b,e),Lt(p,e),Lt(n,e),Lt(o,e)}),define(ne[185],se([1,0,5,172,77,14,2,32]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DynamicCssRules=e.GlobalEditorPointerMoveMonitor=e.EditorPointerEventFactory=e.EditorMouseEventFactory=e.EditorMouseEvent=e.CoordinatesRelativeToEditor=e.EditorPagePosition=e.ClientCoordinates=e.PageCoordinates=void 0,e.createEditorPagePosition=o,e.createCoordinatesRelativeToEditor=t;class _{constructor(C,f){this.x=C,this.y=f,this._pageCoordinatesBrand=void 0}toClientCoordinates(C){return new b(this.x-C.scrollX,this.y-C.scrollY)}}e.PageCoordinates=_;class b{constructor(C,f){this.clientX=C,this.clientY=f,this._clientCoordinatesBrand=void 0}toPageCoordinates(C){return new _(this.clientX+C.scrollX,this.clientY+C.scrollY)}}e.ClientCoordinates=b;class p{constructor(C,f,h,v){this.x=C,this.y=f,this.width=h,this.height=v,this._editorPagePositionBrand=void 0}}e.EditorPagePosition=p;class n{constructor(C,f){this.x=C,this.y=f,this._positionRelativeToEditorBrand=void 0}}e.CoordinatesRelativeToEditor=n;function o(u){const C=d.getDomNodePagePosition(u);return new p(C.left,C.top,C.width,C.height)}function t(u,C,f){const h=C.width/u.offsetWidth,v=C.height/u.offsetHeight,w=(f.x-C.x)/h,S=(f.y-C.y)/v;return new n(w,S)}class i extends I.StandardMouseEvent{constructor(C,f,h){super(d.getWindow(h),C),this._editorMouseEventBrand=void 0,this.isFromPointerCapture=f,this.pos=new _(this.posx,this.posy),this.editorPos=o(h),this.relativePos=t(h,this.editorPos,this.pos)}}e.EditorMouseEvent=i;class s{constructor(C){this._editorViewDomNode=C}_create(C){return new i(C,!1,this._editorViewDomNode)}onContextMenu(C,f){return d.addDisposableListener(C,"contextmenu",h=>{f(this._create(h))})}onMouseUp(C,f){return d.addDisposableListener(C,"mouseup",h=>{f(this._create(h))})}onMouseDown(C,f){return d.addDisposableListener(C,d.EventType.MOUSE_DOWN,h=>{f(this._create(h))})}onPointerDown(C,f){return d.addDisposableListener(C,d.EventType.POINTER_DOWN,h=>{f(this._create(h),h.pointerId)})}onMouseLeave(C,f){return d.addDisposableListener(C,d.EventType.MOUSE_LEAVE,h=>{f(this._create(h))})}onMouseMove(C,f){return d.addDisposableListener(C,"mousemove",h=>f(this._create(h)))}}e.EditorMouseEventFactory=s;class g{constructor(C){this._editorViewDomNode=C}_create(C){return new i(C,!1,this._editorViewDomNode)}onPointerUp(C,f){return d.addDisposableListener(C,"pointerup",h=>{f(this._create(h))})}onPointerDown(C,f){return d.addDisposableListener(C,d.EventType.POINTER_DOWN,h=>{f(this._create(h),h.pointerId)})}onPointerLeave(C,f){return d.addDisposableListener(C,d.EventType.POINTER_LEAVE,h=>{f(this._create(h))})}onPointerMove(C,f){return d.addDisposableListener(C,"pointermove",h=>f(this._create(h)))}}e.EditorPointerEventFactory=g;class c extends y.Disposable{constructor(C){super(),this._editorViewDomNode=C,this._globalPointerMoveMonitor=this._register(new k.GlobalPointerMoveMonitor),this._keydownListener=null}startMonitoring(C,f,h,v,w){this._keydownListener=d.addStandardDisposableListener(C.ownerDocument,"keydown",S=>{S.toKeyCodeChord().isModifierKey()||this._globalPointerMoveMonitor.stopMonitoring(!0,S.browserEvent)},!0),this._globalPointerMoveMonitor.startMonitoring(C,f,h,S=>{v(new i(S,!0,this._editorViewDomNode))},S=>{this._keydownListener.dispose(),w(S)})}stopMonitoring(){this._globalPointerMoveMonitor.stopMonitoring(!0)}}e.GlobalEditorPointerMoveMonitor=c;class l{static{this._idPool=0}constructor(C){this._editor=C,this._instanceId=++l._idPool,this._counter=0,this._rules=new Map,this._garbageCollectionScheduler=new E.RunOnceScheduler(()=>this.garbageCollect(),1e3)}createClassNameRef(C){const f=this.getOrCreateRule(C);return f.increaseRefCount(),{className:f.className,dispose:()=>{f.decreaseRefCount(),this._garbageCollectionScheduler.schedule()}}}getOrCreateRule(C){const f=this.computeUniqueKey(C);let h=this._rules.get(f);if(!h){const v=this._counter++;h=new a(f,`dyn-rule-${this._instanceId}-${v}`,d.isInShadowDOM(this._editor.getContainerDomNode())?this._editor.getContainerDomNode():void 0,C),this._rules.set(f,h)}return h}computeUniqueKey(C){return JSON.stringify(C)}garbageCollect(){for(const C of this._rules.values())C.hasReferences()||(this._rules.delete(C.key),C.dispose())}}e.DynamicCssRules=l;class a{constructor(C,f,h,v){this.key=C,this.className=f,this.properties=v,this._referenceCount=0,this._styleElementDisposables=new y.DisposableStore,this._styleElement=d.createStyleSheet(h,void 0,this._styleElementDisposables),this._styleElement.textContent=this.getCssText(this.className,this.properties)}getCssText(C,f){let h=`.${C} {`;for(const v in f){const w=f[v];let S;typeof w=="object"?S=(0,m.asCssVariable)(w.id):S=w;const L=r(v);h+=` - ${L}: ${S};`}return h+=` -}`,h}dispose(){this._styleElementDisposables.dispose(),this._styleElement=void 0}increaseRefCount(){this._referenceCount++}decreaseRefCount(){this._referenceCount--}hasReferences(){return this._referenceCount>0}}function r(u){return u.replace(/(^[A-Z])/,([C])=>C.toLowerCase()).replace(/([A-Z])/g,([C])=>`-${C.toLowerCase()}`)}}),define(ne[755],se([1,0,5,39,172,2,16,11,262,56,37,4,311,374,95,32,23,69,551,127,45,347,491]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Minimap=void 0;const C=140,f=2;class h{constructor(N,O,F){const x=N.options,W=x.get(144),V=x.get(146),q=V.minimap,H=x.get(50),z=x.get(73);this.renderMinimap=q.renderMinimap,this.size=z.size,this.minimapHeightIsEditorHeight=q.minimapHeightIsEditorHeight,this.scrollBeyondLastLine=x.get(106),this.paddingTop=x.get(84).top,this.paddingBottom=x.get(84).bottom,this.showSlider=z.showSlider,this.autohide=z.autohide,this.pixelRatio=W,this.typicalHalfwidthCharacterWidth=H.typicalHalfwidthCharacterWidth,this.lineHeight=x.get(67),this.minimapLeft=q.minimapLeft,this.minimapWidth=q.minimapWidth,this.minimapHeight=V.height,this.canvasInnerWidth=q.minimapCanvasInnerWidth,this.canvasInnerHeight=q.minimapCanvasInnerHeight,this.canvasOuterWidth=q.minimapCanvasOuterWidth,this.canvasOuterHeight=q.minimapCanvasOuterHeight,this.isSampling=q.minimapIsSampling,this.editorHeight=V.height,this.fontScale=q.minimapScale,this.minimapLineHeight=q.minimapLineHeight,this.minimapCharWidth=1*this.fontScale,this.sectionHeaderFontFamily=u.DEFAULT_FONT_FAMILY,this.sectionHeaderFontSize=z.sectionHeaderFontSize*W,this.sectionHeaderLetterSpacing=z.sectionHeaderLetterSpacing,this.sectionHeaderFontColor=h._getSectionHeaderColor(O,F.getColor(1)),this.charRenderer=(0,a.createSingleCallFunction)(()=>l.MinimapCharRendererFactory.create(this.fontScale,H.fontFamily)),this.defaultBackgroundColor=F.getColor(2),this.backgroundColor=h._getMinimapBackground(O,this.defaultBackgroundColor),this.foregroundAlpha=h._getMinimapForegroundOpacity(O)}static _getMinimapBackground(N,O){const F=N.getColor(s.minimapBackground);return F?new o.RGBA8(F.rgba.r,F.rgba.g,F.rgba.b,Math.round(255*F.rgba.a)):O}static _getMinimapForegroundOpacity(N){const O=N.getColor(s.minimapForegroundOpacity);return O?o.RGBA8._clamp(Math.round(255*O.rgba.a)):255}static _getSectionHeaderColor(N,O){const F=N.getColor(s.editorForeground);return F?new o.RGBA8(F.rgba.r,F.rgba.g,F.rgba.b,Math.round(255*F.rgba.a)):O}equals(N){return this.renderMinimap===N.renderMinimap&&this.size===N.size&&this.minimapHeightIsEditorHeight===N.minimapHeightIsEditorHeight&&this.scrollBeyondLastLine===N.scrollBeyondLastLine&&this.paddingTop===N.paddingTop&&this.paddingBottom===N.paddingBottom&&this.showSlider===N.showSlider&&this.autohide===N.autohide&&this.pixelRatio===N.pixelRatio&&this.typicalHalfwidthCharacterWidth===N.typicalHalfwidthCharacterWidth&&this.lineHeight===N.lineHeight&&this.minimapLeft===N.minimapLeft&&this.minimapWidth===N.minimapWidth&&this.minimapHeight===N.minimapHeight&&this.canvasInnerWidth===N.canvasInnerWidth&&this.canvasInnerHeight===N.canvasInnerHeight&&this.canvasOuterWidth===N.canvasOuterWidth&&this.canvasOuterHeight===N.canvasOuterHeight&&this.isSampling===N.isSampling&&this.editorHeight===N.editorHeight&&this.fontScale===N.fontScale&&this.minimapLineHeight===N.minimapLineHeight&&this.minimapCharWidth===N.minimapCharWidth&&this.sectionHeaderFontSize===N.sectionHeaderFontSize&&this.sectionHeaderLetterSpacing===N.sectionHeaderLetterSpacing&&this.defaultBackgroundColor&&this.defaultBackgroundColor.equals(N.defaultBackgroundColor)&&this.backgroundColor&&this.backgroundColor.equals(N.backgroundColor)&&this.foregroundAlpha===N.foregroundAlpha}}class v{constructor(N,O,F,x,W,V,q,H,z){this.scrollTop=N,this.scrollHeight=O,this.sliderNeeded=F,this._computedSliderRatio=x,this.sliderTop=W,this.sliderHeight=V,this.topPaddingLineCount=q,this.startLineNumber=H,this.endLineNumber=z}getDesiredScrollTopFromDelta(N){return Math.round(this.scrollTop+N/this._computedSliderRatio)}getDesiredScrollTopFromTouchLocation(N){return Math.round((N-this.sliderHeight/2)/this._computedSliderRatio)}intersectWithViewport(N){const O=Math.max(this.startLineNumber,N.startLineNumber),F=Math.min(this.endLineNumber,N.endLineNumber);return O>F?null:[O,F]}getYForLineNumber(N,O){return+(N-this.startLineNumber+this.topPaddingLineCount)*O}static create(N,O,F,x,W,V,q,H,z,U,j){const Y=N.pixelRatio,G=N.minimapLineHeight,K=Math.floor(N.canvasInnerHeight/G),R=N.lineHeight;if(N.minimapHeightIsEditorHeight){let ee=H*N.lineHeight+N.paddingTop+N.paddingBottom;N.scrollBeyondLastLine&&(ee+=Math.max(0,W-N.lineHeight-N.paddingBottom));const de=Math.max(1,Math.floor(W*W/ee)),ge=Math.max(0,N.minimapHeight-de),X=ge/(U-W),B=z*X,$=ge>0,Q=Math.floor(N.canvasInnerHeight/N.minimapLineHeight),Z=Math.floor(N.paddingTop/N.lineHeight);return new v(z,U,$,X,B,de,Z,1,Math.min(q,Q))}let J;if(V&&F!==q){const ee=F-O+1;J=Math.floor(ee*G/Y)}else{const ee=W/R;J=Math.floor(ee*G/Y)}const ie=Math.floor(N.paddingTop/R);let ue=Math.floor(N.paddingBottom/R);if(N.scrollBeyondLastLine){const ee=W/R;ue=Math.max(ue,ee-1)}let he;if(ue>0){const ee=W/R;he=(ie+q+ue-ee-1)*G/Y}else he=Math.max(0,(ie+q)*G/Y-J);he=Math.min(N.minimapHeight-J,he);const pe=he/(U-W),ae=z*pe;if(K>=ie+q+ue){const ee=he>0;return new v(z,U,ee,pe,ae,J,ie,1,q)}else{let ee;O>1?ee=O+ie:ee=Math.max(1,z/R);let de,ge=Math.max(1,Math.floor(ee-ae*Y/G));gez&&(ge=Math.min(ge,j.startLineNumber),de=Math.max(de,j.topPaddingLineCount)),j.scrollTop=N.paddingTop?$=(O-ge+de+B)*G/Y:$=z/N.paddingTop*(de+B)*G/Y,new v(z,U,!0,pe,$,J,de,ge,X)}}}class w{static{this.INVALID=new w(-1)}constructor(N){this.dy=N}onContentChanged(){this.dy=-1}onTokensChanged(){this.dy=-1}}class S{constructor(N,O,F){this.renderedLayout=N,this._imageData=O,this._renderedLines=new _.RenderedLinesCollection({createLine:()=>w.INVALID}),this._renderedLines._set(N.startLineNumber,F)}linesEquals(N){if(!this.scrollEquals(N))return!1;const F=this._renderedLines._get().lines;for(let x=0,W=F.length;x1){for(let ie=0,ue=x-1;ie0&&this.minimapLines[F-1]>=N;)F--;let x=this.modelLineToMinimapLine(O)-1;for(;x+1O)return null}return[F+1,x+1]}decorationLineRangeToMinimapLineRange(N,O){let F=this.modelLineToMinimapLine(N),x=this.modelLineToMinimapLine(O);return N!==O&&x===F&&(x===this.minimapLines.length?F>1&&F--:x++),[F,x]}onLinesDeleted(N){const O=N.toLineNumber-N.fromLineNumber+1;let F=this.minimapLines.length,x=0;for(let W=this.minimapLines.length-1;W>=0&&!(this.minimapLines[W]=0&&!(this.minimapLines[F]0,scrollWidth:N.scrollWidth,scrollHeight:N.scrollHeight,viewportStartLineNumber:O,viewportEndLineNumber:F,viewportStartLineNumberVerticalOffset:N.getVerticalOffsetForLineNumber(O),scrollTop:N.scrollTop,scrollLeft:N.scrollLeft,viewportWidth:N.viewportWidth,viewportHeight:N.viewportHeight};this._actual.render(x)}_recreateLineSampling(){this._minimapSelections=null;const N=!!this._samplingState,[O,F]=D.compute(this.options,this._context.viewModel.getLineCount(),this._samplingState);if(this._samplingState=O,N&&this._samplingState)for(const x of F)switch(x.type){case"deleted":this._actual.onLinesDeleted(x.deleteFromLineNumber,x.deleteToLineNumber);break;case"inserted":this._actual.onLinesInserted(x.insertFromLineNumber,x.insertToLineNumber);break;case"flush":this._actual.onFlushed();break}}getLineCount(){return this._samplingState?this._samplingState.minimapLines.length:this._context.viewModel.getLineCount()}getRealLineCount(){return this._context.viewModel.getLineCount()}getLineContent(N){return this._samplingState?this._context.viewModel.getLineContent(this._samplingState.minimapLines[N-1]):this._context.viewModel.getLineContent(N)}getLineMaxColumn(N){return this._samplingState?this._context.viewModel.getLineMaxColumn(this._samplingState.minimapLines[N-1]):this._context.viewModel.getLineMaxColumn(N)}getMinimapLinesRenderingData(N,O,F){if(this._samplingState){const x=[];for(let W=0,V=O-N+1;W!x.options.minimap?.sectionHeaderStyle);if(this._samplingState){const x=[];for(const W of F){if(!W.options.minimap)continue;const V=W.range,q=this._samplingState.modelLineToMinimapLine(V.startLineNumber),H=this._samplingState.modelLineToMinimapLine(V.endLineNumber);x.push(new i.ViewModelDecoration(new n.Range(q,V.startColumn,H,V.endColumn),W.options))}return x}return F}getSectionHeaderDecorationsInViewport(N,O){const F=this.options.minimapLineHeight,W=this.options.sectionHeaderFontSize/F;return N=Math.floor(Math.max(1,N-W)),this._getMinimapDecorationsInViewport(N,O).filter(V=>!!V.options.minimap?.sectionHeaderStyle)}_getMinimapDecorationsInViewport(N,O){let F;if(this._samplingState){const x=this._samplingState.minimapLines[N-1],W=this._samplingState.minimapLines[O-1];F=new n.Range(x,1,W,this._context.viewModel.getLineMaxColumn(W))}else F=new n.Range(N,1,O,this._context.viewModel.getLineMaxColumn(O));return this._context.viewModel.getMinimapDecorationsInRange(F)}getSectionHeaderText(N,O){const F=N.options.minimap?.sectionHeaderText;if(!F)return null;const x=this._sectionHeaderCache.get(F);if(x)return x;const W=O(F);return this._sectionHeaderCache.set(F,W),W}getOptions(){return this._context.viewModel.model.getOptions()}revealLineNumber(N){this._samplingState&&(N=this._samplingState.minimapLines[N-1]),this._context.viewModel.revealRange("mouse",!1,new n.Range(N,1,N,1),1,0)}setScrollTop(N){this._context.viewModel.viewLayout.setScrollPosition({scrollTop:N},1)}}e.Minimap=T;class M extends E.Disposable{constructor(N,O){super(),this._renderDecorations=!1,this._gestureInProgress=!1,this._theme=N,this._model=O,this._lastRenderData=null,this._buffers=null,this._selectionColor=this._theme.getColor(s.minimapSelection),this._domNode=(0,k.createFastDomNode)(document.createElement("div")),b.PartFingerprints.write(this._domNode,9),this._domNode.setClassName(this._getMinimapDomNodeClassName()),this._domNode.setPosition("absolute"),this._domNode.setAttribute("role","presentation"),this._domNode.setAttribute("aria-hidden","true"),this._shadow=(0,k.createFastDomNode)(document.createElement("div")),this._shadow.setClassName("minimap-shadow-hidden"),this._domNode.appendChild(this._shadow),this._canvas=(0,k.createFastDomNode)(document.createElement("canvas")),this._canvas.setPosition("absolute"),this._canvas.setLeft(0),this._domNode.appendChild(this._canvas),this._decorationsCanvas=(0,k.createFastDomNode)(document.createElement("canvas")),this._decorationsCanvas.setPosition("absolute"),this._decorationsCanvas.setClassName("minimap-decorations-layer"),this._decorationsCanvas.setLeft(0),this._domNode.appendChild(this._decorationsCanvas),this._slider=(0,k.createFastDomNode)(document.createElement("div")),this._slider.setPosition("absolute"),this._slider.setClassName("minimap-slider"),this._slider.setLayerHinting(!0),this._slider.setContain("strict"),this._domNode.appendChild(this._slider),this._sliderHorizontal=(0,k.createFastDomNode)(document.createElement("div")),this._sliderHorizontal.setPosition("absolute"),this._sliderHorizontal.setClassName("minimap-slider-horizontal"),this._slider.appendChild(this._sliderHorizontal),this._applyLayout(),this._pointerDownListener=d.addStandardDisposableListener(this._domNode.domNode,d.EventType.POINTER_DOWN,F=>{if(F.preventDefault(),this._model.options.renderMinimap===0||!this._lastRenderData)return;if(this._model.options.size!=="proportional"){if(F.button===0&&this._lastRenderData){const z=d.getDomNodePagePosition(this._slider.domNode),U=z.top+z.height/2;this._startSliderDragging(F,U,this._lastRenderData.renderedLayout)}return}const W=this._model.options.minimapLineHeight,V=this._model.options.canvasInnerHeight/this._model.options.canvasOuterHeight*F.offsetY;let H=Math.floor(V/W)+this._lastRenderData.renderedLayout.startLineNumber-this._lastRenderData.renderedLayout.topPaddingLineCount;H=Math.min(H,this._model.getLineCount()),this._model.revealLineNumber(H)}),this._sliderPointerMoveMonitor=new I.GlobalPointerMoveMonitor,this._sliderPointerDownListener=d.addStandardDisposableListener(this._slider.domNode,d.EventType.POINTER_DOWN,F=>{F.preventDefault(),F.stopPropagation(),F.button===0&&this._lastRenderData&&this._startSliderDragging(F,F.pageY,this._lastRenderData.renderedLayout)}),this._gestureDisposable=c.Gesture.addTarget(this._domNode.domNode),this._sliderTouchStartListener=d.addDisposableListener(this._domNode.domNode,c.EventType.Start,F=>{F.preventDefault(),F.stopPropagation(),this._lastRenderData&&(this._slider.toggleClassName("active",!0),this._gestureInProgress=!0,this.scrollDueToTouchEvent(F))},{passive:!1}),this._sliderTouchMoveListener=d.addDisposableListener(this._domNode.domNode,c.EventType.Change,F=>{F.preventDefault(),F.stopPropagation(),this._lastRenderData&&this._gestureInProgress&&this.scrollDueToTouchEvent(F)},{passive:!1}),this._sliderTouchEndListener=d.addStandardDisposableListener(this._domNode.domNode,c.EventType.End,F=>{F.preventDefault(),F.stopPropagation(),this._gestureInProgress=!1,this._slider.toggleClassName("active",!1)})}_startSliderDragging(N,O,F){if(!N.target||!(N.target instanceof Element))return;const x=N.pageX;this._slider.toggleClassName("active",!0);const W=(V,q)=>{const H=d.getDomNodePagePosition(this._domNode.domNode),z=Math.min(Math.abs(q-x),Math.abs(q-H.left),Math.abs(q-H.left-H.width));if(y.isWindows&&z>C){this._model.setScrollTop(F.scrollTop);return}const U=V-O;this._model.setScrollTop(F.getDesiredScrollTopFromDelta(U))};N.pageY!==O&&W(N.pageY,x),this._sliderPointerMoveMonitor.startMonitoring(N.target,N.pointerId,N.buttons,V=>W(V.pageY,V.pageX),()=>{this._slider.toggleClassName("active",!1)})}scrollDueToTouchEvent(N){const O=this._domNode.domNode.getBoundingClientRect().top,F=this._lastRenderData.renderedLayout.getDesiredScrollTopFromTouchLocation(N.pageY-O);this._model.setScrollTop(F)}dispose(){this._pointerDownListener.dispose(),this._sliderPointerMoveMonitor.dispose(),this._sliderPointerDownListener.dispose(),this._gestureDisposable.dispose(),this._sliderTouchStartListener.dispose(),this._sliderTouchMoveListener.dispose(),this._sliderTouchEndListener.dispose(),super.dispose()}_getMinimapDomNodeClassName(){const N=["minimap"];return this._model.options.showSlider==="always"?N.push("slider-always"):N.push("slider-mouseover"),this._model.options.autohide&&N.push("autohide"),N.join(" ")}getDomNode(){return this._domNode}_applyLayout(){this._domNode.setLeft(this._model.options.minimapLeft),this._domNode.setWidth(this._model.options.minimapWidth),this._domNode.setHeight(this._model.options.minimapHeight),this._shadow.setHeight(this._model.options.minimapHeight),this._canvas.setWidth(this._model.options.canvasOuterWidth),this._canvas.setHeight(this._model.options.canvasOuterHeight),this._canvas.domNode.width=this._model.options.canvasInnerWidth,this._canvas.domNode.height=this._model.options.canvasInnerHeight,this._decorationsCanvas.setWidth(this._model.options.canvasOuterWidth),this._decorationsCanvas.setHeight(this._model.options.canvasOuterHeight),this._decorationsCanvas.domNode.width=this._model.options.canvasInnerWidth,this._decorationsCanvas.domNode.height=this._model.options.canvasInnerHeight,this._slider.setWidth(this._model.options.minimapWidth)}_getBuffer(){return this._buffers||this._model.options.canvasInnerWidth>0&&this._model.options.canvasInnerHeight>0&&(this._buffers=new L(this._canvas.domNode.getContext("2d"),this._model.options.canvasInnerWidth,this._model.options.canvasInnerHeight,this._model.options.backgroundColor)),this._buffers?this._buffers.getBuffer():null}onDidChangeOptions(){this._lastRenderData=null,this._buffers=null,this._applyLayout(),this._domNode.setClassName(this._getMinimapDomNodeClassName())}onSelectionChanged(){return this._renderDecorations=!0,!0}onDecorationsChanged(){return this._renderDecorations=!0,!0}onFlushed(){return this._lastRenderData=null,!0}onLinesChanged(N,O){return this._lastRenderData?this._lastRenderData.onLinesChanged(N,O):!1}onLinesDeleted(N,O){return this._lastRenderData?.onLinesDeleted(N,O),!0}onLinesInserted(N,O){return this._lastRenderData?.onLinesInserted(N,O),!0}onScrollChanged(){return this._renderDecorations=!0,!0}onThemeChanged(){return this._selectionColor=this._theme.getColor(s.minimapSelection),this._renderDecorations=!0,!0}onTokensChanged(N){return this._lastRenderData?this._lastRenderData.onTokensChanged(N):!1}onTokensColorsChanged(){return this._lastRenderData=null,this._buffers=null,!0}onZonesChanged(){return this._lastRenderData=null,!0}render(N){if(this._model.options.renderMinimap===0){this._shadow.setClassName("minimap-shadow-hidden"),this._sliderHorizontal.setWidth(0),this._sliderHorizontal.setHeight(0);return}N.scrollLeft+N.viewportWidth>=N.scrollWidth?this._shadow.setClassName("minimap-shadow-hidden"):this._shadow.setClassName("minimap-shadow-visible");const F=v.create(this._model.options,N.viewportStartLineNumber,N.viewportEndLineNumber,N.viewportStartLineNumberVerticalOffset,N.viewportHeight,N.viewportContainsWhitespaceGaps,this._model.getLineCount(),this._model.getRealLineCount(),N.scrollTop,N.scrollHeight,this._lastRenderData?this._lastRenderData.renderedLayout:null);this._slider.setDisplay(F.sliderNeeded?"block":"none"),this._slider.setTop(F.sliderTop),this._slider.setHeight(F.sliderHeight),this._sliderHorizontal.setLeft(0),this._sliderHorizontal.setWidth(this._model.options.minimapWidth),this._sliderHorizontal.setTop(0),this._sliderHorizontal.setHeight(F.sliderHeight),this.renderDecorations(F),this._lastRenderData=this.renderLines(F)}renderDecorations(N){if(this._renderDecorations){this._renderDecorations=!1;const O=this._model.getSelections();O.sort(n.Range.compareRangesUsingStarts);const F=this._model.getMinimapDecorationsInViewport(N.startLineNumber,N.endLineNumber);F.sort((Y,G)=>(Y.options.zIndex||0)-(G.options.zIndex||0));const{canvasInnerWidth:x,canvasInnerHeight:W}=this._model.options,V=this._model.options.minimapLineHeight,q=this._model.options.minimapCharWidth,H=this._model.getOptions().tabSize,z=this._decorationsCanvas.domNode.getContext("2d");z.clearRect(0,0,x,W);const U=new A(N.startLineNumber,N.endLineNumber,!1);this._renderSelectionLineHighlights(z,O,U,N,V),this._renderDecorationsLineHighlights(z,F,U,N,V);const j=new A(N.startLineNumber,N.endLineNumber,null);this._renderSelectionsHighlights(z,O,j,N,V,H,q,x),this._renderDecorationsHighlights(z,F,j,N,V,H,q,x),this._renderSectionHeaders(N)}}_renderSelectionLineHighlights(N,O,F,x,W){if(!this._selectionColor||this._selectionColor.isTransparent())return;N.fillStyle=this._selectionColor.transparent(.5).toString();let V=0,q=0;for(const H of O){const z=x.intersectWithViewport(H);if(!z)continue;const[U,j]=z;for(let K=U;K<=j;K++)F.set(K,!0);const Y=x.getYForLineNumber(U,W),G=x.getYForLineNumber(j,W);q>=Y||(q>V&&N.fillRect(p.MINIMAP_GUTTER_WIDTH,V,N.canvas.width,q-V),V=Y),q=G}q>V&&N.fillRect(p.MINIMAP_GUTTER_WIDTH,V,N.canvas.width,q-V)}_renderDecorationsLineHighlights(N,O,F,x,W){const V=new Map;for(let q=O.length-1;q>=0;q--){const H=O[q],z=H.options.minimap;if(!z||z.position!==1)continue;const U=x.intersectWithViewport(H.range);if(!U)continue;const[j,Y]=U,G=z.getColor(this._theme.value);if(!G||G.isTransparent())continue;let K=V.get(G.toString());K||(K=G.transparent(.5).toString(),V.set(G.toString(),K)),N.fillStyle=K;for(let R=j;R<=Y;R++){if(F.has(R))continue;F.set(R,!0);const J=x.getYForLineNumber(j,W);N.fillRect(p.MINIMAP_GUTTER_WIDTH,J,N.canvas.width,W)}}}_renderSelectionsHighlights(N,O,F,x,W,V,q,H){if(!(!this._selectionColor||this._selectionColor.isTransparent()))for(const z of O){const U=x.intersectWithViewport(z);if(!U)continue;const[j,Y]=U;for(let G=j;G<=Y;G++)this.renderDecorationOnLine(N,F,z,this._selectionColor,x,G,W,W,V,q,H)}}_renderDecorationsHighlights(N,O,F,x,W,V,q,H){for(const z of O){const U=z.options.minimap;if(!U)continue;const j=x.intersectWithViewport(z.range);if(!j)continue;const[Y,G]=j,K=U.getColor(this._theme.value);if(!(!K||K.isTransparent()))for(let R=Y;R<=G;R++)switch(U.position){case 1:this.renderDecorationOnLine(N,F,z.range,K,x,R,W,W,V,q,H);continue;case 2:{const J=x.getYForLineNumber(R,W);this.renderDecoration(N,K,2,J,f,W);continue}}}}renderDecorationOnLine(N,O,F,x,W,V,q,H,z,U,j){const Y=W.getYForLineNumber(V,H);if(Y+q<0||Y>this._model.options.canvasInnerHeight)return;const{startLineNumber:G,endLineNumber:K}=F,R=G===V?F.startColumn:1,J=K===V?F.endColumn:this._model.getLineMaxColumn(V),ie=this.getXOffsetForPosition(O,V,R,z,U,j),ue=this.getXOffsetForPosition(O,V,J,z,U,j);this.renderDecoration(N,x,ie,Y,ue-ie,q)}getXOffsetForPosition(N,O,F,x,W,V){if(F===1)return p.MINIMAP_GUTTER_WIDTH;if((F-1)*W>=V)return V;let H=N.get(O);if(!H){const z=this._model.getLineContent(O);H=[p.MINIMAP_GUTTER_WIDTH];let U=p.MINIMAP_GUTTER_WIDTH;for(let j=1;j=V){H[j]=V;break}H[j]=K,U=K}N.set(O,H)}return F-1R.range.startLineNumber-J.range.startLineNumber);const K=M._fitSectionHeader.bind(null,Y,V-p.MINIMAP_GUTTER_WIDTH);for(const R of G){const J=N.getYForLineNumber(R.range.startLineNumber,O)+F,ie=J-F,ue=ie+2,he=this._model.getSectionHeaderText(R,K);M._renderSectionLabel(Y,he,R.options.minimap?.sectionHeaderStyle===2,H,U,V,ie,W,J,ue)}}static _fitSectionHeader(N,O,F){if(!F)return F;const x="\u2026",W=N.measureText(F).width,V=N.measureText(x).width;if(W<=O||W<=V)return F;const q=F.length,H=W/F.length,z=Math.floor((O-V)/H)-1;let U=Math.ceil(z/2);for(;U>0&&/\s/.test(F[U-1]);)--U;return F.substring(0,U)+x+F.substring(q-(z-U))}static _renderSectionLabel(N,O,F,x,W,V,q,H,z,U){O&&(N.fillStyle=x,N.fillRect(0,q,V,H),N.fillStyle=W,N.fillText(O,p.MINIMAP_GUTTER_WIDTH,z)),F&&(N.beginPath(),N.moveTo(0,U),N.lineTo(V,U),N.closePath(),N.stroke())}renderLines(N){const O=N.startLineNumber,F=N.endLineNumber,x=this._model.options.minimapLineHeight;if(this._lastRenderData&&this._lastRenderData.linesEquals(N)){const re=this._lastRenderData._get();return new S(N,re.imageData,re.lines)}const W=this._getBuffer();if(!W)return null;const[V,q,H]=M._renderUntouchedLines(W,N.topPaddingLineCount,O,F,x,this._lastRenderData),z=this._model.getMinimapLinesRenderingData(O,F,H),U=this._model.getOptions().tabSize,j=this._model.options.defaultBackgroundColor,Y=this._model.options.backgroundColor,G=this._model.options.foregroundAlpha,K=this._model.tokensColorTracker,R=K.backgroundIsLight(),J=this._model.options.renderMinimap,ie=this._model.options.charRenderer(),ue=this._model.options.fontScale,he=this._model.options.minimapCharWidth,ae=(J===1?2:3)*ue,ee=x>ae?Math.floor((x-ae)/2):0,de=Y.a/255,ge=new o.RGBA8(Math.round((Y.r-j.r)*de+j.r),Math.round((Y.g-j.g)*de+j.g),Math.round((Y.b-j.b)*de+j.b),255);let X=N.topPaddingLineCount*x;const B=[];for(let re=0,le=F-O+1;re=0&&$ue)return;const Q=J.charCodeAt(ae);if(Q===9){const Z=Y-(ae+ee)%Y;ee+=Z-1,pe+=Z*V}else if(Q===32)pe+=V;else{const Z=m.isFullWidthCharacter(Q)?2:1;for(let te=0;teue)return}}}}}class A{constructor(N,O,F){this._startLineNumber=N,this._endLineNumber=O,this._defaultValue=F,this._values=[];for(let x=0,W=this._endLineNumber-this._startLineNumber+1;xthis._endLineNumber||(this._values[N-this._startLineNumber]=O)}get(N){return Nthis._endLineNumber?this._defaultValue:this._values[N-this._startLineNumber]}}}),define(ne[756],se([1,0,3,32]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.multiDiffEditorBorder=e.multiDiffEditorBackground=e.multiDiffEditorHeaderBackground=void 0,e.multiDiffEditorHeaderBackground=(0,k.registerColor)("multiDiffEditor.headerBackground",{dark:"#262626",light:"tab.inactiveBackground",hcDark:"tab.inactiveBackground",hcLight:"tab.inactiveBackground"},(0,d.localize)(129,"The background color of the diff editor's header")),e.multiDiffEditorBackground=(0,k.registerColor)("multiDiffEditor.background",k.editorBackground,(0,d.localize)(130,"The background color of the multi file diff editor")),e.multiDiffEditorBorder=(0,k.registerColor)("multiDiffEditor.border",{dark:"sideBarSectionHeader.border",light:"#cccccc",hcDark:"sideBarSectionHeader.border",hcLight:"#cccccc"},(0,d.localize)(131,"The border color of the multi file diff editor"))}),define(ne[280],se([1,0,3,32,533]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SYMBOL_ICON_VARIABLE_FOREGROUND=e.SYMBOL_ICON_UNIT_FOREGROUND=e.SYMBOL_ICON_TYPEPARAMETER_FOREGROUND=e.SYMBOL_ICON_TEXT_FOREGROUND=e.SYMBOL_ICON_STRUCT_FOREGROUND=e.SYMBOL_ICON_STRING_FOREGROUND=e.SYMBOL_ICON_SNIPPET_FOREGROUND=e.SYMBOL_ICON_REFERENCE_FOREGROUND=e.SYMBOL_ICON_PROPERTY_FOREGROUND=e.SYMBOL_ICON_PACKAGE_FOREGROUND=e.SYMBOL_ICON_OPERATOR_FOREGROUND=e.SYMBOL_ICON_OBJECT_FOREGROUND=e.SYMBOL_ICON_NUMBER_FOREGROUND=e.SYMBOL_ICON_NULL_FOREGROUND=e.SYMBOL_ICON_NAMESPACE_FOREGROUND=e.SYMBOL_ICON_MODULE_FOREGROUND=e.SYMBOL_ICON_METHOD_FOREGROUND=e.SYMBOL_ICON_KEYWORD_FOREGROUND=e.SYMBOL_ICON_KEY_FOREGROUND=e.SYMBOL_ICON_INTERFACE_FOREGROUND=e.SYMBOL_ICON_FUNCTION_FOREGROUND=e.SYMBOL_ICON_FOLDER_FOREGROUND=e.SYMBOL_ICON_FILE_FOREGROUND=e.SYMBOL_ICON_FIELD_FOREGROUND=e.SYMBOL_ICON_EVENT_FOREGROUND=e.SYMBOL_ICON_ENUMERATOR_MEMBER_FOREGROUND=e.SYMBOL_ICON_ENUMERATOR_FOREGROUND=e.SYMBOL_ICON_CONSTRUCTOR_FOREGROUND=e.SYMBOL_ICON_CONSTANT_FOREGROUND=e.SYMBOL_ICON_COLOR_FOREGROUND=e.SYMBOL_ICON_CLASS_FOREGROUND=e.SYMBOL_ICON_BOOLEAN_FOREGROUND=e.SYMBOL_ICON_ARRAY_FOREGROUND=void 0,e.SYMBOL_ICON_ARRAY_FOREGROUND=(0,k.registerColor)("symbolIcon.arrayForeground",k.foreground,(0,d.localize)(1348,"The foreground color for array symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_BOOLEAN_FOREGROUND=(0,k.registerColor)("symbolIcon.booleanForeground",k.foreground,(0,d.localize)(1349,"The foreground color for boolean symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_CLASS_FOREGROUND=(0,k.registerColor)("symbolIcon.classForeground",{dark:"#EE9D28",light:"#D67E00",hcDark:"#EE9D28",hcLight:"#D67E00"},(0,d.localize)(1350,"The foreground color for class symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_COLOR_FOREGROUND=(0,k.registerColor)("symbolIcon.colorForeground",k.foreground,(0,d.localize)(1351,"The foreground color for color symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_CONSTANT_FOREGROUND=(0,k.registerColor)("symbolIcon.constantForeground",k.foreground,(0,d.localize)(1352,"The foreground color for constant symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_CONSTRUCTOR_FOREGROUND=(0,k.registerColor)("symbolIcon.constructorForeground",{dark:"#B180D7",light:"#652D90",hcDark:"#B180D7",hcLight:"#652D90"},(0,d.localize)(1353,"The foreground color for constructor symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_ENUMERATOR_FOREGROUND=(0,k.registerColor)("symbolIcon.enumeratorForeground",{dark:"#EE9D28",light:"#D67E00",hcDark:"#EE9D28",hcLight:"#D67E00"},(0,d.localize)(1354,"The foreground color for enumerator symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_ENUMERATOR_MEMBER_FOREGROUND=(0,k.registerColor)("symbolIcon.enumeratorMemberForeground",{dark:"#75BEFF",light:"#007ACC",hcDark:"#75BEFF",hcLight:"#007ACC"},(0,d.localize)(1355,"The foreground color for enumerator member symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_EVENT_FOREGROUND=(0,k.registerColor)("symbolIcon.eventForeground",{dark:"#EE9D28",light:"#D67E00",hcDark:"#EE9D28",hcLight:"#D67E00"},(0,d.localize)(1356,"The foreground color for event symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_FIELD_FOREGROUND=(0,k.registerColor)("symbolIcon.fieldForeground",{dark:"#75BEFF",light:"#007ACC",hcDark:"#75BEFF",hcLight:"#007ACC"},(0,d.localize)(1357,"The foreground color for field symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_FILE_FOREGROUND=(0,k.registerColor)("symbolIcon.fileForeground",k.foreground,(0,d.localize)(1358,"The foreground color for file symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_FOLDER_FOREGROUND=(0,k.registerColor)("symbolIcon.folderForeground",k.foreground,(0,d.localize)(1359,"The foreground color for folder symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_FUNCTION_FOREGROUND=(0,k.registerColor)("symbolIcon.functionForeground",{dark:"#B180D7",light:"#652D90",hcDark:"#B180D7",hcLight:"#652D90"},(0,d.localize)(1360,"The foreground color for function symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_INTERFACE_FOREGROUND=(0,k.registerColor)("symbolIcon.interfaceForeground",{dark:"#75BEFF",light:"#007ACC",hcDark:"#75BEFF",hcLight:"#007ACC"},(0,d.localize)(1361,"The foreground color for interface symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_KEY_FOREGROUND=(0,k.registerColor)("symbolIcon.keyForeground",k.foreground,(0,d.localize)(1362,"The foreground color for key symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_KEYWORD_FOREGROUND=(0,k.registerColor)("symbolIcon.keywordForeground",k.foreground,(0,d.localize)(1363,"The foreground color for keyword symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_METHOD_FOREGROUND=(0,k.registerColor)("symbolIcon.methodForeground",{dark:"#B180D7",light:"#652D90",hcDark:"#B180D7",hcLight:"#652D90"},(0,d.localize)(1364,"The foreground color for method symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_MODULE_FOREGROUND=(0,k.registerColor)("symbolIcon.moduleForeground",k.foreground,(0,d.localize)(1365,"The foreground color for module symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_NAMESPACE_FOREGROUND=(0,k.registerColor)("symbolIcon.namespaceForeground",k.foreground,(0,d.localize)(1366,"The foreground color for namespace symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_NULL_FOREGROUND=(0,k.registerColor)("symbolIcon.nullForeground",k.foreground,(0,d.localize)(1367,"The foreground color for null symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_NUMBER_FOREGROUND=(0,k.registerColor)("symbolIcon.numberForeground",k.foreground,(0,d.localize)(1368,"The foreground color for number symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_OBJECT_FOREGROUND=(0,k.registerColor)("symbolIcon.objectForeground",k.foreground,(0,d.localize)(1369,"The foreground color for object symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_OPERATOR_FOREGROUND=(0,k.registerColor)("symbolIcon.operatorForeground",k.foreground,(0,d.localize)(1370,"The foreground color for operator symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_PACKAGE_FOREGROUND=(0,k.registerColor)("symbolIcon.packageForeground",k.foreground,(0,d.localize)(1371,"The foreground color for package symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_PROPERTY_FOREGROUND=(0,k.registerColor)("symbolIcon.propertyForeground",k.foreground,(0,d.localize)(1372,"The foreground color for property symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_REFERENCE_FOREGROUND=(0,k.registerColor)("symbolIcon.referenceForeground",k.foreground,(0,d.localize)(1373,"The foreground color for reference symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_SNIPPET_FOREGROUND=(0,k.registerColor)("symbolIcon.snippetForeground",k.foreground,(0,d.localize)(1374,"The foreground color for snippet symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_STRING_FOREGROUND=(0,k.registerColor)("symbolIcon.stringForeground",k.foreground,(0,d.localize)(1375,"The foreground color for string symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_STRUCT_FOREGROUND=(0,k.registerColor)("symbolIcon.structForeground",k.foreground,(0,d.localize)(1376,"The foreground color for struct symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_TEXT_FOREGROUND=(0,k.registerColor)("symbolIcon.textForeground",k.foreground,(0,d.localize)(1377,"The foreground color for text symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_TYPEPARAMETER_FOREGROUND=(0,k.registerColor)("symbolIcon.typeParameterForeground",k.foreground,(0,d.localize)(1378,"The foreground color for type parameter symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_UNIT_FOREGROUND=(0,k.registerColor)("symbolIcon.unitForeground",k.foreground,(0,d.localize)(1379,"The foreground color for unit symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")),e.SYMBOL_ICON_VARIABLE_FOREGROUND=(0,k.registerColor)("symbolIcon.variableForeground",{dark:"#75BEFF",light:"#007ACC",hcDark:"#75BEFF",hcLight:"#007ACC"},(0,d.localize)(1380,"The foreground color for variable symbols. These symbols appear in the outline, breadcrumb, and suggest widget."))}),define(ne[757],se([1,0,26,134,3,91,195,280]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toMenuItems=_;const y=Object.freeze({kind:E.HierarchicalKind.Empty,title:(0,I.localize)(777,"More Actions...")}),m=Object.freeze([{kind:k.CodeActionKind.QuickFix,title:(0,I.localize)(778,"Quick Fix")},{kind:k.CodeActionKind.RefactorExtract,title:(0,I.localize)(779,"Extract"),icon:d.Codicon.wrench},{kind:k.CodeActionKind.RefactorInline,title:(0,I.localize)(780,"Inline"),icon:d.Codicon.wrench},{kind:k.CodeActionKind.RefactorRewrite,title:(0,I.localize)(781,"Rewrite"),icon:d.Codicon.wrench},{kind:k.CodeActionKind.RefactorMove,title:(0,I.localize)(782,"Move"),icon:d.Codicon.wrench},{kind:k.CodeActionKind.SurroundWith,title:(0,I.localize)(783,"Surround With"),icon:d.Codicon.surroundWith},{kind:k.CodeActionKind.Source,title:(0,I.localize)(784,"Source Action"),icon:d.Codicon.symbolFile},y]);function _(b,p,n){if(!p)return b.map(i=>({kind:"action",item:i,group:y,disabled:!!i.action.disabled,label:i.action.disabled||i.action.title,canPreview:!!i.action.edit?.edits.length}));const o=m.map(i=>({group:i,actions:[]}));for(const i of b){const s=i.action.kind?new E.HierarchicalKind(i.action.kind):E.HierarchicalKind.None;for(const g of o)if(g.group.kind.contains(s)){g.actions.push(i);break}}const t=[];for(const i of o)if(i.actions.length){t.push({kind:"header",group:i.group});for(const s of i.actions){const g=i.group;t.push({kind:"action",item:s,group:s.action.isAI?{title:g.title,kind:g.kind,icon:d.Codicon.sparkle}:g,label:s.action.title,disabled:!!s.action.disabled,keybinding:n(s.action)})}}return t}}),define(ne[110],se([1,0,32,33]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.defaultMenuStyles=e.defaultSelectBoxStyles=e.defaultListStyles=e.defaultBreadcrumbsWidgetStyles=e.defaultCountBadgeStyles=e.defaultFindWidgetStyles=e.defaultInputBoxStyles=e.defaultDialogStyles=e.defaultCheckboxStyles=e.defaultRadioStyles=e.defaultToggleStyles=e.defaultProgressBarStyles=e.defaultButtonStyles=e.defaultKeybindingLabelStyles=void 0,e.getListStyles=E;function I(y,m){const _={...m};for(const b in y){const p=y[b];_[b]=p!==void 0?(0,d.asCssVariable)(p):void 0}return _}e.defaultKeybindingLabelStyles={keybindingLabelBackground:(0,d.asCssVariable)(d.keybindingLabelBackground),keybindingLabelForeground:(0,d.asCssVariable)(d.keybindingLabelForeground),keybindingLabelBorder:(0,d.asCssVariable)(d.keybindingLabelBorder),keybindingLabelBottomBorder:(0,d.asCssVariable)(d.keybindingLabelBottomBorder),keybindingLabelShadow:(0,d.asCssVariable)(d.widgetShadow)},e.defaultButtonStyles={buttonForeground:(0,d.asCssVariable)(d.buttonForeground),buttonSeparator:(0,d.asCssVariable)(d.buttonSeparator),buttonBackground:(0,d.asCssVariable)(d.buttonBackground),buttonHoverBackground:(0,d.asCssVariable)(d.buttonHoverBackground),buttonSecondaryForeground:(0,d.asCssVariable)(d.buttonSecondaryForeground),buttonSecondaryBackground:(0,d.asCssVariable)(d.buttonSecondaryBackground),buttonSecondaryHoverBackground:(0,d.asCssVariable)(d.buttonSecondaryHoverBackground),buttonBorder:(0,d.asCssVariable)(d.buttonBorder)},e.defaultProgressBarStyles={progressBarBackground:(0,d.asCssVariable)(d.progressBarBackground)},e.defaultToggleStyles={inputActiveOptionBorder:(0,d.asCssVariable)(d.inputActiveOptionBorder),inputActiveOptionForeground:(0,d.asCssVariable)(d.inputActiveOptionForeground),inputActiveOptionBackground:(0,d.asCssVariable)(d.inputActiveOptionBackground)},e.defaultRadioStyles={activeForeground:(0,d.asCssVariable)(d.radioActiveForeground),activeBackground:(0,d.asCssVariable)(d.radioActiveBackground),activeBorder:(0,d.asCssVariable)(d.radioActiveBorder),inactiveForeground:(0,d.asCssVariable)(d.radioInactiveForeground),inactiveBackground:(0,d.asCssVariable)(d.radioInactiveBackground),inactiveBorder:(0,d.asCssVariable)(d.radioInactiveBorder),inactiveHoverBackground:(0,d.asCssVariable)(d.radioInactiveHoverBackground)},e.defaultCheckboxStyles={checkboxBackground:(0,d.asCssVariable)(d.checkboxBackground),checkboxBorder:(0,d.asCssVariable)(d.checkboxBorder),checkboxForeground:(0,d.asCssVariable)(d.checkboxForeground)},e.defaultDialogStyles={dialogBackground:(0,d.asCssVariable)(d.editorWidgetBackground),dialogForeground:(0,d.asCssVariable)(d.editorWidgetForeground),dialogShadow:(0,d.asCssVariable)(d.widgetShadow),dialogBorder:(0,d.asCssVariable)(d.contrastBorder),errorIconForeground:(0,d.asCssVariable)(d.problemsErrorIconForeground),warningIconForeground:(0,d.asCssVariable)(d.problemsWarningIconForeground),infoIconForeground:(0,d.asCssVariable)(d.problemsInfoIconForeground),textLinkForeground:(0,d.asCssVariable)(d.textLinkForeground)},e.defaultInputBoxStyles={inputBackground:(0,d.asCssVariable)(d.inputBackground),inputForeground:(0,d.asCssVariable)(d.inputForeground),inputBorder:(0,d.asCssVariable)(d.inputBorder),inputValidationInfoBorder:(0,d.asCssVariable)(d.inputValidationInfoBorder),inputValidationInfoBackground:(0,d.asCssVariable)(d.inputValidationInfoBackground),inputValidationInfoForeground:(0,d.asCssVariable)(d.inputValidationInfoForeground),inputValidationWarningBorder:(0,d.asCssVariable)(d.inputValidationWarningBorder),inputValidationWarningBackground:(0,d.asCssVariable)(d.inputValidationWarningBackground),inputValidationWarningForeground:(0,d.asCssVariable)(d.inputValidationWarningForeground),inputValidationErrorBorder:(0,d.asCssVariable)(d.inputValidationErrorBorder),inputValidationErrorBackground:(0,d.asCssVariable)(d.inputValidationErrorBackground),inputValidationErrorForeground:(0,d.asCssVariable)(d.inputValidationErrorForeground)},e.defaultFindWidgetStyles={listFilterWidgetBackground:(0,d.asCssVariable)(d.listFilterWidgetBackground),listFilterWidgetOutline:(0,d.asCssVariable)(d.listFilterWidgetOutline),listFilterWidgetNoMatchesOutline:(0,d.asCssVariable)(d.listFilterWidgetNoMatchesOutline),listFilterWidgetShadow:(0,d.asCssVariable)(d.listFilterWidgetShadow),inputBoxStyles:e.defaultInputBoxStyles,toggleStyles:e.defaultToggleStyles},e.defaultCountBadgeStyles={badgeBackground:(0,d.asCssVariable)(d.badgeBackground),badgeForeground:(0,d.asCssVariable)(d.badgeForeground),badgeBorder:(0,d.asCssVariable)(d.contrastBorder)},e.defaultBreadcrumbsWidgetStyles={breadcrumbsBackground:(0,d.asCssVariable)(d.breadcrumbsBackground),breadcrumbsForeground:(0,d.asCssVariable)(d.breadcrumbsForeground),breadcrumbsHoverForeground:(0,d.asCssVariable)(d.breadcrumbsFocusForeground),breadcrumbsFocusForeground:(0,d.asCssVariable)(d.breadcrumbsFocusForeground),breadcrumbsFocusAndSelectionForeground:(0,d.asCssVariable)(d.breadcrumbsActiveSelectionForeground)},e.defaultListStyles={listBackground:void 0,listInactiveFocusForeground:void 0,listFocusBackground:(0,d.asCssVariable)(d.listFocusBackground),listFocusForeground:(0,d.asCssVariable)(d.listFocusForeground),listFocusOutline:(0,d.asCssVariable)(d.listFocusOutline),listActiveSelectionBackground:(0,d.asCssVariable)(d.listActiveSelectionBackground),listActiveSelectionForeground:(0,d.asCssVariable)(d.listActiveSelectionForeground),listActiveSelectionIconForeground:(0,d.asCssVariable)(d.listActiveSelectionIconForeground),listFocusAndSelectionOutline:(0,d.asCssVariable)(d.listFocusAndSelectionOutline),listFocusAndSelectionBackground:(0,d.asCssVariable)(d.listActiveSelectionBackground),listFocusAndSelectionForeground:(0,d.asCssVariable)(d.listActiveSelectionForeground),listInactiveSelectionBackground:(0,d.asCssVariable)(d.listInactiveSelectionBackground),listInactiveSelectionIconForeground:(0,d.asCssVariable)(d.listInactiveSelectionIconForeground),listInactiveSelectionForeground:(0,d.asCssVariable)(d.listInactiveSelectionForeground),listInactiveFocusBackground:(0,d.asCssVariable)(d.listInactiveFocusBackground),listInactiveFocusOutline:(0,d.asCssVariable)(d.listInactiveFocusOutline),listHoverBackground:(0,d.asCssVariable)(d.listHoverBackground),listHoverForeground:(0,d.asCssVariable)(d.listHoverForeground),listDropOverBackground:(0,d.asCssVariable)(d.listDropOverBackground),listDropBetweenBackground:(0,d.asCssVariable)(d.listDropBetweenBackground),listSelectionOutline:(0,d.asCssVariable)(d.activeContrastBorder),listHoverOutline:(0,d.asCssVariable)(d.activeContrastBorder),treeIndentGuidesStroke:(0,d.asCssVariable)(d.treeIndentGuidesStroke),treeInactiveIndentGuidesStroke:(0,d.asCssVariable)(d.treeInactiveIndentGuidesStroke),treeStickyScrollBackground:void 0,treeStickyScrollBorder:void 0,treeStickyScrollShadow:(0,d.asCssVariable)(d.scrollbarShadow),tableColumnsBorder:(0,d.asCssVariable)(d.tableColumnsBorder),tableOddRowsBackgroundColor:(0,d.asCssVariable)(d.tableOddRowsBackgroundColor)};function E(y){return I(y,e.defaultListStyles)}e.defaultSelectBoxStyles={selectBackground:(0,d.asCssVariable)(d.selectBackground),selectListBackground:(0,d.asCssVariable)(d.selectListBackground),selectForeground:(0,d.asCssVariable)(d.selectForeground),decoratorRightForeground:(0,d.asCssVariable)(d.pickerGroupForeground),selectBorder:(0,d.asCssVariable)(d.selectBorder),focusBorder:(0,d.asCssVariable)(d.focusBorder),listFocusBackground:(0,d.asCssVariable)(d.quickInputListFocusBackground),listInactiveSelectionIconForeground:(0,d.asCssVariable)(d.quickInputListFocusIconForeground),listFocusForeground:(0,d.asCssVariable)(d.quickInputListFocusForeground),listFocusOutline:(0,d.asCssVariableWithDefault)(d.activeContrastBorder,k.Color.transparent.toString()),listHoverBackground:(0,d.asCssVariable)(d.listHoverBackground),listHoverForeground:(0,d.asCssVariable)(d.listHoverForeground),listHoverOutline:(0,d.asCssVariable)(d.activeContrastBorder),selectListBorder:(0,d.asCssVariable)(d.editorWidgetBorder),listBackground:void 0,listActiveSelectionBackground:void 0,listActiveSelectionForeground:void 0,listActiveSelectionIconForeground:void 0,listFocusAndSelectionBackground:void 0,listDropOverBackground:void 0,listDropBetweenBackground:void 0,listInactiveSelectionBackground:void 0,listInactiveSelectionForeground:void 0,listInactiveFocusBackground:void 0,listInactiveFocusOutline:void 0,listSelectionOutline:void 0,listFocusAndSelectionForeground:void 0,listFocusAndSelectionOutline:void 0,listInactiveFocusForeground:void 0,tableColumnsBorder:void 0,tableOddRowsBackgroundColor:void 0,treeIndentGuidesStroke:void 0,treeInactiveIndentGuidesStroke:void 0,treeStickyScrollBackground:void 0,treeStickyScrollBorder:void 0,treeStickyScrollShadow:void 0},e.defaultMenuStyles={shadowColor:(0,d.asCssVariable)(d.widgetShadow),borderColor:(0,d.asCssVariable)(d.menuBorder),foregroundColor:(0,d.asCssVariable)(d.menuForeground),backgroundColor:(0,d.asCssVariable)(d.menuBackground),selectionForegroundColor:(0,d.asCssVariable)(d.menuSelectionForeground),selectionBackgroundColor:(0,d.asCssVariable)(d.menuSelectionBackground),selectionBorderColor:(0,d.asCssVariable)(d.menuSelectionBorder),separatorColor:(0,d.asCssVariable)(d.menuSeparatorBackground),scrollbarShadow:(0,d.asCssVariable)(d.scrollbarShadow),scrollbarSliderBackground:(0,d.asCssVariable)(d.scrollbarSliderBackground),scrollbarSliderHoverBackground:(0,d.asCssVariable)(d.scrollbarSliderHoverBackground),scrollbarSliderActiveBackground:(0,d.asCssVariable)(d.scrollbarSliderActiveBackground)}}),define(ne[758],se([1,0,5,354,355,254,82,2,48,78,3,7,31,181,110,178]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s){"use strict";var g;Object.defineProperty(e,"__esModule",{value:!0}),e.AccessibilityProvider=e.OneReferenceRenderer=e.FileReferencesRenderer=e.IdentityProvider=e.StringRepresentationProvider=e.Delegate=e.DataSource=void 0;let c=class{constructor(S){this._resolverService=S}hasChildren(S){return S instanceof s.ReferencesModel||S instanceof s.FileReferences}getChildren(S){if(S instanceof s.ReferencesModel)return S.groups;if(S instanceof s.FileReferences)return S.resolve(this._resolverService).then(L=>L.children);throw new Error("bad tree")}};e.DataSource=c,e.DataSource=c=ke([ce(0,b.ITextModelService)],c);class l{getHeight(){return 23}getTemplateId(S){return S instanceof s.FileReferences?C.id:h.id}}e.Delegate=l;let a=class{constructor(S){this._keybindingService=S}getKeyboardNavigationLabel(S){if(S instanceof s.OneReference){const L=S.parent.getPreview(S)?.preview(S.range);if(L)return L.value}return(0,_.basename)(S.uri)}};e.StringRepresentationProvider=a,e.StringRepresentationProvider=a=ke([ce(0,o.IKeybindingService)],a);class r{getId(S){return S instanceof s.OneReference?S.id:S.uri}}e.IdentityProvider=r;let u=class extends m.Disposable{constructor(S,L){super(),this._labelService=L;const D=document.createElement("div");D.classList.add("reference-file"),this.file=this._register(new E.IconLabel(D,{supportHighlights:!0})),this.badge=new k.CountBadge(d.append(D,d.$(".count")),{},i.defaultCountBadgeStyles),S.appendChild(D)}set(S,L){const D=(0,_.dirname)(S.uri);this.file.setLabel(this._labelService.getUriBasenameLabel(S.uri),this._labelService.getUriLabel(D,{relative:!0}),{title:this._labelService.getUriLabel(S.uri),matches:L});const T=S.children.length;this.badge.setCount(T),T>1?this.badge.setTitleFormat((0,p.localize)(989,"{0} references",T)):this.badge.setTitleFormat((0,p.localize)(990,"{0} reference",T))}};u=ke([ce(1,t.ILabelService)],u);let C=class{static{g=this}static{this.id="FileReferencesRenderer"}constructor(S){this._instantiationService=S,this.templateId=g.id}renderTemplate(S){return this._instantiationService.createInstance(u,S)}renderElement(S,L,D){D.set(S.element,(0,y.createMatches)(S.filterData))}disposeTemplate(S){S.dispose()}};e.FileReferencesRenderer=C,e.FileReferencesRenderer=C=g=ke([ce(0,n.IInstantiationService)],C);class f extends m.Disposable{constructor(S){super(),this.label=this._register(new I.HighlightedLabel(S))}set(S,L){const D=S.parent.getPreview(S)?.preview(S.range);if(!D||!D.value)this.label.set(`${(0,_.basename)(S.uri)}:${S.range.startLineNumber+1}:${S.range.startColumn+1}`);else{const{value:T,highlight:M}=D;L&&!y.FuzzyScore.isDefault(L)?(this.label.element.classList.toggle("referenceMatch",!1),this.label.set(T,(0,y.createMatches)(L))):(this.label.element.classList.toggle("referenceMatch",!0),this.label.set(T,[M]))}}}class h{constructor(){this.templateId=h.id}static{this.id="OneReferenceRenderer"}renderTemplate(S){return new f(S)}renderElement(S,L,D){D.set(S.element,S.filterData)}disposeTemplate(S){S.dispose()}}e.OneReferenceRenderer=h;class v{getWidgetAriaLabel(){return(0,p.localize)(991,"References")}getAriaLabel(S){return S.ariaMessage}}e.AccessibilityProvider=v}),define(ne[759],se([1,0,5,206,115,18,26,2,16,30,3,58,31,110,32,306]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ActionList=e.previewSelectedActionCommand=e.acceptSelectedActionCommand=void 0,e.acceptSelectedActionCommand="acceptSelectedCodeAction",e.previewSelectedActionCommand="previewSelectedCodeAction";class s{get templateId(){return"header"}renderTemplate(f){f.classList.add("group-header");const h=document.createElement("span");return f.append(h),{container:f,text:h}}renderElement(f,h,v){v.text.textContent=f.group?.title??""}disposeTemplate(f){}}let g=class{get templateId(){return"action"}constructor(f,h){this._supportsPreview=f,this._keybindingService=h}renderTemplate(f){f.classList.add(this.templateId);const h=document.createElement("div");h.className="icon",f.append(h);const v=document.createElement("span");v.className="title",f.append(v);const w=new k.KeybindingLabel(f,_.OS);return{container:f,icon:h,text:v,keybinding:w}}renderElement(f,h,v){if(f.group?.icon?(v.icon.className=b.ThemeIcon.asClassName(f.group.icon),f.group.icon.color&&(v.icon.style.color=(0,i.asCssVariable)(f.group.icon.color.id))):(v.icon.className=b.ThemeIcon.asClassName(y.Codicon.lightBulb),v.icon.style.color="var(--vscode-editorLightBulb-foreground)"),!f.item||!f.label)return;v.text.textContent=u(f.label),v.keybinding.set(f.keybinding),d.setVisibility(!!f.keybinding,v.keybinding.element);const w=this._keybindingService.lookupKeybinding(e.acceptSelectedActionCommand)?.getLabel(),S=this._keybindingService.lookupKeybinding(e.previewSelectedActionCommand)?.getLabel();v.container.classList.toggle("option-disabled",f.disabled),f.disabled?v.container.title=f.label:w&&S?this._supportsPreview&&f.canPreview?v.container.title=(0,p.localize)(1492,"{0} to Apply, {1} to Preview",w,S):v.container.title=(0,p.localize)(1493,"{0} to Apply",w):v.container.title=""}disposeTemplate(f){f.keybinding.dispose()}};g=ke([ce(1,o.IKeybindingService)],g);class c extends UIEvent{constructor(){super("acceptSelectedAction")}}class l extends UIEvent{constructor(){super("previewSelectedAction")}}function a(C){if(C.kind==="action")return C.label}let r=class extends m.Disposable{constructor(f,h,v,w,S,L){super(),this._delegate=w,this._contextViewService=S,this._keybindingService=L,this._actionLineHeight=24,this._headerLineHeight=26,this.cts=this._register(new E.CancellationTokenSource),this.domNode=document.createElement("div"),this.domNode.classList.add("actionList");const D={getHeight:T=>T.kind==="header"?this._headerLineHeight:this._actionLineHeight,getTemplateId:T=>T.kind};this._list=this._register(new I.List(f,this.domNode,D,[new g(h,this._keybindingService),new s],{keyboardSupport:!1,typeNavigationEnabled:!0,keyboardNavigationLabelProvider:{getKeyboardNavigationLabel:a},accessibilityProvider:{getAriaLabel:T=>{if(T.kind==="action"){let M=T.label?u(T?.label):"";return T.disabled&&(M=(0,p.localize)(1494,"{0}, Disabled Reason: {1}",M,T.disabled)),M}return null},getWidgetAriaLabel:()=>(0,p.localize)(1495,"Action Widget"),getRole:T=>T.kind==="action"?"option":"separator",getWidgetRole:()=>"listbox"}})),this._list.style(t.defaultListStyles),this._register(this._list.onMouseClick(T=>this.onListClick(T))),this._register(this._list.onMouseOver(T=>this.onListHover(T))),this._register(this._list.onDidChangeFocus(()=>this.onFocus())),this._register(this._list.onDidChangeSelection(T=>this.onListSelection(T))),this._allMenuItems=v,this._list.splice(0,this._list.length,this._allMenuItems),this._list.length&&this.focusNext()}focusCondition(f){return!f.disabled&&f.kind==="action"}hide(f){this._delegate.onHide(f),this.cts.cancel(),this._contextViewService.hideContextView()}layout(f){const h=this._allMenuItems.filter(T=>T.kind==="header").length,w=this._allMenuItems.length*this._actionLineHeight+h*this._headerLineHeight-h*this._actionLineHeight;this._list.layout(w);let S=f;if(this._allMenuItems.length>=50)S=380;else{const T=this._allMenuItems.map((M,A)=>{const P=this.domNode.ownerDocument.getElementById(this._list.getElementID(A));if(P){P.style.width="auto";const N=P.getBoundingClientRect().width;return P.style.width="",N}return 0});S=Math.max(...T,f)}const D=Math.min(w,this.domNode.ownerDocument.body.clientHeight*.7);return this._list.layout(D,S),this.domNode.style.height=`${D}px`,this._list.domFocus(),S}focusPrevious(){this._list.focusPrevious(1,!0,void 0,this.focusCondition)}focusNext(){this._list.focusNext(1,!0,void 0,this.focusCondition)}acceptSelected(f){const h=this._list.getFocus();if(h.length===0)return;const v=h[0],w=this._list.element(v);if(!this.focusCondition(w))return;const S=f?new l:new c;this._list.setSelection([v],S)}onListSelection(f){if(!f.elements.length)return;const h=f.elements[0];h.item&&this.focusCondition(h)?this._delegate.onSelect(h.item,f.browserEvent instanceof l):this._list.setSelection([])}onFocus(){const f=this._list.getFocus();if(f.length===0)return;const h=f[0],v=this._list.element(h);this._delegate.onFocus?.(v.item)}async onListHover(f){const h=f.element;if(h&&h.item&&this.focusCondition(h)){if(this._delegate.onHover&&!h.disabled&&h.kind==="action"){const v=await this._delegate.onHover(h.item,this.cts.token);h.canPreview=v?v.canPreview:void 0}f.index&&this._list.splice(f.index,1,[h])}this._list.setFocus(typeof f.index=="number"?[f.index]:[])}onListClick(f){f.element&&this.focusCondition(f.element)&&this._list.setFocus([])}};e.ActionList=r,e.ActionList=r=ke([ce(4,n.IContextViewService),ce(5,o.IKeybindingService)],r);function u(C){return C.replace(/\r\n|\r|\n/g," ")}}),define(ne[760],se([1,0,5,87,2,3,759,29,12,58,49,7,32,306]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IActionWidgetService=void 0,(0,o.registerColor)("actionBar.toggledBackground",o.inputActiveOptionBackground,(0,E.localize)(1496,"Background color for toggled action items in action bar."));const t={Visible:new _.RawContextKey("codeActionMenuVisible",!1,(0,E.localize)(1497,"Whether the action widget list is visible"))};e.IActionWidgetService=(0,n.createDecorator)("actionWidgetService");let i=class extends I.Disposable{get isVisible(){return t.Visible.getValue(this._contextKeyService)||!1}constructor(c,l,a){super(),this._contextViewService=c,this._contextKeyService=l,this._instantiationService=a,this._list=this._register(new I.MutableDisposable)}show(c,l,a,r,u,C,f){const h=t.Visible.bindTo(this._contextKeyService),v=this._instantiationService.createInstance(y.ActionList,c,l,a,r);this._contextViewService.showContextView({getAnchor:()=>u,render:w=>(h.set(!0),this._renderWidget(w,v,f??[])),onHide:w=>{h.reset(),this._onWidgetClosed(w)}},C,!1)}acceptSelected(c){this._list.value?.acceptSelected(c)}focusPrevious(){this._list?.value?.focusPrevious()}focusNext(){this._list?.value?.focusNext()}hide(c){this._list.value?.hide(c),this._list.clear()}_renderWidget(c,l,a){const r=document.createElement("div");if(r.classList.add("action-widget"),c.appendChild(r),this._list.value=l,this._list.value)r.appendChild(this._list.value.domNode);else throw new Error("List has no value");const u=new I.DisposableStore,C=document.createElement("div"),f=c.appendChild(C);f.classList.add("context-view-block"),u.add(d.addDisposableListener(f,d.EventType.MOUSE_DOWN,D=>D.stopPropagation()));const h=document.createElement("div"),v=c.appendChild(h);v.classList.add("context-view-pointerBlock"),u.add(d.addDisposableListener(v,d.EventType.POINTER_MOVE,()=>v.remove())),u.add(d.addDisposableListener(v,d.EventType.MOUSE_DOWN,()=>v.remove()));let w=0;if(a.length){const D=this._createActionBar(".action-widget-action-bar",a);D&&(r.appendChild(D.getContainer().parentElement),u.add(D),w=D.getContainer().offsetWidth)}const S=this._list.value?.layout(w);r.style.width=`${S}px`;const L=u.add(d.trackFocus(c));return u.add(L.onDidBlur(()=>this.hide(!0))),u}_createActionBar(c,l){if(!l.length)return;const a=d.$(c),r=new k.ActionBar(a);return r.push(l,{icon:!1,label:!0}),r}_onWidgetClosed(c){this._list.value?.hide(c)}};i=ke([ce(0,b.IContextViewService),ce(1,_.IContextKeyService),ce(2,n.IInstantiationService)],i),(0,p.registerSingleton)(e.IActionWidgetService,i,1);const s=1100;(0,m.registerAction2)(class extends m.Action2{constructor(){super({id:"hideCodeActionWidget",title:(0,E.localize2)(1498,"Hide action widget"),precondition:t.Visible,keybinding:{weight:s,primary:9,secondary:[1033]}})}run(g){g.get(e.IActionWidgetService).hide(!0)}}),(0,m.registerAction2)(class extends m.Action2{constructor(){super({id:"selectPrevCodeAction",title:(0,E.localize2)(1499,"Select previous action"),precondition:t.Visible,keybinding:{weight:s,primary:16,secondary:[2064],mac:{primary:16,secondary:[2064,302]}}})}run(g){const c=g.get(e.IActionWidgetService);c instanceof i&&c.focusPrevious()}}),(0,m.registerAction2)(class extends m.Action2{constructor(){super({id:"selectNextCodeAction",title:(0,E.localize2)(1500,"Select next action"),precondition:t.Visible,keybinding:{weight:s,primary:18,secondary:[2066],mac:{primary:18,secondary:[2066,300]}}})}run(g){const c=g.get(e.IActionWidgetService);c instanceof i&&c.focusNext()}}),(0,m.registerAction2)(class extends m.Action2{constructor(){super({id:y.acceptSelectedActionCommand,title:(0,E.localize2)(1501,"Accept selected action"),precondition:t.Visible,keybinding:{weight:s,primary:3,secondary:[2137]}})}run(g){const c=g.get(e.IActionWidgetService);c instanceof i&&c.acceptSelected()}}),(0,m.registerAction2)(class extends m.Action2{constructor(){super({id:y.previewSelectedActionCommand,title:(0,E.localize2)(1502,"Preview selected action"),precondition:t.Visible,keybinding:{weight:s,primary:2051}})}run(g){const c=g.get(e.IActionWidgetService);c instanceof i&&c.acceptSelected(!0)}})}),define(ne[761],se([1,0,5,77,642,41,8,2,110]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextMenuHandler=void 0;class b{constructor(n,o,t,i){this.contextViewService=n,this.telemetryService=o,this.notificationService=t,this.keybindingService=i,this.focusToReturn=null,this.lastContainer=null,this.block=null,this.blockDisposable=null,this.options={blockMouse:!0}}configure(n){this.options=n}showContextMenu(n){const o=n.getActions();if(!o.length)return;this.focusToReturn=(0,d.getActiveElement)();let t;const i=(0,d.isHTMLElement)(n.domForShadowRoot)?n.domForShadowRoot:void 0;this.contextViewService.showContextView({getAnchor:()=>n.getAnchor(),canRelayout:!1,anchorAlignment:n.anchorAlignment,anchorAxisAlignment:n.anchorAxisAlignment,render:s=>{this.lastContainer=s;const g=n.getMenuClassName?n.getMenuClassName():"";g&&(s.className+=" "+g),this.options.blockMouse&&(this.block=s.appendChild((0,d.$)(".context-view-block")),this.block.style.position="fixed",this.block.style.cursor="initial",this.block.style.left="0",this.block.style.top="0",this.block.style.width="100%",this.block.style.height="100%",this.block.style.zIndex="-1",this.blockDisposable?.dispose(),this.blockDisposable=(0,d.addDisposableListener)(this.block,d.EventType.MOUSE_DOWN,r=>r.stopPropagation()));const c=new m.DisposableStore,l=n.actionRunner||new E.ActionRunner;l.onWillRun(r=>this.onActionRun(r,!n.skipTelemetry),this,c),l.onDidRun(this.onDidActionRun,this,c),t=new I.Menu(s,o,{actionViewItemProvider:n.getActionViewItem,context:n.getActionsContext?n.getActionsContext():null,actionRunner:l,getKeyBinding:n.getKeyBinding?n.getKeyBinding:r=>this.keybindingService.lookupKeybinding(r.id)},_.defaultMenuStyles),t.onDidCancel(()=>this.contextViewService.hideContextView(!0),null,c),t.onDidBlur(()=>this.contextViewService.hideContextView(!0),null,c);const a=(0,d.getWindow)(s);return c.add((0,d.addDisposableListener)(a,d.EventType.BLUR,()=>this.contextViewService.hideContextView(!0))),c.add((0,d.addDisposableListener)(a,d.EventType.MOUSE_DOWN,r=>{if(r.defaultPrevented)return;const u=new k.StandardMouseEvent(a,r);let C=u.target;if(!u.rightButton){for(;C;){if(C===s)return;C=C.parentElement}this.contextViewService.hideContextView(!0)}})),(0,m.combinedDisposable)(c,t)},focus:()=>{t?.focus(!!n.autoSelectFirstItem)},onHide:s=>{n.onHide?.(!!s),this.block&&(this.block.remove(),this.block=null),this.blockDisposable?.dispose(),this.blockDisposable=null,this.lastContainer&&((0,d.getActiveElement)()===this.lastContainer||(0,d.isAncestor)((0,d.getActiveElement)(),this.lastContainer))&&this.focusToReturn?.focus(),this.lastContainer=null}},i,!!i)}onActionRun(n,o){o&&this.telemetryService.publicLog2("workbenchActionExecuted",{id:n.action.id,from:"contextMenu"}),this.contextViewService.hideContextView(!1)}onDidActionRun(n){n.error&&!(0,y.isCancellationError)(n.error)&&this.notificationService.error(n.error)}}e.ContextMenuHandler=b}),define(ne[216],se([1,0,5,637,115,638,176,645,644,360,6,2,3,28,109,12,179,58,7,31,38,110]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WorkbenchCompressibleAsyncDataTree=e.WorkbenchAsyncDataTree=e.WorkbenchDataTree=e.WorkbenchCompressibleObjectTree=e.WorkbenchObjectTree=e.WorkbenchTable=e.WorkbenchPagedList=e.WorkbenchList=e.WorkbenchTreeFindOpen=e.WorkbenchTreeElementHasChild=e.WorkbenchTreeElementCanExpand=e.WorkbenchTreeElementHasParent=e.WorkbenchTreeElementCanCollapse=e.WorkbenchListSupportsFind=e.WorkbenchListSelectionNavigation=e.WorkbenchListMultiSelection=e.WorkbenchListDoubleSelection=e.WorkbenchListHasSelectionOrFocus=e.WorkbenchListFocusContextKey=e.WorkbenchListSupportsMultiSelectContextKey=e.WorkbenchTreeStickyScrollFocused=e.RawWorkbenchListFocusContextKey=e.WorkbenchListScrollAtBottomContextKey=e.WorkbenchListScrollAtTopContextKey=e.RawWorkbenchListScrollAtBoundaryContextKey=e.ListService=e.IListService=void 0,e.IListService=(0,l.createDecorator)("listService");class C{get lastFocusedList(){return this._lastFocusedWidget}constructor(){this.disposables=new n.DisposableStore,this.lists=[],this._lastFocusedWidget=void 0,this._hasCreatedStyleController=!1}setLastFocusedList(le){le!==this._lastFocusedWidget&&(this._lastFocusedWidget?.getHTMLElement().classList.remove("last-focused"),this._lastFocusedWidget=le,this._lastFocusedWidget?.getHTMLElement().classList.add("last-focused"))}register(le,me){if(this._hasCreatedStyleController||(this._hasCreatedStyleController=!0,new I.DefaultStyleController((0,d.createStyleSheet)(),"").style(u.defaultListStyles)),this.lists.some(ye=>ye.widget===le))throw new Error("Cannot register the same widget multiple times");const Ce={widget:le,extraContextKeys:me};return this.lists.push(Ce),(0,d.isActiveElement)(le.getHTMLElement())&&this.setLastFocusedList(le),(0,n.combinedDisposable)(le.onDidFocus(()=>this.setLastFocusedList(le)),(0,n.toDisposable)(()=>this.lists.splice(this.lists.indexOf(Ce),1)),le.onDidDispose(()=>{this.lists=this.lists.filter(ye=>ye!==Ce),this._lastFocusedWidget===le&&this.setLastFocusedList(void 0)}))}dispose(){this.disposables.dispose()}}e.ListService=C,e.RawWorkbenchListScrollAtBoundaryContextKey=new s.RawContextKey("listScrollAtBoundary","none"),e.WorkbenchListScrollAtTopContextKey=s.ContextKeyExpr.or(e.RawWorkbenchListScrollAtBoundaryContextKey.isEqualTo("top"),e.RawWorkbenchListScrollAtBoundaryContextKey.isEqualTo("both")),e.WorkbenchListScrollAtBottomContextKey=s.ContextKeyExpr.or(e.RawWorkbenchListScrollAtBoundaryContextKey.isEqualTo("bottom"),e.RawWorkbenchListScrollAtBoundaryContextKey.isEqualTo("both")),e.RawWorkbenchListFocusContextKey=new s.RawContextKey("listFocus",!0),e.WorkbenchTreeStickyScrollFocused=new s.RawContextKey("treestickyScrollFocused",!1),e.WorkbenchListSupportsMultiSelectContextKey=new s.RawContextKey("listSupportsMultiselect",!0),e.WorkbenchListFocusContextKey=s.ContextKeyExpr.and(e.RawWorkbenchListFocusContextKey,s.ContextKeyExpr.not(g.InputFocusedContextKey),e.WorkbenchTreeStickyScrollFocused.negate()),e.WorkbenchListHasSelectionOrFocus=new s.RawContextKey("listHasSelectionOrFocus",!1),e.WorkbenchListDoubleSelection=new s.RawContextKey("listDoubleSelection",!1),e.WorkbenchListMultiSelection=new s.RawContextKey("listMultiSelection",!1),e.WorkbenchListSelectionNavigation=new s.RawContextKey("listSelectionNavigation",!1),e.WorkbenchListSupportsFind=new s.RawContextKey("listSupportsFind",!0),e.WorkbenchTreeElementCanCollapse=new s.RawContextKey("treeElementCanCollapse",!1),e.WorkbenchTreeElementHasParent=new s.RawContextKey("treeElementHasParent",!1),e.WorkbenchTreeElementCanExpand=new s.RawContextKey("treeElementCanExpand",!1),e.WorkbenchTreeElementHasChild=new s.RawContextKey("treeElementHasChild",!1),e.WorkbenchTreeFindOpen=new s.RawContextKey("treeFindOpen",!1);const f="listTypeNavigationMode",h="listAutomaticKeyboardNavigation";function v(re,le){const me=re.createScoped(le.getHTMLElement());return e.RawWorkbenchListFocusContextKey.bindTo(me),me}function w(re,le){const me=e.RawWorkbenchListScrollAtBoundaryContextKey.bindTo(re),Ce=()=>{const ye=le.scrollTop===0,Le=le.scrollHeight-le.renderHeight-le.scrollTop<1;ye&&Le?me.set("both"):ye?me.set("top"):Le?me.set("bottom"):me.set("none")};return Ce(),le.onDidScroll(Ce)}const S="workbench.list.multiSelectModifier",L="workbench.list.openMode",D="workbench.list.horizontalScrolling",T="workbench.list.defaultFindMode",M="workbench.list.typeNavigationMode",A="workbench.list.keyboardNavigation",P="workbench.list.scrollByPage",N="workbench.list.defaultFindMatchType",O="workbench.tree.indent",F="workbench.tree.renderIndentGuides",x="workbench.list.smoothScrolling",W="workbench.list.mouseWheelScrollSensitivity",V="workbench.list.fastScrollSensitivity",q="workbench.tree.expandMode",H="workbench.tree.enableStickyScroll",z="workbench.tree.stickyScrollMaxItemCount";function U(re){return re.getValue(S)==="alt"}class j extends n.Disposable{constructor(le){super(),this.configurationService=le,this.useAltAsMultipleSelectionModifier=U(le),this.registerListeners()}registerListeners(){this._register(this.configurationService.onDidChangeConfiguration(le=>{le.affectsConfiguration(S)&&(this.useAltAsMultipleSelectionModifier=U(this.configurationService))}))}isSelectionSingleChangeEvent(le){return this.useAltAsMultipleSelectionModifier?le.browserEvent.altKey:(0,I.isSelectionSingleChangeEvent)(le)}isSelectionRangeChangeEvent(le){return(0,I.isSelectionRangeChangeEvent)(le)}}function Y(re,le){const me=re.get(t.IConfigurationService),Ce=re.get(a.IKeybindingService),ye=new n.DisposableStore;return[{...le,keyboardNavigationDelegate:{mightProducePrintableCharacter(Ee){return Ce.mightProducePrintableCharacter(Ee)}},smoothScrolling:!!me.getValue(x),mouseWheelScrollSensitivity:me.getValue(W),fastScrollSensitivity:me.getValue(V),multipleSelectionController:le.multipleSelectionController??ye.add(new j(me)),keyboardNavigationEventFilter:pe(Ce),scrollByPage:!!me.getValue(P)},ye]}let G=class extends I.List{constructor(le,me,Ce,ye,Le,Ee,Me,Ae,Ne){const Ke=typeof Le.horizontalScrolling<"u"?Le.horizontalScrolling:!!Ae.getValue(D),[ze,Ge]=Ne.invokeFunction(Y,Le);super(le,me,Ce,ye,{keyboardSupport:!1,...ze,horizontalScrolling:Ke}),this.disposables.add(Ge),this.contextKeyService=v(Ee,this),this.disposables.add(w(this.contextKeyService,this)),this.listSupportsMultiSelect=e.WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService),this.listSupportsMultiSelect.set(Le.multipleSelectionSupport!==!1),e.WorkbenchListSelectionNavigation.bindTo(this.contextKeyService).set(!!Le.selectionNavigation),this.listHasSelectionOrFocus=e.WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService),this.listDoubleSelection=e.WorkbenchListDoubleSelection.bindTo(this.contextKeyService),this.listMultiSelection=e.WorkbenchListMultiSelection.bindTo(this.contextKeyService),this.horizontalScrolling=Le.horizontalScrolling,this._useAltAsMultipleSelectionModifier=U(Ae),this.disposables.add(this.contextKeyService),this.disposables.add(Me.register(this)),this.updateStyles(Le.overrideStyles),this.disposables.add(this.onDidChangeSelection(()=>{const Oe=this.getSelection(),Fe=this.getFocus();this.contextKeyService.bufferChangeEvents(()=>{this.listHasSelectionOrFocus.set(Oe.length>0||Fe.length>0),this.listMultiSelection.set(Oe.length>1),this.listDoubleSelection.set(Oe.length===2)})})),this.disposables.add(this.onDidChangeFocus(()=>{const Oe=this.getSelection(),Fe=this.getFocus();this.listHasSelectionOrFocus.set(Oe.length>0||Fe.length>0)})),this.disposables.add(Ae.onDidChangeConfiguration(Oe=>{Oe.affectsConfiguration(S)&&(this._useAltAsMultipleSelectionModifier=U(Ae));let Fe={};if(Oe.affectsConfiguration(D)&&this.horizontalScrolling===void 0){const fe=!!Ae.getValue(D);Fe={...Fe,horizontalScrolling:fe}}if(Oe.affectsConfiguration(P)){const fe=!!Ae.getValue(P);Fe={...Fe,scrollByPage:fe}}if(Oe.affectsConfiguration(x)){const fe=!!Ae.getValue(x);Fe={...Fe,smoothScrolling:fe}}if(Oe.affectsConfiguration(W)){const fe=Ae.getValue(W);Fe={...Fe,mouseWheelScrollSensitivity:fe}}if(Oe.affectsConfiguration(V)){const fe=Ae.getValue(V);Fe={...Fe,fastScrollSensitivity:fe}}Object.keys(Fe).length>0&&this.updateOptions(Fe)})),this.navigator=new ie(this,{configurationService:Ae,...Le}),this.disposables.add(this.navigator)}updateOptions(le){super.updateOptions(le),le.overrideStyles!==void 0&&this.updateStyles(le.overrideStyles),le.multipleSelectionSupport!==void 0&&this.listSupportsMultiSelect.set(!!le.multipleSelectionSupport)}updateStyles(le){this.style(le?(0,u.getListStyles)(le):u.defaultListStyles)}};e.WorkbenchList=G,e.WorkbenchList=G=ke([ce(5,s.IContextKeyService),ce(6,e.IListService),ce(7,t.IConfigurationService),ce(8,l.IInstantiationService)],G);let K=class extends k.PagedList{constructor(le,me,Ce,ye,Le,Ee,Me,Ae,Ne){const Ke=typeof Le.horizontalScrolling<"u"?Le.horizontalScrolling:!!Ae.getValue(D),[ze,Ge]=Ne.invokeFunction(Y,Le);super(le,me,Ce,ye,{keyboardSupport:!1,...ze,horizontalScrolling:Ke}),this.disposables=new n.DisposableStore,this.disposables.add(Ge),this.contextKeyService=v(Ee,this),this.disposables.add(w(this.contextKeyService,this.widget)),this.horizontalScrolling=Le.horizontalScrolling,this.listSupportsMultiSelect=e.WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService),this.listSupportsMultiSelect.set(Le.multipleSelectionSupport!==!1),e.WorkbenchListSelectionNavigation.bindTo(this.contextKeyService).set(!!Le.selectionNavigation),this._useAltAsMultipleSelectionModifier=U(Ae),this.disposables.add(this.contextKeyService),this.disposables.add(Me.register(this)),this.updateStyles(Le.overrideStyles),this.disposables.add(Ae.onDidChangeConfiguration(Oe=>{Oe.affectsConfiguration(S)&&(this._useAltAsMultipleSelectionModifier=U(Ae));let Fe={};if(Oe.affectsConfiguration(D)&&this.horizontalScrolling===void 0){const fe=!!Ae.getValue(D);Fe={...Fe,horizontalScrolling:fe}}if(Oe.affectsConfiguration(P)){const fe=!!Ae.getValue(P);Fe={...Fe,scrollByPage:fe}}if(Oe.affectsConfiguration(x)){const fe=!!Ae.getValue(x);Fe={...Fe,smoothScrolling:fe}}if(Oe.affectsConfiguration(W)){const fe=Ae.getValue(W);Fe={...Fe,mouseWheelScrollSensitivity:fe}}if(Oe.affectsConfiguration(V)){const fe=Ae.getValue(V);Fe={...Fe,fastScrollSensitivity:fe}}Object.keys(Fe).length>0&&this.updateOptions(Fe)})),this.navigator=new ie(this,{configurationService:Ae,...Le}),this.disposables.add(this.navigator)}updateOptions(le){super.updateOptions(le),le.overrideStyles!==void 0&&this.updateStyles(le.overrideStyles),le.multipleSelectionSupport!==void 0&&this.listSupportsMultiSelect.set(!!le.multipleSelectionSupport)}updateStyles(le){this.style(le?(0,u.getListStyles)(le):u.defaultListStyles)}dispose(){this.disposables.dispose(),super.dispose()}};e.WorkbenchPagedList=K,e.WorkbenchPagedList=K=ke([ce(5,s.IContextKeyService),ce(6,e.IListService),ce(7,t.IConfigurationService),ce(8,l.IInstantiationService)],K);let R=class extends E.Table{constructor(le,me,Ce,ye,Le,Ee,Me,Ae,Ne,Ke){const ze=typeof Ee.horizontalScrolling<"u"?Ee.horizontalScrolling:!!Ne.getValue(D),[Ge,it]=Ke.invokeFunction(Y,Ee);super(le,me,Ce,ye,Le,{keyboardSupport:!1,...Ge,horizontalScrolling:ze}),this.disposables.add(it),this.contextKeyService=v(Me,this),this.disposables.add(w(this.contextKeyService,this)),this.listSupportsMultiSelect=e.WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService),this.listSupportsMultiSelect.set(Ee.multipleSelectionSupport!==!1),e.WorkbenchListSelectionNavigation.bindTo(this.contextKeyService).set(!!Ee.selectionNavigation),this.listHasSelectionOrFocus=e.WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService),this.listDoubleSelection=e.WorkbenchListDoubleSelection.bindTo(this.contextKeyService),this.listMultiSelection=e.WorkbenchListMultiSelection.bindTo(this.contextKeyService),this.horizontalScrolling=Ee.horizontalScrolling,this._useAltAsMultipleSelectionModifier=U(Ne),this.disposables.add(this.contextKeyService),this.disposables.add(Ae.register(this)),this.updateStyles(Ee.overrideStyles),this.disposables.add(this.onDidChangeSelection(()=>{const Fe=this.getSelection(),fe=this.getFocus();this.contextKeyService.bufferChangeEvents(()=>{this.listHasSelectionOrFocus.set(Fe.length>0||fe.length>0),this.listMultiSelection.set(Fe.length>1),this.listDoubleSelection.set(Fe.length===2)})})),this.disposables.add(this.onDidChangeFocus(()=>{const Fe=this.getSelection(),fe=this.getFocus();this.listHasSelectionOrFocus.set(Fe.length>0||fe.length>0)})),this.disposables.add(Ne.onDidChangeConfiguration(Fe=>{Fe.affectsConfiguration(S)&&(this._useAltAsMultipleSelectionModifier=U(Ne));let fe={};if(Fe.affectsConfiguration(D)&&this.horizontalScrolling===void 0){const _e=!!Ne.getValue(D);fe={...fe,horizontalScrolling:_e}}if(Fe.affectsConfiguration(P)){const _e=!!Ne.getValue(P);fe={...fe,scrollByPage:_e}}if(Fe.affectsConfiguration(x)){const _e=!!Ne.getValue(x);fe={...fe,smoothScrolling:_e}}if(Fe.affectsConfiguration(W)){const _e=Ne.getValue(W);fe={...fe,mouseWheelScrollSensitivity:_e}}if(Fe.affectsConfiguration(V)){const _e=Ne.getValue(V);fe={...fe,fastScrollSensitivity:_e}}Object.keys(fe).length>0&&this.updateOptions(fe)})),this.navigator=new ue(this,{configurationService:Ne,...Ee}),this.disposables.add(this.navigator)}updateOptions(le){super.updateOptions(le),le.overrideStyles!==void 0&&this.updateStyles(le.overrideStyles),le.multipleSelectionSupport!==void 0&&this.listSupportsMultiSelect.set(!!le.multipleSelectionSupport)}updateStyles(le){this.style(le?(0,u.getListStyles)(le):u.defaultListStyles)}dispose(){this.disposables.dispose(),super.dispose()}};e.WorkbenchTable=R,e.WorkbenchTable=R=ke([ce(6,s.IContextKeyService),ce(7,e.IListService),ce(8,t.IConfigurationService),ce(9,l.IInstantiationService)],R);class J extends n.Disposable{constructor(le,me){super(),this.widget=le,this._onDidOpen=this._register(new p.Emitter),this.onDidOpen=this._onDidOpen.event,this._register(p.Event.filter(this.widget.onDidChangeSelection,Ce=>(0,d.isKeyboardEvent)(Ce.browserEvent))(Ce=>this.onSelectionFromKeyboard(Ce))),this._register(this.widget.onPointer(Ce=>this.onPointer(Ce.element,Ce.browserEvent))),this._register(this.widget.onMouseDblClick(Ce=>this.onMouseDblClick(Ce.element,Ce.browserEvent))),typeof me?.openOnSingleClick!="boolean"&&me?.configurationService?(this.openOnSingleClick=me?.configurationService.getValue(L)!=="doubleClick",this._register(me?.configurationService.onDidChangeConfiguration(Ce=>{Ce.affectsConfiguration(L)&&(this.openOnSingleClick=me?.configurationService.getValue(L)!=="doubleClick")}))):this.openOnSingleClick=me?.openOnSingleClick??!0}onSelectionFromKeyboard(le){if(le.elements.length!==1)return;const me=le.browserEvent,Ce=typeof me.preserveFocus=="boolean"?me.preserveFocus:!0,ye=typeof me.pinned=="boolean"?me.pinned:!Ce;this._open(this.getSelectedElement(),Ce,ye,!1,le.browserEvent)}onPointer(le,me){if(!this.openOnSingleClick||me.detail===2)return;const ye=me.button===1,Le=!0,Ee=ye,Me=me.ctrlKey||me.metaKey||me.altKey;this._open(le,Le,Ee,Me,me)}onMouseDblClick(le,me){if(!me)return;const Ce=me.target;if(Ce.classList.contains("monaco-tl-twistie")||Ce.classList.contains("monaco-icon-label")&&Ce.classList.contains("folder-icon")&&me.offsetX<16)return;const Le=!1,Ee=!0,Me=me.ctrlKey||me.metaKey||me.altKey;this._open(le,Le,Ee,Me,me)}_open(le,me,Ce,ye,Le){le&&this._onDidOpen.fire({editorOptions:{preserveFocus:me,pinned:Ce,revealIfVisible:!0},sideBySide:ye,element:le,browserEvent:Le})}}class ie extends J{constructor(le,me){super(le,me),this.widget=le}getSelectedElement(){return this.widget.getSelectedElements()[0]}}class ue extends J{constructor(le,me){super(le,me)}getSelectedElement(){return this.widget.getSelectedElements()[0]}}class he extends J{constructor(le,me){super(le,me)}getSelectedElement(){return this.widget.getSelection()[0]??void 0}}function pe(re){let le=!1;return me=>{if(me.toKeyCodeChord().isModifierKey())return!1;if(le)return le=!1,!1;const Ce=re.softDispatch(me,me.target);return Ce.kind===1?(le=!0,!1):(le=!1,Ce.kind===0)}}let ae=class extends b.ObjectTree{constructor(le,me,Ce,ye,Le,Ee,Me,Ae,Ne){const{options:Ke,getTypeNavigationMode:ze,disposable:Ge}=Ee.invokeFunction(Q,Le);super(le,me,Ce,ye,Ke),this.disposables.add(Ge),this.internals=new Z(this,Le,ze,Le.overrideStyles,Me,Ae,Ne),this.disposables.add(this.internals)}updateOptions(le){super.updateOptions(le),this.internals.updateOptions(le)}};e.WorkbenchObjectTree=ae,e.WorkbenchObjectTree=ae=ke([ce(5,l.IInstantiationService),ce(6,s.IContextKeyService),ce(7,e.IListService),ce(8,t.IConfigurationService)],ae);let ee=class extends b.CompressibleObjectTree{constructor(le,me,Ce,ye,Le,Ee,Me,Ae,Ne){const{options:Ke,getTypeNavigationMode:ze,disposable:Ge}=Ee.invokeFunction(Q,Le);super(le,me,Ce,ye,Ke),this.disposables.add(Ge),this.internals=new Z(this,Le,ze,Le.overrideStyles,Me,Ae,Ne),this.disposables.add(this.internals)}updateOptions(le={}){super.updateOptions(le),le.overrideStyles&&this.internals.updateStyleOverrides(le.overrideStyles),this.internals.updateOptions(le)}};e.WorkbenchCompressibleObjectTree=ee,e.WorkbenchCompressibleObjectTree=ee=ke([ce(5,l.IInstantiationService),ce(6,s.IContextKeyService),ce(7,e.IListService),ce(8,t.IConfigurationService)],ee);let de=class extends _.DataTree{constructor(le,me,Ce,ye,Le,Ee,Me,Ae,Ne,Ke){const{options:ze,getTypeNavigationMode:Ge,disposable:it}=Me.invokeFunction(Q,Ee);super(le,me,Ce,ye,Le,ze),this.disposables.add(it),this.internals=new Z(this,Ee,Ge,Ee.overrideStyles,Ae,Ne,Ke),this.disposables.add(this.internals)}updateOptions(le={}){super.updateOptions(le),le.overrideStyles!==void 0&&this.internals.updateStyleOverrides(le.overrideStyles),this.internals.updateOptions(le)}};e.WorkbenchDataTree=de,e.WorkbenchDataTree=de=ke([ce(6,l.IInstantiationService),ce(7,s.IContextKeyService),ce(8,e.IListService),ce(9,t.IConfigurationService)],de);let ge=class extends m.AsyncDataTree{get onDidOpen(){return this.internals.onDidOpen}constructor(le,me,Ce,ye,Le,Ee,Me,Ae,Ne,Ke){const{options:ze,getTypeNavigationMode:Ge,disposable:it}=Me.invokeFunction(Q,Ee);super(le,me,Ce,ye,Le,ze),this.disposables.add(it),this.internals=new Z(this,Ee,Ge,Ee.overrideStyles,Ae,Ne,Ke),this.disposables.add(this.internals)}updateOptions(le={}){super.updateOptions(le),le.overrideStyles&&this.internals.updateStyleOverrides(le.overrideStyles),this.internals.updateOptions(le)}};e.WorkbenchAsyncDataTree=ge,e.WorkbenchAsyncDataTree=ge=ke([ce(6,l.IInstantiationService),ce(7,s.IContextKeyService),ce(8,e.IListService),ce(9,t.IConfigurationService)],ge);let X=class extends m.CompressibleAsyncDataTree{constructor(le,me,Ce,ye,Le,Ee,Me,Ae,Ne,Ke,ze){const{options:Ge,getTypeNavigationMode:it,disposable:Oe}=Ae.invokeFunction(Q,Me);super(le,me,Ce,ye,Le,Ee,Ge),this.disposables.add(Oe),this.internals=new Z(this,Me,it,Me.overrideStyles,Ne,Ke,ze),this.disposables.add(this.internals)}updateOptions(le){super.updateOptions(le),this.internals.updateOptions(le)}};e.WorkbenchCompressibleAsyncDataTree=X,e.WorkbenchCompressibleAsyncDataTree=X=ke([ce(7,l.IInstantiationService),ce(8,s.IContextKeyService),ce(9,e.IListService),ce(10,t.IConfigurationService)],X);function B(re){const le=re.getValue(T);if(le==="highlight")return y.TreeFindMode.Highlight;if(le==="filter")return y.TreeFindMode.Filter;const me=re.getValue(A);if(me==="simple"||me==="highlight")return y.TreeFindMode.Highlight;if(me==="filter")return y.TreeFindMode.Filter}function $(re){const le=re.getValue(N);if(le==="fuzzy")return y.TreeFindMatchType.Fuzzy;if(le==="contiguous")return y.TreeFindMatchType.Contiguous}function Q(re,le){const me=re.get(t.IConfigurationService),Ce=re.get(c.IContextViewService),ye=re.get(s.IContextKeyService),Le=re.get(l.IInstantiationService),Ee=()=>{const Ge=ye.getContextKeyValue(f);if(Ge==="automatic")return I.TypeNavigationMode.Automatic;if(Ge==="trigger"||ye.getContextKeyValue(h)===!1)return I.TypeNavigationMode.Trigger;const Oe=me.getValue(M);if(Oe==="automatic")return I.TypeNavigationMode.Automatic;if(Oe==="trigger")return I.TypeNavigationMode.Trigger},Me=le.horizontalScrolling!==void 0?le.horizontalScrolling:!!me.getValue(D),[Ae,Ne]=Le.invokeFunction(Y,le),Ke=le.paddingBottom,ze=le.renderIndentGuides!==void 0?le.renderIndentGuides:me.getValue(F);return{getTypeNavigationMode:Ee,disposable:Ne,options:{keyboardSupport:!1,...Ae,indent:typeof me.getValue(O)=="number"?me.getValue(O):void 0,renderIndentGuides:ze,smoothScrolling:!!me.getValue(x),defaultFindMode:B(me),defaultFindMatchType:$(me),horizontalScrolling:Me,scrollByPage:!!me.getValue(P),paddingBottom:Ke,hideTwistiesOfChildlessElements:le.hideTwistiesOfChildlessElements,expandOnlyOnTwistieClick:le.expandOnlyOnTwistieClick??me.getValue(q)==="doubleClick",contextViewProvider:Ce,findWidgetStyles:u.defaultFindWidgetStyles,enableStickyScroll:!!me.getValue(H),stickyScrollMaxItemCount:Number(me.getValue(z))}}}let Z=class{get onDidOpen(){return this.navigator.onDidOpen}constructor(le,me,Ce,ye,Le,Ee,Me){this.tree=le,this.disposables=[],this.contextKeyService=v(Le,le),this.disposables.push(w(this.contextKeyService,le)),this.listSupportsMultiSelect=e.WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService),this.listSupportsMultiSelect.set(me.multipleSelectionSupport!==!1),e.WorkbenchListSelectionNavigation.bindTo(this.contextKeyService).set(!!me.selectionNavigation),this.listSupportFindWidget=e.WorkbenchListSupportsFind.bindTo(this.contextKeyService),this.listSupportFindWidget.set(me.findWidgetEnabled??!0),this.hasSelectionOrFocus=e.WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService),this.hasDoubleSelection=e.WorkbenchListDoubleSelection.bindTo(this.contextKeyService),this.hasMultiSelection=e.WorkbenchListMultiSelection.bindTo(this.contextKeyService),this.treeElementCanCollapse=e.WorkbenchTreeElementCanCollapse.bindTo(this.contextKeyService),this.treeElementHasParent=e.WorkbenchTreeElementHasParent.bindTo(this.contextKeyService),this.treeElementCanExpand=e.WorkbenchTreeElementCanExpand.bindTo(this.contextKeyService),this.treeElementHasChild=e.WorkbenchTreeElementHasChild.bindTo(this.contextKeyService),this.treeFindOpen=e.WorkbenchTreeFindOpen.bindTo(this.contextKeyService),this.treeStickyScrollFocused=e.WorkbenchTreeStickyScrollFocused.bindTo(this.contextKeyService),this._useAltAsMultipleSelectionModifier=U(Me),this.updateStyleOverrides(ye);const Ne=()=>{const ze=le.getFocus()[0];if(!ze)return;const Ge=le.getNode(ze);this.treeElementCanCollapse.set(Ge.collapsible&&!Ge.collapsed),this.treeElementHasParent.set(!!le.getParentElement(ze)),this.treeElementCanExpand.set(Ge.collapsible&&Ge.collapsed),this.treeElementHasChild.set(!!le.getFirstElementChild(ze))},Ke=new Set;Ke.add(f),Ke.add(h),this.disposables.push(this.contextKeyService,Ee.register(le),le.onDidChangeSelection(()=>{const ze=le.getSelection(),Ge=le.getFocus();this.contextKeyService.bufferChangeEvents(()=>{this.hasSelectionOrFocus.set(ze.length>0||Ge.length>0),this.hasMultiSelection.set(ze.length>1),this.hasDoubleSelection.set(ze.length===2)})}),le.onDidChangeFocus(()=>{const ze=le.getSelection(),Ge=le.getFocus();this.hasSelectionOrFocus.set(ze.length>0||Ge.length>0),Ne()}),le.onDidChangeCollapseState(Ne),le.onDidChangeModel(Ne),le.onDidChangeFindOpenState(ze=>this.treeFindOpen.set(ze)),le.onDidChangeStickyScrollFocused(ze=>this.treeStickyScrollFocused.set(ze)),Me.onDidChangeConfiguration(ze=>{let Ge={};if(ze.affectsConfiguration(S)&&(this._useAltAsMultipleSelectionModifier=U(Me)),ze.affectsConfiguration(O)){const it=Me.getValue(O);Ge={...Ge,indent:it}}if(ze.affectsConfiguration(F)&&me.renderIndentGuides===void 0){const it=Me.getValue(F);Ge={...Ge,renderIndentGuides:it}}if(ze.affectsConfiguration(x)){const it=!!Me.getValue(x);Ge={...Ge,smoothScrolling:it}}if(ze.affectsConfiguration(T)||ze.affectsConfiguration(A)){const it=B(Me);Ge={...Ge,defaultFindMode:it}}if(ze.affectsConfiguration(M)||ze.affectsConfiguration(A)){const it=Ce();Ge={...Ge,typeNavigationMode:it}}if(ze.affectsConfiguration(N)){const it=$(Me);Ge={...Ge,defaultFindMatchType:it}}if(ze.affectsConfiguration(D)&&me.horizontalScrolling===void 0){const it=!!Me.getValue(D);Ge={...Ge,horizontalScrolling:it}}if(ze.affectsConfiguration(P)){const it=!!Me.getValue(P);Ge={...Ge,scrollByPage:it}}if(ze.affectsConfiguration(q)&&me.expandOnlyOnTwistieClick===void 0&&(Ge={...Ge,expandOnlyOnTwistieClick:Me.getValue(q)==="doubleClick"}),ze.affectsConfiguration(H)){const it=Me.getValue(H);Ge={...Ge,enableStickyScroll:it}}if(ze.affectsConfiguration(z)){const it=Math.max(1,Me.getValue(z));Ge={...Ge,stickyScrollMaxItemCount:it}}if(ze.affectsConfiguration(W)){const it=Me.getValue(W);Ge={...Ge,mouseWheelScrollSensitivity:it}}if(ze.affectsConfiguration(V)){const it=Me.getValue(V);Ge={...Ge,fastScrollSensitivity:it}}Object.keys(Ge).length>0&&le.updateOptions(Ge)}),this.contextKeyService.onDidChangeContext(ze=>{ze.affectsSome(Ke)&&le.updateOptions({typeNavigationMode:Ce()})})),this.navigator=new he(le,{configurationService:Me,...me}),this.disposables.push(this.navigator)}updateOptions(le){le.multipleSelectionSupport!==void 0&&this.listSupportsMultiSelect.set(!!le.multipleSelectionSupport)}updateStyleOverrides(le){this.tree.style(le?(0,u.getListStyles)(le):u.defaultListStyles)}dispose(){this.disposables=(0,n.dispose)(this.disposables)}};Z=ke([ce(4,s.IContextKeyService),ce(5,e.IListService),ce(6,t.IConfigurationService)],Z),r.Registry.as(i.Extensions.Configuration).registerConfiguration({id:"workbench",order:7,title:(0,o.localize)(1542,"Workbench"),type:"object",properties:{[S]:{type:"string",enum:["ctrlCmd","alt"],markdownEnumDescriptions:[(0,o.localize)(1543,"Maps to `Control` on Windows and Linux and to `Command` on macOS."),(0,o.localize)(1544,"Maps to `Alt` on Windows and Linux and to `Option` on macOS.")],default:"ctrlCmd",description:(0,o.localize)(1545,"The modifier to be used to add an item in trees and lists to a multi-selection with the mouse (for example in the explorer, open editors and scm view). The 'Open to Side' mouse gestures - if supported - will adapt such that they do not conflict with the multiselect modifier.")},[L]:{type:"string",enum:["singleClick","doubleClick"],default:"singleClick",description:(0,o.localize)(1546,"Controls how to open items in trees and lists using the mouse (if supported). Note that some trees and lists might choose to ignore this setting if it is not applicable.")},[D]:{type:"boolean",default:!1,description:(0,o.localize)(1547,"Controls whether lists and trees support horizontal scrolling in the workbench. Warning: turning on this setting has a performance implication.")},[P]:{type:"boolean",default:!1,description:(0,o.localize)(1548,"Controls whether clicks in the scrollbar scroll page by page.")},[O]:{type:"number",default:8,minimum:4,maximum:40,description:(0,o.localize)(1549,"Controls tree indentation in pixels.")},[F]:{type:"string",enum:["none","onHover","always"],default:"onHover",description:(0,o.localize)(1550,"Controls whether the tree should render indent guides.")},[x]:{type:"boolean",default:!1,description:(0,o.localize)(1551,"Controls whether lists and trees have smooth scrolling.")},[W]:{type:"number",default:1,markdownDescription:(0,o.localize)(1552,"A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.")},[V]:{type:"number",default:5,markdownDescription:(0,o.localize)(1553,"Scrolling speed multiplier when pressing `Alt`.")},[T]:{type:"string",enum:["highlight","filter"],enumDescriptions:[(0,o.localize)(1554,"Highlight elements when searching. Further up and down navigation will traverse only the highlighted elements."),(0,o.localize)(1555,"Filter elements when searching.")],default:"highlight",description:(0,o.localize)(1556,"Controls the default find mode for lists and trees in the workbench.")},[A]:{type:"string",enum:["simple","highlight","filter"],enumDescriptions:[(0,o.localize)(1557,"Simple keyboard navigation focuses elements which match the keyboard input. Matching is done only on prefixes."),(0,o.localize)(1558,"Highlight keyboard navigation highlights elements which match the keyboard input. Further up and down navigation will traverse only the highlighted elements."),(0,o.localize)(1559,"Filter keyboard navigation will filter out and hide all the elements which do not match the keyboard input.")],default:"highlight",description:(0,o.localize)(1560,"Controls the keyboard navigation style for lists and trees in the workbench. Can be simple, highlight and filter."),deprecated:!0,deprecationMessage:(0,o.localize)(1561,"Please use 'workbench.list.defaultFindMode' and 'workbench.list.typeNavigationMode' instead.")},[N]:{type:"string",enum:["fuzzy","contiguous"],enumDescriptions:[(0,o.localize)(1562,"Use fuzzy matching when searching."),(0,o.localize)(1563,"Use contiguous matching when searching.")],default:"fuzzy",description:(0,o.localize)(1564,"Controls the type of matching used when searching lists and trees in the workbench.")},[q]:{type:"string",enum:["singleClick","doubleClick"],default:"singleClick",description:(0,o.localize)(1565,"Controls how tree folders are expanded when clicking the folder names. Note that some trees and lists might choose to ignore this setting if it is not applicable.")},[H]:{type:"boolean",default:!0,description:(0,o.localize)(1566,"Controls whether sticky scrolling is enabled in trees.")},[z]:{type:"number",minimum:1,default:7,markdownDescription:(0,o.localize)(1567,"Controls the number of sticky elements displayed in the tree when {0} is enabled.","`#workbench.tree.enableStickyScroll#`")},[M]:{type:"string",enum:["automatic","trigger"],default:"automatic",markdownDescription:(0,o.localize)(1568,"Controls how type navigation works in lists and trees in the workbench. When set to `trigger`, type navigation begins once the `list.triggerTypeNavigation` command is run.")}}})}),define(ne[71],se([1,0,14,26,191,30,6,19,22,3,273,38]),function(oe,e,d,k,I,E,y,m,_,b,p,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.spinningLoading=e.syncing=e.gotoNextLocation=e.gotoPreviousLocation=e.widgetClose=e.iconsSchemaId=e.IconFontDefinition=e.IconContribution=e.Extensions=void 0,e.registerIcon=g,e.getIconRegistry=c,e.Extensions={IconContribution:"base.contributions.icons"};var o;(function(u){function C(f,h){let v=f.defaults;for(;E.ThemeIcon.isThemeIcon(v);){const w=s.getIcon(v.id);if(!w)return;v=w.defaults}return v}u.getDefinition=C})(o||(e.IconContribution=o={}));var t;(function(u){function C(h){return{weight:h.weight,style:h.style,src:h.src.map(v=>({format:v.format,location:v.location.toString()}))}}u.toJSONObject=C;function f(h){const v=w=>(0,m.isString)(w)?w:void 0;if(h&&Array.isArray(h.src)&&h.src.every(w=>(0,m.isString)(w.format)&&(0,m.isString)(w.location)))return{weight:v(h.weight),style:v(h.style),src:h.src.map(w=>({format:w.format,location:_.URI.parse(w.location)}))}}u.fromJSONObject=f})(t||(e.IconFontDefinition=t={}));class i{constructor(){this._onDidChange=new y.Emitter,this.onDidChange=this._onDidChange.event,this.iconSchema={definitions:{icons:{type:"object",properties:{fontId:{type:"string",description:(0,b.localize)(1838,"The id of the font to use. If not set, the font that is defined first is used.")},fontCharacter:{type:"string",description:(0,b.localize)(1839,"The font character associated with the icon definition.")}},additionalProperties:!1,defaultSnippets:[{body:{fontCharacter:"\\\\e030"}}]}},type:"object",properties:{}},this.iconReferenceSchema={type:"string",pattern:`^${E.ThemeIcon.iconNameExpression}$`,enum:[],enumDescriptions:[]},this.iconsById={},this.iconFontsById={}}registerIcon(C,f,h,v){const w=this.iconsById[C];if(w){if(h&&!w.description){w.description=h,this.iconSchema.properties[C].markdownDescription=`${h} $(${C})`;const D=this.iconReferenceSchema.enum.indexOf(C);D!==-1&&(this.iconReferenceSchema.enumDescriptions[D]=h),this._onDidChange.fire()}return w}const S={id:C,description:h,defaults:f,deprecationMessage:v};this.iconsById[C]=S;const L={$ref:"#/definitions/icons"};return v&&(L.deprecationMessage=v),h&&(L.markdownDescription=`${h}: $(${C})`),this.iconSchema.properties[C]=L,this.iconReferenceSchema.enum.push(C),this.iconReferenceSchema.enumDescriptions.push(h||""),this._onDidChange.fire(),{id:C}}getIcons(){return Object.keys(this.iconsById).map(C=>this.iconsById[C])}getIcon(C){return this.iconsById[C]}getIconSchema(){return this.iconSchema}toString(){const C=(w,S)=>w.id.localeCompare(S.id),f=w=>{for(;E.ThemeIcon.isThemeIcon(w.defaults);)w=this.iconsById[w.defaults.id];return`codicon codicon-${w?w.id:""}`},h=[];h.push("| preview | identifier | default codicon ID | description"),h.push("| ----------- | --------------------------------- | --------------------------------- | --------------------------------- |");const v=Object.keys(this.iconsById).map(w=>this.iconsById[w]);for(const w of v.filter(S=>!!S.description).sort(C))h.push(`||${w.id}|${E.ThemeIcon.isThemeIcon(w.defaults)?w.defaults.id:w.id}|${w.description||""}|`);h.push("| preview | identifier "),h.push("| ----------- | --------------------------------- |");for(const w of v.filter(S=>!E.ThemeIcon.isThemeIcon(S.defaults)).sort(C))h.push(`||${w.id}|`);return h.join(` -`)}}const s=new i;n.Registry.add(e.Extensions.IconContribution,s);function g(u,C,f,h){return s.registerIcon(u,C,f,h)}function c(){return s}function l(){const u=(0,I.getCodiconFontCharacters)();for(const C in u){const f="\\"+u[C].toString(16);s.registerIcon(C,{fontCharacter:f})}}l(),e.iconsSchemaId="vscode://schemas/icons";const a=n.Registry.as(p.Extensions.JSONContribution);a.registerSchema(e.iconsSchemaId,s.getIconSchema());const r=new d.RunOnceScheduler(()=>a.notifySchemaChanged(e.iconsSchemaId),200);s.onDidChange(()=>{r.isScheduled()||r.schedule()}),e.widgetClose=g("widget-close",k.Codicon.close,(0,b.localize)(1840,"Icon for the close action in widgets.")),e.gotoPreviousLocation=g("goto-previous-location",k.Codicon.arrowUp,(0,b.localize)(1841,"Icon for goto previous editor location.")),e.gotoNextLocation=g("goto-next-location",k.Codicon.arrowDown,(0,b.localize)(1842,"Icon for goto next editor location.")),e.syncing=E.ThemeIcon.modify(k.Codicon.sync,"spin"),e.spinningLoading=E.ThemeIcon.modify(k.Codicon.loading,"spin")}),define(ne[762],se([1,0,5,103,87,86,41,13,26,2,21,30,74,88,37,55,68,9,4,105,43,83,136,95,3,137,7,71,499]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AccessibleDiffViewerModelFromEditors=e.AccessibleDiffViewer=void 0;const L=(0,S.registerIcon)("diff-review-insert",_.Codicon.add,(0,h.localize)(84,"Icon for 'Insert' in accessible diff viewer.")),D=(0,S.registerIcon)("diff-review-remove",_.Codicon.remove,(0,h.localize)(85,"Icon for 'Remove' in accessible diff viewer.")),T=(0,S.registerIcon)("diff-review-close",_.Codicon.close,(0,h.localize)(86,"Icon for 'Close' in accessible diff viewer."));let M=class extends b.Disposable{static{this._ttPolicy=(0,k.createTrustedTypesPolicy)("diffReview",{createHTML:j=>j})}constructor(j,Y,G,K,R,J,ie,ue,he){super(),this._parentNode=j,this._visible=Y,this._setVisible=G,this._canClose=K,this._width=R,this._height=J,this._diffs=ie,this._models=ue,this._instantiationService=he,this._state=(0,p.derivedWithStore)(this,(pe,ae)=>{const ee=this._visible.read(pe);if(this._parentNode.style.visibility=ee?"visible":"hidden",!ee)return null;const de=ae.add(this._instantiationService.createInstance(A,this._diffs,this._models,this._setVisible,this._canClose)),ge=ae.add(this._instantiationService.createInstance(H,this._parentNode,de,this._width,this._height,this._models));return{model:de,view:ge}}).recomputeInitiallyAndOnChange(this._store)}next(){(0,p.transaction)(j=>{const Y=this._visible.get();this._setVisible(!0,j),Y&&this._state.get().model.nextGroup(j)})}prev(){(0,p.transaction)(j=>{this._setVisible(!0,j),this._state.get().model.previousGroup(j)})}close(){(0,p.transaction)(j=>{this._setVisible(!1,j)})}};e.AccessibleDiffViewer=M,e.AccessibleDiffViewer=M=ke([ce(8,w.IInstantiationService)],M);let A=class extends b.Disposable{constructor(j,Y,G,K,R){super(),this._diffs=j,this._models=Y,this._setVisible=G,this.canClose=K,this._accessibilitySignalService=R,this._groups=(0,p.observableValue)(this,[]),this._currentGroupIdx=(0,p.observableValue)(this,0),this._currentElementIdx=(0,p.observableValue)(this,0),this.groups=this._groups,this.currentGroup=this._currentGroupIdx.map((J,ie)=>this._groups.read(ie)[J]),this.currentGroupIndex=this._currentGroupIdx,this.currentElement=this._currentElementIdx.map((J,ie)=>this.currentGroup.read(ie)?.lines[J]),this._register((0,p.autorun)(J=>{const ie=this._diffs.read(J);if(!ie){this._groups.set([],void 0);return}const ue=N(ie,this._models.getOriginalModel().getLineCount(),this._models.getModifiedModel().getLineCount());(0,p.transaction)(he=>{const pe=this._models.getModifiedPosition();if(pe){const ae=ue.findIndex(ee=>pe?.lineNumber{const ie=this.currentElement.read(J);ie?.type===O.Deleted?this._accessibilitySignalService.playSignal(v.AccessibilitySignal.diffLineDeleted,{source:"accessibleDiffViewer.currentElementChanged"}):ie?.type===O.Added&&this._accessibilitySignalService.playSignal(v.AccessibilitySignal.diffLineInserted,{source:"accessibleDiffViewer.currentElementChanged"})})),this._register((0,p.autorun)(J=>{const ie=this.currentElement.read(J);if(ie&&ie.type!==O.Header){const ue=ie.modifiedLineNumber??ie.diff.modified.startLineNumber;this._models.modifiedSetSelection(l.Range.fromPositions(new c.Position(ue,1)))}}))}_goToGroupDelta(j,Y){const G=this.groups.get();!G||G.length<=1||(0,p.subtransaction)(Y,K=>{this._currentGroupIdx.set(g.OffsetRange.ofLength(G.length).clipCyclic(this._currentGroupIdx.get()+j),K),this._currentElementIdx.set(0,K)})}nextGroup(j){this._goToGroupDelta(1,j)}previousGroup(j){this._goToGroupDelta(-1,j)}_goToLineDelta(j){const Y=this.currentGroup.get();!Y||Y.lines.length<=1||(0,p.transaction)(G=>{this._currentElementIdx.set(g.OffsetRange.ofLength(Y.lines.length).clip(this._currentElementIdx.get()+j),G)})}goToNextLine(){this._goToLineDelta(1)}goToPreviousLine(){this._goToLineDelta(-1)}goToLine(j){const Y=this.currentGroup.get();if(!Y)return;const G=Y.lines.indexOf(j);G!==-1&&(0,p.transaction)(K=>{this._currentElementIdx.set(G,K)})}revealCurrentElementInEditor(){if(!this.canClose.get())return;this._setVisible(!1,void 0);const j=this.currentElement.get();j&&(j.type===O.Deleted?this._models.originalReveal(l.Range.fromPositions(new c.Position(j.originalLineNumber,1))):this._models.modifiedReveal(j.type!==O.Header?l.Range.fromPositions(new c.Position(j.modifiedLineNumber,1)):void 0))}close(){this.canClose.get()&&(this._setVisible(!1,void 0),this._models.modifiedFocus())}};A=ke([ce(4,v.IAccessibilitySignalService)],A);const P=3;function N(U,j,Y){const G=[];for(const K of(0,m.groupAdjacentBy)(U,(R,J)=>J.modified.startLineNumber-R.modified.endLineNumberExclusive<2*P)){const R=[];R.push(new x);const J=new s.LineRange(Math.max(1,K[0].original.startLineNumber-P),Math.min(K[K.length-1].original.endLineNumberExclusive+P,j+1)),ie=new s.LineRange(Math.max(1,K[0].modified.startLineNumber-P),Math.min(K[K.length-1].modified.endLineNumberExclusive+P,Y+1));(0,m.forEachAdjacent)(K,(pe,ae)=>{const ee=new s.LineRange(pe?pe.original.endLineNumberExclusive:J.startLineNumber,ae?ae.original.startLineNumber:J.endLineNumberExclusive),de=new s.LineRange(pe?pe.modified.endLineNumberExclusive:ie.startLineNumber,ae?ae.modified.startLineNumber:ie.endLineNumberExclusive);ee.forEach(ge=>{R.push(new q(ge,de.startLineNumber+(ge-ee.startLineNumber)))}),ae&&(ae.original.forEach(ge=>{R.push(new W(ae,ge))}),ae.modified.forEach(ge=>{R.push(new V(ae,ge))}))});const ue=K[0].modified.join(K[K.length-1].modified),he=K[0].original.join(K[K.length-1].original);G.push(new F(new a.LineRangeMapping(ue,he),R))}return G}var O;(function(U){U[U.Header=0]="Header",U[U.Unchanged=1]="Unchanged",U[U.Deleted=2]="Deleted",U[U.Added=3]="Added"})(O||(O={}));class F{constructor(j,Y){this.range=j,this.lines=Y}}class x{constructor(){this.type=O.Header}}class W{constructor(j,Y){this.diff=j,this.originalLineNumber=Y,this.type=O.Deleted,this.modifiedLineNumber=void 0}}class V{constructor(j,Y){this.diff=j,this.modifiedLineNumber=Y,this.type=O.Added,this.originalLineNumber=void 0}}class q{constructor(j,Y){this.originalLineNumber=j,this.modifiedLineNumber=Y,this.type=O.Unchanged}}let H=class extends b.Disposable{constructor(j,Y,G,K,R,J){super(),this._element=j,this._model=Y,this._width=G,this._height=K,this._models=R,this._languageService=J,this.domNode=this._element,this.domNode.className="monaco-component diff-review monaco-editor-background";const ie=document.createElement("div");ie.className="diff-review-actions",this._actionBar=this._register(new I.ActionBar(ie)),this._register((0,p.autorun)(ue=>{this._actionBar.clear(),this._model.canClose.read(ue)&&this._actionBar.push(new y.Action("diffreview.close",(0,h.localize)(87,"Close"),"close-diff-review "+n.ThemeIcon.asClassName(T),!0,async()=>Y.close()),{label:!1,icon:!0})})),this._content=document.createElement("div"),this._content.className="diff-review-content",this._content.setAttribute("role","code"),this._scrollbar=this._register(new E.DomScrollableElement(this._content,{})),(0,d.reset)(this.domNode,this._scrollbar.getDomNode(),ie),this._register((0,p.autorun)(ue=>{this._height.read(ue),this._width.read(ue),this._scrollbar.scanDomNode()})),this._register((0,b.toDisposable)(()=>{(0,d.reset)(this.domNode)})),this._register((0,t.applyStyle)(this.domNode,{width:this._width,height:this._height})),this._register((0,t.applyStyle)(this._content,{width:this._width,height:this._height})),this._register((0,p.autorunWithStore)((ue,he)=>{this._model.currentGroup.read(ue),this._render(he)})),this._register((0,d.addStandardDisposableListener)(this.domNode,"keydown",ue=>{(ue.equals(18)||ue.equals(2066)||ue.equals(530))&&(ue.preventDefault(),this._model.goToNextLine()),(ue.equals(16)||ue.equals(2064)||ue.equals(528))&&(ue.preventDefault(),this._model.goToPreviousLine()),(ue.equals(9)||ue.equals(2057)||ue.equals(521)||ue.equals(1033))&&(ue.preventDefault(),this._model.close()),(ue.equals(10)||ue.equals(3))&&(ue.preventDefault(),this._model.revealCurrentElementInEditor())}))}_render(j){const Y=this._models.getOriginalOptions(),G=this._models.getModifiedOptions(),K=document.createElement("div");K.className="diff-review-table",K.setAttribute("role","list"),K.setAttribute("aria-label",(0,h.localize)(88,"Accessible Diff Viewer. Use arrow up and down to navigate.")),(0,o.applyFontInfo)(K,G.get(50)),(0,d.reset)(this._content,K);const R=this._models.getOriginalModel(),J=this._models.getModifiedModel();if(!R||!J)return;const ie=R.getOptions(),ue=J.getOptions(),he=G.get(67),pe=this._model.currentGroup.get();for(const ae of pe?.lines||[]){if(!pe)break;let ee;if(ae.type===O.Header){const ge=document.createElement("div");ge.className="diff-review-row",ge.setAttribute("role","listitem");const X=pe.range,B=this._model.currentGroupIndex.get(),$=this._model.groups.get().length,Q=le=>le===0?(0,h.localize)(89,"no lines changed"):le===1?(0,h.localize)(90,"1 line changed"):(0,h.localize)(91,"{0} lines changed",le),Z=Q(X.original.length),te=Q(X.modified.length);ge.setAttribute("aria-label",(0,h.localize)(92,"Difference {0} of {1}: original line {2}, {3}, modified line {4}, {5}",B+1,$,X.original.startLineNumber,Z,X.modified.startLineNumber,te));const re=document.createElement("div");re.className="diff-review-cell diff-review-summary",re.appendChild(document.createTextNode(`${B+1}/${$}: @@ -${X.original.startLineNumber},${X.original.length} +${X.modified.startLineNumber},${X.modified.length} @@`)),ge.appendChild(re),ee=ge}else ee=this._createRow(ae,he,this._width.get(),Y,R,ie,G,J,ue);K.appendChild(ee);const de=(0,p.derived)(ge=>this._model.currentElement.read(ge)===ae);j.add((0,p.autorun)(ge=>{const X=de.read(ge);ee.tabIndex=X?0:-1,X&&ee.focus()})),j.add((0,d.addDisposableListener)(ee,"focus",()=>{this._model.goToLine(ae)}))}this._scrollbar.scanDomNode()}_createRow(j,Y,G,K,R,J,ie,ue,he){const pe=K.get(146),ae=pe.glyphMarginWidth+pe.lineNumbersWidth,ee=ie.get(146),de=10+ee.glyphMarginWidth+ee.lineNumbersWidth;let ge="diff-review-row",X="";const B="diff-review-spacer";let $=null;switch(j.type){case O.Added:ge="diff-review-row line-insert",X=" char-insert",$=L;break;case O.Deleted:ge="diff-review-row line-delete",X=" char-delete",$=D;break}const Q=document.createElement("div");Q.style.minWidth=G+"px",Q.className=ge,Q.setAttribute("role","listitem"),Q.ariaLevel="";const Z=document.createElement("div");Z.className="diff-review-cell",Z.style.height=`${Y}px`,Q.appendChild(Z);const te=document.createElement("span");te.style.width=ae+"px",te.style.minWidth=ae+"px",te.className="diff-review-line-number"+X,j.originalLineNumber!==void 0?te.appendChild(document.createTextNode(String(j.originalLineNumber))):te.innerText="\xA0",Z.appendChild(te);const re=document.createElement("span");re.style.width=de+"px",re.style.minWidth=de+"px",re.style.paddingRight="10px",re.className="diff-review-line-number"+X,j.modifiedLineNumber!==void 0?re.appendChild(document.createTextNode(String(j.modifiedLineNumber))):re.innerText="\xA0",Z.appendChild(re);const le=document.createElement("span");if(le.className=B,$){const ye=document.createElement("span");ye.className=n.ThemeIcon.asClassName($),ye.innerText="\xA0\xA0",le.appendChild(ye)}else le.innerText="\xA0\xA0";Z.appendChild(le);let me;if(j.modifiedLineNumber!==void 0){let ye=this._getLineHtml(ue,ie,he.tabSize,j.modifiedLineNumber,this._languageService.languageIdCodec);M._ttPolicy&&(ye=M._ttPolicy.createHTML(ye)),Z.insertAdjacentHTML("beforeend",ye),me=ue.getLineContent(j.modifiedLineNumber)}else{let ye=this._getLineHtml(R,K,J.tabSize,j.originalLineNumber,this._languageService.languageIdCodec);M._ttPolicy&&(ye=M._ttPolicy.createHTML(ye)),Z.insertAdjacentHTML("beforeend",ye),me=R.getLineContent(j.originalLineNumber)}me.length===0&&(me=(0,h.localize)(93,"blank"));let Ce="";switch(j.type){case O.Unchanged:j.originalLineNumber===j.modifiedLineNumber?Ce=(0,h.localize)(94,"{0} unchanged line {1}",me,j.originalLineNumber):Ce=(0,h.localize)(95,"{0} original line {1} modified line {2}",me,j.originalLineNumber,j.modifiedLineNumber);break;case O.Added:Ce=(0,h.localize)(96,"+ {0} modified line {1}",me,j.modifiedLineNumber);break;case O.Deleted:Ce=(0,h.localize)(97,"- {0} original line {1}",me,j.originalLineNumber);break}return Q.setAttribute("aria-label",Ce),Q}_getLineHtml(j,Y,G,K,R){const J=j.getLineContent(K),ie=Y.get(50),ue=u.LineTokens.createEmpty(J,R),he=f.ViewLineRenderingData.isBasicASCII(J,j.mightContainNonBasicASCII()),pe=f.ViewLineRenderingData.containsRTL(J,he,j.mightContainRTL());return(0,C.renderViewLine2)(new C.RenderLineInput(ie.isMonospace&&!Y.get(33),ie.canUseHalfwidthRightwardsArrow,J,!1,he,pe,0,ue,[],G,0,ie.spaceWidth,ie.middotWidth,ie.wsmiddotWidth,Y.get(118),Y.get(100),Y.get(95),Y.get(51)!==i.EditorFontLigatures.OFF,null)).html}};H=ke([ce(5,r.ILanguageService)],H);class z{constructor(j){this.editors=j}getOriginalModel(){return this.editors.original.getModel()}getOriginalOptions(){return this.editors.original.getOptions()}originalReveal(j){this.editors.original.revealRange(j),this.editors.original.setSelection(j),this.editors.original.focus()}getModifiedModel(){return this.editors.modified.getModel()}getModifiedOptions(){return this.editors.modified.getOptions()}modifiedReveal(j){j&&(this.editors.modified.revealRange(j),this.editors.modified.setSelection(j)),this.editors.modified.focus()}modifiedSetSelection(j){this.editors.modified.setSelection(j)}modifiedFocus(){this.editors.modified.focus()}getModifiedPosition(){return this.editors.modified.getPosition()??void 0}}e.AccessibleDiffViewerModelFromEditors=z}),define(ne[763],se([1,0,253,5,172,85,26,33,6,2,30,3,32,71,227]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorPickerWidget=e.InsertButton=e.ColorPickerBody=e.ColorPickerHeader=void 0;const i=k.$;class s extends b.Disposable{constructor(v,w,S,L=!1){super(),this.model=w,this.showingStandaloneColorPicker=L,this._closeButton=null,this._domNode=i(".colorpicker-header"),k.append(v,this._domNode),this._pickedColorNode=k.append(this._domNode,i(".picked-color")),k.append(this._pickedColorNode,i("span.codicon.codicon-color-mode")),this._pickedColorPresentation=k.append(this._pickedColorNode,document.createElement("span")),this._pickedColorPresentation.classList.add("picked-color-presentation");const D=(0,n.localize)(796,"Click to toggle color options (rgb/hsl/hex)");this._pickedColorNode.setAttribute("title",D),this._originalColorNode=k.append(this._domNode,i(".original-color")),this._originalColorNode.style.backgroundColor=m.Color.Format.CSS.format(this.model.originalColor)||"",this.backgroundColor=S.getColorTheme().getColor(o.editorHoverBackground)||m.Color.white,this._register(S.onDidColorThemeChange(T=>{this.backgroundColor=T.getColor(o.editorHoverBackground)||m.Color.white})),this._register(k.addDisposableListener(this._pickedColorNode,k.EventType.CLICK,()=>this.model.selectNextColorPresentation())),this._register(k.addDisposableListener(this._originalColorNode,k.EventType.CLICK,()=>{this.model.color=this.model.originalColor,this.model.flushColor()})),this._register(w.onDidChangeColor(this.onDidChangeColor,this)),this._register(w.onDidChangePresentation(this.onDidChangePresentation,this)),this._pickedColorNode.style.backgroundColor=m.Color.Format.CSS.format(w.color)||"",this._pickedColorNode.classList.toggle("light",w.color.rgba.a<.5?this.backgroundColor.isLighter():w.color.isLighter()),this.onDidChangeColor(this.model.color),this.showingStandaloneColorPicker&&(this._domNode.classList.add("standalone-colorpicker"),this._closeButton=this._register(new g(this._domNode)))}get closeButton(){return this._closeButton}get pickedColorNode(){return this._pickedColorNode}get originalColorNode(){return this._originalColorNode}onDidChangeColor(v){this._pickedColorNode.style.backgroundColor=m.Color.Format.CSS.format(v)||"",this._pickedColorNode.classList.toggle("light",v.rgba.a<.5?this.backgroundColor.isLighter():v.isLighter()),this.onDidChangePresentation()}onDidChangePresentation(){this._pickedColorPresentation.textContent=this.model.presentation?this.model.presentation.label:""}}e.ColorPickerHeader=s;class g extends b.Disposable{constructor(v){super(),this._onClicked=this._register(new _.Emitter),this.onClicked=this._onClicked.event,this._button=document.createElement("div"),this._button.classList.add("close-button"),k.append(v,this._button);const w=document.createElement("div");w.classList.add("close-button-inner-div"),k.append(this._button,w),k.append(w,i(".button"+p.ThemeIcon.asCSSSelector((0,t.registerIcon)("color-picker-close",y.Codicon.close,(0,n.localize)(797,"Icon to close the color picker"))))).classList.add("close-icon"),this._register(k.addDisposableListener(this._button,k.EventType.CLICK,()=>{this._onClicked.fire()}))}}class c extends b.Disposable{constructor(v,w,S,L=!1){super(),this.model=w,this.pixelRatio=S,this._insertButton=null,this._domNode=i(".colorpicker-body"),k.append(v,this._domNode),this._saturationBox=new l(this._domNode,this.model,this.pixelRatio),this._register(this._saturationBox),this._register(this._saturationBox.onDidChange(this.onDidSaturationValueChange,this)),this._register(this._saturationBox.onColorFlushed(this.flushColor,this)),this._opacityStrip=new r(this._domNode,this.model,L),this._register(this._opacityStrip),this._register(this._opacityStrip.onDidChange(this.onDidOpacityChange,this)),this._register(this._opacityStrip.onColorFlushed(this.flushColor,this)),this._hueStrip=new u(this._domNode,this.model,L),this._register(this._hueStrip),this._register(this._hueStrip.onDidChange(this.onDidHueChange,this)),this._register(this._hueStrip.onColorFlushed(this.flushColor,this)),L&&(this._insertButton=this._register(new C(this._domNode)),this._domNode.classList.add("standalone-colorpicker"))}flushColor(){this.model.flushColor()}onDidSaturationValueChange({s:v,v:w}){const S=this.model.color.hsva;this.model.color=new m.Color(new m.HSVA(S.h,v,w,S.a))}onDidOpacityChange(v){const w=this.model.color.hsva;this.model.color=new m.Color(new m.HSVA(w.h,w.s,w.v,v))}onDidHueChange(v){const w=this.model.color.hsva,S=(1-v)*360;this.model.color=new m.Color(new m.HSVA(S===360?0:S,w.s,w.v,w.a))}get domNode(){return this._domNode}get saturationBox(){return this._saturationBox}get enterButton(){return this._insertButton}layout(){this._saturationBox.layout(),this._opacityStrip.layout(),this._hueStrip.layout()}}e.ColorPickerBody=c;class l extends b.Disposable{constructor(v,w,S){super(),this.model=w,this.pixelRatio=S,this._onDidChange=new _.Emitter,this.onDidChange=this._onDidChange.event,this._onColorFlushed=new _.Emitter,this.onColorFlushed=this._onColorFlushed.event,this._domNode=i(".saturation-wrap"),k.append(v,this._domNode),this._canvas=document.createElement("canvas"),this._canvas.className="saturation-box",k.append(this._domNode,this._canvas),this.selection=i(".saturation-selection"),k.append(this._domNode,this.selection),this.layout(),this._register(k.addDisposableListener(this._domNode,k.EventType.POINTER_DOWN,L=>this.onPointerDown(L))),this._register(this.model.onDidChangeColor(this.onDidChangeColor,this)),this.monitor=null}get domNode(){return this._domNode}onPointerDown(v){if(!v.target||!(v.target instanceof Element))return;this.monitor=this._register(new I.GlobalPointerMoveMonitor);const w=k.getDomNodePagePosition(this._domNode);v.target!==this.selection&&this.onDidChangePosition(v.offsetX,v.offsetY),this.monitor.startMonitoring(v.target,v.pointerId,v.buttons,L=>this.onDidChangePosition(L.pageX-w.left,L.pageY-w.top),()=>null);const S=k.addDisposableListener(v.target.ownerDocument,k.EventType.POINTER_UP,()=>{this._onColorFlushed.fire(),S.dispose(),this.monitor&&(this.monitor.stopMonitoring(!0),this.monitor=null)},!0)}onDidChangePosition(v,w){const S=Math.max(0,Math.min(1,v/this.width)),L=Math.max(0,Math.min(1,1-w/this.height));this.paintSelection(S,L),this._onDidChange.fire({s:S,v:L})}layout(){this.width=this._domNode.offsetWidth,this.height=this._domNode.offsetHeight,this._canvas.width=this.width*this.pixelRatio,this._canvas.height=this.height*this.pixelRatio,this.paint();const v=this.model.color.hsva;this.paintSelection(v.s,v.v)}paint(){const v=this.model.color.hsva,w=new m.Color(new m.HSVA(v.h,1,1,1)),S=this._canvas.getContext("2d"),L=S.createLinearGradient(0,0,this._canvas.width,0);L.addColorStop(0,"rgba(255, 255, 255, 1)"),L.addColorStop(.5,"rgba(255, 255, 255, 0.5)"),L.addColorStop(1,"rgba(255, 255, 255, 0)");const D=S.createLinearGradient(0,0,0,this._canvas.height);D.addColorStop(0,"rgba(0, 0, 0, 0)"),D.addColorStop(1,"rgba(0, 0, 0, 1)"),S.rect(0,0,this._canvas.width,this._canvas.height),S.fillStyle=m.Color.Format.CSS.format(w),S.fill(),S.fillStyle=L,S.fill(),S.fillStyle=D,S.fill()}paintSelection(v,w){this.selection.style.left=`${v*this.width}px`,this.selection.style.top=`${this.height-w*this.height}px`}onDidChangeColor(v){if(this.monitor&&this.monitor.isMonitoring())return;this.paint();const w=v.hsva;this.paintSelection(w.s,w.v)}}class a extends b.Disposable{constructor(v,w,S=!1){super(),this.model=w,this._onDidChange=new _.Emitter,this.onDidChange=this._onDidChange.event,this._onColorFlushed=new _.Emitter,this.onColorFlushed=this._onColorFlushed.event,S?(this.domNode=k.append(v,i(".standalone-strip")),this.overlay=k.append(this.domNode,i(".standalone-overlay"))):(this.domNode=k.append(v,i(".strip")),this.overlay=k.append(this.domNode,i(".overlay"))),this.slider=k.append(this.domNode,i(".slider")),this.slider.style.top="0px",this._register(k.addDisposableListener(this.domNode,k.EventType.POINTER_DOWN,L=>this.onPointerDown(L))),this._register(w.onDidChangeColor(this.onDidChangeColor,this)),this.layout()}layout(){this.height=this.domNode.offsetHeight-this.slider.offsetHeight;const v=this.getValue(this.model.color);this.updateSliderPosition(v)}onDidChangeColor(v){const w=this.getValue(v);this.updateSliderPosition(w)}onPointerDown(v){if(!v.target||!(v.target instanceof Element))return;const w=this._register(new I.GlobalPointerMoveMonitor),S=k.getDomNodePagePosition(this.domNode);this.domNode.classList.add("grabbing"),v.target!==this.slider&&this.onDidChangeTop(v.offsetY),w.startMonitoring(v.target,v.pointerId,v.buttons,D=>this.onDidChangeTop(D.pageY-S.top),()=>null);const L=k.addDisposableListener(v.target.ownerDocument,k.EventType.POINTER_UP,()=>{this._onColorFlushed.fire(),L.dispose(),w.stopMonitoring(!0),this.domNode.classList.remove("grabbing")},!0)}onDidChangeTop(v){const w=Math.max(0,Math.min(1,1-v/this.height));this.updateSliderPosition(w),this._onDidChange.fire(w)}updateSliderPosition(v){this.slider.style.top=`${(1-v)*this.height}px`}}class r extends a{constructor(v,w,S=!1){super(v,w,S),this.domNode.classList.add("opacity-strip"),this.onDidChangeColor(this.model.color)}onDidChangeColor(v){super.onDidChangeColor(v);const{r:w,g:S,b:L}=v.rgba,D=new m.Color(new m.RGBA(w,S,L,1)),T=new m.Color(new m.RGBA(w,S,L,0));this.overlay.style.background=`linear-gradient(to bottom, ${D} 0%, ${T} 100%)`}getValue(v){return v.hsva.a}}class u extends a{constructor(v,w,S=!1){super(v,w,S),this.domNode.classList.add("hue-strip")}getValue(v){return 1-v.hsva.h/360}}class C extends b.Disposable{constructor(v){super(),this._onClicked=this._register(new _.Emitter),this.onClicked=this._onClicked.event,this._button=k.append(v,document.createElement("button")),this._button.classList.add("insert-button"),this._button.textContent="Insert",this._register(k.addDisposableListener(this._button,k.EventType.CLICK,()=>{this._onClicked.fire()}))}get button(){return this._button}}e.InsertButton=C;class f extends E.Widget{constructor(v,w,S,L,D=!1){super(),this.model=w,this.pixelRatio=S,this._register(d.PixelRatio.getInstance(k.getWindow(v)).onDidChange(()=>this.layout())),this._domNode=i(".colorpicker-widget"),v.appendChild(this._domNode),this.header=this._register(new s(this._domNode,this.model,L,D)),this.body=this._register(new c(this._domNode,this.model,this.pixelRatio,D))}layout(){this.body.layout()}get domNode(){return this._domNode}}e.ColorPickerWidget=f}),define(ne[217],se([1,0,5,13,18,57,2,120,264,4,43,84,3,28,59,17,27,71,26,30,8,31,174,118,14,410,24]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarkdownHoverParticipant=e.MarkdownHover=void 0,e.renderMarkdownHovers=O,e.labelForHoverVerbosityAction=x;const S=d.$,L=(0,c.registerIcon)("hover-increase-verbosity",l.Codicon.add,o.localize(1031,"Icon for increaseing hover verbosity.")),D=(0,c.registerIcon)("hover-decrease-verbosity",l.Codicon.remove,o.localize(1032,"Icon for decreasing hover verbosity."));class T{constructor(V,q,H,z,U,j=void 0){this.owner=V,this.range=q,this.contents=H,this.isBeforeContent=z,this.ordinal=U,this.source=j}isValidForHoverAnchor(V){return V.type===1&&this.range.startColumn<=V.range.startColumn&&this.range.endColumn>=V.range.endColumn}}e.MarkdownHover=T;class M{constructor(V,q,H){this.hover=V,this.hoverProvider=q,this.hoverPosition=H}supportsVerbosityAction(V){switch(V){case g.HoverVerbosityAction.Increase:return this.hover.canIncreaseVerbosity??!1;case g.HoverVerbosityAction.Decrease:return this.hover.canDecreaseVerbosity??!1}}}let A=class{constructor(V,q,H,z,U,j,Y,G){this._editor=V,this._languageService=q,this._openerService=H,this._configurationService=z,this._languageFeaturesService=U,this._keybindingService=j,this._hoverService=Y,this._commandService=G,this.hoverOrdinal=3}createLoadingMessage(V){return new T(this,V.range,[new E.MarkdownString().appendText(o.localize(1033,"Loading..."))],!1,2e3)}computeSync(V,q){if(!this._editor.hasModel()||V.type!==1)return[];const H=this._editor.getModel(),z=V.range.startLineNumber,U=H.getLineMaxColumn(z),j=[];let Y=1e3;const G=H.getLineLength(z),K=H.getLanguageIdAtPosition(V.range.startLineNumber,V.range.startColumn),R=this._editor.getOption(118),J=this._configurationService.getValue("editor.maxTokenizationLineLength",{overrideIdentifier:K});let ie=!1;R>=0&&G>R&&V.range.startColumn>=R&&(ie=!0,j.push(new T(this,V.range,[{value:o.localize(1034,"Rendering paused for long line for performance reasons. This can be configured via `editor.stopRenderingLineAfter`.")}],!1,Y++))),!ie&&typeof J=="number"&&G>=J&&j.push(new T(this,V.range,[{value:o.localize(1035,"Tokenization is skipped for long lines for performance reasons. This can be configured via `editor.maxTokenizationLineLength`.")}],!1,Y++));let ue=!1;for(const he of q){const pe=he.range.startLineNumber===z?he.range.startColumn:1,ae=he.range.endLineNumber===z?he.range.endColumn:U,ee=he.options.hoverMessage;if(!ee||(0,E.isEmptyMarkdownString)(ee))continue;he.options.beforeContentClassName&&(ue=!0);const de=new b.Range(V.range.startLineNumber,pe,V.range.startLineNumber,ae);j.push(new T(this,de,(0,k.asArray)(ee),ue,Y++))}return j}computeAsync(V,q,H){if(!this._editor.hasModel()||V.type!==1)return h.AsyncIterableObject.EMPTY;const z=this._editor.getModel(),U=this._languageFeaturesService.hoverProvider;return U.has(z)?this._getMarkdownHovers(U,z,V,H):h.AsyncIterableObject.EMPTY}_getMarkdownHovers(V,q,H,z){const U=H.range.getStartPosition();return(0,v.getHoverProviderResultsAsAsyncIterable)(V,q,U,z).filter(G=>!(0,E.isEmptyMarkdownString)(G.hover.contents)).map(G=>{const K=G.hover.range?b.Range.lift(G.hover.range):H.range,R=new M(G.hover,G.provider,U);return new T(this,K,G.hover.contents,!1,G.ordinal,R)})}renderHoverParts(V,q){return this._renderedHoverParts=new N(q,V.fragment,this,this._editor,this._languageService,this._openerService,this._commandService,this._keybindingService,this._hoverService,this._configurationService,V.onContentsChanged),this._renderedHoverParts}updateMarkdownHoverVerbosityLevel(V,q,H){return Promise.resolve(this._renderedHoverParts?.updateMarkdownHoverPartVerbosityLevel(V,q,H))}};e.MarkdownHoverParticipant=A,e.MarkdownHoverParticipant=A=ke([ce(1,p.ILanguageService),ce(2,i.IOpenerService),ce(3,t.IConfigurationService),ce(4,s.ILanguageFeaturesService),ce(5,u.IKeybindingService),ce(6,f.IHoverService),ce(7,w.ICommandService)],A);class P{constructor(V,q,H){this.hoverPart=V,this.hoverElement=q,this.disposables=H}dispose(){this.disposables.dispose()}}class N{constructor(V,q,H,z,U,j,Y,G,K,R,J){this._hoverParticipant=H,this._editor=z,this._languageService=U,this._openerService=j,this._commandService=Y,this._keybindingService=G,this._hoverService=K,this._configurationService=R,this._onFinishedRendering=J,this._ongoingHoverOperations=new Map,this._disposables=new y.DisposableStore,this.renderedHoverParts=this._renderHoverParts(V,q,this._onFinishedRendering),this._disposables.add((0,y.toDisposable)(()=>{this.renderedHoverParts.forEach(ie=>{ie.dispose()}),this._ongoingHoverOperations.forEach(ie=>{ie.tokenSource.dispose(!0)})}))}_renderHoverParts(V,q,H){return V.sort((0,k.compareBy)(z=>z.ordinal,k.numberComparator)),V.map(z=>{const U=this._renderHoverPart(z,H);return q.appendChild(U.hoverElement),U})}_renderHoverPart(V,q){const H=this._renderMarkdownHover(V,q),z=H.hoverElement,U=V.source,j=new y.DisposableStore;if(j.add(H),!U)return new P(V,z,j);const Y=U.supportsVerbosityAction(g.HoverVerbosityAction.Increase),G=U.supportsVerbosityAction(g.HoverVerbosityAction.Decrease);if(!Y&&!G)return new P(V,z,j);const K=S("div.verbosity-actions");return z.prepend(K),j.add(this._renderHoverExpansionAction(K,g.HoverVerbosityAction.Increase,Y)),j.add(this._renderHoverExpansionAction(K,g.HoverVerbosityAction.Decrease,G)),new P(V,z,j)}_renderMarkdownHover(V,q){return F(this._editor,V,this._languageService,this._openerService,q)}_renderHoverExpansionAction(V,q,H){const z=new y.DisposableStore,U=q===g.HoverVerbosityAction.Increase,j=d.append(V,S(a.ThemeIcon.asCSSSelector(U?L:D)));j.tabIndex=0;const Y=new f.WorkbenchHoverDelegate("mouse",!1,{target:V,position:{hoverPosition:0}},this._configurationService,this._hoverService);if(z.add(this._hoverService.setupManagedHover(Y,j,x(this._keybindingService,q))),!H)return j.classList.add("disabled"),z;j.classList.add("enabled");const G=()=>this._commandService.executeCommand(q===g.HoverVerbosityAction.Increase?_.INCREASE_HOVER_VERBOSITY_ACTION_ID:_.DECREASE_HOVER_VERBOSITY_ACTION_ID);return z.add(new C.ClickAction(j,G)),z.add(new C.KeyDownAction(j,G,[3,10])),z}async updateMarkdownHoverPartVerbosityLevel(V,q,H=!0){const z=this._editor.getModel();if(!z)return;const U=this._getRenderedHoverPartAtIndex(q),j=U?.hoverPart.source;if(!U||!j?.supportsVerbosityAction(V))return;const Y=await this._fetchHover(j,z,V);if(!Y)return;const G=new M(Y,j.hoverProvider,j.hoverPosition),K=U.hoverPart,R=new T(this._hoverParticipant,K.range,Y.contents,K.isBeforeContent,K.ordinal,G),J=this._renderHoverPart(R,this._onFinishedRendering);return this._replaceRenderedHoverPartAtIndex(q,J,R),H&&this._focusOnHoverPartWithIndex(q),{hoverPart:R,hoverElement:J.hoverElement}}async _fetchHover(V,q,H){let z=H===g.HoverVerbosityAction.Increase?1:-1;const U=V.hoverProvider,j=this._ongoingHoverOperations.get(U);j&&(j.tokenSource.cancel(),z+=j.verbosityDelta);const Y=new I.CancellationTokenSource;this._ongoingHoverOperations.set(U,{verbosityDelta:z,tokenSource:Y});const G={verbosityRequest:{verbosityDelta:z,previousHover:V.hover}};let K;try{K=await Promise.resolve(U.provideHover(q,V.hoverPosition,Y.token,G))}catch(R){(0,r.onUnexpectedExternalError)(R)}return Y.dispose(),this._ongoingHoverOperations.delete(U),K}_replaceRenderedHoverPartAtIndex(V,q,H){if(V>=this.renderedHoverParts.length||V<0)return;const z=this.renderedHoverParts[V],U=z.hoverElement,j=q.hoverElement,Y=Array.from(j.children);U.replaceChildren(...Y);const G=new P(H,U,q.disposables);U.focus(),z.dispose(),this.renderedHoverParts[V]=G}_focusOnHoverPartWithIndex(V){this.renderedHoverParts[V].hoverElement.focus()}_getRenderedHoverPartAtIndex(V){return this.renderedHoverParts[V]}dispose(){this._disposables.dispose()}}function O(W,V,q,H,z){V.sort((0,k.compareBy)(j=>j.ordinal,k.numberComparator));const U=[];for(const j of V)U.push(F(q,j,H,z,W.onContentsChanged));return new n.RenderedHoverParts(U)}function F(W,V,q,H,z){const U=new y.DisposableStore,j=S("div.hover-row"),Y=S("div.hover-row-contents");j.appendChild(Y);const G=V.contents;for(const R of G){if((0,E.isEmptyMarkdownString)(R))continue;const J=S("div.markdown-hover"),ie=d.append(J,S("div.hover-contents")),ue=U.add(new m.MarkdownRenderer({editor:W},q,H));U.add(ue.onDidRenderAsync(()=>{ie.className="hover-contents code-hover-contents",z()}));const he=U.add(ue.render(R));ie.appendChild(he.element),Y.appendChild(J)}return{hoverPart:V,hoverElement:j,dispose(){U.dispose()}}}function x(W,V){switch(V){case g.HoverVerbosityAction.Increase:{const q=W.lookupKeybinding(_.INCREASE_HOVER_VERBOSITY_ACTION_ID);return q?o.localize(1036,"Increase Hover Verbosity ({0})",q.getLabel()):o.localize(1037,"Increase Hover Verbosity")}case g.HoverVerbosityAction.Decrease:{const q=W.lookupKeybinding(_.DECREASE_HOVER_VERBOSITY_ACTION_ID);return q?o.localize(1038,"Decrease Hover Verbosity ({0})",q.getLabel()):o.localize(1039,"Decrease Hover Verbosity")}}}}),define(ne[764],se([1,0,5,46,86,26,6,2,11,19,37,43,120,270,3,12,59,32,71,30,54,63,526]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u){"use strict";var C;Object.defineProperty(e,"__esModule",{value:!0}),e.ParameterHintsWidget=void 0;const f=d.$,h=(0,l.registerIcon)("parameter-hints-next",E.Codicon.chevronDown,i.localize(1173,"Icon for show next parameter hint.")),v=(0,l.registerIcon)("parameter-hints-previous",E.Codicon.chevronUp,i.localize(1174,"Icon for show previous parameter hint."));let w=class extends m.Disposable{static{C=this}static{this.ID="editor.widget.parameterHintsWidget"}constructor(L,D,T,M,A,P){super(),this.editor=L,this.model=D,this.telemetryService=P,this.renderDisposeables=this._register(new m.DisposableStore),this.visible=!1,this.announcedLabel=null,this.allowEditorOverflow=!0,this.markdownRenderer=this._register(new o.MarkdownRenderer({editor:L},A,M)),this.keyVisible=t.Context.Visible.bindTo(T),this.keyMultipleSignatures=t.Context.MultipleSignatures.bindTo(T)}createParameterHintDOMNodes(){const L=f(".editor-widget.parameter-hints-widget"),D=d.append(L,f(".phwrapper"));D.tabIndex=-1;const T=d.append(D,f(".controls")),M=d.append(T,f(".button"+a.ThemeIcon.asCSSSelector(v))),A=d.append(T,f(".overloads")),P=d.append(T,f(".button"+a.ThemeIcon.asCSSSelector(h)));this._register(d.addDisposableListener(M,"click",V=>{d.EventHelper.stop(V),this.previous()})),this._register(d.addDisposableListener(P,"click",V=>{d.EventHelper.stop(V),this.next()}));const N=f(".body"),O=new I.DomScrollableElement(N,{alwaysConsumeMouseWheel:!0});this._register(O),D.appendChild(O.getDomNode());const F=d.append(N,f(".signature")),x=d.append(N,f(".docs"));L.style.userSelect="text",this.domNodes={element:L,signature:F,overloads:A,docs:x,scrollbar:O},this.editor.addContentWidget(this),this.hide(),this._register(this.editor.onDidChangeCursorSelection(V=>{this.visible&&this.editor.layoutContentWidget(this)}));const W=()=>{if(!this.domNodes)return;const V=this.editor.getOption(50),q=this.domNodes.element;q.style.fontSize=`${V.fontSize}px`,q.style.lineHeight=`${V.lineHeight/V.fontSize}`,q.style.setProperty("--vscode-parameterHintsWidget-editorFontFamily",V.fontFamily),q.style.setProperty("--vscode-parameterHintsWidget-editorFontFamilyDefault",p.EDITOR_FONT_DEFAULTS.fontFamily)};W(),this._register(y.Event.chain(this.editor.onDidChangeConfiguration.bind(this.editor),V=>V.filter(q=>q.hasChanged(50)))(W)),this._register(this.editor.onDidLayoutChange(V=>this.updateMaxHeight())),this.updateMaxHeight()}show(){this.visible||(this.domNodes||this.createParameterHintDOMNodes(),this.keyVisible.set(!0),this.visible=!0,setTimeout(()=>{this.domNodes?.element.classList.add("visible")},100),this.editor.layoutContentWidget(this))}hide(){this.renderDisposeables.clear(),this.visible&&(this.keyVisible.reset(),this.visible=!1,this.announcedLabel=null,this.domNodes?.element.classList.remove("visible"),this.editor.layoutContentWidget(this))}getPosition(){return this.visible?{position:this.editor.getPosition(),preference:[1,2]}:null}render(L){if(this.renderDisposeables.clear(),!this.domNodes)return;const D=L.signatures.length>1;this.domNodes.element.classList.toggle("multiple",D),this.keyMultipleSignatures.set(D),this.domNodes.signature.innerText="",this.domNodes.docs.innerText="";const T=L.signatures[L.activeSignature];if(!T)return;const M=d.append(this.domNodes.signature,f(".code")),A=T.parameters.length>0,P=T.activeParameter??L.activeParameter;if(A)this.renderParameters(M,T,P);else{const F=d.append(M,f("span"));F.textContent=T.label}const N=T.parameters[P];if(N?.documentation){const F=f("span.documentation");if(typeof N.documentation=="string")F.textContent=N.documentation;else{const x=this.renderMarkdownDocs(N.documentation);F.appendChild(x.element)}d.append(this.domNodes.docs,f("p",{},F))}if(T.documentation!==void 0)if(typeof T.documentation=="string")d.append(this.domNodes.docs,f("p",{},T.documentation));else{const F=this.renderMarkdownDocs(T.documentation);d.append(this.domNodes.docs,F.element)}const O=this.hasDocs(T,N);if(this.domNodes.signature.classList.toggle("has-docs",O),this.domNodes.docs.classList.toggle("empty",!O),this.domNodes.overloads.textContent=String(L.activeSignature+1).padStart(L.signatures.length.toString().length,"0")+"/"+L.signatures.length,N){let F="";const x=T.parameters[P];Array.isArray(x.label)?F=T.label.substring(x.label[0],x.label[1]):F=x.label,x.documentation&&(F+=typeof x.documentation=="string"?`, ${x.documentation}`:`, ${x.documentation.value}`),T.documentation&&(F+=typeof T.documentation=="string"?`, ${T.documentation}`:`, ${T.documentation.value}`),this.announcedLabel!==F&&(k.alert(i.localize(1175,"{0}, hint",F)),this.announcedLabel=F)}this.editor.layoutContentWidget(this),this.domNodes.scrollbar.scanDomNode()}renderMarkdownDocs(L){const D=new r.StopWatch,T=this.renderDisposeables.add(this.markdownRenderer.render(L,{asyncRenderCallback:()=>{this.domNodes?.scrollbar.scanDomNode()}}));T.element.classList.add("markdown-docs");const M=D.elapsed();return M>300&&this.telemetryService.publicLog2("parameterHints.parseMarkdown",{renderDuration:M}),T}hasDocs(L,D){return!!(D&&typeof D.documentation=="string"&&(0,b.assertIsDefined)(D.documentation).length>0||D&&typeof D.documentation=="object"&&(0,b.assertIsDefined)(D.documentation).value.length>0||L.documentation&&typeof L.documentation=="string"&&(0,b.assertIsDefined)(L.documentation).length>0||L.documentation&&typeof L.documentation=="object"&&(0,b.assertIsDefined)(L.documentation.value).length>0)}renderParameters(L,D,T){const[M,A]=this.getParameterLabelOffsets(D,T),P=document.createElement("span");P.textContent=D.label.substring(0,M);const N=document.createElement("span");N.textContent=D.label.substring(M,A),N.className="parameter active";const O=document.createElement("span");O.textContent=D.label.substring(A),d.append(L,P,N,O)}getParameterLabelOffsets(L,D){const T=L.parameters[D];if(T){if(Array.isArray(T.label))return T.label;if(T.label.length){const M=new RegExp(`(\\W|^)${(0,_.escapeRegExpCharacters)(T.label)}(?=\\W|$)`,"g");M.test(L.label);const A=M.lastIndex-T.label.length;return A>=0?[A,M.lastIndex]:[0,0]}else return[0,0]}else return[0,0]}next(){this.editor.focus(),this.model.next()}previous(){this.editor.focus(),this.model.previous()}getDomNode(){return this.domNodes||this.createParameterHintDOMNodes(),this.domNodes.element}getId(){return C.ID}updateMaxHeight(){if(!this.domNodes)return;const D=`${Math.max(this.editor.getLayoutInfo().height/4,250)}px`;this.domNodes.element.style.maxHeight=D;const T=this.domNodes.element.getElementsByClassName("phwrapper");T.length&&(T[0].style.maxHeight=D)}};e.ParameterHintsWidget=w,e.ParameterHintsWidget=w=C=ke([ce(2,s.IContextKeyService),ce(3,g.IOpenerService),ce(4,n.ILanguageService),ce(5,u.ITelemetryService)],w),(0,c.registerColor)("editorHoverWidget.highlightForeground",c.listHighlightForeground,i.localize(1176,"Foreground color of the active item in the parameter hint."))}),define(ne[765],se([1,0,98,2,15,20,27,17,683,270,3,12,7,764]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t){"use strict";var i;Object.defineProperty(e,"__esModule",{value:!0}),e.TriggerParameterHintsAction=e.ParameterHintsController=void 0;let s=class extends k.Disposable{static{i=this}static{this.ID="editor.controller.parameterHints"}static get(r){return r.getContribution(i.ID)}constructor(r,u,C){super(),this.editor=r,this.model=this._register(new _.ParameterHintsModel(r,C.signatureHelpProvider)),this._register(this.model.onChangedHints(f=>{f?(this.widget.value.show(),this.widget.value.render(f)):this.widget.rawValue?.hide()})),this.widget=new d.Lazy(()=>this._register(u.createInstance(t.ParameterHintsWidget,this.editor,this.model)))}cancel(){this.model.cancel()}previous(){this.widget.rawValue?.previous()}next(){this.widget.rawValue?.next()}trigger(r){this.model.trigger(r,0)}};e.ParameterHintsController=s,e.ParameterHintsController=s=i=ke([ce(1,o.IInstantiationService),ce(2,m.ILanguageFeaturesService)],s);class g extends I.EditorAction{constructor(){super({id:"editor.action.triggerParameterHints",label:p.localize(1172,"Trigger Parameter Hints"),alias:"Trigger Parameter Hints",precondition:E.EditorContextKeys.hasSignatureHelpProvider,kbOpts:{kbExpr:E.EditorContextKeys.editorTextFocus,primary:3082,weight:100}})}run(r,u){s.get(u)?.trigger({triggerKind:y.SignatureHelpTriggerKind.Invoke})}}e.TriggerParameterHintsAction=g,(0,I.registerEditorContribution)(s.ID,s,2),(0,I.registerEditorAction)(g);const c=175,l=I.EditorCommand.bindToContribution(s.get);(0,I.registerEditorCommand)(new l({id:"closeParameterHints",precondition:b.Context.Visible,handler:a=>a.cancel(),kbOpts:{weight:c,kbExpr:E.EditorContextKeys.focus,primary:9,secondary:[1033]}})),(0,I.registerEditorCommand)(new l({id:"showPrevParameterHint",precondition:n.ContextKeyExpr.and(b.Context.Visible,b.Context.MultipleSignatures),handler:a=>a.previous(),kbOpts:{weight:c,kbExpr:E.EditorContextKeys.focus,primary:16,secondary:[528],mac:{primary:16,secondary:[528,302]}}})),(0,I.registerEditorCommand)(new l({id:"showNextParameterHint",precondition:n.ContextKeyExpr.and(b.Context.Visible,b.Context.MultipleSignatures),handler:a=>a.next(),kbOpts:{weight:c,kbExpr:E.EditorContextKeys.focus,primary:18,secondary:[530],mac:{primary:18,secondary:[530,300]}}}))}),define(ne[766],se([1,0,5,87,41,2,120,7,702,71,30,534]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BannerController=void 0;const n=26;let o=class extends E.Disposable{constructor(s,g){super(),this._editor=s,this.instantiationService=g,this.banner=this._register(this.instantiationService.createInstance(t))}hide(){this._editor.setBanner(null,0),this.banner.clear()}show(s){this.banner.show({...s,onClose:()=>{this.hide(),s.onClose?.()}}),this._editor.setBanner(this.banner.element,n)}};e.BannerController=o,e.BannerController=o=ke([ce(1,m.IInstantiationService)],o);let t=class extends E.Disposable{constructor(s){super(),this.instantiationService=s,this.markdownRenderer=this.instantiationService.createInstance(y.MarkdownRenderer,{}),this.element=(0,d.$)("div.editor-banner"),this.element.tabIndex=0}getAriaLabel(s){if(s.ariaLabel)return s.ariaLabel;if(typeof s.message=="string")return s.message}getBannerMessage(s){if(typeof s=="string"){const g=(0,d.$)("span");return g.innerText=s,g}return this.markdownRenderer.render(s).element}clear(){(0,d.clearNode)(this.element)}show(s){(0,d.clearNode)(this.element);const g=this.getAriaLabel(s);g&&this.element.setAttribute("aria-label",g);const c=(0,d.append)(this.element,(0,d.$)("div.icon-container"));c.setAttribute("aria-hidden","true"),s.icon&&c.appendChild((0,d.$)(`div${p.ThemeIcon.asCSSSelector(s.icon)}`));const l=(0,d.append)(this.element,(0,d.$)("div.message-container"));if(l.setAttribute("aria-hidden","true"),l.appendChild(this.getBannerMessage(s.message)),this.messageActionsContainer=(0,d.append)(this.element,(0,d.$)("div.message-actions-container")),s.actions)for(const r of s.actions)this._register(this.instantiationService.createInstance(_.Link,this.messageActionsContainer,{...r,tabIndex:-1},{}));const a=(0,d.append)(this.element,(0,d.$)("div.action-container"));this.actionBar=this._register(new k.ActionBar(a)),this.actionBar.push(this._register(new I.Action("banner.close","Close Banner",p.ThemeIcon.asClassName(b.widgetClose),!0,()=>{typeof s.onClose=="function"&&s.onClose()})),{icon:!0,label:!1}),this.actionBar.setFocusable(!1)}};t=ke([ce(0,m.IInstantiationService)],t)}),define(ne[767],se([1,0,5,6,2,30,71]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UnthemedProductIconTheme=void 0,e.getIconsStyleSheet=m;function m(b){const p=new I.DisposableStore,n=p.add(new k.Emitter),o=(0,y.getIconRegistry)();return p.add(o.onDidChange(()=>n.fire())),b&&p.add(b.onDidProductIconThemeChange(()=>n.fire())),{dispose:()=>p.dispose(),onDidChange:n.event,getCSS(){const t=b?b.getProductIconTheme():new _,i={},s=[],g=[];for(const c of o.getIcons()){const l=t.getIcon(c);if(!l)continue;const a=l.font,r=`--vscode-icon-${c.id}-font-family`,u=`--vscode-icon-${c.id}-content`;a?(i[a.id]=a.definition,g.push(`${r}: ${(0,d.asCSSPropertyValue)(a.id)};`,`${u}: '${l.fontCharacter}';`),s.push(`.codicon-${c.id}:before { content: '${l.fontCharacter}'; font-family: ${(0,d.asCSSPropertyValue)(a.id)}; }`)):(g.push(`${u}: '${l.fontCharacter}'; ${r}: 'codicon';`),s.push(`.codicon-${c.id}:before { content: '${l.fontCharacter}'; }`))}for(const c in i){const l=i[c],a=l.weight?`font-weight: ${l.weight};`:"",r=l.style?`font-style: ${l.style};`:"",u=l.src.map(C=>`${(0,d.asCSSUrl)(C.location)} format('${C.format}')`).join(", ");s.push(`@font-face { src: ${u}; font-family: ${(0,d.asCSSPropertyValue)(c)};${a}${r} font-display: block; }`)}return s.push(`:root { ${g.join(" ")} }`),s.join(` -`)}}}class _{getIcon(p){const n=(0,y.getIconRegistry)();let o=p.defaults;for(;E.ThemeIcon.isThemeIcon(o);){const t=n.getIcon(o.id);if(!t)return;o=t.defaults}return o}}e.UnthemedProductIconTheme=_}),define(ne[97],se([1,0]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorScheme=void 0,e.isHighContrast=k,e.isDark=I;var d;(function(E){E.DARK="dark",E.LIGHT="light",E.HIGH_CONTRAST_DARK="hcDark",E.HIGH_CONTRAST_LIGHT="hcLight"})(d||(e.ColorScheme=d={}));function k(E){return E===d.HIGH_CONTRAST_DARK||E===d.HIGH_CONTRAST_LIGHT}function I(E){return E===d.DARK||E===d.HIGH_CONTRAST_DARK}}),define(ne[281],se([1,0,64,39,16,548,164,150,136,97,37]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewLine=e.ViewLineOptions=void 0,e.getColumnOfNodeOffset=u;const n=function(){return I.isNative?!0:!(I.isLinux||d.isFirefox||d.isSafari)}();let o=!0;class t{constructor(f,h){this.themeType=h;const v=f.options,w=v.get(50);v.get(38)==="off"?this.renderWhitespace=v.get(100):this.renderWhitespace="none",this.renderControlCharacters=v.get(95),this.spaceWidth=w.spaceWidth,this.middotWidth=w.middotWidth,this.wsmiddotWidth=w.wsmiddotWidth,this.useMonospaceOptimizations=w.isMonospace&&!v.get(33),this.canUseHalfwidthRightwardsArrow=w.canUseHalfwidthRightwardsArrow,this.lineHeight=v.get(67),this.stopRenderingLineAfter=v.get(118),this.fontLigatures=v.get(51)}equals(f){return this.themeType===f.themeType&&this.renderWhitespace===f.renderWhitespace&&this.renderControlCharacters===f.renderControlCharacters&&this.spaceWidth===f.spaceWidth&&this.middotWidth===f.middotWidth&&this.wsmiddotWidth===f.wsmiddotWidth&&this.useMonospaceOptimizations===f.useMonospaceOptimizations&&this.canUseHalfwidthRightwardsArrow===f.canUseHalfwidthRightwardsArrow&&this.lineHeight===f.lineHeight&&this.stopRenderingLineAfter===f.stopRenderingLineAfter&&this.fontLigatures===f.fontLigatures}}e.ViewLineOptions=t;class i{static{this.CLASS_NAME="view-line"}constructor(f){this._options=f,this._isMaybeInvalid=!0,this._renderedViewLine=null}getDomNode(){return this._renderedViewLine&&this._renderedViewLine.domNode?this._renderedViewLine.domNode.domNode:null}setDomNode(f){if(this._renderedViewLine)this._renderedViewLine.domNode=(0,k.createFastDomNode)(f);else throw new Error("I have no rendered view line to set the dom node to...")}onContentChanged(){this._isMaybeInvalid=!0}onTokensChanged(){this._isMaybeInvalid=!0}onDecorationsChanged(){this._isMaybeInvalid=!0}onOptionsChanged(f){this._isMaybeInvalid=!0,this._options=f}onSelectionChanged(){return(0,b.isHighContrast)(this._options.themeType)||this._options.renderWhitespace==="selection"?(this._isMaybeInvalid=!0,!0):!1}renderLine(f,h,v,w,S){if(this._isMaybeInvalid===!1)return!1;this._isMaybeInvalid=!1;const L=w.getViewLineRenderingData(f),D=this._options,T=m.LineDecoration.filter(L.inlineDecorations,f,L.minColumn,L.maxColumn);let M=null;if((0,b.isHighContrast)(D.themeType)||this._options.renderWhitespace==="selection"){const O=w.selections;for(const F of O){if(F.endLineNumberf)continue;const x=F.startLineNumber===f?F.startColumn:L.minColumn,W=F.endLineNumber===f?F.endColumn:L.maxColumn;x');const P=(0,_.renderViewLine)(A,S);S.appendString("");let N=null;return o&&n&&L.isBasicASCII&&D.useMonospaceOptimizations&&P.containsForeignElements===0&&(N=new s(this._renderedViewLine?this._renderedViewLine.domNode:null,A,P.characterMapping)),N||(N=l(this._renderedViewLine?this._renderedViewLine.domNode:null,A,P.characterMapping,P.containsRTL,P.containsForeignElements)),this._renderedViewLine=N,!0}layoutLine(f,h,v){this._renderedViewLine&&this._renderedViewLine.domNode&&(this._renderedViewLine.domNode.setTop(h),this._renderedViewLine.domNode.setHeight(v))}getWidth(f){return this._renderedViewLine?this._renderedViewLine.getWidth(f):0}getWidthIsFast(){return this._renderedViewLine?this._renderedViewLine.getWidthIsFast():!0}needsMonospaceFontCheck(){return this._renderedViewLine?this._renderedViewLine instanceof s:!1}monospaceAssumptionsAreValid(){return this._renderedViewLine&&this._renderedViewLine instanceof s?this._renderedViewLine.monospaceAssumptionsAreValid():o}onMonospaceAssumptionsInvalidated(){this._renderedViewLine&&this._renderedViewLine instanceof s&&(this._renderedViewLine=this._renderedViewLine.toSlowRenderedLine())}getVisibleRangesForRange(f,h,v,w){if(!this._renderedViewLine)return null;h=Math.min(this._renderedViewLine.input.lineContent.length+1,Math.max(1,h)),v=Math.min(this._renderedViewLine.input.lineContent.length+1,Math.max(1,v));const S=this._renderedViewLine.input.stopRenderingLineAfter;if(S!==-1&&h>S+1&&v>S+1)return new y.VisibleRanges(!0,[new y.FloatHorizontalRange(this.getWidth(w),0)]);S!==-1&&h>S+1&&(h=S+1),S!==-1&&v>S+1&&(v=S+1);const L=this._renderedViewLine.getVisibleRangesForRange(f,h,v,w);return L&&L.length>0?new y.VisibleRanges(!1,L):null}getColumnOfNodeOffset(f,h){return this._renderedViewLine?this._renderedViewLine.getColumnOfNodeOffset(f,h):1}}e.ViewLine=i;class s{constructor(f,h,v){this._cachedWidth=-1,this.domNode=f,this.input=h;const w=Math.floor(h.lineContent.length/300);if(w>0){this._keyColumnPixelOffsetCache=new Float32Array(w);for(let S=0;S=2&&(console.warn("monospace assumptions have been violated, therefore disabling monospace optimizations!"),o=!1)}return o}toSlowRenderedLine(){return l(this.domNode,this.input,this._characterMapping,!1,0)}getVisibleRangesForRange(f,h,v,w){const S=this._getColumnPixelOffset(f,h,w),L=this._getColumnPixelOffset(f,v,w);return[new y.FloatHorizontalRange(S,L-S)]}_getColumnPixelOffset(f,h,v){if(h<=300){const M=this._characterMapping.getHorizontalOffset(h);return this._charWidth*M}const w=Math.floor((h-1)/300)-1,S=(w+1)*300+1;let L=-1;if(this._keyColumnPixelOffsetCache&&(L=this._keyColumnPixelOffsetCache[w],L===-1&&(L=this._actualReadPixelOffset(f,S,v),this._keyColumnPixelOffsetCache[w]=L)),L===-1){const M=this._characterMapping.getHorizontalOffset(h);return this._charWidth*M}const D=this._characterMapping.getHorizontalOffset(S),T=this._characterMapping.getHorizontalOffset(h);return L+this._charWidth*(T-D)}_getReadingTarget(f){return f.domNode.firstChild}_actualReadPixelOffset(f,h,v){if(!this.domNode)return-1;const w=this._characterMapping.getDomPosition(h),S=E.RangeUtil.readHorizontalRanges(this._getReadingTarget(this.domNode),w.partIndex,w.charIndex,w.partIndex,w.charIndex,v);return!S||S.length===0?-1:S[0].left}getColumnOfNodeOffset(f,h){return u(this._characterMapping,f,h)}}class g{constructor(f,h,v,w,S){if(this.domNode=f,this.input=h,this._characterMapping=v,this._isWhitespaceOnly=/^\s*$/.test(h.lineContent),this._containsForeignElements=S,this._cachedWidth=-1,this._pixelOffsetCache=null,!w||this._characterMapping.length===0){this._pixelOffsetCache=new Float32Array(Math.max(2,this._characterMapping.length+1));for(let L=0,D=this._characterMapping.length;L<=D;L++)this._pixelOffsetCache[L]=-1}}_getReadingTarget(f){return f.domNode.firstChild}getWidth(f){return this.domNode?(this._cachedWidth===-1&&(this._cachedWidth=this._getReadingTarget(this.domNode).offsetWidth,f?.markDidDomLayout()),this._cachedWidth):0}getWidthIsFast(){return this._cachedWidth!==-1}getVisibleRangesForRange(f,h,v,w){if(!this.domNode)return null;if(this._pixelOffsetCache!==null){const S=this._readPixelOffset(this.domNode,f,h,w);if(S===-1)return null;const L=this._readPixelOffset(this.domNode,f,v,w);return L===-1?null:[new y.FloatHorizontalRange(S,L-S)]}return this._readVisibleRangesForRange(this.domNode,f,h,v,w)}_readVisibleRangesForRange(f,h,v,w,S){if(v===w){const L=this._readPixelOffset(f,h,v,S);return L===-1?null:[new y.FloatHorizontalRange(L,0)]}else return this._readRawVisibleRangesForRange(f,v,w,S)}_readPixelOffset(f,h,v,w){if(this._characterMapping.length===0){if(this._containsForeignElements===0||this._containsForeignElements===2)return 0;if(this._containsForeignElements===1)return this.getWidth(w);const S=this._getReadingTarget(f);return S.firstChild?(w.markDidDomLayout(),S.firstChild.offsetWidth):0}if(this._pixelOffsetCache!==null){const S=this._pixelOffsetCache[v];if(S!==-1)return S;const L=this._actualReadPixelOffset(f,h,v,w);return this._pixelOffsetCache[v]=L,L}return this._actualReadPixelOffset(f,h,v,w)}_actualReadPixelOffset(f,h,v,w){if(this._characterMapping.length===0){const T=E.RangeUtil.readHorizontalRanges(this._getReadingTarget(f),0,0,0,0,w);return!T||T.length===0?-1:T[0].left}if(v===this._characterMapping.length&&this._isWhitespaceOnly&&this._containsForeignElements===0)return this.getWidth(w);const S=this._characterMapping.getDomPosition(v),L=E.RangeUtil.readHorizontalRanges(this._getReadingTarget(f),S.partIndex,S.charIndex,S.partIndex,S.charIndex,w);if(!L||L.length===0)return-1;const D=L[0].left;if(this.input.isBasicASCII){const T=this._characterMapping.getHorizontalOffset(v),M=Math.round(this.input.spaceWidth*T);if(Math.abs(M-D)<=1)return M}return D}_readRawVisibleRangesForRange(f,h,v,w){if(h===1&&v===this._characterMapping.length)return[new y.FloatHorizontalRange(0,this.getWidth(w))];const S=this._characterMapping.getDomPosition(h),L=this._characterMapping.getDomPosition(v);return E.RangeUtil.readHorizontalRanges(this._getReadingTarget(f),S.partIndex,S.charIndex,L.partIndex,L.charIndex,w)}getColumnOfNodeOffset(f,h){return u(this._characterMapping,f,h)}}class c extends g{_readVisibleRangesForRange(f,h,v,w,S){const L=super._readVisibleRangesForRange(f,h,v,w,S);if(!L||L.length===0||v===w||v===1&&w===this._characterMapping.length)return L;if(!this.input.containsRTL){const D=this._readPixelOffset(f,h,w,S);if(D!==-1){const T=L[L.length-1];T.left=4&&w[0]===3&&w[3]===8}static isStrictChildOfViewLines(w){return w.length>4&&w[0]===3&&w[3]===8}static isChildOfScrollableElement(w){return w.length>=2&&w[0]===3&&w[1]===6}static isChildOfMinimap(w){return w.length>=2&&w[0]===3&&w[1]===9}static isChildOfContentWidgets(w){return w.length>=4&&w[0]===3&&w[3]===1}static isChildOfOverflowGuard(w){return w.length>=1&&w[0]===3}static isChildOfOverflowingContentWidgets(w){return w.length>=1&&w[0]===2}static isChildOfOverlayWidgets(w){return w.length>=2&&w[0]===3&&w[1]===4}static isChildOfOverflowingOverlayWidgets(w){return w.length>=1&&w[0]===5}}class c{constructor(w,S,L){this.viewModel=w.viewModel;const D=w.configuration.options;this.layoutInfo=D.get(146),this.viewDomNode=S.viewDomNode,this.lineHeight=D.get(67),this.stickyTabStops=D.get(117),this.typicalHalfwidthCharacterWidth=D.get(50).typicalHalfwidthCharacterWidth,this.lastRenderData=L,this._context=w,this._viewHelper=S}getZoneAtCoord(w){return c.getZoneAtCoord(this._context,w)}static getZoneAtCoord(w,S){const L=w.viewLayout.getWhitespaceAtVerticalOffset(S);if(L){const D=L.verticalOffset+L.height/2,T=w.viewModel.getLineCount();let M=null,A,P=null;return L.afterLineNumber!==T&&(P=new E.Position(L.afterLineNumber+1,1)),L.afterLineNumber>0&&(M=new E.Position(L.afterLineNumber,w.viewModel.getLineMaxColumn(L.afterLineNumber))),P===null?A=M:M===null?A=P:S=w.layoutInfo.glyphMarginLeft,this.isInContentArea=!this.isInMarginArea,this.mouseColumn=Math.max(0,C._getMouseColumn(this.mouseContentHorizontalOffset,w.typicalHalfwidthCharacterWidth))}}class a extends l{get target(){return this._useHitTestTarget?this.hitTestResult.value.hitTarget:this._eventTarget}get targetPath(){return this._targetPathCacheElement!==this.target&&(this._targetPathCacheElement=this.target,this._targetPathCacheValue=k.PartFingerprints.collect(this.target,this._ctx.viewDomNode)),this._targetPathCacheValue}constructor(w,S,L,D,T){super(w,S,L,D),this.hitTestResult=new p.Lazy(()=>C.doHitTest(this._ctx,this)),this._targetPathCacheElement=null,this._targetPathCacheValue=new Uint8Array(0),this._ctx=w,this._eventTarget=T;const M=!!this._eventTarget;this._useHitTestTarget=!M}toString(){return`pos(${this.pos.x},${this.pos.y}), editorPos(${this.editorPos.x},${this.editorPos.y}), relativePos(${this.relativePos.x},${this.relativePos.y}), mouseVerticalOffset: ${this.mouseVerticalOffset}, mouseContentHorizontalOffset: ${this.mouseContentHorizontalOffset} - target: ${this.target?this.target.outerHTML:null}`}get wouldBenefitFromHitTestTargetSwitch(){return!this._useHitTestTarget&&this.hitTestResult.value.hitTarget!==null&&this.target!==this.hitTestResult.value.hitTarget}switchToHitTestTarget(){this._useHitTestTarget=!0}_getMouseColumn(w=null){return w&&w.columnM.contentLeft+M.width)continue;const A=w.getVerticalOffsetForLineNumber(M.position.lineNumber);if(A<=T&&T<=A+M.height)return S.fulfillContentText(M.position,null,{mightBeForeignElement:!1,injectedText:null})}}return null}static _hitTestViewZone(w,S){const L=w.getZoneAtCoord(S.mouseVerticalOffset);if(L){const D=S.isInContentArea?8:5;return S.fulfillViewZone(D,L.position,L)}return null}static _hitTestTextArea(w,S){return g.isTextArea(S.targetPath)?w.lastRenderData.lastTextareaPosition?S.fulfillContentText(w.lastRenderData.lastTextareaPosition,null,{mightBeForeignElement:!1,injectedText:null}):S.fulfillTextarea():null}static _hitTestMargin(w,S){if(S.isInMarginArea){const L=w.getFullLineRangeAtCoord(S.mouseVerticalOffset),D=L.range.getStartPosition();let T=Math.abs(S.relativePos.x);const M={isAfterLines:L.isAfterLines,glyphMarginLeft:w.layoutInfo.glyphMarginLeft,glyphMarginWidth:w.layoutInfo.glyphMarginWidth,lineNumbersWidth:w.layoutInfo.lineNumbersWidth,offsetX:T};if(T-=w.layoutInfo.glyphMarginLeft,T<=w.layoutInfo.glyphMarginWidth){const A=w.viewModel.coordinatesConverter.convertViewPositionToModelPosition(L.range.getStartPosition()),P=w.viewModel.glyphLanes.getLanesAtLine(A.lineNumber);return M.glyphMarginLane=P[Math.floor(T/w.lineHeight)],S.fulfillMargin(2,D,L.range,M)}return T-=w.layoutInfo.glyphMarginWidth,T<=w.layoutInfo.lineNumbersWidth?S.fulfillMargin(3,D,L.range,M):(T-=w.layoutInfo.lineNumbersWidth,S.fulfillMargin(4,D,L.range,M))}return null}static _hitTestViewLines(w,S){if(!g.isChildOfViewLines(S.targetPath))return null;if(w.isInTopPadding(S.mouseVerticalOffset))return S.fulfillContentEmpty(new E.Position(1,1),r);if(w.isAfterLines(S.mouseVerticalOffset)||w.isInBottomPadding(S.mouseVerticalOffset)){const D=w.viewModel.getLineCount(),T=w.viewModel.getLineMaxColumn(D);return S.fulfillContentEmpty(new E.Position(D,T),r)}if(g.isStrictChildOfViewLines(S.targetPath)){const D=w.getLineNumberAtVerticalOffset(S.mouseVerticalOffset);if(w.viewModel.getLineLength(D)===0){const M=w.getLineWidth(D),A=u(S.mouseContentHorizontalOffset-M);return S.fulfillContentEmpty(new E.Position(D,1),A)}const T=w.getLineWidth(D);if(S.mouseContentHorizontalOffset>=T){const M=u(S.mouseContentHorizontalOffset-T),A=new E.Position(D,w.viewModel.getLineMaxColumn(D));return S.fulfillContentEmpty(A,M)}}const L=S.hitTestResult.value;return L.type===1?C.createMouseTargetFromHitTestPosition(w,S,L.spanNode,L.position,L.injectedText):S.wouldBenefitFromHitTestTargetSwitch?(S.switchToHitTestTarget(),this._createMouseTarget(w,S)):S.fulfillUnknown()}static _hitTestMinimap(w,S){if(g.isChildOfMinimap(S.targetPath)){const L=w.getLineNumberAtVerticalOffset(S.mouseVerticalOffset),D=w.viewModel.getLineMaxColumn(L);return S.fulfillScrollbar(new E.Position(L,D))}return null}static _hitTestScrollbarSlider(w,S){if(g.isChildOfScrollableElement(S.targetPath)&&S.target&&S.target.nodeType===1){const L=S.target.className;if(L&&/\b(slider|scrollbar)\b/.test(L)){const D=w.getLineNumberAtVerticalOffset(S.mouseVerticalOffset),T=w.viewModel.getLineMaxColumn(D);return S.fulfillScrollbar(new E.Position(D,T))}}return null}static _hitTestScrollbar(w,S){if(g.isChildOfScrollableElement(S.targetPath)){const L=w.getLineNumberAtVerticalOffset(S.mouseVerticalOffset),D=w.viewModel.getLineMaxColumn(L);return S.fulfillScrollbar(new E.Position(L,D))}return null}getMouseColumn(w){const S=this._context.configuration.options,L=S.get(146),D=this._context.viewLayout.getCurrentScrollLeft()+w.x-L.contentLeft;return C._getMouseColumn(D,S.get(50).typicalHalfwidthCharacterWidth)}static _getMouseColumn(w,S){return w<0?1:Math.round(w/S)+1}static createMouseTargetFromHitTestPosition(w,S,L,D,T){const M=D.lineNumber,A=D.column,P=w.getLineWidth(M);if(S.mouseContentHorizontalOffset>P){const z=u(S.mouseContentHorizontalOffset-P);return S.fulfillContentEmpty(D,z)}const N=w.visibleRangeForPosition(M,A);if(!N)return S.fulfillUnknown(D);const O=N.left;if(Math.abs(S.mouseContentHorizontalOffset-O)<1)return S.fulfillContentText(D,null,{mightBeForeignElement:!!T,injectedText:T});const F=[];if(F.push({offset:N.left,column:A}),A>1){const z=w.visibleRangeForPosition(M,A-1);z&&F.push({offset:z.left,column:A-1})}const x=w.viewModel.getLineMaxColumn(M);if(Az.offset-U.offset);const W=S.pos.toClientCoordinates(_.getWindow(w.viewDomNode)),V=L.getBoundingClientRect(),q=V.left<=W.clientX&&W.clientX<=V.right;let H=null;for(let z=1;zT)){const A=Math.floor((D+T)/2);let P=S.pos.y+(A-S.mouseVerticalOffset);P<=S.editorPos.y&&(P=S.editorPos.y+1),P>=S.editorPos.y+S.editorPos.height&&(P=S.editorPos.y+S.editorPos.height-1);const N=new d.PageCoordinates(S.pos.x,P),O=this._actualDoHitTestWithCaretRangeFromPoint(w,N.toClientCoordinates(_.getWindow(w.viewDomNode)));if(O.type===1)return O}return this._actualDoHitTestWithCaretRangeFromPoint(w,S.pos.toClientCoordinates(_.getWindow(w.viewDomNode)))}static _actualDoHitTestWithCaretRangeFromPoint(w,S){const L=_.getShadowRoot(w.viewDomNode);let D;if(L?typeof L.caretRangeFromPoint>"u"?D=f(L,S.clientX,S.clientY):D=L.caretRangeFromPoint(S.clientX,S.clientY):D=w.viewDomNode.ownerDocument.caretRangeFromPoint(S.clientX,S.clientY),!D||!D.startContainer)return new n;const T=D.startContainer;if(T.nodeType===T.TEXT_NODE){const M=T.parentNode,A=M?M.parentNode:null,P=A?A.parentNode:null;return(P&&P.nodeType===P.ELEMENT_NODE?P.className:null)===I.ViewLine.CLASS_NAME?t.createFromDOMInfo(w,M,D.startOffset):new n(T.parentNode)}else if(T.nodeType===T.ELEMENT_NODE){const M=T.parentNode,A=M?M.parentNode:null;return(A&&A.nodeType===A.ELEMENT_NODE?A.className:null)===I.ViewLine.CLASS_NAME?t.createFromDOMInfo(w,T,T.textContent.length):new n(T)}return new n}static _doHitTestWithCaretPositionFromPoint(w,S){const L=w.viewDomNode.ownerDocument.caretPositionFromPoint(S.clientX,S.clientY);if(L.offsetNode.nodeType===L.offsetNode.TEXT_NODE){const D=L.offsetNode.parentNode,T=D?D.parentNode:null,M=T?T.parentNode:null;return(M&&M.nodeType===M.ELEMENT_NODE?M.className:null)===I.ViewLine.CLASS_NAME?t.createFromDOMInfo(w,L.offsetNode.parentNode,L.offset):new n(L.offsetNode.parentNode)}if(L.offsetNode.nodeType===L.offsetNode.ELEMENT_NODE){const D=L.offsetNode.parentNode,T=D&&D.nodeType===D.ELEMENT_NODE?D.className:null,M=D?D.parentNode:null,A=M&&M.nodeType===M.ELEMENT_NODE?M.className:null;if(T===I.ViewLine.CLASS_NAME){const P=L.offsetNode.childNodes[Math.min(L.offset,L.offsetNode.childNodes.length-1)];if(P)return t.createFromDOMInfo(w,P,0)}else if(A===I.ViewLine.CLASS_NAME)return t.createFromDOMInfo(w,L.offsetNode,0)}return new n(L.offsetNode)}static _snapToSoftTabBoundary(w,S){const L=S.getLineContent(w.lineNumber),{tabSize:D}=S.model.getOptions(),T=b.AtomicTabMoveOperations.atomicPosition(L,w.column-1,D,2);return T!==-1?new E.Position(w.lineNumber,T+1):w}static doHitTest(w,S){let L=new n;if(typeof w.viewDomNode.ownerDocument.caretRangeFromPoint=="function"?L=this._doHitTestWithCaretRangeFromPoint(w,S):w.viewDomNode.ownerDocument.caretPositionFromPoint&&(L=this._doHitTestWithCaretPositionFromPoint(w,S.pos.toClientCoordinates(_.getWindow(w.viewDomNode)))),L.type===1){const D=w.viewModel.getInjectedTextAt(L.position),T=w.viewModel.normalizePosition(L.position,2);(D||!T.equals(L.position))&&(L=new o(T,L.spanNode,D))}return L}}e.MouseTargetFactory=C;function f(v,w,S){const L=document.createRange();let D=v.elementFromPoint(w,S);if(D!==null){for(;D&&D.firstChild&&D.firstChild.nodeType!==D.firstChild.TEXT_NODE&&D.lastChild&&D.lastChild.firstChild;)D=D.lastChild;const T=D.getBoundingClientRect(),M=_.getWindow(D),A=M.getComputedStyle(D,null).getPropertyValue("font-style"),P=M.getComputedStyle(D,null).getPropertyValue("font-variant"),N=M.getComputedStyle(D,null).getPropertyValue("font-weight"),O=M.getComputedStyle(D,null).getPropertyValue("font-size"),F=M.getComputedStyle(D,null).getPropertyValue("line-height"),x=M.getComputedStyle(D,null).getPropertyValue("font-family"),W=`${A} ${P} ${N} ${O}/${F} ${x}`,V=D.innerText;let q=T.left,H=0,z;if(w>T.left+T.width)H=V.length;else{const U=h.getInstance();for(let j=0;jthis._createMouseTarget(h,v),h=>this._getMouseColumn(h))),this.lastMouseLeaveTime=-1,this._height=this._context.configuration.options.get(146).height;const C=new m.EditorMouseEventFactory(this.viewHelper.viewDomNode);this._register(C.onContextMenu(this.viewHelper.viewDomNode,h=>this._onContextMenu(h,!0))),this._register(C.onMouseMove(this.viewHelper.viewDomNode,h=>{this._onMouseMove(h),this._mouseLeaveMonitor||(this._mouseLeaveMonitor=d.addDisposableListener(this.viewHelper.viewDomNode.ownerDocument,"mousemove",v=>{this.viewHelper.viewDomNode.contains(v.target)||this._onMouseLeave(new m.EditorMouseEvent(v,!1,this.viewHelper.viewDomNode))}))})),this._register(C.onMouseUp(this.viewHelper.viewDomNode,h=>this._onMouseUp(h))),this._register(C.onMouseLeave(this.viewHelper.viewDomNode,h=>this._onMouseLeave(h)));let f=0;this._register(C.onPointerDown(this.viewHelper.viewDomNode,(h,v)=>{f=v})),this._register(d.addDisposableListener(this.viewHelper.viewDomNode,d.EventType.POINTER_UP,h=>{this._mouseDownOperation.onPointerUp()})),this._register(C.onMouseDown(this.viewHelper.viewDomNode,h=>this._onMouseDown(h,f))),this._setupMouseWheelZoomListener(),this._context.addEventHandler(this)}_setupMouseWheelZoomListener(){const a=o.MouseWheelClassifier.INSTANCE;let r=0,u=_.EditorZoom.getZoomLevel(),C=!1,f=0;const h=w=>{if(this.viewController.emitMouseWheel(w),!this._context.configuration.options.get(76))return;const S=new k.StandardWheelEvent(w);if(a.acceptStandardWheelEvent(S),a.isPhysicalMouseWheel()){if(v(w)){const L=_.EditorZoom.getZoomLevel(),D=S.deltaY>0?1:-1;_.EditorZoom.setZoomLevel(L+D),S.preventDefault(),S.stopPropagation()}}else Date.now()-r>50&&(u=_.EditorZoom.getZoomLevel(),C=v(w),f=0),r=Date.now(),f+=S.deltaY,C&&(_.EditorZoom.setZoomLevel(u+f/5),S.preventDefault(),S.stopPropagation())};this._register(d.addDisposableListener(this.viewHelper.viewDomNode,d.EventType.MOUSE_WHEEL,h,{capture:!0,passive:!1}));function v(w){return E.isMacintosh?(w.metaKey||w.ctrlKey)&&!w.shiftKey&&!w.altKey:w.ctrlKey&&!w.metaKey&&!w.shiftKey&&!w.altKey}}dispose(){this._context.removeEventHandler(this),this._mouseLeaveMonitor&&(this._mouseLeaveMonitor.dispose(),this._mouseLeaveMonitor=null),super.dispose()}onConfigurationChanged(a){if(a.hasChanged(146)){const r=this._context.configuration.options.get(146).height;this._height!==r&&(this._height=r,this._mouseDownOperation.onHeightChanged())}return!1}onCursorStateChanged(a){return this._mouseDownOperation.onCursorStateChanged(a),!1}onFocusChanged(a){return!1}getTargetAtClientPoint(a,r){const C=new m.ClientCoordinates(a,r).toPageCoordinates(d.getWindow(this.viewHelper.viewDomNode)),f=(0,m.createEditorPagePosition)(this.viewHelper.viewDomNode);if(C.yf.y+f.height||C.xf.x+f.width)return null;const h=(0,m.createCoordinatesRelativeToEditor)(this.viewHelper.viewDomNode,f,C);return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(),f,C,h,null)}_createMouseTarget(a,r){let u=a.target;if(!this.viewHelper.viewDomNode.contains(u)){const C=d.getShadowRoot(this.viewHelper.viewDomNode);C&&(u=C.elementsFromPoint(a.posx,a.posy).find(f=>this.viewHelper.viewDomNode.contains(f)))}return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(),a.editorPos,a.pos,a.relativePos,r?u:null)}_getMouseColumn(a){return this.mouseTargetFactory.getMouseColumn(a.relativePos)}_onContextMenu(a,r){this.viewController.emitContextMenu({event:a,target:this._createMouseTarget(a,r)})}_onMouseMove(a){this.mouseTargetFactory.mouseTargetIsWidget(a)||a.preventDefault(),!(this._mouseDownOperation.isActive()||a.timestamp{a.preventDefault(),this.viewHelper.focusTextArea()};if(L&&(C||h&&v))D(),this._mouseDownOperation.start(u.type,a,r);else if(f)a.preventDefault();else if(w){const T=u.detail;L&&this.viewHelper.shouldSuppressMouseDownOnViewZone(T.viewZoneId)&&(D(),this._mouseDownOperation.start(u.type,a,r),a.preventDefault())}else S&&this.viewHelper.shouldSuppressMouseDownOnWidget(u.detail)&&(D(),a.preventDefault());this.viewController.emitMouseDown({event:a,target:u})}}e.MouseHandler=t;class i extends I.Disposable{constructor(a,r,u,C,f,h){super(),this._context=a,this._viewController=r,this._viewHelper=u,this._mouseTargetFactory=C,this._createMouseTarget=f,this._getMouseColumn=h,this._mouseMoveMonitor=this._register(new m.GlobalEditorPointerMoveMonitor(this._viewHelper.viewDomNode)),this._topBottomDragScrolling=this._register(new s(this._context,this._viewHelper,this._mouseTargetFactory,(v,w,S)=>this._dispatchMouse(v,w,S))),this._mouseState=new c,this._currentSelection=new p.Selection(1,1,1,1),this._isActive=!1,this._lastMouseEvent=null}dispose(){super.dispose()}isActive(){return this._isActive}_onMouseDownThenMove(a){this._lastMouseEvent=a,this._mouseState.setModifiers(a);const r=this._findMousePosition(a,!1);r&&(this._mouseState.isDragAndDrop?this._viewController.emitMouseDrag({event:a,target:r}):r.type===13&&(r.outsidePosition==="above"||r.outsidePosition==="below")?this._topBottomDragScrolling.start(r,a):(this._topBottomDragScrolling.stop(),this._dispatchMouse(r,!0,1)))}start(a,r,u){this._lastMouseEvent=r,this._mouseState.setStartedOnLineNumbers(a===3),this._mouseState.setStartButtons(r),this._mouseState.setModifiers(r);const C=this._findMousePosition(r,!0);if(!C||!C.position)return;this._mouseState.trySetCount(r.detail,C.position),r.detail=this._mouseState.count;const f=this._context.configuration.options;if(!f.get(92)&&f.get(35)&&!f.get(22)&&!this._mouseState.altKey&&r.detail<2&&!this._isActive&&!this._currentSelection.isEmpty()&&C.type===6&&C.position&&this._currentSelection.containsPosition(C.position)){this._mouseState.isDragAndDrop=!0,this._isActive=!0,this._mouseMoveMonitor.startMonitoring(this._viewHelper.viewLinesDomNode,u,r.buttons,h=>this._onMouseDownThenMove(h),h=>{const v=this._findMousePosition(this._lastMouseEvent,!1);d.isKeyboardEvent(h)?this._viewController.emitMouseDropCanceled():this._viewController.emitMouseDrop({event:this._lastMouseEvent,target:v?this._createMouseTarget(this._lastMouseEvent,!0):null}),this._stop()});return}this._mouseState.isDragAndDrop=!1,this._dispatchMouse(C,r.shiftKey,1),this._isActive||(this._isActive=!0,this._mouseMoveMonitor.startMonitoring(this._viewHelper.viewLinesDomNode,u,r.buttons,h=>this._onMouseDownThenMove(h),()=>this._stop()))}_stop(){this._isActive=!1,this._topBottomDragScrolling.stop()}onHeightChanged(){this._mouseMoveMonitor.stopMonitoring()}onPointerUp(){this._mouseMoveMonitor.stopMonitoring()}onCursorStateChanged(a){this._currentSelection=a.selections[0]}_getPositionOutsideEditor(a){const r=a.editorPos,u=this._context.viewModel,C=this._context.viewLayout,f=this._getMouseColumn(a);if(a.posyr.y+r.height){const v=a.posy-r.y-r.height,w=C.getCurrentScrollTop()+a.relativePos.y,S=y.HitTestContext.getZoneAtCoord(this._context,w);if(S){const D=this._helpPositionJumpOverViewZone(S);if(D)return y.MouseTarget.createOutsideEditor(f,D,"below",v)}const L=C.getLineNumberAtVerticalOffset(w);return y.MouseTarget.createOutsideEditor(f,new b.Position(L,u.getLineMaxColumn(L)),"below",v)}const h=C.getLineNumberAtVerticalOffset(C.getCurrentScrollTop()+a.relativePos.y);if(a.posxr.x+r.width){const v=a.posx-r.x-r.width;return y.MouseTarget.createOutsideEditor(f,new b.Position(h,u.getLineMaxColumn(h)),"right",v)}return null}_findMousePosition(a,r){const u=this._getPositionOutsideEditor(a);if(u)return u;const C=this._createMouseTarget(a,r);if(!C.position)return null;if(C.type===8||C.type===5){const h=this._helpPositionJumpOverViewZone(C.detail);if(h)return y.MouseTarget.createViewZone(C.type,C.element,C.mouseColumn,h,C.detail)}return C}_helpPositionJumpOverViewZone(a){const r=new b.Position(this._currentSelection.selectionStartLineNumber,this._currentSelection.selectionStartColumn),u=a.positionBefore,C=a.positionAfter;return u&&C?u.isBefore(r)?u:C:null}_dispatchMouse(a,r,u){a.position&&this._viewController.dispatchMouse({position:a.position,mouseColumn:a.mouseColumn,startedOnLineNumbers:this._mouseState.startedOnLineNumbers,revealType:u,inSelectionMode:r,mouseDownCount:this._mouseState.count,altKey:this._mouseState.altKey,ctrlKey:this._mouseState.ctrlKey,metaKey:this._mouseState.metaKey,shiftKey:this._mouseState.shiftKey,leftButton:this._mouseState.leftButton,middleButton:this._mouseState.middleButton,onInjectedText:a.type===6&&a.detail.injectedText!==null})}}class s extends I.Disposable{constructor(a,r,u,C){super(),this._context=a,this._viewHelper=r,this._mouseTargetFactory=u,this._dispatchMouse=C,this._operation=null}dispose(){super.dispose(),this.stop()}start(a,r){this._operation?this._operation.setPosition(a,r):this._operation=new g(this._context,this._viewHelper,this._mouseTargetFactory,this._dispatchMouse,a,r)}stop(){this._operation&&(this._operation.dispose(),this._operation=null)}}class g extends I.Disposable{constructor(a,r,u,C,f,h){super(),this._context=a,this._viewHelper=r,this._mouseTargetFactory=u,this._dispatchMouse=C,this._position=f,this._mouseEvent=h,this._lastTime=Date.now(),this._animationFrameDisposable=d.scheduleAtNextAnimationFrame(d.getWindow(h.browserEvent),()=>this._execute())}dispose(){this._animationFrameDisposable.dispose(),super.dispose()}setPosition(a,r){this._position=a,this._mouseEvent=r}_tick(){const a=Date.now(),r=a-this._lastTime;return this._lastTime=a,r}_getScrollSpeed(){const a=this._context.configuration.options.get(67),r=this._context.configuration.options.get(146).height/a,u=this._position.outsideDistance/a;return u<=1.5?Math.max(30,r*(1+u)):u<=3?Math.max(60,r*(2+u)):Math.max(200,r*(7+u))}_execute(){const a=this._context.configuration.options.get(67),r=this._getScrollSpeed(),u=this._tick(),C=r*(u/1e3)*a,f=this._position.outsidePosition==="above"?-C:C;this._context.viewModel.viewLayout.deltaScrollNow(0,f),this._viewHelper.renderNow();const h=this._context.viewLayout.getLinesViewportData(),v=this._position.outsidePosition==="above"?h.startLineNumber:h.endLineNumber;let w;{const S=(0,m.createEditorPagePosition)(this._viewHelper.viewDomNode),L=this._context.configuration.options.get(146).horizontalScrollbarHeight,D=new m.PageCoordinates(this._mouseEvent.pos.x,S.y+S.height-L-.1),T=(0,m.createCoordinatesRelativeToEditor)(this._viewHelper.viewDomNode,S,D);w=this._mouseTargetFactory.createMouseTarget(this._viewHelper.getLastRenderData(),S,D,T,null)}(!w.position||w.position.lineNumber!==v)&&(this._position.outsidePosition==="above"?w=y.MouseTarget.createOutsideEditor(this._position.mouseColumn,new b.Position(v,1),"above",this._position.outsideDistance):w=y.MouseTarget.createOutsideEditor(this._position.mouseColumn,new b.Position(v,this._context.viewModel.getLineMaxColumn(v)),"below",this._position.outsideDistance)),this._dispatchMouse(w,!0,2),this._animationFrameDisposable=d.scheduleAtNextAnimationFrame(d.getWindow(w.element),()=>this._execute())}}class c{static{this.CLEAR_MOUSE_DOWN_COUNT_TIME=400}get altKey(){return this._altKey}get ctrlKey(){return this._ctrlKey}get metaKey(){return this._metaKey}get shiftKey(){return this._shiftKey}get leftButton(){return this._leftButton}get middleButton(){return this._middleButton}get startedOnLineNumbers(){return this._startedOnLineNumbers}constructor(){this._altKey=!1,this._ctrlKey=!1,this._metaKey=!1,this._shiftKey=!1,this._leftButton=!1,this._middleButton=!1,this._startedOnLineNumbers=!1,this._lastMouseDownPosition=null,this._lastMouseDownPositionEqualCount=0,this._lastMouseDownCount=0,this._lastSetMouseDownCountTime=0,this.isDragAndDrop=!1}get count(){return this._lastMouseDownCount}setModifiers(a){this._altKey=a.altKey,this._ctrlKey=a.ctrlKey,this._metaKey=a.metaKey,this._shiftKey=a.shiftKey}setStartButtons(a){this._leftButton=a.leftButton,this._middleButton=a.middleButton}setStartedOnLineNumbers(a){this._startedOnLineNumbers=a}trySetCount(a,r){const u=new Date().getTime();u-this._lastSetMouseDownCountTime>c.CLEAR_MOUSE_DOWN_COUNT_TIME&&(a=1),this._lastSetMouseDownCountTime=u,a>this._lastMouseDownCount+1&&(a=this._lastMouseDownCount+1),this._lastMouseDownPosition&&this._lastMouseDownPosition.equals(r)?this._lastMouseDownPositionEqualCount++:this._lastMouseDownPositionEqualCount=1,this._lastMouseDownPosition=r,this._lastMouseDownCount=Math.min(a,this._lastMouseDownPositionEqualCount)}}}),define(ne[769],se([1,0,248,5,69,52,2,16,768,212,185]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PointerHandler=e.PointerEventHandler=void 0;class n extends _.MouseHandler{constructor(s,g,c){super(s,g,c),this._register(I.Gesture.addTarget(this.viewHelper.linesContentDomNode)),this._register(k.addDisposableListener(this.viewHelper.linesContentDomNode,I.EventType.Tap,a=>this.onTap(a))),this._register(k.addDisposableListener(this.viewHelper.linesContentDomNode,I.EventType.Change,a=>this.onChange(a))),this._register(k.addDisposableListener(this.viewHelper.linesContentDomNode,I.EventType.Contextmenu,a=>this._onContextMenu(new p.EditorMouseEvent(a,!1,this.viewHelper.viewDomNode),!1))),this._lastPointerType="mouse",this._register(k.addDisposableListener(this.viewHelper.linesContentDomNode,"pointerdown",a=>{const r=a.pointerType;if(r==="mouse"){this._lastPointerType="mouse";return}else r==="touch"?this._lastPointerType="touch":this._lastPointerType="pen"}));const l=new p.EditorPointerEventFactory(this.viewHelper.viewDomNode);this._register(l.onPointerMove(this.viewHelper.viewDomNode,a=>this._onMouseMove(a))),this._register(l.onPointerUp(this.viewHelper.viewDomNode,a=>this._onMouseUp(a))),this._register(l.onPointerLeave(this.viewHelper.viewDomNode,a=>this._onMouseLeave(a))),this._register(l.onPointerDown(this.viewHelper.viewDomNode,(a,r)=>this._onMouseDown(a,r)))}onTap(s){!s.initialTarget||!this.viewHelper.linesContentDomNode.contains(s.initialTarget)||(s.preventDefault(),this.viewHelper.focusTextArea(),this._dispatchGesture(s,!1))}onChange(s){this._lastPointerType==="touch"&&this._context.viewModel.viewLayout.deltaScrollNow(-s.translationX,-s.translationY),this._lastPointerType==="pen"&&this._dispatchGesture(s,!0)}_dispatchGesture(s,g){const c=this._createMouseTarget(new p.EditorMouseEvent(s,!1,this.viewHelper.viewDomNode),!1);c.position&&this.viewController.dispatchMouse({position:c.position,mouseColumn:c.position.column,startedOnLineNumbers:!1,revealType:1,mouseDownCount:s.tapCount,inSelectionMode:g,altKey:!1,ctrlKey:!1,metaKey:!1,shiftKey:!1,leftButton:!1,middleButton:!1,onInjectedText:c.type===6&&c.detail.injectedText!==null})}_onMouseDown(s,g){s.browserEvent.pointerType!=="touch"&&super._onMouseDown(s,g)}}e.PointerEventHandler=n;class o extends _.MouseHandler{constructor(s,g,c){super(s,g,c),this._register(I.Gesture.addTarget(this.viewHelper.linesContentDomNode)),this._register(k.addDisposableListener(this.viewHelper.linesContentDomNode,I.EventType.Tap,l=>this.onTap(l))),this._register(k.addDisposableListener(this.viewHelper.linesContentDomNode,I.EventType.Change,l=>this.onChange(l))),this._register(k.addDisposableListener(this.viewHelper.linesContentDomNode,I.EventType.Contextmenu,l=>this._onContextMenu(new p.EditorMouseEvent(l,!1,this.viewHelper.viewDomNode),!1)))}onTap(s){s.preventDefault(),this.viewHelper.focusTextArea();const g=this._createMouseTarget(new p.EditorMouseEvent(s,!1,this.viewHelper.viewDomNode),!1);if(g.position){const c=document.createEvent("CustomEvent");c.initEvent(b.TextAreaSyntethicEvents.Tap,!1,!0),this.viewHelper.dispatchTextAreaEvent(c),this.viewController.moveTo(g.position,1)}}onChange(s){this._context.viewModel.viewLayout.deltaScrollNow(-s.translationX,-s.translationY)}}class t extends y.Disposable{constructor(s,g,c){super(),(m.isIOS||m.isAndroid&&m.isMobile)&&d.BrowserFeatures.pointerEvents?this.handler=this._register(new n(s,g,c)):E.mainWindow.TouchEvent?this.handler=this._register(new o(s,g,c)):this.handler=this._register(new _.MouseHandler(s,g,c))}getTargetAtClientPoint(s,g){return this.handler.getTargetAtClientPoint(s,g)}}e.PointerHandler=t}),define(ne[770],se([1,0,226,14,16,74,164,262,56,547,281,9,4,487]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewLines=void 0;class t{constructor(){this._currentVisibleRange=new o.Range(1,1,1,1)}getCurrentVisibleRange(){return this._currentVisibleRange}setCurrentVisibleRange(l){this._currentVisibleRange=l}}class i{constructor(l,a,r,u,C,f,h){this.minimalReveal=l,this.lineNumber=a,this.startColumn=r,this.endColumn=u,this.startScrollTop=C,this.stopScrollTop=f,this.scrollType=h,this.type="range",this.minLineNumber=a,this.maxLineNumber=a}}class s{constructor(l,a,r,u,C){this.minimalReveal=l,this.selections=a,this.startScrollTop=r,this.stopScrollTop=u,this.scrollType=C,this.type="selections";let f=a[0].startLineNumber,h=a[0].endLineNumber;for(let v=1,w=a.length;vnew p.ViewLine(this._viewLineOptions)}),this.domNode=this._visibleLines.domNode,_.PartFingerprints.write(this.domNode,8),this.domNode.setClassName(`view-lines ${d.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`),(0,E.applyFontInfo)(this.domNode,C),this._maxLineWidth=0,this._asyncUpdateLineWidths=new k.RunOnceScheduler(()=>{this._updateLineWidthsSlow()},200),this._asyncCheckMonospaceFontAssumptions=new k.RunOnceScheduler(()=>{this._checkMonospaceFontAssumptions()},2e3),this._lastRenderedData=new t,this._horizontalRevealRequest=null,this._stickyScrollEnabled=u.get(116).enabled,this._maxNumberStickyLines=u.get(116).maxLineCount}dispose(){this._asyncUpdateLineWidths.dispose(),this._asyncCheckMonospaceFontAssumptions.dispose(),super.dispose()}getDomNode(){return this.domNode}onConfigurationChanged(l){this._visibleLines.onConfigurationChanged(l),l.hasChanged(147)&&(this._maxLineWidth=0);const a=this._context.configuration.options,r=a.get(50),u=a.get(147);return this._lineHeight=a.get(67),this._typicalHalfwidthCharacterWidth=r.typicalHalfwidthCharacterWidth,this._isViewportWrapping=u.isViewportWrapping,this._revealHorizontalRightPadding=a.get(101),this._cursorSurroundingLines=a.get(29),this._cursorSurroundingLinesStyle=a.get(30),this._canUseLayerHinting=!a.get(32),this._stickyScrollEnabled=a.get(116).enabled,this._maxNumberStickyLines=a.get(116).maxLineCount,(0,E.applyFontInfo)(this.domNode,r),this._onOptionsMaybeChanged(),l.hasChanged(146)&&(this._maxLineWidth=0),!0}_onOptionsMaybeChanged(){const l=this._context.configuration,a=new p.ViewLineOptions(l,this._context.theme.type);if(!this._viewLineOptions.equals(a)){this._viewLineOptions=a;const r=this._visibleLines.getStartLineNumber(),u=this._visibleLines.getEndLineNumber();for(let C=r;C<=u;C++)this._visibleLines.getVisibleLine(C).onOptionsChanged(this._viewLineOptions);return!0}return!1}onCursorStateChanged(l){const a=this._visibleLines.getStartLineNumber(),r=this._visibleLines.getEndLineNumber();let u=!1;for(let C=a;C<=r;C++)u=this._visibleLines.getVisibleLine(C).onSelectionChanged()||u;return u}onDecorationsChanged(l){{const a=this._visibleLines.getStartLineNumber(),r=this._visibleLines.getEndLineNumber();for(let u=a;u<=r;u++)this._visibleLines.getVisibleLine(u).onDecorationsChanged()}return!0}onFlushed(l){const a=this._visibleLines.onFlushed(l);return this._maxLineWidth=0,a}onLinesChanged(l){return this._visibleLines.onLinesChanged(l)}onLinesDeleted(l){return this._visibleLines.onLinesDeleted(l)}onLinesInserted(l){return this._visibleLines.onLinesInserted(l)}onRevealRangeRequest(l){const a=this._computeScrollTopToRevealRange(this._context.viewLayout.getFutureViewport(),l.source,l.minimalReveal,l.range,l.selections,l.verticalType);if(a===-1)return!1;let r=this._context.viewLayout.validateScrollPosition({scrollTop:a});l.revealHorizontal?l.range&&l.range.startLineNumber!==l.range.endLineNumber?r={scrollTop:r.scrollTop,scrollLeft:0}:l.range?this._horizontalRevealRequest=new i(l.minimalReveal,l.range.startLineNumber,l.range.startColumn,l.range.endColumn,this._context.viewLayout.getCurrentScrollTop(),r.scrollTop,l.scrollType):l.selections&&l.selections.length>0&&(this._horizontalRevealRequest=new s(l.minimalReveal,l.selections,this._context.viewLayout.getCurrentScrollTop(),r.scrollTop,l.scrollType)):this._horizontalRevealRequest=null;const C=Math.abs(this._context.viewLayout.getCurrentScrollTop()-r.scrollTop)<=this._lineHeight?1:l.scrollType;return this._context.viewModel.viewLayout.setScrollPosition(r,C),!0}onScrollChanged(l){if(this._horizontalRevealRequest&&l.scrollLeftChanged&&(this._horizontalRevealRequest=null),this._horizontalRevealRequest&&l.scrollTopChanged){const a=Math.min(this._horizontalRevealRequest.startScrollTop,this._horizontalRevealRequest.stopScrollTop),r=Math.max(this._horizontalRevealRequest.startScrollTop,this._horizontalRevealRequest.stopScrollTop);(l.scrollTopr)&&(this._horizontalRevealRequest=null)}return this.domNode.setWidth(l.scrollWidth),this._visibleLines.onScrollChanged(l)||!0}onTokensChanged(l){return this._visibleLines.onTokensChanged(l)}onZonesChanged(l){return this._context.viewModel.viewLayout.setMaxLineWidth(this._maxLineWidth),this._visibleLines.onZonesChanged(l)}onThemeChanged(l){return this._onOptionsMaybeChanged()}getPositionFromDOMInfo(l,a){const r=this._getViewLineDomNode(l);if(r===null)return null;const u=this._getLineNumberFor(r);if(u===-1||u<1||u>this._context.viewModel.getLineCount())return null;if(this._context.viewModel.getLineMaxColumn(u)===1)return new n.Position(u,1);const C=this._visibleLines.getStartLineNumber(),f=this._visibleLines.getEndLineNumber();if(uf)return null;let h=this._visibleLines.getVisibleLine(u).getColumnOfNodeOffset(l,a);const v=this._context.viewModel.getLineMinColumn(u);return hr)return-1;const u=new b.DomReadingContext(this.domNode.domNode,this._textRangeRestingSpot),C=this._visibleLines.getVisibleLine(l).getWidth(u);return this._updateLineWidthsSlowIfDomDidLayout(u),C}linesVisibleRangesForRange(l,a){if(this.shouldRender())return null;const r=l.endLineNumber,u=o.Range.intersectRanges(l,this._lastRenderedData.getCurrentVisibleRange());if(!u)return null;const C=[];let f=0;const h=new b.DomReadingContext(this.domNode.domNode,this._textRangeRestingSpot);let v=0;a&&(v=this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new n.Position(u.startLineNumber,1)).lineNumber);const w=this._visibleLines.getStartLineNumber(),S=this._visibleLines.getEndLineNumber();for(let L=u.startLineNumber;L<=u.endLineNumber;L++){if(LS)continue;const D=L===u.startLineNumber?u.startColumn:1,T=L!==u.endLineNumber,M=T?this._context.viewModel.getLineMaxColumn(L):u.endColumn,A=this._visibleLines.getVisibleLine(L).getVisibleRangesForRange(L,D,M,h);if(A){if(a&&Lthis._visibleLines.getEndLineNumber())return null;const u=new b.DomReadingContext(this.domNode.domNode,this._textRangeRestingSpot),C=this._visibleLines.getVisibleLine(l).getVisibleRangesForRange(l,a,r,u);return this._updateLineWidthsSlowIfDomDidLayout(u),C}visibleRangeForPosition(l){const a=this._visibleRangesForLineRange(l.lineNumber,l.column,l.column);return a?new y.HorizontalPosition(a.outsideRenderedLine,a.ranges[0].left):null}_updateLineWidthsFast(){return this._updateLineWidths(!0)}_updateLineWidthsSlow(){this._updateLineWidths(!1)}_updateLineWidthsSlowIfDomDidLayout(l){l.didDomLayout&&(this._asyncUpdateLineWidths.isScheduled()||(this._asyncUpdateLineWidths.cancel(),this._updateLineWidthsSlow()))}_updateLineWidths(l){const a=this._visibleLines.getStartLineNumber(),r=this._visibleLines.getEndLineNumber();let u=1,C=!0;for(let f=a;f<=r;f++){const h=this._visibleLines.getVisibleLine(f);if(l&&!h.getWidthIsFast()){C=!1;continue}u=Math.max(u,h.getWidth(null))}return C&&a===1&&r===this._context.viewModel.getLineCount()&&(this._maxLineWidth=0),this._ensureMaxLineWidth(u),C}_checkMonospaceFontAssumptions(){let l=-1,a=-1;const r=this._visibleLines.getStartLineNumber(),u=this._visibleLines.getEndLineNumber();for(let C=r;C<=u;C++){const f=this._visibleLines.getVisibleLine(C);if(f.needsMonospaceFontCheck()){const h=f.getWidth(null);h>a&&(a=h,l=C)}}if(l!==-1&&!this._visibleLines.getVisibleLine(l).monospaceAssumptionsAreValid())for(let C=r;C<=u;C++)this._visibleLines.getVisibleLine(C).onMonospaceAssumptionsInvalidated()}prepareRender(){throw new Error("Not supported")}render(){throw new Error("Not supported")}renderText(l){if(this._visibleLines.renderLines(l),this._lastRenderedData.setCurrentVisibleRange(l.visibleRange),this.domNode.setWidth(this._context.viewLayout.getScrollWidth()),this.domNode.setHeight(Math.min(this._context.viewLayout.getScrollHeight(),1e6)),this._horizontalRevealRequest){const r=this._horizontalRevealRequest;if(l.startLineNumber<=r.minLineNumber&&r.maxLineNumber<=l.endLineNumber){this._horizontalRevealRequest=null,this.onDidRender();const u=this._computeScrollLeftToReveal(r);u&&(this._isViewportWrapping||this._ensureMaxLineWidth(u.maxHorizontalOffset),this._context.viewModel.viewLayout.setScrollPosition({scrollLeft:u.scrollLeft},r.scrollType))}}if(this._updateLineWidthsFast()?this._asyncUpdateLineWidths.cancel():this._asyncUpdateLineWidths.schedule(),I.isLinux&&!this._asyncCheckMonospaceFontAssumptions.isScheduled()){const r=this._visibleLines.getStartLineNumber(),u=this._visibleLines.getEndLineNumber();for(let C=r;C<=u;C++)if(this._visibleLines.getVisibleLine(C).needsMonospaceFontCheck()){this._asyncCheckMonospaceFontAssumptions.schedule();break}}this._linesContent.setLayerHinting(this._canUseLayerHinting),this._linesContent.setContain("strict");const a=this._context.viewLayout.getCurrentScrollTop()-l.bigNumbersDelta;this._linesContent.setTop(-a),this._linesContent.setLeft(-this._context.viewLayout.getCurrentScrollLeft())}_ensureMaxLineWidth(l){const a=Math.ceil(l);this._maxLineWidth0){let N=C[0].startLineNumber,O=C[0].endLineNumber;for(let F=1,x=C.length;Fv){if(!S)return-1;P=L}else if(f===5||f===6)if(f===6&&h<=L&&D<=w)P=h;else{const N=Math.max(5*this._lineHeight,v*.2),O=L-N,F=D-v;P=Math.max(F,O)}else if(f===1||f===2)if(f===2&&h<=L&&D<=w)P=h;else{const N=(L+D)/2;P=Math.max(0,N-v/2)}else P=this._computeMinimumScrolling(h,w,L,D,f===3,f===4);return P}_computeScrollLeftToReveal(l){const a=this._context.viewLayout.getCurrentViewport(),r=this._context.configuration.options.get(146),u=a.left,C=u+a.width-r.verticalScrollbarWidth;let f=1073741824,h=0;if(l.type==="range"){const w=this._visibleRangesForLineRange(l.lineNumber,l.startColumn,l.endColumn);if(!w)return null;for(const S of w.ranges)f=Math.min(f,Math.round(S.left)),h=Math.max(h,Math.round(S.left+S.width))}else for(const w of l.selections){if(w.startLineNumber!==w.endLineNumber)return null;const S=this._visibleRangesForLineRange(w.startLineNumber,w.startColumn,w.endColumn);if(!S)return null;for(const L of S.ranges)f=Math.min(f,Math.round(L.left)),h=Math.max(h,Math.round(L.left+L.width))}return l.minimalReveal||(f=Math.max(0,f-g.HORIZONTAL_EXTRA_PX),h+=this._revealHorizontalRightPadding),l.type==="selections"&&h-f>a.width?null:{scrollLeft:this._computeMinimumScrolling(u,C,f,h),maxHorizontalOffset:h}}_computeMinimumScrolling(l,a,r,u,C,f){l=l|0,a=a|0,r=r|0,u=u|0,C=!!C,f=!!f;const h=a-l;if(u-ra)return Math.max(0,u-h)}else return r;return l}}e.ViewLines=g}),define(ne[25],se([1,0,6,2,7,38,97]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Themable=e.Extensions=e.IThemeService=void 0,e.themeColorFromId=m,e.getThemeTypeSelector=_,e.registerThemingParticipant=n,e.IThemeService=(0,I.createDecorator)("themeService");function m(t){return{id:t}}function _(t){switch(t){case y.ColorScheme.DARK:return"vs-dark";case y.ColorScheme.HIGH_CONTRAST_DARK:return"hc-black";case y.ColorScheme.HIGH_CONTRAST_LIGHT:return"hc-light";default:return"vs"}}e.Extensions={ThemingContribution:"base.contributions.theming"};class b{constructor(){this.themingParticipants=[],this.themingParticipants=[],this.onThemingParticipantAddedEmitter=new d.Emitter}onColorThemeChange(i){return this.themingParticipants.push(i),this.onThemingParticipantAddedEmitter.fire(i),(0,k.toDisposable)(()=>{const s=this.themingParticipants.indexOf(i);this.themingParticipants.splice(s,1)})}getThemingParticipants(){return this.themingParticipants}}const p=new b;E.Registry.add(e.Extensions.ThemingContribution,p);function n(t){return p.onColorThemeChange(t)}class o extends k.Disposable{constructor(i){super(),this.themeService=i,this.theme=i.getColorTheme(),this._register(this.themeService.onDidColorThemeChange(s=>this.onThemeChange(s)))}onThemeChange(i){this.theme=i,this.updateStyles()}updateStyles(){}}e.Themable=o}),define(ne[771],se([1,0,6,2,73,25]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GlobalStyleSheet=e.AbstractCodeEditorService=void 0;let y=class extends k.Disposable{constructor(b){super(),this._themeService=b,this._onWillCreateCodeEditor=this._register(new d.Emitter),this._onCodeEditorAdd=this._register(new d.Emitter),this.onCodeEditorAdd=this._onCodeEditorAdd.event,this._onCodeEditorRemove=this._register(new d.Emitter),this.onCodeEditorRemove=this._onCodeEditorRemove.event,this._onWillCreateDiffEditor=this._register(new d.Emitter),this._onDiffEditorAdd=this._register(new d.Emitter),this.onDiffEditorAdd=this._onDiffEditorAdd.event,this._onDiffEditorRemove=this._register(new d.Emitter),this.onDiffEditorRemove=this._onDiffEditorRemove.event,this._decorationOptionProviders=new Map,this._codeEditorOpenHandlers=new I.LinkedList,this._modelProperties=new Map,this._codeEditors=Object.create(null),this._diffEditors=Object.create(null),this._globalStyleSheet=null}willCreateCodeEditor(){this._onWillCreateCodeEditor.fire()}addCodeEditor(b){this._codeEditors[b.getId()]=b,this._onCodeEditorAdd.fire(b)}removeCodeEditor(b){delete this._codeEditors[b.getId()]&&this._onCodeEditorRemove.fire(b)}listCodeEditors(){return Object.keys(this._codeEditors).map(b=>this._codeEditors[b])}willCreateDiffEditor(){this._onWillCreateDiffEditor.fire()}addDiffEditor(b){this._diffEditors[b.getId()]=b,this._onDiffEditorAdd.fire(b)}listDiffEditors(){return Object.keys(this._diffEditors).map(b=>this._diffEditors[b])}getFocusedCodeEditor(){let b=null;const p=this.listCodeEditors();for(const n of p){if(n.hasTextFocus())return n;n.hasWidgetFocus()&&(b=n)}return b}removeDecorationType(b){const p=this._decorationOptionProviders.get(b);p&&(p.refCount--,p.refCount<=0&&(this._decorationOptionProviders.delete(b),p.dispose(),this.listCodeEditors().forEach(n=>n.removeDecorationsByType(b))))}setModelProperty(b,p,n){const o=b.toString();let t;this._modelProperties.has(o)?t=this._modelProperties.get(o):(t=new Map,this._modelProperties.set(o,t)),t.set(p,n)}getModelProperty(b,p){const n=b.toString();if(this._modelProperties.has(n))return this._modelProperties.get(n).get(p)}async openCodeEditor(b,p,n){for(const o of this._codeEditorOpenHandlers){const t=await o(b,p,n);if(t!==null)return t}return null}registerCodeEditorOpenHandler(b){const p=this._codeEditorOpenHandlers.unshift(b);return(0,k.toDisposable)(p)}};e.AbstractCodeEditorService=y,e.AbstractCodeEditorService=y=ke([ce(0,E.IThemeService)],y);class m{constructor(b){this._styleSheet=b}}e.GlobalStyleSheet=m}),define(ne[772],se([1,0,49,25,32,118,58,7,705,2,5,31,47,61,119,52,395,648,14]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HoverService=void 0;let a=class extends b.Disposable{constructor(h,v,w,S,L){super(),this._instantiationService=h,this._keybindingService=w,this._layoutService=S,this._accessibilityService=L,this._managedHovers=new Map,v.onDidShowContextMenu(()=>this.hideHover()),this._contextViewHandler=this._register(new g.ContextViewHandler(this._layoutService))}showHover(h,v,w){if(r(this._currentHoverOptions)===r(h)||this._currentHover&&this._currentHoverOptions?.persistence?.sticky)return;this._currentHoverOptions=h,this._lastHoverOptions=h;const S=h.trapFocus||this._accessibilityService.isScreenReaderOptimized(),L=(0,p.getActiveElement)();w||(S&&L?L.classList.contains("monaco-hover")||(this._lastFocusedElementBeforeOpen=L):this._lastFocusedElementBeforeOpen=void 0);const D=new b.DisposableStore,T=this._instantiationService.createInstance(_.HoverWidget,h);if(h.persistence?.sticky&&(T.isLocked=!0),T.onDispose(()=>{this._currentHover?.domNode&&(0,p.isAncestorOfActiveElement)(this._currentHover.domNode)&&this._lastFocusedElementBeforeOpen?.focus(),this._currentHoverOptions===h&&(this._currentHoverOptions=void 0),D.dispose()},void 0,D),!h.container){const M=(0,p.isHTMLElement)(h.target)?h.target:h.target.targetElements[0];h.container=this._layoutService.getContainer((0,p.getWindow)(M))}if(this._contextViewHandler.showContextView(new u(T,v),h.container),T.onRequestLayout(()=>this._contextViewHandler.layout(),void 0,D),h.persistence?.sticky)D.add((0,p.addDisposableListener)((0,p.getWindow)(h.container).document,p.EventType.MOUSE_DOWN,M=>{(0,p.isAncestor)(M.target,T.domNode)||this.doHideHover()}));else{if("targetElements"in h.target)for(const A of h.target.targetElements)D.add((0,p.addDisposableListener)(A,p.EventType.CLICK,()=>this.hideHover()));else D.add((0,p.addDisposableListener)(h.target,p.EventType.CLICK,()=>this.hideHover()));const M=(0,p.getActiveElement)();if(M){const A=(0,p.getWindow)(M).document;D.add((0,p.addDisposableListener)(M,p.EventType.KEY_DOWN,P=>this._keyDown(P,T,!!h.persistence?.hideOnKeyDown))),D.add((0,p.addDisposableListener)(A,p.EventType.KEY_DOWN,P=>this._keyDown(P,T,!!h.persistence?.hideOnKeyDown))),D.add((0,p.addDisposableListener)(M,p.EventType.KEY_UP,P=>this._keyUp(P,T))),D.add((0,p.addDisposableListener)(A,p.EventType.KEY_UP,P=>this._keyUp(P,T)))}}if("IntersectionObserver"in s.mainWindow){const M=new IntersectionObserver(P=>this._intersectionChange(P,T),{threshold:0}),A="targetElements"in h.target?h.target.targetElements[0]:h.target;M.observe(A),D.add((0,b.toDisposable)(()=>M.disconnect()))}return this._currentHover=T,T}hideHover(){this._currentHover?.isLocked||!this._currentHoverOptions||this.doHideHover()}doHideHover(){this._currentHover=void 0,this._currentHoverOptions=void 0,this._contextViewHandler.hideContextView()}_intersectionChange(h,v){h[h.length-1].isIntersecting||v.dispose()}showAndFocusLastHover(){this._lastHoverOptions&&this.showHover(this._lastHoverOptions,!0,!0)}_keyDown(h,v,w){if(h.key==="Alt"){v.isLocked=!0;return}const S=new o.StandardKeyboardEvent(h);this._keybindingService.resolveKeyboardEvent(S).getSingleModifierDispatchChords().some(D=>!!D)||this._keybindingService.softDispatch(S,S.target).kind!==0||w&&(!this._currentHoverOptions?.trapFocus||h.key!=="Tab")&&(this.hideHover(),this._lastFocusedElementBeforeOpen?.focus())}_keyUp(h,v){h.key==="Alt"&&(v.isLocked=!1,v.isMouseIn||(this.hideHover(),this._lastFocusedElementBeforeOpen?.focus()))}setupManagedHover(h,v,w,S){v.setAttribute("custom-hover","true"),v.title!==""&&(console.warn("HTML element already has a title attribute, which will conflict with the custom hover. Please remove the title attribute."),console.trace("Stack trace:",v.title),v.title="");let L,D;const T=(z,U)=>{const j=D!==void 0;z&&(D?.dispose(),D=void 0),U&&(L?.dispose(),L=void 0),j&&(h.onDidHideHover?.(),D=void 0)},M=(z,U,j,Y)=>new l.TimeoutTimer(async()=>{(!D||D.isDisposed)&&(D=new c.ManagedHoverWidget(h,j||v,z>0),await D.update(typeof w=="function"?w():w,U,{...S,trapFocus:Y}))},z);let A=!1;const P=(0,p.addDisposableListener)(v,p.EventType.MOUSE_DOWN,()=>{A=!0,T(!0,!0)},!0),N=(0,p.addDisposableListener)(v,p.EventType.MOUSE_UP,()=>{A=!1},!0),O=(0,p.addDisposableListener)(v,p.EventType.MOUSE_LEAVE,z=>{A=!1,T(!1,z.fromElement===v)},!0),F=z=>{if(L)return;const U=new b.DisposableStore,j={targetElements:[v],dispose:()=>{}};if(h.placement===void 0||h.placement==="mouse"){const Y=G=>{j.x=G.x+10,(0,p.isHTMLElement)(G.target)&&C(G.target,v)!==v&&T(!0,!0)};U.add((0,p.addDisposableListener)(v,p.EventType.MOUSE_MOVE,Y,!0))}L=U,!((0,p.isHTMLElement)(z.target)&&C(z.target,v)!==v)&&U.add(M(h.delay,!1,j))},x=(0,p.addDisposableListener)(v,p.EventType.MOUSE_OVER,F,!0),W=()=>{if(A||L)return;const z={targetElements:[v],dispose:()=>{}},U=new b.DisposableStore,j=()=>T(!0,!0);U.add((0,p.addDisposableListener)(v,p.EventType.BLUR,j,!0)),U.add(M(h.delay,!1,z)),L=U};let V;const q=v.tagName.toLowerCase();q!=="input"&&q!=="textarea"&&(V=(0,p.addDisposableListener)(v,p.EventType.FOCUS,W,!0));const H={show:z=>{T(!1,!0),M(0,z,void 0,z)},hide:()=>{T(!0,!0)},update:async(z,U)=>{w=z,await D?.update(w,void 0,U)},dispose:()=>{this._managedHovers.delete(v),x.dispose(),O.dispose(),P.dispose(),N.dispose(),V?.dispose(),T(!0,!0)}};return this._managedHovers.set(v,H),H}showManagedHover(h){const v=this._managedHovers.get(h);v&&v.show(!0)}dispose(){this._managedHovers.forEach(h=>h.dispose()),super.dispose()}};e.HoverService=a,e.HoverService=a=ke([ce(0,m.IInstantiationService),ce(1,y.IContextMenuService),ce(2,n.IKeybindingService),ce(3,i.ILayoutService),ce(4,t.IAccessibilityService)],a);function r(f){if(f!==void 0)return f?.id??f}class u{get anchorPosition(){return this._hover.anchor}constructor(h,v=!1){this._hover=h,this._focus=v,this.layer=1}render(h){return this._hover.render(h),this._focus&&this._hover.focus(),this._hover}getAnchor(){return{x:this._hover.x,y:this._hover.y}}layout(){this._hover.layout()}}function C(f,h){for(h=h??(0,p.getWindow)(f).document.body;!f.hasAttribute("custom-hover")&&f!==h;)f=f.parentElement;return f}(0,d.registerSingleton)(E.IHoverService,a,1),(0,k.registerThemingParticipant)((f,h)=>{const v=f.getColor(I.editorHoverBorder);v&&(h.addRule(`.monaco-workbench .workbench-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${v.transparent(.5)}; }`),h.addRule(`.monaco-workbench .workbench-hover hr { border-top: 1px solid ${v.transparent(.5)}; }`))})}),define(ne[773],se([1,0,5,39,86,56,25]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorScrollbar=void 0;class m extends E.ViewPart{constructor(b,p,n,o){super(b);const t=this._context.configuration.options,i=t.get(104),s=t.get(75),g=t.get(40),c=t.get(107),l={listenOnDomNode:n.domNode,className:"editor-scrollable "+(0,y.getThemeTypeSelector)(b.theme.type),useShadows:!1,lazyRender:!0,vertical:i.vertical,horizontal:i.horizontal,verticalHasArrows:i.verticalHasArrows,horizontalHasArrows:i.horizontalHasArrows,verticalScrollbarSize:i.verticalScrollbarSize,verticalSliderSize:i.verticalSliderSize,horizontalScrollbarSize:i.horizontalScrollbarSize,horizontalSliderSize:i.horizontalSliderSize,handleMouseWheel:i.handleMouseWheel,alwaysConsumeMouseWheel:i.alwaysConsumeMouseWheel,arrowSize:i.arrowSize,mouseWheelScrollSensitivity:s,fastScrollSensitivity:g,scrollPredominantAxis:c,scrollByPage:i.scrollByPage};this.scrollbar=this._register(new I.SmoothScrollableElement(p.domNode,l,this._context.viewLayout.getScrollable())),E.PartFingerprints.write(this.scrollbar.getDomNode(),6),this.scrollbarDomNode=(0,k.createFastDomNode)(this.scrollbar.getDomNode()),this.scrollbarDomNode.setPosition("absolute"),this._setLayout();const a=(r,u,C)=>{const f={};if(u){const h=r.scrollTop;h&&(f.scrollTop=this._context.viewLayout.getCurrentScrollTop()+h,r.scrollTop=0)}if(C){const h=r.scrollLeft;h&&(f.scrollLeft=this._context.viewLayout.getCurrentScrollLeft()+h,r.scrollLeft=0)}this._context.viewModel.viewLayout.setScrollPosition(f,1)};this._register(d.addDisposableListener(n.domNode,"scroll",r=>a(n.domNode,!0,!0))),this._register(d.addDisposableListener(p.domNode,"scroll",r=>a(p.domNode,!0,!1))),this._register(d.addDisposableListener(o.domNode,"scroll",r=>a(o.domNode,!0,!1))),this._register(d.addDisposableListener(this.scrollbarDomNode.domNode,"scroll",r=>a(this.scrollbarDomNode.domNode,!0,!1)))}dispose(){super.dispose()}_setLayout(){const b=this._context.configuration.options,p=b.get(146);this.scrollbarDomNode.setLeft(p.contentLeft),b.get(73).side==="right"?this.scrollbarDomNode.setWidth(p.contentWidth+p.minimap.minimapWidth):this.scrollbarDomNode.setWidth(p.contentWidth),this.scrollbarDomNode.setHeight(p.height)}getOverviewRulerLayoutInfo(){return this.scrollbar.getOverviewRulerLayoutInfo()}getDomNode(){return this.scrollbarDomNode}delegateVerticalScrollbarPointerDown(b){this.scrollbar.delegateVerticalScrollbarPointerDown(b)}delegateScrollFromMouseWheelEvent(b){this.scrollbar.delegateScrollFromMouseWheelEvent(b)}onConfigurationChanged(b){if(b.hasChanged(104)||b.hasChanged(75)||b.hasChanged(40)){const p=this._context.configuration.options,n=p.get(104),o=p.get(75),t=p.get(40),i=p.get(107),s={vertical:n.vertical,horizontal:n.horizontal,verticalScrollbarSize:n.verticalScrollbarSize,horizontalScrollbarSize:n.horizontalScrollbarSize,scrollByPage:n.scrollByPage,handleMouseWheel:n.handleMouseWheel,mouseWheelScrollSensitivity:o,fastScrollSensitivity:t,scrollPredominantAxis:i};this.scrollbar.updateOptions(s)}return b.hasChanged(146)&&this._setLayout(),!0}onScrollChanged(b){return!0}onThemeChanged(b){return this.scrollbar.updateClassName("editor-scrollable "+(0,y.getThemeTypeSelector)(this._context.theme.type)),!0}prepareRender(b){}render(b){this.scrollbar.renderNow()}}e.EditorScrollbar=m}),define(ne[774],se([1,0,133,32,25,495]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectionsOverlay=void 0;class E{constructor(o){this.left=o.left,this.width=o.width,this.startStyle=null,this.endStyle=null}}class y{constructor(o,t){this.lineNumber=o,this.ranges=t}}function m(n){return new E(n)}function _(n){return new y(n.lineNumber,n.ranges.map(m))}class b extends d.DynamicViewOverlay{static{this.SELECTION_CLASS_NAME="selected-text"}static{this.SELECTION_TOP_LEFT="top-left-radius"}static{this.SELECTION_BOTTOM_LEFT="bottom-left-radius"}static{this.SELECTION_TOP_RIGHT="top-right-radius"}static{this.SELECTION_BOTTOM_RIGHT="bottom-right-radius"}static{this.EDITOR_BACKGROUND_CLASS_NAME="monaco-editor-background"}static{this.ROUNDED_PIECE_WIDTH=10}constructor(o){super(),this._previousFrameVisibleRangesWithStyle=[],this._context=o;const t=this._context.configuration.options;this._roundedSelection=t.get(102),this._typicalHalfwidthCharacterWidth=t.get(50).typicalHalfwidthCharacterWidth,this._selections=[],this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(o){const t=this._context.configuration.options;return this._roundedSelection=t.get(102),this._typicalHalfwidthCharacterWidth=t.get(50).typicalHalfwidthCharacterWidth,!0}onCursorStateChanged(o){return this._selections=o.selections.slice(0),!0}onDecorationsChanged(o){return!0}onFlushed(o){return!0}onLinesChanged(o){return!0}onLinesDeleted(o){return!0}onLinesInserted(o){return!0}onScrollChanged(o){return o.scrollTopChanged}onZonesChanged(o){return!0}_visibleRangesHaveGaps(o){for(let t=0,i=o.length;t1)return!0;return!1}_enrichVisibleRangesWithStyle(o,t,i){const s=this._typicalHalfwidthCharacterWidth/4;let g=null,c=null;if(i&&i.length>0&&t.length>0){const l=t[0].lineNumber;if(l===o.startLineNumber)for(let r=0;!g&&r=0;r--)i[r].lineNumber===a&&(c=i[r].ranges[0]);g&&!g.startStyle&&(g=null),c&&!c.startStyle&&(c=null)}for(let l=0,a=t.length;l0){const v=t[l-1].ranges[0].left,w=t[l-1].ranges[0].left+t[l-1].ranges[0].width;p(u-v)v&&(f.top=1),p(C-w)'}_actualRenderOneSelection(o,t,i,s){if(s.length===0)return;const g=!!s[0].ranges[0].startStyle,c=s[0].lineNumber,l=s[s.length-1].lineNumber;for(let a=0,r=s.length;a1,r)}this._previousFrameVisibleRangesWithStyle=g,this._renderResult=t.map(([c,l])=>c+l)}render(o,t){if(!this._renderResult)return"";const i=t-o;return i<0||i>=this._renderResult.length?"":this._renderResult[i]}}e.SelectionsOverlay=b,(0,I.registerThemingParticipant)((n,o)=>{const t=n.getColor(k.editorSelectionForeground);t&&!t.isTransparent()&&o.addRule(`.monaco-editor .view-line span.inline-selected-text { color: ${t}; }`)});function p(n){return n<0?-n:n}}),define(ne[415],se([1,0,5,39,223,2,21,88,9,332,32,25]),function(oe,e,d,k,I,E,y,m,_,b,p,n){"use strict";var o;Object.defineProperty(e,"__esModule",{value:!0}),e.OverviewRulerFeature=void 0;let t=class extends E.Disposable{static{o=this}static{this.ONE_OVERVIEW_WIDTH=15}static{this.ENTIRE_DIFF_OVERVIEW_WIDTH=this.ONE_OVERVIEW_WIDTH*2}constructor(s,g,c,l,a,r,u){super(),this._editors=s,this._rootElement=g,this._diffModel=c,this._rootWidth=l,this._rootHeight=a,this._modifiedEditorLayoutInfo=r,this._themeService=u,this.width=o.ENTIRE_DIFF_OVERVIEW_WIDTH;const C=(0,y.observableFromEvent)(this._themeService.onDidColorThemeChange,()=>this._themeService.getColorTheme()),f=(0,y.derived)(w=>{const S=C.read(w),L=S.getColor(p.diffOverviewRulerInserted)||(S.getColor(p.diffInserted)||p.defaultInsertColor).transparent(2),D=S.getColor(p.diffOverviewRulerRemoved)||(S.getColor(p.diffRemoved)||p.defaultRemoveColor).transparent(2);return{insertColor:L,removeColor:D}}),h=(0,k.createFastDomNode)(document.createElement("div"));h.setClassName("diffViewport"),h.setPosition("absolute");const v=(0,d.h)("div.diffOverview",{style:{position:"absolute",top:"0px",width:o.ENTIRE_DIFF_OVERVIEW_WIDTH+"px"}}).root;this._register((0,m.appendRemoveOnDispose)(v,h.domNode)),this._register((0,d.addStandardDisposableListener)(v,d.EventType.POINTER_DOWN,w=>{this._editors.modified.delegateVerticalScrollbarPointerDown(w)})),this._register((0,d.addDisposableListener)(v,d.EventType.MOUSE_WHEEL,w=>{this._editors.modified.delegateScrollFromMouseWheelEvent(w)},{passive:!1})),this._register((0,m.appendRemoveOnDispose)(this._rootElement,v)),this._register((0,y.autorunWithStore)((w,S)=>{const L=this._diffModel.read(w),D=this._editors.original.createOverviewRuler("original diffOverviewRuler");D&&(S.add(D),S.add((0,m.appendRemoveOnDispose)(v,D.getDomNode())));const T=this._editors.modified.createOverviewRuler("modified diffOverviewRuler");if(T&&(S.add(T),S.add((0,m.appendRemoveOnDispose)(v,T.getDomNode()))),!D||!T)return;const M=(0,y.observableSignalFromEvent)("viewZoneChanged",this._editors.original.onDidChangeViewZones),A=(0,y.observableSignalFromEvent)("viewZoneChanged",this._editors.modified.onDidChangeViewZones),P=(0,y.observableSignalFromEvent)("hiddenRangesChanged",this._editors.original.onDidChangeHiddenAreas),N=(0,y.observableSignalFromEvent)("hiddenRangesChanged",this._editors.modified.onDidChangeHiddenAreas);S.add((0,y.autorun)(O=>{M.read(O),A.read(O),P.read(O),N.read(O);const F=f.read(O),x=L?.diff.read(O)?.mappings;function W(H,z,U){const j=U._getViewModel();return j?H.filter(Y=>Y.length>0).map(Y=>{const G=j.coordinatesConverter.convertModelPositionToViewPosition(new _.Position(Y.startLineNumber,1)),K=j.coordinatesConverter.convertModelPositionToViewPosition(new _.Position(Y.endLineNumberExclusive,1)),R=K.lineNumber-G.lineNumber;return new b.OverviewRulerZone(G.lineNumber,K.lineNumber,R,z.toString())}):[]}const V=W((x||[]).map(H=>H.lineRangeMapping.original),F.removeColor,this._editors.original),q=W((x||[]).map(H=>H.lineRangeMapping.modified),F.insertColor,this._editors.modified);D?.setZones(V),T?.setZones(q)})),S.add((0,y.autorun)(O=>{const F=this._rootHeight.read(O),x=this._rootWidth.read(O),W=this._modifiedEditorLayoutInfo.read(O);if(W){const V=o.ENTIRE_DIFF_OVERVIEW_WIDTH-2*o.ONE_OVERVIEW_WIDTH;D.setLayout({top:0,height:F,right:V+o.ONE_OVERVIEW_WIDTH,width:o.ONE_OVERVIEW_WIDTH}),T.setLayout({top:0,height:F,right:0,width:o.ONE_OVERVIEW_WIDTH});const q=this._editors.modifiedScrollTop.read(O),H=this._editors.modifiedScrollHeight.read(O),z=this._editors.modified.getOption(104),U=new I.ScrollbarState(z.verticalHasArrows?z.arrowSize:0,z.verticalScrollbarSize,0,W.height,H,q);h.setTop(U.getSliderPosition()),h.setHeight(U.getSliderSize())}else h.setTop(0),h.setHeight(0);v.style.height=F+"px",v.style.left=x-o.ENTIRE_DIFF_OVERVIEW_WIDTH+"px",h.setWidth(o.ENTIRE_DIFF_OVERVIEW_WIDTH)}))}))}};e.OverviewRulerFeature=t,e.OverviewRulerFeature=t=o=ke([ce(6,n.IThemeService)],t)}),define(ne[775],se([1,0,6,2,21,112,415,37,9,3,7,31]),function(oe,e,d,k,I,E,y,m,_,b,p,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffEditorEditors=void 0;let o=class extends k.Disposable{get onDidContentSizeChange(){return this._onDidContentSizeChange.event}constructor(i,s,g,c,l,a,r){super(),this.originalEditorElement=i,this.modifiedEditorElement=s,this._options=g,this._argCodeEditorWidgetOptions=c,this._createInnerEditor=l,this._instantiationService=a,this._keybindingService=r,this.original=this._register(this._createLeftHandSideEditor(this._options.editorOptions.get(),this._argCodeEditorWidgetOptions.originalEditor||{})),this.modified=this._register(this._createRightHandSideEditor(this._options.editorOptions.get(),this._argCodeEditorWidgetOptions.modifiedEditor||{})),this._onDidContentSizeChange=this._register(new d.Emitter),this.modifiedScrollTop=(0,I.observableFromEvent)(this,this.modified.onDidScrollChange,()=>this.modified.getScrollTop()),this.modifiedScrollHeight=(0,I.observableFromEvent)(this,this.modified.onDidScrollChange,()=>this.modified.getScrollHeight()),this.modifiedObs=(0,E.observableCodeEditor)(this.modified),this.originalObs=(0,E.observableCodeEditor)(this.original),this.modifiedModel=this.modifiedObs.model,this.modifiedSelections=(0,I.observableFromEvent)(this,this.modified.onDidChangeCursorSelection,()=>this.modified.getSelections()??[]),this.modifiedCursor=(0,I.derivedOpts)({owner:this,equalsFn:_.Position.equals},u=>this.modifiedSelections.read(u)[0]?.getPosition()??new _.Position(1,1)),this.originalCursor=(0,I.observableFromEvent)(this,this.original.onDidChangeCursorPosition,()=>this.original.getPosition()??new _.Position(1,1)),this._argCodeEditorWidgetOptions=null,this._register((0,I.autorunHandleChanges)({createEmptyChangeSummary:()=>({}),handleChange:(u,C)=>(u.didChange(g.editorOptions)&&Object.assign(C,u.change.changedOptions),!0)},(u,C)=>{g.editorOptions.read(u),this._options.renderSideBySide.read(u),this.modified.updateOptions(this._adjustOptionsForRightHandSide(u,C)),this.original.updateOptions(this._adjustOptionsForLeftHandSide(u,C))}))}_createLeftHandSideEditor(i,s){const g=this._adjustOptionsForLeftHandSide(void 0,i),c=this._constructInnerEditor(this._instantiationService,this.originalEditorElement,g,s);return c.setContextValue("isInDiffLeftEditor",!0),c}_createRightHandSideEditor(i,s){const g=this._adjustOptionsForRightHandSide(void 0,i),c=this._constructInnerEditor(this._instantiationService,this.modifiedEditorElement,g,s);return c.setContextValue("isInDiffRightEditor",!0),c}_constructInnerEditor(i,s,g,c){const l=this._createInnerEditor(i,s,g,c);return this._register(l.onDidContentSizeChange(a=>{const r=this.original.getContentWidth()+this.modified.getContentWidth()+y.OverviewRulerFeature.ENTIRE_DIFF_OVERVIEW_WIDTH,u=Math.max(this.modified.getContentHeight(),this.original.getContentHeight());this._onDidContentSizeChange.fire({contentHeight:u,contentWidth:r,contentHeightChanged:a.contentHeightChanged,contentWidthChanged:a.contentWidthChanged})})),l}_adjustOptionsForLeftHandSide(i,s){const g=this._adjustOptionsForSubEditor(s);return this._options.renderSideBySide.get()?(g.unicodeHighlight=this._options.editorOptions.get().unicodeHighlight||{},g.wordWrapOverride1=this._options.diffWordWrap.get()):(g.wordWrapOverride1="off",g.wordWrapOverride2="off",g.stickyScroll={enabled:!1},g.unicodeHighlight={nonBasicASCII:!1,ambiguousCharacters:!1,invisibleCharacters:!1}),g.glyphMargin=this._options.renderSideBySide.get(),s.originalAriaLabel&&(g.ariaLabel=s.originalAriaLabel),g.ariaLabel=this._updateAriaLabel(g.ariaLabel),g.readOnly=!this._options.originalEditable.get(),g.dropIntoEditor={enabled:!g.readOnly},g.extraEditorClassName="original-in-monaco-diff-editor",g}_adjustOptionsForRightHandSide(i,s){const g=this._adjustOptionsForSubEditor(s);return s.modifiedAriaLabel&&(g.ariaLabel=s.modifiedAriaLabel),g.ariaLabel=this._updateAriaLabel(g.ariaLabel),g.wordWrapOverride1=this._options.diffWordWrap.get(),g.revealHorizontalRightPadding=m.EditorOptions.revealHorizontalRightPadding.defaultValue+y.OverviewRulerFeature.ENTIRE_DIFF_OVERVIEW_WIDTH,g.scrollbar.verticalHasArrows=!1,g.extraEditorClassName="modified-in-monaco-diff-editor",g}_adjustOptionsForSubEditor(i){const s={...i,dimension:{height:0,width:0}};return s.inDiffEditor=!0,s.automaticLayout=!1,s.scrollbar={...s.scrollbar||{}},s.folding=!1,s.codeLens=this._options.diffCodeLens.get(),s.fixedOverflowWidgets=!0,s.minimap={...s.minimap||{}},s.minimap.enabled=!1,this._options.hideUnchangedRegions.get()?s.stickyScroll={enabled:!1}:s.stickyScroll=this._options.editorOptions.get().stickyScroll,s}_updateAriaLabel(i){i||(i="");const s=(0,b.localize)(98," use {0} to open the accessibility help.",this._keybindingService.lookupKeybinding("editor.action.accessibilityHelp")?.getAriaLabel());return this._options.accessibilityVerbose.get()?i+s:i?i.replaceAll(s,""):""}};e.DiffEditorEditors=o,e.DiffEditorEditors=o=ke([ce(5,p.IInstantiationService),ce(6,n.IKeybindingService)],o)}),define(ne[80],se([1,0,3,33,32,25]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.editorUnicodeHighlightBackground=e.editorUnicodeHighlightBorder=e.editorBracketPairGuideActiveBackground6=e.editorBracketPairGuideActiveBackground5=e.editorBracketPairGuideActiveBackground4=e.editorBracketPairGuideActiveBackground3=e.editorBracketPairGuideActiveBackground2=e.editorBracketPairGuideActiveBackground1=e.editorBracketPairGuideBackground6=e.editorBracketPairGuideBackground5=e.editorBracketPairGuideBackground4=e.editorBracketPairGuideBackground3=e.editorBracketPairGuideBackground2=e.editorBracketPairGuideBackground1=e.editorBracketHighlightingUnexpectedBracketForeground=e.editorBracketHighlightingForeground6=e.editorBracketHighlightingForeground5=e.editorBracketHighlightingForeground4=e.editorBracketHighlightingForeground3=e.editorBracketHighlightingForeground2=e.editorBracketHighlightingForeground1=e.overviewRulerInfo=e.overviewRulerWarning=e.overviewRulerError=e.overviewRulerRangeHighlight=e.ghostTextBackground=e.ghostTextForeground=e.ghostTextBorder=e.editorUnnecessaryCodeOpacity=e.editorUnnecessaryCodeBorder=e.editorGutter=e.editorOverviewRulerBackground=e.editorOverviewRulerBorder=e.editorBracketMatchBorder=e.editorBracketMatchBackground=e.editorCodeLensForeground=e.editorRuler=e.editorDimmedLineNumber=e.editorActiveLineNumber=e.editorActiveIndentGuide6=e.editorActiveIndentGuide5=e.editorActiveIndentGuide4=e.editorActiveIndentGuide3=e.editorActiveIndentGuide2=e.editorActiveIndentGuide1=e.editorIndentGuide6=e.editorIndentGuide5=e.editorIndentGuide4=e.editorIndentGuide3=e.editorIndentGuide2=e.editorIndentGuide1=e.deprecatedEditorActiveIndentGuides=e.deprecatedEditorIndentGuides=e.editorLineNumbers=e.editorWhitespaces=e.editorMultiCursorSecondaryBackground=e.editorMultiCursorSecondaryForeground=e.editorMultiCursorPrimaryBackground=e.editorMultiCursorPrimaryForeground=e.editorCursorBackground=e.editorCursorForeground=e.editorSymbolHighlightBorder=e.editorSymbolHighlight=e.editorRangeHighlightBorder=e.editorRangeHighlight=e.editorLineHighlightBorder=e.editorLineHighlight=void 0,e.editorLineHighlight=(0,I.registerColor)("editor.lineHighlightBackground",null,d.localize(551,"Background color for the highlight of line at the cursor position.")),e.editorLineHighlightBorder=(0,I.registerColor)("editor.lineHighlightBorder",{dark:"#282828",light:"#eeeeee",hcDark:"#f38518",hcLight:I.contrastBorder},d.localize(552,"Background color for the border around the line at the cursor position.")),e.editorRangeHighlight=(0,I.registerColor)("editor.rangeHighlightBackground",{dark:"#ffffff0b",light:"#fdff0033",hcDark:null,hcLight:null},d.localize(553,"Background color of highlighted ranges, like by quick open and find features. The color must not be opaque so as not to hide underlying decorations."),!0),e.editorRangeHighlightBorder=(0,I.registerColor)("editor.rangeHighlightBorder",{dark:null,light:null,hcDark:I.activeContrastBorder,hcLight:I.activeContrastBorder},d.localize(554,"Background color of the border around highlighted ranges.")),e.editorSymbolHighlight=(0,I.registerColor)("editor.symbolHighlightBackground",{dark:I.editorFindMatchHighlight,light:I.editorFindMatchHighlight,hcDark:null,hcLight:null},d.localize(555,"Background color of highlighted symbol, like for go to definition or go next/previous symbol. The color must not be opaque so as not to hide underlying decorations."),!0),e.editorSymbolHighlightBorder=(0,I.registerColor)("editor.symbolHighlightBorder",{dark:null,light:null,hcDark:I.activeContrastBorder,hcLight:I.activeContrastBorder},d.localize(556,"Background color of the border around highlighted symbols.")),e.editorCursorForeground=(0,I.registerColor)("editorCursor.foreground",{dark:"#AEAFAD",light:k.Color.black,hcDark:k.Color.white,hcLight:"#0F4A85"},d.localize(557,"Color of the editor cursor.")),e.editorCursorBackground=(0,I.registerColor)("editorCursor.background",null,d.localize(558,"The background color of the editor cursor. Allows customizing the color of a character overlapped by a block cursor.")),e.editorMultiCursorPrimaryForeground=(0,I.registerColor)("editorMultiCursor.primary.foreground",e.editorCursorForeground,d.localize(559,"Color of the primary editor cursor when multiple cursors are present.")),e.editorMultiCursorPrimaryBackground=(0,I.registerColor)("editorMultiCursor.primary.background",e.editorCursorBackground,d.localize(560,"The background color of the primary editor cursor when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.")),e.editorMultiCursorSecondaryForeground=(0,I.registerColor)("editorMultiCursor.secondary.foreground",e.editorCursorForeground,d.localize(561,"Color of secondary editor cursors when multiple cursors are present.")),e.editorMultiCursorSecondaryBackground=(0,I.registerColor)("editorMultiCursor.secondary.background",e.editorCursorBackground,d.localize(562,"The background color of secondary editor cursors when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.")),e.editorWhitespaces=(0,I.registerColor)("editorWhitespace.foreground",{dark:"#e3e4e229",light:"#33333333",hcDark:"#e3e4e229",hcLight:"#CCCCCC"},d.localize(563,"Color of whitespace characters in the editor.")),e.editorLineNumbers=(0,I.registerColor)("editorLineNumber.foreground",{dark:"#858585",light:"#237893",hcDark:k.Color.white,hcLight:"#292929"},d.localize(564,"Color of editor line numbers.")),e.deprecatedEditorIndentGuides=(0,I.registerColor)("editorIndentGuide.background",e.editorWhitespaces,d.localize(565,"Color of the editor indentation guides."),!1,d.localize(566,"'editorIndentGuide.background' is deprecated. Use 'editorIndentGuide.background1' instead.")),e.deprecatedEditorActiveIndentGuides=(0,I.registerColor)("editorIndentGuide.activeBackground",e.editorWhitespaces,d.localize(567,"Color of the active editor indentation guides."),!1,d.localize(568,"'editorIndentGuide.activeBackground' is deprecated. Use 'editorIndentGuide.activeBackground1' instead.")),e.editorIndentGuide1=(0,I.registerColor)("editorIndentGuide.background1",e.deprecatedEditorIndentGuides,d.localize(569,"Color of the editor indentation guides (1).")),e.editorIndentGuide2=(0,I.registerColor)("editorIndentGuide.background2","#00000000",d.localize(570,"Color of the editor indentation guides (2).")),e.editorIndentGuide3=(0,I.registerColor)("editorIndentGuide.background3","#00000000",d.localize(571,"Color of the editor indentation guides (3).")),e.editorIndentGuide4=(0,I.registerColor)("editorIndentGuide.background4","#00000000",d.localize(572,"Color of the editor indentation guides (4).")),e.editorIndentGuide5=(0,I.registerColor)("editorIndentGuide.background5","#00000000",d.localize(573,"Color of the editor indentation guides (5).")),e.editorIndentGuide6=(0,I.registerColor)("editorIndentGuide.background6","#00000000",d.localize(574,"Color of the editor indentation guides (6).")),e.editorActiveIndentGuide1=(0,I.registerColor)("editorIndentGuide.activeBackground1",e.deprecatedEditorActiveIndentGuides,d.localize(575,"Color of the active editor indentation guides (1).")),e.editorActiveIndentGuide2=(0,I.registerColor)("editorIndentGuide.activeBackground2","#00000000",d.localize(576,"Color of the active editor indentation guides (2).")),e.editorActiveIndentGuide3=(0,I.registerColor)("editorIndentGuide.activeBackground3","#00000000",d.localize(577,"Color of the active editor indentation guides (3).")),e.editorActiveIndentGuide4=(0,I.registerColor)("editorIndentGuide.activeBackground4","#00000000",d.localize(578,"Color of the active editor indentation guides (4).")),e.editorActiveIndentGuide5=(0,I.registerColor)("editorIndentGuide.activeBackground5","#00000000",d.localize(579,"Color of the active editor indentation guides (5).")),e.editorActiveIndentGuide6=(0,I.registerColor)("editorIndentGuide.activeBackground6","#00000000",d.localize(580,"Color of the active editor indentation guides (6)."));const y=(0,I.registerColor)("editorActiveLineNumber.foreground",{dark:"#c6c6c6",light:"#0B216F",hcDark:I.activeContrastBorder,hcLight:I.activeContrastBorder},d.localize(581,"Color of editor active line number"),!1,d.localize(582,"Id is deprecated. Use 'editorLineNumber.activeForeground' instead."));e.editorActiveLineNumber=(0,I.registerColor)("editorLineNumber.activeForeground",y,d.localize(583,"Color of editor active line number")),e.editorDimmedLineNumber=(0,I.registerColor)("editorLineNumber.dimmedForeground",null,d.localize(584,"Color of the final editor line when editor.renderFinalNewline is set to dimmed.")),e.editorRuler=(0,I.registerColor)("editorRuler.foreground",{dark:"#5A5A5A",light:k.Color.lightgrey,hcDark:k.Color.white,hcLight:"#292929"},d.localize(585,"Color of the editor rulers.")),e.editorCodeLensForeground=(0,I.registerColor)("editorCodeLens.foreground",{dark:"#999999",light:"#919191",hcDark:"#999999",hcLight:"#292929"},d.localize(586,"Foreground color of editor CodeLens")),e.editorBracketMatchBackground=(0,I.registerColor)("editorBracketMatch.background",{dark:"#0064001a",light:"#0064001a",hcDark:"#0064001a",hcLight:"#0000"},d.localize(587,"Background color behind matching brackets")),e.editorBracketMatchBorder=(0,I.registerColor)("editorBracketMatch.border",{dark:"#888",light:"#B9B9B9",hcDark:I.contrastBorder,hcLight:I.contrastBorder},d.localize(588,"Color for matching brackets boxes")),e.editorOverviewRulerBorder=(0,I.registerColor)("editorOverviewRuler.border",{dark:"#7f7f7f4d",light:"#7f7f7f4d",hcDark:"#7f7f7f4d",hcLight:"#666666"},d.localize(589,"Color of the overview ruler border.")),e.editorOverviewRulerBackground=(0,I.registerColor)("editorOverviewRuler.background",null,d.localize(590,"Background color of the editor overview ruler.")),e.editorGutter=(0,I.registerColor)("editorGutter.background",I.editorBackground,d.localize(591,"Background color of the editor gutter. The gutter contains the glyph margins and the line numbers.")),e.editorUnnecessaryCodeBorder=(0,I.registerColor)("editorUnnecessaryCode.border",{dark:null,light:null,hcDark:k.Color.fromHex("#fff").transparent(.8),hcLight:I.contrastBorder},d.localize(592,"Border color of unnecessary (unused) source code in the editor.")),e.editorUnnecessaryCodeOpacity=(0,I.registerColor)("editorUnnecessaryCode.opacity",{dark:k.Color.fromHex("#000a"),light:k.Color.fromHex("#0007"),hcDark:null,hcLight:null},d.localize(593,`Opacity of unnecessary (unused) source code in the editor. For example, "#000000c0" will render the code with 75% opacity. For high contrast themes, use the 'editorUnnecessaryCode.border' theme color to underline unnecessary code instead of fading it out.`)),e.ghostTextBorder=(0,I.registerColor)("editorGhostText.border",{dark:null,light:null,hcDark:k.Color.fromHex("#fff").transparent(.8),hcLight:k.Color.fromHex("#292929").transparent(.8)},d.localize(594,"Border color of ghost text in the editor.")),e.ghostTextForeground=(0,I.registerColor)("editorGhostText.foreground",{dark:k.Color.fromHex("#ffffff56"),light:k.Color.fromHex("#0007"),hcDark:null,hcLight:null},d.localize(595,"Foreground color of the ghost text in the editor.")),e.ghostTextBackground=(0,I.registerColor)("editorGhostText.background",null,d.localize(596,"Background color of the ghost text in the editor."));const m=new k.Color(new k.RGBA(0,122,204,.6));e.overviewRulerRangeHighlight=(0,I.registerColor)("editorOverviewRuler.rangeHighlightForeground",m,d.localize(597,"Overview ruler marker color for range highlights. The color must not be opaque so as not to hide underlying decorations."),!0),e.overviewRulerError=(0,I.registerColor)("editorOverviewRuler.errorForeground",{dark:new k.Color(new k.RGBA(255,18,18,.7)),light:new k.Color(new k.RGBA(255,18,18,.7)),hcDark:new k.Color(new k.RGBA(255,50,50,1)),hcLight:"#B5200D"},d.localize(598,"Overview ruler marker color for errors.")),e.overviewRulerWarning=(0,I.registerColor)("editorOverviewRuler.warningForeground",{dark:I.editorWarningForeground,light:I.editorWarningForeground,hcDark:I.editorWarningBorder,hcLight:I.editorWarningBorder},d.localize(599,"Overview ruler marker color for warnings.")),e.overviewRulerInfo=(0,I.registerColor)("editorOverviewRuler.infoForeground",{dark:I.editorInfoForeground,light:I.editorInfoForeground,hcDark:I.editorInfoBorder,hcLight:I.editorInfoBorder},d.localize(600,"Overview ruler marker color for infos.")),e.editorBracketHighlightingForeground1=(0,I.registerColor)("editorBracketHighlight.foreground1",{dark:"#FFD700",light:"#0431FAFF",hcDark:"#FFD700",hcLight:"#0431FAFF"},d.localize(601,"Foreground color of brackets (1). Requires enabling bracket pair colorization.")),e.editorBracketHighlightingForeground2=(0,I.registerColor)("editorBracketHighlight.foreground2",{dark:"#DA70D6",light:"#319331FF",hcDark:"#DA70D6",hcLight:"#319331FF"},d.localize(602,"Foreground color of brackets (2). Requires enabling bracket pair colorization.")),e.editorBracketHighlightingForeground3=(0,I.registerColor)("editorBracketHighlight.foreground3",{dark:"#179FFF",light:"#7B3814FF",hcDark:"#87CEFA",hcLight:"#7B3814FF"},d.localize(603,"Foreground color of brackets (3). Requires enabling bracket pair colorization.")),e.editorBracketHighlightingForeground4=(0,I.registerColor)("editorBracketHighlight.foreground4","#00000000",d.localize(604,"Foreground color of brackets (4). Requires enabling bracket pair colorization.")),e.editorBracketHighlightingForeground5=(0,I.registerColor)("editorBracketHighlight.foreground5","#00000000",d.localize(605,"Foreground color of brackets (5). Requires enabling bracket pair colorization.")),e.editorBracketHighlightingForeground6=(0,I.registerColor)("editorBracketHighlight.foreground6","#00000000",d.localize(606,"Foreground color of brackets (6). Requires enabling bracket pair colorization.")),e.editorBracketHighlightingUnexpectedBracketForeground=(0,I.registerColor)("editorBracketHighlight.unexpectedBracket.foreground",{dark:new k.Color(new k.RGBA(255,18,18,.8)),light:new k.Color(new k.RGBA(255,18,18,.8)),hcDark:"new Color(new RGBA(255, 50, 50, 1))",hcLight:"#B5200D"},d.localize(607,"Foreground color of unexpected brackets.")),e.editorBracketPairGuideBackground1=(0,I.registerColor)("editorBracketPairGuide.background1","#00000000",d.localize(608,"Background color of inactive bracket pair guides (1). Requires enabling bracket pair guides.")),e.editorBracketPairGuideBackground2=(0,I.registerColor)("editorBracketPairGuide.background2","#00000000",d.localize(609,"Background color of inactive bracket pair guides (2). Requires enabling bracket pair guides.")),e.editorBracketPairGuideBackground3=(0,I.registerColor)("editorBracketPairGuide.background3","#00000000",d.localize(610,"Background color of inactive bracket pair guides (3). Requires enabling bracket pair guides.")),e.editorBracketPairGuideBackground4=(0,I.registerColor)("editorBracketPairGuide.background4","#00000000",d.localize(611,"Background color of inactive bracket pair guides (4). Requires enabling bracket pair guides.")),e.editorBracketPairGuideBackground5=(0,I.registerColor)("editorBracketPairGuide.background5","#00000000",d.localize(612,"Background color of inactive bracket pair guides (5). Requires enabling bracket pair guides.")),e.editorBracketPairGuideBackground6=(0,I.registerColor)("editorBracketPairGuide.background6","#00000000",d.localize(613,"Background color of inactive bracket pair guides (6). Requires enabling bracket pair guides.")),e.editorBracketPairGuideActiveBackground1=(0,I.registerColor)("editorBracketPairGuide.activeBackground1","#00000000",d.localize(614,"Background color of active bracket pair guides (1). Requires enabling bracket pair guides.")),e.editorBracketPairGuideActiveBackground2=(0,I.registerColor)("editorBracketPairGuide.activeBackground2","#00000000",d.localize(615,"Background color of active bracket pair guides (2). Requires enabling bracket pair guides.")),e.editorBracketPairGuideActiveBackground3=(0,I.registerColor)("editorBracketPairGuide.activeBackground3","#00000000",d.localize(616,"Background color of active bracket pair guides (3). Requires enabling bracket pair guides.")),e.editorBracketPairGuideActiveBackground4=(0,I.registerColor)("editorBracketPairGuide.activeBackground4","#00000000",d.localize(617,"Background color of active bracket pair guides (4). Requires enabling bracket pair guides.")),e.editorBracketPairGuideActiveBackground5=(0,I.registerColor)("editorBracketPairGuide.activeBackground5","#00000000",d.localize(618,"Background color of active bracket pair guides (5). Requires enabling bracket pair guides.")),e.editorBracketPairGuideActiveBackground6=(0,I.registerColor)("editorBracketPairGuide.activeBackground6","#00000000",d.localize(619,"Background color of active bracket pair guides (6). Requires enabling bracket pair guides.")),e.editorUnicodeHighlightBorder=(0,I.registerColor)("editorUnicodeHighlight.border",I.editorWarningForeground,d.localize(620,"Border color used to highlight unicode characters.")),e.editorUnicodeHighlightBackground=(0,I.registerColor)("editorUnicodeHighlight.background",I.editorWarningBackground,d.localize(621,"Background color used to highlight unicode characters.")),(0,E.registerThemingParticipant)((_,b)=>{const p=_.getColor(I.editorBackground),n=_.getColor(e.editorLineHighlight),o=n&&!n.isTransparent()?n:p;o&&b.addRule(`.monaco-editor .inputarea.ime-input { background-color: ${o}; }`)})}),define(ne[776],se([1,0,133,80,13,25,23,97,9,482]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CurrentLineMarginHighlightOverlay=e.CurrentLineHighlightOverlay=e.AbstractLineHighlightOverlay=void 0;class b extends d.DynamicViewOverlay{constructor(t){super(),this._context=t;const i=this._context.configuration.options,s=i.get(146);this._renderLineHighlight=i.get(97),this._renderLineHighlightOnlyWhenFocus=i.get(98),this._wordWrap=s.isViewportWrapping,this._contentLeft=s.contentLeft,this._contentWidth=s.contentWidth,this._selectionIsEmpty=!0,this._focused=!1,this._cursorLineNumbers=[1],this._selections=[new y.Selection(1,1,1,1)],this._renderData=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),super.dispose()}_readFromSelections(){let t=!1;const i=new Set;for(const c of this._selections)i.add(c.positionLineNumber);const s=Array.from(i);s.sort((c,l)=>c-l),I.equals(this._cursorLineNumbers,s)||(this._cursorLineNumbers=s,t=!0);const g=this._selections.every(c=>c.isEmpty());return this._selectionIsEmpty!==g&&(this._selectionIsEmpty=g,t=!0),t}onThemeChanged(t){return this._readFromSelections()}onConfigurationChanged(t){const i=this._context.configuration.options,s=i.get(146);return this._renderLineHighlight=i.get(97),this._renderLineHighlightOnlyWhenFocus=i.get(98),this._wordWrap=s.isViewportWrapping,this._contentLeft=s.contentLeft,this._contentWidth=s.contentWidth,!0}onCursorStateChanged(t){return this._selections=t.selections,this._readFromSelections()}onFlushed(t){return!0}onLinesDeleted(t){return!0}onLinesInserted(t){return!0}onScrollChanged(t){return t.scrollWidthChanged||t.scrollTopChanged}onZonesChanged(t){return!0}onFocusChanged(t){return this._renderLineHighlightOnlyWhenFocus?(this._focused=t.isFocused,!0):!1}prepareRender(t){if(!this._shouldRenderThis()){this._renderData=null;return}const i=t.visibleRange.startLineNumber,s=t.visibleRange.endLineNumber,g=[];for(let l=i;l<=s;l++){const a=l-i;g[a]=""}if(this._wordWrap){const l=this._renderOne(t,!1);for(const a of this._cursorLineNumbers){const r=this._context.viewModel.coordinatesConverter,u=r.convertViewPositionToModelPosition(new _.Position(a,1)).lineNumber,C=r.convertModelPositionToViewPosition(new _.Position(u,1)).lineNumber,f=r.convertModelPositionToViewPosition(new _.Position(u,this._context.viewModel.model.getLineMaxColumn(u))).lineNumber,h=Math.max(C,i),v=Math.min(f,s);for(let w=h;w<=v;w++){const S=w-i;g[S]=l}}}const c=this._renderOne(t,!0);for(const l of this._cursorLineNumbers){if(ls)continue;const a=l-i;g[a]=c}this._renderData=g}render(t,i){if(!this._renderData)return"";const s=i-t;return s>=this._renderData.length?"":this._renderData[s]}_shouldRenderInMargin(){return(this._renderLineHighlight==="gutter"||this._renderLineHighlight==="all")&&(!this._renderLineHighlightOnlyWhenFocus||this._focused)}_shouldRenderInContent(){return(this._renderLineHighlight==="line"||this._renderLineHighlight==="all")&&this._selectionIsEmpty&&(!this._renderLineHighlightOnlyWhenFocus||this._focused)}}e.AbstractLineHighlightOverlay=b;class p extends b{_renderOne(t,i){return`
    `}_shouldRenderThis(){return this._shouldRenderInContent()}_shouldRenderOther(){return this._shouldRenderInMargin()}}e.CurrentLineHighlightOverlay=p;class n extends b{_renderOne(t,i){return`
    `}_shouldRenderThis(){return!0}_shouldRenderOther(){return this._shouldRenderInContent()}}e.CurrentLineMarginHighlightOverlay=n,(0,E.registerThemingParticipant)((o,t)=>{const i=o.getColor(k.editorLineHighlight);if(i&&(t.addRule(`.monaco-editor .view-overlays .current-line { background-color: ${i}; }`),t.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { background-color: ${i}; border: none; }`)),!i||i.isTransparent()||o.defines(k.editorLineHighlightBorder)){const s=o.getColor(k.editorLineHighlightBorder);s&&(t.addRule(`.monaco-editor .view-overlays .current-line-exact { border: 2px solid ${s}; }`),t.addRule(`.monaco-editor .margin-view-overlays .current-line-exact-margin { border: 2px solid ${s}; }`),(0,m.isHighContrast)(o.type)&&(t.addRule(".monaco-editor .view-overlays .current-line-exact { border-width: 1px; }"),t.addRule(".monaco-editor .margin-view-overlays .current-line-exact-margin { border-width: 1px; }")))}})}),define(ne[777],se([1,0,133,80,25,9,13,19,329,239,485]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IndentGuidesOverlay=void 0;class p extends d.DynamicViewOverlay{constructor(t){super(),this._context=t,this._primaryPosition=null;const i=this._context.configuration.options,s=i.get(147),g=i.get(50);this._spaceWidth=g.spaceWidth,this._maxIndentLeft=s.wrappingColumn===-1?-1:s.wrappingColumn*g.typicalHalfwidthCharacterWidth,this._bracketPairGuideOptions=i.get(16),this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(t){const i=this._context.configuration.options,s=i.get(147),g=i.get(50);return this._spaceWidth=g.spaceWidth,this._maxIndentLeft=s.wrappingColumn===-1?-1:s.wrappingColumn*g.typicalHalfwidthCharacterWidth,this._bracketPairGuideOptions=i.get(16),!0}onCursorStateChanged(t){const s=t.selections[0].getPosition();return this._primaryPosition?.equals(s)?!1:(this._primaryPosition=s,!0)}onDecorationsChanged(t){return!0}onFlushed(t){return!0}onLinesChanged(t){return!0}onLinesDeleted(t){return!0}onLinesInserted(t){return!0}onScrollChanged(t){return t.scrollTopChanged}onZonesChanged(t){return!0}onLanguageConfigurationChanged(t){return!0}prepareRender(t){if(!this._bracketPairGuideOptions.indentation&&this._bracketPairGuideOptions.bracketPairs===!1){this._renderResult=null;return}const i=t.visibleRange.startLineNumber,s=t.visibleRange.endLineNumber,g=t.scrollWidth,c=this._primaryPosition,l=this.getGuidesByLine(i,Math.min(s+1,this._context.viewModel.getLineCount()),c),a=[];for(let r=i;r<=s;r++){const u=r-i,C=l[u];let f="";const h=t.visibleRangeForPosition(new E.Position(r,1))?.left??0;for(const v of C){const w=v.column===-1?h+(v.visibleColumn-1)*this._spaceWidth:t.visibleRangeForPosition(new E.Position(r,v.column)).left;if(w>g||this._maxIndentLeft>0&&w>this._maxIndentLeft)break;const S=v.horizontalLine?v.horizontalLine.top?"horizontal-top":"horizontal-bottom":"vertical",L=v.horizontalLine?(t.visibleRangeForPosition(new E.Position(r,v.horizontalLine.endColumn))?.left??w+this._spaceWidth)-w:this._spaceWidth;f+=`
    `}a[u]=f}this._renderResult=a}getGuidesByLine(t,i,s){const g=this._bracketPairGuideOptions.bracketPairs!==!1?this._context.viewModel.getBracketGuidesInRangeByLine(t,i,s,{highlightActive:this._bracketPairGuideOptions.highlightActiveBracketPair,horizontalGuides:this._bracketPairGuideOptions.bracketPairsHorizontal===!0?b.HorizontalGuidesState.Enabled:this._bracketPairGuideOptions.bracketPairsHorizontal==="active"?b.HorizontalGuidesState.EnabledForActive:b.HorizontalGuidesState.Disabled,includeInactive:this._bracketPairGuideOptions.bracketPairs===!0}):null,c=this._bracketPairGuideOptions.indentation?this._context.viewModel.getLinesIndentGuides(t,i):null;let l=0,a=0,r=0;if(this._bracketPairGuideOptions.highlightActiveIndentation!==!1&&s){const f=this._context.viewModel.getActiveIndentGuide(s.lineNumber,t,i);l=f.startLineNumber,a=f.endLineNumber,r=f.indent}const{indentSize:u}=this._context.viewModel.model.getOptions(),C=[];for(let f=t;f<=i;f++){const h=new Array;C.push(h);const v=g?g[f-t]:[],w=new y.ArrayQueue(v),S=c?c[f-t]:0;for(let L=1;L<=S;L++){const D=(L-1)*u+1,T=(this._bracketPairGuideOptions.highlightActiveIndentation==="always"||v.length===0)&&l<=f&&f<=a&&L===r;h.push(...w.takeWhile(A=>A.visibleColumn!0)||[])}return C}render(t,i){if(!this._renderResult)return"";const s=i-t;return s<0||s>=this._renderResult.length?"":this._renderResult[s]}}e.IndentGuidesOverlay=p;function n(o){if(!(o&&o.isTransparent()))return o}(0,I.registerThemingParticipant)((o,t)=>{const i=[{bracketColor:k.editorBracketHighlightingForeground1,guideColor:k.editorBracketPairGuideBackground1,guideColorActive:k.editorBracketPairGuideActiveBackground1},{bracketColor:k.editorBracketHighlightingForeground2,guideColor:k.editorBracketPairGuideBackground2,guideColorActive:k.editorBracketPairGuideActiveBackground2},{bracketColor:k.editorBracketHighlightingForeground3,guideColor:k.editorBracketPairGuideBackground3,guideColorActive:k.editorBracketPairGuideActiveBackground3},{bracketColor:k.editorBracketHighlightingForeground4,guideColor:k.editorBracketPairGuideBackground4,guideColorActive:k.editorBracketPairGuideActiveBackground4},{bracketColor:k.editorBracketHighlightingForeground5,guideColor:k.editorBracketPairGuideBackground5,guideColorActive:k.editorBracketPairGuideActiveBackground5},{bracketColor:k.editorBracketHighlightingForeground6,guideColor:k.editorBracketPairGuideBackground6,guideColorActive:k.editorBracketPairGuideActiveBackground6}],s=new _.BracketPairGuidesClassNames,g=[{indentColor:k.editorIndentGuide1,indentColorActive:k.editorActiveIndentGuide1},{indentColor:k.editorIndentGuide2,indentColorActive:k.editorActiveIndentGuide2},{indentColor:k.editorIndentGuide3,indentColorActive:k.editorActiveIndentGuide3},{indentColor:k.editorIndentGuide4,indentColorActive:k.editorActiveIndentGuide4},{indentColor:k.editorIndentGuide5,indentColorActive:k.editorActiveIndentGuide5},{indentColor:k.editorIndentGuide6,indentColorActive:k.editorActiveIndentGuide6}],c=i.map(a=>{const r=o.getColor(a.bracketColor),u=o.getColor(a.guideColor),C=o.getColor(a.guideColorActive),f=n(n(u)??r?.transparent(.3)),h=n(n(C)??r);if(!(!f||!h))return{guideColor:f,guideColorActive:h}}).filter(m.isDefined),l=g.map(a=>{const r=o.getColor(a.indentColor),u=o.getColor(a.indentColorActive),C=n(r),f=n(u);if(!(!C||!f))return{indentColor:C,indentColorActive:f}}).filter(m.isDefined);if(c.length>0){for(let a=0;a<30;a++){const r=c[a%c.length];t.addRule(`.monaco-editor .${s.getInlineClassNameOfLevel(a).replace(/ /g,".")} { --guide-color: ${r.guideColor}; --guide-color-active: ${r.guideColorActive}; }`)}t.addRule(".monaco-editor .vertical { box-shadow: 1px 0 0 0 var(--guide-color) inset; }"),t.addRule(".monaco-editor .horizontal-top { border-top: 1px solid var(--guide-color); }"),t.addRule(".monaco-editor .horizontal-bottom { border-bottom: 1px solid var(--guide-color); }"),t.addRule(`.monaco-editor .vertical.${s.activeClassName} { box-shadow: 1px 0 0 0 var(--guide-color-active) inset; }`),t.addRule(`.monaco-editor .horizontal-top.${s.activeClassName} { border-top: 1px solid var(--guide-color-active); }`),t.addRule(`.monaco-editor .horizontal-bottom.${s.activeClassName} { border-bottom: 1px solid var(--guide-color-active); }`)}if(l.length>0){for(let a=0;a<30;a++){const r=l[a%l.length];t.addRule(`.monaco-editor .lines-content .core-guide-indent.lvl-${a} { --indent-color: ${r.indentColor}; --indent-color-active: ${r.indentColorActive}; }`)}t.addRule(".monaco-editor .lines-content .core-guide-indent { box-shadow: 1px 0 0 0 var(--indent-color) inset; }"),t.addRule(".monaco-editor .lines-content .core-guide-indent.indent-active { box-shadow: 1px 0 0 0 var(--indent-color-active) inset; }")}})}),define(ne[416],se([1,0,16,133,9,4,25,80,486]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LineNumbersOverlay=void 0;class _ extends k.DynamicViewOverlay{static{this.CLASS_NAME="line-numbers"}constructor(p){super(),this._context=p,this._readConfig(),this._lastCursorModelPosition=new I.Position(1,1),this._renderResult=null,this._activeLineNumber=1,this._context.addEventHandler(this)}_readConfig(){const p=this._context.configuration.options;this._lineHeight=p.get(67);const n=p.get(68);this._renderLineNumbers=n.renderType,this._renderCustomLineNumbers=n.renderFn,this._renderFinalNewline=p.get(96);const o=p.get(146);this._lineNumbersLeft=o.lineNumbersLeft,this._lineNumbersWidth=o.lineNumbersWidth}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(p){return this._readConfig(),!0}onCursorStateChanged(p){const n=p.selections[0].getPosition();this._lastCursorModelPosition=this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(n);let o=!1;return this._activeLineNumber!==n.lineNumber&&(this._activeLineNumber=n.lineNumber,o=!0),(this._renderLineNumbers===2||this._renderLineNumbers===3)&&(o=!0),o}onFlushed(p){return!0}onLinesChanged(p){return!0}onLinesDeleted(p){return!0}onLinesInserted(p){return!0}onScrollChanged(p){return p.scrollTopChanged}onZonesChanged(p){return!0}onDecorationsChanged(p){return p.affectsLineNumber}_getLineRenderLineNumber(p){const n=this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new I.Position(p,1));if(n.column!==1)return"";const o=n.lineNumber;if(this._renderCustomLineNumbers)return this._renderCustomLineNumbers(o);if(this._renderLineNumbers===2){const t=Math.abs(this._lastCursorModelPosition.lineNumber-o);return t===0?''+o+"":String(t)}if(this._renderLineNumbers===3){if(this._lastCursorModelPosition.lineNumber===o||o%10===0)return String(o);const t=this._context.viewModel.getLineCount();return o===t?String(o):""}return String(o)}prepareRender(p){if(this._renderLineNumbers===0){this._renderResult=null;return}const n=d.isLinux?this._lineHeight%2===0?" lh-even":" lh-odd":"",o=p.visibleRange.startLineNumber,t=p.visibleRange.endLineNumber,i=this._context.viewModel.getDecorationsInViewport(p.visibleRange).filter(l=>!!l.options.lineNumberClassName);i.sort((l,a)=>E.Range.compareRangesUsingEnds(l.range,a.range));let s=0;const g=this._context.viewModel.getLineCount(),c=[];for(let l=o;l<=t;l++){const a=l-o;let r=this._getLineRenderLineNumber(l),u="";for(;s${r}`}this._renderResult=c}render(p,n){if(!this._renderResult)return"";const o=n-p;return o<0||o>=this._renderResult.length?"":this._renderResult[o]}}e.LineNumbersOverlay=_,(0,y.registerThemingParticipant)((b,p)=>{const n=b.getColor(m.editorLineNumbers),o=b.getColor(m.editorDimmedLineNumber);o?p.addRule(`.monaco-editor .line-numbers.dimmed-line-number { color: ${o}; }`):n&&p.addRule(`.monaco-editor .line-numbers.dimmed-line-number { color: ${n.transparent(.4)}; }`)})}),define(ne[778],se([1,0,3,64,39,16,11,74,212,310,56,416,331,37,166,9,4,23,226,27,33,300,31,7,479]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TextAreaHandler=void 0;class h{constructor(D,T,M,A,P){this._context=D,this.modelLineNumber=T,this.distanceToModelLineStart=M,this.widthOfHiddenLineTextBefore=A,this.distanceToModelLineEnd=P,this._visibleTextAreaBrand=void 0,this.startPosition=null,this.endPosition=null,this.visibleTextareaStart=null,this.visibleTextareaEnd=null,this._previousPresentation=null}prepareRender(D){const T=new s.Position(this.modelLineNumber,this.distanceToModelLineStart+1),M=new s.Position(this.modelLineNumber,this._context.viewModel.model.getLineMaxColumn(this.modelLineNumber)-this.distanceToModelLineEnd);this.startPosition=this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(T),this.endPosition=this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(M),this.startPosition.lineNumber===this.endPosition.lineNumber?(this.visibleTextareaStart=D.visibleRangeForPosition(this.startPosition),this.visibleTextareaEnd=D.visibleRangeForPosition(this.endPosition)):(this.visibleTextareaStart=null,this.visibleTextareaEnd=null)}definePresentation(D){return this._previousPresentation||(D?this._previousPresentation=D:this._previousPresentation={foreground:1,italic:!1,bold:!1,underline:!1,strikethrough:!1}),this._previousPresentation}}const v=k.isFirefox;let w=class extends p.ViewPart{constructor(D,T,M,A,P){super(D),this._keybindingService=A,this._instantiationService=P,this._primaryCursorPosition=new s.Position(1,1),this._primaryCursorVisibleRange=null,this._viewController=T,this._visibleRangeProvider=M,this._scrollLeft=0,this._scrollTop=0;const N=this._context.configuration.options,O=N.get(146);this._setAccessibilityOptions(N),this._contentLeft=O.contentLeft,this._contentWidth=O.contentWidth,this._contentHeight=O.height,this._fontInfo=N.get(50),this._lineHeight=N.get(67),this._emptySelectionClipboard=N.get(37),this._copyWithSyntaxHighlighting=N.get(25),this._visibleTextArea=null,this._selections=[new c.Selection(1,1,1,1)],this._modelSelections=[new c.Selection(1,1,1,1)],this._lastRenderPosition=null,this.textArea=(0,I.createFastDomNode)(document.createElement("textarea")),p.PartFingerprints.write(this.textArea,7),this.textArea.setClassName(`inputarea ${l.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`),this.textArea.setAttribute("wrap",this._textAreaWrapping&&!this._visibleTextArea?"on":"off");const{tabSize:F}=this._context.viewModel.model.getOptions();this.textArea.domNode.style.tabSize=`${F*this._fontInfo.spaceWidth}px`,this.textArea.setAttribute("autocorrect","off"),this.textArea.setAttribute("autocapitalize","off"),this.textArea.setAttribute("autocomplete","off"),this.textArea.setAttribute("spellcheck","false"),this.textArea.setAttribute("aria-label",this._getAriaLabel(N)),this.textArea.setAttribute("aria-required",N.get(5)?"true":"false"),this.textArea.setAttribute("tabindex",String(N.get(125))),this.textArea.setAttribute("role","textbox"),this.textArea.setAttribute("aria-roledescription",d.localize(54,"editor")),this.textArea.setAttribute("aria-multiline","true"),this.textArea.setAttribute("aria-autocomplete",N.get(92)?"none":"both"),this._ensureReadOnlyAttribute(),this.textAreaCover=(0,I.createFastDomNode)(document.createElement("div")),this.textAreaCover.setPosition("absolute");const x={getLineCount:()=>this._context.viewModel.getLineCount(),getLineMaxColumn:q=>this._context.viewModel.getLineMaxColumn(q),getValueInRange:(q,H)=>this._context.viewModel.getValueInRange(q,H),getValueLengthInRange:(q,H)=>this._context.viewModel.getValueLengthInRange(q,H),modifyPosition:(q,H)=>this._context.viewModel.modifyPosition(q,H)},W={getDataToCopy:()=>{const q=this._context.viewModel.getPlainTextToCopy(this._modelSelections,this._emptySelectionClipboard,E.isWindows),H=this._context.viewModel.model.getEOL(),z=this._emptySelectionClipboard&&this._modelSelections.length===1&&this._modelSelections[0].isEmpty(),U=Array.isArray(q)?q:null,j=Array.isArray(q)?q.join(H):q;let Y,G=null;if(_.CopyOptions.forceCopyWithSyntaxHighlighting||this._copyWithSyntaxHighlighting&&j.length<65536){const K=this._context.viewModel.getRichTextToCopy(this._modelSelections,this._emptySelectionClipboard);K&&(Y=K.html,G=K.mode)}return{isFromEmptySelection:z,multicursorText:U,text:j,html:Y,mode:G}},getScreenReaderContent:()=>{if(this._accessibilitySupport===1){const q=this._selections[0];if(E.isMacintosh&&q.isEmpty()){const z=q.getStartPosition();let U=this._getWordBeforePosition(z);if(U.length===0&&(U=this._getCharacterBeforePosition(z)),U.length>0)return new b.TextAreaState(U,U.length,U.length,g.Range.fromPositions(z),0)}if(E.isMacintosh&&!q.isEmpty()&&x.getValueLengthInRange(q,0)<500){const z=x.getValueInRange(q,0);return new b.TextAreaState(z,0,z.length,q,0)}if(k.isSafari&&!q.isEmpty()){const z="vscode-placeholder";return new b.TextAreaState(z,0,z.length,null,void 0)}return b.TextAreaState.EMPTY}if(k.isAndroid){const q=this._selections[0];if(q.isEmpty()){const H=q.getStartPosition(),[z,U]=this._getAndroidWordAtPosition(H);if(z.length>0)return new b.TextAreaState(z,U,U,g.Range.fromPositions(H),0)}return b.TextAreaState.EMPTY}return b.PagedScreenReaderStrategy.fromEditorSelection(x,this._selections[0],this._accessibilityPageSize,this._accessibilitySupport===0)},deduceModelPosition:(q,H,z)=>this._context.viewModel.deduceModelPositionRelativeToViewPosition(q,H,z)},V=this._register(new _.TextAreaWrapper(this.textArea.domNode));this._textAreaInput=this._register(this._instantiationService.createInstance(_.TextAreaInput,W,V,E.OS,{isAndroid:k.isAndroid,isChrome:k.isChrome,isFirefox:k.isFirefox,isSafari:k.isSafari})),this._register(this._textAreaInput.onKeyDown(q=>{this._viewController.emitKeyDown(q)})),this._register(this._textAreaInput.onKeyUp(q=>{this._viewController.emitKeyUp(q)})),this._register(this._textAreaInput.onPaste(q=>{let H=!1,z=null,U=null;q.metadata&&(H=this._emptySelectionClipboard&&!!q.metadata.isFromEmptySelection,z=typeof q.metadata.multicursorText<"u"?q.metadata.multicursorText:null,U=q.metadata.mode),this._viewController.paste(q.text,H,z,U)})),this._register(this._textAreaInput.onCut(()=>{this._viewController.cut()})),this._register(this._textAreaInput.onType(q=>{q.replacePrevCharCnt||q.replaceNextCharCnt||q.positionDelta?(b._debugComposition&&console.log(` => compositionType: <<${q.text}>>, ${q.replacePrevCharCnt}, ${q.replaceNextCharCnt}, ${q.positionDelta}`),this._viewController.compositionType(q.text,q.replacePrevCharCnt,q.replaceNextCharCnt,q.positionDelta)):(b._debugComposition&&console.log(` => type: <<${q.text}>>`),this._viewController.type(q.text))})),this._register(this._textAreaInput.onSelectionChangeRequest(q=>{this._viewController.setSelection(q)})),this._register(this._textAreaInput.onCompositionStart(q=>{const H=this.textArea.domNode,z=this._modelSelections[0],{distanceToModelLineStart:U,widthOfHiddenTextBefore:j}=(()=>{const G=H.value.substring(0,Math.min(H.selectionStart,H.selectionEnd)),K=G.lastIndexOf(` -`),R=G.substring(K+1),J=R.lastIndexOf(" "),ie=R.length-J-1,ue=z.getStartPosition(),he=Math.min(ue.column-1,ie),pe=ue.column-1-he,ae=R.substring(0,R.length-he),{tabSize:ee}=this._context.viewModel.model.getOptions(),de=S(this.textArea.domNode.ownerDocument,ae,this._fontInfo,ee);return{distanceToModelLineStart:pe,widthOfHiddenTextBefore:de}})(),{distanceToModelLineEnd:Y}=(()=>{const G=H.value.substring(Math.max(H.selectionStart,H.selectionEnd)),K=G.indexOf(` -`),R=K===-1?G:G.substring(0,K),J=R.indexOf(" "),ie=J===-1?R.length:R.length-J-1,ue=z.getEndPosition(),he=Math.min(this._context.viewModel.model.getLineMaxColumn(ue.lineNumber)-ue.column,ie);return{distanceToModelLineEnd:this._context.viewModel.model.getLineMaxColumn(ue.lineNumber)-ue.column-he}})();this._context.viewModel.revealRange("keyboard",!0,g.Range.fromPositions(this._selections[0].getStartPosition()),0,1),this._visibleTextArea=new h(this._context,z.startLineNumber,U,j,Y),this.textArea.setAttribute("wrap",this._textAreaWrapping&&!this._visibleTextArea?"on":"off"),this._visibleTextArea.prepareRender(this._visibleRangeProvider),this._render(),this.textArea.setClassName(`inputarea ${l.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME} ime-input`),this._viewController.compositionStart(),this._context.viewModel.onCompositionStart()})),this._register(this._textAreaInput.onCompositionUpdate(q=>{this._visibleTextArea&&(this._visibleTextArea.prepareRender(this._visibleRangeProvider),this._render())})),this._register(this._textAreaInput.onCompositionEnd(()=>{this._visibleTextArea=null,this.textArea.setAttribute("wrap",this._textAreaWrapping&&!this._visibleTextArea?"on":"off"),this._render(),this.textArea.setClassName(`inputarea ${l.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`),this._viewController.compositionEnd(),this._context.viewModel.onCompositionEnd()})),this._register(this._textAreaInput.onFocus(()=>{this._context.viewModel.setHasFocus(!0)})),this._register(this._textAreaInput.onBlur(()=>{this._context.viewModel.setHasFocus(!1)})),this._register(u.IME.onDidChange(()=>{this._ensureReadOnlyAttribute()}))}writeScreenReaderContent(D){this._textAreaInput.writeNativeTextAreaContent(D)}dispose(){super.dispose()}_getAndroidWordAtPosition(D){const T='`~!@#$%^&*()-=+[{]}\\|;:",.<>/?',M=this._context.viewModel.getLineContent(D.lineNumber),A=(0,i.getMapForWordSeparators)(T,[]);let P=!0,N=D.column,O=!0,F=D.column,x=0;for(;x<50&&(P||O);){if(P&&N<=1&&(P=!1),P){const W=M.charCodeAt(N-2);A.get(W)!==0?P=!1:N--}if(O&&F>M.length&&(O=!1),O){const W=M.charCodeAt(F-1);A.get(W)!==0?O=!1:F++}x++}return[M.substring(N-1,F-1),D.column-N]}_getWordBeforePosition(D){const T=this._context.viewModel.getLineContent(D.lineNumber),M=(0,i.getMapForWordSeparators)(this._context.configuration.options.get(132),[]);let A=D.column,P=0;for(;A>1;){const N=T.charCodeAt(A-2);if(M.get(N)!==0||P>50)return T.substring(A-1,D.column-1);P++,A--}return T.substring(0,D.column-1)}_getCharacterBeforePosition(D){if(D.column>1){const M=this._context.viewModel.getLineContent(D.lineNumber).charAt(D.column-2);if(!y.isHighSurrogate(M.charCodeAt(0)))return M}return""}_getAriaLabel(D){if(D.get(2)===1){const M=this._keybindingService.lookupKeybinding("editor.action.toggleScreenReaderAccessibilityMode")?.getAriaLabel(),A=this._keybindingService.lookupKeybinding("workbench.action.showCommands")?.getAriaLabel(),P=this._keybindingService.lookupKeybinding("workbench.action.openGlobalKeybindings")?.getAriaLabel(),N=d.localize(55,"The editor is not accessible at this time.");return M?d.localize(56,"{0} To enable screen reader optimized mode, use {1}",N,M):A?d.localize(57,"{0} To enable screen reader optimized mode, open the quick pick with {1} and run the command Toggle Screen Reader Accessibility Mode, which is currently not triggerable via keyboard.",N,A):P?d.localize(58,"{0} Please assign a keybinding for the command Toggle Screen Reader Accessibility Mode by accessing the keybindings editor with {1} and run it.",N,P):N}return D.get(4)}_setAccessibilityOptions(D){this._accessibilitySupport=D.get(2);const T=D.get(3);this._accessibilitySupport===2&&T===t.EditorOptions.accessibilityPageSize.defaultValue?this._accessibilityPageSize=500:this._accessibilityPageSize=T;const A=D.get(146).wrappingColumn;if(A!==-1&&this._accessibilitySupport!==1){const P=D.get(50);this._textAreaWrapping=!0,this._textAreaWidth=Math.round(A*P.typicalHalfwidthCharacterWidth)}else this._textAreaWrapping=!1,this._textAreaWidth=v?0:1}onConfigurationChanged(D){const T=this._context.configuration.options,M=T.get(146);this._setAccessibilityOptions(T),this._contentLeft=M.contentLeft,this._contentWidth=M.contentWidth,this._contentHeight=M.height,this._fontInfo=T.get(50),this._lineHeight=T.get(67),this._emptySelectionClipboard=T.get(37),this._copyWithSyntaxHighlighting=T.get(25),this.textArea.setAttribute("wrap",this._textAreaWrapping&&!this._visibleTextArea?"on":"off");const{tabSize:A}=this._context.viewModel.model.getOptions();return this.textArea.domNode.style.tabSize=`${A*this._fontInfo.spaceWidth}px`,this.textArea.setAttribute("aria-label",this._getAriaLabel(T)),this.textArea.setAttribute("aria-required",T.get(5)?"true":"false"),this.textArea.setAttribute("tabindex",String(T.get(125))),(D.hasChanged(34)||D.hasChanged(92))&&this._ensureReadOnlyAttribute(),D.hasChanged(2)&&this._textAreaInput.writeNativeTextAreaContent("strategy changed"),!0}onCursorStateChanged(D){return this._selections=D.selections.slice(0),this._modelSelections=D.modelSelections.slice(0),this._textAreaInput.writeNativeTextAreaContent("selection changed"),!0}onDecorationsChanged(D){return!0}onFlushed(D){return!0}onLinesChanged(D){return!0}onLinesDeleted(D){return!0}onLinesInserted(D){return!0}onScrollChanged(D){return this._scrollLeft=D.scrollLeft,this._scrollTop=D.scrollTop,!0}onZonesChanged(D){return!0}isFocused(){return this._textAreaInput.isFocused()}focusTextArea(){this._textAreaInput.focusTextArea()}getLastRenderData(){return this._lastRenderPosition}setAriaOptions(D){D.activeDescendant?(this.textArea.setAttribute("aria-haspopup","true"),this.textArea.setAttribute("aria-autocomplete","list"),this.textArea.setAttribute("aria-activedescendant",D.activeDescendant)):(this.textArea.setAttribute("aria-haspopup","false"),this.textArea.setAttribute("aria-autocomplete","both"),this.textArea.removeAttribute("aria-activedescendant")),D.role&&this.textArea.setAttribute("role",D.role)}_ensureReadOnlyAttribute(){const D=this._context.configuration.options;!u.IME.enabled||D.get(34)&&D.get(92)?this.textArea.setAttribute("readonly","true"):this.textArea.removeAttribute("readonly")}prepareRender(D){this._primaryCursorPosition=new s.Position(this._selections[0].positionLineNumber,this._selections[0].positionColumn),this._primaryCursorVisibleRange=D.visibleRangeForPosition(this._primaryCursorPosition),this._visibleTextArea?.prepareRender(D)}render(D){this._textAreaInput.writeNativeTextAreaContent("render"),this._render()}_render(){if(this._visibleTextArea){const M=this._visibleTextArea.visibleTextareaStart,A=this._visibleTextArea.visibleTextareaEnd,P=this._visibleTextArea.startPosition,N=this._visibleTextArea.endPosition;if(P&&N&&M&&A&&A.left>=this._scrollLeft&&M.left<=this._scrollLeft+this._contentWidth){const O=this._context.viewLayout.getVerticalOffsetForLineNumber(this._primaryCursorPosition.lineNumber)-this._scrollTop,F=this._newlinecount(this.textArea.domNode.value.substr(0,this.textArea.domNode.selectionStart));let x=this._visibleTextArea.widthOfHiddenLineTextBefore,W=this._contentLeft+M.left-this._scrollLeft,V=A.left-M.left+1;if(Wthis._contentWidth&&(V=this._contentWidth);const q=this._context.viewModel.getViewLineData(P.lineNumber),H=q.tokens.findTokenIndexAtOffset(P.column-1),z=q.tokens.findTokenIndexAtOffset(N.column-1),U=H===z,j=this._visibleTextArea.definePresentation(U?q.tokens.getPresentation(H):null);this.textArea.domNode.scrollTop=F*this._lineHeight,this.textArea.domNode.scrollLeft=x,this._doRender({lastRenderPosition:null,top:O,left:W,width:V,height:this._lineHeight,useCover:!1,color:(a.TokenizationRegistry.getColorMap()||[])[j.foreground],italic:j.italic,bold:j.bold,underline:j.underline,strikethrough:j.strikethrough})}return}if(!this._primaryCursorVisibleRange){this._renderAtTopLeft();return}const D=this._contentLeft+this._primaryCursorVisibleRange.left-this._scrollLeft;if(Dthis._contentLeft+this._contentWidth){this._renderAtTopLeft();return}const T=this._context.viewLayout.getVerticalOffsetForLineNumber(this._selections[0].positionLineNumber)-this._scrollTop;if(T<0||T>this._contentHeight){this._renderAtTopLeft();return}if(E.isMacintosh||this._accessibilitySupport===2){this._doRender({lastRenderPosition:this._primaryCursorPosition,top:T,left:this._textAreaWrapping?this._contentLeft:D,width:this._textAreaWidth,height:this._lineHeight,useCover:!1}),this.textArea.domNode.scrollLeft=this._primaryCursorVisibleRange.left;const M=this._textAreaInput.textAreaState.newlineCountBeforeSelection??this._newlinecount(this.textArea.domNode.value.substr(0,this.textArea.domNode.selectionStart));this.textArea.domNode.scrollTop=M*this._lineHeight;return}this._doRender({lastRenderPosition:this._primaryCursorPosition,top:T,left:this._textAreaWrapping?this._contentLeft:D,width:this._textAreaWidth,height:v?0:1,useCover:!1})}_newlinecount(D){let T=0,M=-1;do{if(M=D.indexOf(` -`,M+1),M===-1)break;T++}while(!0);return T}_renderAtTopLeft(){this._doRender({lastRenderPosition:null,top:0,left:0,width:this._textAreaWidth,height:v?0:1,useCover:!0})}_doRender(D){this._lastRenderPosition=D.lastRenderPosition;const T=this.textArea,M=this.textAreaCover;(0,m.applyFontInfo)(T,this._fontInfo),T.setTop(D.top),T.setLeft(D.left),T.setWidth(D.width),T.setHeight(D.height),T.setColor(D.color?r.Color.Format.CSS.formatHex(D.color):""),T.setFontStyle(D.italic?"italic":""),D.bold&&T.setFontWeight("bold"),T.setTextDecoration(`${D.underline?" underline":""}${D.strikethrough?" line-through":""}`),M.setTop(D.useCover?D.top:0),M.setLeft(D.useCover?D.left:0),M.setWidth(D.useCover?D.width:0),M.setHeight(D.useCover?D.height:0);const A=this._context.configuration.options;A.get(57)?M.setClassName("monaco-editor-background textAreaCover "+o.Margin.OUTER_CLASS_NAME):A.get(68).renderType!==0?M.setClassName("monaco-editor-background textAreaCover "+n.LineNumbersOverlay.CLASS_NAME):M.setClassName("monaco-editor-background textAreaCover")}};e.TextAreaHandler=w,e.TextAreaHandler=w=ke([ce(3,C.IKeybindingService),ce(4,f.IInstantiationService)],w);function S(L,D,T,M){if(D.length===0)return 0;const A=L.createElement("div");A.style.position="absolute",A.style.top="-50000px",A.style.width="50000px";const P=L.createElement("span");(0,m.applyFontInfo)(P,T),P.style.whiteSpace="pre",P.style.tabSize=`${M*T.spaceWidth}px`,P.append(D),A.appendChild(P),L.body.appendChild(A);const N=P.offsetWidth;return A.remove(),N}}),define(ne[779],se([1,0,39,33,56,9,27,80,95,13]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DecorationsOverviewRuler=void 0;class p{constructor(t,i){const s=t.options;this.lineHeight=s.get(67),this.pixelRatio=s.get(144),this.overviewRulerLanes=s.get(83),this.renderBorder=s.get(82);const g=i.getColor(m.editorOverviewRulerBorder);this.borderColor=g?g.toString():null,this.hideCursor=s.get(59);const c=i.getColor(m.editorCursorForeground);this.cursorColorSingle=c?c.transparent(.7).toString():null;const l=i.getColor(m.editorMultiCursorPrimaryForeground);this.cursorColorPrimary=l?l.transparent(.7).toString():null;const a=i.getColor(m.editorMultiCursorSecondaryForeground);this.cursorColorSecondary=a?a.transparent(.7).toString():null,this.themeType=i.type;const r=s.get(73),u=r.enabled,C=r.side,f=i.getColor(m.editorOverviewRulerBackground),h=y.TokenizationRegistry.getDefaultBackground();f?this.backgroundColor=f:u&&C==="right"?this.backgroundColor=h:this.backgroundColor=null;const w=s.get(146).overviewRuler;this.top=w.top,this.right=w.right,this.domWidth=w.width,this.domHeight=w.height,this.overviewRulerLanes===0?(this.canvasWidth=0,this.canvasHeight=0):(this.canvasWidth=this.domWidth*this.pixelRatio|0,this.canvasHeight=this.domHeight*this.pixelRatio|0);const[S,L]=this._initLanes(1,this.canvasWidth,this.overviewRulerLanes);this.x=S,this.w=L}_initLanes(t,i,s){const g=i-t;if(s>=3){const c=Math.floor(g/3),l=Math.floor(g/3),a=g-c-l,r=t,u=r+c,C=r+c+a;return[[0,r,u,r,C,r,u,r],[0,c,a,c+a,l,c+a+l,a+l,c+a+l]]}else if(s===2){const c=Math.floor(g/2),l=g-c,a=t,r=a+c;return[[0,a,a,a,r,a,a,a],[0,c,c,c,l,c+l,c+l,c+l]]}else{const c=t,l=g;return[[0,c,c,c,c,c,c,c],[0,l,l,l,l,l,l,l]]}}equals(t){return this.lineHeight===t.lineHeight&&this.pixelRatio===t.pixelRatio&&this.overviewRulerLanes===t.overviewRulerLanes&&this.renderBorder===t.renderBorder&&this.borderColor===t.borderColor&&this.hideCursor===t.hideCursor&&this.cursorColorSingle===t.cursorColorSingle&&this.cursorColorPrimary===t.cursorColorPrimary&&this.cursorColorSecondary===t.cursorColorSecondary&&this.themeType===t.themeType&&k.Color.equals(this.backgroundColor,t.backgroundColor)&&this.top===t.top&&this.right===t.right&&this.domWidth===t.domWidth&&this.domHeight===t.domHeight&&this.canvasWidth===t.canvasWidth&&this.canvasHeight===t.canvasHeight}}class n extends I.ViewPart{constructor(t){super(t),this._actualShouldRender=0,this._renderedDecorations=[],this._renderedCursorPositions=[],this._domNode=(0,d.createFastDomNode)(document.createElement("canvas")),this._domNode.setClassName("decorationsOverviewRuler"),this._domNode.setPosition("absolute"),this._domNode.setLayerHinting(!0),this._domNode.setContain("strict"),this._domNode.setAttribute("aria-hidden","true"),this._updateSettings(!1),this._tokensColorTrackerListener=y.TokenizationRegistry.onDidChange(i=>{i.changedColorMap&&this._updateSettings(!0)}),this._cursorPositions=[{position:new E.Position(1,1),color:this._settings.cursorColorSingle}]}dispose(){super.dispose(),this._tokensColorTrackerListener.dispose()}_updateSettings(t){const i=new p(this._context.configuration,this._context.theme);return this._settings&&this._settings.equals(i)?!1:(this._settings=i,this._domNode.setTop(this._settings.top),this._domNode.setRight(this._settings.right),this._domNode.setWidth(this._settings.domWidth),this._domNode.setHeight(this._settings.domHeight),this._domNode.domNode.width=this._settings.canvasWidth,this._domNode.domNode.height=this._settings.canvasHeight,t&&this._render(),!0)}_markRenderingIsNeeded(){return this._actualShouldRender=2,!0}_markRenderingIsMaybeNeeded(){return this._actualShouldRender=1,!0}onConfigurationChanged(t){return this._updateSettings(!1)?this._markRenderingIsNeeded():!1}onCursorStateChanged(t){this._cursorPositions=[];for(let i=0,s=t.selections.length;i1&&(g=i===0?this._settings.cursorColorPrimary:this._settings.cursorColorSecondary),this._cursorPositions.push({position:t.selections[i].getPosition(),color:g})}return this._cursorPositions.sort((i,s)=>E.Position.compare(i.position,s.position)),this._markRenderingIsMaybeNeeded()}onDecorationsChanged(t){return t.affectsOverviewRuler?this._markRenderingIsMaybeNeeded():!1}onFlushed(t){return this._markRenderingIsNeeded()}onScrollChanged(t){return t.scrollHeightChanged?this._markRenderingIsNeeded():!1}onZonesChanged(t){return this._markRenderingIsNeeded()}onThemeChanged(t){return this._updateSettings(!1)?this._markRenderingIsNeeded():!1}getDomNode(){return this._domNode.domNode}prepareRender(t){}render(t){this._render(),this._actualShouldRender=0}_render(){const t=this._settings.backgroundColor;if(this._settings.overviewRulerLanes===0){this._domNode.setBackgroundColor(t?k.Color.Format.CSS.formatHexA(t):""),this._domNode.setDisplay("none");return}const i=this._context.viewModel.getAllOverviewRulerDecorations(this._context.theme);if(i.sort(_.OverviewRulerDecorationsGroup.compareByRenderingProps),this._actualShouldRender===1&&!_.OverviewRulerDecorationsGroup.equalsArr(this._renderedDecorations,i)&&(this._actualShouldRender=2),this._actualShouldRender===1&&!(0,b.equals)(this._renderedCursorPositions,this._cursorPositions,(w,S)=>w.position.lineNumber===S.position.lineNumber&&w.color===S.color)&&(this._actualShouldRender=2),this._actualShouldRender===1)return;this._renderedDecorations=i,this._renderedCursorPositions=this._cursorPositions,this._domNode.setDisplay("block");const s=this._settings.canvasWidth,g=this._settings.canvasHeight,c=this._settings.lineHeight,l=this._context.viewLayout,a=this._context.viewLayout.getScrollHeight(),r=g/a,u=6*this._settings.pixelRatio|0,C=u/2|0,f=this._domNode.domNode.getContext("2d");t?t.isOpaque()?(f.fillStyle=k.Color.Format.CSS.formatHexA(t),f.fillRect(0,0,s,g)):(f.clearRect(0,0,s,g),f.fillStyle=k.Color.Format.CSS.formatHexA(t),f.fillRect(0,0,s,g)):f.clearRect(0,0,s,g);const h=this._settings.x,v=this._settings.w;for(const w of i){const S=w.color,L=w.data;f.fillStyle=S;let D=0,T=0,M=0;for(let A=0,P=L.length/3;Ag&&(q=g-C),x=q-C,W=q+C}x>M+1||N!==D?(A!==0&&f.fillRect(h[D],T,v[D],M-T),D=N,T=x,M=W):W>M&&(M=W)}f.fillRect(h[D],T,v[D],M-T)}if(!this._settings.hideCursor){const w=2*this._settings.pixelRatio|0,S=w/2|0,L=this._settings.x[7],D=this._settings.w[7];let T=-100,M=-100,A=null;for(let P=0,N=this._cursorPositions.length;Pg&&(x=g-S);const W=x-S,V=W+w;W>M+1||O!==A?(P!==0&&A&&f.fillRect(L,T,D,M-T),T=W,M=V):V>M&&(M=V),A=O,f.fillStyle=O}A&&f.fillRect(L,T,D,M-T)}this._settings.renderBorder&&this._settings.borderColor&&this._settings.overviewRulerLanes>0&&(f.beginPath(),f.lineWidth=1,f.strokeStyle=this._settings.borderColor,f.moveTo(0,0),f.lineTo(0,g),f.moveTo(1,0),f.lineTo(s,0),f.stroke())}}e.DecorationsOverviewRuler=n}),define(ne[780],se([1,0,39,14,56,655,37,80,25,97,5,496]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewCursors=void 0;class n extends I.ViewPart{static{this.BLINK_INTERVAL=500}constructor(t){super(t);const i=this._context.configuration.options;this._readOnly=i.get(92),this._cursorBlinking=i.get(26),this._cursorStyle=i.get(28),this._cursorSmoothCaretAnimation=i.get(27),this._selectionIsEmpty=!0,this._isComposingInput=!1,this._isVisible=!1,this._primaryCursor=new E.ViewCursor(this._context,E.CursorPlurality.Single),this._secondaryCursors=[],this._renderData=[],this._domNode=(0,d.createFastDomNode)(document.createElement("div")),this._domNode.setAttribute("role","presentation"),this._domNode.setAttribute("aria-hidden","true"),this._updateDomClassName(),this._domNode.appendChild(this._primaryCursor.getDomNode()),this._startCursorBlinkAnimation=new k.TimeoutTimer,this._cursorFlatBlinkInterval=new p.WindowIntervalTimer,this._blinkingEnabled=!1,this._editorHasFocus=!1,this._updateBlinking()}dispose(){super.dispose(),this._startCursorBlinkAnimation.dispose(),this._cursorFlatBlinkInterval.dispose()}getDomNode(){return this._domNode}onCompositionStart(t){return this._isComposingInput=!0,this._updateBlinking(),!0}onCompositionEnd(t){return this._isComposingInput=!1,this._updateBlinking(),!0}onConfigurationChanged(t){const i=this._context.configuration.options;this._readOnly=i.get(92),this._cursorBlinking=i.get(26),this._cursorStyle=i.get(28),this._cursorSmoothCaretAnimation=i.get(27),this._updateBlinking(),this._updateDomClassName(),this._primaryCursor.onConfigurationChanged(t);for(let s=0,g=this._secondaryCursors.length;si.length){const c=this._secondaryCursors.length-i.length;for(let l=0;l{for(let g=0,c=t.ranges.length;g{this._isVisible?this._hide():this._show()},n.BLINK_INTERVAL,(0,p.getWindow)(this._domNode.domNode)):this._startCursorBlinkAnimation.setIfNotSet(()=>{this._blinkingEnabled=!0,this._updateDomClassName()},n.BLINK_INTERVAL))}_updateDomClassName(){this._domNode.setClassName(this._getClassName())}_getClassName(){let t="cursors-layer";switch(this._selectionIsEmpty||(t+=" has-selection"),this._cursorStyle){case y.TextEditorCursorStyle.Line:t+=" cursor-line-style";break;case y.TextEditorCursorStyle.Block:t+=" cursor-block-style";break;case y.TextEditorCursorStyle.Underline:t+=" cursor-underline-style";break;case y.TextEditorCursorStyle.LineThin:t+=" cursor-line-thin-style";break;case y.TextEditorCursorStyle.BlockOutline:t+=" cursor-block-outline-style";break;case y.TextEditorCursorStyle.UnderlineThin:t+=" cursor-underline-thin-style";break;default:t+=" cursor-line-style"}if(this._blinkingEnabled)switch(this._getCursorBlinking()){case 1:t+=" cursor-blink";break;case 2:t+=" cursor-smooth";break;case 3:t+=" cursor-phase";break;case 4:t+=" cursor-expand";break;case 5:t+=" cursor-solid";break;default:t+=" cursor-solid"}else t+=" cursor-solid";return(this._cursorSmoothCaretAnimation==="on"||this._cursorSmoothCaretAnimation==="explicit")&&(t+=" cursor-smooth-caret-animation"),t}_show(){this._primaryCursor.show();for(let t=0,i=this._secondaryCursors.length;t{const i=[{class:".cursor",foreground:m.editorCursorForeground,background:m.editorCursorBackground},{class:".cursor-primary",foreground:m.editorMultiCursorPrimaryForeground,background:m.editorMultiCursorPrimaryBackground},{class:".cursor-secondary",foreground:m.editorMultiCursorSecondaryForeground,background:m.editorMultiCursorSecondaryBackground}];for(const s of i){const g=o.getColor(s.foreground);if(g){let c=o.getColor(s.background);c||(c=g.opposite()),t.addRule(`.monaco-editor .cursors-layer ${s.class} { background-color: ${g}; border-color: ${g}; color: ${c}; }`),(0,b.isHighContrast)(o.type)&&t.addRule(`.monaco-editor .cursors-layer.has-selection ${s.class} { border-left: 1px solid ${c}; border-right: 1px solid ${c}; }`)}}})}),define(ne[781],se([1,0,133,11,136,9,80,497]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WhitespaceOverlay=void 0;class m extends d.DynamicViewOverlay{constructor(p){super(),this._context=p,this._options=new _(this._context.configuration),this._selection=[],this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(p){const n=new _(this._context.configuration);return this._options.equals(n)?p.hasChanged(146):(this._options=n,!0)}onCursorStateChanged(p){return this._selection=p.selections,this._options.renderWhitespace==="selection"}onDecorationsChanged(p){return!0}onFlushed(p){return!0}onLinesChanged(p){return!0}onLinesDeleted(p){return!0}onLinesInserted(p){return!0}onScrollChanged(p){return p.scrollTopChanged}onZonesChanged(p){return!0}prepareRender(p){if(this._options.renderWhitespace==="none"){this._renderResult=null;return}const n=p.visibleRange.startLineNumber,t=p.visibleRange.endLineNumber-n+1,i=new Array(t);for(let g=0;gg)continue;const C=u.startLineNumber===g?u.startColumn:l.minColumn,f=u.endLineNumber===g?u.endColumn:l.maxColumn;C=O.endOffset&&(N++,O=o&&o[N]),W!==9&&W!==32||u&&!M&&x<=P)continue;if(r&&x>=A&&x<=P&&W===32){const q=x-1>=0?g.charCodeAt(x-1):0,H=x+1=0?g.charCodeAt(x-1):0;if(W===32&&q!==32&&q!==9)continue}if(o&&(!O||O.startOffset>x||O.endOffset<=x))continue;const V=p.visibleRangeForPosition(new E.Position(n,x+1));V&&(s?(F=Math.max(F,V.left),W===9?T+=this._renderArrow(C,v,V.left):T+=``):W===9?T+=`
    ${D?"\uFFEB":"\u2192"}
    `:T+=`
    ${String.fromCharCode(L)}
    `)}return s?(F=Math.round(F+v),``+T+""):T}_renderArrow(p,n,o){const t=n/7,i=n,s=p/2,g=o,c={x:0,y:t/2},l={x:100/125*i,y:c.y},a={x:l.x-.2*l.x,y:l.y+.2*l.x},r={x:a.x+.1*l.x,y:a.y+.1*l.x},u={x:r.x+.35*l.x,y:r.y-.35*l.x},C={x:u.x,y:-u.y},f={x:r.x,y:-r.y},h={x:a.x,y:-a.y},v={x:l.x,y:-l.y},w={x:c.x,y:-c.y};return``}render(p,n){if(!this._renderResult)return"";const o=n-p;return o<0||o>=this._renderResult.length?"":this._renderResult[o]}}e.WhitespaceOverlay=m;class _{constructor(p){const n=p.options,o=n.get(50),t=n.get(38);t==="off"?(this.renderWhitespace="none",this.renderWithSVG=!1):t==="svg"?(this.renderWhitespace=n.get(100),this.renderWithSVG=!0):(this.renderWhitespace=n.get(100),this.renderWithSVG=!1),this.spaceWidth=o.spaceWidth,this.middotWidth=o.middotWidth,this.wsmiddotWidth=o.wsmiddotWidth,this.canUseHalfwidthRightwardsArrow=o.canUseHalfwidthRightwardsArrow,this.lineHeight=n.get(67),this.stopRenderingLineAfter=n.get(118)}equals(p){return this.renderWhitespace===p.renderWhitespace&&this.renderWithSVG===p.renderWithSVG&&this.spaceWidth===p.spaceWidth&&this.middotWidth===p.middotWidth&&this.wsmiddotWidth===p.wsmiddotWidth&&this.canUseHalfwidthRightwardsArrow===p.canUseHalfwidthRightwardsArrow&&this.lineHeight===p.lineHeight&&this.stopRenderingLineAfter===p.stopRenderingLineAfter}}}),define(ne[782],se([1,0,5,39,296,8,414,769,778,164,726,657,56,309,591,649,776,592,773,242,777,416,770,593,331,594,755,650,779,604,595,596,774,780,597,781,9,4,23,40,170,600,605,7,25]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S,L,D,T,M,A,P,N,O,F,x,W,V,q,H,z,U,j){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.View=void 0;let Y=class extends q.ViewEventHandler{constructor(J,ie,ue,he,pe,ae,ee){super(),this._instantiationService=ee,this._shouldRecomputeGlyphMarginLanes=!1,this._selections=[new W.Selection(1,1,1,1)],this._renderAnimationFrame=null;const de=new p.ViewController(ie,he,pe,J);this._context=new z.ViewContext(ie,ue,he),this._context.addEventHandler(this),this._viewParts=[],this._textAreaHandler=this._instantiationService.createInstance(_.TextAreaHandler,this._context,de,this._createTextAreaHandlerHelper()),this._viewParts.push(this._textAreaHandler),this._linesContent=(0,k.createFastDomNode)(document.createElement("div")),this._linesContent.setClassName("lines-content monaco-editor-background"),this._linesContent.setPosition("absolute"),this.domNode=(0,k.createFastDomNode)(document.createElement("div")),this.domNode.setClassName(this._getEditorClassName()),this.domNode.setAttribute("role","code"),this._overflowGuardContainer=(0,k.createFastDomNode)(document.createElement("div")),o.PartFingerprints.write(this._overflowGuardContainer,3),this._overflowGuardContainer.setClassName("overflow-guard"),this._scrollbar=new l.EditorScrollbar(this._context,this._linesContent,this.domNode,this._overflowGuardContainer),this._viewParts.push(this._scrollbar),this._viewLines=new C.ViewLines(this._context,this._linesContent),this._viewZones=new N.ViewZones(this._context),this._viewParts.push(this._viewZones);const ge=new L.DecorationsOverviewRuler(this._context);this._viewParts.push(ge);const X=new M.ScrollDecorationViewPart(this._context);this._viewParts.push(X);const B=new n.ContentViewOverlays(this._context);this._viewParts.push(B),B.addDynamicOverlay(new g.CurrentLineHighlightOverlay(this._context)),B.addDynamicOverlay(new A.SelectionsOverlay(this._context)),B.addDynamicOverlay(new r.IndentGuidesOverlay(this._context)),B.addDynamicOverlay(new c.DecorationsOverlay(this._context)),B.addDynamicOverlay(new O.WhitespaceOverlay(this._context));const $=new n.MarginViewOverlays(this._context);this._viewParts.push($),$.addDynamicOverlay(new g.CurrentLineMarginHighlightOverlay(this._context)),$.addDynamicOverlay(new v.MarginViewLineDecorationsOverlay(this._context)),$.addDynamicOverlay(new f.LinesDecorationsOverlay(this._context)),$.addDynamicOverlay(new u.LineNumbersOverlay(this._context)),this._glyphMarginWidgets=new a.GlyphMarginWidgets(this._context),this._viewParts.push(this._glyphMarginWidgets);const Q=new h.Margin(this._context);Q.getDomNode().appendChild(this._viewZones.marginDomNode),Q.getDomNode().appendChild($.getDomNode()),Q.getDomNode().appendChild(this._glyphMarginWidgets.domNode),this._viewParts.push(Q),this._contentWidgets=new s.ViewContentWidgets(this._context,this.domNode),this._viewParts.push(this._contentWidgets),this._viewCursors=new P.ViewCursors(this._context),this._viewParts.push(this._viewCursors),this._overlayWidgets=new S.ViewOverlayWidgets(this._context,this.domNode),this._viewParts.push(this._overlayWidgets);const Z=new T.Rulers(this._context);this._viewParts.push(Z);const te=new i.BlockDecorations(this._context);this._viewParts.push(te);const re=new w.Minimap(this._context);if(this._viewParts.push(re),ge){const le=this._scrollbar.getOverviewRulerLayoutInfo();le.parent.insertBefore(ge.getDomNode(),le.insertBefore)}this._linesContent.appendChild(B.getDomNode()),this._linesContent.appendChild(Z.domNode),this._linesContent.appendChild(this._viewZones.domNode),this._linesContent.appendChild(this._viewLines.getDomNode()),this._linesContent.appendChild(this._contentWidgets.domNode),this._linesContent.appendChild(this._viewCursors.getDomNode()),this._overflowGuardContainer.appendChild(Q.getDomNode()),this._overflowGuardContainer.appendChild(this._scrollbar.getDomNode()),this._overflowGuardContainer.appendChild(X.getDomNode()),this._overflowGuardContainer.appendChild(this._textAreaHandler.textArea),this._overflowGuardContainer.appendChild(this._textAreaHandler.textAreaCover),this._overflowGuardContainer.appendChild(this._overlayWidgets.getDomNode()),this._overflowGuardContainer.appendChild(re.getDomNode()),this._overflowGuardContainer.appendChild(te.domNode),this.domNode.appendChild(this._overflowGuardContainer),ae?(ae.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode.domNode),ae.appendChild(this._overlayWidgets.overflowingOverlayWidgetsDomNode.domNode)):(this.domNode.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode),this.domNode.appendChild(this._overlayWidgets.overflowingOverlayWidgetsDomNode)),this._applyLayout(),this._pointerHandler=this._register(new m.PointerHandler(this._context,de,this._createPointerHandlerHelper()))}_computeGlyphMarginLanes(){const J=this._context.viewModel.model,ie=this._context.viewModel.glyphLanes;let ue=[],he=0;ue=ue.concat(J.getAllMarginDecorations().map(pe=>{const ae=pe.options.glyphMargin?.position??V.GlyphMarginLane.Center;return he=Math.max(he,pe.range.endLineNumber),{range:pe.range,lane:ae,persist:pe.options.glyphMargin?.persistLane}})),ue=ue.concat(this._glyphMarginWidgets.getWidgets().map(pe=>{const ae=J.validateRange(pe.preference.range);return he=Math.max(he,ae.endLineNumber),{range:ae,lane:pe.preference.lane}})),ue.sort((pe,ae)=>x.Range.compareRangesUsingStarts(pe.range,ae.range)),ie.reset(he);for(const pe of ue)ie.push(pe.lane,pe.range,pe.persist);return ie}_createPointerHandlerHelper(){return{viewDomNode:this.domNode.domNode,linesContentDomNode:this._linesContent.domNode,viewLinesDomNode:this._viewLines.getDomNode().domNode,focusTextArea:()=>{this.focus()},dispatchTextAreaEvent:J=>{this._textAreaHandler.textArea.domNode.dispatchEvent(J)},getLastRenderData:()=>{const J=this._viewCursors.getLastRenderData()||[],ie=this._textAreaHandler.getLastRenderData();return new y.PointerHandlerLastRenderData(J,ie)},renderNow:()=>{this.render(!0,!1)},shouldSuppressMouseDownOnViewZone:J=>this._viewZones.shouldSuppressMouseDownOnViewZone(J),shouldSuppressMouseDownOnWidget:J=>this._contentWidgets.shouldSuppressMouseDownOnWidget(J),getPositionFromDOMInfo:(J,ie)=>(this._flushAccumulatedAndRenderNow(),this._viewLines.getPositionFromDOMInfo(J,ie)),visibleRangeForPosition:(J,ie)=>(this._flushAccumulatedAndRenderNow(),this._viewLines.visibleRangeForPosition(new F.Position(J,ie))),getLineWidth:J=>(this._flushAccumulatedAndRenderNow(),this._viewLines.getLineWidth(J))}}_createTextAreaHandlerHelper(){return{visibleRangeForPosition:J=>(this._flushAccumulatedAndRenderNow(),this._viewLines.visibleRangeForPosition(J))}}_applyLayout(){const ie=this._context.configuration.options.get(146);this.domNode.setWidth(ie.width),this.domNode.setHeight(ie.height),this._overflowGuardContainer.setWidth(ie.width),this._overflowGuardContainer.setHeight(ie.height),this._linesContent.setWidth(16777216),this._linesContent.setHeight(16777216)}_getEditorClassName(){const J=this._textAreaHandler.isFocused()?" focused":"";return this._context.configuration.options.get(143)+" "+(0,j.getThemeTypeSelector)(this._context.theme.type)+J}handleEvents(J){super.handleEvents(J),this._scheduleRender()}onConfigurationChanged(J){return this.domNode.setClassName(this._getEditorClassName()),this._applyLayout(),!1}onCursorStateChanged(J){return this._selections=J.selections,!1}onDecorationsChanged(J){return J.affectsGlyphMargin&&(this._shouldRecomputeGlyphMarginLanes=!0),!1}onFocusChanged(J){return this.domNode.setClassName(this._getEditorClassName()),!1}onThemeChanged(J){return this._context.theme.update(J.theme),this.domNode.setClassName(this._getEditorClassName()),!1}dispose(){this._renderAnimationFrame!==null&&(this._renderAnimationFrame.dispose(),this._renderAnimationFrame=null),this._contentWidgets.overflowingContentWidgetsDomNode.domNode.remove(),this._context.removeEventHandler(this),this._viewLines.dispose();for(const J of this._viewParts)J.dispose();super.dispose()}_scheduleRender(){if(this._store.isDisposed)throw new E.BugIndicatingError;if(this._renderAnimationFrame===null){const J=this._createCoordinatedRendering();this._renderAnimationFrame=K.INSTANCE.scheduleCoordinatedRendering({window:d.getWindow(this.domNode?.domNode),prepareRenderText:()=>{if(this._store.isDisposed)throw new E.BugIndicatingError;try{return J.prepareRenderText()}finally{this._renderAnimationFrame=null}},renderText:()=>{if(this._store.isDisposed)throw new E.BugIndicatingError;return J.renderText()},prepareRender:(ie,ue)=>{if(this._store.isDisposed)throw new E.BugIndicatingError;return J.prepareRender(ie,ue)},render:(ie,ue)=>{if(this._store.isDisposed)throw new E.BugIndicatingError;return J.render(ie,ue)}})}}_flushAccumulatedAndRenderNow(){const J=this._createCoordinatedRendering();G(()=>J.prepareRenderText());const ie=G(()=>J.renderText());if(ie){const[ue,he]=ie;G(()=>J.prepareRender(ue,he)),G(()=>J.render(ue,he))}}_getViewPartsToRender(){const J=[];let ie=0;for(const ue of this._viewParts)ue.shouldRender()&&(J[ie++]=ue);return J}_createCoordinatedRendering(){return{prepareRenderText:()=>{if(this._shouldRecomputeGlyphMarginLanes){this._shouldRecomputeGlyphMarginLanes=!1;const J=this._computeGlyphMarginLanes();this._context.configuration.setGlyphMarginDecorationLaneCount(J.requiredLanes)}I.inputLatency.onRenderStart()},renderText:()=>{if(!this.domNode.domNode.isConnected)return null;let J=this._getViewPartsToRender();if(!this._viewLines.shouldRender()&&J.length===0)return null;const ie=this._context.viewLayout.getLinesViewportData();this._context.viewModel.setViewport(ie.startLineNumber,ie.endLineNumber,ie.centeredLineNumber);const ue=new H.ViewportData(this._selections,ie,this._context.viewLayout.getWhitespaceViewportData(),this._context.viewModel);return this._contentWidgets.shouldRender()&&this._contentWidgets.onBeforeRender(ue),this._viewLines.shouldRender()&&(this._viewLines.renderText(ue),this._viewLines.onDidRender(),J=this._getViewPartsToRender()),[J,new b.RenderingContext(this._context.viewLayout,ue,this._viewLines)]},prepareRender:(J,ie)=>{for(const ue of J)ue.prepareRender(ie)},render:(J,ie)=>{for(const ue of J)ue.render(ie),ue.onDidRender()}}}delegateVerticalScrollbarPointerDown(J){this._scrollbar.delegateVerticalScrollbarPointerDown(J)}delegateScrollFromMouseWheelEvent(J){this._scrollbar.delegateScrollFromMouseWheelEvent(J)}restoreState(J){this._context.viewModel.viewLayout.setScrollPosition({scrollTop:J.scrollTop,scrollLeft:J.scrollLeft},1),this._context.viewModel.visibleLinesStabilized()}getOffsetForColumn(J,ie){const ue=this._context.viewModel.model.validatePosition({lineNumber:J,column:ie}),he=this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(ue);this._flushAccumulatedAndRenderNow();const pe=this._viewLines.visibleRangeForPosition(new F.Position(he.lineNumber,he.column));return pe?pe.left:-1}getTargetAtClientPoint(J,ie){const ue=this._pointerHandler.getTargetAtClientPoint(J,ie);return ue?t.ViewUserInputEvents.convertViewToModelMouseTarget(ue,this._context.viewModel.coordinatesConverter):null}createOverviewRuler(J){return new D.OverviewRuler(this._context,J)}change(J){this._viewZones.changeViewZones(J),this._scheduleRender()}render(J,ie){if(ie){this._viewLines.forceShouldRender();for(const ue of this._viewParts)ue.forceShouldRender()}J?this._flushAccumulatedAndRenderNow():this._scheduleRender()}writeScreenReaderContent(J){this._textAreaHandler.writeScreenReaderContent(J)}focus(){this._textAreaHandler.focusTextArea()}isFocused(){return this._textAreaHandler.isFocused()}setAriaOptions(J){this._textAreaHandler.setAriaOptions(J)}addContentWidget(J){this._contentWidgets.addWidget(J.widget),this.layoutContentWidget(J),this._scheduleRender()}layoutContentWidget(J){this._contentWidgets.setWidgetPosition(J.widget,J.position?.position??null,J.position?.secondaryPosition??null,J.position?.preference??null,J.position?.positionAffinity??null),this._scheduleRender()}removeContentWidget(J){this._contentWidgets.removeWidget(J.widget),this._scheduleRender()}addOverlayWidget(J){this._overlayWidgets.addWidget(J.widget),this.layoutOverlayWidget(J),this._scheduleRender()}layoutOverlayWidget(J){this._overlayWidgets.setWidgetPosition(J.widget,J.position)&&this._scheduleRender()}removeOverlayWidget(J){this._overlayWidgets.removeWidget(J.widget),this._scheduleRender()}addGlyphMarginWidget(J){this._glyphMarginWidgets.addWidget(J.widget),this._shouldRecomputeGlyphMarginLanes=!0,this._scheduleRender()}layoutGlyphMarginWidget(J){const ie=J.position;this._glyphMarginWidgets.setWidgetPosition(J.widget,ie)&&(this._shouldRecomputeGlyphMarginLanes=!0,this._scheduleRender())}removeGlyphMarginWidget(J){this._glyphMarginWidgets.removeWidget(J.widget),this._shouldRecomputeGlyphMarginLanes=!0,this._scheduleRender()}};e.View=Y,e.View=Y=ke([ce(6,U.IInstantiationService)],Y);function G(R){try{return R()}catch(J){return(0,E.onUnexpectedError)(J),null}}class K{static{this.INSTANCE=new K}constructor(){this._coordinatedRenderings=[],this._animationFrameRunners=new Map}scheduleCoordinatedRendering(J){return this._coordinatedRenderings.push(J),this._scheduleRender(J.window),{dispose:()=>{const ie=this._coordinatedRenderings.indexOf(J);if(ie!==-1&&(this._coordinatedRenderings.splice(ie,1),this._coordinatedRenderings.length===0)){for(const[ue,he]of this._animationFrameRunners)he.dispose();this._animationFrameRunners.clear()}}}}_scheduleRender(J){if(!this._animationFrameRunners.has(J)){const ie=()=>{this._animationFrameRunners.delete(J),this._onRenderScheduled()};this._animationFrameRunners.set(J,d.runAtThisOrScheduleAtNextAnimationFrame(J,ie,100))}}_onRenderScheduled(){const J=this._coordinatedRenderings.slice(0);this._coordinatedRenderings=[];for(const ue of J)G(()=>ue.prepareRenderText());const ie=[];for(let ue=0,he=J.length;uepe.renderText())}for(let ue=0,he=J.length;uepe.prepareRender(ee,de))}for(let ue=0,he=J.length;uepe.render(ee,de))}}}}),define(ne[783],se([1,0,6,2,4,80,25]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorizedBracketPairsDecorationProvider=void 0;class m extends k.Disposable{constructor(p){super(),this.textModel=p,this.colorProvider=new _,this.onDidChangeEmitter=new d.Emitter,this.onDidChange=this.onDidChangeEmitter.event,this.colorizationOptions=p.getOptions().bracketPairColorizationOptions,this._register(p.bracketPairs.onDidChange(n=>{this.onDidChangeEmitter.fire()}))}handleDidChangeOptions(p){this.colorizationOptions=this.textModel.getOptions().bracketPairColorizationOptions}getDecorationsInRange(p,n,o,t){return t?[]:n===void 0?[]:this.colorizationOptions.enabled?this.textModel.bracketPairs.getBracketsInRange(p,!0).map(s=>({id:`bracket${s.range.toString()}-${s.nestingLevel}`,options:{description:"BracketPairColorization",inlineClassName:this.colorProvider.getInlineClassName(s,this.colorizationOptions.independentColorPoolPerBracketType)},ownerId:0,range:s.range})).toArray():[]}getAllDecorations(p,n){return p===void 0?[]:this.colorizationOptions.enabled?this.getDecorationsInRange(new I.Range(1,1,this.textModel.getLineCount(),1),p,n):[]}}e.ColorizedBracketPairsDecorationProvider=m;class _{constructor(){this.unexpectedClosingBracketClassName="unexpected-closing-bracket"}getInlineClassName(p,n){return p.isInvalid?this.unexpectedClosingBracketClassName:this.getInlineClassNameOfLevel(n?p.nestingLevelOfEqualBracketType:p.nestingLevel)}getInlineClassNameOfLevel(p){return`bracket-highlighting-${p%30}`}}(0,y.registerThemingParticipant)((b,p)=>{const n=[E.editorBracketHighlightingForeground1,E.editorBracketHighlightingForeground2,E.editorBracketHighlightingForeground3,E.editorBracketHighlightingForeground4,E.editorBracketHighlightingForeground5,E.editorBracketHighlightingForeground6],o=new _;p.addRule(`.monaco-editor .${o.unexpectedClosingBracketClassName} { color: ${b.getColor(E.editorBracketHighlightingUnexpectedBracketForeground)}; }`);const t=n.map(i=>b.getColor(i)).filter(i=>!!i).filter(i=>!i.isTransparent());for(let i=0;i<30;i++){const s=t[i%t.length];p.addRule(`.monaco-editor .${o.getInlineClassNameOfLevel(i)} { color: ${s}; }`)}})}),define(ne[784],se([1,0,108,2,40,25,80,51,4,42,6,32,45,298]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarkerDecorationsService=void 0;let i=class extends k.Disposable{constructor(c,l){super(),this._markerService=l,this._onDidChangeMarker=this._register(new p.Emitter),this._markerDecorations=new o.ResourceMap,c.getModels().forEach(a=>this._onModelAdded(a)),this._register(c.onModelAdded(this._onModelAdded,this)),this._register(c.onModelRemoved(this._onModelRemoved,this)),this._register(this._markerService.onMarkerChanged(this._handleMarkerChange,this))}dispose(){super.dispose(),this._markerDecorations.forEach(c=>c.dispose()),this._markerDecorations.clear()}getMarker(c,l){const a=this._markerDecorations.get(c);return a&&a.getMarker(l)||null}_handleMarkerChange(c){c.forEach(l=>{const a=this._markerDecorations.get(l);a&&this._updateDecorations(a)})}_onModelAdded(c){const l=new s(c);this._markerDecorations.set(c.uri,l),this._updateDecorations(l)}_onModelRemoved(c){const l=this._markerDecorations.get(c.uri);l&&(l.dispose(),this._markerDecorations.delete(c.uri)),(c.uri.scheme===b.Schemas.inMemory||c.uri.scheme===b.Schemas.internal||c.uri.scheme===b.Schemas.vscode)&&this._markerService?.read({resource:c.uri}).map(a=>a.owner).forEach(a=>this._markerService.remove(a,[c.uri]))}_updateDecorations(c){const l=this._markerService.read({resource:c.model.uri,take:500});c.update(l)&&this._onDidChangeMarker.fire(c.model)}};e.MarkerDecorationsService=i,e.MarkerDecorationsService=i=ke([ce(0,m.IModelService),ce(1,d.IMarkerService)],i);class s extends k.Disposable{constructor(c){super(),this.model=c,this._map=new o.BidirectionalMap,this._register((0,k.toDisposable)(()=>{this.model.deltaDecorations([...this._map.values()],[]),this._map.clear()}))}update(c){const{added:l,removed:a}=(0,t.diffSets)(new Set(this._map.keys()),new Set(c));if(l.length===0&&a.length===0)return!1;const r=a.map(f=>this._map.get(f)),u=l.map(f=>({range:this._createDecorationRange(this.model,f),options:this._createDecorationOption(f)})),C=this.model.deltaDecorations(r,u);for(const f of a)this._map.delete(f);for(let f=0;f=r)return a;const u=c.getWordAtPosition(a.getStartPosition());u&&(a=new _.Range(a.startLineNumber,u.startColumn,a.endLineNumber,u.endColumn))}else if(l.endColumn===Number.MAX_VALUE&&l.startColumn===1&&a.startLineNumber===a.endLineNumber){const r=c.getLineFirstNonWhitespaceColumn(l.startLineNumber);r=0:!1}}}),define(ne[282],se([1,0,148,25,62,589,43]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticTokensProviderStyling=void 0,e.toMultilineTokens2=b;const m=!1;let _=class{constructor(t,i,s,g){this._legend=t,this._themeService=i,this._languageService=s,this._logService=g,this._hasWarnedOverlappingTokens=!1,this._hasWarnedInvalidLengthTokens=!1,this._hasWarnedInvalidEditStart=!1,this._hashTable=new n}getMetadata(t,i,s){const g=this._languageService.languageIdCodec.encodeLanguageId(s),c=this._hashTable.get(t,i,g);let l;if(c)l=c.metadata,m&&this._logService.getLevel()===I.LogLevel.Trace&&this._logService.trace(`SemanticTokensProviderStyling [CACHED] ${t} / ${i}: foreground ${d.TokenMetadata.getForeground(l)}, fontStyle ${d.TokenMetadata.getFontStyle(l).toString(2)}`);else{let a=this._legend.tokenTypes[t];const r=[];if(a){let u=i;for(let f=0;u>0&&f>1;m&&u>0&&this._logService.getLevel()===I.LogLevel.Trace&&(this._logService.trace(`SemanticTokensProviderStyling: unknown token modifier index: ${i.toString(2)} for legend: ${JSON.stringify(this._legend.tokenModifiers)}`),r.push("not-in-legend"));const C=this._themeService.getColorTheme().getTokenStyleMetadata(a,r,s);if(typeof C>"u")l=2147483647;else{if(l=0,typeof C.italic<"u"){const f=(C.italic?1:0)<<11;l|=f|1}if(typeof C.bold<"u"){const f=(C.bold?2:0)<<11;l|=f|2}if(typeof C.underline<"u"){const f=(C.underline?4:0)<<11;l|=f|4}if(typeof C.strikethrough<"u"){const f=(C.strikethrough?8:0)<<11;l|=f|8}if(C.foreground){const f=C.foreground<<15;l|=f|16}l===0&&(l=2147483647)}}else m&&this._logService.getLevel()===I.LogLevel.Trace&&this._logService.trace(`SemanticTokensProviderStyling: unknown token type index: ${t} for legend: ${JSON.stringify(this._legend.tokenTypes)}`),l=2147483647,a="not-in-legend";this._hashTable.add(t,i,g,l),m&&this._logService.getLevel()===I.LogLevel.Trace&&this._logService.trace(`SemanticTokensProviderStyling ${t} (${a}) / ${i} (${r.join(" ")}): foreground ${d.TokenMetadata.getForeground(l)}, fontStyle ${d.TokenMetadata.getFontStyle(l).toString(2)}`)}return l}warnOverlappingSemanticTokens(t,i){this._hasWarnedOverlappingTokens||(this._hasWarnedOverlappingTokens=!0,this._logService.warn(`Overlapping semantic tokens detected at lineNumber ${t}, column ${i}`))}warnInvalidLengthSemanticTokens(t,i){this._hasWarnedInvalidLengthTokens||(this._hasWarnedInvalidLengthTokens=!0,this._logService.warn(`Semantic token with invalid length detected at lineNumber ${t}, column ${i}`))}warnInvalidEditStart(t,i,s,g,c){this._hasWarnedInvalidEditStart||(this._hasWarnedInvalidEditStart=!0,this._logService.warn(`Invalid semantic tokens edit detected (previousResultId: ${t}, resultId: ${i}) at edit #${s}: The provided start offset ${g} is outside the previous data (length ${c}).`))}};e.SemanticTokensProviderStyling=_,e.SemanticTokensProviderStyling=_=ke([ce(1,k.IThemeService),ce(2,y.ILanguageService),ce(3,I.ILogService)],_);function b(o,t,i){const s=o.data,g=o.data.length/5|0,c=Math.max(Math.ceil(g/1024),400),l=[];let a=0,r=1,u=0;for(;aC&&s[5*T]===0;)T--;if(T-1===C){let M=f;for(;M+1N)t.warnOverlappingSemanticTokens(P,N+1);else{const V=t.getMetadata(x,W,i);V!==2147483647&&(w===0&&(w=P),h[v]=P-w,h[v+1]=N,h[v+2]=F,h[v+3]=V,v+=4,S=P,L=F)}r=P,u=N,a++}v!==h.length&&(h=h.subarray(0,v));const D=E.SparseMultilineTokens.create(w,h);l.push(D)}return l}class p{constructor(t,i,s,g){this.tokenTypeIndex=t,this.tokenModifierSet=i,this.languageId=s,this.metadata=g,this.next=null}}class n{static{this._SIZES=[3,7,13,31,61,127,251,509,1021,2039,4093,8191,16381,32749,65521,131071,262139,524287,1048573,2097143]}constructor(){this._elementsCount=0,this._currentLengthIndex=0,this._currentLength=n._SIZES[this._currentLengthIndex],this._growCount=Math.round(this._currentLengthIndex+1=this._growCount){const c=this._elements;this._currentLengthIndex++,this._currentLength=n._SIZES[this._currentLengthIndex],this._growCount=Math.round(this._currentLengthIndex+1{this._caches=new WeakMap}))}getStyling(n){return this._caches.has(n)||this._caches.set(n,new y.SemanticTokensProviderStyling(n.getLegend(),this._themeService,this._languageService,this._logService)),this._caches.get(n)}};e.SemanticTokensStylingService=b,e.SemanticTokensStylingService=b=ke([ce(0,I.IThemeService),ce(1,E.ILogService),ce(2,k.ILanguageService)],b),(0,_.registerSingleton)(m.ISemanticTokensStylingService,b,1)}),define(ne[786],se([1,0,15,80,3,89,379,700,528]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),(0,d.registerEditorContribution)(y.PlaceholderTextContribution.ID,(0,m.wrapInReloadableClass1)(()=>y.PlaceholderTextContribution),0),(0,E.registerColor)("editor.placeholder.foreground",k.ghostTextForeground,(0,I.localize)(1194,"Foreground color of the placeholder text in the editor."))}),define(ne[417],se([1,0,127,2,168,40,80,25,46]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractEditorNavigationQuickAccessProvider=void 0;class b{constructor(n){this.options=n,this.rangeHighlightDecorationId=void 0}provide(n,o,t){const i=new k.DisposableStore;n.canAcceptInBackground=!!this.options?.canAcceptInBackground,n.matchOnLabel=n.matchOnDescription=n.matchOnDetail=n.sortByLabel=!1;const s=i.add(new k.MutableDisposable);return s.value=this.doProvide(n,o,t),i.add(this.onDidActiveTextEditorControlChange(()=>{s.value=void 0,s.value=this.doProvide(n,o)})),i}doProvide(n,o,t){const i=new k.DisposableStore,s=this.activeTextEditorControl;if(s&&this.canProvideWithTextEditor(s)){const g={editor:s},c=(0,I.getCodeEditor)(s);if(c){let l=s.saveViewState()??void 0;i.add(c.onDidChangeCursorPosition(()=>{l=s.saveViewState()??void 0})),g.restoreViewState=()=>{l&&s===this.activeTextEditorControl&&s.restoreViewState(l)},i.add((0,d.createSingleCallFunction)(o.onCancellationRequested)(()=>g.restoreViewState?.()))}i.add((0,k.toDisposable)(()=>this.clearDecorations(s))),i.add(this.provideWithTextEditor(g,n,o,t))}else i.add(this.provideWithoutTextEditor(n,o));return i}canProvideWithTextEditor(n){return!0}gotoLocation({editor:n},o){n.setSelection(o.range,"code.jump"),n.revealRangeInCenter(o.range,0),o.preserveFocus||n.focus();const t=n.getModel();t&&"getLineContent"in t&&(0,_.status)(`${t.getLineContent(o.range.startLineNumber)}`)}getModel(n){return(0,I.isDiffEditor)(n)?n.getModel()?.modified:n.getModel()}addDecorations(n,o){n.changeDecorations(t=>{const i=[];this.rangeHighlightDecorationId&&(i.push(this.rangeHighlightDecorationId.overviewRulerDecorationId),i.push(this.rangeHighlightDecorationId.rangeHighlightId),this.rangeHighlightDecorationId=void 0);const s=[{range:o,options:{description:"quick-access-range-highlight",className:"rangeHighlight",isWholeLine:!0}},{range:o,options:{description:"quick-access-range-highlight-overview",overviewRuler:{color:(0,m.themeColorFromId)(y.overviewRulerRangeHighlight),position:E.OverviewRulerLane.Full}}}],[g,c]=t.deltaDecorations(i,s);this.rangeHighlightDecorationId={rangeHighlightId:g,overviewRulerDecorationId:c}})}clearDecorations(n){const o=this.rangeHighlightDecorationId;o&&(n.changeDecorations(t=>{t.deltaDecorations([o.overviewRulerDecorationId,o.rangeHighlightId],[])}),this.rangeHighlightDecorationId=void 0)}}e.AbstractEditorNavigationQuickAccessProvider=b}),define(ne[787],se([1,0,2,168,417,3]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractGotoLineQuickAccessProvider=void 0;class y extends I.AbstractEditorNavigationQuickAccessProvider{static{this.PREFIX=":"}constructor(){super({canAcceptInBackground:!0})}provideWithoutTextEditor(_){const b=(0,E.localize)(1195,"Open a text editor first to go to a line.");return _.items=[{label:b}],_.ariaLabel=b,d.Disposable.None}provideWithTextEditor(_,b,p){const n=_.editor,o=new d.DisposableStore;o.add(b.onDidAccept(s=>{const[g]=b.selectedItems;if(g){if(!this.isValidLineNumber(n,g.lineNumber))return;this.gotoLocation(_,{range:this.toRange(g.lineNumber,g.column),keyMods:b.keyMods,preserveFocus:s.inBackground}),s.inBackground||b.hide()}}));const t=()=>{const s=this.parsePosition(n,b.value.trim().substr(y.PREFIX.length)),g=this.getPickLabel(n,s.lineNumber,s.column);if(b.items=[{lineNumber:s.lineNumber,column:s.column,label:g}],b.ariaLabel=g,!this.isValidLineNumber(n,s.lineNumber)){this.clearDecorations(n);return}const c=this.toRange(s.lineNumber,s.column);n.revealRangeInCenter(c,0),this.addDecorations(n,c)};t(),o.add(b.onDidChangeValue(()=>t()));const i=(0,k.getCodeEditor)(n);return i&&i.getOptions().get(68).renderType===2&&(i.updateOptions({lineNumbers:"on"}),o.add((0,d.toDisposable)(()=>i.updateOptions({lineNumbers:"relative"})))),o}toRange(_=1,b=1){return{startLineNumber:_,startColumn:b,endLineNumber:_,endColumn:b}}parsePosition(_,b){const p=b.split(/,|:|#/).map(o=>parseInt(o,10)).filter(o=>!isNaN(o)),n=this.lineCount(_)+1;return{lineNumber:p[0]>0?p[0]:n+p[0],column:p[1]}}getPickLabel(_,b,p){if(this.isValidLineNumber(_,b))return this.isValidColumn(_,b,p)?(0,E.localize)(1196,"Go to line {0} and character {1}.",b,p):(0,E.localize)(1197,"Go to line {0}.",b);const n=_.getPosition()||{lineNumber:1,column:1},o=this.lineCount(_);return o>1?(0,E.localize)(1198,"Current Line: {0}, Character: {1}. Type a line number between 1 and {2} to navigate to.",n.lineNumber,n.column,o):(0,E.localize)(1199,"Current Line: {0}, Character: {1}. Type a line number to navigate to.",n.lineNumber,n.column)}isValidLineNumber(_,b){return!b||typeof b!="number"?!1:b>0&&b<=this.lineCount(_)}isValidColumn(_,b,p){if(!p||typeof p!="number")return!1;const n=this.getModel(_);if(!n)return!1;const o={lineNumber:b,column:p};return n.validatePosition(o).equals(o)}lineCount(_){return this.getModel(_)?.getLineCount()??0}}e.AbstractGotoLineQuickAccessProvider=y}),define(ne[788],se([1,0,14,18,26,30,628,2,11,4,27,182,417,3,17,67]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s){"use strict";var g;Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractGotoSymbolQuickAccessProvider=void 0;let c=class extends o.AbstractEditorNavigationQuickAccessProvider{static{g=this}static{this.PREFIX="@"}static{this.SCOPE_PREFIX=":"}static{this.PREFIX_BY_CATEGORY=`${this.PREFIX}${this.SCOPE_PREFIX}`}constructor(u,C,f=Object.create(null)){super(f),this._languageFeaturesService=u,this._outlineModelService=C,this.options=f,this.options.canAcceptInBackground=!0}provideWithoutTextEditor(u){return this.provideLabelPick(u,(0,t.localize)(1200,"To go to a symbol, first open a text editor with symbol information.")),m.Disposable.None}provideWithTextEditor(u,C,f,h){const v=u.editor,w=this.getModel(v);return w?this._languageFeaturesService.documentSymbolProvider.has(w)?this.doProvideWithEditorSymbols(u,w,C,f,h):this.doProvideWithoutEditorSymbols(u,w,C,f):m.Disposable.None}doProvideWithoutEditorSymbols(u,C,f,h){const v=new m.DisposableStore;return this.provideLabelPick(f,(0,t.localize)(1201,"The active text editor does not provide symbol information.")),(async()=>!await this.waitForLanguageSymbolRegistry(C,v)||h.isCancellationRequested||v.add(this.doProvideWithEditorSymbols(u,C,f,h)))(),v}provideLabelPick(u,C){u.items=[{label:C,index:0,kind:14}],u.ariaLabel=C}async waitForLanguageSymbolRegistry(u,C){if(this._languageFeaturesService.documentSymbolProvider.has(u))return!0;const f=new d.DeferredPromise,h=C.add(this._languageFeaturesService.documentSymbolProvider.onDidChange(()=>{this._languageFeaturesService.documentSymbolProvider.has(u)&&(h.dispose(),f.complete(!0))}));return C.add((0,m.toDisposable)(()=>f.complete(!1))),f.p}doProvideWithEditorSymbols(u,C,f,h,v){const w=u.editor,S=new m.DisposableStore;S.add(f.onDidAccept(M=>{const[A]=f.selectedItems;A&&A.range&&(this.gotoLocation(u,{range:A.range.selection,keyMods:f.keyMods,preserveFocus:M.inBackground}),v?.handleAccept?.(A),M.inBackground||f.hide())})),S.add(f.onDidTriggerItemButton(({item:M})=>{M&&M.range&&(this.gotoLocation(u,{range:M.range.selection,keyMods:f.keyMods,forceSideBySide:!0}),f.hide())}));const L=this.getDocumentSymbols(C,h);let D;const T=async M=>{D?.dispose(!0),f.busy=!1,D=new k.CancellationTokenSource(h),f.busy=!0;try{const A=(0,y.prepareQuery)(f.value.substr(g.PREFIX.length).trim()),P=await this.doGetSymbolPicks(L,A,void 0,D.token,C);if(h.isCancellationRequested)return;if(P.length>0){if(f.items=P,M&&A.original.length===0){const N=(0,s.findLast)(P,O=>!!(O.type!=="separator"&&O.range&&b.Range.containsPosition(O.range.decoration,M)));N&&(f.activeItems=[N])}}else A.original.length>0?this.provideLabelPick(f,(0,t.localize)(1202,"No matching editor symbols")):this.provideLabelPick(f,(0,t.localize)(1203,"No editor symbols"))}finally{h.isCancellationRequested||(f.busy=!1)}};return S.add(f.onDidChangeValue(()=>T(void 0))),T(w.getSelection()?.getPosition()),S.add(f.onDidChangeActive(()=>{const[M]=f.activeItems;M&&M.range&&(w.revealRangeInCenter(M.range.selection,0),this.addDecorations(w,M.range.decoration))})),S}async doGetSymbolPicks(u,C,f,h,v){const w=await u;if(h.isCancellationRequested)return[];const S=C.original.indexOf(g.SCOPE_PREFIX)===0,L=S?1:0;let D,T;C.values&&C.values.length>1?(D=(0,y.pieceToQuery)(C.values[0]),T=(0,y.pieceToQuery)(C.values.slice(1))):D=C;let M;const A=this.options?.openSideBySideDirection?.();A&&(M=[{iconClass:A==="right"?E.ThemeIcon.asClassName(I.Codicon.splitHorizontal):E.ThemeIcon.asClassName(I.Codicon.splitVertical),tooltip:A==="right"?(0,t.localize)(1204,"Open to the Side"):(0,t.localize)(1205,"Open to the Bottom")}]);const P=[];for(let F=0;FL){let K=!1;if(D!==C&&([z,U]=(0,y.scoreFuzzy2)(V,{...C,values:void 0},L,q),typeof z=="number"&&(K=!0)),typeof z!="number"&&([z,U]=(0,y.scoreFuzzy2)(V,D,L,q),typeof z!="number"))continue;if(!K&&T){if(H&&T.original.length>0&&([j,Y]=(0,y.scoreFuzzy2)(H,T)),typeof j!="number")continue;typeof z=="number"&&(z+=j)}}const G=x.tags&&x.tags.indexOf(1)>=0;P.push({index:F,kind:x.kind,score:z,label:V,ariaLabel:(0,p.getAriaLabelForSymbol)(x.name,x.kind),description:H,highlights:G?void 0:{label:U,description:Y},range:{selection:b.Range.collapseToStart(x.selectionRange),decoration:x.range},uri:v.uri,symbolName:W,strikethrough:G,buttons:M})}const N=P.sort((F,x)=>S?this.compareByKindAndScore(F,x):this.compareByScore(F,x));let O=[];if(S){let V=function(){x&&typeof F=="number"&&W>0&&(x.label=(0,_.format)(a[F]||l,W))},F,x,W=0;for(const q of N)F!==q.kind?(V(),F=q.kind,W=1,x={type:"separator"},O.push(x)):W++,O.push(q);V()}else N.length>0&&(O=[{label:(0,t.localize)(1206,"symbols ({0})",P.length),type:"separator"},...N]);return O}compareByScore(u,C){if(typeof u.score!="number"&&typeof C.score=="number")return 1;if(typeof u.score=="number"&&typeof C.score!="number")return-1;if(typeof u.score=="number"&&typeof C.score=="number"){if(u.score>C.score)return-1;if(u.scoreC.index?1:0}compareByKindAndScore(u,C){const f=a[u.kind]||l,h=a[C.kind]||l,v=f.localeCompare(h);return v===0?this.compareByScore(u,C):v}async getDocumentSymbols(u,C){const f=await this._outlineModelService.getOrCreate(u,C);return C.isCancellationRequested?[]:f.asListOfDocumentSymbols()}};e.AbstractGotoSymbolQuickAccessProvider=c,e.AbstractGotoSymbolQuickAccessProvider=c=g=ke([ce(0,i.ILanguageFeaturesService),ce(1,n.IOutlineModelService)],c);const l=(0,t.localize)(1207,"properties ({0})"),a={5:(0,t.localize)(1208,"methods ({0})"),11:(0,t.localize)(1209,"functions ({0})"),8:(0,t.localize)(1210,"constructors ({0})"),12:(0,t.localize)(1211,"variables ({0})"),4:(0,t.localize)(1212,"classes ({0})"),22:(0,t.localize)(1213,"structs ({0})"),23:(0,t.localize)(1214,"events ({0})"),24:(0,t.localize)(1215,"operators ({0})"),10:(0,t.localize)(1216,"interfaces ({0})"),2:(0,t.localize)(1217,"namespaces ({0})"),3:(0,t.localize)(1218,"packages ({0})"),25:(0,t.localize)(1219,"type parameters ({0})"),1:(0,t.localize)(1220,"modules ({0})"),6:(0,t.localize)(1221,"properties ({0})"),9:(0,t.localize)(1222,"enumerations ({0})"),21:(0,t.localize)(1223,"enumeration members ({0})"),14:(0,t.localize)(1224,"strings ({0})"),0:(0,t.localize)(1225,"files ({0})"),17:(0,t.localize)(1226,"arrays ({0})"),15:(0,t.localize)(1227,"numbers ({0})"),16:(0,t.localize)(1228,"booleans ({0})"),18:(0,t.localize)(1229,"objects ({0})"),19:(0,t.localize)(1230,"keys ({0})"),7:(0,t.localize)(1231,"fields ({0})"),13:(0,t.localize)(1232,"constants ({0})")}}),define(ne[789],se([1,0,5,47,46,81,44,114,115,13,14,18,26,6,2,54,19,74,9,4,27,3,12,31,62,110,32,25,529]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RenameWidget=e.CONTEXT_RENAME_INPUT_FOCUSED=e.CONTEXT_RENAME_INPUT_VISIBLE=void 0;const L=!1;e.CONTEXT_RENAME_INPUT_VISIBLE=new C.RawContextKey("renameInputVisible",!1,u.localize(1246,"Whether the rename input widget is visible")),e.CONTEXT_RENAME_INPUT_FOCUSED=new C.RawContextKey("renameInputFocused",!1,u.localize(1247,"Whether the rename input widget is focused"));let D=class{constructor(N,O,F,x,W,V){this._editor=N,this._acceptKeybindings=O,this._themeService=F,this._keybindingService=x,this._logService=V,this.allowEditorOverflow=!0,this._disposables=new i.DisposableStore,this._visibleContextKey=e.CONTEXT_RENAME_INPUT_VISIBLE.bindTo(W),this._isEditingRenameCandidate=!1,this._nRenameSuggestionsInvocations=0,this._hadAutomaticRenameSuggestionsInvocation=!1,this._candidates=new Set,this._beforeFirstInputFieldEditSW=new s.StopWatch,this._inputWithButton=new M,this._disposables.add(this._inputWithButton),this._editor.addContentWidget(this),this._disposables.add(this._editor.onDidChangeConfiguration(q=>{q.hasChanged(50)&&this._updateFont()})),this._disposables.add(F.onDidColorThemeChange(this._updateStyles,this))}dispose(){this._disposables.dispose(),this._editor.removeContentWidget(this)}getId(){return"__renameInputWidget"}getDomNode(){return this._domNode||(this._domNode=document.createElement("div"),this._domNode.className="monaco-editor rename-box",this._domNode.appendChild(this._inputWithButton.domNode),this._renameCandidateListView=this._disposables.add(new T(this._domNode,{fontInfo:this._editor.getOption(50),onFocusChange:N=>{this._inputWithButton.input.value=N,this._isEditingRenameCandidate=!1},onSelectionChange:()=>{this._isEditingRenameCandidate=!1,this.acceptInput(!1)}})),this._disposables.add(this._inputWithButton.onDidInputChange(()=>{this._renameCandidateListView?.focusedCandidate!==void 0&&(this._isEditingRenameCandidate=!0),this._timeBeforeFirstInputFieldEdit??=this._beforeFirstInputFieldEditSW.elapsed(),this._renameCandidateProvidersCts?.token.isCancellationRequested===!1&&this._renameCandidateProvidersCts.cancel(),this._renameCandidateListView?.clearFocus()})),this._label=document.createElement("div"),this._label.className="rename-label",this._domNode.appendChild(this._label),this._updateFont(),this._updateStyles(this._themeService.getColorTheme())),this._domNode}_updateStyles(N){if(!this._domNode)return;const O=N.getColor(w.widgetShadow),F=N.getColor(w.widgetBorder);this._domNode.style.backgroundColor=String(N.getColor(w.editorWidgetBackground)??""),this._domNode.style.boxShadow=O?` 0 0 8px 2px ${O}`:"",this._domNode.style.border=F?`1px solid ${F}`:"",this._domNode.style.color=String(N.getColor(w.inputForeground)??"");const x=N.getColor(w.inputBorder);this._inputWithButton.domNode.style.backgroundColor=String(N.getColor(w.inputBackground)??""),this._inputWithButton.input.style.backgroundColor=String(N.getColor(w.inputBackground)??""),this._inputWithButton.domNode.style.borderWidth=x?"1px":"0px",this._inputWithButton.domNode.style.borderStyle=x?"solid":"none",this._inputWithButton.domNode.style.borderColor=x?.toString()??"none"}_updateFont(){if(this._domNode===void 0)return;(0,g.assertType)(this._label!==void 0,"RenameWidget#_updateFont: _label must not be undefined given _domNode is defined"),this._editor.applyFontInfo(this._inputWithButton.input);const N=this._editor.getOption(50);this._label.style.fontSize=`${this._computeLabelFontSize(N.fontSize)}px`}_computeLabelFontSize(N){return N*.8}getPosition(){if(!this._visible||!this._editor.hasModel()||!this._editor.getDomNode())return null;const N=d.getClientArea(this.getDomNode().ownerDocument.body),O=d.getDomNodePagePosition(this._editor.getDomNode()),F=this._getTopForPosition();this._nPxAvailableAbove=F+O.top,this._nPxAvailableBelow=N.height-this._nPxAvailableAbove;const x=this._editor.getOption(67),{totalHeight:W}=A.getLayoutInfo({lineHeight:x}),V=this._nPxAvailableBelow>W*6?[2,1]:[1,2];return{position:this._position,preference:V}}beforeRender(){const[N,O]=this._acceptKeybindings;return this._label.innerText=u.localize(1248,"{0} to Rename, {1} to Preview",this._keybindingService.lookupKeybinding(N)?.getLabel(),this._keybindingService.lookupKeybinding(O)?.getLabel()),this._domNode.style.minWidth="200px",null}afterRender(N){if(N===null){this.cancelInput(!0,"afterRender (because position is null)");return}if(!this._editor.hasModel()||!this._editor.getDomNode())return;(0,g.assertType)(this._renameCandidateListView),(0,g.assertType)(this._nPxAvailableAbove!==void 0),(0,g.assertType)(this._nPxAvailableBelow!==void 0);const O=d.getTotalHeight(this._inputWithButton.domNode),F=d.getTotalHeight(this._label);let x;N===2?x=this._nPxAvailableBelow:x=this._nPxAvailableAbove,this._renameCandidateListView.layout({height:x-F-O,width:d.getTotalWidth(this._inputWithButton.domNode)})}acceptInput(N){this._trace("invoking acceptInput"),this._currentAcceptInput?.(N)}cancelInput(N,O){this._currentCancelInput?.(N)}focusNextRenameSuggestion(){this._renameCandidateListView?.focusNext()||(this._inputWithButton.input.value=this._currentName)}focusPreviousRenameSuggestion(){this._renameCandidateListView?.focusPrevious()||(this._inputWithButton.input.value=this._currentName)}getInput(N,O,F,x,W){const{start:V,end:q}=this._getSelection(N,O);this._renameCts=W;const H=new i.DisposableStore;this._nRenameSuggestionsInvocations=0,this._hadAutomaticRenameSuggestionsInvocation=!1,x===void 0?this._inputWithButton.button.style.display="none":(this._inputWithButton.button.style.display="flex",this._requestRenameCandidatesOnce=x,this._requestRenameCandidates(O,!1),H.add(d.addDisposableListener(this._inputWithButton.button,"click",()=>this._requestRenameCandidates(O,!0))),H.add(d.addDisposableListener(this._inputWithButton.button,d.EventType.KEY_DOWN,U=>{const j=new k.StandardKeyboardEvent(U);(j.equals(3)||j.equals(10))&&(j.stopPropagation(),j.preventDefault(),this._requestRenameCandidates(O,!0))}))),this._isEditingRenameCandidate=!1,this._domNode.classList.toggle("preview",F),this._position=new l.Position(N.startLineNumber,N.startColumn),this._currentName=O,this._inputWithButton.input.value=O,this._inputWithButton.input.setAttribute("selectionStart",V.toString()),this._inputWithButton.input.setAttribute("selectionEnd",q.toString()),this._inputWithButton.input.size=Math.max((N.endColumn-N.startColumn)*1.1,20),this._beforeFirstInputFieldEditSW.reset(),H.add((0,i.toDisposable)(()=>{this._renameCts=void 0,W.dispose(!0)})),H.add((0,i.toDisposable)(()=>{this._renameCandidateProvidersCts!==void 0&&(this._renameCandidateProvidersCts.dispose(!0),this._renameCandidateProvidersCts=void 0)})),H.add((0,i.toDisposable)(()=>this._candidates.clear()));const z=new p.DeferredPromise;return z.p.finally(()=>{H.dispose(),this._hide()}),this._currentCancelInput=U=>(this._trace("invoking _currentCancelInput"),this._currentAcceptInput=void 0,this._currentCancelInput=void 0,this._renameCandidateListView?.clearCandidates(),z.complete(U),!0),this._currentAcceptInput=U=>{this._trace("invoking _currentAcceptInput"),(0,g.assertType)(this._renameCandidateListView!==void 0);const j=this._renameCandidateListView.nCandidates;let Y,G;const K=this._renameCandidateListView.focusedCandidate;if(K!==void 0?(this._trace("using new name from renameSuggestion"),Y=K,G={k:"renameSuggestion"}):(this._trace("using new name from inputField"),Y=this._inputWithButton.input.value,G=this._isEditingRenameCandidate?{k:"userEditedRenameSuggestion"}:{k:"inputField"}),Y===O||Y.trim().length===0){this.cancelInput(!0,"_currentAcceptInput (because newName === value || newName.trim().length === 0)");return}this._currentAcceptInput=void 0,this._currentCancelInput=void 0,this._renameCandidateListView.clearCandidates(),z.complete({newName:Y,wantsPreview:F&&U,stats:{source:G,nRenameSuggestions:j,timeBeforeFirstInputFieldEdit:this._timeBeforeFirstInputFieldEdit,nRenameSuggestionsInvocations:this._nRenameSuggestionsInvocations,hadAutomaticRenameSuggestionsInvocation:this._hadAutomaticRenameSuggestionsInvocation}})},H.add(W.token.onCancellationRequested(()=>this.cancelInput(!0,"cts.token.onCancellationRequested"))),L||H.add(this._editor.onDidBlurEditorWidget(()=>this.cancelInput(!this._domNode?.ownerDocument.hasFocus(),"editor.onDidBlurEditorWidget"))),this._show(),z.p}_requestRenameCandidates(N,O){if(this._requestRenameCandidatesOnce!==void 0&&(this._renameCandidateProvidersCts!==void 0&&this._renameCandidateProvidersCts.dispose(!0),(0,g.assertType)(this._renameCts),this._inputWithButton.buttonState!=="stop")){this._renameCandidateProvidersCts=new n.CancellationTokenSource;const F=O?r.NewSymbolNameTriggerKind.Invoke:r.NewSymbolNameTriggerKind.Automatic,x=this._requestRenameCandidatesOnce(F,this._renameCandidateProvidersCts.token);if(x.length===0){this._inputWithButton.setSparkleButton();return}O||(this._hadAutomaticRenameSuggestionsInvocation=!0),this._nRenameSuggestionsInvocations+=1,this._inputWithButton.setStopButton(),this._updateRenameCandidates(x,N,this._renameCts.token)}}_getSelection(N,O){(0,g.assertType)(this._editor.hasModel());const F=this._editor.getSelection();let x=0,W=O.length;return!a.Range.isEmpty(F)&&!a.Range.spansMultipleLines(F)&&a.Range.containsRange(N,F)&&(x=Math.max(0,F.startColumn-N.startColumn),W=Math.min(N.endColumn,F.endColumn)-N.startColumn),{start:x,end:W}}_show(){this._trace("invoking _show"),this._editor.revealLineInCenterIfOutsideViewport(this._position.lineNumber,0),this._visible=!0,this._visibleContextKey.set(!0),this._editor.layoutContentWidget(this),setTimeout(()=>{this._inputWithButton.input.focus(),this._inputWithButton.input.setSelectionRange(parseInt(this._inputWithButton.input.getAttribute("selectionStart")),parseInt(this._inputWithButton.input.getAttribute("selectionEnd")))},100)}async _updateRenameCandidates(N,O,F){const x=(...z)=>this._trace("_updateRenameCandidates",...z);x("start");const W=await(0,p.raceCancellation)(Promise.allSettled(N),F);if(this._inputWithButton.setSparkleButton(),W===void 0){x("returning early - received updateRenameCandidates results - undefined");return}const V=W.flatMap(z=>z.status==="fulfilled"&&(0,g.isDefined)(z.value)?z.value:[]);x(`received updateRenameCandidates results - total (unfiltered) ${V.length} candidates.`);const q=b.distinct(V,z=>z.newSymbolName);x(`distinct candidates - ${q.length} candidates.`);const H=q.filter(({newSymbolName:z})=>z.trim().length>0&&z!==this._inputWithButton.input.value&&z!==O&&!this._candidates.has(z));if(x(`valid distinct candidates - ${V.length} candidates.`),H.forEach(z=>this._candidates.add(z.newSymbolName)),H.length<1){x("returning early - no valid distinct candidates");return}x("setting candidates"),this._renameCandidateListView.setCandidates(H),x("asking editor to re-layout"),this._editor.layoutContentWidget(this)}_hide(){this._trace("invoked _hide"),this._visible=!1,this._visibleContextKey.reset(),this._editor.layoutContentWidget(this)}_getTopForPosition(){const N=this._editor.getVisibleRanges();let O;return N.length>0?O=N[0].startLineNumber:(this._logService.warn("RenameWidget#_getTopForPosition: this should not happen - visibleRanges is empty"),O=Math.max(1,this._position.lineNumber-5)),this._editor.getTopForLineNumber(this._position.lineNumber)-this._editor.getTopForLineNumber(O)}_trace(...N){this._logService.trace("RenameWidget",...N)}};e.RenameWidget=D,e.RenameWidget=D=ke([ce(2,S.IThemeService),ce(3,f.IKeybindingService),ce(4,C.IContextKeyService),ce(5,h.ILogService)],D);class T{constructor(N,O){this._disposables=new i.DisposableStore,this._availableHeight=0,this._minimumWidth=0,this._lineHeight=O.fontInfo.lineHeight,this._typicalHalfwidthCharacterWidth=O.fontInfo.typicalHalfwidthCharacterWidth,this._listContainer=document.createElement("div"),this._listContainer.className="rename-box rename-candidate-list-container",N.appendChild(this._listContainer),this._listWidget=T._createListWidget(this._listContainer,this._candidateViewHeight,O.fontInfo),this._listWidget.onDidChangeFocus(F=>{F.elements.length===1&&O.onFocusChange(F.elements[0].newSymbolName)},this._disposables),this._listWidget.onDidChangeSelection(F=>{F.elements.length===1&&O.onSelectionChange()},this._disposables),this._disposables.add(this._listWidget.onDidBlur(F=>{this._listWidget.setFocus([])})),this._listWidget.style((0,v.getListStyles)({listInactiveFocusForeground:w.quickInputListFocusForeground,listInactiveFocusBackground:w.quickInputListFocusBackground}))}dispose(){this._listWidget.dispose(),this._disposables.dispose()}layout({height:N,width:O}){this._availableHeight=N,this._minimumWidth=O}setCandidates(N){this._listWidget.splice(0,0,N);const O=this._pickListHeight(this._listWidget.length),F=this._pickListWidth(N);this._listWidget.layout(O,F),this._listContainer.style.height=`${O}px`,this._listContainer.style.width=`${F}px`,I.status(u.localize(1249,"Received {0} rename suggestions",N.length))}clearCandidates(){this._listContainer.style.height="0px",this._listContainer.style.width="0px",this._listWidget.splice(0,this._listWidget.length,[])}get nCandidates(){return this._listWidget.length}get focusedCandidate(){if(this._listWidget.length===0)return;const N=this._listWidget.getSelectedElements()[0];if(N!==void 0)return N.newSymbolName;const O=this._listWidget.getFocusedElements()[0];if(O!==void 0)return O.newSymbolName}focusNext(){if(this._listWidget.length===0)return!1;const N=this._listWidget.getFocus();if(N.length===0)return this._listWidget.focusFirst(),this._listWidget.reveal(0),!0;if(N[0]===this._listWidget.length-1)return this._listWidget.setFocus([]),this._listWidget.reveal(0),!1;{this._listWidget.focusNext();const O=this._listWidget.getFocus()[0];return this._listWidget.reveal(O),!0}}focusPrevious(){if(this._listWidget.length===0)return!1;const N=this._listWidget.getFocus();if(N.length===0){this._listWidget.focusLast();const O=this._listWidget.getFocus()[0];return this._listWidget.reveal(O),!0}else{if(N[0]===0)return this._listWidget.setFocus([]),!1;{this._listWidget.focusPrevious();const O=this._listWidget.getFocus()[0];return this._listWidget.reveal(O),!0}}}clearFocus(){this._listWidget.setFocus([])}get _candidateViewHeight(){const{totalHeight:N}=A.getLayoutInfo({lineHeight:this._lineHeight});return N}_pickListHeight(N){const O=this._candidateViewHeight*N;return Math.min(O,this._availableHeight,this._candidateViewHeight*7)}_pickListWidth(N){const O=Math.ceil(Math.max(...N.map(x=>x.newSymbolName.length))*this._typicalHalfwidthCharacterWidth);return Math.max(this._minimumWidth,25+O+10)}static _createListWidget(N,O,F){const x=new class{getTemplateId(V){return"candidate"}getHeight(V){return O}},W=new class{constructor(){this.templateId="candidate"}renderTemplate(V){return new A(V,F)}renderElement(V,q,H){H.populate(V)}disposeTemplate(V){V.dispose()}};return new _.List("NewSymbolNameCandidates",N,x,[W],{keyboardSupport:!1,mouseSupport:!0,multipleSelectionSupport:!1})}}class M{constructor(){this._onDidInputChange=new t.Emitter,this.onDidInputChange=this._onDidInputChange.event,this._disposables=new i.DisposableStore}get domNode(){return this._domNode||(this._domNode=document.createElement("div"),this._domNode.className="rename-input-with-button",this._domNode.style.display="flex",this._domNode.style.flexDirection="row",this._domNode.style.alignItems="center",this._inputNode=document.createElement("input"),this._inputNode.className="rename-input",this._inputNode.type="text",this._inputNode.style.border="none",this._inputNode.setAttribute("aria-label",u.localize(1250,"Rename input. Type new name and press Enter to commit.")),this._domNode.appendChild(this._inputNode),this._buttonNode=document.createElement("div"),this._buttonNode.className="rename-suggestions-button",this._buttonNode.setAttribute("tabindex","0"),this._buttonGenHoverText=u.localize(1251,"Generate new name suggestions"),this._buttonCancelHoverText=u.localize(1252,"Cancel"),this._buttonHover=(0,E.getBaseLayerHoverDelegate)().setupManagedHover((0,y.getDefaultHoverDelegate)("element"),this._buttonNode,this._buttonGenHoverText),this._disposables.add(this._buttonHover),this._domNode.appendChild(this._buttonNode),this._disposables.add(d.addDisposableListener(this.input,d.EventType.INPUT,()=>this._onDidInputChange.fire())),this._disposables.add(d.addDisposableListener(this.input,d.EventType.KEY_DOWN,N=>{const O=new k.StandardKeyboardEvent(N);(O.keyCode===15||O.keyCode===17)&&this._onDidInputChange.fire()})),this._disposables.add(d.addDisposableListener(this.input,d.EventType.CLICK,()=>this._onDidInputChange.fire())),this._disposables.add(d.addDisposableListener(this.input,d.EventType.FOCUS,()=>{this.domNode.style.outlineWidth="1px",this.domNode.style.outlineStyle="solid",this.domNode.style.outlineOffset="-1px",this.domNode.style.outlineColor="var(--vscode-focusBorder)"})),this._disposables.add(d.addDisposableListener(this.input,d.EventType.BLUR,()=>{this.domNode.style.outline="none"}))),this._domNode}get input(){return(0,g.assertType)(this._inputNode),this._inputNode}get button(){return(0,g.assertType)(this._buttonNode),this._buttonNode}get buttonState(){return this._buttonState}setSparkleButton(){this._buttonState="sparkle",this._sparkleIcon??=(0,m.renderIcon)(o.Codicon.sparkle),d.clearNode(this.button),this.button.appendChild(this._sparkleIcon),this.button.setAttribute("aria-label","Generating new name suggestions"),this._buttonHover?.update(this._buttonGenHoverText),this.input.focus()}setStopButton(){this._buttonState="stop",this._stopIcon??=(0,m.renderIcon)(o.Codicon.primitiveSquare),d.clearNode(this.button),this.button.appendChild(this._stopIcon),this.button.setAttribute("aria-label","Cancel generating new name suggestions"),this._buttonHover?.update(this._buttonCancelHoverText),this.input.focus()}dispose(){this._disposables.dispose()}}class A{static{this._PADDING=2}constructor(N,O){this._domNode=document.createElement("div"),this._domNode.className="rename-box rename-candidate",this._domNode.style.display="flex",this._domNode.style.columnGap="5px",this._domNode.style.alignItems="center",this._domNode.style.height=`${O.lineHeight}px`,this._domNode.style.padding=`${A._PADDING}px`;const F=document.createElement("div");F.style.display="flex",F.style.alignItems="center",F.style.width=F.style.height=`${O.lineHeight*.8}px`,this._domNode.appendChild(F),this._icon=(0,m.renderIcon)(o.Codicon.sparkle),this._icon.style.display="none",F.appendChild(this._icon),this._label=document.createElement("div"),c.applyFontInfo(this._label,O),this._domNode.appendChild(this._label),N.appendChild(this._domNode)}populate(N){this._updateIcon(N),this._updateLabel(N)}_updateIcon(N){const O=!!N.tags?.includes(r.NewSymbolNameTag.AIGenerated);this._icon.style.display=O?"inherit":"none"}_updateLabel(N){this._label.innerText=N.newSymbolName}static getLayoutInfo({lineHeight:N}){return{totalHeight:N+A._PADDING*2}}dispose(){}}}),define(ne[790],se([1,0,46,14,18,8,57,2,19,22,15,152,34,9,4,20,27,17,211,122,184,3,29,109,12,7,62,50,96,38,63,789]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S,L,D,T,M){"use strict";var A;Object.defineProperty(e,"__esModule",{value:!0}),e.RenameAction=void 0,e.rename=N;class P{constructor(V,q,H){this.model=V,this.position=q,this._providerRenameIdx=0,this._providers=H.ordered(V)}hasProvider(){return this._providers.length>0}async resolveRenameLocation(V){const q=[];for(this._providerRenameIdx=0;this._providerRenameIdx0?q.join(` -`):void 0}:{range:i.Range.fromPositions(this.position),text:"",rejectReason:q.length>0?q.join(` -`):void 0}}async provideRenameEdits(V,q){return this._provideRenameEdits(V,this._providerRenameIdx,[],q)}async _provideRenameEdits(V,q,H,z){const U=this._providers[q];if(!U)return{edits:[],rejectReason:H.join(` -`)};const j=await U.provideRenameEdits(this.model,this.position,V,z);if(j){if(j.rejectReason)return this._provideRenameEdits(V,q+1,H.concat(j.rejectReason),z)}else return this._provideRenameEdits(V,q+1,H.concat(u.localize(1235,"No result.")),z);return j}}async function N(W,V,q,H){const z=new P(V,q,W),U=await z.resolveRenameLocation(I.CancellationToken.None);return U?.rejectReason?{edits:[],rejectReason:U.rejectReason}:z.provideRenameEdits(H,I.CancellationToken.None)}let O=class{static{A=this}static{this.ID="editor.contrib.renameController"}static get(V){return V.getContribution(A.ID)}constructor(V,q,H,z,U,j,Y,G,K){this.editor=V,this._instaService=q,this._notificationService=H,this._bulkEditService=z,this._progressService=U,this._logService=j,this._configService=Y,this._languageFeaturesService=G,this._telemetryService=K,this._disposableStore=new m.DisposableStore,this._cts=new I.CancellationTokenSource,this._renameWidget=this._disposableStore.add(this._instaService.createInstance(M.RenameWidget,this.editor,["acceptRenameInput","acceptRenameInputWithPreview"]))}dispose(){this._disposableStore.dispose(),this._cts.dispose(!0)}async run(){const V=this._logService.trace.bind(this._logService,"[rename]");if(this._cts.dispose(!0),this._cts=new I.CancellationTokenSource,!this.editor.hasModel()){V("editor has no model");return}const q=this.editor.getPosition(),H=new P(this.editor.getModel(),q,this._languageFeaturesService.renameProvider);if(!H.hasProvider()){V("skeleton has no provider");return}const z=new a.EditorStateCancellationTokenSource(this.editor,5,void 0,this._cts.token);let U;try{V("resolving rename location");const he=H.resolveRenameLocation(z.token);this._progressService.showWhile(he,250),U=await he,V("resolved rename location")}catch(he){he instanceof E.CancellationError?V("resolve rename location cancelled",JSON.stringify(he,null," ")):(V("resolve rename location failed",he instanceof Error?he:JSON.stringify(he,null," ")),(typeof he=="string"||(0,y.isMarkdownString)(he))&&r.MessageController.get(this.editor)?.showMessage(he||u.localize(1236,"An unknown error occurred while resolving rename location"),q));return}finally{z.dispose()}if(!U){V("returning early - no loc");return}if(U.rejectReason){V(`returning early - rejected with reason: ${U.rejectReason}`,U.rejectReason),r.MessageController.get(this.editor)?.showMessage(U.rejectReason,q);return}if(z.token.isCancellationRequested){V("returning early - cts1 cancelled");return}const j=new a.EditorStateCancellationTokenSource(this.editor,5,U.range,this._cts.token),Y=this.editor.getModel(),G=this._languageFeaturesService.newSymbolNamesProvider.all(Y),K=await Promise.all(G.map(async he=>[he,await he.supportsAutomaticNewSymbolNamesTriggerKind??!1])),R=(he,pe)=>{let ae=K.slice();return he===g.NewSymbolNameTriggerKind.Automatic&&(ae=ae.filter(([ee,de])=>de)),ae.map(([ee])=>ee.provideNewSymbolNames(Y,U.range,he,pe))};V("creating rename input field and awaiting its result");const J=this._bulkEditService.hasPreviewHandler()&&this._configService.getValue(this.editor.getModel().uri,"editor.rename.enablePreview"),ie=await this._renameWidget.getInput(U.range,U.text,J,G.length>0?R:void 0,j);if(V("received response from rename input field"),G.length>0&&this._reportTelemetry(G.length,Y.getLanguageId(),ie),typeof ie=="boolean"){V(`returning early - rename input field response - ${ie}`),ie&&this.editor.focus(),j.dispose();return}this.editor.focus(),V("requesting rename edits");const ue=(0,k.raceCancellation)(H.provideRenameEdits(ie.newName,j.token),j.token).then(async he=>{if(!he){V("returning early - no rename edits result");return}if(!this.editor.hasModel()){V("returning early - no model after rename edits are provided");return}if(he.rejectReason){V(`returning early - rejected with reason: ${he.rejectReason}`),this._notificationService.info(he.rejectReason);return}this.editor.setSelection(i.Range.fromPositions(this.editor.getSelection().getPosition())),V("applying edits"),this._bulkEditService.apply(he,{editor:this.editor,showPreview:ie.wantsPreview,label:u.localize(1237,"Renaming '{0}' to '{1}'",U?.text,ie.newName),code:"undoredo.rename",quotableLabel:u.localize(1238,"Renaming {0} to {1}",U?.text,ie.newName),respectAutoSaveConfig:!0}).then(pe=>{V("edits applied"),pe.ariaSummary&&(0,d.alert)(u.localize(1239,"Successfully renamed '{0}' to '{1}'. Summary: {2}",U.text,ie.newName,pe.ariaSummary))}).catch(pe=>{V(`error when applying edits ${JSON.stringify(pe,null," ")}`),this._notificationService.error(u.localize(1240,"Rename failed to apply edits")),this._logService.error(pe)})},he=>{V("error when providing rename edits",JSON.stringify(he,null," ")),this._notificationService.error(u.localize(1241,"Rename failed to compute edits")),this._logService.error(he)}).finally(()=>{j.dispose()});return V("returning rename operation"),this._progressService.showWhile(ue,250),ue}acceptRenameInput(V){this._renameWidget.acceptInput(V)}cancelRenameInput(){this._renameWidget.cancelInput(!0,"cancelRenameInput command")}focusNextRenameSuggestion(){this._renameWidget.focusNextRenameSuggestion()}focusPreviousRenameSuggestion(){this._renameWidget.focusPreviousRenameSuggestion()}_reportTelemetry(V,q,H){const z=typeof H=="boolean"?{kind:"cancelled",languageId:q,nRenameSuggestionProviders:V}:{kind:"accepted",languageId:q,nRenameSuggestionProviders:V,source:H.stats.source.k,nRenameSuggestions:H.stats.nRenameSuggestions,timeBeforeFirstInputFieldEdit:H.stats.timeBeforeFirstInputFieldEdit,wantsPreview:H.wantsPreview,nRenameSuggestionsInvocations:H.stats.nRenameSuggestionsInvocations,hadAutomaticRenameSuggestionsInvocation:H.stats.hadAutomaticRenameSuggestionsInvocation};this._telemetryService.publicLog2("renameInvokedEvent",z)}};O=A=ke([ce(1,v.IInstantiationService),ce(2,S.INotificationService),ce(3,n.IBulkEditService),ce(4,L.IEditorProgressService),ce(5,w.ILogService),ce(6,l.ITextResourceConfigurationService),ce(7,c.ILanguageFeaturesService),ce(8,T.ITelemetryService)],O);class F extends p.EditorAction{constructor(){super({id:"editor.action.rename",label:u.localize(1242,"Rename Symbol"),alias:"Rename Symbol",precondition:h.ContextKeyExpr.and(s.EditorContextKeys.writable,s.EditorContextKeys.hasRenameProvider),kbOpts:{kbExpr:s.EditorContextKeys.editorTextFocus,primary:60,weight:100},contextMenuOpts:{group:"1_modification",order:1.1}})}runCommand(V,q){const H=V.get(o.ICodeEditorService),[z,U]=Array.isArray(q)&&q||[void 0,void 0];return b.URI.isUri(z)&&t.Position.isIPosition(U)?H.openCodeEditor({resource:z},H.getActiveCodeEditor()).then(j=>{j&&(j.setPosition(U),j.invokeWithinContext(Y=>(this.reportTelemetry(Y,j),this.run(Y,j))))},E.onUnexpectedError):super.runCommand(V,q)}run(V,q){const H=V.get(w.ILogService),z=O.get(q);return z?(H.trace("[RenameAction] got controller, running..."),z.run()):(H.trace("[RenameAction] returning early - controller missing"),Promise.resolve())}}e.RenameAction=F,(0,p.registerEditorContribution)(O.ID,O,4),(0,p.registerEditorAction)(F);const x=p.EditorCommand.bindToContribution(O.get);(0,p.registerEditorCommand)(new x({id:"acceptRenameInput",precondition:M.CONTEXT_RENAME_INPUT_VISIBLE,handler:W=>W.acceptRenameInput(!1),kbOpts:{weight:199,kbExpr:h.ContextKeyExpr.and(s.EditorContextKeys.focus,h.ContextKeyExpr.not("isComposing")),primary:3}})),(0,p.registerEditorCommand)(new x({id:"acceptRenameInputWithPreview",precondition:h.ContextKeyExpr.and(M.CONTEXT_RENAME_INPUT_VISIBLE,h.ContextKeyExpr.has("config.editor.rename.enablePreview")),handler:W=>W.acceptRenameInput(!0),kbOpts:{weight:199,kbExpr:h.ContextKeyExpr.and(s.EditorContextKeys.focus,h.ContextKeyExpr.not("isComposing")),primary:2051}})),(0,p.registerEditorCommand)(new x({id:"cancelRenameInput",precondition:M.CONTEXT_RENAME_INPUT_VISIBLE,handler:W=>W.cancelRenameInput(),kbOpts:{weight:199,kbExpr:s.EditorContextKeys.focus,primary:9,secondary:[1033]}})),(0,C.registerAction2)(class extends C.Action2{constructor(){super({id:"focusNextRenameSuggestion",title:{...u.localize2(1244,"Focus Next Rename Suggestion")},precondition:M.CONTEXT_RENAME_INPUT_VISIBLE,keybinding:[{primary:18,weight:199}]})}run(V){const q=V.get(o.ICodeEditorService).getFocusedCodeEditor();if(!q)return;const H=O.get(q);H&&H.focusNextRenameSuggestion()}}),(0,C.registerAction2)(class extends C.Action2{constructor(){super({id:"focusPreviousRenameSuggestion",title:{...u.localize2(1245,"Focus Previous Rename Suggestion")},precondition:M.CONTEXT_RENAME_INPUT_VISIBLE,keybinding:[{primary:16,weight:199}]})}run(V){const q=V.get(o.ICodeEditorService).getFocusedCodeEditor();if(!q)return;const H=O.get(q);H&&H.focusPreviousRenameSuggestion()}}),(0,p.registerModelAndPositionCommand)("_executeDocumentRenameProvider",function(W,V,q,...H){const[z]=H;(0,_.assertType)(typeof z=="string");const{renameProvider:U}=W.get(c.ILanguageFeaturesService);return N(U,V,q,z)}),(0,p.registerModelAndPositionCommand)("_executePrepareRename",async function(W,V,q){const{renameProvider:H}=W.get(c.ILanguageFeaturesService),U=await new P(V,q,H).resolveRenameLocation(I.CancellationToken.None);if(U?.rejectReason)throw new Error(U.rejectReason);return U}),D.Registry.as(f.Extensions.Configuration).registerConfiguration({id:"editor",properties:{"editor.rename.enablePreview":{scope:5,description:u.localize(1243,"Enable/disable the ability to preview changes before renaming"),default:!0,type:"boolean"}}})}),define(ne[791],se([1,0,2,8,51,28,14,18,25,282,387,79,54,17,267,130,339]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g){"use strict";var c;Object.defineProperty(e,"__esModule",{value:!0}),e.DocumentSemanticTokensFeature=void 0;let l=class extends d.Disposable{constructor(C,f,h,v,w,S){super(),this._watchers=Object.create(null);const L=M=>{this._watchers[M.uri.toString()]=new a(M,C,h,w,S)},D=(M,A)=>{A.dispose(),delete this._watchers[M.uri.toString()]},T=()=>{for(const M of f.getModels()){const A=this._watchers[M.uri.toString()];(0,g.isSemanticColoringEnabled)(M,h,v)?A||L(M):A&&D(M,A)}};f.getModels().forEach(M=>{(0,g.isSemanticColoringEnabled)(M,h,v)&&L(M)}),this._register(f.onModelAdded(M=>{(0,g.isSemanticColoringEnabled)(M,h,v)&&L(M)})),this._register(f.onModelRemoved(M=>{const A=this._watchers[M.uri.toString()];A&&D(M,A)})),this._register(v.onDidChangeConfiguration(M=>{M.affectsConfiguration(g.SEMANTIC_HIGHLIGHTING_SETTING_ID)&&T()})),this._register(h.onDidColorThemeChange(T))}dispose(){for(const C of Object.values(this._watchers))C.dispose();super.dispose()}};e.DocumentSemanticTokensFeature=l,e.DocumentSemanticTokensFeature=l=ke([ce(0,i.ISemanticTokensStylingService),ce(1,I.IModelService),ce(2,_.IThemeService),ce(3,E.IConfigurationService),ce(4,n.ILanguageFeatureDebounceService),ce(5,t.ILanguageFeaturesService)],l);let a=class extends d.Disposable{static{c=this}static{this.REQUEST_MIN_DELAY=300}static{this.REQUEST_MAX_DELAY=2e3}constructor(C,f,h,v,w){super(),this._semanticTokensStylingService=f,this._isDisposed=!1,this._model=C,this._provider=w.documentSemanticTokensProvider,this._debounceInformation=v.for(this._provider,"DocumentSemanticTokens",{min:c.REQUEST_MIN_DELAY,max:c.REQUEST_MAX_DELAY}),this._fetchDocumentSemanticTokens=this._register(new y.RunOnceScheduler(()=>this._fetchDocumentSemanticTokensNow(),c.REQUEST_MIN_DELAY)),this._currentDocumentResponse=null,this._currentDocumentRequestCancellationTokenSource=null,this._documentProvidersChangeListeners=[],this._providersChangedDuringRequest=!1,this._register(this._model.onDidChangeContent(()=>{this._fetchDocumentSemanticTokens.isScheduled()||this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model))})),this._register(this._model.onDidChangeAttached(()=>{this._fetchDocumentSemanticTokens.isScheduled()||this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model))})),this._register(this._model.onDidChangeLanguage(()=>{this._currentDocumentResponse&&(this._currentDocumentResponse.dispose(),this._currentDocumentResponse=null),this._currentDocumentRequestCancellationTokenSource&&(this._currentDocumentRequestCancellationTokenSource.cancel(),this._currentDocumentRequestCancellationTokenSource=null),this._setDocumentSemanticTokens(null,null,null,[]),this._fetchDocumentSemanticTokens.schedule(0)}));const S=()=>{(0,d.dispose)(this._documentProvidersChangeListeners),this._documentProvidersChangeListeners=[];for(const L of this._provider.all(C))typeof L.onDidChange=="function"&&this._documentProvidersChangeListeners.push(L.onDidChange(()=>{if(this._currentDocumentRequestCancellationTokenSource){this._providersChangedDuringRequest=!0;return}this._fetchDocumentSemanticTokens.schedule(0)}))};S(),this._register(this._provider.onDidChange(()=>{S(),this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model))})),this._register(h.onDidColorThemeChange(L=>{this._setDocumentSemanticTokens(null,null,null,[]),this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model))})),this._fetchDocumentSemanticTokens.schedule(0)}dispose(){this._currentDocumentResponse&&(this._currentDocumentResponse.dispose(),this._currentDocumentResponse=null),this._currentDocumentRequestCancellationTokenSource&&(this._currentDocumentRequestCancellationTokenSource.cancel(),this._currentDocumentRequestCancellationTokenSource=null),(0,d.dispose)(this._documentProvidersChangeListeners),this._documentProvidersChangeListeners=[],this._setDocumentSemanticTokens(null,null,null,[]),this._isDisposed=!0,super.dispose()}_fetchDocumentSemanticTokensNow(){if(this._currentDocumentRequestCancellationTokenSource)return;if(!(0,p.hasDocumentSemanticTokensProvider)(this._provider,this._model)){this._currentDocumentResponse&&this._model.tokenization.setSemanticTokens(null,!1);return}if(!this._model.isAttachedToEditor())return;const C=new m.CancellationTokenSource,f=this._currentDocumentResponse?this._currentDocumentResponse.provider:null,h=this._currentDocumentResponse&&this._currentDocumentResponse.resultId||null,v=(0,p.getDocumentSemanticTokens)(this._provider,this._model,f,h,C.token);this._currentDocumentRequestCancellationTokenSource=C,this._providersChangedDuringRequest=!1;const w=[],S=this._model.onDidChangeContent(D=>{w.push(D)}),L=new o.StopWatch(!1);v.then(D=>{if(this._debounceInformation.update(this._model,L.elapsed()),this._currentDocumentRequestCancellationTokenSource=null,S.dispose(),!D)this._setDocumentSemanticTokens(null,null,null,w);else{const{provider:T,tokens:M}=D,A=this._semanticTokensStylingService.getStyling(T);this._setDocumentSemanticTokens(T,M||null,A,w)}},D=>{D&&(k.isCancellationError(D)||typeof D.message=="string"&&D.message.indexOf("busy")!==-1)||k.onUnexpectedError(D),this._currentDocumentRequestCancellationTokenSource=null,S.dispose(),(w.length>0||this._providersChangedDuringRequest)&&(this._fetchDocumentSemanticTokens.isScheduled()||this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model)))})}static _copy(C,f,h,v,w){w=Math.min(w,h.length-v,C.length-f);for(let S=0;S{(v.length>0||this._providersChangedDuringRequest)&&!this._fetchDocumentSemanticTokens.isScheduled()&&this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model))};if(this._currentDocumentResponse&&(this._currentDocumentResponse.dispose(),this._currentDocumentResponse=null),this._isDisposed){C&&f&&C.releaseDocumentSemanticTokens(f.resultId);return}if(!C||!h){this._model.tokenization.setSemanticTokens(null,!1);return}if(!f){this._model.tokenization.setSemanticTokens(null,!0),S();return}if((0,p.isSemanticTokensEdits)(f)){if(!w){this._model.tokenization.setSemanticTokens(null,!0);return}if(f.edits.length===0)f={resultId:f.resultId,data:w.data};else{let L=0;for(const P of f.edits)L+=(P.data?P.data.length:0)-P.deleteCount;const D=w.data,T=new Uint32Array(D.length+L);let M=D.length,A=T.length;for(let P=f.edits.length-1;P>=0;P--){const N=f.edits[P];if(N.start>D.length){h.warnInvalidEditStart(w.resultId,f.resultId,P,N.start,D.length),this._model.tokenization.setSemanticTokens(null,!0);return}const O=M-(N.start+N.deleteCount);O>0&&(c._copy(D,M-O,T,A-O,O),A-=O),N.data&&(c._copy(N.data,0,T,A-N.data.length,N.data.length),A-=N.data.length),M=N.start}M>0&&c._copy(D,0,T,0,M),f={resultId:f.resultId,data:T}}}if((0,p.isSemanticTokens)(f)){this._currentDocumentResponse=new r(C,f.resultId,f.data);const L=(0,b.toMultilineTokens2)(f,h,this._model.getLanguageId());if(v.length>0)for(const D of v)for(const T of L)for(const M of D.changes)T.applyEdit(M.range,M.text);this._model.tokenization.setSemanticTokens(L,!0)}else this._model.tokenization.setSemanticTokens(null,!0);S()}};a=c=ke([ce(1,i.ISemanticTokensStylingService),ce(2,_.IThemeService),ce(3,n.ILanguageFeatureDebounceService),ce(4,t.ILanguageFeaturesService)],a);class r{constructor(C,f,h){this.provider=C,this.resultId=f,this.data=h}dispose(){this.provider.releaseDocumentSemanticTokens(this.resultId)}}(0,s.registerEditorFeature)(l)}),define(ne[792],se([1,0,14,2,15,387,339,282,28,25,79,54,17,267]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewportSemanticTokensContribution=void 0;let i=class extends k.Disposable{static{this.ID="editor.contrib.viewportSemanticTokens"}constructor(g,c,l,a,r,u){super(),this._semanticTokensStylingService=c,this._themeService=l,this._configurationService=a,this._editor=g,this._provider=u.documentRangeSemanticTokensProvider,this._debounceInformation=r.for(this._provider,"DocumentRangeSemanticTokens",{min:100,max:500}),this._tokenizeViewport=this._register(new d.RunOnceScheduler(()=>this._tokenizeViewportNow(),100)),this._outstandingRequests=[];const C=()=>{this._editor.hasModel()&&this._tokenizeViewport.schedule(this._debounceInformation.get(this._editor.getModel()))};this._register(this._editor.onDidScrollChange(()=>{C()})),this._register(this._editor.onDidChangeModel(()=>{this._cancelAll(),C()})),this._register(this._editor.onDidChangeModelContent(f=>{this._cancelAll(),C()})),this._register(this._provider.onDidChange(()=>{this._cancelAll(),C()})),this._register(this._configurationService.onDidChangeConfiguration(f=>{f.affectsConfiguration(y.SEMANTIC_HIGHLIGHTING_SETTING_ID)&&(this._cancelAll(),C())})),this._register(this._themeService.onDidColorThemeChange(()=>{this._cancelAll(),C()})),C()}_cancelAll(){for(const g of this._outstandingRequests)g.cancel();this._outstandingRequests=[]}_removeOutstandingRequest(g){for(let c=0,l=this._outstandingRequests.length;cthis._requestRange(g,l)))}_requestRange(g,c){const l=g.getVersionId(),a=(0,d.createCancelablePromise)(u=>Promise.resolve((0,E.getDocumentRangeSemanticTokens)(this._provider,g,c,u))),r=new n.StopWatch(!1);return a.then(u=>{if(this._debounceInformation.update(g,r.elapsed()),!u||!u.tokens||g.isDisposed()||g.getVersionId()!==l)return;const{provider:C,tokens:f}=u,h=this._semanticTokensStylingService.getStyling(C);g.tokenization.setPartialSemanticTokens(c,(0,m.toMultilineTokens2)(f,h,g.getLanguageId()))}).then(()=>this._removeOutstandingRequest(a),()=>this._removeOutstandingRequest(a)),a}};e.ViewportSemanticTokensContribution=i,e.ViewportSemanticTokensContribution=i=ke([ce(1,t.ISemanticTokensStylingService),ce(2,b.IThemeService),ce(3,_.IConfigurationService),ce(4,p.ILanguageFeatureDebounceService),ce(5,o.ILanguageFeaturesService)],i),(0,I.registerEditorContribution)(i.ID,i,1)}),define(ne[793],se([1,0,5,254,26,30,6,82,2,22,27,708,51,43,3,382,71,25,402]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ItemRenderer=void 0,e.getAriaId=a;function a(h){return`suggest-aria-id:${h}`}const r=(0,g.registerIcon)("suggest-more-info",I.Codicon.chevronRight,i.localize(1346,"Icon for more information in the suggest widget.")),u=new class xt{static{this._regexRelaxed=/(#([\da-fA-F]{3}){1,2}|(rgb|hsl)a\(\s*(\d{1,3}%?\s*,\s*){3}(1|0?\.\d+)\)|(rgb|hsl)\(\s*\d{1,3}%?(\s*,\s*\d{1,3}%?){2}\s*\))/}static{this._regexStrict=new RegExp(`^${xt._regexRelaxed.source}$`,"i")}extract(v,w){if(v.textLabel.match(xt._regexStrict))return w[0]=v.textLabel,!0;if(v.completion.detail&&v.completion.detail.match(xt._regexStrict))return w[0]=v.completion.detail,!0;if(v.completion.documentation){const S=typeof v.completion.documentation=="string"?v.completion.documentation:v.completion.documentation.value,L=xt._regexRelaxed.exec(S);if(L&&(L.index===0||L.index+L[0].length===S.length))return w[0]=L[0],!0}return!1}};let C=class{constructor(v,w,S,L){this._editor=v,this._modelService=w,this._languageService=S,this._themeService=L,this._onDidToggleDetails=new y.Emitter,this.onDidToggleDetails=this._onDidToggleDetails.event,this.templateId="suggestion"}dispose(){this._onDidToggleDetails.dispose()}renderTemplate(v){const w=new _.DisposableStore,S=v;S.classList.add("show-file-icons");const L=(0,d.append)(v,(0,d.$)(".icon")),D=(0,d.append)(L,(0,d.$)("span.colorspan")),T=(0,d.append)(v,(0,d.$)(".contents")),M=(0,d.append)(T,(0,d.$)(".main")),A=(0,d.append)(M,(0,d.$)(".icon-label.codicon")),P=(0,d.append)(M,(0,d.$)("span.left")),N=(0,d.append)(M,(0,d.$)("span.right")),O=new k.IconLabel(P,{supportHighlights:!0,supportIcons:!0});w.add(O);const F=(0,d.append)(P,(0,d.$)("span.signature-label")),x=(0,d.append)(P,(0,d.$)("span.qualifier-label")),W=(0,d.append)(N,(0,d.$)("span.details-label")),V=(0,d.append)(N,(0,d.$)("span.readMore"+E.ThemeIcon.asCSSSelector(r)));return V.title=i.localize(1347,"Read More"),{root:S,left:P,right:N,icon:L,colorspan:D,iconLabel:O,iconContainer:A,parametersLabel:F,qualifierLabel:x,detailsLabel:W,readMore:V,disposables:w,configureFont:()=>{const H=this._editor.getOptions(),z=H.get(50),U=z.getMassagedFontFamily(),j=z.fontFeatureSettings,Y=H.get(120)||z.fontSize,G=H.get(121)||z.lineHeight,K=z.fontWeight,R=z.letterSpacing,J=`${Y}px`,ie=`${G}px`,ue=`${R}px`;S.style.fontSize=J,S.style.fontWeight=K,S.style.letterSpacing=ue,M.style.fontFamily=U,M.style.fontFeatureSettings=j,M.style.lineHeight=ie,L.style.height=ie,L.style.width=ie,V.style.height=ie,V.style.width=ie}}}renderElement(v,w,S){S.configureFont();const{completion:L}=v;S.root.id=a(w),S.colorspan.style.backgroundColor="";const D={labelEscapeNewLines:!0,matches:(0,m.createMatches)(v.score)},T=[];if(L.kind===19&&u.extract(v,T))S.icon.className="icon customcolor",S.iconContainer.className="icon hide",S.colorspan.style.backgroundColor=T[0];else if(L.kind===20&&this._themeService.getFileIconTheme().hasFileIcons){S.icon.className="icon hide",S.iconContainer.className="icon hide";const M=(0,n.getIconClasses)(this._modelService,this._languageService,b.URI.from({scheme:"fake",path:v.textLabel}),s.FileKind.FILE),A=(0,n.getIconClasses)(this._modelService,this._languageService,b.URI.from({scheme:"fake",path:L.detail}),s.FileKind.FILE);D.extraClasses=M.length>A.length?M:A}else L.kind===23&&this._themeService.getFileIconTheme().hasFolderIcons?(S.icon.className="icon hide",S.iconContainer.className="icon hide",D.extraClasses=[(0,n.getIconClasses)(this._modelService,this._languageService,b.URI.from({scheme:"fake",path:v.textLabel}),s.FileKind.FOLDER),(0,n.getIconClasses)(this._modelService,this._languageService,b.URI.from({scheme:"fake",path:L.detail}),s.FileKind.FOLDER)].flat()):(S.icon.className="icon hide",S.iconContainer.className="",S.iconContainer.classList.add("suggest-icon",...E.ThemeIcon.asClassNameArray(p.CompletionItemKinds.toIcon(L.kind))));L.tags&&L.tags.indexOf(1)>=0&&(D.extraClasses=(D.extraClasses||[]).concat(["deprecated"]),D.matches=[]),S.iconLabel.setLabel(v.textLabel,void 0,D),typeof L.label=="string"?(S.parametersLabel.textContent="",S.detailsLabel.textContent=f(L.detail||""),S.root.classList.add("string-label")):(S.parametersLabel.textContent=f(L.label.detail||""),S.detailsLabel.textContent=f(L.label.description||""),S.root.classList.remove("string-label")),this._editor.getOption(119).showInlineDetails?(0,d.show)(S.detailsLabel):(0,d.hide)(S.detailsLabel),(0,l.canExpandCompletionItem)(v)?(S.right.classList.add("can-expand-details"),(0,d.show)(S.readMore),S.readMore.onmousedown=M=>{M.stopPropagation(),M.preventDefault()},S.readMore.onclick=M=>{M.stopPropagation(),M.preventDefault(),this._onDidToggleDetails.fire()}):(S.right.classList.remove("can-expand-details"),(0,d.hide)(S.readMore),S.readMore.onmousedown=null,S.readMore.onclick=null)}disposeTemplate(v){v.disposables.dispose()}};e.ItemRenderer=C,e.ItemRenderer=C=ke([ce(1,o.IModelService),ce(2,t.ILanguageService),ce(3,c.IThemeService)],C);function f(h){return h.replace(/\r\n|\r|\n/g,"")}}),define(ne[794],se([1,0,787,38,156,34,107,6,15,20,66]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GotoLineAction=e.StandaloneGotoLineQuickAccessProvider=void 0;let n=class extends d.AbstractGotoLineQuickAccessProvider{constructor(i){super(),this.editorService=i,this.onDidActiveTextEditorControlChange=m.Event.None}get activeTextEditorControl(){return this.editorService.getFocusedCodeEditor()??void 0}};e.StandaloneGotoLineQuickAccessProvider=n,e.StandaloneGotoLineQuickAccessProvider=n=ke([ce(0,E.ICodeEditorService)],n);class o extends _.EditorAction{static{this.ID="editor.action.gotoLine"}constructor(){super({id:o.ID,label:y.GoToLineNLS.gotoLineActionLabel,alias:"Go to Line/Column...",precondition:void 0,kbOpts:{kbExpr:b.EditorContextKeys.focus,primary:2085,mac:{primary:293},weight:100}})}run(i){i.get(p.IQuickInputService).quickAccess.show(n.PREFIX)}}e.GotoLineAction=o,(0,_.registerEditorAction)(o),k.Registry.as(I.Extensions.Quickaccess).registerQuickAccessProvider({ctor:n,prefix:n.PREFIX,helpEntries:[{description:y.GoToLineNLS.gotoLineActionLabel,commandId:o.ID}]})}),define(ne[795],se([1,0,788,38,156,34,107,6,15,20,66,182,17,195,280]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GotoSymbolAction=e.StandaloneGotoSymbolQuickAccessProvider=void 0;let t=class extends d.AbstractGotoSymbolQuickAccessProvider{constructor(g,c,l){super(c,l),this.editorService=g,this.onDidActiveTextEditorControlChange=m.Event.None}get activeTextEditorControl(){return this.editorService.getFocusedCodeEditor()??void 0}};e.StandaloneGotoSymbolQuickAccessProvider=t,e.StandaloneGotoSymbolQuickAccessProvider=t=ke([ce(0,E.ICodeEditorService),ce(1,o.ILanguageFeaturesService),ce(2,n.IOutlineModelService)],t);class i extends _.EditorAction{static{this.ID="editor.action.quickOutline"}constructor(){super({id:i.ID,label:y.QuickOutlineNLS.quickOutlineActionLabel,alias:"Go to Symbol...",precondition:b.EditorContextKeys.hasDocumentSymbolProvider,kbOpts:{kbExpr:b.EditorContextKeys.focus,primary:3117,weight:100},contextMenuOpts:{group:"navigation",order:3}})}run(g){g.get(p.IQuickInputService).quickAccess.show(d.AbstractGotoSymbolQuickAccessProvider.PREFIX,{itemActivation:p.ItemActivation.NONE})}}e.GotoSymbolAction=i,(0,_.registerEditorAction)(i),k.Registry.as(I.Extensions.Quickaccess).registerQuickAccessProvider({ctor:t,prefix:d.AbstractGotoSymbolQuickAccessProvider.PREFIX,helpEntries:[{description:y.QuickOutlineNLS.quickOutlineActionLabel,prefix:d.AbstractGotoSymbolQuickAccessProvider.PREFIX,commandId:i.ID},{description:y.QuickOutlineNLS.quickOutlineByCategoryActionLabel,prefix:d.AbstractGotoSymbolQuickAccessProvider.PREFIX_BY_CATEGORY}]})}),define(ne[418],se([1,0,5,42,771,34,12,49,25]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneCodeEditorService=void 0;let b=class extends I.AbstractCodeEditorService{constructor(n,o){super(o),this._register(this.onCodeEditorAdd(()=>this._checkContextKey())),this._register(this.onCodeEditorRemove(()=>this._checkContextKey())),this._editorIsOpen=n.createKey("editorIsOpen",!1),this._activeCodeEditor=null,this._register(this.registerCodeEditorOpenHandler(async(t,i,s)=>i?this.doOpenEditor(i,t):null))}_checkContextKey(){let n=!1;for(const o of this.listCodeEditors())if(!o.isSimpleWidget){n=!0;break}this._editorIsOpen.set(n)}setActiveCodeEditor(n){this._activeCodeEditor=n}getActiveCodeEditor(){return this._activeCodeEditor}doOpenEditor(n,o){if(!this.findModel(n,o.resource)){if(o.resource){const s=o.resource.scheme;if(s===k.Schemas.http||s===k.Schemas.https)return(0,d.windowOpenNoOpener)(o.resource.toString()),n}return null}const i=o.options?o.options.selection:null;if(i)if(typeof i.endLineNumber=="number"&&typeof i.endColumn=="number")n.setSelection(i),n.revealRangeInCenter(i,1);else{const s={lineNumber:i.startLineNumber,column:i.startColumn};n.setPosition(s),n.revealPositionInCenter(s,1)}return n}findModel(n,o){const t=n.getModel();return t&&t.uri.toString()!==o.toString()?null:t}};e.StandaloneCodeEditorService=b,e.StandaloneCodeEditorService=b=ke([ce(0,y.IContextKeyService),ce(1,_.IThemeService)],b),(0,m.registerSingleton)(E.ICodeEditorService,b,0)}),define(ne[796],se([1,0,80,32]),function(oe,e,d,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.hc_light=e.hc_black=e.vs_dark=e.vs=void 0,e.vs={base:"vs",inherit:!1,rules:[{token:"",foreground:"000000",background:"fffffe"},{token:"invalid",foreground:"cd3131"},{token:"emphasis",fontStyle:"italic"},{token:"strong",fontStyle:"bold"},{token:"variable",foreground:"001188"},{token:"variable.predefined",foreground:"4864AA"},{token:"constant",foreground:"dd0000"},{token:"comment",foreground:"008000"},{token:"number",foreground:"098658"},{token:"number.hex",foreground:"3030c0"},{token:"regexp",foreground:"800000"},{token:"annotation",foreground:"808080"},{token:"type",foreground:"008080"},{token:"delimiter",foreground:"000000"},{token:"delimiter.html",foreground:"383838"},{token:"delimiter.xml",foreground:"0000FF"},{token:"tag",foreground:"800000"},{token:"tag.id.pug",foreground:"4F76AC"},{token:"tag.class.pug",foreground:"4F76AC"},{token:"meta.scss",foreground:"800000"},{token:"metatag",foreground:"e00000"},{token:"metatag.content.html",foreground:"FF0000"},{token:"metatag.html",foreground:"808080"},{token:"metatag.xml",foreground:"808080"},{token:"metatag.php",fontStyle:"bold"},{token:"key",foreground:"863B00"},{token:"string.key.json",foreground:"A31515"},{token:"string.value.json",foreground:"0451A5"},{token:"attribute.name",foreground:"FF0000"},{token:"attribute.value",foreground:"0451A5"},{token:"attribute.value.number",foreground:"098658"},{token:"attribute.value.unit",foreground:"098658"},{token:"attribute.value.html",foreground:"0000FF"},{token:"attribute.value.xml",foreground:"0000FF"},{token:"string",foreground:"A31515"},{token:"string.html",foreground:"0000FF"},{token:"string.sql",foreground:"FF0000"},{token:"string.yaml",foreground:"0451A5"},{token:"keyword",foreground:"0000FF"},{token:"keyword.json",foreground:"0451A5"},{token:"keyword.flow",foreground:"AF00DB"},{token:"keyword.flow.scss",foreground:"0000FF"},{token:"operator.scss",foreground:"666666"},{token:"operator.sql",foreground:"778899"},{token:"operator.swift",foreground:"666666"},{token:"predefined.sql",foreground:"C700C7"}],colors:{[k.editorBackground]:"#FFFFFE",[k.editorForeground]:"#000000",[k.editorInactiveSelection]:"#E5EBF1",[d.editorIndentGuide1]:"#D3D3D3",[d.editorActiveIndentGuide1]:"#939393",[k.editorSelectionHighlight]:"#ADD6FF4D"}},e.vs_dark={base:"vs-dark",inherit:!1,rules:[{token:"",foreground:"D4D4D4",background:"1E1E1E"},{token:"invalid",foreground:"f44747"},{token:"emphasis",fontStyle:"italic"},{token:"strong",fontStyle:"bold"},{token:"variable",foreground:"74B0DF"},{token:"variable.predefined",foreground:"4864AA"},{token:"variable.parameter",foreground:"9CDCFE"},{token:"constant",foreground:"569CD6"},{token:"comment",foreground:"608B4E"},{token:"number",foreground:"B5CEA8"},{token:"number.hex",foreground:"5BB498"},{token:"regexp",foreground:"B46695"},{token:"annotation",foreground:"cc6666"},{token:"type",foreground:"3DC9B0"},{token:"delimiter",foreground:"DCDCDC"},{token:"delimiter.html",foreground:"808080"},{token:"delimiter.xml",foreground:"808080"},{token:"tag",foreground:"569CD6"},{token:"tag.id.pug",foreground:"4F76AC"},{token:"tag.class.pug",foreground:"4F76AC"},{token:"meta.scss",foreground:"A79873"},{token:"meta.tag",foreground:"CE9178"},{token:"metatag",foreground:"DD6A6F"},{token:"metatag.content.html",foreground:"9CDCFE"},{token:"metatag.html",foreground:"569CD6"},{token:"metatag.xml",foreground:"569CD6"},{token:"metatag.php",fontStyle:"bold"},{token:"key",foreground:"9CDCFE"},{token:"string.key.json",foreground:"9CDCFE"},{token:"string.value.json",foreground:"CE9178"},{token:"attribute.name",foreground:"9CDCFE"},{token:"attribute.value",foreground:"CE9178"},{token:"attribute.value.number.css",foreground:"B5CEA8"},{token:"attribute.value.unit.css",foreground:"B5CEA8"},{token:"attribute.value.hex.css",foreground:"D4D4D4"},{token:"string",foreground:"CE9178"},{token:"string.sql",foreground:"FF0000"},{token:"keyword",foreground:"569CD6"},{token:"keyword.flow",foreground:"C586C0"},{token:"keyword.json",foreground:"CE9178"},{token:"keyword.flow.scss",foreground:"569CD6"},{token:"operator.scss",foreground:"909090"},{token:"operator.sql",foreground:"778899"},{token:"operator.swift",foreground:"909090"},{token:"predefined.sql",foreground:"FF00FF"}],colors:{[k.editorBackground]:"#1E1E1E",[k.editorForeground]:"#D4D4D4",[k.editorInactiveSelection]:"#3A3D41",[d.editorIndentGuide1]:"#404040",[d.editorActiveIndentGuide1]:"#707070",[k.editorSelectionHighlight]:"#ADD6FF26"}},e.hc_black={base:"hc-black",inherit:!1,rules:[{token:"",foreground:"FFFFFF",background:"000000"},{token:"invalid",foreground:"f44747"},{token:"emphasis",fontStyle:"italic"},{token:"strong",fontStyle:"bold"},{token:"variable",foreground:"1AEBFF"},{token:"variable.parameter",foreground:"9CDCFE"},{token:"constant",foreground:"569CD6"},{token:"comment",foreground:"608B4E"},{token:"number",foreground:"FFFFFF"},{token:"regexp",foreground:"C0C0C0"},{token:"annotation",foreground:"569CD6"},{token:"type",foreground:"3DC9B0"},{token:"delimiter",foreground:"FFFF00"},{token:"delimiter.html",foreground:"FFFF00"},{token:"tag",foreground:"569CD6"},{token:"tag.id.pug",foreground:"4F76AC"},{token:"tag.class.pug",foreground:"4F76AC"},{token:"meta",foreground:"D4D4D4"},{token:"meta.tag",foreground:"CE9178"},{token:"metatag",foreground:"569CD6"},{token:"metatag.content.html",foreground:"1AEBFF"},{token:"metatag.html",foreground:"569CD6"},{token:"metatag.xml",foreground:"569CD6"},{token:"metatag.php",fontStyle:"bold"},{token:"key",foreground:"9CDCFE"},{token:"string.key",foreground:"9CDCFE"},{token:"string.value",foreground:"CE9178"},{token:"attribute.name",foreground:"569CD6"},{token:"attribute.value",foreground:"3FF23F"},{token:"string",foreground:"CE9178"},{token:"string.sql",foreground:"FF0000"},{token:"keyword",foreground:"569CD6"},{token:"keyword.flow",foreground:"C586C0"},{token:"operator.sql",foreground:"778899"},{token:"operator.swift",foreground:"909090"},{token:"predefined.sql",foreground:"FF00FF"}],colors:{[k.editorBackground]:"#000000",[k.editorForeground]:"#FFFFFF",[d.editorIndentGuide1]:"#FFFFFF",[d.editorActiveIndentGuide1]:"#FFFFFF"}},e.hc_light={base:"hc-light",inherit:!1,rules:[{token:"",foreground:"292929",background:"FFFFFF"},{token:"invalid",foreground:"B5200D"},{token:"emphasis",fontStyle:"italic"},{token:"strong",fontStyle:"bold"},{token:"variable",foreground:"264F70"},{token:"variable.predefined",foreground:"4864AA"},{token:"constant",foreground:"dd0000"},{token:"comment",foreground:"008000"},{token:"number",foreground:"098658"},{token:"number.hex",foreground:"3030c0"},{token:"regexp",foreground:"800000"},{token:"annotation",foreground:"808080"},{token:"type",foreground:"008080"},{token:"delimiter",foreground:"000000"},{token:"delimiter.html",foreground:"383838"},{token:"tag",foreground:"800000"},{token:"tag.id.pug",foreground:"4F76AC"},{token:"tag.class.pug",foreground:"4F76AC"},{token:"meta.scss",foreground:"800000"},{token:"metatag",foreground:"e00000"},{token:"metatag.content.html",foreground:"B5200D"},{token:"metatag.html",foreground:"808080"},{token:"metatag.xml",foreground:"808080"},{token:"metatag.php",fontStyle:"bold"},{token:"key",foreground:"863B00"},{token:"string.key.json",foreground:"A31515"},{token:"string.value.json",foreground:"0451A5"},{token:"attribute.name",foreground:"264F78"},{token:"attribute.value",foreground:"0451A5"},{token:"string",foreground:"A31515"},{token:"string.sql",foreground:"B5200D"},{token:"keyword",foreground:"0000FF"},{token:"keyword.flow",foreground:"AF00DB"},{token:"operator.sql",foreground:"778899"},{token:"operator.swift",foreground:"666666"},{token:"predefined.sql",foreground:"C700C7"}],colors:{[k.editorBackground]:"#FFFFFF",[k.editorForeground]:"#292929",[d.editorIndentGuide1]:"#292929",[d.editorActiveIndentGuide1]:"#292929"}}}),define(ne[419],se([1,0,5,64,33,6,27,148,572,796,38,32,25,2,97,767,52]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneThemeService=e.HC_LIGHT_THEME_NAME=e.HC_BLACK_THEME_NAME=e.VS_DARK_THEME_NAME=e.VS_LIGHT_THEME_NAME=void 0,e.VS_LIGHT_THEME_NAME="vs",e.VS_DARK_THEME_NAME="vs-dark",e.HC_BLACK_THEME_NAME="hc-black",e.HC_LIGHT_THEME_NAME="hc-light";const c=p.Registry.as(n.Extensions.ColorContribution),l=p.Registry.as(o.Extensions.ThemingContribution);class a{constructor(v,w){this.semanticHighlighting=!1,this.themeData=w;const S=w.base;v.length>0?(r(v)?this.id=v:this.id=S+" "+v,this.themeName=v):(this.id=S,this.themeName=S),this.colors=null,this.defaultColors=Object.create(null),this._tokenTheme=null}get base(){return this.themeData.base}notifyBaseUpdated(){this.themeData.inherit&&(this.colors=null,this._tokenTheme=null)}getColors(){if(!this.colors){const v=new Map;for(const w in this.themeData.colors)v.set(w,I.Color.fromHex(this.themeData.colors[w]));if(this.themeData.inherit){const w=u(this.themeData.base);for(const S in w.colors)v.has(S)||v.set(S,I.Color.fromHex(w.colors[S]))}this.colors=v}return this.colors}getColor(v,w){const S=this.getColors().get(v);if(S)return S;if(w!==!1)return this.getDefault(v)}getDefault(v){let w=this.defaultColors[v];return w||(w=c.resolveDefaultColor(v,this),this.defaultColors[v]=w,w)}defines(v){return this.getColors().has(v)}get type(){switch(this.base){case e.VS_LIGHT_THEME_NAME:return i.ColorScheme.LIGHT;case e.HC_BLACK_THEME_NAME:return i.ColorScheme.HIGH_CONTRAST_DARK;case e.HC_LIGHT_THEME_NAME:return i.ColorScheme.HIGH_CONTRAST_LIGHT;default:return i.ColorScheme.DARK}}get tokenTheme(){if(!this._tokenTheme){let v=[],w=[];if(this.themeData.inherit){const D=u(this.themeData.base);v=D.rules,D.encodedTokensColors&&(w=D.encodedTokensColors)}const S=this.themeData.colors["editor.foreground"],L=this.themeData.colors["editor.background"];if(S||L){const D={token:""};S&&(D.foreground=S),L&&(D.background=L),v.push(D)}v=v.concat(this.themeData.rules),this.themeData.encodedTokensColors&&(w=this.themeData.encodedTokensColors),this._tokenTheme=_.TokenTheme.createFromRawTokenTheme(v,w)}return this._tokenTheme}getTokenStyleMetadata(v,w,S){const D=this.tokenTheme._match([v].concat(w).join(".")).metadata,T=m.TokenMetadata.getForeground(D),M=m.TokenMetadata.getFontStyle(D);return{foreground:T,italic:!!(M&1),bold:!!(M&2),underline:!!(M&4),strikethrough:!!(M&8)}}}function r(h){return h===e.VS_LIGHT_THEME_NAME||h===e.VS_DARK_THEME_NAME||h===e.HC_BLACK_THEME_NAME||h===e.HC_LIGHT_THEME_NAME}function u(h){switch(h){case e.VS_LIGHT_THEME_NAME:return b.vs;case e.VS_DARK_THEME_NAME:return b.vs_dark;case e.HC_BLACK_THEME_NAME:return b.hc_black;case e.HC_LIGHT_THEME_NAME:return b.hc_light}}function C(h){const v=u(h);return new a(h,v)}class f extends t.Disposable{constructor(){super(),this._onColorThemeChange=this._register(new E.Emitter),this.onDidColorThemeChange=this._onColorThemeChange.event,this._onProductIconThemeChange=this._register(new E.Emitter),this.onDidProductIconThemeChange=this._onProductIconThemeChange.event,this._environment=Object.create(null),this._builtInProductIconTheme=new s.UnthemedProductIconTheme,this._autoDetectHighContrast=!0,this._knownThemes=new Map,this._knownThemes.set(e.VS_LIGHT_THEME_NAME,C(e.VS_LIGHT_THEME_NAME)),this._knownThemes.set(e.VS_DARK_THEME_NAME,C(e.VS_DARK_THEME_NAME)),this._knownThemes.set(e.HC_BLACK_THEME_NAME,C(e.HC_BLACK_THEME_NAME)),this._knownThemes.set(e.HC_LIGHT_THEME_NAME,C(e.HC_LIGHT_THEME_NAME));const v=this._register((0,s.getIconsStyleSheet)(this));this._codiconCSS=v.getCSS(),this._themeCSS="",this._allCSS=`${this._codiconCSS} -${this._themeCSS}`,this._globalStyleElement=null,this._styleElements=[],this._colorMapOverride=null,this.setTheme(e.VS_LIGHT_THEME_NAME),this._onOSSchemeChanged(),this._register(v.onDidChange(()=>{this._codiconCSS=v.getCSS(),this._updateCSS()})),(0,k.addMatchMediaChangeListener)(g.mainWindow,"(forced-colors: active)",()=>{this._onOSSchemeChanged()})}registerEditorContainer(v){return d.isInShadowDOM(v)?this._registerShadowDomContainer(v):this._registerRegularEditorContainer()}_registerRegularEditorContainer(){return this._globalStyleElement||(this._globalStyleElement=d.createStyleSheet(void 0,v=>{v.className="monaco-colors",v.textContent=this._allCSS}),this._styleElements.push(this._globalStyleElement)),t.Disposable.None}_registerShadowDomContainer(v){const w=d.createStyleSheet(v,S=>{S.className="monaco-colors",S.textContent=this._allCSS});return this._styleElements.push(w),{dispose:()=>{for(let S=0;S{S.base===v&&S.notifyBaseUpdated()}),this._theme.themeName===v&&this.setTheme(v)}getColorTheme(){return this._theme}setColorMapOverride(v){this._colorMapOverride=v,this._updateThemeOrColorMap()}setTheme(v){let w;this._knownThemes.has(v)?w=this._knownThemes.get(v):w=this._knownThemes.get(e.VS_LIGHT_THEME_NAME),this._updateActualTheme(w)}_updateActualTheme(v){!v||this._theme===v||(this._theme=v,this._updateThemeOrColorMap())}_onOSSchemeChanged(){if(this._autoDetectHighContrast){const v=g.mainWindow.matchMedia("(forced-colors: active)").matches;if(v!==(0,i.isHighContrast)(this._theme.type)){let w;(0,i.isDark)(this._theme.type)?w=v?e.HC_BLACK_THEME_NAME:e.VS_DARK_THEME_NAME:w=v?e.HC_LIGHT_THEME_NAME:e.VS_LIGHT_THEME_NAME,this._updateActualTheme(this._knownThemes.get(w))}}}setAutoDetectHighContrast(v){this._autoDetectHighContrast=v,this._onOSSchemeChanged()}_updateThemeOrColorMap(){const v=[],w={},S={addRule:T=>{w[T]||(v.push(T),w[T]=!0)}};l.getThemingParticipants().forEach(T=>T(this._theme,S,this._environment));const L=[];for(const T of c.getColors()){const M=this._theme.getColor(T.id,!0);M&&L.push(`${(0,n.asCssVariableName)(T.id)}: ${M.toString()};`)}S.addRule(`.monaco-editor, .monaco-diff-editor, .monaco-component { ${L.join(` -`)} }`);const D=this._colorMapOverride||this._theme.tokenTheme.getColorMap();S.addRule((0,_.generateTokensCSSForColorMap)(D)),this._themeCSS=v.join(` -`),this._updateCSS(),y.TokenizationRegistry.setColorMap(D),this._onColorThemeChange.fire(this._theme)}_updateCSS(){this._allCSS=`${this._codiconCSS} -${this._themeCSS}`,this._styleElements.forEach(v=>v.textContent=this._allCSS)}getFileIconTheme(){return{hasFileIcons:!1,hasFolderIcons:!1,hidesExplorerArrows:!1}}getProductIconTheme(){return this._builtInProductIconTheme}}e.StandaloneThemeService=f}),define(ne[797],se([1,0,15,153,107,97,419]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class m extends d.EditorAction{constructor(){super({id:"editor.action.toggleHighContrast",label:I.ToggleHighContrastNLS.toggleHighContrast,alias:"Toggle High Contrast Theme",precondition:void 0}),this._originalThemeName=null}run(b,p){const n=b.get(k.IStandaloneThemeService),o=n.getColorTheme();(0,E.isHighContrast)(o.type)?(n.setTheme(this._originalThemeName||((0,E.isDark)(o.type)?y.VS_DARK_THEME_NAME:y.VS_LIGHT_THEME_NAME)),this._originalThemeName=null):(n.setTheme((0,E.isDark)(o.type)?y.HC_BLACK_THEME_NAME:y.HC_LIGHT_THEME_NAME),this._originalThemeName=o.themeName)}}(0,d.registerEditorAction)(m)}),define(ne[124],se([1,0,5,47,151,359,41,247,2,16,3,29,381,12,58,7,31,50,101,25,30,97,19,32,110,61,542]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DropdownWithDefaultActionViewItem=e.SubmenuEntryActionViewItem=e.TextOnlyMenuEntryActionViewItem=e.MenuEntryActionViewItem=void 0,e.createAndFillInContextMenuActions=w,e.createAndFillInActionBarActions=S,e.createActionViewItem=N;function w(O,F,x,W){let V,q,H;if(Array.isArray(O))H=O,V=F,q=x;else{const j=F;H=O.getActions(j),V=x,q=W}const z=d.ModifierKeyEmitter.getInstance(),U=z.keyStatus.altKey||(b.isWindows||b.isLinux)&&z.keyStatus.shiftKey;L(H,V,U,q?j=>j===q:j=>j==="navigation")}function S(O,F,x,W,V,q){let H,z,U,j,Y;if(Array.isArray(O))Y=O,H=F,z=x,U=W,j=V;else{const K=F;Y=O.getActions(K),H=x,z=W,U=V,j=q}L(Y,H,!1,typeof z=="string"?K=>K===z:z,U,j)}function L(O,F,x,W=H=>H==="navigation",V=()=>!1,q=!1){let H,z;Array.isArray(F)?(H=F,z=F):(H=F.primary,z=F.secondary);const U=new Set;for(const[j,Y]of O){let G;W(j)?(G=H,G.length>0&&q&&G.push(new y.Separator)):(G=z,G.length>0&&G.push(new y.Separator));for(let K of Y){x&&(K=K instanceof n.MenuItemAction&&K.alt?K.alt:K);const R=G.push(K);K instanceof y.SubmenuAction&&U.add({group:j,action:K,index:R-1})}}for(const{group:j,action:Y,index:G}of U){const K=W(j)?H:z,R=Y.actions;V(Y,j,K.length)&&K.splice(G,1,...R)}}let D=class extends I.ActionViewItem{constructor(F,x,W,V,q,H,z,U){super(void 0,F,{icon:!!(F.class||F.item.icon),label:!F.class&&!F.item.icon,draggable:x?.draggable,keybinding:x?.keybinding,hoverDelegate:x?.hoverDelegate}),this._options=x,this._keybindingService=W,this._notificationService=V,this._contextKeyService=q,this._themeService=H,this._contextMenuService=z,this._accessibilityService=U,this._wantsAltCommand=!1,this._itemClassDispose=this._register(new _.MutableDisposable),this._altKey=d.ModifierKeyEmitter.getInstance()}get _menuItemAction(){return this._action}get _commandAction(){return this._wantsAltCommand&&this._menuItemAction.alt||this._menuItemAction}async onClick(F){F.preventDefault(),F.stopPropagation();try{await this.actionRunner.run(this._commandAction,this._context)}catch(x){this._notificationService.error(x)}}render(F){if(super.render(F),F.classList.add("menu-entry"),this.options.icon&&this._updateItemClass(this._menuItemAction.item),this._menuItemAction.alt){let x=!1;const W=()=>{const V=!!this._menuItemAction.alt?.enabled&&(!this._accessibilityService.isMotionReduced()||x)&&(this._altKey.keyStatus.altKey||this._altKey.keyStatus.shiftKey&&x);V!==this._wantsAltCommand&&(this._wantsAltCommand=V,this.updateLabel(),this.updateTooltip(),this.updateClass())};this._register(this._altKey.event(W)),this._register((0,d.addDisposableListener)(F,"mouseleave",V=>{x=!1,W()})),this._register((0,d.addDisposableListener)(F,"mouseenter",V=>{x=!0,W()})),W()}}updateLabel(){this.options.label&&this.label&&(this.label.textContent=this._commandAction.label)}getTooltip(){const F=this._keybindingService.lookupKeybinding(this._commandAction.id,this._contextKeyService),x=F&&F.getLabel(),W=this._commandAction.tooltip||this._commandAction.label;let V=x?(0,p.localize)(1483,"{0} ({1})",W,x):W;if(!this._wantsAltCommand&&this._menuItemAction.alt?.enabled){const q=this._menuItemAction.alt.tooltip||this._menuItemAction.alt.label,H=this._keybindingService.lookupKeybinding(this._menuItemAction.alt.id,this._contextKeyService),z=H&&H.getLabel(),U=z?(0,p.localize)(1484,"{0} ({1})",q,z):q;V=(0,p.localize)(1485,`{0} -[{1}] {2}`,V,m.UILabelProvider.modifierLabels[b.OS].altKey,U)}return V}updateClass(){this.options.icon&&(this._commandAction!==this._menuItemAction?this._menuItemAction.alt&&this._updateItemClass(this._menuItemAction.alt.item):this._updateItemClass(this._menuItemAction.item))}_updateItemClass(F){this._itemClassDispose.value=void 0;const{element:x,label:W}=this;if(!x||!W)return;const V=this._commandAction.checked&&(0,o.isICommandActionToggleInfo)(F.toggled)&&F.toggled.icon?F.toggled.icon:F.icon;if(V)if(r.ThemeIcon.isThemeIcon(V)){const q=r.ThemeIcon.asClassNameArray(V);W.classList.add(...q),this._itemClassDispose.value=(0,_.toDisposable)(()=>{W.classList.remove(...q)})}else W.style.backgroundImage=(0,u.isDark)(this._themeService.getColorTheme().type)?(0,d.asCSSUrl)(V.dark):(0,d.asCSSUrl)(V.light),W.classList.add("icon"),this._itemClassDispose.value=(0,_.combinedDisposable)((0,_.toDisposable)(()=>{W.style.backgroundImage="",W.classList.remove("icon")}),this._themeService.onDidColorThemeChange(()=>{this.updateClass()}))}};e.MenuEntryActionViewItem=D,e.MenuEntryActionViewItem=D=ke([ce(2,g.IKeybindingService),ce(3,c.INotificationService),ce(4,t.IContextKeyService),ce(5,a.IThemeService),ce(6,i.IContextMenuService),ce(7,v.IAccessibilityService)],D);class T extends D{render(F){this.options.label=!0,this.options.icon=!1,super.render(F),F.classList.add("text-only"),F.classList.toggle("use-comma",this._options?.useComma??!1)}updateLabel(){const F=this._keybindingService.lookupKeybinding(this._action.id,this._contextKeyService);if(!F)return super.updateLabel();if(this.label){const x=T._symbolPrintEnter(F);this._options?.conversational?this.label.textContent=(0,p.localize)(1486,"{1} to {0}",this._action.label,x):this.label.textContent=(0,p.localize)(1487,"{0} ({1})",this._action.label,x)}}static _symbolPrintEnter(F){return F.getLabel()?.replace(/\benter\b/gi,"\u23CE").replace(/\bEscape\b/gi,"Esc")}}e.TextOnlyMenuEntryActionViewItem=T;let M=class extends E.DropdownMenuActionViewItem{constructor(F,x,W,V,q){const H={...x,menuAsChild:x?.menuAsChild??!1,classNames:x?.classNames??(r.ThemeIcon.isThemeIcon(F.item.icon)?r.ThemeIcon.asClassName(F.item.icon):void 0),keybindingProvider:x?.keybindingProvider??(z=>W.lookupKeybinding(z.id))};super(F,{getActions:()=>F.actions},V,H),this._keybindingService=W,this._contextMenuService=V,this._themeService=q}render(F){super.render(F),(0,C.assertType)(this.element),F.classList.add("menu-entry");const x=this._action,{icon:W}=x.item;if(W&&!r.ThemeIcon.isThemeIcon(W)){this.element.classList.add("icon");const V=()=>{this.element&&(this.element.style.backgroundImage=(0,u.isDark)(this._themeService.getColorTheme().type)?(0,d.asCSSUrl)(W.dark):(0,d.asCSSUrl)(W.light))};V(),this._register(this._themeService.onDidColorThemeChange(()=>{V()}))}}};e.SubmenuEntryActionViewItem=M,e.SubmenuEntryActionViewItem=M=ke([ce(2,g.IKeybindingService),ce(3,i.IContextMenuService),ce(4,a.IThemeService)],M);let A=class extends I.BaseActionViewItem{constructor(F,x,W,V,q,H,z,U){super(null,F),this._keybindingService=W,this._notificationService=V,this._contextMenuService=q,this._menuService=H,this._instaService=z,this._storageService=U,this._container=null,this._options=x,this._storageKey=`${F.item.submenu.id}_lastActionId`;let j;const Y=x?.persistLastActionId?U.get(this._storageKey,1):void 0;Y&&(j=F.actions.find(K=>Y===K.id)),j||(j=F.actions[0]),this._defaultAction=this._instaService.createInstance(D,j,{keybinding:this._getDefaultActionKeybindingLabel(j)});const G={keybindingProvider:K=>this._keybindingService.lookupKeybinding(K.id),...x,menuAsChild:x?.menuAsChild??!0,classNames:x?.classNames??["codicon","codicon-chevron-down"],actionRunner:x?.actionRunner??new y.ActionRunner};this._dropdown=new E.DropdownMenuActionViewItem(F,F.actions,this._contextMenuService,G),this._register(this._dropdown.actionRunner.onDidRun(K=>{K.action instanceof n.MenuItemAction&&this.update(K.action)}))}update(F){this._options?.persistLastActionId&&this._storageService.store(this._storageKey,F.id,1,1),this._defaultAction.dispose(),this._defaultAction=this._instaService.createInstance(D,F,{keybinding:this._getDefaultActionKeybindingLabel(F)}),this._defaultAction.actionRunner=new class extends y.ActionRunner{async runAction(x,W){await x.run(void 0)}},this._container&&this._defaultAction.render((0,d.prepend)(this._container,(0,d.$)(".action-container")))}_getDefaultActionKeybindingLabel(F){let x;if(this._options?.renderKeybindingWithDefaultActionLabel){const W=this._keybindingService.lookupKeybinding(F.id);W&&(x=`(${W.getLabel()})`)}return x}setActionContext(F){super.setActionContext(F),this._defaultAction.setActionContext(F),this._dropdown.setActionContext(F)}render(F){this._container=F,super.render(this._container),this._container.classList.add("monaco-dropdown-with-default");const x=(0,d.$)(".action-container");this._defaultAction.render((0,d.append)(this._container,x)),this._register((0,d.addDisposableListener)(x,d.EventType.KEY_DOWN,V=>{const q=new k.StandardKeyboardEvent(V);q.equals(17)&&(this._defaultAction.element.tabIndex=-1,this._dropdown.focus(),q.stopPropagation())}));const W=(0,d.$)(".dropdown-action-container");this._dropdown.render((0,d.append)(this._container,W)),this._register((0,d.addDisposableListener)(W,d.EventType.KEY_DOWN,V=>{const q=new k.StandardKeyboardEvent(V);q.equals(15)&&(this._defaultAction.element.tabIndex=0,this._dropdown.setFocusable(!1),this._defaultAction.element?.focus(),q.stopPropagation())}))}focus(F){F?this._dropdown.focus():(this._defaultAction.element.tabIndex=0,this._defaultAction.element.focus())}blur(){this._defaultAction.element.tabIndex=-1,this._dropdown.blur(),this._container.blur()}setFocusable(F){F?this._defaultAction.element.tabIndex=0:(this._defaultAction.element.tabIndex=-1,this._dropdown.setFocusable(!1))}dispose(){this._defaultAction.dispose(),this._dropdown.dispose(),super.dispose()}};e.DropdownWithDefaultActionViewItem=A,e.DropdownWithDefaultActionViewItem=A=ke([ce(2,g.IKeybindingService),ce(3,c.INotificationService),ce(4,i.IContextMenuService),ce(5,n.IMenuService),ce(6,s.IInstantiationService),ce(7,l.IStorageService)],A);let P=class extends I.SelectActionViewItem{constructor(F,x){super(null,F,F.actions.map(W=>({text:W.id===y.Separator.ID?"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500":W.label,isDisabled:!W.enabled})),0,x,h.defaultSelectBoxStyles,{ariaLabel:F.tooltip,optionsAsChildren:!0}),this.select(Math.max(0,F.actions.findIndex(W=>W.checked)))}render(F){super.render(F),F.style.borderColor=(0,f.asCssVariable)(f.selectBorder)}runAction(F,x){const W=this.action.actions[x];W&&this.actionRunner.run(W)}};P=ke([ce(1,i.IContextViewService)],P);function N(O,F,x){return F instanceof n.MenuItemAction?O.createInstance(D,F,x):F instanceof n.SubmenuItemAction?F.item.isSelection?O.createInstance(P,F):F.item.rememberDefaultAction?O.createInstance(A,F,{...x,persistLastActionId:!0}):O.createInstance(M,F,x):void 0}}),define(ne[798],se([1,0,5,87,2,124,29,12,7]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestWidgetStatus=void 0;let b=class{constructor(n,o,t,i,s){this._menuId=o,this._menuService=i,this._contextKeyService=s,this._menuDisposables=new I.DisposableStore,this.element=d.append(n,d.$(".suggest-status-bar"));const g=c=>c instanceof y.MenuItemAction?t.createInstance(E.TextOnlyMenuEntryActionViewItem,c,{useComma:!0}):void 0;this._leftActions=new k.ActionBar(this.element,{actionViewItemProvider:g}),this._rightActions=new k.ActionBar(this.element,{actionViewItemProvider:g}),this._leftActions.domNode.classList.add("left"),this._rightActions.domNode.classList.add("right")}dispose(){this._menuDisposables.dispose(),this._leftActions.dispose(),this._rightActions.dispose(),this.element.remove()}show(){const n=this._menuService.createMenu(this._menuId,this._contextKeyService),o=()=>{const t=[],i=[];for(const[s,g]of n.getActions())s==="left"?t.push(...g):i.push(...g);this._leftActions.clear(),this._leftActions.push(t),this._rightActions.clear(),this._rightActions.push(i)};this._menuDisposables.add(n.onDidChange(()=>o())),this._menuDisposables.add(n)}hide(){this._menuDisposables.clear()}};e.SuggestWidgetStatus=b,e.SuggestWidgetStatus=b=ke([ce(2,_.IInstantiationService),ce(3,y.IMenuService),ce(4,m.IContextKeyService)],b)}),define(ne[218],se([1,0,5,77,643,41,13,298,8,6,53,2,3,124,29,406,24,12,58,31,63]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MenuWorkbenchToolBar=e.WorkbenchToolBar=void 0;let u=class extends I.ToolBar{constructor(h,v,w,S,L,D,T,M){super(h,L,{getKeyBinding:P=>D.lookupKeybinding(P.id)??void 0,...v,allowContextMenu:!0,skipTelemetry:typeof v?.telemetrySource=="string"}),this._options=v,this._menuService=w,this._contextKeyService=S,this._contextMenuService=L,this._keybindingService=D,this._commandService=T,this._sessionDisposables=this._store.add(new n.DisposableStore);const A=v?.telemetrySource;A&&this._store.add(this.actionBar.onDidRun(P=>M.publicLog2("workbenchActionExecuted",{id:P.action.id,from:A})))}setActions(h,v=[],w){this._sessionDisposables.clear();const S=h.slice(),L=v.slice(),D=[];let T=0;const M=[];let A=!1;if(this._options?.hiddenItemStrategy!==-1)for(let P=0;PF?.id)),N=this._options.overflowBehavior.maxItems-P.size;let O=0;for(let F=0;F=N&&(S[F]=void 0,M[F]=x))}}(0,y.coalesceInPlace)(S),(0,y.coalesceInPlace)(M),super.setActions(S,E.Separator.join(M,L)),(D.length>0||S.length>0)&&this._sessionDisposables.add((0,d.addDisposableListener)(this.getElement(),"contextmenu",P=>{const N=new k.StandardMouseEvent((0,d.getWindow)(this.getElement()),P),O=this.getItemAction(N.target);if(!O)return;N.preventDefault(),N.stopPropagation();const F=[];if(O instanceof i.MenuItemAction&&O.menuKeybinding)F.push(O.menuKeybinding);else if(!(O instanceof i.SubmenuItemAction||O instanceof I.ToggleMenuAction)){const W=!!this._keybindingService.lookupKeybinding(O.id);F.push((0,s.createConfigureKeybindingAction)(this._commandService,this._keybindingService,O.id,void 0,W))}if(D.length>0){let W=!1;if(T===1&&this._options?.hiddenItemStrategy===0){W=!0;for(let V=0;Vthis._menuService.resetHiddenStates(w)}))),x.length!==0&&this._contextMenuService.showContextMenu({getAnchor:()=>N,getActions:()=>x,menuId:this._options?.contextMenu,menuActionOptions:{renderShortTitle:!0,...this._options?.menuOptions},skipTelemetry:typeof this._options?.telemetrySource=="string",contextKeyService:this._contextKeyService})}))}};e.WorkbenchToolBar=u,e.WorkbenchToolBar=u=ke([ce(2,i.IMenuService),ce(3,c.IContextKeyService),ce(4,l.IContextMenuService),ce(5,a.IKeybindingService),ce(6,g.ICommandService),ce(7,r.ITelemetryService)],u);let C=class extends u{constructor(h,v,w,S,L,D,T,M,A){super(h,{resetMenu:v,...w},S,L,D,T,M,A),this._onDidChangeMenuItems=this._store.add(new b.Emitter),this.onDidChangeMenuItems=this._onDidChangeMenuItems.event;const P=this._store.add(S.createMenu(v,L,{emitEventsForSubmenuChanges:!0})),N=()=>{const O=[],F=[];(0,t.createAndFillInActionBarActions)(P,w?.menuOptions,{primary:O,secondary:F},w?.toolbarOptions?.primaryGroup,w?.toolbarOptions?.shouldInlineSubmenu,w?.toolbarOptions?.useSeparatorsInPrimaryActions),h.classList.toggle("has-no-actions",O.length===0&&F.length===0),super.setActions(O,F)};this._store.add(P.onDidChange(()=>{N(),this._onDidChangeMenuItems.fire(this)})),N()}setActions(){throw new _.BugIndicatingError("This toolbar is populated from a menu.")}};e.MenuWorkbenchToolBar=C,e.MenuWorkbenchToolBar=C=ke([ce(3,i.IMenuService),ce(4,c.IContextKeyService),ce(5,l.IContextMenuService),ce(6,a.IKeybindingService),ce(7,g.ICommandService),ce(8,r.ITelemetryService)],C)}),define(ne[799],se([1,0,5,2,21,65,363,88,654,365,55,68,4,104,105,581,218,29,12,118,7]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffEditorGutter=void 0;const u=[],C=35;let f=class extends k.Disposable{constructor(S,L,D,T,M,A,P,N,O){super(),this._diffModel=L,this._editors=D,this._options=T,this._sashLayout=M,this._boundarySashes=A,this._instantiationService=P,this._contextKeyService=N,this._menuService=O,this._menu=this._register(this._menuService.createMenu(c.MenuId.DiffEditorHunkToolbar,this._contextKeyService)),this._actions=(0,I.observableFromEvent)(this,this._menu.onDidChange,()=>this._menu.getActions()),this._hasActions=this._actions.map(F=>F.length>0),this._showSash=(0,I.derived)(this,F=>this._options.renderSideBySide.read(F)&&this._hasActions.read(F)),this.width=(0,I.derived)(this,F=>this._hasActions.read(F)?C:0),this.elements=(0,d.h)("div.gutter@gutter",{style:{position:"absolute",height:"100%",width:C+"px"}},[]),this._currentDiff=(0,I.derived)(this,F=>{const x=this._diffModel.read(F);if(!x)return;const W=x.diff.read(F)?.mappings,V=this._editors.modifiedCursor.read(F);if(V)return W?.find(q=>q.lineRangeMapping.modified.contains(V.lineNumber))}),this._selectedDiffs=(0,I.derived)(this,F=>{const W=this._diffModel.read(F)?.diff.read(F);if(!W)return u;const V=this._editors.modifiedSelections.read(F);if(V.every(U=>U.isEmpty()))return u;const q=new p.LineRangeSet(V.map(U=>p.LineRange.fromRangeInclusive(U))),z=W.mappings.filter(U=>U.lineRangeMapping.innerChanges&&q.intersects(U.lineRangeMapping.modified)).map(U=>({mapping:U,rangeMappings:U.lineRangeMapping.innerChanges.filter(j=>V.some(Y=>o.Range.areIntersecting(j.modifiedRange,Y)))}));return z.length===0||z.every(U=>U.rangeMappings.length===0)?u:z}),this._register((0,m.prependRemoveOnDispose)(S,this.elements.root)),this._register((0,d.addDisposableListener)(this.elements.root,"click",()=>{this._editors.modified.focus()})),this._register((0,m.applyStyle)(this.elements.root,{display:this._hasActions.map(F=>F?"block":"none")})),(0,E.derivedDisposable)(this,F=>this._showSash.read(F)?new y.DiffEditorSash(S,this._sashLayout.dimensions,this._options.enableSplitViewResizing,this._boundarySashes,(0,E.derivedWithSetter)(this,W=>this._sashLayout.sashLeft.read(W)-C,(W,V)=>this._sashLayout.sashLeft.set(W+C,V)),()=>this._sashLayout.resetSash()):void 0).recomputeInitiallyAndOnChange(this._store),this._register(new _.EditorGutter(this._editors.modified,this.elements.root,{getIntersectingGutterItems:(F,x)=>{const W=this._diffModel.read(x);if(!W)return[];const V=W.diff.read(x);if(!V)return[];const q=this._selectedDiffs.read(x);if(q.length>0){const z=i.DetailedLineRangeMapping.fromRangeMappings(q.flatMap(U=>U.rangeMappings));return[new h(z,!0,c.MenuId.DiffEditorSelectionToolbar,void 0,W.model.original.uri,W.model.modified.uri)]}const H=this._currentDiff.read(x);return V.mappings.map(z=>new h(z.lineRangeMapping.withInnerChangesFromLineRanges(),z.lineRangeMapping===H?.lineRangeMapping,c.MenuId.DiffEditorHunkToolbar,void 0,W.model.original.uri,W.model.modified.uri))},createView:(F,x)=>this._instantiationService.createInstance(v,F,x,this)})),this._register((0,d.addDisposableListener)(this.elements.gutter,d.EventType.MOUSE_WHEEL,F=>{this._editors.modified.getOption(104).handleMouseWheel&&this._editors.modified.delegateScrollFromMouseWheelEvent(F)},{passive:!1}))}computeStagedValue(S){const L=S.innerChanges??[],D=new s.TextModelText(this._editors.modifiedModel.get()),T=new s.TextModelText(this._editors.original.getModel());return new t.TextEdit(L.map(P=>P.toTextEdit(D))).apply(T)}layout(S){this.elements.gutter.style.left=S+"px"}};e.DiffEditorGutter=f,e.DiffEditorGutter=f=ke([ce(6,r.IInstantiationService),ce(7,l.IContextKeyService),ce(8,c.IMenuService)],f);class h{constructor(S,L,D,T,M,A){this.mapping=S,this.showAlways=L,this.menuId=D,this.rangeOverride=T,this.originalUri=M,this.modifiedUri=A}get id(){return this.mapping.modified.toString()}get range(){return this.rangeOverride??this.mapping.modified}}let v=class extends k.Disposable{constructor(S,L,D,T){super(),this._item=S,this._elements=(0,d.h)("div.gutterItem",{style:{height:"20px",width:"34px"}},[(0,d.h)("div.background@background",{},[]),(0,d.h)("div.buttons@buttons",{},[])]),this._showAlways=this._item.map(this,A=>A.showAlways),this._menuId=this._item.map(this,A=>A.menuId),this._isSmall=(0,I.observableValue)(this,!1),this._lastItemRange=void 0,this._lastViewRange=void 0;const M=this._register(T.createInstance(a.WorkbenchHoverDelegate,"element",!0,{position:{hoverPosition:1}}));this._register((0,m.appendRemoveOnDispose)(L,this._elements.root)),this._register((0,I.autorun)(A=>{const P=this._showAlways.read(A);this._elements.root.classList.toggle("noTransition",!0),this._elements.root.classList.toggle("showAlways",P),setTimeout(()=>{this._elements.root.classList.toggle("noTransition",!1)},0)})),this._register((0,I.autorunWithStore)((A,P)=>{this._elements.buttons.replaceChildren();const N=P.add(T.createInstance(g.MenuWorkbenchToolBar,this._elements.buttons,this._menuId.read(A),{orientation:1,hoverDelegate:M,toolbarOptions:{primaryGroup:O=>O.startsWith("primary")},overflowBehavior:{maxItems:this._isSmall.read(A)?1:3},hiddenItemStrategy:0,actionRunner:new b.ActionRunnerWithContext(()=>{const O=this._item.get(),F=O.mapping;return{mapping:F,originalWithModifiedChanges:D.computeStagedValue(F),originalUri:O.originalUri,modifiedUri:O.modifiedUri}}),menuOptions:{shouldForwardArgs:!0}}));P.add(N.onDidChangeMenuItems(()=>{this._lastItemRange&&this.layout(this._lastItemRange,this._lastViewRange)}))}))}layout(S,L){this._lastItemRange=S,this._lastViewRange=L;let D=this._elements.buttons.clientHeight;this._isSmall.set(this._item.get().mapping.original.startLineNumber===1&&S.length<30,void 0),D=this._elements.buttons.clientHeight;const T=S.length/2-D/2,M=D;let A=S.start+T;const P=n.OffsetRange.tryCreate(M,L.endExclusive-M-D),N=n.OffsetRange.tryCreate(S.start+M,S.endExclusive-D-M);N&&P&&N.startthis.editor.getOption(62).showToolbar==="always"),this.sessionPosition=void 0,this.position=(0,p.derived)(this,q=>{const H=this.model.read(q)?.primaryGhostText.read(q);if(!this.alwaysShowToolbar.read(q)||!H||H.parts.length===0)return this.sessionPosition=void 0,null;const z=H.parts[0].column;this.sessionPosition&&this.sessionPosition.lineNumber!==H.lineNumber&&(this.sessionPosition=void 0);const U=new i.Position(H.lineNumber,Math.min(z,this.sessionPosition?.column??Number.MAX_SAFE_INTEGER));return this.sessionPosition=U,U}),this._register((0,p.autorunWithStore)((q,H)=>{const z=this.model.read(q);if(!z||!this.alwaysShowToolbar.read(q))return;const U=(0,n.derivedWithStore)((Y,G)=>{const K=G.add(this.instantiationService.createInstance(A,this.editor,!0,this.position,z.selectedInlineCompletionIndex,z.inlineCompletionsCount,z.activeCommands));return x.addContentWidget(K),G.add((0,b.toDisposable)(()=>x.removeContentWidget(K))),G.add((0,p.autorun)(R=>{this.position.read(R)&&z.lastTriggerKind.read(R)!==s.InlineCompletionTriggerKind.Explicit&&z.triggerExplicitly()})),K}),j=(0,p.derivedObservableWithCache)(this,(Y,G)=>!!this.position.read(Y)||!!G);H.add((0,p.autorun)(Y=>{j.read(Y)&&U.read(Y)}))}))}};e.InlineCompletionsHintsWidget=D,e.InlineCompletionsHintsWidget=D=ke([ce(2,h.IInstantiationService)],D);const T=(0,S.registerIcon)("inline-suggestion-hints-next",_.Codicon.chevronRight,(0,c.localize)(1090,"Icon for show next parameter hint.")),M=(0,S.registerIcon)("inline-suggestion-hints-previous",_.Codicon.chevronLeft,(0,c.localize)(1091,"Icon for show previous parameter hint."));let A=class extends b.Disposable{static{L=this}static{this._dropDownVisible=!1}static get dropDownVisible(){return this._dropDownVisible}static{this.id=0}createCommandAction(x,W,V){const q=new E.Action(x,W,V,!0,()=>this._commandService.executeCommand(x)),H=this.keybindingService.lookupKeybinding(x,this._contextKeyService);let z=W;return H&&(z=(0,c.localize)(1092,"{0} ({1})",W,H.getLabel())),q.tooltip=z,q}constructor(x,W,V,q,H,z,U,j,Y,G,K){super(),this.editor=x,this.withBorder=W,this._position=V,this._currentSuggestionIdx=q,this._suggestionCount=H,this._extraCommands=z,this._commandService=U,this.keybindingService=Y,this._contextKeyService=G,this._menuService=K,this.id=`InlineSuggestionHintsContentWidget${L.id++}`,this.allowEditorOverflow=!0,this.suppressMouseDown=!1,this.nodes=(0,d.h)("div.inlineSuggestionsHints",{className:this.withBorder?".withBorder":""},[(0,d.h)("div@toolBar")]),this.previousAction=this.createCommandAction(g.showPreviousInlineSuggestionActionId,(0,c.localize)(1093,"Previous"),t.ThemeIcon.asClassName(M)),this.availableSuggestionCountAction=new E.Action("inlineSuggestionHints.availableSuggestionCount","",void 0,!1),this.nextAction=this.createCommandAction(g.showNextInlineSuggestionActionId,(0,c.localize)(1094,"Next"),t.ThemeIcon.asClassName(T)),this.inlineCompletionsActionsMenus=this._register(this._menuService.createMenu(r.MenuId.InlineCompletionsActions,this._contextKeyService)),this.clearAvailableSuggestionCountLabelDebounced=this._register(new m.RunOnceScheduler(()=>{this.availableSuggestionCountAction.label=""},100)),this.disableButtonsDebounced=this._register(new m.RunOnceScheduler(()=>{this.previousAction.enabled=this.nextAction.enabled=!1},100)),this.toolBar=this._register(j.createInstance(O,this.nodes.toolBar,r.MenuId.InlineSuggestionToolbar,{menuOptions:{renderShortTitle:!0},toolbarOptions:{primaryGroup:R=>R.startsWith("primary")},actionViewItemProvider:(R,J)=>{if(R instanceof r.MenuItemAction)return j.createInstance(N,R,void 0);if(R===this.availableSuggestionCountAction){const ie=new P(void 0,R,{label:!0,icon:!1});return ie.setClass("availableSuggestionCount"),ie}},telemetrySource:"InlineSuggestionToolbar"})),this.toolBar.setPrependedPrimaryActions([this.previousAction,this.availableSuggestionCountAction,this.nextAction]),this._register(this.toolBar.onDidChangeDropdownVisibility(R=>{L._dropDownVisible=R})),this._register((0,p.autorun)(R=>{this._position.read(R),this.editor.layoutContentWidget(this)})),this._register((0,p.autorun)(R=>{const J=this._suggestionCount.read(R),ie=this._currentSuggestionIdx.read(R);J!==void 0?(this.clearAvailableSuggestionCountLabelDebounced.cancel(),this.availableSuggestionCountAction.label=`${ie+1}/${J}`):this.clearAvailableSuggestionCountLabelDebounced.schedule(),J!==void 0&&J>1?(this.disableButtonsDebounced.cancel(),this.previousAction.enabled=this.nextAction.enabled=!0):this.disableButtonsDebounced.schedule()})),this._register((0,p.autorun)(R=>{const ie=this._extraCommands.read(R).map(ue=>({class:void 0,id:ue.id,enabled:!0,tooltip:ue.tooltip||"",label:ue.title,run:he=>this._commandService.executeCommand(ue.id)}));for(const[ue,he]of this.inlineCompletionsActionsMenus.getActions())for(const pe of he)pe instanceof r.MenuItemAction&&ie.push(pe);ie.length>0&&ie.unshift(new E.Separator),this.toolBar.setAdditionalSecondaryActions(ie)}))}getId(){return this.id}getDomNode(){return this.nodes.root}getPosition(){return{position:this._position.get(),preference:[1,2],positionAffinity:3}}};e.InlineSuggestionHintsContentWidget=A,e.InlineSuggestionHintsContentWidget=A=L=ke([ce(6,u.ICommandService),ce(7,h.IInstantiationService),ce(8,v.IKeybindingService),ce(9,C.IContextKeyService),ce(10,r.IMenuService)],A);class P extends k.ActionViewItem{constructor(){super(...arguments),this._className=void 0}setClass(x){this._className=x}render(x){super.render(x),this._className&&x.classList.add(this._className)}updateTooltip(){}}class N extends l.MenuEntryActionViewItem{updateLabel(){const x=this._keybindingService.lookupKeybinding(this._action.id,this._contextKeyService);if(!x)return super.updateLabel();if(this.label){const W=(0,d.h)("div.keybinding").root;this._register(new I.KeybindingLabel(W,o.OS,{disableTitle:!0,...I.unthemedKeybindingLabelOptions})).set(x),this.label.textContent=this._action.label,this.label.appendChild(W),this.label.classList.add("inlineSuggestionStatusBarItemLabel")}}updateTooltip(){}}let O=class extends a.WorkbenchToolBar{constructor(x,W,V,q,H,z,U,j,Y){super(x,{resetMenu:W,...V},q,H,z,U,j,Y),this.menuId=W,this.options2=V,this.menuService=q,this.contextKeyService=H,this.menu=this._store.add(this.menuService.createMenu(this.menuId,this.contextKeyService,{emitEventsForSubmenuChanges:!0})),this.additionalActions=[],this.prependedPrimaryActions=[],this._store.add(this.menu.onDidChange(()=>this.updateToolbar())),this.updateToolbar()}updateToolbar(){const x=[],W=[];(0,l.createAndFillInActionBarActions)(this.menu,this.options2?.menuOptions,{primary:x,secondary:W},this.options2?.toolbarOptions?.primaryGroup,this.options2?.toolbarOptions?.shouldInlineSubmenu,this.options2?.toolbarOptions?.useSeparatorsInPrimaryActions),W.push(...this.additionalActions),x.unshift(...this.prependedPrimaryActions),this.setActions(x,W)}setPrependedPrimaryActions(x){(0,y.equals)(this.prependedPrimaryActions,x,(W,V)=>W===V)||(this.prependedPrimaryActions=x,this.updateToolbar())}setAdditionalSecondaryActions(x){(0,y.equals)(this.additionalActions,x,(W,V)=>W===V)||(this.additionalActions=x,this.updateToolbar())}};e.CustomizedMenuWorkbenchToolBar=O,e.CustomizedMenuWorkbenchToolBar=O=ke([ce(3,r.IMenuService),ce(4,C.IContextKeyService),ce(5,f.IContextMenuService),ce(6,v.IKeybindingService),ce(7,u.ICommandService),ce(8,w.ITelemetryService)],O)}),define(ne[800],se([1,0,5,206,41,13,2,21,16,9,124,218,29,24,12,58,7,31,63,519]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l){"use strict";var a;Object.defineProperty(e,"__esModule",{value:!0}),e.CustomizedMenuWorkbenchToolBar=e.InlineEditHintsContentWidget=e.InlineEditHintsWidget=void 0;let r=class extends y.Disposable{constructor(v,w,S){super(),this.editor=v,this.model=w,this.instantiationService=S,this.alwaysShowToolbar=(0,m.observableFromEvent)(this,this.editor.onDidChangeConfiguration,()=>this.editor.getOption(63).showToolbar==="always"),this.sessionPosition=void 0,this.position=(0,m.derived)(this,L=>{const D=this.model.read(L)?.model.ghostText.read(L);if(!this.alwaysShowToolbar.read(L)||!D||D.parts.length===0)return this.sessionPosition=void 0,null;const T=D.parts[0].column;this.sessionPosition&&this.sessionPosition.lineNumber!==D.lineNumber&&(this.sessionPosition=void 0);const M=new b.Position(D.lineNumber,Math.min(T,this.sessionPosition?.column??Number.MAX_SAFE_INTEGER));return this.sessionPosition=M,M}),this._register((0,m.autorunWithStore)((L,D)=>{if(!this.model.read(L)||!this.alwaysShowToolbar.read(L))return;const M=D.add(this.instantiationService.createInstance(u,this.editor,!0,this.position));v.addContentWidget(M),D.add((0,y.toDisposable)(()=>v.removeContentWidget(M)))}))}};e.InlineEditHintsWidget=r,e.InlineEditHintsWidget=r=ke([ce(2,g.IInstantiationService)],r);let u=class extends y.Disposable{static{a=this}static{this._dropDownVisible=!1}static{this.id=0}constructor(v,w,S,L,D,T){super(),this.editor=v,this.withBorder=w,this._position=S,this._contextKeyService=D,this._menuService=T,this.id=`InlineEditHintsContentWidget${a.id++}`,this.allowEditorOverflow=!0,this.suppressMouseDown=!1,this.nodes=(0,d.h)("div.inlineEditHints",{className:this.withBorder?".withBorder":""},[(0,d.h)("div@toolBar")]),this.inlineCompletionsActionsMenus=this._register(this._menuService.createMenu(o.MenuId.InlineEditActions,this._contextKeyService)),this.toolBar=this._register(L.createInstance(f,this.nodes.toolBar,this.editor,o.MenuId.InlineEditToolbar,{menuOptions:{renderShortTitle:!0},toolbarOptions:{primaryGroup:M=>M.startsWith("primary")},actionViewItemProvider:(M,A)=>{if(M instanceof o.MenuItemAction)return L.createInstance(C,M,void 0)},telemetrySource:"InlineEditToolbar"})),this._register(this.toolBar.onDidChangeDropdownVisibility(M=>{a._dropDownVisible=M})),this._register((0,m.autorun)(M=>{this._position.read(M),this.editor.layoutContentWidget(this)})),this._register((0,m.autorun)(M=>{const A=[];for(const[P,N]of this.inlineCompletionsActionsMenus.getActions())for(const O of N)O instanceof o.MenuItemAction&&A.push(O);A.length>0&&A.unshift(new I.Separator),this.toolBar.setAdditionalSecondaryActions(A)}))}getId(){return this.id}getDomNode(){return this.nodes.root}getPosition(){return{position:this._position.get(),preference:[1,2],positionAffinity:3}}};e.InlineEditHintsContentWidget=u,e.InlineEditHintsContentWidget=u=a=ke([ce(3,g.IInstantiationService),ce(4,i.IContextKeyService),ce(5,o.IMenuService)],u);class C extends p.MenuEntryActionViewItem{updateLabel(){const v=this._keybindingService.lookupKeybinding(this._action.id,this._contextKeyService);if(!v)return super.updateLabel();if(this.label){const w=(0,d.h)("div.keybinding").root;this._register(new k.KeybindingLabel(w,_.OS,{disableTitle:!0,...k.unthemedKeybindingLabelOptions})).set(v),this.label.textContent=this._action.label,this.label.appendChild(w),this.label.classList.add("inlineEditStatusBarItemLabel")}}updateTooltip(){}}let f=class extends n.WorkbenchToolBar{constructor(v,w,S,L,D,T,M,A,P,N){super(v,{resetMenu:S,...L},D,T,M,A,P,N),this.editor=w,this.menuId=S,this.options2=L,this.menuService=D,this.contextKeyService=T,this.menu=this._store.add(this.menuService.createMenu(this.menuId,this.contextKeyService,{emitEventsForSubmenuChanges:!0})),this.additionalActions=[],this.prependedPrimaryActions=[],this._store.add(this.menu.onDidChange(()=>this.updateToolbar())),this._store.add(this.editor.onDidChangeCursorPosition(()=>this.updateToolbar())),this.updateToolbar()}updateToolbar(){const v=[],w=[];(0,p.createAndFillInActionBarActions)(this.menu,this.options2?.menuOptions,{primary:v,secondary:w},this.options2?.toolbarOptions?.primaryGroup,this.options2?.toolbarOptions?.shouldInlineSubmenu,this.options2?.toolbarOptions?.useSeparatorsInPrimaryActions),w.push(...this.additionalActions),v.unshift(...this.prependedPrimaryActions),this.setActions(v,w)}setAdditionalSecondaryActions(v){(0,E.equals)(this.additionalActions,v,(w,S)=>w===S)||(this.additionalActions=v,this.updateToolbar())}};e.CustomizedMenuWorkbenchToolBar=f,e.CustomizedMenuWorkbenchToolBar=f=ke([ce(4,o.IMenuService),ce(5,i.IContextKeyService),ce(6,s.IContextMenuService),ce(7,c.IKeybindingService),ce(8,t.ICommandService),ce(9,l.ITelemetryService)],f)}),define(ne[801],se([1,0,5,41,6,2,124,29,12,31,50,63,761,58]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextMenuMenuDelegate=e.ContextMenuService=void 0;let i=class extends E.Disposable{get contextMenuHandler(){return this._contextMenuHandler||(this._contextMenuHandler=new o.ContextMenuHandler(this.contextViewService,this.telemetryService,this.notificationService,this.keybindingService)),this._contextMenuHandler}constructor(c,l,a,r,u,C){super(),this.telemetryService=c,this.notificationService=l,this.contextViewService=a,this.keybindingService=r,this.menuService=u,this.contextKeyService=C,this._contextMenuHandler=void 0,this._onDidShowContextMenu=this._store.add(new I.Emitter),this.onDidShowContextMenu=this._onDidShowContextMenu.event,this._onDidHideContextMenu=this._store.add(new I.Emitter)}configure(c){this.contextMenuHandler.configure(c)}showContextMenu(c){c=s.transform(c,this.menuService,this.contextKeyService),this.contextMenuHandler.showContextMenu({...c,onHide:l=>{c.onHide?.(l),this._onDidHideContextMenu.fire()}}),d.ModifierKeyEmitter.getInstance().resetKeyStatus(),this._onDidShowContextMenu.fire()}};e.ContextMenuService=i,e.ContextMenuService=i=ke([ce(0,n.ITelemetryService),ce(1,p.INotificationService),ce(2,t.IContextViewService),ce(3,b.IKeybindingService),ce(4,m.IMenuService),ce(5,_.IContextKeyService)],i);var s;(function(g){function c(a){return a&&a.menuId instanceof m.MenuId}function l(a,r,u){if(!c(a))return a;const{menuId:C,menuActionOptions:f,contextKeyService:h}=a;return{...a,getActions:()=>{const v=[];if(C){const w=r.getMenuActions(C,h??u,f);(0,y.createAndFillInContextMenuActions)(w,v)}return a.getActions?k.Separator.join(a.getActions(),v):v}}}g.transform=l})(s||(e.ContextMenuMenuDelegate=s={}))}),define(ne[802],se([1,0,5,6,3,7,216,25,2,66,47,16,126,254,206,87,97,22,398,98,142,445,11,176,14,8,61,21,13]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S,L){"use strict";var D;Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputTree=void 0;const T=d.$;class M{constructor(Y,G,K){this.index=Y,this.hasCheckbox=G,this._hidden=!1,this._init=new a.Lazy(()=>{const R=K.label??"",J=(0,r.parseLabelWithIcons)(R).text.trim(),ie=K.ariaLabel||[R,this.saneDescription,this.saneDetail].map(ue=>(0,r.getCodiconAriaLabel)(ue)).filter(ue=>!!ue).join(", ");return{saneLabel:R,saneSortLabel:J,saneAriaLabel:ie}}),this._saneDescription=K.description,this._saneTooltip=K.tooltip}get saneLabel(){return this._init.value.saneLabel}get saneSortLabel(){return this._init.value.saneSortLabel}get saneAriaLabel(){return this._init.value.saneAriaLabel}get element(){return this._element}set element(Y){this._element=Y}get hidden(){return this._hidden}set hidden(Y){this._hidden=Y}get saneDescription(){return this._saneDescription}set saneDescription(Y){this._saneDescription=Y}get saneDetail(){return this._saneDetail}set saneDetail(Y){this._saneDetail=Y}get saneTooltip(){return this._saneTooltip}set saneTooltip(Y){this._saneTooltip=Y}get labelHighlights(){return this._labelHighlights}set labelHighlights(Y){this._labelHighlights=Y}get descriptionHighlights(){return this._descriptionHighlights}set descriptionHighlights(Y){this._descriptionHighlights=Y}get detailHighlights(){return this._detailHighlights}set detailHighlights(Y){this._detailHighlights=Y}}class A extends M{constructor(Y,G,K,R,J,ie){super(Y,G,J),this.fireButtonTriggered=K,this._onChecked=R,this.item=J,this._separator=ie,this._checked=!1,this.onChecked=G?k.Event.map(k.Event.filter(this._onChecked.event,ue=>ue.element===this),ue=>ue.checked):k.Event.None,this._saneDetail=J.detail,this._labelHighlights=J.highlights?.label,this._descriptionHighlights=J.highlights?.description,this._detailHighlights=J.highlights?.detail}get separator(){return this._separator}set separator(Y){this._separator=Y}get checked(){return this._checked}set checked(Y){Y!==this._checked&&(this._checked=Y,this._onChecked.fire({element:this,checked:Y}))}get checkboxDisabled(){return!!this.item.disabled}}var P;(function(j){j[j.NONE=0]="NONE",j[j.MOUSE_HOVER=1]="MOUSE_HOVER",j[j.ACTIVE_ITEM=2]="ACTIVE_ITEM"})(P||(P={}));class N extends M{constructor(Y,G,K){super(Y,!1,K),this.fireSeparatorButtonTriggered=G,this.separator=K,this.children=new Array,this.focusInsideSeparator=P.NONE}}class O{getHeight(Y){return Y instanceof N?30:Y.saneDetail?44:22}getTemplateId(Y){return Y instanceof A?W.ID:V.ID}}class F{getWidgetAriaLabel(){return(0,I.localize)(1597,"Quick Input")}getAriaLabel(Y){return Y.separator?.label?`${Y.saneAriaLabel}, ${Y.separator.label}`:Y.saneAriaLabel}getWidgetRole(){return"listbox"}getRole(Y){return Y.hasCheckbox?"checkbox":"option"}isChecked(Y){if(!(!Y.hasCheckbox||!(Y instanceof A)))return{get value(){return Y.checked},onDidChange:G=>Y.onChecked(()=>G())}}}class x{constructor(Y){this.hoverDelegate=Y}renderTemplate(Y){const G=Object.create(null);G.toDisposeElement=new _.DisposableStore,G.toDisposeTemplate=new _.DisposableStore,G.entry=d.append(Y,T(".quick-input-list-entry"));const K=d.append(G.entry,T("label.quick-input-list-label"));G.toDisposeTemplate.add(d.addStandardDisposableListener(K,d.EventType.CLICK,pe=>{G.checkbox.offsetParent||pe.preventDefault()})),G.checkbox=d.append(K,T("input.quick-input-list-checkbox")),G.checkbox.type="checkbox";const R=d.append(K,T(".quick-input-list-rows")),J=d.append(R,T(".quick-input-list-row")),ie=d.append(R,T(".quick-input-list-row"));G.label=new t.IconLabel(J,{supportHighlights:!0,supportDescriptionHighlights:!0,supportIcons:!0,hoverDelegate:this.hoverDelegate}),G.toDisposeTemplate.add(G.label),G.icon=d.prepend(G.label.element,T(".quick-input-list-icon"));const ue=d.append(J,T(".quick-input-list-entry-keybinding"));G.keybinding=new i.KeybindingLabel(ue,n.OS),G.toDisposeTemplate.add(G.keybinding);const he=d.append(ie,T(".quick-input-list-label-meta"));return G.detail=new t.IconLabel(he,{supportHighlights:!0,supportIcons:!0,hoverDelegate:this.hoverDelegate}),G.toDisposeTemplate.add(G.detail),G.separator=d.append(G.entry,T(".quick-input-list-separator")),G.actionBar=new s.ActionBar(G.entry,this.hoverDelegate?{hoverDelegate:this.hoverDelegate}:void 0),G.actionBar.domNode.classList.add("quick-input-list-entry-action-bar"),G.toDisposeTemplate.add(G.actionBar),G}disposeTemplate(Y){Y.toDisposeElement.dispose(),Y.toDisposeTemplate.dispose()}disposeElement(Y,G,K){K.toDisposeElement.clear(),K.actionBar.clear()}}let W=class extends x{static{D=this}static{this.ID="quickpickitem"}constructor(Y,G){super(Y),this.themeService=G,this._itemsWithSeparatorsFrequency=new Map}get templateId(){return D.ID}renderTemplate(Y){const G=super.renderTemplate(Y);return G.toDisposeTemplate.add(d.addStandardDisposableListener(G.checkbox,d.EventType.CHANGE,K=>{G.element.checked=G.checkbox.checked})),G}renderElement(Y,G,K){const R=Y.element;K.element=R,R.element=K.entry??void 0;const J=R.item;K.checkbox.checked=R.checked,K.toDisposeElement.add(R.onChecked(de=>K.checkbox.checked=de)),K.checkbox.disabled=R.checkboxDisabled;const{labelHighlights:ie,descriptionHighlights:ue,detailHighlights:he}=R;if(J.iconPath){const de=(0,g.isDark)(this.themeService.getColorTheme().type)?J.iconPath.dark:J.iconPath.light??J.iconPath.dark,ge=c.URI.revive(de);K.icon.className="quick-input-list-icon",K.icon.style.backgroundImage=d.asCSSUrl(ge)}else K.icon.style.backgroundImage="",K.icon.className=J.iconClass?`quick-input-list-icon ${J.iconClass}`:"";let pe;!R.saneTooltip&&R.saneDescription&&(pe={markdown:{value:R.saneDescription,supportThemeIcons:!0},markdownNotSupportedFallback:R.saneDescription});const ae={matches:ie||[],descriptionTitle:pe,descriptionMatches:ue||[],labelEscapeNewLines:!0};if(ae.extraClasses=J.iconClasses,ae.italic=J.italic,ae.strikethrough=J.strikethrough,K.entry.classList.remove("quick-input-list-separator-as-item"),K.label.setLabel(R.saneLabel,R.saneDescription,ae),K.keybinding.set(J.keybinding),R.saneDetail){let de;R.saneTooltip||(de={markdown:{value:R.saneDetail,supportThemeIcons:!0},markdownNotSupportedFallback:R.saneDetail}),K.detail.element.style.display="",K.detail.setLabel(R.saneDetail,void 0,{matches:he,title:de,labelEscapeNewLines:!0})}else K.detail.element.style.display="none";R.separator?.label?(K.separator.textContent=R.separator.label,K.separator.style.display="",this.addItemWithSeparator(R)):K.separator.style.display="none",K.entry.classList.toggle("quick-input-list-separator-border",!!R.separator);const ee=J.buttons;ee&&ee.length?(K.actionBar.push(ee.map((de,ge)=>(0,l.quickInputButtonToAction)(de,`id-${ge}`,()=>R.fireButtonTriggered({button:de,item:R.item}))),{icon:!0,label:!1}),K.entry.classList.add("has-actions")):K.entry.classList.remove("has-actions")}disposeElement(Y,G,K){this.removeItemWithSeparator(Y.element),super.disposeElement(Y,G,K)}isItemWithSeparatorVisible(Y){return this._itemsWithSeparatorsFrequency.has(Y)}addItemWithSeparator(Y){this._itemsWithSeparatorsFrequency.set(Y,(this._itemsWithSeparatorsFrequency.get(Y)||0)+1)}removeItemWithSeparator(Y){const G=this._itemsWithSeparatorsFrequency.get(Y)||0;G>1?this._itemsWithSeparatorsFrequency.set(Y,G-1):this._itemsWithSeparatorsFrequency.delete(Y)}};W=D=ke([ce(1,m.IThemeService)],W);class V extends x{constructor(){super(...arguments),this._visibleSeparatorsFrequency=new Map}static{this.ID="quickpickseparator"}get templateId(){return V.ID}get visibleSeparators(){return[...this._visibleSeparatorsFrequency.keys()]}isSeparatorVisible(Y){return this._visibleSeparatorsFrequency.has(Y)}renderTemplate(Y){const G=super.renderTemplate(Y);return G.checkbox.style.display="none",G}renderElement(Y,G,K){const R=Y.element;K.element=R,R.element=K.entry??void 0,R.element.classList.toggle("focus-inside",!!R.focusInsideSeparator);const J=R.separator,{labelHighlights:ie,descriptionHighlights:ue,detailHighlights:he}=R;K.icon.style.backgroundImage="",K.icon.className="";let pe;!R.saneTooltip&&R.saneDescription&&(pe={markdown:{value:R.saneDescription,supportThemeIcons:!0},markdownNotSupportedFallback:R.saneDescription});const ae={matches:ie||[],descriptionTitle:pe,descriptionMatches:ue||[],labelEscapeNewLines:!0};if(K.entry.classList.add("quick-input-list-separator-as-item"),K.label.setLabel(R.saneLabel,R.saneDescription,ae),R.saneDetail){let de;R.saneTooltip||(de={markdown:{value:R.saneDetail,supportThemeIcons:!0},markdownNotSupportedFallback:R.saneDetail}),K.detail.element.style.display="",K.detail.setLabel(R.saneDetail,void 0,{matches:he,title:de,labelEscapeNewLines:!0})}else K.detail.element.style.display="none";K.separator.style.display="none",K.entry.classList.add("quick-input-list-separator-border");const ee=J.buttons;ee&&ee.length?(K.actionBar.push(ee.map((de,ge)=>(0,l.quickInputButtonToAction)(de,`id-${ge}`,()=>R.fireSeparatorButtonTriggered({button:de,separator:R.separator}))),{icon:!0,label:!1}),K.entry.classList.add("has-actions")):K.entry.classList.remove("has-actions"),this.addSeparator(R)}disposeElement(Y,G,K){this.removeSeparator(Y.element),this.isSeparatorVisible(Y.element)||Y.element.element?.classList.remove("focus-inside"),super.disposeElement(Y,G,K)}addSeparator(Y){this._visibleSeparatorsFrequency.set(Y,(this._visibleSeparatorsFrequency.get(Y)||0)+1)}removeSeparator(Y){const G=this._visibleSeparatorsFrequency.get(Y)||0;G>1?this._visibleSeparatorsFrequency.set(Y,G-1):this._visibleSeparatorsFrequency.delete(Y)}}let q=class extends _.Disposable{constructor(Y,G,K,R,J,ie){super(),this.parent=Y,this.hoverDelegate=G,this.linkOpenerDelegate=K,this.accessibilityService=ie,this._onKeyDown=new k.Emitter,this._onLeave=new k.Emitter,this.onLeave=this._onLeave.event,this._visibleCountObservable=(0,S.observableValue)("VisibleCount",0),this.onChangedVisibleCount=k.Event.fromObservable(this._visibleCountObservable,this._store),this._allVisibleCheckedObservable=(0,S.observableValue)("AllVisibleChecked",!1),this.onChangedAllVisibleChecked=k.Event.fromObservable(this._allVisibleCheckedObservable,this._store),this._checkedCountObservable=(0,S.observableValue)("CheckedCount",0),this.onChangedCheckedCount=k.Event.fromObservable(this._checkedCountObservable,this._store),this._checkedElementsObservable=(0,S.observableValueOpts)({equalsFn:L.equals},new Array),this.onChangedCheckedElements=k.Event.fromObservable(this._checkedElementsObservable,this._store),this._onButtonTriggered=new k.Emitter,this.onButtonTriggered=this._onButtonTriggered.event,this._onSeparatorButtonTriggered=new k.Emitter,this.onSeparatorButtonTriggered=this._onSeparatorButtonTriggered.event,this._elementChecked=new k.Emitter,this._elementCheckedEventBufferer=new k.EventBufferer,this._hasCheckboxes=!1,this._inputElements=new Array,this._elementTree=new Array,this._itemElements=new Array,this._elementDisposable=this._register(new _.DisposableStore),this._matchOnDescription=!1,this._matchOnDetail=!1,this._matchOnLabel=!0,this._matchOnLabelMode="fuzzy",this._sortByLabel=!0,this._shouldLoop=!0,this._container=d.append(this.parent,T(".quick-input-list")),this._separatorRenderer=new V(G),this._itemRenderer=J.createInstance(W,G),this._tree=this._register(J.createInstance(y.WorkbenchObjectTree,"QuickInput",this._container,new O,[this._itemRenderer,this._separatorRenderer],{filter:{filter(ue){return ue.hidden?0:ue instanceof N?2:1}},sorter:{compare:(ue,he)=>{if(!this.sortByLabel||!this._lastQueryString)return 0;const pe=this._lastQueryString.toLowerCase();return U(ue,he,pe)}},accessibilityProvider:new F,setRowLineHeight:!1,multipleSelectionSupport:!1,hideTwistiesOfChildlessElements:!0,renderIndentGuides:f.RenderIndentGuides.None,findWidgetEnabled:!1,indent:0,horizontalScrolling:!1,allowNonCollapsibleParents:!0,alwaysConsumeMouseWheel:!0})),this._tree.getHTMLElement().id=R,this._registerListeners()}get onDidChangeFocus(){return k.Event.map(this._tree.onDidChangeFocus,Y=>Y.elements.filter(G=>G instanceof A).map(G=>G.item),this._store)}get onDidChangeSelection(){return k.Event.map(this._tree.onDidChangeSelection,Y=>({items:Y.elements.filter(G=>G instanceof A).map(G=>G.item),event:Y.browserEvent}),this._store)}get displayed(){return this._container.style.display!=="none"}set displayed(Y){this._container.style.display=Y?"":"none"}get scrollTop(){return this._tree.scrollTop}set scrollTop(Y){this._tree.scrollTop=Y}get ariaLabel(){return this._tree.ariaLabel}set ariaLabel(Y){this._tree.ariaLabel=Y??""}set enabled(Y){this._tree.getHTMLElement().style.pointerEvents=Y?"":"none"}get matchOnDescription(){return this._matchOnDescription}set matchOnDescription(Y){this._matchOnDescription=Y}get matchOnDetail(){return this._matchOnDetail}set matchOnDetail(Y){this._matchOnDetail=Y}get matchOnLabel(){return this._matchOnLabel}set matchOnLabel(Y){this._matchOnLabel=Y}get matchOnLabelMode(){return this._matchOnLabelMode}set matchOnLabelMode(Y){this._matchOnLabelMode=Y}get sortByLabel(){return this._sortByLabel}set sortByLabel(Y){this._sortByLabel=Y}get shouldLoop(){return this._shouldLoop}set shouldLoop(Y){this._shouldLoop=Y}_registerListeners(){this._registerOnKeyDown(),this._registerOnContainerClick(),this._registerOnMouseMiddleClick(),this._registerOnTreeModelChanged(),this._registerOnElementChecked(),this._registerOnContextMenu(),this._registerHoverListeners(),this._registerSelectionChangeListener(),this._registerSeparatorActionShowingListeners()}_registerOnKeyDown(){this._register(this._tree.onKeyDown(Y=>{const G=new p.StandardKeyboardEvent(Y);switch(G.keyCode){case 10:this.toggleCheckbox();break}this._onKeyDown.fire(G)}))}_registerOnContainerClick(){this._register(d.addDisposableListener(this._container,d.EventType.CLICK,Y=>{(Y.x||Y.y)&&this._onLeave.fire()}))}_registerOnMouseMiddleClick(){this._register(d.addDisposableListener(this._container,d.EventType.AUXCLICK,Y=>{Y.button===1&&this._onLeave.fire()}))}_registerOnTreeModelChanged(){this._register(this._tree.onDidChangeModel(()=>{const Y=this._itemElements.filter(G=>!G.hidden).length;this._visibleCountObservable.set(Y,void 0),this._hasCheckboxes&&this._updateCheckedObservables()}))}_registerOnElementChecked(){this._register(this._elementCheckedEventBufferer.wrapEvent(this._elementChecked.event,(Y,G)=>G)(Y=>this._updateCheckedObservables()))}_registerOnContextMenu(){this._register(this._tree.onContextMenu(Y=>{Y.element&&(Y.browserEvent.preventDefault(),this._tree.setSelection([Y.element]))}))}_registerHoverListeners(){const Y=this._register(new h.ThrottledDelayer(this.hoverDelegate.delay));this._register(this._tree.onMouseOver(async G=>{if(d.isHTMLAnchorElement(G.browserEvent.target)){Y.cancel();return}if(!(!d.isHTMLAnchorElement(G.browserEvent.relatedTarget)&&d.isAncestor(G.browserEvent.relatedTarget,G.element?.element)))try{await Y.trigger(async()=>{G.element instanceof A&&this.showHover(G.element)})}catch(K){if(!(0,v.isCancellationError)(K))throw K}})),this._register(this._tree.onMouseOut(G=>{d.isAncestor(G.browserEvent.relatedTarget,G.element?.element)||Y.cancel()}))}_registerSeparatorActionShowingListeners(){this._register(this._tree.onDidChangeFocus(Y=>{const G=Y.elements[0]?this._tree.getParentElement(Y.elements[0]):null;for(const K of this._separatorRenderer.visibleSeparators){const R=K===G;!!(K.focusInsideSeparator&P.ACTIVE_ITEM)!==R&&(R?K.focusInsideSeparator|=P.ACTIVE_ITEM:K.focusInsideSeparator&=~P.ACTIVE_ITEM,this._tree.rerender(K))}})),this._register(this._tree.onMouseOver(Y=>{const G=Y.element?this._tree.getParentElement(Y.element):null;for(const K of this._separatorRenderer.visibleSeparators){if(K!==G)continue;!!(K.focusInsideSeparator&P.MOUSE_HOVER)||(K.focusInsideSeparator|=P.MOUSE_HOVER,this._tree.rerender(K))}})),this._register(this._tree.onMouseOut(Y=>{const G=Y.element?this._tree.getParentElement(Y.element):null;for(const K of this._separatorRenderer.visibleSeparators){if(K!==G)continue;!!(K.focusInsideSeparator&P.MOUSE_HOVER)&&(K.focusInsideSeparator&=~P.MOUSE_HOVER,this._tree.rerender(K))}}))}_registerSelectionChangeListener(){this._register(this._tree.onDidChangeSelection(Y=>{const G=Y.elements.filter(K=>K instanceof A);G.length!==Y.elements.length&&(Y.elements.length===1&&Y.elements[0]instanceof N&&(this._tree.setFocus([Y.elements[0].children[0]]),this._tree.reveal(Y.elements[0],0)),this._tree.setSelection(G))}))}setAllVisibleChecked(Y){this._elementCheckedEventBufferer.bufferEvents(()=>{this._itemElements.forEach(G=>{!G.hidden&&!G.checkboxDisabled&&(G.checked=Y)})})}setElements(Y){this._elementDisposable.clear(),this._lastQueryString=void 0,this._inputElements=Y,this._hasCheckboxes=this.parent.classList.contains("show-checkboxes");let G;this._itemElements=new Array,this._elementTree=Y.reduce((K,R,J)=>{let ie;if(R.type==="separator"){if(!R.buttons)return K;G=new N(J,ue=>this._onSeparatorButtonTriggered.fire(ue),R),ie=G}else{const ue=J>0?Y[J-1]:void 0;let he;ue&&ue.type==="separator"&&!ue.buttons&&(G=void 0,he=ue);const pe=new A(J,this._hasCheckboxes,ae=>this._onButtonTriggered.fire(ae),this._elementChecked,R,he);if(this._itemElements.push(pe),G)return G.children.push(pe),K;ie=pe}return K.push(ie),K},new Array),this._setElementsToTree(this._elementTree),this.accessibilityService.isScreenReaderOptimized()&&setTimeout(()=>{const K=this._tree.getHTMLElement().querySelector(".monaco-list-row.focused"),R=K?.parentNode;if(K&&R){const J=K.nextSibling;K.remove(),R.insertBefore(K,J)}},0)}setFocusedElements(Y){const G=Y.map(K=>this._itemElements.find(R=>R.item===K)).filter(K=>!!K).filter(K=>!K.hidden);if(this._tree.setFocus(G),Y.length>0){const K=this._tree.getFocus()[0];K&&this._tree.reveal(K)}}getActiveDescendant(){return this._tree.getHTMLElement().getAttribute("aria-activedescendant")}setSelectedElements(Y){const G=Y.map(K=>this._itemElements.find(R=>R.item===K)).filter(K=>!!K);this._tree.setSelection(G)}getCheckedElements(){return this._itemElements.filter(Y=>Y.checked).map(Y=>Y.item)}setCheckedElements(Y){this._elementCheckedEventBufferer.bufferEvents(()=>{const G=new Set;for(const K of Y)G.add(K);for(const K of this._itemElements)K.checked=G.has(K.item)})}focus(Y){if(this._itemElements.length)switch(Y===b.QuickPickFocus.Second&&this._itemElements.length<2&&(Y=b.QuickPickFocus.First),Y){case b.QuickPickFocus.First:this._tree.scrollTop=0,this._tree.focusFirst(void 0,G=>G.element instanceof A);break;case b.QuickPickFocus.Second:{this._tree.scrollTop=0;let G=!1;this._tree.focusFirst(void 0,K=>K.element instanceof A?G?!0:(G=!G,!1):!1);break}case b.QuickPickFocus.Last:this._tree.scrollTop=this._tree.scrollHeight,this._tree.focusLast(void 0,G=>G.element instanceof A);break;case b.QuickPickFocus.Next:{const G=this._tree.getFocus();this._tree.focusNext(void 0,this._shouldLoop,void 0,R=>R.element instanceof A?(this._tree.reveal(R.element),!0):!1);const K=this._tree.getFocus();G.length&&G[0]===K[0]&&G[0]===this._itemElements[this._itemElements.length-1]&&this._onLeave.fire();break}case b.QuickPickFocus.Previous:{const G=this._tree.getFocus();this._tree.focusPrevious(void 0,this._shouldLoop,void 0,R=>{if(!(R.element instanceof A))return!1;const J=this._tree.getParentElement(R.element);return J===null||J.children[0]!==R.element?this._tree.reveal(R.element):this._tree.reveal(J),!0});const K=this._tree.getFocus();G.length&&G[0]===K[0]&&G[0]===this._itemElements[0]&&this._onLeave.fire();break}case b.QuickPickFocus.NextPage:this._tree.focusNextPage(void 0,G=>G.element instanceof A?(this._tree.reveal(G.element),!0):!1);break;case b.QuickPickFocus.PreviousPage:this._tree.focusPreviousPage(void 0,G=>{if(!(G.element instanceof A))return!1;const K=this._tree.getParentElement(G.element);return K===null||K.children[0]!==G.element?this._tree.reveal(G.element):this._tree.reveal(K),!0});break;case b.QuickPickFocus.NextSeparator:{let G=!1;const K=this._tree.getFocus()[0];this._tree.focusNext(void 0,!0,void 0,J=>{if(G)return!0;if(J.element instanceof N)G=!0,this._separatorRenderer.isSeparatorVisible(J.element)?this._tree.reveal(J.element.children[0]):this._tree.reveal(J.element,0);else if(J.element instanceof A){if(J.element.separator)return this._itemRenderer.isItemWithSeparatorVisible(J.element)?this._tree.reveal(J.element):this._tree.reveal(J.element,0),!0;if(J.element===this._elementTree[0])return this._tree.reveal(J.element,0),!0}return!1});const R=this._tree.getFocus()[0];K===R&&(this._tree.scrollTop=this._tree.scrollHeight,this._tree.focusLast(void 0,J=>J.element instanceof A));break}case b.QuickPickFocus.PreviousSeparator:{let G,K=!!this._tree.getFocus()[0]?.separator;this._tree.focusPrevious(void 0,!0,void 0,R=>{if(R.element instanceof N)K?G||(this._separatorRenderer.isSeparatorVisible(R.element)?this._tree.reveal(R.element):this._tree.reveal(R.element,0),G=R.element.children[0]):K=!0;else if(R.element instanceof A&&!G){if(R.element.separator)this._itemRenderer.isItemWithSeparatorVisible(R.element)?this._tree.reveal(R.element):this._tree.reveal(R.element,0),G=R.element;else if(R.element===this._elementTree[0])return this._tree.reveal(R.element,0),!0}return!1}),G&&this._tree.setFocus([G]);break}}}clearFocus(){this._tree.setFocus([])}domFocus(){this._tree.domFocus()}layout(Y){this._tree.getHTMLElement().style.maxHeight=Y?`${Math.floor(Y/44)*44+6}px`:"",this._tree.layout()}filter(Y){if(this._lastQueryString=Y,!(this._sortByLabel||this._matchOnLabel||this._matchOnDescription||this._matchOnDetail))return this._tree.layout(),!1;const G=Y;if(Y=Y.trim(),!Y||!(this.matchOnLabel||this.matchOnDescription||this.matchOnDetail))this._itemElements.forEach(K=>{K.labelHighlights=void 0,K.descriptionHighlights=void 0,K.detailHighlights=void 0,K.hidden=!1;const R=K.index&&this._inputElements[K.index-1];K.item&&(K.separator=R&&R.type==="separator"&&!R.buttons?R:void 0)});else{let K;this._itemElements.forEach(R=>{let J;this.matchOnLabelMode==="fuzzy"?J=this.matchOnLabel?(0,r.matchesFuzzyIconAware)(Y,(0,r.parseLabelWithIcons)(R.saneLabel))??void 0:void 0:J=this.matchOnLabel?H(G,(0,r.parseLabelWithIcons)(R.saneLabel))??void 0:void 0;const ie=this.matchOnDescription?(0,r.matchesFuzzyIconAware)(Y,(0,r.parseLabelWithIcons)(R.saneDescription||""))??void 0:void 0,ue=this.matchOnDetail?(0,r.matchesFuzzyIconAware)(Y,(0,r.parseLabelWithIcons)(R.saneDetail||""))??void 0:void 0;if(J||ie||ue?(R.labelHighlights=J,R.descriptionHighlights=ie,R.detailHighlights=ue,R.hidden=!1):(R.labelHighlights=void 0,R.descriptionHighlights=void 0,R.detailHighlights=void 0,R.hidden=R.item?!R.item.alwaysShow:!0),R.item?R.separator=void 0:R.separator&&(R.hidden=!0),!this.sortByLabel){const he=R.index&&this._inputElements[R.index-1]||void 0;he?.type==="separator"&&!he.buttons&&(K=he),K&&!R.hidden&&(R.separator=K,K=void 0)}})}return this._setElementsToTree(this._sortByLabel&&Y?this._itemElements:this._elementTree),this._tree.layout(),!0}toggleCheckbox(){this._elementCheckedEventBufferer.bufferEvents(()=>{const Y=this._tree.getFocus().filter(K=>K instanceof A),G=this._allVisibleChecked(Y);for(const K of Y)K.checkboxDisabled||(K.checked=!G)})}style(Y){this._tree.style(Y)}toggleHover(){const Y=this._tree.getFocus()[0];if(!Y?.saneTooltip||!(Y instanceof A))return;if(this._lastHover&&!this._lastHover.isDisposed){this._lastHover.dispose();return}this.showHover(Y);const G=new _.DisposableStore;G.add(this._tree.onDidChangeFocus(K=>{K.elements[0]instanceof A&&this.showHover(K.elements[0])})),this._lastHover&&G.add(this._lastHover),this._elementDisposable.add(G)}_setElementsToTree(Y){const G=new Array;for(const K of Y)K instanceof N?G.push({element:K,collapsible:!1,collapsed:!1,children:K.children.map(R=>({element:R,collapsible:!1,collapsed:!1}))}):G.push({element:K,collapsible:!1,collapsed:!1});this._tree.setChildren(null,G)}_allVisibleChecked(Y,G=!0){for(let K=0,R=Y.length;K{this._allVisibleCheckedObservable.set(this._allVisibleChecked(this._itemElements,!1),Y);const G=this._itemElements.filter(K=>K.checked).length;this._checkedCountObservable.set(G,Y),this._checkedElementsObservable.set(this.getCheckedElements(),Y)})}showHover(Y){this._lastHover&&!this._lastHover.isDisposed&&(this.hoverDelegate.onDidHideHover?.(),this._lastHover?.dispose()),!(!Y.element||!Y.saneTooltip)&&(this._lastHover=this.hoverDelegate.showHover({content:Y.saneTooltip,target:Y.element,linkHandler:G=>{this.linkOpenerDelegate(G)},appearance:{showPointer:!0},container:this._container,position:{hoverPosition:1}},!1))}};e.QuickInputTree=q,ke([o.memoize],q.prototype,"onDidChangeFocus",null),ke([o.memoize],q.prototype,"onDidChangeSelection",null),e.QuickInputTree=q=ke([ce(4,E.IInstantiationService),ce(5,w.IAccessibilityService)],q);function H(j,Y){const{text:G,iconOffsets:K}=Y;if(!K||K.length===0)return z(j,G);const R=(0,C.ltrim)(G," "),J=G.length-R.length,ie=z(j,R);if(ie)for(const ue of ie){const he=K[ue.start+J]+J;ue.start+=he,ue.end+=he}return ie}function z(j,Y){const G=Y.toLowerCase().indexOf(j.toLowerCase());return G!==-1?[{start:G,end:G+j.length}]:null}function U(j,Y,G){const K=j.labelHighlights||[],R=Y.labelHighlights||[];return K.length&&!R.length?-1:!K.length&&R.length?1:K.length===0&&R.length===0?0:(0,u.compareAnything)(j.saneSortLabel,Y.saneSortLabel,G)}}),define(ne[803],se([1,0,5,87,258,354,633,18,6,2,111,3,66,704,272,119,52,7,802,12,719]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a){"use strict";var r;Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputController=void 0;const u=d.$;let C=class extends b.Disposable{static{r=this}static{this.MAX_WIDTH=600}get currentQuickInput(){return this.controller??void 0}get container(){return this._container}constructor(h,v,w,S){super(),this.options=h,this.layoutService=v,this.instantiationService=w,this.contextKeyService=S,this.enabled=!0,this.onDidAcceptEmitter=this._register(new _.Emitter),this.onDidCustomEmitter=this._register(new _.Emitter),this.onDidTriggerButtonEmitter=this._register(new _.Emitter),this.keyMods={ctrlCmd:!1,alt:!1},this.controller=null,this.onShowEmitter=this._register(new _.Emitter),this.onShow=this.onShowEmitter.event,this.onHideEmitter=this._register(new _.Emitter),this.onHide=this.onHideEmitter.event,this.inQuickInputContext=i.InQuickInputContextKey.bindTo(this.contextKeyService),this.quickInputTypeContext=i.QuickInputTypeContextKey.bindTo(this.contextKeyService),this.endOfQuickInputBoxContext=i.EndOfQuickInputBoxContextKey.bindTo(this.contextKeyService),this.idPrefix=h.idPrefix,this._container=h.container,this.styles=h.styles,this._register(_.Event.runAndSubscribe(d.onDidRegisterWindow,({window:L,disposables:D})=>this.registerKeyModsListeners(L,D),{window:g.mainWindow,disposables:this._store})),this._register(d.onWillUnregisterWindow(L=>{this.ui&&d.getWindow(this.ui.container)===L&&(this.reparentUI(this.layoutService.mainContainer),this.layout(this.layoutService.mainContainerDimension,this.layoutService.mainContainerOffset.quickPickTop))}))}registerKeyModsListeners(h,v){const w=S=>{this.keyMods.ctrlCmd=S.ctrlKey||S.metaKey,this.keyMods.alt=S.altKey};for(const S of[d.EventType.KEY_DOWN,d.EventType.KEY_UP,d.EventType.MOUSE_DOWN])v.add(d.addDisposableListener(h,S,w,!0))}getUI(h){if(this.ui)return h&&d.getWindow(this._container)!==d.getWindow(this.layoutService.activeContainer)&&(this.reparentUI(this.layoutService.activeContainer),this.layout(this.layoutService.activeContainerDimension,this.layoutService.activeContainerOffset.quickPickTop)),this.ui;const v=d.append(this._container,u(".quick-input-widget.show-file-icons"));v.tabIndex=-1,v.style.display="none";const w=d.createStyleSheet(v),S=d.append(v,u(".quick-input-titlebar")),L=this._register(new k.ActionBar(S,{hoverDelegate:this.options.hoverDelegate}));L.domNode.classList.add("quick-input-left-action-bar");const D=d.append(S,u(".quick-input-title")),T=this._register(new k.ActionBar(S,{hoverDelegate:this.options.hoverDelegate}));T.domNode.classList.add("quick-input-right-action-bar");const M=d.append(v,u(".quick-input-header")),A=d.append(M,u("input.quick-input-check-all"));A.type="checkbox",A.setAttribute("aria-label",(0,n.localize)(1590,"Toggle all checkboxes")),this._register(d.addStandardDisposableListener(A,d.EventType.CHANGE,pe=>{const ae=A.checked;ue.setAllVisibleChecked(ae)})),this._register(d.addDisposableListener(A,d.EventType.CLICK,pe=>{(pe.x||pe.y)&&F.setFocus()}));const P=d.append(M,u(".quick-input-description")),N=d.append(M,u(".quick-input-and-message")),O=d.append(N,u(".quick-input-filter")),F=this._register(new t.QuickInputBox(O,this.styles.inputBox,this.styles.toggle));F.setAttribute("aria-describedby",`${this.idPrefix}message`);const x=d.append(O,u(".quick-input-visible-count"));x.setAttribute("aria-live","polite"),x.setAttribute("aria-atomic","true");const W=new E.CountBadge(x,{countFormat:(0,n.localize)(1591,"{0} Results")},this.styles.countBadge),V=d.append(O,u(".quick-input-count"));V.setAttribute("aria-live","polite");const q=new E.CountBadge(V,{countFormat:(0,n.localize)(1592,"{0} Selected")},this.styles.countBadge),H=this._register(new k.ActionBar(M,{hoverDelegate:this.options.hoverDelegate}));H.domNode.classList.add("quick-input-inline-action-bar");const z=d.append(M,u(".quick-input-action")),U=this._register(new I.Button(z,this.styles.button));U.label=(0,n.localize)(1593,"OK"),this._register(U.onDidClick(pe=>{this.onDidAcceptEmitter.fire()}));const j=d.append(M,u(".quick-input-action")),Y=this._register(new I.Button(j,{...this.styles.button,supportIcons:!0}));Y.label=(0,n.localize)(1594,"Custom"),this._register(Y.onDidClick(pe=>{this.onDidCustomEmitter.fire()}));const G=d.append(N,u(`#${this.idPrefix}message.quick-input-message`)),K=this._register(new y.ProgressBar(v,this.styles.progressBar));K.getContainer().classList.add("quick-input-progress");const R=d.append(v,u(".quick-input-html-widget"));R.tabIndex=-1;const J=d.append(v,u(".quick-input-description")),ie=this.idPrefix+"list",ue=this._register(this.instantiationService.createInstance(l.QuickInputTree,v,this.options.hoverDelegate,this.options.linkOpenerDelegate,ie));F.setAttribute("aria-controls",ie),this._register(ue.onDidChangeFocus(()=>{F.setAttribute("aria-activedescendant",ue.getActiveDescendant()??"")})),this._register(ue.onChangedAllVisibleChecked(pe=>{A.checked=pe})),this._register(ue.onChangedVisibleCount(pe=>{W.setCount(pe)})),this._register(ue.onChangedCheckedCount(pe=>{q.setCount(pe)})),this._register(ue.onLeave(()=>{setTimeout(()=>{this.controller&&(F.setFocus(),this.controller instanceof i.QuickPick&&this.controller.canSelectMany&&ue.clearFocus())},0)}));const he=d.trackFocus(v);return this._register(he),this._register(d.addDisposableListener(v,d.EventType.FOCUS,pe=>{const ae=this.getUI();if(d.isAncestor(pe.relatedTarget,ae.inputContainer)){const ee=ae.inputBox.isSelectionAtEnd();this.endOfQuickInputBoxContext.get()!==ee&&this.endOfQuickInputBoxContext.set(ee)}d.isAncestor(pe.relatedTarget,ae.container)||(this.inQuickInputContext.set(!0),this.previousFocusElement=d.isHTMLElement(pe.relatedTarget)?pe.relatedTarget:void 0)},!0)),this._register(he.onDidBlur(()=>{!this.getUI().ignoreFocusOut&&!this.options.ignoreFocusOut()&&this.hide(o.QuickInputHideReason.Blur),this.inQuickInputContext.set(!1),this.endOfQuickInputBoxContext.set(!1),this.previousFocusElement=void 0})),this._register(F.onKeyDown(pe=>{const ae=this.getUI().inputBox.isSelectionAtEnd();this.endOfQuickInputBoxContext.get()!==ae&&this.endOfQuickInputBoxContext.set(ae)})),this._register(d.addDisposableListener(v,d.EventType.FOCUS,pe=>{F.setFocus()})),this._register(d.addStandardDisposableListener(v,d.EventType.KEY_DOWN,pe=>{if(!d.isAncestor(pe.target,R))switch(pe.keyCode){case 3:d.EventHelper.stop(pe,!0),this.enabled&&this.onDidAcceptEmitter.fire();break;case 9:d.EventHelper.stop(pe,!0),this.hide(o.QuickInputHideReason.Gesture);break;case 2:if(!pe.altKey&&!pe.ctrlKey&&!pe.metaKey){const ae=[".quick-input-list .monaco-action-bar .always-visible",".quick-input-list-entry:hover .monaco-action-bar",".monaco-list-row.focused .monaco-action-bar"];if(v.classList.contains("show-checkboxes")?ae.push("input"):ae.push("input[type=text]"),this.getUI().list.displayed&&ae.push(".monaco-list"),this.getUI().message&&ae.push(".quick-input-message a"),this.getUI().widget){if(d.isAncestor(pe.target,this.getUI().widget))break;ae.push(".quick-input-html-widget")}const ee=v.querySelectorAll(ae.join(", "));pe.shiftKey&&pe.target===ee[0]?(d.EventHelper.stop(pe,!0),ue.clearFocus()):!pe.shiftKey&&d.isAncestor(pe.target,ee[ee.length-1])&&(d.EventHelper.stop(pe,!0),ee[0].focus())}break;case 10:pe.ctrlKey&&(d.EventHelper.stop(pe,!0),this.getUI().list.toggleHover());break}})),this.ui={container:v,styleSheet:w,leftActionBar:L,titleBar:S,title:D,description1:J,description2:P,widget:R,rightActionBar:T,inlineActionBar:H,checkAll:A,inputContainer:N,filterContainer:O,inputBox:F,visibleCountContainer:x,visibleCount:W,countContainer:V,count:q,okContainer:z,ok:U,message:G,customButtonContainer:j,customButton:Y,list:ue,progressBar:K,onDidAccept:this.onDidAcceptEmitter.event,onDidCustom:this.onDidCustomEmitter.event,onDidTriggerButton:this.onDidTriggerButtonEmitter.event,ignoreFocusOut:!1,keyMods:this.keyMods,show:pe=>this.show(pe),hide:()=>this.hide(),setVisibilities:pe=>this.setVisibilities(pe),setEnabled:pe=>this.setEnabled(pe),setContextKey:pe=>this.options.setContextKey(pe),linkOpenerDelegate:pe=>this.options.linkOpenerDelegate(pe)},this.updateStyles(),this.ui}reparentUI(h){this.ui&&(this._container=h,d.append(this._container,this.ui.container))}pick(h,v={},w=m.CancellationToken.None){return new Promise((S,L)=>{let D=P=>{D=S,v.onKeyMods?.(T.keyMods),S(P)};if(w.isCancellationRequested){D(void 0);return}const T=this.createQuickPick({useSeparators:!0});let M;const A=[T,T.onDidAccept(()=>{if(T.canSelectMany)D(T.selectedItems.slice()),T.hide();else{const P=T.activeItems[0];P&&(D(P),T.hide())}}),T.onDidChangeActive(P=>{const N=P[0];N&&v.onDidFocus&&v.onDidFocus(N)}),T.onDidChangeSelection(P=>{if(!T.canSelectMany){const N=P[0];N&&(D(N),T.hide())}}),T.onDidTriggerItemButton(P=>v.onDidTriggerItemButton&&v.onDidTriggerItemButton({...P,removeItem:()=>{const N=T.items.indexOf(P.item);if(N!==-1){const O=T.items.slice(),F=O.splice(N,1),x=T.activeItems.filter(V=>V!==F[0]),W=T.keepScrollPosition;T.keepScrollPosition=!0,T.items=O,x&&(T.activeItems=x),T.keepScrollPosition=W}}})),T.onDidTriggerSeparatorButton(P=>v.onDidTriggerSeparatorButton?.(P)),T.onDidChangeValue(P=>{M&&!P&&(T.activeItems.length!==1||T.activeItems[0]!==M)&&(T.activeItems=[M])}),w.onCancellationRequested(()=>{T.hide()}),T.onDidHide(()=>{(0,b.dispose)(A),D(void 0)})];T.title=v.title,v.value&&(T.value=v.value),T.canSelectMany=!!v.canPickMany,T.placeholder=v.placeHolder,T.ignoreFocusOut=!!v.ignoreFocusLost,T.matchOnDescription=!!v.matchOnDescription,T.matchOnDetail=!!v.matchOnDetail,T.matchOnLabel=v.matchOnLabel===void 0||v.matchOnLabel,T.quickNavigate=v.quickNavigate,T.hideInput=!!v.hideInput,T.contextKey=v.contextKey,T.busy=!0,Promise.all([h,v.activeItem]).then(([P,N])=>{M=N,T.busy=!1,T.items=P,T.canSelectMany&&(T.selectedItems=P.filter(O=>O.type!=="separator"&&O.picked)),M&&(T.activeItems=[M])}),T.show(),Promise.resolve(h).then(void 0,P=>{L(P),T.hide()})})}createQuickPick(h={useSeparators:!1}){const v=this.getUI(!0);return new i.QuickPick(v)}createInputBox(){const h=this.getUI(!0);return new i.InputBox(h)}show(h){const v=this.getUI(!0);this.onShowEmitter.fire();const w=this.controller;this.controller=h,w?.didHide(),this.setEnabled(!0),v.leftActionBar.clear(),v.title.textContent="",v.description1.textContent="",v.description2.textContent="",d.reset(v.widget),v.rightActionBar.clear(),v.inlineActionBar.clear(),v.checkAll.checked=!1,v.inputBox.placeholder="",v.inputBox.password=!1,v.inputBox.showDecoration(p.default.Ignore),v.visibleCount.setCount(0),v.count.setCount(0),d.reset(v.message),v.progressBar.stop(),v.list.setElements([]),v.list.matchOnDescription=!1,v.list.matchOnDetail=!1,v.list.matchOnLabel=!0,v.list.sortByLabel=!0,v.ignoreFocusOut=!1,v.inputBox.toggles=void 0;const S=this.options.backKeybindingLabel();i.backButton.tooltip=S?(0,n.localize)(1595,"Back ({0})",S):(0,n.localize)(1596,"Back"),v.container.style.display="",this.updateLayout(),v.inputBox.setFocus(),this.quickInputTypeContext.set(h.type)}isVisible(){return!!this.ui&&this.ui.container.style.display!=="none"}setVisibilities(h){const v=this.getUI();v.title.style.display=h.title?"":"none",v.description1.style.display=h.description&&(h.inputBox||h.checkAll)?"":"none",v.description2.style.display=h.description&&!(h.inputBox||h.checkAll)?"":"none",v.checkAll.style.display=h.checkAll?"":"none",v.inputContainer.style.display=h.inputBox?"":"none",v.filterContainer.style.display=h.inputBox?"":"none",v.visibleCountContainer.style.display=h.visibleCount?"":"none",v.countContainer.style.display=h.count?"":"none",v.okContainer.style.display=h.ok?"":"none",v.customButtonContainer.style.display=h.customButton?"":"none",v.message.style.display=h.message?"":"none",v.progressBar.getContainer().style.display=h.progressBar?"":"none",v.list.displayed=!!h.list,v.container.classList.toggle("show-checkboxes",!!h.checkBox),v.container.classList.toggle("hidden-input",!h.inputBox&&!h.description),this.updateLayout()}setEnabled(h){if(h!==this.enabled){this.enabled=h;for(const v of this.getUI().leftActionBar.viewItems)v.action.enabled=h;for(const v of this.getUI().rightActionBar.viewItems)v.action.enabled=h;this.getUI().checkAll.disabled=!h,this.getUI().inputBox.enabled=h,this.getUI().ok.enabled=h,this.getUI().list.enabled=h}}hide(h){const v=this.controller;if(!v)return;v.willHide(h);const w=this.ui?.container,S=w&&!d.isAncestorOfActiveElement(w);if(this.controller=null,this.onHideEmitter.fire(),w&&(w.style.display="none"),!S){let L=this.previousFocusElement;for(;L&&!L.offsetParent;)L=L.parentElement??void 0;L?.offsetParent?(L.focus(),this.previousFocusElement=void 0):this.options.returnFocus()}v.didHide(h)}layout(h,v){this.dimension=h,this.titleBarOffset=v,this.updateLayout()}updateLayout(){if(this.ui&&this.isVisible()){this.ui.container.style.top=`${this.titleBarOffset}px`;const h=this.ui.container.style,v=Math.min(this.dimension.width*.62,r.MAX_WIDTH);h.width=v+"px",h.marginLeft="-"+v/2+"px",this.ui.inputBox.layout(),this.ui.list.layout(this.dimension&&this.dimension.height*.4)}}applyStyles(h){this.styles=h,this.updateStyles()}updateStyles(){if(this.ui){const{quickInputTitleBackground:h,quickInputBackground:v,quickInputForeground:w,widgetBorder:S,widgetShadow:L}=this.styles.widget;this.ui.titleBar.style.backgroundColor=h??"",this.ui.container.style.backgroundColor=v??"",this.ui.container.style.color=w??"",this.ui.container.style.border=S?`1px solid ${S}`:"",this.ui.container.style.boxShadow=L?`0 0 8px 2px ${L}`:"",this.ui.list.style(this.styles.list);const D=[];this.styles.pickerGroup.pickerGroupBorder&&D.push(`.quick-input-list .quick-input-list-entry { border-top-color: ${this.styles.pickerGroup.pickerGroupBorder}; }`),this.styles.pickerGroup.pickerGroupForeground&&D.push(`.quick-input-list .quick-input-list-separator { color: ${this.styles.pickerGroup.pickerGroupForeground}; }`),this.styles.pickerGroup.pickerGroupForeground&&D.push(".quick-input-list .quick-input-list-separator-as-item { color: var(--vscode-descriptionForeground); }"),(this.styles.keybindingLabel.keybindingLabelBackground||this.styles.keybindingLabel.keybindingLabelBorder||this.styles.keybindingLabel.keybindingLabelBottomBorder||this.styles.keybindingLabel.keybindingLabelShadow||this.styles.keybindingLabel.keybindingLabelForeground)&&(D.push(".quick-input-list .monaco-keybinding > .monaco-keybinding-key {"),this.styles.keybindingLabel.keybindingLabelBackground&&D.push(`background-color: ${this.styles.keybindingLabel.keybindingLabelBackground};`),this.styles.keybindingLabel.keybindingLabelBorder&&D.push(`border-color: ${this.styles.keybindingLabel.keybindingLabelBorder};`),this.styles.keybindingLabel.keybindingLabelBottomBorder&&D.push(`border-bottom-color: ${this.styles.keybindingLabel.keybindingLabelBottomBorder};`),this.styles.keybindingLabel.keybindingLabelShadow&&D.push(`box-shadow: inset 0 -1px 0 ${this.styles.keybindingLabel.keybindingLabelShadow};`),this.styles.keybindingLabel.keybindingLabelForeground&&D.push(`color: ${this.styles.keybindingLabel.keybindingLabelForeground};`),D.push("}"));const T=D.join(` -`);T!==this.ui.styleSheet.textContent&&(this.ui.styleSheet.textContent=T)}}};e.QuickInputController=C,e.QuickInputController=C=r=ke([ce(1,s.ILayoutService),ce(2,c.IInstantiationService),ce(3,a.IContextKeyService)],C)}),define(ne[804],se([1,0,18,6,12,7,119,59,722,110,32,25,272,803,28,5]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputService=void 0;let g=class extends n.Themable{get controller(){return this._controller||(this._controller=this._register(this.createController())),this._controller}get hasController(){return!!this._controller}get currentQuickInput(){return this.controller.currentQuickInput}get quickAccess(){return this._quickAccess||(this._quickAccess=this._register(this.instantiationService.createInstance(_.QuickAccessController))),this._quickAccess}constructor(l,a,r,u,C){super(r),this.instantiationService=l,this.contextKeyService=a,this.layoutService=u,this.configurationService=C,this._onShow=this._register(new k.Emitter),this._onHide=this._register(new k.Emitter),this.contexts=new Map}createController(l=this.layoutService,a){const r={idPrefix:"quickInput_",container:l.activeContainer,ignoreFocusOut:()=>!1,backKeybindingLabel:()=>{},setContextKey:C=>this.setContextKey(C),linkOpenerDelegate:C=>{this.instantiationService.invokeFunction(f=>{f.get(m.IOpenerService).open(C,{allowCommands:!0,fromUserGesture:!0})})},returnFocus:()=>l.focus(),styles:this.computeStyles(),hoverDelegate:this._register(this.instantiationService.createInstance(o.QuickInputHoverDelegate))},u=this._register(this.instantiationService.createInstance(t.QuickInputController,{...r,...a}));return u.layout(l.activeContainerDimension,l.activeContainerOffset.quickPickTop),this._register(l.onDidLayoutActiveContainer(C=>{(0,s.getWindow)(l.activeContainer)===(0,s.getWindow)(u.container)&&u.layout(C,l.activeContainerOffset.quickPickTop)})),this._register(l.onDidChangeActiveContainer(()=>{u.isVisible()||u.layout(l.activeContainerDimension,l.activeContainerOffset.quickPickTop)})),this._register(u.onShow(()=>{this.resetContextKeys(),this._onShow.fire()})),this._register(u.onHide(()=>{this.resetContextKeys(),this._onHide.fire()})),u}setContextKey(l){let a;l&&(a=this.contexts.get(l),a||(a=new I.RawContextKey(l,!1).bindTo(this.contextKeyService),this.contexts.set(l,a))),!(a&&a.get())&&(this.resetContextKeys(),a?.set(!0))}resetContextKeys(){this.contexts.forEach(l=>{l.get()&&l.reset()})}pick(l,a,r=d.CancellationToken.None){return this.controller.pick(l,a,r)}createQuickPick(l={useSeparators:!1}){return this.controller.createQuickPick(l)}createInputBox(){return this.controller.createInputBox()}updateStyles(){this.hasController&&this.controller.applyStyles(this.computeStyles())}computeStyles(){return{widget:{quickInputBackground:(0,p.asCssVariable)(p.quickInputBackground),quickInputForeground:(0,p.asCssVariable)(p.quickInputForeground),quickInputTitleBackground:(0,p.asCssVariable)(p.quickInputTitleBackground),widgetBorder:(0,p.asCssVariable)(p.widgetBorder),widgetShadow:(0,p.asCssVariable)(p.widgetShadow)},inputBox:b.defaultInputBoxStyles,toggle:b.defaultToggleStyles,countBadge:b.defaultCountBadgeStyles,button:b.defaultButtonStyles,progressBar:b.defaultProgressBarStyles,keybindingLabel:b.defaultKeybindingLabelStyles,list:(0,b.getListStyles)({listBackground:p.quickInputBackground,listFocusBackground:p.quickInputListFocusBackground,listFocusForeground:p.quickInputListFocusForeground,listInactiveFocusForeground:p.quickInputListFocusForeground,listInactiveSelectionIconForeground:p.quickInputListFocusIconForeground,listInactiveFocusBackground:p.quickInputListFocusBackground,listFocusOutline:p.activeContrastBorder,listInactiveFocusOutline:p.activeContrastBorder}),pickerGroup:{pickerGroupBorder:(0,p.asCssVariable)(p.pickerGroupBorder),pickerGroupForeground:(0,p.asCssVariable)(p.pickerGroupForeground)}}}};e.QuickInputService=g,e.QuickInputService=g=ke([ce(0,E.IInstantiationService),ce(1,I.IContextKeyService),ce(2,n.IThemeService),ce(3,y.ILayoutService),ce(4,i.IConfigurationService)],g)}),define(ne[805],se([1,0,6,15,25,18,7,12,394,34,804,127,28,540]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputEditorWidget=e.QuickInputEditorContribution=e.StandaloneQuickInputService=void 0;let t=class extends p.QuickInputService{constructor(l,a,r,u,C,f){super(a,r,u,new _.EditorScopedLayoutService(l.getContainerDomNode(),C),f),this.host=void 0;const h=s.get(l);if(h){const v=h.widget;this.host={_serviceBrand:void 0,get mainContainer(){return v.getDomNode()},getContainer(){return v.getDomNode()},whenContainerStylesLoaded(){},get containers(){return[v.getDomNode()]},get activeContainer(){return v.getDomNode()},get mainContainerDimension(){return l.getLayoutInfo()},get activeContainerDimension(){return l.getLayoutInfo()},get onDidLayoutMainContainer(){return l.onDidLayoutChange},get onDidLayoutActiveContainer(){return l.onDidLayoutChange},get onDidLayoutContainer(){return d.Event.map(l.onDidLayoutChange,w=>({container:v.getDomNode(),dimension:w}))},get onDidChangeActiveContainer(){return d.Event.None},get onDidAddContainer(){return d.Event.None},get mainContainerOffset(){return{top:0,quickPickTop:0}},get activeContainerOffset(){return{top:0,quickPickTop:0}},focus:()=>l.focus()}}else this.host=void 0}createController(){return super.createController(this.host)}};t=ke([ce(1,y.IInstantiationService),ce(2,m.IContextKeyService),ce(3,I.IThemeService),ce(4,b.ICodeEditorService),ce(5,o.IConfigurationService)],t);let i=class{get activeService(){const l=this.codeEditorService.getFocusedCodeEditor();if(!l)throw new Error("Quick input service needs a focused editor to work.");let a=this.mapEditorToService.get(l);if(!a){const r=a=this.instantiationService.createInstance(t,l);this.mapEditorToService.set(l,a),(0,n.createSingleCallFunction)(l.onDidDispose)(()=>{r.dispose(),this.mapEditorToService.delete(l)})}return a}get currentQuickInput(){return this.activeService.currentQuickInput}get quickAccess(){return this.activeService.quickAccess}constructor(l,a){this.instantiationService=l,this.codeEditorService=a,this.mapEditorToService=new Map}pick(l,a,r=E.CancellationToken.None){return this.activeService.pick(l,a,r)}createQuickPick(l={useSeparators:!1}){return this.activeService.createQuickPick(l)}createInputBox(){return this.activeService.createInputBox()}};e.StandaloneQuickInputService=i,e.StandaloneQuickInputService=i=ke([ce(0,y.IInstantiationService),ce(1,b.ICodeEditorService)],i);class s{static{this.ID="editor.controller.quickInput"}static get(l){return l.getContribution(s.ID)}constructor(l){this.editor=l,this.widget=new g(this.editor)}dispose(){this.widget.dispose()}}e.QuickInputEditorContribution=s;class g{static{this.ID="editor.contrib.quickInputWidget"}constructor(l){this.codeEditor=l,this.domNode=document.createElement("div"),this.codeEditor.addOverlayWidget(this)}getId(){return g.ID}getDomNode(){return this.domNode}getPosition(){return{preference:2}}dispose(){this.codeEditor.removeOverlayWidget(this)}}e.QuickInputEditorWidget=g,(0,k.registerEditorContribution)(s.ID,s,4)}),define(ne[284],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UndoRedoSource=e.UndoRedoGroup=e.ResourceEditStackSnapshot=e.IUndoRedoService=void 0,e.IUndoRedoService=(0,d.createDecorator)("undoRedoService");class k{constructor(m,_){this.resource=m,this.elements=_}}e.ResourceEditStackSnapshot=k;class I{static{this._ID=0}constructor(){this.id=I._ID++,this.order=1}nextOrder(){return this.id===0?0:this.order++}static{this.None=new I}}e.UndoRedoGroup=I;class E{static{this._ID=0}constructor(){this.id=E._ID++,this.order=1}nextOrder(){return this.id===0?0:this.order++}static{this.None=new E}}e.UndoRedoSource=E}),define(ne[35],se([1,0,13,33,8,6,2,11,22,145,230,9,4,23,197,43,36,40,661,783,370,329,577,578,371,662,202,707,263,132,7,284]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S,L,D,T,M){"use strict";var A;Object.defineProperty(e,"__esModule",{value:!0}),e.ModelDecorationOptions=e.ModelDecorationInjectedTextOptions=e.ModelDecorationMinimapOptions=e.ModelDecorationGlyphMarginOptions=e.ModelDecorationOverviewRulerOptions=e.TextModel=void 0,e.createTextBufferFactory=P,e.createTextBufferFactoryFromSnapshot=N,e.createTextBuffer=O,e.indentOfLine=z;function P(X){const B=new v.PieceTreeTextBufferBuilder;return B.acceptChunk(X),B.finish()}function N(X){const B=new v.PieceTreeTextBufferBuilder;let $;for(;typeof($=X.read())=="string";)B.acceptChunk($);return B.finish()}function O(X,B){let $;return typeof X=="string"?$=P(X):c.isITextSnapshot(X)?$=N(X):$=X,$.create(B)}let F=0;const x=999,W=1e4;class V{constructor(B){this._source=B,this._eos=!1}read(){if(this._eos)return null;const B=[];let $=0,Q=0;do{const Z=this._source.read();if(Z===null)return this._eos=!0,$===0?null:B.join("");if(Z.length>0&&(B[$++]=Z,Q+=Z.length),Q>=64*1024)return B.join("")}while(!0)}}const q=()=>{throw new Error("Invalid change accessor")};let H=class extends y.Disposable{static{A=this}static{this._MODEL_SYNC_LIMIT=50*1024*1024}static{this.LARGE_FILE_SIZE_THRESHOLD=20*1024*1024}static{this.LARGE_FILE_LINE_COUNT_THRESHOLD=300*1e3}static{this.LARGE_FILE_HEAP_OPERATION_THRESHOLD=256*1024*1024}static{this.DEFAULT_CREATION_OPTIONS={isForSimpleWidget:!1,tabSize:i.EDITOR_MODEL_DEFAULTS.tabSize,indentSize:i.EDITOR_MODEL_DEFAULTS.indentSize,insertSpaces:i.EDITOR_MODEL_DEFAULTS.insertSpaces,detectIndentation:!1,defaultEOL:1,trimAutoWhitespace:i.EDITOR_MODEL_DEFAULTS.trimAutoWhitespace,largeFileOptimizations:i.EDITOR_MODEL_DEFAULTS.largeFileOptimizations,bracketPairColorizationOptions:i.EDITOR_MODEL_DEFAULTS.bracketPairColorizationOptions}}static resolveOptions(B,$){if($.detectIndentation){const Q=(0,C.guessIndentation)(B,$.tabSize,$.insertSpaces);return new c.TextModelResolvedOptions({tabSize:Q.tabSize,indentSize:"tabSize",insertSpaces:Q.insertSpaces,trimAutoWhitespace:$.trimAutoWhitespace,defaultEOL:$.defaultEOL,bracketPairColorizationOptions:$.bracketPairColorizationOptions})}return new c.TextModelResolvedOptions($)}get onDidChangeLanguage(){return this._tokenizationTextModelPart.onDidChangeLanguage}get onDidChangeLanguageConfiguration(){return this._tokenizationTextModelPart.onDidChangeLanguageConfiguration}get onDidChangeTokens(){return this._tokenizationTextModelPart.onDidChangeTokens}onDidChangeContent(B){return this._eventEmitter.slowEvent($=>B($.contentChangedEvent))}onDidChangeContentOrInjectedText(B){return(0,y.combinedDisposable)(this._eventEmitter.fastEvent($=>B($)),this._onDidChangeInjectedText.event($=>B($)))}_isDisposing(){return this.__isDisposing}get tokenization(){return this._tokenizationTextModelPart}get bracketPairs(){return this._bracketPairs}get guides(){return this._guidesTextModelPart}constructor(B,$,Q,Z=null,te,re,le,me){super(),this._undoRedoService=te,this._languageService=re,this._languageConfigurationService=le,this.instantiationService=me,this._onWillDispose=this._register(new E.Emitter),this.onWillDispose=this._onWillDispose.event,this._onDidChangeDecorations=this._register(new de(Ae=>this.handleBeforeFireDecorationsChangedEvent(Ae))),this.onDidChangeDecorations=this._onDidChangeDecorations.event,this._onDidChangeOptions=this._register(new E.Emitter),this.onDidChangeOptions=this._onDidChangeOptions.event,this._onDidChangeAttached=this._register(new E.Emitter),this.onDidChangeAttached=this._onDidChangeAttached.event,this._onDidChangeInjectedText=this._register(new E.Emitter),this._eventEmitter=this._register(new ge),this._languageSelectionListener=this._register(new y.MutableDisposable),this._deltaDecorationCallCnt=0,this._attachedViews=new L.AttachedViews,F++,this.id="$model"+F,this.isForSimpleWidget=Q.isForSimpleWidget,typeof Z>"u"||Z===null?this._associatedResource=_.URI.parse("inmemory://model/"+F):this._associatedResource=Z,this._attachedEditorCount=0;const{textBuffer:Ce,disposable:ye}=O(B,Q.defaultEOL);this._buffer=Ce,this._bufferDisposable=ye,this._options=A.resolveOptions(this._buffer,Q);const Le=typeof $=="string"?$:$.languageId;typeof $!="string"&&(this._languageSelectionListener.value=$.onDidChange(()=>this._setLanguage($.languageId))),this._bracketPairs=this._register(new l.BracketPairsTextModelPart(this,this._languageConfigurationService)),this._guidesTextModelPart=this._register(new u.GuidesTextModelPart(this,this._languageConfigurationService)),this._decorationProvider=this._register(new a.ColorizedBracketPairsDecorationProvider(this)),this._tokenizationTextModelPart=this.instantiationService.createInstance(S.TokenizationTextModelPart,this,this._bracketPairs,Le,this._attachedViews);const Ee=this._buffer.getLineCount(),Me=this._buffer.getValueLengthInRange(new o.Range(1,1,Ee,this._buffer.getLineLength(Ee)+1),0);Q.largeFileOptimizations?(this._isTooLargeForTokenization=Me>A.LARGE_FILE_SIZE_THRESHOLD||Ee>A.LARGE_FILE_LINE_COUNT_THRESHOLD,this._isTooLargeForHeapOperation=Me>A.LARGE_FILE_HEAP_OPERATION_THRESHOLD):(this._isTooLargeForTokenization=!1,this._isTooLargeForHeapOperation=!1),this._isTooLargeForSyncing=Me>A._MODEL_SYNC_LIMIT,this._versionId=1,this._alternativeVersionId=1,this._initialUndoRedoSnapshot=null,this._isDisposed=!1,this.__isDisposing=!1,this._instanceId=m.singleLetterHash(F),this._lastDecorationId=0,this._decorations=Object.create(null),this._decorationsTree=new G,this._commandManager=new r.EditStack(this,this._undoRedoService),this._isUndoing=!1,this._isRedoing=!1,this._trimAutoWhitespaceLines=null,this._register(this._decorationProvider.onDidChange(()=>{this._onDidChangeDecorations.beginDeferredEmit(),this._onDidChangeDecorations.fire(),this._onDidChangeDecorations.endDeferredEmit()})),this._languageService.requestRichLanguageFeatures(Le),this._register(this._languageConfigurationService.onDidChange(Ae=>{this._bracketPairs.handleLanguageConfigurationServiceChange(Ae),this._tokenizationTextModelPart.handleLanguageConfigurationServiceChange(Ae)}))}dispose(){this.__isDisposing=!0,this._onWillDispose.fire(),this._tokenizationTextModelPart.dispose(),this._isDisposed=!0,super.dispose(),this._bufferDisposable.dispose(),this.__isDisposing=!1;const B=new h.PieceTreeTextBuffer([],"",` -`,!1,!1,!0,!0);B.dispose(),this._buffer=B,this._bufferDisposable=y.Disposable.None}_assertNotDisposed(){if(this._isDisposed)throw new I.BugIndicatingError("Model is disposed!")}_emitContentChangedEvent(B,$){this.__isDisposing||(this._tokenizationTextModelPart.handleDidChangeContent($),this._bracketPairs.handleDidChangeContent($),this._eventEmitter.fire(new D.InternalModelContentChangeEvent(B,$)))}setValue(B){if(this._assertNotDisposed(),B==null)throw(0,I.illegalArgument)();const{textBuffer:$,disposable:Q}=O(B,this._options.defaultEOL);this._setValueFromTextBuffer($,Q)}_createContentChanged2(B,$,Q,Z,te,re,le,me){return{changes:[{range:B,rangeOffset:$,rangeLength:Q,text:Z}],eol:this._buffer.getEOL(),isEolChange:me,versionId:this.getVersionId(),isUndoing:te,isRedoing:re,isFlush:le}}_setValueFromTextBuffer(B,$){this._assertNotDisposed();const Q=this.getFullModelRange(),Z=this.getValueLengthInRange(Q),te=this.getLineCount(),re=this.getLineMaxColumn(te);this._buffer=B,this._bufferDisposable.dispose(),this._bufferDisposable=$,this._increaseVersionId(),this._decorations=Object.create(null),this._decorationsTree=new G,this._commandManager.clear(),this._trimAutoWhitespaceLines=null,this._emitContentChangedEvent(new D.ModelRawContentChangedEvent([new D.ModelRawFlush],this._versionId,!1,!1),this._createContentChanged2(new o.Range(1,1,te,re),0,Z,this.getValue(),!1,!1,!0,!1))}setEOL(B){this._assertNotDisposed();const $=B===1?`\r -`:` -`;if(this._buffer.getEOL()===$)return;const Q=this.getFullModelRange(),Z=this.getValueLengthInRange(Q),te=this.getLineCount(),re=this.getLineMaxColumn(te);this._onBeforeEOLChange(),this._buffer.setEOL($),this._increaseVersionId(),this._onAfterEOLChange(),this._emitContentChangedEvent(new D.ModelRawContentChangedEvent([new D.ModelRawEOLChanged],this._versionId,!1,!1),this._createContentChanged2(new o.Range(1,1,te,re),0,Z,this.getValue(),!1,!1,!1,!0))}_onBeforeEOLChange(){this._decorationsTree.ensureAllNodesHaveRanges(this)}_onAfterEOLChange(){const B=this.getVersionId(),$=this._decorationsTree.collectNodesPostOrder();for(let Q=0,Z=$.length;Q0}getAttachedEditorCount(){return this._attachedEditorCount}isTooLargeForSyncing(){return this._isTooLargeForSyncing}isTooLargeForTokenization(){return this._isTooLargeForTokenization}isTooLargeForHeapOperation(){return this._isTooLargeForHeapOperation}isDisposed(){return this._isDisposed}isDominatedByLongLines(){if(this._assertNotDisposed(),this.isTooLargeForTokenization())return!1;let B=0,$=0;const Q=this._buffer.getLineCount();for(let Z=1;Z<=Q;Z++){const te=this._buffer.getLineLength(Z);te>=W?$+=te:B+=te}return $>B}get uri(){return this._associatedResource}getOptions(){return this._assertNotDisposed(),this._options}getFormattingOptions(){return{tabSize:this._options.indentSize,insertSpaces:this._options.insertSpaces}}updateOptions(B){this._assertNotDisposed();const $=typeof B.tabSize<"u"?B.tabSize:this._options.tabSize,Q=typeof B.indentSize<"u"?B.indentSize:this._options.originalIndentSize,Z=typeof B.insertSpaces<"u"?B.insertSpaces:this._options.insertSpaces,te=typeof B.trimAutoWhitespace<"u"?B.trimAutoWhitespace:this._options.trimAutoWhitespace,re=typeof B.bracketColorizationOptions<"u"?B.bracketColorizationOptions:this._options.bracketPairColorizationOptions,le=new c.TextModelResolvedOptions({tabSize:$,indentSize:Q,insertSpaces:Z,defaultEOL:this._options.defaultEOL,trimAutoWhitespace:te,bracketPairColorizationOptions:re});if(this._options.equals(le))return;const me=this._options.createChangeEvent(le);this._options=le,this._bracketPairs.handleDidChangeOptions(me),this._decorationProvider.handleDidChangeOptions(me),this._onDidChangeOptions.fire(me)}detectIndentation(B,$){this._assertNotDisposed();const Q=(0,C.guessIndentation)(this._buffer,$,B);this.updateOptions({insertSpaces:Q.insertSpaces,tabSize:Q.tabSize,indentSize:Q.tabSize})}normalizeIndentation(B){return this._assertNotDisposed(),(0,p.normalizeIndentation)(B,this._options.indentSize,this._options.insertSpaces)}getVersionId(){return this._assertNotDisposed(),this._versionId}mightContainRTL(){return this._buffer.mightContainRTL()}mightContainUnusualLineTerminators(){return this._buffer.mightContainUnusualLineTerminators()}removeUnusualLineTerminators(B=null){const $=this.findMatches(m.UNUSUAL_LINE_TERMINATORS.source,!1,!0,!1,null,!1,1073741824);this._buffer.resetMightContainUnusualLineTerminators(),this.pushEditOperations(B,$.map(Q=>({range:Q.range,text:null})),()=>null)}mightContainNonBasicASCII(){return this._buffer.mightContainNonBasicASCII()}getAlternativeVersionId(){return this._assertNotDisposed(),this._alternativeVersionId}getInitialUndoRedoSnapshot(){return this._assertNotDisposed(),this._initialUndoRedoSnapshot}getOffsetAt(B){this._assertNotDisposed();const $=this._validatePosition(B.lineNumber,B.column,0);return this._buffer.getOffsetAt($.lineNumber,$.column)}getPositionAt(B){this._assertNotDisposed();const $=Math.min(this._buffer.getLength(),Math.max(0,B));return this._buffer.getPositionAt($)}_increaseVersionId(){this._versionId=this._versionId+1,this._alternativeVersionId=this._versionId}_overwriteVersionId(B){this._versionId=B}_overwriteAlternativeVersionId(B){this._alternativeVersionId=B}_overwriteInitialUndoRedoSnapshot(B){this._initialUndoRedoSnapshot=B}getValue(B,$=!1){if(this._assertNotDisposed(),this.isTooLargeForHeapOperation())throw new I.BugIndicatingError("Operation would exceed heap memory limits");const Q=this.getFullModelRange(),Z=this.getValueInRange(Q,B);return $?this._buffer.getBOM()+Z:Z}createSnapshot(B=!1){return new V(this._buffer.createSnapshot(B))}getValueLength(B,$=!1){this._assertNotDisposed();const Q=this.getFullModelRange(),Z=this.getValueLengthInRange(Q,B);return $?this._buffer.getBOM().length+Z:Z}getValueInRange(B,$=0){return this._assertNotDisposed(),this._buffer.getValueInRange(this.validateRange(B),$)}getValueLengthInRange(B,$=0){return this._assertNotDisposed(),this._buffer.getValueLengthInRange(this.validateRange(B),$)}getCharacterCountInRange(B,$=0){return this._assertNotDisposed(),this._buffer.getCharacterCountInRange(this.validateRange(B),$)}getLineCount(){return this._assertNotDisposed(),this._buffer.getLineCount()}getLineContent(B){if(this._assertNotDisposed(),B<1||B>this.getLineCount())throw new I.BugIndicatingError("Illegal value for lineNumber");return this._buffer.getLineContent(B)}getLineLength(B){if(this._assertNotDisposed(),B<1||B>this.getLineCount())throw new I.BugIndicatingError("Illegal value for lineNumber");return this._buffer.getLineLength(B)}getLinesContent(){if(this._assertNotDisposed(),this.isTooLargeForHeapOperation())throw new I.BugIndicatingError("Operation would exceed heap memory limits");return this._buffer.getLinesContent()}getEOL(){return this._assertNotDisposed(),this._buffer.getEOL()}getEndOfLineSequence(){return this._assertNotDisposed(),this._buffer.getEOL()===` -`?0:1}getLineMinColumn(B){return this._assertNotDisposed(),1}getLineMaxColumn(B){if(this._assertNotDisposed(),B<1||B>this.getLineCount())throw new I.BugIndicatingError("Illegal value for lineNumber");return this._buffer.getLineLength(B)+1}getLineFirstNonWhitespaceColumn(B){if(this._assertNotDisposed(),B<1||B>this.getLineCount())throw new I.BugIndicatingError("Illegal value for lineNumber");return this._buffer.getLineFirstNonWhitespaceColumn(B)}getLineLastNonWhitespaceColumn(B){if(this._assertNotDisposed(),B<1||B>this.getLineCount())throw new I.BugIndicatingError("Illegal value for lineNumber");return this._buffer.getLineLastNonWhitespaceColumn(B)}_validateRangeRelaxedNoAllocations(B){const $=this._buffer.getLineCount(),Q=B.startLineNumber,Z=B.startColumn;let te=Math.floor(typeof Q=="number"&&!isNaN(Q)?Q:1),re=Math.floor(typeof Z=="number"&&!isNaN(Z)?Z:1);if(te<1)te=1,re=1;else if(te>$)te=$,re=this.getLineMaxColumn(te);else if(re<=1)re=1;else{const Le=this.getLineMaxColumn(te);re>=Le&&(re=Le)}const le=B.endLineNumber,me=B.endColumn;let Ce=Math.floor(typeof le=="number"&&!isNaN(le)?le:1),ye=Math.floor(typeof me=="number"&&!isNaN(me)?me:1);if(Ce<1)Ce=1,ye=1;else if(Ce>$)Ce=$,ye=this.getLineMaxColumn(Ce);else if(ye<=1)ye=1;else{const Le=this.getLineMaxColumn(Ce);ye>=Le&&(ye=Le)}return Q===te&&Z===re&&le===Ce&&me===ye&&B instanceof o.Range&&!(B instanceof t.Selection)?B:new o.Range(te,re,Ce,ye)}_isValidPosition(B,$,Q){if(typeof B!="number"||typeof $!="number"||isNaN(B)||isNaN($)||B<1||$<1||(B|0)!==B||($|0)!==$)return!1;const Z=this._buffer.getLineCount();if(B>Z)return!1;if($===1)return!0;const te=this.getLineMaxColumn(B);if($>te)return!1;if(Q===1){const re=this._buffer.getLineCharCode(B,$-2);if(m.isHighSurrogate(re))return!1}return!0}_validatePosition(B,$,Q){const Z=Math.floor(typeof B=="number"&&!isNaN(B)?B:1),te=Math.floor(typeof $=="number"&&!isNaN($)?$:1),re=this._buffer.getLineCount();if(Z<1)return new n.Position(1,1);if(Z>re)return new n.Position(re,this.getLineMaxColumn(re));if(te<=1)return new n.Position(Z,1);const le=this.getLineMaxColumn(Z);if(te>=le)return new n.Position(Z,le);if(Q===1){const me=this._buffer.getLineCharCode(Z,te-2);if(m.isHighSurrogate(me))return new n.Position(Z,te-1)}return new n.Position(Z,te)}validatePosition(B){return this._assertNotDisposed(),B instanceof n.Position&&this._isValidPosition(B.lineNumber,B.column,1)?B:this._validatePosition(B.lineNumber,B.column,1)}_isValidRange(B,$){const Q=B.startLineNumber,Z=B.startColumn,te=B.endLineNumber,re=B.endColumn;if(!this._isValidPosition(Q,Z,0)||!this._isValidPosition(te,re,0))return!1;if($===1){const le=Z>1?this._buffer.getLineCharCode(Q,Z-2):0,me=re>1&&re<=this._buffer.getLineLength(te)?this._buffer.getLineCharCode(te,re-2):0,Ce=m.isHighSurrogate(le),ye=m.isHighSurrogate(me);return!Ce&&!ye}return!0}validateRange(B){if(this._assertNotDisposed(),B instanceof o.Range&&!(B instanceof t.Selection)&&this._isValidRange(B,1))return B;const Q=this._validatePosition(B.startLineNumber,B.startColumn,0),Z=this._validatePosition(B.endLineNumber,B.endColumn,0),te=Q.lineNumber,re=Q.column,le=Z.lineNumber,me=Z.column;{const Ce=re>1?this._buffer.getLineCharCode(te,re-2):0,ye=me>1&&me<=this._buffer.getLineLength(le)?this._buffer.getLineCharCode(le,me-2):0,Le=m.isHighSurrogate(Ce),Ee=m.isHighSurrogate(ye);return!Le&&!Ee?new o.Range(te,re,le,me):te===le&&re===me?new o.Range(te,re-1,le,me-1):Le&&Ee?new o.Range(te,re-1,le,me+1):Le?new o.Range(te,re-1,le,me):new o.Range(te,re,le,me+1)}return new o.Range(te,re,le,me)}modifyPosition(B,$){this._assertNotDisposed();const Q=this.getOffsetAt(B)+$;return this.getPositionAt(Math.min(this._buffer.getLength(),Math.max(0,Q)))}getFullModelRange(){this._assertNotDisposed();const B=this.getLineCount();return new o.Range(1,1,B,this.getLineMaxColumn(B))}findMatchesLineByLine(B,$,Q,Z){return this._buffer.findMatchesLineByLine(B,$,Q,Z)}findMatches(B,$,Q,Z,te,re,le=x){this._assertNotDisposed();let me=null;$!==null&&(Array.isArray($)||($=[$]),$.every(Le=>o.Range.isIRange(Le))&&(me=$.map(Le=>this.validateRange(Le)))),me===null&&(me=[this.getFullModelRange()]),me=me.sort((Le,Ee)=>Le.startLineNumber-Ee.startLineNumber||Le.startColumn-Ee.startColumn);const Ce=[];Ce.push(me.reduce((Le,Ee)=>o.Range.areIntersecting(Le,Ee)?Le.plusRange(Ee):(Ce.push(Le),Ee)));let ye;if(!Q&&B.indexOf(` -`)<0){const Ee=new w.SearchParams(B,Q,Z,te).parseSearchRequest();if(!Ee)return[];ye=Me=>this.findMatchesLineByLine(Me,Ee,re,le)}else ye=Le=>w.TextModelSearch.findMatches(this,new w.SearchParams(B,Q,Z,te),Le,re,le);return Ce.map(ye).reduce((Le,Ee)=>Le.concat(Ee),[])}findNextMatch(B,$,Q,Z,te,re){this._assertNotDisposed();const le=this.validatePosition($);if(!Q&&B.indexOf(` -`)<0){const Ce=new w.SearchParams(B,Q,Z,te).parseSearchRequest();if(!Ce)return null;const ye=this.getLineCount();let Le=new o.Range(le.lineNumber,le.column,ye,this.getLineMaxColumn(ye)),Ee=this.findMatchesLineByLine(Le,Ce,re,1);return w.TextModelSearch.findNextMatch(this,new w.SearchParams(B,Q,Z,te),le,re),Ee.length>0||(Le=new o.Range(1,1,le.lineNumber,this.getLineMaxColumn(le.lineNumber)),Ee=this.findMatchesLineByLine(Le,Ce,re,1),Ee.length>0)?Ee[0]:null}return w.TextModelSearch.findNextMatch(this,new w.SearchParams(B,Q,Z,te),le,re)}findPreviousMatch(B,$,Q,Z,te,re){this._assertNotDisposed();const le=this.validatePosition($);return w.TextModelSearch.findPreviousMatch(this,new w.SearchParams(B,Q,Z,te),le,re)}pushStackElement(){this._commandManager.pushStackElement()}popStackElement(){this._commandManager.popStackElement()}pushEOL(B){if((this.getEOL()===` -`?0:1)!==B)try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit(),this._initialUndoRedoSnapshot===null&&(this._initialUndoRedoSnapshot=this._undoRedoService.createSnapshot(this.uri)),this._commandManager.pushEOL(B)}finally{this._eventEmitter.endDeferredEmit(),this._onDidChangeDecorations.endDeferredEmit()}}_validateEditOperation(B){return B instanceof c.ValidAnnotatedEditOperation?B:new c.ValidAnnotatedEditOperation(B.identifier||null,this.validateRange(B.range),B.text,B.forceMoveMarkers||!1,B.isAutoWhitespaceEdit||!1,B._isTracked||!1)}_validateEditOperations(B){const $=[];for(let Q=0,Z=B.length;Q({range:this.validateRange(le.range),text:le.text}));let re=!0;if(B)for(let le=0,me=B.length;leCe.endLineNumber,Ne=Ce.startLineNumber>Me.endLineNumber;if(!Ae&&!Ne){ye=!0;break}}if(!ye){re=!1;break}}if(re)for(let le=0,me=this._trimAutoWhitespaceLines.length;leAe.endLineNumber)&&!(Ce===Ae.startLineNumber&&Ae.startColumn===ye&&Ae.isEmpty()&&Ne&&Ne.length>0&&Ne.charAt(0)===` -`)&&!(Ce===Ae.startLineNumber&&Ae.startColumn===1&&Ae.isEmpty()&&Ne&&Ne.length>0&&Ne.charAt(Ne.length-1)===` -`)){Le=!1;break}}if(Le){const Ee=new o.Range(Ce,1,Ce,ye);$.push(new c.ValidAnnotatedEditOperation(null,Ee,null,!1,!1,!1))}}this._trimAutoWhitespaceLines=null}return this._initialUndoRedoSnapshot===null&&(this._initialUndoRedoSnapshot=this._undoRedoService.createSnapshot(this.uri)),this._commandManager.pushEditOperation(B,$,Q,Z)}_applyUndo(B,$,Q,Z){const te=B.map(re=>{const le=this.getPositionAt(re.newPosition),me=this.getPositionAt(re.newEnd);return{range:new o.Range(le.lineNumber,le.column,me.lineNumber,me.column),text:re.oldText}});this._applyUndoRedoEdits(te,$,!0,!1,Q,Z)}_applyRedo(B,$,Q,Z){const te=B.map(re=>{const le=this.getPositionAt(re.oldPosition),me=this.getPositionAt(re.oldEnd);return{range:new o.Range(le.lineNumber,le.column,me.lineNumber,me.column),text:re.newText}});this._applyUndoRedoEdits(te,$,!1,!0,Q,Z)}_applyUndoRedoEdits(B,$,Q,Z,te,re){try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit(),this._isUndoing=Q,this._isRedoing=Z,this.applyEdits(B,!1),this.setEOL($),this._overwriteAlternativeVersionId(te)}finally{this._isUndoing=!1,this._isRedoing=!1,this._eventEmitter.endDeferredEmit(re),this._onDidChangeDecorations.endDeferredEmit()}}applyEdits(B,$=!1){try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit();const Q=this._validateEditOperations(B);return this._doApplyEdits(Q,$)}finally{this._eventEmitter.endDeferredEmit(),this._onDidChangeDecorations.endDeferredEmit()}}_doApplyEdits(B,$){const Q=this._buffer.getLineCount(),Z=this._buffer.applyEdits(B,this._options.trimAutoWhitespace,$),te=this._buffer.getLineCount(),re=Z.changes;if(this._trimAutoWhitespaceLines=Z.trimAutoWhitespaceLineNumbers,re.length!==0){for(let Ce=0,ye=re.length;Ce=0;be--){const ve=Me+be,we=it+be;xe.takeFromEndWhile(Pe=>Pe.lineNumber>we);const Te=xe.takeFromEndWhile(Pe=>Pe.lineNumber===we);le.push(new D.ModelRawLineChanged(ve,this.getLineContent(we),Te))}if(zeje.lineNumber<$e),Pe[He]=be.takeWhile(je=>je.lineNumber===$e)}le.push(new D.ModelRawLinesInserted(ve+1,Me+Ke,Be,Pe))}me+=Ge}this._emitContentChangedEvent(new D.ModelRawContentChangedEvent(le,this.getVersionId(),this._isUndoing,this._isRedoing),{changes:re,eol:this._buffer.getEOL(),isEolChange:!1,versionId:this.getVersionId(),isUndoing:this._isUndoing,isRedoing:this._isRedoing,isFlush:!1})}return Z.reverseEdits===null?void 0:Z.reverseEdits}undo(){return this._undoRedoService.undo(this.uri)}canUndo(){return this._undoRedoService.canUndo(this.uri)}redo(){return this._undoRedoService.redo(this.uri)}canRedo(){return this._undoRedoService.canRedo(this.uri)}handleBeforeFireDecorationsChangedEvent(B){if(B===null||B.size===0)return;const Q=Array.from(B).map(Z=>new D.ModelRawLineChanged(Z,this.getLineContent(Z),this._getInjectedTextInLine(Z)));this._onDidChangeInjectedText.fire(new D.ModelInjectedTextChangedEvent(Q))}changeDecorations(B,$=0){this._assertNotDisposed();try{return this._onDidChangeDecorations.beginDeferredEmit(),this._changeDecorations($,B)}finally{this._onDidChangeDecorations.endDeferredEmit()}}_changeDecorations(B,$){const Q={addDecoration:(te,re)=>this._deltaDecorationsImpl(B,[],[{range:te,options:re}])[0],changeDecoration:(te,re)=>{this._changeDecorationImpl(te,re)},changeDecorationOptions:(te,re)=>{this._changeDecorationOptionsImpl(te,ee(re))},removeDecoration:te=>{this._deltaDecorationsImpl(B,[te],[])},deltaDecorations:(te,re)=>te.length===0&&re.length===0?[]:this._deltaDecorationsImpl(B,te,re)};let Z=null;try{Z=$(Q)}catch(te){(0,I.onUnexpectedError)(te)}return Q.addDecoration=q,Q.changeDecoration=q,Q.changeDecorationOptions=q,Q.removeDecoration=q,Q.deltaDecorations=q,Z}deltaDecorations(B,$,Q=0){if(this._assertNotDisposed(),B||(B=[]),B.length===0&&$.length===0)return[];try{return this._deltaDecorationCallCnt++,this._deltaDecorationCallCnt>1&&(console.warn("Invoking deltaDecorations recursively could lead to leaking decorations."),(0,I.onUnexpectedError)(new Error("Invoking deltaDecorations recursively could lead to leaking decorations."))),this._onDidChangeDecorations.beginDeferredEmit(),this._deltaDecorationsImpl(Q,B,$)}finally{this._onDidChangeDecorations.endDeferredEmit(),this._deltaDecorationCallCnt--}}_getTrackedRange(B){return this.getDecorationRange(B)}_setTrackedRange(B,$,Q){const Z=B?this._decorations[B]:null;if(!Z)return $?this._deltaDecorationsImpl(0,[],[{range:$,options:ae[Q]}],!0)[0]:null;if(!$)return this._decorationsTree.delete(Z),delete this._decorations[Z.id],null;const te=this._validateRangeRelaxedNoAllocations($),re=this._buffer.getOffsetAt(te.startLineNumber,te.startColumn),le=this._buffer.getOffsetAt(te.endLineNumber,te.endColumn);return this._decorationsTree.delete(Z),Z.reset(this.getVersionId(),re,le,te),Z.setOptions(ae[Q]),this._decorationsTree.insert(Z),Z.id}removeAllDecorationsWithOwnerId(B){if(this._isDisposed)return;const $=this._decorationsTree.collectNodesFromOwner(B);for(let Q=0,Z=$.length;Qthis.getLineCount()?[]:this.getLinesDecorations(B,B,$,Q)}getLinesDecorations(B,$,Q=0,Z=!1,te=!1){const re=this.getLineCount(),le=Math.min(re,Math.max(1,B)),me=Math.min(re,Math.max(1,$)),Ce=this.getLineMaxColumn(me),ye=new o.Range(le,1,me,Ce),Le=this._getDecorationsInRange(ye,Q,Z,te);return(0,d.pushMany)(Le,this._decorationProvider.getDecorationsInRange(ye,Q,Z)),Le}getDecorationsInRange(B,$=0,Q=!1,Z=!1,te=!1){const re=this.validateRange(B),le=this._getDecorationsInRange(re,$,Q,te);return(0,d.pushMany)(le,this._decorationProvider.getDecorationsInRange(re,$,Q,Z)),le}getOverviewRulerDecorations(B=0,$=!1){return this._decorationsTree.getAll(this,B,$,!0,!1)}getInjectedTextDecorations(B=0){return this._decorationsTree.getAllInjectedText(this,B)}_getInjectedTextInLine(B){const $=this._buffer.getOffsetAt(B,1),Q=$+this._buffer.getLineLength(B),Z=this._decorationsTree.getInjectedTextInInterval(this,$,Q,0);return D.LineInjectedText.fromDecorations(Z).filter(te=>te.lineNumber===B)}getAllDecorations(B=0,$=!1){let Q=this._decorationsTree.getAll(this,B,$,!1,!1);return Q=Q.concat(this._decorationProvider.getAllDecorations(B,$)),Q}getAllMarginDecorations(B=0){return this._decorationsTree.getAll(this,B,!1,!1,!0)}_getDecorationsInRange(B,$,Q,Z){const te=this._buffer.getOffsetAt(B.startLineNumber,B.startColumn),re=this._buffer.getOffsetAt(B.endLineNumber,B.endColumn);return this._decorationsTree.getAllInInterval(this,te,re,$,Q,Z)}getRangeAt(B,$){return this._buffer.getRangeAt(B,$-B)}_changeDecorationImpl(B,$){const Q=this._decorations[B];if(!Q)return;if(Q.options.after){const le=this.getDecorationRange(B);this._onDidChangeDecorations.recordLineAffectedByInjectedText(le.endLineNumber)}if(Q.options.before){const le=this.getDecorationRange(B);this._onDidChangeDecorations.recordLineAffectedByInjectedText(le.startLineNumber)}const Z=this._validateRangeRelaxedNoAllocations($),te=this._buffer.getOffsetAt(Z.startLineNumber,Z.startColumn),re=this._buffer.getOffsetAt(Z.endLineNumber,Z.endColumn);this._decorationsTree.delete(Q),Q.reset(this.getVersionId(),te,re,Z),this._decorationsTree.insert(Q),this._onDidChangeDecorations.checkAffectedAndFire(Q.options),Q.options.after&&this._onDidChangeDecorations.recordLineAffectedByInjectedText(Z.endLineNumber),Q.options.before&&this._onDidChangeDecorations.recordLineAffectedByInjectedText(Z.startLineNumber)}_changeDecorationOptionsImpl(B,$){const Q=this._decorations[B];if(!Q)return;const Z=!!(Q.options.overviewRuler&&Q.options.overviewRuler.color),te=!!($.overviewRuler&&$.overviewRuler.color);if(this._onDidChangeDecorations.checkAffectedAndFire(Q.options),this._onDidChangeDecorations.checkAffectedAndFire($),Q.options.after||$.after){const me=this._decorationsTree.getNodeRange(this,Q);this._onDidChangeDecorations.recordLineAffectedByInjectedText(me.endLineNumber)}if(Q.options.before||$.before){const me=this._decorationsTree.getNodeRange(this,Q);this._onDidChangeDecorations.recordLineAffectedByInjectedText(me.startLineNumber)}const re=Z!==te,le=j($)!==Y(Q);re||le?(this._decorationsTree.delete(Q),Q.setOptions($),this._decorationsTree.insert(Q)):Q.setOptions($)}_deltaDecorationsImpl(B,$,Q,Z=!1){const te=this.getVersionId(),re=$.length;let le=0;const me=Q.length;let Ce=0;this._onDidChangeDecorations.beginDeferredEmit();try{const ye=new Array(me);for(;lethis._setLanguage(B.languageId,$)),this._setLanguage(B.languageId,$))}_setLanguage(B,$){this.tokenization.setLanguageId(B,$),this._languageService.requestRichLanguageFeatures(B)}getLanguageIdAtPosition(B,$){return this.tokenization.getLanguageIdAtPosition(B,$)}getWordAtPosition(B){return this._tokenizationTextModelPart.getWordAtPosition(B)}getWordUntilPosition(B){return this._tokenizationTextModelPart.getWordUntilPosition(B)}normalizePosition(B,$){return B}getLineIndentColumn(B){return z(this.getLineContent(B))+1}};e.TextModel=H,e.TextModel=H=A=ke([ce(4,M.IUndoRedoService),ce(5,s.ILanguageService),ce(6,g.ILanguageConfigurationService),ce(7,T.IInstantiationService)],H);function z(X){let B=0;for(const $ of X)if($===" "||$===" ")B++;else break;return B}function U(X){return!!(X.options.overviewRuler&&X.options.overviewRuler.color)}function j(X){return!!X.after||!!X.before}function Y(X){return!!X.options.after||!!X.options.before}class G{constructor(){this._decorationsTree0=new f.IntervalTree,this._decorationsTree1=new f.IntervalTree,this._injectedTextDecorationsTree=new f.IntervalTree}ensureAllNodesHaveRanges(B){this.getAll(B,0,!1,!1,!1)}_ensureNodesHaveRanges(B,$){for(const Q of $)Q.range===null&&(Q.range=B.getRangeAt(Q.cachedAbsoluteStart,Q.cachedAbsoluteEnd));return $}getAllInInterval(B,$,Q,Z,te,re){const le=B.getVersionId(),me=this._intervalSearch($,Q,Z,te,le,re);return this._ensureNodesHaveRanges(B,me)}_intervalSearch(B,$,Q,Z,te,re){const le=this._decorationsTree0.intervalSearch(B,$,Q,Z,te,re),me=this._decorationsTree1.intervalSearch(B,$,Q,Z,te,re),Ce=this._injectedTextDecorationsTree.intervalSearch(B,$,Q,Z,te,re);return le.concat(me).concat(Ce)}getInjectedTextInInterval(B,$,Q,Z){const te=B.getVersionId(),re=this._injectedTextDecorationsTree.intervalSearch($,Q,Z,!1,te,!1);return this._ensureNodesHaveRanges(B,re).filter(le=>le.options.showIfCollapsed||!le.range.isEmpty())}getAllInjectedText(B,$){const Q=B.getVersionId(),Z=this._injectedTextDecorationsTree.search($,!1,Q,!1);return this._ensureNodesHaveRanges(B,Z).filter(te=>te.options.showIfCollapsed||!te.range.isEmpty())}getAll(B,$,Q,Z,te){const re=B.getVersionId(),le=this._search($,Q,Z,re,te);return this._ensureNodesHaveRanges(B,le)}_search(B,$,Q,Z,te){if(Q)return this._decorationsTree1.search(B,$,Z,te);{const re=this._decorationsTree0.search(B,$,Z,te),le=this._decorationsTree1.search(B,$,Z,te),me=this._injectedTextDecorationsTree.search(B,$,Z,te);return re.concat(le).concat(me)}}collectNodesFromOwner(B){const $=this._decorationsTree0.collectNodesFromOwner(B),Q=this._decorationsTree1.collectNodesFromOwner(B),Z=this._injectedTextDecorationsTree.collectNodesFromOwner(B);return $.concat(Q).concat(Z)}collectNodesPostOrder(){const B=this._decorationsTree0.collectNodesPostOrder(),$=this._decorationsTree1.collectNodesPostOrder(),Q=this._injectedTextDecorationsTree.collectNodesPostOrder();return B.concat($).concat(Q)}insert(B){Y(B)?this._injectedTextDecorationsTree.insert(B):U(B)?this._decorationsTree1.insert(B):this._decorationsTree0.insert(B)}delete(B){Y(B)?this._injectedTextDecorationsTree.delete(B):U(B)?this._decorationsTree1.delete(B):this._decorationsTree0.delete(B)}getNodeRange(B,$){const Q=B.getVersionId();return $.cachedVersionId!==Q&&this._resolveNode($,Q),$.range===null&&($.range=B.getRangeAt($.cachedAbsoluteStart,$.cachedAbsoluteEnd)),$.range}_resolveNode(B,$){Y(B)?this._injectedTextDecorationsTree.resolveNode(B,$):U(B)?this._decorationsTree1.resolveNode(B,$):this._decorationsTree0.resolveNode(B,$)}acceptReplace(B,$,Q,Z){this._decorationsTree0.acceptReplace(B,$,Q,Z),this._decorationsTree1.acceptReplace(B,$,Q,Z),this._injectedTextDecorationsTree.acceptReplace(B,$,Q,Z)}}function K(X){return X.replace(/[^a-z0-9\-_]/gi," ")}class R{constructor(B){this.color=B.color||"",this.darkColor=B.darkColor||""}}class J extends R{constructor(B){super(B),this._resolvedColor=null,this.position=typeof B.position=="number"?B.position:c.OverviewRulerLane.Center}getColor(B){return this._resolvedColor||(B.type!=="light"&&this.darkColor?this._resolvedColor=this._resolveColor(this.darkColor,B):this._resolvedColor=this._resolveColor(this.color,B)),this._resolvedColor}invalidateCachedColor(){this._resolvedColor=null}_resolveColor(B,$){if(typeof B=="string")return B;const Q=B?$.getColor(B.id):null;return Q?Q.toString():""}}e.ModelDecorationOverviewRulerOptions=J;class ie{constructor(B){this.position=B?.position??c.GlyphMarginLane.Center,this.persistLane=B?.persistLane}}e.ModelDecorationGlyphMarginOptions=ie;class ue extends R{constructor(B){super(B),this.position=B.position,this.sectionHeaderStyle=B.sectionHeaderStyle??null,this.sectionHeaderText=B.sectionHeaderText??null}getColor(B){return this._resolvedColor||(B.type!=="light"&&this.darkColor?this._resolvedColor=this._resolveColor(this.darkColor,B):this._resolvedColor=this._resolveColor(this.color,B)),this._resolvedColor}invalidateCachedColor(){this._resolvedColor=void 0}_resolveColor(B,$){return typeof B=="string"?k.Color.fromHex(B):$.getColor(B.id)}}e.ModelDecorationMinimapOptions=ue;class he{static from(B){return B instanceof he?B:new he(B)}constructor(B){this.content=B.content||"",this.inlineClassName=B.inlineClassName||null,this.inlineClassNameAffectsLetterSpacing=B.inlineClassNameAffectsLetterSpacing||!1,this.attachedData=B.attachedData||null,this.cursorStops=B.cursorStops||null}}e.ModelDecorationInjectedTextOptions=he;class pe{static register(B){return new pe(B)}static createDynamic(B){return new pe(B)}constructor(B){this.description=B.description,this.blockClassName=B.blockClassName?K(B.blockClassName):null,this.blockDoesNotCollapse=B.blockDoesNotCollapse??null,this.blockIsAfterEnd=B.blockIsAfterEnd??null,this.blockPadding=B.blockPadding??null,this.stickiness=B.stickiness||0,this.zIndex=B.zIndex||0,this.className=B.className?K(B.className):null,this.shouldFillLineOnLineBreak=B.shouldFillLineOnLineBreak??null,this.hoverMessage=B.hoverMessage||null,this.glyphMarginHoverMessage=B.glyphMarginHoverMessage||null,this.lineNumberHoverMessage=B.lineNumberHoverMessage||null,this.isWholeLine=B.isWholeLine||!1,this.showIfCollapsed=B.showIfCollapsed||!1,this.collapseOnReplaceEdit=B.collapseOnReplaceEdit||!1,this.overviewRuler=B.overviewRuler?new J(B.overviewRuler):null,this.minimap=B.minimap?new ue(B.minimap):null,this.glyphMargin=B.glyphMarginClassName?new ie(B.glyphMargin):null,this.glyphMarginClassName=B.glyphMarginClassName?K(B.glyphMarginClassName):null,this.linesDecorationsClassName=B.linesDecorationsClassName?K(B.linesDecorationsClassName):null,this.lineNumberClassName=B.lineNumberClassName?K(B.lineNumberClassName):null,this.linesDecorationsTooltip=B.linesDecorationsTooltip?m.htmlAttributeEncodeValue(B.linesDecorationsTooltip):null,this.firstLineDecorationClassName=B.firstLineDecorationClassName?K(B.firstLineDecorationClassName):null,this.marginClassName=B.marginClassName?K(B.marginClassName):null,this.inlineClassName=B.inlineClassName?K(B.inlineClassName):null,this.inlineClassNameAffectsLetterSpacing=B.inlineClassNameAffectsLetterSpacing||!1,this.beforeContentClassName=B.beforeContentClassName?K(B.beforeContentClassName):null,this.afterContentClassName=B.afterContentClassName?K(B.afterContentClassName):null,this.after=B.after?he.from(B.after):null,this.before=B.before?he.from(B.before):null,this.hideInCommentTokens=B.hideInCommentTokens??!1,this.hideInStringTokens=B.hideInStringTokens??!1}}e.ModelDecorationOptions=pe,pe.EMPTY=pe.register({description:"empty"});const ae=[pe.register({description:"tracked-range-always-grows-when-typing-at-edges",stickiness:0}),pe.register({description:"tracked-range-never-grows-when-typing-at-edges",stickiness:1}),pe.register({description:"tracked-range-grows-only-when-typing-before",stickiness:2}),pe.register({description:"tracked-range-grows-only-when-typing-after",stickiness:3})];function ee(X){return X instanceof pe?X:pe.createDynamic(X)}class de extends y.Disposable{constructor(B){super(),this.handleBeforeFire=B,this._actual=this._register(new E.Emitter),this.event=this._actual.event,this._affectedInjectedTextLines=null,this._deferredCnt=0,this._shouldFireDeferred=!1,this._affectsMinimap=!1,this._affectsOverviewRuler=!1,this._affectsGlyphMargin=!1,this._affectsLineNumber=!1}beginDeferredEmit(){this._deferredCnt++}endDeferredEmit(){this._deferredCnt--,this._deferredCnt===0&&(this._shouldFireDeferred&&this.doFire(),this._affectedInjectedTextLines?.clear(),this._affectedInjectedTextLines=null)}recordLineAffectedByInjectedText(B){this._affectedInjectedTextLines||(this._affectedInjectedTextLines=new Set),this._affectedInjectedTextLines.add(B)}checkAffectedAndFire(B){this._affectsMinimap||=!!B.minimap?.position,this._affectsOverviewRuler||=!!B.overviewRuler?.color,this._affectsGlyphMargin||=!!B.glyphMarginClassName,this._affectsLineNumber||=!!B.lineNumberClassName,this.tryFire()}fire(){this._affectsMinimap=!0,this._affectsOverviewRuler=!0,this._affectsGlyphMargin=!0,this.tryFire()}tryFire(){this._deferredCnt===0?this.doFire():this._shouldFireDeferred=!0}doFire(){this.handleBeforeFire(this._affectedInjectedTextLines);const B={affectsMinimap:this._affectsMinimap,affectsOverviewRuler:this._affectsOverviewRuler,affectsGlyphMargin:this._affectsGlyphMargin,affectsLineNumber:this._affectsLineNumber};this._shouldFireDeferred=!1,this._affectsMinimap=!1,this._affectsOverviewRuler=!1,this._affectsGlyphMargin=!1,this._actual.fire(B)}}class ge extends y.Disposable{constructor(){super(),this._fastEmitter=this._register(new E.Emitter),this.fastEvent=this._fastEmitter.event,this._slowEmitter=this._register(new E.Emitter),this.slowEvent=this._slowEmitter.event,this._deferredCnt=0,this._deferredEvent=null}beginDeferredEmit(){this._deferredCnt++}endDeferredEmit(B=null){if(this._deferredCnt--,this._deferredCnt===0&&this._deferredEvent!==null){this._deferredEvent.rawContentChangedEvent.resultingSelection=B;const $=this._deferredEvent;this._deferredEvent=null,this._fastEmitter.fire($),this._slowEmitter.fire($)}}fire(B){if(this._deferredCnt>0){this._deferredEvent?this._deferredEvent=this._deferredEvent.merge(B):this._deferredEvent=B;return}this._fastEmitter.fire(B),this._slowEmitter.fire(B)}}}),define(ne[139],se([1,0,26,30,35,3,32,71]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.diffDeleteDecorationEmpty=e.diffWholeLineDeleteDecoration=e.diffDeleteDecoration=e.diffAddDecorationEmpty=e.diffWholeLineAddDecoration=e.diffAddDecoration=e.diffLineDeleteDecorationBackground=e.diffLineAddDecorationBackground=e.diffLineDeleteDecorationBackgroundWithIndicator=e.diffLineAddDecorationBackgroundWithIndicator=e.diffRemoveIcon=e.diffInsertIcon=e.diffEditorUnchangedRegionShadow=e.diffMoveBorderActive=e.diffMoveBorder=void 0,e.diffMoveBorder=(0,y.registerColor)("diffEditor.move.border","#8b8b8b9c",(0,E.localize)(124,"The border color for text that got moved in the diff editor.")),e.diffMoveBorderActive=(0,y.registerColor)("diffEditor.moveActive.border","#FFA500",(0,E.localize)(125,"The active border color for text that got moved in the diff editor.")),e.diffEditorUnchangedRegionShadow=(0,y.registerColor)("diffEditor.unchangedRegionShadow",{dark:"#000000",light:"#737373BF",hcDark:"#000000",hcLight:"#737373BF"},(0,E.localize)(126,"The color of the shadow around unchanged region widgets.")),e.diffInsertIcon=(0,m.registerIcon)("diff-insert",d.Codicon.add,(0,E.localize)(127,"Line decoration for inserts in the diff editor.")),e.diffRemoveIcon=(0,m.registerIcon)("diff-remove",d.Codicon.remove,(0,E.localize)(128,"Line decoration for removals in the diff editor.")),e.diffLineAddDecorationBackgroundWithIndicator=I.ModelDecorationOptions.register({className:"line-insert",description:"line-insert",isWholeLine:!0,linesDecorationsClassName:"insert-sign "+k.ThemeIcon.asClassName(e.diffInsertIcon),marginClassName:"gutter-insert"}),e.diffLineDeleteDecorationBackgroundWithIndicator=I.ModelDecorationOptions.register({className:"line-delete",description:"line-delete",isWholeLine:!0,linesDecorationsClassName:"delete-sign "+k.ThemeIcon.asClassName(e.diffRemoveIcon),marginClassName:"gutter-delete"}),e.diffLineAddDecorationBackground=I.ModelDecorationOptions.register({className:"line-insert",description:"line-insert",isWholeLine:!0,marginClassName:"gutter-insert"}),e.diffLineDeleteDecorationBackground=I.ModelDecorationOptions.register({className:"line-delete",description:"line-delete",isWholeLine:!0,marginClassName:"gutter-delete"}),e.diffAddDecoration=I.ModelDecorationOptions.register({className:"char-insert",description:"char-insert",shouldFillLineOnLineBreak:!0}),e.diffWholeLineAddDecoration=I.ModelDecorationOptions.register({className:"char-insert",description:"char-insert",isWholeLine:!0}),e.diffAddDecorationEmpty=I.ModelDecorationOptions.register({className:"char-insert diff-range-empty",description:"char-insert diff-range-empty"}),e.diffDeleteDecoration=I.ModelDecorationOptions.register({className:"char-delete",description:"char-delete",shouldFillLineOnLineBreak:!0}),e.diffWholeLineDeleteDecoration=I.ModelDecorationOptions.register({className:"char-delete",description:"char-delete",isWholeLine:!0}),e.diffDeleteDecorationEmpty=I.ModelDecorationOptions.register({className:"char-delete diff-range-empty",description:"char-delete diff-range-empty"})}),define(ne[285],se([1,0,5,13,14,26,2,21,30,19,74,139,407,652,667,88,55,9,95,117,58,4]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffEditorViewZones=void 0,e.allowsTrueInlineDiffRendering=v;let C=class extends y.Disposable{constructor(L,D,T,M,A,P,N,O,F,x){super(),this._targetWindow=L,this._editors=D,this._diffModel=T,this._options=M,this._diffEditorWidget=A,this._canIgnoreViewZoneUpdateEvent=P,this._origViewZonesToIgnore=N,this._modViewZonesToIgnore=O,this._clipboardService=F,this._contextMenuService=x,this._originalTopPadding=(0,m.observableValue)(this,0),this._originalScrollOffset=(0,m.observableValue)(this,0),this._originalScrollOffsetAnimated=(0,s.animatedObservable)(this._targetWindow,this._originalScrollOffset,this._store),this._modifiedTopPadding=(0,m.observableValue)(this,0),this._modifiedScrollOffset=(0,m.observableValue)(this,0),this._modifiedScrollOffsetAnimated=(0,s.animatedObservable)(this._targetWindow,this._modifiedScrollOffset,this._store);const W=(0,m.observableValue)("invalidateAlignmentsState",0),V=this._register(new I.RunOnceScheduler(()=>{W.set(W.get()+1,void 0)},0));this._register(this._editors.original.onDidChangeViewZones(G=>{this._canIgnoreViewZoneUpdateEvent()||V.schedule()})),this._register(this._editors.modified.onDidChangeViewZones(G=>{this._canIgnoreViewZoneUpdateEvent()||V.schedule()})),this._register(this._editors.original.onDidChangeConfiguration(G=>{(G.hasChanged(147)||G.hasChanged(67))&&V.schedule()})),this._register(this._editors.modified.onDidChangeConfiguration(G=>{(G.hasChanged(147)||G.hasChanged(67))&&V.schedule()}));const q=this._diffModel.map(G=>G?(0,m.observableFromEvent)(this,G.model.original.onDidChangeTokens,()=>G.model.original.tokenization.backgroundTokenizationState===2):void 0).map((G,K)=>G?.read(K)),H=(0,m.derived)(G=>{const K=this._diffModel.read(G),R=K?.diff.read(G);if(!K||!R)return null;W.read(G);const ie=this._options.renderSideBySide.read(G);return f(this._editors.original,this._editors.modified,R.mappings,this._origViewZonesToIgnore,this._modViewZonesToIgnore,ie)}),z=(0,m.derived)(G=>{const K=this._diffModel.read(G)?.movedTextToCompare.read(G);if(!K)return null;W.read(G);const R=K.changes.map(J=>new o.DiffMapping(J));return f(this._editors.original,this._editors.modified,R,this._origViewZonesToIgnore,this._modViewZonesToIgnore,!0)});function U(){const G=document.createElement("div");return G.className="diagonal-fill",G}const j=this._register(new y.DisposableStore);this.viewZones=(0,m.derivedWithStore)(this,(G,K)=>{j.clear();const R=H.read(G)||[],J=[],ie=[],ue=this._modifiedTopPadding.read(G);ue>0&&ie.push({afterLineNumber:0,domNode:document.createElement("div"),heightInPx:ue,showInHiddenAreas:!0,suppressMouseDown:!0});const he=this._originalTopPadding.read(G);he>0&&J.push({afterLineNumber:0,domNode:document.createElement("div"),heightInPx:he,showInHiddenAreas:!0,suppressMouseDown:!0});const pe=this._options.renderSideBySide.read(G),ae=pe?void 0:this._editors.modified._getViewModel()?.createLineBreaksComputer();if(ae){const Z=this._editors.original.getModel();for(const te of R)if(te.diff)for(let re=te.originalRange.startLineNumber;reZ.getLineCount())return{orig:J,mod:ie};ae?.addRequest(Z.getLineContent(re),null,null)}}const ee=ae?.finalize()??[];let de=0;const ge=this._editors.modified.getOption(67),X=this._diffModel.read(G)?.movedTextToCompare.read(G),B=this._editors.original.getModel()?.mightContainNonBasicASCII()??!1,$=this._editors.original.getModel()?.mightContainRTL()??!1,Q=i.RenderOptions.fromEditor(this._editors.modified);for(const Z of R)if(Z.diff&&!pe&&(!this._options.useTrueInlineDiffRendering.read(G)||!v(Z.diff))){if(!Z.originalRange.isEmpty){q.read(G);const re=document.createElement("div");re.classList.add("view-lines","line-delete","monaco-mouse-cursor-text");const le=this._editors.original.getModel();if(Z.originalRange.endLineNumberExclusive-1>le.getLineCount())return{orig:J,mod:ie};const me=new i.LineSource(Z.originalRange.mapToLineArray(Me=>le.tokenization.getLineTokens(Me)),Z.originalRange.mapToLineArray(Me=>ee[de++]),B,$),Ce=[];for(const Me of Z.diff.innerChanges||[])Ce.push(new l.InlineDecoration(Me.originalRange.delta(-(Z.diff.original.startLineNumber-1)),n.diffDeleteDecoration.className,0));const ye=(0,i.renderLines)(me,Q,Ce,re),Le=document.createElement("div");if(Le.className="inline-deleted-margin-view-zone",(0,p.applyFontInfo)(Le,Q.fontInfo),this._options.renderIndicators.read(G))for(let Me=0;Me(0,b.assertIsDefined)(Ee),Le,this._editors.modified,Z.diff,this._diffEditorWidget,ye.viewLineCounts,this._editors.original.getModel(),this._contextMenuService,this._clipboardService));for(let Me=0;Me1&&J.push({afterLineNumber:Z.originalRange.startLineNumber+Me,domNode:U(),heightInPx:(Ae-1)*ge,showInHiddenAreas:!0,suppressMouseDown:!0})}ie.push({afterLineNumber:Z.modifiedRange.startLineNumber-1,domNode:re,heightInPx:ye.heightInLines*ge,minWidthInPx:ye.minWidthInPx,marginDomNode:Le,setZoneId(Me){Ee=Me},showInHiddenAreas:!0,suppressMouseDown:!0})}const te=document.createElement("div");te.className="gutter-delete",J.push({afterLineNumber:Z.originalRange.endLineNumberExclusive-1,domNode:U(),heightInPx:Z.modifiedHeightInPx,marginDomNode:te,showInHiddenAreas:!0,suppressMouseDown:!0})}else{const te=Z.modifiedHeightInPx-Z.originalHeightInPx;if(te>0){if(X?.lineRangeMapping.original.delta(-1).deltaLength(2).contains(Z.originalRange.endLineNumberExclusive-1))continue;J.push({afterLineNumber:Z.originalRange.endLineNumberExclusive-1,domNode:U(),heightInPx:te,showInHiddenAreas:!0,suppressMouseDown:!0})}else{let re=function(){const me=document.createElement("div");return me.className="arrow-revert-change "+_.ThemeIcon.asClassName(E.Codicon.arrowRight),K.add((0,d.addDisposableListener)(me,"mousedown",Ce=>Ce.stopPropagation())),K.add((0,d.addDisposableListener)(me,"click",Ce=>{Ce.stopPropagation(),A.revert(Z.diff)})),(0,d.$)("div",{},me)};if(X?.lineRangeMapping.modified.delta(-1).deltaLength(2).contains(Z.modifiedRange.endLineNumberExclusive-1))continue;let le;Z.diff&&Z.diff.modified.isEmpty&&this._options.shouldRenderOldRevertArrows.read(G)&&(le=re()),ie.push({afterLineNumber:Z.modifiedRange.endLineNumberExclusive-1,domNode:U(),heightInPx:-te,marginDomNode:le,showInHiddenAreas:!0,suppressMouseDown:!0})}}for(const Z of z.read(G)??[]){if(!X?.lineRangeMapping.original.intersect(Z.originalRange)||!X?.lineRangeMapping.modified.intersect(Z.modifiedRange))continue;const te=Z.modifiedHeightInPx-Z.originalHeightInPx;te>0?J.push({afterLineNumber:Z.originalRange.endLineNumberExclusive-1,domNode:U(),heightInPx:te,showInHiddenAreas:!0,suppressMouseDown:!0}):ie.push({afterLineNumber:Z.modifiedRange.endLineNumberExclusive-1,domNode:U(),heightInPx:-te,showInHiddenAreas:!0,suppressMouseDown:!0})}return{orig:J,mod:ie}});let Y=!1;this._register(this._editors.original.onDidScrollChange(G=>{G.scrollLeftChanged&&!Y&&(Y=!0,this._editors.modified.setScrollLeft(G.scrollLeft),Y=!1)})),this._register(this._editors.modified.onDidScrollChange(G=>{G.scrollLeftChanged&&!Y&&(Y=!0,this._editors.original.setScrollLeft(G.scrollLeft),Y=!1)})),this._originalScrollTop=(0,m.observableFromEvent)(this._editors.original.onDidScrollChange,()=>this._editors.original.getScrollTop()),this._modifiedScrollTop=(0,m.observableFromEvent)(this._editors.modified.onDidScrollChange,()=>this._editors.modified.getScrollTop()),this._register((0,m.autorun)(G=>{const K=this._originalScrollTop.read(G)-(this._originalScrollOffsetAnimated.get()-this._modifiedScrollOffsetAnimated.read(G))-(this._originalTopPadding.get()-this._modifiedTopPadding.read(G));K!==this._editors.modified.getScrollTop()&&this._editors.modified.setScrollTop(K,1)})),this._register((0,m.autorun)(G=>{const K=this._modifiedScrollTop.read(G)-(this._modifiedScrollOffsetAnimated.get()-this._originalScrollOffsetAnimated.read(G))-(this._modifiedTopPadding.get()-this._originalTopPadding.read(G));K!==this._editors.original.getScrollTop()&&this._editors.original.setScrollTop(K,1)})),this._register((0,m.autorun)(G=>{const K=this._diffModel.read(G)?.movedTextToCompare.read(G);let R=0;if(K){const J=this._editors.original.getTopForLineNumber(K.lineRangeMapping.original.startLineNumber,!0)-this._originalTopPadding.get();R=this._editors.modified.getTopForLineNumber(K.lineRangeMapping.modified.startLineNumber,!0)-this._modifiedTopPadding.get()-J}R>0?(this._modifiedTopPadding.set(0,void 0),this._originalTopPadding.set(R,void 0)):R<0?(this._modifiedTopPadding.set(-R,void 0),this._originalTopPadding.set(0,void 0)):setTimeout(()=>{this._modifiedTopPadding.set(0,void 0),this._originalTopPadding.set(0,void 0)},400),this._editors.modified.hasTextFocus()?this._originalScrollOffset.set(this._modifiedScrollOffset.get()-R,void 0,!0):this._modifiedScrollOffset.set(this._originalScrollOffset.get()+R,void 0,!0)}))}};e.DiffEditorViewZones=C,e.DiffEditorViewZones=C=ke([ce(8,a.IClipboardService),ce(9,r.IContextMenuService)],C);function f(S,L,D,T,M,A){const P=new k.ArrayQueue(h(S,T)),N=new k.ArrayQueue(h(L,M)),O=S.getOption(67),F=L.getOption(67),x=[];let W=0,V=0;function q(H,z){for(;;){let U=P.peek(),j=N.peek();if(U&&U.lineNumber>=H&&(U=void 0),j&&j.lineNumber>=z&&(j=void 0),!U&&!j)break;const Y=U?U.lineNumber-W:Number.MAX_VALUE,G=j?j.lineNumber-V:Number.MAX_VALUE;YG?(N.dequeue(),U={lineNumber:j.lineNumber-V+W,heightInPx:0}):(P.dequeue(),N.dequeue()),x.push({originalRange:g.LineRange.ofLength(U.lineNumber,1),modifiedRange:g.LineRange.ofLength(j.lineNumber,1),originalHeightInPx:O+U.heightInPx,modifiedHeightInPx:F+j.heightInPx,diff:void 0})}}for(const H of D){let G=function(K,R,J=!1){if(Kae.lineNumberae+ee.heightInPx,0)??0,pe=N.takeWhile(ae=>ae.lineNumberae+ee.heightInPx,0)??0;x.push({originalRange:ie,modifiedRange:ue,originalHeightInPx:ie.length*O+he,modifiedHeightInPx:ue.length*F+pe,diff:H.lineRangeMapping}),Y=K,j=R};const z=H.lineRangeMapping;q(z.original.startLineNumber,z.modified.startLineNumber);let U=!0,j=z.modified.startLineNumber,Y=z.original.startLineNumber;if(A)for(const K of z.innerChanges||[]){K.originalRange.startColumn>1&&K.modifiedRange.startColumn>1&&G(K.originalRange.startLineNumber,K.modifiedRange.startLineNumber);const R=S.getModel(),J=K.originalRange.endLineNumber<=R.getLineCount()?R.getLineMaxColumn(K.originalRange.endLineNumber):Number.MAX_SAFE_INTEGER;K.originalRange.endColumn1&&T.push({lineNumber:O,heightInPx:P*(F-1)})}for(const O of S.getWhitespaces()){if(L.has(O.id))continue;const F=O.afterLineNumber===0?0:A.convertViewPositionToModelPosition(new c.Position(O.afterLineNumber,1)).lineNumber;D.push({lineNumber:F,heightInPx:O.height})}return(0,s.joinCombine)(D,T,O=>O.lineNumber,(O,F)=>({lineNumber:O.lineNumber,heightInPx:O.heightInPx+F.heightInPx}))}function v(S){return S.innerChanges?S.innerChanges.every(L=>w(L.modifiedRange)&&w(L.originalRange)||L.originalRange.equalsRange(new u.Range(1,1,1,1))):!1}function w(S){return S.startLineNumber===S.endLineNumber}}),define(ne[806],se([1,0,2,21,285,364,139,88]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffEditorDecorations=void 0;class _ extends d.Disposable{constructor(p,n,o,t){super(),this._editors=p,this._diffModel=n,this._options=o,this._decorations=(0,k.derived)(this,i=>{const s=this._diffModel.read(i),g=s?.diff.read(i);if(!g)return null;const c=this._diffModel.read(i).movedTextToCompare.read(i),l=this._options.renderIndicators.read(i),a=this._options.showEmptyDecorations.read(i),r=[],u=[];if(!c)for(const f of g.mappings)if(f.lineRangeMapping.original.isEmpty||r.push({range:f.lineRangeMapping.original.toInclusiveRange(),options:l?y.diffLineDeleteDecorationBackgroundWithIndicator:y.diffLineDeleteDecorationBackground}),f.lineRangeMapping.modified.isEmpty||u.push({range:f.lineRangeMapping.modified.toInclusiveRange(),options:l?y.diffLineAddDecorationBackgroundWithIndicator:y.diffLineAddDecorationBackground}),f.lineRangeMapping.modified.isEmpty||f.lineRangeMapping.original.isEmpty)f.lineRangeMapping.original.isEmpty||r.push({range:f.lineRangeMapping.original.toInclusiveRange(),options:y.diffWholeLineDeleteDecoration}),f.lineRangeMapping.modified.isEmpty||u.push({range:f.lineRangeMapping.modified.toInclusiveRange(),options:y.diffWholeLineAddDecoration});else{const h=this._options.useTrueInlineDiffRendering.read(i)&&(0,I.allowsTrueInlineDiffRendering)(f.lineRangeMapping);for(const v of f.lineRangeMapping.innerChanges||[])if(f.lineRangeMapping.original.contains(v.originalRange.startLineNumber)&&r.push({range:v.originalRange,options:v.originalRange.isEmpty()&&a?y.diffDeleteDecorationEmpty:y.diffDeleteDecoration}),f.lineRangeMapping.modified.contains(v.modifiedRange.startLineNumber)&&u.push({range:v.modifiedRange,options:v.modifiedRange.isEmpty()&&a&&!h?y.diffAddDecorationEmpty:y.diffAddDecoration}),h){const w=s.model.original.getValueInRange(v.originalRange);u.push({range:v.modifiedRange,options:{description:"deleted-text",before:{content:w,inlineClassName:"inline-deleted-text"},zIndex:1e5,showIfCollapsed:!0}})}}if(c)for(const f of c.changes){const h=f.original.toInclusiveRange();h&&r.push({range:h,options:l?y.diffLineDeleteDecorationBackgroundWithIndicator:y.diffLineDeleteDecorationBackground});const v=f.modified.toInclusiveRange();v&&u.push({range:v,options:l?y.diffLineAddDecorationBackgroundWithIndicator:y.diffLineAddDecorationBackground});for(const w of f.innerChanges||[])r.push({range:w.originalRange,options:y.diffDeleteDecoration}),u.push({range:w.modifiedRange,options:y.diffAddDecoration})}const C=this._diffModel.read(i).activeMovedText.read(i);for(const f of g.movedTexts)r.push({range:f.lineRangeMapping.original.toInclusiveRange(),options:{description:"moved",blockClassName:"movedOriginal"+(f===C?" currentMove":""),blockPadding:[E.MovedBlocksLinesFeature.movedCodeBlockPadding,0,E.MovedBlocksLinesFeature.movedCodeBlockPadding,E.MovedBlocksLinesFeature.movedCodeBlockPadding]}}),u.push({range:f.lineRangeMapping.modified.toInclusiveRange(),options:{description:"moved",blockClassName:"movedModified"+(f===C?" currentMove":""),blockPadding:[4,0,4,4]}});return{originalDecorations:r,modifiedDecorations:u}}),this._register((0,m.applyObservableDecorations)(this._editors.original,this._decorations.map(i=>i?.originalDecorations||[]))),this._register((0,m.applyObservableDecorations)(this._editors.modified,this._decorations.map(i=>i?.modifiedDecorations||[])))}}e.DiffEditorDecorations=_}),define(ne[807],se([1,0,21,189,285,308,37,61]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffEditorOptions=void 0;let _=class{get editorOptions(){return this._options}constructor(i,s){this._accessibilityService=s,this._diffEditorWidth=(0,d.observableValue)(this,0),this._screenReaderMode=(0,d.observableFromEvent)(this,this._accessibilityService.onDidChangeScreenReaderOptimized,()=>this._accessibilityService.isScreenReaderOptimized()),this.couldShowInlineViewBecauseOfSize=(0,d.derived)(this,c=>this._options.read(c).renderSideBySide&&this._diffEditorWidth.read(c)<=this._options.read(c).renderSideBySideInlineBreakpoint),this.renderOverviewRuler=(0,d.derived)(this,c=>this._options.read(c).renderOverviewRuler),this.renderSideBySide=(0,d.derived)(this,c=>this.compactMode.read(c)&&this.shouldRenderInlineViewInSmartMode.read(c)?!1:this._options.read(c).renderSideBySide&&!(this._options.read(c).useInlineViewWhenSpaceIsLimited&&this.couldShowInlineViewBecauseOfSize.read(c)&&!this._screenReaderMode.read(c))),this.readOnly=(0,d.derived)(this,c=>this._options.read(c).readOnly),this.shouldRenderOldRevertArrows=(0,d.derived)(this,c=>!(!this._options.read(c).renderMarginRevertIcon||!this.renderSideBySide.read(c)||this.readOnly.read(c)||this.shouldRenderGutterMenu.read(c))),this.shouldRenderGutterMenu=(0,d.derived)(this,c=>this._options.read(c).renderGutterMenu),this.renderIndicators=(0,d.derived)(this,c=>this._options.read(c).renderIndicators),this.enableSplitViewResizing=(0,d.derived)(this,c=>this._options.read(c).enableSplitViewResizing),this.splitViewDefaultRatio=(0,d.derived)(this,c=>this._options.read(c).splitViewDefaultRatio),this.ignoreTrimWhitespace=(0,d.derived)(this,c=>this._options.read(c).ignoreTrimWhitespace),this.maxComputationTimeMs=(0,d.derived)(this,c=>this._options.read(c).maxComputationTime),this.showMoves=(0,d.derived)(this,c=>this._options.read(c).experimental.showMoves&&this.renderSideBySide.read(c)),this.isInEmbeddedEditor=(0,d.derived)(this,c=>this._options.read(c).isInEmbeddedEditor),this.diffWordWrap=(0,d.derived)(this,c=>this._options.read(c).diffWordWrap),this.originalEditable=(0,d.derived)(this,c=>this._options.read(c).originalEditable),this.diffCodeLens=(0,d.derived)(this,c=>this._options.read(c).diffCodeLens),this.accessibilityVerbose=(0,d.derived)(this,c=>this._options.read(c).accessibilityVerbose),this.diffAlgorithm=(0,d.derived)(this,c=>this._options.read(c).diffAlgorithm),this.showEmptyDecorations=(0,d.derived)(this,c=>this._options.read(c).experimental.showEmptyDecorations),this.onlyShowAccessibleDiffViewer=(0,d.derived)(this,c=>this._options.read(c).onlyShowAccessibleDiffViewer),this.compactMode=(0,d.derived)(this,c=>this._options.read(c).compactMode),this.trueInlineDiffRenderingEnabled=(0,d.derived)(this,c=>this._options.read(c).experimental.useTrueInlineView),this.useTrueInlineDiffRendering=(0,d.derived)(this,c=>!this.renderSideBySide.read(c)&&this.trueInlineDiffRenderingEnabled.read(c)),this.hideUnchangedRegions=(0,d.derived)(this,c=>this._options.read(c).hideUnchangedRegions.enabled),this.hideUnchangedRegionsRevealLineCount=(0,d.derived)(this,c=>this._options.read(c).hideUnchangedRegions.revealLineCount),this.hideUnchangedRegionsContextLineCount=(0,d.derived)(this,c=>this._options.read(c).hideUnchangedRegions.contextLineCount),this.hideUnchangedRegionsMinimumLineCount=(0,d.derived)(this,c=>this._options.read(c).hideUnchangedRegions.minimumLineCount),this._model=(0,d.observableValue)(this,void 0),this.shouldRenderInlineViewInSmartMode=this._model.map(this,c=>(0,k.derivedConstOnceDefined)(this,l=>{const a=c?.diff.read(l);return a?b(a,this.trueInlineDiffRenderingEnabled.read(l)):void 0})).flatten().map(this,c=>!!c),this.inlineViewHideOriginalLineNumbers=this.compactMode;const g={...i,...o(i,E.diffEditorDefaultOptions)};this._options=(0,d.observableValue)(this,g)}updateOptions(i){const s=o(i,this._options.get()),g={...this._options.get(),...i,...s};this._options.set(g,void 0,{changedOptions:i})}setWidth(i){this._diffEditorWidth.set(i,void 0)}setModel(i){this._model.set(i,void 0)}};e.DiffEditorOptions=_,e.DiffEditorOptions=_=ke([ce(1,m.IAccessibilityService)],_);function b(t,i){return t.mappings.every(s=>p(s.lineRangeMapping)||n(s.lineRangeMapping)||i&&(0,I.allowsTrueInlineDiffRendering)(s.lineRangeMapping))}function p(t){return t.original.length===0}function n(t){return t.modified.length===0}function o(t,i){return{enableSplitViewResizing:(0,y.boolean)(t.enableSplitViewResizing,i.enableSplitViewResizing),splitViewDefaultRatio:(0,y.clampedFloat)(t.splitViewDefaultRatio,.5,.1,.9),renderSideBySide:(0,y.boolean)(t.renderSideBySide,i.renderSideBySide),renderMarginRevertIcon:(0,y.boolean)(t.renderMarginRevertIcon,i.renderMarginRevertIcon),maxComputationTime:(0,y.clampedInt)(t.maxComputationTime,i.maxComputationTime,0,1073741824),maxFileSize:(0,y.clampedInt)(t.maxFileSize,i.maxFileSize,0,1073741824),ignoreTrimWhitespace:(0,y.boolean)(t.ignoreTrimWhitespace,i.ignoreTrimWhitespace),renderIndicators:(0,y.boolean)(t.renderIndicators,i.renderIndicators),originalEditable:(0,y.boolean)(t.originalEditable,i.originalEditable),diffCodeLens:(0,y.boolean)(t.diffCodeLens,i.diffCodeLens),renderOverviewRuler:(0,y.boolean)(t.renderOverviewRuler,i.renderOverviewRuler),diffWordWrap:(0,y.stringSet)(t.diffWordWrap,i.diffWordWrap,["off","on","inherit"]),diffAlgorithm:(0,y.stringSet)(t.diffAlgorithm,i.diffAlgorithm,["legacy","advanced"],{smart:"legacy",experimental:"advanced"}),accessibilityVerbose:(0,y.boolean)(t.accessibilityVerbose,i.accessibilityVerbose),experimental:{showMoves:(0,y.boolean)(t.experimental?.showMoves,i.experimental.showMoves),showEmptyDecorations:(0,y.boolean)(t.experimental?.showEmptyDecorations,i.experimental.showEmptyDecorations),useTrueInlineView:(0,y.boolean)(t.experimental?.useTrueInlineView,i.experimental.useTrueInlineView)},hideUnchangedRegions:{enabled:(0,y.boolean)(t.hideUnchangedRegions?.enabled??t.experimental?.collapseUnchangedRegions,i.hideUnchangedRegions.enabled),contextLineCount:(0,y.clampedInt)(t.hideUnchangedRegions?.contextLineCount,i.hideUnchangedRegions.contextLineCount,0,1073741824),minimumLineCount:(0,y.clampedInt)(t.hideUnchangedRegions?.minimumLineCount,i.hideUnchangedRegions.minimumLineCount,0,1073741824),revealLineCount:(0,y.clampedInt)(t.hideUnchangedRegions?.revealLineCount,i.hideUnchangedRegions.revealLineCount,0,1073741824)},isInEmbeddedEditor:(0,y.boolean)(t.isInEmbeddedEditor,i.isInEmbeddedEditor),onlyShowAccessibleDiffViewer:(0,y.boolean)(t.onlyShowAccessibleDiffViewer,i.onlyShowAccessibleDiffViewer),renderSideBySideInlineBreakpoint:(0,y.clampedInt)(t.renderSideBySideInlineBreakpoint,i.renderSideBySideInlineBreakpoint,0,1073741824),useInlineViewWhenSpaceIsLimited:(0,y.boolean)(t.useInlineViewWhenSpaceIsLimited,i.useInlineViewWhenSpaceIsLimited),renderGutterMenu:(0,y.boolean)(t.renderGutterMenu,i.renderGutterMenu),compactMode:(0,y.boolean)(t.compactMode,i.compactMode)}}}),define(ne[808],se([1,0,6,2,16,35,197,70,211,28,284,129,370,42,60,7]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s){"use strict";var g;Object.defineProperty(e,"__esModule",{value:!0}),e.DefaultModelSHA1Computer=e.ModelService=void 0;function c(f){return f.toString()}class l{constructor(h,v,w){this.model=h,this._modelEventListeners=new k.DisposableStore,this.model=h,this._modelEventListeners.add(h.onWillDispose(()=>v(h))),this._modelEventListeners.add(h.onDidChangeLanguage(S=>w(h,S)))}dispose(){this._modelEventListeners.dispose()}}const a=I.isLinux||I.isMacintosh?1:2;class r{constructor(h,v,w,S,L,D,T,M){this.uri=h,this.initialUndoRedoSnapshot=v,this.time=w,this.sharesUndoRedoStack=S,this.heapSize=L,this.sha1=D,this.versionId=T,this.alternativeVersionId=M}}let u=class extends k.Disposable{static{g=this}static{this.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK=20*1024*1024}constructor(h,v,w,S){super(),this._configurationService=h,this._resourcePropertiesService=v,this._undoRedoService=w,this._instantiationService=S,this._onModelAdded=this._register(new d.Emitter),this.onModelAdded=this._onModelAdded.event,this._onModelRemoved=this._register(new d.Emitter),this.onModelRemoved=this._onModelRemoved.event,this._onModelModeChanged=this._register(new d.Emitter),this.onModelLanguageChanged=this._onModelModeChanged.event,this._modelCreationOptionsByLanguageAndResource=Object.create(null),this._models={},this._disposedModels=new Map,this._disposedModelsHeapSize=0,this._register(this._configurationService.onDidChangeConfiguration(L=>this._updateModelOptions(L))),this._updateModelOptions(void 0)}static _readModelOptions(h,v){let w=y.EDITOR_MODEL_DEFAULTS.tabSize;if(h.editor&&typeof h.editor.tabSize<"u"){const O=parseInt(h.editor.tabSize,10);isNaN(O)||(w=O),w<1&&(w=1)}let S="tabSize";if(h.editor&&typeof h.editor.indentSize<"u"&&h.editor.indentSize!=="tabSize"){const O=parseInt(h.editor.indentSize,10);isNaN(O)||(S=Math.max(O,1))}let L=y.EDITOR_MODEL_DEFAULTS.insertSpaces;h.editor&&typeof h.editor.insertSpaces<"u"&&(L=h.editor.insertSpaces==="false"?!1:!!h.editor.insertSpaces);let D=a;const T=h.eol;T===`\r -`?D=2:T===` -`&&(D=1);let M=y.EDITOR_MODEL_DEFAULTS.trimAutoWhitespace;h.editor&&typeof h.editor.trimAutoWhitespace<"u"&&(M=h.editor.trimAutoWhitespace==="false"?!1:!!h.editor.trimAutoWhitespace);let A=y.EDITOR_MODEL_DEFAULTS.detectIndentation;h.editor&&typeof h.editor.detectIndentation<"u"&&(A=h.editor.detectIndentation==="false"?!1:!!h.editor.detectIndentation);let P=y.EDITOR_MODEL_DEFAULTS.largeFileOptimizations;h.editor&&typeof h.editor.largeFileOptimizations<"u"&&(P=h.editor.largeFileOptimizations==="false"?!1:!!h.editor.largeFileOptimizations);let N=y.EDITOR_MODEL_DEFAULTS.bracketPairColorizationOptions;return h.editor?.bracketPairColorization&&typeof h.editor.bracketPairColorization=="object"&&(N={enabled:!!h.editor.bracketPairColorization.enabled,independentColorPoolPerBracketType:!!h.editor.bracketPairColorization.independentColorPoolPerBracketType}),{isForSimpleWidget:v,tabSize:w,indentSize:S,insertSpaces:L,detectIndentation:A,defaultEOL:D,trimAutoWhitespace:M,largeFileOptimizations:P,bracketPairColorizationOptions:N}}_getEOL(h,v){if(h)return this._resourcePropertiesService.getEOL(h,v);const w=this._configurationService.getValue("files.eol",{overrideIdentifier:v});return w&&typeof w=="string"&&w!=="auto"?w:I.OS===3||I.OS===2?` -`:`\r -`}_shouldRestoreUndoStack(){const h=this._configurationService.getValue("files.restoreUndoStack");return typeof h=="boolean"?h:!0}getCreationOptions(h,v,w){const S=typeof h=="string"?h:h.languageId;let L=this._modelCreationOptionsByLanguageAndResource[S+v];if(!L){const D=this._configurationService.getValue("editor",{overrideIdentifier:S,resource:v}),T=this._getEOL(v,S);L=g._readModelOptions({editor:D,eol:T},w),this._modelCreationOptionsByLanguageAndResource[S+v]=L}return L}_updateModelOptions(h){const v=this._modelCreationOptionsByLanguageAndResource;this._modelCreationOptionsByLanguageAndResource=Object.create(null);const w=Object.keys(this._models);for(let S=0,L=w.length;Sh){const v=[];for(this._disposedModels.forEach(w=>{w.sharesUndoRedoStack||v.push(w)}),v.sort((w,S)=>w.time-S.time);v.length>0&&this._disposedModelsHeapSize>h;){const w=v.shift();this._removeDisposedModel(w.uri),w.initialUndoRedoSnapshot!==null&&this._undoRedoService.restoreSnapshot(w.initialUndoRedoSnapshot)}}}_createModelData(h,v,w,S){const L=this.getCreationOptions(v,w,S),D=this._instantiationService.createInstance(E.TextModel,h,v,L,w);if(w&&this._disposedModels.has(c(w))){const A=this._removeDisposedModel(w),P=this._undoRedoService.getElements(w),N=this._getSHA1Computer(),O=N.canComputeSHA1(D)?N.computeSHA1(D)===A.sha1:!1;if(O||A.sharesUndoRedoStack){for(const F of P.past)(0,o.isEditStackElement)(F)&&F.matchesResource(w)&&F.setModel(D);for(const F of P.future)(0,o.isEditStackElement)(F)&&F.matchesResource(w)&&F.setModel(D);this._undoRedoService.setElementsValidFlag(w,!0,F=>(0,o.isEditStackElement)(F)&&F.matchesResource(w)),O&&(D._overwriteVersionId(A.versionId),D._overwriteAlternativeVersionId(A.alternativeVersionId),D._overwriteInitialUndoRedoSnapshot(A.initialUndoRedoSnapshot))}else A.initialUndoRedoSnapshot!==null&&this._undoRedoService.restoreSnapshot(A.initialUndoRedoSnapshot)}const T=c(D.uri);if(this._models[T])throw new Error("ModelService: Cannot add model because it already exists!");const M=new l(D,A=>this._onWillDispose(A),(A,P)=>this._onDidChangeLanguage(A,P));return this._models[T]=M,M}createModel(h,v,w,S=!1){let L;return v?L=this._createModelData(h,v,w,S):L=this._createModelData(h,m.PLAINTEXT_LANGUAGE_ID,w,S),this._onModelAdded.fire(L.model),L.model}getModels(){const h=[],v=Object.keys(this._models);for(let w=0,S=v.length;w0||A.future.length>0){for(const P of A.past)(0,o.isEditStackElement)(P)&&P.matchesResource(h.uri)&&(L=!0,D+=P.heapSize(h.uri),P.setModel(h.uri));for(const P of A.future)(0,o.isEditStackElement)(P)&&P.matchesResource(h.uri)&&(L=!0,D+=P.heapSize(h.uri),P.setModel(h.uri))}}const T=g.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK,M=this._getSHA1Computer();if(L)if(!S&&(D>T||!M.canComputeSHA1(h))){const A=w.model.getInitialUndoRedoSnapshot();A!==null&&this._undoRedoService.restoreSnapshot(A)}else this._ensureDisposedModelsHeapSize(T-D),this._undoRedoService.setElementsValidFlag(h.uri,!1,A=>(0,o.isEditStackElement)(A)&&A.matchesResource(h.uri)),this._insertDisposedModel(new r(h.uri,w.model.getInitialUndoRedoSnapshot(),Date.now(),S,D,M.computeSHA1(h),h.getVersionId(),h.getAlternativeVersionId()));else if(!S){const A=w.model.getInitialUndoRedoSnapshot();A!==null&&this._undoRedoService.restoreSnapshot(A)}delete this._models[v],w.dispose(),delete this._modelCreationOptionsByLanguageAndResource[h.getLanguageId()+h.uri],this._onModelRemoved.fire(h)}_onDidChangeLanguage(h,v){const w=v.oldLanguage,S=h.getLanguageId(),L=this.getCreationOptions(w,h.uri,h.isForSimpleWidget),D=this.getCreationOptions(S,h.uri,h.isForSimpleWidget);g._setModelOptionsForModel(h,D,L),this._onModelModeChanged.fire({model:h,oldLanguageId:w})}_getSHA1Computer(){return new C}};e.ModelService=u,e.ModelService=u=g=ke([ce(0,b.IConfigurationService),ce(1,_.ITextResourcePropertiesService),ce(2,p.IUndoRedoService),ce(3,s.IInstantiationService)],u);class C{static{this.MAX_MODEL_SIZE=10*1024*1024}canComputeSHA1(h){return h.getValueLength()<=C.MAX_MODEL_SIZE}computeSHA1(h){const v=new n.StringSHA1,w=h.createSnapshot();let S;for(;S=w.read();)v.update(S);return v.digest()}}e.DefaultModelSHA1Computer=C}),define(ne[809],se([1,0,13,9,4,239,35,132,243,602,322,95]),function(oe,e,d,k,I,E,y,m,_,b,p,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewModelLinesFromModelAsIs=e.ViewModelLinesFromProjectedModel=void 0;class o{constructor(r,u,C,f,h,v,w,S,L,D){this._editorId=r,this.model=u,this._validModelVersionId=-1,this._domLineBreaksComputerFactory=C,this._monospaceLineBreaksComputerFactory=f,this.fontInfo=h,this.tabSize=v,this.wrappingStrategy=w,this.wrappingColumn=S,this.wrappingIndent=L,this.wordBreak=D,this._constructLines(!0,null)}dispose(){this.hiddenAreasDecorationIds=this.model.deltaDecorations(this.hiddenAreasDecorationIds,[])}createCoordinatesConverter(){return new g(this)}_constructLines(r,u){this.modelLineProjections=[],r&&(this.hiddenAreasDecorationIds=this.model.deltaDecorations(this.hiddenAreasDecorationIds,[]));const C=this.model.getLinesContent(),f=this.model.getInjectedTextDecorations(this._editorId),h=C.length,v=this.createLineBreaksComputer(),w=new d.ArrayQueue(m.LineInjectedText.fromDecorations(f));for(let N=0;NF.lineNumber===N+1);v.addRequest(C[N],O,u?u[N]:null)}const S=v.finalize(),L=[],D=this.hiddenAreasDecorationIds.map(N=>this.model.getDecorationRange(N)).sort(I.Range.compareRangesUsingStarts);let T=1,M=0,A=-1,P=A+1=T&&O<=M,x=(0,b.createModelLineProjection)(S[N],!F);L[N]=x.getViewLineCount(),this.modelLineProjections[N]=x}this._validModelVersionId=this.model.getVersionId(),this.projectedModelLineLineCounts=new p.ConstantTimePrefixSumComputer(L)}getHiddenAreas(){return this.hiddenAreasDecorationIds.map(r=>this.model.getDecorationRange(r))}setHiddenAreas(r){const u=r.map(M=>this.model.validateRange(M)),C=t(u),f=this.hiddenAreasDecorationIds.map(M=>this.model.getDecorationRange(M)).sort(I.Range.compareRangesUsingStarts);if(C.length===f.length){let M=!1;for(let A=0;A({range:M,options:y.ModelDecorationOptions.EMPTY}));this.hiddenAreasDecorationIds=this.model.deltaDecorations(this.hiddenAreasDecorationIds,h);const v=C;let w=1,S=0,L=-1,D=L+1=w&&A<=S?this.modelLineProjections[M].isVisible()&&(this.modelLineProjections[M]=this.modelLineProjections[M].setVisible(!1),P=!0):(T=!0,this.modelLineProjections[M].isVisible()||(this.modelLineProjections[M]=this.modelLineProjections[M].setVisible(!0),P=!0)),P){const N=this.modelLineProjections[M].getViewLineCount();this.projectedModelLineLineCounts.setValue(M,N)}}return T||this.setHiddenAreas([]),!0}modelPositionIsVisible(r,u){return r<1||r>this.modelLineProjections.length?!1:this.modelLineProjections[r-1].isVisible()}getModelLineViewLineCount(r){return r<1||r>this.modelLineProjections.length?1:this.modelLineProjections[r-1].getViewLineCount()}setTabSize(r){return this.tabSize===r?!1:(this.tabSize=r,this._constructLines(!1,null),!0)}setWrappingSettings(r,u,C,f,h){const v=this.fontInfo.equals(r),w=this.wrappingStrategy===u,S=this.wrappingColumn===C,L=this.wrappingIndent===f,D=this.wordBreak===h;if(v&&w&&S&&L&&D)return!1;const T=v&&w&&!S&&L&&D;this.fontInfo=r,this.wrappingStrategy=u,this.wrappingColumn=C,this.wrappingIndent=f,this.wordBreak=h;let M=null;if(T){M=[];for(let A=0,P=this.modelLineProjections.length;A2&&!this.modelLineProjections[u-2].isVisible(),v=u===1?1:this.projectedModelLineLineCounts.getPrefixSum(u-1)+1;let w=0;const S=[],L=[];for(let D=0,T=f.length;DS?(D=this.projectedModelLineLineCounts.getPrefixSum(u-1)+1,T=D+S-1,P=T+1,N=P+(h-S)-1,L=!0):hu?u:r|0}getActiveIndentGuide(r,u,C){r=this._toValidViewLineNumber(r),u=this._toValidViewLineNumber(u),C=this._toValidViewLineNumber(C);const f=this.convertViewPositionToModelPosition(r,this.getViewLineMinColumn(r)),h=this.convertViewPositionToModelPosition(u,this.getViewLineMinColumn(u)),v=this.convertViewPositionToModelPosition(C,this.getViewLineMinColumn(C)),w=this.model.guides.getActiveIndentGuide(f.lineNumber,h.lineNumber,v.lineNumber),S=this.convertModelPositionToViewPosition(w.startLineNumber,1),L=this.convertModelPositionToViewPosition(w.endLineNumber,this.model.getLineMaxColumn(w.endLineNumber));return{startLineNumber:S.lineNumber,endLineNumber:L.lineNumber,indent:w.indent}}getViewLineInfo(r){r=this._toValidViewLineNumber(r);const u=this.projectedModelLineLineCounts.getIndexOf(r-1),C=u.index,f=u.remainder;return new i(C+1,f)}getMinColumnOfViewLine(r){return this.modelLineProjections[r.modelLineNumber-1].getViewLineMinColumn(this.model,r.modelLineNumber,r.modelLineWrappedLineIdx)}getMaxColumnOfViewLine(r){return this.modelLineProjections[r.modelLineNumber-1].getViewLineMaxColumn(this.model,r.modelLineNumber,r.modelLineWrappedLineIdx)}getModelStartPositionOfViewLine(r){const u=this.modelLineProjections[r.modelLineNumber-1],C=u.getViewLineMinColumn(this.model,r.modelLineNumber,r.modelLineWrappedLineIdx),f=u.getModelColumnOfViewPosition(r.modelLineWrappedLineIdx,C);return new k.Position(r.modelLineNumber,f)}getModelEndPositionOfViewLine(r){const u=this.modelLineProjections[r.modelLineNumber-1],C=u.getViewLineMaxColumn(this.model,r.modelLineNumber,r.modelLineWrappedLineIdx),f=u.getModelColumnOfViewPosition(r.modelLineWrappedLineIdx,C);return new k.Position(r.modelLineNumber,f)}getViewLineInfosGroupedByModelRanges(r,u){const C=this.getViewLineInfo(r),f=this.getViewLineInfo(u),h=new Array;let v=this.getModelStartPositionOfViewLine(C),w=new Array;for(let S=C.modelLineNumber;S<=f.modelLineNumber;S++){const L=this.modelLineProjections[S-1];if(L.isVisible()){const D=S===C.modelLineNumber?C.modelLineWrappedLineIdx:0,T=S===f.modelLineNumber?f.modelLineWrappedLineIdx+1:L.getViewLineCount();for(let M=D;M{if(A.forWrappedLinesAfterColumn!==-1&&this.modelLineProjections[D.modelLineNumber-1].getViewPositionOfModelPosition(0,A.forWrappedLinesAfterColumn).lineNumber>=D.modelLineWrappedLineIdx||A.forWrappedLinesBeforeOrAtColumn!==-1&&this.modelLineProjections[D.modelLineNumber-1].getViewPositionOfModelPosition(0,A.forWrappedLinesBeforeOrAtColumn).lineNumberD.modelLineWrappedLineIdx)return}const N=this.convertModelPositionToViewPosition(D.modelLineNumber,A.horizontalLine.endColumn),O=this.modelLineProjections[D.modelLineNumber-1].getViewPositionOfModelPosition(0,A.horizontalLine.endColumn);return O.lineNumber===D.modelLineWrappedLineIdx?new E.IndentGuide(A.visibleColumn,P,A.className,new E.IndentGuideHorizontalLine(A.horizontalLine.top,N.column),-1,-1):O.lineNumber!!A))}}return v}getViewLinesIndentGuides(r,u){r=this._toValidViewLineNumber(r),u=this._toValidViewLineNumber(u);const C=this.convertViewPositionToModelPosition(r,this.getViewLineMinColumn(r)),f=this.convertViewPositionToModelPosition(u,this.getViewLineMaxColumn(u));let h=[];const v=[],w=[],S=C.lineNumber-1,L=f.lineNumber-1;let D=null;for(let P=S;P<=L;P++){const N=this.modelLineProjections[P];if(N.isVisible()){const O=N.getViewLineNumberOfModelPosition(0,P===S?C.column:1),F=N.getViewLineNumberOfModelPosition(0,this.model.getLineMaxColumn(P+1)),x=F-O+1;let W=0;x>1&&N.getViewLineMinColumn(this.model,P+1,F)===1&&(W=O===0?1:2),v.push(x),w.push(W),D===null&&(D=new k.Position(P+1,0))}else D!==null&&(h=h.concat(this.model.guides.getLinesIndentGuides(D.lineNumber,P)),D=null)}D!==null&&(h=h.concat(this.model.guides.getLinesIndentGuides(D.lineNumber,f.lineNumber)),D=null);const T=u-r+1,M=new Array(T);let A=0;for(let P=0,N=h.length;Pu&&(P=!0,A=u-h+1),T.getViewLinesData(this.model,L+1,M,A,h-r,C,S),h+=A,P)break}return S}validateViewPosition(r,u,C){r=this._toValidViewLineNumber(r);const f=this.projectedModelLineLineCounts.getIndexOf(r-1),h=f.index,v=f.remainder,w=this.modelLineProjections[h],S=w.getViewLineMinColumn(this.model,h+1,v),L=w.getViewLineMaxColumn(this.model,h+1,v);uL&&(u=L);const D=w.getModelColumnOfViewPosition(v,u);return this.model.validatePosition(new k.Position(h+1,D)).equals(C)?new k.Position(r,u):this.convertModelPositionToViewPosition(C.lineNumber,C.column)}validateViewRange(r,u){const C=this.validateViewPosition(r.startLineNumber,r.startColumn,u.getStartPosition()),f=this.validateViewPosition(r.endLineNumber,r.endColumn,u.getEndPosition());return new I.Range(C.lineNumber,C.column,f.lineNumber,f.column)}convertViewPositionToModelPosition(r,u){const C=this.getViewLineInfo(r),f=this.modelLineProjections[C.modelLineNumber-1].getModelColumnOfViewPosition(C.modelLineWrappedLineIdx,u);return this.model.validatePosition(new k.Position(C.modelLineNumber,f))}convertViewRangeToModelRange(r){const u=this.convertViewPositionToModelPosition(r.startLineNumber,r.startColumn),C=this.convertViewPositionToModelPosition(r.endLineNumber,r.endColumn);return new I.Range(u.lineNumber,u.column,C.lineNumber,C.column)}convertModelPositionToViewPosition(r,u,C=2,f=!1,h=!1){const v=this.model.validatePosition(new k.Position(r,u)),w=v.lineNumber,S=v.column;let L=w-1,D=!1;if(h)for(;L0&&!this.modelLineProjections[L].isVisible();)L--,D=!0;if(L===0&&!this.modelLineProjections[L].isVisible())return new k.Position(f?0:1,1);const T=1+this.projectedModelLineLineCounts.getPrefixSum(L);let M;return D?h?M=this.modelLineProjections[L].getViewPositionOfModelPosition(T,1,C):M=this.modelLineProjections[L].getViewPositionOfModelPosition(T,this.model.getLineMaxColumn(L+1),C):M=this.modelLineProjections[w-1].getViewPositionOfModelPosition(T,S,C),M}convertModelRangeToViewRange(r,u=0){if(r.isEmpty()){const C=this.convertModelPositionToViewPosition(r.startLineNumber,r.startColumn,u);return I.Range.fromPositions(C)}else{const C=this.convertModelPositionToViewPosition(r.startLineNumber,r.startColumn,1),f=this.convertModelPositionToViewPosition(r.endLineNumber,r.endColumn,0);return new I.Range(C.lineNumber,C.column,f.lineNumber,f.column)}}getViewLineNumberOfModelPosition(r,u){let C=r-1;if(this.modelLineProjections[C].isVisible()){const h=1+this.projectedModelLineLineCounts.getPrefixSum(C);return this.modelLineProjections[C].getViewLineNumberOfModelPosition(h,u)}for(;C>0&&!this.modelLineProjections[C].isVisible();)C--;if(C===0&&!this.modelLineProjections[C].isVisible())return 1;const f=1+this.projectedModelLineLineCounts.getPrefixSum(C);return this.modelLineProjections[C].getViewLineNumberOfModelPosition(f,this.model.getLineMaxColumn(C+1))}getDecorationsInRange(r,u,C,f,h){const v=this.convertViewPositionToModelPosition(r.startLineNumber,r.startColumn),w=this.convertViewPositionToModelPosition(r.endLineNumber,r.endColumn);if(w.lineNumber-v.lineNumber<=r.endLineNumber-r.startLineNumber)return this.model.getDecorationsInRange(new I.Range(v.lineNumber,1,w.lineNumber,w.column),u,C,f,h);let S=[];const L=v.lineNumber-1,D=w.lineNumber-1;let T=null;for(let N=L;N<=D;N++)if(this.modelLineProjections[N].isVisible())T===null&&(T=new k.Position(N+1,N===L?v.column:1));else if(T!==null){const F=this.model.getLineMaxColumn(N);S=S.concat(this.model.getDecorationsInRange(new I.Range(T.lineNumber,T.column,N,F),u,C,f)),T=null}T!==null&&(S=S.concat(this.model.getDecorationsInRange(new I.Range(T.lineNumber,T.column,w.lineNumber,w.column),u,C,f)),T=null),S.sort((N,O)=>{const F=I.Range.compareRangesUsingStarts(N.range,O.range);return F===0?N.idO.id?1:0:F});const M=[];let A=0,P=null;for(const N of S){const O=N.id;P!==O&&(P=O,M[A++]=N)}return M}getInjectedTextAt(r){const u=this.getViewLineInfo(r.lineNumber);return this.modelLineProjections[u.modelLineNumber-1].getInjectedTextAt(u.modelLineWrappedLineIdx,r.column)}normalizePosition(r,u){const C=this.getViewLineInfo(r.lineNumber);return this.modelLineProjections[C.modelLineNumber-1].normalizePosition(C.modelLineWrappedLineIdx,r,u)}getLineIndentColumn(r){const u=this.getViewLineInfo(r);return u.modelLineWrappedLineIdx===0?this.model.getLineIndentColumn(u.modelLineNumber):0}}e.ViewModelLinesFromProjectedModel=o;function t(a){if(a.length===0)return[];const r=a.slice();r.sort(I.Range.compareRangesUsingStarts);const u=[];let C=r[0].startLineNumber,f=r[0].endLineNumber;for(let h=1,v=r.length;hf+1?(u.push(new I.Range(C,1,f,1)),C=w.startLineNumber,f=w.endLineNumber):w.endLineNumber>f&&(f=w.endLineNumber)}return u.push(new I.Range(C,1,f,1)),u}class i{constructor(r,u){this.modelLineNumber=r,this.modelLineWrappedLineIdx=u}}class s{constructor(r,u){this.modelRange=r,this.viewLines=u}}class g{constructor(r){this._lines=r}convertViewPositionToModelPosition(r){return this._lines.convertViewPositionToModelPosition(r.lineNumber,r.column)}convertViewRangeToModelRange(r){return this._lines.convertViewRangeToModelRange(r)}validateViewPosition(r,u){return this._lines.validateViewPosition(r.lineNumber,r.column,u)}validateViewRange(r,u){return this._lines.validateViewRange(r,u)}convertModelPositionToViewPosition(r,u,C,f){return this._lines.convertModelPositionToViewPosition(r.lineNumber,r.column,u,C,f)}convertModelRangeToViewRange(r,u){return this._lines.convertModelRangeToViewRange(r,u)}modelPositionIsVisible(r){return this._lines.modelPositionIsVisible(r.lineNumber,r.column)}getModelLineViewLineCount(r){return this._lines.getModelLineViewLineCount(r)}getViewLineNumberOfModelPosition(r,u){return this._lines.getViewLineNumberOfModelPosition(r,u)}}class c{constructor(r){this.model=r}dispose(){}createCoordinatesConverter(){return new l(this)}getHiddenAreas(){return[]}setHiddenAreas(r){return!1}setTabSize(r){return!1}setWrappingSettings(r,u,C,f){return!1}createLineBreaksComputer(){const r=[];return{addRequest:(u,C,f)=>{r.push(null)},finalize:()=>r}}onModelFlushed(){}onModelLinesDeleted(r,u,C){return new _.ViewLinesDeletedEvent(u,C)}onModelLinesInserted(r,u,C,f){return new _.ViewLinesInsertedEvent(u,C)}onModelLineChanged(r,u,C){return[!1,new _.ViewLinesChangedEvent(u,1),null,null]}acceptVersionId(r){}getViewLineCount(){return this.model.getLineCount()}getActiveIndentGuide(r,u,C){return{startLineNumber:r,endLineNumber:r,indent:0}}getViewLinesBracketGuides(r,u,C){return new Array(u-r+1).fill([])}getViewLinesIndentGuides(r,u){const C=u-r+1,f=new Array(C);for(let h=0;hu)}getModelLineViewLineCount(r){return 1}getViewLineNumberOfModelPosition(r,u){return r}}}),define(ne[810],se([1,0,13,14,33,2,16,11,37,706,76,9,4,132,27,70,369,243,606,374,95,375,244,809,601]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewModel=void 0;const v=!0;class w extends E.Disposable{constructor(N,O,F,x,W,V,q,H,z,U){if(super(),this.languageConfigurationService=q,this._themeService=H,this._attachedView=z,this._transactionalTarget=U,this.hiddenAreasModel=new D,this.previousHiddenAreas=[],this._editorId=N,this._configuration=O,this.model=F,this._eventDispatcher=new C.ViewModelEventDispatcher,this.onEvent=this._eventDispatcher.onEvent,this.cursorConfig=new p.CursorConfiguration(this.model.getLanguageId(),this.model.getOptions(),this._configuration,this.languageConfigurationService),this._updateConfigurationViewLineCount=this._register(new k.RunOnceScheduler(()=>this._updateConfigurationViewLineCountNow(),0)),this._hasFocus=!1,this._viewportStart=S.create(this.model),this.glyphLanes=new h.GlyphMarginLanesModel(0),v&&this.model.isTooLargeForTokenization())this._lines=new f.ViewModelLinesFromModelAsIs(this.model);else{const j=this._configuration.options,Y=j.get(50),G=j.get(140),K=j.get(147),R=j.get(139),J=j.get(130);this._lines=new f.ViewModelLinesFromProjectedModel(this._editorId,this.model,x,W,Y,this.model.getOptions().tabSize,G,K.wrappingColumn,R,J)}this.coordinatesConverter=this._lines.createCoordinatesConverter(),this._cursor=this._register(new b.CursorsController(F,this,this.coordinatesConverter,this.cursorConfig)),this.viewLayout=this._register(new l.ViewLayout(this._configuration,this.getLineCount(),V)),this._register(this.viewLayout.onDidScroll(j=>{j.scrollTopChanged&&this._handleVisibleLinesChanged(),j.scrollTopChanged&&this._viewportStart.invalidate(),this._eventDispatcher.emitSingleViewEvent(new c.ViewScrollChangedEvent(j)),this._eventDispatcher.emitOutgoingEvent(new C.ScrollChangedEvent(j.oldScrollWidth,j.oldScrollLeft,j.oldScrollHeight,j.oldScrollTop,j.scrollWidth,j.scrollLeft,j.scrollHeight,j.scrollTop))})),this._register(this.viewLayout.onDidContentSizeChange(j=>{this._eventDispatcher.emitOutgoingEvent(j)})),this._decorations=new u.ViewModelDecorations(this._editorId,this.model,this._configuration,this._lines,this.coordinatesConverter),this._registerModelEvents(),this._register(this._configuration.onDidChangeFast(j=>{try{const Y=this._eventDispatcher.beginEmitViewEvents();this._onConfigurationChanged(Y,j)}finally{this._eventDispatcher.endEmitViewEvents()}})),this._register(a.MinimapTokensColorTracker.getInstance().onDidChange(()=>{this._eventDispatcher.emitSingleViewEvent(new c.ViewTokensColorsChangedEvent)})),this._register(this._themeService.onDidColorThemeChange(j=>{this._invalidateDecorationsColorCache(),this._eventDispatcher.emitSingleViewEvent(new c.ViewThemeChangedEvent(j))})),this._updateConfigurationViewLineCountNow()}dispose(){super.dispose(),this._decorations.dispose(),this._lines.dispose(),this._viewportStart.dispose(),this._eventDispatcher.dispose()}createLineBreaksComputer(){return this._lines.createLineBreaksComputer()}addViewEventHandler(N){this._eventDispatcher.addViewEventHandler(N)}removeViewEventHandler(N){this._eventDispatcher.removeViewEventHandler(N)}_updateConfigurationViewLineCountNow(){this._configuration.setViewLineCount(this._lines.getViewLineCount())}getModelVisibleRanges(){const N=this.viewLayout.getLinesViewportData(),O=new o.Range(N.startLineNumber,this.getLineMinColumn(N.startLineNumber),N.endLineNumber,this.getLineMaxColumn(N.endLineNumber));return this._toModelVisibleRanges(O)}visibleLinesStabilized(){const N=this.getModelVisibleRanges();this._attachedView.setVisibleLines(N,!0)}_handleVisibleLinesChanged(){const N=this.getModelVisibleRanges();this._attachedView.setVisibleLines(N,!1)}setHasFocus(N){this._hasFocus=N,this._cursor.setHasFocus(N),this._eventDispatcher.emitSingleViewEvent(new c.ViewFocusChangedEvent(N)),this._eventDispatcher.emitOutgoingEvent(new C.FocusChangedEvent(!N,N))}onCompositionStart(){this._eventDispatcher.emitSingleViewEvent(new c.ViewCompositionStartEvent)}onCompositionEnd(){this._eventDispatcher.emitSingleViewEvent(new c.ViewCompositionEndEvent)}_captureStableViewport(){if(this._viewportStart.isValid&&this.viewLayout.getCurrentScrollTop()>0){const N=new n.Position(this._viewportStart.viewLineNumber,this.getLineMinColumn(this._viewportStart.viewLineNumber)),O=this.coordinatesConverter.convertViewPositionToModelPosition(N);return new A(O,this._viewportStart.startLineDelta)}return new A(null,0)}_onConfigurationChanged(N,O){const F=this._captureStableViewport(),x=this._configuration.options,W=x.get(50),V=x.get(140),q=x.get(147),H=x.get(139),z=x.get(130);this._lines.setWrappingSettings(W,V,q.wrappingColumn,H,z)&&(N.emitViewEvent(new c.ViewFlushedEvent),N.emitViewEvent(new c.ViewLineMappingChangedEvent),N.emitViewEvent(new c.ViewDecorationsChangedEvent(null)),this._cursor.onLineMappingChanged(N),this._decorations.onLineMappingChanged(),this.viewLayout.onFlushed(this.getLineCount()),this._updateConfigurationViewLineCount.schedule()),O.hasChanged(92)&&(this._decorations.reset(),N.emitViewEvent(new c.ViewDecorationsChangedEvent(null))),O.hasChanged(99)&&(this._decorations.reset(),N.emitViewEvent(new c.ViewDecorationsChangedEvent(null))),N.emitViewEvent(new c.ViewConfigurationChangedEvent(O)),this.viewLayout.onConfigurationChanged(O),F.recoverViewportStart(this.coordinatesConverter,this.viewLayout),p.CursorConfiguration.shouldRecreate(O)&&(this.cursorConfig=new p.CursorConfiguration(this.model.getLanguageId(),this.model.getOptions(),this._configuration,this.languageConfigurationService),this._cursor.updateConfiguration(this.cursorConfig))}_registerModelEvents(){this._register(this.model.onDidChangeContentOrInjectedText(N=>{try{const F=this._eventDispatcher.beginEmitViewEvents();let x=!1,W=!1;const V=N instanceof t.InternalModelContentChangeEvent?N.rawContentChangedEvent.changes:N.changes,q=N instanceof t.InternalModelContentChangeEvent?N.rawContentChangedEvent.versionId:null,H=this._lines.createLineBreaksComputer();for(const j of V)switch(j.changeType){case 4:{for(let Y=0;Y!R.ownerId||R.ownerId===this._editorId)),H.addRequest(G,K,null)}break}case 2:{let Y=null;j.injectedText&&(Y=j.injectedText.filter(G=>!G.ownerId||G.ownerId===this._editorId)),H.addRequest(j.detail,Y,null);break}}const z=H.finalize(),U=new d.ArrayQueue(z);for(const j of V)switch(j.changeType){case 1:{this._lines.onModelFlushed(),F.emitViewEvent(new c.ViewFlushedEvent),this._decorations.reset(),this.viewLayout.onFlushed(this.getLineCount()),x=!0;break}case 3:{const Y=this._lines.onModelLinesDeleted(q,j.fromLineNumber,j.toLineNumber);Y!==null&&(F.emitViewEvent(Y),this.viewLayout.onLinesDeleted(Y.fromLineNumber,Y.toLineNumber)),x=!0;break}case 4:{const Y=U.takeCount(j.detail.length),G=this._lines.onModelLinesInserted(q,j.fromLineNumber,j.toLineNumber,Y);G!==null&&(F.emitViewEvent(G),this.viewLayout.onLinesInserted(G.fromLineNumber,G.toLineNumber)),x=!0;break}case 2:{const Y=U.dequeue(),[G,K,R,J]=this._lines.onModelLineChanged(q,j.lineNumber,Y);W=G,K&&F.emitViewEvent(K),R&&(F.emitViewEvent(R),this.viewLayout.onLinesInserted(R.fromLineNumber,R.toLineNumber)),J&&(F.emitViewEvent(J),this.viewLayout.onLinesDeleted(J.fromLineNumber,J.toLineNumber));break}case 5:break}q!==null&&this._lines.acceptVersionId(q),this.viewLayout.onHeightMaybeChanged(),!x&&W&&(F.emitViewEvent(new c.ViewLineMappingChangedEvent),F.emitViewEvent(new c.ViewDecorationsChangedEvent(null)),this._cursor.onLineMappingChanged(F),this._decorations.onLineMappingChanged())}finally{this._eventDispatcher.endEmitViewEvents()}const O=this._viewportStart.isValid;if(this._viewportStart.invalidate(),this._configuration.setModelLineCount(this.model.getLineCount()),this._updateConfigurationViewLineCountNow(),!this._hasFocus&&this.model.getAttachedEditorCount()>=2&&O){const F=this.model._getTrackedRange(this._viewportStart.modelTrackedRange);if(F){const x=this.coordinatesConverter.convertModelPositionToViewPosition(F.getStartPosition()),W=this.viewLayout.getVerticalOffsetForLineNumber(x.lineNumber);this.viewLayout.setScrollPosition({scrollTop:W+this._viewportStart.startLineDelta},1)}}try{const F=this._eventDispatcher.beginEmitViewEvents();N instanceof t.InternalModelContentChangeEvent&&F.emitOutgoingEvent(new C.ModelContentChangedEvent(N.contentChangedEvent)),this._cursor.onModelContentChanged(F,N)}finally{this._eventDispatcher.endEmitViewEvents()}this._handleVisibleLinesChanged()})),this._register(this.model.onDidChangeTokens(N=>{const O=[];for(let F=0,x=N.ranges.length;F{this._eventDispatcher.emitSingleViewEvent(new c.ViewLanguageConfigurationEvent),this.cursorConfig=new p.CursorConfiguration(this.model.getLanguageId(),this.model.getOptions(),this._configuration,this.languageConfigurationService),this._cursor.updateConfiguration(this.cursorConfig),this._eventDispatcher.emitOutgoingEvent(new C.ModelLanguageConfigurationChangedEvent(N))})),this._register(this.model.onDidChangeLanguage(N=>{this.cursorConfig=new p.CursorConfiguration(this.model.getLanguageId(),this.model.getOptions(),this._configuration,this.languageConfigurationService),this._cursor.updateConfiguration(this.cursorConfig),this._eventDispatcher.emitOutgoingEvent(new C.ModelLanguageChangedEvent(N))})),this._register(this.model.onDidChangeOptions(N=>{if(this._lines.setTabSize(this.model.getOptions().tabSize)){try{const O=this._eventDispatcher.beginEmitViewEvents();O.emitViewEvent(new c.ViewFlushedEvent),O.emitViewEvent(new c.ViewLineMappingChangedEvent),O.emitViewEvent(new c.ViewDecorationsChangedEvent(null)),this._cursor.onLineMappingChanged(O),this._decorations.onLineMappingChanged(),this.viewLayout.onFlushed(this.getLineCount())}finally{this._eventDispatcher.endEmitViewEvents()}this._updateConfigurationViewLineCount.schedule()}this.cursorConfig=new p.CursorConfiguration(this.model.getLanguageId(),this.model.getOptions(),this._configuration,this.languageConfigurationService),this._cursor.updateConfiguration(this.cursorConfig),this._eventDispatcher.emitOutgoingEvent(new C.ModelOptionsChangedEvent(N))})),this._register(this.model.onDidChangeDecorations(N=>{this._decorations.onModelDecorationsChanged(),this._eventDispatcher.emitSingleViewEvent(new c.ViewDecorationsChangedEvent(N)),this._eventDispatcher.emitOutgoingEvent(new C.ModelDecorationsChangedEvent(N))}))}setHiddenAreas(N,O){this.hiddenAreasModel.setHiddenAreas(O,N);const F=this.hiddenAreasModel.getMergedRanges();if(F===this.previousHiddenAreas)return;this.previousHiddenAreas=F;const x=this._captureStableViewport();let W=!1;try{const V=this._eventDispatcher.beginEmitViewEvents();W=this._lines.setHiddenAreas(F),W&&(V.emitViewEvent(new c.ViewFlushedEvent),V.emitViewEvent(new c.ViewLineMappingChangedEvent),V.emitViewEvent(new c.ViewDecorationsChangedEvent(null)),this._cursor.onLineMappingChanged(V),this._decorations.onLineMappingChanged(),this.viewLayout.onFlushed(this.getLineCount()),this.viewLayout.onHeightMaybeChanged());const q=x.viewportStartModelPosition?.lineNumber;q&&F.some(z=>z.startLineNumber<=q&&q<=z.endLineNumber)||x.recoverViewportStart(this.coordinatesConverter,this.viewLayout)}finally{this._eventDispatcher.endEmitViewEvents()}this._updateConfigurationViewLineCount.schedule(),W&&this._eventDispatcher.emitOutgoingEvent(new C.HiddenAreasChangedEvent)}getVisibleRangesPlusViewportAboveBelow(){const N=this._configuration.options.get(146),O=this._configuration.options.get(67),F=Math.max(20,Math.round(N.height/O)),x=this.viewLayout.getLinesViewportData(),W=Math.max(1,x.completelyVisibleStartLineNumber-F),V=Math.min(this.getLineCount(),x.completelyVisibleEndLineNumber+F);return this._toModelVisibleRanges(new o.Range(W,this.getLineMinColumn(W),V,this.getLineMaxColumn(V)))}getVisibleRanges(){const N=this.getCompletelyVisibleViewRange();return this._toModelVisibleRanges(N)}getHiddenAreas(){return this._lines.getHiddenAreas()}_toModelVisibleRanges(N){const O=this.coordinatesConverter.convertViewRangeToModelRange(N),F=this._lines.getHiddenAreas();if(F.length===0)return[O];const x=[];let W=0,V=O.startLineNumber,q=O.startColumn;const H=O.endLineNumber,z=O.endColumn;for(let U=0,j=F.length;UH||(V"u")return this._reduceRestoreStateCompatibility(N);const O=this.model.validatePosition(N.firstPosition),F=this.coordinatesConverter.convertModelPositionToViewPosition(O),x=this.viewLayout.getVerticalOffsetForLineNumber(F.lineNumber)-N.firstPositionDeltaTop;return{scrollLeft:N.scrollLeft,scrollTop:x}}_reduceRestoreStateCompatibility(N){return{scrollLeft:N.scrollLeft,scrollTop:N.scrollTopWithoutViewZones}}getTabSize(){return this.model.getOptions().tabSize}getLineCount(){return this._lines.getViewLineCount()}setViewport(N,O,F){this._viewportStart.update(this,N)}getActiveIndentGuide(N,O,F){return this._lines.getActiveIndentGuide(N,O,F)}getLinesIndentGuides(N,O){return this._lines.getViewLinesIndentGuides(N,O)}getBracketGuidesInRangeByLine(N,O,F,x){return this._lines.getViewLinesBracketGuides(N,O,F,x)}getLineContent(N){return this._lines.getViewLineContent(N)}getLineLength(N){return this._lines.getViewLineLength(N)}getLineMinColumn(N){return this._lines.getViewLineMinColumn(N)}getLineMaxColumn(N){return this._lines.getViewLineMaxColumn(N)}getLineFirstNonWhitespaceColumn(N){const O=m.firstNonWhitespaceIndex(this.getLineContent(N));return O===-1?0:O+1}getLineLastNonWhitespaceColumn(N){const O=m.lastNonWhitespaceIndex(this.getLineContent(N));return O===-1?0:O+2}getMinimapDecorationsInRange(N){return this._decorations.getMinimapDecorationsInRange(N)}getDecorationsInViewport(N){return this._decorations.getDecorationsViewportData(N).decorations}getInjectedTextAt(N){return this._lines.getInjectedTextAt(N)}getViewportViewLineRenderingData(N,O){const x=this._decorations.getDecorationsViewportData(N).inlineDecorations[O-N.startLineNumber];return this._getViewLineRenderingData(O,x)}getViewLineRenderingData(N){const O=this._decorations.getInlineDecorationsOnLine(N);return this._getViewLineRenderingData(N,O)}_getViewLineRenderingData(N,O){const F=this.model.mightContainRTL(),x=this.model.mightContainNonBasicASCII(),W=this.getTabSize(),V=this._lines.getViewLineData(N);return V.inlineDecorations&&(O=[...O,...V.inlineDecorations.map(q=>q.toInlineDecoration(N))]),new r.ViewLineRenderingData(V.minColumn,V.maxColumn,V.content,V.continuesWithWrappedLine,F,x,V.tokens,O,W,V.startVisibleColumn)}getViewLineData(N){return this._lines.getViewLineData(N)}getMinimapLinesRenderingData(N,O,F){const x=this._lines.getViewLinesData(N,O,F);return new r.MinimapLinesRenderingData(this.getTabSize(),x)}getAllOverviewRulerDecorations(N){const O=this.model.getOverviewRulerDecorations(this._editorId,(0,_.filterValidationDecorations)(this._configuration.options)),F=new L;for(const x of O){const W=x.options,V=W.overviewRuler;if(!V)continue;const q=V.position;if(q===0)continue;const H=V.getColor(N.value),z=this.coordinatesConverter.getViewLineNumberOfModelPosition(x.range.startLineNumber,x.range.startColumn),U=this.coordinatesConverter.getViewLineNumberOfModelPosition(x.range.endLineNumber,x.range.endColumn);F.accept(H,W.zIndex,z,U,q)}return F.asArray}_invalidateDecorationsColorCache(){const N=this.model.getOverviewRulerDecorations();for(const O of N)O.options.overviewRuler?.invalidateCachedColor(),O.options.minimap?.invalidateCachedColor()}getValueInRange(N,O){const F=this.coordinatesConverter.convertViewRangeToModelRange(N);return this.model.getValueInRange(F,O)}getValueLengthInRange(N,O){const F=this.coordinatesConverter.convertViewRangeToModelRange(N);return this.model.getValueLengthInRange(F,O)}modifyPosition(N,O){const F=this.coordinatesConverter.convertViewPositionToModelPosition(N),x=this.model.modifyPosition(F,O);return this.coordinatesConverter.convertModelPositionToViewPosition(x)}deduceModelPositionRelativeToViewPosition(N,O,F){const x=this.coordinatesConverter.convertViewPositionToModelPosition(N);this.model.getEOL().length===2&&(O<0?O-=F:O+=F);const V=this.model.getOffsetAt(x)+O;return this.model.getPositionAt(V)}getPlainTextToCopy(N,O,F){const x=F?`\r -`:this.model.getEOL();N=N.slice(0),N.sort(o.Range.compareRangesUsingStarts);let W=!1,V=!1;for(const H of N)H.isEmpty()?W=!0:V=!0;if(!V){if(!O)return"";const H=N.map(U=>U.startLineNumber);let z="";for(let U=0;U0&&H[U-1]===H[U]||(z+=this.model.getLineContent(H[U])+x);return z}if(W&&O){const H=[];let z=0;for(const U of N){const j=U.startLineNumber;U.isEmpty()?j!==z&&H.push(this.model.getLineContent(j)):H.push(this.model.getValueInRange(U,F?2:0)),z=j}return H.length===1?H[0]:H}const q=[];for(const H of N)H.isEmpty()||q.push(this.model.getValueInRange(H,F?2:0));return q.length===1?q[0]:q}getRichTextToCopy(N,O){const F=this.model.getLanguageId();if(F===s.PLAINTEXT_LANGUAGE_ID||N.length!==1)return null;let x=N[0];if(x.isEmpty()){if(!O)return null;const U=x.startLineNumber;x=new o.Range(U,this.model.getLineMinColumn(U),U,this.model.getLineMaxColumn(U))}const W=this._configuration.options.get(50),V=this._getColorMap(),H=/[:;\\\/<>]/.test(W.fontFamily)||W.fontFamily===_.EDITOR_FONT_DEFAULTS.fontFamily;let z;return H?z=_.EDITOR_FONT_DEFAULTS.fontFamily:(z=W.fontFamily,z=z.replace(/"/g,"'"),/[,']/.test(z)||/[+ ]/.test(z)&&(z=`'${z}'`),z=`${z}, ${_.EDITOR_FONT_DEFAULTS.fontFamily}`),{mode:F,html:`
    `+this._getHTMLToCopy(x,V)+"
    "}}_getHTMLToCopy(N,O){const F=N.startLineNumber,x=N.startColumn,W=N.endLineNumber,V=N.endColumn,q=this.getTabSize();let H="";for(let z=F;z<=W;z++){const U=this.model.tokenization.getLineTokens(z),j=U.getLineContent(),Y=z===F?x-1:0,G=z===W?V-1:j.length;j===""?H+="
    ":H+=(0,g.tokenizeLineToHTML)(j,U.inflate(),O,Y,G,q,y.isWindows)}return H}_getColorMap(){const N=i.TokenizationRegistry.getColorMap(),O=["#000000"];if(N)for(let F=1,x=N.length;Fthis._cursor.setStates(x,N,O,F))}getCursorColumnSelectData(){return this._cursor.getCursorColumnSelectData()}getCursorAutoClosedCharacters(){return this._cursor.getAutoClosedCharacters()}setCursorColumnSelectData(N){this._cursor.setCursorColumnSelectData(N)}getPrevEditOperationType(){return this._cursor.getPrevEditOperationType()}setPrevEditOperationType(N){this._cursor.setPrevEditOperationType(N)}getSelection(){return this._cursor.getSelection()}getSelections(){return this._cursor.getSelections()}getPosition(){return this._cursor.getPrimaryCursorState().modelState.position}setSelections(N,O,F=0){this._withViewEventsCollector(x=>this._cursor.setSelections(x,N,O,F))}saveCursorState(){return this._cursor.saveState()}restoreCursorState(N){this._withViewEventsCollector(O=>this._cursor.restoreState(O,N))}_executeCursorEdit(N){if(this._cursor.context.cursorConfig.readOnly){this._eventDispatcher.emitOutgoingEvent(new C.ReadOnlyEditAttemptEvent);return}this._withViewEventsCollector(N)}executeEdits(N,O,F){this._executeCursorEdit(x=>this._cursor.executeEdits(x,N,O,F))}startComposition(){this._executeCursorEdit(N=>this._cursor.startComposition(N))}endComposition(N){this._executeCursorEdit(O=>this._cursor.endComposition(O,N))}type(N,O){this._executeCursorEdit(F=>this._cursor.type(F,N,O))}compositionType(N,O,F,x,W){this._executeCursorEdit(V=>this._cursor.compositionType(V,N,O,F,x,W))}paste(N,O,F,x){this._executeCursorEdit(W=>this._cursor.paste(W,N,O,F,x))}cut(N){this._executeCursorEdit(O=>this._cursor.cut(O,N))}executeCommand(N,O){this._executeCursorEdit(F=>this._cursor.executeCommand(F,N,O))}executeCommands(N,O){this._executeCursorEdit(F=>this._cursor.executeCommands(F,N,O))}revealAllCursors(N,O,F=!1){this._withViewEventsCollector(x=>this._cursor.revealAll(x,N,F,0,O,0))}revealPrimaryCursor(N,O,F=!1){this._withViewEventsCollector(x=>this._cursor.revealPrimary(x,N,F,0,O,0))}revealTopMostCursor(N){const O=this._cursor.getTopMostViewPosition(),F=new o.Range(O.lineNumber,O.column,O.lineNumber,O.column);this._withViewEventsCollector(x=>x.emitViewEvent(new c.ViewRevealRangeRequestEvent(N,!1,F,null,0,!0,0)))}revealBottomMostCursor(N){const O=this._cursor.getBottomMostViewPosition(),F=new o.Range(O.lineNumber,O.column,O.lineNumber,O.column);this._withViewEventsCollector(x=>x.emitViewEvent(new c.ViewRevealRangeRequestEvent(N,!1,F,null,0,!0,0)))}revealRange(N,O,F,x,W){this._withViewEventsCollector(V=>V.emitViewEvent(new c.ViewRevealRangeRequestEvent(N,!1,F,null,x,O,W)))}changeWhitespace(N){this.viewLayout.changeWhitespace(N)&&(this._eventDispatcher.emitSingleViewEvent(new c.ViewZonesChangedEvent),this._eventDispatcher.emitOutgoingEvent(new C.ViewZonesChangedEvent))}_withViewEventsCollector(N){return this._transactionalTarget.batchChanges(()=>{try{const O=this._eventDispatcher.beginEmitViewEvents();return N(O)}finally{this._eventDispatcher.endEmitViewEvents()}})}batchEvents(N){this._withViewEventsCollector(()=>{N()})}normalizePosition(N,O){return this._lines.normalizePosition(N,O)}getLineIndentColumn(N){return this._lines.getLineIndentColumn(N)}}e.ViewModel=w;class S{static create(N){const O=N._setTrackedRange(null,new o.Range(1,1,1,1),1);return new S(N,1,!1,O,0)}get viewLineNumber(){return this._viewLineNumber}get isValid(){return this._isValid}get modelTrackedRange(){return this._modelTrackedRange}get startLineDelta(){return this._startLineDelta}constructor(N,O,F,x,W){this._model=N,this._viewLineNumber=O,this._isValid=F,this._modelTrackedRange=x,this._startLineDelta=W}dispose(){this._model._setTrackedRange(this._modelTrackedRange,null,1)}update(N,O){const F=N.coordinatesConverter.convertViewPositionToModelPosition(new n.Position(O,N.getLineMinColumn(O))),x=N.model._setTrackedRange(this._modelTrackedRange,new o.Range(F.lineNumber,F.column,F.lineNumber,F.column),1),W=N.viewLayout.getVerticalOffsetForLineNumber(O),V=N.viewLayout.getCurrentScrollTop();this._viewLineNumber=O,this._isValid=!0,this._modelTrackedRange=x,this._startLineDelta=V-W}invalidate(){this._isValid=!1}}class L{constructor(){this._asMap=Object.create(null),this.asArray=[]}accept(N,O,F,x,W){const V=this._asMap[N];if(V){const q=V.data,H=q[q.length-3],z=q[q.length-1];if(H===W&&z+1>=F){x>z&&(q[q.length-1]=x);return}q.push(W,F,x)}else{const q=new r.OverviewRulerDecorationsGroup(N,O,[W,F,x]);this._asMap[N]=q,this.asArray.push(q)}}}class D{constructor(){this.hiddenAreas=new Map,this.shouldRecompute=!1,this.ranges=[]}setHiddenAreas(N,O){const F=this.hiddenAreas.get(N);F&&M(F,O)||(this.hiddenAreas.set(N,O),this.shouldRecompute=!0)}getMergedRanges(){if(!this.shouldRecompute)return this.ranges;this.shouldRecompute=!1;const N=Array.from(this.hiddenAreas.values()).reduce((O,F)=>T(O,F),[]);return M(this.ranges,N)?this.ranges:(this.ranges=N,this.ranges)}}function T(P,N){const O=[];let F=0,x=0;for(;F{this._onDidChangeConfiguration.fire(Ne);const Ke=this._configuration.options;if(Ne.hasChanged(146)){const ze=Ke.get(146);this._onDidLayoutChange.fire(ze)}})),this._contextKeyService=this._register(re.createScoped(this._domElement)),this._notificationService=me,this._codeEditorService=Z,this._commandService=te,this._themeService=le,this._register(new K(this,this._contextKeyService)),this._register(new R(this,this._contextKeyService,Le)),this._instantiationService=this._register(Q.createChild(new F.ServiceCollection([N.IContextKeyService,this._contextKeyService]))),this._modelData=null,this._focusTracker=new J(X,this._overflowWidgetsDomNode),this._register(this._focusTracker.onChange(()=>{this._editorWidgetFocus.setValue(this._focusTracker.hasFocus())})),this._contentWidgets={},this._overlayWidgets={},this._glyphMarginWidgets={};let Me;Array.isArray($.contributions)?Me=$.contributions:Me=p.EditorExtensionsRegistry.getEditorContributions(),this._contributions.initialize(this,Me,this._instantiationService);for(const Ne of p.EditorExtensionsRegistry.getEditorActions()){if(this._actions.has(Ne.id)){(0,k.onUnexpectedError)(new Error(`Cannot have two actions with the same id ${Ne.id}`));continue}const Ke=new f.InternalEditorAction(Ne.id,Ne.label,Ne.alias,Ne.metadata,Ne.precondition??void 0,ze=>this._instantiationService.invokeFunction(Ge=>Promise.resolve(Ne.runEditorCommand(Ge,this,ze))),this._contextKeyService);this._actions.set(Ke.id,Ke)}const Ae=()=>!this._configuration.options.get(92)&&this._configuration.options.get(36).enabled;this._register(new d.DragAndDropObserver(this._domElement,{onDragOver:Ne=>{if(!Ae())return;const Ke=this.getTargetAtClientPoint(Ne.clientX,Ne.clientY);Ke?.position&&this.showDropIndicatorAt(Ke.position)},onDrop:async Ne=>{if(!Ae()||(this.removeDropIndicator(),!Ne.dataTransfer))return;const Ke=this.getTargetAtClientPoint(Ne.clientX,Ne.clientY);Ke?.position&&this._onDropIntoEditor.fire({position:Ke.position,event:Ne})},onDragLeave:()=>{this.removeDropIndicator()},onDragEnd:()=>{this.removeDropIndicator()}})),this._codeEditorService.addCodeEditor(this)}writeScreenReaderContent(X){this._modelData?.view.writeScreenReaderContent(X)}_createConfiguration(X,B,$,Q){return new _.EditorConfiguration(X,B,$,this._domElement,Q)}getId(){return this.getEditorType()+":"+this._id}getEditorType(){return h.EditorType.ICodeEditor}dispose(){this._codeEditorService.removeCodeEditor(this),this._focusTracker.dispose(),this._actions.clear(),this._contentWidgets={},this._overlayWidgets={},this._removeDecorationTypes(),this._postDetachModelCleanup(this._detachModel()),this._onDidDispose.fire(),super.dispose()}invokeWithinContext(X){return this._instantiationService.invokeFunction(X)}updateOptions(X){this._configuration.updateOptions(X||{})}getOptions(){return this._configuration.options}getOption(X){return this._configuration.options.get(X)}getRawOptions(){return this._configuration.getRawOptions()}getOverflowWidgetsDomNode(){return this._overflowWidgetsDomNode}getConfiguredWordAtPosition(X){return this._modelData?C.WordOperations.getWordAtPosition(this._modelData.model,this._configuration.options.get(132),this._configuration.options.get(131),X):null}getValue(X=null){if(!this._modelData)return"";const B=!!(X&&X.preserveBOM);let $=0;return X&&X.lineEnding&&X.lineEnding===` -`?$=1:X&&X.lineEnding&&X.lineEnding===`\r -`&&($=2),this._modelData.model.getValue($,B)}setValue(X){try{if(this._beginUpdate(),!this._modelData)return;this._modelData.model.setValue(X)}finally{this._endUpdate()}}getModel(){return this._modelData?this._modelData.model:null}setModel(X=null){try{this._beginUpdate();const B=X;if(this._modelData===null&&B===null||this._modelData&&this._modelData.model===B)return;const $={oldModelUrl:this._modelData?.model.uri||null,newModelUrl:B?.uri||null};this._onWillChangeModel.fire($);const Q=this.hasTextFocus(),Z=this._detachModel();this._attachModel(B),Q&&this.hasModel()&&this.focus(),this._removeDecorationTypes(),this._onDidChangeModel.fire($),this._postDetachModelCleanup(Z),this._contributionsDisposable=this._contributions.onAfterModelAttached()}finally{this._endUpdate()}}_removeDecorationTypes(){if(this._decorationTypeKeysToIds={},this._decorationTypeSubtypes){for(const X in this._decorationTypeSubtypes){const B=this._decorationTypeSubtypes[X];for(const $ in B)this._removeDecorationType(X+"-"+$)}this._decorationTypeSubtypes={}}}getVisibleRanges(){return this._modelData?this._modelData.viewModel.getVisibleRanges():[]}getVisibleRangesPlusViewportAboveBelow(){return this._modelData?this._modelData.viewModel.getVisibleRangesPlusViewportAboveBelow():[]}getWhitespaces(){return this._modelData?this._modelData.viewModel.viewLayout.getWhitespaces():[]}static _getVerticalOffsetAfterPosition(X,B,$,Q){const Z=X.model.validatePosition({lineNumber:B,column:$}),te=X.viewModel.coordinatesConverter.convertModelPositionToViewPosition(Z);return X.viewModel.viewLayout.getVerticalOffsetAfterLineNumber(te.lineNumber,Q)}getTopForLineNumber(X,B=!1){return this._modelData?H._getVerticalOffsetForPosition(this._modelData,X,1,B):-1}getTopForPosition(X,B){return this._modelData?H._getVerticalOffsetForPosition(this._modelData,X,B,!1):-1}static _getVerticalOffsetForPosition(X,B,$,Q=!1){const Z=X.model.validatePosition({lineNumber:B,column:$}),te=X.viewModel.coordinatesConverter.convertModelPositionToViewPosition(Z);return X.viewModel.viewLayout.getVerticalOffsetForLineNumber(te.lineNumber,Q)}getBottomForLineNumber(X,B=!1){if(!this._modelData)return-1;const $=this._modelData.model.getLineMaxColumn(X);return H._getVerticalOffsetAfterPosition(this._modelData,X,$,B)}setHiddenAreas(X,B){this._modelData?.viewModel.setHiddenAreas(X.map($=>r.Range.lift($)),B)}getVisibleColumnFromPosition(X){if(!this._modelData)return X.column;const B=this._modelData.model.validatePosition(X),$=this._modelData.model.getOptions().tabSize;return c.CursorColumns.visibleColumnFromColumn(this._modelData.model.getLineContent(B.lineNumber),B.column,$)+1}getPosition(){return this._modelData?this._modelData.viewModel.getPosition():null}setPosition(X,B="api"){if(this._modelData){if(!a.Position.isIPosition(X))throw new Error("Invalid arguments");this._modelData.viewModel.setSelections(B,[{selectionStartLineNumber:X.lineNumber,selectionStartColumn:X.column,positionLineNumber:X.lineNumber,positionColumn:X.column}])}}_sendRevealRange(X,B,$,Q){if(!this._modelData)return;if(!r.Range.isIRange(X))throw new Error("Invalid arguments");const Z=this._modelData.model.validateRange(X),te=this._modelData.viewModel.coordinatesConverter.convertModelRangeToViewRange(Z);this._modelData.viewModel.revealRange("api",$,te,B,Q)}revealLine(X,B=0){this._revealLine(X,0,B)}revealLineInCenter(X,B=0){this._revealLine(X,1,B)}revealLineInCenterIfOutsideViewport(X,B=0){this._revealLine(X,2,B)}revealLineNearTop(X,B=0){this._revealLine(X,5,B)}_revealLine(X,B,$){if(typeof X!="number")throw new Error("Invalid arguments");this._sendRevealRange(new r.Range(X,1,X,1),B,!1,$)}revealPosition(X,B=0){this._revealPosition(X,0,!0,B)}revealPositionInCenter(X,B=0){this._revealPosition(X,1,!0,B)}revealPositionInCenterIfOutsideViewport(X,B=0){this._revealPosition(X,2,!0,B)}revealPositionNearTop(X,B=0){this._revealPosition(X,5,!0,B)}_revealPosition(X,B,$,Q){if(!a.Position.isIPosition(X))throw new Error("Invalid arguments");this._sendRevealRange(new r.Range(X.lineNumber,X.column,X.lineNumber,X.column),B,$,Q)}getSelection(){return this._modelData?this._modelData.viewModel.getSelection():null}getSelections(){return this._modelData?this._modelData.viewModel.getSelections():null}setSelection(X,B="api"){const $=u.Selection.isISelection(X),Q=r.Range.isIRange(X);if(!$&&!Q)throw new Error("Invalid arguments");if($)this._setSelectionImpl(X,B);else if(Q){const Z={selectionStartLineNumber:X.startLineNumber,selectionStartColumn:X.startColumn,positionLineNumber:X.endLineNumber,positionColumn:X.endColumn};this._setSelectionImpl(Z,B)}}_setSelectionImpl(X,B){if(!this._modelData)return;const $=new u.Selection(X.selectionStartLineNumber,X.selectionStartColumn,X.positionLineNumber,X.positionColumn);this._modelData.viewModel.setSelections(B,[$])}revealLines(X,B,$=0){this._revealLines(X,B,0,$)}revealLinesInCenter(X,B,$=0){this._revealLines(X,B,1,$)}revealLinesInCenterIfOutsideViewport(X,B,$=0){this._revealLines(X,B,2,$)}revealLinesNearTop(X,B,$=0){this._revealLines(X,B,5,$)}_revealLines(X,B,$,Q){if(typeof X!="number"||typeof B!="number")throw new Error("Invalid arguments");this._sendRevealRange(new r.Range(X,1,B,1),$,!1,Q)}revealRange(X,B=0,$=!1,Q=!0){this._revealRange(X,$?1:0,Q,B)}revealRangeInCenter(X,B=0){this._revealRange(X,1,!0,B)}revealRangeInCenterIfOutsideViewport(X,B=0){this._revealRange(X,2,!0,B)}revealRangeNearTop(X,B=0){this._revealRange(X,5,!0,B)}revealRangeNearTopIfOutsideViewport(X,B=0){this._revealRange(X,6,!0,B)}revealRangeAtTop(X,B=0){this._revealRange(X,3,!0,B)}_revealRange(X,B,$,Q){if(!r.Range.isIRange(X))throw new Error("Invalid arguments");this._sendRevealRange(r.Range.lift(X),B,$,Q)}setSelections(X,B="api",$=0){if(this._modelData){if(!X||X.length===0)throw new Error("Invalid arguments");for(let Q=0,Z=X.length;Q0&&this._modelData.viewModel.restoreCursorState($):this._modelData.viewModel.restoreCursorState([$]),this._contributions.restoreViewState(B.contributionsState||{});const Q=this._modelData.viewModel.reduceRestoreState(B.viewState);this._modelData.view.restoreState(Q)}}handleInitialized(){this._getViewModel()?.visibleLinesStabilized()}getContribution(X){return this._contributions.get(X)}getActions(){return Array.from(this._actions.values())}getSupportedActions(){let X=this.getActions();return X=X.filter(B=>B.isSupported()),X}getAction(X){return this._actions.get(X)||null}trigger(X,B,$){$=$||{};try{switch(this._beginUpdate(),B){case"compositionStart":this._startComposition();return;case"compositionEnd":this._endComposition(X);return;case"type":{const Z=$;this._type(X,Z.text||"");return}case"replacePreviousChar":{const Z=$;this._compositionType(X,Z.text||"",Z.replaceCharCnt||0,0,0);return}case"compositionType":{const Z=$;this._compositionType(X,Z.text||"",Z.replacePrevCharCnt||0,Z.replaceNextCharCnt||0,Z.positionDelta||0);return}case"paste":{const Z=$;this._paste(X,Z.text||"",Z.pasteOnNewLine||!1,Z.multicursorText||null,Z.mode||null,Z.clipboardEvent);return}case"cut":this._cut(X);return}const Q=this.getAction(B);if(Q){Promise.resolve(Q.run($)).then(void 0,k.onUnexpectedError);return}if(!this._modelData||this._triggerEditorCommand(X,B,$))return;this._triggerCommand(B,$)}finally{this._endUpdate()}}_triggerCommand(X,B){this._commandService.executeCommand(X,B)}_startComposition(){this._modelData&&(this._modelData.viewModel.startComposition(),this._onDidCompositionStart.fire())}_endComposition(X){this._modelData&&(this._modelData.viewModel.endComposition(X),this._onDidCompositionEnd.fire())}_type(X,B){!this._modelData||B.length===0||(X==="keyboard"&&this._onWillType.fire(B),this._modelData.viewModel.type(B,X),X==="keyboard"&&this._onDidType.fire(B))}_compositionType(X,B,$,Q,Z){this._modelData&&this._modelData.viewModel.compositionType(B,$,Q,Z,X)}_paste(X,B,$,Q,Z,te){if(!this._modelData)return;const re=this._modelData.viewModel,le=re.getSelection().getStartPosition();re.paste(B,$,Q,X);const me=re.getSelection().getStartPosition();X==="keyboard"&&this._onDidPaste.fire({clipboardEvent:te,range:new r.Range(le.lineNumber,le.column,me.lineNumber,me.column),languageId:Z})}_cut(X){this._modelData&&this._modelData.viewModel.cut(X)}_triggerEditorCommand(X,B,$){const Q=p.EditorExtensionsRegistry.getEditorCommand(B);return Q?($=$||{},$.source=X,this._instantiationService.invokeFunction(Z=>{Promise.resolve(Q.runEditorCommand(Z,this,$)).then(void 0,k.onUnexpectedError)}),!0):!1}_getViewModel(){return this._modelData?this._modelData.viewModel:null}pushUndoStop(){return!this._modelData||this._configuration.options.get(92)?!1:(this._modelData.model.pushStackElement(),!0)}popUndoStop(){return!this._modelData||this._configuration.options.get(92)?!1:(this._modelData.model.popStackElement(),!0)}executeEdits(X,B,$){if(!this._modelData||this._configuration.options.get(92))return!1;let Q;return $?Array.isArray($)?Q=()=>$:Q=$:Q=()=>null,this._modelData.viewModel.executeEdits(X,B,Q),!0}executeCommand(X,B){this._modelData&&this._modelData.viewModel.executeCommand(B,X)}executeCommands(X,B){this._modelData&&this._modelData.viewModel.executeCommands(B,X)}createDecorationsCollection(X){return new ie(this,X)}changeDecorations(X){return this._modelData?this._modelData.model.changeDecorations(X,this._id):null}getLineDecorations(X){return this._modelData?this._modelData.model.getLineDecorations(X,this._id,(0,g.filterValidationDecorations)(this._configuration.options)):null}getDecorationsInRange(X){return this._modelData?this._modelData.model.getDecorationsInRange(X,this._id,(0,g.filterValidationDecorations)(this._configuration.options)):null}deltaDecorations(X,B){return this._modelData?X.length===0&&B.length===0?X:this._modelData.model.deltaDecorations(X,B,this._id):[]}removeDecorations(X){!this._modelData||X.length===0||this._modelData.model.changeDecorations(B=>{B.deltaDecorations(X,[])})}removeDecorationsByType(X){const B=this._decorationTypeKeysToIds[X];B&&this.changeDecorations($=>$.deltaDecorations(B,[])),this._decorationTypeKeysToIds.hasOwnProperty(X)&&delete this._decorationTypeKeysToIds[X],this._decorationTypeSubtypes.hasOwnProperty(X)&&delete this._decorationTypeSubtypes[X]}getLayoutInfo(){return this._configuration.options.get(146)}createOverviewRuler(X){return!this._modelData||!this._modelData.hasRealView?null:this._modelData.view.createOverviewRuler(X)}getContainerDomNode(){return this._domElement}getDomNode(){return!this._modelData||!this._modelData.hasRealView?null:this._modelData.view.domNode.domNode}delegateVerticalScrollbarPointerDown(X){!this._modelData||!this._modelData.hasRealView||this._modelData.view.delegateVerticalScrollbarPointerDown(X)}delegateScrollFromMouseWheelEvent(X){!this._modelData||!this._modelData.hasRealView||this._modelData.view.delegateScrollFromMouseWheelEvent(X)}layout(X,B=!1){this._configuration.observeContainer(X),B||this.render()}focus(){!this._modelData||!this._modelData.hasRealView||this._modelData.view.focus()}hasTextFocus(){return!this._modelData||!this._modelData.hasRealView?!1:this._modelData.view.isFocused()}hasWidgetFocus(){return this._focusTracker&&this._focusTracker.hasFocus()}addContentWidget(X){const B={widget:X,position:X.getPosition()};this._contentWidgets.hasOwnProperty(X.getId())&&console.warn("Overwriting a content widget with the same id:"+X.getId()),this._contentWidgets[X.getId()]=B,this._modelData&&this._modelData.hasRealView&&this._modelData.view.addContentWidget(B)}layoutContentWidget(X){const B=X.getId();if(this._contentWidgets.hasOwnProperty(B)){const $=this._contentWidgets[B];$.position=X.getPosition(),this._modelData&&this._modelData.hasRealView&&this._modelData.view.layoutContentWidget($)}}removeContentWidget(X){const B=X.getId();if(this._contentWidgets.hasOwnProperty(B)){const $=this._contentWidgets[B];delete this._contentWidgets[B],this._modelData&&this._modelData.hasRealView&&this._modelData.view.removeContentWidget($)}}addOverlayWidget(X){const B={widget:X,position:X.getPosition()};this._overlayWidgets.hasOwnProperty(X.getId())&&console.warn("Overwriting an overlay widget with the same id."),this._overlayWidgets[X.getId()]=B,this._modelData&&this._modelData.hasRealView&&this._modelData.view.addOverlayWidget(B)}layoutOverlayWidget(X){const B=X.getId();if(this._overlayWidgets.hasOwnProperty(B)){const $=this._overlayWidgets[B];$.position=X.getPosition(),this._modelData&&this._modelData.hasRealView&&this._modelData.view.layoutOverlayWidget($)}}removeOverlayWidget(X){const B=X.getId();if(this._overlayWidgets.hasOwnProperty(B)){const $=this._overlayWidgets[B];delete this._overlayWidgets[B],this._modelData&&this._modelData.hasRealView&&this._modelData.view.removeOverlayWidget($)}}addGlyphMarginWidget(X){const B={widget:X,position:X.getPosition()};this._glyphMarginWidgets.hasOwnProperty(X.getId())&&console.warn("Overwriting a glyph margin widget with the same id."),this._glyphMarginWidgets[X.getId()]=B,this._modelData&&this._modelData.hasRealView&&this._modelData.view.addGlyphMarginWidget(B)}layoutGlyphMarginWidget(X){const B=X.getId();if(this._glyphMarginWidgets.hasOwnProperty(B)){const $=this._glyphMarginWidgets[B];$.position=X.getPosition(),this._modelData&&this._modelData.hasRealView&&this._modelData.view.layoutGlyphMarginWidget($)}}removeGlyphMarginWidget(X){const B=X.getId();if(this._glyphMarginWidgets.hasOwnProperty(B)){const $=this._glyphMarginWidgets[B];delete this._glyphMarginWidgets[B],this._modelData&&this._modelData.hasRealView&&this._modelData.view.removeGlyphMarginWidget($)}}changeViewZones(X){!this._modelData||!this._modelData.hasRealView||this._modelData.view.change(X)}getTargetAtClientPoint(X,B){return!this._modelData||!this._modelData.hasRealView?null:this._modelData.view.getTargetAtClientPoint(X,B)}getScrolledVisiblePosition(X){if(!this._modelData||!this._modelData.hasRealView)return null;const B=this._modelData.model.validatePosition(X),$=this._configuration.options,Q=$.get(146),Z=H._getVerticalOffsetForPosition(this._modelData,B.lineNumber,B.column)-this.getScrollTop(),te=this._modelData.view.getOffsetForColumn(B.lineNumber,B.column)+Q.glyphMarginWidth+Q.lineNumbersWidth+Q.decorationsWidth-this.getScrollLeft();return{top:Z,left:te,height:$.get(67)}}getOffsetForColumn(X,B){return!this._modelData||!this._modelData.hasRealView?-1:this._modelData.view.getOffsetForColumn(X,B)}render(X=!1){!this._modelData||!this._modelData.hasRealView||this._modelData.viewModel.batchEvents(()=>{this._modelData.view.render(!0,X)})}setAriaOptions(X){!this._modelData||!this._modelData.hasRealView||this._modelData.view.setAriaOptions(X)}applyFontInfo(X){(0,m.applyFontInfo)(X,this._configuration.options.get(50))}setBanner(X,B){this._bannerDomNode&&this._domElement.contains(this._bannerDomNode)&&this._bannerDomNode.remove(),this._bannerDomNode=X,this._configuration.setReservedHeight(X?B:0),this._bannerDomNode&&this._domElement.prepend(this._bannerDomNode)}_attachModel(X){if(!X){this._modelData=null;return}const B=[];this._domElement.setAttribute("data-mode-id",X.getLanguageId()),this._configuration.setIsDominatedByLongLines(X.isDominatedByLongLines()),this._configuration.setModelLineCount(X.getLineCount());const $=X.onBeforeAttached(),Q=new T.ViewModel(this._id,this._configuration,X,t.DOMLineBreaksComputerFactory.create(d.getWindow(this._domElement)),D.MonospaceLineBreaksComputerFactory.create(this._configuration.options),re=>d.scheduleAtNextAnimationFrame(d.getWindow(this._domElement),re),this.languageConfigurationService,this._themeService,$,{batchChanges:re=>{try{return this._beginUpdate(),re()}finally{this._endUpdate()}}});B.push(X.onWillDispose(()=>this.setModel(null))),B.push(Q.onEvent(re=>{switch(re.kind){case 0:this._onDidContentSizeChange.fire(re);break;case 1:this._editorTextFocus.setValue(re.hasFocus);break;case 2:this._onDidScrollChange.fire(re);break;case 3:this._onDidChangeViewZones.fire();break;case 4:this._onDidChangeHiddenAreas.fire();break;case 5:this._onDidAttemptReadOnlyEdit.fire();break;case 6:{if(re.reachedMaxCursorCount){const ye=this.getOption(80),Le=M.localize(70,"The number of cursors has been limited to {0}. Consider using [find and replace](https://code.visualstudio.com/docs/editor/codebasics#_find-and-replace) for larger changes or increase the editor multi cursor limit setting.",ye);this._notificationService.prompt(x.Severity.Warning,Le,[{label:"Find and Replace",run:()=>{this._commandService.executeCommand("editor.action.startFindReplaceAction")}},{label:M.localize(71,"Increase Multi Cursor Limit"),run:()=>{this._commandService.executeCommand("workbench.action.openSettings2",{query:"editor.multiCursorLimit"})}}])}const le=[];for(let ye=0,Le=re.selections.length;ye{this._paste("keyboard",Z,te,re,le)},type:Z=>{this._type("keyboard",Z)},compositionType:(Z,te,re,le)=>{this._compositionType("keyboard",Z,te,re,le)},startComposition:()=>{this._startComposition()},endComposition:()=>{this._endComposition("keyboard")},cut:()=>{this._cut("keyboard")}}:B={paste:(Z,te,re,le)=>{const me={text:Z,pasteOnNewLine:te,multicursorText:re,mode:le};this._commandService.executeCommand("paste",me)},type:Z=>{const te={text:Z};this._commandService.executeCommand("type",te)},compositionType:(Z,te,re,le)=>{if(re||le){const me={text:Z,replacePrevCharCnt:te,replaceNextCharCnt:re,positionDelta:le};this._commandService.executeCommand("compositionType",me)}else{const me={text:Z,replaceCharCnt:te};this._commandService.executeCommand("replacePreviousChar",me)}},startComposition:()=>{this._commandService.executeCommand("compositionStart",{})},endComposition:()=>{this._commandService.executeCommand("compositionEnd",{})},cut:()=>{this._commandService.executeCommand("cut",{})}};const $=new i.ViewUserInputEvents(X.coordinatesConverter);return $.onKeyDown=Z=>this._onKeyDown.fire(Z),$.onKeyUp=Z=>this._onKeyUp.fire(Z),$.onContextMenu=Z=>this._onContextMenu.fire(Z),$.onMouseMove=Z=>this._onMouseMove.fire(Z),$.onMouseLeave=Z=>this._onMouseLeave.fire(Z),$.onMouseDown=Z=>this._onMouseDown.fire(Z),$.onMouseUp=Z=>this._onMouseUp.fire(Z),$.onMouseDrag=Z=>this._onMouseDrag.fire(Z),$.onMouseDrop=Z=>this._onMouseDrop.fire(Z),$.onMouseDropCanceled=Z=>this._onMouseDropCanceled.fire(Z),$.onMouseWheel=Z=>this._onMouseWheel.fire(Z),[new o.View(B,this._configuration,this._themeService.getColorTheme(),X,$,this._overflowWidgetsDomNode,this._instantiationService),!0]}_postDetachModelCleanup(X){X?.removeAllDecorationsWithOwnerId(this._id)}_detachModel(){if(this._contributionsDisposable?.dispose(),this._contributionsDisposable=void 0,!this._modelData)return null;const X=this._modelData.model,B=this._modelData.hasRealView?this._modelData.view.domNode.domNode:null;return this._modelData.dispose(),this._modelData=null,this._domElement.removeAttribute("data-mode-id"),B&&this._domElement.contains(B)&&B.remove(),this._bannerDomNode&&this._domElement.contains(this._bannerDomNode)&&this._bannerDomNode.remove(),X}_removeDecorationType(X){this._codeEditorService.removeDecorationType(X)}hasModel(){return this._modelData!==null}showDropIndicatorAt(X){const B=[{range:new r.Range(X.lineNumber,X.column,X.lineNumber,X.column),options:H.dropIntoEditorDecorationOptions}];this._dropIntoEditorDecorations.set(B),this.revealPosition(X,1)}removeDropIndicator(){this._dropIntoEditorDecorations.clear()}setContextValue(X,B){this._contextKeyService.createKey(X,B)}_beginUpdate(){this._updateCounter++,this._updateCounter===1&&this._onBeginUpdate.fire()}_endUpdate(){this._updateCounter--,this._updateCounter===0&&this._onEndUpdate.fire()}};e.CodeEditorWidget=z,e.CodeEditorWidget=z=H=ke([ce(3,O.IInstantiationService),ce(4,n.ICodeEditorService),ce(5,P.ICommandService),ce(6,N.IContextKeyService),ce(7,V.IThemeService),ce(8,x.INotificationService),ce(9,A.IAccessibilityService),ce(10,w.ILanguageConfigurationService),ce(11,L.ILanguageFeaturesService)],z);let U=0;class j{constructor(X,B,$,Q,Z,te){this.model=X,this.viewModel=B,this.view=$,this.hasRealView=Q,this.listenersToRemove=Z,this.attachedView=te}dispose(){(0,E.dispose)(this.listenersToRemove),this.model.onBeforeDetached(this.attachedView),this.hasRealView&&this.view.dispose(),this.viewModel.dispose()}}class Y extends E.Disposable{constructor(X){super(),this._emitterOptions=X,this._onDidChangeToTrue=this._register(new I.Emitter(this._emitterOptions)),this.onDidChangeToTrue=this._onDidChangeToTrue.event,this._onDidChangeToFalse=this._register(new I.Emitter(this._emitterOptions)),this.onDidChangeToFalse=this._onDidChangeToFalse.event,this._value=0}setValue(X){const B=X?2:1;this._value!==B&&(this._value=B,this._value===2?this._onDidChangeToTrue.fire():this._value===1&&this._onDidChangeToFalse.fire())}}e.BooleanEventEmitter=Y;class G extends I.Emitter{constructor(X,B){super({deliveryQueue:B}),this._contributions=X}fire(X){this._contributions.onBeforeInteractionEvent(),super.fire(X)}}class K extends E.Disposable{constructor(X,B){super(),this._editor=X,B.createKey("editorId",X.getId()),this._editorSimpleInput=v.EditorContextKeys.editorSimpleInput.bindTo(B),this._editorFocus=v.EditorContextKeys.focus.bindTo(B),this._textInputFocus=v.EditorContextKeys.textInputFocus.bindTo(B),this._editorTextFocus=v.EditorContextKeys.editorTextFocus.bindTo(B),this._tabMovesFocus=v.EditorContextKeys.tabMovesFocus.bindTo(B),this._editorReadonly=v.EditorContextKeys.readOnly.bindTo(B),this._inDiffEditor=v.EditorContextKeys.inDiffEditor.bindTo(B),this._editorColumnSelection=v.EditorContextKeys.columnSelection.bindTo(B),this._hasMultipleSelections=v.EditorContextKeys.hasMultipleSelections.bindTo(B),this._hasNonEmptySelection=v.EditorContextKeys.hasNonEmptySelection.bindTo(B),this._canUndo=v.EditorContextKeys.canUndo.bindTo(B),this._canRedo=v.EditorContextKeys.canRedo.bindTo(B),this._register(this._editor.onDidChangeConfiguration(()=>this._updateFromConfig())),this._register(this._editor.onDidChangeCursorSelection(()=>this._updateFromSelection())),this._register(this._editor.onDidFocusEditorWidget(()=>this._updateFromFocus())),this._register(this._editor.onDidBlurEditorWidget(()=>this._updateFromFocus())),this._register(this._editor.onDidFocusEditorText(()=>this._updateFromFocus())),this._register(this._editor.onDidBlurEditorText(()=>this._updateFromFocus())),this._register(this._editor.onDidChangeModel(()=>this._updateFromModel())),this._register(this._editor.onDidChangeConfiguration(()=>this._updateFromModel())),this._register(b.TabFocus.onDidChangeTabFocus($=>this._tabMovesFocus.set($))),this._updateFromConfig(),this._updateFromSelection(),this._updateFromFocus(),this._updateFromModel(),this._editorSimpleInput.set(this._editor.isSimpleWidget)}_updateFromConfig(){const X=this._editor.getOptions();this._tabMovesFocus.set(b.TabFocus.getTabFocusMode()),this._editorReadonly.set(X.get(92)),this._inDiffEditor.set(X.get(61)),this._editorColumnSelection.set(X.get(22))}_updateFromSelection(){const X=this._editor.getSelections();X?(this._hasMultipleSelections.set(X.length>1),this._hasNonEmptySelection.set(X.some(B=>!B.isEmpty()))):(this._hasMultipleSelections.reset(),this._hasNonEmptySelection.reset())}_updateFromFocus(){this._editorFocus.set(this._editor.hasWidgetFocus()&&!this._editor.isSimpleWidget),this._editorTextFocus.set(this._editor.hasTextFocus()&&!this._editor.isSimpleWidget),this._textInputFocus.set(this._editor.hasTextFocus())}_updateFromModel(){const X=this._editor.getModel();this._canUndo.set(!!(X&&X.canUndo())),this._canRedo.set(!!(X&&X.canRedo()))}}class R extends E.Disposable{constructor(X,B,$){super(),this._editor=X,this._contextKeyService=B,this._languageFeaturesService=$,this._langId=v.EditorContextKeys.languageId.bindTo(B),this._hasCompletionItemProvider=v.EditorContextKeys.hasCompletionItemProvider.bindTo(B),this._hasCodeActionsProvider=v.EditorContextKeys.hasCodeActionsProvider.bindTo(B),this._hasCodeLensProvider=v.EditorContextKeys.hasCodeLensProvider.bindTo(B),this._hasDefinitionProvider=v.EditorContextKeys.hasDefinitionProvider.bindTo(B),this._hasDeclarationProvider=v.EditorContextKeys.hasDeclarationProvider.bindTo(B),this._hasImplementationProvider=v.EditorContextKeys.hasImplementationProvider.bindTo(B),this._hasTypeDefinitionProvider=v.EditorContextKeys.hasTypeDefinitionProvider.bindTo(B),this._hasHoverProvider=v.EditorContextKeys.hasHoverProvider.bindTo(B),this._hasDocumentHighlightProvider=v.EditorContextKeys.hasDocumentHighlightProvider.bindTo(B),this._hasDocumentSymbolProvider=v.EditorContextKeys.hasDocumentSymbolProvider.bindTo(B),this._hasReferenceProvider=v.EditorContextKeys.hasReferenceProvider.bindTo(B),this._hasRenameProvider=v.EditorContextKeys.hasRenameProvider.bindTo(B),this._hasSignatureHelpProvider=v.EditorContextKeys.hasSignatureHelpProvider.bindTo(B),this._hasInlayHintsProvider=v.EditorContextKeys.hasInlayHintsProvider.bindTo(B),this._hasDocumentFormattingProvider=v.EditorContextKeys.hasDocumentFormattingProvider.bindTo(B),this._hasDocumentSelectionFormattingProvider=v.EditorContextKeys.hasDocumentSelectionFormattingProvider.bindTo(B),this._hasMultipleDocumentFormattingProvider=v.EditorContextKeys.hasMultipleDocumentFormattingProvider.bindTo(B),this._hasMultipleDocumentSelectionFormattingProvider=v.EditorContextKeys.hasMultipleDocumentSelectionFormattingProvider.bindTo(B),this._isInEmbeddedEditor=v.EditorContextKeys.isInEmbeddedEditor.bindTo(B);const Q=()=>this._update();this._register(X.onDidChangeModel(Q)),this._register(X.onDidChangeModelLanguage(Q)),this._register($.completionProvider.onDidChange(Q)),this._register($.codeActionProvider.onDidChange(Q)),this._register($.codeLensProvider.onDidChange(Q)),this._register($.definitionProvider.onDidChange(Q)),this._register($.declarationProvider.onDidChange(Q)),this._register($.implementationProvider.onDidChange(Q)),this._register($.typeDefinitionProvider.onDidChange(Q)),this._register($.hoverProvider.onDidChange(Q)),this._register($.documentHighlightProvider.onDidChange(Q)),this._register($.documentSymbolProvider.onDidChange(Q)),this._register($.referenceProvider.onDidChange(Q)),this._register($.renameProvider.onDidChange(Q)),this._register($.documentFormattingEditProvider.onDidChange(Q)),this._register($.documentRangeFormattingEditProvider.onDidChange(Q)),this._register($.signatureHelpProvider.onDidChange(Q)),this._register($.inlayHintsProvider.onDidChange(Q)),Q()}dispose(){super.dispose()}reset(){this._contextKeyService.bufferChangeEvents(()=>{this._langId.reset(),this._hasCompletionItemProvider.reset(),this._hasCodeActionsProvider.reset(),this._hasCodeLensProvider.reset(),this._hasDefinitionProvider.reset(),this._hasDeclarationProvider.reset(),this._hasImplementationProvider.reset(),this._hasTypeDefinitionProvider.reset(),this._hasHoverProvider.reset(),this._hasDocumentHighlightProvider.reset(),this._hasDocumentSymbolProvider.reset(),this._hasReferenceProvider.reset(),this._hasRenameProvider.reset(),this._hasDocumentFormattingProvider.reset(),this._hasDocumentSelectionFormattingProvider.reset(),this._hasSignatureHelpProvider.reset(),this._isInEmbeddedEditor.reset()})}_update(){const X=this._editor.getModel();if(!X){this.reset();return}this._contextKeyService.bufferChangeEvents(()=>{this._langId.set(X.getLanguageId()),this._hasCompletionItemProvider.set(this._languageFeaturesService.completionProvider.has(X)),this._hasCodeActionsProvider.set(this._languageFeaturesService.codeActionProvider.has(X)),this._hasCodeLensProvider.set(this._languageFeaturesService.codeLensProvider.has(X)),this._hasDefinitionProvider.set(this._languageFeaturesService.definitionProvider.has(X)),this._hasDeclarationProvider.set(this._languageFeaturesService.declarationProvider.has(X)),this._hasImplementationProvider.set(this._languageFeaturesService.implementationProvider.has(X)),this._hasTypeDefinitionProvider.set(this._languageFeaturesService.typeDefinitionProvider.has(X)),this._hasHoverProvider.set(this._languageFeaturesService.hoverProvider.has(X)),this._hasDocumentHighlightProvider.set(this._languageFeaturesService.documentHighlightProvider.has(X)),this._hasDocumentSymbolProvider.set(this._languageFeaturesService.documentSymbolProvider.has(X)),this._hasReferenceProvider.set(this._languageFeaturesService.referenceProvider.has(X)),this._hasRenameProvider.set(this._languageFeaturesService.renameProvider.has(X)),this._hasSignatureHelpProvider.set(this._languageFeaturesService.signatureHelpProvider.has(X)),this._hasInlayHintsProvider.set(this._languageFeaturesService.inlayHintsProvider.has(X)),this._hasDocumentFormattingProvider.set(this._languageFeaturesService.documentFormattingEditProvider.has(X)||this._languageFeaturesService.documentRangeFormattingEditProvider.has(X)),this._hasDocumentSelectionFormattingProvider.set(this._languageFeaturesService.documentRangeFormattingEditProvider.has(X)),this._hasMultipleDocumentFormattingProvider.set(this._languageFeaturesService.documentFormattingEditProvider.all(X).length+this._languageFeaturesService.documentRangeFormattingEditProvider.all(X).length>1),this._hasMultipleDocumentSelectionFormattingProvider.set(this._languageFeaturesService.documentRangeFormattingEditProvider.all(X).length>1),this._isInEmbeddedEditor.set(X.uri.scheme===y.Schemas.walkThroughSnippet||X.uri.scheme===y.Schemas.vscodeChatCodeBlock)})}}e.EditorModeContext=R;class J extends E.Disposable{constructor(X,B){super(),this._onChange=this._register(new I.Emitter),this.onChange=this._onChange.event,this._hadFocus=void 0,this._hasDomElementFocus=!1,this._domFocusTracker=this._register(d.trackFocus(X)),this._overflowWidgetsDomNodeHasFocus=!1,this._register(this._domFocusTracker.onDidFocus(()=>{this._hasDomElementFocus=!0,this._update()})),this._register(this._domFocusTracker.onDidBlur(()=>{this._hasDomElementFocus=!1,this._update()})),B&&(this._overflowWidgetsDomNode=this._register(d.trackFocus(B)),this._register(this._overflowWidgetsDomNode.onDidFocus(()=>{this._overflowWidgetsDomNodeHasFocus=!0,this._update()})),this._register(this._overflowWidgetsDomNode.onDidBlur(()=>{this._overflowWidgetsDomNodeHasFocus=!1,this._update()})))}_update(){const X=this._hasDomElementFocus||this._overflowWidgetsDomNodeHasFocus;this._hadFocus!==X&&(this._hadFocus=X,this._onChange.fire(void 0))}hasFocus(){return this._hadFocus??!1}}class ie{get length(){return this._decorationIds.length}constructor(X,B){this._editor=X,this._decorationIds=[],this._isChangingDecorations=!1,Array.isArray(B)&&B.length>0&&this.set(B)}onDidChange(X,B,$){return this._editor.onDidChangeModelDecorations(Q=>{this._isChangingDecorations||X.call(B,Q)},$)}getRange(X){return!this._editor.hasModel()||X>=this._decorationIds.length?null:this._editor.getModel().getDecorationRange(this._decorationIds[X])}getRanges(){if(!this._editor.hasModel())return[];const X=this._editor.getModel(),B=[];for(const $ of this._decorationIds){const Q=X.getDecorationRange($);Q&&B.push(Q)}return B}has(X){return this._decorationIds.includes(X.id)}clear(){this._decorationIds.length!==0&&this.set([])}set(X){try{this._isChangingDecorations=!0,this._editor.changeDecorations(B=>{this._decorationIds=B.deltaDecorations(this._decorationIds,X)})}finally{this._isChangingDecorations=!1}return this._decorationIds}append(X){let B=[];try{this._isChangingDecorations=!0,this._editor.changeDecorations($=>{B=$.deltaDecorations([],X),this._decorationIds=this._decorationIds.concat(B)})}finally{this._isChangingDecorations=!1}return B}}const ue=encodeURIComponent("");function pe(ge){return ue+encodeURIComponent(ge.toString())+he}const ae=encodeURIComponent('');function de(ge){return ae+encodeURIComponent(ge.toString())+ee}(0,V.registerThemingParticipant)((ge,X)=>{const B=ge.getColor(W.editorErrorForeground);B&&X.addRule(`.monaco-editor .squiggly-error { background: url("data:image/svg+xml,${pe(B)}") repeat-x bottom left; }`);const $=ge.getColor(W.editorWarningForeground);$&&X.addRule(`.monaco-editor .squiggly-warning { background: url("data:image/svg+xml,${pe($)}") repeat-x bottom left; }`);const Q=ge.getColor(W.editorInfoForeground);Q&&X.addRule(`.monaco-editor .squiggly-info { background: url("data:image/svg+xml,${pe(Q)}") repeat-x bottom left; }`);const Z=ge.getColor(W.editorHintForeground);Z&&X.addRule(`.monaco-editor .squiggly-hint { background: url("data:image/svg+xml,${de(Z)}") no-repeat bottom left; }`);const te=ge.getColor(l.editorUnnecessaryCodeOpacity);te&&X.addRule(`.monaco-editor.showUnused .squiggly-inline-unnecessary { opacity: ${te.rgba.a}; }`)})}),define(ne[125],se([1,0,60,34,219,36,17,61,24,12,7,50,25]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EmbeddedCodeEditorWidget=void 0;let t=class extends I.CodeEditorWidget{constructor(s,g,c,l,a,r,u,C,f,h,v,w,S){super(s,{...l.getRawOptions(),overflowWidgetsDomNode:l.getOverflowWidgetsDomNode()},c,a,r,u,C,f,h,v,w,S),this._parentEditor=l,this._overwriteOptions=g,super.updateOptions(this._overwriteOptions),this._register(l.onDidChangeConfiguration(L=>this._onParentConfigurationChanged(L)))}getParentEditor(){return this._parentEditor}_onParentConfigurationChanged(s){super.updateOptions(this._parentEditor.getRawOptions()),super.updateOptions(this._overwriteOptions)}updateOptions(s){d.mixin(this._overwriteOptions,s,!0),super.updateOptions(this._overwriteOptions)}};e.EmbeddedCodeEditorWidget=t,e.EmbeddedCodeEditorWidget=t=ke([ce(4,p.IInstantiationService),ce(5,k.ICodeEditorService),ce(6,_.ICommandService),ce(7,b.IContextKeyService),ce(8,o.IThemeService),ce(9,n.INotificationService),ce(10,m.IAccessibilityService),ce(11,E.ILanguageConfigurationService),ce(12,y.ILanguageFeaturesService)],t)}),define(ne[286],se([1,0,5,67,8,6,2,21,65,15,34,143,219,762,806,363,285,799,383,364,415,653,88,171,397,9,4,198,20,137,12,7,154,96,775,552,807,407,500]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S,L,D,T,M,A,P,N,O,F,x){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffEditorWidget=void 0;let W=class extends O.DelegatingEditor{get onDidContentSizeChange(){return this._editors.onDidContentSizeChange}constructor(H,z,U,j,Y,G,K,R){super(),this._domElement=H,this._parentContextKeyService=j,this._parentInstantiationService=Y,this._accessibilitySignalService=K,this._editorProgressService=R,this.elements=(0,d.h)("div.monaco-diff-editor.side-by-side",{style:{position:"relative",height:"100%"}},[(0,d.h)("div.editor.original@original",{style:{position:"absolute",height:"100%"}}),(0,d.h)("div.editor.modified@modified",{style:{position:"absolute",height:"100%"}}),(0,d.h)("div.accessibleDiffViewer@accessibleDiffViewer",{style:{position:"absolute",height:"100%"}})]),this._diffModelSrc=this._register((0,m.disposableObservableValue)(this,void 0)),this._diffModel=(0,m.derived)(this,$=>this._diffModelSrc.read($)?.object),this.onDidChangeModel=E.Event.fromObservableLight(this._diffModel),this._contextKeyService=this._register(this._parentContextKeyService.createScoped(this._domElement)),this._instantiationService=this._register(this._parentInstantiationService.createChild(new A.ServiceCollection([T.IContextKeyService,this._contextKeyService]))),this._boundarySashes=(0,m.observableValue)(this,void 0),this._accessibleDiffViewerShouldBeVisible=(0,m.observableValue)(this,!1),this._accessibleDiffViewerVisible=(0,m.derived)(this,$=>this._options.onlyShowAccessibleDiffViewer.read($)?!0:this._accessibleDiffViewerShouldBeVisible.read($)),this._movedBlocksLinesPart=(0,m.observableValue)(this,void 0),this._layoutInfo=(0,m.derived)(this,$=>{const Q=this._rootSizeObserver.width.read($),Z=this._rootSizeObserver.height.read($);this._rootSizeObserver.automaticLayout?this.elements.root.style.height="100%":this.elements.root.style.height=Z+"px";const te=this._sash.read($),re=this._gutter.read($),le=re?.width.read($)??0,me=this._overviewRulerPart.read($)?.width??0;let Ce,ye,Le,Ee,Me;if(!!te){const Ne=te.sashLeft.read($),Ke=this._movedBlocksLinesPart.read($)?.width.read($)??0;Ce=0,ye=Ne-le-Ke,Me=Ne-le,Le=Ne,Ee=Q-Le-me}else{Me=0;const Ne=this._options.inlineViewHideOriginalLineNumbers.read($);Ce=le,Ne?ye=0:ye=Math.max(5,this._editors.originalObs.layoutInfoDecorationsLeft.read($)),Le=le+ye,Ee=Q-Le-me}return this.elements.original.style.left=Ce+"px",this.elements.original.style.width=ye+"px",this._editors.original.layout({width:ye,height:Z},!0),re?.layout(Me),this.elements.modified.style.left=Le+"px",this.elements.modified.style.width=Ee+"px",this._editors.modified.layout({width:Ee,height:Z},!0),{modifiedEditor:this._editors.modified.getLayoutInfo(),originalEditor:this._editors.original.getLayoutInfo()}}),this._diffValue=this._diffModel.map(($,Q)=>$?.diff.read(Q)),this.onDidUpdateDiff=E.Event.fromObservableLight(this._diffValue),G.willCreateDiffEditor(),this._contextKeyService.createKey("isInDiffEditor",!0),this._domElement.appendChild(this.elements.root),this._register((0,y.toDisposable)(()=>this.elements.root.remove())),this._rootSizeObserver=this._register(new C.ObservableElementSizeObserver(this.elements.root,z.dimension)),this._rootSizeObserver.setAutomaticLayout(z.automaticLayout??!1),this._options=this._instantiationService.createInstance(F.DiffEditorOptions,z),this._register((0,m.autorun)($=>{this._options.setWidth(this._rootSizeObserver.width.read($))})),this._contextKeyService.createKey(L.EditorContextKeys.isEmbeddedDiffEditor.key,!1),this._register((0,h.bindContextKey)(L.EditorContextKeys.isEmbeddedDiffEditor,this._contextKeyService,$=>this._options.isInEmbeddedEditor.read($))),this._register((0,h.bindContextKey)(L.EditorContextKeys.comparingMovedCode,this._contextKeyService,$=>!!this._diffModel.read($)?.movedTextToCompare.read($))),this._register((0,h.bindContextKey)(L.EditorContextKeys.diffEditorRenderSideBySideInlineBreakpointReached,this._contextKeyService,$=>this._options.couldShowInlineViewBecauseOfSize.read($))),this._register((0,h.bindContextKey)(L.EditorContextKeys.diffEditorInlineMode,this._contextKeyService,$=>!this._options.renderSideBySide.read($))),this._register((0,h.bindContextKey)(L.EditorContextKeys.hasChanges,this._contextKeyService,$=>(this._diffModel.read($)?.diff.read($)?.mappings.length??0)>0)),this._editors=this._register(this._instantiationService.createInstance(N.DiffEditorEditors,this.elements.original,this.elements.modified,this._options,U,($,Q,Z,te)=>this._createInnerEditor($,Q,Z,te))),this._register((0,h.bindContextKey)(L.EditorContextKeys.diffEditorOriginalWritable,this._contextKeyService,$=>this._options.originalEditable.read($))),this._register((0,h.bindContextKey)(L.EditorContextKeys.diffEditorModifiedWritable,this._contextKeyService,$=>!this._options.readOnly.read($))),this._register((0,h.bindContextKey)(L.EditorContextKeys.diffEditorOriginalUri,this._contextKeyService,$=>this._diffModel.read($)?.model.original.uri.toString()??"")),this._register((0,h.bindContextKey)(L.EditorContextKeys.diffEditorModifiedUri,this._contextKeyService,$=>this._diffModel.read($)?.model.modified.uri.toString()??"")),this._overviewRulerPart=(0,_.derivedDisposable)(this,$=>this._options.renderOverviewRuler.read($)?this._instantiationService.createInstance((0,f.readHotReloadableExport)(r.OverviewRulerFeature,$),this._editors,this.elements.root,this._diffModel,this._rootSizeObserver.width,this._rootSizeObserver.height,this._layoutInfo.map(Q=>Q.modifiedEditor)):void 0).recomputeInitiallyAndOnChange(this._store);const J={height:this._rootSizeObserver.height,width:this._rootSizeObserver.width.map(($,Q)=>$-(this._overviewRulerPart.read(Q)?.width??0))};this._sashLayout=new s.SashLayout(this._options,J),this._sash=(0,_.derivedDisposable)(this,$=>{const Q=this._options.renderSideBySide.read($);return this.elements.root.classList.toggle("side-by-side",Q),Q?new s.DiffEditorSash(this.elements.root,J,this._options.enableSplitViewResizing,this._boundarySashes,this._sashLayout.sashLeft,()=>this._sashLayout.resetSash()):void 0}).recomputeInitiallyAndOnChange(this._store);const ie=(0,_.derivedDisposable)(this,$=>this._instantiationService.createInstance((0,f.readHotReloadableExport)(l.HideUnchangedRegionsFeature,$),this._editors,this._diffModel,this._options)).recomputeInitiallyAndOnChange(this._store);(0,_.derivedDisposable)(this,$=>this._instantiationService.createInstance((0,f.readHotReloadableExport)(i.DiffEditorDecorations,$),this._editors,this._diffModel,this._options,this)).recomputeInitiallyAndOnChange(this._store);const ue=new Set,he=new Set;let pe=!1;const ae=(0,_.derivedDisposable)(this,$=>this._instantiationService.createInstance((0,f.readHotReloadableExport)(g.DiffEditorViewZones,$),(0,d.getWindow)(this._domElement),this._editors,this._diffModel,this._options,this,()=>pe||ie.get().isUpdatingHiddenAreas,ue,he)).recomputeInitiallyAndOnChange(this._store),ee=(0,m.derived)(this,$=>{const Q=ae.read($).viewZones.read($).orig,Z=ie.read($).viewZones.read($).origViewZones;return Q.concat(Z)}),de=(0,m.derived)(this,$=>{const Q=ae.read($).viewZones.read($).mod,Z=ie.read($).viewZones.read($).modViewZones;return Q.concat(Z)});this._register((0,C.applyViewZones)(this._editors.original,ee,$=>{pe=$},ue));let ge;this._register((0,C.applyViewZones)(this._editors.modified,de,$=>{pe=$,pe?ge=n.StableEditorScrollState.capture(this._editors.modified):(ge?.restore(this._editors.modified),ge=void 0)},he)),this._accessibleDiffViewer=(0,_.derivedDisposable)(this,$=>this._instantiationService.createInstance((0,f.readHotReloadableExport)(t.AccessibleDiffViewer,$),this.elements.accessibleDiffViewer,this._accessibleDiffViewerVisible,(Q,Z)=>this._accessibleDiffViewerShouldBeVisible.set(Q,Z),this._options.onlyShowAccessibleDiffViewer.map(Q=>!Q),this._rootSizeObserver.width,this._rootSizeObserver.height,this._diffModel.map((Q,Z)=>Q?.diff.read(Z)?.mappings.map(te=>te.lineRangeMapping)),new t.AccessibleDiffViewerModelFromEditors(this._editors))).recomputeInitiallyAndOnChange(this._store);const X=this._accessibleDiffViewerVisible.map($=>$?"hidden":"visible");this._register((0,C.applyStyle)(this.elements.modified,{visibility:X})),this._register((0,C.applyStyle)(this.elements.original,{visibility:X})),this._createDiffEditorContributions(),G.addDiffEditor(this),this._gutter=(0,_.derivedDisposable)(this,$=>this._options.shouldRenderGutterMenu.read($)?this._instantiationService.createInstance((0,f.readHotReloadableExport)(c.DiffEditorGutter,$),this.elements.root,this._diffModel,this._editors,this._options,this._sashLayout,this._boundarySashes):void 0),this._register((0,m.recomputeInitiallyAndOnChange)(this._layoutInfo)),(0,_.derivedDisposable)(this,$=>new((0,f.readHotReloadableExport)(a.MovedBlocksLinesFeature,$))(this.elements.root,this._diffModel,this._layoutInfo.map(Q=>Q.originalEditor),this._layoutInfo.map(Q=>Q.modifiedEditor),this._editors)).recomputeInitiallyAndOnChange(this._store,$=>{this._movedBlocksLinesPart.set($,void 0)}),this._register(E.Event.runAndSubscribe(this._editors.modified.onDidChangeCursorPosition,$=>this._handleCursorPositionChange($,!0))),this._register(E.Event.runAndSubscribe(this._editors.original.onDidChangeCursorPosition,$=>this._handleCursorPositionChange($,!1)));const B=this._diffModel.map(this,($,Q)=>{if($)return $.diff.read(Q)===void 0&&!$.isDiffUpToDate.read(Q)});this._register((0,m.autorunWithStore)(($,Q)=>{if(B.read($)===!0){const Z=this._editorProgressService.show(!0,1e3);Q.add((0,y.toDisposable)(()=>Z.done()))}})),this._register((0,m.autorunWithStore)(($,Q)=>{Q.add(new((0,f.readHotReloadableExport)(u.RevertButtonsFeature,$))(this._editors,this._diffModel,this._options,this))})),this._register((0,m.autorunWithStore)(($,Q)=>{const Z=this._diffModel.read($);if(Z)for(const te of[Z.model.original,Z.model.modified])Q.add(te.onWillDispose(re=>{(0,I.onUnexpectedError)(new I.BugIndicatingError("TextModel got disposed before DiffEditorWidget model got reset")),this.setModel(null)}))})),this._register((0,m.autorun)($=>{this._options.setModel(this._diffModel.read($))}))}_createInnerEditor(H,z,U,j){return H.createInstance(o.CodeEditorWidget,z,U,j)}_createDiffEditorContributions(){const H=b.EditorExtensionsRegistry.getDiffEditorContributions();for(const z of H)try{this._register(this._instantiationService.createInstance(z.ctor,this))}catch(U){(0,I.onUnexpectedError)(U)}}get _targetEditor(){return this._editors.modified}getEditorType(){return S.EditorType.IDiffEditor}layout(H){this._rootSizeObserver.observe(H)}hasTextFocus(){return this._editors.original.hasTextFocus()||this._editors.modified.hasTextFocus()}saveViewState(){const H=this._editors.original.saveViewState(),z=this._editors.modified.saveViewState();return{original:H,modified:z,modelState:this._diffModel.get()?.serializeState()}}restoreViewState(H){if(H&&H.original&&H.modified){const z=H;this._editors.original.restoreViewState(z.original),this._editors.modified.restoreViewState(z.modified),z.modelState&&this._diffModel.get()?.restoreSerializedState(z.modelState)}}handleInitialized(){this._editors.original.handleInitialized(),this._editors.modified.handleInitialized()}createViewModel(H){return this._instantiationService.createInstance(x.DiffEditorViewModel,H,this._options)}getModel(){return this._diffModel.get()?.model??null}setModel(H){const z=H?"model"in H?C.RefCounted.create(H).createNewRef(this):C.RefCounted.create(this.createViewModel(H),this):null;this.setDiffModel(z)}setDiffModel(H,z){const U=this._diffModel.get();!H&&U&&this._accessibleDiffViewer.get().close(),this._diffModel.get()!==H?.object&&(0,m.subtransaction)(z,j=>{const Y=H?.object;m.observableFromEvent.batchEventsGlobally(j,()=>{this._editors.original.setModel(Y?Y.model.original:null),this._editors.modified.setModel(Y?Y.model.modified:null)});const G=this._diffModelSrc.get()?.createNewRef(this);this._diffModelSrc.set(H?.createNewRef(this),j),setTimeout(()=>{G?.dispose()},0)})}updateOptions(H){this._options.updateOptions(H)}getContainerDomNode(){return this._domElement}getOriginalEditor(){return this._editors.original}getModifiedEditor(){return this._editors.modified}getLineChanges(){const H=this._diffModel.get()?.diff.get();return H?V(H):null}revert(H){const z=this._diffModel.get();!z||!z.isDiffUpToDate.get()||this._editors.modified.executeEdits("diffEditor",[{range:H.modified.toExclusiveRange(),text:z.model.original.getValueInRange(H.original.toExclusiveRange())}])}revertRangeMappings(H){const z=this._diffModel.get();if(!z||!z.isDiffUpToDate.get())return;const U=H.map(j=>({range:j.modifiedRange,text:z.model.original.getValueInRange(j.originalRange)}));this._editors.modified.executeEdits("diffEditor",U)}_goTo(H){this._editors.modified.setPosition(new v.Position(H.lineRangeMapping.modified.startLineNumber,1)),this._editors.modified.revealRangeInCenter(H.lineRangeMapping.modified.toExclusiveRange())}goToDiff(H){const z=this._diffModel.get()?.diff.get()?.mappings;if(!z||z.length===0)return;const U=this._editors.modified.getPosition().lineNumber;let j;H==="next"?j=z.find(Y=>Y.lineRangeMapping.modified.startLineNumber>U)??z[0]:j=(0,k.findLast)(z,Y=>Y.lineRangeMapping.modified.startLineNumber{const z=H.diff.get()?.mappings;!z||z.length===0||this._goTo(z[0])})}accessibleDiffViewerNext(){this._accessibleDiffViewer.get().next()}accessibleDiffViewerPrev(){this._accessibleDiffViewer.get().prev()}async waitForDiff(){const H=this._diffModel.get();H&&await H.waitForDiff()}mapToOtherSide(){const H=this._editors.modified.hasWidgetFocus(),z=H?this._editors.modified:this._editors.original,U=H?this._editors.original:this._editors.modified;let j;const Y=z.getSelection();if(Y){const G=this._diffModel.get()?.diff.get()?.mappings.map(K=>H?K.lineRangeMapping.flip():K.lineRangeMapping);if(G){const K=(0,C.translatePosition)(Y.getStartPosition(),G),R=(0,C.translatePosition)(Y.getEndPosition(),G);j=w.Range.plusRange(K,R)}}return{destination:U,destinationSelection:j}}switchSide(){const{destination:H,destinationSelection:z}=this.mapToOtherSide();H.focus(),z&&H.setSelection(z)}exitCompareMove(){const H=this._diffModel.get();H&&H.movedTextToCompare.set(void 0,void 0)}collapseAllUnchangedRegions(){const H=this._diffModel.get()?.unchangedRegions.get();H&&(0,m.transaction)(z=>{for(const U of H)U.collapseAll(z)})}showAllUnchangedRegions(){const H=this._diffModel.get()?.unchangedRegions.get();H&&(0,m.transaction)(z=>{for(const U of H)U.showAll(z)})}_handleCursorPositionChange(H,z){if(H?.reason===3){const U=this._diffModel.get()?.diff.get()?.mappings.find(j=>z?j.lineRangeMapping.modified.contains(H.position.lineNumber):j.lineRangeMapping.original.contains(H.position.lineNumber));U?.lineRangeMapping.modified.isEmpty?this._accessibilitySignalService.playSignal(D.AccessibilitySignal.diffLineDeleted,{source:"diffEditor.cursorPositionChanged"}):U?.lineRangeMapping.original.isEmpty?this._accessibilitySignalService.playSignal(D.AccessibilitySignal.diffLineInserted,{source:"diffEditor.cursorPositionChanged"}):U&&this._accessibilitySignalService.playSignal(D.AccessibilitySignal.diffLineModified,{source:"diffEditor.cursorPositionChanged"})}}};e.DiffEditorWidget=W,e.DiffEditorWidget=W=ke([ce(3,T.IContextKeyService),ce(4,M.IInstantiationService),ce(5,p.ICodeEditorService),ce(6,D.IAccessibilitySignalService),ce(7,P.IEditorProgressService)],W);function V(q){return q.mappings.map(H=>{const z=H.lineRangeMapping;let U,j,Y,G,K=z.innerChanges;return z.original.isEmpty?(U=z.original.startLineNumber-1,j=0,K=void 0):(U=z.original.startLineNumber,j=z.original.endLineNumberExclusive-1),z.modified.isEmpty?(Y=z.modified.startLineNumber-1,G=0,K=void 0):(Y=z.modified.startLineNumber,G=z.modified.endLineNumberExclusive-1),{originalStartLineNumber:U,originalEndLineNumber:j,modifiedStartLineNumber:Y,modifiedEndLineNumber:G,charChanges:K?.map(R=>({originalStartLineNumber:R.originalRange.startLineNumber,originalStartColumn:R.originalRange.startColumn,originalEndLineNumber:R.originalRange.endLineNumber,originalEndColumn:R.originalRange.endColumn,modifiedStartLineNumber:R.modifiedRange.startLineNumber,modifiedStartColumn:R.modifiedRange.startColumn,modifiedEndLineNumber:R.modifiedRange.endLineNumber,modifiedEndColumn:R.modifiedRange.endColumn}))}})}}),define(ne[811],se([1,0,5,26,15,34,286,20,3,29,28,12,139]),function(oe,e,d,k,I,E,y,m,_,b,p,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AccessibleDiffViewerPrev=e.AccessibleDiffViewerNext=e.RevertHunkOrSelection=e.ShowAllUnchangedRegions=e.CollapseAllUnchangedRegions=e.ExitCompareMove=e.SwitchSide=e.ToggleUseInlineViewWhenSpaceIsLimited=e.ToggleShowMovedCodeBlocks=e.ToggleCollapseUnchangedRegions=void 0,e.findDiffEditor=h,e.findFocusedDiffEditor=v;class o extends b.Action2{constructor(){super({id:"diffEditor.toggleCollapseUnchangedRegions",title:(0,_.localize2)(72,"Toggle Collapse Unchanged Regions"),icon:k.Codicon.map,toggled:n.ContextKeyExpr.has("config.diffEditor.hideUnchangedRegions.enabled"),precondition:n.ContextKeyExpr.has("isInDiffEditor"),menu:{when:n.ContextKeyExpr.has("isInDiffEditor"),id:b.MenuId.EditorTitle,order:22,group:"navigation"}})}run(L,...D){const T=L.get(p.IConfigurationService),M=!T.getValue("diffEditor.hideUnchangedRegions.enabled");T.updateValue("diffEditor.hideUnchangedRegions.enabled",M)}}e.ToggleCollapseUnchangedRegions=o;class t extends b.Action2{constructor(){super({id:"diffEditor.toggleShowMovedCodeBlocks",title:(0,_.localize2)(73,"Toggle Show Moved Code Blocks"),precondition:n.ContextKeyExpr.has("isInDiffEditor")})}run(L,...D){const T=L.get(p.IConfigurationService),M=!T.getValue("diffEditor.experimental.showMoves");T.updateValue("diffEditor.experimental.showMoves",M)}}e.ToggleShowMovedCodeBlocks=t;class i extends b.Action2{constructor(){super({id:"diffEditor.toggleUseInlineViewWhenSpaceIsLimited",title:(0,_.localize2)(74,"Toggle Use Inline View When Space Is Limited"),precondition:n.ContextKeyExpr.has("isInDiffEditor")})}run(L,...D){const T=L.get(p.IConfigurationService),M=!T.getValue("diffEditor.useInlineViewWhenSpaceIsLimited");T.updateValue("diffEditor.useInlineViewWhenSpaceIsLimited",M)}}e.ToggleUseInlineViewWhenSpaceIsLimited=i;const s=(0,_.localize2)(75,"Diff Editor");class g extends I.EditorAction2{constructor(){super({id:"diffEditor.switchSide",title:(0,_.localize2)(76,"Switch Side"),icon:k.Codicon.arrowSwap,precondition:n.ContextKeyExpr.has("isInDiffEditor"),f1:!0,category:s})}runEditorCommand(L,D,T){const M=v(L);if(M instanceof y.DiffEditorWidget){if(T&&T.dryRun)return{destinationSelection:M.mapToOtherSide().destinationSelection};M.switchSide()}}}e.SwitchSide=g;class c extends I.EditorAction2{constructor(){super({id:"diffEditor.exitCompareMove",title:(0,_.localize2)(77,"Exit Compare Move"),icon:k.Codicon.close,precondition:m.EditorContextKeys.comparingMovedCode,f1:!1,category:s,keybinding:{weight:1e4,primary:9}})}runEditorCommand(L,D,...T){const M=v(L);M instanceof y.DiffEditorWidget&&M.exitCompareMove()}}e.ExitCompareMove=c;class l extends I.EditorAction2{constructor(){super({id:"diffEditor.collapseAllUnchangedRegions",title:(0,_.localize2)(78,"Collapse All Unchanged Regions"),icon:k.Codicon.fold,precondition:n.ContextKeyExpr.has("isInDiffEditor"),f1:!0,category:s})}runEditorCommand(L,D,...T){const M=v(L);M instanceof y.DiffEditorWidget&&M.collapseAllUnchangedRegions()}}e.CollapseAllUnchangedRegions=l;class a extends I.EditorAction2{constructor(){super({id:"diffEditor.showAllUnchangedRegions",title:(0,_.localize2)(79,"Show All Unchanged Regions"),icon:k.Codicon.unfold,precondition:n.ContextKeyExpr.has("isInDiffEditor"),f1:!0,category:s})}runEditorCommand(L,D,...T){const M=v(L);M instanceof y.DiffEditorWidget&&M.showAllUnchangedRegions()}}e.ShowAllUnchangedRegions=a;class r extends b.Action2{constructor(){super({id:"diffEditor.revert",title:(0,_.localize2)(80,"Revert"),f1:!1,category:s})}run(L,D){const T=h(L,D.originalUri,D.modifiedUri);T instanceof y.DiffEditorWidget&&T.revertRangeMappings(D.mapping.innerChanges??[])}}e.RevertHunkOrSelection=r;const u=(0,_.localize2)(81,"Accessible Diff Viewer");class C extends b.Action2{static{this.id="editor.action.accessibleDiffViewer.next"}constructor(){super({id:C.id,title:(0,_.localize2)(82,"Go to Next Difference"),category:u,precondition:n.ContextKeyExpr.has("isInDiffEditor"),keybinding:{primary:65,weight:100},f1:!0})}run(L){v(L)?.accessibleDiffViewerNext()}}e.AccessibleDiffViewerNext=C;class f extends b.Action2{static{this.id="editor.action.accessibleDiffViewer.prev"}constructor(){super({id:f.id,title:(0,_.localize2)(83,"Go to Previous Difference"),category:u,precondition:n.ContextKeyExpr.has("isInDiffEditor"),keybinding:{primary:1089,weight:100},f1:!0})}run(L){v(L)?.accessibleDiffViewerPrev()}}e.AccessibleDiffViewerPrev=f;function h(S,L,D){return S.get(E.ICodeEditorService).listDiffEditors().find(A=>{const P=A.getModifiedEditor(),N=A.getOriginalEditor();return P&&P.getModel()?.uri.toString()===D.toString()&&N&&N.getModel()?.uri.toString()===L.toString()})||null}function v(S){const D=S.get(E.ICodeEditorService).listDiffEditors(),T=(0,d.getActiveElement)();if(T)for(const M of D){const A=M.getContainerDomNode();if(w(A,T))return M}return null}function w(S,L){let D=L;for(;D;){if(D===S)return!0;D=D.parentElement}return!1}}),define(ne[812],se([1,0,26,811,20,3,29,24,12,139]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),(0,y.registerAction2)(k.ToggleCollapseUnchangedRegions),(0,y.registerAction2)(k.ToggleShowMovedCodeBlocks),(0,y.registerAction2)(k.ToggleUseInlineViewWhenSpaceIsLimited),y.MenuRegistry.appendMenuItem(y.MenuId.EditorTitle,{command:{id:new k.ToggleUseInlineViewWhenSpaceIsLimited().desc.id,title:(0,E.localize)(106,"Use Inline View When Space Is Limited"),toggled:_.ContextKeyExpr.has("config.diffEditor.useInlineViewWhenSpaceIsLimited"),precondition:_.ContextKeyExpr.has("isInDiffEditor")},order:11,group:"1_diff",when:_.ContextKeyExpr.and(I.EditorContextKeys.diffEditorRenderSideBySideInlineBreakpointReached,_.ContextKeyExpr.has("isInDiffEditor"))}),y.MenuRegistry.appendMenuItem(y.MenuId.EditorTitle,{command:{id:new k.ToggleShowMovedCodeBlocks().desc.id,title:(0,E.localize)(107,"Show Moved Code Blocks"),icon:d.Codicon.move,toggled:_.ContextKeyEqualsExpr.create("config.diffEditor.experimental.showMoves",!0),precondition:_.ContextKeyExpr.has("isInDiffEditor")},order:10,group:"1_diff",when:_.ContextKeyExpr.has("isInDiffEditor")}),(0,y.registerAction2)(k.RevertHunkOrSelection);for(const b of[{icon:d.Codicon.arrowRight,key:I.EditorContextKeys.diffEditorInlineMode.toNegated()},{icon:d.Codicon.discard,key:I.EditorContextKeys.diffEditorInlineMode}])y.MenuRegistry.appendMenuItem(y.MenuId.DiffEditorHunkToolbar,{command:{id:new k.RevertHunkOrSelection().desc.id,title:(0,E.localize)(108,"Revert Block"),icon:b.icon},when:_.ContextKeyExpr.and(I.EditorContextKeys.diffEditorModifiedWritable,b.key),order:5,group:"primary"}),y.MenuRegistry.appendMenuItem(y.MenuId.DiffEditorSelectionToolbar,{command:{id:new k.RevertHunkOrSelection().desc.id,title:(0,E.localize)(109,"Revert Selection"),icon:b.icon},when:_.ContextKeyExpr.and(I.EditorContextKeys.diffEditorModifiedWritable,b.key),order:5,group:"primary"});(0,y.registerAction2)(k.SwitchSide),(0,y.registerAction2)(k.ExitCompareMove),(0,y.registerAction2)(k.CollapseAllUnchangedRegions),(0,y.registerAction2)(k.ShowAllUnchangedRegions),y.MenuRegistry.appendMenuItem(y.MenuId.EditorTitle,{command:{id:k.AccessibleDiffViewerNext.id,title:(0,E.localize)(110,"Open Accessible Diff Viewer"),precondition:_.ContextKeyExpr.has("isInDiffEditor")},order:10,group:"2_diff",when:_.ContextKeyExpr.and(I.EditorContextKeys.accessibleDiffViewerVisible.negate(),_.ContextKeyExpr.has("isInDiffEditor"))}),m.CommandsRegistry.registerCommandAlias("editor.action.diffReview.next",k.AccessibleDiffViewerNext.id),(0,y.registerAction2)(k.AccessibleDiffViewerNext),m.CommandsRegistry.registerCommandAlias("editor.action.diffReview.prev",k.AccessibleDiffViewerPrev.id),(0,y.registerAction2)(k.AccessibleDiffViewerPrev)}),define(ne[420],se([1,0,5,258,26,2,21,92,112,286,124,218,29,7,365,12,154]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffEditorItemTemplate=e.TemplateData=void 0;class c{constructor(r,u){this.viewModel=r,this.deltaScrollVertical=u}getId(){return this.viewModel}}e.TemplateData=c;let l=class extends E.Disposable{constructor(r,u,C,f,h){super(),this._container=r,this._overflowWidgetsDomNode=u,this._workbenchUIElementFactory=C,this._instantiationService=f,this._viewModel=(0,m.observableValue)(this,void 0),this._collapsed=(0,y.derived)(this,S=>this._viewModel.read(S)?.collapsed.read(S)),this._editorContentHeight=(0,m.observableValue)(this,500),this.contentHeight=(0,y.derived)(this,S=>(this._collapsed.read(S)?0:this._editorContentHeight.read(S))+this._outerEditorHeight),this._modifiedContentWidth=(0,m.observableValue)(this,0),this._modifiedWidth=(0,m.observableValue)(this,0),this._originalContentWidth=(0,m.observableValue)(this,0),this._originalWidth=(0,m.observableValue)(this,0),this.maxScroll=(0,y.derived)(this,S=>{const L=this._modifiedContentWidth.read(S)-this._modifiedWidth.read(S),D=this._originalContentWidth.read(S)-this._originalWidth.read(S);return L>D?{maxScroll:L,width:this._modifiedWidth.read(S)}:{maxScroll:D,width:this._originalWidth.read(S)}}),this._elements=(0,d.h)("div.multiDiffEntry",[(0,d.h)("div.header@header",[(0,d.h)("div.header-content",[(0,d.h)("div.collapse-button@collapseButton"),(0,d.h)("div.file-path",[(0,d.h)("div.title.modified.show-file-icons@primaryPath",[]),(0,d.h)("div.status.deleted@status",["R"]),(0,d.h)("div.title.original.show-file-icons@secondaryPath",[])]),(0,d.h)("div.actions@actions")])]),(0,d.h)("div.editorParent",[(0,d.h)("div.editorContainer@editor")])]),this.editor=this._register(this._instantiationService.createInstance(b.DiffEditorWidget,this._elements.editor,{overflowWidgetsDomNode:this._overflowWidgetsDomNode},{})),this.isModifedFocused=(0,_.observableCodeEditor)(this.editor.getModifiedEditor()).isFocused,this.isOriginalFocused=(0,_.observableCodeEditor)(this.editor.getOriginalEditor()).isFocused,this.isFocused=(0,y.derived)(this,S=>this.isModifedFocused.read(S)||this.isOriginalFocused.read(S)),this._resourceLabel=this._workbenchUIElementFactory.createResourceLabel?this._register(this._workbenchUIElementFactory.createResourceLabel(this._elements.primaryPath)):void 0,this._resourceLabel2=this._workbenchUIElementFactory.createResourceLabel?this._register(this._workbenchUIElementFactory.createResourceLabel(this._elements.secondaryPath)):void 0,this._dataStore=this._register(new E.DisposableStore),this._headerHeight=40,this._lastScrollTop=-1,this._isSettingScrollTop=!1;const v=new k.Button(this._elements.collapseButton,{});this._register((0,y.autorun)(S=>{v.element.className="",v.icon=this._collapsed.read(S)?I.Codicon.chevronRight:I.Codicon.chevronDown})),this._register(v.onDidClick(()=>{this._viewModel.get()?.collapsed.set(!this._collapsed.get(),void 0)})),this._register((0,y.autorun)(S=>{this._elements.editor.style.display=this._collapsed.read(S)?"none":"block"})),this._register(this.editor.getModifiedEditor().onDidLayoutChange(S=>{const L=this.editor.getModifiedEditor().getLayoutInfo().contentWidth;this._modifiedWidth.set(L,void 0)})),this._register(this.editor.getOriginalEditor().onDidLayoutChange(S=>{const L=this.editor.getOriginalEditor().getLayoutInfo().contentWidth;this._originalWidth.set(L,void 0)})),this._register(this.editor.onDidContentSizeChange(S=>{(0,m.globalTransaction)(L=>{this._editorContentHeight.set(S.contentHeight,L),this._modifiedContentWidth.set(this.editor.getModifiedEditor().getContentWidth(),L),this._originalContentWidth.set(this.editor.getOriginalEditor().getContentWidth(),L)})})),this._register(this.editor.getOriginalEditor().onDidScrollChange(S=>{if(this._isSettingScrollTop||!S.scrollTopChanged||!this._data)return;const L=S.scrollTop-this._lastScrollTop;this._data.deltaScrollVertical(L)})),this._register((0,y.autorun)(S=>{const L=this._viewModel.read(S)?.isActive.read(S);this._elements.root.classList.toggle("active",L)})),this._container.appendChild(this._elements.root),this._outerEditorHeight=this._headerHeight,this._contextKeyService=this._register(h.createScoped(this._elements.actions));const w=this._register(this._instantiationService.createChild(new g.ServiceCollection([s.IContextKeyService,this._contextKeyService])));this._register(w.createInstance(n.MenuWorkbenchToolBar,this._elements.actions,o.MenuId.MultiDiffEditorFileToolbar,{actionRunner:this._register(new i.ActionRunnerWithContext(()=>this._viewModel.get()?.modifiedUri)),menuOptions:{shouldForwardArgs:!0},toolbarOptions:{primaryGroup:S=>S.startsWith("navigation")},actionViewItemProvider:(S,L)=>(0,p.createActionViewItem)(w,S,L)}))}setScrollLeft(r){this._modifiedContentWidth.get()-this._modifiedWidth.get()>this._originalContentWidth.get()-this._originalWidth.get()?this.editor.getModifiedEditor().setScrollLeft(r):this.editor.getOriginalEditor().setScrollLeft(r)}setData(r){this._data=r;function u(f){return{...f,scrollBeyondLastLine:!1,hideUnchangedRegions:{enabled:!0},scrollbar:{vertical:"hidden",horizontal:"hidden",handleMouseWheel:!1,useShadows:!1},renderOverviewRuler:!1,fixedOverflowWidgets:!0,overviewRulerBorder:!1}}if(!r){(0,m.globalTransaction)(f=>{this._viewModel.set(void 0,f),this.editor.setDiffModel(null,f),this._dataStore.clear()});return}const C=r.viewModel.documentDiffItem;if((0,m.globalTransaction)(f=>{this._resourceLabel?.setUri(r.viewModel.modifiedUri??r.viewModel.originalUri,{strikethrough:r.viewModel.modifiedUri===void 0});let h=!1,v=!1,w=!1,S="";r.viewModel.modifiedUri&&r.viewModel.originalUri&&r.viewModel.modifiedUri.path!==r.viewModel.originalUri.path?(S="R",h=!0):r.viewModel.modifiedUri?r.viewModel.originalUri||(S="A",w=!0):(S="D",v=!0),this._elements.status.classList.toggle("renamed",h),this._elements.status.classList.toggle("deleted",v),this._elements.status.classList.toggle("added",w),this._elements.status.innerText=S,this._resourceLabel2?.setUri(h?r.viewModel.originalUri:void 0,{strikethrough:!0}),this._dataStore.clear(),this._viewModel.set(r.viewModel,f),this.editor.setDiffModel(r.viewModel.diffEditorViewModelRef,f),this.editor.updateOptions(u(C.options??{}))}),C.onOptionsDidChange&&this._dataStore.add(C.onOptionsDidChange(()=>{this.editor.updateOptions(u(C.options??{}))})),r.viewModel.isAlive.recomputeInitiallyAndOnChange(this._dataStore,f=>{f||this.setData(void 0)}),r.viewModel.documentDiffItem.contextKeys)for(const[f,h]of Object.entries(r.viewModel.documentDiffItem.contextKeys))this._contextKeyService.createKey(f,h)}render(r,u,C,f){this._elements.root.style.visibility="visible",this._elements.root.style.top=`${r.start}px`,this._elements.root.style.height=`${r.length}px`,this._elements.root.style.width=`${u}px`,this._elements.root.style.position="absolute";const h=r.length-this._headerHeight,v=Math.max(0,Math.min(f.start-r.start,h));this._elements.header.style.transform=`translateY(${v}px)`,(0,m.globalTransaction)(w=>{this.editor.layout({width:u-2*8-2*1,height:r.length-this._outerEditorHeight})});try{this._isSettingScrollTop=!0,this._lastScrollTop=C,this.editor.getOriginalEditor().setScrollTop(C)}finally{this._isSettingScrollTop=!1}this._elements.header.classList.toggle("shadow",v>0||C>0),this._elements.header.classList.toggle("collapsed",v===h)}hide(){this._elements.root.style.top="-100000px",this._elements.root.style.visibility="hidden"}};e.DiffEditorItemTemplate=l,e.DiffEditorItemTemplate=l=ke([ce(3,t.IInstantiationService),ce(4,s.IContextKeyService)],l)}),define(ne[813],se([1,0,5,86,13,67,8,2,21,92,163,88,68,23,20,12,7,154,420,553,3,502]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MultiDiffEditorWidgetImpl=void 0;let u=class extends m.Disposable{constructor(h,v,w,S,L,D){super(),this._element=h,this._dimension=v,this._viewModel=w,this._workbenchUIElementFactory=S,this._parentContextKeyService=L,this._parentInstantiationService=D,this._scrollableElements=(0,d.h)("div.scrollContent",[(0,d.h)("div@content",{style:{overflow:"hidden"}}),(0,d.h)("div.monaco-editor@overflowWidgetsDomNode",{})]),this._scrollable=this._register(new p.Scrollable({forceIntegerValues:!1,scheduleAtNextAnimationFrame:M=>(0,d.scheduleAtNextAnimationFrame)((0,d.getWindow)(this._element),M),smoothScrollDuration:100})),this._scrollableElement=this._register(new k.SmoothScrollableElement(this._scrollableElements.root,{vertical:1,horizontal:1,useShadows:!1},this._scrollable)),this._elements=(0,d.h)("div.monaco-component.multiDiffEditor",{},[(0,d.h)("div",{},[this._scrollableElement.getDomNode()]),(0,d.h)("div.placeholder@placeholder",{},[(0,d.h)("div",[(0,r.localize)(132,"No Changed Files")])])]),this._sizeObserver=this._register(new n.ObservableElementSizeObserver(this._element,void 0)),this._objectPool=this._register(new a.ObjectPool(M=>{const A=this._instantiationService.createInstance(l.DiffEditorItemTemplate,this._scrollableElements.content,this._scrollableElements.overflowWidgetsDomNode,this._workbenchUIElementFactory);return A.setData(M),A})),this.scrollTop=(0,_.observableFromEvent)(this,this._scrollableElement.onScroll,()=>this._scrollableElement.getScrollPosition().scrollTop),this.scrollLeft=(0,_.observableFromEvent)(this,this._scrollableElement.onScroll,()=>this._scrollableElement.getScrollPosition().scrollLeft),this._viewItemsInfo=(0,_.derivedWithStore)(this,(M,A)=>{const P=this._viewModel.read(M);if(!P)return{items:[],getItem:x=>{throw new y.BugIndicatingError}};const N=P.items.read(M),O=new Map;return{items:N.map(x=>{const W=A.add(new C(x,this._objectPool,this.scrollLeft,q=>{this._scrollableElement.setScrollPosition({scrollTop:this._scrollableElement.getScrollPosition().scrollTop+q})})),V=this._lastDocStates?.[W.getKey()];return V&&(0,b.transaction)(q=>{W.setViewState(V,q)}),O.set(x,W),W}),getItem:x=>O.get(x)}}),this._viewItems=this._viewItemsInfo.map(this,M=>M.items),this._spaceBetweenPx=0,this._totalHeight=this._viewItems.map(this,(M,A)=>M.reduce((P,N)=>P+N.contentHeight.read(A)+this._spaceBetweenPx,0)),this._contextKeyService=this._register(this._parentContextKeyService.createScoped(this._element)),this._instantiationService=this._register(this._parentInstantiationService.createChild(new c.ServiceCollection([s.IContextKeyService,this._contextKeyService]))),this._lastDocStates={},this._contextKeyService.createKey(i.EditorContextKeys.inMultiDiffEditor.key,!0),this._register((0,_.autorunWithStore)((M,A)=>{const P=this._viewModel.read(M);if(P&&P.contextKeys)for(const[N,O]of Object.entries(P.contextKeys)){const F=this._contextKeyService.createKey(N,void 0);F.set(O),A.add((0,m.toDisposable)(()=>F.reset()))}}));const T=this._parentContextKeyService.createKey(i.EditorContextKeys.multiDiffEditorAllCollapsed.key,!1);this._register((0,_.autorun)(M=>{const A=this._viewModel.read(M);if(A){const P=A.items.read(M).every(N=>N.collapsed.read(M));T.set(P)}})),this._register((0,_.autorun)(M=>{const A=this._dimension.read(M);this._sizeObserver.observe(A)})),this._register((0,_.autorun)(M=>{const A=this._viewItems.read(M);this._elements.placeholder.classList.toggle("visible",A.length===0)})),this._scrollableElements.content.style.position="relative",this._register((0,_.autorun)(M=>{const A=this._sizeObserver.height.read(M);this._scrollableElements.root.style.height=`${A}px`;const P=this._totalHeight.read(M);this._scrollableElements.content.style.height=`${P}px`;const N=this._sizeObserver.width.read(M);let O=N;const F=this._viewItems.read(M),x=(0,E.findFirstMax)(F,(0,I.compareBy)(W=>W.maxScroll.read(M).maxScroll,I.numberComparator));if(x){const W=x.maxScroll.read(M);O=N+W.maxScroll}this._scrollableElement.setScrollDimensions({width:N,height:A,scrollHeight:P,scrollWidth:O})})),h.replaceChildren(this._elements.root),this._register((0,m.toDisposable)(()=>{h.replaceChildren()})),this._register(this._register((0,_.autorun)(M=>{(0,b.globalTransaction)(A=>{this.render(M)})})))}render(h){const v=this.scrollTop.read(h);let w=0,S=0,L=0;const D=this._sizeObserver.height.read(h),T=o.OffsetRange.ofStartAndLength(v,D),M=this._sizeObserver.width.read(h);for(const A of this._viewItems.read(h)){const P=A.contentHeight.read(h),N=Math.min(P,D),O=o.OffsetRange.ofStartAndLength(S,N),F=o.OffsetRange.ofStartAndLength(L,P);if(F.isBefore(T))w-=P-N,A.hide();else if(F.isAfter(T))A.hide();else{const x=Math.max(0,Math.min(T.start-F.start,P-N));w-=x;const W=o.OffsetRange.ofStartAndLength(v+w,D);A.render(O,x,M,W)}S+=N+this._spaceBetweenPx,L+=P+this._spaceBetweenPx}this._scrollableElements.content.style.transform=`translateY(${-(v+w)}px)`}};e.MultiDiffEditorWidgetImpl=u,e.MultiDiffEditorWidgetImpl=u=ke([ce(4,s.IContextKeyService),ce(5,g.IInstantiationService)],u);class C extends m.Disposable{constructor(h,v,w,S){super(),this.viewModel=h,this._objectPool=v,this._scrollLeft=w,this._deltaScrollVertical=S,this._templateRef=this._register((0,b.disposableObservableValue)(this,void 0)),this.contentHeight=(0,_.derived)(this,L=>this._templateRef.read(L)?.object.contentHeight?.read(L)??this.viewModel.lastTemplateData.read(L).contentHeight),this.maxScroll=(0,_.derived)(this,L=>this._templateRef.read(L)?.object.maxScroll.read(L)??{maxScroll:0,scrollWidth:0}),this.template=(0,_.derived)(this,L=>this._templateRef.read(L)?.object),this._isHidden=(0,_.observableValue)(this,!1),this._isFocused=(0,_.derived)(this,L=>this.template.read(L)?.isFocused.read(L)??!1),this.viewModel.setIsFocused(this._isFocused,void 0),this._register((0,_.autorun)(L=>{const D=this._scrollLeft.read(L);this._templateRef.read(L)?.object.setScrollLeft(D)})),this._register((0,_.autorun)(L=>{const D=this._templateRef.read(L);!D||!this._isHidden.read(L)||D.object.isFocused.read(L)||this._clear()}))}dispose(){this._clear(),super.dispose()}toString(){return`VirtualViewItem(${this.viewModel.documentDiffItem.modified?.uri.toString()})`}getKey(){return this.viewModel.getKey()}setViewState(h,v){this.viewModel.collapsed.set(h.collapsed,v),this._updateTemplateData(v);const w=this.viewModel.lastTemplateData.get(),S=h.selections?.map(t.Selection.liftSelection);this.viewModel.lastTemplateData.set({...w,selections:S},v);const L=this._templateRef.get();L&&S&&L.object.editor.setSelections(S)}_updateTemplateData(h){const v=this._templateRef.get();v&&this.viewModel.lastTemplateData.set({contentHeight:v.object.contentHeight.get(),selections:v.object.editor.getSelections()??void 0},h)}_clear(){const h=this._templateRef.get();h&&(0,b.transaction)(v=>{this._updateTemplateData(v),h.object.hide(),this._templateRef.set(void 0,v)})}hide(){this._isHidden.set(!0,void 0)}render(h,v,w,S){this._isHidden.set(!1,void 0);let L=this._templateRef.get();if(!L){L=this._objectPool.getUnusedObj(new l.TemplateData(this.viewModel,this._deltaScrollVertical)),this._templateRef.set(L,void 0);const D=this.viewModel.lastTemplateData.get().selections;D&&L.object.editor.setSelections(D)}L.object.render(h,w,v,S)}}}),define(ne[814],se([1,0,2,21,171,813,7,420,756]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MultiDiffEditorWidget=void 0;let _=class extends d.Disposable{constructor(p,n,o){super(),this._element=p,this._workbenchUIElementFactory=n,this._instantiationService=o,this._dimension=(0,k.observableValue)(this,void 0),this._viewModel=(0,k.observableValue)(this,void 0),this._widgetImpl=(0,k.derivedWithStore)(this,(t,i)=>((0,I.readHotReloadableExport)(m.DiffEditorItemTemplate,t),i.add(this._instantiationService.createInstance((0,I.readHotReloadableExport)(E.MultiDiffEditorWidgetImpl,t),this._element,this._dimension,this._viewModel,this._workbenchUIElementFactory)))),this._register((0,k.recomputeInitiallyAndOnChange)(this._widgetImpl))}};e.MultiDiffEditorWidget=_,e.MultiDiffEditorWidget=_=ke([ce(2,y.IInstantiationService)],_)}),define(ne[815],se([1,0,14,2,15,9,4,23,20,40,35,3,29,32,25,504]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketMatchingController=void 0;const s=(0,t.registerColor)("editorOverviewRuler.bracketMatchForeground","#A0A0A0",n.localize(716,"Overview ruler marker color for matching brackets."));class g extends I.EditorAction{constructor(){super({id:"editor.action.jumpToBracket",label:n.localize(717,"Go to Bracket"),alias:"Go to Bracket",precondition:void 0,kbOpts:{kbExpr:_.EditorContextKeys.editorTextFocus,primary:3165,weight:100}})}run(C,f){r.get(f)?.jumpToBracket()}}class c extends I.EditorAction{constructor(){super({id:"editor.action.selectToBracket",label:n.localize(718,"Select to Bracket"),alias:"Select to Bracket",precondition:void 0,metadata:{description:n.localize2(721,"Select the text inside and including the brackets or curly braces"),args:[{name:"args",schema:{type:"object",properties:{selectBrackets:{type:"boolean",default:!0}}}}]}})}run(C,f,h){let v=!0;h&&h.selectBrackets===!1&&(v=!1),r.get(f)?.selectToBracket(v)}}class l extends I.EditorAction{constructor(){super({id:"editor.action.removeBrackets",label:n.localize(719,"Remove Brackets"),alias:"Remove Brackets",precondition:void 0,kbOpts:{kbExpr:_.EditorContextKeys.editorTextFocus,primary:2561,weight:100}})}run(C,f){r.get(f)?.removeBrackets(this.id)}}class a{constructor(C,f,h){this.position=C,this.brackets=f,this.options=h}}class r extends k.Disposable{static{this.ID="editor.contrib.bracketMatchingController"}static get(C){return C.getContribution(r.ID)}constructor(C){super(),this._editor=C,this._lastBracketsData=[],this._lastVersionId=0,this._decorations=this._editor.createDecorationsCollection(),this._updateBracketsSoon=this._register(new d.RunOnceScheduler(()=>this._updateBrackets(),50)),this._matchBrackets=this._editor.getOption(72),this._updateBracketsSoon.schedule(),this._register(C.onDidChangeCursorPosition(f=>{this._matchBrackets!=="never"&&this._updateBracketsSoon.schedule()})),this._register(C.onDidChangeModelContent(f=>{this._updateBracketsSoon.schedule()})),this._register(C.onDidChangeModel(f=>{this._lastBracketsData=[],this._updateBracketsSoon.schedule()})),this._register(C.onDidChangeModelLanguageConfiguration(f=>{this._lastBracketsData=[],this._updateBracketsSoon.schedule()})),this._register(C.onDidChangeConfiguration(f=>{f.hasChanged(72)&&(this._matchBrackets=this._editor.getOption(72),this._decorations.clear(),this._lastBracketsData=[],this._lastVersionId=0,this._updateBracketsSoon.schedule())})),this._register(C.onDidBlurEditorWidget(()=>{this._updateBracketsSoon.schedule()})),this._register(C.onDidFocusEditorWidget(()=>{this._updateBracketsSoon.schedule()}))}jumpToBracket(){if(!this._editor.hasModel())return;const C=this._editor.getModel(),f=this._editor.getSelections().map(h=>{const v=h.getStartPosition(),w=C.bracketPairs.matchBracket(v);let S=null;if(w)w[0].containsPosition(v)&&!w[1].containsPosition(v)?S=w[1].getStartPosition():w[1].containsPosition(v)&&(S=w[0].getStartPosition());else{const L=C.bracketPairs.findEnclosingBrackets(v);if(L)S=L[1].getStartPosition();else{const D=C.bracketPairs.findNextBracket(v);D&&D.range&&(S=D.range.getStartPosition())}}return S?new m.Selection(S.lineNumber,S.column,S.lineNumber,S.column):new m.Selection(v.lineNumber,v.column,v.lineNumber,v.column)});this._editor.setSelections(f),this._editor.revealRange(f[0])}selectToBracket(C){if(!this._editor.hasModel())return;const f=this._editor.getModel(),h=[];this._editor.getSelections().forEach(v=>{const w=v.getStartPosition();let S=f.bracketPairs.matchBracket(w);if(!S&&(S=f.bracketPairs.findEnclosingBrackets(w),!S)){const T=f.bracketPairs.findNextBracket(w);T&&T.range&&(S=f.bracketPairs.matchBracket(T.range.getStartPosition()))}let L=null,D=null;if(S){S.sort(y.Range.compareRangesUsingStarts);const[T,M]=S;if(L=C?T.getStartPosition():T.getEndPosition(),D=C?M.getEndPosition():M.getStartPosition(),M.containsPosition(w)){const A=L;L=D,D=A}}L&&D&&h.push(new m.Selection(L.lineNumber,L.column,D.lineNumber,D.column))}),h.length>0&&(this._editor.setSelections(h),this._editor.revealRange(h[0]))}removeBrackets(C){if(!this._editor.hasModel())return;const f=this._editor.getModel();this._editor.getSelections().forEach(h=>{const v=h.getPosition();let w=f.bracketPairs.matchBracket(v);w||(w=f.bracketPairs.findEnclosingBrackets(v)),w&&(this._editor.pushUndoStop(),this._editor.executeEdits(C,[{range:w[0],text:""},{range:w[1],text:""}]),this._editor.pushUndoStop())})}static{this._DECORATION_OPTIONS_WITH_OVERVIEW_RULER=p.ModelDecorationOptions.register({description:"bracket-match-overview",stickiness:1,className:"bracket-match",overviewRuler:{color:(0,i.themeColorFromId)(s),position:b.OverviewRulerLane.Center}})}static{this._DECORATION_OPTIONS_WITHOUT_OVERVIEW_RULER=p.ModelDecorationOptions.register({description:"bracket-match-no-overview",stickiness:1,className:"bracket-match"})}_updateBrackets(){if(this._matchBrackets==="never")return;this._recomputeBrackets();const C=[];let f=0;for(const h of this._lastBracketsData){const v=h.brackets;v&&(C[f++]={range:v[0],options:h.options},C[f++]={range:v[1],options:h.options})}this._decorations.set(C)}_recomputeBrackets(){if(!this._editor.hasModel()||!this._editor.hasWidgetFocus()){this._lastBracketsData=[],this._lastVersionId=0;return}const C=this._editor.getSelections();if(C.length>100){this._lastBracketsData=[],this._lastVersionId=0;return}const f=this._editor.getModel(),h=f.getVersionId();let v=[];this._lastVersionId===h&&(v=this._lastBracketsData);const w=[];let S=0;for(let A=0,P=C.length;A1&&w.sort(E.Position.compare);const L=[];let D=0,T=0;const M=v.length;for(let A=0,P=w.length;A{const L=this._editor.getModel();(this.state.type!==1||!L||this.state.editorPosition.lineNumber>=L.getLineCount())&&this.hide(),(this.gutterState.type!==1||!L||this.gutterState.editorPosition.lineNumber>=L.getLineCount())&&this.gutterHide()})),this._register(d.addStandardDisposableGenericMouseDownListener(this._domNode,S=>{if(this.state.type!==1)return;this._editor.focus(),S.preventDefault();const{top:L,height:D}=d.getDomNodePagePosition(this._domNode),T=this._editor.getOption(67);let M=Math.floor(T/3);this.state.widgetPosition.position!==null&&this.state.widgetPosition.position.lineNumber{(S.buttons&1)===1&&this.hide()})),this._register(E.Event.runAndSubscribe(this._keybindingService.onDidUpdateKeybindings,()=>{this._preferredKbLabel=this._keybindingService.lookupKeybinding(n.autoFixCommandId)?.getLabel()??void 0,this._quickFixKbLabel=this._keybindingService.lookupKeybinding(n.quickFixCommandId)?.getLabel()??void 0,this._updateLightBulbTitleAndIcon()})),this._register(this._editor.onMouseDown(async S=>{if(!S.target.element||!this.lightbulbClasses.some(A=>S.target.element&&S.target.element.classList.contains(A))||this.gutterState.type!==1)return;this._editor.focus();const{top:L,height:D}=d.getDomNodePagePosition(S.target.element),T=this._editor.getOption(67);let M=Math.floor(T/3);this.gutterState.widgetPosition.position!==null&&this.gutterState.widgetPosition.position.lineNumber22,W=Y=>Y>2&&this._editor.getTopForLineNumber(Y)===this._editor.getTopForLineNumber(Y-1),V=this._editor.getLineDecorations(M);let q=!1;if(V)for(const Y of V){const G=Y.options.glyphMarginClassName;if(G&&!this.lightbulbClasses.some(K=>G.includes(K))){q=!0;break}}let H=M,z=1;if(!x){const Y=G=>{const K=T.getLineContent(G);return/^\s*$|^\s+/.test(K)||K.length<=z};if(M>1&&!W(M-1)){const G=T.getLineCount(),K=M===G,R=M>1&&Y(M-1),J=!K&&Y(M+1),ie=Y(M),ue=!J&&!R;if(!J&&!R&&!q)return this.gutterState=new C.Showing(v,w,S,{position:{lineNumber:H,column:z},preference:g._posPref}),this.renderGutterLightbub(),this.hide();R||K||R&&!ie?H-=1:(J||ue&&ie)&&(H+=1)}else if(M===1&&(M===T.getLineCount()||!Y(M+1)&&!Y(M)))if(this.gutterState=new C.Showing(v,w,S,{position:{lineNumber:H,column:z},preference:g._posPref}),q)this.gutterHide();else return this.renderGutterLightbub(),this.hide();else if(M{this._gutterDecorationID=w.addDecoration(new s.Range(v,0,v,0),this.gutterDecoration)})}_removeGutterDecoration(v){this._editor.changeDecorations(w=>{w.removeDecoration(v),this._gutterDecorationID=void 0})}_updateGutterDecoration(v,w){this._editor.changeDecorations(S=>{S.changeDecoration(v,new s.Range(w,0,w,0)),S.changeDecorationOptions(v,this.gutterDecoration)})}_updateLightbulbTitle(v,w){this.state.type===1&&(w?this.title=o.localize(790,"Run: {0}",this.state.actions.validActions[0].action.title):v&&this._preferredKbLabel?this.title=o.localize(791,"Show Code Actions. Preferred Quick Fix Available ({0})",this._preferredKbLabel):!v&&this._quickFixKbLabel?this.title=o.localize(792,"Show Code Actions ({0})",this._quickFixKbLabel):v||(this.title=o.localize(793,"Show Code Actions")))}set title(v){this._domNode.title=v}};e.LightBulbWidget=f,e.LightBulbWidget=f=g=ke([ce(1,t.IKeybindingService)],f)}),define(ne[287],se([1,0,5,46,8,98,2,9,35,17,157,733,757,421,184,3,760,24,28,12,7,108,96,32,97,25,134,408,91,63]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S,L,D){"use strict";var T;Object.defineProperty(e,"__esModule",{value:!0}),e.CodeActionController=void 0;const M="quickfix-edit-highlight";let A=class extends y.Disposable{static{T=this}static{this.ID="editor.contrib.codeActionController"}static get(N){return N.getContribution(T.ID)}constructor(N,O,F,x,W,V,q,H,z,U,j){super(),this._commandService=q,this._configurationService=H,this._actionWidgetService=z,this._instantiationService=U,this._telemetryService=j,this._activeCodeActions=this._register(new y.MutableDisposable),this._showDisabled=!1,this._disposed=!1,this._editor=N,this._model=this._register(new S.CodeActionModel(this._editor,W.codeActionProvider,O,F,V,H,this._telemetryService)),this._register(this._model.onDidChangeState(Y=>this.update(Y))),this._lightBulbWidget=new E.Lazy(()=>{const Y=this._editor.getContribution(t.LightBulbWidget.ID);return Y&&this._register(Y.onClick(G=>this.showCodeActionsFromLightbulb(G.actions,G))),Y}),this._resolver=x.createInstance(n.CodeActionKeybindingResolver),this._register(this._editor.onDidLayoutChange(()=>this._actionWidgetService.hide()))}dispose(){this._disposed=!0,super.dispose()}async showCodeActionsFromLightbulb(N,O){if(N.allAIFixes&&N.validActions.length===1){const F=N.validActions[0],x=F.action.command;x&&x.id==="inlineChat.start"&&x.arguments&&x.arguments.length>=1&&(x.arguments[0]={...x.arguments[0],autoSend:!1}),await this._applyCodeAction(F,!1,!1,p.ApplyCodeActionReason.FromAILightbulb);return}await this.showCodeActionList(N,O,{includeDisabledActions:!1,fromLightbulb:!0})}showCodeActions(N,O,F){return this.showCodeActionList(O,F,{includeDisabledActions:!1,fromLightbulb:!1})}manualTriggerAtCurrentPosition(N,O,F,x){if(!this._editor.hasModel())return;i.MessageController.get(this._editor)?.closeMessage();const W=this._editor.getPosition();this._trigger({type:1,triggerAction:O,filter:F,autoApply:x,context:{notAvailableMessage:N,position:W}})}_trigger(N){return this._model.trigger(N)}async _applyCodeAction(N,O,F,x){try{await this._instantiationService.invokeFunction(p.applyCodeAction,N,x,{preview:F,editor:this._editor})}finally{O&&this._trigger({type:2,triggerAction:w.CodeActionTriggerSource.QuickFix,filter:{}})}}hideLightBulbWidget(){this._lightBulbWidget.rawValue?.hide(),this._lightBulbWidget.rawValue?.gutterHide()}async update(N){if(N.type!==1){this.hideLightBulbWidget();return}let O;try{O=await N.actions}catch(x){(0,I.onUnexpectedError)(x);return}if(!(this._disposed||this._editor.getSelection()?.startLineNumber!==N.position.lineNumber))if(this._lightBulbWidget.value?.update(O,N.trigger,N.position),N.trigger.type===1){if(N.trigger.filter?.include){const W=this.tryGetValidActionToApply(N.trigger,O);if(W){try{this.hideLightBulbWidget(),await this._applyCodeAction(W,!1,!1,p.ApplyCodeActionReason.FromCodeActions)}finally{O.dispose()}return}if(N.trigger.context){const V=this.getInvalidActionThatWouldHaveBeenApplied(N.trigger,O);if(V&&V.action.disabled){i.MessageController.get(this._editor)?.showMessage(V.action.disabled,N.trigger.context.position),O.dispose();return}}}const x=!!N.trigger.filter?.include;if(N.trigger.context&&(!O.allActions.length||!x&&!O.validActions.length)){i.MessageController.get(this._editor)?.showMessage(N.trigger.context.notAvailableMessage,N.trigger.context.position),this._activeCodeActions.value=O,O.dispose();return}this._activeCodeActions.value=O,this.showCodeActionList(O,this.toCoords(N.position),{includeDisabledActions:x,fromLightbulb:!1})}else this._actionWidgetService.isVisible?O.dispose():this._activeCodeActions.value=O}getInvalidActionThatWouldHaveBeenApplied(N,O){if(O.allActions.length&&(N.autoApply==="first"&&O.validActions.length===0||N.autoApply==="ifSingle"&&O.allActions.length===1))return O.allActions.find(({action:F})=>F.disabled)}tryGetValidActionToApply(N,O){if(O.validActions.length&&(N.autoApply==="first"&&O.validActions.length>0||N.autoApply==="ifSingle"&&O.validActions.length===1))return O.validActions[0]}static{this.DECORATION=_.ModelDecorationOptions.register({description:"quickfix-highlight",className:M})}async showCodeActionList(N,O,F){const x=this._editor.createDecorationsCollection(),W=this._editor.getDomNode();if(!W)return;const V=F.includeDisabledActions&&(this._showDisabled||N.validActions.length===0)?N.allActions:N.validActions;if(!V.length)return;const q=m.Position.isIPosition(O)?this.toCoords(O):O,H={onSelect:async(z,U)=>{this._applyCodeAction(z,!0,!!U,F.fromLightbulb?p.ApplyCodeActionReason.FromAILightbulb:p.ApplyCodeActionReason.FromCodeActions),this._actionWidgetService.hide(!1),x.clear()},onHide:z=>{this._editor?.focus(),x.clear()},onHover:async(z,U)=>{if(U.isCancellationRequested)return;let j=!1;const Y=z.action.kind;if(Y){const G=new L.HierarchicalKind(Y);j=[w.CodeActionKind.RefactorExtract,w.CodeActionKind.RefactorInline,w.CodeActionKind.RefactorRewrite,w.CodeActionKind.RefactorMove,w.CodeActionKind.Source].some(R=>R.contains(G))}return{canPreview:j||!!z.action.edit?.edits.length}},onFocus:z=>{if(z&&z.action){const U=z.action.ranges,j=z.action.diagnostics;if(x.clear(),U&&U.length>0){const Y=j&&j?.length>1?j.map(G=>({range:G,options:T.DECORATION})):U.map(G=>({range:G,options:T.DECORATION}));x.set(Y)}else if(j&&j.length>0){const Y=j.map(K=>({range:K,options:T.DECORATION}));x.set(Y);const G=j[0];if(G.startLineNumber&&G.startColumn){const K=this._editor.getModel()?.getWordAtPosition({lineNumber:G.startLineNumber,column:G.startColumn})?.word;k.status((0,s.localize)(774,"Context: {0} at line {1} and column {2}.",K,G.startLineNumber,G.startColumn))}}}else x.clear()}};this._actionWidgetService.show("codeActionWidget",!0,(0,o.toMenuItems)(V,this._shouldShowHeaders(),this._resolver.getResolver()),H,q,W,this._getActionBarActions(N,O,F))}toCoords(N){if(!this._editor.hasModel())return{x:0,y:0};this._editor.revealPosition(N,1),this._editor.render();const O=this._editor.getScrolledVisiblePosition(N),F=(0,d.getDomNodePagePosition)(this._editor.getDomNode()),x=F.left+O.left,W=F.top+O.top+O.height;return{x,y:W}}_shouldShowHeaders(){const N=this._editor?.getModel();return this._configurationService.getValue("editor.codeActionWidget.showHeaders",{resource:N?.uri})}_getActionBarActions(N,O,F){if(F.fromLightbulb)return[];const x=N.documentation.map(W=>({id:W.id,label:W.title,tooltip:W.tooltip??"",class:void 0,enabled:!0,run:()=>this._commandService.executeCommand(W.id,...W.arguments??[])}));return F.includeDisabledActions&&N.validActions.length>0&&N.allActions.length!==N.validActions.length&&x.push(this._showDisabled?{id:"hideMoreActions",label:(0,s.localize)(775,"Hide Disabled"),enabled:!0,tooltip:"",class:void 0,run:()=>(this._showDisabled=!1,this.showCodeActionList(N,O,F))}:{id:"showMoreActions",label:(0,s.localize)(776,"Show Disabled"),enabled:!0,tooltip:"",class:void 0,run:()=>(this._showDisabled=!0,this.showCodeActionList(N,O,F))}),x}};e.CodeActionController=A,e.CodeActionController=A=T=ke([ce(1,u.IMarkerService),ce(2,a.IContextKeyService),ce(3,r.IInstantiationService),ce(4,b.ILanguageFeaturesService),ce(5,C.IEditorProgressService),ce(6,c.ICommandService),ce(7,l.IConfigurationService),ce(8,g.IActionWidgetService),ce(9,r.IInstantiationService),ce(10,D.ITelemetryService)],A),(0,v.registerThemingParticipant)((P,N)=>{((x,W)=>{W&&N.addRule(`.monaco-editor ${x} { background-color: ${W}; }`)})(".quickfix-edit-highlight",P.getColor(f.editorFindMatchHighlight));const F=P.getColor(f.editorFindMatchHighlightBorder);F&&N.addRule(`.monaco-editor .quickfix-edit-highlight { border: 1px ${(0,h.isHighContrast)(P.type)?"dotted":"solid"} ${F}; box-sizing: border-box; }`)})}),define(ne[816],se([1,0,91,11,15,20,157,3,12,134,287,408]),function(oe,e,d,k,I,E,y,m,_,b,p,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AutoFixAction=e.FixAllAction=e.OrganizeImportsAction=e.SourceAction=e.RefactorAction=e.CodeActionCommand=e.QuickFixAction=void 0;function o(C){return _.ContextKeyExpr.regex(n.SUPPORTED_CODE_ACTIONS.keys()[0],new RegExp("(\\s|^)"+(0,k.escapeRegExpCharacters)(C.value)+"\\b"))}const t={type:"object",defaultSnippets:[{body:{kind:""}}],properties:{kind:{type:"string",description:m.localize(743,"Kind of the code action to run.")},apply:{type:"string",description:m.localize(744,"Controls when the returned actions are applied."),default:"ifSingle",enum:["first","ifSingle","never"],enumDescriptions:[m.localize(745,"Always apply the first returned code action."),m.localize(746,"Apply the first returned code action if it is the only one."),m.localize(747,"Do not apply the returned code actions.")]},preferred:{type:"boolean",default:!1,description:m.localize(748,"Controls if only preferred code actions should be returned.")}}};function i(C,f,h,v,w=b.CodeActionTriggerSource.Default){C.hasModel()&&p.CodeActionController.get(C)?.manualTriggerAtCurrentPosition(f,w,h,v)}class s extends I.EditorAction{constructor(){super({id:y.quickFixCommandId,label:m.localize(749,"Quick Fix..."),alias:"Quick Fix...",precondition:_.ContextKeyExpr.and(E.EditorContextKeys.writable,E.EditorContextKeys.hasCodeActionsProvider),kbOpts:{kbExpr:E.EditorContextKeys.textInputFocus,primary:2137,weight:100}})}run(f,h){return i(h,m.localize(750,"No code actions available"),void 0,void 0,b.CodeActionTriggerSource.QuickFix)}}e.QuickFixAction=s;class g extends I.EditorCommand{constructor(){super({id:y.codeActionCommandId,precondition:_.ContextKeyExpr.and(E.EditorContextKeys.writable,E.EditorContextKeys.hasCodeActionsProvider),metadata:{description:"Trigger a code action",args:[{name:"args",schema:t}]}})}runEditorCommand(f,h,v){const w=b.CodeActionCommandArgs.fromUser(v,{kind:d.HierarchicalKind.Empty,apply:"ifSingle"});return i(h,typeof v?.kind=="string"?w.preferred?m.localize(751,"No preferred code actions for '{0}' available",v.kind):m.localize(752,"No code actions for '{0}' available",v.kind):w.preferred?m.localize(753,"No preferred code actions available"):m.localize(754,"No code actions available"),{include:w.kind,includeSourceActions:!0,onlyIncludePreferredActions:w.preferred},w.apply)}}e.CodeActionCommand=g;class c extends I.EditorAction{constructor(){super({id:y.refactorCommandId,label:m.localize(755,"Refactor..."),alias:"Refactor...",precondition:_.ContextKeyExpr.and(E.EditorContextKeys.writable,E.EditorContextKeys.hasCodeActionsProvider),kbOpts:{kbExpr:E.EditorContextKeys.textInputFocus,primary:3120,mac:{primary:1328},weight:100},contextMenuOpts:{group:"1_modification",order:2,when:_.ContextKeyExpr.and(E.EditorContextKeys.writable,o(b.CodeActionKind.Refactor))},metadata:{description:"Refactor...",args:[{name:"args",schema:t}]}})}run(f,h,v){const w=b.CodeActionCommandArgs.fromUser(v,{kind:b.CodeActionKind.Refactor,apply:"never"});return i(h,typeof v?.kind=="string"?w.preferred?m.localize(756,"No preferred refactorings for '{0}' available",v.kind):m.localize(757,"No refactorings for '{0}' available",v.kind):w.preferred?m.localize(758,"No preferred refactorings available"):m.localize(759,"No refactorings available"),{include:b.CodeActionKind.Refactor.contains(w.kind)?w.kind:d.HierarchicalKind.None,onlyIncludePreferredActions:w.preferred},w.apply,b.CodeActionTriggerSource.Refactor)}}e.RefactorAction=c;class l extends I.EditorAction{constructor(){super({id:y.sourceActionCommandId,label:m.localize(760,"Source Action..."),alias:"Source Action...",precondition:_.ContextKeyExpr.and(E.EditorContextKeys.writable,E.EditorContextKeys.hasCodeActionsProvider),contextMenuOpts:{group:"1_modification",order:2.1,when:_.ContextKeyExpr.and(E.EditorContextKeys.writable,o(b.CodeActionKind.Source))},metadata:{description:"Source Action...",args:[{name:"args",schema:t}]}})}run(f,h,v){const w=b.CodeActionCommandArgs.fromUser(v,{kind:b.CodeActionKind.Source,apply:"never"});return i(h,typeof v?.kind=="string"?w.preferred?m.localize(761,"No preferred source actions for '{0}' available",v.kind):m.localize(762,"No source actions for '{0}' available",v.kind):w.preferred?m.localize(763,"No preferred source actions available"):m.localize(764,"No source actions available"),{include:b.CodeActionKind.Source.contains(w.kind)?w.kind:d.HierarchicalKind.None,includeSourceActions:!0,onlyIncludePreferredActions:w.preferred},w.apply,b.CodeActionTriggerSource.SourceAction)}}e.SourceAction=l;class a extends I.EditorAction{constructor(){super({id:y.organizeImportsCommandId,label:m.localize(765,"Organize Imports"),alias:"Organize Imports",precondition:_.ContextKeyExpr.and(E.EditorContextKeys.writable,o(b.CodeActionKind.SourceOrganizeImports)),kbOpts:{kbExpr:E.EditorContextKeys.textInputFocus,primary:1581,weight:100}})}run(f,h){return i(h,m.localize(766,"No organize imports action available"),{include:b.CodeActionKind.SourceOrganizeImports,includeSourceActions:!0},"ifSingle",b.CodeActionTriggerSource.OrganizeImports)}}e.OrganizeImportsAction=a;class r extends I.EditorAction{constructor(){super({id:y.fixAllCommandId,label:m.localize(767,"Fix All"),alias:"Fix All",precondition:_.ContextKeyExpr.and(E.EditorContextKeys.writable,o(b.CodeActionKind.SourceFixAll))})}run(f,h){return i(h,m.localize(768,"No fix all action available"),{include:b.CodeActionKind.SourceFixAll,includeSourceActions:!0},"ifSingle",b.CodeActionTriggerSource.FixAll)}}e.FixAllAction=r;class u extends I.EditorAction{constructor(){super({id:y.autoFixCommandId,label:m.localize(769,"Auto Fix..."),alias:"Auto Fix...",precondition:_.ContextKeyExpr.and(E.EditorContextKeys.writable,o(b.CodeActionKind.QuickFix)),kbOpts:{kbExpr:E.EditorContextKeys.textInputFocus,primary:1625,mac:{primary:2649},weight:100}})}run(f,h){return i(h,m.localize(770,"No auto fixes available"),{include:b.CodeActionKind.QuickFix,onlyIncludePreferredActions:!0},"ifSingle",b.CodeActionTriggerSource.AutoFix)}}e.AutoFixAction=u}),define(ne[817],se([1,0,15,274,816,287,421,3,109,38]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),(0,d.registerEditorContribution)(E.CodeActionController.ID,E.CodeActionController,3),(0,d.registerEditorContribution)(y.LightBulbWidget.ID,y.LightBulbWidget,4),(0,d.registerEditorAction)(I.QuickFixAction),(0,d.registerEditorAction)(I.RefactorAction),(0,d.registerEditorAction)(I.SourceAction),(0,d.registerEditorAction)(I.OrganizeImportsAction),(0,d.registerEditorAction)(I.AutoFixAction),(0,d.registerEditorAction)(I.FixAllAction),(0,d.registerEditorCommand)(new I.CodeActionCommand),b.Registry.as(_.Extensions.Configuration).registerConfiguration({...k.editorConfigurationBaseNode,properties:{"editor.codeActionWidget.showHeaders":{type:"boolean",scope:5,description:m.localize(771,"Enable/disable showing group headers in the Code Action menu."),default:!0}}}),b.Registry.as(_.Extensions.Configuration).registerConfiguration({...k.editorConfigurationBaseNode,properties:{"editor.codeActionWidget.includeNearbyQuickFixes":{type:"boolean",scope:5,description:m.localize(772,"Enable/disable showing nearest Quick Fix within a line when not currently on a diagnostic."),default:!0}}}),b.Registry.as(_.Extensions.Configuration).registerConfiguration({...k.editorConfigurationBaseNode,properties:{"editor.codeActions.triggerOnFocusChange":{type:"boolean",scope:5,markdownDescription:m.localize(773,"Enable triggering {0} when {1} is set to {2}. Code Actions must be set to {3} to be triggered for window and focus changes.","`#editor.codeActionsOnSave#`","`#files.autoSave#`","`afterDelay`","`always`"),default:!1}}})}),define(ne[818],se([1,0,5,114,4,35,506]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeLensWidget=e.CodeLensHelper=void 0;class y{constructor(o,t,i){this.afterColumn=1073741824,this.afterLineNumber=o,this.heightInPx=t,this._onHeight=i,this.suppressMouseDown=!0,this.domNode=document.createElement("div")}onComputedHeight(o){this._lastHeight===void 0?this._lastHeight=o:this._lastHeight!==o&&(this._lastHeight=o,this._onHeight())}isVisible(){return this._lastHeight!==0&&this.domNode.hasAttribute("monaco-visible-view-zone")}}class m{static{this._idPool=0}constructor(o,t){this.allowEditorOverflow=!1,this.suppressMouseDown=!0,this._commands=new Map,this._isEmpty=!0,this._editor=o,this._id=`codelens.widget-${m._idPool++}`,this.updatePosition(t),this._domNode=document.createElement("span"),this._domNode.className="codelens-decoration"}withCommands(o,t){this._commands.clear();const i=[];let s=!1;for(let g=0;g{r.symbol.command&&a.push(r.symbol),i.addDecoration({range:r.symbol.range,options:b},C=>this._decorationIds[u]=C),l?l=I.Range.plusRange(l,r.symbol.range):l=I.Range.lift(r.symbol.range)}),this._viewZone=new y(l.startLineNumber-1,g,c),this._viewZoneId=s.addZone(this._viewZone),a.length>0&&(this._createContentWidgetIfNecessary(),this._contentWidget.withCommands(a,!1))}_createContentWidgetIfNecessary(){this._contentWidget?this._editor.layoutContentWidget(this._contentWidget):(this._contentWidget=new m(this._editor,this._viewZone.afterLineNumber+1),this._editor.addContentWidget(this._contentWidget))}dispose(o,t){this._decorationIds.forEach(o.removeDecoration,o),this._decorationIds=[],t?.removeZone(this._viewZoneId),this._contentWidget&&(this._editor.removeContentWidget(this._contentWidget),this._contentWidget=void 0),this._isDisposed=!0}isDisposed(){return this._isDisposed}isValid(){return this._decorationIds.some((o,t)=>{const i=this._editor.getModel().getDecorationRange(o),s=this._data[t].symbol;return!!(i&&I.Range.isEmpty(s.range)===i.isEmpty())})}updateCodeLensSymbols(o,t){this._decorationIds.forEach(t.removeDecoration,t),this._decorationIds=[],this._data=o,this._data.forEach((i,s)=>{t.addDecoration({range:i.symbol.range,options:b},g=>this._decorationIds[s]=g)})}updateHeight(o,t){this._viewZone.heightInPx=o,t.layoutZone(this._viewZoneId),this._contentWidget&&this._editor.layoutContentWidget(this._contentWidget)}computeIfNecessary(o){if(!this._viewZone.isVisible())return null;for(let t=0;tthis._resolveCodeLensesInViewport(),this._resolveCodeLensesDebounce.default()),this._disposables.add(this._editor.onDidChangeModel(()=>this._onModelChange())),this._disposables.add(this._editor.onDidChangeModelLanguage(()=>this._onModelChange())),this._disposables.add(this._editor.onDidChangeConfiguration(w=>{(w.hasChanged(50)||w.hasChanged(19)||w.hasChanged(18))&&this._updateLensStyle(),w.hasChanged(17)&&this._onModelChange()})),this._disposables.add(u.codeLensProvider.onDidChange(this._onModelChange,this)),this._onModelChange(),this._updateLensStyle()}dispose(){this._localDispose(),this._disposables.dispose(),this._oldCodeLensModels.dispose(),this._currentCodeLensModel?.dispose()}_getLayoutInfo(){const r=Math.max(1.3,this._editor.getOption(67)/this._editor.getOption(52));let u=this._editor.getOption(19);return(!u||u<5)&&(u=this._editor.getOption(52)*.9|0),{fontSize:u,codeLensHeight:u*r|0}}_updateLensStyle(){const{codeLensHeight:r,fontSize:u}=this._getLayoutInfo(),C=this._editor.getOption(18),f=this._editor.getOption(50),{style:h}=this._editor.getContainerDomNode();h.setProperty("--vscode-editorCodeLens-lineHeight",`${r}px`),h.setProperty("--vscode-editorCodeLens-fontSize",`${u}px`),h.setProperty("--vscode-editorCodeLens-fontFeatureSettings",f.fontFeatureSettings),C&&(h.setProperty("--vscode-editorCodeLens-fontFamily",C),h.setProperty("--vscode-editorCodeLens-fontFamilyDefault",m.EDITOR_FONT_DEFAULTS.fontFamily)),this._editor.changeViewZones(v=>{for(const w of this._lenses)w.updateHeight(r,v)})}_localDispose(){this._getCodeLensModelPromise?.cancel(),this._getCodeLensModelPromise=void 0,this._resolveCodeLensesPromise?.cancel(),this._resolveCodeLensesPromise=void 0,this._localToDispose.clear(),this._oldCodeLensModels.clear(),this._currentCodeLensModel?.dispose()}_onModelChange(){this._localDispose();const r=this._editor.getModel();if(!r||!this._editor.getOption(17)||r.isTooLargeForTokenization())return;const u=this._codeLensCache.get(r);if(u&&this._renderCodeLensSymbols(u),!this._languageFeaturesService.codeLensProvider.has(r)){u&&(0,d.disposableTimeout)(()=>{const f=this._codeLensCache.get(r);u===f&&(this._codeLensCache.delete(r),this._onModelChange())},30*1e3,this._localToDispose);return}for(const f of this._languageFeaturesService.codeLensProvider.all(r))if(typeof f.onDidChange=="function"){const h=f.onDidChange(()=>C.schedule());this._localToDispose.add(h)}const C=new d.RunOnceScheduler(()=>{const f=Date.now();this._getCodeLensModelPromise?.cancel(),this._getCodeLensModelPromise=(0,d.createCancelablePromise)(h=>(0,b.getCodeLensModel)(this._languageFeaturesService.codeLensProvider,r,h)),this._getCodeLensModelPromise.then(h=>{this._currentCodeLensModel&&this._oldCodeLensModels.add(this._currentCodeLensModel),this._currentCodeLensModel=h,this._codeLensCache.put(r,h);const v=this._provideCodeLensDebounce.update(r,Date.now()-f);C.delay=v,this._renderCodeLensSymbols(h),this._resolveCodeLensesInViewportSoon()},k.onUnexpectedError)},this._provideCodeLensDebounce.get(r));this._localToDispose.add(C),this._localToDispose.add((0,I.toDisposable)(()=>this._resolveCodeLensesScheduler.cancel())),this._localToDispose.add(this._editor.onDidChangeModelContent(()=>{this._editor.changeDecorations(f=>{this._editor.changeViewZones(h=>{const v=[];let w=-1;this._lenses.forEach(L=>{!L.isValid()||w===L.getLineNumber()?v.push(L):(L.update(h),w=L.getLineNumber())});const S=new n.CodeLensHelper;v.forEach(L=>{L.dispose(S,h),this._lenses.splice(this._lenses.indexOf(L),1)}),S.commit(f)})}),C.schedule(),this._resolveCodeLensesScheduler.cancel(),this._resolveCodeLensesPromise?.cancel(),this._resolveCodeLensesPromise=void 0})),this._localToDispose.add(this._editor.onDidFocusEditorText(()=>{C.schedule()})),this._localToDispose.add(this._editor.onDidBlurEditorText(()=>{C.cancel()})),this._localToDispose.add(this._editor.onDidScrollChange(f=>{f.scrollTopChanged&&this._lenses.length>0&&this._resolveCodeLensesInViewportSoon()})),this._localToDispose.add(this._editor.onDidLayoutChange(()=>{this._resolveCodeLensesInViewportSoon()})),this._localToDispose.add((0,I.toDisposable)(()=>{if(this._editor.getModel()){const f=E.StableEditorScrollState.capture(this._editor);this._editor.changeDecorations(h=>{this._editor.changeViewZones(v=>{this._disposeAllLenses(h,v)})}),f.restore(this._editor)}else this._disposeAllLenses(void 0,void 0)})),this._localToDispose.add(this._editor.onMouseDown(f=>{if(f.target.type!==9)return;let h=f.target.element;if(h?.tagName==="SPAN"&&(h=h.parentElement),h?.tagName==="A")for(const v of this._lenses){const w=v.getCommand(h);if(w){this._commandService.executeCommand(w.id,...w.arguments||[]).catch(S=>this._notificationService.error(S));break}}})),C.schedule()}_disposeAllLenses(r,u){const C=new n.CodeLensHelper;for(const f of this._lenses)f.dispose(C,u);r&&C.commit(r),this._lenses.length=0}_renderCodeLensSymbols(r){if(!this._editor.hasModel())return;const u=this._editor.getModel().getLineCount(),C=[];let f;for(const w of r.lenses){const S=w.symbol.range.startLineNumber;S<1||S>u||(f&&f[f.length-1].symbol.range.startLineNumber===S?f.push(w):(f=[w],C.push(f)))}if(!C.length&&!this._lenses.length)return;const h=E.StableEditorScrollState.capture(this._editor),v=this._getLayoutInfo();this._editor.changeDecorations(w=>{this._editor.changeViewZones(S=>{const L=new n.CodeLensHelper;let D=0,T=0;for(;Tthis._resolveCodeLensesInViewportSoon())),D++,T++)}for(;Dthis._resolveCodeLensesInViewportSoon())),T++;L.commit(w)})}),h.restore(this._editor)}_resolveCodeLensesInViewportSoon(){this._editor.getModel()&&this._resolveCodeLensesScheduler.schedule()}_resolveCodeLensesInViewport(){this._resolveCodeLensesPromise?.cancel(),this._resolveCodeLensesPromise=void 0;const r=this._editor.getModel();if(!r)return;const u=[],C=[];if(this._lenses.forEach(v=>{const w=v.computeIfNecessary(r);w&&(u.push(w),C.push(v))}),u.length===0)return;const f=Date.now(),h=(0,d.createCancelablePromise)(v=>{const w=u.map((S,L)=>{const D=new Array(S.length),T=S.map((M,A)=>!M.symbol.command&&typeof M.provider.resolveCodeLens=="function"?Promise.resolve(M.provider.resolveCodeLens(r,M.symbol,v)).then(P=>{D[A]=P},k.onUnexpectedExternalError):(D[A]=M.symbol,Promise.resolve(void 0)));return Promise.all(T).then(()=>{!v.isCancellationRequested&&!C[L].isDisposed()&&C[L].updateCommands(D)})});return Promise.all(w)});this._resolveCodeLensesPromise=h,this._resolveCodeLensesPromise.then(()=>{const v=this._resolveCodeLensesDebounce.update(r,Date.now()-f);this._resolveCodeLensesScheduler.delay=v,this._currentCodeLensModel&&this._codeLensCache.put(r,this._currentCodeLensModel),this._oldCodeLensModels.clear(),h===this._resolveCodeLensesPromise&&(this._resolveCodeLensesPromise=void 0)},v=>{(0,k.onUnexpectedError)(v),h===this._resolveCodeLensesPromise&&(this._resolveCodeLensesPromise=void 0)})}async getModel(){return await this._getCodeLensModelPromise,await this._resolveCodeLensesPromise,this._currentCodeLensModel?.isDisposed?void 0:this._currentCodeLensModel}};e.CodeLensContribution=l,e.CodeLensContribution=l=ke([ce(1,c.ILanguageFeaturesService),ce(2,g.ILanguageFeatureDebounceService),ce(3,t.ICommandService),ce(4,i.INotificationService),ce(5,p.ICodeLensCache)],l),(0,y.registerEditorContribution)(l.ID,l,1),(0,y.registerEditorAction)(class extends y.EditorAction{constructor(){super({id:"codelens.showLensesInCurrentLine",precondition:_.EditorContextKeys.hasCodeLensProvider,label:(0,o.localize)(794,"Show CodeLens Commands For Current Line"),alias:"Show CodeLens Commands For Current Line"})}async run(r,u){if(!u.hasModel())return;const C=r.get(s.IQuickInputService),f=r.get(t.ICommandService),h=r.get(i.INotificationService),v=u.getSelection().positionLineNumber,w=u.getContribution(l.ID);if(!w)return;const S=await w.getModel();if(!S)return;const L=[];for(const M of S.lenses)M.symbol.command&&M.symbol.range.startLineNumber===v&&L.push({label:M.symbol.command.title,command:M.symbol.command});if(L.length===0)return;const D=await C.pick(L,{canPickMany:!1,placeHolder:(0,o.localize)(795,"Select a command")});if(!D)return;let T=D.command;if(S.isDisposed){const A=(await w.getModel())?.lenses.find(P=>P.symbol.range.startLineNumber===v&&P.symbol.command?.title===T.title);if(!A||!A.symbol.command)return;T=A.symbol.command}try{await f.executeCommand(T.id,...T.arguments||[])}catch(M){h.error(M)}}})}),define(ne[422],se([1,0,14,33,8,6,2,54,11,185,15,4,35,79,17,388,28]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g){"use strict";var c;Object.defineProperty(e,"__esModule",{value:!0}),e.DecoratorLimitReporter=e.ColorDetector=e.ColorDecorationInjectedTextMarker=void 0,e.ColorDecorationInjectedTextMarker=Object.create({});let l=class extends y.Disposable{static{c=this}static{this.ID="editor.contrib.colorDetector"}static{this.RECOMPUTE_TIME=1e3}constructor(u,C,f,h){super(),this._editor=u,this._configurationService=C,this._languageFeaturesService=f,this._localToDispose=this._register(new y.DisposableStore),this._decorationsIds=[],this._colorDatas=new Map,this._colorDecoratorIds=this._editor.createDecorationsCollection(),this._ruleFactory=new b.DynamicCssRules(this._editor),this._decoratorLimitReporter=new a,this._colorDecorationClassRefs=this._register(new y.DisposableStore),this._debounceInformation=h.for(f.colorProvider,"Document Colors",{min:c.RECOMPUTE_TIME}),this._register(u.onDidChangeModel(()=>{this._isColorDecoratorsEnabled=this.isEnabled(),this.updateColors()})),this._register(u.onDidChangeModelLanguage(()=>this.updateColors())),this._register(f.colorProvider.onDidChange(()=>this.updateColors())),this._register(u.onDidChangeConfiguration(v=>{const w=this._isColorDecoratorsEnabled;this._isColorDecoratorsEnabled=this.isEnabled(),this._isDefaultColorDecoratorsEnabled=this._editor.getOption(148);const S=w!==this._isColorDecoratorsEnabled||v.hasChanged(21),L=v.hasChanged(148);(S||L)&&(this._isColorDecoratorsEnabled?this.updateColors():this.removeAllDecorations())})),this._timeoutTimer=null,this._computePromise=null,this._isColorDecoratorsEnabled=this.isEnabled(),this._isDefaultColorDecoratorsEnabled=this._editor.getOption(148),this.updateColors()}isEnabled(){const u=this._editor.getModel();if(!u)return!1;const C=u.getLanguageId(),f=this._configurationService.getValue(C);if(f&&typeof f=="object"){const h=f.colorDecorators;if(h&&h.enable!==void 0&&!h.enable)return h.enable}return this._editor.getOption(20)}static get(u){return u.getContribution(this.ID)}dispose(){this.stop(),this.removeAllDecorations(),super.dispose()}updateColors(){if(this.stop(),!this._isColorDecoratorsEnabled)return;const u=this._editor.getModel();!u||!this._languageFeaturesService.colorProvider.has(u)||(this._localToDispose.add(this._editor.onDidChangeModelContent(()=>{this._timeoutTimer||(this._timeoutTimer=new d.TimeoutTimer,this._timeoutTimer.cancelAndSet(()=>{this._timeoutTimer=null,this.beginCompute()},this._debounceInformation.get(u)))})),this.beginCompute())}async beginCompute(){this._computePromise=(0,d.createCancelablePromise)(async u=>{const C=this._editor.getModel();if(!C)return[];const f=new m.StopWatch(!1),h=await(0,s.getColors)(this._languageFeaturesService.colorProvider,C,u,this._isDefaultColorDecoratorsEnabled);return this._debounceInformation.update(C,f.elapsed()),h});try{const u=await this._computePromise;this.updateDecorations(u),this.updateColorDecorators(u),this._computePromise=null}catch(u){(0,I.onUnexpectedError)(u)}}stop(){this._timeoutTimer&&(this._timeoutTimer.cancel(),this._timeoutTimer=null),this._computePromise&&(this._computePromise.cancel(),this._computePromise=null),this._localToDispose.clear()}updateDecorations(u){const C=u.map(f=>({range:{startLineNumber:f.colorInfo.range.startLineNumber,startColumn:f.colorInfo.range.startColumn,endLineNumber:f.colorInfo.range.endLineNumber,endColumn:f.colorInfo.range.endColumn},options:o.ModelDecorationOptions.EMPTY}));this._editor.changeDecorations(f=>{this._decorationsIds=f.deltaDecorations(this._decorationsIds,C),this._colorDatas=new Map,this._decorationsIds.forEach((h,v)=>this._colorDatas.set(h,u[v]))})}updateColorDecorators(u){this._colorDecorationClassRefs.clear();const C=[],f=this._editor.getOption(21);for(let v=0;vthis._colorDatas.has(h.id));return f.length===0?null:this._colorDatas.get(f[0].id)}isColorDecoration(u){return this._colorDecoratorIds.has(u)}};e.ColorDetector=l,e.ColorDetector=l=c=ke([ce(1,g.IConfigurationService),ce(2,i.ILanguageFeaturesService),ce(3,t.ILanguageFeatureDebounceService)],l);class a{constructor(){this._onDidChange=new E.Emitter,this._computed=0,this._limited=!1}update(u,C){(u!==this._computed||C!==this._limited)&&(this._computed=u,this._limited=C,this._onDidChange.fire())}}e.DecoratorLimitReporter=a,(0,p.registerEditorContribution)(l.ID,l,1)}),define(ne[288],se([1,0,14,18,33,2,4,388,422,608,763,84,25,5]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneColorPickerParticipant=e.StandaloneColorPickerHover=e.ColorHoverParticipant=e.ColorHover=void 0;class i{constructor(f,h,v,w){this.owner=f,this.range=h,this.model=v,this.provider=w,this.forceShowAtRange=!0}isValidForHoverAnchor(f){return f.type===1&&this.range.startColumn<=f.range.startColumn&&this.range.endColumn>=f.range.endColumn}}e.ColorHover=i;let s=class{constructor(f,h){this._editor=f,this._themeService=h,this.hoverOrdinal=2}computeSync(f,h){return[]}computeAsync(f,h,v){return d.AsyncIterableObject.fromPromise(this._computeAsync(f,h,v))}async _computeAsync(f,h,v){if(!this._editor.hasModel())return[];const w=_.ColorDetector.get(this._editor);if(!w)return[];for(const S of h){if(!w.isColorDecoration(S))continue;const L=w.getColorData(S.range.getStartPosition());if(L)return[await l(this,this._editor.getModel(),L.colorInfo,L.provider)]}return[]}renderHoverParts(f,h){const v=a(this,this._editor,this._themeService,h,f);if(!v)return new n.RenderedHoverParts([]);this._colorPicker=v.colorPicker;const w={hoverPart:v.hoverPart,hoverElement:this._colorPicker.domNode,dispose(){v.disposables.dispose()}};return new n.RenderedHoverParts([w])}handleResize(){this._colorPicker?.layout()}isColorPickerVisible(){return!!this._colorPicker}};e.ColorHoverParticipant=s,e.ColorHoverParticipant=s=ke([ce(1,o.IThemeService)],s);class g{constructor(f,h,v,w){this.owner=f,this.range=h,this.model=v,this.provider=w}}e.StandaloneColorPickerHover=g;let c=class{constructor(f,h){this._editor=f,this._themeService=h,this._color=null}async createColorHover(f,h,v){if(!this._editor.hasModel()||!_.ColorDetector.get(this._editor))return null;const S=await(0,m.getColors)(v,this._editor.getModel(),k.CancellationToken.None);let L=null,D=null;for(const P of S){const N=P.colorInfo;y.Range.containsRange(N.range,f.range)&&(L=N,D=P.provider)}const T=L??f,M=D??h,A=!!L;return{colorHover:await l(this,this._editor.getModel(),T,M),foundInEditor:A}}async updateEditorModel(f){if(!this._editor.hasModel())return;const h=f.model;let v=new y.Range(f.range.startLineNumber,f.range.startColumn,f.range.endLineNumber,f.range.endColumn);this._color&&(await u(this._editor.getModel(),h,this._color,v,f),v=r(this._editor,v,h))}renderHoverParts(f,h){return a(this,this._editor,this._themeService,h,f)}set color(f){this._color=f}get color(){return this._color}};e.StandaloneColorPickerParticipant=c,e.StandaloneColorPickerParticipant=c=ke([ce(1,o.IThemeService)],c);async function l(C,f,h,v){const w=f.getValueInRange(h.range),{red:S,green:L,blue:D,alpha:T}=h.color,M=new I.RGBA(Math.round(S*255),Math.round(L*255),Math.round(D*255),T),A=new I.Color(M),P=await(0,m.getColorPresentations)(f,h,v,k.CancellationToken.None),N=new b.ColorPickerModel(A,[],0);return N.colorPresentations=P||[],N.guessColorPresentation(A,w),C instanceof s?new i(C,y.Range.lift(h.range),N,v):new g(C,y.Range.lift(h.range),N,v)}function a(C,f,h,v,w){if(v.length===0||!f.hasModel())return;if(w.setMinimumDimensions){const N=f.getOption(67)+8;w.setMinimumDimensions(new t.Dimension(302,N))}const S=new E.DisposableStore,L=v[0],D=f.getModel(),T=L.model,M=S.add(new p.ColorPickerWidget(w.fragment,T,f.getOption(144),h,C instanceof c));let A=!1,P=new y.Range(L.range.startLineNumber,L.range.startColumn,L.range.endLineNumber,L.range.endColumn);if(C instanceof c){const N=L.model.color;C.color=N,u(D,T,N,P,L),S.add(T.onColorFlushed(O=>{C.color=O}))}else S.add(T.onColorFlushed(async N=>{await u(D,T,N,P,L),A=!0,P=r(f,P,T)}));return S.add(T.onDidChangeColor(N=>{u(D,T,N,P,L)})),S.add(f.onDidChangeModelContent(N=>{A?A=!1:(w.hide(),f.focus())})),{hoverPart:L,colorPicker:M,disposables:S}}function r(C,f,h){const v=[],w=h.presentation.textEdit??{range:f,text:h.presentation.label,forceMoveMarkers:!1};v.push(w),h.presentation.additionalTextEdits&&v.push(...h.presentation.additionalTextEdits);const S=y.Range.lift(w.range),L=C.getModel()._setTrackedRange(null,S,3);return C.executeEdits("colorpicker",v),C.pushUndoStop(),C.getModel()._getTrackedRange(L)??S}async function u(C,f,h,v,w){const S=await(0,m.getColorPresentations)(C,{range:v,color:{red:h.rgba.r/255,green:h.rgba.g/255,blue:h.rgba.b/255,alpha:h.rgba.a}},w.provider,k.CancellationToken.None);f.colorPresentations=S||[]}}),define(ne[820],se([1,0,2,288,7,391,31,6,17,15,20,12,385,5,100,227]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i){"use strict";var s,g;Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneColorPickerWidget=e.StandaloneColorPickerController=void 0;let c=class extends d.Disposable{static{s=this}static{this.ID="editor.contrib.standaloneColorPickerController"}constructor(f,h,v){super(),this._editor=f,this._instantiationService=v,this._standaloneColorPickerWidget=null,this._standaloneColorPickerVisible=p.EditorContextKeys.standaloneColorPickerVisible.bindTo(h),this._standaloneColorPickerFocused=p.EditorContextKeys.standaloneColorPickerFocused.bindTo(h)}showOrFocus(){this._editor.hasModel()&&(this._standaloneColorPickerVisible.get()?this._standaloneColorPickerFocused.get()||this._standaloneColorPickerWidget?.focus():this._standaloneColorPickerWidget=this._instantiationService.createInstance(r,this._editor,this._standaloneColorPickerVisible,this._standaloneColorPickerFocused))}hide(){this._standaloneColorPickerFocused.set(!1),this._standaloneColorPickerVisible.set(!1),this._standaloneColorPickerWidget?.hide(),this._editor.focus()}insertColor(){this._standaloneColorPickerWidget?.updateEditor(),this.hide()}static get(f){return f.getContribution(s.ID)}};e.StandaloneColorPickerController=c,e.StandaloneColorPickerController=c=s=ke([ce(1,n.IContextKeyService),ce(2,I.IInstantiationService)],c),(0,b.registerEditorContribution)(c.ID,c,1);const l=8,a=22;let r=class extends d.Disposable{static{g=this}static{this.ID="editor.contrib.standaloneColorPickerWidget"}constructor(f,h,v,w,S,L,D){super(),this._editor=f,this._standaloneColorPickerVisible=h,this._standaloneColorPickerFocused=v,this._keybindingService=S,this._languageFeaturesService=L,this._editorWorkerService=D,this.allowEditorOverflow=!0,this._position=void 0,this._body=document.createElement("div"),this._colorHover=null,this._selectionSetInEditor=!1,this._onResult=this._register(new m.Emitter),this.onResult=this._onResult.event,this._standaloneColorPickerVisible.set(!0),this._standaloneColorPickerParticipant=w.createInstance(k.StandaloneColorPickerParticipant,this._editor),this._position=this._editor._getViewModel()?.getPrimaryCursorState().modelState.position;const T=this._editor.getSelection(),M=T?{startLineNumber:T.startLineNumber,startColumn:T.startColumn,endLineNumber:T.endLineNumber,endColumn:T.endColumn}:{startLineNumber:0,endLineNumber:0,endColumn:0,startColumn:0},A=this._register(t.trackFocus(this._body));this._register(A.onDidBlur(P=>{this.hide()})),this._register(A.onDidFocus(P=>{this.focus()})),this._register(this._editor.onDidChangeCursorPosition(()=>{this._selectionSetInEditor?this._selectionSetInEditor=!1:this.hide()})),this._register(this._editor.onMouseMove(P=>{const N=P.target.element?.classList;N&&N.contains("colorpicker-color-decoration")&&this.hide()})),this._register(this.onResult(P=>{this._render(P.value,P.foundInEditor)})),this._start(M),this._body.style.zIndex="50",this._editor.addContentWidget(this)}updateEditor(){this._colorHover&&this._standaloneColorPickerParticipant.updateEditorModel(this._colorHover)}getId(){return g.ID}getDomNode(){return this._body}getPosition(){if(!this._position)return null;const f=this._editor.getOption(60).above;return{position:this._position,secondaryPosition:this._position,preference:f?[1,2]:[2,1],positionAffinity:2}}hide(){this.dispose(),this._standaloneColorPickerVisible.set(!1),this._standaloneColorPickerFocused.set(!1),this._editor.removeContentWidget(this),this._editor.focus()}focus(){this._standaloneColorPickerFocused.set(!0),this._body.focus()}async _start(f){const h=await this._computeAsync(f);h&&this._onResult.fire(new u(h.result,h.foundInEditor))}async _computeAsync(f){if(!this._editor.hasModel())return null;const h={range:f,color:{red:0,green:0,blue:0,alpha:1}},v=await this._standaloneColorPickerParticipant.createColorHover(h,new o.DefaultDocumentColorProvider(this._editorWorkerService),this._languageFeaturesService.colorProvider);return v?{result:v.colorHover,foundInEditor:v.foundInEditor}:null}_render(f,h){const v=document.createDocumentFragment(),w=this._register(new E.EditorHoverStatusBar(this._keybindingService)),S={fragment:v,statusBar:w,onContentsChanged:()=>{},hide:()=>this.hide()};this._colorHover=f;const L=this._standaloneColorPickerParticipant.renderHoverParts(S,[f]);if(!L)return;this._register(L.disposables);const D=L.colorPicker;this._body.classList.add("standalone-colorpicker-body"),this._body.style.maxHeight=Math.max(this._editor.getLayoutInfo().height/4,250)+"px",this._body.style.maxWidth=Math.max(this._editor.getLayoutInfo().width*.66,500)+"px",this._body.tabIndex=0,this._body.appendChild(v),D.layout();const T=D.body,M=T.saturationBox.domNode.clientWidth,A=T.domNode.clientWidth-M-a-l,P=D.body.enterButton;P?.onClicked(()=>{this.updateEditor(),this.hide()});const N=D.header,O=N.pickedColorNode;O.style.width=M+l+"px";const F=N.originalColorNode;F.style.width=A+"px",D.header.closeButton?.onClicked(()=>{this.hide()}),h&&(P&&(P.button.textContent="Replace"),this._selectionSetInEditor=!0,this._editor.setSelection(f.range)),this._editor.layoutContentWidget(this)}};e.StandaloneColorPickerWidget=r,e.StandaloneColorPickerWidget=r=g=ke([ce(3,I.IInstantiationService),ce(4,y.IKeybindingService),ce(5,_.ILanguageFeaturesService),ce(6,i.IEditorWorkerService)],r);class u{constructor(f,h){this.value=f,this.foundInEditor=h}}}),define(ne[821],se([1,0,15,3,820,20,29,227]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ShowOrFocusStandaloneColorPicker=void 0;class m extends d.EditorAction2{constructor(){super({id:"editor.action.showOrFocusStandaloneColorPicker",title:{...(0,k.localize2)(801,"Show or Focus Standalone Color Picker"),mnemonicTitle:(0,k.localize)(798,"&&Show or Focus Standalone Color Picker")},precondition:void 0,menu:[{id:y.MenuId.CommandPalette}],metadata:{description:(0,k.localize2)(802,"Show or focus a standalone color picker which uses the default color provider. It displays hex/rgb/hsl colors.")}})}runEditorCommand(n,o){I.StandaloneColorPickerController.get(o)?.showOrFocus()}}e.ShowOrFocusStandaloneColorPicker=m;class _ extends d.EditorAction{constructor(){super({id:"editor.action.hideColorPicker",label:(0,k.localize)(799,"Hide the Color Picker"),alias:"Hide the Color Picker",precondition:E.EditorContextKeys.standaloneColorPickerVisible.isEqualTo(!0),kbOpts:{primary:9,weight:100},metadata:{description:(0,k.localize2)(803,"Hide the standalone color picker.")}})}run(n,o){I.StandaloneColorPickerController.get(o)?.hide()}}class b extends d.EditorAction{constructor(){super({id:"editor.action.insertColorWithStandaloneColorPicker",label:(0,k.localize)(800,"Insert Color with Standalone Color Picker"),alias:"Insert Color with Standalone Color Picker",precondition:E.EditorContextKeys.standaloneColorPickerFocused.isEqualTo(!0),kbOpts:{primary:3,weight:100},metadata:{description:(0,k.localize2)(804,"Insert hex/rgb/hsl colors with the focused standalone color picker.")}})}run(n,o){I.StandaloneColorPickerController.get(o)?.insertColor()}}(0,d.registerEditorAction)(_),(0,d.registerEditorAction)(b),(0,y.registerAction2)(m)}),define(ne[822],se([1,0,2,16,15,9,4,23,35,610,507]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DragAndDropController=void 0;function p(o){return k.isMacintosh?o.altKey:o.ctrlKey}class n extends d.Disposable{static{this.ID="editor.contrib.dragAndDrop"}static{this.TRIGGER_KEY_VALUE=k.isMacintosh?6:5}constructor(t){super(),this._editor=t,this._dndDecorationIds=this._editor.createDecorationsCollection(),this._register(this._editor.onMouseDown(i=>this._onEditorMouseDown(i))),this._register(this._editor.onMouseUp(i=>this._onEditorMouseUp(i))),this._register(this._editor.onMouseDrag(i=>this._onEditorMouseDrag(i))),this._register(this._editor.onMouseDrop(i=>this._onEditorMouseDrop(i))),this._register(this._editor.onMouseDropCanceled(()=>this._onEditorMouseDropCanceled())),this._register(this._editor.onKeyDown(i=>this.onEditorKeyDown(i))),this._register(this._editor.onKeyUp(i=>this.onEditorKeyUp(i))),this._register(this._editor.onDidBlurEditorWidget(()=>this.onEditorBlur())),this._register(this._editor.onDidBlurEditorText(()=>this.onEditorBlur())),this._mouseDown=!1,this._modifierPressed=!1,this._dragSelection=null}onEditorBlur(){this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1,this._modifierPressed=!1}onEditorKeyDown(t){!this._editor.getOption(35)||this._editor.getOption(22)||(p(t)&&(this._modifierPressed=!0),this._mouseDown&&p(t)&&this._editor.updateOptions({mouseStyle:"copy"}))}onEditorKeyUp(t){!this._editor.getOption(35)||this._editor.getOption(22)||(p(t)&&(this._modifierPressed=!1),this._mouseDown&&t.keyCode===n.TRIGGER_KEY_VALUE&&this._editor.updateOptions({mouseStyle:"default"}))}_onEditorMouseDown(t){this._mouseDown=!0}_onEditorMouseUp(t){this._mouseDown=!1,this._editor.updateOptions({mouseStyle:"text"})}_onEditorMouseDrag(t){const i=t.target;if(this._dragSelection===null){const g=(this._editor.getSelections()||[]).filter(c=>i.position&&c.containsPosition(i.position));if(g.length===1)this._dragSelection=g[0];else return}p(t.event)?this._editor.updateOptions({mouseStyle:"copy"}):this._editor.updateOptions({mouseStyle:"default"}),i.position&&(this._dragSelection.containsPosition(i.position)?this._removeDecoration():this.showAt(i.position))}_onEditorMouseDropCanceled(){this._editor.updateOptions({mouseStyle:"text"}),this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1}_onEditorMouseDrop(t){if(t.target&&(this._hitContent(t.target)||this._hitMargin(t.target))&&t.target.position){const i=new E.Position(t.target.position.lineNumber,t.target.position.column);if(this._dragSelection===null){let s=null;if(t.event.shiftKey){const g=this._editor.getSelection();if(g){const{selectionStartLineNumber:c,selectionStartColumn:l}=g;s=[new m.Selection(c,l,i.lineNumber,i.column)]}}else s=(this._editor.getSelections()||[]).map(g=>g.containsPosition(i)?new m.Selection(i.lineNumber,i.column,i.lineNumber,i.column):g);this._editor.setSelections(s||[],"mouse",3)}else(!this._dragSelection.containsPosition(i)||(p(t.event)||this._modifierPressed)&&(this._dragSelection.getEndPosition().equals(i)||this._dragSelection.getStartPosition().equals(i)))&&(this._editor.pushUndoStop(),this._editor.executeCommand(n.ID,new b.DragAndDropCommand(this._dragSelection,i,p(t.event)||this._modifierPressed)),this._editor.pushUndoStop())}this._editor.updateOptions({mouseStyle:"text"}),this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1}static{this._DECORATION_OPTIONS=_.ModelDecorationOptions.register({description:"dnd-target",className:"dnd-target"})}showAt(t){this._dndDecorationIds.set([{range:new y.Range(t.lineNumber,t.column,t.lineNumber,t.column),options:n._DECORATION_OPTIONS}]),this._editor.revealPosition(t,1)}_removeDecoration(){this._dndDecorationIds.clear()}_hitContent(t){return t.type===6||t.type===7}_hitMargin(t){return t.type===2||t.type===3||t.type===4}dispose(){this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1,this._modifierPressed=!1,super.dispose()}}e.DragAndDropController=n,(0,I.registerEditorContribution)(n.ID,n,2)}),define(ne[823],se([1,0,4,40,35,32,25]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FindDecorations=void 0;class m{constructor(b){this._editor=b,this._decorations=[],this._overviewRulerApproximateDecorations=[],this._findScopeDecorationIds=[],this._rangeHighlightDecorationId=null,this._highlightedDecorationId=null,this._startPosition=this._editor.getPosition()}dispose(){this._editor.removeDecorations(this._allDecorations()),this._decorations=[],this._overviewRulerApproximateDecorations=[],this._findScopeDecorationIds=[],this._rangeHighlightDecorationId=null,this._highlightedDecorationId=null}reset(){this._decorations=[],this._overviewRulerApproximateDecorations=[],this._findScopeDecorationIds=[],this._rangeHighlightDecorationId=null,this._highlightedDecorationId=null}getCount(){return this._decorations.length}getFindScope(){return this._findScopeDecorationIds[0]?this._editor.getModel().getDecorationRange(this._findScopeDecorationIds[0]):null}getFindScopes(){if(this._findScopeDecorationIds.length){const b=this._findScopeDecorationIds.map(p=>this._editor.getModel().getDecorationRange(p)).filter(p=>!!p);if(b.length)return b}return null}getStartPosition(){return this._startPosition}setStartPosition(b){this._startPosition=b,this.setCurrentFindMatch(null)}_getDecorationIndex(b){const p=this._decorations.indexOf(b);return p>=0?p+1:1}getDecorationRangeAt(b){const p=b{if(this._highlightedDecorationId!==null&&(o.changeDecorationOptions(this._highlightedDecorationId,m._FIND_MATCH_DECORATION),this._highlightedDecorationId=null),p!==null&&(this._highlightedDecorationId=p,o.changeDecorationOptions(this._highlightedDecorationId,m._CURRENT_FIND_MATCH_DECORATION)),this._rangeHighlightDecorationId!==null&&(o.removeDecoration(this._rangeHighlightDecorationId),this._rangeHighlightDecorationId=null),p!==null){let t=this._editor.getModel().getDecorationRange(p);if(t.startLineNumber!==t.endLineNumber&&t.endColumn===1){const i=t.endLineNumber-1,s=this._editor.getModel().getLineMaxColumn(i);t=new d.Range(t.startLineNumber,t.startColumn,i,s)}this._rangeHighlightDecorationId=o.addDecoration(t,m._RANGE_HIGHLIGHT_DECORATION)}}),n}set(b,p){this._editor.changeDecorations(n=>{let o=m._FIND_MATCH_DECORATION;const t=[];if(b.length>1e3){o=m._FIND_MATCH_NO_OVERVIEW_DECORATION;const s=this._editor.getModel().getLineCount(),c=this._editor.getLayoutInfo().height/s,l=Math.max(2,Math.ceil(3/c));let a=b[0].range.startLineNumber,r=b[0].range.endLineNumber;for(let u=1,C=b.length;u=f.startLineNumber?f.endLineNumber>r&&(r=f.endLineNumber):(t.push({range:new d.Range(a,1,r,1),options:m._FIND_MATCH_ONLY_OVERVIEW_DECORATION}),a=f.startLineNumber,r=f.endLineNumber)}t.push({range:new d.Range(a,1,r,1),options:m._FIND_MATCH_ONLY_OVERVIEW_DECORATION})}const i=new Array(b.length);for(let s=0,g=b.length;sn.removeDecoration(s)),this._findScopeDecorationIds=[]),p?.length&&(this._findScopeDecorationIds=p.map(s=>n.addDecoration(s,m._FIND_SCOPE_DECORATION)))})}matchBeforePosition(b){if(this._decorations.length===0)return null;for(let p=this._decorations.length-1;p>=0;p--){const n=this._decorations[p],o=this._editor.getModel().getDecorationRange(n);if(!(!o||o.endLineNumber>b.lineNumber)){if(o.endLineNumberb.column))return o}}return this._editor.getModel().getDecorationRange(this._decorations[this._decorations.length-1])}matchAfterPosition(b){if(this._decorations.length===0)return null;for(let p=0,n=this._decorations.length;pb.lineNumber)return t;if(!(t.startColumn{if(this._editor.hasModel())return this.research(!1)},100),this._toDispose.add(this._updateDecorationsScheduler),this._toDispose.add(this._editor.onDidChangeCursorPosition(a=>{(a.reason===3||a.reason===5||a.reason===6)&&this._decorations.setStartPosition(this._editor.getPosition())})),this._ignoreModelContentChanged=!1,this._toDispose.add(this._editor.onDidChangeModelContent(a=>{this._ignoreModelContentChanged||(a.isFlush&&this._decorations.reset(),this._decorations.setStartPosition(this._editor.getPosition()),this._updateDecorationsScheduler.schedule())})),this._toDispose.add(this._state.onFindReplaceStateChange(a=>this._onStateChanged(a))),this.research(!1,this._state.searchScope)}dispose(){this._isDisposed=!0,(0,I.dispose)(this._startSearchingTimer),this._toDispose.dispose()}_onStateChanged(c){this._isDisposed||this._editor.hasModel()&&(c.searchString||c.isReplaceRevealed||c.isRegex||c.wholeWord||c.matchCase||c.searchScope)&&(this._editor.getModel().isTooLargeForSyncing()?(this._startSearchingTimer.cancel(),this._startSearchingTimer.setIfNotSet(()=>{c.searchScope?this.research(c.moveCursor,this._state.searchScope):this.research(c.moveCursor)},i)):c.searchScope?this.research(c.moveCursor,this._state.searchScope):this.research(c.moveCursor))}static _getSearchRange(c,l){return l||c.getFullModelRange()}research(c,l){let a=null;typeof l<"u"?l!==null&&(Array.isArray(l)?a=l:a=[l]):a=this._decorations.getFindScopes(),a!==null&&(a=a.map(f=>{if(f.startLineNumber!==f.endLineNumber){let h=f.endLineNumber;return f.endColumn===1&&(h=h-1),new m.Range(f.startLineNumber,1,h,this._editor.getModel().getLineMaxColumn(h))}return f}));const r=this._findMatches(a,!1,e.MATCHES_LIMIT);this._decorations.set(r,a);const u=this._editor.getSelection();let C=this._decorations.getCurrentMatchesPosition(u);if(C===0&&r.length>0){const f=(0,d.findFirstIdxMonotonousOrArrLen)(r.map(h=>h.range),h=>m.Range.compareRangesUsingStarts(h,u)>=0);C=f>0?f-1+1:C}this._state.changeMatchInfo(C,this._decorations.getCount(),void 0),c&&this._editor.getOption(41).cursorMoveOnType&&this._moveToNextMatch(this._decorations.getStartPosition())}_hasMatches(){return this._state.matchesCount>0}_cannotFind(){if(!this._hasMatches()){const c=this._decorations.getFindScope();return c&&this._editor.revealRangeInCenterIfOutsideViewport(c,0),!0}return!1}_setCurrentFindMatch(c){const l=this._decorations.setCurrentFindMatch(c);this._state.changeMatchInfo(l,this._decorations.getCount(),c),this._editor.setSelection(c),this._editor.revealRangeInCenterIfOutsideViewport(c,0)}_prevSearchPosition(c){const l=this._state.isRegex&&(this._state.searchString.indexOf("^")>=0||this._state.searchString.indexOf("$")>=0);let{lineNumber:a,column:r}=c;const u=this._editor.getModel();return l||r===1?(a===1?a=u.getLineCount():a--,r=u.getLineMaxColumn(a)):r--,new y.Position(a,r)}_moveToPrevMatch(c,l=!1){if(!this._state.canNavigateBack()){const w=this._decorations.matchAfterPosition(c);w&&this._setCurrentFindMatch(w);return}if(this._decorations.getCount()=0||this._state.searchString.indexOf("$")>=0);let{lineNumber:a,column:r}=c;const u=this._editor.getModel();return l||r===u.getLineMaxColumn(a)?(a===u.getLineCount()?a=1:a++,r=1):r++,new y.Position(a,r)}_moveToNextMatch(c){if(!this._state.canNavigateForward()){const a=this._decorations.matchBeforePosition(c);a&&this._setCurrentFindMatch(a);return}if(this._decorations.getCount()s._getSearchRange(this._editor.getModel(),u));return this._editor.getModel().findMatches(this._state.searchString,r,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(132):null,l,a)}replaceAll(){if(!this._hasMatches())return;const c=this._decorations.getFindScopes();c===null&&this._state.matchesCount>=e.MATCHES_LIMIT?this._largeReplaceAll():this._regularReplaceAll(c),this.research(!1)}_largeReplaceAll(){const l=new b.SearchParams(this._state.searchString,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(132):null).parseSearchRequest();if(!l)return;let a=l.regex;if(!a.multiline){let S="mu";a.ignoreCase&&(S+="i"),a.global&&(S+="g"),a=new RegExp(a.source,S)}const r=this._editor.getModel(),u=r.getValue(1),C=r.getFullModelRange(),f=this._getReplacePattern();let h;const v=this._state.preserveCase;f.hasReplacementPatterns||v?h=u.replace(a,function(){return f.buildReplaceString(arguments,v)}):h=u.replace(a,f.buildReplaceString(null,v));const w=new E.ReplaceCommandThatPreservesSelection(C,h,this._editor.getSelection());this._executeEditorCommand("replaceAll",w)}_regularReplaceAll(c){const l=this._getReplacePattern(),a=this._findMatches(c,l.hasReplacementPatterns||this._state.preserveCase,1073741824),r=[];for(let C=0,f=a.length;CC.range),r);this._executeEditorCommand("replaceAll",u)}selectAllMatches(){if(!this._hasMatches())return;const c=this._decorations.getFindScopes();let a=this._findMatches(c,!1,1073741824).map(u=>new _.Selection(u.range.startLineNumber,u.range.startColumn,u.range.endLineNumber,u.range.endColumn));const r=this._editor.getSelection();for(let u=0,C=a.length;uthis._hide(),2e3)),this._isVisible=!1,this._editor=n,this._state=o,this._keybindingService=t,this._domNode=document.createElement("div"),this._domNode.className="findOptionsWidget",this._domNode.style.display="none",this._domNode.style.top="10px",this._domNode.style.zIndex="12",this._domNode.setAttribute("role","presentation"),this._domNode.setAttribute("aria-hidden","true");const i={inputActiveOptionBorder:(0,m.asCssVariable)(m.inputActiveOptionBorder),inputActiveOptionForeground:(0,m.asCssVariable)(m.inputActiveOptionForeground),inputActiveOptionBackground:(0,m.asCssVariable)(m.inputActiveOptionBackground)},s=this._register((0,_.createInstantHoverDelegate)());this.caseSensitive=this._register(new k.CaseSensitiveToggle({appendTitle:this._keybindingLabelFor(y.FIND_IDS.ToggleCaseSensitiveCommand),isChecked:this._state.matchCase,hoverDelegate:s,...i})),this._domNode.appendChild(this.caseSensitive.domNode),this._register(this.caseSensitive.onChange(()=>{this._state.change({matchCase:this.caseSensitive.checked},!1)})),this.wholeWords=this._register(new k.WholeWordsToggle({appendTitle:this._keybindingLabelFor(y.FIND_IDS.ToggleWholeWordCommand),isChecked:this._state.wholeWord,hoverDelegate:s,...i})),this._domNode.appendChild(this.wholeWords.domNode),this._register(this.wholeWords.onChange(()=>{this._state.change({wholeWord:this.wholeWords.checked},!1)})),this.regex=this._register(new k.RegexToggle({appendTitle:this._keybindingLabelFor(y.FIND_IDS.ToggleRegexCommand),isChecked:this._state.isRegex,hoverDelegate:s,...i})),this._domNode.appendChild(this.regex.domNode),this._register(this.regex.onChange(()=>{this._state.change({isRegex:this.regex.checked},!1)})),this._editor.addOverlayWidget(this),this._register(this._state.onFindReplaceStateChange(g=>{let c=!1;g.isRegex&&(this.regex.checked=this._state.isRegex,c=!0),g.wholeWord&&(this.wholeWords.checked=this._state.wholeWord,c=!0),g.matchCase&&(this.caseSensitive.checked=this._state.matchCase,c=!0),!this._state.isRevealed&&c&&this._revealTemporarily()})),this._register(d.addDisposableListener(this._domNode,d.EventType.MOUSE_LEAVE,g=>this._onMouseLeave())),this._register(d.addDisposableListener(this._domNode,"mouseover",g=>this._onMouseOver()))}_keybindingLabelFor(n){const o=this._keybindingService.lookupKeybinding(n);return o?` (${o.getLabel()})`:""}dispose(){this._editor.removeOverlayWidget(this),super.dispose()}getId(){return b.ID}getDomNode(){return this._domNode}getPosition(){return{preference:0}}highlightFindOptions(){this._revealTemporarily()}_revealTemporarily(){this._show(),this._hideSoon.schedule()}_onMouseLeave(){this._hideSoon.schedule()}_onMouseOver(){this._hideSoon.cancel()}_show(){this._isVisible||(this._isVisible=!0,this._domNode.style.display="block")}_hide(){this._isVisible&&(this._isVisible=!1,this._domNode.style.display="none")}}e.FindOptionsWidget=b}),define(ne[825],se([1,0,6,2,4,220]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FindReplaceState=void 0;function y(_,b){return _===1?!0:_===2?!1:b}class m extends k.Disposable{get searchString(){return this._searchString}get replaceString(){return this._replaceString}get isRevealed(){return this._isRevealed}get isReplaceRevealed(){return this._isReplaceRevealed}get isRegex(){return y(this._isRegexOverride,this._isRegex)}get wholeWord(){return y(this._wholeWordOverride,this._wholeWord)}get matchCase(){return y(this._matchCaseOverride,this._matchCase)}get preserveCase(){return y(this._preserveCaseOverride,this._preserveCase)}get actualIsRegex(){return this._isRegex}get actualWholeWord(){return this._wholeWord}get actualMatchCase(){return this._matchCase}get actualPreserveCase(){return this._preserveCase}get searchScope(){return this._searchScope}get matchesPosition(){return this._matchesPosition}get matchesCount(){return this._matchesCount}get currentMatch(){return this._currentMatch}constructor(){super(),this._onFindReplaceStateChange=this._register(new d.Emitter),this.onFindReplaceStateChange=this._onFindReplaceStateChange.event,this._searchString="",this._replaceString="",this._isRevealed=!1,this._isReplaceRevealed=!1,this._isRegex=!1,this._isRegexOverride=0,this._wholeWord=!1,this._wholeWordOverride=0,this._matchCase=!1,this._matchCaseOverride=0,this._preserveCase=!1,this._preserveCaseOverride=0,this._searchScope=null,this._matchesPosition=0,this._matchesCount=0,this._currentMatch=null,this._loop=!0,this._isSearching=!1,this._filters=null}changeMatchInfo(b,p,n){const o={moveCursor:!1,updateHistory:!1,searchString:!1,replaceString:!1,isRevealed:!1,isReplaceRevealed:!1,isRegex:!1,wholeWord:!1,matchCase:!1,preserveCase:!1,searchScope:!1,matchesPosition:!1,matchesCount:!1,currentMatch:!1,loop:!1,isSearching:!1,filters:!1};let t=!1;p===0&&(b=0),b>p&&(b=p),this._matchesPosition!==b&&(this._matchesPosition=b,o.matchesPosition=!0,t=!0),this._matchesCount!==p&&(this._matchesCount=p,o.matchesCount=!0,t=!0),typeof n<"u"&&(I.Range.equalsRange(this._currentMatch,n)||(this._currentMatch=n,o.currentMatch=!0,t=!0)),t&&this._onFindReplaceStateChange.fire(o)}change(b,p,n=!0){const o={moveCursor:p,updateHistory:n,searchString:!1,replaceString:!1,isRevealed:!1,isReplaceRevealed:!1,isRegex:!1,wholeWord:!1,matchCase:!1,preserveCase:!1,searchScope:!1,matchesPosition:!1,matchesCount:!1,currentMatch:!1,loop:!1,isSearching:!1,filters:!1};let t=!1;const i=this.isRegex,s=this.wholeWord,g=this.matchCase,c=this.preserveCase;typeof b.searchString<"u"&&this._searchString!==b.searchString&&(this._searchString=b.searchString,o.searchString=!0,t=!0),typeof b.replaceString<"u"&&this._replaceString!==b.replaceString&&(this._replaceString=b.replaceString,o.replaceString=!0,t=!0),typeof b.isRevealed<"u"&&this._isRevealed!==b.isRevealed&&(this._isRevealed=b.isRevealed,o.isRevealed=!0,t=!0),typeof b.isReplaceRevealed<"u"&&this._isReplaceRevealed!==b.isReplaceRevealed&&(this._isReplaceRevealed=b.isReplaceRevealed,o.isReplaceRevealed=!0,t=!0),typeof b.isRegex<"u"&&(this._isRegex=b.isRegex),typeof b.wholeWord<"u"&&(this._wholeWord=b.wholeWord),typeof b.matchCase<"u"&&(this._matchCase=b.matchCase),typeof b.preserveCase<"u"&&(this._preserveCase=b.preserveCase),typeof b.searchScope<"u"&&(b.searchScope?.every(l=>this._searchScope?.some(a=>!I.Range.equalsRange(a,l)))||(this._searchScope=b.searchScope,o.searchScope=!0,t=!0)),typeof b.loop<"u"&&this._loop!==b.loop&&(this._loop=b.loop,o.loop=!0,t=!0),typeof b.isSearching<"u"&&this._isSearching!==b.isSearching&&(this._isSearching=b.isSearching,o.isSearching=!0,t=!0),typeof b.filters<"u"&&(this._filters?this._filters.update(b.filters):this._filters=b.filters,o.filters=!0,t=!0),this._isRegexOverride=typeof b.isRegexOverride<"u"?b.isRegexOverride:0,this._wholeWordOverride=typeof b.wholeWordOverride<"u"?b.wholeWordOverride:0,this._matchCaseOverride=typeof b.matchCaseOverride<"u"?b.matchCaseOverride:0,this._preserveCaseOverride=typeof b.preserveCaseOverride<"u"?b.preserveCaseOverride:0,i!==this.isRegex&&(t=!0,o.isRegex=!0),s!==this.wholeWord&&(t=!0,o.wholeWord=!0),g!==this.matchCase&&(t=!0,o.matchCase=!0),c!==this.preserveCase&&(t=!0,o.preserveCase=!0),t&&this._onFindReplaceStateChange.fire(o)}canNavigateBack(){return this.canNavigateInLoop()||this.matchesPosition!==1}canNavigateForward(){return this.canNavigateInLoop()||this.matchesPosition=E.MATCHES_LIMIT}}e.FindReplaceState=m}),define(ne[826],se([1,0,5,46,175,173,85,14,26,8,2,16,11,4,220,3,404,675,32,71,25,30,97,19,110,44,510]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SimpleButton=e.FindWidget=e.FindWidgetViewZone=e.NLS_NO_RESULTS=e.NLS_MATCHES_LOCATION=e.findNextMatchIcon=e.findPreviousMatchIcon=e.findReplaceAllIcon=e.findReplaceIcon=e.findSelectionIcon=void 0;const w=(0,a.registerIcon)("find-collapsed",_.Codicon.chevronRight,s.localize(864,"Icon to indicate that the editor find widget is collapsed.")),S=(0,a.registerIcon)("find-expanded",_.Codicon.chevronDown,s.localize(865,"Icon to indicate that the editor find widget is expanded."));e.findSelectionIcon=(0,a.registerIcon)("find-selection",_.Codicon.selection,s.localize(866,"Icon for 'Find in Selection' in the editor find widget.")),e.findReplaceIcon=(0,a.registerIcon)("find-replace",_.Codicon.replace,s.localize(867,"Icon for 'Replace' in the editor find widget.")),e.findReplaceAllIcon=(0,a.registerIcon)("find-replace-all",_.Codicon.replaceAll,s.localize(868,"Icon for 'Replace All' in the editor find widget.")),e.findPreviousMatchIcon=(0,a.registerIcon)("find-previous-match",_.Codicon.arrowUp,s.localize(869,"Icon for 'Find Previous' in the editor find widget.")),e.findNextMatchIcon=(0,a.registerIcon)("find-next-match",_.Codicon.arrowDown,s.localize(870,"Icon for 'Find Next' in the editor find widget."));const L=s.localize(871,"Find / Replace"),D=s.localize(872,"Find"),T=s.localize(873,"Find"),M=s.localize(874,"Previous Match"),A=s.localize(875,"Next Match"),P=s.localize(876,"Find in Selection"),N=s.localize(877,"Close"),O=s.localize(878,"Replace"),F=s.localize(879,"Replace"),x=s.localize(880,"Replace"),W=s.localize(881,"Replace All"),V=s.localize(882,"Toggle Replace"),q=s.localize(883,"Only the first {0} results are highlighted, but all find operations work on the entire text.",i.MATCHES_LIMIT);e.NLS_MATCHES_LOCATION=s.localize(884,"{0} of {1}"),e.NLS_NO_RESULTS=s.localize(885,"No results");const H=419,U=275-54;let j=69;const Y=33,G="ctrlEnterReplaceAll.windows.donotask",K=n.isMacintosh?256:2048;class R{constructor(ae){this.afterLineNumber=ae,this.heightInPx=Y,this.suppressMouseDown=!1,this.domNode=document.createElement("div"),this.domNode.className="dock-find-viewzone"}}e.FindWidgetViewZone=R;function J(pe,ae,ee){const de=!!ae.match(/\n/);if(ee&&de&&ee.selectionStart>0){pe.stopPropagation();return}}function ie(pe,ae,ee){const de=!!ae.match(/\n/);if(ee&&de&&ee.selectionEndthis._updateHistoryDelayer.cancel())),this._register(this._state.onFindReplaceStateChange(re=>this._onStateChanged(re))),this._buildDomNode(),this._updateButtons(),this._tryUpdateWidgetWidth(),this._findInput.inputBox.layout(),this._register(this._codeEditor.onDidChangeConfiguration(re=>{if(re.hasChanged(92)&&(this._codeEditor.getOption(92)&&this._state.change({isReplaceRevealed:!1},!1),this._updateButtons()),re.hasChanged(146)&&this._tryUpdateWidgetWidth(),re.hasChanged(2)&&this.updateAccessibilitySupport(),re.hasChanged(41)){const le=this._codeEditor.getOption(41).loop;this._state.change({loop:le},!1);const me=this._codeEditor.getOption(41).addExtraSpaceOnTop;me&&!this._viewZone&&(this._viewZone=new R(0),this._showViewZone()),!me&&this._viewZone&&this._removeViewZone()}})),this.updateAccessibilitySupport(),this._register(this._codeEditor.onDidChangeCursorSelection(()=>{this._isVisible&&this._updateToggleSelectionFindButton()})),this._register(this._codeEditor.onDidFocusEditorWidget(async()=>{if(this._isVisible){const re=await this._controller.getGlobalBufferTerm();re&&re!==this._state.searchString&&(this._state.change({searchString:re},!1),this._findInput.select())}})),this._findInputFocused=i.CONTEXT_FIND_INPUT_FOCUSED.bindTo(B),this._findFocusTracker=this._register(d.trackFocus(this._findInput.inputBox.inputElement)),this._register(this._findFocusTracker.onDidFocus(()=>{this._findInputFocused.set(!0),this._updateSearchScope()})),this._register(this._findFocusTracker.onDidBlur(()=>{this._findInputFocused.set(!1)})),this._replaceInputFocused=i.CONTEXT_REPLACE_INPUT_FOCUSED.bindTo(B),this._replaceFocusTracker=this._register(d.trackFocus(this._replaceInput.inputBox.inputElement)),this._register(this._replaceFocusTracker.onDidFocus(()=>{this._replaceInputFocused.set(!0),this._updateSearchScope()})),this._register(this._replaceFocusTracker.onDidBlur(()=>{this._replaceInputFocused.set(!1)})),this._codeEditor.addOverlayWidget(this),this._codeEditor.getOption(41).addExtraSpaceOnTop&&(this._viewZone=new R(0)),this._register(this._codeEditor.onDidChangeModel(()=>{this._isVisible&&(this._viewZoneId=void 0)})),this._register(this._codeEditor.onDidScrollChange(re=>{if(re.scrollTopChanged){this._layoutViewZone();return}setTimeout(()=>{this._layoutViewZone()},0)}))}getId(){return ue.ID}getDomNode(){return this._domNode}getPosition(){return this._isVisible?{preference:0}:null}_onStateChanged(ae){if(ae.searchString){try{this._ignoreChangeEvent=!0,this._findInput.setValue(this._state.searchString)}finally{this._ignoreChangeEvent=!1}this._updateButtons()}if(ae.replaceString&&(this._replaceInput.inputBox.value=this._state.replaceString),ae.isRevealed&&(this._state.isRevealed?this._reveal():this._hide(!0)),ae.isReplaceRevealed&&(this._state.isReplaceRevealed?!this._codeEditor.getOption(92)&&!this._isReplaceVisible&&(this._isReplaceVisible=!0,this._replaceInput.width=d.getTotalWidth(this._findInput.domNode),this._updateButtons(),this._replaceInput.inputBox.layout()):this._isReplaceVisible&&(this._isReplaceVisible=!1,this._updateButtons())),(ae.isRevealed||ae.isReplaceRevealed)&&(this._state.isRevealed||this._state.isReplaceRevealed)&&this._tryUpdateHeight()&&this._showViewZone(),ae.isRegex&&this._findInput.setRegex(this._state.isRegex),ae.wholeWord&&this._findInput.setWholeWords(this._state.wholeWord),ae.matchCase&&this._findInput.setCaseSensitive(this._state.matchCase),ae.preserveCase&&this._replaceInput.setPreserveCase(this._state.preserveCase),ae.searchScope&&(this._state.searchScope?this._toggleSelectionFind.checked=!0:this._toggleSelectionFind.checked=!1,this._updateToggleSelectionFindButton()),ae.searchString||ae.matchesCount||ae.matchesPosition){const ee=this._state.searchString.length>0&&this._state.matchesCount===0;this._domNode.classList.toggle("no-results",ee),this._updateMatchesCount(),this._updateButtons()}(ae.searchString||ae.currentMatch)&&this._layoutViewZone(),ae.updateHistory&&this._delayedUpdateHistory(),ae.loop&&this._updateButtons()}_delayedUpdateHistory(){this._updateHistoryDelayer.trigger(this._updateHistory.bind(this)).then(void 0,b.onUnexpectedError)}_updateHistory(){this._state.searchString&&this._findInput.inputBox.addToHistory(),this._state.replaceString&&this._replaceInput.inputBox.addToHistory()}_updateMatchesCount(){this._matchesCount.style.minWidth=j+"px",this._state.matchesCount>=i.MATCHES_LIMIT?this._matchesCount.title=q:this._matchesCount.title="",this._matchesCount.firstChild?.remove();let ae;if(this._state.matchesCount>0){let ee=String(this._state.matchesCount);this._state.matchesCount>=i.MATCHES_LIMIT&&(ee+="+");let de=String(this._state.matchesPosition);de==="0"&&(de="?"),ae=o.format(e.NLS_MATCHES_LOCATION,de,ee)}else ae=e.NLS_NO_RESULTS;this._matchesCount.appendChild(document.createTextNode(ae)),(0,k.alert)(this._getAriaLabel(ae,this._state.currentMatch,this._state.searchString)),j=Math.max(j,this._matchesCount.clientWidth)}_getAriaLabel(ae,ee,de){if(ae===e.NLS_NO_RESULTS)return de===""?s.localize(886,"{0} found",ae):s.localize(887,"{0} found for '{1}'",ae,de);if(ee){const ge=s.localize(888,"{0} found for '{1}', at {2}",ae,de,ee.startLineNumber+":"+ee.startColumn),X=this._codeEditor.getModel();return X&&ee.startLineNumber<=X.getLineCount()&&ee.startLineNumber>=1?`${X.getLineContent(ee.startLineNumber)}, ${ge}`:ge}return s.localize(889,"{0} found for '{1}'",ae,de)}_updateToggleSelectionFindButton(){const ae=this._codeEditor.getSelection(),ee=ae?ae.startLineNumber!==ae.endLineNumber||ae.startColumn!==ae.endColumn:!1,de=this._toggleSelectionFind.checked;this._isVisible&&(de||ee)?this._toggleSelectionFind.enable():this._toggleSelectionFind.disable()}_updateButtons(){this._findInput.setEnabled(this._isVisible),this._replaceInput.setEnabled(this._isVisible&&this._isReplaceVisible),this._updateToggleSelectionFindButton(),this._closeBtn.setEnabled(this._isVisible);const ae=this._state.searchString.length>0,ee=!!this._state.matchesCount;this._prevBtn.setEnabled(this._isVisible&&ae&&ee&&this._state.canNavigateBack()),this._nextBtn.setEnabled(this._isVisible&&ae&&ee&&this._state.canNavigateForward()),this._replaceBtn.setEnabled(this._isVisible&&this._isReplaceVisible&&ae),this._replaceAllBtn.setEnabled(this._isVisible&&this._isReplaceVisible&&ae),this._domNode.classList.toggle("replaceToggled",this._isReplaceVisible),this._toggleReplaceBtn.setExpanded(this._isReplaceVisible);const de=!this._codeEditor.getOption(92);this._toggleReplaceBtn.setEnabled(this._isVisible&&de)}_reveal(){if(this._revealTimeouts.forEach(ae=>{clearTimeout(ae)}),this._revealTimeouts=[],!this._isVisible){this._isVisible=!0;const ae=this._codeEditor.getSelection();switch(this._codeEditor.getOption(41).autoFindInSelection){case"always":this._toggleSelectionFind.checked=!0;break;case"never":this._toggleSelectionFind.checked=!1;break;case"multiline":{const de=!!ae&&ae.startLineNumber!==ae.endLineNumber;this._toggleSelectionFind.checked=de;break}default:break}this._tryUpdateWidgetWidth(),this._updateButtons(),this._revealTimeouts.push(setTimeout(()=>{this._domNode.classList.add("visible"),this._domNode.setAttribute("aria-hidden","false")},0)),this._revealTimeouts.push(setTimeout(()=>{this._findInput.validate()},200)),this._codeEditor.layoutOverlayWidget(this);let ee=!0;if(this._codeEditor.getOption(41).seedSearchStringFromSelection&&ae){const de=this._codeEditor.getDomNode();if(de){const ge=d.getDomNodePagePosition(de),X=this._codeEditor.getScrolledVisiblePosition(ae.getStartPosition()),B=ge.left+(X?X.left:0),$=X?X.top:0;if(this._viewZone&&$ae.startLineNumber&&(ee=!1);const Q=d.getTopLeftOffset(this._domNode).left;B>Q&&(ee=!1);const Z=this._codeEditor.getScrolledVisiblePosition(ae.getEndPosition());ge.left+(Z?Z.left:0)>Q&&(ee=!1)}}}this._showViewZone(ee)}}_hide(ae){this._revealTimeouts.forEach(ee=>{clearTimeout(ee)}),this._revealTimeouts=[],this._isVisible&&(this._isVisible=!1,this._updateButtons(),this._domNode.classList.remove("visible"),this._domNode.setAttribute("aria-hidden","true"),this._findInput.clearMessage(),ae&&this._codeEditor.focus(),this._codeEditor.layoutOverlayWidget(this),this._removeViewZone())}_layoutViewZone(ae){if(!this._codeEditor.getOption(41).addExtraSpaceOnTop){this._removeViewZone();return}if(!this._isVisible)return;const de=this._viewZone;this._viewZoneId!==void 0||!de||this._codeEditor.changeViewZones(ge=>{de.heightInPx=this._getHeight(),this._viewZoneId=ge.addZone(de),this._codeEditor.setScrollTop(ae||this._codeEditor.getScrollTop()+de.heightInPx)})}_showViewZone(ae=!0){if(!this._isVisible||!this._codeEditor.getOption(41).addExtraSpaceOnTop)return;this._viewZone===void 0&&(this._viewZone=new R(0));const de=this._viewZone;this._codeEditor.changeViewZones(ge=>{if(this._viewZoneId!==void 0){const X=this._getHeight();if(X===de.heightInPx)return;const B=X-de.heightInPx;de.heightInPx=X,ge.layoutZone(this._viewZoneId),ae&&this._codeEditor.setScrollTop(this._codeEditor.getScrollTop()+B);return}else{let X=this._getHeight();if(X-=this._codeEditor.getOption(84).top,X<=0)return;de.heightInPx=X,this._viewZoneId=ge.addZone(de),ae&&this._codeEditor.setScrollTop(this._codeEditor.getScrollTop()+X)}})}_removeViewZone(){this._codeEditor.changeViewZones(ae=>{this._viewZoneId!==void 0&&(ae.removeZone(this._viewZoneId),this._viewZoneId=void 0,this._viewZone&&(this._codeEditor.setScrollTop(this._codeEditor.getScrollTop()-this._viewZone.heightInPx),this._viewZone=void 0))})}_tryUpdateWidgetWidth(){if(!this._isVisible||!this._domNode.isConnected)return;const ae=this._codeEditor.getLayoutInfo();if(ae.contentWidth<=0){this._domNode.classList.add("hiddenEditor");return}else this._domNode.classList.contains("hiddenEditor")&&this._domNode.classList.remove("hiddenEditor");const de=ae.width,ge=ae.minimap.minimapWidth;let X=!1,B=!1,$=!1;if(this._resized&&d.getTotalWidth(this._domNode)>H){this._domNode.style.maxWidth=`${de-28-ge-15}px`,this._replaceInput.width=d.getTotalWidth(this._findInput.domNode);return}if(H+28+ge>=de&&(B=!0),H+28+ge-j>=de&&($=!0),H+28+ge-j>=de+50&&(X=!0),this._domNode.classList.toggle("collapsed-find-widget",X),this._domNode.classList.toggle("narrow-find-widget",$),this._domNode.classList.toggle("reduced-find-widget",B),!$&&!X&&(this._domNode.style.maxWidth=`${de-28-ge-15}px`),this._findInput.layout({collapsedFindWidget:X,narrowFindWidget:$,reducedFindWidget:B}),this._resized){const Q=this._findInput.inputBox.element.clientWidth;Q>0&&(this._replaceInput.width=Q)}else this._isReplaceVisible&&(this._replaceInput.width=d.getTotalWidth(this._findInput.domNode))}_getHeight(){let ae=0;return ae+=4,ae+=this._findInput.inputBox.height+2,this._isReplaceVisible&&(ae+=4,ae+=this._replaceInput.inputBox.height+2),ae+=4,ae}_tryUpdateHeight(){const ae=this._getHeight();return this._cachedHeight!==null&&this._cachedHeight===ae?!1:(this._cachedHeight=ae,this._domNode.style.height=`${ae}px`,!0)}focusFindInput(){this._findInput.select(),this._findInput.focus()}focusReplaceInput(){this._replaceInput.select(),this._replaceInput.focus()}highlightFindOptions(){this._findInput.highlightFindOptions()}_updateSearchScope(){if(this._codeEditor.hasModel()&&this._toggleSelectionFind.checked){const ae=this._codeEditor.getSelections();ae.map(ee=>{ee.endColumn===1&&ee.endLineNumber>ee.startLineNumber&&(ee=ee.setEndPosition(ee.endLineNumber-1,this._codeEditor.getModel().getLineMaxColumn(ee.endLineNumber-1)));const de=this._state.currentMatch;return ee.startLineNumber!==ee.endLineNumber&&!t.Range.equalsRange(ee,de)?ee:null}).filter(ee=>!!ee),ae.length&&this._state.change({searchScope:ae},!0)}}_onFindInputMouseDown(ae){ae.middleButton&&ae.stopPropagation()}_onFindInputKeyDown(ae){if(ae.equals(K|3))if(this._keybindingService.dispatchEvent(ae,ae.target)){ae.preventDefault();return}else{this._findInput.inputBox.insertAtCursor(` -`),ae.preventDefault();return}if(ae.equals(2)){this._isReplaceVisible?this._replaceInput.focus():this._findInput.focusOnCaseSensitive(),ae.preventDefault();return}if(ae.equals(2066)){this._codeEditor.focus(),ae.preventDefault();return}if(ae.equals(16))return J(ae,this._findInput.getValue(),this._findInput.domNode.querySelector("textarea"));if(ae.equals(18))return ie(ae,this._findInput.getValue(),this._findInput.domNode.querySelector("textarea"))}_onReplaceInputKeyDown(ae){if(ae.equals(K|3))if(this._keybindingService.dispatchEvent(ae,ae.target)){ae.preventDefault();return}else{n.isWindows&&n.isNative&&!this._ctrlEnterReplaceAllWarningPrompted&&(this._notificationService.info(s.localize(890,"Ctrl+Enter now inserts line break instead of replacing all. You can modify the keybinding for editor.action.replaceAll to override this behavior.")),this._ctrlEnterReplaceAllWarningPrompted=!0,this._storageService.store(G,!0,0,0)),this._replaceInput.inputBox.insertAtCursor(` -`),ae.preventDefault();return}if(ae.equals(2)){this._findInput.focusOnCaseSensitive(),ae.preventDefault();return}if(ae.equals(1026)){this._findInput.focus(),ae.preventDefault();return}if(ae.equals(2066)){this._codeEditor.focus(),ae.preventDefault();return}if(ae.equals(16))return J(ae,this._replaceInput.inputBox.value,this._replaceInput.inputBox.element.querySelector("textarea"));if(ae.equals(18))return ie(ae,this._replaceInput.inputBox.value,this._replaceInput.inputBox.element.querySelector("textarea"))}getVerticalSashLeft(ae){return 0}_keybindingLabelFor(ae){const ee=this._keybindingService.lookupKeybinding(ae);return ee?` (${ee.getLabel()})`:""}_buildDomNode(){this._findInput=this._register(new g.ContextScopedFindInput(null,this._contextViewProvider,{width:U,label:D,placeholder:T,appendCaseSensitiveLabel:this._keybindingLabelFor(i.FIND_IDS.ToggleCaseSensitiveCommand),appendWholeWordsLabel:this._keybindingLabelFor(i.FIND_IDS.ToggleWholeWordCommand),appendRegexLabel:this._keybindingLabelFor(i.FIND_IDS.ToggleRegexCommand),validation:te=>{if(te.length===0||!this._findInput.getRegex())return null;try{return new RegExp(te,"gu"),null}catch(re){return{content:re.message}}},flexibleHeight:!0,flexibleWidth:!0,flexibleMaxHeight:118,showCommonFindToggles:!0,showHistoryHint:()=>(0,c.showHistoryKeybindingHint)(this._keybindingService),inputBoxStyles:h.defaultInputBoxStyles,toggleStyles:h.defaultToggleStyles},this._contextKeyService)),this._findInput.setRegex(!!this._state.isRegex),this._findInput.setCaseSensitive(!!this._state.matchCase),this._findInput.setWholeWords(!!this._state.wholeWord),this._register(this._findInput.onKeyDown(te=>this._onFindInputKeyDown(te))),this._register(this._findInput.inputBox.onDidChange(()=>{this._ignoreChangeEvent||this._state.change({searchString:this._findInput.getValue()},!0)})),this._register(this._findInput.onDidOptionChange(()=>{this._state.change({isRegex:this._findInput.getRegex(),wholeWord:this._findInput.getWholeWords(),matchCase:this._findInput.getCaseSensitive()},!0)})),this._register(this._findInput.onCaseSensitiveKeyDown(te=>{te.equals(1026)&&this._isReplaceVisible&&(this._replaceInput.focus(),te.preventDefault())})),this._register(this._findInput.onRegexKeyDown(te=>{te.equals(2)&&this._isReplaceVisible&&(this._replaceInput.focusOnPreserve(),te.preventDefault())})),this._register(this._findInput.inputBox.onDidHeightChange(te=>{this._tryUpdateHeight()&&this._showViewZone()})),n.isLinux&&this._register(this._findInput.onMouseDown(te=>this._onFindInputMouseDown(te))),this._matchesCount=document.createElement("div"),this._matchesCount.className="matchesCount",this._updateMatchesCount();const de=this._register((0,v.createInstantHoverDelegate)());this._prevBtn=this._register(new he({label:M+this._keybindingLabelFor(i.FIND_IDS.PreviousMatchFindAction),icon:e.findPreviousMatchIcon,hoverDelegate:de,onTrigger:()=>{(0,f.assertIsDefined)(this._codeEditor.getAction(i.FIND_IDS.PreviousMatchFindAction)).run().then(void 0,b.onUnexpectedError)}},this._hoverService)),this._nextBtn=this._register(new he({label:A+this._keybindingLabelFor(i.FIND_IDS.NextMatchFindAction),icon:e.findNextMatchIcon,hoverDelegate:de,onTrigger:()=>{(0,f.assertIsDefined)(this._codeEditor.getAction(i.FIND_IDS.NextMatchFindAction)).run().then(void 0,b.onUnexpectedError)}},this._hoverService));const ge=document.createElement("div");ge.className="find-part",ge.appendChild(this._findInput.domNode);const X=document.createElement("div");X.className="find-actions",ge.appendChild(X),X.appendChild(this._matchesCount),X.appendChild(this._prevBtn.domNode),X.appendChild(this._nextBtn.domNode),this._toggleSelectionFind=this._register(new I.Toggle({icon:e.findSelectionIcon,title:P+this._keybindingLabelFor(i.FIND_IDS.ToggleSearchScopeCommand),isChecked:!1,hoverDelegate:de,inputActiveOptionBackground:(0,l.asCssVariable)(l.inputActiveOptionBackground),inputActiveOptionBorder:(0,l.asCssVariable)(l.inputActiveOptionBorder),inputActiveOptionForeground:(0,l.asCssVariable)(l.inputActiveOptionForeground)})),this._register(this._toggleSelectionFind.onChange(()=>{if(this._toggleSelectionFind.checked){if(this._codeEditor.hasModel()){let te=this._codeEditor.getSelections();te=te.map(re=>(re.endColumn===1&&re.endLineNumber>re.startLineNumber&&(re=re.setEndPosition(re.endLineNumber-1,this._codeEditor.getModel().getLineMaxColumn(re.endLineNumber-1))),re.isEmpty()?null:re)).filter(re=>!!re),te.length&&this._state.change({searchScope:te},!0)}}else this._state.change({searchScope:null},!0)})),X.appendChild(this._toggleSelectionFind.domNode),this._closeBtn=this._register(new he({label:N+this._keybindingLabelFor(i.FIND_IDS.CloseFindWidgetCommand),icon:a.widgetClose,hoverDelegate:de,onTrigger:()=>{this._state.change({isRevealed:!1,searchScope:null},!1)},onKeyDown:te=>{te.equals(2)&&this._isReplaceVisible&&(this._replaceBtn.isEnabled()?this._replaceBtn.focus():this._codeEditor.focus(),te.preventDefault())}},this._hoverService)),this._replaceInput=this._register(new g.ContextScopedReplaceInput(null,void 0,{label:O,placeholder:F,appendPreserveCaseLabel:this._keybindingLabelFor(i.FIND_IDS.TogglePreserveCaseCommand),history:[],flexibleHeight:!0,flexibleWidth:!0,flexibleMaxHeight:118,showHistoryHint:()=>(0,c.showHistoryKeybindingHint)(this._keybindingService),inputBoxStyles:h.defaultInputBoxStyles,toggleStyles:h.defaultToggleStyles},this._contextKeyService,!0)),this._replaceInput.setPreserveCase(!!this._state.preserveCase),this._register(this._replaceInput.onKeyDown(te=>this._onReplaceInputKeyDown(te))),this._register(this._replaceInput.inputBox.onDidChange(()=>{this._state.change({replaceString:this._replaceInput.inputBox.value},!1)})),this._register(this._replaceInput.inputBox.onDidHeightChange(te=>{this._isReplaceVisible&&this._tryUpdateHeight()&&this._showViewZone()})),this._register(this._replaceInput.onDidOptionChange(()=>{this._state.change({preserveCase:this._replaceInput.getPreserveCase()},!0)})),this._register(this._replaceInput.onPreserveCaseKeyDown(te=>{te.equals(2)&&(this._prevBtn.isEnabled()?this._prevBtn.focus():this._nextBtn.isEnabled()?this._nextBtn.focus():this._toggleSelectionFind.enabled?this._toggleSelectionFind.focus():this._closeBtn.isEnabled()&&this._closeBtn.focus(),te.preventDefault())}));const B=this._register((0,v.createInstantHoverDelegate)());this._replaceBtn=this._register(new he({label:x+this._keybindingLabelFor(i.FIND_IDS.ReplaceOneAction),icon:e.findReplaceIcon,hoverDelegate:B,onTrigger:()=>{this._controller.replace()},onKeyDown:te=>{te.equals(1026)&&(this._closeBtn.focus(),te.preventDefault())}},this._hoverService)),this._replaceAllBtn=this._register(new he({label:W+this._keybindingLabelFor(i.FIND_IDS.ReplaceAllAction),icon:e.findReplaceAllIcon,hoverDelegate:B,onTrigger:()=>{this._controller.replaceAll()}},this._hoverService));const $=document.createElement("div");$.className="replace-part",$.appendChild(this._replaceInput.domNode);const Q=document.createElement("div");Q.className="replace-actions",$.appendChild(Q),Q.appendChild(this._replaceBtn.domNode),Q.appendChild(this._replaceAllBtn.domNode),this._toggleReplaceBtn=this._register(new he({label:V,className:"codicon toggle left",onTrigger:()=>{this._state.change({isReplaceRevealed:!this._isReplaceVisible},!1),this._isReplaceVisible&&(this._replaceInput.width=d.getTotalWidth(this._findInput.domNode),this._replaceInput.inputBox.layout()),this._showViewZone()}},this._hoverService)),this._toggleReplaceBtn.setExpanded(this._isReplaceVisible),this._domNode=document.createElement("div"),this._domNode.className="editor-widget find-widget",this._domNode.setAttribute("aria-hidden","true"),this._domNode.ariaLabel=L,this._domNode.role="dialog",this._domNode.style.width=`${H}px`,this._domNode.appendChild(this._toggleReplaceBtn.domNode),this._domNode.appendChild(ge),this._domNode.appendChild(this._closeBtn.domNode),this._domNode.appendChild($),this._resizeSash=this._register(new E.Sash(this._domNode,this,{orientation:0,size:2})),this._resized=!1;let Z=H;this._register(this._resizeSash.onDidStart(()=>{Z=d.getTotalWidth(this._domNode)})),this._register(this._resizeSash.onDidChange(te=>{this._resized=!0;const re=Z+te.startX-te.currentX;if(rele||(this._domNode.style.width=`${re}px`,this._isReplaceVisible&&(this._replaceInput.width=d.getTotalWidth(this._findInput.domNode)),this._findInput.inputBox.layout(),this._tryUpdateHeight())})),this._register(this._resizeSash.onDidReset(()=>{const te=d.getTotalWidth(this._domNode);if(te{this._opts.onTrigger(),ge.preventDefault()}),this.onkeydown(this._domNode,ge=>{if(ge.equals(10)||ge.equals(3)){this._opts.onTrigger(),ge.preventDefault();return}this._opts.onKeyDown?.(ge)})}get domNode(){return this._domNode}isEnabled(){return this._domNode.tabIndex>=0}focus(){this._domNode.focus()}setEnabled(ae){this._domNode.classList.toggle("disabled",!ae),this._domNode.setAttribute("aria-disabled",String(!ae)),this._domNode.tabIndex=ae?0:-1}setExpanded(ae){this._domNode.setAttribute("aria-expanded",String(!!ae)),ae?(this._domNode.classList.remove(...u.ThemeIcon.asClassNameArray(w)),this._domNode.classList.add(...u.ThemeIcon.asClassNameArray(S))):(this._domNode.classList.remove(...u.ThemeIcon.asClassNameArray(S)),this._domNode.classList.add(...u.ThemeIcon.asClassNameArray(w)))}}e.SimpleButton=he,(0,r.registerThemingParticipant)((pe,ae)=>{const ee=pe.getColor(l.editorFindMatchHighlightBorder);ee&&ae.addRule(`.monaco-editor .findMatch { border: 1px ${(0,C.isHighContrast)(pe.type)?"dotted":"solid"} ${ee}; box-sizing: border-box; }`);const de=pe.getColor(l.editorFindRangeHighlightBorder);de&&ae.addRule(`.monaco-editor .findScope { border: 1px ${(0,C.isHighContrast)(pe.type)?"dashed":"solid"} ${de}; }`);const ge=pe.getColor(l.contrastBorder);ge&&ae.addRule(`.monaco-editor .find-widget { border: 1px solid ${ge}; }`);const X=pe.getColor(l.editorFindMatchForeground);X&&ae.addRule(`.monaco-editor .findMatchInline { color: ${X}; }`);const B=pe.getColor(l.editorFindMatchHighlightForeground);B&&ae.addRule(`.monaco-editor .currentFindMatchInline { color: ${B}; }`)})}),define(ne[423],se([1,0,14,2,11,15,80,20,40,220,824,825,826,3,29,117,12,58,31,50,66,101,25,118]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f){"use strict";var h;Object.defineProperty(e,"__esModule",{value:!0}),e.StartFindReplaceAction=e.PreviousSelectionMatchFindAction=e.NextSelectionMatchFindAction=e.SelectionMatchFindAction=e.MoveToMatchFindAction=e.PreviousMatchFindAction=e.NextMatchFindAction=e.MatchFindAction=e.StartFindWithSelectionAction=e.StartFindWithArgsAction=e.StartFindAction=e.FindController=e.CommonFindController=void 0,e.getSelectionSearchString=w;const v=524288;function w(q,H="single",z=!1){if(!q.hasModel())return null;const U=q.getSelection();if(H==="single"&&U.startLineNumber===U.endLineNumber||H==="multiple"){if(U.isEmpty()){const j=q.getConfiguredWordAtPosition(U.getStartPosition());if(j&&z===!1)return j.word}else if(q.getModel().getValueLengthInRange(U)this._onStateChanged(K))),this._model=null,this._register(this._editor.onDidChangeModel(()=>{const K=this._editor.getModel()&&this._state.isRevealed;this.disposeModel(),this._state.change({searchScope:null,matchCase:this._storageService.getBoolean("editor.matchCase",1,!1),wholeWord:this._storageService.getBoolean("editor.wholeWord",1,!1),isRegex:this._storageService.getBoolean("editor.isRegex",1,!1),preserveCase:this._storageService.getBoolean("editor.preserveCase",1,!1)},!1),K&&this._start({forceRevealReplace:!1,seedSearchStringFromSelection:"none",seedSearchStringFromNonEmptySelection:!1,seedSearchStringFromGlobalClipboard:!1,shouldFocus:0,shouldAnimate:!1,updateSearchScope:!1,loop:this._editor.getOption(41).loop})}))}dispose(){this.disposeModel(),super.dispose()}disposeModel(){this._model&&(this._model.dispose(),this._model=null)}_onStateChanged(H){this.saveQueryState(H),H.isRevealed&&(this._state.isRevealed?this._findWidgetVisible.set(!0):(this._findWidgetVisible.reset(),this.disposeModel())),H.searchString&&this.setGlobalBufferTerm(this._state.searchString)}saveQueryState(H){H.isRegex&&this._storageService.store("editor.isRegex",this._state.actualIsRegex,1,1),H.wholeWord&&this._storageService.store("editor.wholeWord",this._state.actualWholeWord,1,1),H.matchCase&&this._storageService.store("editor.matchCase",this._state.actualMatchCase,1,1),H.preserveCase&&this._storageService.store("editor.preserveCase",this._state.actualPreserveCase,1,1)}loadQueryState(){this._state.change({matchCase:this._storageService.getBoolean("editor.matchCase",1,this._state.matchCase),wholeWord:this._storageService.getBoolean("editor.wholeWord",1,this._state.wholeWord),isRegex:this._storageService.getBoolean("editor.isRegex",1,this._state.isRegex),preserveCase:this._storageService.getBoolean("editor.preserveCase",1,this._state.preserveCase)},!1)}isFindInputFocused(){return!!b.CONTEXT_FIND_INPUT_FOCUSED.getValue(this._contextKeyService)}getState(){return this._state}closeFindWidget(){this._state.change({isRevealed:!1,searchScope:null},!1),this._editor.focus()}toggleCaseSensitive(){this._state.change({matchCase:!this._state.matchCase},!1),this._state.isRevealed||this.highlightFindOptions()}toggleWholeWords(){this._state.change({wholeWord:!this._state.wholeWord},!1),this._state.isRevealed||this.highlightFindOptions()}toggleRegex(){this._state.change({isRegex:!this._state.isRegex},!1),this._state.isRevealed||this.highlightFindOptions()}togglePreserveCase(){this._state.change({preserveCase:!this._state.preserveCase},!1),this._state.isRevealed||this.highlightFindOptions()}toggleSearchScope(){if(this._state.searchScope)this._state.change({searchScope:null},!0);else if(this._editor.hasModel()){let H=this._editor.getSelections();H=H.map(z=>(z.endColumn===1&&z.endLineNumber>z.startLineNumber&&(z=z.setEndPosition(z.endLineNumber-1,this._editor.getModel().getLineMaxColumn(z.endLineNumber-1))),z.isEmpty()?null:z)).filter(z=>!!z),H.length&&this._state.change({searchScope:H},!0)}}setSearchString(H){this._state.isRegex&&(H=I.escapeRegExpCharacters(H)),this._state.change({searchString:H},!1)}highlightFindOptions(H=!1){}async _start(H,z){if(this.disposeModel(),!this._editor.hasModel())return;const U={...z,isRevealed:!0};if(H.seedSearchStringFromSelection==="single"){const j=w(this._editor,H.seedSearchStringFromSelection,H.seedSearchStringFromNonEmptySelection);j&&(this._state.isRegex?U.searchString=I.escapeRegExpCharacters(j):U.searchString=j)}else if(H.seedSearchStringFromSelection==="multiple"&&!H.updateSearchScope){const j=w(this._editor,H.seedSearchStringFromSelection);j&&(U.searchString=j)}if(!U.searchString&&H.seedSearchStringFromGlobalClipboard){const j=await this.getGlobalBufferTerm();if(!this._editor.hasModel())return;j&&(U.searchString=j)}if(H.forceRevealReplace||U.isReplaceRevealed?U.isReplaceRevealed=!0:this._findWidgetVisible.get()||(U.isReplaceRevealed=!1),H.updateSearchScope){const j=this._editor.getSelections();j.some(Y=>!Y.isEmpty())&&(U.searchScope=j)}U.loop=H.loop,this._state.change(U,!1),this._model||(this._model=new b.FindModelBoundToEditorModel(this._editor,this._state))}start(H,z){return this._start(H,z)}moveToNextMatch(){return this._model?(this._model.moveToNextMatch(),!0):!1}moveToPrevMatch(){return this._model?(this._model.moveToPrevMatch(),!0):!1}goToMatch(H){return this._model?(this._model.moveToMatch(H),!0):!1}replace(){return this._model?(this._model.replace(),!0):!1}replaceAll(){return this._model?this._editor.getModel()?.isTooLargeForHeapOperation()?(this._notificationService.warn(t.localize(848,"The file is too large to perform a replace all operation.")),!1):(this._model.replaceAll(),!0):!1}selectAllMatches(){return this._model?(this._model.selectAllMatches(),this._editor.focus(),!0):!1}async getGlobalBufferTerm(){return this._editor.getOption(41).globalFindClipboard&&this._editor.hasModel()&&!this._editor.getModel().isTooLargeForSyncing()?this._clipboardService.readFindText():""}setGlobalBufferTerm(H){this._editor.getOption(41).globalFindClipboard&&this._editor.hasModel()&&!this._editor.getModel().isTooLargeForSyncing()&&this._clipboardService.writeFindText(H)}};e.CommonFindController=S,e.CommonFindController=S=h=ke([ce(1,g.IContextKeyService),ce(2,u.IStorageService),ce(3,s.IClipboardService),ce(4,a.INotificationService),ce(5,f.IHoverService)],S);let L=class extends S{constructor(H,z,U,j,Y,G,K,R,J){super(H,U,K,R,G,J),this._contextViewService=z,this._keybindingService=j,this._themeService=Y,this._widget=null,this._findOptionsWidget=null}async _start(H,z){this._widget||this._createFindWidget();const U=this._editor.getSelection();let j=!1;switch(this._editor.getOption(41).autoFindInSelection){case"always":j=!0;break;case"never":j=!1;break;case"multiline":{j=!!U&&U.startLineNumber!==U.endLineNumber;break}default:break}H.updateSearchScope=H.updateSearchScope||j,await super._start(H,z),this._widget&&(H.shouldFocus===2?this._widget.focusReplaceInput():H.shouldFocus===1&&this._widget.focusFindInput())}highlightFindOptions(H=!1){this._widget||this._createFindWidget(),this._state.isRevealed&&!H?this._widget.highlightFindOptions():this._findOptionsWidget.highlightFindOptions()}_createFindWidget(){this._widget=this._register(new o.FindWidget(this._editor,this,this._state,this._contextViewService,this._keybindingService,this._contextKeyService,this._themeService,this._storageService,this._notificationService,this._hoverService)),this._findOptionsWidget=this._register(new p.FindOptionsWidget(this._editor,this._state,this._keybindingService))}};e.FindController=L,e.FindController=L=ke([ce(1,c.IContextViewService),ce(2,g.IContextKeyService),ce(3,l.IKeybindingService),ce(4,C.IThemeService),ce(5,a.INotificationService),ce(6,u.IStorageService),ce(7,s.IClipboardService),ce(8,f.IHoverService)],L),e.StartFindAction=(0,E.registerMultiEditorAction)(new E.MultiEditorAction({id:b.FIND_IDS.StartFindAction,label:t.localize(849,"Find"),alias:"Find",precondition:g.ContextKeyExpr.or(m.EditorContextKeys.focus,g.ContextKeyExpr.has("editorIsOpen")),kbOpts:{kbExpr:null,primary:2084,weight:100},menuOpts:{menuId:i.MenuId.MenubarEditMenu,group:"3_find",title:t.localize(850,"&&Find"),order:1}})),e.StartFindAction.addImplementation(0,(q,H,z)=>{const U=S.get(H);return U?U.start({forceRevealReplace:!1,seedSearchStringFromSelection:H.getOption(41).seedSearchStringFromSelection!=="never"?"single":"none",seedSearchStringFromNonEmptySelection:H.getOption(41).seedSearchStringFromSelection==="selection",seedSearchStringFromGlobalClipboard:H.getOption(41).globalFindClipboard,shouldFocus:1,shouldAnimate:!0,updateSearchScope:!1,loop:H.getOption(41).loop}):!1});const D={description:"Open a new In-Editor Find Widget.",args:[{name:"Open a new In-Editor Find Widget args",schema:{properties:{searchString:{type:"string"},replaceString:{type:"string"},isRegex:{type:"boolean"},matchWholeWord:{type:"boolean"},isCaseSensitive:{type:"boolean"},preserveCase:{type:"boolean"},findInSelection:{type:"boolean"}}}}]};class T extends E.EditorAction{constructor(){super({id:b.FIND_IDS.StartFindWithArgs,label:t.localize(851,"Find With Arguments"),alias:"Find With Arguments",precondition:void 0,kbOpts:{kbExpr:null,primary:0,weight:100},metadata:D})}async run(H,z,U){const j=S.get(z);if(j){const Y=U?{searchString:U.searchString,replaceString:U.replaceString,isReplaceRevealed:U.replaceString!==void 0,isRegex:U.isRegex,wholeWord:U.matchWholeWord,matchCase:U.isCaseSensitive,preserveCase:U.preserveCase}:{};await j.start({forceRevealReplace:!1,seedSearchStringFromSelection:j.getState().searchString.length===0&&z.getOption(41).seedSearchStringFromSelection!=="never"?"single":"none",seedSearchStringFromNonEmptySelection:z.getOption(41).seedSearchStringFromSelection==="selection",seedSearchStringFromGlobalClipboard:!0,shouldFocus:1,shouldAnimate:!0,updateSearchScope:U?.findInSelection||!1,loop:z.getOption(41).loop},Y),j.setGlobalBufferTerm(j.getState().searchString)}}}e.StartFindWithArgsAction=T;class M extends E.EditorAction{constructor(){super({id:b.FIND_IDS.StartFindWithSelection,label:t.localize(852,"Find With Selection"),alias:"Find With Selection",precondition:void 0,kbOpts:{kbExpr:null,primary:0,mac:{primary:2083},weight:100}})}async run(H,z){const U=S.get(z);U&&(await U.start({forceRevealReplace:!1,seedSearchStringFromSelection:"multiple",seedSearchStringFromNonEmptySelection:!1,seedSearchStringFromGlobalClipboard:!1,shouldFocus:0,shouldAnimate:!0,updateSearchScope:!1,loop:z.getOption(41).loop}),U.setGlobalBufferTerm(U.getState().searchString))}}e.StartFindWithSelectionAction=M;class A extends E.EditorAction{async run(H,z){const U=S.get(z);U&&!this._run(U)&&(await U.start({forceRevealReplace:!1,seedSearchStringFromSelection:U.getState().searchString.length===0&&z.getOption(41).seedSearchStringFromSelection!=="never"?"single":"none",seedSearchStringFromNonEmptySelection:z.getOption(41).seedSearchStringFromSelection==="selection",seedSearchStringFromGlobalClipboard:!0,shouldFocus:0,shouldAnimate:!0,updateSearchScope:!1,loop:z.getOption(41).loop}),this._run(U))}}e.MatchFindAction=A;class P extends A{constructor(){super({id:b.FIND_IDS.NextMatchFindAction,label:t.localize(853,"Find Next"),alias:"Find Next",precondition:void 0,kbOpts:[{kbExpr:m.EditorContextKeys.focus,primary:61,mac:{primary:2085,secondary:[61]},weight:100},{kbExpr:g.ContextKeyExpr.and(m.EditorContextKeys.focus,b.CONTEXT_FIND_INPUT_FOCUSED),primary:3,weight:100}]})}_run(H){return H.moveToNextMatch()?(H.editor.pushUndoStop(),!0):!1}}e.NextMatchFindAction=P;class N extends A{constructor(){super({id:b.FIND_IDS.PreviousMatchFindAction,label:t.localize(854,"Find Previous"),alias:"Find Previous",precondition:void 0,kbOpts:[{kbExpr:m.EditorContextKeys.focus,primary:1085,mac:{primary:3109,secondary:[1085]},weight:100},{kbExpr:g.ContextKeyExpr.and(m.EditorContextKeys.focus,b.CONTEXT_FIND_INPUT_FOCUSED),primary:1027,weight:100}]})}_run(H){return H.moveToPrevMatch()}}e.PreviousMatchFindAction=N;class O extends E.EditorAction{constructor(){super({id:b.FIND_IDS.GoToMatchFindAction,label:t.localize(855,"Go to Match..."),alias:"Go to Match...",precondition:b.CONTEXT_FIND_WIDGET_VISIBLE}),this._highlightDecorations=[]}run(H,z,U){const j=S.get(z);if(!j)return;const Y=j.getState().matchesCount;if(Y<1){H.get(a.INotificationService).notify({severity:a.Severity.Warning,message:t.localize(856,"No matches. Try searching for something else.")});return}const G=H.get(r.IQuickInputService),K=new k.DisposableStore,R=K.add(G.createInputBox());R.placeholder=t.localize(857,"Type a number to go to a specific match (between 1 and {0})",Y);const J=ue=>{const he=parseInt(ue);if(isNaN(he))return;const pe=j.getState().matchesCount;if(he>0&&he<=pe)return he-1;if(he<0&&he>=-pe)return pe+he},ie=ue=>{const he=J(ue);if(typeof he=="number"){R.validationMessage=void 0,j.goToMatch(he);const pe=j.getState().currentMatch;pe&&this.addDecorations(z,pe)}else R.validationMessage=t.localize(858,"Please type a number between 1 and {0}",j.getState().matchesCount),this.clearDecorations(z)};K.add(R.onDidChangeValue(ue=>{ie(ue)})),K.add(R.onDidAccept(()=>{const ue=J(R.value);typeof ue=="number"?(j.goToMatch(ue),R.hide()):R.validationMessage=t.localize(859,"Please type a number between 1 and {0}",j.getState().matchesCount)})),K.add(R.onDidHide(()=>{this.clearDecorations(z),K.dispose()})),R.show()}clearDecorations(H){H.changeDecorations(z=>{this._highlightDecorations=z.deltaDecorations(this._highlightDecorations,[])})}addDecorations(H,z){H.changeDecorations(U=>{this._highlightDecorations=U.deltaDecorations(this._highlightDecorations,[{range:z,options:{description:"find-match-quick-access-range-highlight",className:"rangeHighlight",isWholeLine:!0}},{range:z,options:{description:"find-match-quick-access-range-highlight-overview",overviewRuler:{color:(0,C.themeColorFromId)(y.overviewRulerRangeHighlight),position:_.OverviewRulerLane.Full}}}])})}}e.MoveToMatchFindAction=O;class F extends E.EditorAction{async run(H,z){const U=S.get(z);if(!U)return;const j=w(z,"single",!1);j&&U.setSearchString(j),this._run(U)||(await U.start({forceRevealReplace:!1,seedSearchStringFromSelection:"none",seedSearchStringFromNonEmptySelection:!1,seedSearchStringFromGlobalClipboard:!1,shouldFocus:0,shouldAnimate:!0,updateSearchScope:!1,loop:z.getOption(41).loop}),this._run(U))}}e.SelectionMatchFindAction=F;class x extends F{constructor(){super({id:b.FIND_IDS.NextSelectionMatchFindAction,label:t.localize(860,"Find Next Selection"),alias:"Find Next Selection",precondition:void 0,kbOpts:{kbExpr:m.EditorContextKeys.focus,primary:2109,weight:100}})}_run(H){return H.moveToNextMatch()}}e.NextSelectionMatchFindAction=x;class W extends F{constructor(){super({id:b.FIND_IDS.PreviousSelectionMatchFindAction,label:t.localize(861,"Find Previous Selection"),alias:"Find Previous Selection",precondition:void 0,kbOpts:{kbExpr:m.EditorContextKeys.focus,primary:3133,weight:100}})}_run(H){return H.moveToPrevMatch()}}e.PreviousSelectionMatchFindAction=W,e.StartFindReplaceAction=(0,E.registerMultiEditorAction)(new E.MultiEditorAction({id:b.FIND_IDS.StartFindReplaceAction,label:t.localize(862,"Replace"),alias:"Replace",precondition:g.ContextKeyExpr.or(m.EditorContextKeys.focus,g.ContextKeyExpr.has("editorIsOpen")),kbOpts:{kbExpr:null,primary:2086,mac:{primary:2596},weight:100},menuOpts:{menuId:i.MenuId.MenubarEditMenu,group:"3_find",title:t.localize(863,"&&Replace"),order:2}})),e.StartFindReplaceAction.addImplementation(0,(q,H,z)=>{if(!H.hasModel()||H.getOption(92))return!1;const U=S.get(H);if(!U)return!1;const j=H.getSelection(),Y=U.isFindInputFocused(),G=!j.isEmpty()&&j.startLineNumber===j.endLineNumber&&H.getOption(41).seedSearchStringFromSelection!=="never"&&!Y,K=Y||G?2:1;return U.start({forceRevealReplace:!0,seedSearchStringFromSelection:G?"single":"none",seedSearchStringFromNonEmptySelection:H.getOption(41).seedSearchStringFromSelection==="selection",seedSearchStringFromGlobalClipboard:H.getOption(41).seedSearchStringFromSelection!=="never",shouldFocus:K,shouldAnimate:!0,updateSearchScope:!1,loop:H.getOption(41).loop})}),(0,E.registerEditorContribution)(S.ID,L,0),(0,E.registerEditorAction)(T),(0,E.registerEditorAction)(M),(0,E.registerEditorAction)(P),(0,E.registerEditorAction)(N),(0,E.registerEditorAction)(O),(0,E.registerEditorAction)(x),(0,E.registerEditorAction)(W);const V=E.EditorCommand.bindToContribution(S.get);(0,E.registerEditorCommand)(new V({id:b.FIND_IDS.CloseFindWidgetCommand,precondition:b.CONTEXT_FIND_WIDGET_VISIBLE,handler:q=>q.closeFindWidget(),kbOpts:{weight:105,kbExpr:g.ContextKeyExpr.and(m.EditorContextKeys.focus,g.ContextKeyExpr.not("isComposing")),primary:9,secondary:[1033]}})),(0,E.registerEditorCommand)(new V({id:b.FIND_IDS.ToggleCaseSensitiveCommand,precondition:void 0,handler:q=>q.toggleCaseSensitive(),kbOpts:{weight:105,kbExpr:m.EditorContextKeys.focus,primary:b.ToggleCaseSensitiveKeybinding.primary,mac:b.ToggleCaseSensitiveKeybinding.mac,win:b.ToggleCaseSensitiveKeybinding.win,linux:b.ToggleCaseSensitiveKeybinding.linux}})),(0,E.registerEditorCommand)(new V({id:b.FIND_IDS.ToggleWholeWordCommand,precondition:void 0,handler:q=>q.toggleWholeWords(),kbOpts:{weight:105,kbExpr:m.EditorContextKeys.focus,primary:b.ToggleWholeWordKeybinding.primary,mac:b.ToggleWholeWordKeybinding.mac,win:b.ToggleWholeWordKeybinding.win,linux:b.ToggleWholeWordKeybinding.linux}})),(0,E.registerEditorCommand)(new V({id:b.FIND_IDS.ToggleRegexCommand,precondition:void 0,handler:q=>q.toggleRegex(),kbOpts:{weight:105,kbExpr:m.EditorContextKeys.focus,primary:b.ToggleRegexKeybinding.primary,mac:b.ToggleRegexKeybinding.mac,win:b.ToggleRegexKeybinding.win,linux:b.ToggleRegexKeybinding.linux}})),(0,E.registerEditorCommand)(new V({id:b.FIND_IDS.ToggleSearchScopeCommand,precondition:void 0,handler:q=>q.toggleSearchScope(),kbOpts:{weight:105,kbExpr:m.EditorContextKeys.focus,primary:b.ToggleSearchScopeKeybinding.primary,mac:b.ToggleSearchScopeKeybinding.mac,win:b.ToggleSearchScopeKeybinding.win,linux:b.ToggleSearchScopeKeybinding.linux}})),(0,E.registerEditorCommand)(new V({id:b.FIND_IDS.TogglePreserveCaseCommand,precondition:void 0,handler:q=>q.togglePreserveCase(),kbOpts:{weight:105,kbExpr:m.EditorContextKeys.focus,primary:b.TogglePreserveCaseKeybinding.primary,mac:b.TogglePreserveCaseKeybinding.mac,win:b.TogglePreserveCaseKeybinding.win,linux:b.TogglePreserveCaseKeybinding.linux}})),(0,E.registerEditorCommand)(new V({id:b.FIND_IDS.ReplaceOneAction,precondition:b.CONTEXT_FIND_WIDGET_VISIBLE,handler:q=>q.replace(),kbOpts:{weight:105,kbExpr:m.EditorContextKeys.focus,primary:3094}})),(0,E.registerEditorCommand)(new V({id:b.FIND_IDS.ReplaceOneAction,precondition:b.CONTEXT_FIND_WIDGET_VISIBLE,handler:q=>q.replace(),kbOpts:{weight:105,kbExpr:g.ContextKeyExpr.and(m.EditorContextKeys.focus,b.CONTEXT_REPLACE_INPUT_FOCUSED),primary:3}})),(0,E.registerEditorCommand)(new V({id:b.FIND_IDS.ReplaceAllAction,precondition:b.CONTEXT_FIND_WIDGET_VISIBLE,handler:q=>q.replaceAll(),kbOpts:{weight:105,kbExpr:m.EditorContextKeys.focus,primary:2563}})),(0,E.registerEditorCommand)(new V({id:b.FIND_IDS.ReplaceAllAction,precondition:b.CONTEXT_FIND_WIDGET_VISIBLE,handler:q=>q.replaceAll(),kbOpts:{weight:105,kbExpr:g.ContextKeyExpr.and(m.EditorContextKeys.focus,b.CONTEXT_REPLACE_INPUT_FOCUSED),primary:void 0,mac:{primary:2051}}})),(0,E.registerEditorCommand)(new V({id:b.FIND_IDS.SelectAllMatchesAction,precondition:b.CONTEXT_FIND_WIDGET_VISIBLE,handler:q=>q.selectAllMatches(),kbOpts:{weight:105,kbExpr:m.EditorContextKeys.focus,primary:515}}))}),define(ne[424],se([1,0,26,35,3,32,71,25,30]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FoldingDecorationProvider=e.foldingManualExpandedIcon=e.foldingManualCollapsedIcon=e.foldingCollapsedIcon=e.foldingExpandedIcon=void 0;const b=(0,E.registerColor)("editor.foldBackground",{light:(0,E.transparent)(E.editorSelectionBackground,.3),dark:(0,E.transparent)(E.editorSelectionBackground,.3),hcDark:null,hcLight:null},(0,I.localize)(910,"Background color behind folded ranges. The color must not be opaque so as not to hide underlying decorations."),!0);(0,E.registerColor)("editor.foldPlaceholderForeground",{light:"#808080",dark:"#808080",hcDark:null,hcLight:null},(0,I.localize)(911,"Color of the collapsed text after the first line of a folded range.")),(0,E.registerColor)("editorGutter.foldingControlForeground",E.iconForeground,(0,I.localize)(912,"Color of the folding control in the editor gutter.")),e.foldingExpandedIcon=(0,y.registerIcon)("folding-expanded",d.Codicon.chevronDown,(0,I.localize)(913,"Icon for expanded ranges in the editor glyph margin.")),e.foldingCollapsedIcon=(0,y.registerIcon)("folding-collapsed",d.Codicon.chevronRight,(0,I.localize)(914,"Icon for collapsed ranges in the editor glyph margin.")),e.foldingManualCollapsedIcon=(0,y.registerIcon)("folding-manual-collapsed",e.foldingCollapsedIcon,(0,I.localize)(915,"Icon for manually collapsed ranges in the editor glyph margin.")),e.foldingManualExpandedIcon=(0,y.registerIcon)("folding-manual-expanded",e.foldingExpandedIcon,(0,I.localize)(916,"Icon for manually expanded ranges in the editor glyph margin."));const p={color:(0,m.themeColorFromId)(b),position:1},n=(0,I.localize)(917,"Click to expand the range."),o=(0,I.localize)(918,"Click to collapse the range.");class t{static{this.COLLAPSED_VISUAL_DECORATION=k.ModelDecorationOptions.register({description:"folding-collapsed-visual-decoration",stickiness:0,afterContentClassName:"inline-folded",isWholeLine:!0,linesDecorationsTooltip:n,firstLineDecorationClassName:_.ThemeIcon.asClassName(e.foldingCollapsedIcon)})}static{this.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION=k.ModelDecorationOptions.register({description:"folding-collapsed-highlighted-visual-decoration",stickiness:0,afterContentClassName:"inline-folded",className:"folded-background",minimap:p,isWholeLine:!0,linesDecorationsTooltip:n,firstLineDecorationClassName:_.ThemeIcon.asClassName(e.foldingCollapsedIcon)})}static{this.MANUALLY_COLLAPSED_VISUAL_DECORATION=k.ModelDecorationOptions.register({description:"folding-manually-collapsed-visual-decoration",stickiness:0,afterContentClassName:"inline-folded",isWholeLine:!0,linesDecorationsTooltip:n,firstLineDecorationClassName:_.ThemeIcon.asClassName(e.foldingManualCollapsedIcon)})}static{this.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION=k.ModelDecorationOptions.register({description:"folding-manually-collapsed-highlighted-visual-decoration",stickiness:0,afterContentClassName:"inline-folded",className:"folded-background",minimap:p,isWholeLine:!0,linesDecorationsTooltip:n,firstLineDecorationClassName:_.ThemeIcon.asClassName(e.foldingManualCollapsedIcon)})}static{this.NO_CONTROLS_COLLAPSED_RANGE_DECORATION=k.ModelDecorationOptions.register({description:"folding-no-controls-range-decoration",stickiness:0,afterContentClassName:"inline-folded",isWholeLine:!0,linesDecorationsTooltip:n})}static{this.NO_CONTROLS_COLLAPSED_HIGHLIGHTED_RANGE_DECORATION=k.ModelDecorationOptions.register({description:"folding-no-controls-range-decoration",stickiness:0,afterContentClassName:"inline-folded",className:"folded-background",minimap:p,isWholeLine:!0,linesDecorationsTooltip:n})}static{this.EXPANDED_VISUAL_DECORATION=k.ModelDecorationOptions.register({description:"folding-expanded-visual-decoration",stickiness:1,isWholeLine:!0,firstLineDecorationClassName:"alwaysShowFoldIcons "+_.ThemeIcon.asClassName(e.foldingExpandedIcon),linesDecorationsTooltip:o})}static{this.EXPANDED_AUTO_HIDE_VISUAL_DECORATION=k.ModelDecorationOptions.register({description:"folding-expanded-auto-hide-visual-decoration",stickiness:1,isWholeLine:!0,firstLineDecorationClassName:_.ThemeIcon.asClassName(e.foldingExpandedIcon),linesDecorationsTooltip:o})}static{this.MANUALLY_EXPANDED_VISUAL_DECORATION=k.ModelDecorationOptions.register({description:"folding-manually-expanded-visual-decoration",stickiness:0,isWholeLine:!0,firstLineDecorationClassName:"alwaysShowFoldIcons "+_.ThemeIcon.asClassName(e.foldingManualExpandedIcon),linesDecorationsTooltip:o})}static{this.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION=k.ModelDecorationOptions.register({description:"folding-manually-expanded-auto-hide-visual-decoration",stickiness:0,isWholeLine:!0,firstLineDecorationClassName:_.ThemeIcon.asClassName(e.foldingManualExpandedIcon),linesDecorationsTooltip:o})}static{this.NO_CONTROLS_EXPANDED_RANGE_DECORATION=k.ModelDecorationOptions.register({description:"folding-no-controls-range-decoration",stickiness:0,isWholeLine:!0})}static{this.HIDDEN_RANGE_DECORATION=k.ModelDecorationOptions.register({description:"folding-hidden-range-decoration",stickiness:1})}constructor(s){this.editor=s,this.showFoldingControls="mouseover",this.showFoldingHighlights=!0}getDecorationOption(s,g,c){return g?t.HIDDEN_RANGE_DECORATION:this.showFoldingControls==="never"?s?this.showFoldingHighlights?t.NO_CONTROLS_COLLAPSED_HIGHLIGHTED_RANGE_DECORATION:t.NO_CONTROLS_COLLAPSED_RANGE_DECORATION:t.NO_CONTROLS_EXPANDED_RANGE_DECORATION:s?c?this.showFoldingHighlights?t.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION:t.MANUALLY_COLLAPSED_VISUAL_DECORATION:this.showFoldingHighlights?t.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION:t.COLLAPSED_VISUAL_DECORATION:this.showFoldingControls==="mouseover"?c?t.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION:t.EXPANDED_AUTO_HIDE_VISUAL_DECORATION:c?t.MANUALLY_EXPANDED_VISUAL_DECORATION:t.EXPANDED_VISUAL_DECORATION}changeDecorations(s){return this.editor.changeDecorations(s)}removeDecorations(s){this.editor.removeDecorations(s)}}e.FoldingDecorationProvider=t}),define(ne[289],se([1,0,14,18,8,72,2,11,19,143,15,20,27,36,334,613,335,3,12,424,203,336,50,79,54,17,6,24,22,51,28,511]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S,L,D,T){"use strict";var M;Object.defineProperty(e,"__esModule",{value:!0}),e.RangesLimitReporter=e.FoldingController=void 0,e.toSelectedLines=F;const A=new l.RawContextKey("foldingEnabled",!1);let P=class extends y.Disposable{static{M=this}static{this.ID="editor.contrib.folding"}static get(X){return X.getContribution(M.ID)}static getFoldingRangeProviders(X,B){const $=X.foldingRangeProvider.ordered(B);return M._foldingRangeSelector?.($,B)??$}constructor(X,B,$,Q,Z,te){super(),this.contextKeyService=B,this.languageConfigurationService=$,this.languageFeaturesService=te,this.localToDispose=this._register(new y.DisposableStore),this.editor=X,this._foldingLimitReporter=new N(X);const re=this.editor.getOptions();this._isEnabled=re.get(43),this._useFoldingProviders=re.get(44)!=="indentation",this._unfoldOnClickAfterEndOfLine=re.get(48),this._restoringViewState=!1,this._currentModelHasFoldedImports=!1,this._foldingImportsByDefault=re.get(46),this.updateDebounceInfo=Z.for(te.foldingRangeProvider,"Folding",{min:200}),this.foldingModel=null,this.hiddenRangeModel=null,this.rangeProvider=null,this.foldingRegionPromise=null,this.foldingModelPromise=null,this.updateScheduler=null,this.cursorChangedScheduler=null,this.mouseDownInfo=null,this.foldingDecorationProvider=new a.FoldingDecorationProvider(X),this.foldingDecorationProvider.showFoldingControls=re.get(111),this.foldingDecorationProvider.showFoldingHighlights=re.get(45),this.foldingEnabled=A.bindTo(this.contextKeyService),this.foldingEnabled.set(this._isEnabled),this._register(this.editor.onDidChangeModel(()=>this.onModelChanged())),this._register(this.editor.onDidChangeConfiguration(le=>{if(le.hasChanged(43)&&(this._isEnabled=this.editor.getOptions().get(43),this.foldingEnabled.set(this._isEnabled),this.onModelChanged()),le.hasChanged(47)&&this.onModelChanged(),le.hasChanged(111)||le.hasChanged(45)){const me=this.editor.getOptions();this.foldingDecorationProvider.showFoldingControls=me.get(111),this.foldingDecorationProvider.showFoldingHighlights=me.get(45),this.triggerFoldingModelChanged()}le.hasChanged(44)&&(this._useFoldingProviders=this.editor.getOptions().get(44)!=="indentation",this.onFoldingStrategyChanged()),le.hasChanged(48)&&(this._unfoldOnClickAfterEndOfLine=this.editor.getOptions().get(48)),le.hasChanged(46)&&(this._foldingImportsByDefault=this.editor.getOptions().get(46))})),this.onModelChanged()}saveViewState(){const X=this.editor.getModel();if(!X||!this._isEnabled||X.isTooLargeForTokenization())return{};if(this.foldingModel){const B=this.foldingModel.getMemento(),$=this.rangeProvider?this.rangeProvider.id:void 0;return{collapsedRegions:B,lineCount:X.getLineCount(),provider:$,foldedImports:this._currentModelHasFoldedImports}}}restoreViewState(X){const B=this.editor.getModel();if(!(!B||!this._isEnabled||B.isTooLargeForTokenization()||!this.hiddenRangeModel)&&X&&(this._currentModelHasFoldedImports=!!X.foldedImports,X.collapsedRegions&&X.collapsedRegions.length>0&&this.foldingModel)){this._restoringViewState=!0;try{this.foldingModel.applyMemento(X.collapsedRegions)}finally{this._restoringViewState=!1}}}onModelChanged(){this.localToDispose.clear();const X=this.editor.getModel();!this._isEnabled||!X||X.isTooLargeForTokenization()||(this._currentModelHasFoldedImports=!1,this.foldingModel=new i.FoldingModel(X,this.foldingDecorationProvider),this.localToDispose.add(this.foldingModel),this.hiddenRangeModel=new s.HiddenRangeModel(this.foldingModel),this.localToDispose.add(this.hiddenRangeModel),this.localToDispose.add(this.hiddenRangeModel.onDidChange(B=>this.onHiddenRangesChanges(B))),this.updateScheduler=new d.Delayer(this.updateDebounceInfo.get(X)),this.cursorChangedScheduler=new d.RunOnceScheduler(()=>this.revealCursor(),200),this.localToDispose.add(this.cursorChangedScheduler),this.localToDispose.add(this.languageFeaturesService.foldingRangeProvider.onDidChange(()=>this.onFoldingStrategyChanged())),this.localToDispose.add(this.editor.onDidChangeModelLanguageConfiguration(()=>this.onFoldingStrategyChanged())),this.localToDispose.add(this.editor.onDidChangeModelContent(B=>this.onDidChangeModelContent(B))),this.localToDispose.add(this.editor.onDidChangeCursorPosition(()=>this.onCursorPositionChanged())),this.localToDispose.add(this.editor.onMouseDown(B=>this.onEditorMouseDown(B))),this.localToDispose.add(this.editor.onMouseUp(B=>this.onEditorMouseUp(B))),this.localToDispose.add({dispose:()=>{this.foldingRegionPromise&&(this.foldingRegionPromise.cancel(),this.foldingRegionPromise=null),this.updateScheduler?.cancel(),this.updateScheduler=null,this.foldingModel=null,this.foldingModelPromise=null,this.hiddenRangeModel=null,this.cursorChangedScheduler=null,this.rangeProvider?.dispose(),this.rangeProvider=null}}),this.triggerFoldingModelChanged())}onFoldingStrategyChanged(){this.rangeProvider?.dispose(),this.rangeProvider=null,this.triggerFoldingModelChanged()}getRangeProvider(X){if(this.rangeProvider)return this.rangeProvider;const B=new g.IndentRangeProvider(X,this.languageConfigurationService,this._foldingLimitReporter);if(this.rangeProvider=B,this._useFoldingProviders&&this.foldingModel){const $=M.getFoldingRangeProviders(this.languageFeaturesService,X);$.length>0&&(this.rangeProvider=new u.SyntaxRangeProvider(X,$,()=>this.triggerFoldingModelChanged(),this._foldingLimitReporter,B))}return this.rangeProvider}getFoldingModel(){return this.foldingModelPromise}onDidChangeModelContent(X){this.hiddenRangeModel?.notifyChangeModelContent(X),this.triggerFoldingModelChanged()}triggerFoldingModelChanged(){this.updateScheduler&&(this.foldingRegionPromise&&(this.foldingRegionPromise.cancel(),this.foldingRegionPromise=null),this.foldingModelPromise=this.updateScheduler.trigger(()=>{const X=this.foldingModel;if(!X)return null;const B=new h.StopWatch,$=this.getRangeProvider(X.textModel),Q=this.foldingRegionPromise=(0,d.createCancelablePromise)(Z=>$.compute(Z));return Q.then(Z=>{if(Z&&Q===this.foldingRegionPromise){let te;if(this._foldingImportsByDefault&&!this._currentModelHasFoldedImports){const me=Z.setCollapsedAllOfType(o.FoldingRangeKind.Imports.value,!0);me&&(te=b.StableEditorScrollState.capture(this.editor),this._currentModelHasFoldedImports=me)}const re=this.editor.getSelections();X.update(Z,F(re)),te?.restore(this.editor);const le=this.updateDebounceInfo.update(X.textModel,B.elapsed());this.updateScheduler&&(this.updateScheduler.defaultDelay=le)}return X})}).then(void 0,X=>((0,I.onUnexpectedError)(X),null)))}onHiddenRangesChanges(X){if(this.hiddenRangeModel&&X.length&&!this._restoringViewState){const B=this.editor.getSelections();B&&this.hiddenRangeModel.adjustSelections(B)&&this.editor.setSelections(B)}this.editor.setHiddenAreas(X,this)}onCursorPositionChanged(){this.hiddenRangeModel&&this.hiddenRangeModel.hasRanges()&&this.cursorChangedScheduler.schedule()}revealCursor(){const X=this.getFoldingModel();X&&X.then(B=>{if(B){const $=this.editor.getSelections();if($&&$.length>0){const Q=[];for(const Z of $){const te=Z.selectionStartLineNumber;this.hiddenRangeModel&&this.hiddenRangeModel.isHidden(te)&&Q.push(...B.getAllRegionsAtLine(te,re=>re.isCollapsed&&te>re.startLineNumber))}Q.length&&(B.toggleCollapseState(Q),this.reveal($[0].getPosition()))}}}).then(void 0,I.onUnexpectedError)}onEditorMouseDown(X){if(this.mouseDownInfo=null,!this.hiddenRangeModel||!X.target||!X.target.range||!X.event.leftButton&&!X.event.middleButton)return;const B=X.target.range;let $=!1;switch(X.target.type){case 4:{const Q=X.target.detail,Z=X.target.element.offsetLeft;if(Q.offsetX-Z<4)return;$=!0;break}case 7:{if(this._unfoldOnClickAfterEndOfLine&&this.hiddenRangeModel.hasRanges()&&!X.target.detail.isAfterLines)break;return}case 6:{if(this.hiddenRangeModel.hasRanges()){const Q=this.editor.getModel();if(Q&&B.startColumn===Q.getLineMaxColumn(B.startLineNumber))break}return}default:return}this.mouseDownInfo={lineNumber:B.startLineNumber,iconClicked:$}}onEditorMouseUp(X){const B=this.foldingModel;if(!B||!this.mouseDownInfo||!X.target)return;const $=this.mouseDownInfo.lineNumber,Q=this.mouseDownInfo.iconClicked,Z=X.target.range;if(!Z||Z.startLineNumber!==$)return;if(Q){if(X.target.type!==4)return}else{const re=this.editor.getModel();if(!re||Z.startColumn!==re.getLineMaxColumn($))return}const te=B.getRegionAtLine($);if(te&&te.startLineNumber===$){const re=te.isCollapsed;if(Q||re){const le=X.event.altKey;let me=[];if(le){const Ce=Le=>!Le.containedBy(te)&&!te.containedBy(Le),ye=B.getRegionsInside(null,Ce);for(const Le of ye)Le.isCollapsed&&me.push(Le);me.length===0&&(me=ye)}else{const Ce=X.event.middleButton||X.event.shiftKey;if(Ce)for(const ye of B.getRegionsInside(te))ye.isCollapsed===re&&me.push(ye);(re||!Ce||me.length===0)&&me.push(te)}B.toggleCollapseState(me),this.reveal({lineNumber:$,column:1})}}}reveal(X){this.editor.revealPositionInCenterIfOutsideViewport(X,0)}};e.FoldingController=P,e.FoldingController=P=M=ke([ce(1,l.IContextKeyService),ce(2,t.ILanguageConfigurationService),ce(3,C.INotificationService),ce(4,f.ILanguageFeatureDebounceService),ce(5,v.ILanguageFeaturesService)],P);class N{constructor(X){this.editor=X,this._onDidChange=new w.Emitter,this._computed=0,this._limited=!1}get limit(){return this.editor.getOptions().get(47)}update(X,B){(X!==this._computed||B!==this._limited)&&(this._computed=X,this._limited=B,this._onDidChange.fire())}}e.RangesLimitReporter=N;class O extends p.EditorAction{runEditorCommand(X,B,$){const Q=X.get(t.ILanguageConfigurationService),Z=P.get(B);if(!Z)return;const te=Z.getFoldingModel();if(te)return this.reportTelemetry(X,B),te.then(re=>{if(re){this.invoke(Z,re,B,$,Q);const le=B.getSelection();le&&Z.reveal(le.getStartPosition())}})}getSelectedLines(X){const B=X.getSelections();return B?B.map($=>$.startLineNumber):[]}getLineNumbers(X,B){return X&&X.selectionLines?X.selectionLines.map($=>$+1):this.getSelectedLines(B)}run(X,B){}}function F(ge){return!ge||ge.length===0?{startsInside:()=>!1}:{startsInside(X,B){for(const $ of ge){const Q=$.startLineNumber;if(Q>=X&&Q<=B)return!0}return!1}}}function x(ge){if(!_.isUndefined(ge)){if(!_.isObject(ge))return!1;const X=ge;if(!_.isUndefined(X.levels)&&!_.isNumber(X.levels)||!_.isUndefined(X.direction)&&!_.isString(X.direction)||!_.isUndefined(X.selectionLines)&&(!Array.isArray(X.selectionLines)||!X.selectionLines.every(_.isNumber)))return!1}return!0}class W extends O{constructor(){super({id:"editor.unfold",label:c.localize(891,"Unfold"),alias:"Unfold",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:3166,mac:{primary:2654},weight:100},metadata:{description:"Unfold the content in the editor",args:[{name:"Unfold editor argument",description:`Property-value pairs that can be passed through this argument: - * 'levels': Number of levels to unfold. If not set, defaults to 1. - * 'direction': If 'up', unfold given number of levels up otherwise unfolds down. - * 'selectionLines': Array of the start lines (0-based) of the editor selections to apply the unfold action to. If not set, the active selection(s) will be used. - `,constraint:x,schema:{type:"object",properties:{levels:{type:"number",default:1},direction:{type:"string",enum:["up","down"],default:"down"},selectionLines:{type:"array",items:{type:"number"}}}}}]}})}invoke(X,B,$,Q){const Z=Q&&Q.levels||1,te=this.getLineNumbers(Q,$);Q&&Q.direction==="up"?(0,i.setCollapseStateLevelsUp)(B,!1,Z,te):(0,i.setCollapseStateLevelsDown)(B,!1,Z,te)}}class V extends O{constructor(){super({id:"editor.unfoldRecursively",label:c.localize(892,"Unfold Recursively"),alias:"Unfold Recursively",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2142),weight:100}})}invoke(X,B,$,Q){(0,i.setCollapseStateLevelsDown)(B,!1,Number.MAX_VALUE,this.getSelectedLines($))}}class q extends O{constructor(){super({id:"editor.fold",label:c.localize(893,"Fold"),alias:"Fold",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:3164,mac:{primary:2652},weight:100},metadata:{description:"Fold the content in the editor",args:[{name:"Fold editor argument",description:`Property-value pairs that can be passed through this argument: - * 'levels': Number of levels to fold. - * 'direction': If 'up', folds given number of levels up otherwise folds down. - * 'selectionLines': Array of the start lines (0-based) of the editor selections to apply the fold action to. If not set, the active selection(s) will be used. - If no levels or direction is set, folds the region at the locations or if already collapsed, the first uncollapsed parent instead. - `,constraint:x,schema:{type:"object",properties:{levels:{type:"number"},direction:{type:"string",enum:["up","down"]},selectionLines:{type:"array",items:{type:"number"}}}}}]}})}invoke(X,B,$,Q){const Z=this.getLineNumbers(Q,$),te=Q&&Q.levels,re=Q&&Q.direction;typeof te!="number"&&typeof re!="string"?(0,i.setCollapseStateUp)(B,!0,Z):re==="up"?(0,i.setCollapseStateLevelsUp)(B,!0,te||1,Z):(0,i.setCollapseStateLevelsDown)(B,!0,te||1,Z)}}class H extends O{constructor(){super({id:"editor.toggleFold",label:c.localize(894,"Toggle Fold"),alias:"Toggle Fold",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2090),weight:100}})}invoke(X,B,$){const Q=this.getSelectedLines($);(0,i.toggleCollapseState)(B,1,Q)}}class z extends O{constructor(){super({id:"editor.foldRecursively",label:c.localize(895,"Fold Recursively"),alias:"Fold Recursively",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2140),weight:100}})}invoke(X,B,$){const Q=this.getSelectedLines($);(0,i.setCollapseStateLevelsDown)(B,!0,Number.MAX_VALUE,Q)}}class U extends O{constructor(){super({id:"editor.toggleFoldRecursively",label:c.localize(896,"Toggle Fold Recursively"),alias:"Toggle Fold Recursively",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,3114),weight:100}})}invoke(X,B,$){const Q=this.getSelectedLines($);(0,i.toggleCollapseState)(B,Number.MAX_VALUE,Q)}}class j extends O{constructor(){super({id:"editor.foldAllBlockComments",label:c.localize(897,"Fold All Block Comments"),alias:"Fold All Block Comments",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2138),weight:100}})}invoke(X,B,$,Q,Z){if(B.regions.hasTypes())(0,i.setCollapseStateForType)(B,o.FoldingRangeKind.Comment.value,!0);else{const te=$.getModel();if(!te)return;const re=Z.getLanguageConfiguration(te.getLanguageId()).comments;if(re&&re.blockCommentStartToken){const le=new RegExp("^\\s*"+(0,m.escapeRegExpCharacters)(re.blockCommentStartToken));(0,i.setCollapseStateForMatchingLines)(B,le,!0)}}}}class Y extends O{constructor(){super({id:"editor.foldAllMarkerRegions",label:c.localize(898,"Fold All Regions"),alias:"Fold All Regions",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2077),weight:100}})}invoke(X,B,$,Q,Z){if(B.regions.hasTypes())(0,i.setCollapseStateForType)(B,o.FoldingRangeKind.Region.value,!0);else{const te=$.getModel();if(!te)return;const re=Z.getLanguageConfiguration(te.getLanguageId()).foldingRules;if(re&&re.markers&&re.markers.start){const le=new RegExp(re.markers.start);(0,i.setCollapseStateForMatchingLines)(B,le,!0)}}}}class G extends O{constructor(){super({id:"editor.unfoldAllMarkerRegions",label:c.localize(899,"Unfold All Regions"),alias:"Unfold All Regions",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2078),weight:100}})}invoke(X,B,$,Q,Z){if(B.regions.hasTypes())(0,i.setCollapseStateForType)(B,o.FoldingRangeKind.Region.value,!1);else{const te=$.getModel();if(!te)return;const re=Z.getLanguageConfiguration(te.getLanguageId()).foldingRules;if(re&&re.markers&&re.markers.start){const le=new RegExp(re.markers.start);(0,i.setCollapseStateForMatchingLines)(B,le,!1)}}}}class K extends O{constructor(){super({id:"editor.foldAllExcept",label:c.localize(900,"Fold All Except Selected"),alias:"Fold All Except Selected",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2136),weight:100}})}invoke(X,B,$){const Q=this.getSelectedLines($);(0,i.setCollapseStateForRest)(B,!0,Q)}}class R extends O{constructor(){super({id:"editor.unfoldAllExcept",label:c.localize(901,"Unfold All Except Selected"),alias:"Unfold All Except Selected",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2134),weight:100}})}invoke(X,B,$){const Q=this.getSelectedLines($);(0,i.setCollapseStateForRest)(B,!1,Q)}}class J extends O{constructor(){super({id:"editor.foldAll",label:c.localize(902,"Fold All"),alias:"Fold All",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2069),weight:100}})}invoke(X,B,$){(0,i.setCollapseStateLevelsDown)(B,!0)}}class ie extends O{constructor(){super({id:"editor.unfoldAll",label:c.localize(903,"Unfold All"),alias:"Unfold All",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2088),weight:100}})}invoke(X,B,$){(0,i.setCollapseStateLevelsDown)(B,!1)}}class ue extends O{static{this.ID_PREFIX="editor.foldLevel"}static{this.ID=X=>ue.ID_PREFIX+X}getFoldingLevel(){return parseInt(this.id.substr(ue.ID_PREFIX.length))}invoke(X,B,$){(0,i.setCollapseStateAtLevel)(B,this.getFoldingLevel(),!0,this.getSelectedLines($))}}class he extends O{constructor(){super({id:"editor.gotoParentFold",label:c.localize(904,"Go to Parent Fold"),alias:"Go to Parent Fold",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,weight:100}})}invoke(X,B,$){const Q=this.getSelectedLines($);if(Q.length>0){const Z=(0,i.getParentFoldLine)(Q[0],B);Z!==null&&$.setSelection({startLineNumber:Z,startColumn:1,endLineNumber:Z,endColumn:1})}}}class pe extends O{constructor(){super({id:"editor.gotoPreviousFold",label:c.localize(905,"Go to Previous Folding Range"),alias:"Go to Previous Folding Range",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,weight:100}})}invoke(X,B,$){const Q=this.getSelectedLines($);if(Q.length>0){const Z=(0,i.getPreviousFoldLine)(Q[0],B);Z!==null&&$.setSelection({startLineNumber:Z,startColumn:1,endLineNumber:Z,endColumn:1})}}}class ae extends O{constructor(){super({id:"editor.gotoNextFold",label:c.localize(906,"Go to Next Folding Range"),alias:"Go to Next Folding Range",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,weight:100}})}invoke(X,B,$){const Q=this.getSelectedLines($);if(Q.length>0){const Z=(0,i.getNextFoldLine)(Q[0],B);Z!==null&&$.setSelection({startLineNumber:Z,startColumn:1,endLineNumber:Z,endColumn:1})}}}class ee extends O{constructor(){super({id:"editor.createFoldingRangeFromSelection",label:c.localize(907,"Create Folding Range from Selection"),alias:"Create Folding Range from Selection",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2135),weight:100}})}invoke(X,B,$){const Q=[],Z=$.getSelections();if(Z){for(const te of Z){let re=te.endLineNumber;te.endColumn===1&&--re,re>te.startLineNumber&&(Q.push({startLineNumber:te.startLineNumber,endLineNumber:re,type:void 0,isCollapsed:!0,source:1}),$.setSelection({startLineNumber:te.startLineNumber,startColumn:1,endLineNumber:te.startLineNumber,endColumn:1}))}if(Q.length>0){Q.sort((re,le)=>re.startLineNumber-le.startLineNumber);const te=r.FoldingRegions.sanitizeAndMerge(B.regions,Q,$.getModel()?.getLineCount());B.updatePost(r.FoldingRegions.fromFoldRanges(te))}}}}class de extends O{constructor(){super({id:"editor.removeManualFoldingRanges",label:c.localize(908,"Remove Manual Folding Ranges"),alias:"Remove Manual Folding Ranges",precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2137),weight:100}})}invoke(X,B,$){const Q=$.getSelections();if(Q){const Z=[];for(const te of Q){const{startLineNumber:re,endLineNumber:le}=te;Z.push(le>=re?{startLineNumber:re,endLineNumber:le}:{endLineNumber:le,startLineNumber:re})}B.removeManualRanges(Z),X.triggerFoldingModelChanged()}}}(0,p.registerEditorContribution)(P.ID,P,0),(0,p.registerEditorAction)(W),(0,p.registerEditorAction)(V),(0,p.registerEditorAction)(q),(0,p.registerEditorAction)(z),(0,p.registerEditorAction)(U),(0,p.registerEditorAction)(J),(0,p.registerEditorAction)(ie),(0,p.registerEditorAction)(j),(0,p.registerEditorAction)(Y),(0,p.registerEditorAction)(G),(0,p.registerEditorAction)(K),(0,p.registerEditorAction)(R),(0,p.registerEditorAction)(H),(0,p.registerEditorAction)(he),(0,p.registerEditorAction)(pe),(0,p.registerEditorAction)(ae),(0,p.registerEditorAction)(ee),(0,p.registerEditorAction)(de);for(let ge=1;ge<=7;ge++)(0,p.registerInstantiatedEditorAction)(new ue({id:ue.ID(ge),label:c.localize(909,"Fold Level {0}",ge),alias:`Fold Level ${ge}`,precondition:A,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2048|21+ge),weight:100}}));S.CommandsRegistry.registerCommand("_executeFoldingRangeProvider",async function(ge,...X){const[B]=X;if(!(B instanceof L.URI))throw(0,I.illegalArgument)();const $=ge.get(v.ILanguageFeaturesService),Q=ge.get(D.IModelService).getModel(B);if(!Q)throw(0,I.illegalArgument)();const Z=ge.get(T.IConfigurationService);if(!Z.getValue("editor.folding",{resource:B}))return[];const te=ge.get(t.ILanguageConfigurationService),re=Z.getValue("editor.foldingStrategy",{resource:B}),le={get limit(){return Z.getValue("editor.foldingMaximumRegions",{resource:B})},update:(Ee,Me)=>{}},me=new g.IndentRangeProvider(Q,te,le);let Ce=me;if(re!=="indentation"){const Ee=P.getFoldingRangeProviders($,Q);Ee.length&&(Ce=new u.SyntaxRangeProvider(Q,Ee,()=>{},le,me))}const ye=await Ce.compute(k.CancellationToken.None),Le=[];try{if(ye)for(let Ee=0;Eethis.editorWorkerService.navigateValueSet(h,C,a)),this.currentRequest.then(v=>{if(!v||!v.range||!v.value||!f.validate(this.editor))return;const w=y.Range.lift(v.range);let S=v.range;const L=v.value.length-(C.endColumn-C.startColumn);S={startLineNumber:S.startLineNumber,startColumn:S.startColumn,endLineNumber:S.endLineNumber,endColumn:S.startColumn+v.value.length},L>1&&(C=new m.Selection(C.startLineNumber,C.startColumn,C.endLineNumber,C.endColumn+L-1));const D=new o.InPlaceReplaceCommand(w,C,v.value);this.editor.pushUndoStop(),this.editor.executeCommand(l,D),this.editor.pushUndoStop(),this.decorations.set([{range:S,options:t.DECORATION}]),this.decorationRemover?.cancel(),this.decorationRemover=(0,d.timeout)(350),this.decorationRemover.then(()=>this.decorations.clear()).catch(k.onUnexpectedError)}).catch(k.onUnexpectedError)):Promise.resolve(void 0)}};i=t=ke([ce(1,p.IEditorWorkerService)],i);class s extends E.EditorAction{constructor(){super({id:"editor.action.inPlaceReplace.up",label:n.localize(1103,"Replace with Previous Value"),alias:"Replace with Previous Value",precondition:_.EditorContextKeys.writable,kbOpts:{kbExpr:_.EditorContextKeys.editorTextFocus,primary:3159,weight:100}})}run(l,a){const r=i.get(a);return r?r.run(this.id,!1):Promise.resolve(void 0)}}class g extends E.EditorAction{constructor(){super({id:"editor.action.inPlaceReplace.down",label:n.localize(1104,"Replace with Next Value"),alias:"Replace with Next Value",precondition:_.EditorContextKeys.writable,kbOpts:{kbExpr:_.EditorContextKeys.editorTextFocus,primary:3161,weight:100}})}run(l,a){const r=i.get(a);return r?r.run(this.id,!0):Promise.resolve(void 0)}}(0,E.registerEditorContribution)(i.ID,i,4),(0,E.registerEditorAction)(s),(0,E.registerEditorAction)(g)}),define(ne[828],se([1,0,2,21,9,4,43,40,150,205,139,518]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GhostTextWidget=e.INLINE_EDIT_DESCRIPTION=void 0,e.INLINE_EDIT_DESCRIPTION="inline-edit";let n=class extends d.Disposable{constructor(t,i,s){super(),this.editor=t,this.model=i,this.languageService=s,this.isDisposed=(0,k.observableValue)(this,!1),this.currentTextModel=(0,k.observableFromEvent)(this,this.editor.onDidChangeModel,()=>this.editor.getModel()),this.uiState=(0,k.derived)(this,g=>{if(this.isDisposed.read(g))return;const c=this.currentTextModel.read(g);if(c!==this.model.targetTextModel.read(g))return;const l=this.model.ghostText.read(g);if(!l)return;let a=this.model.range?.read(g);a&&a.startLineNumber===a.endLineNumber&&a.startColumn===a.endColumn&&(a=void 0);const r=(a?a.startLineNumber===a.endLineNumber:!0)&&l.parts.length===1&&l.parts[0].lines.length===1,u=l.parts.length===1&&l.parts[0].lines.every(T=>T.length===0),C=[],f=[];function h(T,M){if(f.length>0){const A=f[f.length-1];M&&A.decorations.push(new _.LineDecoration(A.content.length+1,A.content.length+1+T[0].length,M,0)),A.content+=T[0],T=T.slice(1)}for(const A of T)f.push({content:A,decorations:M?[new _.LineDecoration(1,A.length+1,M,0)]:[]})}const v=c.getLineContent(l.lineNumber);let w,S=0;if(!u&&(r||!a)){for(const T of l.parts){let M=T.lines;a&&!r&&(h(M,e.INLINE_EDIT_DESCRIPTION),M=[]),w===void 0?(C.push({column:T.column,text:M[0],preview:T.preview}),M=M.slice(1)):h([v.substring(S,T.column-1)],void 0),M.length>0&&(h(M,e.INLINE_EDIT_DESCRIPTION),w===void 0&&T.column<=v.length&&(w=T.column)),S=T.column-1}w!==void 0&&h([v.substring(S)],void 0)}const L=w!==void 0?new b.ColumnRange(w,v.length+1):void 0,D=r||!a?l.lineNumber:a.endLineNumber-1;return{inlineTexts:C,additionalLines:f,hiddenRange:L,lineNumber:D,additionalReservedLineCount:this.model.minReservedLineCount.read(g),targetTextModel:c,range:a,isSingleLine:r,isPureRemove:u}}),this.decorations=(0,k.derived)(this,g=>{const c=this.uiState.read(g);if(!c)return[];const l=[];if(c.hiddenRange&&l.push({range:c.hiddenRange.toRange(c.lineNumber),options:{inlineClassName:"inline-edit-hidden",description:"inline-edit-hidden"}}),c.range){const a=[];if(c.isSingleLine)a.push(c.range);else if(!c.isPureRemove){const r=c.range.endLineNumber-c.range.startLineNumber;for(let u=0;u{this.isDisposed.set(!0,void 0)})),this._register((0,b.applyObservableDecorations)(this.editor,this.decorations))}};e.GhostTextWidget=n,e.GhostTextWidget=n=ke([ce(2,y.ILanguageService)],n)}),define(ne[829],se([1,0,5,18,2,21,65,22,112,125,215,139,9,4,70,35,51,7,520]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c){"use strict";var l,a;Object.defineProperty(e,"__esModule",{value:!0}),e.InlineEditSideBySideWidget=void 0;function*r(h,v,w=1){v===void 0&&([v,h]=[h,0]);for(let S=h;SS.replace(new RegExp("^"+v),"")),shift:w}}let C=class extends I.Disposable{static{l=this}static{this._modelId=0}static _createUniqueUri(){return m.URI.from({scheme:"inline-edit-widget",path:new Date().toString()+String(l._modelId++)})}constructor(v,w,S,L,D){super(),this._editor=v,this._model=w,this._instantiationService=S,this._diffProviderFactoryService=L,this._modelService=D,this._position=(0,E.derived)(this,T=>{const M=this._model.read(T);if(!M||M.text.length===0||M.range.startLineNumber===M.range.endLineNumber&&!(M.range.startColumn===M.range.endColumn&&M.range.startColumn===1))return null;const A=this._editor.getModel();if(!A)return null;const P=Array.from(r(M.range.startLineNumber,M.range.endLineNumber+1)),N=P.map(V=>A.getLineLastNonWhitespaceColumn(V)),O=Math.max(...N),F=P[N.indexOf(O)],x=new o.Position(F,O);return{top:M.range.startLineNumber,left:x}}),this._text=(0,E.derived)(this,T=>{const M=this._model.read(T);if(!M)return{text:"",shift:0};const A=u(M.text.split(` -`));return{text:A.text.join(` -`),shift:A.shift}}),this._originalModel=(0,y.derivedDisposable)(()=>this._modelService.createModel("",null,l._createUniqueUri())).keepObserved(this._store),this._modifiedModel=(0,y.derivedDisposable)(()=>this._modelService.createModel("",null,l._createUniqueUri())).keepObserved(this._store),this._diff=(0,E.derived)(this,T=>this._diffPromise.read(T)?.promiseResult.read(T)?.data),this._diffPromise=(0,E.derived)(this,T=>{const M=this._model.read(T);if(!M)return;const A=this._editor.getModel();if(!A)return;const P=u(A.getValueInRange(M.range).split(` -`)).text.join(` -`),N=u(M.text.split(` -`)).text.join(` -`);this._originalModel.get().setValue(P),this._modifiedModel.get().setValue(N);const O=this._diffProviderFactoryService.createDiffProvider({diffAlgorithm:"advanced"});return E.ObservablePromise.fromFn(async()=>{const F=await O.computeDiff(this._originalModel.get(),this._modifiedModel.get(),{computeMoves:!1,ignoreTrimWhitespace:!1,maxComputationTimeMs:1e3},k.CancellationToken.None);if(!F.identical)return F.changes})}),this._register((0,E.autorunWithStore)((T,M)=>{if(!this._model.read(T)||this._position.get()===null)return;const P=M.add(this._instantiationService.createInstance(f,this._editor,this._position,this._text.map(N=>N.text),this._text.map(N=>N.shift),this._diff));v.addOverlayWidget(P),M.add((0,I.toDisposable)(()=>v.removeOverlayWidget(P)))}))}};e.InlineEditSideBySideWidget=C,e.InlineEditSideBySideWidget=C=l=ke([ce(2,c.IInstantiationService),ce(3,p.IDiffProviderFactoryService),ce(4,g.IModelService)],C);let f=class extends I.Disposable{static{a=this}static{this.id=0}constructor(v,w,S,L,D,T){super(),this._editor=v,this._position=w,this._text=S,this._shift=L,this._diff=D,this._instantiationService=T,this.id=`InlineEditSideBySideContentWidget${a.id++}`,this.allowEditorOverflow=!1,this._nodes=(0,d.$)("div.inlineEditSideBySide",void 0),this._scrollChanged=(0,E.observableSignalFromEvent)("editor.onDidScrollChange",this._editor.onDidScrollChange),this._previewEditor=this._register(this._instantiationService.createInstance(b.EmbeddedCodeEditorWidget,this._nodes,{glyphMargin:!1,lineNumbers:"off",minimap:{enabled:!1},guides:{indentation:!1,bracketPairs:!1,bracketPairsHorizontal:!1,highlightActiveIndentation:!1},folding:!1,selectOnLineNumbers:!1,selectionHighlight:!1,columnSelection:!1,overviewRulerBorder:!1,overviewRulerLanes:0,lineDecorationsWidth:0,lineNumbersMinChars:0,scrollbar:{vertical:"hidden",horizontal:"hidden",alwaysConsumeMouseWheel:!1,handleMouseWheel:!1},readOnly:!0,wordWrap:"off",wordWrapOverride1:"off",wordWrapOverride2:"off",wrappingIndent:"none",wrappingStrategy:void 0},{contributions:[],isSimpleWidget:!0},this._editor)),this._previewEditorObs=(0,_.observableCodeEditor)(this._previewEditor),this._editorObs=(0,_.observableCodeEditor)(this._editor),this._previewTextModel=this._register(this._instantiationService.createInstance(s.TextModel,"",this._editor.getModel()?.getLanguageId()??i.PLAINTEXT_LANGUAGE_ID,s.TextModel.DEFAULT_CREATION_OPTIONS,null)),this._setText=(0,E.derived)(M=>{const A=this._text.read(M);A&&this._previewTextModel.setValue(A)}).recomputeInitiallyAndOnChange(this._store),this._decorations=(0,E.derived)(this,M=>{this._setText.read(M);const A=this._position.read(M);if(!A)return{org:[],mod:[]};const P=this._diff.read(M);if(!P)return{org:[],mod:[]};const N=[],O=[];if(P.length===1&&P[0].innerChanges[0].modifiedRange.equalsRange(this._previewTextModel.getFullModelRange()))return{org:[],mod:[]};const F=this._shift.get(),x=W=>new t.Range(W.startLineNumber+A.top-1,W.startColumn+F,W.endLineNumber+A.top-1,W.endColumn+F);for(const W of P)if(W.original.isEmpty||N.push({range:x(W.original.toInclusiveRange()),options:n.diffLineDeleteDecorationBackgroundWithIndicator}),W.modified.isEmpty||O.push({range:W.modified.toInclusiveRange(),options:n.diffLineAddDecorationBackgroundWithIndicator}),W.modified.isEmpty||W.original.isEmpty)W.original.isEmpty||N.push({range:x(W.original.toInclusiveRange()),options:n.diffWholeLineDeleteDecoration}),W.modified.isEmpty||O.push({range:W.modified.toInclusiveRange(),options:n.diffWholeLineAddDecoration});else for(const V of W.innerChanges||[])W.original.contains(V.originalRange.startLineNumber)&&N.push({range:x(V.originalRange),options:V.originalRange.isEmpty()?n.diffDeleteDecorationEmpty:n.diffDeleteDecoration}),W.modified.contains(V.modifiedRange.startLineNumber)&&O.push({range:V.modifiedRange,options:V.modifiedRange.isEmpty()?n.diffAddDecorationEmpty:n.diffAddDecoration});return{org:N,mod:O}}),this._originalDecorations=(0,E.derived)(this,M=>this._decorations.read(M).org),this._modifiedDecorations=(0,E.derived)(this,M=>this._decorations.read(M).mod),this._previewEditor.setModel(this._previewTextModel),this._register(this._editorObs.setDecorations(this._originalDecorations)),this._register(this._previewEditorObs.setDecorations(this._modifiedDecorations)),this._register((0,E.autorun)(M=>{const A=this._previewEditorObs.contentWidth.read(M),P=this._text.read(M).split(` -`).length-1,N=this._editor.getOption(67)*P;A<=0||this._previewEditor.layout({height:N,width:A})})),this._register((0,E.autorun)(M=>{this._position.read(M),this._editor.layoutOverlayWidget(this)})),this._register((0,E.autorun)(M=>{this._scrollChanged.read(M),this._position.read(M)&&this._editor.layoutOverlayWidget(this)}))}getId(){return this.id}getDomNode(){return this._nodes}getPosition(){const v=this._position.get();if(!v)return null;const w=this._editor.getLayoutInfo(),S=this._editor.getScrolledVisiblePosition(new o.Position(v.top,1));if(!S)return null;const L=S.top-1,D=this._editor.getOffsetForColumn(v.left.lineNumber,v.left.column);return{preference:{left:w.contentLeft+D+10,top:L}}}};f=a=ke([ce(5,c.IInstantiationService)],f)}),define(ne[425],se([1,0,2,21,75,9,4,828,12,7,27,17,18,204,24,800,5,28,8,65,829,215,51]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C){"use strict";var f;Object.defineProperty(e,"__esModule",{value:!0}),e.InlineEditController=void 0;let h=class extends d.Disposable{static{f=this}static{this.ID="editor.contrib.inlineEditController"}static{this.inlineEditVisibleKey="inlineEditVisible"}static{this.inlineEditVisibleContext=new _.RawContextKey(this.inlineEditVisibleKey,!1)}static{this.cursorAtInlineEditKey="cursorAtInlineEdit"}static{this.cursorAtInlineEditContext=new _.RawContextKey(this.cursorAtInlineEditKey,!1)}static get(S){return S.getContribution(f.ID)}constructor(S,L,D,T,M,A,P,N){super(),this.editor=S,this.instantiationService=L,this.contextKeyService=D,this.languageFeaturesService=T,this._commandService=M,this._configurationService=A,this._diffProviderFactoryService=P,this._modelService=N,this._isVisibleContext=f.inlineEditVisibleContext.bindTo(this.contextKeyService),this._isCursorAtInlineEditContext=f.cursorAtInlineEditContext.bindTo(this.contextKeyService),this._currentEdit=(0,k.observableValue)(this,void 0),this._currentWidget=(0,a.derivedDisposable)(this._currentEdit,q=>{const H=this._currentEdit.read(q);if(!H)return;const z=H.range.endLineNumber,U=H.range.endColumn,j=H.text.endsWith(` -`)&&!(H.range.startLineNumber===H.range.endLineNumber&&H.range.startColumn===H.range.endColumn)?H.text.slice(0,-1):H.text,Y=new t.GhostText(z,[new t.GhostTextPart(U,j,!1)]),G=H.range.startLineNumber===H.range.endLineNumber&&Y.parts.length===1&&Y.parts[0].lines.length===1,K=H.text==="";return!G&&!K?void 0:this.instantiationService.createInstance(m.GhostTextWidget,this.editor,{ghostText:(0,k.constObservable)(Y),minReservedLineCount:(0,k.constObservable)(0),targetTextModel:(0,k.constObservable)(this.editor.getModel()??void 0),range:(0,k.constObservable)(H.range)})}),this._isAccepting=(0,k.observableValue)(this,!1),this._enabled=(0,k.observableFromEvent)(this,this.editor.onDidChangeConfiguration,()=>this.editor.getOption(63).enabled),this._fontFamily=(0,k.observableFromEvent)(this,this.editor.onDidChangeConfiguration,()=>this.editor.getOption(63).fontFamily);const O=(0,k.observableSignalFromEvent)("InlineEditController.modelContentChangedSignal",S.onDidChangeModelContent);this._register((0,k.autorun)(q=>{this._enabled.read(q)&&(O.read(q),!this._isAccepting.read(q)&&this.getInlineEdit(S,!0))}));const F=(0,k.observableFromEvent)(this,S.onDidChangeCursorPosition,()=>S.getPosition());this._register((0,k.autorun)(q=>{if(!this._enabled.read(q))return;const H=F.read(q);H&&this.checkCursorPosition(H)})),this._register((0,k.autorun)(q=>{const H=this._currentEdit.read(q);if(this._isCursorAtInlineEditContext.set(!1),!H){this._isVisibleContext.set(!1);return}this._isVisibleContext.set(!0);const z=S.getPosition();z&&this.checkCursorPosition(z)}));const x=(0,k.observableSignalFromEvent)("InlineEditController.editorBlurSignal",S.onDidBlurEditorWidget);this._register((0,k.autorun)(async q=>{this._enabled.read(q)&&(x.read(q),!(this._configurationService.getValue("editor.experimentalInlineEdit.keepOnBlur")||S.getOption(63).keepOnBlur)&&(this._currentRequestCts?.dispose(!0),this._currentRequestCts=void 0,await this.clear(!1)))}));const W=(0,k.observableSignalFromEvent)("InlineEditController.editorFocusSignal",S.onDidFocusEditorText);this._register((0,k.autorun)(q=>{this._enabled.read(q)&&(W.read(q),this.getInlineEdit(S,!0))}));const V=this._register((0,g.createStyleSheet2)());this._register((0,k.autorun)(q=>{const H=this._fontFamily.read(q);V.setStyle(H===""||H==="default"?"":` -.monaco-editor .inline-edit-decoration, -.monaco-editor .inline-edit-decoration-preview, -.monaco-editor .inline-edit { - font-family: ${H}; -}`)})),this._register(new s.InlineEditHintsWidget(this.editor,this._currentWidget,this.instantiationService)),this._register(new r.InlineEditSideBySideWidget(this.editor,this._currentEdit,this.instantiationService,this._diffProviderFactoryService,this._modelService))}checkCursorPosition(S){if(!this._currentEdit){this._isCursorAtInlineEditContext.set(!1);return}const L=this._currentEdit.get();if(!L){this._isCursorAtInlineEditContext.set(!1);return}this._isCursorAtInlineEditContext.set(y.Range.containsPosition(L.range,S))}validateInlineEdit(S,L){if(L.text.includes(` -`)&&L.range.startLineNumber!==L.range.endLineNumber&&L.range.startColumn!==L.range.endColumn){if(L.range.startColumn!==1)return!1;const T=L.range.endLineNumber,M=L.range.endColumn,A=S.getModel()?.getLineLength(T)??0;if(M!==A+1)return!1}return!0}async fetchInlineEdit(S,L){this._currentRequestCts&&this._currentRequestCts.dispose(!0);const D=S.getModel();if(!D)return;const T=D.getVersionId(),M=this.languageFeaturesService.inlineEditProvider.all(D);if(M.length===0)return;const A=M[0];this._currentRequestCts=new o.CancellationTokenSource;const P=this._currentRequestCts.token,N=L?p.InlineEditTriggerKind.Automatic:p.InlineEditTriggerKind.Invoke;if(L&&await v(50,P),P.isCancellationRequested||D.isDisposed()||D.getVersionId()!==T)return;const F=await A.provideInlineEdit(D,{triggerKind:N},P);if(F&&!(P.isCancellationRequested||D.isDisposed()||D.getVersionId()!==T)&&this.validateInlineEdit(S,F))return F}async getInlineEdit(S,L){this._isCursorAtInlineEditContext.set(!1),await this.clear();const D=await this.fetchInlineEdit(S,L);D&&this._currentEdit.set(D,void 0)}async trigger(){await this.getInlineEdit(this.editor,!1)}async jumpBack(){this._jumpBackPosition&&(this.editor.setPosition(this._jumpBackPosition),this.editor.revealPositionInCenterIfOutsideViewport(this._jumpBackPosition))}async accept(){this._isAccepting.set(!0,void 0);const S=this._currentEdit.get();if(!S)return;let L=S.text;S.text.startsWith(` -`)&&(L=S.text.substring(1)),this.editor.pushUndoStop(),this.editor.executeEdits("acceptCurrent",[I.EditOperation.replace(y.Range.lift(S.range),L)]),S.accepted&&await this._commandService.executeCommand(S.accepted.id,...S.accepted.arguments||[]).then(void 0,l.onUnexpectedExternalError),this.freeEdit(S),(0,k.transaction)(D=>{this._currentEdit.set(void 0,D),this._isAccepting.set(!1,D)})}jumpToCurrent(){this._jumpBackPosition=this.editor.getSelection()?.getStartPosition();const S=this._currentEdit.get();if(!S)return;const L=E.Position.lift({lineNumber:S.range.startLineNumber,column:S.range.startColumn});this.editor.setPosition(L),this.editor.revealPositionInCenterIfOutsideViewport(L)}async clear(S=!0){const L=this._currentEdit.get();L&&L?.rejected&&S&&await this._commandService.executeCommand(L.rejected.id,...L.rejected.arguments||[]).then(void 0,l.onUnexpectedExternalError),L&&this.freeEdit(L),this._currentEdit.set(void 0,void 0)}freeEdit(S){const L=this.editor.getModel();if(!L)return;const D=this.languageFeaturesService.inlineEditProvider.all(L);D.length!==0&&D[0].freeInlineEdit(S)}};e.InlineEditController=h,e.InlineEditController=h=f=ke([ce(1,b.IInstantiationService),ce(2,_.IContextKeyService),ce(3,n.ILanguageFeaturesService),ce(4,i.ICommandService),ce(5,c.IConfigurationService),ce(6,u.IDiffProviderFactoryService),ce(7,C.IModelService)],h);function v(w,S){return new Promise(L=>{let D;const T=setTimeout(()=>{D&&D.dispose(),L()},w);S&&(D=S.onCancellationRequested(()=>{clearTimeout(T),D&&D.dispose(),L()}))})}}),define(ne[830],se([1,0,15,20,618,425,29,12]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RejectInlineEdit=e.JumpBackInlineEdit=e.JumpToInlineEdit=e.TriggerInlineEdit=e.AcceptInlineEdit=void 0;class _ extends d.EditorAction{constructor(){super({id:I.inlineEditAcceptId,label:"Accept Inline Edit",alias:"Accept Inline Edit",precondition:m.ContextKeyExpr.and(k.EditorContextKeys.writable,E.InlineEditController.inlineEditVisibleContext),kbOpts:[{weight:101,primary:2,kbExpr:m.ContextKeyExpr.and(k.EditorContextKeys.writable,E.InlineEditController.inlineEditVisibleContext,E.InlineEditController.cursorAtInlineEditContext)}],menuOpts:[{menuId:y.MenuId.InlineEditToolbar,title:"Accept",group:"primary",order:1}]})}async run(i,s){await E.InlineEditController.get(s)?.accept()}}e.AcceptInlineEdit=_;class b extends d.EditorAction{constructor(){const i=m.ContextKeyExpr.and(k.EditorContextKeys.writable,m.ContextKeyExpr.not(E.InlineEditController.inlineEditVisibleKey));super({id:"editor.action.inlineEdit.trigger",label:"Trigger Inline Edit",alias:"Trigger Inline Edit",precondition:i,kbOpts:{weight:101,primary:2646,kbExpr:i}})}async run(i,s){E.InlineEditController.get(s)?.trigger()}}e.TriggerInlineEdit=b;class p extends d.EditorAction{constructor(){const i=m.ContextKeyExpr.and(k.EditorContextKeys.writable,E.InlineEditController.inlineEditVisibleContext,m.ContextKeyExpr.not(E.InlineEditController.cursorAtInlineEditKey));super({id:I.inlineEditJumpToId,label:"Jump to Inline Edit",alias:"Jump to Inline Edit",precondition:i,kbOpts:{weight:101,primary:2646,kbExpr:i},menuOpts:[{menuId:y.MenuId.InlineEditToolbar,title:"Jump To Edit",group:"primary",order:3,when:i}]})}async run(i,s){E.InlineEditController.get(s)?.jumpToCurrent()}}e.JumpToInlineEdit=p;class n extends d.EditorAction{constructor(){const i=m.ContextKeyExpr.and(k.EditorContextKeys.writable,E.InlineEditController.cursorAtInlineEditContext);super({id:I.inlineEditJumpBackId,label:"Jump Back from Inline Edit",alias:"Jump Back from Inline Edit",precondition:i,kbOpts:{weight:110,primary:2646,kbExpr:i},menuOpts:[{menuId:y.MenuId.InlineEditToolbar,title:"Jump Back",group:"primary",order:3,when:i}]})}async run(i,s){E.InlineEditController.get(s)?.jumpBack()}}e.JumpBackInlineEdit=n;class o extends d.EditorAction{constructor(){const i=m.ContextKeyExpr.and(k.EditorContextKeys.writable,E.InlineEditController.inlineEditVisibleContext);super({id:I.inlineEditRejectId,label:"Reject Inline Edit",alias:"Reject Inline Edit",precondition:i,kbOpts:{weight:100,primary:9,kbExpr:i},menuOpts:[{menuId:y.MenuId.InlineEditToolbar,title:"Reject",group:"secondary",order:2}]})}async run(i,s){await E.InlineEditController.get(s)?.clear()}}e.RejectInlineEdit=o}),define(ne[831],se([1,0,15,830,425]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),(0,d.registerEditorAction)(k.AcceptInlineEdit),(0,d.registerEditorAction)(k.RejectInlineEdit),(0,d.registerEditorAction)(k.JumpToInlineEdit),(0,d.registerEditorAction)(k.JumpBackInlineEdit),(0,d.registerEditorAction)(k.TriggerInlineEdit),(0,d.registerEditorContribution)(I.InlineEditController.ID,I.InlineEditController,3)}),define(ne[290],se([1,0,5,14,26,2,11,30,4,35,7,522]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlineProgressManager=void 0;const n=b.ModelDecorationOptions.register({description:"inline-progress-widget",stickiness:1,showIfCollapsed:!0,after:{content:y.noBreakWhitespace,inlineClassName:"inline-editor-progress-decoration",inlineClassNameAffectsLetterSpacing:!0}});class o extends E.Disposable{static{this.baseId="editor.widget.inlineProgressWidget"}constructor(s,g,c,l,a){super(),this.typeId=s,this.editor=g,this.range=c,this.delegate=a,this.allowEditorOverflow=!1,this.suppressMouseDown=!0,this.create(l),this.editor.addContentWidget(this),this.editor.layoutContentWidget(this)}create(s){this.domNode=d.$(".inline-progress-widget"),this.domNode.role="button",this.domNode.title=s;const g=d.$("span.icon");this.domNode.append(g),g.classList.add(...m.ThemeIcon.asClassNameArray(I.Codicon.loading),"codicon-modifier-spin");const c=()=>{const l=this.editor.getOption(67);this.domNode.style.height=`${l}px`,this.domNode.style.width=`${Math.ceil(.8*l)}px`};c(),this._register(this.editor.onDidChangeConfiguration(l=>{(l.hasChanged(52)||l.hasChanged(67))&&c()})),this._register(d.addDisposableListener(this.domNode,d.EventType.CLICK,l=>{this.delegate.cancel()}))}getId(){return o.baseId+"."+this.typeId}getDomNode(){return this.domNode}getPosition(){return{position:{lineNumber:this.range.startLineNumber,column:this.range.startColumn},preference:[0]}}dispose(){super.dispose(),this.editor.removeContentWidget(this)}}let t=class extends E.Disposable{constructor(s,g,c){super(),this.id=s,this._editor=g,this._instantiationService=c,this._showDelay=500,this._showPromise=this._register(new E.MutableDisposable),this._currentWidget=this._register(new E.MutableDisposable),this._operationIdPool=0,this._currentDecorations=g.createDecorationsCollection()}dispose(){super.dispose(),this._currentDecorations.clear()}async showWhile(s,g,c,l,a){const r=this._operationIdPool++;this._currentOperation=r,this.clear(),this._showPromise.value=(0,k.disposableTimeout)(()=>{const u=_.Range.fromPositions(s);this._currentDecorations.set([{range:u,options:n}]).length>0&&(this._currentWidget.value=this._instantiationService.createInstance(o,this.id,this._editor,u,g,l))},a??this._showDelay);try{return await c}finally{this._currentOperation===r&&(this.clear(),this._currentOperation=void 0)}}clear(){this._showPromise.clear(),this._currentDecorations.clear(),this._currentWidget.clear()}};e.InlineProgressManager=t,e.InlineProgressManager=t=ke([ce(2,p.IInstantiationService)],t)}),define(ne[832],se([1,0,13,14,194,91,2,400,4,17,327,678,122,290,3,28,12,399,7,268,396]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r){"use strict";var u;Object.defineProperty(e,"__esModule",{value:!0}),e.DropIntoEditorController=e.dropWidgetVisibleCtx=e.changeDropTypeCommandId=e.defaultProviderConfig=void 0,e.defaultProviderConfig="editor.experimental.dropIntoEditor.defaultProvider",e.changeDropTypeCommandId="editor.changeDropType",e.dropWidgetVisibleCtx=new g.RawContextKey("dropWidgetVisible",!1,(0,i.localize)(842,"Whether the drop widget is showing"));let C=class extends y.Disposable{static{u=this}static{this.ID="editor.contrib.dropIntoEditorController"}static get(h){return h.getContribution(u.ID)}constructor(h,v,w,S,L){super(),this._configService=w,this._languageFeaturesService=S,this._treeViewsDragAndDropService=L,this.treeItemsTransfer=c.LocalSelectionTransfer.getInstance(),this._dropProgressManager=this._register(v.createInstance(t.InlineProgressManager,"dropIntoEditor",h)),this._postDropWidgetManager=this._register(v.createInstance(r.PostEditWidgetManager,"dropIntoEditor",h,e.dropWidgetVisibleCtx,{id:e.changeDropTypeCommandId,label:(0,i.localize)(843,"Show drop options...")})),this._register(h.onDropIntoEditor(D=>this.onDropIntoEditor(h,D.position,D.event)))}clearWidgets(){this._postDropWidgetManager.clear()}changeDropType(){this._postDropWidgetManager.tryShowSelector()}async onDropIntoEditor(h,v,w){if(!w.dataTransfer||!h.hasModel())return;this._currentOperation?.cancel(),h.focus(),h.setPosition(v);const S=(0,k.createCancelablePromise)(async L=>{const D=new y.DisposableStore,T=D.add(new o.EditorStateCancellationTokenSource(h,1,void 0,L));try{const M=await this.extractDataTransferData(w);if(M.size===0||T.token.isCancellationRequested)return;const A=h.getModel();if(!A)return;const P=this._languageFeaturesService.documentDropEditProvider.ordered(A).filter(O=>O.dropMimeTypes?O.dropMimeTypes.some(F=>M.matches(F)):!0),N=D.add(await this.getDropEdits(P,A,v,M,T));if(T.token.isCancellationRequested)return;if(N.edits.length){const O=this.getInitialActiveEditIndex(A,N.edits),F=h.getOption(36).showDropSelector==="afterDrop";await this._postDropWidgetManager.applyEditAndShowIfNeeded([_.Range.fromPositions(v)],{activeEditIndex:O,allEdits:N.edits},F,async x=>x,L)}}finally{D.dispose(),this._currentOperation===S&&(this._currentOperation=void 0)}});this._dropProgressManager.showWhile(v,(0,i.localize)(844,"Running drop handlers. Click to cancel"),S,{cancel:()=>S.cancel()}),this._currentOperation=S}async getDropEdits(h,v,w,S,L){const D=new y.DisposableStore,T=await(0,k.raceCancellation)(Promise.all(h.map(async A=>{try{const P=await A.provideDocumentDropEdits(v,w,S,L.token);return P&&D.add(P),P?.edits.map(N=>({...N,providerId:A.id}))}catch(P){console.error(P)}})),L.token),M=(0,d.coalesce)(T??[]).flat();return{edits:(0,a.sortEditsByYieldTo)(M),dispose:()=>D.dispose()}}getInitialActiveEditIndex(h,v){const w=this._configService.getValue(e.defaultProviderConfig,{resource:h.uri});for(const[S,L]of Object.entries(w)){const D=new E.HierarchicalKind(L),T=v.findIndex(M=>D.value===M.providerId&&M.handledMimeType&&(0,I.matchesMimeType)(S,[M.handledMimeType]));if(T>=0)return T}return 0}async extractDataTransferData(h){if(!h.dataTransfer)return new I.VSDataTransfer;const v=(0,m.toExternalVSDataTransfer)(h.dataTransfer);if(this.treeItemsTransfer.hasData(p.DraggedTreeItemsIdentifier.prototype)){const w=this.treeItemsTransfer.getData(p.DraggedTreeItemsIdentifier.prototype);if(Array.isArray(w))for(const S of w){const L=await this._treeViewsDragAndDropService.removeDragOperationTransfer(S.identifier);if(L)for(const[D,T]of L)v.replace(D,T)}}return v}};e.DropIntoEditorController=C,e.DropIntoEditorController=C=u=ke([ce(1,l.IInstantiationService),ce(2,s.IConfigurationService),ce(3,b.ILanguageFeaturesService),ce(4,n.ITreeViewsDnDService)],C)}),define(ne[833],se([1,0,13,14,18,33,8,6,2,11,22,15,34,9,4,20,35,36,3,12,17,32,79,54,523]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f){"use strict";var h;Object.defineProperty(e,"__esModule",{value:!0}),e.editorLinkedEditingBackground=e.LinkedEditingAction=e.LinkedEditingContribution=e.CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE=void 0,e.CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE=new a.RawContextKey("LinkedEditingInputVisible",!1);const v="linked-editing-decoration";let w=class extends _.Disposable{static{h=this}static{this.ID="editor.contrib.linkedEditing"}static{this.DECORATION=g.ModelDecorationOptions.register({description:"linked-editing",stickiness:0,className:v})}static get(M){return M.getContribution(h.ID)}constructor(M,A,P,N,O){super(),this.languageConfigurationService=N,this._syncRangesToken=0,this._localToDispose=this._register(new _.DisposableStore),this._editor=M,this._providers=P.linkedEditingRangeProvider,this._enabled=!1,this._visibleContextKey=e.CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE.bindTo(A),this._debounceInformation=O.for(this._providers,"Linked Editing",{max:200}),this._currentDecorations=this._editor.createDecorationsCollection(),this._languageWordPattern=null,this._currentWordPattern=null,this._ignoreChangeEvent=!1,this._localToDispose=this._register(new _.DisposableStore),this._rangeUpdateTriggerPromise=null,this._rangeSyncTriggerPromise=null,this._currentRequestCts=null,this._currentRequestPosition=null,this._currentRequestModelVersion=null,this._register(this._editor.onDidChangeModel(()=>this.reinitialize(!0))),this._register(this._editor.onDidChangeConfiguration(F=>{(F.hasChanged(70)||F.hasChanged(94))&&this.reinitialize(!1)})),this._register(this._providers.onDidChange(()=>this.reinitialize(!1))),this._register(this._editor.onDidChangeModelLanguage(()=>this.reinitialize(!0))),this.reinitialize(!0)}reinitialize(M){const A=this._editor.getModel(),P=A!==null&&(this._editor.getOption(70)||this._editor.getOption(94))&&this._providers.has(A);if(P===this._enabled&&!M||(this._enabled=P,this.clearRanges(),this._localToDispose.clear(),!P||A===null))return;this._localToDispose.add(m.Event.runAndSubscribe(A.onDidChangeLanguageConfiguration,()=>{this._languageWordPattern=this.languageConfigurationService.getLanguageConfiguration(A.getLanguageId()).getWordDefinition()}));const N=new k.Delayer(this._debounceInformation.get(A)),O=()=>{this._rangeUpdateTriggerPromise=N.trigger(()=>this.updateRanges(),this._debounceDuration??this._debounceInformation.get(A))},F=new k.Delayer(0),x=W=>{this._rangeSyncTriggerPromise=F.trigger(()=>this._syncRanges(W))};this._localToDispose.add(this._editor.onDidChangeCursorPosition(()=>{O()})),this._localToDispose.add(this._editor.onDidChangeModelContent(W=>{if(!this._ignoreChangeEvent&&this._currentDecorations.length>0){const V=this._currentDecorations.getRange(0);if(V&&W.changes.every(q=>V.intersectRanges(q.range))){x(this._syncRangesToken);return}}O()})),this._localToDispose.add({dispose:()=>{N.dispose(),F.dispose()}}),this.updateRanges()}_syncRanges(M){if(!this._editor.hasModel()||M!==this._syncRangesToken||this._currentDecorations.length===0)return;const A=this._editor.getModel(),P=this._currentDecorations.getRange(0);if(!P||P.startLineNumber!==P.endLineNumber)return this.clearRanges();const N=A.getValueInRange(P);if(this._currentWordPattern){const F=N.match(this._currentWordPattern);if((F?F[0].length:0)!==N.length)return this.clearRanges()}const O=[];for(let F=1,x=this._currentDecorations.length;F1){this.clearRanges();return}const P=this._editor.getModel(),N=P.getVersionId();if(this._currentRequestPosition&&this._currentRequestModelVersion===N){if(A.equals(this._currentRequestPosition))return;if(this._currentDecorations.length>0){const F=this._currentDecorations.getRange(0);if(F&&F.containsPosition(A))return}}this.clearRanges(),this._currentRequestPosition=A,this._currentRequestModelVersion=N;const O=this._currentRequestCts=new I.CancellationTokenSource;try{const F=new f.StopWatch(!1),x=await D(this._providers,P,A,O.token);if(this._debounceInformation.update(P,F.elapsed()),O!==this._currentRequestCts||(this._currentRequestCts=null,N!==P.getVersionId()))return;let W=[];x?.ranges&&(W=x.ranges),this._currentWordPattern=x?.wordPattern||this._languageWordPattern;let V=!1;for(let H=0,z=W.length;H({range:H,options:h.DECORATION}));this._visibleContextKey.set(!0),this._currentDecorations.set(q),this._syncRangesToken++}catch(F){(0,y.isCancellationError)(F)||(0,y.onUnexpectedError)(F),(this._currentRequestCts===O||!this._currentRequestCts)&&this.clearRanges()}}};e.LinkedEditingContribution=w,e.LinkedEditingContribution=w=h=ke([ce(1,a.IContextKeyService),ce(2,r.ILanguageFeaturesService),ce(3,c.ILanguageConfigurationService),ce(4,C.ILanguageFeatureDebounceService)],w);class S extends n.EditorAction{constructor(){super({id:"editor.action.linkedEditing",label:l.localize(1136,"Start Linked Editing"),alias:"Start Linked Editing",precondition:a.ContextKeyExpr.and(s.EditorContextKeys.writable,s.EditorContextKeys.hasRenameProvider),kbOpts:{kbExpr:s.EditorContextKeys.editorTextFocus,primary:3132,weight:100}})}runCommand(M,A){const P=M.get(o.ICodeEditorService),[N,O]=Array.isArray(A)&&A||[void 0,void 0];return p.URI.isUri(N)&&t.Position.isIPosition(O)?P.openCodeEditor({resource:N},P.getActiveCodeEditor()).then(F=>{F&&(F.setPosition(O),F.invokeWithinContext(x=>(this.reportTelemetry(x,F),this.run(x,F))))},y.onUnexpectedError):super.runCommand(M,A)}run(M,A){const P=w.get(A);return P?Promise.resolve(P.updateRanges(!0)):Promise.resolve()}}e.LinkedEditingAction=S;const L=n.EditorCommand.bindToContribution(w.get);(0,n.registerEditorCommand)(new L({id:"cancelLinkedEditingInput",precondition:e.CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE,handler:T=>T.clearRanges(),kbOpts:{kbExpr:s.EditorContextKeys.editorTextFocus,weight:199,primary:9,secondary:[1033]}}));function D(T,M,A,P){const N=T.ordered(M);return(0,k.first)(N.map(O=>async()=>{try{return await O.provideLinkedEditingRanges(M,A,P)}catch(F){(0,y.onUnexpectedExternalError)(F);return}}),O=>!!O&&d.isNonEmptyArray(O?.ranges))}e.editorLinkedEditingBackground=(0,u.registerColor)("editor.linkedEditingBackground",{dark:E.Color.fromHex("#f00").transparent(.3),light:E.Color.fromHex("#f00").transparent(.3),hcDark:E.Color.fromHex("#f00").transparent(.3),hcLight:E.Color.white},l.localize(1137,"Background color when the editor auto renames on type.")),(0,n.registerModelAndPositionCommand)("_executeLinkedEditingProvider",(T,M,A)=>{const{linkedEditingRangeProvider:P}=T.get(r.ILanguageFeaturesService);return D(P,M,A,I.CancellationToken.None)}),(0,n.registerEditorContribution)(w.ID,w,1),(0,n.registerEditorAction)(S)}),define(ne[834],se([1,0,14,18,8,57,2,42,16,48,54,22,15,35,79,17,209,681,3,50,59,524]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r){"use strict";var u;Object.defineProperty(e,"__esModule",{value:!0}),e.LinkDetector=void 0;let C=class extends y.Disposable{static{u=this}static{this.ID="editor.linkDetector"}static get(L){return L.getContribution(u.ID)}constructor(L,D,T,M,A){super(),this.editor=L,this.openerService=D,this.notificationService=T,this.languageFeaturesService=M,this.providers=this.languageFeaturesService.linkProvider,this.debounceInformation=A.for(this.providers,"Links",{min:1e3,max:4e3}),this.computeLinks=this._register(new d.RunOnceScheduler(()=>this.computeLinksNow(),1e3)),this.computePromise=null,this.activeLinksList=null,this.currentOccurrences={},this.activeLinkDecorationId=null;const P=this._register(new g.ClickLinkGesture(L));this._register(P.onMouseMoveOrRelevantKeyDown(([N,O])=>{this._onEditorMouseMove(N,O)})),this._register(P.onExecute(N=>{this.onEditorMouseUp(N)})),this._register(P.onCancel(N=>{this.cleanUpActiveLinkDecoration()})),this._register(L.onDidChangeConfiguration(N=>{N.hasChanged(71)&&(this.updateDecorations([]),this.stop(),this.computeLinks.schedule(0))})),this._register(L.onDidChangeModelContent(N=>{this.editor.hasModel()&&this.computeLinks.schedule(this.debounceInformation.get(this.editor.getModel()))})),this._register(L.onDidChangeModel(N=>{this.currentOccurrences={},this.activeLinkDecorationId=null,this.stop(),this.computeLinks.schedule(0)})),this._register(L.onDidChangeModelLanguage(N=>{this.stop(),this.computeLinks.schedule(0)})),this._register(this.providers.onDidChange(N=>{this.stop(),this.computeLinks.schedule(0)})),this.computeLinks.schedule(0)}async computeLinksNow(){if(!this.editor.hasModel()||!this.editor.getOption(71))return;const L=this.editor.getModel();if(!L.isTooLargeForSyncing()&&this.providers.has(L)){this.activeLinksList&&(this.activeLinksList.dispose(),this.activeLinksList=null),this.computePromise=(0,d.createCancelablePromise)(D=>(0,c.getLinks)(this.providers,L,D));try{const D=new p.StopWatch(!1);if(this.activeLinksList=await this.computePromise,this.debounceInformation.update(L,D.elapsed()),L.isDisposed())return;this.updateDecorations(this.activeLinksList.links)}catch(D){(0,I.onUnexpectedError)(D)}finally{this.computePromise=null}}}updateDecorations(L){const D=this.editor.getOption(78)==="altKey",T=[],M=Object.keys(this.currentOccurrences);for(const P of M){const N=this.currentOccurrences[P];T.push(N.decorationId)}const A=[];if(L)for(const P of L)A.push(h.decoration(P,D));this.editor.changeDecorations(P=>{const N=P.deltaDecorations(T,A);this.currentOccurrences={},this.activeLinkDecorationId=null;for(let O=0,F=N.length;O{M.activate(A,T),this.activeLinkDecorationId=M.decorationId})}else this.cleanUpActiveLinkDecoration()}cleanUpActiveLinkDecoration(){const L=this.editor.getOption(78)==="altKey";if(this.activeLinkDecorationId){const D=this.currentOccurrences[this.activeLinkDecorationId];D&&this.editor.changeDecorations(T=>{D.deactivate(T,L)}),this.activeLinkDecorationId=null}}onEditorMouseUp(L){if(!this.isEnabled(L))return;const D=this.getLinkOccurrence(L.target.position);D&&this.openLinkOccurrence(D,L.hasSideBySideModifier,!0)}openLinkOccurrence(L,D,T=!1){if(!this.openerService)return;const{link:M}=L;M.resolve(k.CancellationToken.None).then(A=>{if(typeof A=="string"&&this.editor.hasModel()){const P=this.editor.getModel().uri;if(P.scheme===m.Schemas.file&&A.startsWith(`${m.Schemas.file}:`)){const N=n.URI.parse(A);if(N.scheme===m.Schemas.file){const O=b.originalFSPath(N);let F=null;O.startsWith("/./")||O.startsWith("\\.\\")?F=`.${O.substr(1)}`:(O.startsWith("//./")||O.startsWith("\\\\.\\"))&&(F=`.${O.substr(2)}`),F&&(A=b.joinPath(P,F))}}}return this.openerService.open(A,{openToSide:D,fromUserGesture:T,allowContributedOpeners:!0,allowCommands:!0,fromWorkspace:!0})},A=>{const P=A instanceof Error?A.message:A;P==="invalid"?this.notificationService.warn(l.localize(1138,"Failed to open this link because it is not well-formed: {0}",M.url.toString())):P==="missing"?this.notificationService.warn(l.localize(1139,"Failed to open this link because its target is missing.")):(0,I.onUnexpectedError)(A)})}getLinkOccurrence(L){if(!this.editor.hasModel()||!L)return null;const D=this.editor.getModel().getDecorationsInRange({startLineNumber:L.lineNumber,startColumn:L.column,endLineNumber:L.lineNumber,endColumn:L.column},0,!0);for(const T of D){const M=this.currentOccurrences[T.id];if(M)return M}return null}isEnabled(L,D){return!!(L.target.type===6&&(L.hasTriggerModifier||D&&D.keyCodeIsTriggerKey))}stop(){this.computeLinks.cancel(),this.activeLinksList&&(this.activeLinksList?.dispose(),this.activeLinksList=null),this.computePromise&&(this.computePromise.cancel(),this.computePromise=null)}dispose(){super.dispose(),this.stop()}};e.LinkDetector=C,e.LinkDetector=C=u=ke([ce(1,r.IOpenerService),ce(2,a.INotificationService),ce(3,s.ILanguageFeaturesService),ce(4,i.ILanguageFeatureDebounceService)],C);const f={general:t.ModelDecorationOptions.register({description:"detected-link",stickiness:1,collapseOnReplaceEdit:!0,inlineClassName:"detected-link"}),active:t.ModelDecorationOptions.register({description:"detected-link-active",stickiness:1,collapseOnReplaceEdit:!0,inlineClassName:"detected-link-active"})};class h{static decoration(L,D){return{range:L.range,options:h._getOptions(L,D,!1)}}static _getOptions(L,D,T){const M={...T?f.active:f.general};return M.hoverMessage=v(L,D),M}constructor(L,D){this.link=L,this.decorationId=D}activate(L,D){L.changeDecorationOptions(this.decorationId,h._getOptions(this.link,D,!0))}deactivate(L,D){L.changeDecorationOptions(this.decorationId,h._getOptions(this.link,D,!1))}}function v(S,L){const D=S.url&&/^command:/i.test(S.url.toString()),T=S.tooltip?S.tooltip:D?l.localize(1140,"Execute command"):l.localize(1141,"Follow link"),M=L?_.isMacintosh?l.localize(1142,"cmd + click"):l.localize(1143,"ctrl + click"):_.isMacintosh?l.localize(1144,"option + click"):l.localize(1145,"alt + click");if(S.url){let A="";if(/^command:/i.test(S.url.toString())){const N=S.url.toString().match(/^command:([^?#]+)/);if(N){const O=N[1];A=l.localize(1146,"Execute command {0}",O)}}return new E.MarkdownString("",!0).appendLink(S.url.toString(!0).replace(/ /g,"%20"),T,A).appendMarkdown(` (${M})`)}else return new E.MarkdownString().appendText(`${T} (${M})`)}class w extends o.EditorAction{constructor(){super({id:"editor.action.openLink",label:l.localize(1147,"Open Link"),alias:"Open Link",precondition:void 0})}run(L,D){const T=C.get(D);if(!T||!D.hasModel())return;const M=D.getSelections();for(const A of M){const P=T.getLinkOccurrence(A.getEndPosition());P&&T.openLinkOccurrence(P,!1)}}}(0,o.registerEditorContribution)(C.ID,C,1),(0,o.registerEditorAction)(w)}),define(ne[835],se([1,0,14,2,15,36,35,100]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SectionHeaderDetector=void 0;let _=class extends k.Disposable{static{this.ID="editor.sectionHeaderDetector"}constructor(n,o,t){super(),this.editor=n,this.languageConfigurationService=o,this.editorWorkerService=t,this.decorations=this.editor.createDecorationsCollection(),this.options=this.createOptions(n.getOption(73)),this.computePromise=null,this.currentOccurrences={},this._register(n.onDidChangeModel(i=>{this.currentOccurrences={},this.options=this.createOptions(n.getOption(73)),this.stop(),this.computeSectionHeaders.schedule(0)})),this._register(n.onDidChangeModelLanguage(i=>{this.currentOccurrences={},this.options=this.createOptions(n.getOption(73)),this.stop(),this.computeSectionHeaders.schedule(0)})),this._register(o.onDidChange(i=>{const s=this.editor.getModel()?.getLanguageId();s&&i.affects(s)&&(this.currentOccurrences={},this.options=this.createOptions(n.getOption(73)),this.stop(),this.computeSectionHeaders.schedule(0))})),this._register(n.onDidChangeConfiguration(i=>{this.options&&!i.hasChanged(73)||(this.options=this.createOptions(n.getOption(73)),this.updateDecorations([]),this.stop(),this.computeSectionHeaders.schedule(0))})),this._register(this.editor.onDidChangeModelContent(i=>{this.computeSectionHeaders.schedule()})),this._register(n.onDidChangeModelTokens(i=>{this.computeSectionHeaders.isScheduled()||this.computeSectionHeaders.schedule(1e3)})),this.computeSectionHeaders=this._register(new d.RunOnceScheduler(()=>{this.findSectionHeaders()},250)),this.computeSectionHeaders.schedule(0)}createOptions(n){if(!n||!this.editor.hasModel())return;const o=this.editor.getModel().getLanguageId();if(!o)return;const t=this.languageConfigurationService.getLanguageConfiguration(o).comments,i=this.languageConfigurationService.getLanguageConfiguration(o).foldingRules;if(!(!t&&!i?.markers))return{foldingRules:i,findMarkSectionHeaders:n.showMarkSectionHeaders,findRegionSectionHeaders:n.showRegionSectionHeaders}}findSectionHeaders(){if(!this.editor.hasModel()||!this.options?.findMarkSectionHeaders&&!this.options?.findRegionSectionHeaders)return;const n=this.editor.getModel();if(n.isDisposed()||n.isTooLargeForSyncing())return;const o=n.getVersionId();this.editorWorkerService.findSectionHeaders(n.uri,this.options).then(t=>{n.isDisposed()||n.getVersionId()!==o||this.updateDecorations(t)})}updateDecorations(n){const o=this.editor.getModel();o&&(n=n.filter(s=>{if(!s.shouldBeInComments)return!0;const g=o.validateRange(s.range),c=o.tokenization.getLineTokens(g.startLineNumber),l=c.findTokenIndexAtOffset(g.startColumn-1),a=c.getStandardTokenType(l);return c.getLanguageId(l)===o.getLanguageId()&&a===1}));const t=Object.values(this.currentOccurrences).map(s=>s.decorationId),i=n.map(s=>b(s));this.editor.changeDecorations(s=>{const g=s.deltaDecorations(t,i);this.currentOccurrences={};for(let c=0,l=g.length;cf.dispose()),this._updateOperation.clear(),this._cancelModelPromise(),super.dispose()}_cancelModelPromise(){this._modelPromise&&(this._modelPromise.cancel(),this._modelPromise=null)}async update(f){return this._updateOperation.clear(),this._updateOperation.add({dispose:()=>{this._cancelModelPromise(),this._updateScheduler.cancel()}}),this._cancelModelPromise(),await this._updateScheduler.trigger(async()=>{for(const h of this._modelProviders){const{statusPromise:v,modelPromise:w}=h.computeStickyModel(f);this._modelPromise=w;const S=await v;if(this._modelPromise!==w)return null;switch(S){case s.CANCELED:return this._updateOperation.clear(),null;case s.VALID:return h.stickyModel}}return null}).catch(h=>((0,p.onUnexpectedError)(h),null))}};e.StickyModelProvider=g,e.StickyModelProvider=g=ke([ce(2,t.IInstantiationService),ce(3,k.ILanguageFeaturesService)],g);class c extends d.Disposable{constructor(f){super(),this._editor=f,this._stickyModel=null}get stickyModel(){return this._stickyModel}_invalid(){return this._stickyModel=null,s.INVALID}computeStickyModel(f){if(f.isCancellationRequested||!this.isProviderValid())return{statusPromise:this._invalid(),modelPromise:null};const h=(0,E.createCancelablePromise)(v=>this.createModelFromProvider(v));return{statusPromise:h.then(v=>this.isModelValid(v)?f.isCancellationRequested?s.CANCELED:(this._stickyModel=this.createStickyModel(f,v),s.VALID):this._invalid()).then(void 0,v=>((0,p.onUnexpectedError)(v),s.CANCELED)),modelPromise:h}}isModelValid(f){return!0}isProviderValid(){return!0}}let l=class extends c{constructor(f,h){super(f),this._languageFeaturesService=h}createModelFromProvider(f){return I.OutlineModel.create(this._languageFeaturesService.documentSymbolProvider,this._editor.getModel(),f)}createStickyModel(f,h){const{stickyOutlineElement:v,providerID:w}=this._stickyModelFromOutlineModel(h,this._stickyModel?.outlineProviderId),S=this._editor.getModel();return new n.StickyModel(S.uri,S.getVersionId(),v,w)}isModelValid(f){return f&&f.children.size>0}_stickyModelFromOutlineModel(f,h){let v;if(o.Iterable.first(f.children.values())instanceof I.OutlineGroup){const D=o.Iterable.find(f.children.values(),T=>T.id===h);if(D)v=D.children;else{let T="",M=-1,A;for(const[P,N]of f.children.entries()){const O=this._findSumOfRangesOfGroup(N);O>M&&(A=N,M=O,T=N.id)}h=T,v=A.children}}else v=f.children;const w=[],S=Array.from(v.values()).sort((D,T)=>{const M=new n.StickyRange(D.symbol.range.startLineNumber,D.symbol.range.endLineNumber),A=new n.StickyRange(T.symbol.range.startLineNumber,T.symbol.range.endLineNumber);return this._comparator(M,A)});for(const D of S)w.push(this._stickyModelFromOutlineElement(D,D.symbol.selectionRange.startLineNumber));return{stickyOutlineElement:new n.StickyElement(void 0,w,void 0),providerID:h}}_stickyModelFromOutlineElement(f,h){const v=[];for(const S of f.children.values())if(S.symbol.selectionRange.startLineNumber!==S.symbol.range.endLineNumber)if(S.symbol.selectionRange.startLineNumber!==h)v.push(this._stickyModelFromOutlineElement(S,S.symbol.selectionRange.startLineNumber));else for(const L of S.children.values())v.push(this._stickyModelFromOutlineElement(L,S.symbol.selectionRange.startLineNumber));v.sort((S,L)=>this._comparator(S.range,L.range));const w=new n.StickyRange(f.symbol.selectionRange.startLineNumber,f.symbol.range.endLineNumber);return new n.StickyElement(w,v,void 0)}_comparator(f,h){return f.startLineNumber!==h.startLineNumber?f.startLineNumber-h.startLineNumber:h.endLineNumber-f.endLineNumber}_findSumOfRangesOfGroup(f){let h=0;for(const v of f.children.values())h+=this._findSumOfRangesOfGroup(v);return f instanceof I.OutlineElement?h+f.symbol.range.endLineNumber-f.symbol.selectionRange.startLineNumber:h}};l=ke([ce(1,k.ILanguageFeaturesService)],l);class a extends c{constructor(f){super(f),this._foldingLimitReporter=new y.RangesLimitReporter(f)}createStickyModel(f,h){const v=this._fromFoldingRegions(h),w=this._editor.getModel();return new n.StickyModel(w.uri,w.getVersionId(),v,void 0)}isModelValid(f){return f!==null}_fromFoldingRegions(f){const h=f.length,v=[],w=new n.StickyElement(void 0,[],void 0);for(let S=0;S0&&(this.provider=this._register(new m.SyntaxRangeProvider(f.getModel(),w,h,this._foldingLimitReporter,void 0)))}isProviderValid(){return this.provider!==void 0}async createModelFromProvider(f){return this.provider?.compute(f)??null}};u=ke([ce(2,k.ILanguageFeaturesService)],u)}),define(ne[837],se([1,0,2,17,18,14,13,6,36,836]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StickyLineCandidateProvider=e.StickyLineCandidate=void 0;class p{constructor(t,i,s){this.startLineNumber=t,this.endLineNumber=i,this.nestingDepth=s}}e.StickyLineCandidate=p;let n=class extends d.Disposable{constructor(t,i,s){super(),this._languageFeaturesService=i,this._languageConfigurationService=s,this._onDidChangeStickyScroll=this._register(new m.Emitter),this.onDidChangeStickyScroll=this._onDidChangeStickyScroll.event,this._model=null,this._cts=null,this._stickyModelProvider=null,this._editor=t,this._sessionStore=this._register(new d.DisposableStore),this._updateSoon=this._register(new E.RunOnceScheduler(()=>this.update(),50)),this._register(this._editor.onDidChangeConfiguration(g=>{g.hasChanged(116)&&this.readConfiguration()})),this.readConfiguration()}readConfiguration(){this._sessionStore.clear(),this._editor.getOption(116).enabled&&(this._sessionStore.add(this._editor.onDidChangeModel(()=>{this._model=null,this.updateStickyModelProvider(),this._onDidChangeStickyScroll.fire(),this.update()})),this._sessionStore.add(this._editor.onDidChangeHiddenAreas(()=>this.update())),this._sessionStore.add(this._editor.onDidChangeModelContent(()=>this._updateSoon.schedule())),this._sessionStore.add(this._languageFeaturesService.documentSymbolProvider.onDidChange(()=>this.update())),this._sessionStore.add((0,d.toDisposable)(()=>{this._stickyModelProvider?.dispose(),this._stickyModelProvider=null})),this.updateStickyModelProvider(),this.update())}getVersionId(){return this._model?.version}updateStickyModelProvider(){this._stickyModelProvider?.dispose(),this._stickyModelProvider=null;const t=this._editor;t.hasModel()&&(this._stickyModelProvider=new b.StickyModelProvider(t,()=>this._updateSoon.schedule(),this._languageConfigurationService,this._languageFeaturesService))}async update(){this._cts?.dispose(!0),this._cts=new I.CancellationTokenSource,await this.updateStickyModel(this._cts.token),this._onDidChangeStickyScroll.fire()}async updateStickyModel(t){if(!this._editor.hasModel()||!this._stickyModelProvider||this._editor.getModel().isTooLargeForTokenization()){this._model=null;return}const i=await this._stickyModelProvider.update(t);t.isCancellationRequested||(this._model=i)}updateIndex(t){return t===-1?t=0:t<0&&(t=-t-2),t}getCandidateStickyLinesIntersectingFromStickyModel(t,i,s,g,c){if(i.children.length===0)return;let l=c;const a=[];for(let C=0;CC-f)),u=this.updateIndex((0,y.binarySearch)(a,t.startLineNumber+g,(C,f)=>C-f));for(let C=r;C<=u;C++){const f=i.children[C];if(!f)return;if(f.range){const h=f.range.startLineNumber,v=f.range.endLineNumber;t.startLineNumber<=v+1&&h-1<=t.endLineNumber&&h!==l&&(l=h,s.push(new p(h,v-1,g+1)),this.getCandidateStickyLinesIntersectingFromStickyModel(t,f,s,g+1,h))}else this.getCandidateStickyLinesIntersectingFromStickyModel(t,f,s,g,c)}}getCandidateStickyLinesIntersecting(t){if(!this._model?.element)return[];let i=[];this.getCandidateStickyLinesIntersectingFromStickyModel(t,this._model.element,i,0,-1);const s=this._editor._getViewModel()?.getHiddenAreas();if(s)for(const g of s)i=i.filter(c=>!(c.startLineNumber>=g.startLineNumber&&c.endLineNumber<=g.endLineNumber+1));return i}};e.StickyLineCandidateProvider=n,e.StickyLineCandidateProvider=n=ke([ce(1,k.ILanguageFeaturesService),ce(2,_.ILanguageConfigurationService)],n)}),define(ne[838],se([1,0,5,103,13,2,30,281,125,9,116,150,136,424,531]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StickyScrollWidget=e.StickyScrollWidgetState=void 0;class i{constructor(h,v,w,S=null){this.startLineNumbers=h,this.endLineNumbers=v,this.lastLineRelativePosition=w,this.showEndForLine=S}equals(h){return!!h&&this.lastLineRelativePosition===h.lastLineRelativePosition&&this.showEndForLine===h.showEndForLine&&(0,I.equals)(this.startLineNumbers,h.startLineNumbers)&&(0,I.equals)(this.endLineNumbers,h.endLineNumbers)}static get Empty(){return new i([],[],0)}}e.StickyScrollWidgetState=i;const s=(0,k.createTrustedTypesPolicy)("stickyScrollViewLayer",{createHTML:f=>f}),g="data-sticky-line-index",c="data-sticky-is-line",l="data-sticky-is-line-number",a="data-sticky-is-folding-icon";class r extends E.Disposable{constructor(h){super(),this._editor=h,this._foldingIconStore=new E.DisposableStore,this._rootDomNode=document.createElement("div"),this._lineNumbersDomNode=document.createElement("div"),this._linesDomNodeScrollable=document.createElement("div"),this._linesDomNode=document.createElement("div"),this._lineHeight=this._editor.getOption(67),this._renderedStickyLines=[],this._lineNumbers=[],this._lastLineRelativePosition=0,this._minContentWidthInPx=0,this._isOnGlyphMargin=!1,this._lineNumbersDomNode.className="sticky-widget-line-numbers",this._lineNumbersDomNode.setAttribute("role","none"),this._linesDomNode.className="sticky-widget-lines",this._linesDomNode.setAttribute("role","list"),this._linesDomNodeScrollable.className="sticky-widget-lines-scrollable",this._linesDomNodeScrollable.appendChild(this._linesDomNode),this._rootDomNode.className="sticky-widget",this._rootDomNode.classList.toggle("peek",h instanceof _.EmbeddedCodeEditorWidget),this._rootDomNode.appendChild(this._lineNumbersDomNode),this._rootDomNode.appendChild(this._linesDomNodeScrollable);const v=()=>{this._linesDomNode.style.left=this._editor.getOption(116).scrollWithEditor?`-${this._editor.getScrollLeft()}px`:"0px"};this._register(this._editor.onDidChangeConfiguration(w=>{w.hasChanged(116)&&v(),w.hasChanged(67)&&(this._lineHeight=this._editor.getOption(67))})),this._register(this._editor.onDidScrollChange(w=>{w.scrollLeftChanged&&v(),w.scrollWidthChanged&&this._updateWidgetWidth()})),this._register(this._editor.onDidChangeModel(()=>{v(),this._updateWidgetWidth()})),this._register(this._foldingIconStore),v(),this._register(this._editor.onDidLayoutChange(w=>{this._updateWidgetWidth()})),this._updateWidgetWidth()}get lineNumbers(){return this._lineNumbers}get lineNumberCount(){return this._lineNumbers.length}getRenderedStickyLine(h){return this._renderedStickyLines.find(v=>v.lineNumber===h)}getCurrentLines(){return this._lineNumbers}setState(h,v,w){if(w===void 0&&(!this._previousState&&!h||this._previousState&&this._previousState.equals(h)))return;const S=this._isWidgetHeightZero(h),L=S?void 0:h,D=S?0:this._findLineToRebuildWidgetFrom(h,w);this._renderRootNode(L,v,D),this._previousState=h}_isWidgetHeightZero(h){if(!h)return!0;const v=h.startLineNumbers.length*this._lineHeight+h.lastLineRelativePosition;if(v>0){this._lastLineRelativePosition=h.lastLineRelativePosition;const w=[...h.startLineNumbers];h.showEndForLine!==null&&(w[h.showEndForLine]=h.endLineNumbers[h.showEndForLine]),this._lineNumbers=w}else this._lastLineRelativePosition=0,this._lineNumbers=[];return v===0}_findLineToRebuildWidgetFrom(h,v){if(!h||!this._previousState)return 0;if(v!==void 0)return v;const w=this._previousState,S=h.startLineNumbers.findIndex(L=>!w.startLineNumbers.includes(L));return S===-1?0:S}_updateWidgetWidth(){const h=this._editor.getLayoutInfo(),v=h.contentLeft;this._lineNumbersDomNode.style.width=`${v}px`,this._linesDomNodeScrollable.style.setProperty("--vscode-editorStickyScroll-scrollableWidth",`${this._editor.getScrollWidth()-h.verticalScrollbarWidth}px`),this._rootDomNode.style.width=`${h.width-h.verticalScrollbarWidth}px`}_clearStickyLinesFromLine(h){this._foldingIconStore.clear();for(let v=h;vT.scrollWidth))+S.verticalScrollbarWidth,this._editor.layoutOverlayWidget(this)}_setFoldingHoverListeners(){this._editor.getOption(111)==="mouseover"&&(this._foldingIconStore.add(d.addDisposableListener(this._lineNumbersDomNode,d.EventType.MOUSE_ENTER,()=>{this._isOnGlyphMargin=!0,this._setFoldingIconsVisibility(!0)})),this._foldingIconStore.add(d.addDisposableListener(this._lineNumbersDomNode,d.EventType.MOUSE_LEAVE,()=>{this._isOnGlyphMargin=!1,this._useFoldingOpacityTransition(!0),this._setFoldingIconsVisibility(!1)})))}_renderChildNode(h,v,w,S){const L=this._editor._getViewModel();if(!L)return;const D=L.coordinatesConverter.convertModelPositionToViewPosition(new b.Position(v,1)).lineNumber,T=L.getViewLineRenderingData(D),M=this._editor.getOption(68);let A;try{A=n.LineDecoration.filter(T.inlineDecorations,D,T.minColumn,T.maxColumn)}catch{A=[]}const P=new o.RenderLineInput(!0,!0,T.content,T.continuesWithWrappedLine,T.isBasicASCII,T.containsRTL,0,T.tokens,A,T.tabSize,T.startVisibleColumn,1,1,1,500,"none",!0,!0,null),N=new p.StringBuilder(2e3),O=(0,o.renderViewLine)(P,N);let F;s?F=s.createHTML(N.build()):F=N.build();const x=document.createElement("span");x.setAttribute(g,String(h)),x.setAttribute(c,""),x.setAttribute("role","listitem"),x.tabIndex=0,x.className="sticky-line-content",x.classList.add(`stickyLine${v}`),x.style.lineHeight=`${this._lineHeight}px`,x.innerHTML=F;const W=document.createElement("span");W.setAttribute(g,String(h)),W.setAttribute(l,""),W.className="sticky-line-number",W.style.lineHeight=`${this._lineHeight}px`;const V=S.contentLeft;W.style.width=`${V}px`;const q=document.createElement("span");M.renderType===1||M.renderType===3&&v%10===0?q.innerText=v.toString():M.renderType===2&&(q.innerText=Math.abs(v-this._editor.getPosition().lineNumber).toString()),q.className="sticky-line-number-inner",q.style.lineHeight=`${this._lineHeight}px`,q.style.width=`${S.lineNumbersWidth}px`,q.style.paddingLeft=`${S.lineNumbersLeft}px`,W.appendChild(q);const H=this._renderFoldingIconForLine(w,v);H&&W.appendChild(H.domNode),this._editor.applyFontInfo(x),this._editor.applyFontInfo(q),W.style.lineHeight=`${this._lineHeight}px`,x.style.lineHeight=`${this._lineHeight}px`,W.style.height=`${this._lineHeight}px`,x.style.height=`${this._lineHeight}px`;const z=new u(h,v,x,W,H,O.characterMapping,x.scrollWidth);return this._updateTopAndZIndexOfStickyLine(z)}_updateTopAndZIndexOfStickyLine(h){const v=h.index,w=h.lineDomNode,S=h.lineNumberDomNode,L=v===this._lineNumbers.length-1,D="0",T="1";w.style.zIndex=L?D:T,S.style.zIndex=L?D:T;const M=`${v*this._lineHeight+this._lastLineRelativePosition+(h.foldingIcon?.isCollapsed?1:0)}px`,A=`${v*this._lineHeight}px`;return w.style.top=L?M:A,S.style.top=L?M:A,h}_renderFoldingIconForLine(h,v){const w=this._editor.getOption(111);if(!h||w==="never")return;const S=h.regions,L=S.findRange(v),D=S.getStartLineNumber(L);if(!(v===D))return;const M=S.isCollapsed(L),A=new C(M,D,S.getEndLineNumber(L),this._lineHeight);return A.setVisible(this._isOnGlyphMargin?!0:M||w==="always"),A.domNode.setAttribute(a,""),A}getId(){return"editor.contrib.stickyScrollWidget"}getDomNode(){return this._rootDomNode}getPosition(){return{preference:2,stackOridinal:10}}getMinContentWidthInPx(){return this._minContentWidthInPx}focusLineWithIndex(h){0<=h&&h0)return null;const v=this._getRenderedStickyLineFromChildDomNode(h);if(!v)return null;const w=(0,m.getColumnOfNodeOffset)(v.characterMapping,h,0);return new b.Position(v.lineNumber,w)}getLineNumberFromChildDomNode(h){return this._getRenderedStickyLineFromChildDomNode(h)?.lineNumber??null}_getRenderedStickyLineFromChildDomNode(h){const v=this.getLineIndexFromChildDomNode(h);return v===null||v<0||v>=this._renderedStickyLines.length?null:this._renderedStickyLines[v]}getLineIndexFromChildDomNode(h){const v=this._getAttributeValue(h,g);return v?parseInt(v,10):null}isInStickyLine(h){return this._getAttributeValue(h,c)!==void 0}isInFoldingIconDomNode(h){return this._getAttributeValue(h,a)!==void 0}_getAttributeValue(h,v){for(;h&&h!==this._rootDomNode;){const w=h.getAttribute(v);if(w!==null)return w;h=h.parentElement}}}e.StickyScrollWidget=r;class u{constructor(h,v,w,S,L,D,T){this.index=h,this.lineNumber=v,this.lineDomNode=w,this.lineNumberDomNode=S,this.foldingIcon=L,this.characterMapping=D,this.scrollWidth=T}}class C{constructor(h,v,w,S){this.isCollapsed=h,this.foldingStartLine=v,this.foldingEndLine=w,this.dimension=S,this.domNode=document.createElement("div"),this.domNode.style.width=`${S}px`,this.domNode.style.height=`${S}px`,this.domNode.className=y.ThemeIcon.asClassName(h?t.foldingCollapsedIcon:t.foldingExpandedIcon)}setVisible(h){this.domNode.style.cursor=h?"pointer":"default",this.domNode.style.opacity=h?"1":"0"}}}),define(ne[839],se([1,0,5,115,14,8,6,2,141,11,125,798,3,12,7,101,32,97,25,255,155,402,793,110,46,195,532,280]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h){"use strict";var v;Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestContentWidget=e.SuggestWidget=e.editorSuggestWidgetSelectedBackground=void 0,(0,g.registerColor)("editorSuggestWidget.background",g.editorWidgetBackground,o.localize(1328,"Background color of the suggest widget.")),(0,g.registerColor)("editorSuggestWidget.border",g.editorWidgetBorder,o.localize(1329,"Border color of the suggest widget."));const w=(0,g.registerColor)("editorSuggestWidget.foreground",g.editorForeground,o.localize(1330,"Foreground color of the suggest widget."));(0,g.registerColor)("editorSuggestWidget.selectedForeground",g.quickInputListFocusForeground,o.localize(1331,"Foreground color of the selected entry in the suggest widget.")),(0,g.registerColor)("editorSuggestWidget.selectedIconForeground",g.quickInputListFocusIconForeground,o.localize(1332,"Icon foreground color of the selected entry in the suggest widget.")),e.editorSuggestWidgetSelectedBackground=(0,g.registerColor)("editorSuggestWidget.selectedBackground",g.quickInputListFocusBackground,o.localize(1333,"Background color of the selected entry in the suggest widget.")),(0,g.registerColor)("editorSuggestWidget.highlightForeground",g.listHighlightForeground,o.localize(1334,"Color of the match highlights in the suggest widget.")),(0,g.registerColor)("editorSuggestWidget.focusHighlightForeground",g.listFocusHighlightForeground,o.localize(1335,"Color of the match highlights in the suggest widget when an item is focused.")),(0,g.registerColor)("editorSuggestWidgetStatus.foreground",(0,g.transparent)(w,.5),o.localize(1336,"Foreground color of the suggest widget status."));class S{constructor(M,A){this._service=M,this._key=`suggestWidget.size/${A.getEditorType()}/${A instanceof p.EmbeddedCodeEditorWidget}`}restore(){const M=this._service.get(this._key,0)??"";try{const A=JSON.parse(M);if(d.Dimension.is(A))return d.Dimension.lift(A)}catch{}}store(M){this._service.store(this._key,JSON.stringify(M),0,1)}reset(){this._service.remove(this._key,0)}}let L=class{static{v=this}static{this.LOADING_MESSAGE=o.localize(1337,"Loading...")}static{this.NO_SUGGESTIONS_MESSAGE=o.localize(1338,"No suggestions.")}constructor(M,A,P,N,O){this.editor=M,this._storageService=A,this._state=0,this._isAuto=!1,this._pendingLayout=new m.MutableDisposable,this._pendingShowDetails=new m.MutableDisposable,this._ignoreFocusEvents=!1,this._forceRenderingAbove=!1,this._explainMode=!1,this._showTimeout=new I.TimeoutTimer,this._disposables=new m.DisposableStore,this._onDidSelect=new y.PauseableEmitter,this._onDidFocus=new y.PauseableEmitter,this._onDidHide=new y.Emitter,this._onDidShow=new y.Emitter,this.onDidSelect=this._onDidSelect.event,this.onDidFocus=this._onDidFocus.event,this.onDidHide=this._onDidHide.event,this.onDidShow=this._onDidShow.event,this._onDetailsKeydown=new y.Emitter,this.onDetailsKeyDown=this._onDetailsKeydown.event,this.element=new a.ResizableHTMLElement,this.element.domNode.classList.add("editor-widget","suggest-widget"),this._contentWidget=new D(this,M),this._persistedSize=new S(A,M);class F{constructor(U,j,Y=!1,G=!1){this.persistedSize=U,this.currentSize=j,this.persistHeight=Y,this.persistWidth=G}}let x;this._disposables.add(this.element.onDidWillResize(()=>{this._contentWidget.lockPreference(),x=new F(this._persistedSize.restore(),this.element.size)})),this._disposables.add(this.element.onDidResize(z=>{if(this._resize(z.dimension.width,z.dimension.height),x&&(x.persistHeight=x.persistHeight||!!z.north||!!z.south,x.persistWidth=x.persistWidth||!!z.east||!!z.west),!!z.done){if(x){const{itemHeight:U,defaultSize:j}=this.getLayoutInfo(),Y=Math.round(U/2);let{width:G,height:K}=this.element.size;(!x.persistHeight||Math.abs(x.currentSize.height-K)<=Y)&&(K=x.persistedSize?.height??j.height),(!x.persistWidth||Math.abs(x.currentSize.width-G)<=Y)&&(G=x.persistedSize?.width??j.width),this._persistedSize.store(new d.Dimension(G,K))}this._contentWidget.unlockPreference(),x=void 0}})),this._messageElement=d.append(this.element.domNode,d.$(".message")),this._listElement=d.append(this.element.domNode,d.$(".tree"));const W=this._disposables.add(O.createInstance(u.SuggestDetailsWidget,this.editor));W.onDidClose(this.toggleDetails,this,this._disposables),this._details=new u.SuggestDetailsOverlay(W,this.editor);const V=()=>this.element.domNode.classList.toggle("no-icons",!this.editor.getOption(119).showIcons);V();const q=O.createInstance(C.ItemRenderer,this.editor);this._disposables.add(q),this._disposables.add(q.onDidToggleDetails(()=>this.toggleDetails())),this._list=new k.List("SuggestWidget",this._listElement,{getHeight:z=>this.getLayoutInfo().itemHeight,getTemplateId:z=>"suggestion"},[q],{alwaysConsumeMouseWheel:!0,useShadows:!1,mouseSupport:!1,multipleSelectionSupport:!1,accessibilityProvider:{getRole:()=>"option",getWidgetAriaLabel:()=>o.localize(1339,"Suggest"),getWidgetRole:()=>"listbox",getAriaLabel:z=>{let U=z.textLabel;if(typeof z.completion.label!="string"){const{detail:K,description:R}=z.completion.label;K&&R?U=o.localize(1340,"{0} {1}, {2}",U,K,R):K?U=o.localize(1341,"{0} {1}",U,K):R&&(U=o.localize(1342,"{0}, {1}",U,R))}if(!z.isResolved||!this._isDetailsVisible())return U;const{documentation:j,detail:Y}=z.completion,G=b.format("{0}{1}",Y||"",j?typeof j=="string"?j:j.value:"");return o.localize(1343,"{0}, docs: {1}",U,G)}}}),this._list.style((0,f.getListStyles)({listInactiveFocusBackground:e.editorSuggestWidgetSelectedBackground,listInactiveFocusOutline:g.activeContrastBorder})),this._status=O.createInstance(n.SuggestWidgetStatus,this.element.domNode,r.suggestWidgetStatusbarMenu);const H=()=>this.element.domNode.classList.toggle("with-status-bar",this.editor.getOption(119).showStatusBar);H(),this._disposables.add(N.onDidColorThemeChange(z=>this._onThemeChange(z))),this._onThemeChange(N.getColorTheme()),this._disposables.add(this._list.onMouseDown(z=>this._onListMouseDownOrTap(z))),this._disposables.add(this._list.onTap(z=>this._onListMouseDownOrTap(z))),this._disposables.add(this._list.onDidChangeSelection(z=>this._onListSelection(z))),this._disposables.add(this._list.onDidChangeFocus(z=>this._onListFocus(z))),this._disposables.add(this.editor.onDidChangeCursorSelection(()=>this._onCursorSelectionChanged())),this._disposables.add(this.editor.onDidChangeConfiguration(z=>{z.hasChanged(119)&&(H(),V()),this._completionModel&&(z.hasChanged(50)||z.hasChanged(120)||z.hasChanged(121))&&this._list.splice(0,this._list.length,this._completionModel.items)})),this._ctxSuggestWidgetVisible=r.Context.Visible.bindTo(P),this._ctxSuggestWidgetDetailsVisible=r.Context.DetailsVisible.bindTo(P),this._ctxSuggestWidgetMultipleSuggestions=r.Context.MultipleSuggestions.bindTo(P),this._ctxSuggestWidgetHasFocusedSuggestion=r.Context.HasFocusedSuggestion.bindTo(P),this._disposables.add(d.addStandardDisposableListener(this._details.widget.domNode,"keydown",z=>{this._onDetailsKeydown.fire(z)})),this._disposables.add(this.editor.onMouseDown(z=>this._onEditorMouseDown(z)))}dispose(){this._details.widget.dispose(),this._details.dispose(),this._list.dispose(),this._status.dispose(),this._disposables.dispose(),this._loadingTimeout?.dispose(),this._pendingLayout.dispose(),this._pendingShowDetails.dispose(),this._showTimeout.dispose(),this._contentWidget.dispose(),this.element.dispose()}_onEditorMouseDown(M){this._details.widget.domNode.contains(M.target.element)?this._details.widget.domNode.focus():this.element.domNode.contains(M.target.element)&&this.editor.focus()}_onCursorSelectionChanged(){this._state!==0&&this._contentWidget.layout()}_onListMouseDownOrTap(M){typeof M.element>"u"||typeof M.index>"u"||(M.browserEvent.preventDefault(),M.browserEvent.stopPropagation(),this._select(M.element,M.index))}_onListSelection(M){M.elements.length&&this._select(M.elements[0],M.indexes[0])}_select(M,A){const P=this._completionModel;P&&(this._onDidSelect.fire({item:M,index:A,model:P}),this.editor.focus())}_onThemeChange(M){this._details.widget.borderWidth=(0,c.isHighContrast)(M.type)?2:1}_onListFocus(M){if(this._ignoreFocusEvents)return;if(!M.elements.length){this._currentSuggestionDetails&&(this._currentSuggestionDetails.cancel(),this._currentSuggestionDetails=void 0,this._focusedItem=void 0),this.editor.setAriaOptions({activeDescendant:void 0}),this._ctxSuggestWidgetHasFocusedSuggestion.set(!1);return}if(!this._completionModel)return;this._ctxSuggestWidgetHasFocusedSuggestion.set(!0);const A=M.elements[0],P=M.indexes[0];A!==this._focusedItem&&(this._currentSuggestionDetails?.cancel(),this._currentSuggestionDetails=void 0,this._focusedItem=A,this._list.reveal(P),this._currentSuggestionDetails=(0,I.createCancelablePromise)(async N=>{const O=(0,I.disposableTimeout)(()=>{this._isDetailsVisible()&&this.showDetails(!0)},250),F=N.onCancellationRequested(()=>O.dispose());try{return await A.resolve(N)}finally{O.dispose(),F.dispose()}}),this._currentSuggestionDetails.then(()=>{P>=this._list.length||A!==this._list.element(P)||(this._ignoreFocusEvents=!0,this._list.splice(P,1,[A]),this._list.setFocus([P]),this._ignoreFocusEvents=!1,this._isDetailsVisible()?this.showDetails(!1):this.element.domNode.classList.remove("docs-side"),this.editor.setAriaOptions({activeDescendant:(0,C.getAriaId)(P)}))}).catch(E.onUnexpectedError)),this._onDidFocus.fire({item:A,index:P,model:this._completionModel})}_setState(M){if(this._state!==M)switch(this._state=M,this.element.domNode.classList.toggle("frozen",M===4),this.element.domNode.classList.remove("message"),M){case 0:d.hide(this._messageElement,this._listElement,this._status.element),this._details.hide(!0),this._status.hide(),this._contentWidget.hide(),this._ctxSuggestWidgetVisible.reset(),this._ctxSuggestWidgetMultipleSuggestions.reset(),this._ctxSuggestWidgetHasFocusedSuggestion.reset(),this._showTimeout.cancel(),this.element.domNode.classList.remove("visible"),this._list.splice(0,this._list.length),this._focusedItem=void 0,this._cappedHeight=void 0,this._explainMode=!1;break;case 1:this.element.domNode.classList.add("message"),this._messageElement.textContent=v.LOADING_MESSAGE,d.hide(this._listElement,this._status.element),d.show(this._messageElement),this._details.hide(),this._show(),this._focusedItem=void 0,(0,h.status)(v.LOADING_MESSAGE);break;case 2:this.element.domNode.classList.add("message"),this._messageElement.textContent=v.NO_SUGGESTIONS_MESSAGE,d.hide(this._listElement,this._status.element),d.show(this._messageElement),this._details.hide(),this._show(),this._focusedItem=void 0,(0,h.status)(v.NO_SUGGESTIONS_MESSAGE);break;case 3:d.hide(this._messageElement),d.show(this._listElement,this._status.element),this._show();break;case 4:d.hide(this._messageElement),d.show(this._listElement,this._status.element),this._show();break;case 5:d.hide(this._messageElement),d.show(this._listElement,this._status.element),this._details.show(),this._show();break}}_show(){this._status.show(),this._contentWidget.show(),this._layout(this._persistedSize.restore()),this._ctxSuggestWidgetVisible.set(!0),this._showTimeout.cancelAndSet(()=>{this.element.domNode.classList.add("visible"),this._onDidShow.fire(this)},100)}showTriggered(M,A){this._state===0&&(this._contentWidget.setPosition(this.editor.getPosition()),this._isAuto=!!M,this._isAuto||(this._loadingTimeout=(0,I.disposableTimeout)(()=>this._setState(1),A)))}showSuggestions(M,A,P,N,O){if(this._contentWidget.setPosition(this.editor.getPosition()),this._loadingTimeout?.dispose(),this._currentSuggestionDetails?.cancel(),this._currentSuggestionDetails=void 0,this._completionModel!==M&&(this._completionModel=M),P&&this._state!==2&&this._state!==0){this._setState(4);return}const F=this._completionModel.items.length,x=F===0;if(this._ctxSuggestWidgetMultipleSuggestions.set(F>1),x){this._setState(N?0:2),this._completionModel=void 0;return}this._focusedItem=void 0,this._onDidFocus.pause(),this._onDidSelect.pause();try{this._list.splice(0,this._list.length,this._completionModel.items),this._setState(P?4:3),this._list.reveal(A,0),this._list.setFocus(O?[]:[A])}finally{this._onDidFocus.resume(),this._onDidSelect.resume()}this._pendingLayout.value=d.runAtThisOrScheduleAtNextAnimationFrame(d.getWindow(this.element.domNode),()=>{this._pendingLayout.clear(),this._layout(this.element.size),this._details.widget.domNode.classList.remove("focused")})}focusSelected(){this._list.length>0&&this._list.setFocus([0])}selectNextPage(){switch(this._state){case 0:return!1;case 5:return this._details.widget.pageDown(),!0;case 1:return!this._isAuto;default:return this._list.focusNextPage(),!0}}selectNext(){switch(this._state){case 0:return!1;case 1:return!this._isAuto;default:return this._list.focusNext(1,!0),!0}}selectLast(){switch(this._state){case 0:return!1;case 5:return this._details.widget.scrollBottom(),!0;case 1:return!this._isAuto;default:return this._list.focusLast(),!0}}selectPreviousPage(){switch(this._state){case 0:return!1;case 5:return this._details.widget.pageUp(),!0;case 1:return!this._isAuto;default:return this._list.focusPreviousPage(),!0}}selectPrevious(){switch(this._state){case 0:return!1;case 1:return!this._isAuto;default:return this._list.focusPrevious(1,!0),!1}}selectFirst(){switch(this._state){case 0:return!1;case 5:return this._details.widget.scrollTop(),!0;case 1:return!this._isAuto;default:return this._list.focusFirst(),!0}}getFocusedItem(){if(this._state!==0&&this._state!==2&&this._state!==1&&this._completionModel&&this._list.getFocus().length>0)return{item:this._list.getFocusedElements()[0],index:this._list.getFocus()[0],model:this._completionModel}}toggleDetailsFocus(){this._state===5?(this._setState(3),this._details.widget.domNode.classList.remove("focused")):this._state===3&&this._isDetailsVisible()&&(this._setState(5),this._details.widget.domNode.classList.add("focused"))}toggleDetails(){this._isDetailsVisible()?(this._pendingShowDetails.clear(),this._ctxSuggestWidgetDetailsVisible.set(!1),this._setDetailsVisible(!1),this._details.hide(),this.element.domNode.classList.remove("shows-details")):((0,u.canExpandCompletionItem)(this._list.getFocusedElements()[0])||this._explainMode)&&(this._state===3||this._state===5||this._state===4)&&(this._ctxSuggestWidgetDetailsVisible.set(!0),this._setDetailsVisible(!0),this.showDetails(!1))}showDetails(M){this._pendingShowDetails.value=d.runAtThisOrScheduleAtNextAnimationFrame(d.getWindow(this.element.domNode),()=>{this._pendingShowDetails.clear(),this._details.show(),M?this._details.widget.renderLoading():this._details.widget.renderItem(this._list.getFocusedElements()[0],this._explainMode),this._details.widget.isEmpty?this._details.hide():(this._positionDetails(),this.element.domNode.classList.add("shows-details")),this.editor.focus()})}toggleExplainMode(){this._list.getFocusedElements()[0]&&(this._explainMode=!this._explainMode,this._isDetailsVisible()?this.showDetails(!1):this.toggleDetails())}resetPersistedSize(){this._persistedSize.reset()}hideWidget(){this._pendingLayout.clear(),this._pendingShowDetails.clear(),this._loadingTimeout?.dispose(),this._setState(0),this._onDidHide.fire(this),this.element.clearSashHoverState();const M=this._persistedSize.restore(),A=Math.ceil(this.getLayoutInfo().itemHeight*4.3);M&&M.heightF&&(O=F);const x=this._completionModel?this._completionModel.stats.pLabelLen*P.typicalHalfwidthCharacterWidth:O,W=P.statusBarHeight+this._list.contentHeight+P.borderHeight,V=P.itemHeight+P.statusBarHeight,q=d.getDomNodePagePosition(this.editor.getDomNode()),H=this.editor.getScrolledVisiblePosition(this.editor.getPosition()),z=q.top+H.top+H.height,U=Math.min(A.height-z-P.verticalPadding,W),j=q.top+H.top-P.verticalPadding,Y=Math.min(j,W);let G=Math.min(Math.max(Y,U)+P.borderHeight,W);N===this._cappedHeight?.capped&&(N=this._cappedHeight.wanted),NG&&(N=G),N>U||this._forceRenderingAbove&&j>150?(this._contentWidget.setPreference(1),this.element.enableSashes(!0,!0,!1,!1),G=Y):(this._contentWidget.setPreference(2),this.element.enableSashes(!1,!0,!0,!1),G=U),this.element.preferredSize=new d.Dimension(x,P.defaultSize.height),this.element.maxSize=new d.Dimension(F,G),this.element.minSize=new d.Dimension(220,V),this._cappedHeight=N===W?{wanted:this._cappedHeight?.wanted??M.height,capped:N}:void 0}this._resize(O,N)}_resize(M,A){const{width:P,height:N}=this.element.maxSize;M=Math.min(P,M),A=Math.min(N,A);const{statusBarHeight:O}=this.getLayoutInfo();this._list.layout(A-O,M),this._listElement.style.height=`${A-O}px`,this.element.layout(A,M),this._contentWidget.layout(),this._positionDetails()}_positionDetails(){this._isDetailsVisible()&&this._details.placeAtAnchor(this.element.domNode,this._contentWidget.getPosition()?.preference[0]===2)}getLayoutInfo(){const M=this.editor.getOption(50),A=(0,_.clamp)(this.editor.getOption(121)||M.lineHeight,8,1e3),P=!this.editor.getOption(119).showStatusBar||this._state===2||this._state===1?0:A,N=this._details.widget.borderWidth,O=2*N;return{itemHeight:A,statusBarHeight:P,borderWidth:N,borderHeight:O,typicalHalfwidthCharacterWidth:M.typicalHalfwidthCharacterWidth,verticalPadding:22,horizontalPadding:14,defaultSize:new d.Dimension(430,P+12*A+O)}}_isDetailsVisible(){return this._storageService.getBoolean("expandSuggestionDocs",0,!1)}_setDetailsVisible(M){this._storageService.store("expandSuggestionDocs",M,0,0)}forceRenderingAbove(){this._forceRenderingAbove||(this._forceRenderingAbove=!0,this._layout(this._persistedSize.restore()))}stopForceRenderingAbove(){this._forceRenderingAbove=!1}};e.SuggestWidget=L,e.SuggestWidget=L=v=ke([ce(1,s.IStorageService),ce(2,t.IContextKeyService),ce(3,l.IThemeService),ce(4,i.IInstantiationService)],L);class D{constructor(M,A){this._widget=M,this._editor=A,this.allowEditorOverflow=!0,this.suppressMouseDown=!1,this._preferenceLocked=!1,this._added=!1,this._hidden=!1}dispose(){this._added&&(this._added=!1,this._editor.removeContentWidget(this))}getId(){return"editor.widget.suggestWidget"}getDomNode(){return this._widget.element.domNode}show(){this._hidden=!1,this._added||(this._added=!0,this._editor.addContentWidget(this))}hide(){this._hidden||(this._hidden=!0,this.layout())}layout(){this._editor.layoutContentWidget(this)}getPosition(){return this._hidden||!this._position||!this._preference?null:{position:this._position,preference:[this._preference]}}beforeRender(){const{height:M,width:A}=this._widget.element.size,{borderWidth:P,horizontalPadding:N}=this._widget.getLayoutInfo();return new d.Dimension(A+2*P+N,M+2*P)}afterRender(M){this._widget._afterRender(M)}setPreference(M){this._preferenceLocked||(this._preference=M)}lockPreference(){this._preferenceLocked=!0}unlockPreference(){this._preferenceLocked=!1}setPosition(M){this._position=M}}e.SuggestContentWidget=D}),define(ne[426],se([1,0,40,35,27,3,32,25,536]),function(oe,e,d,k,I,E,y,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getHighlightDecorationOptions=l,e.getSelectionHighlightDecorationOptions=a;const _=(0,y.registerColor)("editor.wordHighlightBackground",{dark:"#575757B8",light:"#57575740",hcDark:null,hcLight:null},E.localize(1415,"Background color of a symbol during read-access, like reading a variable. The color must not be opaque so as not to hide underlying decorations."),!0);(0,y.registerColor)("editor.wordHighlightStrongBackground",{dark:"#004972B8",light:"#0e639c40",hcDark:null,hcLight:null},E.localize(1416,"Background color of a symbol during write-access, like writing to a variable. The color must not be opaque so as not to hide underlying decorations."),!0),(0,y.registerColor)("editor.wordHighlightTextBackground",_,E.localize(1417,"Background color of a textual occurrence for a symbol. The color must not be opaque so as not to hide underlying decorations."),!0);const b=(0,y.registerColor)("editor.wordHighlightBorder",{light:null,dark:null,hcDark:y.activeContrastBorder,hcLight:y.activeContrastBorder},E.localize(1418,"Border color of a symbol during read-access, like reading a variable."));(0,y.registerColor)("editor.wordHighlightStrongBorder",{light:null,dark:null,hcDark:y.activeContrastBorder,hcLight:y.activeContrastBorder},E.localize(1419,"Border color of a symbol during write-access, like writing to a variable.")),(0,y.registerColor)("editor.wordHighlightTextBorder",b,E.localize(1420,"Border color of a textual occurrence for a symbol."));const p=(0,y.registerColor)("editorOverviewRuler.wordHighlightForeground","#A0A0A0CC",E.localize(1421,"Overview ruler marker color for symbol highlights. The color must not be opaque so as not to hide underlying decorations."),!0),n=(0,y.registerColor)("editorOverviewRuler.wordHighlightStrongForeground","#C0A0C0CC",E.localize(1422,"Overview ruler marker color for write-access symbol highlights. The color must not be opaque so as not to hide underlying decorations."),!0),o=(0,y.registerColor)("editorOverviewRuler.wordHighlightTextForeground",y.overviewRulerSelectionHighlightForeground,E.localize(1423,"Overview ruler marker color of a textual occurrence for a symbol. The color must not be opaque so as not to hide underlying decorations."),!0),t=k.ModelDecorationOptions.register({description:"word-highlight-strong",stickiness:1,className:"wordHighlightStrong",overviewRuler:{color:(0,m.themeColorFromId)(n),position:d.OverviewRulerLane.Center},minimap:{color:(0,m.themeColorFromId)(y.minimapSelectionOccurrenceHighlight),position:1}}),i=k.ModelDecorationOptions.register({description:"word-highlight-text",stickiness:1,className:"wordHighlightText",overviewRuler:{color:(0,m.themeColorFromId)(o),position:d.OverviewRulerLane.Center},minimap:{color:(0,m.themeColorFromId)(y.minimapSelectionOccurrenceHighlight),position:1}}),s=k.ModelDecorationOptions.register({description:"selection-highlight-overview",stickiness:1,className:"selectionHighlight",overviewRuler:{color:(0,m.themeColorFromId)(y.overviewRulerSelectionHighlightForeground),position:d.OverviewRulerLane.Center},minimap:{color:(0,m.themeColorFromId)(y.minimapSelectionOccurrenceHighlight),position:1}}),g=k.ModelDecorationOptions.register({description:"selection-highlight",stickiness:1,className:"selectionHighlight"}),c=k.ModelDecorationOptions.register({description:"word-highlight",stickiness:1,className:"wordHighlight",overviewRuler:{color:(0,m.themeColorFromId)(p),position:d.OverviewRulerLane.Center},minimap:{color:(0,m.themeColorFromId)(y.minimapSelectionOccurrenceHighlight),position:1}});function l(r){return r===I.DocumentHighlightKind.Write?t:r===I.DocumentHighlightKind.Text?i:c}function a(r){return r?g:s}(0,m.registerThemingParticipant)((r,u)=>{const C=r.getColor(y.editorSelectionHighlight);C&&u.addRule(`.monaco-editor .selectionHighlight { background-color: ${C.transparent(.5)}; }`)})}),define(ne[840],se([1,0,46,14,72,2,15,235,4,23,20,423,3,29,12,17,426,7]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c){"use strict";var l;Object.defineProperty(e,"__esModule",{value:!0}),e.FocusPreviousCursor=e.FocusNextCursor=e.SelectionHighlighter=e.CompatChangeAll=e.SelectHighlightsAction=e.MoveSelectionToPreviousFindMatchAction=e.MoveSelectionToNextFindMatchAction=e.AddSelectionToPreviousFindMatchAction=e.AddSelectionToNextFindMatchAction=e.MultiCursorSelectionControllerAction=e.MultiCursorSelectionController=e.MultiCursorSession=e.MultiCursorSessionResult=e.InsertCursorBelow=e.InsertCursorAbove=void 0;function a(H,z){const U=z.filter(j=>!H.find(Y=>Y.equals(j)));if(U.length>=1){const j=U.map(G=>`line ${G.viewState.position.lineNumber} column ${G.viewState.position.column}`).join(", "),Y=U.length===1?o.localize(1149,"Cursor added: {0}",j):o.localize(1150,"Cursors added: {0}",j);(0,d.status)(Y)}}class r extends y.EditorAction{constructor(){super({id:"editor.action.insertCursorAbove",label:o.localize(1151,"Add Cursor Above"),alias:"Add Cursor Above",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:2576,linux:{primary:1552,secondary:[3088]},weight:100},menuOpts:{menuId:t.MenuId.MenubarSelectionMenu,group:"3_multi",title:o.localize(1152,"&&Add Cursor Above"),order:2}})}run(z,U,j){if(!U.hasModel())return;let Y=!0;j&&j.logicalLine===!1&&(Y=!1);const G=U._getViewModel();if(G.cursorConfig.readOnly)return;G.model.pushStackElement();const K=G.getCursorStates();G.setCursorStates(j.source,3,m.CursorMoveCommands.addCursorUp(G,K,Y)),G.revealTopMostCursor(j.source),a(K,G.getCursorStates())}}e.InsertCursorAbove=r;class u extends y.EditorAction{constructor(){super({id:"editor.action.insertCursorBelow",label:o.localize(1153,"Add Cursor Below"),alias:"Add Cursor Below",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:2578,linux:{primary:1554,secondary:[3090]},weight:100},menuOpts:{menuId:t.MenuId.MenubarSelectionMenu,group:"3_multi",title:o.localize(1154,"A&&dd Cursor Below"),order:3}})}run(z,U,j){if(!U.hasModel())return;let Y=!0;j&&j.logicalLine===!1&&(Y=!1);const G=U._getViewModel();if(G.cursorConfig.readOnly)return;G.model.pushStackElement();const K=G.getCursorStates();G.setCursorStates(j.source,3,m.CursorMoveCommands.addCursorDown(G,K,Y)),G.revealBottomMostCursor(j.source),a(K,G.getCursorStates())}}e.InsertCursorBelow=u;class C extends y.EditorAction{constructor(){super({id:"editor.action.insertCursorAtEndOfEachLineSelected",label:o.localize(1155,"Add Cursors to Line Ends"),alias:"Add Cursors to Line Ends",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:1575,weight:100},menuOpts:{menuId:t.MenuId.MenubarSelectionMenu,group:"3_multi",title:o.localize(1156,"Add C&&ursors to Line Ends"),order:4}})}getCursorsForSelection(z,U,j){if(!z.isEmpty()){for(let Y=z.startLineNumber;Y1&&j.push(new b.Selection(z.endLineNumber,z.endColumn,z.endLineNumber,z.endColumn))}}run(z,U){if(!U.hasModel())return;const j=U.getModel(),Y=U.getSelections(),G=U._getViewModel(),K=G.getCursorStates(),R=[];Y.forEach(J=>this.getCursorsForSelection(J,j,R)),R.length>0&&U.setSelections(R),a(K,G.getCursorStates())}}class f extends y.EditorAction{constructor(){super({id:"editor.action.addCursorsToBottom",label:o.localize(1157,"Add Cursors To Bottom"),alias:"Add Cursors To Bottom",precondition:void 0})}run(z,U){if(!U.hasModel())return;const j=U.getSelections(),Y=U.getModel().getLineCount(),G=[];for(let J=j[0].startLineNumber;J<=Y;J++)G.push(new b.Selection(J,j[0].startColumn,J,j[0].endColumn));const K=U._getViewModel(),R=K.getCursorStates();G.length>0&&U.setSelections(G),a(R,K.getCursorStates())}}class h extends y.EditorAction{constructor(){super({id:"editor.action.addCursorsToTop",label:o.localize(1158,"Add Cursors To Top"),alias:"Add Cursors To Top",precondition:void 0})}run(z,U){if(!U.hasModel())return;const j=U.getSelections(),Y=[];for(let R=j[0].startLineNumber;R>=1;R--)Y.push(new b.Selection(R,j[0].startColumn,R,j[0].endColumn));const G=U._getViewModel(),K=G.getCursorStates();Y.length>0&&U.setSelections(Y),a(K,G.getCursorStates())}}class v{constructor(z,U,j){this.selections=z,this.revealRange=U,this.revealScrollType=j}}e.MultiCursorSessionResult=v;class w{static create(z,U){if(!z.hasModel())return null;const j=U.getState();if(!z.hasTextFocus()&&j.isRevealed&&j.searchString.length>0)return new w(z,U,!1,j.searchString,j.wholeWord,j.matchCase,null);let Y=!1,G,K;const R=z.getSelections();R.length===1&&R[0].isEmpty()?(Y=!0,G=!0,K=!0):(G=j.wholeWord,K=j.matchCase);const J=z.getSelection();let ie,ue=null;if(J.isEmpty()){const he=z.getConfiguredWordAtPosition(J.getStartPosition());if(!he)return null;ie=he.word,ue=new b.Selection(J.startLineNumber,he.startColumn,J.startLineNumber,he.endColumn)}else ie=z.getModel().getValueInRange(J).replace(/\r\n/g,` -`);return new w(z,U,Y,ie,G,K,ue)}constructor(z,U,j,Y,G,K,R){this._editor=z,this.findController=U,this.isDisconnectedFromFindController=j,this.searchText=Y,this.wholeWord=G,this.matchCase=K,this.currentMatch=R}addSelectionToNextFindMatch(){if(!this._editor.hasModel())return null;const z=this._getNextMatch();if(!z)return null;const U=this._editor.getSelections();return new v(U.concat(z),z,0)}moveSelectionToNextFindMatch(){if(!this._editor.hasModel())return null;const z=this._getNextMatch();if(!z)return null;const U=this._editor.getSelections();return new v(U.slice(0,U.length-1).concat(z),z,0)}_getNextMatch(){if(!this._editor.hasModel())return null;if(this.currentMatch){const Y=this.currentMatch;return this.currentMatch=null,Y}this.findController.highlightFindOptions();const z=this._editor.getSelections(),U=z[z.length-1],j=this._editor.getModel().findNextMatch(this.searchText,U.getEndPosition(),!1,this.matchCase,this.wholeWord?this._editor.getOption(132):null,!1);return j?new b.Selection(j.range.startLineNumber,j.range.startColumn,j.range.endLineNumber,j.range.endColumn):null}addSelectionToPreviousFindMatch(){if(!this._editor.hasModel())return null;const z=this._getPreviousMatch();if(!z)return null;const U=this._editor.getSelections();return new v(U.concat(z),z,0)}moveSelectionToPreviousFindMatch(){if(!this._editor.hasModel())return null;const z=this._getPreviousMatch();if(!z)return null;const U=this._editor.getSelections();return new v(U.slice(0,U.length-1).concat(z),z,0)}_getPreviousMatch(){if(!this._editor.hasModel())return null;if(this.currentMatch){const Y=this.currentMatch;return this.currentMatch=null,Y}this.findController.highlightFindOptions();const z=this._editor.getSelections(),U=z[z.length-1],j=this._editor.getModel().findPreviousMatch(this.searchText,U.getStartPosition(),!1,this.matchCase,this.wholeWord?this._editor.getOption(132):null,!1);return j?new b.Selection(j.range.startLineNumber,j.range.startColumn,j.range.endLineNumber,j.range.endColumn):null}selectAll(z){if(!this._editor.hasModel())return[];this.findController.highlightFindOptions();const U=this._editor.getModel();return z?U.findMatches(this.searchText,z,!1,this.matchCase,this.wholeWord?this._editor.getOption(132):null,!1,1073741824):U.findMatches(this.searchText,!0,!1,this.matchCase,this.wholeWord?this._editor.getOption(132):null,!1,1073741824)}}e.MultiCursorSession=w;class S extends E.Disposable{static{this.ID="editor.contrib.multiCursorController"}static get(z){return z.getContribution(S.ID)}constructor(z){super(),this._sessionDispose=this._register(new E.DisposableStore),this._editor=z,this._ignoreSelectionChange=!1,this._session=null}dispose(){this._endSession(),super.dispose()}_beginSessionIfNeeded(z){if(!this._session){const U=w.create(this._editor,z);if(!U)return;this._session=U;const j={searchString:this._session.searchText};this._session.isDisconnectedFromFindController&&(j.wholeWordOverride=1,j.matchCaseOverride=1,j.isRegexOverride=2),z.getState().change(j,!1),this._sessionDispose.add(this._editor.onDidChangeCursorSelection(Y=>{this._ignoreSelectionChange||this._endSession()})),this._sessionDispose.add(this._editor.onDidBlurEditorText(()=>{this._endSession()})),this._sessionDispose.add(z.getState().onFindReplaceStateChange(Y=>{(Y.matchCase||Y.wholeWord)&&this._endSession()}))}}_endSession(){if(this._sessionDispose.clear(),this._session&&this._session.isDisconnectedFromFindController){const z={wholeWordOverride:0,matchCaseOverride:0,isRegexOverride:0};this._session.findController.getState().change(z,!1)}this._session=null}_setSelections(z){this._ignoreSelectionChange=!0,this._editor.setSelections(z),this._ignoreSelectionChange=!1}_expandEmptyToWord(z,U){if(!U.isEmpty())return U;const j=this._editor.getConfiguredWordAtPosition(U.getStartPosition());return j?new b.Selection(U.startLineNumber,j.startColumn,U.startLineNumber,j.endColumn):U}_applySessionResult(z){z&&(this._setSelections(z.selections),z.revealRange&&this._editor.revealRangeInCenterIfOutsideViewport(z.revealRange,z.revealScrollType))}getSession(z){return this._session}addSelectionToNextFindMatch(z){if(this._editor.hasModel()){if(!this._session){const U=this._editor.getSelections();if(U.length>1){const Y=z.getState().matchCase;if(!x(this._editor.getModel(),U,Y)){const K=this._editor.getModel(),R=[];for(let J=0,ie=U.length;J0&&j.isRegex){const Y=this._editor.getModel();j.searchScope?U=Y.findMatches(j.searchString,j.searchScope,j.isRegex,j.matchCase,j.wholeWord?this._editor.getOption(132):null,!1,1073741824):U=Y.findMatches(j.searchString,!0,j.isRegex,j.matchCase,j.wholeWord?this._editor.getOption(132):null,!1,1073741824)}else{if(this._beginSessionIfNeeded(z),!this._session)return;U=this._session.selectAll(j.searchScope)}if(U.length>0){const Y=this._editor.getSelection();for(let G=0,K=U.length;Gnew b.Selection(G.range.startLineNumber,G.range.startColumn,G.range.endLineNumber,G.range.endColumn)))}}}e.MultiCursorSelectionController=S;class L extends y.EditorAction{run(z,U){const j=S.get(U);if(!j)return;const Y=U._getViewModel();if(Y){const G=Y.getCursorStates(),K=n.CommonFindController.get(U);if(K)this._run(j,K);else{const R=z.get(c.IInstantiationService).createInstance(n.CommonFindController,U);this._run(j,R),R.dispose()}a(G,Y.getCursorStates())}}}e.MultiCursorSelectionControllerAction=L;class D extends L{constructor(){super({id:"editor.action.addSelectionToNextFindMatch",label:o.localize(1159,"Add Selection To Next Find Match"),alias:"Add Selection To Next Find Match",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.focus,primary:2082,weight:100},menuOpts:{menuId:t.MenuId.MenubarSelectionMenu,group:"3_multi",title:o.localize(1160,"Add &&Next Occurrence"),order:5}})}_run(z,U){z.addSelectionToNextFindMatch(U)}}e.AddSelectionToNextFindMatchAction=D;class T extends L{constructor(){super({id:"editor.action.addSelectionToPreviousFindMatch",label:o.localize(1161,"Add Selection To Previous Find Match"),alias:"Add Selection To Previous Find Match",precondition:void 0,menuOpts:{menuId:t.MenuId.MenubarSelectionMenu,group:"3_multi",title:o.localize(1162,"Add P&&revious Occurrence"),order:6}})}_run(z,U){z.addSelectionToPreviousFindMatch(U)}}e.AddSelectionToPreviousFindMatchAction=T;class M extends L{constructor(){super({id:"editor.action.moveSelectionToNextFindMatch",label:o.localize(1163,"Move Last Selection To Next Find Match"),alias:"Move Last Selection To Next Find Match",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.focus,primary:(0,I.KeyChord)(2089,2082),weight:100}})}_run(z,U){z.moveSelectionToNextFindMatch(U)}}e.MoveSelectionToNextFindMatchAction=M;class A extends L{constructor(){super({id:"editor.action.moveSelectionToPreviousFindMatch",label:o.localize(1164,"Move Last Selection To Previous Find Match"),alias:"Move Last Selection To Previous Find Match",precondition:void 0})}_run(z,U){z.moveSelectionToPreviousFindMatch(U)}}e.MoveSelectionToPreviousFindMatchAction=A;class P extends L{constructor(){super({id:"editor.action.selectHighlights",label:o.localize(1165,"Select All Occurrences of Find Match"),alias:"Select All Occurrences of Find Match",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.focus,primary:3114,weight:100},menuOpts:{menuId:t.MenuId.MenubarSelectionMenu,group:"3_multi",title:o.localize(1166,"Select All &&Occurrences"),order:7}})}_run(z,U){z.selectAll(U)}}e.SelectHighlightsAction=P;class N extends L{constructor(){super({id:"editor.action.changeAll",label:o.localize(1167,"Change All Occurrences"),alias:"Change All Occurrences",precondition:i.ContextKeyExpr.and(p.EditorContextKeys.writable,p.EditorContextKeys.editorTextFocus),kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:2108,weight:100},contextMenuOpts:{group:"1_modification",order:1.2}})}_run(z,U){z.selectAll(U)}}e.CompatChangeAll=N;class O{constructor(z,U,j,Y,G){this._model=z,this._searchText=U,this._matchCase=j,this._wordSeparators=Y,this._modelVersionId=this._model.getVersionId(),this._cachedFindMatches=null,G&&this._model===G._model&&this._searchText===G._searchText&&this._matchCase===G._matchCase&&this._wordSeparators===G._wordSeparators&&this._modelVersionId===G._modelVersionId&&(this._cachedFindMatches=G._cachedFindMatches)}findMatches(){return this._cachedFindMatches===null&&(this._cachedFindMatches=this._model.findMatches(this._searchText,!0,!1,this._matchCase,this._wordSeparators,!1).map(z=>z.range),this._cachedFindMatches.sort(_.Range.compareRangesUsingStarts)),this._cachedFindMatches}}let F=class extends E.Disposable{static{l=this}static{this.ID="editor.contrib.selectionHighlighter"}constructor(z,U){super(),this._languageFeaturesService=U,this.editor=z,this._isEnabled=z.getOption(109),this._decorations=z.createDecorationsCollection(),this.updateSoon=this._register(new k.RunOnceScheduler(()=>this._update(),300)),this.state=null,this._register(z.onDidChangeConfiguration(Y=>{this._isEnabled=z.getOption(109)})),this._register(z.onDidChangeCursorSelection(Y=>{this._isEnabled&&(Y.selection.isEmpty()?Y.reason===3?(this.state&&this._setState(null),this.updateSoon.schedule()):this._setState(null):this._update())})),this._register(z.onDidChangeModel(Y=>{this._setState(null)})),this._register(z.onDidChangeModelContent(Y=>{this._isEnabled&&this.updateSoon.schedule()}));const j=n.CommonFindController.get(z);j&&this._register(j.getState().onFindReplaceStateChange(Y=>{this._update()})),this.updateSoon.schedule()}_update(){this._setState(l._createState(this.state,this._isEnabled,this.editor))}static _createState(z,U,j){if(!U||!j.hasModel())return null;const Y=j.getSelection();if(Y.startLineNumber!==Y.endLineNumber)return null;const G=S.get(j);if(!G)return null;const K=n.CommonFindController.get(j);if(!K)return null;let R=G.getSession(K);if(!R){const ue=j.getSelections();if(ue.length>1){const pe=K.getState().matchCase;if(!x(j.getModel(),ue,pe))return null}R=w.create(j,K)}if(!R||R.currentMatch||/^[ \t]+$/.test(R.searchText)||R.searchText.length>200)return null;const J=K.getState(),ie=J.matchCase;if(J.isRevealed){let ue=J.searchString;ie||(ue=ue.toLowerCase());let he=R.searchText;if(ie||(he=he.toLowerCase()),ue===he&&R.matchCase===J.matchCase&&R.wholeWord===J.wholeWord&&!J.isRegex)return null}return new O(j.getModel(),R.searchText,R.matchCase,R.wholeWord?j.getOption(132):null,z)}_setState(z){if(this.state=z,!this.state){this._decorations.clear();return}if(!this.editor.hasModel())return;const U=this.editor.getModel();if(U.isTooLargeForTokenization())return;const j=this.state.findMatches(),Y=this.editor.getSelections();Y.sort(_.Range.compareRangesUsingStarts);const G=[];for(let ie=0,ue=0,he=j.length,pe=Y.length;ie=pe)G.push(ae),ie++;else{const ee=_.Range.compareRangesUsingStarts(ae,Y[ue]);ee<0?((Y[ue].isEmpty()||!_.Range.areIntersecting(ae,Y[ue]))&&G.push(ae),ie++):(ee>0||ie++,ue++)}}const K=this.editor.getOption(81)!=="off",R=this._languageFeaturesService.documentHighlightProvider.has(U)&&K,J=G.map(ie=>({range:ie,options:(0,g.getSelectionHighlightDecorationOptions)(R)}));this._decorations.set(J)}dispose(){this._setState(null),super.dispose()}};e.SelectionHighlighter=F,e.SelectionHighlighter=F=l=ke([ce(1,s.ILanguageFeaturesService)],F);function x(H,z,U){const j=W(H,z[0],!U);for(let Y=1,G=z.length;Y()=>Promise.resolve(j.provideDocumentHighlights(q,H,z)).then(void 0,y.onUnexpectedExternalError)),j=>j!=null).then(j=>{if(j){const Y=new l.ResourceMap;return Y.set(q.uri,j),Y}return new l.ResourceMap})}function S(V,q,H,z,U,j){const Y=V.ordered(q);return(0,I.first)(Y.map(G=>()=>{const K=j.filter(R=>(0,t.shouldSynchronizeModel)(R)).filter(R=>(0,a.score)(G.selector,R.uri,R.getLanguageId(),!0,void 0,void 0)>0);return Promise.resolve(G.provideMultiDocumentHighlights(q,H,K,U)).then(void 0,y.onUnexpectedExternalError)}),G=>G!=null)}class L{constructor(q,H,z){this._model=q,this._selection=H,this._wordSeparators=z,this._wordRange=this._getCurrentWordRange(q,H),this._result=null}get result(){return this._result||(this._result=(0,I.createCancelablePromise)(q=>this._compute(this._model,this._selection,this._wordSeparators,q))),this._result}_getCurrentWordRange(q,H){const z=q.getWordAtPosition(H.getPosition());return z?new n.Range(H.startLineNumber,z.startColumn,H.startLineNumber,z.endColumn):null}isValid(q,H,z){const U=H.startLineNumber,j=H.startColumn,Y=H.endColumn,G=this._getCurrentWordRange(q,H);let K=!!(this._wordRange&&this._wordRange.equalsRange(G));for(let R=0,J=z.length;!K&&R=Y&&(K=!0)}return K}cancel(){this.result.cancel()}}class D extends L{constructor(q,H,z,U){super(q,H,z),this._providers=U}_compute(q,H,z,U){return w(this._providers,q,H.getPosition(),U).then(j=>j||new l.ResourceMap)}}class T extends L{constructor(q,H,z,U,j){super(q,H,z),this._providers=U,this._otherModels=j}_compute(q,H,z,U){return S(this._providers,q,H.getPosition(),z,U,this._otherModels).then(j=>j||new l.ResourceMap)}}function M(V,q,H,z,U){return new D(q,H,U,V)}function A(V,q,H,z,U,j){return new T(q,H,U,V,j)}(0,b.registerModelAndPositionCommand)("_executeDocumentHighlights",async(V,q,H)=>{const z=V.get(i.ILanguageFeaturesService);return(await w(z.documentHighlightProvider,q,H,E.CancellationToken.None))?.get(q.uri)});let P=class{static{f=this}static{this.storedDecorationIDs=new l.ResourceMap}static{this.query=null}constructor(q,H,z,U,j){this.toUnhook=new m.DisposableStore,this.workerRequestTokenId=0,this.workerRequestCompleted=!1,this.workerRequestValue=new l.ResourceMap,this.lastCursorPositionChangeTime=0,this.renderDecorationsTimer=-1,this.runDelayer=this.toUnhook.add(new I.Delayer(50)),this.editor=q,this.providers=H,this.multiDocumentProviders=z,this.codeEditorService=j,this._hasWordHighlights=v.bindTo(U),this._ignorePositionChangeEvent=!1,this.occurrencesHighlight=this.editor.getOption(81),this.model=this.editor.getModel(),this.toUnhook.add(q.onDidChangeCursorPosition(Y=>{this._ignorePositionChangeEvent||this.occurrencesHighlight!=="off"&&this.runDelayer.trigger(()=>{this._onPositionChanged(Y)})})),this.toUnhook.add(q.onDidFocusEditorText(Y=>{this.occurrencesHighlight!=="off"&&(this.workerRequest||this.runDelayer.trigger(()=>{this._run()}))})),this.toUnhook.add(q.onDidChangeModelContent(Y=>{(0,c.matchesScheme)(this.model.uri,"output")||this._stopAll()})),this.toUnhook.add(q.onDidChangeModel(Y=>{!Y.newModelUrl&&Y.oldModelUrl?this._stopSingular():f.query&&this._run()})),this.toUnhook.add(q.onDidChangeConfiguration(Y=>{const G=this.editor.getOption(81);if(this.occurrencesHighlight!==G)switch(this.occurrencesHighlight=G,G){case"off":this._stopAll();break;case"singleFile":this._stopAll(f.query?.modelInfo?.model);break;case"multiFile":f.query&&this._run(!0);break;default:console.warn("Unknown occurrencesHighlight setting value:",G);break}})),this.decorations=this.editor.createDecorationsCollection(),this.workerRequestTokenId=0,this.workerRequest=null,this.workerRequestCompleted=!1,this.lastCursorPositionChangeTime=0,this.renderDecorationsTimer=-1,f.query&&this._run()}hasDecorations(){return this.decorations.length>0}restore(){this.occurrencesHighlight!=="off"&&(this.runDelayer.cancel(),this._run())}_getSortedHighlights(){return this.decorations.getRanges().sort(n.Range.compareRangesUsingStarts)}moveNext(){const q=this._getSortedHighlights(),z=(q.findIndex(j=>j.containsPosition(this.editor.getPosition()))+1)%q.length,U=q[z];try{this._ignorePositionChangeEvent=!0,this.editor.setPosition(U.getStartPosition()),this.editor.revealRangeInCenterIfOutsideViewport(U);const j=this._getWord();if(j){const Y=this.editor.getModel().getLineContent(U.startLineNumber);(0,k.alert)(`${Y}, ${z+1} of ${q.length} for '${j.word}'`)}}finally{this._ignorePositionChangeEvent=!1}}moveBack(){const q=this._getSortedHighlights(),z=(q.findIndex(j=>j.containsPosition(this.editor.getPosition()))-1+q.length)%q.length,U=q[z];try{this._ignorePositionChangeEvent=!0,this.editor.setPosition(U.getStartPosition()),this.editor.revealRangeInCenterIfOutsideViewport(U);const j=this._getWord();if(j){const Y=this.editor.getModel().getLineContent(U.startLineNumber);(0,k.alert)(`${Y}, ${z+1} of ${q.length} for '${j.word}'`)}}finally{this._ignorePositionChangeEvent=!1}}_removeSingleDecorations(){if(!this.editor.hasModel())return;const q=f.storedDecorationIDs.get(this.editor.getModel().uri);q&&(this.editor.removeDecorations(q),f.storedDecorationIDs.delete(this.editor.getModel().uri),this.decorations.length>0&&(this.decorations.clear(),this._hasWordHighlights.set(!1)))}_removeAllDecorations(q){const H=this.codeEditorService.listCodeEditors(),z=[];for(const U of H){if(!U.hasModel()||(0,r.isEqual)(U.getModel().uri,q?.uri))continue;const j=f.storedDecorationIDs.get(U.getModel().uri);if(!j)continue;U.removeDecorations(j),z.push(U.getModel().uri);const Y=N.get(U);Y?.wordHighlighter&&Y.wordHighlighter.decorations.length>0&&(Y.wordHighlighter.decorations.clear(),Y.wordHighlighter.workerRequest=null,Y.wordHighlighter._hasWordHighlights.set(!1))}for(const U of z)f.storedDecorationIDs.delete(U)}_stopSingular(){this._removeSingleDecorations(),this.editor.hasTextFocus()&&(this.editor.getModel()?.uri.scheme!==c.Schemas.vscodeNotebookCell&&f.query?.modelInfo?.model.uri.scheme!==c.Schemas.vscodeNotebookCell?(f.query=null,this._run()):f.query?.modelInfo&&(f.query.modelInfo=null)),this.renderDecorationsTimer!==-1&&(clearTimeout(this.renderDecorationsTimer),this.renderDecorationsTimer=-1),this.workerRequest!==null&&(this.workerRequest.cancel(),this.workerRequest=null),this.workerRequestCompleted||(this.workerRequestTokenId++,this.workerRequestCompleted=!0)}_stopAll(q){this._removeAllDecorations(q),this.renderDecorationsTimer!==-1&&(clearTimeout(this.renderDecorationsTimer),this.renderDecorationsTimer=-1),this.workerRequest!==null&&(this.workerRequest.cancel(),this.workerRequest=null),this.workerRequestCompleted||(this.workerRequestTokenId++,this.workerRequestCompleted=!0)}_onPositionChanged(q){if(this.occurrencesHighlight==="off"){this._stopAll();return}if(q.reason!==3&&this.editor.getModel()?.uri.scheme!==c.Schemas.vscodeNotebookCell){this._stopAll();return}this._run()}_getWord(){const q=this.editor.getSelection(),H=q.startLineNumber,z=q.startColumn;return this.model.isDisposed()?null:this.model.getWordAtPosition({lineNumber:H,column:z})}getOtherModelsToHighlight(q){if(!q)return[];if(q.uri.scheme===c.Schemas.vscodeNotebookCell){const j=[],Y=this.codeEditorService.listCodeEditors();for(const G of Y){const K=G.getModel();K&&K!==q&&K.uri.scheme===c.Schemas.vscodeNotebookCell&&j.push(K)}return j}const z=[],U=this.codeEditorService.listCodeEditors();for(const j of U){if(!(0,_.isDiffEditor)(j))continue;const Y=j.getModel();Y&&q===Y.modified&&z.push(Y.modified)}if(z.length)return z;if(this.occurrencesHighlight==="singleFile")return[];for(const j of U){const Y=j.getModel();Y&&Y!==q&&z.push(Y)}return z}_run(q){let H;if(this.editor.hasTextFocus()){const U=this.editor.getSelection();if(!U||U.startLineNumber!==U.endLineNumber){f.query=null,this._stopAll();return}const j=U.startColumn,Y=U.endColumn,G=this._getWord();if(!G||G.startColumn>j||G.endColumn{U===this.workerRequestTokenId&&(this.workerRequestCompleted=!0,this.workerRequestValue=Y||[],this._beginRenderDecorations())},y.onUnexpectedError)}}computeWithModel(q,H,z,U){return U.length?A(this.multiDocumentProviders,q,H,z,this.editor.getOption(132),U):M(this.providers,q,H,z,this.editor.getOption(132))}_beginRenderDecorations(){const q=new Date().getTime(),H=this.lastCursorPositionChangeTime+250;q>=H?(this.renderDecorationsTimer=-1,this.renderDecorations()):this.renderDecorationsTimer=setTimeout(()=>{this.renderDecorations()},H-q)}renderDecorations(){this.renderDecorationsTimer=-1;const q=this.codeEditorService.listCodeEditors();for(const H of q){const z=N.get(H);if(!z)continue;const U=[],j=H.getModel()?.uri;if(j&&this.workerRequestValue.has(j)){const Y=f.storedDecorationIDs.get(j),G=this.workerRequestValue.get(j);if(G)for(const R of G)R.range&&U.push({range:R.range,options:(0,s.getHighlightDecorationOptions)(R.kind)});let K=[];H.changeDecorations(R=>{K=R.deltaDecorations(Y??[],U)}),f.storedDecorationIDs=f.storedDecorationIDs.set(j,K),U.length>0&&(z.wordHighlighter?.decorations.set(U),z.wordHighlighter?._hasWordHighlights.set(!0))}}}dispose(){this._stopSingular(),this.toUnhook.dispose()}};P=f=ke([ce(4,p.ICodeEditorService)],P);let N=class extends m.Disposable{static{h=this}static{this.ID="editor.contrib.wordHighlighter"}static get(q){return q.getContribution(h.ID)}constructor(q,H,z,U){super(),this._wordHighlighter=null;const j=()=>{q.hasModel()&&!q.getModel().isTooLargeForTokenization()&&(this._wordHighlighter=new P(q,z.documentHighlightProvider,z.multiDocumentHighlightProvider,H,U))};this._register(q.onDidChangeModel(Y=>{this._wordHighlighter&&(this._wordHighlighter.dispose(),this._wordHighlighter=null),j()})),j()}get wordHighlighter(){return this._wordHighlighter}saveViewState(){return!!(this._wordHighlighter&&this._wordHighlighter.hasDecorations())}moveNext(){this._wordHighlighter?.moveNext()}moveBack(){this._wordHighlighter?.moveBack()}restoreViewState(q){this._wordHighlighter&&q&&this._wordHighlighter.restore()}dispose(){this._wordHighlighter&&(this._wordHighlighter.dispose(),this._wordHighlighter=null),super.dispose()}};e.WordHighlighterContribution=N,e.WordHighlighterContribution=N=h=ke([ce(1,g.IContextKeyService),ce(2,i.ILanguageFeaturesService),ce(3,p.ICodeEditorService)],N);class O extends b.EditorAction{constructor(q,H){super(H),this._isNext=q}run(q,H){const z=N.get(H);z&&(this._isNext?z.moveNext():z.moveBack())}}class F extends O{constructor(){super(!0,{id:"editor.action.wordHighlight.next",label:d.localize(1424,"Go to Next Symbol Highlight"),alias:"Go to Next Symbol Highlight",precondition:v,kbOpts:{kbExpr:o.EditorContextKeys.editorTextFocus,primary:65,weight:100}})}}class x extends O{constructor(){super(!1,{id:"editor.action.wordHighlight.prev",label:d.localize(1425,"Go to Previous Symbol Highlight"),alias:"Go to Previous Symbol Highlight",precondition:v,kbOpts:{kbExpr:o.EditorContextKeys.editorTextFocus,primary:1089,weight:100}})}}class W extends b.EditorAction{constructor(){super({id:"editor.action.wordHighlight.trigger",label:d.localize(1426,"Trigger Symbol Highlight"),alias:"Trigger Symbol Highlight",precondition:void 0,kbOpts:{kbExpr:o.EditorContextKeys.editorTextFocus,primary:0,weight:100}})}run(q,H,z){const U=N.get(H);U&&U.restoreViewState(!0)}}(0,b.registerEditorContribution)(N.ID,N,0),(0,b.registerEditorAction)(F),(0,b.registerEditorAction)(x),(0,b.registerEditorAction)(W),(0,C.registerEditorFeature)(u.TextualMultiDocumentHighlightFeature)}),define(ne[842],se([1,0,5,173,33,187,2,60,4,35,537]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ZoneWidget=e.OverlayWidgetDelegate=void 0;const p=new I.Color(new I.RGBA(0,122,204)),n={showArrow:!0,showFrame:!0,className:"",frameColor:p,arrowColor:p,keepEditorSelection:!1},o="vs.editor.contrib.zoneWidget";class t{constructor(l,a,r,u,C,f,h,v){this.id="",this.domNode=l,this.afterLineNumber=a,this.afterColumn=r,this.heightInLines=u,this.showInHiddenAreas=h,this.ordinal=v,this._onDomNodeTop=C,this._onComputedHeight=f}onDomNodeTop(l){this._onDomNodeTop(l)}onComputedHeight(l){this._onComputedHeight(l)}}class i{constructor(l,a){this._id=l,this._domNode=a}getId(){return this._id}getDomNode(){return this._domNode}getPosition(){return null}}e.OverlayWidgetDelegate=i;class s{static{this._IdGenerator=new E.IdGenerator(".arrow-decoration-")}constructor(l){this._editor=l,this._ruleName=s._IdGenerator.nextId(),this._decorations=this._editor.createDecorationsCollection(),this._color=null,this._height=-1}dispose(){this.hide(),d.removeCSSRulesContainingSelector(this._ruleName)}set color(l){this._color!==l&&(this._color=l,this._updateStyle())}set height(l){this._height!==l&&(this._height=l,this._updateStyle())}_updateStyle(){d.removeCSSRulesContainingSelector(this._ruleName),d.createCSSRule(`.monaco-editor ${this._ruleName}`,`border-style: solid; border-color: transparent; border-bottom-color: ${this._color}; border-width: ${this._height}px; bottom: -${this._height}px !important; margin-left: -${this._height}px; `)}show(l){l.column===1&&(l={lineNumber:l.lineNumber,column:2}),this._decorations.set([{range:_.Range.fromPositions(l),options:{description:"zone-widget-arrow",className:this._ruleName,stickiness:1}}])}hide(){this._decorations.clear()}}class g{constructor(l,a={}){this._arrow=null,this._overlayWidget=null,this._resizeSash=null,this._viewZone=null,this._disposables=new y.DisposableStore,this.container=null,this._isShowing=!1,this.editor=l,this._positionMarkerId=this.editor.createDecorationsCollection(),this.options=m.deepClone(a),m.mixin(this.options,n,!1),this.domNode=document.createElement("div"),this.options.isAccessible||(this.domNode.setAttribute("aria-hidden","true"),this.domNode.setAttribute("role","presentation")),this._disposables.add(this.editor.onDidLayoutChange(r=>{const u=this._getWidth(r);this.domNode.style.width=u+"px",this.domNode.style.left=this._getLeft(r)+"px",this._onWidth(u)}))}dispose(){this._overlayWidget&&(this.editor.removeOverlayWidget(this._overlayWidget),this._overlayWidget=null),this._viewZone&&this.editor.changeViewZones(l=>{this._viewZone&&l.removeZone(this._viewZone.id),this._viewZone=null}),this._positionMarkerId.clear(),this._disposables.dispose()}create(){this.domNode.classList.add("zone-widget"),this.options.className&&this.domNode.classList.add(this.options.className),this.container=document.createElement("div"),this.container.classList.add("zone-widget-container"),this.domNode.appendChild(this.container),this.options.showArrow&&(this._arrow=new s(this.editor),this._disposables.add(this._arrow)),this._fillContainer(this.container),this._initSash(),this._applyStyles()}style(l){l.frameColor&&(this.options.frameColor=l.frameColor),l.arrowColor&&(this.options.arrowColor=l.arrowColor),this._applyStyles()}_applyStyles(){if(this.container&&this.options.frameColor){const l=this.options.frameColor.toString();this.container.style.borderTopColor=l,this.container.style.borderBottomColor=l}if(this._arrow&&this.options.arrowColor){const l=this.options.arrowColor.toString();this._arrow.color=l}}_getWidth(l){return l.width-l.minimap.minimapWidth-l.verticalScrollbarWidth}_getLeft(l){return l.minimap.minimapWidth>0&&l.minimap.minimapLeft===0?l.minimap.minimapWidth:0}_onViewZoneTop(l){this.domNode.style.top=l+"px"}_onViewZoneHeight(l){if(this.domNode.style.height=`${l}px`,this.container){const a=l-this._decoratingElementsHeight();this.container.style.height=`${a}px`;const r=this.editor.getLayoutInfo();this._doLayout(a,this._getWidth(r))}this._resizeSash?.layout()}get position(){const l=this._positionMarkerId.getRange(0);if(l)return l.getStartPosition()}show(l,a){const r=_.Range.isIRange(l)?_.Range.lift(l):_.Range.fromPositions(l);this._isShowing=!0,this._showImpl(r,a),this._isShowing=!1,this._positionMarkerId.set([{range:r,options:b.ModelDecorationOptions.EMPTY}])}hide(){this._viewZone&&(this.editor.changeViewZones(l=>{this._viewZone&&l.removeZone(this._viewZone.id)}),this._viewZone=null),this._overlayWidget&&(this.editor.removeOverlayWidget(this._overlayWidget),this._overlayWidget=null),this._arrow?.hide(),this._positionMarkerId.clear()}_decoratingElementsHeight(){const l=this.editor.getOption(67);let a=0;if(this.options.showArrow){const r=Math.round(l/3);a+=2*r}if(this.options.showFrame){const r=Math.round(l/9);a+=2*r}return a}_showImpl(l,a){const r=l.getStartPosition(),u=this.editor.getLayoutInfo(),C=this._getWidth(u);this.domNode.style.width=`${C}px`,this.domNode.style.left=this._getLeft(u)+"px";const f=document.createElement("div");f.style.overflow="hidden";const h=this.editor.getOption(67);if(!this.options.allowUnlimitedHeight){const D=Math.max(12,this.editor.getLayoutInfo().height/h*.8);a=Math.min(a,D)}let v=0,w=0;if(this._arrow&&this.options.showArrow&&(v=Math.round(h/3),this._arrow.height=v,this._arrow.show(r)),this.options.showFrame&&(w=Math.round(h/9)),this.editor.changeViewZones(D=>{this._viewZone&&D.removeZone(this._viewZone.id),this._overlayWidget&&(this.editor.removeOverlayWidget(this._overlayWidget),this._overlayWidget=null),this.domNode.style.top="-1000px",this._viewZone=new t(f,r.lineNumber,r.column,a,T=>this._onViewZoneTop(T),T=>this._onViewZoneHeight(T),this.options.showInHiddenAreas,this.options.ordinal),this._viewZone.id=D.addZone(this._viewZone),this._overlayWidget=new i(o+this._viewZone.id,this.domNode),this.editor.addOverlayWidget(this._overlayWidget)}),this.container&&this.options.showFrame){const D=this.options.frameWidth?this.options.frameWidth:w;this.container.style.borderTopWidth=D+"px",this.container.style.borderBottomWidth=D+"px"}const S=a*h-this._decoratingElementsHeight();this.container&&(this.container.style.top=v+"px",this.container.style.height=S+"px",this.container.style.overflow="hidden"),this._doLayout(S,C),this.options.keepEditorSelection||this.editor.setSelection(l);const L=this.editor.getModel();if(L){const D=L.validateRange(new _.Range(l.startLineNumber,1,l.endLineNumber+1,1));this.revealRange(D,D.startLineNumber===L.getLineCount())}}revealRange(l,a){a?this.editor.revealLineNearTop(l.endLineNumber,0):this.editor.revealRange(l,0)}setCssClass(l,a){this.container&&(a&&this.container.classList.remove(a),this.container.classList.add(l))}_onWidth(l){}_doLayout(l,a){}_relayout(l){this._viewZone&&this._viewZone.heightInLines!==l&&this.editor.changeViewZones(a=>{this._viewZone&&(this._viewZone.heightInLines=l,a.layoutZone(this._viewZone.id))})}_initSash(){if(this._resizeSash)return;this._resizeSash=this._disposables.add(new k.Sash(this.domNode,this,{orientation:1})),this.options.isResizeable||(this._resizeSash.state=0);let l;this._disposables.add(this._resizeSash.onDidStart(a=>{this._viewZone&&(l={startY:a.startY,heightInLines:this._viewZone.heightInLines})})),this._disposables.add(this._resizeSash.onDidEnd(()=>{l=void 0})),this._disposables.add(this._resizeSash.onDidChange(a=>{if(l){const r=(a.currentY-l.startY)/this.editor.getOption(67),u=r<0?Math.ceil(r):Math.floor(r),C=l.heightInLines+u;C>5&&C<35&&this._relayout(C)}}))}getHorizontalSashLeft(){return 0}getHorizontalSashTop(){return(this.domNode.style.height===null?0:parseInt(this.domNode.style.height))-this._decoratingElementsHeight()/2}getHorizontalSashWidth(){const l=this.editor.getLayoutInfo();return l.width-l.minimap.minimapWidth}}e.ZoneWidget=g}),define(ne[158],se([1,0,5,87,41,26,30,33,6,60,15,34,125,842,3,124,12,49,7,32,527]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.peekViewEditorMatchHighlightBorder=e.peekViewEditorMatchHighlight=e.peekViewResultsMatchHighlight=e.peekViewEditorStickyScrollBackground=e.peekViewEditorGutterBackground=e.peekViewEditorBackground=e.peekViewResultsSelectionForeground=e.peekViewResultsSelectionBackground=e.peekViewResultsFileForeground=e.peekViewResultsMatchForeground=e.peekViewResultsBackground=e.peekViewBorder=e.peekViewTitleInfoForeground=e.peekViewTitleForeground=e.peekViewTitleBackground=e.PeekViewWidget=e.PeekContext=e.IPeekViewService=void 0,e.getOuterEditor=C,e.IPeekViewService=(0,l.createDecorator)("IPeekViewService"),(0,c.registerSingleton)(e.IPeekViewService,class{constructor(){this._widgets=new Map}addExclusiveWidget(v,w){const S=this._widgets.get(v);S&&(S.listener.dispose(),S.widget.dispose());const L=()=>{const D=this._widgets.get(v);D&&D.widget===w&&(D.listener.dispose(),this._widgets.delete(v))};this._widgets.set(v,{widget:w,listener:w.onDidClose(L)})}},1);var r;(function(v){v.inPeekEditor=new g.RawContextKey("inReferenceSearchEditor",!0,i.localize(1177,"Whether the current code editor is embedded inside peek")),v.notInPeekEditor=v.inPeekEditor.toNegated()})(r||(e.PeekContext=r={}));let u=class{static{this.ID="editor.contrib.referenceController"}constructor(w,S){w instanceof o.EmbeddedCodeEditorWidget&&r.inPeekEditor.bindTo(S)}dispose(){}};u=ke([ce(1,g.IContextKeyService)],u),(0,p.registerEditorContribution)(u.ID,u,0);function C(v){const w=v.get(n.ICodeEditorService).getFocusedCodeEditor();return w instanceof o.EmbeddedCodeEditorWidget?w.getParentEditor():w}const f={headerBackgroundColor:m.Color.white,primaryHeadingColor:m.Color.fromHex("#333333"),secondaryHeadingColor:m.Color.fromHex("#6c6c6cb3")};let h=class extends t.ZoneWidget{constructor(w,S,L){super(w,S),this.instantiationService=L,this._onDidClose=new _.Emitter,this.onDidClose=this._onDidClose.event,b.mixin(this.options,f,!1)}dispose(){this.disposed||(this.disposed=!0,super.dispose(),this._onDidClose.fire(this))}style(w){const S=this.options;w.headerBackgroundColor&&(S.headerBackgroundColor=w.headerBackgroundColor),w.primaryHeadingColor&&(S.primaryHeadingColor=w.primaryHeadingColor),w.secondaryHeadingColor&&(S.secondaryHeadingColor=w.secondaryHeadingColor),super.style(w)}_applyStyles(){super._applyStyles();const w=this.options;this._headElement&&w.headerBackgroundColor&&(this._headElement.style.backgroundColor=w.headerBackgroundColor.toString()),this._primaryHeading&&w.primaryHeadingColor&&(this._primaryHeading.style.color=w.primaryHeadingColor.toString()),this._secondaryHeading&&w.secondaryHeadingColor&&(this._secondaryHeading.style.color=w.secondaryHeadingColor.toString()),this._bodyElement&&w.frameColor&&(this._bodyElement.style.borderColor=w.frameColor.toString())}_fillContainer(w){this.setCssClass("peekview-widget"),this._headElement=d.$(".head"),this._bodyElement=d.$(".body"),this._fillHead(this._headElement),this._fillBody(this._bodyElement),w.appendChild(this._headElement),w.appendChild(this._bodyElement)}_fillHead(w,S){this._titleElement=d.$(".peekview-title"),this.options.supportOnTitleClick&&(this._titleElement.classList.add("clickable"),d.addStandardDisposableListener(this._titleElement,"click",T=>this._onTitleClick(T))),d.append(this._headElement,this._titleElement),this._fillTitleIcon(this._titleElement),this._primaryHeading=d.$("span.filename"),this._secondaryHeading=d.$("span.dirname"),this._metaHeading=d.$("span.meta"),d.append(this._titleElement,this._primaryHeading,this._secondaryHeading,this._metaHeading);const L=d.$(".peekview-actions");d.append(this._headElement,L);const D=this._getActionBarOptions();this._actionbarWidget=new k.ActionBar(L,D),this._disposables.add(this._actionbarWidget),S||this._actionbarWidget.push(new I.Action("peekview.close",i.localize(1178,"Close"),y.ThemeIcon.asClassName(E.Codicon.close),!0,()=>(this.dispose(),Promise.resolve())),{label:!1,icon:!0})}_fillTitleIcon(w){}_getActionBarOptions(){return{actionViewItemProvider:s.createActionViewItem.bind(void 0,this.instantiationService),orientation:0}}_onTitleClick(w){}setTitle(w,S){this._primaryHeading&&this._secondaryHeading&&(this._primaryHeading.innerText=w,this._primaryHeading.setAttribute("title",w),S?this._secondaryHeading.innerText=S:d.clearNode(this._secondaryHeading))}setMetaTitle(w){this._metaHeading&&(w?(this._metaHeading.innerText=w,d.show(this._metaHeading)):d.hide(this._metaHeading))}_doLayout(w,S){if(!this._isShowing&&w<0){this.dispose();return}const L=Math.ceil(this.editor.getOption(67)*1.2),D=Math.round(w-(L+2));this._doLayoutHead(L,S),this._doLayoutBody(D,S)}_doLayoutHead(w,S){this._headElement&&(this._headElement.style.height=`${w}px`,this._headElement.style.lineHeight=this._headElement.style.height)}_doLayoutBody(w,S){this._bodyElement&&(this._bodyElement.style.height=`${w}px`)}};e.PeekViewWidget=h,e.PeekViewWidget=h=ke([ce(2,l.IInstantiationService)],h),e.peekViewTitleBackground=(0,a.registerColor)("peekViewTitle.background",{dark:"#252526",light:"#F3F3F3",hcDark:m.Color.black,hcLight:m.Color.white},i.localize(1179,"Background color of the peek view title area.")),e.peekViewTitleForeground=(0,a.registerColor)("peekViewTitleLabel.foreground",{dark:m.Color.white,light:m.Color.black,hcDark:m.Color.white,hcLight:a.editorForeground},i.localize(1180,"Color of the peek view title.")),e.peekViewTitleInfoForeground=(0,a.registerColor)("peekViewTitleDescription.foreground",{dark:"#ccccccb3",light:"#616161",hcDark:"#FFFFFF99",hcLight:"#292929"},i.localize(1181,"Color of the peek view title info.")),e.peekViewBorder=(0,a.registerColor)("peekView.border",{dark:a.editorInfoForeground,light:a.editorInfoForeground,hcDark:a.contrastBorder,hcLight:a.contrastBorder},i.localize(1182,"Color of the peek view borders and arrow.")),e.peekViewResultsBackground=(0,a.registerColor)("peekViewResult.background",{dark:"#252526",light:"#F3F3F3",hcDark:m.Color.black,hcLight:m.Color.white},i.localize(1183,"Background color of the peek view result list.")),e.peekViewResultsMatchForeground=(0,a.registerColor)("peekViewResult.lineForeground",{dark:"#bbbbbb",light:"#646465",hcDark:m.Color.white,hcLight:a.editorForeground},i.localize(1184,"Foreground color for line nodes in the peek view result list.")),e.peekViewResultsFileForeground=(0,a.registerColor)("peekViewResult.fileForeground",{dark:m.Color.white,light:"#1E1E1E",hcDark:m.Color.white,hcLight:a.editorForeground},i.localize(1185,"Foreground color for file nodes in the peek view result list.")),e.peekViewResultsSelectionBackground=(0,a.registerColor)("peekViewResult.selectionBackground",{dark:"#3399ff33",light:"#3399ff33",hcDark:null,hcLight:null},i.localize(1186,"Background color of the selected entry in the peek view result list.")),e.peekViewResultsSelectionForeground=(0,a.registerColor)("peekViewResult.selectionForeground",{dark:m.Color.white,light:"#6C6C6C",hcDark:m.Color.white,hcLight:a.editorForeground},i.localize(1187,"Foreground color of the selected entry in the peek view result list.")),e.peekViewEditorBackground=(0,a.registerColor)("peekViewEditor.background",{dark:"#001F33",light:"#F2F8FC",hcDark:m.Color.black,hcLight:m.Color.white},i.localize(1188,"Background color of the peek view editor.")),e.peekViewEditorGutterBackground=(0,a.registerColor)("peekViewEditorGutter.background",e.peekViewEditorBackground,i.localize(1189,"Background color of the gutter in the peek view editor.")),e.peekViewEditorStickyScrollBackground=(0,a.registerColor)("peekViewEditorStickyScroll.background",e.peekViewEditorBackground,i.localize(1190,"Background color of sticky scroll in the peek view editor.")),e.peekViewResultsMatchHighlight=(0,a.registerColor)("peekViewResult.matchHighlightBackground",{dark:"#ea5c004d",light:"#ea5c004d",hcDark:null,hcLight:null},i.localize(1191,"Match highlight color in the peek view result list.")),e.peekViewEditorMatchHighlight=(0,a.registerColor)("peekViewEditor.matchHighlightBackground",{dark:"#ff8f0099",light:"#f5d802de",hcDark:null,hcLight:null},i.localize(1192,"Match highlight color in the peek view editor.")),e.peekViewEditorMatchHighlightBorder=(0,a.registerColor)("peekViewEditor.matchHighlightBorder",{dark:null,light:null,hcDark:a.activeContrastBorder,hcLight:a.activeContrastBorder},i.localize(1193,"Match highlight border in the peek view editor."))}),define(ne[843],se([1,0,5,86,13,33,6,2,48,11,4,158,3,124,29,12,7,181,108,59,723,32,25,512]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C){"use strict";var f;Object.defineProperty(e,"__esModule",{value:!0}),e.MarkerNavigationWidget=void 0;class h{constructor(x,W,V,q,H){this._openerService=q,this._labelService=H,this._lines=0,this._longestLineLength=0,this._relatedDiagnostics=new WeakMap,this._disposables=new m.DisposableStore,this._editor=W;const z=document.createElement("div");z.className="descriptioncontainer",this._messageBlock=document.createElement("div"),this._messageBlock.classList.add("message"),this._messageBlock.setAttribute("aria-live","assertive"),this._messageBlock.setAttribute("role","alert"),z.appendChild(this._messageBlock),this._relatedBlock=document.createElement("div"),z.appendChild(this._relatedBlock),this._disposables.add(d.addStandardDisposableListener(this._relatedBlock,"click",U=>{U.preventDefault();const j=this._relatedDiagnostics.get(U.target);j&&V(j)})),this._scrollable=new k.ScrollableElement(z,{horizontal:1,vertical:1,useShadows:!1,horizontalScrollbarSize:6,verticalScrollbarSize:6}),x.appendChild(this._scrollable.getDomNode()),this._disposables.add(this._scrollable.onScroll(U=>{z.style.left=`-${U.scrollLeft}px`,z.style.top=`-${U.scrollTop}px`})),this._disposables.add(this._scrollable)}dispose(){(0,m.dispose)(this._disposables)}update(x){const{source:W,message:V,relatedInformation:q,code:H}=x;let z=(W?.length||0)+2;H&&(typeof H=="string"?z+=H.length:z+=H.value.length);const U=(0,b.splitLines)(V);this._lines=U.length,this._longestLineLength=0;for(const R of U)this._longestLineLength=Math.max(R.length+z,this._longestLineLength);d.clearNode(this._messageBlock),this._messageBlock.setAttribute("aria-label",this.getAriaLabel(x)),this._editor.applyFontInfo(this._messageBlock);let j=this._messageBlock;for(const R of U)j=document.createElement("div"),j.innerText=R,R===""&&(j.style.height=this._messageBlock.style.lineHeight),this._messageBlock.appendChild(j);if(W||H){const R=document.createElement("span");if(R.classList.add("details"),j.appendChild(R),W){const J=document.createElement("span");J.innerText=W,J.classList.add("source"),R.appendChild(J)}if(H)if(typeof H=="string"){const J=document.createElement("span");J.innerText=`(${H})`,J.classList.add("code"),R.appendChild(J)}else{this._codeLink=d.$("a.code-link"),this._codeLink.setAttribute("href",`${H.target.toString()}`),this._codeLink.onclick=ie=>{this._openerService.open(H.target,{allowCommands:!0}),ie.preventDefault(),ie.stopPropagation()};const J=d.append(this._codeLink,d.$("span"));J.innerText=H.value,R.appendChild(this._codeLink)}}if(d.clearNode(this._relatedBlock),this._editor.applyFontInfo(this._relatedBlock),(0,I.isNonEmptyArray)(q)){const R=this._relatedBlock.appendChild(document.createElement("div"));R.style.paddingTop=`${Math.floor(this._editor.getOption(67)*.66)}px`,this._lines+=1;for(const J of q){const ie=document.createElement("div"),ue=document.createElement("a");ue.classList.add("filename"),ue.innerText=`${this._labelService.getUriBasenameLabel(J.resource)}(${J.startLineNumber}, ${J.startColumn}): `,ue.title=this._labelService.getUriLabel(J.resource),this._relatedDiagnostics.set(ue,J);const he=document.createElement("span");he.innerText=J.message,ie.appendChild(ue),ie.appendChild(he),this._lines+=1,R.appendChild(ie)}}const Y=this._editor.getOption(50),G=Math.ceil(Y.typicalFullwidthCharacterWidth*this._longestLineLength*.75),K=Y.lineHeight*this._lines;this._scrollable.setScrollDimensions({scrollWidth:G,scrollHeight:K})}layout(x,W){this._scrollable.getDomNode().style.height=`${x}px`,this._scrollable.getDomNode().style.width=`${W}px`,this._scrollable.setScrollDimensions({width:W,height:x})}getHeightInLines(){return Math.min(17,this._lines)}getAriaLabel(x){let W="";switch(x.severity){case l.MarkerSeverity.Error:W=o.localize(932,"Error");break;case l.MarkerSeverity.Warning:W=o.localize(933,"Warning");break;case l.MarkerSeverity.Info:W=o.localize(934,"Info");break;case l.MarkerSeverity.Hint:W=o.localize(935,"Hint");break}let V=o.localize(936,"{0} at {1}. ",W,x.startLineNumber+":"+x.startColumn);const q=this._editor.getModel();return q&&x.startLineNumber<=q.getLineCount()&&x.startLineNumber>=1&&(V=`${q.getLineContent(x.startLineNumber)}, ${V}`),V}}let v=class extends n.PeekViewWidget{static{f=this}static{this.TitleMenu=new i.MenuId("gotoErrorTitleMenu")}constructor(x,W,V,q,H,z,U){super(x,{showArrow:!0,showFrame:!0,isAccessible:!0,frameWidth:1},H),this._themeService=W,this._openerService=V,this._menuService=q,this._contextKeyService=z,this._labelService=U,this._callOnDispose=new m.DisposableStore,this._onDidSelectRelatedInformation=new y.Emitter,this.onDidSelectRelatedInformation=this._onDidSelectRelatedInformation.event,this._severity=l.MarkerSeverity.Warning,this._backgroundColor=E.Color.white,this._applyTheme(W.getColorTheme()),this._callOnDispose.add(W.onDidColorThemeChange(this._applyTheme.bind(this))),this.create()}_applyTheme(x){this._backgroundColor=x.getColor(O);let W=D,V=T;this._severity===l.MarkerSeverity.Warning?(W=M,V=A):this._severity===l.MarkerSeverity.Info&&(W=P,V=N);const q=x.getColor(W),H=x.getColor(V);this.style({arrowColor:q,frameColor:q,headerBackgroundColor:H,primaryHeadingColor:x.getColor(n.peekViewTitleForeground),secondaryHeadingColor:x.getColor(n.peekViewTitleInfoForeground)})}_applyStyles(){this._parentContainer&&(this._parentContainer.style.backgroundColor=this._backgroundColor?this._backgroundColor.toString():""),super._applyStyles()}dispose(){this._callOnDispose.dispose(),super.dispose()}_fillHead(x){super._fillHead(x),this._disposables.add(this._actionbarWidget.actionRunner.onWillRun(q=>this.editor.focus()));const W=[],V=this._menuService.getMenuActions(f.TitleMenu,this._contextKeyService);(0,t.createAndFillInActionBarActions)(V,W),this._actionbarWidget.push(W,{label:!1,icon:!0,index:0})}_fillTitleIcon(x){this._icon=d.append(x,d.$(""))}_fillBody(x){this._parentContainer=x,x.classList.add("marker-widget"),this._parentContainer.tabIndex=0,this._parentContainer.setAttribute("role","tooltip"),this._container=document.createElement("div"),x.appendChild(this._container),this._message=new h(this._container,this.editor,W=>this._onDidSelectRelatedInformation.fire(W),this._openerService,this._labelService),this._disposables.add(this._message)}show(){throw new Error("call showAtMarker")}showAtMarker(x,W,V){this._container.classList.remove("stale"),this._message.update(x),this._severity=x.severity,this._applyTheme(this._themeService.getColorTheme());const q=p.Range.lift(x),H=this.editor.getPosition(),z=H&&q.containsPosition(H)?H:q.getStartPosition();super.show(z,this.computeRequiredHeight());const U=this.editor.getModel();if(U){const j=V>1?o.localize(937,"{0} of {1} problems",W,V):o.localize(938,"{0} of {1} problem",W,V);this.setTitle((0,_.basename)(U.uri),j)}this._icon.className=`codicon ${r.SeverityIcon.className(l.MarkerSeverity.toSeverity(this._severity))}`,this.editor.revealPositionNearTop(z,0),this.editor.focus()}updateMarker(x){this._container.classList.remove("stale"),this._message.update(x)}showStale(){this._container.classList.add("stale"),this._relayout()}_doLayoutBody(x,W){super._doLayoutBody(x,W),this._heightInPixel=x,this._message.layout(x,W),this._container.style.height=`${x}px`}_onWidth(x){this._message.layout(this._heightInPixel,x)}_relayout(){super._relayout(this.computeRequiredHeight())}computeRequiredHeight(){return 3+this._message.getHeightInLines()}};e.MarkerNavigationWidget=v,e.MarkerNavigationWidget=v=f=ke([ce(1,C.IThemeService),ce(2,a.IOpenerService),ce(3,i.IMenuService),ce(4,g.IInstantiationService),ce(5,s.IContextKeyService),ce(6,c.ILabelService)],v);const w=(0,u.oneOf)(u.editorErrorForeground,u.editorErrorBorder),S=(0,u.oneOf)(u.editorWarningForeground,u.editorWarningBorder),L=(0,u.oneOf)(u.editorInfoForeground,u.editorInfoBorder),D=(0,u.registerColor)("editorMarkerNavigationError.background",{dark:w,light:w,hcDark:u.contrastBorder,hcLight:u.contrastBorder},o.localize(939,"Editor marker navigation widget error color.")),T=(0,u.registerColor)("editorMarkerNavigationError.headerBackground",{dark:(0,u.transparent)(D,.1),light:(0,u.transparent)(D,.1),hcDark:null,hcLight:null},o.localize(940,"Editor marker navigation widget error heading background.")),M=(0,u.registerColor)("editorMarkerNavigationWarning.background",{dark:S,light:S,hcDark:u.contrastBorder,hcLight:u.contrastBorder},o.localize(941,"Editor marker navigation widget warning color.")),A=(0,u.registerColor)("editorMarkerNavigationWarning.headerBackground",{dark:(0,u.transparent)(M,.1),light:(0,u.transparent)(M,.1),hcDark:"#0C141F",hcLight:(0,u.transparent)(M,.2)},o.localize(942,"Editor marker navigation widget warning heading background.")),P=(0,u.registerColor)("editorMarkerNavigationInfo.background",{dark:L,light:L,hcDark:u.contrastBorder,hcLight:u.contrastBorder},o.localize(943,"Editor marker navigation widget info color.")),N=(0,u.registerColor)("editorMarkerNavigationInfo.headerBackground",{dark:(0,u.transparent)(P,.1),light:(0,u.transparent)(P,.1),hcDark:null,hcLight:null},o.localize(944,"Editor marker navigation widget info heading background.")),O=(0,u.registerColor)("editorMarkerNavigation.background",u.editorBackground,o.localize(945,"Editor marker navigation widget background."))}),define(ne[427],se([1,0,26,2,15,34,9,4,20,698,3,29,12,7,71,843]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s){"use strict";var g;Object.defineProperty(e,"__esModule",{value:!0}),e.NextMarkerAction=e.MarkerController=void 0;let c=class{static{g=this}static{this.ID="editor.contrib.markerController"}static get(w){return w.getContribution(g.ID)}constructor(w,S,L,D,T){this._markerNavigationService=S,this._contextKeyService=L,this._editorService=D,this._instantiationService=T,this._sessionDispoables=new k.DisposableStore,this._editor=w,this._widgetVisible=f.bindTo(this._contextKeyService)}dispose(){this._cleanUp(),this._sessionDispoables.dispose()}_cleanUp(){this._widgetVisible.reset(),this._sessionDispoables.clear(),this._widget=void 0,this._model=void 0}_getOrCreateModel(w){if(this._model&&this._model.matches(w))return this._model;let S=!1;return this._model&&(S=!0,this._cleanUp()),this._model=this._markerNavigationService.getMarkerList(w),S&&this._model.move(!0,this._editor.getModel(),this._editor.getPosition()),this._widget=this._instantiationService.createInstance(s.MarkerNavigationWidget,this._editor),this._widget.onDidClose(()=>this.close(),this,this._sessionDispoables),this._widgetVisible.set(!0),this._sessionDispoables.add(this._model),this._sessionDispoables.add(this._widget),this._sessionDispoables.add(this._editor.onDidChangeCursorPosition(L=>{(!this._model?.selected||!m.Range.containsPosition(this._model?.selected.marker,L.position))&&this._model?.resetIndex()})),this._sessionDispoables.add(this._model.onDidChange(()=>{if(!this._widget||!this._widget.position||!this._model)return;const L=this._model.find(this._editor.getModel().uri,this._widget.position);L?this._widget.updateMarker(L.marker):this._widget.showStale()})),this._sessionDispoables.add(this._widget.onDidSelectRelatedInformation(L=>{this._editorService.openCodeEditor({resource:L.resource,options:{pinned:!0,revealIfOpened:!0,selection:m.Range.lift(L).collapseToStart()}},this._editor),this.close(!1)})),this._sessionDispoables.add(this._editor.onDidChangeModel(()=>this._cleanUp())),this._model}close(w=!0){this._cleanUp(),w&&this._editor.focus()}showAtMarker(w){if(this._editor.hasModel()){const S=this._getOrCreateModel(this._editor.getModel().uri);S.resetIndex(),S.move(!0,this._editor.getModel(),new y.Position(w.startLineNumber,w.startColumn)),S.selected&&this._widget.showAtMarker(S.selected.marker,S.selected.index,S.selected.total)}}async nagivate(w,S){if(this._editor.hasModel()){const L=this._getOrCreateModel(S?void 0:this._editor.getModel().uri);if(L.move(w,this._editor.getModel(),this._editor.getPosition()),!L.selected)return;if(L.selected.marker.resource.toString()!==this._editor.getModel().uri.toString()){this._cleanUp();const D=await this._editorService.openCodeEditor({resource:L.selected.marker.resource,options:{pinned:!1,revealIfOpened:!0,selectionRevealType:2,selection:L.selected.marker}},this._editor);D&&(g.get(D)?.close(),g.get(D)?.nagivate(w,S))}else this._widget.showAtMarker(L.selected.marker,L.selected.index,L.selected.total)}}};e.MarkerController=c,e.MarkerController=c=g=ke([ce(1,b.IMarkerNavigationService),ce(2,o.IContextKeyService),ce(3,E.ICodeEditorService),ce(4,t.IInstantiationService)],c);class l extends I.EditorAction{constructor(w,S,L){super(L),this._next=w,this._multiFile=S}async run(w,S){S.hasModel()&&c.get(S)?.nagivate(this._next,this._multiFile)}}class a extends l{static{this.ID="editor.action.marker.next"}static{this.LABEL=p.localize(924,"Go to Next Problem (Error, Warning, Info)")}constructor(){super(!0,!1,{id:a.ID,label:a.LABEL,alias:"Go to Next Problem (Error, Warning, Info)",precondition:void 0,kbOpts:{kbExpr:_.EditorContextKeys.focus,primary:578,weight:100},menuOpts:{menuId:s.MarkerNavigationWidget.TitleMenu,title:a.LABEL,icon:(0,i.registerIcon)("marker-navigation-next",d.Codicon.arrowDown,p.localize(925,"Icon for goto next marker.")),group:"navigation",order:1}})}}e.NextMarkerAction=a;class r extends l{static{this.ID="editor.action.marker.prev"}static{this.LABEL=p.localize(926,"Go to Previous Problem (Error, Warning, Info)")}constructor(){super(!1,!1,{id:r.ID,label:r.LABEL,alias:"Go to Previous Problem (Error, Warning, Info)",precondition:void 0,kbOpts:{kbExpr:_.EditorContextKeys.focus,primary:1602,weight:100},menuOpts:{menuId:s.MarkerNavigationWidget.TitleMenu,title:r.LABEL,icon:(0,i.registerIcon)("marker-navigation-previous",d.Codicon.arrowUp,p.localize(927,"Icon for goto previous marker.")),group:"navigation",order:2}})}}class u extends l{constructor(){super(!0,!0,{id:"editor.action.marker.nextInFiles",label:p.localize(928,"Go to Next Problem in Files (Error, Warning, Info)"),alias:"Go to Next Problem in Files (Error, Warning, Info)",precondition:void 0,kbOpts:{kbExpr:_.EditorContextKeys.focus,primary:66,weight:100},menuOpts:{menuId:n.MenuId.MenubarGoMenu,title:p.localize(929,"Next &&Problem"),group:"6_problem_nav",order:1}})}}class C extends l{constructor(){super(!1,!0,{id:"editor.action.marker.prevInFiles",label:p.localize(930,"Go to Previous Problem in Files (Error, Warning, Info)"),alias:"Go to Previous Problem in Files (Error, Warning, Info)",precondition:void 0,kbOpts:{kbExpr:_.EditorContextKeys.focus,primary:1090,weight:100},menuOpts:{menuId:n.MenuId.MenubarGoMenu,title:p.localize(931,"Previous &&Problem"),group:"6_problem_nav",order:2}})}}(0,I.registerEditorContribution)(c.ID,c,4),(0,I.registerEditorAction)(a),(0,I.registerEditorAction)(r),(0,I.registerEditorAction)(u),(0,I.registerEditorAction)(C);const f=new o.RawContextKey("markersNavigationVisible",!1),h=I.EditorCommand.bindToContribution(c.get);(0,I.registerEditorCommand)(new h({id:"closeMarkersNavigation",precondition:f,handler:v=>v.close(),kbOpts:{weight:150,kbExpr:_.EditorContextKeys.focus,primary:9,secondary:[1033]}}))}),define(ne[844],se([1,0,5,357,33,6,2,42,48,125,4,35,70,78,758,158,3,7,31,181,216,25,178,514]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReferenceWidget=e.LayoutData=void 0;class f{static{this.DecorationOptions=n.ModelDecorationOptions.register({description:"reference-decoration",stickiness:1,className:"reference-decoration"})}constructor(L,D){this._editor=L,this._model=D,this._decorations=new Map,this._decorationIgnoreSet=new Set,this._callOnDispose=new y.DisposableStore,this._callOnModelChange=new y.DisposableStore,this._callOnDispose.add(this._editor.onDidChangeModel(()=>this._onModelChanged())),this._onModelChanged()}dispose(){this._callOnModelChange.dispose(),this._callOnDispose.dispose(),this.removeDecorations()}_onModelChanged(){this._callOnModelChange.clear();const L=this._editor.getModel();if(L){for(const D of this._model.references)if(D.uri.toString()===L.uri.toString()){this._addDecorations(D.parent);return}}}_addDecorations(L){if(!this._editor.hasModel())return;this._callOnModelChange.add(this._editor.getModel().onDidChangeDecorations(()=>this._onDecorationChanged()));const D=[],T=[];for(let M=0,A=L.children.length;M{const A=M.deltaDecorations([],D);for(let P=0;P{A.equals(9)&&(this._keybindingService.dispatchEvent(A,A.target),A.stopPropagation())},!0)),this._tree=this._instantiationService.createInstance(v,"ReferencesWidget",this._treeContainer,new i.Delegate,[this._instantiationService.createInstance(i.FileReferencesRenderer),this._instantiationService.createInstance(i.OneReferenceRenderer)],this._instantiationService.createInstance(i.DataSource),T),this._splitView.addView({onDidChange:E.Event.None,element:this._previewContainer,minimumSize:200,maximumSize:Number.MAX_VALUE,layout:A=>{this._preview.layout({height:this._dim.height,width:A})}},k.Sizing.Distribute),this._splitView.addView({onDidChange:E.Event.None,element:this._treeContainer,minimumSize:100,maximumSize:Number.MAX_VALUE,layout:A=>{this._treeContainer.style.height=`${this._dim.height}px`,this._treeContainer.style.width=`${A}px`,this._tree.layout(this._dim.height,A)}},k.Sizing.Distribute),this._disposables.add(this._splitView.onDidSashChange(()=>{this._dim.width&&(this.layoutData.ratio=this._splitView.getViewSize(0)/this._dim.width)},void 0));const M=(A,P)=>{A instanceof C.OneReference&&(P==="show"&&this._revealReference(A,!1),this._onDidSelectReference.fire({element:A,kind:P,source:"tree"}))};this._disposables.add(this._tree.onDidOpen(A=>{A.sideBySide?M(A.element,"side"):A.editorOptions.pinned?M(A.element,"goto"):M(A.element,"show")})),d.hide(this._treeContainer)}_onWidth(L){this._dim&&this._doLayoutBody(this._dim.height,L)}_doLayoutBody(L,D){super._doLayoutBody(L,D),this._dim=new d.Dimension(D,L),this.layoutData.heightInLines=this._viewZone?this._viewZone.heightInLines:this.layoutData.heightInLines,this._splitView.layout(D),this._splitView.resizeView(0,D*this.layoutData.ratio)}setSelection(L){return this._revealReference(L,!0).then(()=>{this._model&&(this._tree.setSelection([L]),this._tree.setFocus([L]))})}setModel(L){return this._disposeOnNewModel.clear(),this._model=L,this._model?this._onNewModel():Promise.resolve()}_onNewModel(){return this._model?this._model.isEmpty?(this.setTitle(""),this._messageContainer.innerText=g.localize(993,"No results"),d.show(this._messageContainer),Promise.resolve(void 0)):(d.hide(this._messageContainer),this._decorationsManager=new f(this._preview,this._model),this._disposeOnNewModel.add(this._decorationsManager),this._disposeOnNewModel.add(this._model.onDidChangeReferenceRange(L=>this._tree.rerender(L))),this._disposeOnNewModel.add(this._preview.onMouseDown(L=>{const{event:D,target:T}=L;if(D.detail!==2)return;const M=this._getFocusedReference();M&&this._onDidSelectReference.fire({element:{uri:M.uri,range:T.range},kind:D.ctrlKey||D.metaKey||D.altKey?"side":"open",source:"editor"})})),this.container.classList.add("results-loaded"),d.show(this._treeContainer),d.show(this._previewContainer),this._splitView.layout(this._dim.width),this.focusOnReferenceTree(),this._tree.setInput(this._model.groups.length===1?this._model.groups[0]:this._model)):Promise.resolve(void 0)}_getFocusedReference(){const[L]=this._tree.getFocus();if(L instanceof C.OneReference)return L;if(L instanceof C.FileReferences&&L.children.length>0)return L.children[0]}async revealReference(L){await this._revealReference(L,!1),this._onDidSelectReference.fire({element:L,kind:"goto",source:"tree"})}async _revealReference(L,D){if(this._revealedReference===L)return;this._revealedReference=L,L.uri.scheme!==m.Schemas.inMemory?this.setTitle((0,_.basenameOrAuthority)(L.uri),this._uriLabel.getUriLabel((0,_.dirname)(L.uri))):this.setTitle(g.localize(994,"References"));const T=this._textModelResolverService.createModelReference(L.uri);this._tree.getInput()===L.parent?this._tree.reveal(L):(D&&this._tree.reveal(L.parent),await this._tree.expand(L.parent),this._tree.reveal(L));const M=await T;if(!this._model){M.dispose();return}(0,y.dispose)(this._previewModelReference);const A=M.object;if(A){const P=this._preview.getModel()===A.textEditorModel?0:1,N=p.Range.lift(L.range).collapseToStart();this._previewModelReference=M,this._preview.setModel(A.textEditorModel),this._preview.setSelection(N),this._preview.revealRangeInCenter(N,P)}else this._preview.setModel(this._previewNotAvailableMessage),M.dispose()}};e.ReferenceWidget=w,e.ReferenceWidget=w=ke([ce(3,u.IThemeService),ce(4,t.ITextModelService),ce(5,c.IInstantiationService),ce(6,s.IPeekViewService),ce(7,a.ILabelService),ce(8,l.IKeybindingService)],w)}),define(ne[428],se([1,0,14,8,72,2,34,9,4,158,3,24,28,12,7,121,216,50,101,178,844,20,179]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C){"use strict";var f;Object.defineProperty(e,"__esModule",{value:!0}),e.ReferencesController=e.ctxReferenceSearchVisible=void 0,e.ctxReferenceSearchVisible=new t.RawContextKey("referenceSearchVisible",!1,p.localize(986,"Whether reference peek is visible, like 'Peek References' or 'Peek Definition'"));let h=class{static{f=this}static{this.ID="editor.contrib.referencesController"}static get(S){return S.getContribution(f.ID)}constructor(S,L,D,T,M,A,P,N){this._defaultTreeKeyboardSupport=S,this._editor=L,this._editorService=T,this._notificationService=M,this._instantiationService=A,this._storageService=P,this._configurationService=N,this._disposables=new E.DisposableStore,this._requestIdPool=0,this._ignoreModelChangeEvent=!1,this._referenceSearchVisible=e.ctxReferenceSearchVisible.bindTo(D)}dispose(){this._referenceSearchVisible.reset(),this._disposables.dispose(),this._widget?.dispose(),this._model?.dispose(),this._widget=void 0,this._model=void 0}toggleWidget(S,L,D){let T;if(this._widget&&(T=this._widget.position),this.closeWidget(),T&&S.containsPosition(T))return;this._peekMode=D,this._referenceSearchVisible.set(!0),this._disposables.add(this._editor.onDidChangeModelLanguage(()=>{this.closeWidget()})),this._disposables.add(this._editor.onDidChangeModel(()=>{this._ignoreModelChangeEvent||this.closeWidget()}));const M="peekViewLayout",A=r.LayoutData.fromJSON(this._storageService.get(M,0,"{}"));this._widget=this._instantiationService.createInstance(r.ReferenceWidget,this._editor,this._defaultTreeKeyboardSupport,A),this._widget.setTitle(p.localize(987,"Loading...")),this._widget.show(S),this._disposables.add(this._widget.onDidClose(()=>{L.cancel(),this._widget?(this._storageService.store(M,JSON.stringify(this._widget.layoutData),0,1),this._widget.isClosing||this.closeWidget(),this._widget=void 0):this.closeWidget()})),this._disposables.add(this._widget.onDidSelectReference(N=>{const{element:O,kind:F}=N;if(O)switch(F){case"open":(N.source!=="editor"||!this._configurationService.getValue("editor.stablePeek"))&&this.openReference(O,!1,!1);break;case"side":this.openReference(O,!0,!1);break;case"goto":D?this._gotoReference(O,!0):this.openReference(O,!1,!0);break}}));const P=++this._requestIdPool;L.then(N=>{if(P!==this._requestIdPool||!this._widget){N.dispose();return}return this._model?.dispose(),this._model=N,this._widget.setModel(this._model).then(()=>{if(this._widget&&this._model&&this._editor.hasModel()){this._model.isEmpty?this._widget.setMetaTitle(""):this._widget.setMetaTitle(p.localize(988,"{0} ({1})",this._model.title,this._model.references.length));const O=this._editor.getModel().uri,F=new m.Position(S.startLineNumber,S.startColumn),x=this._model.nearestReference(O,F);if(x)return this._widget.setSelection(x).then(()=>{this._widget&&this._editor.getOption(87)==="editor"&&this._widget.focusOnPreviewEditor()})}})},N=>{this._notificationService.error(N)})}changeFocusBetweenPreviewAndReferences(){this._widget&&(this._widget.isPreviewEditorFocused()?this._widget.focusOnReferenceTree():this._widget.focusOnPreviewEditor())}async goToNextOrPreviousReference(S){if(!this._editor.hasModel()||!this._model||!this._widget)return;const L=this._widget.position;if(!L)return;const D=this._model.nearestReference(this._editor.getModel().uri,L);if(!D)return;const T=this._model.nextOrPreviousReference(D,S),M=this._editor.hasTextFocus(),A=this._widget.isPreviewEditorFocused();await this._widget.setSelection(T),await this._gotoReference(T,!1),M?this._editor.focus():this._widget&&A&&this._widget.focusOnPreviewEditor()}async revealReference(S){!this._editor.hasModel()||!this._model||!this._widget||await this._widget.revealReference(S)}closeWidget(S=!0){this._widget?.dispose(),this._model?.dispose(),this._referenceSearchVisible.reset(),this._disposables.clear(),this._widget=void 0,this._model=void 0,S&&this._editor.focus(),this._requestIdPool+=1}_gotoReference(S,L){this._widget?.hide(),this._ignoreModelChangeEvent=!0;const D=_.Range.lift(S.range).collapseToStart();return this._editorService.openCodeEditor({resource:S.uri,options:{selection:D,selectionSource:"code.jump",pinned:L}},this._editor).then(T=>{if(this._ignoreModelChangeEvent=!1,!T||!this._widget){this.closeWidget();return}if(this._editor===T)this._widget.show(D),this._widget.focusOnReferenceTree();else{const M=f.get(T),A=this._model.clone();this.closeWidget(),T.focus(),M?.toggleWidget(D,(0,d.createCancelablePromise)(P=>Promise.resolve(A)),this._peekMode??!1)}},T=>{this._ignoreModelChangeEvent=!1,(0,k.onUnexpectedError)(T)})}openReference(S,L,D){L||this.closeWidget();const{uri:T,range:M}=S;this._editorService.openCodeEditor({resource:T,options:{selection:M,selectionSource:"code.jump",pinned:D}},this._editor,L)}};e.ReferencesController=h,e.ReferencesController=h=f=ke([ce(2,t.IContextKeyService),ce(3,y.ICodeEditorService),ce(4,c.INotificationService),ce(5,i.IInstantiationService),ce(6,l.IStorageService),ce(7,o.IConfigurationService)],h);function v(w,S){const L=(0,b.getOuterEditor)(w);if(!L)return;const D=h.get(L);D&&S(D)}s.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"togglePeekWidgetFocus",weight:100,primary:(0,I.KeyChord)(2089,60),when:t.ContextKeyExpr.or(e.ctxReferenceSearchVisible,b.PeekContext.inPeekEditor),handler(w){v(w,S=>{S.changeFocusBetweenPreviewAndReferences()})}}),s.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"goToNextReference",weight:90,primary:62,secondary:[70],when:t.ContextKeyExpr.or(e.ctxReferenceSearchVisible,b.PeekContext.inPeekEditor),handler(w){v(w,S=>{S.goToNextOrPreviousReference(!0)})}}),s.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"goToPreviousReference",weight:90,primary:1086,secondary:[1094],when:t.ContextKeyExpr.or(e.ctxReferenceSearchVisible,b.PeekContext.inPeekEditor),handler(w){v(w,S=>{S.goToNextOrPreviousReference(!1)})}}),n.CommandsRegistry.registerCommandAlias("goToNextReferenceFromEmbeddedEditor","goToNextReference"),n.CommandsRegistry.registerCommandAlias("goToPreviousReferenceFromEmbeddedEditor","goToPreviousReference"),n.CommandsRegistry.registerCommandAlias("closeReferenceSearchEditor","closeReferenceSearch"),n.CommandsRegistry.registerCommand("closeReferenceSearch",w=>v(w,S=>S.closeWidget())),s.KeybindingsRegistry.registerKeybindingRule({id:"closeReferenceSearch",weight:-1,primary:9,secondary:[1033],when:t.ContextKeyExpr.and(b.PeekContext.inPeekEditor,t.ContextKeyExpr.not("config.editor.stablePeek"))}),s.KeybindingsRegistry.registerKeybindingRule({id:"closeReferenceSearch",weight:250,primary:9,secondary:[1033],when:t.ContextKeyExpr.and(e.ctxReferenceSearchVisible,t.ContextKeyExpr.not("config.editor.stablePeek"),t.ContextKeyExpr.or(u.EditorContextKeys.editorTextFocus,C.InputFocusedContext.negate()))}),s.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"revealReference",weight:200,primary:3,mac:{primary:3,secondary:[2066]},when:t.ContextKeyExpr.and(e.ctxReferenceSearchVisible,g.WorkbenchListFocusContextKey,g.WorkbenchTreeElementCanCollapse.negate(),g.WorkbenchTreeElementCanExpand.negate()),handler(w){const L=w.get(g.IListService).lastFocusedList?.getFocus();Array.isArray(L)&&L[0]instanceof a.OneReference&&v(w,D=>D.revealReference(L[0]))}}),s.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"openReferenceToSide",weight:100,primary:2051,mac:{primary:259},when:t.ContextKeyExpr.and(e.ctxReferenceSearchVisible,g.WorkbenchListFocusContextKey,g.WorkbenchTreeElementCanCollapse.negate(),g.WorkbenchTreeElementCanExpand.negate()),handler(w){const L=w.get(g.IListService).lastFocusedList?.getFocus();Array.isArray(L)&&L[0]instanceof a.OneReference&&v(w,D=>D.openReference(L[0],!0,!0))}}),n.CommandsRegistry.registerCommand("openReference",w=>{const L=w.get(g.IListService).lastFocusedList?.getFocus();Array.isArray(L)&&L[0]instanceof a.OneReference&&v(w,D=>D.openReference(L[0],!1,!0))})}),define(ne[291],se([1,0,46,14,72,19,22,122,168,15,34,125,9,4,20,27,428,178,736,184,158,3,29,24,12,7,50,96,277,17,53,179]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S,L,D,T,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DefinitionAction=e.SymbolNavigationAction=e.SymbolNavigationAnchor=void 0,C.MenuRegistry.appendMenuItem(C.MenuId.EditorContext,{submenu:C.MenuId.EditorContextPeek,title:u.localize(946,"Peek"),group:"navigation",order:100});class A{static is(H){return!H||typeof H!="object"?!1:!!(H instanceof A||o.Position.isIPosition(H.position)&&H.model)}constructor(H,z){this.model=H,this.position=z}}e.SymbolNavigationAnchor=A;class P extends b.EditorAction2{static{this._allSymbolNavigationCommands=new Map}static{this._activeAlternativeCommands=new Set}static all(){return P._allSymbolNavigationCommands.values()}static _patchConfig(H){const z={...H,f1:!0};if(z.menu)for(const U of T.Iterable.wrap(z.menu))(U.id===C.MenuId.EditorContext||U.id===C.MenuId.EditorContextPeek)&&(U.when=h.ContextKeyExpr.and(H.precondition,U.when));return z}constructor(H,z){super(P._patchConfig(z)),this.configuration=H,P._allSymbolNavigationCommands.set(z.id,this)}runEditorCommand(H,z,U,j){if(!z.hasModel())return Promise.resolve(void 0);const Y=H.get(w.INotificationService),G=H.get(p.ICodeEditorService),K=H.get(S.IEditorProgressService),R=H.get(l.ISymbolNavigationService),J=H.get(D.ILanguageFeaturesService),ie=H.get(v.IInstantiationService),ue=z.getModel(),he=z.getPosition(),pe=A.is(U)?U:new A(ue,he),ae=new m.EditorStateCancellationTokenSource(z,5),ee=(0,k.raceCancellation)(this._getLocationModel(J,pe.model,pe.position,ae.token),ae.token).then(async de=>{if(!de||ae.token.isCancellationRequested)return;(0,d.alert)(de.ariaMessage);let ge;if(de.referenceAt(ue.uri,he)){const B=this._getAlternativeCommand(z);!P._activeAlternativeCommands.has(B)&&P._allSymbolNavigationCommands.has(B)&&(ge=P._allSymbolNavigationCommands.get(B))}const X=de.references.length;if(X===0){if(!this.configuration.muteMessage){const B=ue.getWordAtPosition(he);a.MessageController.get(z)?.showMessage(this._getNoResultFoundMessage(B),he)}}else if(X===1&&ge)P._activeAlternativeCommands.add(this.desc.id),ie.invokeFunction(B=>ge.runEditorCommand(B,z,U,j).finally(()=>{P._activeAlternativeCommands.delete(this.desc.id)}));else return this._onResult(G,R,z,de,j)},de=>{Y.error(de)}).finally(()=>{ae.dispose()});return K.showWhile(ee,250),ee}async _onResult(H,z,U,j,Y){const G=this._getGoToPreference(U);if(!(U instanceof n.EmbeddedCodeEditorWidget)&&(this.configuration.openInPeek||G==="peek"&&j.references.length>1))this._openInPeek(U,j,Y);else{const K=j.firstReference(),R=j.references.length>1&&G==="gotoAndPeek",J=await this._openReference(U,H,K,this.configuration.openToSide,!R);R&&J?this._openInPeek(J,j,Y):j.dispose(),G==="goto"&&z.put(K)}}async _openReference(H,z,U,j,Y){let G;if((0,s.isLocationLink)(U)&&(G=U.targetSelectionRange),G||(G=U.range),!G)return;const K=await z.openCodeEditor({resource:U.uri,options:{selection:t.Range.collapseToStart(G),selectionRevealType:3,selectionSource:"code.jump"}},H,j);if(K){if(Y){const R=K.getModel(),J=K.createDecorationsCollection([{range:G,options:{description:"symbol-navigate-action-highlight",className:"symbolHighlight"}}]);setTimeout(()=>{K.getModel()===R&&J.clear()},350)}return K}}_openInPeek(H,z,U){const j=g.ReferencesController.get(H);j&&H.hasModel()?j.toggleWidget(U??H.getSelection(),(0,k.createCancelablePromise)(Y=>Promise.resolve(z)),this.configuration.openInPeek):z.dispose()}}e.SymbolNavigationAction=P;class N extends P{async _getLocationModel(H,z,U,j){return new c.ReferencesModel(await(0,L.getDefinitionsAtPosition)(H.definitionProvider,z,U,!1,j),u.localize(947,"Definitions"))}_getNoResultFoundMessage(H){return H&&H.word?u.localize(948,"No definition found for '{0}'",H.word):u.localize(949,"No definition found")}_getAlternativeCommand(H){return H.getOption(58).alternativeDefinitionCommand}_getGoToPreference(H){return H.getOption(58).multipleDefinitions}}e.DefinitionAction=N,(0,C.registerAction2)(class Gt extends N{static{this.id="editor.action.revealDefinition"}constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:Gt.id,title:{...u.localize2(973,"Go to Definition"),mnemonicTitle:u.localize(950,"Go to &&Definition")},precondition:i.EditorContextKeys.hasDefinitionProvider,keybinding:[{when:i.EditorContextKeys.editorTextFocus,primary:70,weight:100},{when:h.ContextKeyExpr.and(i.EditorContextKeys.editorTextFocus,M.IsWebContext),primary:2118,weight:100}],menu:[{id:C.MenuId.EditorContext,group:"navigation",order:1.1},{id:C.MenuId.MenubarGoMenu,precondition:null,group:"4_symbol_nav",order:2}]}),f.CommandsRegistry.registerCommandAlias("editor.action.goToDeclaration",Gt.id)}}),(0,C.registerAction2)(class Yt extends N{static{this.id="editor.action.revealDefinitionAside"}constructor(){super({openToSide:!0,openInPeek:!1,muteMessage:!1},{id:Yt.id,title:u.localize2(974,"Open Definition to the Side"),precondition:h.ContextKeyExpr.and(i.EditorContextKeys.hasDefinitionProvider,i.EditorContextKeys.isInEmbeddedEditor.toNegated()),keybinding:[{when:i.EditorContextKeys.editorTextFocus,primary:(0,I.KeyChord)(2089,70),weight:100},{when:h.ContextKeyExpr.and(i.EditorContextKeys.editorTextFocus,M.IsWebContext),primary:(0,I.KeyChord)(2089,2118),weight:100}]}),f.CommandsRegistry.registerCommandAlias("editor.action.openDeclarationToTheSide",Yt.id)}}),(0,C.registerAction2)(class Qt extends N{static{this.id="editor.action.peekDefinition"}constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:Qt.id,title:u.localize2(975,"Peek Definition"),precondition:h.ContextKeyExpr.and(i.EditorContextKeys.hasDefinitionProvider,r.PeekContext.notInPeekEditor,i.EditorContextKeys.isInEmbeddedEditor.toNegated()),keybinding:{when:i.EditorContextKeys.editorTextFocus,primary:582,linux:{primary:3140},weight:100},menu:{id:C.MenuId.EditorContextPeek,group:"peek",order:2}}),f.CommandsRegistry.registerCommandAlias("editor.action.previewDeclaration",Qt.id)}});class O extends P{async _getLocationModel(H,z,U,j){return new c.ReferencesModel(await(0,L.getDeclarationsAtPosition)(H.declarationProvider,z,U,!1,j),u.localize(951,"Declarations"))}_getNoResultFoundMessage(H){return H&&H.word?u.localize(952,"No declaration found for '{0}'",H.word):u.localize(953,"No declaration found")}_getAlternativeCommand(H){return H.getOption(58).alternativeDeclarationCommand}_getGoToPreference(H){return H.getOption(58).multipleDeclarations}}(0,C.registerAction2)(class hi extends O{static{this.id="editor.action.revealDeclaration"}constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:hi.id,title:{...u.localize2(976,"Go to Declaration"),mnemonicTitle:u.localize(954,"Go to &&Declaration")},precondition:h.ContextKeyExpr.and(i.EditorContextKeys.hasDeclarationProvider,i.EditorContextKeys.isInEmbeddedEditor.toNegated()),menu:[{id:C.MenuId.EditorContext,group:"navigation",order:1.3},{id:C.MenuId.MenubarGoMenu,precondition:null,group:"4_symbol_nav",order:3}]})}_getNoResultFoundMessage(H){return H&&H.word?u.localize(955,"No declaration found for '{0}'",H.word):u.localize(956,"No declaration found")}}),(0,C.registerAction2)(class extends O{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:"editor.action.peekDeclaration",title:u.localize2(977,"Peek Declaration"),precondition:h.ContextKeyExpr.and(i.EditorContextKeys.hasDeclarationProvider,r.PeekContext.notInPeekEditor,i.EditorContextKeys.isInEmbeddedEditor.toNegated()),menu:{id:C.MenuId.EditorContextPeek,group:"peek",order:3}})}});class F extends P{async _getLocationModel(H,z,U,j){return new c.ReferencesModel(await(0,L.getTypeDefinitionsAtPosition)(H.typeDefinitionProvider,z,U,!1,j),u.localize(957,"Type Definitions"))}_getNoResultFoundMessage(H){return H&&H.word?u.localize(958,"No type definition found for '{0}'",H.word):u.localize(959,"No type definition found")}_getAlternativeCommand(H){return H.getOption(58).alternativeTypeDefinitionCommand}_getGoToPreference(H){return H.getOption(58).multipleTypeDefinitions}}(0,C.registerAction2)(class gi extends F{static{this.ID="editor.action.goToTypeDefinition"}constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:gi.ID,title:{...u.localize2(978,"Go to Type Definition"),mnemonicTitle:u.localize(960,"Go to &&Type Definition")},precondition:i.EditorContextKeys.hasTypeDefinitionProvider,keybinding:{when:i.EditorContextKeys.editorTextFocus,primary:0,weight:100},menu:[{id:C.MenuId.EditorContext,group:"navigation",order:1.4},{id:C.MenuId.MenubarGoMenu,precondition:null,group:"4_symbol_nav",order:3}]})}}),(0,C.registerAction2)(class fi extends F{static{this.ID="editor.action.peekTypeDefinition"}constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:fi.ID,title:u.localize2(979,"Peek Type Definition"),precondition:h.ContextKeyExpr.and(i.EditorContextKeys.hasTypeDefinitionProvider,r.PeekContext.notInPeekEditor,i.EditorContextKeys.isInEmbeddedEditor.toNegated()),menu:{id:C.MenuId.EditorContextPeek,group:"peek",order:4}})}});class x extends P{async _getLocationModel(H,z,U,j){return new c.ReferencesModel(await(0,L.getImplementationsAtPosition)(H.implementationProvider,z,U,!1,j),u.localize(961,"Implementations"))}_getNoResultFoundMessage(H){return H&&H.word?u.localize(962,"No implementation found for '{0}'",H.word):u.localize(963,"No implementation found")}_getAlternativeCommand(H){return H.getOption(58).alternativeImplementationCommand}_getGoToPreference(H){return H.getOption(58).multipleImplementations}}(0,C.registerAction2)(class mi extends x{static{this.ID="editor.action.goToImplementation"}constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:mi.ID,title:{...u.localize2(980,"Go to Implementations"),mnemonicTitle:u.localize(964,"Go to &&Implementations")},precondition:i.EditorContextKeys.hasImplementationProvider,keybinding:{when:i.EditorContextKeys.editorTextFocus,primary:2118,weight:100},menu:[{id:C.MenuId.EditorContext,group:"navigation",order:1.45},{id:C.MenuId.MenubarGoMenu,precondition:null,group:"4_symbol_nav",order:4}]})}}),(0,C.registerAction2)(class pi extends x{static{this.ID="editor.action.peekImplementation"}constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:pi.ID,title:u.localize2(981,"Peek Implementations"),precondition:h.ContextKeyExpr.and(i.EditorContextKeys.hasImplementationProvider,r.PeekContext.notInPeekEditor,i.EditorContextKeys.isInEmbeddedEditor.toNegated()),keybinding:{when:i.EditorContextKeys.editorTextFocus,primary:3142,weight:100},menu:{id:C.MenuId.EditorContextPeek,group:"peek",order:5}})}});class W extends P{_getNoResultFoundMessage(H){return H?u.localize(965,"No references found for '{0}'",H.word):u.localize(966,"No references found")}_getAlternativeCommand(H){return H.getOption(58).alternativeReferenceCommand}_getGoToPreference(H){return H.getOption(58).multipleReferences}}(0,C.registerAction2)(class extends W{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:"editor.action.goToReferences",title:{...u.localize2(982,"Go to References"),mnemonicTitle:u.localize(967,"Go to &&References")},precondition:h.ContextKeyExpr.and(i.EditorContextKeys.hasReferenceProvider,r.PeekContext.notInPeekEditor,i.EditorContextKeys.isInEmbeddedEditor.toNegated()),keybinding:{when:i.EditorContextKeys.editorTextFocus,primary:1094,weight:100},menu:[{id:C.MenuId.EditorContext,group:"navigation",order:1.45},{id:C.MenuId.MenubarGoMenu,precondition:null,group:"4_symbol_nav",order:5}]})}async _getLocationModel(H,z,U,j){return new c.ReferencesModel(await(0,L.getReferencesAtPosition)(H.referenceProvider,z,U,!0,!1,j),u.localize(968,"References"))}}),(0,C.registerAction2)(class extends W{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:"editor.action.referenceSearch.trigger",title:u.localize2(983,"Peek References"),precondition:h.ContextKeyExpr.and(i.EditorContextKeys.hasReferenceProvider,r.PeekContext.notInPeekEditor,i.EditorContextKeys.isInEmbeddedEditor.toNegated()),menu:{id:C.MenuId.EditorContextPeek,group:"peek",order:6}})}async _getLocationModel(H,z,U,j){return new c.ReferencesModel(await(0,L.getReferencesAtPosition)(H.referenceProvider,z,U,!1,!1,j),u.localize(969,"References"))}});class V extends P{constructor(H,z,U){super(H,{id:"editor.action.goToLocation",title:u.localize2(984,"Go to Any Symbol"),precondition:h.ContextKeyExpr.and(r.PeekContext.notInPeekEditor,i.EditorContextKeys.isInEmbeddedEditor.toNegated())}),this._references=z,this._gotoMultipleBehaviour=U}async _getLocationModel(H,z,U,j){return new c.ReferencesModel(this._references,u.localize(970,"Locations"))}_getNoResultFoundMessage(H){return H&&u.localize(971,"No results for '{0}'",H.word)||""}_getGoToPreference(H){return this._gotoMultipleBehaviour??H.getOption(58).multipleReferences}_getAlternativeCommand(){return""}}f.CommandsRegistry.registerCommand({id:"editor.action.goToLocations",metadata:{description:"Go to locations from a position in a file",args:[{name:"uri",description:"The text document in which to start",constraint:y.URI},{name:"position",description:"The position at which to start",constraint:o.Position.isIPosition},{name:"locations",description:"An array of locations.",constraint:Array},{name:"multiple",description:"Define what to do when having multiple results, either `peek`, `gotoAndPeek`, or `goto`"},{name:"noResultsMessage",description:"Human readable message that shows when locations is empty."}]},handler:async(q,H,z,U,j,Y,G)=>{(0,E.assertType)(y.URI.isUri(H)),(0,E.assertType)(o.Position.isIPosition(z)),(0,E.assertType)(Array.isArray(U)),(0,E.assertType)(typeof j>"u"||typeof j=="string"),(0,E.assertType)(typeof G>"u"||typeof G=="boolean");const K=q.get(p.ICodeEditorService),R=await K.openCodeEditor({resource:H},K.getFocusedCodeEditor());if((0,_.isCodeEditor)(R))return R.setPosition(z),R.revealPositionInCenterIfOutsideViewport(z,0),R.invokeWithinContext(J=>{const ie=new class extends V{_getNoResultFoundMessage(ue){return Y||super._getNoResultFoundMessage(ue)}}({muteMessage:!Y,openInPeek:!!G,openToSide:!1},U,j);J.get(v.IInstantiationService).invokeFunction(ie.run.bind(ie),R)})}}),f.CommandsRegistry.registerCommand({id:"editor.action.peekLocations",metadata:{description:"Peek locations from a position in a file",args:[{name:"uri",description:"The text document in which to start",constraint:y.URI},{name:"position",description:"The position at which to start",constraint:o.Position.isIPosition},{name:"locations",description:"An array of locations.",constraint:Array},{name:"multiple",description:"Define what to do when having multiple results, either `peek`, `gotoAndPeek`, or `goto`"}]},handler:async(q,H,z,U,j)=>{q.get(f.ICommandService).executeCommand("editor.action.goToLocations",H,z,U,j,void 0,!0)}}),f.CommandsRegistry.registerCommand({id:"editor.action.findReferences",handler:(q,H,z)=>{(0,E.assertType)(y.URI.isUri(H)),(0,E.assertType)(o.Position.isIPosition(z));const U=q.get(D.ILanguageFeaturesService),j=q.get(p.ICodeEditorService);return j.openCodeEditor({resource:H},j.getFocusedCodeEditor()).then(Y=>{if(!(0,_.isCodeEditor)(Y)||!Y.hasModel())return;const G=g.ReferencesController.get(Y);if(!G)return;const K=(0,k.createCancelablePromise)(J=>(0,L.getReferencesAtPosition)(U.referenceProvider,Y.getModel(),o.Position.lift(z),!1,!1,J).then(ie=>new c.ReferencesModel(ie,u.localize(972,"References")))),R=new t.Range(z.lineNumber,z.column,z.lineNumber,z.column);return Promise.resolve(G.toggleWidget(R,K,!1))})}}),f.CommandsRegistry.registerCommandAlias("editor.action.showReferences","editor.action.peekLocations")}),define(ne[429],se([1,0,14,8,57,2,122,15,4,43,78,209,158,3,12,291,277,17,35,513]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l){"use strict";var a;Object.defineProperty(e,"__esModule",{value:!0}),e.GotoDefinitionAtPositionEditorContribution=void 0;let r=class{static{a=this}static{this.ID="editor.contrib.gotodefinitionatposition"}static{this.MAX_SOURCE_PREVIEW_LINES=8}constructor(C,f,h,v){this.textModelResolverService=f,this.languageService=h,this.languageFeaturesService=v,this.toUnhook=new E.DisposableStore,this.toUnhookForKeyboard=new E.DisposableStore,this.currentWordAtPosition=null,this.previousPromise=null,this.editor=C,this.linkDecorations=this.editor.createDecorationsCollection();const w=new n.ClickLinkGesture(C);this.toUnhook.add(w),this.toUnhook.add(w.onMouseMoveOrRelevantKeyDown(([S,L])=>{this.startFindDefinitionFromMouse(S,L??void 0)})),this.toUnhook.add(w.onExecute(S=>{this.isEnabled(S)&&this.gotoDefinition(S.target.position,S.hasSideBySideModifier).catch(L=>{(0,k.onUnexpectedError)(L)}).finally(()=>{this.removeLinkDecorations()})})),this.toUnhook.add(w.onCancel(()=>{this.removeLinkDecorations(),this.currentWordAtPosition=null}))}static get(C){return C.getContribution(a.ID)}async startFindDefinitionFromCursor(C){await this.startFindDefinition(C),this.toUnhookForKeyboard.add(this.editor.onDidChangeCursorPosition(()=>{this.currentWordAtPosition=null,this.removeLinkDecorations(),this.toUnhookForKeyboard.clear()})),this.toUnhookForKeyboard.add(this.editor.onKeyDown(f=>{f&&(this.currentWordAtPosition=null,this.removeLinkDecorations(),this.toUnhookForKeyboard.clear())}))}startFindDefinitionFromMouse(C,f){if(C.target.type===9&&this.linkDecorations.length>0)return;if(!this.editor.hasModel()||!this.isEnabled(C,f)){this.currentWordAtPosition=null,this.removeLinkDecorations();return}const h=C.target.position;this.startFindDefinition(h)}async startFindDefinition(C){this.toUnhookForKeyboard.clear();const f=C?this.editor.getModel()?.getWordAtPosition(C):null;if(!f){this.currentWordAtPosition=null,this.removeLinkDecorations();return}if(this.currentWordAtPosition&&this.currentWordAtPosition.startColumn===f.startColumn&&this.currentWordAtPosition.endColumn===f.endColumn&&this.currentWordAtPosition.word===f.word)return;this.currentWordAtPosition=f;const h=new y.EditorState(this.editor,15);this.previousPromise&&(this.previousPromise.cancel(),this.previousPromise=null),this.previousPromise=(0,d.createCancelablePromise)(S=>this.findDefinition(C,S));let v;try{v=await this.previousPromise}catch(S){(0,k.onUnexpectedError)(S);return}if(!v||!v.length||!h.validate(this.editor)){this.removeLinkDecorations();return}const w=v[0].originSelectionRange?_.Range.lift(v[0].originSelectionRange):new _.Range(C.lineNumber,f.startColumn,C.lineNumber,f.endColumn);if(v.length>1){let S=w;for(const{originSelectionRange:L}of v)L&&(S=_.Range.plusRange(S,L));this.addDecoration(S,new I.MarkdownString().appendText(t.localize(985,"Click to show {0} definitions.",v.length)))}else{const S=v[0];if(!S.uri)return;this.textModelResolverService.createModelReference(S.uri).then(L=>{if(!L.object||!L.object.textEditorModel){L.dispose();return}const{object:{textEditorModel:D}}=L,{startLineNumber:T}=S.range;if(T<1||T>D.getLineCount()){L.dispose();return}const M=this.getPreviewValue(D,T,S),A=this.languageService.guessLanguageIdByFilepathOrFirstLine(D.uri);this.addDecoration(w,M?new I.MarkdownString().appendCodeblock(A||"",M):void 0),L.dispose()})}}getPreviewValue(C,f,h){let v=h.range;return v.endLineNumber-v.startLineNumber>=a.MAX_SOURCE_PREVIEW_LINES&&(v=this.getPreviewRangeBasedOnIndentation(C,f)),this.stripIndentationFromPreviewRange(C,f,v)}stripIndentationFromPreviewRange(C,f,h){let w=C.getLineFirstNonWhitespaceColumn(f);for(let L=f+1;L{const v=!f&&this.editor.getOption(89)&&!this.isInPeekEditor(h);return new s.DefinitionAction({openToSide:f,openInPeek:v,muteMessage:!0},{title:{value:"",original:""},id:"",precondition:void 0}).run(h)})}isInPeekEditor(C){const f=C.get(i.IContextKeyService);return o.PeekContext.inPeekEditor.getValue(f)}dispose(){this.toUnhook.dispose(),this.toUnhookForKeyboard.dispose()}};e.GotoDefinitionAtPositionEditorContribution=r,e.GotoDefinitionAtPositionEditorContribution=r=a=ke([ce(1,p.ITextModelService),ce(2,b.ILanguageService),ce(3,c.ILanguageFeaturesService)],r),(0,m.registerEditorContribution)(r.ID,r,2)}),define(ne[845],se([1,0,5,13,14,8,2,48,4,17,266,157,287,134,427,84,3,108,59,96]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarkerHoverParticipant=e.MarkerHover=void 0;const r=d.$;class u{constructor(v,w,S){this.owner=v,this.range=w,this.marker=S}isValidForHoverAnchor(v){return v.type===1&&this.range.startColumn<=v.range.startColumn&&this.range.endColumn>=v.range.endColumn}}e.MarkerHover=u;const C={type:1,filter:{include:t.CodeActionKind.QuickFix},triggerAction:t.CodeActionTriggerSource.QuickFixHover};let f=class{constructor(v,w,S,L){this._editor=v,this._markerDecorationsService=w,this._openerService=S,this._languageFeaturesService=L,this.hoverOrdinal=1,this.recentMarkerCodeActionsInfo=void 0}computeSync(v,w){if(!this._editor.hasModel()||v.type!==1&&!v.supportsMarkerHover)return[];const S=this._editor.getModel(),L=v.range.startLineNumber,D=S.getLineMaxColumn(L),T=[];for(const M of w){const A=M.range.startLineNumber===L?M.range.startColumn:1,P=M.range.endLineNumber===L?M.range.endColumn:D,N=this._markerDecorationsService.getMarker(S.uri,M);if(!N)continue;const O=new _.Range(v.range.startLineNumber,A,v.range.startLineNumber,P);T.push(new u(this,O,N))}return T}renderHoverParts(v,w){if(!w.length)return new s.RenderedHoverParts([]);const S=new y.DisposableStore,L=[];w.forEach(T=>{const M=this._renderMarkerHover(T);v.fragment.appendChild(M.hoverElement),L.push(M)});const D=w.length===1?w[0]:w.sort((T,M)=>c.MarkerSeverity.compare(T.marker.severity,M.marker.severity))[0];return this.renderMarkerStatusbar(v,D,S),new s.RenderedHoverParts(L)}_renderMarkerHover(v){const w=new y.DisposableStore,S=r("div.hover-row"),L=d.append(S,r("div.marker.hover-contents")),{source:D,message:T,code:M,relatedInformation:A}=v.marker;this._editor.applyFontInfo(L);const P=d.append(L,r("span"));if(P.style.whiteSpace="pre-wrap",P.innerText=T,D||M)if(M&&typeof M!="string"){const O=r("span");if(D){const V=d.append(O,r("span"));V.innerText=D}const F=d.append(O,r("a.code-link"));F.setAttribute("href",M.target.toString()),w.add(d.addDisposableListener(F,"click",V=>{this._openerService.open(M.target,{allowCommands:!0}),V.preventDefault(),V.stopPropagation()}));const x=d.append(F,r("span"));x.innerText=M.value;const W=d.append(L,O);W.style.opacity="0.6",W.style.paddingLeft="6px"}else{const O=d.append(L,r("span"));O.style.opacity="0.6",O.style.paddingLeft="6px",O.innerText=D&&M?`${D}(${M})`:D||`(${M})`}if((0,k.isNonEmptyArray)(A))for(const{message:O,resource:F,startLineNumber:x,startColumn:W}of A){const V=d.append(L,r("div"));V.style.marginTop="8px";const q=d.append(V,r("a"));q.innerText=`${(0,m.basename)(F)}(${x}, ${W}): `,q.style.cursor="pointer",w.add(d.addDisposableListener(q,"click",z=>{if(z.stopPropagation(),z.preventDefault(),this._openerService){const U={selection:{startLineNumber:x,startColumn:W}};this._openerService.open(F,{fromUserGesture:!0,editorOptions:U}).catch(E.onUnexpectedError)}}));const H=d.append(V,r("span"));H.innerText=O,this._editor.applyFontInfo(H)}return{hoverPart:v,hoverElement:S,dispose:()=>w.dispose()}}renderMarkerStatusbar(v,w,S){if(w.marker.severity===c.MarkerSeverity.Error||w.marker.severity===c.MarkerSeverity.Warning||w.marker.severity===c.MarkerSeverity.Info){const L=i.MarkerController.get(this._editor);L&&v.statusBar.addAction({label:g.localize(1040,"View Problem"),commandId:i.NextMarkerAction.ID,run:()=>{v.hide(),L.showAtMarker(w.marker),this._editor.focus()}})}if(!this._editor.getOption(92)){const L=v.statusBar.append(r("div"));this.recentMarkerCodeActionsInfo&&(c.IMarkerData.makeKey(this.recentMarkerCodeActionsInfo.marker)===c.IMarkerData.makeKey(w.marker)?this.recentMarkerCodeActionsInfo.hasCodeActions||(L.textContent=g.localize(1041,"No quick fixes available")):this.recentMarkerCodeActionsInfo=void 0);const D=this.recentMarkerCodeActionsInfo&&!this.recentMarkerCodeActionsInfo.hasCodeActions?y.Disposable.None:(0,I.disposableTimeout)(()=>L.textContent=g.localize(1042,"Checking for quick fixes..."),200,S);L.textContent||(L.textContent="\xA0");const T=this.getCodeActions(w.marker);S.add((0,y.toDisposable)(()=>T.cancel())),T.then(M=>{if(D.dispose(),this.recentMarkerCodeActionsInfo={marker:w.marker,hasCodeActions:M.validActions.length>0},!this.recentMarkerCodeActionsInfo.hasCodeActions){M.dispose(),L.textContent=g.localize(1043,"No quick fixes available");return}L.style.display="none";let A=!1;S.add((0,y.toDisposable)(()=>{A||M.dispose()})),v.statusBar.addAction({label:g.localize(1044,"Quick Fix..."),commandId:n.quickFixCommandId,run:P=>{A=!0;const N=o.CodeActionController.get(this._editor),O=d.getDomNodePagePosition(P);v.hide(),N?.showCodeActions(C,M,{x:O.left,y:O.top,width:O.width,height:O.height})}})},E.onUnexpectedError)}}getCodeActions(v){return(0,I.createCancelablePromise)(w=>(0,n.getCodeActions)(this._languageFeaturesService.codeActionProvider,this._editor.getModel(),new _.Range(v.startLineNumber,v.startColumn,v.endLineNumber,v.endColumn),C,a.Progress.None,w))}};e.MarkerHoverParticipant=f,e.MarkerHoverParticipant=f=ke([ce(1,p.IMarkerDecorationsService),ce(2,l.IOpenerService),ce(3,b.ILanguageFeaturesService)],f)}),define(ne[430],se([1,0,5,41,18,193,4,78,291,158,29,24,12,58,7,50]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.showGoToContextMenu=g,e.goToDefinitionWithLocation=c;async function g(l,a,r,u){const C=l.get(m.ITextModelService),f=l.get(t.IContextMenuService),h=l.get(n.ICommandService),v=l.get(i.IInstantiationService),w=l.get(s.INotificationService);if(await u.item.resolve(I.CancellationToken.None),!u.part.location)return;const S=u.part.location,L=[],D=new Set(p.MenuRegistry.getMenuItems(p.MenuId.EditorContext).map(M=>(0,p.isIMenuItem)(M)?M.command.id:(0,E.generateUuid)()));for(const M of _.SymbolNavigationAction.all())D.has(M.desc.id)&&L.push(new k.Action(M.desc.id,p.MenuItemAction.label(M.desc,{renderShortTitle:!0}),void 0,!0,async()=>{const A=await C.createModelReference(S.uri);try{const P=new _.SymbolNavigationAnchor(A.object.textEditorModel,y.Range.getStartPosition(S.range)),N=u.item.anchor.range;await v.invokeFunction(M.runEditorCommand.bind(M),a,P,N)}finally{A.dispose()}}));if(u.part.command){const{command:M}=u.part;L.push(new k.Separator),L.push(new k.Action(M.id,M.title,void 0,!0,async()=>{try{await h.executeCommand(M.id,...M.arguments??[])}catch(A){w.notify({severity:s.Severity.Error,source:u.item.provider.displayName,message:A})}}))}const T=a.getOption(128);f.showContextMenu({domForShadowRoot:T?a.getDomNode()??void 0:void 0,getAnchor:()=>{const M=d.getDomNodePagePosition(r);return{x:M.left,y:M.top+M.height+8}},getActions:()=>L,onHide:()=>{a.focus()},autoSelectFirstItem:!0})}async function c(l,a,r,u){const f=await l.get(m.ITextModelService).createModelReference(u.uri);await r.invokeWithinContext(async h=>{const v=a.hasSideBySideModifier,w=h.get(o.IContextKeyService),S=b.PeekContext.inPeekEditor.getValue(w),L=!v&&r.getOption(89)&&!S;return new _.DefinitionAction({openToSide:v,openInPeek:L,muteMessage:!0},{title:{value:"",original:""},id:"",precondition:void 0}).run(h,new _.SymbolNavigationAnchor(f.object.textEditorModel,y.Range.getStartPosition(u.range)),y.Range.lift(u.range))}),f.dispose()}}),define(ne[431],se([1,0,5,13,14,18,8,2,45,19,22,185,143,37,75,4,27,40,35,79,17,78,209,377,430,24,49,7,50,32,25]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S,L,D,T){"use strict";var M;Object.defineProperty(e,"__esModule",{value:!0}),e.InlayHintsController=e.RenderedInlayHintLabelPart=void 0;class A{constructor(){this._entries=new _.LRUCache(50)}get(V){const q=A._key(V);return this._entries.get(q)}set(V,q){const H=A._key(V);this._entries.set(H,q)}static _key(V){return`${V.uri.toString()}/${V.getVersionId()}`}}const P=(0,S.createDecorator)("IInlayHintsCache");(0,w.registerSingleton)(P,A,1);class N{constructor(V,q){this.item=V,this.index=q}get part(){const V=this.item.hint.label;return typeof V=="string"?{label:V}:V[this.index]}}e.RenderedInlayHintLabelPart=N;class O{constructor(V,q){this.part=V,this.hasTriggerModifier=q}}let F=class{static{M=this}static{this.ID="editor.contrib.InlayHints"}static{this._MAX_DECORATORS=1500}static{this._MAX_LABEL_LEN=43}static get(V){return V.getContribution(M.ID)??void 0}constructor(V,q,H,z,U,j,Y){this._editor=V,this._languageFeaturesService=q,this._inlayHintsCache=z,this._commandService=U,this._notificationService=j,this._instaService=Y,this._disposables=new m.DisposableStore,this._sessionDisposables=new m.DisposableStore,this._decorationsMetadata=new Map,this._ruleFactory=new n.DynamicCssRules(this._editor),this._activeRenderMode=0,this._debounceInfo=H.for(q.inlayHintsProvider,"InlayHint",{min:25}),this._disposables.add(q.inlayHintsProvider.onDidChange(()=>this._update())),this._disposables.add(V.onDidChangeModel(()=>this._update())),this._disposables.add(V.onDidChangeModelLanguage(()=>this._update())),this._disposables.add(V.onDidChangeConfiguration(G=>{G.hasChanged(142)&&this._update()})),this._update()}dispose(){this._sessionDisposables.dispose(),this._removeAllDecorations(),this._disposables.dispose()}_update(){this._sessionDisposables.clear(),this._removeAllDecorations();const V=this._editor.getOption(142);if(V.enabled==="off")return;const q=this._editor.getModel();if(!q||!this._languageFeaturesService.inlayHintsProvider.has(q))return;if(V.enabled==="on")this._activeRenderMode=0;else{let Y,G;V.enabled==="onUnlessPressed"?(Y=0,G=1):(Y=1,G=0),this._activeRenderMode=Y,this._sessionDisposables.add(d.ModifierKeyEmitter.getInstance().event(K=>{if(!this._editor.hasModel())return;const R=K.altKey&&K.ctrlKey&&!(K.shiftKey||K.metaKey)?G:Y;if(R!==this._activeRenderMode){this._activeRenderMode=R;const J=this._editor.getModel(),ie=this._copyInlayHintsWithCurrentAnchor(J);this._updateHintsDecorators([J.getFullModelRange()],ie),j.schedule(0)}}))}const H=this._inlayHintsCache.get(q);H&&this._updateHintsDecorators([q.getFullModelRange()],H),this._sessionDisposables.add((0,m.toDisposable)(()=>{q.isDisposed()||this._cacheHintsForFastRestore(q)}));let z;const U=new Set,j=new I.RunOnceScheduler(async()=>{const Y=Date.now();z?.dispose(!0),z=new E.CancellationTokenSource;const G=q.onWillDispose(()=>z?.cancel());try{const K=z.token,R=await f.InlayHintsFragments.create(this._languageFeaturesService.inlayHintsProvider,q,this._getHintsRanges(),K);if(j.delay=this._debounceInfo.update(q,Date.now()-Y),K.isCancellationRequested){R.dispose();return}for(const J of R.provider)typeof J.onDidChangeInlayHints=="function"&&!U.has(J)&&(U.add(J),this._sessionDisposables.add(J.onDidChangeInlayHints(()=>{j.isScheduled()||j.schedule()})));this._sessionDisposables.add(R),this._updateHintsDecorators(R.ranges,R.items),this._cacheHintsForFastRestore(q)}catch(K){(0,y.onUnexpectedError)(K)}finally{z.dispose(),G.dispose()}},this._debounceInfo.get(q));this._sessionDisposables.add(j),this._sessionDisposables.add((0,m.toDisposable)(()=>z?.dispose(!0))),j.schedule(0),this._sessionDisposables.add(this._editor.onDidScrollChange(Y=>{(Y.scrollTopChanged||!j.isScheduled())&&j.schedule()})),this._sessionDisposables.add(this._editor.onDidChangeModelContent(Y=>{z?.cancel();const G=Math.max(j.delay,1250);j.schedule(G)})),this._sessionDisposables.add(this._installDblClickGesture(()=>j.schedule(0))),this._sessionDisposables.add(this._installLinkGesture()),this._sessionDisposables.add(this._installContextMenu())}_installLinkGesture(){const V=new m.DisposableStore,q=V.add(new C.ClickLinkGesture(this._editor)),H=new m.DisposableStore;return V.add(H),V.add(q.onMouseMoveOrRelevantKeyDown(z=>{const[U]=z,j=this._getInlayHintLabelPart(U),Y=this._editor.getModel();if(!j||!Y){H.clear();return}const G=new E.CancellationTokenSource;H.add((0,m.toDisposable)(()=>G.dispose(!0))),j.item.resolve(G.token),this._activeInlayHintPart=j.part.command||j.part.location?new O(j,U.hasTriggerModifier):void 0;const K=Y.validatePosition(j.item.hint.position).lineNumber,R=new s.Range(K,1,K,Y.getLineMaxColumn(K)),J=this._getInlineHintsForRange(R);this._updateHintsDecorators([R],J),H.add((0,m.toDisposable)(()=>{this._activeInlayHintPart=void 0,this._updateHintsDecorators([R],J)}))})),V.add(q.onCancel(()=>H.clear())),V.add(q.onExecute(async z=>{const U=this._getInlayHintLabelPart(z);if(U){const j=U.part;j.location?this._instaService.invokeFunction(h.goToDefinitionWithLocation,z,this._editor,j.location):g.Command.is(j.command)&&await this._invokeCommand(j.command,U.item)}})),V}_getInlineHintsForRange(V){const q=new Set;for(const H of this._decorationsMetadata.values())V.containsRange(H.item.anchor.range)&&q.add(H.item);return Array.from(q)}_installDblClickGesture(V){return this._editor.onMouseUp(async q=>{if(q.event.detail!==2)return;const H=this._getInlayHintLabelPart(q);if(H&&(q.event.preventDefault(),await H.item.resolve(E.CancellationToken.None),(0,k.isNonEmptyArray)(H.item.hint.textEdits))){const z=H.item.hint.textEdits.map(U=>i.EditOperation.replace(s.Range.lift(U.range),U.text));this._editor.executeEdits("inlayHint.default",z),V()}})}_installContextMenu(){return this._editor.onContextMenu(async V=>{if(!(0,d.isHTMLElement)(V.event.target))return;const q=this._getInlayHintLabelPart(V);q&&await this._instaService.invokeFunction(h.showGoToContextMenu,this._editor,V.event.target,q)})}_getInlayHintLabelPart(V){if(V.target.type!==6)return;const q=V.target.detail.injectedText?.options;if(q instanceof l.ModelDecorationInjectedTextOptions&&q?.attachedData instanceof N)return q.attachedData}async _invokeCommand(V,q){try{await this._commandService.executeCommand(V.id,...V.arguments??[])}catch(H){this._notificationService.notify({severity:L.Severity.Error,source:q.provider.displayName,message:H})}}_cacheHintsForFastRestore(V){const q=this._copyInlayHintsWithCurrentAnchor(V);this._inlayHintsCache.set(V,q)}_copyInlayHintsWithCurrentAnchor(V){const q=new Map;for(const[H,z]of this._decorationsMetadata){if(q.has(z.item))continue;const U=V.getDecorationRange(H);if(U){const j=new f.InlayHintAnchor(U,z.item.anchor.direction),Y=z.item.with({anchor:j});q.set(z.item,Y)}}return Array.from(q.values())}_getHintsRanges(){const q=this._editor.getModel(),H=this._editor.getVisibleRangesPlusViewportAboveBelow(),z=[];for(const U of H.sort(s.Range.compareRangesUsingStarts)){const j=q.validateRange(new s.Range(U.startLineNumber-30,U.startColumn,U.endLineNumber+30,U.endColumn));z.length===0||!s.Range.areIntersectingOrTouching(z[z.length-1],j)?z.push(j):z[z.length-1]=s.Range.plusRange(z[z.length-1],j)}return z}_updateHintsDecorators(V,q){const H=[],z=(he,pe,ae,ee,de)=>{const ge={content:ae,inlineClassNameAffectsLetterSpacing:!0,inlineClassName:pe.className,cursorStops:ee,attachedData:de};H.push({item:he,classNameRef:pe,decoration:{range:he.anchor.range,options:{description:"InlayHint",showIfCollapsed:he.anchor.range.isEmpty(),collapseOnReplaceEdit:!he.anchor.range.isEmpty(),stickiness:0,[he.anchor.direction]:this._activeRenderMode===0?ge:void 0}}})},U=(he,pe)=>{const ae=this._ruleFactory.createClassNameRef({width:`${j/3|0}px`,display:"inline-block"});z(he,ae,"\u200A",pe?c.InjectedTextCursorStops.Right:c.InjectedTextCursorStops.None)},{fontSize:j,fontFamily:Y,padding:G,isUniform:K}=this._getLayoutInfo(),R="--code-editorInlayHintsFontFamily";this._editor.getContainerDomNode().style.setProperty(R,Y);let J={line:0,totalLen:0};for(const he of q){if(J.line!==he.anchor.range.startLineNumber&&(J={line:he.anchor.range.startLineNumber,totalLen:0}),J.totalLen>M._MAX_LABEL_LEN)continue;he.hint.paddingLeft&&U(he,!1);const pe=typeof he.hint.label=="string"?[{label:he.hint.label}]:he.hint.label;for(let ae=0;ae0&&(B=B.slice(0,-Q)+"\u2026",$=!0),z(he,this._ruleFactory.createClassNameRef(X),x(B),ge&&!he.hint.paddingRight?c.InjectedTextCursorStops.Right:c.InjectedTextCursorStops.None,new N(he,ae)),$)break}if(he.hint.paddingRight&&U(he,!0),H.length>M._MAX_DECORATORS)break}const ie=[];for(const[he,pe]of this._decorationsMetadata){const ae=this._editor.getModel()?.getDecorationRange(he);ae&&V.some(ee=>ee.containsRange(ae))&&(ie.push(he),pe.classNameRef.dispose(),this._decorationsMetadata.delete(he))}const ue=o.StableEditorScrollState.capture(this._editor);this._editor.changeDecorations(he=>{const pe=he.deltaDecorations(ie,H.map(ae=>ae.decoration));for(let ae=0;aeH)&&(U=H);const j=V.fontFamily||z;return{fontSize:U,fontFamily:j,padding:q,isUniform:!q&&j===z&&U===H}}_removeAllDecorations(){this._editor.removeDecorations(Array.from(this._decorationsMetadata.keys()));for(const V of this._decorationsMetadata.values())V.classNameRef.dispose();this._decorationsMetadata.clear()}};e.InlayHintsController=F,e.InlayHintsController=F=M=ke([ce(1,r.ILanguageFeaturesService),ce(2,a.ILanguageFeatureDebounceService),ce(3,P),ce(4,v.ICommandService),ce(5,L.INotificationService),ce(6,S.IInstantiationService)],F);function x(W){return W.replace(/[ \t]/g,"\xA0")}v.CommandsRegistry.registerCommand("_executeInlayHintProvider",async(W,...V)=>{const[q,H]=V;(0,b.assertType)(p.URI.isUri(q)),(0,b.assertType)(s.Range.isIRange(H));const{inlayHintsProvider:z}=W.get(r.ILanguageFeaturesService),U=await W.get(u.ITextModelService).createModelReference(q);try{const j=await f.InlayHintsFragments.create(z,U.object.textEditorModel,[s.Range.lift(H)],E.CancellationToken.None),Y=j.items.map(G=>G.hint);return setTimeout(()=>j.dispose(),0),Y}finally{U.dispose()}})}),define(ne[432],se([1,0,14,57,9,35,84,43,78,410,217,431,28,59,17,3,16,377,13,31,118,24]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlayHintsHover=void 0;class C extends y.HoverForeignElementAnchor{constructor(v,w,S,L){super(10,w,v.item.anchor.range,S,L,!0),this.part=v}}let f=class extends p.MarkdownHoverParticipant{constructor(v,w,S,L,D,T,M,A,P){super(v,w,S,T,A,L,D,P),this._resolverService=M,this.hoverOrdinal=6}suggestHoverAnchor(v){if(!n.InlayHintsController.get(this._editor)||v.target.type!==6)return null;const S=v.target.detail.injectedText?.options;return S instanceof E.ModelDecorationInjectedTextOptions&&S.attachedData instanceof n.RenderedInlayHintLabelPart?new C(S.attachedData,this,v.event.posx,v.event.posy):null}computeSync(){return[]}computeAsync(v,w,S){return v instanceof C?new d.AsyncIterableObject(async L=>{const{part:D}=v;if(await D.item.resolve(S),S.isCancellationRequested)return;let T;typeof D.item.hint.tooltip=="string"?T=new k.MarkdownString().appendText(D.item.hint.tooltip):D.item.hint.tooltip&&(T=D.item.hint.tooltip),T&&L.emitOne(new p.MarkdownHover(this,v.range,[T],!1,0)),(0,l.isNonEmptyArray)(D.item.hint.textEdits)&&L.emitOne(new p.MarkdownHover(this,v.range,[new k.MarkdownString().appendText((0,s.localize)(1065,"Double-click to insert"))],!1,10001));let M;if(typeof D.part.tooltip=="string"?M=new k.MarkdownString().appendText(D.part.tooltip):D.part.tooltip&&(M=D.part.tooltip),M&&L.emitOne(new p.MarkdownHover(this,v.range,[M],!1,1)),D.part.location||D.part.command){let P;const O=this._editor.getOption(78)==="altKey"?g.isMacintosh?(0,s.localize)(1066,"cmd + click"):(0,s.localize)(1067,"ctrl + click"):g.isMacintosh?(0,s.localize)(1068,"option + click"):(0,s.localize)(1069,"alt + click");D.part.location&&D.part.command?P=new k.MarkdownString().appendText((0,s.localize)(1070,"Go to Definition ({0}), right click for more",O)):D.part.location?P=new k.MarkdownString().appendText((0,s.localize)(1071,"Go to Definition ({0})",O)):D.part.command&&(P=new k.MarkdownString(`[${(0,s.localize)(1072,"Execute Command")}](${(0,c.asCommandLink)(D.part.command)} "${D.part.command.title}") (${O})`,{isTrusted:!0})),P&&L.emitOne(new p.MarkdownHover(this,v.range,[P],!1,1e4))}const A=await this._resolveInlayHintLabelPartHover(D,S);for await(const P of A)L.emitOne(P)}):d.AsyncIterableObject.EMPTY}async _resolveInlayHintLabelPartHover(v,w){if(!v.part.location)return d.AsyncIterableObject.EMPTY;const{uri:S,range:L}=v.part.location,D=await this._resolverService.createModelReference(S);try{const T=D.object.textEditorModel;return this._languageFeaturesService.hoverProvider.has(T)?(0,b.getHoverProviderResultsAsAsyncIterable)(this._languageFeaturesService.hoverProvider,T,new I.Position(L.startLineNumber,L.startColumn),w).filter(M=>!(0,k.isEmptyMarkdownString)(M.hover.contents)).map(M=>new p.MarkdownHover(this,v.item.anchor.range,M.hover.contents,!1,2+M.ordinal)):d.AsyncIterableObject.EMPTY}finally{D.dispose()}}};e.InlayHintsHover=f,e.InlayHintsHover=f=ke([ce(1,m.ILanguageService),ce(2,t.IOpenerService),ce(3,a.IKeybindingService),ce(4,r.IHoverService),ce(5,o.IConfigurationService),ce(6,_.ITextModelService),ce(7,i.ILanguageFeaturesService),ce(8,u.ICommandService)],f)}),define(ne[846],se([1,0,84,2,391,35,9,4,5,217,288,432,8]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RenderedContentHover=void 0;class t extends k.Disposable{constructor(c,l,a,r,u,C){super();const f=l.anchor,h=l.hoverParts;this._renderedHoverParts=this._register(new s(c,a,h,C,u));const{showAtPosition:v,showAtSecondaryPosition:w}=t.computeHoverPositions(c,f.range,h);this.shouldAppearBeforeContent=h.some(S=>S.isBeforeContent),this.showAtPosition=v,this.showAtSecondaryPosition=w,this.initialMousePosX=f.initialMousePosX,this.initialMousePosY=f.initialMousePosY,this.shouldFocus=r.shouldFocus,this.source=r.source}get domNode(){return this._renderedHoverParts.domNode}get domNodeHasChildren(){return this._renderedHoverParts.domNodeHasChildren}get focusedHoverPartIndex(){return this._renderedHoverParts.focusedHoverPartIndex}async updateHoverVerbosityLevel(c,l,a){this._renderedHoverParts.updateHoverVerbosityLevel(c,l,a)}isColorPickerVisible(){return this._renderedHoverParts.isColorPickerVisible()}static computeHoverPositions(c,l,a){let r=1;if(c.hasModel()){const w=c._getViewModel(),S=w.coordinatesConverter,L=S.convertModelRangeToViewRange(l),D=w.getLineMinColumn(L.startLineNumber),T=new y.Position(L.startLineNumber,D);r=S.convertViewPositionToModelPosition(T).column}const u=l.startLineNumber;let C=l.startColumn,f;for(const w of a){const S=w.range,L=S.startLineNumber===u,D=S.endLineNumber===u;if(L&&D){const M=S.startColumn,A=Math.min(C,M);C=Math.max(A,r)}w.forceShowAtRange&&(f=S)}let h,v;if(f){const w=f.getStartPosition();h=w,v=w}else h=l.getStartPosition(),v=new y.Position(u,C);return{showAtPosition:h,showAtSecondaryPosition:v}}}e.RenderedContentHover=t;class i{constructor(c,l){this._statusBar=l,c.appendChild(this._statusBar.hoverElement)}get hoverElement(){return this._statusBar.hoverElement}get actions(){return this._statusBar.actions}dispose(){this._statusBar.dispose()}}class s extends k.Disposable{static{this._DECORATION_OPTIONS=E.ModelDecorationOptions.register({description:"content-hover-highlight",className:"hoverHighlight"})}constructor(c,l,a,r,u){super(),this._renderedParts=[],this._focusedHoverPartIndex=-1,this._context=u,this._fragment=document.createDocumentFragment(),this._register(this._renderParts(l,a,u,r)),this._register(this._registerListenersOnRenderedParts()),this._register(this._createEditorDecorations(c,a)),this._updateMarkdownAndColorParticipantInfo(l)}_createEditorDecorations(c,l){if(l.length===0)return k.Disposable.None;let a=l[0].range;for(const u of l){const C=u.range;a=m.Range.plusRange(a,C)}const r=c.createDecorationsCollection();return r.set([{range:a,options:s._DECORATION_OPTIONS}]),(0,k.toDisposable)(()=>{r.clear()})}_renderParts(c,l,a,r){const u=new I.EditorHoverStatusBar(r),C={fragment:this._fragment,statusBar:u,...a},f=new k.DisposableStore;for(const v of c){const w=this._renderHoverPartsForParticipant(l,v,C);f.add(w);for(const S of w.renderedHoverParts)this._renderedParts.push({type:"hoverPart",participant:v,hoverPart:S.hoverPart,hoverElement:S.hoverElement})}const h=this._renderStatusBar(this._fragment,u);return h&&(f.add(h),this._renderedParts.push({type:"statusBar",hoverElement:h.hoverElement,actions:h.actions})),(0,k.toDisposable)(()=>{f.dispose()})}_renderHoverPartsForParticipant(c,l,a){const r=c.filter(C=>C.owner===l);return r.length>0?l.renderHoverParts(a,r):new d.RenderedHoverParts([])}_renderStatusBar(c,l){if(l.hasContent)return new i(c,l)}_registerListenersOnRenderedParts(){const c=new k.DisposableStore;return this._renderedParts.forEach((l,a)=>{const r=l.hoverElement;r.tabIndex=0,c.add(_.addDisposableListener(r,_.EventType.FOCUS_IN,u=>{u.stopPropagation(),this._focusedHoverPartIndex=a})),c.add(_.addDisposableListener(r,_.EventType.FOCUS_OUT,u=>{u.stopPropagation(),this._focusedHoverPartIndex=-1}))}),c}_updateMarkdownAndColorParticipantInfo(c){const l=c.find(a=>a instanceof b.MarkdownHoverParticipant&&!(a instanceof n.InlayHintsHover));l&&(this._markdownHoverParticipant=l),this._colorHoverParticipant=c.find(a=>a instanceof p.ColorHoverParticipant)}async updateHoverVerbosityLevel(c,l,a){if(!this._markdownHoverParticipant)return;const r=this._normalizedIndexToMarkdownHoverIndexRange(this._markdownHoverParticipant,l);if(r===void 0)return;const u=await this._markdownHoverParticipant.updateMarkdownHoverVerbosityLevel(c,r,a);u&&(this._renderedParts[l]={type:"hoverPart",participant:this._markdownHoverParticipant,hoverPart:u.hoverPart,hoverElement:u.hoverElement},this._context.onContentsChanged())}isColorPickerVisible(){return this._colorHoverParticipant?.isColorPickerVisible()??!1}_normalizedIndexToMarkdownHoverIndexRange(c,l){const a=this._renderedParts[l];if(!a||a.type!=="hoverPart"||!(a.participant===c))return;const u=this._renderedParts.findIndex(C=>C.type==="hoverPart"&&C.participant===c);if(u===-1)throw new o.BugIndicatingError;return l-u}get domNode(){return this._fragment}get domNodeHasChildren(){return this._fragment.hasChildNodes()}get focusedHoverPartIndex(){return this._focusedHoverPartIndex}}}),define(ne[847],se([1,0,5,2,27,376,84,7,31,690,668,614,6,846,210]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContentHoverWidgetWrapper=void 0;let s=class extends k.Disposable{constructor(c,l,a){super(),this._editor=c,this._instantiationService=l,this._keybindingService=a,this._currentResult=null,this._onContentsChanged=this._register(new o.Emitter),this.onContentsChanged=this._onContentsChanged.event,this._contentHoverWidget=this._register(this._instantiationService.createInstance(b.ContentHoverWidget,this._editor)),this._participants=this._initializeHoverParticipants(),this._computer=new p.ContentHoverComputer(this._editor,this._participants),this._hoverOperation=this._register(new E.HoverOperation(this._editor,this._computer)),this._registerListeners()}_initializeHoverParticipants(){const c=[];for(const l of y.HoverParticipantRegistry.getAll()){const a=this._instantiationService.createInstance(l,this._editor);c.push(a)}return c.sort((l,a)=>l.hoverOrdinal-a.hoverOrdinal),this._register(this._contentHoverWidget.onDidResize(()=>{this._participants.forEach(l=>l.handleResize?.())})),c}_registerListeners(){this._register(this._hoverOperation.onResult(l=>{if(!this._computer.anchor)return;const a=l.hasLoadingMessage?this._addLoadingMessage(l.value):l.value;this._withResult(new n.HoverResult(this._computer.anchor,a,l.isComplete))}));const c=this._contentHoverWidget.getDomNode();this._register(d.addStandardDisposableListener(c,"keydown",l=>{l.equals(9)&&this.hide()})),this._register(d.addStandardDisposableListener(c,"mouseleave",l=>{this._onMouseLeave(l)})),this._register(I.TokenizationRegistry.onDidChange(()=>{this._contentHoverWidget.position&&this._currentResult&&this._setCurrentResult(this._currentResult)}))}_startShowingOrUpdateHover(c,l,a,r,u){if(!(this._contentHoverWidget.position&&this._currentResult))return c?(this._startHoverOperationIfNecessary(c,l,a,r,!1),!0):!1;const f=this._editor.getOption(60).sticky,h=u&&this._contentHoverWidget.isMouseGettingCloser(u.event.posx,u.event.posy);return f&&h?(c&&this._startHoverOperationIfNecessary(c,l,a,r,!0),!0):c?this._currentResult.anchor.equals(c)?!0:c.canAdoptVisibleHover(this._currentResult.anchor,this._contentHoverWidget.position)?(this._setCurrentResult(this._currentResult.filter(c)),this._startHoverOperationIfNecessary(c,l,a,r,!1),!0):(this._setCurrentResult(null),this._startHoverOperationIfNecessary(c,l,a,r,!1),!0):(this._setCurrentResult(null),!1)}_startHoverOperationIfNecessary(c,l,a,r,u){this._computer.anchor&&this._computer.anchor.equals(c)||(this._hoverOperation.cancel(),this._computer.anchor=c,this._computer.shouldFocus=r,this._computer.source=a,this._computer.insistOnKeepingHoverVisible=u,this._hoverOperation.start(l))}_setCurrentResult(c){let l=c;if(this._currentResult===l)return;l&&l.hoverParts.length===0&&(l=null),this._currentResult=l,this._currentResult?this._showHover(this._currentResult):this._hideHover()}_addLoadingMessage(c){if(!this._computer.anchor)return c;for(const l of this._participants){if(!l.createLoadingMessage)continue;const a=l.createLoadingMessage(this._computer.anchor);if(a)return c.slice(0).concat([a])}return c}_withResult(c){if(this._contentHoverWidget.position&&this._currentResult&&this._currentResult.isComplete||this._setCurrentResult(c),!c.isComplete)return;const r=c.hoverParts.length===0,u=this._computer.insistOnKeepingHoverVisible;r&&u||this._setCurrentResult(c)}_showHover(c){const l=this._getHoverContext();this._renderedContentHover=new t.RenderedContentHover(this._editor,c,this._participants,this._computer,l,this._keybindingService),this._renderedContentHover.domNodeHasChildren?this._contentHoverWidget.show(this._renderedContentHover):this._renderedContentHover.dispose()}_hideHover(){this._contentHoverWidget.hide()}_getHoverContext(){return{hide:()=>{this.hide()},onContentsChanged:()=>{this._onContentsChanged.fire(),this._contentHoverWidget.onContentsChanged()},setMinimumDimensions:r=>{this._contentHoverWidget.setMinimumDimensions(r)}}}showsOrWillShow(c){if(this._contentHoverWidget.isResizing)return!0;const a=this._findHoverAnchorCandidates(c);if(!(a.length>0))return this._startShowingOrUpdateHover(null,0,0,!1,c);const u=a[0];return this._startShowingOrUpdateHover(u,0,0,!1,c)}_findHoverAnchorCandidates(c){const l=[];for(const r of this._participants){if(!r.suggestHoverAnchor)continue;const u=r.suggestHoverAnchor(c);u&&l.push(u)}const a=c.target;switch(a.type){case 6:{l.push(new y.HoverRangeAnchor(0,a.range,c.event.posx,c.event.posy));break}case 7:{const r=this._editor.getOption(50).typicalHalfwidthCharacterWidth/2;if(!(!a.detail.isAfterLines&&typeof a.detail.horizontalDistanceToText=="number"&&a.detail.horizontalDistanceToTextu.priority-r.priority),l}_onMouseLeave(c){const l=this._editor.getDomNode();(!l||!(0,i.isMousePositionWithinElement)(l,c.x,c.y))&&this.hide()}startShowingAtRange(c,l,a,r){this._startShowingOrUpdateHover(new y.HoverRangeAnchor(0,c,void 0,void 0),l,a,r,null)}async updateHoverVerbosityLevel(c,l,a){this._renderedContentHover?.updateHoverVerbosityLevel(c,l,a)}focusedHoverPartIndex(){return this._renderedContentHover?.focusedHoverPartIndex??-1}containsNode(c){return c?this._contentHoverWidget.getDomNode().contains(c):!1}focus(){this._contentHoverWidget.focus()}scrollUp(){this._contentHoverWidget.scrollUp()}scrollDown(){this._contentHoverWidget.scrollDown()}scrollLeft(){this._contentHoverWidget.scrollLeft()}scrollRight(){this._contentHoverWidget.scrollRight()}pageUp(){this._contentHoverWidget.pageUp()}pageDown(){this._contentHoverWidget.pageDown()}goToTop(){this._contentHoverWidget.goToTop()}goToBottom(){this._contentHoverWidget.goToBottom()}hide(){this._computer.anchor=null,this._hoverOperation.cancel(),this._setCurrentResult(null)}getDomNode(){return this._contentHoverWidget.getDomNode()}get isColorPickerVisible(){return this._renderedContentHover?.isColorPickerVisible()??!1}get isVisibleFromKeyboard(){return this._contentHoverWidget.isVisibleFromKeyboard}get isVisible(){return this._contentHoverWidget.isVisible}get isFocused(){return this._contentHoverWidget.isFocused}get isResizing(){return this._contentHoverWidget.isResizing}get widget(){return this._contentHoverWidget}};e.ContentHoverWidgetWrapper=s,e.ContentHoverWidgetWrapper=s=ke([ce(1,m.IInstantiationService),ce(2,_.IKeybindingService)],s)}),define(ne[292],se([1,0,264,2,7,283,31,14,210,847,6,196]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";var n;Object.defineProperty(e,"__esModule",{value:!0}),e.ContentHoverController=void 0;const o=!1;let t=class extends k.Disposable{static{n=this}static{this.ID="editor.contrib.contentHover"}constructor(s,g,c){super(),this._editor=s,this._instantiationService=g,this._keybindingService=c,this._onHoverContentsChanged=this._register(new p.Emitter),this.shouldKeepOpenOnEditorMouseMoveOrLeave=!1,this._listenersStore=new k.DisposableStore,this._hoverState={mouseDown:!1,activatedByDecoratorClick:!1},this._reactToEditorMouseMoveRunner=this._register(new m.RunOnceScheduler(()=>this._reactToEditorMouseMove(this._mouseMoveEvent),0)),this._hookListeners(),this._register(this._editor.onDidChangeConfiguration(l=>{l.hasChanged(60)&&(this._unhookListeners(),this._hookListeners())}))}static get(s){return s.getContribution(n.ID)}_hookListeners(){const s=this._editor.getOption(60);this._hoverSettings={enabled:s.enabled,sticky:s.sticky,hidingDelay:s.hidingDelay},s.enabled?(this._listenersStore.add(this._editor.onMouseDown(g=>this._onEditorMouseDown(g))),this._listenersStore.add(this._editor.onMouseUp(()=>this._onEditorMouseUp())),this._listenersStore.add(this._editor.onMouseMove(g=>this._onEditorMouseMove(g))),this._listenersStore.add(this._editor.onKeyDown(g=>this._onKeyDown(g)))):(this._listenersStore.add(this._editor.onMouseMove(g=>this._onEditorMouseMove(g))),this._listenersStore.add(this._editor.onKeyDown(g=>this._onKeyDown(g)))),this._listenersStore.add(this._editor.onMouseLeave(g=>this._onEditorMouseLeave(g))),this._listenersStore.add(this._editor.onDidChangeModel(()=>{this._cancelScheduler(),this._hideWidgets()})),this._listenersStore.add(this._editor.onDidChangeModelContent(()=>this._cancelScheduler())),this._listenersStore.add(this._editor.onDidScrollChange(g=>this._onEditorScrollChanged(g)))}_unhookListeners(){this._listenersStore.clear()}_cancelScheduler(){this._mouseMoveEvent=void 0,this._reactToEditorMouseMoveRunner.cancel()}_onEditorScrollChanged(s){(s.scrollTopChanged||s.scrollLeftChanged)&&this._hideWidgets()}_onEditorMouseDown(s){this._hoverState.mouseDown=!0,!this._shouldNotHideCurrentHoverWidget(s)&&this._hideWidgets()}_shouldNotHideCurrentHoverWidget(s){return this._isMouseOnContentHoverWidget(s)||this._isContentWidgetResizing()}_isMouseOnContentHoverWidget(s){const g=this._contentWidget?.getDomNode();return g?(0,_.isMousePositionWithinElement)(g,s.event.posx,s.event.posy):!1}_onEditorMouseUp(){this._hoverState.mouseDown=!1}_onEditorMouseLeave(s){this.shouldKeepOpenOnEditorMouseMoveOrLeave||(this._cancelScheduler(),this._shouldNotHideCurrentHoverWidget(s))||o||this._hideWidgets()}_shouldNotRecomputeCurrentHoverWidget(s){const g=this._hoverSettings.sticky,c=(r,u)=>{const C=this._isMouseOnContentHoverWidget(r);return u&&C},l=r=>{const u=this._isMouseOnContentHoverWidget(r),C=this._contentWidget?.isColorPickerVisible??!1;return u&&C},a=(r,u)=>(u&&this._contentWidget?.containsNode(r.event.browserEvent.view?.document.activeElement)&&!r.event.browserEvent.view?.getSelection()?.isCollapsed)??!1;return c(s,g)||l(s)||a(s,g)}_onEditorMouseMove(s){if(this.shouldKeepOpenOnEditorMouseMoveOrLeave||(this._mouseMoveEvent=s,this._contentWidget?.isFocused||this._contentWidget?.isResizing))return;const g=this._hoverSettings.sticky;if(g&&this._contentWidget?.isVisibleFromKeyboard)return;if(this._shouldNotRecomputeCurrentHoverWidget(s)){this._reactToEditorMouseMoveRunner.cancel();return}const l=this._hoverSettings.hidingDelay;if(this._contentWidget?.isVisible&&g&&l>0){this._reactToEditorMouseMoveRunner.isScheduled()||this._reactToEditorMouseMoveRunner.schedule(l);return}this._reactToEditorMouseMove(s)}_reactToEditorMouseMove(s){if(!s)return;const c=s.target.element?.classList.contains("colorpicker-color-decoration"),l=this._editor.getOption(149),a=this._hoverSettings.enabled,r=this._hoverState.activatedByDecoratorClick;if(c&&(l==="click"&&!r||l==="hover"&&!a&&!o||l==="clickAndHover"&&!a&&!r)||!c&&!a&&!r){this._hideWidgets();return}this._tryShowHoverWidget(s)||o||this._hideWidgets()}_tryShowHoverWidget(s){return this._getOrCreateContentWidget().showsOrWillShow(s)}_onKeyDown(s){if(!this._editor.hasModel())return;const g=this._keybindingService.softDispatch(s,this._editor.getDomNode()),c=g.kind===1||g.kind===2&&(g.commandId===d.SHOW_OR_FOCUS_HOVER_ACTION_ID||g.commandId===d.INCREASE_HOVER_VERBOSITY_ACTION_ID||g.commandId===d.DECREASE_HOVER_VERBOSITY_ACTION_ID)&&this._contentWidget?.isVisible;s.keyCode===5||s.keyCode===6||s.keyCode===57||s.keyCode===4||c||this._hideWidgets()}_hideWidgets(){o||this._hoverState.mouseDown&&this._contentWidget?.isColorPickerVisible||E.InlineSuggestionHintsContentWidget.dropDownVisible||(this._hoverState.activatedByDecoratorClick=!1,this._contentWidget?.hide())}_getOrCreateContentWidget(){return this._contentWidget||(this._contentWidget=this._instantiationService.createInstance(b.ContentHoverWidgetWrapper,this._editor),this._listenersStore.add(this._contentWidget.onContentsChanged(()=>this._onHoverContentsChanged.fire()))),this._contentWidget}showContentHover(s,g,c,l,a=!1){this._hoverState.activatedByDecoratorClick=a,this._getOrCreateContentWidget().startShowingAtRange(s,g,c,l)}_isContentWidgetResizing(){return this._contentWidget?.widget.isResizing||!1}focusedHoverPartIndex(){return this._getOrCreateContentWidget().focusedHoverPartIndex()}updateHoverVerbosityLevel(s,g,c){this._getOrCreateContentWidget().updateHoverVerbosityLevel(s,g,c)}focus(){this._contentWidget?.focus()}scrollUp(){this._contentWidget?.scrollUp()}scrollDown(){this._contentWidget?.scrollDown()}scrollLeft(){this._contentWidget?.scrollLeft()}scrollRight(){this._contentWidget?.scrollRight()}pageUp(){this._contentWidget?.pageUp()}pageDown(){this._contentWidget?.pageDown()}goToTop(){this._contentWidget?.goToTop()}goToBottom(){this._contentWidget?.goToBottom()}get isColorPickerVisible(){return this._contentWidget?.isColorPickerVisible}get isHoverVisible(){return this._contentWidget?.isVisible}dispose(){super.dispose(),this._unhookListeners(),this._listenersStore.dispose(),this._contentWidget?.dispose()}};e.ContentHoverController=t,e.ContentHoverController=t=n=ke([ce(1,I.IInstantiationService),ce(2,y.IKeybindingService)],t)}),define(ne[848],se([1,0,2,15,4,422,288,292,84]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorContribution=void 0;class b extends d.Disposable{static{this.ID="editor.contrib.colorContribution"}constructor(n){super(),this._editor=n,this._register(n.onMouseDown(o=>this.onMouseDown(o)))}dispose(){super.dispose()}onMouseDown(n){const o=this._editor.getOption(149);if(o!=="click"&&o!=="clickAndHover")return;const t=n.target;if(t.type!==6||!t.detail.injectedText||t.detail.injectedText.options.attachedData!==E.ColorDecorationInjectedTextMarker||!t.range)return;const i=this._editor.getContribution(m.ContentHoverController.ID);if(i&&!i.isColorPickerVisible){const s=new I.Range(t.range.startLineNumber,t.range.startColumn+1,t.range.endLineNumber,t.range.endColumn+1);i.showContentHover(s,1,0,!1,!0)}}}e.ColorContribution=b,(0,k.registerEditorContribution)(b.ID,b,2),_.HoverParticipantRegistry.register(y.ColorHoverParticipant)}),define(ne[849],se([1,0,264,72,15,4,20,429,292,27,3,196]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DecreaseHoverVerbosityLevel=e.IncreaseHoverVerbosityLevel=e.GoToBottomHoverAction=e.GoToTopHoverAction=e.PageDownHoverAction=e.PageUpHoverAction=e.ScrollRightHoverAction=e.ScrollLeftHoverAction=e.ScrollDownHoverAction=e.ScrollUpHoverAction=e.ShowDefinitionPreviewHoverAction=e.ShowOrFocusHoverAction=void 0;var n;(function(h){h.NoAutoFocus="noAutoFocus",h.FocusIfVisible="focusIfVisible",h.AutoFocusImmediately="autoFocusImmediately"})(n||(n={}));class o extends I.EditorAction{constructor(){super({id:d.SHOW_OR_FOCUS_HOVER_ACTION_ID,label:p.localize(1008,"Show or Focus Hover"),metadata:{description:p.localize2(1021,"Show or focus the editor hover which shows documentation, references, and other content for a symbol at the current cursor position."),args:[{name:"args",schema:{type:"object",properties:{focus:{description:"Controls if and when the hover should take focus upon being triggered by this action.",enum:[n.NoAutoFocus,n.FocusIfVisible,n.AutoFocusImmediately],enumDescriptions:[p.localize(1009,"The hover will not automatically take focus."),p.localize(1010,"The hover will take focus only if it is already visible."),p.localize(1011,"The hover will automatically take focus when it appears.")],default:n.FocusIfVisible}}}}]},alias:"Show or Focus Hover",precondition:void 0,kbOpts:{kbExpr:y.EditorContextKeys.editorTextFocus,primary:(0,k.KeyChord)(2089,2087),weight:100}})}run(v,w,S){if(!w.hasModel())return;const L=_.ContentHoverController.get(w);if(!L)return;const D=S?.focus;let T=n.FocusIfVisible;Object.values(n).includes(D)?T=D:typeof D=="boolean"&&D&&(T=n.AutoFocusImmediately);const M=P=>{const N=w.getPosition(),O=new E.Range(N.lineNumber,N.column,N.lineNumber,N.column);L.showContentHover(O,1,1,P)},A=w.getOption(2)===2;L.isHoverVisible?T!==n.NoAutoFocus?L.focus():M(A):M(A||T===n.AutoFocusImmediately)}}e.ShowOrFocusHoverAction=o;class t extends I.EditorAction{constructor(){super({id:d.SHOW_DEFINITION_PREVIEW_HOVER_ACTION_ID,label:p.localize(1012,"Show Definition Preview Hover"),alias:"Show Definition Preview Hover",precondition:void 0,metadata:{description:p.localize2(1022,"Show the definition preview hover in the editor.")}})}run(v,w){const S=_.ContentHoverController.get(w);if(!S)return;const L=w.getPosition();if(!L)return;const D=new E.Range(L.lineNumber,L.column,L.lineNumber,L.column),T=m.GotoDefinitionAtPositionEditorContribution.get(w);if(!T)return;T.startFindDefinitionFromCursor(L).then(()=>{S.showContentHover(D,1,1,!0)})}}e.ShowDefinitionPreviewHoverAction=t;class i extends I.EditorAction{constructor(){super({id:d.SCROLL_UP_HOVER_ACTION_ID,label:p.localize(1013,"Scroll Up Hover"),alias:"Scroll Up Hover",precondition:y.EditorContextKeys.hoverFocused,kbOpts:{kbExpr:y.EditorContextKeys.hoverFocused,primary:16,weight:100},metadata:{description:p.localize2(1023,"Scroll up the editor hover.")}})}run(v,w){const S=_.ContentHoverController.get(w);S&&S.scrollUp()}}e.ScrollUpHoverAction=i;class s extends I.EditorAction{constructor(){super({id:d.SCROLL_DOWN_HOVER_ACTION_ID,label:p.localize(1014,"Scroll Down Hover"),alias:"Scroll Down Hover",precondition:y.EditorContextKeys.hoverFocused,kbOpts:{kbExpr:y.EditorContextKeys.hoverFocused,primary:18,weight:100},metadata:{description:p.localize2(1024,"Scroll down the editor hover.")}})}run(v,w){const S=_.ContentHoverController.get(w);S&&S.scrollDown()}}e.ScrollDownHoverAction=s;class g extends I.EditorAction{constructor(){super({id:d.SCROLL_LEFT_HOVER_ACTION_ID,label:p.localize(1015,"Scroll Left Hover"),alias:"Scroll Left Hover",precondition:y.EditorContextKeys.hoverFocused,kbOpts:{kbExpr:y.EditorContextKeys.hoverFocused,primary:15,weight:100},metadata:{description:p.localize2(1025,"Scroll left the editor hover.")}})}run(v,w){const S=_.ContentHoverController.get(w);S&&S.scrollLeft()}}e.ScrollLeftHoverAction=g;class c extends I.EditorAction{constructor(){super({id:d.SCROLL_RIGHT_HOVER_ACTION_ID,label:p.localize(1016,"Scroll Right Hover"),alias:"Scroll Right Hover",precondition:y.EditorContextKeys.hoverFocused,kbOpts:{kbExpr:y.EditorContextKeys.hoverFocused,primary:17,weight:100},metadata:{description:p.localize2(1026,"Scroll right the editor hover.")}})}run(v,w){const S=_.ContentHoverController.get(w);S&&S.scrollRight()}}e.ScrollRightHoverAction=c;class l extends I.EditorAction{constructor(){super({id:d.PAGE_UP_HOVER_ACTION_ID,label:p.localize(1017,"Page Up Hover"),alias:"Page Up Hover",precondition:y.EditorContextKeys.hoverFocused,kbOpts:{kbExpr:y.EditorContextKeys.hoverFocused,primary:11,secondary:[528],weight:100},metadata:{description:p.localize2(1027,"Page up the editor hover.")}})}run(v,w){const S=_.ContentHoverController.get(w);S&&S.pageUp()}}e.PageUpHoverAction=l;class a extends I.EditorAction{constructor(){super({id:d.PAGE_DOWN_HOVER_ACTION_ID,label:p.localize(1018,"Page Down Hover"),alias:"Page Down Hover",precondition:y.EditorContextKeys.hoverFocused,kbOpts:{kbExpr:y.EditorContextKeys.hoverFocused,primary:12,secondary:[530],weight:100},metadata:{description:p.localize2(1028,"Page down the editor hover.")}})}run(v,w){const S=_.ContentHoverController.get(w);S&&S.pageDown()}}e.PageDownHoverAction=a;class r extends I.EditorAction{constructor(){super({id:d.GO_TO_TOP_HOVER_ACTION_ID,label:p.localize(1019,"Go To Top Hover"),alias:"Go To Bottom Hover",precondition:y.EditorContextKeys.hoverFocused,kbOpts:{kbExpr:y.EditorContextKeys.hoverFocused,primary:14,secondary:[2064],weight:100},metadata:{description:p.localize2(1029,"Go to the top of the editor hover.")}})}run(v,w){const S=_.ContentHoverController.get(w);S&&S.goToTop()}}e.GoToTopHoverAction=r;class u extends I.EditorAction{constructor(){super({id:d.GO_TO_BOTTOM_HOVER_ACTION_ID,label:p.localize(1020,"Go To Bottom Hover"),alias:"Go To Bottom Hover",precondition:y.EditorContextKeys.hoverFocused,kbOpts:{kbExpr:y.EditorContextKeys.hoverFocused,primary:13,secondary:[2066],weight:100},metadata:{description:p.localize2(1030,"Go to the bottom of the editor hover.")}})}run(v,w){const S=_.ContentHoverController.get(w);S&&S.goToBottom()}}e.GoToBottomHoverAction=u;class C extends I.EditorAction{constructor(){super({id:d.INCREASE_HOVER_VERBOSITY_ACTION_ID,label:d.INCREASE_HOVER_VERBOSITY_ACTION_LABEL,alias:"Increase Hover Verbosity Level",precondition:y.EditorContextKeys.hoverVisible})}run(v,w,S){const L=_.ContentHoverController.get(w);if(!L)return;const D=S?.index!==void 0?S.index:L.focusedHoverPartIndex();L.updateHoverVerbosityLevel(b.HoverVerbosityAction.Increase,D,S?.focus)}}e.IncreaseHoverVerbosityLevel=C;class f extends I.EditorAction{constructor(){super({id:d.DECREASE_HOVER_VERBOSITY_ACTION_ID,label:d.DECREASE_HOVER_VERBOSITY_ACTION_LABEL,alias:"Decrease Hover Verbosity Level",precondition:y.EditorContextKeys.hoverVisible})}run(v,w,S){const L=_.ContentHoverController.get(w);if(!L)return;const D=S?.index!==void 0?S.index:L.focusedHoverPartIndex();_.ContentHoverController.get(w)?.updateHoverVerbosityLevel(b.HoverVerbosityAction.Decrease,D,S?.focus)}}e.DecreaseHoverVerbosityLevel=f}),define(ne[850],se([1,0,849,15,32,25,84,217,845,292,713,380,615,196]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),(0,k.registerEditorContribution)(b.ContentHoverController.ID,b.ContentHoverController,2),(0,k.registerEditorContribution)(p.MarginHoverController.ID,p.MarginHoverController,2),(0,k.registerEditorAction)(d.ShowOrFocusHoverAction),(0,k.registerEditorAction)(d.ShowDefinitionPreviewHoverAction),(0,k.registerEditorAction)(d.ScrollUpHoverAction),(0,k.registerEditorAction)(d.ScrollDownHoverAction),(0,k.registerEditorAction)(d.ScrollLeftHoverAction),(0,k.registerEditorAction)(d.ScrollRightHoverAction),(0,k.registerEditorAction)(d.PageUpHoverAction),(0,k.registerEditorAction)(d.PageDownHoverAction),(0,k.registerEditorAction)(d.GoToTopHoverAction),(0,k.registerEditorAction)(d.GoToBottomHoverAction),(0,k.registerEditorAction)(d.IncreaseHoverVerbosityLevel),(0,k.registerEditorAction)(d.DecreaseHoverVerbosityLevel),y.HoverParticipantRegistry.register(m.MarkdownHoverParticipant),y.HoverParticipantRegistry.register(_.MarkerHoverParticipant),(0,E.registerThemingParticipant)((t,i)=>{const s=t.getColor(I.editorHoverBorder);s&&(i.addRule(`.monaco-editor .monaco-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${s.transparent(.5)}; }`),i.addRule(`.monaco-editor .monaco-hover hr { border-top: 1px solid ${s.transparent(.5)}; }`),i.addRule(`.monaco-editor .monaco-hover hr { border-bottom: 0px solid ${s.transparent(.5)}; }`))}),n.AccessibleViewRegistry.register(new o.HoverAccessibleView),n.AccessibleViewRegistry.register(new o.HoverAccessibilityHelp),n.AccessibleViewRegistry.register(new o.ExtHoverAccessibleView)}),define(ne[851],se([1,0,15,84,431,432]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),(0,d.registerEditorContribution)(I.InlayHintsController.ID,I.InlayHintsController,1),k.HoverParticipantRegistry.register(E.InlayHintsHover)}),define(ne[433],se([1,0,2,17,838,837,7,58,29,12,20,209,4,277,430,9,18,36,79,5,341,77,289,334]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f){"use strict";var h;Object.defineProperty(e,"__esModule",{value:!0}),e.StickyScrollController=void 0;let v=class extends d.Disposable{static{h=this}static{this.ID="store.contrib.stickyScrollController"}constructor(S,L,D,T,M,A,P){super(),this._editor=S,this._contextMenuService=L,this._languageFeaturesService=D,this._instaService=T,this._contextKeyService=P,this._sessionStore=new d.DisposableStore,this._maxStickyLines=Number.MAX_SAFE_INTEGER,this._candidateDefinitionsLength=-1,this._focusedStickyElementIndex=-1,this._enabled=!1,this._focused=!1,this._positionRevealed=!1,this._onMouseDown=!1,this._endLineNumbers=[],this._stickyScrollWidget=new I.StickyScrollWidget(this._editor),this._stickyLineCandidateProvider=new E.StickyLineCandidateProvider(this._editor,D,M),this._register(this._stickyScrollWidget),this._register(this._stickyLineCandidateProvider),this._widgetState=I.StickyScrollWidgetState.Empty,this._onDidResize(),this._readConfiguration();const N=this._stickyScrollWidget.getDomNode();this._register(this._editor.onDidChangeConfiguration(F=>{this._readConfigurationChange(F)})),this._register(a.addDisposableListener(N,a.EventType.CONTEXT_MENU,async F=>{this._onContextMenu(a.getWindow(N),F)})),this._stickyScrollFocusedContextKey=p.EditorContextKeys.stickyScrollFocused.bindTo(this._contextKeyService),this._stickyScrollVisibleContextKey=p.EditorContextKeys.stickyScrollVisible.bindTo(this._contextKeyService);const O=this._register(a.trackFocus(N));this._register(O.onDidBlur(F=>{this._positionRevealed===!1&&N.clientHeight===0?(this._focusedStickyElementIndex=-1,this.focus()):this._disposeFocusStickyScrollStore()})),this._register(O.onDidFocus(F=>{this.focus()})),this._registerMouseListeners(),this._register(a.addDisposableListener(N,a.EventType.MOUSE_DOWN,F=>{this._onMouseDown=!0}))}static get(S){return S.getContribution(h.ID)}_disposeFocusStickyScrollStore(){this._stickyScrollFocusedContextKey.set(!1),this._focusDisposableStore?.dispose(),this._focused=!1,this._positionRevealed=!1,this._onMouseDown=!1}focus(){if(this._onMouseDown){this._onMouseDown=!1,this._editor.focus();return}this._stickyScrollFocusedContextKey.get()!==!0&&(this._focused=!0,this._focusDisposableStore=new d.DisposableStore,this._stickyScrollFocusedContextKey.set(!0),this._focusedStickyElementIndex=this._stickyScrollWidget.lineNumbers.length-1,this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex))}focusNext(){this._focusedStickyElementIndex0&&this._focusNav(!1)}selectEditor(){this._editor.focus()}_focusNav(S){this._focusedStickyElementIndex=S?this._focusedStickyElementIndex+1:this._focusedStickyElementIndex-1,this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex)}goToFocused(){const S=this._stickyScrollWidget.lineNumbers;this._disposeFocusStickyScrollStore(),this._revealPosition({lineNumber:S[this._focusedStickyElementIndex],column:1})}_revealPosition(S){this._reveaInEditor(S,()=>this._editor.revealPosition(S))}_revealLineInCenterIfOutsideViewport(S){this._reveaInEditor(S,()=>this._editor.revealLineInCenterIfOutsideViewport(S.lineNumber,0))}_reveaInEditor(S,L){this._focused&&this._disposeFocusStickyScrollStore(),this._positionRevealed=!0,L(),this._editor.setSelection(o.Range.fromPositions(S)),this._editor.focus()}_registerMouseListeners(){const S=this._register(new d.DisposableStore),L=this._register(new n.ClickLinkGesture(this._editor,{extractLineNumberFromMouseEvent:M=>{const A=this._stickyScrollWidget.getEditorPositionFromNode(M.target.element);return A?A.lineNumber:0}})),D=M=>{if(!this._editor.hasModel()||M.target.type!==12||M.target.detail!==this._stickyScrollWidget.getId())return null;const A=M.target.element;if(!A||A.innerText!==A.innerHTML)return null;const P=this._stickyScrollWidget.getEditorPositionFromNode(A);return P?{range:new o.Range(P.lineNumber,P.column,P.lineNumber,P.column+A.innerText.length),textElement:A}:null},T=this._stickyScrollWidget.getDomNode();this._register(a.addStandardDisposableListener(T,a.EventType.CLICK,M=>{if(M.ctrlKey||M.altKey||M.metaKey||!M.leftButton)return;if(M.shiftKey){const O=this._stickyScrollWidget.getLineIndexFromChildDomNode(M.target);if(O===null)return;const F=new s.Position(this._endLineNumbers[O],1);this._revealLineInCenterIfOutsideViewport(F);return}if(this._stickyScrollWidget.isInFoldingIconDomNode(M.target)){const O=this._stickyScrollWidget.getLineNumberFromChildDomNode(M.target);this._toggleFoldingRegionForLine(O);return}if(!this._stickyScrollWidget.isInStickyLine(M.target))return;let N=this._stickyScrollWidget.getEditorPositionFromNode(M.target);if(!N){const O=this._stickyScrollWidget.getLineNumberFromChildDomNode(M.target);if(O===null)return;N=new s.Position(O,1)}this._revealPosition(N)})),this._register(a.addStandardDisposableListener(T,a.EventType.MOUSE_MOVE,M=>{if(M.shiftKey){const A=this._stickyScrollWidget.getLineIndexFromChildDomNode(M.target);if(A===null||this._showEndForLine!==null&&this._showEndForLine===A)return;this._showEndForLine=A,this._renderStickyScroll();return}this._showEndForLine!==void 0&&(this._showEndForLine=void 0,this._renderStickyScroll())})),this._register(a.addDisposableListener(T,a.EventType.MOUSE_LEAVE,M=>{this._showEndForLine!==void 0&&(this._showEndForLine=void 0,this._renderStickyScroll())})),this._register(L.onMouseMoveOrRelevantKeyDown(([M,A])=>{const P=D(M);if(!P||!M.hasTriggerModifier||!this._editor.hasModel()){S.clear();return}const{range:N,textElement:O}=P;if(!N.equalsRange(this._stickyRangeProjectedOnEditor))this._stickyRangeProjectedOnEditor=N,S.clear();else if(O.style.textDecoration==="underline")return;const F=new g.CancellationTokenSource;S.add((0,d.toDisposable)(()=>F.dispose(!0)));let x;(0,t.getDefinitionsAtPosition)(this._languageFeaturesService.definitionProvider,this._editor.getModel(),new s.Position(N.startLineNumber,N.startColumn+1),!1,F.token).then(W=>{if(!F.token.isCancellationRequested)if(W.length!==0){this._candidateDefinitionsLength=W.length;const V=O;x!==V?(S.clear(),x=V,x.style.textDecoration="underline",S.add((0,d.toDisposable)(()=>{x.style.textDecoration="none"}))):x||(x=V,x.style.textDecoration="underline",S.add((0,d.toDisposable)(()=>{x.style.textDecoration="none"})))}else S.clear()})})),this._register(L.onCancel(()=>{S.clear()})),this._register(L.onExecute(async M=>{if(M.target.type!==12||M.target.detail!==this._stickyScrollWidget.getId())return;const A=this._stickyScrollWidget.getEditorPositionFromNode(M.target.element);A&&(!this._editor.hasModel()||!this._stickyRangeProjectedOnEditor||(this._candidateDefinitionsLength>1&&(this._focused&&this._disposeFocusStickyScrollStore(),this._revealPosition({lineNumber:A.lineNumber,column:1})),this._instaService.invokeFunction(i.goToDefinitionWithLocation,M,this._editor,{uri:this._editor.getModel().uri,range:this._stickyRangeProjectedOnEditor})))}))}_onContextMenu(S,L){const D=new u.StandardMouseEvent(S,L);this._contextMenuService.showContextMenu({menuId:_.MenuId.StickyScrollContext,getAnchor:()=>D})}_toggleFoldingRegionForLine(S){if(!this._foldingModel||S===null)return;const L=this._stickyScrollWidget.getRenderedStickyLine(S),D=L?.foldingIcon;if(!D)return;(0,f.toggleCollapseState)(this._foldingModel,Number.MAX_VALUE,[S]),D.isCollapsed=!D.isCollapsed;const T=(D.isCollapsed?this._editor.getTopForLineNumber(D.foldingEndLine):this._editor.getTopForLineNumber(D.foldingStartLine))-this._editor.getOption(67)*L.index+1;this._editor.setScrollTop(T),this._renderStickyScroll(S)}_readConfiguration(){const S=this._editor.getOption(116);if(S.enabled===!1){this._editor.removeOverlayWidget(this._stickyScrollWidget),this._sessionStore.clear(),this._enabled=!1;return}else S.enabled&&!this._enabled&&(this._editor.addOverlayWidget(this._stickyScrollWidget),this._sessionStore.add(this._editor.onDidScrollChange(D=>{D.scrollTopChanged&&(this._showEndForLine=void 0,this._renderStickyScroll())})),this._sessionStore.add(this._editor.onDidLayoutChange(()=>this._onDidResize())),this._sessionStore.add(this._editor.onDidChangeModelTokens(D=>this._onTokensChange(D))),this._sessionStore.add(this._stickyLineCandidateProvider.onDidChangeStickyScroll(()=>{this._showEndForLine=void 0,this._renderStickyScroll()})),this._enabled=!0);this._editor.getOption(68).renderType===2&&this._sessionStore.add(this._editor.onDidChangeCursorPosition(()=>{this._showEndForLine=void 0,this._renderStickyScroll(0)}))}_readConfigurationChange(S){(S.hasChanged(116)||S.hasChanged(73)||S.hasChanged(67)||S.hasChanged(111)||S.hasChanged(68))&&this._readConfiguration(),S.hasChanged(68)&&this._renderStickyScroll(0)}_needsUpdate(S){const L=this._stickyScrollWidget.getCurrentLines();for(const D of L)for(const T of S.ranges)if(D>=T.fromLineNumber&&D<=T.toLineNumber)return!0;return!1}_onTokensChange(S){this._needsUpdate(S)&&this._renderStickyScroll(0)}_onDidResize(){const L=this._editor.getLayoutInfo().height/this._editor.getOption(67);this._maxStickyLines=Math.round(L*.25)}async _renderStickyScroll(S){const L=this._editor.getModel();if(!L||L.isTooLargeForTokenization()){this._resetState();return}const D=this._updateAndGetMinRebuildFromLine(S),T=this._stickyLineCandidateProvider.getVersionId();if(T===void 0||T===L.getVersionId())if(!this._focused)await this._updateState(D);else if(this._focusedStickyElementIndex===-1)await this._updateState(D),this._focusedStickyElementIndex=this._stickyScrollWidget.lineNumberCount-1,this._focusedStickyElementIndex!==-1&&this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);else{const A=this._stickyScrollWidget.lineNumbers[this._focusedStickyElementIndex];await this._updateState(D),this._stickyScrollWidget.lineNumberCount===0?this._focusedStickyElementIndex=-1:(this._stickyScrollWidget.lineNumbers.includes(A)||(this._focusedStickyElementIndex=this._stickyScrollWidget.lineNumberCount-1),this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex))}}_updateAndGetMinRebuildFromLine(S){if(S!==void 0){const L=this._minRebuildFromLine!==void 0?this._minRebuildFromLine:1/0;this._minRebuildFromLine=Math.min(S,L)}return this._minRebuildFromLine}async _updateState(S){this._minRebuildFromLine=void 0,this._foldingModel=await C.FoldingController.get(this._editor)?.getFoldingModel()??void 0,this._widgetState=this.findScrollWidgetState();const L=this._widgetState.startLineNumbers.length>0;this._stickyScrollVisibleContextKey.set(L),this._stickyScrollWidget.setState(this._widgetState,this._foldingModel,S)}async _resetState(){this._minRebuildFromLine=void 0,this._foldingModel=void 0,this._widgetState=I.StickyScrollWidgetState.Empty,this._stickyScrollVisibleContextKey.set(!1),this._stickyScrollWidget.setState(void 0,void 0)}findScrollWidgetState(){const S=this._editor.getOption(67),L=Math.min(this._maxStickyLines,this._editor.getOption(116).maxLineCount),D=this._editor.getScrollTop();let T=0;const M=[],A=[],P=this._editor.getVisibleRanges();if(P.length!==0){const N=new r.StickyRange(P[0].startLineNumber,P[P.length-1].endLineNumber),O=this._stickyLineCandidateProvider.getCandidateStickyLinesIntersecting(N);for(const F of O){const x=F.startLineNumber,W=F.endLineNumber,V=F.nestingDepth;if(W-x>0){const q=(V-1)*S,H=V*S,z=this._editor.getBottomForLineNumber(x)-D,U=this._editor.getTopForLineNumber(W)-D,j=this._editor.getBottomForLineNumber(W)-D;if(q>U&&q<=j){M.push(x),A.push(W+1),T=j-H;break}else H>z&&H<=j&&(M.push(x),A.push(W+1));if(M.length===L)break}}}return this._endLineNumbers=A,new I.StickyScrollWidgetState(M,A,T,this._showEndForLine)}dispose(){super.dispose(),this._sessionStore.dispose()}};e.StickyScrollController=v,e.StickyScrollController=v=h=ke([ce(1,m.IContextMenuService),ce(2,k.ILanguageFeaturesService),ce(3,y.IInstantiationService),ce(4,c.ILanguageConfigurationService),ce(5,l.ILanguageFeatureDebounceService),ce(6,b.IContextKeyService)],v)}),define(ne[852],se([1,0,15,3,671,29,28,12,20,433]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectEditor=e.GoToStickyScrollLine=e.SelectPreviousStickyScrollLine=e.SelectNextStickyScrollLine=e.FocusStickyScroll=e.ToggleStickyScroll=void 0;class p extends E.Action2{constructor(){super({id:"editor.action.toggleStickyScroll",title:{...(0,k.localize2)(1303,"Toggle Editor Sticky Scroll"),mnemonicTitle:(0,k.localize)(1299,"&&Toggle Editor Sticky Scroll")},metadata:{description:(0,k.localize2)(1304,"Toggle/enable the editor sticky scroll which shows the nested scopes at the top of the viewport")},category:I.Categories.View,toggled:{condition:m.ContextKeyExpr.equals("config.editor.stickyScroll.enabled",!0),title:(0,k.localize)(1300,"Sticky Scroll"),mnemonicTitle:(0,k.localize)(1301,"&&Sticky Scroll")},menu:[{id:E.MenuId.CommandPalette},{id:E.MenuId.MenubarAppearanceMenu,group:"4_editor",order:3},{id:E.MenuId.StickyScrollContext}]})}async run(l){const a=l.get(y.IConfigurationService),r=!a.getValue("editor.stickyScroll.enabled");return a.updateValue("editor.stickyScroll.enabled",r)}}e.ToggleStickyScroll=p;const n=100;class o extends d.EditorAction2{constructor(){super({id:"editor.action.focusStickyScroll",title:{...(0,k.localize2)(1305,"Focus on the editor sticky scroll"),mnemonicTitle:(0,k.localize)(1302,"&&Focus Sticky Scroll")},precondition:m.ContextKeyExpr.and(m.ContextKeyExpr.has("config.editor.stickyScroll.enabled"),_.EditorContextKeys.stickyScrollVisible),menu:[{id:E.MenuId.CommandPalette}]})}runEditorCommand(l,a){b.StickyScrollController.get(a)?.focus()}}e.FocusStickyScroll=o;class t extends d.EditorAction2{constructor(){super({id:"editor.action.selectNextStickyScrollLine",title:(0,k.localize2)(1306,"Select the next editor sticky scroll line"),precondition:_.EditorContextKeys.stickyScrollFocused.isEqualTo(!0),keybinding:{weight:n,primary:18}})}runEditorCommand(l,a){b.StickyScrollController.get(a)?.focusNext()}}e.SelectNextStickyScrollLine=t;class i extends d.EditorAction2{constructor(){super({id:"editor.action.selectPreviousStickyScrollLine",title:(0,k.localize2)(1307,"Select the previous sticky scroll line"),precondition:_.EditorContextKeys.stickyScrollFocused.isEqualTo(!0),keybinding:{weight:n,primary:16}})}runEditorCommand(l,a){b.StickyScrollController.get(a)?.focusPrevious()}}e.SelectPreviousStickyScrollLine=i;class s extends d.EditorAction2{constructor(){super({id:"editor.action.goToFocusedStickyScrollLine",title:(0,k.localize2)(1308,"Go to the focused sticky scroll line"),precondition:_.EditorContextKeys.stickyScrollFocused.isEqualTo(!0),keybinding:{weight:n,primary:3}})}runEditorCommand(l,a){b.StickyScrollController.get(a)?.goToFocused()}}e.GoToStickyScrollLine=s;class g extends d.EditorAction2{constructor(){super({id:"editor.action.selectEditor",title:(0,k.localize2)(1309,"Select Editor"),precondition:_.EditorContextKeys.stickyScrollFocused.isEqualTo(!0),keybinding:{weight:n,primary:9}})}runEditorCommand(l,a){b.StickyScrollController.get(a)?.selectEditor()}}e.SelectEditor=g}),define(ne[853],se([1,0,15,852,433,29]),function(oe,e,d,k,I,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),(0,d.registerEditorContribution)(I.StickyScrollController.ID,I.StickyScrollController,1),(0,E.registerAction2)(k.ToggleStickyScroll),(0,E.registerAction2)(k.FocusStickyScroll),(0,E.registerAction2)(k.SelectPreviousStickyScrollLine),(0,E.registerAction2)(k.SelectNextStickyScrollLine),(0,E.registerAction2)(k.GoToStickyScrollLine),(0,E.registerAction2)(k.SelectEditor)}),define(ne[854],se([1,0,15,34,428,28,12,7,50,101]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneReferencesController=void 0;let p=class extends I.ReferencesController{constructor(o,t,i,s,g,c,l){super(!0,o,t,i,s,g,c,l)}};e.StandaloneReferencesController=p,e.StandaloneReferencesController=p=ke([ce(1,y.IContextKeyService),ce(2,k.ICodeEditorService),ce(3,_.INotificationService),ce(4,m.IInstantiationService),ce(5,b.IStorageService),ce(6,E.IConfigurationService)],p),(0,d.registerEditorContribution)(I.ReferencesController.ID,p,4)}),define(ne[855],se([1,0,8,2,42,111,3,180,49,50,284]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UndoRedoService=void 0;const n=!1;function o(f){return f.scheme===I.Schemas.file?f.fsPath:f.path}let t=0;class i{constructor(h,v,w,S,L,D,T){this.id=++t,this.type=0,this.actual=h,this.label=h.label,this.confirmBeforeUndo=h.confirmBeforeUndo||!1,this.resourceLabel=v,this.strResource=w,this.resourceLabels=[this.resourceLabel],this.strResources=[this.strResource],this.groupId=S,this.groupOrder=L,this.sourceId=D,this.sourceOrder=T,this.isValid=!0}setValid(h){this.isValid=h}toString(){return`[id:${this.id}] [group:${this.groupId}] [${this.isValid?" VALID":"INVALID"}] ${this.actual.constructor.name} - ${this.actual}`}}class s{constructor(h,v){this.resourceLabel=h,this.reason=v}}class g{constructor(){this.elements=new Map}createMessage(){const h=[],v=[];for(const[,S]of this.elements)(S.reason===0?h:v).push(S.resourceLabel);const w=[];return h.length>0&&w.push(y.localize(1843,"The following files have been closed and modified on disk: {0}.",h.join(", "))),v.length>0&&w.push(y.localize(1844,"The following files have been modified in an incompatible way: {0}.",v.join(", "))),w.join(` -`)}get size(){return this.elements.size}has(h){return this.elements.has(h)}set(h,v){this.elements.set(h,v)}delete(h){return this.elements.delete(h)}}class c{constructor(h,v,w,S,L,D,T){this.id=++t,this.type=1,this.actual=h,this.label=h.label,this.confirmBeforeUndo=h.confirmBeforeUndo||!1,this.resourceLabels=v,this.strResources=w,this.groupId=S,this.groupOrder=L,this.sourceId=D,this.sourceOrder=T,this.removedResources=null,this.invalidatedResources=null}canSplit(){return typeof this.actual.split=="function"}removeResource(h,v,w){this.removedResources||(this.removedResources=new g),this.removedResources.has(v)||this.removedResources.set(v,new s(h,w))}setValid(h,v,w){w?this.invalidatedResources&&(this.invalidatedResources.delete(v),this.invalidatedResources.size===0&&(this.invalidatedResources=null)):(this.invalidatedResources||(this.invalidatedResources=new g),this.invalidatedResources.has(v)||this.invalidatedResources.set(v,new s(h,0)))}toString(){return`[id:${this.id}] [group:${this.groupId}] [${this.invalidatedResources?"INVALID":" VALID"}] ${this.actual.constructor.name} - ${this.actual}`}}class l{constructor(h,v){this.resourceLabel=h,this.strResource=v,this._past=[],this._future=[],this.locked=!1,this.versionId=1}dispose(){for(const h of this._past)h.type===1&&h.removeResource(this.resourceLabel,this.strResource,0);for(const h of this._future)h.type===1&&h.removeResource(this.resourceLabel,this.strResource,0);this.versionId++}toString(){const h=[];h.push(`* ${this.strResource}:`);for(let v=0;v=0;v--)h.push(` * [REDO] ${this._future[v]}`);return h.join(` -`)}flushAllElements(){this._past=[],this._future=[],this.versionId++}_setElementValidFlag(h,v){h.type===1?h.setValid(this.resourceLabel,this.strResource,v):h.setValid(v)}setElementsValidFlag(h,v){for(const w of this._past)v(w.actual)&&this._setElementValidFlag(w,h);for(const w of this._future)v(w.actual)&&this._setElementValidFlag(w,h)}pushElement(h){for(const v of this._future)v.type===1&&v.removeResource(this.resourceLabel,this.strResource,1);this._future=[],this._past.push(h),this.versionId++}createSnapshot(h){const v=[];for(let w=0,S=this._past.length;w=0;w--)v.push(this._future[w].id);return new p.ResourceEditStackSnapshot(h,v)}restoreSnapshot(h){const v=h.elements.length;let w=!0,S=0,L=-1;for(let T=0,M=this._past.length;T=v||A.id!==h.elements[S])&&(w=!1,L=0),!w&&A.type===1&&A.removeResource(this.resourceLabel,this.strResource,0)}let D=-1;for(let T=this._future.length-1;T>=0;T--,S++){const M=this._future[T];w&&(S>=v||M.id!==h.elements[S])&&(w=!1,D=T),!w&&M.type===1&&M.removeResource(this.resourceLabel,this.strResource,0)}L!==-1&&(this._past=this._past.slice(0,L)),D!==-1&&(this._future=this._future.slice(D+1)),this.versionId++}getElements(){const h=[],v=[];for(const w of this._past)h.push(w.actual);for(const w of this._future)v.push(w.actual);return{past:h,future:v}}getClosestPastElement(){return this._past.length===0?null:this._past[this._past.length-1]}getSecondClosestPastElement(){return this._past.length<2?null:this._past[this._past.length-2]}getClosestFutureElement(){return this._future.length===0?null:this._future[this._future.length-1]}hasPastElements(){return this._past.length>0}hasFutureElements(){return this._future.length>0}splitPastWorkspaceElement(h,v){for(let w=this._past.length-1;w>=0;w--)if(this._past[w]===h){v.has(this.strResource)?this._past[w]=v.get(this.strResource):this._past.splice(w,1);break}this.versionId++}splitFutureWorkspaceElement(h,v){for(let w=this._future.length-1;w>=0;w--)if(this._future[w]===h){v.has(this.strResource)?this._future[w]=v.get(this.strResource):this._future.splice(w,1);break}this.versionId++}moveBackward(h){this._past.pop(),this._future.push(h),this.versionId++}moveForward(h){this._future.pop(),this._past.push(h),this.versionId++}}class a{constructor(h){this.editStacks=h,this._versionIds=[];for(let v=0,w=this.editStacks.length;vv.sourceOrder)&&(v=D,w=S)}return[v,w]}canUndo(h){if(h instanceof p.UndoRedoSource){const[,w]=this._findClosestUndoElementWithSource(h.id);return!!w}const v=this.getUriComparisonKey(h);return this._editStacks.has(v)?this._editStacks.get(v).hasPastElements():!1}_onError(h,v){(0,d.onUnexpectedError)(h);for(const w of v.strResources)this.removeElements(w);this._notificationService.error(h)}_acquireLocks(h){for(const v of h.editStacks)if(v.locked)throw new Error("Cannot acquire edit stack lock");for(const v of h.editStacks)v.locked=!0;return()=>{for(const v of h.editStacks)v.locked=!1}}_safeInvokeWithLocks(h,v,w,S,L){const D=this._acquireLocks(w);let T;try{T=v()}catch(M){return D(),S.dispose(),this._onError(M,h)}return T?T.then(()=>(D(),S.dispose(),L()),M=>(D(),S.dispose(),this._onError(M,h))):(D(),S.dispose(),L())}async _invokeWorkspacePrepare(h){if(typeof h.actual.prepareUndoRedo>"u")return k.Disposable.None;const v=h.actual.prepareUndoRedo();return typeof v>"u"?k.Disposable.None:v}_invokeResourcePrepare(h,v){if(h.actual.type!==1||typeof h.actual.prepareUndoRedo>"u")return v(k.Disposable.None);const w=h.actual.prepareUndoRedo();return w?(0,k.isDisposable)(w)?v(w):w.then(S=>v(S)):v(k.Disposable.None)}_getAffectedEditStacks(h){const v=[];for(const w of h.strResources)v.push(this._editStacks.get(w)||r);return new a(v)}_tryToSplitAndUndo(h,v,w,S){if(v.canSplit())return this._splitPastWorkspaceElement(v,w),this._notificationService.warn(S),new C(this._undo(h,0,!0));for(const L of v.strResources)this.removeElements(L);return this._notificationService.warn(S),new C}_checkWorkspaceUndo(h,v,w,S){if(v.removedResources)return this._tryToSplitAndUndo(h,v,v.removedResources,y.localize(1845,"Could not undo '{0}' across all files. {1}",v.label,v.removedResources.createMessage()));if(S&&v.invalidatedResources)return this._tryToSplitAndUndo(h,v,v.invalidatedResources,y.localize(1846,"Could not undo '{0}' across all files. {1}",v.label,v.invalidatedResources.createMessage()));const L=[];for(const T of w.editStacks)T.getClosestPastElement()!==v&&L.push(T.resourceLabel);if(L.length>0)return this._tryToSplitAndUndo(h,v,null,y.localize(1847,"Could not undo '{0}' across all files because changes were made to {1}",v.label,L.join(", ")));const D=[];for(const T of w.editStacks)T.locked&&D.push(T.resourceLabel);return D.length>0?this._tryToSplitAndUndo(h,v,null,y.localize(1848,"Could not undo '{0}' across all files because there is already an undo or redo operation running on {1}",v.label,D.join(", "))):w.isValid()?null:this._tryToSplitAndUndo(h,v,null,y.localize(1849,"Could not undo '{0}' across all files because an undo or redo operation occurred in the meantime",v.label))}_workspaceUndo(h,v,w){const S=this._getAffectedEditStacks(v),L=this._checkWorkspaceUndo(h,v,S,!1);return L?L.returnValue:this._confirmAndExecuteWorkspaceUndo(h,v,S,w)}_isPartOfUndoGroup(h){if(!h.groupId)return!1;for(const[,v]of this._editStacks){const w=v.getClosestPastElement();if(w){if(w===h){const S=v.getSecondClosestPastElement();if(S&&S.groupId===h.groupId)return!0}if(w.groupId===h.groupId)return!0}}return!1}async _confirmAndExecuteWorkspaceUndo(h,v,w,S){if(v.canSplit()&&!this._isPartOfUndoGroup(v)){let T;(function(P){P[P.All=0]="All",P[P.This=1]="This",P[P.Cancel=2]="Cancel"})(T||(T={}));const{result:M}=await this._dialogService.prompt({type:E.default.Info,message:y.localize(1850,"Would you like to undo '{0}' across all files?",v.label),buttons:[{label:y.localize(1851,"&&Undo in {0} Files",w.editStacks.length),run:()=>T.All},{label:y.localize(1852,"Undo this &&File"),run:()=>T.This}],cancelButton:{run:()=>T.Cancel}});if(M===T.Cancel)return;if(M===T.This)return this._splitPastWorkspaceElement(v,null),this._undo(h,0,!0);const A=this._checkWorkspaceUndo(h,v,w,!1);if(A)return A.returnValue;S=!0}let L;try{L=await this._invokeWorkspacePrepare(v)}catch(T){return this._onError(T,v)}const D=this._checkWorkspaceUndo(h,v,w,!0);if(D)return L.dispose(),D.returnValue;for(const T of w.editStacks)T.moveBackward(v);return this._safeInvokeWithLocks(v,()=>v.actual.undo(),w,L,()=>this._continueUndoInGroup(v.groupId,S))}_resourceUndo(h,v,w){if(!v.isValid){h.flushAllElements();return}if(h.locked){const S=y.localize(1853,"Could not undo '{0}' because there is already an undo or redo operation running.",v.label);this._notificationService.warn(S);return}return this._invokeResourcePrepare(v,S=>(h.moveBackward(v),this._safeInvokeWithLocks(v,()=>v.actual.undo(),new a([h]),S,()=>this._continueUndoInGroup(v.groupId,w))))}_findClosestUndoElementInGroup(h){if(!h)return[null,null];let v=null,w=null;for(const[S,L]of this._editStacks){const D=L.getClosestPastElement();D&&D.groupId===h&&(!v||D.groupOrder>v.groupOrder)&&(v=D,w=S)}return[v,w]}_continueUndoInGroup(h,v){if(!h)return;const[,w]=this._findClosestUndoElementInGroup(h);if(w)return this._undo(w,0,v)}undo(h){if(h instanceof p.UndoRedoSource){const[,v]=this._findClosestUndoElementWithSource(h.id);return v?this._undo(v,h.id,!1):void 0}return typeof h=="string"?this._undo(h,0,!1):this._undo(this.getUriComparisonKey(h),0,!1)}_undo(h,v=0,w){if(!this._editStacks.has(h))return;const S=this._editStacks.get(h),L=S.getClosestPastElement();if(!L)return;if(L.groupId){const[T,M]=this._findClosestUndoElementInGroup(L.groupId);if(L!==T&&M)return this._undo(M,v,w)}if((L.sourceId!==v||L.confirmBeforeUndo)&&!w)return this._confirmAndContinueUndo(h,v,L);try{return L.type===1?this._workspaceUndo(h,L,w):this._resourceUndo(S,L,w)}finally{n&&this._print("undo")}}async _confirmAndContinueUndo(h,v,w){if((await this._dialogService.confirm({message:y.localize(1854,"Would you like to undo '{0}'?",w.label),primaryButton:y.localize(1855,"&&Yes"),cancelButton:y.localize(1856,"No")})).confirmed)return this._undo(h,v,!0)}_findClosestRedoElementWithSource(h){if(!h)return[null,null];let v=null,w=null;for(const[S,L]of this._editStacks){const D=L.getClosestFutureElement();D&&D.sourceId===h&&(!v||D.sourceOrder0)return this._tryToSplitAndRedo(h,v,null,y.localize(1859,"Could not redo '{0}' across all files because changes were made to {1}",v.label,L.join(", ")));const D=[];for(const T of w.editStacks)T.locked&&D.push(T.resourceLabel);return D.length>0?this._tryToSplitAndRedo(h,v,null,y.localize(1860,"Could not redo '{0}' across all files because there is already an undo or redo operation running on {1}",v.label,D.join(", "))):w.isValid()?null:this._tryToSplitAndRedo(h,v,null,y.localize(1861,"Could not redo '{0}' across all files because an undo or redo operation occurred in the meantime",v.label))}_workspaceRedo(h,v){const w=this._getAffectedEditStacks(v),S=this._checkWorkspaceRedo(h,v,w,!1);return S?S.returnValue:this._executeWorkspaceRedo(h,v,w)}async _executeWorkspaceRedo(h,v,w){let S;try{S=await this._invokeWorkspacePrepare(v)}catch(D){return this._onError(D,v)}const L=this._checkWorkspaceRedo(h,v,w,!0);if(L)return S.dispose(),L.returnValue;for(const D of w.editStacks)D.moveForward(v);return this._safeInvokeWithLocks(v,()=>v.actual.redo(),w,S,()=>this._continueRedoInGroup(v.groupId))}_resourceRedo(h,v){if(!v.isValid){h.flushAllElements();return}if(h.locked){const w=y.localize(1862,"Could not redo '{0}' because there is already an undo or redo operation running.",v.label);this._notificationService.warn(w);return}return this._invokeResourcePrepare(v,w=>(h.moveForward(v),this._safeInvokeWithLocks(v,()=>v.actual.redo(),new a([h]),w,()=>this._continueRedoInGroup(v.groupId))))}_findClosestRedoElementInGroup(h){if(!h)return[null,null];let v=null,w=null;for(const[S,L]of this._editStacks){const D=L.getClosestFutureElement();D&&D.groupId===h&&(!v||D.groupOrder"u")return typeof i=="string"?{id:(0,k.basename)(i)}:s?e.EXTENSION_DEVELOPMENT_EMPTY_WINDOW_WORKSPACE:e.UNKNOWN_EMPTY_WINDOW_WORKSPACE;const g=i;return g.configuration?{id:g.id,configPath:g.configuration}:g.folders.length===1?{id:g.id,uri:g.folders[0].uri}:{id:g.id}}function p(i){const s=i;return typeof s?.id=="string"&&E.URI.isUri(s.configPath)}class n{constructor(s,g,c,l,a){this._id=s,this._transient=c,this._configuration=l,this._ignorePathCasing=a,this._foldersMap=I.TernarySearchTree.forUris(this._ignorePathCasing,()=>!0),this.folders=g}get folders(){return this._folders}set folders(s){this._folders=s,this.updateFoldersMap()}get id(){return this._id}get transient(){return this._transient}get configuration(){return this._configuration}set configuration(s){this._configuration=s}getFolder(s){return s&&this._foldersMap.findSubstr(s)||null}updateFoldersMap(){this._foldersMap=I.TernarySearchTree.forUris(this._ignorePathCasing,()=>!0);for(const s of this.folders)this._foldersMap.set(s.uri,s)}toJSON(){return{id:this.id,folders:this.folders,transient:this.transient,configuration:this.configuration}}}e.Workspace=n;class o{constructor(s,g){this.raw=g,this.uri=s.uri,this.index=s.index,this.name=s.name}toJSON(){return{uri:this.uri,name:this.name,index:this.index}}}e.WorkspaceFolder=o,e.WORKSPACE_EXTENSION="code-workspace",e.WORKSPACE_FILTER=[{name:(0,d.localize)(1863,"Code Workspace"),extensions:[e.WORKSPACE_EXTENSION]}],e.STANDALONE_EDITOR_WORKSPACE_ID="4064f6ec-cb38-4ad0-af64-ee6467e63c82";function t(i){return i.id===e.STANDALONE_EDITOR_WORKSPACE_ID}}),define(ne[434],se([1,0,5,151,41,2,16,15,20,3,29,12,58,31,28,186]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s){"use strict";var g;Object.defineProperty(e,"__esModule",{value:!0}),e.ContextMenuController=void 0;let c=class{static{g=this}static{this.ID="editor.contrib.contextmenu"}static get(r){return r.getContribution(g.ID)}constructor(r,u,C,f,h,v,w,S){this._contextMenuService=u,this._contextViewService=C,this._contextKeyService=f,this._keybindingService=h,this._menuService=v,this._configurationService=w,this._workspaceContextService=S,this._toDispose=new E.DisposableStore,this._contextMenuIsBeingShownCount=0,this._editor=r,this._toDispose.add(this._editor.onContextMenu(L=>this._onContextMenu(L))),this._toDispose.add(this._editor.onMouseWheel(L=>{if(this._contextMenuIsBeingShownCount>0){const D=this._contextViewService.getContextViewElement(),T=L.srcElement;T.shadowRoot&&d.getShadowRoot(D)===T.shadowRoot||this._contextViewService.hideContextView()}})),this._toDispose.add(this._editor.onKeyDown(L=>{this._editor.getOption(24)&&L.keyCode===58&&(L.preventDefault(),L.stopPropagation(),this.showContextMenu())}))}_onContextMenu(r){if(!this._editor.hasModel())return;if(!this._editor.getOption(24)){this._editor.focus(),r.target.position&&!this._editor.getSelection().containsPosition(r.target.position)&&this._editor.setPosition(r.target.position);return}if(r.target.type===12||r.target.type===6&&r.target.detail.injectedText)return;if(r.event.preventDefault(),r.event.stopPropagation(),r.target.type===11)return this._showScrollbarContextMenu(r.event);if(r.target.type!==6&&r.target.type!==7&&r.target.type!==1)return;if(this._editor.focus(),r.target.position){let C=!1;for(const f of this._editor.getSelections())if(f.containsPosition(r.target.position)){C=!0;break}C||this._editor.setPosition(r.target.position)}let u=null;r.target.type!==1&&(u=r.event),this.showContextMenu(u)}showContextMenu(r){if(!this._editor.getOption(24)||!this._editor.hasModel())return;const u=this._getMenuActions(this._editor.getModel(),this._editor.contextMenuId);u.length>0&&this._doShowContextMenu(u,r)}_getMenuActions(r,u){const C=[],f=this._menuService.getMenuActions(u,this._contextKeyService,{arg:r.uri});for(const h of f){const[,v]=h;let w=0;for(const S of v)if(S instanceof p.SubmenuItemAction){const L=this._getMenuActions(r,S.item.submenu);L.length>0&&(C.push(new I.SubmenuAction(S.id,S.label,L)),w++)}else C.push(S),w++;w&&C.push(new I.Separator)}return C.length&&C.pop(),C}_doShowContextMenu(r,u=null){if(!this._editor.hasModel())return;const C=this._editor.getOption(60);this._editor.updateOptions({hover:{enabled:!1}});let f=u;if(!f){this._editor.revealPosition(this._editor.getPosition(),1),this._editor.render();const v=this._editor.getScrolledVisiblePosition(this._editor.getPosition()),w=d.getDomNodePagePosition(this._editor.getDomNode()),S=w.left+v.left,L=w.top+v.top+v.height;f={x:S,y:L}}const h=this._editor.getOption(128)&&!y.isIOS;this._contextMenuIsBeingShownCount++,this._contextMenuService.showContextMenu({domForShadowRoot:h?this._editor.getOverflowWidgetsDomNode()??this._editor.getDomNode():void 0,getAnchor:()=>f,getActions:()=>r,getActionViewItem:v=>{const w=this._keybindingFor(v);if(w)return new k.ActionViewItem(v,v,{label:!0,keybinding:w.getLabel(),isMenu:!0});const S=v;return typeof S.getActionViewItem=="function"?S.getActionViewItem():new k.ActionViewItem(v,v,{icon:!0,label:!0,isMenu:!0})},getKeyBinding:v=>this._keybindingFor(v),onHide:v=>{this._contextMenuIsBeingShownCount--,this._editor.updateOptions({hover:C})}})}_showScrollbarContextMenu(r){if(!this._editor.hasModel()||(0,s.isStandaloneEditorWorkspace)(this._workspaceContextService.getWorkspace()))return;const u=this._editor.getOption(73);let C=0;const f=L=>({id:`menu-action-${++C}`,label:L.label,tooltip:"",class:void 0,enabled:typeof L.enabled>"u"?!0:L.enabled,checked:L.checked,run:L.run}),h=(L,D)=>new I.SubmenuAction(`menu-action-${++C}`,L,D,void 0),v=(L,D,T,M,A)=>{if(!D)return f({label:L,enabled:D,run:()=>{}});const P=O=>()=>{this._configurationService.updateValue(T,O)},N=[];for(const O of A)N.push(f({label:O.label,checked:M===O.value,run:P(O.value)}));return h(L,N)},w=[];w.push(f({label:b.localize(811,"Minimap"),checked:u.enabled,run:()=>{this._configurationService.updateValue("editor.minimap.enabled",!u.enabled)}})),w.push(new I.Separator),w.push(f({label:b.localize(812,"Render Characters"),enabled:u.enabled,checked:u.renderCharacters,run:()=>{this._configurationService.updateValue("editor.minimap.renderCharacters",!u.renderCharacters)}})),w.push(v(b.localize(813,"Vertical size"),u.enabled,"editor.minimap.size",u.size,[{label:b.localize(814,"Proportional"),value:"proportional"},{label:b.localize(815,"Fill"),value:"fill"},{label:b.localize(816,"Fit"),value:"fit"}])),w.push(v(b.localize(817,"Slider"),u.enabled,"editor.minimap.showSlider",u.showSlider,[{label:b.localize(818,"Mouse Over"),value:"mouseover"},{label:b.localize(819,"Always"),value:"always"}]));const S=this._editor.getOption(128)&&!y.isIOS;this._contextMenuIsBeingShownCount++,this._contextMenuService.showContextMenu({domForShadowRoot:S?this._editor.getDomNode():void 0,getAnchor:()=>r,getActions:()=>w,onHide:L=>{this._contextMenuIsBeingShownCount--,this._editor.focus()}})}_keybindingFor(r){return this._keybindingService.lookupKeybinding(r.id)}dispose(){this._contextMenuIsBeingShownCount>0&&this._contextViewService.hideContextView(),this._toDispose.dispose()}};e.ContextMenuController=c,e.ContextMenuController=c=g=ke([ce(1,o.IContextMenuService),ce(2,o.IContextViewService),ce(3,n.IContextKeyService),ce(4,t.IKeybindingService),ce(5,p.IMenuService),ce(6,i.IConfigurationService),ce(7,s.IWorkspaceContextService)],c);class l extends m.EditorAction{constructor(){super({id:"editor.action.showContextMenu",label:b.localize(820,"Show Editor Context Menu"),alias:"Show Editor Context Menu",precondition:void 0,kbOpts:{kbExpr:_.EditorContextKeys.textInputFocus,primary:1092,weight:100}})}run(r,u){c.get(u)?.showContextMenu()}}(0,m.registerEditorContribution)(c.ID,c,2),(0,m.registerEditorAction)(l)}),define(ne[293],se([1,0,13,194,91,2,128,42,48,22,27,17,3,186]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DefaultPasteProvidersFeature=e.DefaultDropProvidersFeature=e.DefaultTextPasteOrDropEditProvider=void 0;class i{async provideDocumentPasteEdits(f,h,v,w,S){const L=await this.getEdit(v,S);if(L)return{edits:[{insertText:L.insertText,title:L.title,kind:L.kind,handledMimeType:L.handledMimeType,yieldTo:L.yieldTo}],dispose(){}}}async provideDocumentDropEdits(f,h,v,w){const S=await this.getEdit(v,w);if(S)return{edits:[{insertText:S.insertText,title:S.title,kind:S.kind,handledMimeType:S.handledMimeType,yieldTo:S.yieldTo}],dispose(){}}}}class s extends i{constructor(){super(...arguments),this.kind=s.kind,this.dropMimeTypes=[y.Mimes.text],this.pasteMimeTypes=[y.Mimes.text]}static{this.id="text"}static{this.kind=new I.HierarchicalKind("text.plain")}async getEdit(f,h){const v=f.get(y.Mimes.text);if(!v||f.has(y.Mimes.uriList))return;const w=await v.asString();return{handledMimeType:y.Mimes.text,title:(0,o.localize)(833,"Insert Plain Text"),insertText:w,kind:this.kind}}}e.DefaultTextPasteOrDropEditProvider=s;class g extends i{constructor(){super(...arguments),this.kind=new I.HierarchicalKind("uri.absolute"),this.dropMimeTypes=[y.Mimes.uriList],this.pasteMimeTypes=[y.Mimes.uriList]}async getEdit(f,h){const v=await a(f);if(!v.length||h.isCancellationRequested)return;let w=0;const S=v.map(({uri:D,originalText:T})=>D.scheme===m.Schemas.file?D.fsPath:(w++,T)).join(" ");let L;return w>0?L=v.length>1?(0,o.localize)(834,"Insert Uris"):(0,o.localize)(835,"Insert Uri"):L=v.length>1?(0,o.localize)(836,"Insert Paths"):(0,o.localize)(837,"Insert Path"),{handledMimeType:y.Mimes.uriList,insertText:S,title:L,kind:this.kind}}}let c=class extends i{constructor(f){super(),this._workspaceContextService=f,this.kind=new I.HierarchicalKind("uri.relative"),this.dropMimeTypes=[y.Mimes.uriList],this.pasteMimeTypes=[y.Mimes.uriList]}async getEdit(f,h){const v=await a(f);if(!v.length||h.isCancellationRequested)return;const w=(0,d.coalesce)(v.map(({uri:S})=>{const L=this._workspaceContextService.getWorkspaceFolder(S);return L?(0,_.relativePath)(L.uri,S):void 0}));if(w.length)return{handledMimeType:y.Mimes.uriList,insertText:w.join(" "),title:v.length>1?(0,o.localize)(838,"Insert Relative Paths"):(0,o.localize)(839,"Insert Relative Path"),kind:this.kind}}};c=ke([ce(0,t.IWorkspaceContextService)],c);class l{constructor(){this.kind=new I.HierarchicalKind("html"),this.pasteMimeTypes=["text/html"],this._yieldTo=[{mimeType:y.Mimes.text}]}async provideDocumentPasteEdits(f,h,v,w,S){if(w.triggerKind!==p.DocumentPasteTriggerKind.PasteAs&&!w.only?.contains(this.kind))return;const D=await v.get("text/html")?.asString();if(!(!D||S.isCancellationRequested))return{dispose(){},edits:[{insertText:D,yieldTo:this._yieldTo,title:(0,o.localize)(840,"Insert HTML"),kind:this.kind}]}}}async function a(C){const f=C.get(y.Mimes.uriList);if(!f)return[];const h=await f.asString(),v=[];for(const w of k.UriList.parse(h))try{v.push({uri:b.URI.parse(w),originalText:w})}catch{}return v}let r=class extends E.Disposable{constructor(f,h){super(),this._register(f.documentDropEditProvider.register("*",new s)),this._register(f.documentDropEditProvider.register("*",new g)),this._register(f.documentDropEditProvider.register("*",new c(h)))}};e.DefaultDropProvidersFeature=r,e.DefaultDropProvidersFeature=r=ke([ce(0,n.ILanguageFeaturesService),ce(1,t.IWorkspaceContextService)],r);let u=class extends E.Disposable{constructor(f,h){super(),this._register(f.documentPasteEditProvider.register("*",new s)),this._register(f.documentPasteEditProvider.register("*",new g)),this._register(f.documentPasteEditProvider.register("*",new c(h))),this._register(f.documentPasteEditProvider.register("*",new l))}};e.DefaultPasteProvidersFeature=u,e.DefaultPasteProvidersFeature=u=ke([ce(0,n.ILanguageFeaturesService),ce(1,t.IWorkspaceContextService)],u)}),define(ne[435],se([1,0,5,13,14,18,194,91,2,128,16,193,212,400,152,4,27,17,293,268,122,290,184,3,117,12,7,96,66,396,8]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S,L,D,T){"use strict";var M;Object.defineProperty(e,"__esModule",{value:!0}),e.CopyPasteController=e.pasteWidgetVisibleCtx=e.changePasteTypeCommandId=void 0,e.changePasteTypeCommandId="editor.changePasteType",e.pasteWidgetVisibleCtx=new v.RawContextKey("pasteWidgetVisible",!1,(0,f.localize)(826,"Whether the paste widget is showing"));const A="application/vnd.code.copyMetadata";let P=class extends _.Disposable{static{M=this}static{this.ID="editor.contrib.copyPasteActionController"}static get(O){return O.getContribution(M.ID)}constructor(O,F,x,W,V,q,H){super(),this._bulkEditService=x,this._clipboardService=W,this._languageFeaturesService=V,this._quickInputService=q,this._progressService=H,this._editor=O;const z=O.getContainerDomNode();this._register((0,d.addDisposableListener)(z,"copy",U=>this.handleCopy(U))),this._register((0,d.addDisposableListener)(z,"cut",U=>this.handleCopy(U))),this._register((0,d.addDisposableListener)(z,"paste",U=>this.handlePaste(U),!0)),this._pasteProgressManager=this._register(new u.InlineProgressManager("pasteIntoEditor",O,F)),this._postPasteWidgetManager=this._register(F.createInstance(D.PostEditWidgetManager,"pasteIntoEditor",O,e.pasteWidgetVisibleCtx,{id:e.changePasteTypeCommandId,label:(0,f.localize)(827,"Show paste options...")}))}changePasteType(){this._postPasteWidgetManager.tryShowSelector()}pasteAs(O){this._editor.focus();try{this._pasteAsActionContext={preferred:O},(0,d.getActiveDocument)().execCommand("paste")}finally{this._pasteAsActionContext=void 0}}clearWidgets(){this._postPasteWidgetManager.clear()}isPasteAsEnabled(){return this._editor.getOption(85).enabled}async finishedPaste(){await this._currentPasteOperation}handleCopy(O){if(!this._editor.hasTextFocus()||(this._clipboardService.clearInternalState?.(),!O.clipboardData||!this.isPasteAsEnabled()))return;const F=this._editor.getModel(),x=this._editor.getSelections();if(!F||!x?.length)return;const W=this._editor.getOption(37);let V=x;const q=x.length===1&&x[0].isEmpty();if(q){if(!W)return;V=[new s.Range(V[0].startLineNumber,1,V[0].startLineNumber,1+F.getLineLength(V[0].startLineNumber))]}const H=this._editor._getViewModel()?.getPlainTextToCopy(x,W,p.isWindows),U={multicursorText:Array.isArray(H)?H:null,pasteOnNewLine:q,mode:null},j=this._languageFeaturesService.documentPasteEditProvider.ordered(F).filter(J=>!!J.prepareDocumentPaste);if(!j.length){this.setCopyMetadata(O.clipboardData,{defaultPastePayload:U});return}const Y=(0,t.toVSDataTransfer)(O.clipboardData),G=j.flatMap(J=>J.copyMimeTypes??[]),K=(0,n.generateUuid)();this.setCopyMetadata(O.clipboardData,{id:K,providerCopyMimeTypes:G,defaultPastePayload:U});const R=(0,I.createCancelablePromise)(async J=>{const ie=(0,k.coalesce)(await Promise.all(j.map(async ue=>{try{return await ue.prepareDocumentPaste(F,V,Y,J)}catch(he){console.error(he);return}})));ie.reverse();for(const ue of ie)for(const[he,pe]of ue)Y.replace(he,pe);return Y});M._currentCopyOperation?.dataTransferPromise.cancel(),M._currentCopyOperation={handle:K,dataTransferPromise:R}}async handlePaste(O){if(!O.clipboardData||!this._editor.hasTextFocus())return;C.MessageController.get(this._editor)?.closeMessage(),this._currentPasteOperation?.cancel(),this._currentPasteOperation=void 0;const F=this._editor.getModel(),x=this._editor.getSelections();if(!x?.length||!F||this._editor.getOption(92)||!this.isPasteAsEnabled()&&!this._pasteAsActionContext)return;const W=this.fetchCopyMetadata(O),V=(0,t.toExternalVSDataTransfer)(O.clipboardData);V.delete(A);const q=[...O.clipboardData.types,...W?.providerCopyMimeTypes??[],b.Mimes.uriList],H=this._languageFeaturesService.documentPasteEditProvider.ordered(F).filter(z=>{const U=this._pasteAsActionContext?.preferred;return U&&z.providedPasteEditKinds&&!this.providerMatchesPreference(z,U)?!1:z.pasteMimeTypes?.some(j=>(0,y.matchesMimeType)(j,q))});if(!H.length){this._pasteAsActionContext?.preferred&&this.showPasteAsNoEditMessage(x,this._pasteAsActionContext.preferred);return}O.preventDefault(),O.stopImmediatePropagation(),this._pasteAsActionContext?this.showPasteAsPick(this._pasteAsActionContext.preferred,H,x,V,W):this.doPasteInline(H,x,V,W,O)}showPasteAsNoEditMessage(O,F){C.MessageController.get(this._editor)?.showMessage((0,f.localize)(828,"No paste edits for '{0}' found",F instanceof m.HierarchicalKind?F.value:F.providerId),O[0].getStartPosition())}doPasteInline(O,F,x,W,V){const q=this._editor;if(!q.hasModel())return;const H=new r.EditorStateCancellationTokenSource(q,3,void 0),z=(0,I.createCancelablePromise)(async U=>{const j=this._editor;if(!j.hasModel())return;const Y=j.getModel(),G=new _.DisposableStore,K=G.add(new E.CancellationTokenSource(U));G.add(H.token.onCancellationRequested(()=>K.cancel()));const R=K.token;try{if(await this.mergeInDataFromCopy(x,W,R),R.isCancellationRequested)return;const J=O.filter(he=>this.isSupportedPasteProvider(he,x));if(!J.length||J.length===1&&J[0]instanceof l.DefaultTextPasteOrDropEditProvider)return this.applyDefaultPasteHandler(x,W,R,V);const ie={triggerKind:g.DocumentPasteTriggerKind.Automatic},ue=await this.getPasteEdits(J,x,Y,F,ie,R);if(G.add(ue),R.isCancellationRequested)return;if(ue.edits.length===1&&ue.edits[0].provider instanceof l.DefaultTextPasteOrDropEditProvider)return this.applyDefaultPasteHandler(x,W,R,V);if(ue.edits.length){const he=j.getOption(85).showPasteSelector==="afterPaste";return this._postPasteWidgetManager.applyEditAndShowIfNeeded(F,{activeEditIndex:0,allEdits:ue.edits},he,(pe,ae)=>new Promise((ee,de)=>{(async()=>{try{const ge=pe.provider.resolveDocumentPasteEdit?.(pe,ae),X=new I.DeferredPromise,B=ge&&await this._pasteProgressManager.showWhile(F[0].getEndPosition(),(0,f.localize)(829,"Resolving paste edit. Click to cancel"),Promise.race([X.p,ge]),{cancel:()=>(X.cancel(),de(new T.CancellationError))},0);return B&&(pe.additionalEdit=B.additionalEdit),ee(pe)}catch(ge){return de(ge)}})()}),R)}await this.applyDefaultPasteHandler(x,W,R,V)}finally{G.dispose(),this._currentPasteOperation===z&&(this._currentPasteOperation=void 0)}});this._pasteProgressManager.showWhile(F[0].getEndPosition(),(0,f.localize)(830,"Running paste handlers. Click to cancel and do basic paste"),z,{cancel:async()=>{try{if(z.cancel(),H.token.isCancellationRequested)return;await this.applyDefaultPasteHandler(x,W,H.token,V)}finally{H.dispose()}}}).then(()=>{H.dispose()}),this._currentPasteOperation=z}showPasteAsPick(O,F,x,W,V){const q=(0,I.createCancelablePromise)(async H=>{const z=this._editor;if(!z.hasModel())return;const U=z.getModel(),j=new _.DisposableStore,Y=j.add(new r.EditorStateCancellationTokenSource(z,3,void 0,H));try{if(await this.mergeInDataFromCopy(W,V,Y.token),Y.token.isCancellationRequested)return;let G=F.filter(ue=>this.isSupportedPasteProvider(ue,W,O));O&&(G=G.filter(ue=>this.providerMatchesPreference(ue,O)));const K={triggerKind:g.DocumentPasteTriggerKind.PasteAs,only:O&&O instanceof m.HierarchicalKind?O:void 0};let R=j.add(await this.getPasteEdits(G,W,U,x,K,Y.token));if(Y.token.isCancellationRequested)return;if(O&&(R={edits:R.edits.filter(ue=>O instanceof m.HierarchicalKind?O.contains(ue.kind):O.providerId===ue.provider.id),dispose:R.dispose}),!R.edits.length){K.only&&this.showPasteAsNoEditMessage(x,K.only);return}let J;if(O?J=R.edits.at(0):J=(await this._quickInputService.pick(R.edits.map(he=>({label:he.title,description:he.kind?.value,edit:he})),{placeHolder:(0,f.localize)(831,"Select Paste Action")}))?.edit,!J)return;const ie=(0,a.createCombinedWorkspaceEdit)(U.uri,x,J);await this._bulkEditService.apply(ie,{editor:this._editor})}finally{j.dispose(),this._currentPasteOperation===q&&(this._currentPasteOperation=void 0)}});this._progressService.withProgress({location:10,title:(0,f.localize)(832,"Running paste handlers")},()=>q)}setCopyMetadata(O,F){O.setData(A,JSON.stringify(F))}fetchCopyMetadata(O){if(!O.clipboardData)return;const F=O.clipboardData.getData(A);if(F)try{return JSON.parse(F)}catch{return}const[x,W]=o.ClipboardEventUtils.getTextData(O.clipboardData);if(W)return{defaultPastePayload:{mode:W.mode,multicursorText:W.multicursorText??null,pasteOnNewLine:!!W.isFromEmptySelection}}}async mergeInDataFromCopy(O,F,x){if(F?.id&&M._currentCopyOperation?.handle===F.id){const W=await M._currentCopyOperation.dataTransferPromise;if(x.isCancellationRequested)return;for(const[V,q]of W)O.replace(V,q)}if(!O.has(b.Mimes.uriList)){const W=await this._clipboardService.readResources();if(x.isCancellationRequested)return;W.length&&O.append(b.Mimes.uriList,(0,y.createStringDataTransferItem)(y.UriList.create(W)))}}async getPasteEdits(O,F,x,W,V,q){const H=new _.DisposableStore,z=await(0,I.raceCancellation)(Promise.all(O.map(async j=>{try{const Y=await j.provideDocumentPasteEdits?.(x,W,F,V,q);return Y&&H.add(Y),Y?.edits?.map(G=>({...G,provider:j}))}catch(Y){(0,T.isCancellationError)(Y)||console.error(Y);return}})),q),U=(0,k.coalesce)(z??[]).flat().filter(j=>!V.only||V.only.contains(j.kind));return{edits:(0,a.sortEditsByYieldTo)(U),dispose:()=>H.dispose()}}async applyDefaultPasteHandler(O,F,x,W){const q=await(O.get(b.Mimes.text)??O.get("text"))?.asString()??"";if(x.isCancellationRequested)return;const H={clipboardEvent:W,text:q,pasteOnNewLine:F?.defaultPastePayload.pasteOnNewLine??!1,multicursorText:F?.defaultPastePayload.multicursorText??null,mode:null};this._editor.trigger("keyboard","paste",H)}isSupportedPasteProvider(O,F,x){return O.pasteMimeTypes?.some(W=>F.matches(W))?!x||this.providerMatchesPreference(O,x):!1}providerMatchesPreference(O,F){return F instanceof m.HierarchicalKind?O.providedPasteEditKinds?O.providedPasteEditKinds.some(x=>F.contains(x)):!0:O.id===F.providerId}};e.CopyPasteController=P,e.CopyPasteController=P=M=ke([ce(1,w.IInstantiationService),ce(2,i.IBulkEditService),ce(3,h.IClipboardService),ce(4,c.ILanguageFeaturesService),ce(5,L.IQuickInputService),ce(6,S.IProgressService)],P)}),define(ne[856],se([1,0,64,5,16,212,15,34,20,435,3,29,117,12]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PasteAction=e.CopyAction=e.CutAction=void 0;const i="9_cutcopypaste",s=I.isNative||document.queryCommandSupported("cut"),g=I.isNative||document.queryCommandSupported("copy"),c=typeof navigator.clipboard>"u"||d.isFirefox?document.queryCommandSupported("paste"):!0;function l(u){return u.register(),u}e.CutAction=s?l(new y.MultiCommand({id:"editor.action.clipboardCutAction",precondition:void 0,kbOpts:I.isNative?{primary:2102,win:{primary:2102,secondary:[1044]},weight:100}:void 0,menuOpts:[{menuId:n.MenuId.MenubarEditMenu,group:"2_ccp",title:p.localize(725,"Cu&&t"),order:1},{menuId:n.MenuId.EditorContext,group:i,title:p.localize(726,"Cut"),when:_.EditorContextKeys.writable,order:1},{menuId:n.MenuId.CommandPalette,group:"",title:p.localize(727,"Cut"),order:1},{menuId:n.MenuId.SimpleEditorContext,group:i,title:p.localize(728,"Cut"),when:_.EditorContextKeys.writable,order:1}]})):void 0,e.CopyAction=g?l(new y.MultiCommand({id:"editor.action.clipboardCopyAction",precondition:void 0,kbOpts:I.isNative?{primary:2081,win:{primary:2081,secondary:[2067]},weight:100}:void 0,menuOpts:[{menuId:n.MenuId.MenubarEditMenu,group:"2_ccp",title:p.localize(729,"&&Copy"),order:2},{menuId:n.MenuId.EditorContext,group:i,title:p.localize(730,"Copy"),order:2},{menuId:n.MenuId.CommandPalette,group:"",title:p.localize(731,"Copy"),order:1},{menuId:n.MenuId.SimpleEditorContext,group:i,title:p.localize(732,"Copy"),order:2}]})):void 0,n.MenuRegistry.appendMenuItem(n.MenuId.MenubarEditMenu,{submenu:n.MenuId.MenubarCopy,title:p.localize2(738,"Copy As"),group:"2_ccp",order:3}),n.MenuRegistry.appendMenuItem(n.MenuId.EditorContext,{submenu:n.MenuId.EditorContextCopy,title:p.localize2(739,"Copy As"),group:i,order:3}),n.MenuRegistry.appendMenuItem(n.MenuId.EditorContext,{submenu:n.MenuId.EditorContextShare,title:p.localize2(740,"Share"),group:"11_share",order:-1,when:t.ContextKeyExpr.and(t.ContextKeyExpr.notEquals("resourceScheme","output"),_.EditorContextKeys.editorTextFocus)}),n.MenuRegistry.appendMenuItem(n.MenuId.ExplorerContext,{submenu:n.MenuId.ExplorerContextShare,title:p.localize2(741,"Share"),group:"11_share",order:-1}),e.PasteAction=c?l(new y.MultiCommand({id:"editor.action.clipboardPasteAction",precondition:void 0,kbOpts:I.isNative?{primary:2100,win:{primary:2100,secondary:[1043]},linux:{primary:2100,secondary:[1043]},weight:100}:void 0,menuOpts:[{menuId:n.MenuId.MenubarEditMenu,group:"2_ccp",title:p.localize(733,"&&Paste"),order:4},{menuId:n.MenuId.EditorContext,group:i,title:p.localize(734,"Paste"),when:_.EditorContextKeys.writable,order:4},{menuId:n.MenuId.CommandPalette,group:"",title:p.localize(735,"Paste"),order:1},{menuId:n.MenuId.SimpleEditorContext,group:i,title:p.localize(736,"Paste"),when:_.EditorContextKeys.writable,order:4}]})):void 0;class a extends y.EditorAction{constructor(){super({id:"editor.action.clipboardCopyWithSyntaxHighlightingAction",label:p.localize(737,"Copy With Syntax Highlighting"),alias:"Copy With Syntax Highlighting",precondition:void 0,kbOpts:{kbExpr:_.EditorContextKeys.textInputFocus,primary:0,weight:100}})}run(C,f){!f.hasModel()||!f.getOption(37)&&f.getSelection().isEmpty()||(E.CopyOptions.forceCopyWithSyntaxHighlighting=!0,f.focus(),f.getContainerDomNode().ownerDocument.execCommand("copy"),E.CopyOptions.forceCopyWithSyntaxHighlighting=!1)}}function r(u,C){u&&(u.addImplementation(1e4,"code-editor",(f,h)=>{const v=f.get(m.ICodeEditorService).getFocusedCodeEditor();if(v&&v.hasTextFocus()){const w=v.getOption(37),S=v.getSelection();return S&&S.isEmpty()&&!w||v.getContainerDomNode().ownerDocument.execCommand(C),!0}return!1}),u.addImplementation(0,"generic-dom",(f,h)=>((0,k.getActiveDocument)().execCommand(C),!0)))}r(e.CutAction,"cut"),r(e.CopyAction,"copy"),e.PasteAction&&(e.PasteAction.addImplementation(1e4,"code-editor",(u,C)=>{const f=u.get(m.ICodeEditorService),h=u.get(o.IClipboardService),v=f.getFocusedCodeEditor();return v&&v.hasTextFocus()?v.getContainerDomNode().ownerDocument.execCommand("paste")?b.CopyPasteController.get(v)?.finishedPaste()??Promise.resolve():I.isWeb?(async()=>{const S=await h.readText();if(S!==""){const L=E.InMemoryClipboardMetadataManager.INSTANCE.get(S);let D=!1,T=null,M=null;L&&(D=v.getOption(37)&&!!L.isFromEmptySelection,T=typeof L.multicursorText<"u"?L.multicursorText:null,M=L.mode),v.trigger("keyboard","paste",{text:S,pasteOnNewLine:D,multicursorText:T,mode:M})}})():!0:!1}),e.PasteAction.addImplementation(0,"generic-dom",(u,C)=>((0,k.getActiveDocument)().execCommand("paste"),!0))),g&&(0,y.registerEditorAction)(a)}),define(ne[857],se([1,0,91,15,20,130,435,293,3]),function(oe,e,d,k,I,E,y,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),(0,k.registerEditorContribution)(y.CopyPasteController.ID,y.CopyPasteController,0),(0,E.registerEditorFeature)(m.DefaultPasteProvidersFeature),(0,k.registerEditorCommand)(new class extends k.EditorCommand{constructor(){super({id:y.changePasteTypeCommandId,precondition:y.pasteWidgetVisibleCtx,kbOpts:{weight:100,primary:2137}})}runEditorCommand(b,p){return y.CopyPasteController.get(p)?.changePasteType()}}),(0,k.registerEditorCommand)(new class extends k.EditorCommand{constructor(){super({id:"editor.hidePasteWidget",precondition:y.pasteWidgetVisibleCtx,kbOpts:{weight:100,primary:9}})}runEditorCommand(b,p){y.CopyPasteController.get(p)?.clearWidgets()}}),(0,k.registerEditorAction)(class bi extends k.EditorAction{static{this.argsSchema={type:"object",properties:{kind:{type:"string",description:_.localize(823,"The kind of the paste edit to try applying. If not provided or there are multiple edits for this kind, the editor will show a picker.")}}}}constructor(){super({id:"editor.action.pasteAs",label:_.localize(824,"Paste As..."),alias:"Paste As...",precondition:I.EditorContextKeys.writable,metadata:{description:"Paste as",args:[{name:"args",schema:bi.argsSchema}]}})}run(p,n,o){let t=typeof o?.kind=="string"?o.kind:void 0;return!t&&o&&(t=typeof o.id=="string"?o.id:void 0),y.CopyPasteController.get(n)?.pasteAs(t?new d.HierarchicalKind(t):void 0)}}),(0,k.registerEditorAction)(class extends k.EditorAction{constructor(){super({id:"editor.action.pasteAsText",label:_.localize(825,"Paste as Text"),alias:"Paste as Text",precondition:I.EditorContextKeys.writable})}run(b,p){return y.CopyPasteController.get(p)?.pasteAs({providerId:m.DefaultTextPasteOrDropEditProvider.id})}})}),define(ne[858],se([1,0,15,274,130,293,3,109,38,832]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),(0,d.registerEditorContribution)(b.DropIntoEditorController.ID,b.DropIntoEditorController,2),(0,I.registerEditorFeature)(E.DefaultDropProvidersFeature),(0,d.registerEditorCommand)(new class extends d.EditorCommand{constructor(){super({id:b.changeDropTypeCommandId,precondition:b.dropWidgetVisibleCtx,kbOpts:{weight:100,primary:2137}})}runEditorCommand(p,n,o){b.DropIntoEditorController.get(n)?.changeDropType()}}),(0,d.registerEditorCommand)(new class extends d.EditorCommand{constructor(){super({id:"editor.hideDropWidget",precondition:b.dropWidgetVisibleCtx,kbOpts:{weight:100,primary:9}})}runEditorCommand(p,n,o){b.DropIntoEditorController.get(n)?.clearWidgets()}}),_.Registry.as(m.Extensions.Configuration).registerConfiguration({...k.editorConfigurationBaseNode,properties:{[b.defaultProviderConfig]:{type:"object",scope:5,description:y.localize(841,"Configures the default drop provider to use for content of a given mime type."),default:{},additionalProperties:{type:"string"}}}})}),define(ne[859],se([1,0,629,99,48,11,193,36,135,3,186]),function(oe,e,d,k,I,E,y,m,_,b,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RandomBasedVariableResolver=e.WorkspaceBasedVariableResolver=e.TimeBasedVariableResolver=e.CommentBasedVariableResolver=e.ClipboardBasedVariableResolver=e.ModelBasedVariableResolver=e.SelectionBasedVariableResolver=e.CompositeSnippetVariableResolver=e.KnownSnippetVariableNames=void 0,e.KnownSnippetVariableNames=Object.freeze({CURRENT_YEAR:!0,CURRENT_YEAR_SHORT:!0,CURRENT_MONTH:!0,CURRENT_DATE:!0,CURRENT_HOUR:!0,CURRENT_MINUTE:!0,CURRENT_SECOND:!0,CURRENT_DAY_NAME:!0,CURRENT_DAY_NAME_SHORT:!0,CURRENT_MONTH_NAME:!0,CURRENT_MONTH_NAME_SHORT:!0,CURRENT_SECONDS_UNIX:!0,CURRENT_TIMEZONE_OFFSET:!0,SELECTION:!0,CLIPBOARD:!0,TM_SELECTED_TEXT:!0,TM_CURRENT_LINE:!0,TM_CURRENT_WORD:!0,TM_LINE_INDEX:!0,TM_LINE_NUMBER:!0,TM_FILENAME:!0,TM_FILENAME_BASE:!0,TM_DIRECTORY:!0,TM_FILEPATH:!0,CURSOR_INDEX:!0,CURSOR_NUMBER:!0,RELATIVE_FILEPATH:!0,BLOCK_COMMENT_START:!0,BLOCK_COMMENT_END:!0,LINE_COMMENT:!0,WORKSPACE_NAME:!0,WORKSPACE_FOLDER:!0,RANDOM:!0,RANDOM_HEX:!0,UUID:!0});class n{constructor(r){this._delegates=r}resolve(r){for(const u of this._delegates){const C=u.resolve(r);if(C!==void 0)return C}}}e.CompositeSnippetVariableResolver=n;class o{constructor(r,u,C,f){this._model=r,this._selection=u,this._selectionIdx=C,this._overtypingCapturer=f}resolve(r){const{name:u}=r;if(u==="SELECTION"||u==="TM_SELECTED_TEXT"){let C=this._model.getValueInRange(this._selection)||void 0,f=this._selection.startLineNumber!==this._selection.endLineNumber;if(!C&&this._overtypingCapturer){const h=this._overtypingCapturer.getLastOvertypedInfo(this._selectionIdx);h&&(C=h.value,f=h.multiline)}if(C&&f&&r.snippet){const h=this._model.getLineContent(this._selection.startLineNumber),v=(0,E.getLeadingWhitespace)(h,0,this._selection.startColumn-1);let w=v;r.snippet.walk(L=>L===r?!1:(L instanceof _.Text&&(w=(0,E.getLeadingWhitespace)((0,E.splitLines)(L.value).pop())),!0));const S=(0,E.commonPrefixLength)(w,v);C=C.replace(/(\r\n|\r|\n)(.*)/g,(L,D,T)=>`${D}${w.substr(S)}${T}`)}return C}else{if(u==="TM_CURRENT_LINE")return this._model.getLineContent(this._selection.positionLineNumber);if(u==="TM_CURRENT_WORD"){const C=this._model.getWordAtPosition({lineNumber:this._selection.positionLineNumber,column:this._selection.positionColumn});return C&&C.word||void 0}else{if(u==="TM_LINE_INDEX")return String(this._selection.positionLineNumber-1);if(u==="TM_LINE_NUMBER")return String(this._selection.positionLineNumber);if(u==="CURSOR_INDEX")return String(this._selectionIdx);if(u==="CURSOR_NUMBER")return String(this._selectionIdx+1)}}}}e.SelectionBasedVariableResolver=o;class t{constructor(r,u){this._labelService=r,this._model=u}resolve(r){const{name:u}=r;if(u==="TM_FILENAME")return k.basename(this._model.uri.fsPath);if(u==="TM_FILENAME_BASE"){const C=k.basename(this._model.uri.fsPath),f=C.lastIndexOf(".");return f<=0?C:C.slice(0,f)}else{if(u==="TM_DIRECTORY")return k.dirname(this._model.uri.fsPath)==="."?"":this._labelService.getUriLabel((0,I.dirname)(this._model.uri));if(u==="TM_FILEPATH")return this._labelService.getUriLabel(this._model.uri);if(u==="RELATIVE_FILEPATH")return this._labelService.getUriLabel(this._model.uri,{relative:!0,noPrefix:!0})}}}e.ModelBasedVariableResolver=t;class i{constructor(r,u,C,f){this._readClipboardText=r,this._selectionIdx=u,this._selectionCount=C,this._spread=f}resolve(r){if(r.name!=="CLIPBOARD")return;const u=this._readClipboardText();if(u){if(this._spread){const C=u.split(/\r\n|\n|\r/).filter(f=>!(0,E.isFalsyOrWhitespace)(f));if(C.length===this._selectionCount)return C[this._selectionIdx]}return u}}}e.ClipboardBasedVariableResolver=i;let s=class{constructor(r,u,C){this._model=r,this._selection=u,this._languageConfigurationService=C}resolve(r){const{name:u}=r,C=this._model.getLanguageIdAtPosition(this._selection.selectionStartLineNumber,this._selection.selectionStartColumn),f=this._languageConfigurationService.getLanguageConfiguration(C).comments;if(f){if(u==="LINE_COMMENT")return f.lineCommentToken||void 0;if(u==="BLOCK_COMMENT_START")return f.blockCommentStartToken||void 0;if(u==="BLOCK_COMMENT_END")return f.blockCommentEndToken||void 0}}};e.CommentBasedVariableResolver=s,e.CommentBasedVariableResolver=s=ke([ce(2,m.ILanguageConfigurationService)],s);class g{constructor(){this._date=new Date}static{this.dayNames=[b.localize(1261,"Sunday"),b.localize(1262,"Monday"),b.localize(1263,"Tuesday"),b.localize(1264,"Wednesday"),b.localize(1265,"Thursday"),b.localize(1266,"Friday"),b.localize(1267,"Saturday")]}static{this.dayNamesShort=[b.localize(1268,"Sun"),b.localize(1269,"Mon"),b.localize(1270,"Tue"),b.localize(1271,"Wed"),b.localize(1272,"Thu"),b.localize(1273,"Fri"),b.localize(1274,"Sat")]}static{this.monthNames=[b.localize(1275,"January"),b.localize(1276,"February"),b.localize(1277,"March"),b.localize(1278,"April"),b.localize(1279,"May"),b.localize(1280,"June"),b.localize(1281,"July"),b.localize(1282,"August"),b.localize(1283,"September"),b.localize(1284,"October"),b.localize(1285,"November"),b.localize(1286,"December")]}static{this.monthNamesShort=[b.localize(1287,"Jan"),b.localize(1288,"Feb"),b.localize(1289,"Mar"),b.localize(1290,"Apr"),b.localize(1291,"May"),b.localize(1292,"Jun"),b.localize(1293,"Jul"),b.localize(1294,"Aug"),b.localize(1295,"Sep"),b.localize(1296,"Oct"),b.localize(1297,"Nov"),b.localize(1298,"Dec")]}resolve(r){const{name:u}=r;if(u==="CURRENT_YEAR")return String(this._date.getFullYear());if(u==="CURRENT_YEAR_SHORT")return String(this._date.getFullYear()).slice(-2);if(u==="CURRENT_MONTH")return String(this._date.getMonth().valueOf()+1).padStart(2,"0");if(u==="CURRENT_DATE")return String(this._date.getDate().valueOf()).padStart(2,"0");if(u==="CURRENT_HOUR")return String(this._date.getHours().valueOf()).padStart(2,"0");if(u==="CURRENT_MINUTE")return String(this._date.getMinutes().valueOf()).padStart(2,"0");if(u==="CURRENT_SECOND")return String(this._date.getSeconds().valueOf()).padStart(2,"0");if(u==="CURRENT_DAY_NAME")return g.dayNames[this._date.getDay()];if(u==="CURRENT_DAY_NAME_SHORT")return g.dayNamesShort[this._date.getDay()];if(u==="CURRENT_MONTH_NAME")return g.monthNames[this._date.getMonth()];if(u==="CURRENT_MONTH_NAME_SHORT")return g.monthNamesShort[this._date.getMonth()];if(u==="CURRENT_SECONDS_UNIX")return String(Math.floor(this._date.getTime()/1e3));if(u==="CURRENT_TIMEZONE_OFFSET"){const C=this._date.getTimezoneOffset(),f=C>0?"-":"+",h=Math.trunc(Math.abs(C/60)),v=h<10?"0"+h:h,w=Math.abs(C)-h*60,S=w<10?"0"+w:w;return f+v+":"+S}}}e.TimeBasedVariableResolver=g;class c{constructor(r){this._workspaceService=r}resolve(r){if(!this._workspaceService)return;const u=(0,p.toWorkspaceIdentifier)(this._workspaceService.getWorkspace());if(!(0,p.isEmptyWorkspaceIdentifier)(u)){if(r.name==="WORKSPACE_NAME")return this._resolveWorkspaceName(u);if(r.name==="WORKSPACE_FOLDER")return this._resoveWorkspacePath(u)}}_resolveWorkspaceName(r){if((0,p.isSingleFolderWorkspaceIdentifier)(r))return k.basename(r.uri.path);let u=k.basename(r.configPath.path);return u.endsWith(p.WORKSPACE_EXTENSION)&&(u=u.substr(0,u.length-p.WORKSPACE_EXTENSION.length-1)),u}_resoveWorkspacePath(r){if((0,p.isSingleFolderWorkspaceIdentifier)(r))return(0,d.normalizeDriveLetter)(r.uri.fsPath);const u=k.basename(r.configPath.path);let C=r.configPath.fsPath;return C.endsWith(u)&&(C=C.substr(0,C.length-u.length-1)),C?(0,d.normalizeDriveLetter)(C):"/"}}e.WorkspaceBasedVariableResolver=c;class l{resolve(r){const{name:u}=r;if(u==="RANDOM")return Math.random().toString().slice(-6);if(u==="RANDOM_HEX")return Math.random().toString(16).slice(-6);if(u==="UUID")return(0,y.generateUuid)()}}e.RandomBasedVariableResolver=l}),define(ne[436],se([1,0,13,2,11,75,4,23,36,35,181,186,135,859,530]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t){"use strict";var i;Object.defineProperty(e,"__esModule",{value:!0}),e.SnippetSession=e.OneSnippet=void 0;class s{static{this._decor={active:b.ModelDecorationOptions.register({description:"snippet-placeholder-1",stickiness:0,className:"snippet-placeholder"}),inactive:b.ModelDecorationOptions.register({description:"snippet-placeholder-2",stickiness:1,className:"snippet-placeholder"}),activeFinal:b.ModelDecorationOptions.register({description:"snippet-placeholder-3",stickiness:1,className:"finish-snippet-placeholder"}),inactiveFinal:b.ModelDecorationOptions.register({description:"snippet-placeholder-4",stickiness:1,className:"finish-snippet-placeholder"})}}constructor(a,r,u){this._editor=a,this._snippet=r,this._snippetLineLeadingWhitespace=u,this._offset=-1,this._nestingLevel=1,this._placeholderGroups=(0,d.groupBy)(r.placeholders,o.Placeholder.compareByIndex),this._placeholderGroupsIdx=-1}initialize(a){this._offset=a.newPosition}dispose(){this._placeholderDecorations&&this._editor.removeDecorations([...this._placeholderDecorations.values()]),this._placeholderGroups.length=0}_initDecorations(){if(this._offset===-1)throw new Error("Snippet not initialized!");if(this._placeholderDecorations)return;this._placeholderDecorations=new Map;const a=this._editor.getModel();this._editor.changeDecorations(r=>{for(const u of this._snippet.placeholders){const C=this._snippet.offset(u),f=this._snippet.fullLen(u),h=y.Range.fromPositions(a.getPositionAt(this._offset+C),a.getPositionAt(this._offset+C+f)),v=u.isFinalTabstop?s._decor.inactiveFinal:s._decor.inactive,w=r.addDecoration(h,v);this._placeholderDecorations.set(u,w)}})}move(a){if(!this._editor.hasModel())return[];if(this._initDecorations(),this._placeholderGroupsIdx>=0){const C=[];for(const f of this._placeholderGroups[this._placeholderGroupsIdx])if(f.transform){const h=this._placeholderDecorations.get(f),v=this._editor.getModel().getDecorationRange(h),w=this._editor.getModel().getValueInRange(v),S=f.transform.resolve(w).split(/\r\n|\r|\n/);for(let L=1;L0&&this._editor.executeEdits("snippet.placeholderTransform",C)}let r=!1;a===!0&&this._placeholderGroupsIdx0&&(this._placeholderGroupsIdx-=1,r=!0);const u=this._editor.getModel().changeDecorations(C=>{const f=new Set,h=[];for(const v of this._placeholderGroups[this._placeholderGroupsIdx]){const w=this._placeholderDecorations.get(v),S=this._editor.getModel().getDecorationRange(w);h.push(new m.Selection(S.startLineNumber,S.startColumn,S.endLineNumber,S.endColumn)),r=r&&this._hasPlaceholderBeenCollapsed(v),C.changeDecorationOptions(w,v.isFinalTabstop?s._decor.activeFinal:s._decor.active),f.add(v);for(const L of this._snippet.enclosingPlaceholders(v)){const D=this._placeholderDecorations.get(L);C.changeDecorationOptions(D,L.isFinalTabstop?s._decor.activeFinal:s._decor.active),f.add(L)}}for(const[v,w]of this._placeholderDecorations)f.has(v)||C.changeDecorationOptions(w,v.isFinalTabstop?s._decor.inactiveFinal:s._decor.inactive);return h});return r?this.move(a):u??[]}_hasPlaceholderBeenCollapsed(a){let r=a;for(;r;){if(r instanceof o.Placeholder){const u=this._placeholderDecorations.get(r);if(this._editor.getModel().getDecorationRange(u).isEmpty()&&r.toString().length>0)return!0}r=r.parent}return!1}get isAtFirstPlaceholder(){return this._placeholderGroupsIdx<=0||this._placeholderGroups.length===0}get isAtLastPlaceholder(){return this._placeholderGroupsIdx===this._placeholderGroups.length-1}get hasPlaceholder(){return this._snippet.placeholders.length>0}get isTrivialSnippet(){if(this._snippet.placeholders.length===0)return!0;if(this._snippet.placeholders.length===1){const[a]=this._snippet.placeholders;if(a.isFinalTabstop&&this._snippet.rightMostDescendant===a)return!0}return!1}computePossibleSelections(){const a=new Map;for(const r of this._placeholderGroups){let u;for(const C of r){if(C.isFinalTabstop)break;u||(u=[],a.set(C.index,u));const f=this._placeholderDecorations.get(C),h=this._editor.getModel().getDecorationRange(f);if(!h){a.delete(C.index);break}u.push(h)}}return a}get activeChoice(){if(!this._placeholderDecorations)return;const a=this._placeholderGroups[this._placeholderGroupsIdx][0];if(!a?.choice)return;const r=this._placeholderDecorations.get(a);if(!r)return;const u=this._editor.getModel().getDecorationRange(r);if(u)return{range:u,choice:a.choice}}get hasChoice(){let a=!1;return this._snippet.walk(r=>(a=r instanceof o.Choice,!a)),a}merge(a){const r=this._editor.getModel();this._nestingLevel*=10,this._editor.changeDecorations(u=>{for(const C of this._placeholderGroups[this._placeholderGroupsIdx]){const f=a.shift();console.assert(f._offset!==-1),console.assert(!f._placeholderDecorations);const h=f._snippet.placeholderInfo.last.index;for(const w of f._snippet.placeholderInfo.all)w.isFinalTabstop?w.index=C.index+(h+1)/this._nestingLevel:w.index=C.index+w.index/this._nestingLevel;this._snippet.replace(C,f._snippet.children);const v=this._placeholderDecorations.get(C);u.removeDecoration(v),this._placeholderDecorations.delete(C);for(const w of f._snippet.placeholders){const S=f._snippet.offset(w),L=f._snippet.fullLen(w),D=y.Range.fromPositions(r.getPositionAt(f._offset+S),r.getPositionAt(f._offset+S+L)),T=u.addDecoration(D,s._decor.inactive);this._placeholderDecorations.set(w,T)}}this._placeholderGroups=(0,d.groupBy)(this._snippet.placeholders,o.Placeholder.compareByIndex)})}}e.OneSnippet=s;const g={overwriteBefore:0,overwriteAfter:0,adjustWhitespace:!0,clipboardText:void 0,overtypingCapturer:void 0};let c=i=class{static adjustWhitespace(a,r,u,C,f){const h=a.getLineContent(r.lineNumber),v=(0,I.getLeadingWhitespace)(h,0,r.column-1);let w;return C.walk(S=>{if(!(S instanceof o.Text)||S.parent instanceof o.Choice||f&&!f.has(S))return!0;const L=S.value.split(/\r\n|\r|\n/);if(u){const T=C.offset(S);if(T===0)L[0]=a.normalizeIndentation(L[0]);else{w=w??C.toString();const M=w.charCodeAt(T-1);(M===10||M===13)&&(L[0]=a.normalizeIndentation(v+L[0]))}for(let M=1;MW.get(n.IWorkspaceContextService)),A=a.invokeWithinContext(W=>new t.ModelBasedVariableResolver(W.get(p.ILabelService),T)),P=()=>v,N=T.getValueInRange(i.adjustSelection(T,a.getSelection(),u,0)),O=T.getValueInRange(i.adjustSelection(T,a.getSelection(),0,C)),F=T.getLineFirstNonWhitespaceColumn(a.getSelection().positionLineNumber),x=a.getSelections().map((W,V)=>({selection:W,idx:V})).sort((W,V)=>y.Range.compareRangesUsingStarts(W.selection,V.selection));for(const{selection:W,idx:V}of x){let q=i.adjustSelection(T,W,u,0),H=i.adjustSelection(T,W,0,C);N!==T.getValueInRange(q)&&(q=W),O!==T.getValueInRange(H)&&(H=W);const z=W.setStartPosition(q.startLineNumber,q.startColumn).setEndPosition(H.endLineNumber,H.endColumn),U=new o.SnippetParser().parse(r,!0,f),j=z.getStartPosition(),Y=i.adjustWhitespace(T,j,h||V>0&&F!==T.getLineFirstNonWhitespaceColumn(W.positionLineNumber),U);U.resolveVariables(new t.CompositeSnippetVariableResolver([A,new t.ClipboardBasedVariableResolver(P,V,x.length,a.getOption(79)==="spread"),new t.SelectionBasedVariableResolver(T,W,V,w),new t.CommentBasedVariableResolver(T,W,S),new t.TimeBasedVariableResolver,new t.WorkspaceBasedVariableResolver(M),new t.RandomBasedVariableResolver])),L[V]=E.EditOperation.replace(z,U.toString()),L[V].identifier={major:V,minor:0},L[V]._isTracked=!0,D[V]=new s(a,U,Y)}return{edits:L,snippets:D}}static createEditsAndSnippetsFromEdits(a,r,u,C,f,h,v){if(!a.hasModel()||r.length===0)return{edits:[],snippets:[]};const w=[],S=a.getModel(),L=new o.SnippetParser,D=new o.TextmateSnippet,T=new t.CompositeSnippetVariableResolver([a.invokeWithinContext(A=>new t.ModelBasedVariableResolver(A.get(p.ILabelService),S)),new t.ClipboardBasedVariableResolver(()=>f,0,a.getSelections().length,a.getOption(79)==="spread"),new t.SelectionBasedVariableResolver(S,a.getSelection(),0,h),new t.CommentBasedVariableResolver(S,a.getSelection(),v),new t.TimeBasedVariableResolver,new t.WorkspaceBasedVariableResolver(a.invokeWithinContext(A=>A.get(n.IWorkspaceContextService))),new t.RandomBasedVariableResolver]);r=r.sort((A,P)=>y.Range.compareRangesUsingStarts(A.range,P.range));let M=0;for(let A=0;A0){const V=r[A-1].range,q=y.Range.fromPositions(V.getEndPosition(),P.getStartPosition()),H=new o.Text(S.getValueInRange(q));D.appendChild(H),M+=H.value.length}const O=L.parseFragment(N,D);i.adjustWhitespace(S,P.getStartPosition(),!0,D,new Set(O)),D.resolveVariables(T);const F=D.toString(),x=F.slice(M);M=F.length;const W=E.EditOperation.replace(P,x);W.identifier={major:A,minor:0},W._isTracked=!0,w.push(W)}return L.ensureFinalTabstop(D,u,!0),{edits:w,snippets:[new s(a,D,"")]}}constructor(a,r,u=g,C){this._editor=a,this._template=r,this._options=u,this._languageConfigurationService=C,this._templateMerges=[],this._snippets=[]}dispose(){(0,k.dispose)(this._snippets)}_logInfo(){return`template="${this._template}", merged_templates="${this._templateMerges.join(" -> ")}"`}insert(){if(!this._editor.hasModel())return;const{edits:a,snippets:r}=typeof this._template=="string"?i.createEditsAndSnippetsFromSelections(this._editor,this._template,this._options.overwriteBefore,this._options.overwriteAfter,!1,this._options.adjustWhitespace,this._options.clipboardText,this._options.overtypingCapturer,this._languageConfigurationService):i.createEditsAndSnippetsFromEdits(this._editor,this._template,!1,this._options.adjustWhitespace,this._options.clipboardText,this._options.overtypingCapturer,this._languageConfigurationService);this._snippets=r,this._editor.executeEdits("snippet",a,u=>{const C=u.filter(f=>!!f.identifier);for(let f=0;fm.Selection.fromPositions(f.range.getEndPosition()))}),this._editor.revealRange(this._editor.getSelections()[0])}merge(a,r=g){if(!this._editor.hasModel())return;this._templateMerges.push([this._snippets[0]._nestingLevel,this._snippets[0]._placeholderGroupsIdx,a]);const{edits:u,snippets:C}=i.createEditsAndSnippetsFromSelections(this._editor,a,r.overwriteBefore,r.overwriteAfter,!0,r.adjustWhitespace,r.clipboardText,r.overtypingCapturer,this._languageConfigurationService);this._editor.executeEdits("snippet",u,f=>{const h=f.filter(w=>!!w.identifier);for(let w=0;wm.Selection.fromPositions(w.range.getEndPosition()))})}next(){const a=this._move(!0);this._editor.setSelections(a),this._editor.revealPositionInCenterIfOutsideViewport(a[0].getPosition())}prev(){const a=this._move(!1);this._editor.setSelections(a),this._editor.revealPositionInCenterIfOutsideViewport(a[0].getPosition())}_move(a){const r=[];for(const u of this._snippets){const C=u.move(a);r.push(...C)}return r}get isAtFirstPlaceholder(){return this._snippets[0].isAtFirstPlaceholder}get isAtLastPlaceholder(){return this._snippets[0].isAtLastPlaceholder}get hasPlaceholder(){return this._snippets[0].hasPlaceholder}get hasChoice(){return this._snippets[0].hasChoice}get activeChoice(){return this._snippets[0].activeChoice}isSelectionWithinPlaceholders(){if(!this.hasPlaceholder)return!1;const a=this._editor.getSelections();if(a.length{f.push(...C.get(h))})}a.sort(y.Range.compareRangesUsingStarts);for(const[u,C]of r){if(C.length!==a.length){r.delete(u);continue}C.sort(y.Range.compareRangesUsingStarts);for(let f=0;f0}};e.SnippetSession=c,e.SnippetSession=c=i=ke([ce(3,_.ILanguageConfigurationService)],c)}),define(ne[221],se([1,0,2,19,15,9,20,36,17,155,3,12,62,436]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t){"use strict";var i;Object.defineProperty(e,"__esModule",{value:!0}),e.SnippetController2=void 0;const s={overwriteBefore:0,overwriteAfter:0,undoStopBefore:!0,undoStopAfter:!0,adjustWhitespace:!0,clipboardText:void 0,overtypingCapturer:void 0};let g=class{static{i=this}static{this.ID="snippetController2"}static get(a){return a.getContribution(i.ID)}static{this.InSnippetMode=new n.RawContextKey("inSnippetMode",!1,(0,p.localize)(1257,"Whether the editor in current in snippet mode"))}static{this.HasNextTabstop=new n.RawContextKey("hasNextTabstop",!1,(0,p.localize)(1258,"Whether there is a next tab stop when in snippet mode"))}static{this.HasPrevTabstop=new n.RawContextKey("hasPrevTabstop",!1,(0,p.localize)(1259,"Whether there is a previous tab stop when in snippet mode"))}constructor(a,r,u,C,f){this._editor=a,this._logService=r,this._languageFeaturesService=u,this._languageConfigurationService=f,this._snippetListener=new d.DisposableStore,this._modelVersionId=-1,this._inSnippet=i.InSnippetMode.bindTo(C),this._hasNextTabstop=i.HasNextTabstop.bindTo(C),this._hasPrevTabstop=i.HasPrevTabstop.bindTo(C)}dispose(){this._inSnippet.reset(),this._hasPrevTabstop.reset(),this._hasNextTabstop.reset(),this._session?.dispose(),this._snippetListener.dispose()}insert(a,r){try{this._doInsert(a,typeof r>"u"?s:{...s,...r})}catch(u){this.cancel(),this._logService.error(u),this._logService.error("snippet_error"),this._logService.error("insert_template=",a),this._logService.error("existing_template=",this._session?this._session._logInfo():"")}}_doInsert(a,r){if(this._editor.hasModel()){if(this._snippetListener.clear(),r.undoStopBefore&&this._editor.getModel().pushStackElement(),this._session&&typeof a!="string"&&this.cancel(),this._session?((0,k.assertType)(typeof a=="string"),this._session.merge(a,r)):(this._modelVersionId=this._editor.getModel().getAlternativeVersionId(),this._session=new t.SnippetSession(this._editor,a,r,this._languageConfigurationService),this._session.insert()),r.undoStopAfter&&this._editor.getModel().pushStackElement(),this._session?.hasChoice){const u={_debugDisplayName:"snippetChoiceCompletions",provideCompletionItems:(S,L)=>{if(!this._session||S!==this._editor.getModel()||!E.Position.equals(this._editor.getPosition(),L))return;const{activeChoice:D}=this._session;if(!D||D.choice.options.length===0)return;const T=S.getValueInRange(D.range),M=!!D.choice.options.find(P=>P.value===T),A=[];for(let P=0;P{f?.dispose(),h=!1},w=()=>{h||(f=this._languageFeaturesService.completionProvider.register({language:C.getLanguageId(),pattern:C.uri.fsPath,scheme:C.uri.scheme,exclusive:!0},u),this._snippetListener.add(f),h=!0)};this._choiceCompletions={provider:u,enable:w,disable:v}}this._updateState(),this._snippetListener.add(this._editor.onDidChangeModelContent(u=>u.isFlush&&this.cancel())),this._snippetListener.add(this._editor.onDidChangeModel(()=>this.cancel())),this._snippetListener.add(this._editor.onDidChangeCursorSelection(()=>this._updateState()))}}_updateState(){if(!(!this._session||!this._editor.hasModel())){if(this._modelVersionId===this._editor.getModel().getAlternativeVersionId())return this.cancel();if(!this._session.hasPlaceholder)return this.cancel();if(this._session.isAtLastPlaceholder||!this._session.isSelectionWithinPlaceholders())return this._editor.getModel().pushStackElement(),this.cancel();this._inSnippet.set(!0),this._hasPrevTabstop.set(!this._session.isAtFirstPlaceholder),this._hasNextTabstop.set(!this._session.isAtLastPlaceholder),this._handleChoice()}}_handleChoice(){if(!this._session||!this._editor.hasModel()){this._currentChoice=void 0;return}const{activeChoice:a}=this._session;if(!a||!this._choiceCompletions){this._choiceCompletions?.disable(),this._currentChoice=void 0;return}this._currentChoice!==a.choice&&(this._currentChoice=a.choice,this._choiceCompletions.enable(),queueMicrotask(()=>{(0,b.showSimpleSuggestions)(this._editor,this._choiceCompletions.provider)}))}finish(){for(;this._inSnippet.get();)this.next()}cancel(a=!1){this._inSnippet.reset(),this._hasPrevTabstop.reset(),this._hasNextTabstop.reset(),this._snippetListener.clear(),this._currentChoice=void 0,this._session?.dispose(),this._session=void 0,this._modelVersionId=-1,a&&this._editor.setSelections([this._editor.getSelection()])}prev(){this._session?.prev(),this._updateState()}next(){this._session?.next(),this._updateState()}isInSnippet(){return!!this._inSnippet.get()}};e.SnippetController2=g,e.SnippetController2=g=i=ke([ce(1,o.ILogService),ce(2,_.ILanguageFeaturesService),ce(3,n.IContextKeyService),ce(4,m.ILanguageConfigurationService)],g),(0,I.registerEditorContribution)(g.ID,g,4);const c=I.EditorCommand.bindToContribution(g.get);(0,I.registerEditorCommand)(new c({id:"jumpToNextSnippetPlaceholder",precondition:n.ContextKeyExpr.and(g.InSnippetMode,g.HasNextTabstop),handler:l=>l.next(),kbOpts:{weight:130,kbExpr:y.EditorContextKeys.textInputFocus,primary:2}})),(0,I.registerEditorCommand)(new c({id:"jumpToPrevSnippetPlaceholder",precondition:n.ContextKeyExpr.and(g.InSnippetMode,g.HasPrevTabstop),handler:l=>l.prev(),kbOpts:{weight:130,kbExpr:y.EditorContextKeys.textInputFocus,primary:1026}})),(0,I.registerEditorCommand)(new c({id:"leaveSnippet",precondition:g.InSnippetMode,handler:l=>l.cancel(!0),kbOpts:{weight:130,kbExpr:y.EditorContextKeys.textInputFocus,primary:9,secondary:[1033]}})),(0,I.registerEditorCommand)(new c({id:"acceptSnippet",precondition:g.InSnippetMode,handler:l=>l.finish()}))}),define(ne[860],se([1,0,13,67,102,8,2,21,11,19,75,9,4,23,104,113,27,36,204,715,246,205,221,24,7]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.VersionIdChangeReason=e.InlineCompletionsModel=void 0,e.getSecondaryEdits=S;let v=class extends y.Disposable{get isAcceptingPartially(){return this._isAcceptingPartially}constructor(M,A,P,N,O,F,x,W,V,q,H,z){super(),this.textModel=M,this.selectedSuggestItem=A,this._textModelVersionId=P,this._positions=N,this._debounceValue=O,this._suggestPreviewEnabled=F,this._suggestPreviewMode=x,this._inlineSuggestMode=W,this._enabled=V,this._instantiationService=q,this._commandService=H,this._languageConfigurationService=z,this._source=this._register(this._instantiationService.createInstance(a.InlineCompletionsSource,this.textModel,this._textModelVersionId,this._debounceValue)),this._isActive=(0,m.observableValue)(this,!1),this._forceUpdateExplicitlySignal=(0,m.observableSignal)(this),this._selectedInlineCompletionId=(0,m.observableValue)(this,void 0),this._primaryPosition=(0,m.derived)(this,j=>this._positions.read(j)[0]??new n.Position(1,1)),this._isAcceptingPartially=!1,this._preserveCurrentCompletionReasons=new Set([w.Redo,w.Undo,w.AcceptWord]),this._fetchInlineCompletionsPromise=(0,m.derivedHandleChanges)({owner:this,createEmptyChangeSummary:()=>({preserveCurrentCompletion:!1,inlineCompletionTriggerKind:g.InlineCompletionTriggerKind.Automatic}),handleChange:(j,Y)=>(j.didChange(this._textModelVersionId)&&this._preserveCurrentCompletionReasons.has(this._getReason(j.change))?Y.preserveCurrentCompletion=!0:j.didChange(this._forceUpdateExplicitlySignal)&&(Y.inlineCompletionTriggerKind=g.InlineCompletionTriggerKind.Explicit),!0)},(j,Y)=>{if(this._forceUpdateExplicitlySignal.read(j),!(this._enabled.read(j)&&this.selectedSuggestItem.read(j)||this._isActive.read(j))){this._source.cancelUpdate();return}this._textModelVersionId.read(j);const K=this._source.suggestWidgetInlineCompletions.get(),R=this.selectedSuggestItem.read(j);if(K&&!R){const pe=this._source.inlineCompletions.get();(0,m.transaction)(ae=>{(!pe||K.request.versionId>pe.request.versionId)&&this._source.inlineCompletions.set(K.clone(),ae),this._source.clearSuggestWidgetInlineCompletions(ae)})}const J=this._primaryPosition.read(j),ie={triggerKind:Y.inlineCompletionTriggerKind,selectedSuggestionInfo:R?.toSelectedSuggestionInfo()},ue=this.selectedInlineCompletion.get(),he=Y.preserveCurrentCompletion||ue?.forwardStable?ue:void 0;return this._source.fetch(J,ie,he)}),this._filteredInlineCompletionItems=(0,m.derivedOpts)({owner:this,equalsFn:(0,I.itemsEquals)()},j=>{const Y=this._source.inlineCompletions.read(j);if(!Y)return[];const G=this._primaryPosition.read(j);return Y.inlineCompletions.filter(R=>R.isVisible(this.textModel,G,j))}),this.selectedInlineCompletionIndex=(0,m.derived)(this,j=>{const Y=this._selectedInlineCompletionId.read(j),G=this._filteredInlineCompletionItems.read(j),K=this._selectedInlineCompletionId===void 0?-1:G.findIndex(R=>R.semanticId===Y);return K===-1?(this._selectedInlineCompletionId.set(void 0,void 0),0):K}),this.selectedInlineCompletion=(0,m.derived)(this,j=>{const Y=this._filteredInlineCompletionItems.read(j),G=this.selectedInlineCompletionIndex.read(j);return Y[G]}),this.activeCommands=(0,m.derivedOpts)({owner:this,equalsFn:(0,I.itemsEquals)()},j=>this.selectedInlineCompletion.read(j)?.inlineCompletion.source.inlineCompletions.commands??[]),this.lastTriggerKind=this._source.inlineCompletions.map(this,j=>j?.request.context.triggerKind),this.inlineCompletionsCount=(0,m.derived)(this,j=>{if(this.lastTriggerKind.read(j)===g.InlineCompletionTriggerKind.Explicit)return this._filteredInlineCompletionItems.read(j).length}),this.state=(0,m.derivedOpts)({owner:this,equalsFn:(j,Y)=>!j||!Y?j===Y:(0,l.ghostTextsOrReplacementsEqual)(j.ghostTexts,Y.ghostTexts)&&j.inlineCompletion===Y.inlineCompletion&&j.suggestItem===Y.suggestItem},j=>{const Y=this.textModel,G=this.selectedSuggestItem.read(j);if(G){const K=(0,r.singleTextRemoveCommonPrefix)(G.toSingleTextEdit(),Y),R=this._computeAugmentation(K,j);if(!this._suggestPreviewEnabled.read(j)&&!R)return;const ie=R?.edit??K,ue=R?R.edit.text.length-K.text.length:0,he=this._suggestPreviewMode.read(j),pe=this._positions.read(j),ae=[ie,...S(this.textModel,pe,ie)],ee=ae.map((ge,X)=>(0,r.computeGhostText)(ge,Y,he,pe[X],ue)).filter(b.isDefined),de=ee[0]??new l.GhostText(ie.range.endLineNumber,[]);return{edits:ae,primaryGhostText:de,ghostTexts:ee,inlineCompletion:R?.completion,suggestItem:G}}else{if(!this._isActive.read(j))return;const K=this.selectedInlineCompletion.read(j);if(!K)return;const R=K.toSingleTextEdit(j),J=this._inlineSuggestMode.read(j),ie=this._positions.read(j),ue=[R,...S(this.textModel,ie,R)],he=ue.map((pe,ae)=>(0,r.computeGhostText)(pe,Y,J,ie[ae],0)).filter(b.isDefined);return he[0]?{edits:ue,primaryGhostText:he[0],ghostTexts:he,inlineCompletion:K,suggestItem:void 0}:void 0}}),this.ghostTexts=(0,m.derivedOpts)({owner:this,equalsFn:l.ghostTextsOrReplacementsEqual},j=>{const Y=this.state.read(j);if(Y)return Y.ghostTexts}),this.primaryGhostText=(0,m.derivedOpts)({owner:this,equalsFn:l.ghostTextOrReplacementEquals},j=>{const Y=this.state.read(j);if(Y)return Y?.primaryGhostText}),this._register((0,m.recomputeInitiallyAndOnChange)(this._fetchInlineCompletionsPromise));let U;this._register((0,m.autorun)(j=>{const G=this.state.read(j)?.inlineCompletion;if(G?.semanticId!==U?.semanticId&&(U=G,G)){const K=G.inlineCompletion,R=K.source;R.provider.handleItemDidShow?.(R.inlineCompletions,K.sourceInlineCompletion,K.insertText)}}))}_getReason(M){return M?.isUndoing?w.Undo:M?.isRedoing?w.Redo:this.isAcceptingPartially?w.AcceptWord:w.Other}async trigger(M){this._isActive.set(!0,M),await this._fetchInlineCompletionsPromise.get()}async triggerExplicitly(M){(0,m.subtransaction)(M,A=>{this._isActive.set(!0,A),this._forceUpdateExplicitlySignal.trigger(A)}),await this._fetchInlineCompletionsPromise.get()}stop(M){(0,m.subtransaction)(M,A=>{this._isActive.set(!1,A),this._source.clear(A)})}_computeAugmentation(M,A){const P=this.textModel,N=this._source.suggestWidgetInlineCompletions.read(A),O=N?N.inlineCompletions:[this.selectedInlineCompletion.read(A)].filter(b.isDefined);return(0,k.mapFindFirst)(O,x=>{let W=x.toSingleTextEdit(A);return W=(0,r.singleTextRemoveCommonPrefix)(W,P,o.Range.fromPositions(W.range.getStartPosition(),M.range.getEndPosition())),(0,r.singleTextEditAugments)(W,M)?{completion:x,edit:W}:void 0})}async _deltaSelectedInlineCompletionIndex(M){await this.triggerExplicitly();const A=this._filteredInlineCompletionItems.get()||[];if(A.length>0){const P=(this.selectedInlineCompletionIndex.get()+M+A.length)%A.length;this._selectedInlineCompletionId.set(A[P].semanticId,void 0)}else this._selectedInlineCompletionId.set(void 0,void 0)}async next(){await this._deltaSelectedInlineCompletionIndex(1)}async previous(){await this._deltaSelectedInlineCompletionIndex(-1)}async accept(M){if(M.getModel()!==this.textModel)throw new E.BugIndicatingError;const A=this.state.get();if(!A||A.primaryGhostText.isEmpty()||!A.inlineCompletion)return;const P=A.inlineCompletion.toInlineCompletion(void 0);if(P.command&&P.source.addRef(),M.pushUndoStop(),P.snippetInfo)M.executeEdits("inlineSuggestion.accept",[p.EditOperation.replace(P.range,""),...P.additionalTextEdits]),M.setPosition(P.snippetInfo.range.getStartPosition(),"inlineCompletionAccept"),C.SnippetController2.get(M)?.insert(P.snippetInfo.snippet,{undoStopBefore:!1});else{const N=A.edits,O=D(N).map(F=>t.Selection.fromPositions(F));M.executeEdits("inlineSuggestion.accept",[...N.map(F=>p.EditOperation.replace(F.range,F.text)),...P.additionalTextEdits]),M.setSelections(O,"inlineCompletionAccept")}this.stop(),P.command&&(await this._commandService.executeCommand(P.command.id,...P.command.arguments||[]).then(void 0,E.onUnexpectedExternalError),P.source.removeRef())}async acceptNextWord(M){await this._acceptNext(M,(A,P)=>{const N=this.textModel.getLanguageIdAtPosition(A.lineNumber,A.column),O=this._languageConfigurationService.getLanguageConfiguration(N),F=new RegExp(O.wordDefinition.source,O.wordDefinition.flags.replace("g","")),x=P.match(F);let W=0;x&&x.index!==void 0?x.index===0?W=x[0].length:W=x.index:W=P.length;const q=/\s+/g.exec(P);return q&&q.index!==void 0&&q.index+q[0].length{const N=P.match(/\n/);return N&&N.index!==void 0?N.index+1:P.length},1)}async _acceptNext(M,A,P){if(M.getModel()!==this.textModel)throw new E.BugIndicatingError;const N=this.state.get();if(!N||N.primaryGhostText.isEmpty()||!N.inlineCompletion)return;const O=N.primaryGhostText,F=N.inlineCompletion.toInlineCompletion(void 0);if(F.snippetInfo||F.filterText!==F.insertText){await this.accept(M);return}const x=O.parts[0],W=new n.Position(O.lineNumber,x.column),V=x.text,q=A(W,V);if(q===V.length&&O.parts.length===1){this.accept(M);return}const H=V.substring(0,q),z=this._positions.get(),U=z[0];F.source.addRef();try{this._isAcceptingPartially=!0;try{M.pushUndoStop();const j=o.Range.fromPositions(U,W),Y=M.getModel().getValueInRange(j)+H,G=new i.SingleTextEdit(j,Y),K=[G,...S(this.textModel,z,G)],R=D(K).map(J=>t.Selection.fromPositions(J));M.executeEdits("inlineSuggestion.accept",K.map(J=>p.EditOperation.replace(J.range,J.text))),M.setSelections(R,"inlineCompletionPartialAccept"),M.revealPositionInCenterIfOutsideViewport(M.getPosition(),1)}finally{this._isAcceptingPartially=!1}if(F.source.provider.handlePartialAccept){const j=o.Range.fromPositions(F.range.getStartPosition(),s.TextLength.ofText(H).addToPosition(W)),Y=M.getModel().getValueInRange(j,1);F.source.provider.handlePartialAccept(F.source.inlineCompletions,F.sourceInlineCompletion,Y.length,{kind:P})}}finally{F.source.removeRef()}}handleSuggestAccepted(M){const A=(0,r.singleTextRemoveCommonPrefix)(M.toSingleTextEdit(),this.textModel),P=this._computeAugmentation(A,void 0);if(!P)return;const N=P.completion.inlineCompletion;N.source.provider.handlePartialAccept?.(N.source.inlineCompletions,N.sourceInlineCompletion,A.text.length,{kind:2})}};e.InlineCompletionsModel=v,e.InlineCompletionsModel=v=ke([ce(9,h.IInstantiationService),ce(10,f.ICommandService),ce(11,c.ILanguageConfigurationService)],v);var w;(function(T){T[T.Undo=0]="Undo",T[T.Redo=1]="Redo",T[T.AcceptWord=2]="AcceptWord",T[T.Other=3]="Other"})(w||(e.VersionIdChangeReason=w={}));function S(T,M,A){if(M.length===1)return[];const P=M[0],N=M.slice(1),O=A.range.getStartPosition(),F=A.range.getEndPosition(),x=T.getValueInRange(o.Range.fromPositions(P,F)),W=(0,u.subtractPositions)(P,O);if(W.lineNumber<1)return(0,E.onUnexpectedError)(new E.BugIndicatingError(`positionWithinTextEdit line number should be bigger than 0. - Invalid subtraction between ${P.toString()} and ${O.toString()}`)),[];const V=L(A.text,W);return N.map(q=>{const H=(0,u.addPositions)((0,u.subtractPositions)(q,O),F),z=T.getValueInRange(o.Range.fromPositions(q,H)),U=(0,_.commonPrefixLength)(x,z),j=o.Range.fromPositions(q,q.delta(0,U));return new i.SingleTextEdit(j,V)})}function L(T,M){let A="";const P=(0,_.splitLinesIncludeSeparators)(T);for(let N=M.lineNumber-1;NO.range,o.Range.compareRangesUsingStarts)),P=new i.TextEdit(M.apply(T)).getNewRanges();return M.inverse().apply(P).map(O=>O.getEndPosition())}}),define(ne[437],se([1,0,14,18,8,6,2,11,23,100,343,117,28,12,62,63,342,155,17,82,19,269,221,271]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f){"use strict";var h;Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestModel=e.LineContext=void 0;class v{static shouldAutoTrigger(T){if(!T.hasModel())return!1;const M=T.getModel(),A=T.getPosition();M.tokenization.tokenizeIfCheap(A.lineNumber);const P=M.getWordAtPosition(A);return!(!P||P.endColumn!==A.column&&P.startColumn+1!==A.column||!isNaN(Number(P.word)))}constructor(T,M,A){this.leadingLineContent=T.getLineContent(M.lineNumber).substr(0,M.column-1),this.leadingWord=T.getWordUntilPosition(M),this.lineNumber=M.lineNumber,this.column=M.column,this.triggerOptions=A}}e.LineContext=v;function w(D,T,M){if(!T.getContextKeyValue(u.InlineCompletionContextKeys.inlineSuggestionVisible.key))return!0;const A=T.getContextKeyValue(u.InlineCompletionContextKeys.suppressSuggestions.key);return A!==void 0?!A:!D.getOption(62).suppressSuggestions}function S(D,T,M){if(!T.getContextKeyValue("inlineSuggestionVisible"))return!0;const A=T.getContextKeyValue(u.InlineCompletionContextKeys.suppressSuggestions.key);return A!==void 0?!A:!D.getOption(62).suppressSuggestions}let L=h=class{constructor(T,M,A,P,N,O,F,x,W){this._editor=T,this._editorWorkerService=M,this._clipboardService=A,this._telemetryService=P,this._logService=N,this._contextKeyService=O,this._configurationService=F,this._languageFeaturesService=x,this._envService=W,this._toDispose=new y.DisposableStore,this._triggerCharacterListener=new y.DisposableStore,this._triggerQuickSuggest=new d.TimeoutTimer,this._triggerState=void 0,this._completionDisposables=new y.DisposableStore,this._onDidCancel=new E.Emitter,this._onDidTrigger=new E.Emitter,this._onDidSuggest=new E.Emitter,this.onDidCancel=this._onDidCancel.event,this.onDidTrigger=this._onDidTrigger.event,this.onDidSuggest=this._onDidSuggest.event,this._telemetryGate=0,this._currentSelection=this._editor.getSelection()||new _.Selection(1,1,1,1),this._toDispose.add(this._editor.onDidChangeModel(()=>{this._updateTriggerCharacters(),this.cancel()})),this._toDispose.add(this._editor.onDidChangeModelLanguage(()=>{this._updateTriggerCharacters(),this.cancel()})),this._toDispose.add(this._editor.onDidChangeConfiguration(()=>{this._updateTriggerCharacters()})),this._toDispose.add(this._languageFeaturesService.completionProvider.onDidChange(()=>{this._updateTriggerCharacters(),this._updateActiveSuggestSession()}));let V=!1;this._toDispose.add(this._editor.onDidCompositionStart(()=>{V=!0})),this._toDispose.add(this._editor.onDidCompositionEnd(()=>{V=!1,this._onCompositionEnd()})),this._toDispose.add(this._editor.onDidChangeCursorSelection(q=>{V||this._onCursorChange(q)})),this._toDispose.add(this._editor.onDidChangeModelContent(()=>{!V&&this._triggerState!==void 0&&this._refilterCompletionItems()})),this._updateTriggerCharacters()}dispose(){(0,y.dispose)(this._triggerCharacterListener),(0,y.dispose)([this._onDidCancel,this._onDidSuggest,this._onDidTrigger,this._triggerQuickSuggest]),this._toDispose.dispose(),this._completionDisposables.dispose(),this.cancel()}_updateTriggerCharacters(){if(this._triggerCharacterListener.clear(),this._editor.getOption(92)||!this._editor.hasModel()||!this._editor.getOption(122))return;const T=new Map;for(const A of this._languageFeaturesService.completionProvider.all(this._editor.getModel()))for(const P of A.triggerCharacters||[]){let N=T.get(P);if(!N){N=new Set;const O=(0,c.getSnippetSuggestSupport)();O&&N.add(O),T.set(P,N)}N.add(A)}const M=A=>{if(!S(this._editor,this._contextKeyService,this._configurationService)||v.shouldAutoTrigger(this._editor))return;if(!A){const O=this._editor.getPosition();A=this._editor.getModel().getLineContent(O.lineNumber).substr(0,O.column-1)}let P="";(0,m.isLowSurrogate)(A.charCodeAt(A.length-1))?(0,m.isHighSurrogate)(A.charCodeAt(A.length-2))&&(P=A.substr(A.length-2)):P=A.charAt(A.length-1);const N=T.get(P);if(N){const O=new Map;if(this._completionModel)for(const[F,x]of this._completionModel.getItemsByProvider())N.has(F)||O.set(F,x);this.trigger({auto:!0,triggerKind:1,triggerCharacter:P,retrigger:!!this._completionModel,clipboardText:this._completionModel?.clipboardText,completionOptions:{providerFilter:N,providerItemsToReuse:O}})}};this._triggerCharacterListener.add(this._editor.onDidType(M)),this._triggerCharacterListener.add(this._editor.onDidCompositionEnd(()=>M()))}get state(){return this._triggerState?this._triggerState.auto?2:1:0}cancel(T=!1){this._triggerState!==void 0&&(this._triggerQuickSuggest.cancel(),this._requestToken?.cancel(),this._requestToken=void 0,this._triggerState=void 0,this._completionModel=void 0,this._context=void 0,this._onDidCancel.fire({retrigger:T}))}clear(){this._completionDisposables.clear()}_updateActiveSuggestSession(){this._triggerState!==void 0&&(!this._editor.hasModel()||!this._languageFeaturesService.completionProvider.has(this._editor.getModel())?this.cancel():this.trigger({auto:this._triggerState.auto,retrigger:!0}))}_onCursorChange(T){if(!this._editor.hasModel())return;const M=this._currentSelection;if(this._currentSelection=this._editor.getSelection(),!T.selection.isEmpty()||T.reason!==0&&T.reason!==3||T.source!=="keyboard"&&T.source!=="deleteLeft"){this.cancel();return}this._triggerState===void 0&&T.reason===0?(M.containsRange(this._currentSelection)||M.getEndPosition().isBeforeOrEqual(this._currentSelection.getPosition()))&&this._doTriggerQuickSuggest():this._triggerState!==void 0&&T.reason===3&&this._refilterCompletionItems()}_onCompositionEnd(){this._triggerState===void 0?this._doTriggerQuickSuggest():this._refilterCompletionItems()}_doTriggerQuickSuggest(){c.QuickSuggestionsOptions.isAllOff(this._editor.getOption(90))||this._editor.getOption(119).snippetsPreventQuickSuggestions&&C.SnippetController2.get(this._editor)?.isInSnippet()||(this.cancel(),this._triggerQuickSuggest.cancelAndSet(()=>{if(this._triggerState!==void 0||!v.shouldAutoTrigger(this._editor)||!this._editor.hasModel()||!this._editor.hasWidgetFocus())return;const T=this._editor.getModel(),M=this._editor.getPosition(),A=this._editor.getOption(90);if(!c.QuickSuggestionsOptions.isAllOff(A)){if(!c.QuickSuggestionsOptions.isAllOn(A)){T.tokenization.tokenizeIfCheap(M.lineNumber);const P=T.tokenization.getLineTokens(M.lineNumber),N=P.getStandardTokenType(P.findTokenIndexAtOffset(Math.max(M.column-1-1,0)));if(c.QuickSuggestionsOptions.valueFor(A,N)!=="on")return}w(this._editor,this._contextKeyService,this._configurationService)&&this._languageFeaturesService.completionProvider.has(T)&&this.trigger({auto:!0})}},this._editor.getOption(91)))}_refilterCompletionItems(){(0,r.assertType)(this._editor.hasModel()),(0,r.assertType)(this._triggerState!==void 0);const T=this._editor.getModel(),M=this._editor.getPosition(),A=new v(T,M,{...this._triggerState,refilter:!0});this._onNewContext(A)}trigger(T){if(!this._editor.hasModel())return;const M=this._editor.getModel(),A=new v(M,this._editor.getPosition(),T);this.cancel(T.retrigger),this._triggerState=T,this._onDidTrigger.fire({auto:T.auto,shy:T.shy??!1,position:this._editor.getPosition()}),this._context=A;let P={triggerKind:T.triggerKind??0};T.triggerCharacter&&(P={triggerKind:1,triggerCharacter:T.triggerCharacter}),this._requestToken=new k.CancellationTokenSource;const N=this._editor.getOption(113);let O=1;switch(N){case"top":O=0;break;case"bottom":O=2;break}const{itemKind:F,showDeprecated:x}=h.createSuggestFilter(this._editor),W=new c.CompletionOptions(O,T.completionOptions?.kindFilter??F,T.completionOptions?.providerFilter,T.completionOptions?.providerItemsToReuse,x),V=p.WordDistance.create(this._editorWorkerService,this._editor),q=(0,c.provideSuggestionItems)(this._languageFeaturesService.completionProvider,M,this._editor.getPosition(),W,P,this._requestToken.token);Promise.all([q,V]).then(async([H,z])=>{if(this._requestToken?.dispose(),!this._editor.hasModel())return;let U=T?.clipboardText;if(!U&&H.needsClipboard&&(U=await this._clipboardService.readText()),this._triggerState===void 0)return;const j=this._editor.getModel(),Y=new v(j,this._editor.getPosition(),T),G={...a.FuzzyScoreOptions.default,firstMatchCanBeWeak:!this._editor.getOption(119).matchOnWordStartOnly};if(this._completionModel=new g.CompletionModel(H.items,this._context.column,{leadingLineContent:Y.leadingLineContent,characterCountDelta:Y.column-this._context.column},z,this._editor.getOption(119),this._editor.getOption(113),G,U),this._completionDisposables.add(H.disposable),this._onNewContext(Y),this._reportDurationsTelemetry(H.durations),!this._envService.isBuilt||this._envService.isExtensionDevelopment)for(const K of H.items)K.isInvalid&&this._logService.warn(`[suggest] did IGNORE invalid completion item from ${K.provider._debugDisplayName}`,K.completion)}).catch(I.onUnexpectedError)}_reportDurationsTelemetry(T){this._telemetryGate++%230===0&&setTimeout(()=>{this._telemetryService.publicLog2("suggest.durations.json",{data:JSON.stringify(T)}),this._logService.debug("suggest.durations.json",T)})}static createSuggestFilter(T){const M=new Set;T.getOption(113)==="none"&&M.add(27);const P=T.getOption(119);return P.showMethods||M.add(0),P.showFunctions||M.add(1),P.showConstructors||M.add(2),P.showFields||M.add(3),P.showVariables||M.add(4),P.showClasses||M.add(5),P.showStructs||M.add(6),P.showInterfaces||M.add(7),P.showModules||M.add(8),P.showProperties||M.add(9),P.showEvents||M.add(10),P.showOperators||M.add(11),P.showUnits||M.add(12),P.showValues||M.add(13),P.showConstants||M.add(14),P.showEnums||M.add(15),P.showEnumMembers||M.add(16),P.showKeywords||M.add(17),P.showWords||M.add(18),P.showColors||M.add(19),P.showFiles||M.add(20),P.showReferences||M.add(21),P.showColors||M.add(22),P.showFolders||M.add(23),P.showTypeParameters||M.add(24),P.showSnippets||M.add(27),P.showUsers||M.add(25),P.showIssues||M.add(26),{itemKind:M,showDeprecated:P.showDeprecated}}_onNewContext(T){if(this._context){if(T.lineNumber!==this._context.lineNumber){this.cancel();return}if((0,m.getLeadingWhitespace)(T.leadingLineContent)!==(0,m.getLeadingWhitespace)(this._context.leadingLineContent)){this.cancel();return}if(T.columnthis._context.leadingWord.startColumn){if(v.shouldAutoTrigger(this._editor)&&this._context){const A=this._completionModel.getItemsByProvider();this.trigger({auto:this._context.triggerOptions.auto,retrigger:!0,clipboardText:this._completionModel.clipboardText,completionOptions:{providerItemsToReuse:A}})}return}if(T.column>this._context.column&&this._completionModel.getIncompleteProvider().size>0&&T.leadingWord.word.length!==0){const M=new Map,A=new Set;for(const[P,N]of this._completionModel.getItemsByProvider())N.length>0&&N[0].container.incomplete?A.add(P):M.set(P,N);this.trigger({auto:this._context.triggerOptions.auto,triggerKind:2,retrigger:!0,clipboardText:this._completionModel.clipboardText,completionOptions:{providerFilter:A,providerItemsToReuse:M}})}else{const M=this._completionModel.lineContext;let A=!1;if(this._completionModel.lineContext={leadingLineContent:T.leadingLineContent,characterCountDelta:T.column-this._context.column},this._completionModel.items.length===0){const P=v.shouldAutoTrigger(this._editor);if(!this._context){this.cancel();return}if(P&&this._context.leadingWord.endColumn0,A&&T.leadingWord.word.length===0){this.cancel();return}}this._onDidSuggest.fire({completionModel:this._completionModel,triggerOptions:T.triggerOptions,isFrozen:A})}}}}};e.SuggestModel=L,e.SuggestModel=L=h=ke([ce(1,b.IEditorWorkerService),ce(2,n.IClipboardService),ce(3,s.ITelemetryService),ce(4,i.ILogService),ce(5,t.IContextKeyService),ce(6,o.IConfigurationService),ce(7,l.ILanguageFeaturesService),ce(8,f.IEnvironmentService)],L)}),define(ne[294],se([1,0,46,13,18,8,6,140,2,16,54,19,143,15,75,9,4,20,221,135,405,685,3,24,12,7,62,155,684,622,437,623,839,63,48,129,5,35]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S,L,D,T,M,A,P,N,O,F,x){"use strict";var W;Object.defineProperty(e,"__esModule",{value:!0}),e.TriggerSuggestAction=e.SuggestController=void 0;const V=!1;class q{constructor(K,R){if(this._model=K,this._position=R,this._decorationOptions=x.ModelDecorationOptions.register({description:"suggest-line-suffix",stickiness:1}),K.getLineMaxColumn(R.lineNumber)!==R.column){const ie=K.getOffsetAt(R),ue=K.getPositionAt(ie+1);K.changeDecorations(he=>{this._marker&&he.removeDecoration(this._marker),this._marker=he.addDecoration(g.Range.fromPositions(R,ue),this._decorationOptions)})}}dispose(){this._marker&&!this._model.isDisposed()&&this._model.changeDecorations(K=>{K.removeDecoration(this._marker),this._marker=void 0})}delta(K){if(this._model.isDisposed()||this._position.lineNumber!==K.lineNumber)return 0;if(this._marker){const R=this._model.getDecorationRange(this._marker);return this._model.getOffsetAt(R.getStartPosition())-this._model.getOffsetAt(K)}else return this._model.getLineMaxColumn(K.lineNumber)-K.column}}let H=class{static{W=this}static{this.ID="editor.contrib.suggestController"}static get(K){return K.getContribution(W.ID)}constructor(K,R,J,ie,ue,he,pe){this._memoryService=R,this._commandService=J,this._contextKeyService=ie,this._instantiationService=ue,this._logService=he,this._telemetryService=pe,this._lineSuffix=new _.MutableDisposable,this._toDispose=new _.DisposableStore,this._selectors=new z(ge=>ge.priority),this._onWillInsertSuggestItem=new y.Emitter,this.onWillInsertSuggestItem=this._onWillInsertSuggestItem.event,this.editor=K,this.model=ue.createInstance(T.SuggestModel,this.editor),this._selectors.register({priority:0,select:(ge,X,B)=>this._memoryService.select(ge,X,B)});const ae=S.Context.InsertMode.bindTo(ie);ae.set(K.getOption(119).insertMode),this._toDispose.add(this.model.onDidTrigger(()=>ae.set(K.getOption(119).insertMode))),this.widget=this._toDispose.add(new F.WindowIdleValue((0,F.getWindow)(K.getDomNode()),()=>{const ge=this._instantiationService.createInstance(A.SuggestWidget,this.editor);this._toDispose.add(ge),this._toDispose.add(ge.onDidSelect(Z=>this._insertSuggestion(Z,0),this));const X=new D.CommitCharacterController(this.editor,ge,this.model,Z=>this._insertSuggestion(Z,2));this._toDispose.add(X);const B=S.Context.MakesTextEdit.bindTo(this._contextKeyService),$=S.Context.HasInsertAndReplaceRange.bindTo(this._contextKeyService),Q=S.Context.CanResolve.bindTo(this._contextKeyService);return this._toDispose.add((0,_.toDisposable)(()=>{B.reset(),$.reset(),Q.reset()})),this._toDispose.add(ge.onDidFocus(({item:Z})=>{const te=this.editor.getPosition(),re=Z.editStart.column,le=te.column;let me=!0;this.editor.getOption(1)==="smart"&&this.model.state===2&&!Z.completion.additionalTextEdits&&!(Z.completion.insertTextRules&4)&&le-re===Z.completion.insertText.length&&(me=this.editor.getModel().getValueInRange({startLineNumber:te.lineNumber,startColumn:re,endLineNumber:te.lineNumber,endColumn:le})!==Z.completion.insertText),B.set(me),$.set(!s.Position.equals(Z.editInsertEnd,Z.editReplaceEnd)),Q.set(!!Z.provider.resolveCompletionItem||!!Z.completion.documentation||Z.completion.detail!==Z.completion.label)})),this._toDispose.add(ge.onDetailsKeyDown(Z=>{if(Z.toKeyCodeChord().equals(new m.KeyCodeChord(!0,!1,!1,!1,33))||b.isMacintosh&&Z.toKeyCodeChord().equals(new m.KeyCodeChord(!1,!1,!1,!0,33))){Z.stopPropagation();return}Z.toKeyCodeChord().isModifierKey()||this.editor.focus()})),ge})),this._overtypingCapturer=this._toDispose.add(new F.WindowIdleValue((0,F.getWindow)(K.getDomNode()),()=>this._toDispose.add(new M.OvertypingCapturer(this.editor,this.model)))),this._alternatives=this._toDispose.add(new F.WindowIdleValue((0,F.getWindow)(K.getDomNode()),()=>this._toDispose.add(new L.SuggestAlternatives(this.editor,this._contextKeyService)))),this._toDispose.add(ue.createInstance(u.WordContextKey,K)),this._toDispose.add(this.model.onDidTrigger(ge=>{this.widget.value.showTriggered(ge.auto,ge.shy?250:50),this._lineSuffix.value=new q(this.editor.getModel(),ge.position)})),this._toDispose.add(this.model.onDidSuggest(ge=>{if(ge.triggerOptions.shy)return;let X=-1;for(const $ of this._selectors.itemsOrderedByPriorityDesc)if(X=$.select(this.editor.getModel(),this.editor.getPosition(),ge.completionModel.items),X!==-1)break;if(X===-1&&(X=0),this.model.state===0)return;let B=!1;if(ge.triggerOptions.auto){const $=this.editor.getOption(119);$.selectionMode==="never"||$.selectionMode==="always"?B=$.selectionMode==="never":$.selectionMode==="whenTriggerCharacter"?B=ge.triggerOptions.triggerKind!==1:$.selectionMode==="whenQuickSuggestion"&&(B=ge.triggerOptions.triggerKind===1&&!ge.triggerOptions.refilter)}this.widget.value.showSuggestions(ge.completionModel,X,ge.isFrozen,ge.triggerOptions.auto,B)})),this._toDispose.add(this.model.onDidCancel(ge=>{ge.retrigger||this.widget.value.hideWidget()})),this._toDispose.add(this.editor.onDidBlurEditorWidget(()=>{V||(this.model.cancel(),this.model.clear())}));const ee=S.Context.AcceptSuggestionsOnEnter.bindTo(ie),de=()=>{const ge=this.editor.getOption(1);ee.set(ge==="on"||ge==="smart")};this._toDispose.add(this.editor.onDidChangeConfiguration(()=>de())),de()}dispose(){this._alternatives.dispose(),this._toDispose.dispose(),this.widget.dispose(),this.model.dispose(),this._lineSuffix.dispose(),this._onWillInsertSuggestItem.dispose()}_insertSuggestion(K,R){if(!K||!K.item){this._alternatives.value.reset(),this.model.cancel(),this.model.clear();return}if(!this.editor.hasModel())return;const J=l.SnippetController2.get(this.editor);if(!J)return;this._onWillInsertSuggestItem.fire({item:K.item});const ie=this.editor.getModel(),ue=ie.getAlternativeVersionId(),{item:he}=K,pe=[],ae=new I.CancellationTokenSource;R&1||this.editor.pushUndoStop();const ee=this.getOverwriteInfo(he,!!(R&8));this._memoryService.memorize(ie,this.editor.getPosition(),he);const de=he.isResolved;let ge=-1,X=-1;if(Array.isArray(he.completion.additionalTextEdits)){this.model.cancel();const $=o.StableEditorScrollState.capture(this.editor);this.editor.executeEdits("suggestController.additionalTextEdits.sync",he.completion.additionalTextEdits.map(Q=>{let Z=g.Range.lift(Q.range);if(Z.startLineNumber===he.position.lineNumber&&Z.startColumn>he.position.column){const te=this.editor.getPosition().column-he.position.column,re=te,le=g.Range.spansMultipleLines(Z)?0:te;Z=new g.Range(Z.startLineNumber,Z.startColumn+re,Z.endLineNumber,Z.endColumn+le)}return i.EditOperation.replaceMove(Z,Q.text)})),$.restoreRelativeVerticalPositionOfCursor(this.editor)}else if(!de){const $=new p.StopWatch;let Q;const Z=ie.onDidChangeContent(me=>{if(me.isFlush){ae.cancel(),Z.dispose();return}for(const Ce of me.changes){const ye=g.Range.getEndPosition(Ce.range);(!Q||s.Position.isBefore(ye,Q))&&(Q=ye)}}),te=R;R|=2;let re=!1;const le=this.editor.onWillType(()=>{le.dispose(),re=!0,te&2||this.editor.pushUndoStop()});pe.push(he.resolve(ae.token).then(()=>{if(!he.completion.additionalTextEdits||ae.token.isCancellationRequested)return;if(Q&&he.completion.additionalTextEdits.some(Ce=>s.Position.isBefore(Q,g.Range.getStartPosition(Ce.range))))return!1;re&&this.editor.pushUndoStop();const me=o.StableEditorScrollState.capture(this.editor);return this.editor.executeEdits("suggestController.additionalTextEdits.async",he.completion.additionalTextEdits.map(Ce=>i.EditOperation.replaceMove(g.Range.lift(Ce.range),Ce.text))),me.restoreRelativeVerticalPositionOfCursor(this.editor),(re||!(te&2))&&this.editor.pushUndoStop(),!0}).then(me=>{this._logService.trace("[suggest] async resolving of edits DONE (ms, applied?)",$.elapsed(),me),X=me===!0?1:me===!1?0:-2}).finally(()=>{Z.dispose(),le.dispose()}))}let{insertText:B}=he.completion;if(he.completion.insertTextRules&4||(B=a.SnippetParser.escape(B)),this.model.cancel(),J.insert(B,{overwriteBefore:ee.overwriteBefore,overwriteAfter:ee.overwriteAfter,undoStopBefore:!1,undoStopAfter:!1,adjustWhitespace:!(he.completion.insertTextRules&1),clipboardText:K.model.clipboardText,overtypingCapturer:this._overtypingCapturer.value}),R&2||this.editor.pushUndoStop(),he.completion.command)if(he.completion.command.id===U.id)this.model.trigger({auto:!0,retrigger:!0});else{const $=new p.StopWatch;pe.push(this._commandService.executeCommand(he.completion.command.id,...he.completion.command.arguments?[...he.completion.command.arguments]:[]).catch(Q=>{he.completion.extensionId?(0,E.onUnexpectedExternalError)(Q):(0,E.onUnexpectedError)(Q)}).finally(()=>{ge=$.elapsed()}))}R&4&&this._alternatives.value.set(K,$=>{for(ae.cancel();ie.canUndo();){ue!==ie.getAlternativeVersionId()&&ie.undo(),this._insertSuggestion($,3|(R&8?8:0));break}}),this._alertCompletionItem(he),Promise.all(pe).finally(()=>{this._reportSuggestionAcceptedTelemetry(he,ie,de,ge,X,K.index,K.model.items),this.model.clear(),ae.dispose()})}_reportSuggestionAcceptedTelemetry(K,R,J,ie,ue,he,pe){if(Math.floor(Math.random()*100)===0)return;const ae=new Map;for(let X=0;X1?ee[0]:-1;this._telemetryService.publicLog2("suggest.acceptedSuggestion",{extensionId:K.extensionId?.value??"unknown",providerId:K.provider._debugDisplayName??"unknown",kind:K.completion.kind,basenameHash:(0,O.hash)((0,N.basename)(R.uri)).toString(16),languageId:R.getLanguageId(),fileExtension:(0,N.extname)(R.uri),resolveInfo:K.provider.resolveCompletionItem?J?1:0:-1,resolveDuration:K.resolveDuration,commandDuration:ie,additionalEditsAsync:ue,index:he,firstIndex:ge})}getOverwriteInfo(K,R){(0,n.assertType)(this.editor.hasModel());let J=this.editor.getOption(119).insertMode==="replace";R&&(J=!J);const ie=K.position.column-K.editStart.column,ue=(J?K.editReplaceEnd.column:K.editInsertEnd.column)-K.position.column,he=this.editor.getPosition().column-K.position.column,pe=this._lineSuffix.value?this._lineSuffix.value.delta(this.editor.getPosition()):0;return{overwriteBefore:ie+he,overwriteAfter:ue+pe}}_alertCompletionItem(K){if((0,k.isNonEmptyArray)(K.completion.additionalTextEdits)){const R=C.localize(1318,"Accepting '{0}' made {1} additional edits",K.textLabel,K.completion.additionalTextEdits.length);(0,d.alert)(R)}}triggerSuggest(K,R,J){this.editor.hasModel()&&(this.model.trigger({auto:R??!1,completionOptions:{providerFilter:K,kindFilter:J?new Set:void 0}}),this.editor.revealPosition(this.editor.getPosition(),0),this.editor.focus())}triggerSuggestAndAcceptBest(K){if(!this.editor.hasModel())return;const R=this.editor.getPosition(),J=()=>{R.equals(this.editor.getPosition())&&this._commandService.executeCommand(K.fallback)},ie=ue=>{if(ue.completion.insertTextRules&4||ue.completion.additionalTextEdits)return!0;const he=this.editor.getPosition(),pe=ue.editStart.column,ae=he.column;return ae-pe!==ue.completion.insertText.length?!0:this.editor.getModel().getValueInRange({startLineNumber:he.lineNumber,startColumn:pe,endLineNumber:he.lineNumber,endColumn:ae})!==ue.completion.insertText};y.Event.once(this.model.onDidTrigger)(ue=>{const he=[];y.Event.any(this.model.onDidTrigger,this.model.onDidCancel)(()=>{(0,_.dispose)(he),J()},void 0,he),this.model.onDidSuggest(({completionModel:pe})=>{if((0,_.dispose)(he),pe.items.length===0){J();return}const ae=this._memoryService.select(this.editor.getModel(),this.editor.getPosition(),pe.items),ee=pe.items[ae];if(!ie(ee)){J();return}this.editor.pushUndoStop(),this._insertSuggestion({index:ae,item:ee,model:pe},7)},void 0,he)}),this.model.trigger({auto:!1,shy:!0}),this.editor.revealPosition(R,0),this.editor.focus()}acceptSelectedSuggestion(K,R){const J=this.widget.value.getFocusedItem();let ie=0;K&&(ie|=4),R&&(ie|=8),this._insertSuggestion(J,ie)}acceptNextSuggestion(){this._alternatives.value.next()}acceptPrevSuggestion(){this._alternatives.value.prev()}cancelSuggestWidget(){this.model.cancel(),this.model.clear(),this.widget.value.hideWidget()}focusSuggestion(){this.widget.value.focusSelected()}selectNextSuggestion(){this.widget.value.selectNext()}selectNextPageSuggestion(){this.widget.value.selectNextPage()}selectLastSuggestion(){this.widget.value.selectLast()}selectPrevSuggestion(){this.widget.value.selectPrevious()}selectPrevPageSuggestion(){this.widget.value.selectPreviousPage()}selectFirstSuggestion(){this.widget.value.selectFirst()}toggleSuggestionDetails(){this.widget.value.toggleDetails()}toggleExplainMode(){this.widget.value.toggleExplainMode()}toggleSuggestionFocus(){this.widget.value.toggleDetailsFocus()}resetWidgetSize(){this.widget.value.resetPersistedSize()}forceRenderingAbove(){this.widget.value.forceRenderingAbove()}stopForceRenderingAbove(){this.widget.isInitialized&&this.widget.value.stopForceRenderingAbove()}registerSelector(K){return this._selectors.register(K)}};e.SuggestController=H,e.SuggestController=H=W=ke([ce(1,r.ISuggestMemoryService),ce(2,f.ICommandService),ce(3,h.IContextKeyService),ce(4,v.IInstantiationService),ce(5,w.ILogService),ce(6,P.ITelemetryService)],H);class z{constructor(K){this.prioritySelector=K,this._items=new Array}register(K){if(this._items.indexOf(K)!==-1)throw new Error("Value is already registered");return this._items.push(K),this._items.sort((R,J)=>this.prioritySelector(J)-this.prioritySelector(R)),{dispose:()=>{const R=this._items.indexOf(K);R>=0&&this._items.splice(R,1)}}}get itemsOrderedByPriorityDesc(){return this._items}}class U extends t.EditorAction{static{this.id="editor.action.triggerSuggest"}constructor(){super({id:U.id,label:C.localize(1319,"Trigger Suggest"),alias:"Trigger Suggest",precondition:h.ContextKeyExpr.and(c.EditorContextKeys.writable,c.EditorContextKeys.hasCompletionItemProvider,S.Context.Visible.toNegated()),kbOpts:{kbExpr:c.EditorContextKeys.textInputFocus,primary:2058,secondary:[2087],mac:{primary:266,secondary:[521,2087]},weight:100}})}run(K,R,J){const ie=H.get(R);if(!ie)return;let ue;J&&typeof J=="object"&&J.auto===!0&&(ue=!0),ie.triggerSuggest(void 0,ue,void 0)}}e.TriggerSuggestAction=U,(0,t.registerEditorContribution)(H.ID,H,2),(0,t.registerEditorAction)(U);const j=190,Y=t.EditorCommand.bindToContribution(H.get);(0,t.registerEditorCommand)(new Y({id:"acceptSelectedSuggestion",precondition:h.ContextKeyExpr.and(S.Context.Visible,S.Context.HasFocusedSuggestion),handler(G){G.acceptSelectedSuggestion(!0,!1)},kbOpts:[{primary:2,kbExpr:h.ContextKeyExpr.and(S.Context.Visible,c.EditorContextKeys.textInputFocus),weight:j},{primary:3,kbExpr:h.ContextKeyExpr.and(S.Context.Visible,c.EditorContextKeys.textInputFocus,S.Context.AcceptSuggestionsOnEnter,S.Context.MakesTextEdit),weight:j}],menuOpts:[{menuId:S.suggestWidgetStatusbarMenu,title:C.localize(1320,"Insert"),group:"left",order:1,when:S.Context.HasInsertAndReplaceRange.toNegated()},{menuId:S.suggestWidgetStatusbarMenu,title:C.localize(1321,"Insert"),group:"left",order:1,when:h.ContextKeyExpr.and(S.Context.HasInsertAndReplaceRange,S.Context.InsertMode.isEqualTo("insert"))},{menuId:S.suggestWidgetStatusbarMenu,title:C.localize(1322,"Replace"),group:"left",order:1,when:h.ContextKeyExpr.and(S.Context.HasInsertAndReplaceRange,S.Context.InsertMode.isEqualTo("replace"))}]})),(0,t.registerEditorCommand)(new Y({id:"acceptAlternativeSelectedSuggestion",precondition:h.ContextKeyExpr.and(S.Context.Visible,c.EditorContextKeys.textInputFocus,S.Context.HasFocusedSuggestion),kbOpts:{weight:j,kbExpr:c.EditorContextKeys.textInputFocus,primary:1027,secondary:[1026]},handler(G){G.acceptSelectedSuggestion(!1,!0)},menuOpts:[{menuId:S.suggestWidgetStatusbarMenu,group:"left",order:2,when:h.ContextKeyExpr.and(S.Context.HasInsertAndReplaceRange,S.Context.InsertMode.isEqualTo("insert")),title:C.localize(1323,"Replace")},{menuId:S.suggestWidgetStatusbarMenu,group:"left",order:2,when:h.ContextKeyExpr.and(S.Context.HasInsertAndReplaceRange,S.Context.InsertMode.isEqualTo("replace")),title:C.localize(1324,"Insert")}]})),f.CommandsRegistry.registerCommandAlias("acceptSelectedSuggestionOnEnter","acceptSelectedSuggestion"),(0,t.registerEditorCommand)(new Y({id:"hideSuggestWidget",precondition:S.Context.Visible,handler:G=>G.cancelSuggestWidget(),kbOpts:{weight:j,kbExpr:c.EditorContextKeys.textInputFocus,primary:9,secondary:[1033]}})),(0,t.registerEditorCommand)(new Y({id:"selectNextSuggestion",precondition:h.ContextKeyExpr.and(S.Context.Visible,h.ContextKeyExpr.or(S.Context.MultipleSuggestions,S.Context.HasFocusedSuggestion.negate())),handler:G=>G.selectNextSuggestion(),kbOpts:{weight:j,kbExpr:c.EditorContextKeys.textInputFocus,primary:18,secondary:[2066],mac:{primary:18,secondary:[2066,300]}}})),(0,t.registerEditorCommand)(new Y({id:"selectNextPageSuggestion",precondition:h.ContextKeyExpr.and(S.Context.Visible,h.ContextKeyExpr.or(S.Context.MultipleSuggestions,S.Context.HasFocusedSuggestion.negate())),handler:G=>G.selectNextPageSuggestion(),kbOpts:{weight:j,kbExpr:c.EditorContextKeys.textInputFocus,primary:12,secondary:[2060]}})),(0,t.registerEditorCommand)(new Y({id:"selectLastSuggestion",precondition:h.ContextKeyExpr.and(S.Context.Visible,h.ContextKeyExpr.or(S.Context.MultipleSuggestions,S.Context.HasFocusedSuggestion.negate())),handler:G=>G.selectLastSuggestion()})),(0,t.registerEditorCommand)(new Y({id:"selectPrevSuggestion",precondition:h.ContextKeyExpr.and(S.Context.Visible,h.ContextKeyExpr.or(S.Context.MultipleSuggestions,S.Context.HasFocusedSuggestion.negate())),handler:G=>G.selectPrevSuggestion(),kbOpts:{weight:j,kbExpr:c.EditorContextKeys.textInputFocus,primary:16,secondary:[2064],mac:{primary:16,secondary:[2064,302]}}})),(0,t.registerEditorCommand)(new Y({id:"selectPrevPageSuggestion",precondition:h.ContextKeyExpr.and(S.Context.Visible,h.ContextKeyExpr.or(S.Context.MultipleSuggestions,S.Context.HasFocusedSuggestion.negate())),handler:G=>G.selectPrevPageSuggestion(),kbOpts:{weight:j,kbExpr:c.EditorContextKeys.textInputFocus,primary:11,secondary:[2059]}})),(0,t.registerEditorCommand)(new Y({id:"selectFirstSuggestion",precondition:h.ContextKeyExpr.and(S.Context.Visible,h.ContextKeyExpr.or(S.Context.MultipleSuggestions,S.Context.HasFocusedSuggestion.negate())),handler:G=>G.selectFirstSuggestion()})),(0,t.registerEditorCommand)(new Y({id:"focusSuggestion",precondition:h.ContextKeyExpr.and(S.Context.Visible,S.Context.HasFocusedSuggestion.negate()),handler:G=>G.focusSuggestion(),kbOpts:{weight:j,kbExpr:c.EditorContextKeys.textInputFocus,primary:2058,secondary:[2087],mac:{primary:266,secondary:[2087]}}})),(0,t.registerEditorCommand)(new Y({id:"focusAndAcceptSuggestion",precondition:h.ContextKeyExpr.and(S.Context.Visible,S.Context.HasFocusedSuggestion.negate()),handler:G=>{G.focusSuggestion(),G.acceptSelectedSuggestion(!0,!1)}})),(0,t.registerEditorCommand)(new Y({id:"toggleSuggestionDetails",precondition:h.ContextKeyExpr.and(S.Context.Visible,S.Context.HasFocusedSuggestion),handler:G=>G.toggleSuggestionDetails(),kbOpts:{weight:j,kbExpr:c.EditorContextKeys.textInputFocus,primary:2058,secondary:[2087],mac:{primary:266,secondary:[2087]}},menuOpts:[{menuId:S.suggestWidgetStatusbarMenu,group:"right",order:1,when:h.ContextKeyExpr.and(S.Context.DetailsVisible,S.Context.CanResolve),title:C.localize(1325,"Show Less")},{menuId:S.suggestWidgetStatusbarMenu,group:"right",order:1,when:h.ContextKeyExpr.and(S.Context.DetailsVisible.toNegated(),S.Context.CanResolve),title:C.localize(1326,"Show More")}]})),(0,t.registerEditorCommand)(new Y({id:"toggleExplainMode",precondition:S.Context.Visible,handler:G=>G.toggleExplainMode(),kbOpts:{weight:100,primary:2138}})),(0,t.registerEditorCommand)(new Y({id:"toggleSuggestionFocus",precondition:S.Context.Visible,handler:G=>G.toggleSuggestionFocus(),kbOpts:{weight:j,kbExpr:c.EditorContextKeys.textInputFocus,primary:2570,mac:{primary:778}}})),(0,t.registerEditorCommand)(new Y({id:"insertBestCompletion",precondition:h.ContextKeyExpr.and(c.EditorContextKeys.textInputFocus,h.ContextKeyExpr.equals("config.editor.tabCompletion","on"),u.WordContextKey.AtEnd,S.Context.Visible.toNegated(),L.SuggestAlternatives.OtherSuggestions.toNegated(),l.SnippetController2.InSnippetMode.toNegated()),handler:(G,K)=>{G.triggerSuggestAndAcceptBest((0,n.isObject)(K)?{fallback:"tab",...K}:{fallback:"tab"})},kbOpts:{weight:j,primary:2}})),(0,t.registerEditorCommand)(new Y({id:"insertNextSuggestion",precondition:h.ContextKeyExpr.and(c.EditorContextKeys.textInputFocus,h.ContextKeyExpr.equals("config.editor.tabCompletion","on"),L.SuggestAlternatives.OtherSuggestions,S.Context.Visible.toNegated(),l.SnippetController2.InSnippetMode.toNegated()),handler:G=>G.acceptNextSuggestion(),kbOpts:{weight:j,kbExpr:c.EditorContextKeys.textInputFocus,primary:2}})),(0,t.registerEditorCommand)(new Y({id:"insertPrevSuggestion",precondition:h.ContextKeyExpr.and(c.EditorContextKeys.textInputFocus,h.ContextKeyExpr.equals("config.editor.tabCompletion","on"),L.SuggestAlternatives.OtherSuggestions,S.Context.Visible.toNegated(),l.SnippetController2.InSnippetMode.toNegated()),handler:G=>G.acceptPrevSuggestion(),kbOpts:{weight:j,kbExpr:c.EditorContextKeys.textInputFocus,primary:1026}})),(0,t.registerEditorAction)(class extends t.EditorAction{constructor(){super({id:"editor.action.resetSuggestSize",label:C.localize(1327,"Reset Suggest Widget Size"),alias:"Reset Suggest Widget Size",precondition:void 0})}run(G,K){H.get(K)?.resetWidgetSize()}})}),define(ne[861],se([1,0,13,67,6,2,9,4,104,27,246,135,436,294]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestItemInfo=e.SuggestWidgetAdaptor=void 0;class i extends E.Disposable{get selectedItem(){return this._currentSuggestItemInfo}constructor(l,a,r){super(),this.editor=l,this.suggestControllerPreselector=a,this.onWillAccept=r,this.isSuggestWidgetVisible=!1,this.isShiftKeyPressed=!1,this._isActive=!1,this._currentSuggestItemInfo=void 0,this._onDidSelectedItemChange=this._register(new I.Emitter),this.onDidSelectedItemChange=this._onDidSelectedItemChange.event,this._register(l.onKeyDown(C=>{C.shiftKey&&!this.isShiftKeyPressed&&(this.isShiftKeyPressed=!0,this.update(this._isActive))})),this._register(l.onKeyUp(C=>{C.shiftKey&&this.isShiftKeyPressed&&(this.isShiftKeyPressed=!1,this.update(this._isActive))}));const u=t.SuggestController.get(this.editor);if(u){this._register(u.registerSelector({priority:100,select:(h,v,w)=>{const S=this.editor.getModel();if(!S)return-1;const L=this.suggestControllerPreselector(),D=L?(0,p.singleTextRemoveCommonPrefix)(L,S):void 0;if(!D)return-1;const T=y.Position.lift(v),M=w.map((P,N)=>{const O=s.fromSuggestion(u,S,T,P,this.isShiftKeyPressed),F=(0,p.singleTextRemoveCommonPrefix)(O.toSingleTextEdit(),S),x=(0,p.singleTextEditAugments)(D,F);return{index:N,valid:x,prefixLength:F.text.length,suggestItem:P}}).filter(P=>P&&P.valid&&P.prefixLength>0),A=(0,k.findFirstMax)(M,(0,d.compareBy)(P=>P.prefixLength,d.numberComparator));return A?A.index:-1}}));let C=!1;const f=()=>{C||(C=!0,this._register(u.widget.value.onDidShow(()=>{this.isSuggestWidgetVisible=!0,this.update(!0)})),this._register(u.widget.value.onDidHide(()=>{this.isSuggestWidgetVisible=!1,this.update(!1)})),this._register(u.widget.value.onDidFocus(()=>{this.isSuggestWidgetVisible=!0,this.update(!0)})))};this._register(I.Event.once(u.model.onDidTrigger)(h=>{f()})),this._register(u.onWillInsertSuggestItem(h=>{const v=this.editor.getPosition(),w=this.editor.getModel();if(!v||!w)return;const S=s.fromSuggestion(u,w,v,h.item,this.isShiftKeyPressed);this.onWillAccept(S)}))}this.update(this._isActive)}update(l){const a=this.getSuggestItemInfo();(this._isActive!==l||!g(this._currentSuggestItemInfo,a))&&(this._isActive=l,this._currentSuggestItemInfo=a,this._onDidSelectedItemChange.fire())}getSuggestItemInfo(){const l=t.SuggestController.get(this.editor);if(!l||!this.isSuggestWidgetVisible)return;const a=l.widget.value.getFocusedItem(),r=this.editor.getPosition(),u=this.editor.getModel();if(!(!a||!r||!u))return s.fromSuggestion(l,u,r,a.item,this.isShiftKeyPressed)}stopForceRenderingAbove(){t.SuggestController.get(this.editor)?.stopForceRenderingAbove()}forceRenderingAbove(){t.SuggestController.get(this.editor)?.forceRenderingAbove()}}e.SuggestWidgetAdaptor=i;class s{static fromSuggestion(l,a,r,u,C){let{insertText:f}=u.completion,h=!1;if(u.completion.insertTextRules&4){const w=new n.SnippetParser().parse(f);w.children.length<100&&o.SnippetSession.adjustWhitespace(a,r,!0,w),f=w.toString(),h=!0}const v=l.getOverwriteInfo(u,C);return new s(m.Range.fromPositions(r.delta(0,-v.overwriteBefore),r.delta(0,Math.max(v.overwriteAfter,0))),f,u.completion.kind,h)}constructor(l,a,r,u){this.range=l,this.insertText=a,this.completionItemKind=r,this.isSnippetText=u}equals(l){return this.range.equalsRange(l.range)&&this.insertText===l.insertText&&this.completionItemKind===l.completionItemKind&&this.isSnippetText===l.isSnippetText}toSelectedSuggestionInfo(){return new b.SelectedSuggestionInfo(this.range,this.insertText,this.completionItemKind,this.isSnippetText)}toSingleTextEdit(){return new _.SingleTextEdit(this.range,this.insertText)}}e.SuggestItemInfo=s;function g(c,l){return c===l?!0:!c||!l?!1:c.equals(l)}}),define(ne[295],se([1,0,630,46,14,18,2,21,65,189,19,214,112,9,79,17,245,679,269,283,860,861,3,61,137,24,28,12,7,31]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S,L,D){"use strict";var T;Object.defineProperty(e,"__esModule",{value:!0}),e.InlineCompletionsController=void 0;let M=class extends y.Disposable{static{T=this}static{this.ID="editor.contrib.inlineCompletionsController"}static get(N){return N.getContribution(T.ID)}constructor(N,O,F,x,W,V,q,H,z,U){super(),this.editor=N,this._instantiationService=O,this._contextKeyService=F,this._configurationService=x,this._commandService=W,this._debounceService=V,this._languageFeaturesService=q,this._accessibilitySignalService=H,this._keybindingService=z,this._accessibilityService=U,this._editorObs=(0,o.observableCodeEditor)(this.editor),this._positions=(0,m.derived)(this,Y=>this._editorObs.selections.read(Y)?.map(G=>G.getEndPosition())??[new t.Position(1,1)]),this._suggestWidgetAdaptor=this._register(new u.SuggestWidgetAdaptor(this.editor,()=>(this._editorObs.forceUpdate(),this.model.get()?.selectedInlineCompletion.get()?.toSingleTextEdit(void 0)),Y=>this._editorObs.forceUpdate(G=>{this.model.get()?.handleSuggestAccepted(Y)}))),this._suggestWidgetSelectedItem=(0,m.observableFromEvent)(this,Y=>this._suggestWidgetAdaptor.onDidSelectedItemChange(()=>{this._editorObs.forceUpdate(G=>Y(void 0))}),()=>this._suggestWidgetAdaptor.selectedItem),this._enabledInConfig=(0,m.observableFromEvent)(this,this.editor.onDidChangeConfiguration,()=>this.editor.getOption(62).enabled),this._isScreenReaderEnabled=(0,m.observableFromEvent)(this,this._accessibilityService.onDidChangeScreenReaderOptimized,()=>this._accessibilityService.isScreenReaderOptimized()),this._editorDictationInProgress=(0,m.observableFromEvent)(this,this._contextKeyService.onDidChangeContext,()=>this._contextKeyService.getContext(this.editor.getDomNode()).getValue("editorDictation.inProgress")===!0),this._enabled=(0,m.derived)(this,Y=>this._enabledInConfig.read(Y)&&(!this._isScreenReaderEnabled.read(Y)||!this._editorDictationInProgress.read(Y))),this._debounceValue=this._debounceService.for(this._languageFeaturesService.inlineCompletionsProvider,"InlineCompletionsDebounce",{min:50,max:50}),this.model=(0,_.derivedDisposable)(this,Y=>{if(this._editorObs.isReadonly.read(Y))return;const G=this._editorObs.model.read(Y);return G?this._instantiationService.createInstance(r.InlineCompletionsModel,G,this._suggestWidgetSelectedItem,this._editorObs.versionId,this._positions,this._debounceValue,(0,m.observableFromEvent)(this.editor.onDidChangeConfiguration,()=>this.editor.getOption(119).preview),(0,m.observableFromEvent)(this.editor.onDidChangeConfiguration,()=>this.editor.getOption(119).previewMode),(0,m.observableFromEvent)(this.editor.onDidChangeConfiguration,()=>this.editor.getOption(62).mode),this._enabled):void 0}).recomputeInitiallyAndOnChange(this._store),this._ghostTexts=(0,m.derived)(this,Y=>this.model.read(Y)?.ghostTexts.read(Y)??[]),this._stablizedGhostTexts=A(this._ghostTexts,this._store),this._ghostTextWidgets=(0,b.mapObservableArrayCached)(this,this._stablizedGhostTexts,(Y,G)=>G.add(this._instantiationService.createInstance(c.GhostTextView,this.editor,{ghostText:Y,minReservedLineCount:(0,m.constObservable)(0),targetTextModel:this.model.map(K=>K?.textModel)}))).recomputeInitiallyAndOnChange(this._store),this._playAccessibilitySignal=(0,m.observableSignal)(this),this._fontFamily=(0,m.observableFromEvent)(this,this.editor.onDidChangeConfiguration,()=>this.editor.getOption(62).fontFamily),this._register(new l.InlineCompletionContextKeys(this._contextKeyService,this.model)),this._register((0,o.reactToChange)(this._editorObs.onDidType,(Y,G)=>{this._enabled.get()&&this.model.get()?.trigger()})),this._register(this._commandService.onDidExecuteCommand(Y=>{new Set([n.CoreEditingCommands.Tab.id,n.CoreEditingCommands.DeleteLeft.id,n.CoreEditingCommands.DeleteRight.id,g.inlineSuggestCommitId,"acceptSelectedSuggestion"]).has(Y.commandId)&&N.hasTextFocus()&&this._enabled.get()&&this._editorObs.forceUpdate(K=>{this.model.get()?.trigger(K)})})),this._register((0,o.reactToChange)(this._editorObs.selections,(Y,G)=>{G.some(K=>K.reason===3||K.source==="api")&&this.model.get()?.stop()})),this._register(this.editor.onDidBlurEditorWidget(()=>{this._contextKeyService.getContextKeyValue("accessibleViewIsShown")||this._configurationService.getValue("editor.inlineSuggest.keepOnBlur")||N.getOption(62).keepOnBlur||a.InlineSuggestionHintsContentWidget.dropDownVisible||(0,m.transaction)(Y=>{this.model.get()?.stop(Y)})})),this._register((0,m.autorun)(Y=>{const G=this.model.read(Y)?.state.read(Y);G?.suggestItem?G.primaryGhostText.lineCount>=2&&this._suggestWidgetAdaptor.forceRenderingAbove():this._suggestWidgetAdaptor.stopForceRenderingAbove()})),this._register((0,y.toDisposable)(()=>{this._suggestWidgetAdaptor.stopForceRenderingAbove()}));const j=(0,b.derivedObservableWithCache)(this,(Y,G)=>{const R=this.model.read(Y)?.state.read(Y);return this._suggestWidgetSelectedItem.get()?G:R?.inlineCompletion?.semanticId});this._register((0,o.reactToChangeWithStore)((0,m.derived)(Y=>(this._playAccessibilitySignal.read(Y),j.read(Y),{})),async(Y,G,K)=>{const R=this.model.get(),J=R?.state.get();if(!J||!R)return;const ie=R.textModel.getLineContent(J.primaryGhostText.lineNumber);await(0,I.timeout)(50,(0,E.cancelOnDispose)(K)),await(0,m.waitForState)(this._suggestWidgetSelectedItem,p.isUndefined,()=>!1,(0,E.cancelOnDispose)(K)),await this._accessibilitySignalService.playSignal(h.AccessibilitySignal.inlineSuggestion),this.editor.getOption(8)&&this._provideScreenReaderUpdate(J.primaryGhostText.renderForScreenReader(ie))})),this._register(new a.InlineCompletionsHintsWidget(this.editor,this.model,this._instantiationService)),this._register((0,d.createStyleSheetFromObservable)((0,m.derived)(Y=>{const G=this._fontFamily.read(Y);return G===""||G==="default"?"":` -.monaco-editor .ghost-text-decoration, -.monaco-editor .ghost-text-decoration-preview, -.monaco-editor .ghost-text { - font-family: ${G}; -}`}))),this._register(this._configurationService.onDidChangeConfiguration(Y=>{Y.affectsConfiguration("accessibility.verbosity.inlineCompletions")&&this.editor.updateOptions({inlineCompletionsAccessibilityVerbose:this._configurationService.getValue("accessibility.verbosity.inlineCompletions")})})),this.editor.updateOptions({inlineCompletionsAccessibilityVerbose:this._configurationService.getValue("accessibility.verbosity.inlineCompletions")})}playAccessibilitySignal(N){this._playAccessibilitySignal.trigger(N)}_provideScreenReaderUpdate(N){const O=this._contextKeyService.getContextKeyValue("accessibleViewIsShown"),F=this._keybindingService.lookupKeybinding("editor.action.accessibleView");let x;!O&&F&&this.editor.getOption(150)&&(x=(0,C.localize)(1088,"Inspect this in the accessible view ({0})",F.getAriaLabel())),(0,k.alert)(x?N+", "+x:N)}shouldShowHoverAt(N){const O=this.model.get()?.primaryGhostText.get();return O?O.parts.some(F=>N.containsPosition(new t.Position(O.lineNumber,F.column))):!1}shouldShowHoverAtViewZone(N){return this._ghostTextWidgets.get()[0]?.ownsViewZone(N)??!1}};e.InlineCompletionsController=M,e.InlineCompletionsController=M=T=ke([ce(1,L.IInstantiationService),ce(2,S.IContextKeyService),ce(3,w.IConfigurationService),ce(4,v.ICommandService),ce(5,i.ILanguageFeatureDebounceService),ce(6,s.ILanguageFeaturesService),ce(7,h.IAccessibilitySignalService),ce(8,D.IKeybindingService),ce(9,f.IAccessibilityService)],M);function A(P,N){const O=(0,m.observableValue)("result",[]),F=[];return N.add((0,m.autorun)(x=>{const W=P.read(x);(0,m.transaction)(V=>{if(W.length!==F.length){F.length=W.length;for(let q=0;qq.set(W[H],V))})})),O}}),define(ne[862],se([1,0,21,92,15,20,245,269,295,155,3,29,28,12]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ToggleAlwaysShowInlineSuggestionToolbar=e.HideInlineCompletion=e.AcceptInlineCompletion=e.AcceptNextLineOfInlineCompletion=e.AcceptNextWordOfInlineCompletion=e.TriggerInlineSuggestionAction=e.ShowPreviousInlineSuggestionAction=e.ShowNextInlineSuggestionAction=void 0;class i extends I.EditorAction{static{this.ID=y.showNextInlineSuggestionActionId}constructor(){super({id:i.ID,label:p.localize(1073,"Show Next Inline Suggestion"),alias:"Show Next Inline Suggestion",precondition:t.ContextKeyExpr.and(E.EditorContextKeys.writable,m.InlineCompletionContextKeys.inlineSuggestionVisible),kbOpts:{weight:100,primary:606}})}async run(f,h){_.InlineCompletionsController.get(h)?.model.get()?.next()}}e.ShowNextInlineSuggestionAction=i;class s extends I.EditorAction{static{this.ID=y.showPreviousInlineSuggestionActionId}constructor(){super({id:s.ID,label:p.localize(1074,"Show Previous Inline Suggestion"),alias:"Show Previous Inline Suggestion",precondition:t.ContextKeyExpr.and(E.EditorContextKeys.writable,m.InlineCompletionContextKeys.inlineSuggestionVisible),kbOpts:{weight:100,primary:604}})}async run(f,h){_.InlineCompletionsController.get(h)?.model.get()?.previous()}}e.ShowPreviousInlineSuggestionAction=s;class g extends I.EditorAction{constructor(){super({id:"editor.action.inlineSuggest.trigger",label:p.localize(1075,"Trigger Inline Suggestion"),alias:"Trigger Inline Suggestion",precondition:E.EditorContextKeys.writable})}async run(f,h){const v=_.InlineCompletionsController.get(h);await(0,k.asyncTransaction)(async w=>{await v?.model.get()?.triggerExplicitly(w),v?.playAccessibilitySignal(w)})}}e.TriggerInlineSuggestionAction=g;class c extends I.EditorAction{constructor(){super({id:"editor.action.inlineSuggest.acceptNextWord",label:p.localize(1076,"Accept Next Word Of Inline Suggestion"),alias:"Accept Next Word Of Inline Suggestion",precondition:t.ContextKeyExpr.and(E.EditorContextKeys.writable,m.InlineCompletionContextKeys.inlineSuggestionVisible),kbOpts:{weight:101,primary:2065,kbExpr:t.ContextKeyExpr.and(E.EditorContextKeys.writable,m.InlineCompletionContextKeys.inlineSuggestionVisible)},menuOpts:[{menuId:n.MenuId.InlineSuggestionToolbar,title:p.localize(1077,"Accept Word"),group:"primary",order:2}]})}async run(f,h){const v=_.InlineCompletionsController.get(h);await v?.model.get()?.acceptNextWord(v.editor)}}e.AcceptNextWordOfInlineCompletion=c;class l extends I.EditorAction{constructor(){super({id:"editor.action.inlineSuggest.acceptNextLine",label:p.localize(1078,"Accept Next Line Of Inline Suggestion"),alias:"Accept Next Line Of Inline Suggestion",precondition:t.ContextKeyExpr.and(E.EditorContextKeys.writable,m.InlineCompletionContextKeys.inlineSuggestionVisible),kbOpts:{weight:101},menuOpts:[{menuId:n.MenuId.InlineSuggestionToolbar,title:p.localize(1079,"Accept Line"),group:"secondary",order:2}]})}async run(f,h){const v=_.InlineCompletionsController.get(h);await v?.model.get()?.acceptNextLine(v.editor)}}e.AcceptNextLineOfInlineCompletion=l;class a extends I.EditorAction{constructor(){super({id:y.inlineSuggestCommitId,label:p.localize(1080,"Accept Inline Suggestion"),alias:"Accept Inline Suggestion",precondition:m.InlineCompletionContextKeys.inlineSuggestionVisible,menuOpts:[{menuId:n.MenuId.InlineSuggestionToolbar,title:p.localize(1081,"Accept"),group:"primary",order:1}],kbOpts:{primary:2,weight:200,kbExpr:t.ContextKeyExpr.and(m.InlineCompletionContextKeys.inlineSuggestionVisible,E.EditorContextKeys.tabMovesFocus.toNegated(),m.InlineCompletionContextKeys.inlineSuggestionHasIndentationLessThanTabSize,b.Context.Visible.toNegated(),E.EditorContextKeys.hoverFocused.toNegated())}})}async run(f,h){const v=_.InlineCompletionsController.get(h);v&&(v.model.get()?.accept(v.editor),v.editor.focus())}}e.AcceptInlineCompletion=a;class r extends I.EditorAction{static{this.ID="editor.action.inlineSuggest.hide"}constructor(){super({id:r.ID,label:p.localize(1082,"Hide Inline Suggestion"),alias:"Hide Inline Suggestion",precondition:m.InlineCompletionContextKeys.inlineSuggestionVisible,kbOpts:{weight:100,primary:9}})}async run(f,h){const v=_.InlineCompletionsController.get(h);(0,d.transaction)(w=>{v?.model.get()?.stop(w)})}}e.HideInlineCompletion=r;class u extends n.Action2{static{this.ID="editor.action.inlineSuggest.toggleAlwaysShowToolbar"}constructor(){super({id:u.ID,title:p.localize(1083,"Always Show Toolbar"),f1:!1,precondition:void 0,menu:[{id:n.MenuId.InlineSuggestionToolbar,group:"secondary",order:10}],toggled:t.ContextKeyExpr.equals("config.editor.inlineSuggest.showToolbar","always")})}async run(f,h){const v=f.get(o.IConfigurationService),S=v.getValue("editor.inlineSuggest.showToolbar")==="always"?"onHover":"always";v.updateValue("editor.inlineSuggest.showToolbar",S)}}e.ToggleAlwaysShowInlineSuggestionToolbar=u}),define(ne[863],se([1,0,5,57,2,21,4,43,84,295,283,120,3,61,7,59,63]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlineCompletionsHoverParticipant=e.InlineCompletionsHover=void 0;class c{constructor(r,u,C){this.owner=r,this.range=u,this.controller=C}isValidForHoverAnchor(r){return r.type===1&&this.range.startColumn<=r.range.startColumn&&this.range.endColumn>=r.range.endColumn}}e.InlineCompletionsHover=c;let l=class{constructor(r,u,C,f,h,v){this._editor=r,this._languageService=u,this._openerService=C,this.accessibilityService=f,this._instantiationService=h,this._telemetryService=v,this.hoverOrdinal=4}suggestHoverAnchor(r){const u=b.InlineCompletionsController.get(this._editor);if(!u)return null;const C=r.target;if(C.type===8){const f=C.detail;if(u.shouldShowHoverAtViewZone(f.viewZoneId))return new _.HoverForeignElementAnchor(1e3,this,y.Range.fromPositions(this._editor.getModel().validatePosition(f.positionBefore||f.position)),r.event.posx,r.event.posy,!1)}return C.type===7&&u.shouldShowHoverAt(C.range)?new _.HoverForeignElementAnchor(1e3,this,C.range,r.event.posx,r.event.posy,!1):C.type===6&&C.detail.mightBeForeignElement&&u.shouldShowHoverAt(C.range)?new _.HoverForeignElementAnchor(1e3,this,C.range,r.event.posx,r.event.posy,!1):null}computeSync(r,u){if(this._editor.getOption(62).showToolbar!=="onHover")return[];const C=b.InlineCompletionsController.get(this._editor);return C&&C.shouldShowHoverAt(r.range)?[new c(this,r.range,C)]:[]}renderHoverParts(r,u){const C=new I.DisposableStore,f=u[0];this._telemetryService.publicLog2("inlineCompletionHover.shown"),this.accessibilityService.isScreenReaderOptimized()&&!this._editor.getOption(8)&&C.add(this.renderScreenReaderText(r,f));const h=f.controller.model.get(),v=this._instantiationService.createInstance(p.InlineSuggestionHintsContentWidget,this._editor,!1,(0,E.constObservable)(null),h.selectedInlineCompletionIndex,h.inlineCompletionsCount,h.activeCommands),w=v.getDomNode();r.fragment.appendChild(w),h.triggerExplicitly(),C.add(v);const S={hoverPart:f,hoverElement:w,dispose(){C.dispose()}};return new _.RenderedHoverParts([S])}renderScreenReaderText(r,u){const C=new I.DisposableStore,f=d.$,h=f("div.hover-row.markdown-hover"),v=d.append(h,f("div.hover-contents",{"aria-live":"assertive"})),w=C.add(new n.MarkdownRenderer({editor:this._editor},this._languageService,this._openerService)),S=L=>{C.add(w.onDidRenderAsync(()=>{v.className="hover-contents code-hover-contents",r.onContentsChanged()}));const D=o.localize(1089,"Suggestion:"),T=C.add(w.render(new k.MarkdownString().appendText(D).appendCodeblock("text",L)));v.replaceChildren(T.element)};return C.add((0,E.autorun)(L=>{const D=u.controller.model.read(L)?.primaryGhostText.read(L);if(D){const T=this._editor.getModel().getLineContent(D.lineNumber);S(D.renderForScreenReader(T))}else d.reset(v)})),r.fragment.appendChild(h),C}};e.InlineCompletionsHoverParticipant=l,e.InlineCompletionsHoverParticipant=l=ke([ce(1,m.ILanguageService),ce(2,s.IOpenerService),ce(3,t.IAccessibilityService),ce(4,i.IInstantiationService),ce(5,g.ITelemetryService)],l)}),define(ne[864],se([1,0,15,84,862,863,617,295,380,29]),function(oe,e,d,k,I,E,y,m,_,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),(0,d.registerEditorContribution)(m.InlineCompletionsController.ID,m.InlineCompletionsController,3),(0,d.registerEditorAction)(I.TriggerInlineSuggestionAction),(0,d.registerEditorAction)(I.ShowNextInlineSuggestionAction),(0,d.registerEditorAction)(I.ShowPreviousInlineSuggestionAction),(0,d.registerEditorAction)(I.AcceptNextWordOfInlineCompletion),(0,d.registerEditorAction)(I.AcceptNextLineOfInlineCompletion),(0,d.registerEditorAction)(I.AcceptInlineCompletion),(0,d.registerEditorAction)(I.HideInlineCompletion),(0,b.registerAction2)(I.ToggleAlwaysShowInlineSuggestionToolbar),k.HoverParticipantRegistry.register(E.InlineCompletionsHoverParticipant),_.AccessibleViewRegistry.register(new y.InlineCompletionsAccessibleView)}),define(ne[438],se([1,0,5,347,2,21,65,15,112,125,139,88,70,35,434,379,294,7,521]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlineEditsWidget=e.InlineEdit=void 0;class l{constructor(v,w,S){this.range=v,this.newLines=w,this.changes=S}}e.InlineEdit=l;let a=class extends I.Disposable{constructor(v,w,S,L){super(),this._editor=v,this._edit=w,this._userPrompt=S,this._instantiationService=L,this._editorObs=(0,_.observableCodeEditor)(this._editor),this._elements=(0,d.h)("div.inline-edits-widget",{style:{position:"absolute",overflow:"visible",top:"0px",left:"0px"}},[(0,d.h)("div@editorContainer",{style:{position:"absolute",top:"0px",left:"0px",width:"500px",height:"500px"}},[(0,d.h)("div.toolbar@toolbar",{style:{position:"absolute",top:"-25px",left:"0px"}}),(0,d.h)("div.promptEditor@promptEditor",{style:{position:"absolute",top:"-25px",left:"80px",width:"300px",height:"22px"}}),(0,d.h)("div.preview@editor",{style:{position:"absolute",top:"0px",left:"0px"}})]),(0,d.svgElem)("svg",{style:{overflow:"visible",pointerEvents:"none"}},[(0,d.svgElem)("defs",[(0,d.svgElem)("linearGradient",{id:"Gradient2",x1:"0",y1:"0",x2:"1",y2:"0"},[(0,d.svgElem)("stop",{offset:"0%",class:"gradient-stop"}),(0,d.svgElem)("stop",{offset:"100%",class:"gradient-stop"})])]),(0,d.svgElem)("path@path",{d:"",fill:"url(#Gradient2)"})])]),this._previewTextModel=this._register(this._instantiationService.createInstance(t.TextModel,"",o.PLAINTEXT_LANGUAGE_ID,t.TextModel.DEFAULT_CREATION_OPTIONS,null)),this._setText=(0,E.derived)(T=>{const M=this._edit.read(T);M&&this._previewTextModel.setValue(M.newLines.join(` -`))}).recomputeInitiallyAndOnChange(this._store),this._promptTextModel=this._register(this._instantiationService.createInstance(t.TextModel,"",o.PLAINTEXT_LANGUAGE_ID,t.TextModel.DEFAULT_CREATION_OPTIONS,null)),this._promptEditor=this._register(this._instantiationService.createInstance(b.EmbeddedCodeEditorWidget,this._elements.promptEditor,{glyphMargin:!1,lineNumbers:"off",minimap:{enabled:!1},guides:{indentation:!1,bracketPairs:!1,bracketPairsHorizontal:!1,highlightActiveIndentation:!1},folding:!1,selectOnLineNumbers:!1,selectionHighlight:!1,columnSelection:!1,overviewRulerBorder:!1,overviewRulerLanes:0,lineDecorationsWidth:0,lineNumbersMinChars:0,placeholder:"Describe the change you want...",fontFamily:k.DEFAULT_FONT_FAMILY},{contributions:m.EditorExtensionsRegistry.getSomeEditorContributions([g.SuggestController.ID,s.PlaceholderTextContribution.ID,i.ContextMenuController.ID]),isSimpleWidget:!0},this._editor)),this._previewEditor=this._register(this._instantiationService.createInstance(b.EmbeddedCodeEditorWidget,this._elements.editor,{glyphMargin:!1,lineNumbers:"off",minimap:{enabled:!1},guides:{indentation:!1,bracketPairs:!1,bracketPairsHorizontal:!1,highlightActiveIndentation:!1},folding:!1,selectOnLineNumbers:!1,selectionHighlight:!1,columnSelection:!1,overviewRulerBorder:!1,overviewRulerLanes:0,lineDecorationsWidth:0,lineNumbersMinChars:0},{contributions:[]},this._editor)),this._previewEditorObs=(0,_.observableCodeEditor)(this._previewEditor),this._decorations=(0,E.derived)(this,T=>{this._setText.read(T);const M=this._edit.read(T)?.changes;if(!M)return[];const A=[],P=[];if(M.length===1&&M[0].innerChanges[0].modifiedRange.equalsRange(this._previewTextModel.getFullModelRange()))return[];for(const N of M)if(N.original.isEmpty||A.push({range:N.original.toInclusiveRange(),options:p.diffLineDeleteDecorationBackgroundWithIndicator}),N.modified.isEmpty||P.push({range:N.modified.toInclusiveRange(),options:p.diffLineAddDecorationBackgroundWithIndicator}),N.modified.isEmpty||N.original.isEmpty)N.original.isEmpty||A.push({range:N.original.toInclusiveRange(),options:p.diffWholeLineDeleteDecoration}),N.modified.isEmpty||P.push({range:N.modified.toInclusiveRange(),options:p.diffWholeLineAddDecoration});else for(const O of N.innerChanges||[])N.original.contains(O.originalRange.startLineNumber)&&A.push({range:O.originalRange,options:O.originalRange.isEmpty()?p.diffDeleteDecorationEmpty:p.diffDeleteDecoration}),N.modified.contains(O.modifiedRange.startLineNumber)&&P.push({range:O.modifiedRange,options:O.modifiedRange.isEmpty()?p.diffAddDecorationEmpty:p.diffAddDecoration});return P}),this._layout1=(0,E.derived)(this,T=>{const M=this._editor.getModel(),A=this._edit.read(T);if(!A)return null;const P=A.range;let N=0;for(let x=P.startLineNumber;x{const M=this._edit.read(T);if(!M)return null;const A=M.range,P=this._editorObs.scrollLeft.read(T),N=this._layout1.read(T).left+20-P,O=this._editor.getTopForLineNumber(A.startLineNumber)-this._editorObs.scrollTop.read(T),F=this._editor.getTopForLineNumber(A.endLineNumberExclusive)-this._editorObs.scrollTop.read(T),x=new u(N,O),W=new u(N,F),V=F-O,q=50,H=this._editor.getOption(67)*M.newLines.length,z=V-H,U=new u(N+q,O+z/2),j=new u(N+q,F-z/2);return{topCode:x,bottomCode:W,codeHeight:V,topEdit:U,bottomEdit:j,editHeight:H}});const D=(0,E.derived)(this,T=>this._edit.read(T)!==void 0||this._userPrompt.read(T)!==void 0);this._register((0,n.applyStyle)(this._elements.root,{display:(0,E.derived)(this,T=>D.read(T)?"block":"none")})),this._register((0,n.appendRemoveOnDispose)(this._editor.getDomNode(),this._elements.root)),this._register((0,_.observableCodeEditor)(v).createOverlayWidget({domNode:this._elements.root,position:(0,E.constObservable)(null),allowEditorOverflow:!1,minContentWidthInPx:(0,E.derived)(T=>{const M=this._layout1.read(T)?.left;if(M===void 0)return 0;const A=this._previewEditorObs.contentWidth.read(T);return M+A})})),this._previewEditor.setModel(this._previewTextModel),this._register(this._previewEditorObs.setDecorations(this._decorations)),this._register((0,E.autorun)(T=>{const M=this._layout.read(T);if(!M)return;const{topCode:A,bottomCode:P,topEdit:N,bottomEdit:O,editHeight:F}=M,x=10,W=0,V=40,q=new C().moveTo(A).lineTo(A.deltaX(x)).curveTo(A.deltaX(x+V),N.deltaX(-V-W),N.deltaX(-W)).lineTo(N).lineTo(O).lineTo(O.deltaX(-W)).curveTo(O.deltaX(-V-W),P.deltaX(x+V),P.deltaX(x)).lineTo(P).build();this._elements.path.setAttribute("d",q),this._elements.editorContainer.style.top=`${N.y}px`,this._elements.editorContainer.style.left=`${N.x}px`,this._elements.editorContainer.style.height=`${F}px`;const H=this._previewEditorObs.contentWidth.read(T);this._previewEditor.layout({height:F,width:H})})),this._promptEditor.setModel(this._promptTextModel),this._promptEditor.layout(),this._register(f(r(this._userPrompt,T=>T??"",T=>T),(0,_.observableCodeEditor)(this._promptEditor).value)),this._register((0,E.autorun)(T=>{const M=(0,_.observableCodeEditor)(this._promptEditor).isFocused.read(T);this._elements.root.classList.toggle("focused",M)}))}};e.InlineEditsWidget=a,e.InlineEditsWidget=a=ke([ce(3,c.IInstantiationService)],a);function r(h,v,w){return(0,y.derivedWithSetter)(void 0,S=>v(h.read(S)),(S,L)=>h.set(w(S),L))}class u{constructor(v,w){this.x=v,this.y=w}deltaX(v){return new u(this.x+v,this.y)}}class C{constructor(){this._data=""}moveTo(v){return this._data+=`M ${v.x} ${v.y} `,this}lineTo(v){return this._data+=`L ${v.x} ${v.y} `,this}curveTo(v,w,S){return this._data+=`C ${v.x} ${v.y} ${w.x} ${w.y} ${S.x} ${S.y} `,this}build(){return this._data}}function f(h,v){const w=new I.DisposableStore;return w.add((0,E.autorun)(S=>{const L=h.read(S);v.set(L,void 0)})),w.add((0,E.autorun)(S=>{const L=v.read(S);h.set(L,void 0)})),w}}),define(ne[865],se([1,0,14,18,102,8,2,21,65,22,215,55,27,17,51,378,438]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g){"use strict";var c;Object.defineProperty(e,"__esModule",{value:!0}),e.InlineEditsModel=void 0;let l=class extends y.Disposable{static{c=this}static{this._modelId=0}static _createUniqueUri(){return b.URI.from({scheme:"inline-edits",path:new Date().toString()+String(c._modelId++)})}constructor(C,f,h,v,w,S,L){super(),this.textModel=C,this._textModelVersionId=f,this._selection=h,this._debounceValue=v,this.languageFeaturesService=w,this._diffProviderFactoryService=S,this._modelService=L,this._forceUpdateExplicitlySignal=(0,m.observableSignal)(this),this._selectedInlineCompletionId=(0,m.observableValue)(this,void 0),this._isActive=(0,m.observableValue)(this,!1),this._originalModel=(0,_.derivedDisposable)(()=>this._modelService.createModel("",null,c._createUniqueUri())).keepObserved(this._store),this._modifiedModel=(0,_.derivedDisposable)(()=>this._modelService.createModel("",null,c._createUniqueUri())).keepObserved(this._store),this._pinnedRange=new r(this.textModel,this._textModelVersionId),this.isPinned=this._pinnedRange.range.map(D=>!!D),this.userPrompt=(0,m.observableValue)(this,void 0),this.inlineEdit=(0,m.derived)(this,D=>this._inlineEdit.read(D)?.promiseResult.read(D)?.data),this._inlineEdit=(0,m.derived)(this,D=>{const T=this.selectedInlineEdit.read(D);if(!T)return;const M=T.inlineCompletion.range;if(T.inlineCompletion.insertText.trim()==="")return;let A=T.inlineCompletion.insertText.split(/\r\n|\r|\n/);function P(x){const W=x[0].match(/^\s*/)?.[0]??"";return x.map(V=>V.replace(new RegExp("^"+W),""))}A=P(A);let O=this.textModel.getValueInRange(M).split(/\r\n|\r|\n/);O=P(O),this._originalModel.get().setValue(O.join(` -`)),this._modifiedModel.get().setValue(A.join(` -`));const F=this._diffProviderFactoryService.createDiffProvider({diffAlgorithm:"advanced"});return m.ObservablePromise.fromFn(async()=>{const x=await F.computeDiff(this._originalModel.get(),this._modifiedModel.get(),{computeMoves:!1,ignoreTrimWhitespace:!1,maxComputationTimeMs:1e3},k.CancellationToken.None);if(!x.identical)return new g.InlineEdit(n.LineRange.fromRangeInclusive(M),P(A),x.changes)})}),this._fetchStore=this._register(new y.DisposableStore),this._inlineEditsFetchResult=(0,m.disposableObservableValue)(this,void 0),this._inlineEdits=(0,m.derivedOpts)({owner:this,equalsFn:I.structuralEquals},D=>this._inlineEditsFetchResult.read(D)?.completions.map(T=>new a(T))??[]),this._fetchInlineEditsPromise=(0,m.derivedHandleChanges)({owner:this,createEmptyChangeSummary:()=>({inlineCompletionTriggerKind:o.InlineCompletionTriggerKind.Automatic}),handleChange:(D,T)=>(D.didChange(this._forceUpdateExplicitlySignal)&&(T.inlineCompletionTriggerKind=o.InlineCompletionTriggerKind.Explicit),!0)},async(D,T)=>{this._fetchStore.clear(),this._forceUpdateExplicitlySignal.read(D),this._textModelVersionId.read(D);function M(F,x){return x(F)}const A=this._pinnedRange.range.read(D)??M(this._selection.read(D),F=>F.isEmpty()?void 0:F);if(!A){this._inlineEditsFetchResult.set(void 0,void 0),this.userPrompt.set(void 0,void 0);return}const P={triggerKind:T.inlineCompletionTriggerKind,selectedSuggestionInfo:void 0,userPrompt:this.userPrompt.read(D)},N=(0,k.cancelOnDispose)(this._fetchStore);await(0,d.timeout)(200,N);const O=await(0,s.provideInlineCompletions)(this.languageFeaturesService.inlineCompletionsProvider,A,this.textModel,P,N);N.isCancellationRequested||this._inlineEditsFetchResult.set(O,void 0)}),this._filteredInlineEditItems=(0,m.derivedOpts)({owner:this,equalsFn:(0,I.itemsEquals)()},D=>this._inlineEdits.read(D)),this.selectedInlineCompletionIndex=(0,m.derived)(this,D=>{const T=this._selectedInlineCompletionId.read(D),M=this._filteredInlineEditItems.read(D),A=this._selectedInlineCompletionId===void 0?-1:M.findIndex(P=>P.semanticId===T);return A===-1?(this._selectedInlineCompletionId.set(void 0,void 0),0):A}),this.selectedInlineEdit=(0,m.derived)(this,D=>{const T=this._filteredInlineEditItems.read(D),M=this.selectedInlineCompletionIndex.read(D);return T[M]}),this._register((0,m.recomputeInitiallyAndOnChange)(this._fetchInlineEditsPromise))}async triggerExplicitly(C){(0,m.subtransaction)(C,f=>{this._isActive.set(!0,f),this._forceUpdateExplicitlySignal.trigger(f)}),await this._fetchInlineEditsPromise.get()}stop(C){(0,m.subtransaction)(C,f=>{this.userPrompt.set(void 0,f),this._isActive.set(!1,f),this._inlineEditsFetchResult.set(void 0,f),this._pinnedRange.setRange(void 0,f)})}async _deltaSelectedInlineCompletionIndex(C){await this.triggerExplicitly();const f=this._filteredInlineEditItems.get()||[];if(f.length>0){const h=(this.selectedInlineCompletionIndex.get()+C+f.length)%f.length;this._selectedInlineCompletionId.set(f[h].semanticId,void 0)}else this._selectedInlineCompletionId.set(void 0,void 0)}async next(){await this._deltaSelectedInlineCompletionIndex(1)}async previous(){await this._deltaSelectedInlineCompletionIndex(-1)}async accept(C){if(C.getModel()!==this.textModel)throw new E.BugIndicatingError;const f=this.selectedInlineEdit.get();f&&(C.pushUndoStop(),C.executeEdits("inlineSuggestion.accept",[f.inlineCompletion.toSingleTextEdit().toSingleEditOperation()]),this.stop())}};e.InlineEditsModel=l,e.InlineEditsModel=l=c=ke([ce(4,t.ILanguageFeaturesService),ce(5,p.IDiffProviderFactoryService),ce(6,i.IModelService)],l);class a{constructor(C){this.inlineCompletion=C,this.semanticId=this.inlineCompletion.hash()}}class r extends y.Disposable{constructor(C,f){super(),this._textModel=C,this._versionId=f,this._decorations=(0,m.observableValue)(this,[]),this.range=(0,m.derived)(this,h=>{this._versionId.read(h);const v=this._decorations.read(h)[0];return v?this._textModel.getDecorationRange(v)??null:null}),this._register((0,y.toDisposable)(()=>{this._textModel.deltaDecorations(this._decorations.get(),[])}))}setRange(C,f){this._decorations.set(this._textModel.deltaDecorations(this._decorations.get(),C?[{range:C,options:{description:"trackedRange"}}]:[]),f)}}}),define(ne[439],se([1,0,2,21,65,112,171,23,79,17,390,865,438,28,12,7,397]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g){"use strict";var c;Object.defineProperty(e,"__esModule",{value:!0}),e.InlineEditsController=void 0;let l=class extends d.Disposable{static{c=this}static{this.ID="editor.contrib.inlineEditsController"}static get(u){return u.getContribution(c.ID)}constructor(u,C,f,h,v,w){super(),this.editor=u,this._instantiationService=C,this._contextKeyService=f,this._debounceService=h,this._languageFeaturesService=v,this._configurationService=w,this._enabled=(0,g.observableConfigValue)("editor.inlineEdits.enabled",!1,this._configurationService),this._editorObs=(0,E.observableCodeEditor)(this.editor),this._selection=(0,k.derived)(this,S=>this._editorObs.cursorSelection.read(S)??new m.Selection(1,1,1,1)),this._debounceValue=this._debounceService.for(this._languageFeaturesService.inlineCompletionsProvider,"InlineEditsDebounce",{min:50,max:50}),this.model=(0,I.derivedDisposable)(this,S=>{if(!this._enabled.read(S)||this._editorObs.isReadonly.read(S))return;const L=this._editorObs.model.read(S);return L?this._instantiationService.createInstance((0,y.readHotReloadableExport)(n.InlineEditsModel,S),L,this._editorObs.versionId,this._selection,this._debounceValue):void 0}),this._hadInlineEdit=(0,k.derivedObservableWithCache)(this,(S,L)=>L||this.model.read(S)?.inlineEdit.read(S)!==void 0),this._widget=(0,I.derivedDisposable)(this,S=>{if(this._hadInlineEdit.read(S))return this._instantiationService.createInstance((0,y.readHotReloadableExport)(o.InlineEditsWidget,S),this.editor,this.model.map((L,D)=>L?.inlineEdit.read(D)),a(L=>this.model.read(L)?.userPrompt??(0,k.observableValue)("empty","")))}),this._register((0,g.bindContextKey)(p.inlineEditVisible,this._contextKeyService,S=>!!this.model.read(S)?.inlineEdit.read(S))),this._register((0,g.bindContextKey)(p.isPinnedContextKey,this._contextKeyService,S=>!!this.model.read(S)?.isPinned.read(S))),this.model.recomputeInitiallyAndOnChange(this._store),this._widget.recomputeInitiallyAndOnChange(this._store)}};e.InlineEditsController=l,e.InlineEditsController=l=c=ke([ce(1,s.IInstantiationService),ce(2,i.IContextKeyService),ce(3,_.ILanguageFeatureDebounceService),ce(4,b.ILanguageFeaturesService),ce(5,t.IConfigurationService)],l);function a(r){return(0,I.derivedWithSetter)(void 0,u=>r(u).read(u),(u,C)=>{r(void 0).set(u,C)})}}),define(ne[866],se([1,0,26,21,92,15,125,20,390,439,3,29,12]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HideInlineEdit=e.AcceptInlineEdit=e.TriggerInlineEditAction=e.ShowPreviousInlineEditAction=e.ShowNextInlineEditAction=void 0;function t(a){return{label:a.value,alias:a.original}}class i extends E.EditorAction{static{this.ID=_.showNextInlineEditActionId}constructor(){super({id:i.ID,...t(p.localize2(1096,"Show Next Inline Edit")),precondition:o.ContextKeyExpr.and(m.EditorContextKeys.writable,_.inlineEditVisible),kbOpts:{weight:100,primary:606}})}async run(r,u){b.InlineEditsController.get(u)?.model.get()?.next()}}e.ShowNextInlineEditAction=i;class s extends E.EditorAction{static{this.ID=_.showPreviousInlineEditActionId}constructor(){super({id:s.ID,...t(p.localize2(1097,"Show Previous Inline Edit")),precondition:o.ContextKeyExpr.and(m.EditorContextKeys.writable,_.inlineEditVisible),kbOpts:{weight:100,primary:604}})}async run(r,u){b.InlineEditsController.get(u)?.model.get()?.previous()}}e.ShowPreviousInlineEditAction=s;class g extends E.EditorAction{constructor(){super({id:"editor.action.inlineEdits.trigger",...t(p.localize2(1098,"Trigger Inline Edit")),precondition:m.EditorContextKeys.writable})}async run(r,u){const C=b.InlineEditsController.get(u);await(0,I.asyncTransaction)(async f=>{await C?.model.get()?.triggerExplicitly(f)})}}e.TriggerInlineEditAction=g;class c extends E.EditorAction{constructor(){super({id:_.inlineEditAcceptId,...t(p.localize2(1099,"Accept Inline Edit")),precondition:_.inlineEditVisible,menuOpts:{menuId:n.MenuId.InlineEditsActions,title:p.localize(1095,"Accept Inline Edit"),group:"primary",order:1,icon:d.Codicon.check},kbOpts:{primary:2058,weight:2e4,kbExpr:_.inlineEditVisible}})}async run(r,u){u instanceof y.EmbeddedCodeEditorWidget&&(u=u.getParentEditor());const C=b.InlineEditsController.get(u);C&&(C.model.get()?.accept(C.editor),C.editor.focus())}}e.AcceptInlineEdit=c;class l extends E.EditorAction{static{this.ID="editor.action.inlineEdits.hide"}constructor(){super({id:l.ID,...t(p.localize2(1100,"Hide Inline Edit")),precondition:_.inlineEditVisible,kbOpts:{weight:100,primary:9}})}async run(r,u){const C=b.InlineEditsController.get(u);(0,k.transaction)(f=>{C?.model.get()?.stop(f)})}}e.HideInlineEdit=l}),define(ne[867],se([1,0,15,866,439]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),(0,d.registerEditorContribution)(I.InlineEditsController.ID,I.InlineEditsController,3),(0,d.registerEditorAction)(k.TriggerInlineEditAction),(0,d.registerEditorAction)(k.ShowNextInlineEditAction),(0,d.registerEditorAction)(k.ShowPreviousInlineEditAction),(0,d.registerEditorAction)(k.AcceptInlineEdit),(0,d.registerEditorAction)(k.HideInlineEdit)}),define(ne[868],se([1,0,18,82,53,2,34,4,130,17,342,155,405,437,343,117]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestInlineCompletions=void 0;class g{constructor(r,u,C,f,h,v){this.range=r,this.insertText=u,this.filterText=C,this.additionalTextEdits=f,this.command=h,this.completion=v}}let c=class extends E.RefCountedDisposable{constructor(r,u,C,f,h,v){super(h.disposable),this.model=r,this.line=u,this.word=C,this.completionModel=f,this._suggestMemoryService=v}canBeReused(r,u,C){return this.model===r&&this.line===u&&this.word.word.length>0&&this.word.startColumn===C.startColumn&&this.word.endColumn=0&&w.resolve(d.CancellationToken.None)}return r}};c=ke([ce(5,o.ISuggestMemoryService)],c);let l=class extends E.Disposable{constructor(r,u,C,f){super(),this._languageFeatureService=r,this._clipboardService=u,this._suggestMemoryService=C,this._editorService=f,this._store.add(r.inlineCompletionsProvider.register("*",this))}async provideInlineCompletions(r,u,C,f){if(C.selectedSuggestionInfo)return;let h;for(const A of this._editorService.listCodeEditors())if(A.getModel()===r){h=A;break}if(!h)return;const v=h.getOption(90);if(n.QuickSuggestionsOptions.isAllOff(v))return;r.tokenization.tokenizeIfCheap(u.lineNumber);const w=r.tokenization.getLineTokens(u.lineNumber),S=w.getStandardTokenType(w.findTokenIndexAtOffset(Math.max(u.column-1-1,0)));if(n.QuickSuggestionsOptions.valueFor(v,S)!=="inline")return;let L=r.getWordAtPosition(u),D;if(L?.word||(D=this._getTriggerCharacterInfo(r,u)),!L?.word&&!D||(L||(L=r.getWordUntilPosition(u)),L.endColumn!==u.column))return;let T;const M=r.getValueInRange(new m.Range(u.lineNumber,1,u.lineNumber,u.column));if(!D&&this._lastResult?.canBeReused(r,u.lineNumber,L)){const A=new p.LineContext(M,u.column-this._lastResult.word.endColumn);this._lastResult.completionModel.lineContext=A,this._lastResult.acquire(),T=this._lastResult}else{const A=await(0,n.provideSuggestionItems)(this._languageFeatureService.completionProvider,r,u,new n.CompletionOptions(void 0,t.SuggestModel.createSuggestFilter(h).itemKind,D?.providers),D&&{triggerKind:1,triggerCharacter:D.ch},f);let P;A.needsClipboard&&(P=await this._clipboardService.readText());const N=new p.CompletionModel(A.items,u.column,new p.LineContext(M,0),i.WordDistance.None,h.getOption(119),h.getOption(113),{boostFullMatch:!1,firstMatchCanBeWeak:!1},P);T=new c(r,u.lineNumber,L,N,A,this._suggestMemoryService)}return this._lastResult=T,T}handleItemDidShow(r,u){u.completion.resolve(d.CancellationToken.None)}freeInlineCompletions(r){r.release()}_getTriggerCharacterInfo(r,u){const C=r.getValueInRange(m.Range.fromPositions({lineNumber:u.lineNumber,column:u.column-1},u)),f=new Set;for(const h of this._languageFeatureService.completionProvider.all(r))h.triggerCharacters?.includes(C)&&f.add(h);if(f.size!==0)return{providers:f,ch:C}}};e.SuggestInlineCompletions=l,e.SuggestInlineCompletions=l=ke([ce(0,b.ILanguageFeaturesService),ce(1,s.IClipboardService),ce(2,o.ISuggestMemoryService),ce(3,y.ICodeEditorService)],l),(0,_.registerEditorFeature)(l)}),define(ne[440],se([1,0,7]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IWorkspaceTrustManagementService=void 0,e.IWorkspaceTrustManagementService=(0,d.createDecorator)("workspaceTrustManagementService")}),define(ne[869],se([1,0,14,26,57,2,16,11,15,37,35,328,100,43,375,84,217,766,3,28,7,59,66,71,440,535]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ShowExcludeOptions=e.DisableHighlightingOfNonBasicAsciiCharactersAction=e.DisableHighlightingOfInvisibleCharactersAction=e.DisableHighlightingOfAmbiguousCharactersAction=e.DisableHighlightingInStringsAction=e.DisableHighlightingInCommentsAction=e.UnicodeHighlighterHoverParticipant=e.UnicodeHighlighter=e.warningIcon=void 0,e.warningIcon=(0,f.registerIcon)("extensions-warning-message",k.Codicon.warning,l.localize(1386,"Icon shown with a warning message in the extensions editor."));let v=class extends E.Disposable{static{this.ID="editor.contrib.unicodeHighlighter"}constructor(G,K,R,J){super(),this._editor=G,this._editorWorkerService=K,this._workspaceTrustService=R,this._highlighter=null,this._bannerClosed=!1,this._updateState=ie=>{if(ie&&ie.hasMore){if(this._bannerClosed)return;const ue=Math.max(ie.ambiguousCharacterCount,ie.nonBasicAsciiCharacterCount,ie.invisibleCharacterCount);let he;if(ie.nonBasicAsciiCharacterCount>=ue)he={message:l.localize(1387,"This document contains many non-basic ASCII unicode characters"),command:new q};else if(ie.ambiguousCharacterCount>=ue)he={message:l.localize(1388,"This document contains many ambiguous unicode characters"),command:new W};else if(ie.invisibleCharacterCount>=ue)he={message:l.localize(1389,"This document contains many invisible unicode characters"),command:new V};else throw new Error("Unreachable");this._bannerController.show({id:"unicodeHighlightBanner",message:he.message,icon:e.warningIcon,actions:[{label:he.command.shortLabel,href:`command:${he.command.id}`}],onClose:()=>{this._bannerClosed=!0}})}else this._bannerController.hide()},this._bannerController=this._register(J.createInstance(c.BannerController,G)),this._register(this._editor.onDidChangeModel(()=>{this._bannerClosed=!1,this._updateHighlighter()})),this._options=G.getOption(126),this._register(R.onDidChangeTrust(ie=>{this._updateHighlighter()})),this._register(G.onDidChangeConfiguration(ie=>{ie.hasChanged(126)&&(this._options=G.getOption(126),this._updateHighlighter())})),this._updateHighlighter()}dispose(){this._highlighter&&(this._highlighter.dispose(),this._highlighter=null),super.dispose()}_updateHighlighter(){if(this._updateState(null),this._highlighter&&(this._highlighter.dispose(),this._highlighter=null),!this._editor.hasModel())return;const G=w(this._workspaceTrustService.isWorkspaceTrusted(),this._options);if([G.nonBasicASCII,G.ambiguousCharacters,G.invisibleCharacters].every(R=>R===!1))return;const K={nonBasicASCII:G.nonBasicASCII,ambiguousCharacters:G.ambiguousCharacters,invisibleCharacters:G.invisibleCharacters,includeComments:G.includeComments,includeStrings:G.includeStrings,allowedCodePoints:Object.keys(G.allowedCharacters).map(R=>R.codePointAt(0)),allowedLocales:Object.keys(G.allowedLocales).map(R=>R==="_os"?new Intl.NumberFormat().resolvedOptions().locale:R==="_vscode"?y.language:R)};this._editorWorkerService.canComputeUnicodeHighlights(this._editor.getModel().uri)?this._highlighter=new S(this._editor,K,this._updateState,this._editorWorkerService):this._highlighter=new L(this._editor,K,this._updateState)}getDecorationInfo(G){return this._highlighter?this._highlighter.getDecorationInfo(G):null}};e.UnicodeHighlighter=v,e.UnicodeHighlighter=v=ke([ce(1,o.IEditorWorkerService),ce(2,h.IWorkspaceTrustManagementService),ce(3,r.IInstantiationService)],v);function w(Y,G){return{nonBasicASCII:G.nonBasicASCII===b.inUntrustedWorkspace?!Y:G.nonBasicASCII,ambiguousCharacters:G.ambiguousCharacters,invisibleCharacters:G.invisibleCharacters,includeComments:G.includeComments===b.inUntrustedWorkspace?!Y:G.includeComments,includeStrings:G.includeStrings===b.inUntrustedWorkspace?!Y:G.includeStrings,allowedCharacters:G.allowedCharacters,allowedLocales:G.allowedLocales}}let S=class extends E.Disposable{constructor(G,K,R,J){super(),this._editor=G,this._options=K,this._updateState=R,this._editorWorkerService=J,this._model=this._editor.getModel(),this._decorations=this._editor.createDecorationsCollection(),this._updateSoon=this._register(new d.RunOnceScheduler(()=>this._update(),250)),this._register(this._editor.onDidChangeModelContent(()=>{this._updateSoon.schedule()})),this._updateSoon.schedule()}dispose(){this._decorations.clear(),super.dispose()}_update(){if(this._model.isDisposed())return;if(!this._model.mightContainNonBasicASCII()){this._decorations.clear();return}const G=this._model.getVersionId();this._editorWorkerService.computedUnicodeHighlights(this._model.uri,this._options).then(K=>{if(this._model.isDisposed()||this._model.getVersionId()!==G)return;this._updateState(K);const R=[];if(!K.hasMore)for(const J of K.ranges)R.push({range:J,options:O.instance.getDecorationFromOptions(this._options)});this._decorations.set(R)})}getDecorationInfo(G){if(!this._decorations.has(G))return null;const K=this._editor.getModel();if(!(0,i.isModelDecorationVisible)(K,G))return null;const R=K.getValueInRange(G.range);return{reason:N(R,this._options),inComment:(0,i.isModelDecorationInComment)(K,G),inString:(0,i.isModelDecorationInString)(K,G)}}};S=ke([ce(3,o.IEditorWorkerService)],S);class L extends E.Disposable{constructor(G,K,R){super(),this._editor=G,this._options=K,this._updateState=R,this._model=this._editor.getModel(),this._decorations=this._editor.createDecorationsCollection(),this._updateSoon=this._register(new d.RunOnceScheduler(()=>this._update(),250)),this._register(this._editor.onDidLayoutChange(()=>{this._updateSoon.schedule()})),this._register(this._editor.onDidScrollChange(()=>{this._updateSoon.schedule()})),this._register(this._editor.onDidChangeHiddenAreas(()=>{this._updateSoon.schedule()})),this._register(this._editor.onDidChangeModelContent(()=>{this._updateSoon.schedule()})),this._updateSoon.schedule()}dispose(){this._decorations.clear(),super.dispose()}_update(){if(this._model.isDisposed())return;if(!this._model.mightContainNonBasicASCII()){this._decorations.clear();return}const G=this._editor.getVisibleRanges(),K=[],R={ranges:[],ambiguousCharacterCount:0,invisibleCharacterCount:0,nonBasicAsciiCharacterCount:0,hasMore:!1};for(const J of G){const ie=n.UnicodeTextModelHighlighter.computeUnicodeHighlights(this._model,this._options,J);for(const ue of ie.ranges)R.ranges.push(ue);R.ambiguousCharacterCount+=R.ambiguousCharacterCount,R.invisibleCharacterCount+=R.invisibleCharacterCount,R.nonBasicAsciiCharacterCount+=R.nonBasicAsciiCharacterCount,R.hasMore=R.hasMore||ie.hasMore}if(!R.hasMore)for(const J of R.ranges)K.push({range:J,options:O.instance.getDecorationFromOptions(this._options)});this._updateState(R),this._decorations.set(K)}getDecorationInfo(G){if(!this._decorations.has(G))return null;const K=this._editor.getModel(),R=K.getValueInRange(G.range);return(0,i.isModelDecorationVisible)(K,G)?{reason:N(R,this._options),inComment:(0,i.isModelDecorationInComment)(K,G),inString:(0,i.isModelDecorationInString)(K,G)}:null}}const D=l.localize(1390,"Configure Unicode Highlight Options");let T=class{constructor(G,K,R){this._editor=G,this._languageService=K,this._openerService=R,this.hoverOrdinal=5}computeSync(G,K){if(!this._editor.hasModel()||G.type!==1)return[];const R=this._editor.getModel(),J=this._editor.getContribution(v.ID);if(!J)return[];const ie=[],ue=new Set;let he=300;for(const pe of K){const ae=J.getDecorationInfo(pe);if(!ae)continue;const de=R.getValueInRange(pe.range).codePointAt(0),ge=A(de);let X;switch(ae.reason.kind){case 0:{(0,m.isBasicASCII)(ae.reason.confusableWith)?X=l.localize(1391,"The character {0} could be confused with the ASCII character {1}, which is more common in source code.",ge,A(ae.reason.confusableWith.codePointAt(0))):X=l.localize(1392,"The character {0} could be confused with the character {1}, which is more common in source code.",ge,A(ae.reason.confusableWith.codePointAt(0)));break}case 1:X=l.localize(1393,"The character {0} is invisible.",ge);break;case 2:X=l.localize(1394,"The character {0} is not a basic ASCII character.",ge);break}if(ue.has(X))continue;ue.add(X);const B={codePoint:de,reason:ae.reason,inComment:ae.inComment,inString:ae.inString},$=l.localize(1395,"Adjust settings"),Q=`command:${H.ID}?${encodeURIComponent(JSON.stringify(B))}`,Z=new I.MarkdownString("",!0).appendMarkdown(X).appendText(" ").appendLink(Q,$,D);ie.push(new g.MarkdownHover(this,pe.range,[Z],!1,he++))}return ie}renderHoverParts(G,K){return(0,g.renderMarkdownHovers)(G,K,this._editor,this._languageService,this._openerService)}};e.UnicodeHighlighterHoverParticipant=T,e.UnicodeHighlighterHoverParticipant=T=ke([ce(1,t.ILanguageService),ce(2,u.IOpenerService)],T);function M(Y){return`U+${Y.toString(16).padStart(4,"0")}`}function A(Y){let G=`\`${M(Y)}\``;return m.InvisibleCharacters.isInvisibleCharacter(Y)||(G+=` "${`${P(Y)}`}"`),G}function P(Y){return Y===96?"`` ` ``":"`"+String.fromCodePoint(Y)+"`"}function N(Y,G){return n.UnicodeTextModelHighlighter.computeUnicodeHighlightReason(Y,G)}class O{constructor(){this.map=new Map}static{this.instance=new O}getDecorationFromOptions(G){return this.getDecoration(!G.includeComments,!G.includeStrings)}getDecoration(G,K){const R=`${G}${K}`;let J=this.map.get(R);return J||(J=p.ModelDecorationOptions.createDynamic({description:"unicode-highlight",stickiness:1,className:"unicode-highlight",showIfCollapsed:!0,overviewRuler:null,minimap:null,hideInCommentTokens:G,hideInStringTokens:K}),this.map.set(R,J)),J}}class F extends _.EditorAction{constructor(){super({id:W.ID,label:l.localize(1397,"Disable highlighting of characters in comments"),alias:"Disable highlighting of characters in comments",precondition:void 0}),this.shortLabel=l.localize(1396,"Disable Highlight In Comments")}async run(G,K,R){const J=G?.get(a.IConfigurationService);J&&this.runAction(J)}async runAction(G){await G.updateValue(b.unicodeHighlightConfigKeys.includeComments,!1,2)}}e.DisableHighlightingInCommentsAction=F;class x extends _.EditorAction{constructor(){super({id:W.ID,label:l.localize(1399,"Disable highlighting of characters in strings"),alias:"Disable highlighting of characters in strings",precondition:void 0}),this.shortLabel=l.localize(1398,"Disable Highlight In Strings")}async run(G,K,R){const J=G?.get(a.IConfigurationService);J&&this.runAction(J)}async runAction(G){await G.updateValue(b.unicodeHighlightConfigKeys.includeStrings,!1,2)}}e.DisableHighlightingInStringsAction=x;class W extends _.EditorAction{static{this.ID="editor.action.unicodeHighlight.disableHighlightingOfAmbiguousCharacters"}constructor(){super({id:W.ID,label:l.localize(1401,"Disable highlighting of ambiguous characters"),alias:"Disable highlighting of ambiguous characters",precondition:void 0}),this.shortLabel=l.localize(1400,"Disable Ambiguous Highlight")}async run(G,K,R){const J=G?.get(a.IConfigurationService);J&&this.runAction(J)}async runAction(G){await G.updateValue(b.unicodeHighlightConfigKeys.ambiguousCharacters,!1,2)}}e.DisableHighlightingOfAmbiguousCharactersAction=W;class V extends _.EditorAction{static{this.ID="editor.action.unicodeHighlight.disableHighlightingOfInvisibleCharacters"}constructor(){super({id:V.ID,label:l.localize(1403,"Disable highlighting of invisible characters"),alias:"Disable highlighting of invisible characters",precondition:void 0}),this.shortLabel=l.localize(1402,"Disable Invisible Highlight")}async run(G,K,R){const J=G?.get(a.IConfigurationService);J&&this.runAction(J)}async runAction(G){await G.updateValue(b.unicodeHighlightConfigKeys.invisibleCharacters,!1,2)}}e.DisableHighlightingOfInvisibleCharactersAction=V;class q extends _.EditorAction{static{this.ID="editor.action.unicodeHighlight.disableHighlightingOfNonBasicAsciiCharacters"}constructor(){super({id:q.ID,label:l.localize(1405,"Disable highlighting of non basic ASCII characters"),alias:"Disable highlighting of non basic ASCII characters",precondition:void 0}),this.shortLabel=l.localize(1404,"Disable Non ASCII Highlight")}async run(G,K,R){const J=G?.get(a.IConfigurationService);J&&this.runAction(J)}async runAction(G){await G.updateValue(b.unicodeHighlightConfigKeys.nonBasicASCII,!1,2)}}e.DisableHighlightingOfNonBasicAsciiCharactersAction=q;class H extends _.EditorAction{static{this.ID="editor.action.unicodeHighlight.showExcludeOptions"}constructor(){super({id:H.ID,label:l.localize(1406,"Show Exclude Options"),alias:"Show Exclude Options",precondition:void 0})}async run(G,K,R){const{codePoint:J,reason:ie,inString:ue,inComment:he}=R,pe=String.fromCodePoint(J),ae=G.get(C.IQuickInputService),ee=G.get(a.IConfigurationService);function de(B){return m.InvisibleCharacters.isInvisibleCharacter(B)?l.localize(1407,"Exclude {0} (invisible character) from being highlighted",M(B)):l.localize(1408,"Exclude {0} from being highlighted",`${M(B)} "${pe}"`)}const ge=[];if(ie.kind===0)for(const B of ie.notAmbiguousInLocales)ge.push({label:l.localize(1409,'Allow unicode characters that are more common in the language "{0}".',B),run:async()=>{U(ee,[B])}});if(ge.push({label:de(J),run:()=>z(ee,[J])}),he){const B=new F;ge.push({label:B.label,run:async()=>B.runAction(ee)})}else if(ue){const B=new x;ge.push({label:B.label,run:async()=>B.runAction(ee)})}if(ie.kind===0){const B=new W;ge.push({label:B.label,run:async()=>B.runAction(ee)})}else if(ie.kind===1){const B=new V;ge.push({label:B.label,run:async()=>B.runAction(ee)})}else if(ie.kind===2){const B=new q;ge.push({label:B.label,run:async()=>B.runAction(ee)})}else j(ie);const X=await ae.pick(ge,{title:D});X&&await X.run()}}e.ShowExcludeOptions=H;async function z(Y,G){const K=Y.getValue(b.unicodeHighlightConfigKeys.allowedCharacters);let R;typeof K=="object"&&K?R=K:R={};for(const J of G)R[String.fromCodePoint(J)]=!0;await Y.updateValue(b.unicodeHighlightConfigKeys.allowedCharacters,R,2)}async function U(Y,G){const K=Y.inspect(b.unicodeHighlightConfigKeys.allowedLocales).user?.value;let R;typeof K=="object"&&K?R=Object.assign({},K):R={};for(const J of G)R[J]=!0;await Y.updateValue(b.unicodeHighlightConfigKeys.allowedLocales,R,2)}function j(Y){throw new Error(`Unexpected value: ${Y}`)}(0,_.registerEditorAction)(W),(0,_.registerEditorAction)(V),(0,_.registerEditorAction)(q),(0,_.registerEditorAction)(H),(0,_.registerEditorContribution)(v.ID,v,1),s.HoverParticipantRegistry.register(T)}),define(ne[870],se([1,0,214,219,812,727,815,728,729,856,817,819,848,821,730,434,731,822,857,858,423,289,734,735,695,864,290,291,429,427,850,737,851,827,738,739,833,834,740,840,831,867,765,786,790,835,791,792,742,221,853,294,868,743,718,869,744,841,411,745,741,694,107,195]),function(oe,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0})}),define(ne[222],se([1,0,11,5,47,6,140,2,16,111,22,152,274,75,9,4,51,78,211,24,28,403,12,180,7,691,31,392,121,393,692,181,50,96,63,186,119,107,48,34,62,440,58,395,711,801,49,701,100,401,43,784,266,808,805,419,153,693,61,29,406,696,117,687,265,688,154,216,108,699,59,66,101,717,137,17,36,697,130,8,271,52,45,384,624,418,394,855,79,785,677,772]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S,L,D,T,M,A,P,N,O,F,x,W,V,q,H,z,U,j,Y,G,K,R,J,ie,ue,he,pe,ae,ee,de,ge,X,B,$,Q,Z,te,re,le,me,Ce,ye,Le,Ee,Me,Ae,Ne,Ke,ze,Ge,it,Oe,Fe,fe,_e,xe,be,ve){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneServices=e.standaloneEditorWorkerDescriptor=e.StandaloneConfigurationService=e.StandaloneKeybindingService=e.StandaloneCommandService=e.StandaloneNotificationService=void 0,e.updateConfigurationService=Re;class we{constructor(Ve){this.disposed=!1,this.model=Ve,this._onWillDispose=new E.Emitter}get textEditorModel(){return this.model}dispose(){this.disposed=!0,this._onWillDispose.fire()}}let Te=class{constructor(Ve){this.modelService=Ve}createModelReference(Ve){const Ye=this.modelService.getModel(Ve);return Ye?Promise.resolve(new m.ImmortalReference(new we(Ye))):Promise.reject(new Error("Model not found"))}};Te=ke([ce(0,g.IModelService)],Te);class Pe{static{this.NULL_PROGRESS_RUNNER={done:()=>{},total:()=>{},worked:()=>{}}}show(){return Pe.NULL_PROGRESS_RUNNER}async showWhile(Ve,Ye){await Ve}}class Be{withProgress(Ve,Ye,Ze){return Ye({report:()=>{}})}}class He{constructor(){this.isExtensionDevelopment=!1,this.isBuilt=!1}}class $e{async confirm(Ve){return{confirmed:this.doConfirm(Ve.message,Ve.detail),checkboxChecked:!1}}doConfirm(Ve,Ye){let Ze=Ve;return Ye&&(Ze=Ze+` - -`+Ye),_e.mainWindow.confirm(Ze)}async prompt(Ve){let Ye;if(this.doConfirm(Ve.message,Ve.detail)){const nt=[...Ve.buttons??[]];Ve.cancelButton&&typeof Ve.cancelButton!="string"&&typeof Ve.cancelButton!="boolean"&&nt.push(Ve.cancelButton),Ye=await nt[0]?.run({checkboxChecked:!1})}return{result:Ye}}async error(Ve,Ye){await this.prompt({type:b.default.Error,message:Ve,detail:Ye})}}class je{static{this.NO_OP=new A.NoOpNotification}info(Ve){return this.notify({severity:b.default.Info,message:Ve})}warn(Ve){return this.notify({severity:b.default.Warning,message:Ve})}error(Ve){return this.notify({severity:b.default.Error,message:Ve})}notify(Ve){switch(Ve.severity){case b.default.Error:console.error(Ve.message);break;case b.default.Warning:console.warn(Ve.message);break;default:console.log(Ve.message);break}return je.NO_OP}prompt(Ve,Ye,Ze,nt){return je.NO_OP}status(Ve,Ye){return m.Disposable.None}}e.StandaloneNotificationService=je;let Xe=class{constructor(Ve){this._onWillExecuteCommand=new E.Emitter,this._onDidExecuteCommand=new E.Emitter,this.onDidExecuteCommand=this._onDidExecuteCommand.event,this._instantiationService=Ve}executeCommand(Ve,...Ye){const Ze=a.CommandsRegistry.getCommand(Ve);if(!Ze)return Promise.reject(new Error(`command '${Ve}' not found`));try{this._onWillExecuteCommand.fire({commandId:Ve,args:Ye});const nt=this._instantiationService.invokeFunction.apply(this._instantiationService,[Ze.handler,...Ye]);return this._onDidExecuteCommand.fire({commandId:Ve,args:Ye}),Promise.resolve(nt)}catch(nt){return Promise.reject(nt)}}};e.StandaloneCommandService=Xe,e.StandaloneCommandService=Xe=ke([ce(0,h.IInstantiationService)],Xe);let et=class extends v.AbstractKeybindingService{constructor(Ve,Ye,Ze,nt,ct,ht){super(Ve,Ye,Ze,nt,ct),this._cachedResolver=null,this._dynamicKeybindings=[],this._domNodeListeners=[];const ft=wt=>{const kt=new m.DisposableStore;kt.add(k.addDisposableListener(wt,k.EventType.KEY_DOWN,Mt=>{const Tt=new I.StandardKeyboardEvent(Mt);this._dispatch(Tt,Tt.target)&&(Tt.preventDefault(),Tt.stopPropagation())})),kt.add(k.addDisposableListener(wt,k.EventType.KEY_UP,Mt=>{const Tt=new I.StandardKeyboardEvent(Mt);this._singleModifierDispatch(Tt,Tt.target)&&Tt.preventDefault()})),this._domNodeListeners.push(new dt(wt,kt))},gt=wt=>{for(let kt=0;kt{wt.getOption(61)||ft(wt.getContainerDomNode())},vt=wt=>{wt.getOption(61)||gt(wt.getContainerDomNode())};this._register(ht.onCodeEditorAdd(mt)),this._register(ht.onCodeEditorRemove(vt)),ht.listCodeEditors().forEach(mt);const Dt=wt=>{ft(wt.getContainerDomNode())},ui=wt=>{gt(wt.getContainerDomNode())};this._register(ht.onDiffEditorAdd(Dt)),this._register(ht.onDiffEditorRemove(ui)),ht.listDiffEditors().forEach(Dt)}addDynamicKeybinding(Ve,Ye,Ze,nt){return(0,m.combinedDisposable)(a.CommandsRegistry.registerCommand(Ve,Ze),this.addDynamicKeybindings([{keybinding:Ye,command:Ve,when:nt}]))}addDynamicKeybindings(Ve){const Ye=Ve.map(Ze=>({keybinding:(0,y.decodeKeybinding)(Ze.keybinding,_.OS),command:Ze.command??null,commandArgs:Ze.commandArgs,when:Ze.when,weight1:1e3,weight2:0,extensionId:null,isBuiltinExtension:!1}));return this._dynamicKeybindings=this._dynamicKeybindings.concat(Ye),this.updateResolver(),(0,m.toDisposable)(()=>{for(let Ze=0;Zethis._log(Ze))}return this._cachedResolver}_documentHasFocus(){return _e.mainWindow.document.hasFocus()}_toNormalizedKeybindingItems(Ve,Ye){const Ze=[];let nt=0;for(const ct of Ve){const ht=ct.when||void 0,ft=ct.keybinding;if(!ft)Ze[nt++]=new D.ResolvedKeybindingItem(void 0,ct.command,ct.commandArgs,ht,Ye,null,!1);else{const gt=T.USLayoutResolvedKeybinding.resolveKeybinding(ft,_.OS);for(const mt of gt)Ze[nt++]=new D.ResolvedKeybindingItem(mt,ct.command,ct.commandArgs,ht,Ye,null,!1)}}return Ze}resolveKeyboardEvent(Ve){const Ye=new y.KeyCodeChord(Ve.ctrlKey,Ve.shiftKey,Ve.altKey,Ve.metaKey,Ve.keyCode);return new T.USLayoutResolvedKeybinding([Ye],_.OS)}};e.StandaloneKeybindingService=et,e.StandaloneKeybindingService=et=ke([ce(0,C.IContextKeyService),ce(1,a.ICommandService),ce(2,N.ITelemetryService),ce(3,A.INotificationService),ce(4,q.ILogService),ce(5,V.ICodeEditorService)],et);class dt extends m.Disposable{constructor(Ve,Ye){super(),this.domNode=Ve,this._register(Ye)}}function at(ot){return ot&&typeof ot=="object"&&(!ot.overrideIdentifier||typeof ot.overrideIdentifier=="string")&&(!ot.resource||ot.resource instanceof p.URI)}let st=class{constructor(Ve){this.logService=Ve,this._onDidChangeConfiguration=new E.Emitter,this.onDidChangeConfiguration=this._onDidChangeConfiguration.event;const Ye=new Ne.DefaultConfiguration(Ve);this._configuration=new u.Configuration(Ye.reload(),u.ConfigurationModel.createEmptyModel(Ve),u.ConfigurationModel.createEmptyModel(Ve),u.ConfigurationModel.createEmptyModel(Ve),u.ConfigurationModel.createEmptyModel(Ve),u.ConfigurationModel.createEmptyModel(Ve),new xe.ResourceMap,u.ConfigurationModel.createEmptyModel(Ve),new xe.ResourceMap,Ve),Ye.dispose()}getValue(Ve,Ye){const Ze=typeof Ve=="string"?Ve:void 0,nt=at(Ve)?Ve:at(Ye)?Ye:{};return this._configuration.getValue(Ze,nt,void 0)}updateValues(Ve){const Ye={data:this._configuration.toData()},Ze=[];for(const nt of Ve){const[ct,ht]=nt;this.getValue(ct)!==ht&&(this._configuration.updateValue(ct,ht),Ze.push(ct))}if(Ze.length>0){const nt=new u.ConfigurationChangeEvent({keys:Ze,overrides:[]},Ye,this._configuration,void 0,this.logService);nt.source=8,this._onDidChangeConfiguration.fire(nt)}return Promise.resolve()}updateValue(Ve,Ye,Ze,nt){return this.updateValues([[Ve,Ye]])}inspect(Ve,Ye={}){return this._configuration.inspect(Ve,Ye,void 0)}};e.StandaloneConfigurationService=st,e.StandaloneConfigurationService=st=ke([ce(0,q.ILogService)],st);let pt=class{constructor(Ve,Ye,Ze){this.configurationService=Ve,this.modelService=Ye,this.languageService=Ze,this._onDidChangeConfiguration=new E.Emitter,this.configurationService.onDidChangeConfiguration(nt=>{this._onDidChangeConfiguration.fire({affectedKeys:nt.affectedKeys,affectsConfiguration:(ct,ht)=>nt.affectsConfiguration(ht)})})}getValue(Ve,Ye,Ze){const nt=i.Position.isIPosition(Ye)?Ye:null,ct=nt?typeof Ze=="string"?Ze:void 0:typeof Ye=="string"?Ye:void 0,ht=Ve?this.getLanguage(Ve,nt):void 0;return typeof ct>"u"?this.configurationService.getValue({resource:Ve,overrideIdentifier:ht}):this.configurationService.getValue(ct,{resource:Ve,overrideIdentifier:ht})}getLanguage(Ve,Ye){const Ze=this.modelService.getModel(Ve);return Ze?Ye?Ze.getLanguageIdAtPosition(Ye.lineNumber,Ye.column):Ze.getLanguageId():this.languageService.guessLanguageIdByFilepathOrFirstLine(Ve)}};pt=ke([ce(0,r.IConfigurationService),ce(1,g.IModelService),ce(2,ie.ILanguageService)],pt);let bt=class{constructor(Ve){this.configurationService=Ve}getEOL(Ve,Ye){const Ze=this.configurationService.getValue("files.eol",{overrideIdentifier:Ye,resource:Ve});return Ze&&typeof Ze=="string"&&Ze!=="auto"?Ze:_.isLinux||_.isMacintosh?` -`:`\r -`}};bt=ke([ce(0,r.IConfigurationService)],bt);class De{publicLog2(){}}class Ie{static{this.SCHEME="inmemory"}constructor(){const Ve=p.URI.from({scheme:Ie.SCHEME,authority:"model",path:"/"});this.workspace={id:O.STANDALONE_EDITOR_WORKSPACE_ID,folders:[new O.WorkspaceFolder({uri:Ve,name:"",index:0})]}}getWorkspace(){return this.workspace}getWorkspaceFolder(Ve){return Ve&&Ve.scheme===Ie.SCHEME?this.workspace.folders[0]:null}}function Re(ot,Ve,Ye){if(!Ve||!(ot instanceof st))return;const Ze=[];Object.keys(Ve).forEach(nt=>{(0,o.isEditorConfigurationKey)(nt)&&Ze.push([`editor.${nt}`,Ve[nt]]),Ye&&(0,o.isDiffEditorConfigurationKey)(nt)&&Ze.push([`diffEditor.${nt}`,Ve[nt]])}),Ze.length>0&&ot.updateValues(Ze)}let Se=class{constructor(Ve){this._modelService=Ve}hasPreviewHandler(){return!1}async apply(Ve,Ye){const Ze=Array.isArray(Ve)?Ve:n.ResourceEdit.convert(Ve),nt=new Map;for(const ft of Ze){if(!(ft instanceof n.ResourceTextEdit))throw new Error("bad edit - only text edits are supported");const gt=this._modelService.getModel(ft.resource);if(!gt)throw new Error("bad edit - model not found");if(typeof ft.versionId=="number"&>.getVersionId()!==ft.versionId)throw new Error("bad state - model changed in the meantime");let mt=nt.get(gt);mt||(mt=[],nt.set(gt,mt)),mt.push(t.EditOperation.replaceMove(s.Range.lift(ft.textEdit.range),ft.textEdit.text))}let ct=0,ht=0;for(const[ft,gt]of nt)ft.pushStackElement(),ft.pushEditOperations([],gt,()=>[]),ft.pushStackElement(),ht+=1,ct+=gt.length;return{ariaSummary:d.format(x.StandaloneServicesNLS.bulkEditServiceSummary,ct,ht),isApplied:ct>0}}};Se=ke([ce(0,g.IModelService)],Se);class We{getUriLabel(Ve,Ye){return Ve.scheme==="file"?Ve.fsPath:Ve.path}getUriBasenameLabel(Ve){return(0,W.basename)(Ve)}}let qe=class extends U.ContextViewService{constructor(Ve,Ye){super(Ve),this._codeEditorService=Ye}showContextView(Ve,Ye,Ze){if(!Ye){const nt=this._codeEditorService.getFocusedCodeEditor()||this._codeEditorService.getActiveCodeEditor();nt&&(Ye=nt.getContainerDomNode())}return super.showContextView(Ve,Ye,Ze)}};qe=ke([ce(0,F.ILayoutService),ce(1,V.ICodeEditorService)],qe);class Ue{constructor(){this._neverEmitter=new E.Emitter,this.onDidChangeTrust=this._neverEmitter.event}isWorkspaceTrusted(){return!0}}class Je extends j.LanguageService{constructor(){super()}}class tt extends it.LogService{constructor(){super(new q.ConsoleLogger)}}let Qe=class extends Y.ContextMenuService{constructor(Ve,Ye,Ze,nt,ct,ht){super(Ve,Ye,Ze,nt,ct,ht),this.configure({blockMouse:!1})}};Qe=ke([ce(0,N.ITelemetryService),ce(1,A.INotificationService),ce(2,z.IContextViewService),ce(3,w.IKeybindingService),ce(4,B.IMenuService),ce(5,C.IContextKeyService)],Qe),e.standaloneEditorWorkerDescriptor={amdModuleId:"vs/editor/common/services/editorSimpleWorker",esmModuleLocation:void 0,label:"editorWorkerService"};let rt=class extends J.EditorWorkerService{constructor(Ve,Ye,Ze,nt,ct){super(e.standaloneEditorWorkerDescriptor,Ve,Ye,Ze,nt,ct)}};rt=ke([ce(0,g.IModelService),ce(1,l.ITextResourceConfigurationService),ce(2,q.ILogService),ce(3,Ge.ILanguageConfigurationService),ce(4,ze.ILanguageFeaturesService)],rt);class Ct{async playSignal(Ve,Ye){}}(0,G.registerSingleton)(q.ILogService,tt,0),(0,G.registerSingleton)(r.IConfigurationService,st,0),(0,G.registerSingleton)(l.ITextResourceConfigurationService,pt,0),(0,G.registerSingleton)(l.ITextResourcePropertiesService,bt,0),(0,G.registerSingleton)(O.IWorkspaceContextService,Ie,0),(0,G.registerSingleton)(M.ILabelService,We,0),(0,G.registerSingleton)(N.ITelemetryService,De,0),(0,G.registerSingleton)(f.IDialogService,$e,0),(0,G.registerSingleton)(fe.IEnvironmentService,He,0),(0,G.registerSingleton)(A.INotificationService,je,0),(0,G.registerSingleton)(ye.IMarkerService,Le.MarkerService,0),(0,G.registerSingleton)(ie.ILanguageService,Je,0),(0,G.registerSingleton)(de.IStandaloneThemeService,ee.StandaloneThemeService,0),(0,G.registerSingleton)(g.IModelService,pe.ModelService,0),(0,G.registerSingleton)(he.IMarkerDecorationsService,ue.MarkerDecorationsService,0),(0,G.registerSingleton)(C.IContextKeyService,te.ContextKeyService,0),(0,G.registerSingleton)(P.IProgressService,Be,0),(0,G.registerSingleton)(P.IEditorProgressService,Pe,0),(0,G.registerSingleton)(Ae.IStorageService,Ae.InMemoryStorageService,0),(0,G.registerSingleton)(R.IEditorWorkerService,rt,0),(0,G.registerSingleton)(n.IBulkEditService,Se,0),(0,G.registerSingleton)(H.IWorkspaceTrustManagementService,Ue,0),(0,G.registerSingleton)(c.ITextModelService,Te,0),(0,G.registerSingleton)(X.IAccessibilityService,ge.AccessibilityService,0),(0,G.registerSingleton)(Ce.IListService,Ce.ListService,0),(0,G.registerSingleton)(a.ICommandService,Xe,0),(0,G.registerSingleton)(w.IKeybindingService,et,0),(0,G.registerSingleton)(Me.IQuickInputService,ae.StandaloneQuickInputService,0),(0,G.registerSingleton)(z.IContextViewService,qe,0),(0,G.registerSingleton)(Ee.IOpenerService,K.OpenerService,0),(0,G.registerSingleton)(Z.IClipboardService,Q.BrowserClipboardService,0),(0,G.registerSingleton)(z.IContextMenuService,Qe,0),(0,G.registerSingleton)(B.IMenuService,$.MenuService,0),(0,G.registerSingleton)(Ke.IAccessibilitySignalService,Ct,0),(0,G.registerSingleton)(be.ITreeSitterParserService,ve.StandaloneTreeSitterParserService,0);var ut;(function(ot){const Ve=new me.ServiceCollection;for(const[gt,mt]of(0,G.getSingletonServiceDescriptors)())Ve.set(gt,mt);const Ye=new le.InstantiationService(Ve,!0);Ve.set(h.IInstantiationService,Ye);function Ze(gt){nt||ht({});const mt=Ve.get(gt);if(!mt)throw new Error("Missing service "+gt);return mt instanceof re.SyncDescriptor?Ye.invokeFunction(vt=>vt.get(gt)):mt}ot.get=Ze;let nt=!1;const ct=new E.Emitter;function ht(gt){if(nt)return Ye;nt=!0;for(const[vt,Dt]of(0,G.getSingletonServiceDescriptors)())Ve.get(vt)||Ve.set(vt,Dt);for(const vt in gt)if(gt.hasOwnProperty(vt)){const Dt=(0,h.createDecorator)(vt);Ve.get(Dt)instanceof re.SyncDescriptor&&Ve.set(Dt,gt[vt])}const mt=(0,Oe.getEditorFeatures)();for(const vt of mt)try{Ye.createInstance(vt)}catch(Dt){(0,Fe.onUnexpectedError)(Dt)}return ct.fire(),Ye}ot.initialize=ht;function ft(gt){if(nt)return gt();const mt=new m.DisposableStore,vt=mt.add(ct.event(()=>{vt.dispose(),mt.add(gt())}));return mt}ot.withServices=ft})(ut||(e.StandaloneServices=ut={}))}),define(ne[871],se([1,0,46,2,34,219,318,222,153,29,24,28,12,58,7,31,50,25,61,107,117,96,51,43,418,70,36,17,286,137,52,44,118,81]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S,L,D,T,M,A,P){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneDiffEditor2=e.StandaloneEditor=e.StandaloneCodeEditor=void 0,e.createTextModel=q;let N=0,O=!1;function F(z){if(!z){if(O)return;O=!0}d.setARIAContainer(z||T.mainWindow.document.body)}let x=class extends E.CodeEditorWidget{constructor(U,j,Y,G,K,R,J,ie,ue,he,pe,ae,ee){const de={...j};de.ariaLabel=de.ariaLabel||a.StandaloneCodeEditorNLS.editorViewAccessibleLabel,super(U,de,{},Y,G,K,R,ue,he,pe,ae,ee),ie instanceof m.StandaloneKeybindingService?this._standaloneKeybindingService=ie:this._standaloneKeybindingService=null,F(de.ariaContainerElement),(0,M.setHoverDelegateFactory)((ge,X)=>Y.createInstance(A.WorkbenchHoverDelegate,ge,X,{})),(0,P.setBaseLayerHoverDelegate)(J)}addCommand(U,j,Y){if(!this._standaloneKeybindingService)return console.warn("Cannot add command because the editor is configured with an unrecognized KeybindingService"),null;const G="DYNAMIC_"+ ++N,K=o.ContextKeyExpr.deserialize(Y);return this._standaloneKeybindingService.addDynamicKeybinding(G,U,j,K),G}createContextKey(U,j){return this._contextKeyService.createKey(U,j)}addAction(U){if(typeof U.id!="string"||typeof U.label!="string"||typeof U.run!="function")throw new Error("Invalid action descriptor, `id`, `label` and `run` are required properties!");if(!this._standaloneKeybindingService)return console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"),k.Disposable.None;const j=U.id,Y=U.label,G=o.ContextKeyExpr.and(o.ContextKeyExpr.equals("editorId",this.getId()),o.ContextKeyExpr.deserialize(U.precondition)),K=U.keybindings,R=o.ContextKeyExpr.and(G,o.ContextKeyExpr.deserialize(U.keybindingContext)),J=U.contextMenuGroupId||null,ie=U.contextMenuOrder||0,ue=(ee,...de)=>Promise.resolve(U.run(this,...de)),he=new k.DisposableStore,pe=this.getId()+":"+j;if(he.add(p.CommandsRegistry.registerCommand(pe,ue)),J){const ee={command:{id:pe,title:Y},when:G,group:J,order:ie};he.add(b.MenuRegistry.appendMenuItem(b.MenuId.EditorContext,ee))}if(Array.isArray(K))for(const ee of K)he.add(this._standaloneKeybindingService.addDynamicKeybinding(pe,ee,ue,R));const ae=new y.InternalEditorAction(pe,Y,Y,void 0,G,(...ee)=>Promise.resolve(U.run(this,...ee)),this._contextKeyService);return this._actions.set(j,ae),he.add((0,k.toDisposable)(()=>{this._actions.delete(j)})),he}_triggerCommand(U,j){if(this._codeEditorService instanceof h.StandaloneCodeEditorService)try{this._codeEditorService.setActiveCodeEditor(this),super._triggerCommand(U,j)}finally{this._codeEditorService.setActiveCodeEditor(null)}else super._triggerCommand(U,j)}};e.StandaloneCodeEditor=x,e.StandaloneCodeEditor=x=ke([ce(2,i.IInstantiationService),ce(3,I.ICodeEditorService),ce(4,p.ICommandService),ce(5,o.IContextKeyService),ce(6,A.IHoverService),ce(7,s.IKeybindingService),ce(8,c.IThemeService),ce(9,g.INotificationService),ce(10,l.IAccessibilityService),ce(11,w.ILanguageConfigurationService),ce(12,S.ILanguageFeaturesService)],x);let W=class extends x{constructor(U,j,Y,G,K,R,J,ie,ue,he,pe,ae,ee,de,ge,X){const B={...j};(0,m.updateConfigurationService)(pe,B,!1);const $=ue.registerEditorContainer(U);typeof B.theme=="string"&&ue.setTheme(B.theme),typeof B.autoDetectHighContrast<"u"&&ue.setAutoDetectHighContrast(!!B.autoDetectHighContrast);const Q=B.model;delete B.model,super(U,B,Y,G,K,R,J,ie,ue,he,ae,ge,X),this._configurationService=pe,this._standaloneThemeService=ue,this._register($);let Z;if(typeof Q>"u"){const te=de.getLanguageIdByMimeType(B.language)||B.language||v.PLAINTEXT_LANGUAGE_ID;Z=q(ee,de,B.value||"",te,void 0),this._ownsModel=!0}else Z=Q,this._ownsModel=!1;if(this._attachModel(Z),Z){const te={oldModelUrl:null,newModelUrl:Z.uri};this._onDidChangeModel.fire(te)}}dispose(){super.dispose()}updateOptions(U){(0,m.updateConfigurationService)(this._configurationService,U,!1),typeof U.theme=="string"&&this._standaloneThemeService.setTheme(U.theme),typeof U.autoDetectHighContrast<"u"&&this._standaloneThemeService.setAutoDetectHighContrast(!!U.autoDetectHighContrast),super.updateOptions(U)}_postDetachModelCleanup(U){super._postDetachModelCleanup(U),U&&this._ownsModel&&(U.dispose(),this._ownsModel=!1)}};e.StandaloneEditor=W,e.StandaloneEditor=W=ke([ce(2,i.IInstantiationService),ce(3,I.ICodeEditorService),ce(4,p.ICommandService),ce(5,o.IContextKeyService),ce(6,A.IHoverService),ce(7,s.IKeybindingService),ce(8,_.IStandaloneThemeService),ce(9,g.INotificationService),ce(10,n.IConfigurationService),ce(11,l.IAccessibilityService),ce(12,C.IModelService),ce(13,f.ILanguageService),ce(14,w.ILanguageConfigurationService),ce(15,S.ILanguageFeaturesService)],W);let V=class extends L.DiffEditorWidget{constructor(U,j,Y,G,K,R,J,ie,ue,he,pe,ae){const ee={...j};(0,m.updateConfigurationService)(ie,ee,!0);const de=R.registerEditorContainer(U);typeof ee.theme=="string"&&R.setTheme(ee.theme),typeof ee.autoDetectHighContrast<"u"&&R.setAutoDetectHighContrast(!!ee.autoDetectHighContrast),super(U,ee,{},G,Y,K,ae,he),this._configurationService=ie,this._standaloneThemeService=R,this._register(de)}dispose(){super.dispose()}updateOptions(U){(0,m.updateConfigurationService)(this._configurationService,U,!0),typeof U.theme=="string"&&this._standaloneThemeService.setTheme(U.theme),typeof U.autoDetectHighContrast<"u"&&this._standaloneThemeService.setAutoDetectHighContrast(!!U.autoDetectHighContrast),super.updateOptions(U)}_createInnerEditor(U,j,Y){return U.createInstance(x,j,Y)}getOriginalEditor(){return super.getOriginalEditor()}getModifiedEditor(){return super.getModifiedEditor()}addCommand(U,j,Y){return this.getModifiedEditor().addCommand(U,j,Y)}createContextKey(U,j){return this.getModifiedEditor().createContextKey(U,j)}addAction(U){return this.getModifiedEditor().addAction(U)}};e.StandaloneDiffEditor2=V,e.StandaloneDiffEditor2=V=ke([ce(2,i.IInstantiationService),ce(3,o.IContextKeyService),ce(4,I.ICodeEditorService),ce(5,_.IStandaloneThemeService),ce(6,g.INotificationService),ce(7,n.IConfigurationService),ce(8,t.IContextMenuService),ce(9,u.IEditorProgressService),ce(10,r.IClipboardService),ce(11,D.IAccessibilitySignalService)],V);function q(z,U,j,Y,G){if(j=j||"",!Y){const K=j.indexOf(` -`);let R=j;return K!==-1&&(R=j.substring(0,K)),H(z,j,U.createByFilepathOrFirstLine(G||null,R),G)}return H(z,j,U.createById(Y),G)}function H(z,U,j,Y){return z.createModel(U,j,Y)}}),define(ne[872],se([1,0,33,4,27,43,36,70,17,238,222,625,389,153,28,108]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TokenizationSupportAdapter=e.EncodedTokenizationSupportAdapter=void 0,e.register=g,e.getLanguages=c,e.getEncodedLanguageId=l,e.onLanguage=a,e.onLanguageEncountered=r,e.setLanguageConfiguration=u,e.setColorMap=S,e.registerTokensProviderFactory=D,e.setTokensProvider=T,e.setMonarchTokensProvider=M,e.registerReferenceProvider=A,e.registerRenameProvider=P,e.registerNewSymbolNameProvider=N,e.registerSignatureHelpProvider=O,e.registerHoverProvider=F,e.registerDocumentSymbolProvider=x,e.registerDocumentHighlightProvider=W,e.registerLinkedEditingRangeProvider=V,e.registerDefinitionProvider=q,e.registerImplementationProvider=H,e.registerTypeDefinitionProvider=z,e.registerCodeLensProvider=U,e.registerCodeActionProvider=j,e.registerDocumentFormattingEditProvider=Y,e.registerDocumentRangeFormattingEditProvider=G,e.registerOnTypeFormattingEditProvider=K,e.registerLinkProvider=R,e.registerCompletionItemProvider=J,e.registerColorProvider=ie,e.registerFoldingRangeProvider=ue,e.registerDeclarationProvider=he,e.registerSelectionRangeProvider=pe,e.registerDocumentSemanticTokensProvider=ae,e.registerDocumentRangeSemanticTokensProvider=ee,e.registerInlineCompletionsProvider=de,e.registerInlineEditProvider=ge,e.registerInlayHintsProvider=X,e.createMonacoLanguagesAPI=B;function g($){m.ModesRegistry.registerLanguage($)}function c(){let $=[];return $=$.concat(m.ModesRegistry.getLanguages()),$}function l($){return p.StandaloneServices.get(E.ILanguageService).languageIdCodec.encodeLanguageId($)}function a($,Q){return p.StandaloneServices.withServices(()=>{const te=p.StandaloneServices.get(E.ILanguageService).onDidRequestRichLanguageFeatures(re=>{re===$&&(te.dispose(),Q())});return te})}function r($,Q){return p.StandaloneServices.withServices(()=>{const te=p.StandaloneServices.get(E.ILanguageService).onDidRequestBasicLanguageFeatures(re=>{re===$&&(te.dispose(),Q())});return te})}function u($,Q){if(!p.StandaloneServices.get(E.ILanguageService).isRegisteredLanguageId($))throw new Error(`Cannot set configuration for unknown language ${$}`);return p.StandaloneServices.get(y.ILanguageConfigurationService).register($,Q,100)}class C{constructor(Q,Z){this._languageId=Q,this._actual=Z}dispose(){}getInitialState(){return this._actual.getInitialState()}tokenize(Q,Z,te){if(typeof this._actual.tokenize=="function")return f.adaptTokenize(this._languageId,this._actual,Q,te);throw new Error("Not supported!")}tokenizeEncoded(Q,Z,te){const re=this._actual.tokenizeEncoded(Q,te);return new I.EncodedTokenizationResult(re.tokens,re.endState)}}e.EncodedTokenizationSupportAdapter=C;class f{constructor(Q,Z,te,re){this._languageId=Q,this._actual=Z,this._languageService=te,this._standaloneThemeService=re}dispose(){}getInitialState(){return this._actual.getInitialState()}static _toClassicTokens(Q,Z){const te=[];let re=0;for(let le=0,me=Q.length;le0&&le[me-1]===Ae)continue;let Ne=Me.startIndex;Le===0?Ne=0:Ne{const te=await Promise.resolve(Q.create());return te?h(te)?L($,te):new o.MonarchTokenizer(p.StandaloneServices.get(E.ILanguageService),p.StandaloneServices.get(t.IStandaloneThemeService),$,(0,n.compile)($,te),p.StandaloneServices.get(i.IConfigurationService)):null});return I.TokenizationRegistry.registerFactory($,Z)}function T($,Q){if(!p.StandaloneServices.get(E.ILanguageService).isRegisteredLanguageId($))throw new Error(`Cannot set tokens provider for unknown language ${$}`);return w(Q)?D($,{create:()=>Q}):I.TokenizationRegistry.register($,L($,Q))}function M($,Q){const Z=te=>new o.MonarchTokenizer(p.StandaloneServices.get(E.ILanguageService),p.StandaloneServices.get(t.IStandaloneThemeService),$,(0,n.compile)($,te),p.StandaloneServices.get(i.IConfigurationService));return w(Q)?D($,{create:()=>Q}):I.TokenizationRegistry.register($,Z(Q))}function A($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).referenceProvider.register($,Q)}function P($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).renameProvider.register($,Q)}function N($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).newSymbolNamesProvider.register($,Q)}function O($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).signatureHelpProvider.register($,Q)}function F($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).hoverProvider.register($,{provideHover:async(te,re,le,me)=>{const Ce=te.getWordAtPosition(re);return Promise.resolve(Q.provideHover(te,re,le,me)).then(ye=>{if(ye)return!ye.range&&Ce&&(ye.range=new k.Range(re.lineNumber,Ce.startColumn,re.lineNumber,Ce.endColumn)),ye.range||(ye.range=new k.Range(re.lineNumber,re.column,re.lineNumber,re.column)),ye})}})}function x($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).documentSymbolProvider.register($,Q)}function W($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).documentHighlightProvider.register($,Q)}function V($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).linkedEditingRangeProvider.register($,Q)}function q($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).definitionProvider.register($,Q)}function H($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).implementationProvider.register($,Q)}function z($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).typeDefinitionProvider.register($,Q)}function U($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).codeLensProvider.register($,Q)}function j($,Q,Z){return p.StandaloneServices.get(_.ILanguageFeaturesService).codeActionProvider.register($,{providedCodeActionKinds:Z?.providedCodeActionKinds,documentation:Z?.documentation,provideCodeActions:(re,le,me,Ce)=>{const Le=p.StandaloneServices.get(s.IMarkerService).read({resource:re.uri}).filter(Ee=>k.Range.areIntersectingOrTouching(Ee,le));return Q.provideCodeActions(re,le,{markers:Le,only:me.only,trigger:me.trigger},Ce)},resolveCodeAction:Q.resolveCodeAction})}function Y($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).documentFormattingEditProvider.register($,Q)}function G($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).documentRangeFormattingEditProvider.register($,Q)}function K($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).onTypeFormattingEditProvider.register($,Q)}function R($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).linkProvider.register($,Q)}function J($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).completionProvider.register($,Q)}function ie($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).colorProvider.register($,Q)}function ue($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).foldingRangeProvider.register($,Q)}function he($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).declarationProvider.register($,Q)}function pe($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).selectionRangeProvider.register($,Q)}function ae($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).documentSemanticTokensProvider.register($,Q)}function ee($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).documentRangeSemanticTokensProvider.register($,Q)}function de($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).inlineCompletionsProvider.register($,Q)}function ge($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).inlineEditProvider.register($,Q)}function X($,Q){return p.StandaloneServices.get(_.ILanguageFeaturesService).inlayHintsProvider.register($,Q)}function B(){return{register:g,getLanguages:c,onLanguage:a,onLanguageEncountered:r,getEncodedLanguageId:l,setLanguageConfiguration:u,setColorMap:S,registerTokensProviderFactory:D,setTokensProvider:T,setMonarchTokensProvider:M,registerReferenceProvider:A,registerRenameProvider:P,registerNewSymbolNameProvider:N,registerCompletionItemProvider:J,registerSignatureHelpProvider:O,registerHoverProvider:F,registerDocumentSymbolProvider:x,registerDocumentHighlightProvider:W,registerLinkedEditingRangeProvider:V,registerDefinitionProvider:q,registerImplementationProvider:H,registerTypeDefinitionProvider:z,registerCodeLensProvider:U,registerCodeActionProvider:j,registerDocumentFormattingEditProvider:Y,registerDocumentRangeFormattingEditProvider:G,registerOnTypeFormattingEditProvider:K,registerLinkProvider:R,registerColorProvider:ie,registerFoldingRangeProvider:ue,registerDeclarationProvider:he,registerSelectionRangeProvider:pe,registerDocumentSemanticTokensProvider:ae,registerDocumentRangeSemanticTokensProvider:ee,registerInlineCompletionsProvider:de,registerInlineEditProvider:ge,registerInlayHintsProvider:X,DocumentHighlightKind:b.DocumentHighlightKind,CompletionItemKind:b.CompletionItemKind,CompletionItemTag:b.CompletionItemTag,CompletionItemInsertTextRule:b.CompletionItemInsertTextRule,SymbolKind:b.SymbolKind,SymbolTag:b.SymbolTag,IndentAction:b.IndentAction,CompletionTriggerKind:b.CompletionTriggerKind,SignatureHelpTriggerKind:b.SignatureHelpTriggerKind,InlayHintKind:b.InlayHintKind,InlineCompletionTriggerKind:b.InlineCompletionTriggerKind,InlineEditTriggerKind:b.InlineEditTriggerKind,CodeActionTriggerType:b.CodeActionTriggerType,NewSymbolNameTag:b.NewSymbolNameTag,NewSymbolNameTriggerKind:b.NewSymbolNameTriggerKind,PartialAcceptTriggerKind:b.PartialAcceptTriggerKind,HoverVerbosityAction:b.HoverVerbosityAction,FoldingRangeKind:I.FoldingRangeKind,SelectedSuggestionInfo:I.SelectedSuggestionInfo}}}),define(ne[873],se([1,0,60,401,222]),function(oe,e,d,k,I){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createWebWorker=E;function E(m,_){return new y(m,_)}class y extends k.EditorWorkerClient{constructor(_,b){const p={amdModuleId:I.standaloneEditorWorkerDescriptor.amdModuleId,esmModuleLocation:I.standaloneEditorWorkerDescriptor.esmModuleLocation,label:b.label};super(p,b.keepIdleModels||!1,_),this._foreignModuleId=b.moduleId,this._foreignModuleCreateData=b.createData||null,this._foreignModuleHost=b.host||null,this._foreignProxy=null}fhr(_,b){if(!this._foreignModuleHost||typeof this._foreignModuleHost[_]!="function")return Promise.reject(new Error("Missing method "+_+" or missing main thread foreign host."));try{return Promise.resolve(this._foreignModuleHost[_].apply(this._foreignModuleHost,b))}catch(p){return Promise.reject(p)}}_getForeignProxy(){return this._foreignProxy||(this._foreignProxy=this._getProxy().then(_=>{const b=this._foreignModuleHost?(0,d.getAllMethodNames)(this._foreignModuleHost):[];return _.$loadForeignModule(this._foreignModuleId,this._foreignModuleCreateData,b).then(p=>{this._foreignModuleCreateData=null;const n=(i,s)=>_.$fmr(i,s),o=(i,s)=>function(){const g=Array.prototype.slice.call(arguments,0);return s(i,g)},t={};for(const i of p)t[i]=o(i,n);return t})})),this._foreignProxy}getProxy(){return this._getForeignProxy()}withSyncedResources(_){return this.workerWithSyncedResources(_).then(b=>this.getProxy())}}}),define(ne[874],se([1,0,52,2,11,22,366,15,34,873,37,165,261,198,27,43,70,177,40,51,238,682,871,222,153,29,24,12,31,108,59,814,541]),function(oe,e,d,k,I,E,y,m,_,b,p,n,o,t,i,s,g,c,l,a,r,u,C,f,h,v,w,S,L,D,T,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.create=A,e.onDidCreateEditor=P,e.onDidCreateDiffEditor=N,e.getEditors=O,e.getDiffEditors=F,e.createDiffEditor=x,e.createMultiFileDiffEditor=W,e.addCommand=V,e.addEditorAction=q,e.addKeybindingRule=H,e.addKeybindingRules=z,e.createModel=U,e.setModelLanguage=j,e.setModelMarkers=Y,e.removeAllMarkers=G,e.getModelMarkers=K,e.onDidChangeMarkers=R,e.getModel=J,e.getModels=ie,e.onDidCreateModel=ue,e.onWillDisposeModel=he,e.onDidChangeModelLanguage=pe,e.createWebWorker=ae,e.colorizeElement=ee,e.colorize=de,e.colorizeModelLine=ge,e.tokenize=B,e.defineTheme=$,e.setTheme=Q,e.remeasureFonts=Z,e.registerCommand=te,e.registerLinkOpener=re,e.registerEditorOpener=le,e.createMonacoEditorAPI=me;function A(Ce,ye,Le){return f.StandaloneServices.initialize(Le||{}).createInstance(C.StandaloneEditor,Ce,ye)}function P(Ce){return f.StandaloneServices.get(_.ICodeEditorService).onCodeEditorAdd(Le=>{Ce(Le)})}function N(Ce){return f.StandaloneServices.get(_.ICodeEditorService).onDiffEditorAdd(Le=>{Ce(Le)})}function O(){return f.StandaloneServices.get(_.ICodeEditorService).listCodeEditors()}function F(){return f.StandaloneServices.get(_.ICodeEditorService).listDiffEditors()}function x(Ce,ye,Le){return f.StandaloneServices.initialize(Le||{}).createInstance(C.StandaloneDiffEditor2,Ce,ye)}function W(Ce,ye){const Le=f.StandaloneServices.initialize(ye||{});return new M.MultiDiffEditorWidget(Ce,{},Le)}function V(Ce){if(typeof Ce.id!="string"||typeof Ce.run!="function")throw new Error("Invalid command descriptor, `id` and `run` are required properties!");return w.CommandsRegistry.registerCommand(Ce.id,Ce.run)}function q(Ce){if(typeof Ce.id!="string"||typeof Ce.label!="string"||typeof Ce.run!="function")throw new Error("Invalid action descriptor, `id`, `label` and `run` are required properties!");const ye=S.ContextKeyExpr.deserialize(Ce.precondition),Le=(Me,...Ae)=>m.EditorCommand.runEditorCommand(Me,Ae,ye,(Ne,Ke,ze)=>Promise.resolve(Ce.run(Ke,...ze))),Ee=new k.DisposableStore;if(Ee.add(w.CommandsRegistry.registerCommand(Ce.id,Le)),Ce.contextMenuGroupId){const Me={command:{id:Ce.id,title:Ce.label},when:ye,group:Ce.contextMenuGroupId,order:Ce.contextMenuOrder||0};Ee.add(v.MenuRegistry.appendMenuItem(v.MenuId.EditorContext,Me))}if(Array.isArray(Ce.keybindings)){const Me=f.StandaloneServices.get(L.IKeybindingService);if(!(Me instanceof f.StandaloneKeybindingService))console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService");else{const Ae=S.ContextKeyExpr.and(ye,S.ContextKeyExpr.deserialize(Ce.keybindingContext));Ee.add(Me.addDynamicKeybindings(Ce.keybindings.map(Ne=>({keybinding:Ne,command:Ce.id,when:Ae}))))}}return Ee}function H(Ce){return z([Ce])}function z(Ce){const ye=f.StandaloneServices.get(L.IKeybindingService);return ye instanceof f.StandaloneKeybindingService?ye.addDynamicKeybindings(Ce.map(Le=>({keybinding:Le.keybinding,command:Le.command,commandArgs:Le.commandArgs,when:S.ContextKeyExpr.deserialize(Le.when)}))):(console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"),k.Disposable.None)}function U(Ce,ye,Le){const Ee=f.StandaloneServices.get(s.ILanguageService),Me=Ee.getLanguageIdByMimeType(ye)||ye;return(0,C.createTextModel)(f.StandaloneServices.get(a.IModelService),Ee,Ce,Me,Le)}function j(Ce,ye){const Le=f.StandaloneServices.get(s.ILanguageService),Ee=Le.getLanguageIdByMimeType(ye)||ye||g.PLAINTEXT_LANGUAGE_ID;Ce.setLanguage(Le.createById(Ee))}function Y(Ce,ye,Le){Ce&&f.StandaloneServices.get(D.IMarkerService).changeOne(ye,Ce.uri,Le)}function G(Ce){f.StandaloneServices.get(D.IMarkerService).changeAll(Ce,[])}function K(Ce){return f.StandaloneServices.get(D.IMarkerService).read(Ce)}function R(Ce){return f.StandaloneServices.get(D.IMarkerService).onMarkerChanged(Ce)}function J(Ce){return f.StandaloneServices.get(a.IModelService).getModel(Ce)}function ie(){return f.StandaloneServices.get(a.IModelService).getModels()}function ue(Ce){return f.StandaloneServices.get(a.IModelService).onModelAdded(Ce)}function he(Ce){return f.StandaloneServices.get(a.IModelService).onModelRemoved(Ce)}function pe(Ce){return f.StandaloneServices.get(a.IModelService).onModelLanguageChanged(Le=>{Ce({model:Le.model,oldLanguage:Le.oldLanguageId})})}function ae(Ce){return(0,b.createWebWorker)(f.StandaloneServices.get(a.IModelService),Ce)}function ee(Ce,ye){const Le=f.StandaloneServices.get(s.ILanguageService),Ee=f.StandaloneServices.get(h.IStandaloneThemeService);return u.Colorizer.colorizeElement(Ee,Le,Ce,ye).then(()=>{Ee.registerEditorContainer(Ce)})}function de(Ce,ye,Le){const Ee=f.StandaloneServices.get(s.ILanguageService);return f.StandaloneServices.get(h.IStandaloneThemeService).registerEditorContainer(d.mainWindow.document.body),u.Colorizer.colorize(Ee,Ce,ye,Le)}function ge(Ce,ye,Le=4){return f.StandaloneServices.get(h.IStandaloneThemeService).registerEditorContainer(d.mainWindow.document.body),u.Colorizer.colorizeModelLine(Ce,ye,Le)}function X(Ce){const ye=i.TokenizationRegistry.get(Ce);return ye||{getInitialState:()=>c.NullState,tokenize:(Le,Ee,Me)=>(0,c.nullTokenize)(Ce,Me)}}function B(Ce,ye){i.TokenizationRegistry.getOrCreate(ye);const Le=X(ye),Ee=(0,I.splitLines)(Ce),Me=[];let Ae=Le.getInitialState();for(let Ne=0,Ke=Ee.length;Ne{if(!Ee)return null;const Ae=Le.options?.selection;let Ne;return Ae&&typeof Ae.endLineNumber=="number"&&typeof Ae.endColumn=="number"?Ne=Ae:Ae&&(Ne={lineNumber:Ae.startLineNumber,column:Ae.startColumn}),await Ce.openCodeEditor(Ee,Le.resource,Ne)?Ee:null})}function me(){return{create:A,getEditors:O,getDiffEditors:F,onDidCreateEditor:P,onDidCreateDiffEditor:N,createDiffEditor:x,addCommand:V,addEditorAction:q,addKeybindingRule:H,addKeybindingRules:z,createModel:U,setModelLanguage:j,setModelMarkers:Y,getModelMarkers:K,removeAllMarkers:G,onDidChangeMarkers:R,getModels:ie,getModel:J,onDidCreateModel:ue,onWillDisposeModel:he,onDidChangeModelLanguage:pe,createWebWorker:ae,colorizeElement:ee,colorize:de,colorizeModelLine:ge,tokenize:B,defineTheme:$,setTheme:Q,remeasureFonts:Z,registerCommand:te,registerLinkOpener:re,registerEditorOpener:le,AccessibilitySupport:r.AccessibilitySupport,ContentWidgetPositionPreference:r.ContentWidgetPositionPreference,CursorChangeReason:r.CursorChangeReason,DefaultEndOfLine:r.DefaultEndOfLine,EditorAutoIndentStrategy:r.EditorAutoIndentStrategy,EditorOption:r.EditorOption,EndOfLinePreference:r.EndOfLinePreference,EndOfLineSequence:r.EndOfLineSequence,MinimapPosition:r.MinimapPosition,MinimapSectionHeaderStyle:r.MinimapSectionHeaderStyle,MouseTargetType:r.MouseTargetType,OverlayWidgetPositionPreference:r.OverlayWidgetPositionPreference,OverviewRulerLane:r.OverviewRulerLane,GlyphMarginLane:r.GlyphMarginLane,RenderLineNumbersType:r.RenderLineNumbersType,RenderMinimap:r.RenderMinimap,ScrollbarVisibility:r.ScrollbarVisibility,ScrollType:r.ScrollType,TextEditorCursorBlinkingStyle:r.TextEditorCursorBlinkingStyle,TextEditorCursorStyle:r.TextEditorCursorStyle,TrackedRangeStickiness:r.TrackedRangeStickiness,WrappingIndent:r.WrappingIndent,InjectedTextCursorStops:r.InjectedTextCursorStops,PositionAffinity:r.PositionAffinity,ShowLightbulbIconMode:r.ShowLightbulbIconMode,ConfigurationChangedEvent:p.ConfigurationChangedEvent,BareFontInfo:o.BareFontInfo,FontInfo:o.FontInfo,TextModelResolvedOptions:l.TextModelResolvedOptions,FindMatch:l.FindMatch,ApplyUpdateResult:p.ApplyUpdateResult,EditorZoom:n.EditorZoom,createMultiFileDiffEditor:W,EditorType:t.EditorType,EditorOptions:p.EditorOptions}}}),define(ne[875],se([1,0,37,372,874,872,409]),function(oe,e,d,k,I,E,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.languages=e.editor=e.Token=e.Uri=e.MarkerTag=e.MarkerSeverity=e.SelectionDirection=e.Selection=e.Range=e.Position=e.KeyMod=e.KeyCode=e.Emitter=e.CancellationTokenSource=void 0,d.EditorOptions.wrappingIndent.defaultValue=0,d.EditorOptions.glyphMargin.defaultValue=!1,d.EditorOptions.autoIndent.defaultValue=3,d.EditorOptions.overviewRulerLanes.defaultValue=2,y.FormattingConflicts.setFormatterSelector((b,p,n)=>Promise.resolve(b[0]));const m=(0,k.createMonacoBaseAPI)();m.editor=(0,I.createMonacoEditorAPI)(),m.languages=(0,E.createMonacoLanguagesAPI)(),e.CancellationTokenSource=m.CancellationTokenSource,e.Emitter=m.Emitter,e.KeyCode=m.KeyCode,e.KeyMod=m.KeyMod,e.Position=m.Position,e.Range=m.Range,e.Selection=m.Selection,e.SelectionDirection=m.SelectionDirection,e.MarkerSeverity=m.MarkerSeverity,e.MarkerTag=m.MarkerTag,e.Uri=m.Uri,e.Token=m.Token,e.editor=m.editor,e.languages=m.languages,(globalThis.MonacoEnvironment?.globalAPI||typeof define=="function"&&define.amd)&&(globalThis.monaco=m),typeof globalThis.require<"u"&&typeof globalThis.require.config=="function"&&globalThis.require.config({ignoreDuplicateModules:["vscode-languageserver-types","vscode-languageserver-types/main","vscode-languageserver-textdocument","vscode-languageserver-textdocument/main","vscode-nls","vscode-nls/vscode-nls","jsonc-parser","jsonc-parser/main","vscode-uri","vscode-uri/index","vs/basic-languages/typescript/typescript"]})});var Lt=this&&this.__exportStar||function(oe,e){for(var d in oe)d!=="default"&&!Object.prototype.hasOwnProperty.call(e,d)&&ci(e,oe,d)};define(ne[877],se([1,0,875,870,746,747,721,794,795,750,854,797]),function(oe,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),Lt(d,e)})}).call(this); - - -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/monaco.contribution", ["require","require","vs/editor/editor.api"],(require)=>{ -"use strict";var moduleExports=(()=>{var y=Object.create;var g=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var A=Object.getPrototypeOf,M=Object.prototype.hasOwnProperty;var a=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(r,s)=>(typeof require<"u"?require:r)[s]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var D=(e,r)=>()=>(r||e((r={exports:{}}).exports,r),r.exports);var l=(e,r,s,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of q(r))!M.call(e,o)&&o!==s&&g(e,o,{get:()=>r[o],enumerable:!(n=x(r,o))||n.enumerable});return e},p=(e,r,s)=>(l(e,r,"default"),s&&l(s,r,"default")),c=(e,r,s)=>(s=e!=null?y(A(e)):{},l(r||!e||!e.__esModule?g(s,"default",{value:e,enumerable:!0}):s,e));var v=D((w,d)=>{var b=c(a("vs/editor/editor.api"));d.exports=b});var t={};p(t,c(v()));var f={},m={},u=class e{static getOrCreate(r){return m[r]||(m[r]=new e(r)),m[r]}constructor(r){this._languageId=r,this._loadingTriggered=!1,this._lazyLoadPromise=new Promise((s,n)=>{this._lazyLoadPromiseResolve=s,this._lazyLoadPromiseReject=n})}load(){return this._loadingTriggered||(this._loadingTriggered=!0,f[this._languageId].loader().then(r=>this._lazyLoadPromiseResolve(r),r=>this._lazyLoadPromiseReject(r))),this._lazyLoadPromise}};function i(e){let r=e.id;f[r]=e,t.languages.register(e);let s=u.getOrCreate(r);t.languages.registerTokensProviderFactory(r,{create:async()=>(await s.load()).language}),t.languages.onLanguageEncountered(r,async()=>{let n=await s.load();t.languages.setLanguageConfiguration(r,n.conf)})}i({id:"abap",extensions:[".abap"],aliases:["abap","ABAP"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/abap/abap"],e,r)})});i({id:"apex",extensions:[".cls"],aliases:["Apex","apex"],mimetypes:["text/x-apex-source","text/x-apex"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/apex/apex"],e,r)})});i({id:"azcli",extensions:[".azcli"],aliases:["Azure CLI","azcli"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/azcli/azcli"],e,r)})});i({id:"bat",extensions:[".bat",".cmd"],aliases:["Batch","bat"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/bat/bat"],e,r)})});i({id:"bicep",extensions:[".bicep"],aliases:["Bicep"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/bicep/bicep"],e,r)})});i({id:"cameligo",extensions:[".mligo"],aliases:["Cameligo"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/cameligo/cameligo"],e,r)})});i({id:"clojure",extensions:[".clj",".cljs",".cljc",".edn"],aliases:["clojure","Clojure"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/clojure/clojure"],e,r)})});i({id:"coffeescript",extensions:[".coffee"],aliases:["CoffeeScript","coffeescript","coffee"],mimetypes:["text/x-coffeescript","text/coffeescript"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/coffee/coffee"],e,r)})});i({id:"c",extensions:[".c",".h"],aliases:["C","c"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/cpp/cpp"],e,r)})});i({id:"cpp",extensions:[".cpp",".cc",".cxx",".hpp",".hh",".hxx"],aliases:["C++","Cpp","cpp"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/cpp/cpp"],e,r)})});i({id:"csharp",extensions:[".cs",".csx",".cake"],aliases:["C#","csharp"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/csharp/csharp"],e,r)})});i({id:"csp",extensions:[".csp"],aliases:["CSP","csp"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/csp/csp"],e,r)})});i({id:"css",extensions:[".css"],aliases:["CSS","css"],mimetypes:["text/css"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/css/css"],e,r)})});i({id:"cypher",extensions:[".cypher",".cyp"],aliases:["Cypher","OpenCypher"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/cypher/cypher"],e,r)})});i({id:"dart",extensions:[".dart"],aliases:["Dart","dart"],mimetypes:["text/x-dart-source","text/x-dart"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/dart/dart"],e,r)})});i({id:"dockerfile",extensions:[".dockerfile"],filenames:["Dockerfile"],aliases:["Dockerfile"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/dockerfile/dockerfile"],e,r)})});i({id:"ecl",extensions:[".ecl"],aliases:["ECL","Ecl","ecl"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/ecl/ecl"],e,r)})});i({id:"elixir",extensions:[".ex",".exs"],aliases:["Elixir","elixir","ex"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/elixir/elixir"],e,r)})});i({id:"flow9",extensions:[".flow"],aliases:["Flow9","Flow","flow9","flow"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/flow9/flow9"],e,r)})});i({id:"fsharp",extensions:[".fs",".fsi",".ml",".mli",".fsx",".fsscript"],aliases:["F#","FSharp","fsharp"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/fsharp/fsharp"],e,r)})});i({id:"freemarker2",extensions:[".ftl",".ftlh",".ftlx"],aliases:["FreeMarker2","Apache FreeMarker2"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/freemarker2/freemarker2"],e,r)}).then(e=>e.TagAngleInterpolationDollar)});i({id:"freemarker2.tag-angle.interpolation-dollar",aliases:["FreeMarker2 (Angle/Dollar)","Apache FreeMarker2 (Angle/Dollar)"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/freemarker2/freemarker2"],e,r)}).then(e=>e.TagAngleInterpolationDollar)});i({id:"freemarker2.tag-bracket.interpolation-dollar",aliases:["FreeMarker2 (Bracket/Dollar)","Apache FreeMarker2 (Bracket/Dollar)"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/freemarker2/freemarker2"],e,r)}).then(e=>e.TagBracketInterpolationDollar)});i({id:"freemarker2.tag-angle.interpolation-bracket",aliases:["FreeMarker2 (Angle/Bracket)","Apache FreeMarker2 (Angle/Bracket)"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/freemarker2/freemarker2"],e,r)}).then(e=>e.TagAngleInterpolationBracket)});i({id:"freemarker2.tag-bracket.interpolation-bracket",aliases:["FreeMarker2 (Bracket/Bracket)","Apache FreeMarker2 (Bracket/Bracket)"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/freemarker2/freemarker2"],e,r)}).then(e=>e.TagBracketInterpolationBracket)});i({id:"freemarker2.tag-auto.interpolation-dollar",aliases:["FreeMarker2 (Auto/Dollar)","Apache FreeMarker2 (Auto/Dollar)"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/freemarker2/freemarker2"],e,r)}).then(e=>e.TagAutoInterpolationDollar)});i({id:"freemarker2.tag-auto.interpolation-bracket",aliases:["FreeMarker2 (Auto/Bracket)","Apache FreeMarker2 (Auto/Bracket)"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/freemarker2/freemarker2"],e,r)}).then(e=>e.TagAutoInterpolationBracket)});i({id:"go",extensions:[".go"],aliases:["Go"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/go/go"],e,r)})});i({id:"graphql",extensions:[".graphql",".gql"],aliases:["GraphQL","graphql","gql"],mimetypes:["application/graphql"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/graphql/graphql"],e,r)})});i({id:"handlebars",extensions:[".handlebars",".hbs"],aliases:["Handlebars","handlebars","hbs"],mimetypes:["text/x-handlebars-template"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/handlebars/handlebars"],e,r)})});i({id:"hcl",extensions:[".tf",".tfvars",".hcl"],aliases:["Terraform","tf","HCL","hcl"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/hcl/hcl"],e,r)})});i({id:"html",extensions:[".html",".htm",".shtml",".xhtml",".mdoc",".jsp",".asp",".aspx",".jshtm"],aliases:["HTML","htm","html","xhtml"],mimetypes:["text/html","text/x-jshtm","text/template","text/ng-template"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/html/html"],e,r)})});i({id:"ini",extensions:[".ini",".properties",".gitconfig"],filenames:["config",".gitattributes",".gitconfig",".editorconfig"],aliases:["Ini","ini"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/ini/ini"],e,r)})});i({id:"java",extensions:[".java",".jav"],aliases:["Java","java"],mimetypes:["text/x-java-source","text/x-java"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/java/java"],e,r)})});i({id:"javascript",extensions:[".js",".es6",".jsx",".mjs",".cjs"],firstLine:"^#!.*\\bnode",filenames:["jakefile"],aliases:["JavaScript","javascript","js"],mimetypes:["text/javascript"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/javascript/javascript"],e,r)})});i({id:"julia",extensions:[".jl"],aliases:["julia","Julia"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/julia/julia"],e,r)})});i({id:"kotlin",extensions:[".kt",".kts"],aliases:["Kotlin","kotlin"],mimetypes:["text/x-kotlin-source","text/x-kotlin"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/kotlin/kotlin"],e,r)})});i({id:"less",extensions:[".less"],aliases:["Less","less"],mimetypes:["text/x-less","text/less"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/less/less"],e,r)})});i({id:"lexon",extensions:[".lex"],aliases:["Lexon"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/lexon/lexon"],e,r)})});i({id:"lua",extensions:[".lua"],aliases:["Lua","lua"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/lua/lua"],e,r)})});i({id:"liquid",extensions:[".liquid",".html.liquid"],aliases:["Liquid","liquid"],mimetypes:["application/liquid"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/liquid/liquid"],e,r)})});i({id:"m3",extensions:[".m3",".i3",".mg",".ig"],aliases:["Modula-3","Modula3","modula3","m3"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/m3/m3"],e,r)})});i({id:"markdown",extensions:[".md",".markdown",".mdown",".mkdn",".mkd",".mdwn",".mdtxt",".mdtext"],aliases:["Markdown","markdown"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/markdown/markdown"],e,r)})});i({id:"mdx",extensions:[".mdx"],aliases:["MDX","mdx"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/mdx/mdx"],e,r)})});i({id:"mips",extensions:[".s"],aliases:["MIPS","MIPS-V"],mimetypes:["text/x-mips","text/mips","text/plaintext"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/mips/mips"],e,r)})});i({id:"msdax",extensions:[".dax",".msdax"],aliases:["DAX","MSDAX"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/msdax/msdax"],e,r)})});i({id:"mysql",extensions:[],aliases:["MySQL","mysql"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/mysql/mysql"],e,r)})});i({id:"objective-c",extensions:[".m"],aliases:["Objective-C"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/objective-c/objective-c"],e,r)})});i({id:"pascal",extensions:[".pas",".p",".pp"],aliases:["Pascal","pas"],mimetypes:["text/x-pascal-source","text/x-pascal"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/pascal/pascal"],e,r)})});i({id:"pascaligo",extensions:[".ligo"],aliases:["Pascaligo","ligo"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/pascaligo/pascaligo"],e,r)})});i({id:"perl",extensions:[".pl",".pm"],aliases:["Perl","pl"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/perl/perl"],e,r)})});i({id:"pgsql",extensions:[],aliases:["PostgreSQL","postgres","pg","postgre"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/pgsql/pgsql"],e,r)})});i({id:"php",extensions:[".php",".php4",".php5",".phtml",".ctp"],aliases:["PHP","php"],mimetypes:["application/x-php"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/php/php"],e,r)})});i({id:"pla",extensions:[".pla"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/pla/pla"],e,r)})});i({id:"postiats",extensions:[".dats",".sats",".hats"],aliases:["ATS","ATS/Postiats"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/postiats/postiats"],e,r)})});i({id:"powerquery",extensions:[".pq",".pqm"],aliases:["PQ","M","Power Query","Power Query M"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/powerquery/powerquery"],e,r)})});i({id:"powershell",extensions:[".ps1",".psm1",".psd1"],aliases:["PowerShell","powershell","ps","ps1"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/powershell/powershell"],e,r)})});i({id:"proto",extensions:[".proto"],aliases:["protobuf","Protocol Buffers"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/protobuf/protobuf"],e,r)})});i({id:"pug",extensions:[".jade",".pug"],aliases:["Pug","Jade","jade"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/pug/pug"],e,r)})});i({id:"python",extensions:[".py",".rpy",".pyw",".cpy",".gyp",".gypi"],aliases:["Python","py"],firstLine:"^#!/.*\\bpython[0-9.-]*\\b",loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/python/python"],e,r)})});i({id:"qsharp",extensions:[".qs"],aliases:["Q#","qsharp"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/qsharp/qsharp"],e,r)})});i({id:"r",extensions:[".r",".rhistory",".rmd",".rprofile",".rt"],aliases:["R","r"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/r/r"],e,r)})});i({id:"razor",extensions:[".cshtml"],aliases:["Razor","razor"],mimetypes:["text/x-cshtml"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/razor/razor"],e,r)})});i({id:"redis",extensions:[".redis"],aliases:["redis"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/redis/redis"],e,r)})});i({id:"redshift",extensions:[],aliases:["Redshift","redshift"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/redshift/redshift"],e,r)})});i({id:"restructuredtext",extensions:[".rst"],aliases:["reStructuredText","restructuredtext"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/restructuredtext/restructuredtext"],e,r)})});i({id:"ruby",extensions:[".rb",".rbx",".rjs",".gemspec",".pp"],filenames:["rakefile","Gemfile"],aliases:["Ruby","rb"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/ruby/ruby"],e,r)})});i({id:"rust",extensions:[".rs",".rlib"],aliases:["Rust","rust"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/rust/rust"],e,r)})});i({id:"sb",extensions:[".sb"],aliases:["Small Basic","sb"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/sb/sb"],e,r)})});i({id:"scala",extensions:[".scala",".sc",".sbt"],aliases:["Scala","scala","SBT","Sbt","sbt","Dotty","dotty"],mimetypes:["text/x-scala-source","text/x-scala","text/x-sbt","text/x-dotty"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/scala/scala"],e,r)})});i({id:"scheme",extensions:[".scm",".ss",".sch",".rkt"],aliases:["scheme","Scheme"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/scheme/scheme"],e,r)})});i({id:"scss",extensions:[".scss"],aliases:["Sass","sass","scss"],mimetypes:["text/x-scss","text/scss"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/scss/scss"],e,r)})});i({id:"shell",extensions:[".sh",".bash"],aliases:["Shell","sh"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/shell/shell"],e,r)})});i({id:"sol",extensions:[".sol"],aliases:["sol","solidity","Solidity"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/solidity/solidity"],e,r)})});i({id:"aes",extensions:[".aes"],aliases:["aes","sophia","Sophia"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/sophia/sophia"],e,r)})});i({id:"sparql",extensions:[".rq"],aliases:["sparql","SPARQL"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/sparql/sparql"],e,r)})});i({id:"sql",extensions:[".sql"],aliases:["SQL"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/sql/sql"],e,r)})});i({id:"st",extensions:[".st",".iecst",".iecplc",".lc3lib",".TcPOU",".TcDUT",".TcGVL",".TcIO"],aliases:["StructuredText","scl","stl"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/st/st"],e,r)})});i({id:"swift",aliases:["Swift","swift"],extensions:[".swift"],mimetypes:["text/swift"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/swift/swift"],e,r)})});i({id:"systemverilog",extensions:[".sv",".svh"],aliases:["SV","sv","SystemVerilog","systemverilog"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/systemverilog/systemverilog"],e,r)})});i({id:"verilog",extensions:[".v",".vh"],aliases:["V","v","Verilog","verilog"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/systemverilog/systemverilog"],e,r)})});i({id:"tcl",extensions:[".tcl"],aliases:["tcl","Tcl","tcltk","TclTk","tcl/tk","Tcl/Tk"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/tcl/tcl"],e,r)})});i({id:"twig",extensions:[".twig"],aliases:["Twig","twig"],mimetypes:["text/x-twig"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/twig/twig"],e,r)})});i({id:"typescript",extensions:[".ts",".tsx",".cts",".mts"],aliases:["TypeScript","ts","typescript"],mimetypes:["text/typescript"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/typescript/typescript"],e,r)})});i({id:"typespec",extensions:[".tsp"],aliases:["TypeSpec"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/typespec/typespec"],e,r)})});i({id:"vb",extensions:[".vb"],aliases:["Visual Basic","vb"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/vb/vb"],e,r)})});i({id:"wgsl",extensions:[".wgsl"],aliases:["WebGPU Shading Language","WGSL","wgsl"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/wgsl/wgsl"],e,r)})});i({id:"xml",extensions:[".xml",".xsd",".dtd",".ascx",".csproj",".config",".props",".targets",".wxi",".wxl",".wxs",".xaml",".svg",".svgz",".opf",".xslt",".xsl"],firstLine:"(\\<\\?xml.*)|(\\new Promise((e,r)=>{a(["vs/basic-languages/xml/xml"],e,r)})});i({id:"yaml",extensions:[".yaml",".yml"],aliases:["YAML","yaml","YML","yml"],mimetypes:["application/x-yaml","text/x-yaml"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/yaml/yaml"],e,r)})});})(); -return moduleExports; -}); - -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/language/css/monaco.contribution", ["require","require","vs/editor/editor.api"],(require)=>{ -"use strict";var moduleExports=(()=>{var C=Object.create;var g=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty;var l=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,r)=>(typeof require<"u"?require:n)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var I=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports),M=(e,n)=>{for(var r in n)g(e,r,{get:n[r],enumerable:!0})},s=(e,n,r,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of b(n))!h.call(e,t)&&t!==r&&g(e,t,{get:()=>n[t],enumerable:!(a=S(n,t))||a.enumerable});return e},y=(e,n,r)=>(s(e,n,"default"),r&&s(r,n,"default")),w=(e,n,r)=>(r=e!=null?C(x(e)):{},s(n||!e||!e.__esModule?g(r,"default",{value:e,enumerable:!0}):r,e)),P=e=>s(g({},"__esModule",{value:!0}),e);var v=I((k,D)=>{var O=w(l("vs/editor/editor.api"));D.exports=O});var R={};M(R,{cssDefaults:()=>p,lessDefaults:()=>f,scssDefaults:()=>c});var o={};y(o,w(v()));var i=class{constructor(n,r,a){this._onDidChange=new o.Emitter;this._languageId=n,this.setOptions(r),this.setModeConfiguration(a)}get onDidChange(){return this._onDidChange.event}get languageId(){return this._languageId}get modeConfiguration(){return this._modeConfiguration}get diagnosticsOptions(){return this.options}get options(){return this._options}setOptions(n){this._options=n||Object.create(null),this._onDidChange.fire(this)}setDiagnosticsOptions(n){this.setOptions(n)}setModeConfiguration(n){this._modeConfiguration=n||Object.create(null),this._onDidChange.fire(this)}},d={validate:!0,lint:{compatibleVendorPrefixes:"ignore",vendorPrefix:"warning",duplicateProperties:"warning",emptyRules:"warning",importStatement:"ignore",boxModel:"ignore",universalSelector:"ignore",zeroUnits:"ignore",fontFaceProperties:"warning",hexColorLength:"error",argumentsInColorFunction:"error",unknownProperties:"warning",ieHack:"ignore",unknownVendorSpecificProperties:"ignore",propertyIgnoredDueToDisplay:"warning",important:"ignore",float:"ignore",idSelector:"ignore"},data:{useDefaultDataProvider:!0},format:{newlineBetweenSelectors:!0,newlineBetweenRules:!0,spaceAroundSelectorSeparator:!1,braceStyle:"collapse",maxPreserveNewLines:void 0,preserveNewLines:!0}},u={completionItems:!0,hovers:!0,documentSymbols:!0,definitions:!0,references:!0,documentHighlights:!0,rename:!0,colors:!0,foldingRanges:!0,diagnostics:!0,selectionRanges:!0,documentFormattingEdits:!0,documentRangeFormattingEdits:!0},p=new i("css",d,u),c=new i("scss",d,u),f=new i("less",d,u);o.languages.css={cssDefaults:p,lessDefaults:f,scssDefaults:c};function m(){return new Promise((e,n)=>{l(["vs/language/css/cssMode"],e,n)})}o.languages.onLanguage("less",()=>{m().then(e=>e.setupMode(f))});o.languages.onLanguage("scss",()=>{m().then(e=>e.setupMode(c))});o.languages.onLanguage("css",()=>{m().then(e=>e.setupMode(p))});return P(R);})(); -return moduleExports; -}); - -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/language/html/monaco.contribution", ["require","require","vs/editor/editor.api"],(require)=>{ -"use strict";var moduleExports=(()=>{var w=Object.create;var l=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var H=Object.getOwnPropertyNames;var O=Object.getPrototypeOf,_=Object.prototype.hasOwnProperty;var f=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,t)=>(typeof require<"u"?require:n)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var k=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports),T=(e,n)=>{for(var t in n)l(e,t,{get:n[t],enumerable:!0})},d=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of H(n))!_.call(e,o)&&o!==t&&l(e,o,{get:()=>n[o],enumerable:!(r=R(n,o))||r.enumerable});return e},b=(e,n,t)=>(d(e,n,"default"),t&&d(t,n,"default")),v=(e,n,t)=>(t=e!=null?w(O(e)):{},d(n||!e||!e.__esModule?l(t,"default",{value:e,enumerable:!0}):t,e)),A=e=>d(l({},"__esModule",{value:!0}),e);var C=k((z,h)=>{var E=v(f("vs/editor/editor.api"));h.exports=E});var V={};T(V,{handlebarDefaults:()=>M,handlebarLanguageService:()=>m,htmlDefaults:()=>x,htmlLanguageService:()=>c,razorDefaults:()=>I,razorLanguageService:()=>y,registerHTMLLanguageService:()=>s});var a={};b(a,v(C()));var p=class{constructor(n,t,r){this._onDidChange=new a.Emitter;this._languageId=n,this.setOptions(t),this.setModeConfiguration(r)}get onDidChange(){return this._onDidChange.event}get languageId(){return this._languageId}get options(){return this._options}get modeConfiguration(){return this._modeConfiguration}setOptions(n){this._options=n||Object.create(null),this._onDidChange.fire(this)}setModeConfiguration(n){this._modeConfiguration=n||Object.create(null),this._onDidChange.fire(this)}},F={tabSize:4,insertSpaces:!1,wrapLineLength:120,unformatted:'default": "a, abbr, acronym, b, bdo, big, br, button, cite, code, dfn, em, i, img, input, kbd, label, map, object, q, samp, select, small, span, strong, sub, sup, textarea, tt, var',contentUnformatted:"pre",indentInnerHtml:!1,preserveNewLines:!0,maxPreserveNewLines:void 0,indentHandlebars:!1,endWithNewline:!1,extraLiners:"head, body, /html",wrapAttributes:"auto"},u={format:F,suggest:{},data:{useDefaultDataProvider:!0}};function g(e){return{completionItems:!0,hovers:!0,documentSymbols:!0,links:!0,documentHighlights:!0,rename:!0,colors:!0,foldingRanges:!0,selectionRanges:!0,diagnostics:e===i,documentFormattingEdits:e===i,documentRangeFormattingEdits:e===i}}var i="html",D="handlebars",L="razor",c=s(i,u,g(i)),x=c.defaults,m=s(D,u,g(D)),M=m.defaults,y=s(L,u,g(L)),I=y.defaults;a.languages.html={htmlDefaults:x,razorDefaults:I,handlebarDefaults:M,htmlLanguageService:c,handlebarLanguageService:m,razorLanguageService:y,registerHTMLLanguageService:s};function P(){return new Promise((e,n)=>{f(["vs/language/html/htmlMode"],e,n)})}function s(e,n=u,t=g(e)){let r=new p(e,n,t),o,S=a.languages.onLanguage(e,async()=>{o=(await P()).setupMode(r)});return{defaults:r,dispose(){S.dispose(),o?.dispose(),o=void 0}}}return A(V);})(); -return moduleExports; -}); - -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/language/json/monaco.contribution", ["require","require","vs/editor/editor.api"],(require)=>{ -"use strict";var moduleExports=(()=>{var f=Object.create;var s=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var b=Object.getPrototypeOf,O=Object.prototype.hasOwnProperty;var d=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,o)=>(typeof require<"u"?require:n)[o]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var v=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports),x=(e,n)=>{for(var o in n)s(e,o,{get:n[o],enumerable:!0})},i=(e,n,o,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of N(n))!O.call(e,r)&&r!==o&&s(e,r,{get:()=>n[r],enumerable:!(a=h(n,r))||a.enumerable});return e},g=(e,n,o)=>(i(e,n,"default"),o&&i(o,n,"default")),c=(e,n,o)=>(o=e!=null?f(b(e)):{},i(n||!e||!e.__esModule?s(o,"default",{value:e,enumerable:!0}):o,e)),A=e=>i(s({},"__esModule",{value:!0}),e);var S=v((R,u)=>{var T=c(d("vs/editor/editor.api"));u.exports=T});var M={};x(M,{getWorker:()=>p,jsonDefaults:()=>m});var t={};g(t,c(S()));var l=class{constructor(n,o,a){this._onDidChange=new t.Emitter;this._languageId=n,this.setDiagnosticsOptions(o),this.setModeConfiguration(a)}get onDidChange(){return this._onDidChange.event}get languageId(){return this._languageId}get modeConfiguration(){return this._modeConfiguration}get diagnosticsOptions(){return this._diagnosticsOptions}setDiagnosticsOptions(n){this._diagnosticsOptions=n||Object.create(null),this._onDidChange.fire(this)}setModeConfiguration(n){this._modeConfiguration=n||Object.create(null),this._onDidChange.fire(this)}},D={validate:!0,allowComments:!0,schemas:[],enableSchemaRequest:!1,schemaRequest:"warning",schemaValidation:"warning",comments:"error",trailingCommas:"error"},C={documentFormattingEdits:!0,documentRangeFormattingEdits:!0,completionItems:!0,hovers:!0,documentSymbols:!0,tokens:!0,colors:!0,foldingRanges:!0,diagnostics:!0,selectionRanges:!0},m=new l("json",D,C),p=()=>y().then(e=>e.getWorker());t.languages.json={jsonDefaults:m,getWorker:p};function y(){return new Promise((e,n)=>{d(["vs/language/json/jsonMode"],e,n)})}t.languages.register({id:"json",extensions:[".json",".bowerrc",".jshintrc",".jscsrc",".eslintrc",".babelrc",".har"],aliases:["JSON","json"],mimetypes:["application/json"]});t.languages.onLanguage("json",()=>{y().then(e=>e.setupMode(m))});return A(M);})(); -return moduleExports; -}); - -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/language/typescript/monaco.contribution", ["require","require","vs/editor/editor.api"],(require)=>{ -"use strict";var moduleExports=(()=>{var N=Object.create;var m=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var R=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var c=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var w=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),A=(n,e)=>{for(var t in e)m(n,t,{get:e[t],enumerable:!0})},g=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of M(e))!F.call(n,r)&&r!==t&&m(n,r,{get:()=>e[r],enumerable:!(i=H(e,r))||i.enumerable});return n},v=(n,e,t)=>(g(n,e,"default"),t&&g(t,e,"default")),C=(n,e,t)=>(t=n!=null?N(R(n)):{},g(e||!n||!n.__esModule?m(t,"default",{value:n,enumerable:!0}):t,n)),W=n=>g(m({},"__esModule",{value:!0}),n);var _=w((B,L)=>{var V=C(c("vs/editor/editor.api"));L.exports=V});var T={};A(T,{JsxEmit:()=>f,ModuleKind:()=>b,ModuleResolutionKind:()=>O,NewLineKind:()=>y,ScriptTarget:()=>h,getJavaScriptWorker:()=>k,getTypeScriptWorker:()=>P,javascriptDefaults:()=>D,typescriptDefaults:()=>x,typescriptVersion:()=>I});var E="5.4.5";var l={};v(l,C(_()));var b=(s=>(s[s.None=0]="None",s[s.CommonJS=1]="CommonJS",s[s.AMD=2]="AMD",s[s.UMD=3]="UMD",s[s.System=4]="System",s[s.ES2015=5]="ES2015",s[s.ESNext=99]="ESNext",s))(b||{}),f=(a=>(a[a.None=0]="None",a[a.Preserve=1]="Preserve",a[a.React=2]="React",a[a.ReactNative=3]="ReactNative",a[a.ReactJSX=4]="ReactJSX",a[a.ReactJSXDev=5]="ReactJSXDev",a))(f||{}),y=(t=>(t[t.CarriageReturnLineFeed=0]="CarriageReturnLineFeed",t[t.LineFeed=1]="LineFeed",t))(y||{}),h=(o=>(o[o.ES3=0]="ES3",o[o.ES5=1]="ES5",o[o.ES2015=2]="ES2015",o[o.ES2016=3]="ES2016",o[o.ES2017=4]="ES2017",o[o.ES2018=5]="ES2018",o[o.ES2019=6]="ES2019",o[o.ES2020=7]="ES2020",o[o.ESNext=99]="ESNext",o[o.JSON=100]="JSON",o[o.Latest=99]="Latest",o))(h||{}),O=(t=>(t[t.Classic=1]="Classic",t[t.NodeJs=2]="NodeJs",t))(O||{}),d=class{constructor(e,t,i,r,p){this._onDidChange=new l.Emitter;this._onDidExtraLibsChange=new l.Emitter;this._extraLibs=Object.create(null),this._removedExtraLibs=Object.create(null),this._eagerModelSync=!1,this.setCompilerOptions(e),this.setDiagnosticsOptions(t),this.setWorkerOptions(i),this.setInlayHintsOptions(r),this.setModeConfiguration(p),this._onDidExtraLibsChangeTimeout=-1}get onDidChange(){return this._onDidChange.event}get onDidExtraLibsChange(){return this._onDidExtraLibsChange.event}get modeConfiguration(){return this._modeConfiguration}get workerOptions(){return this._workerOptions}get inlayHintsOptions(){return this._inlayHintsOptions}getExtraLibs(){return this._extraLibs}addExtraLib(e,t){let i;if(typeof t>"u"?i=`ts:extralib-${Math.random().toString(36).substring(2,15)}`:i=t,this._extraLibs[i]&&this._extraLibs[i].content===e)return{dispose:()=>{}};let r=1;return this._removedExtraLibs[i]&&(r=this._removedExtraLibs[i]+1),this._extraLibs[i]&&(r=this._extraLibs[i].version+1),this._extraLibs[i]={content:e,version:r},this._fireOnDidExtraLibsChangeSoon(),{dispose:()=>{let p=this._extraLibs[i];p&&p.version===r&&(delete this._extraLibs[i],this._removedExtraLibs[i]=r,this._fireOnDidExtraLibsChangeSoon())}}}setExtraLibs(e){for(let t in this._extraLibs)this._removedExtraLibs[t]=this._extraLibs[t].version;if(this._extraLibs=Object.create(null),e&&e.length>0)for(let t of e){let i=t.filePath||`ts:extralib-${Math.random().toString(36).substring(2,15)}`,r=t.content,p=1;this._removedExtraLibs[i]&&(p=this._removedExtraLibs[i]+1),this._extraLibs[i]={content:r,version:p}}this._fireOnDidExtraLibsChangeSoon()}_fireOnDidExtraLibsChangeSoon(){this._onDidExtraLibsChangeTimeout===-1&&(this._onDidExtraLibsChangeTimeout=window.setTimeout(()=>{this._onDidExtraLibsChangeTimeout=-1,this._onDidExtraLibsChange.fire(void 0)},0))}getCompilerOptions(){return this._compilerOptions}setCompilerOptions(e){this._compilerOptions=e||Object.create(null),this._onDidChange.fire(void 0)}getDiagnosticsOptions(){return this._diagnosticsOptions}setDiagnosticsOptions(e){this._diagnosticsOptions=e||Object.create(null),this._onDidChange.fire(void 0)}setWorkerOptions(e){this._workerOptions=e||Object.create(null),this._onDidChange.fire(void 0)}setInlayHintsOptions(e){this._inlayHintsOptions=e||Object.create(null),this._onDidChange.fire(void 0)}setMaximumWorkerIdleTime(e){}setEagerModelSync(e){this._eagerModelSync=e}getEagerModelSync(){return this._eagerModelSync}setModeConfiguration(e){this._modeConfiguration=e||Object.create(null),this._onDidChange.fire(void 0)}},I=E,S={completionItems:!0,hovers:!0,documentSymbols:!0,definitions:!0,references:!0,documentHighlights:!0,rename:!0,diagnostics:!0,documentRangeFormattingEdits:!0,signatureHelp:!0,onTypeFormattingEdits:!0,codeActions:!0,inlayHints:!0},x=new d({allowNonTsExtensions:!0,target:99},{noSemanticValidation:!1,noSyntaxValidation:!1,onlyVisible:!1},{},{},S),D=new d({allowNonTsExtensions:!0,allowJs:!0,target:99},{noSemanticValidation:!0,noSyntaxValidation:!1,onlyVisible:!1},{},{},S),P=()=>u().then(n=>n.getTypeScriptWorker()),k=()=>u().then(n=>n.getJavaScriptWorker());l.languages.typescript={ModuleKind:b,JsxEmit:f,NewLineKind:y,ScriptTarget:h,ModuleResolutionKind:O,typescriptVersion:I,typescriptDefaults:x,javascriptDefaults:D,getTypeScriptWorker:P,getJavaScriptWorker:k};function u(){return new Promise((n,e)=>{c(["vs/language/typescript/tsMode"],n,e)})}l.languages.onLanguage("typescript",()=>u().then(n=>n.setupTypeScript(x)));l.languages.onLanguage("javascript",()=>u().then(n=>n.setupJavaScript(D)));return W(T);})(); -return moduleExports; -}); - -define("vs/editor/editor.main", ["vs/editor/edcore.main","vs/basic-languages/monaco.contribution","vs/language/css/monaco.contribution","vs/language/html/monaco.contribution","vs/language/json/monaco.contribution","vs/language/typescript/monaco.contribution"], function(api) { return api; }); -//# sourceMappingURL=../../../min-maps/vs/editor/editor.main.js.map \ No newline at end of file diff --git a/public/js/monaco-editor-0.52.2/min/vs/language/css/cssMode.js b/public/js/monaco-editor-0.52.2/min/vs/language/css/cssMode.js deleted file mode 100644 index 8e46120c73..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/language/css/cssMode.js +++ /dev/null @@ -1,13 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/language/css/cssMode", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var Tt=Object.create;var X=Object.defineProperty;var _t=Object.getOwnPropertyDescriptor;var Ct=Object.getOwnPropertyNames;var bt=Object.getPrototypeOf,wt=Object.prototype.hasOwnProperty;var Et=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,i)=>(typeof require<"u"?require:n)[i]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var Rt=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports),Pt=(e,n)=>{for(var i in n)X(e,i,{get:n[i],enumerable:!0})},z=(e,n,i,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of Ct(n))!wt.call(e,t)&&t!==i&&X(e,t,{get:()=>n[t],enumerable:!(r=_t(n,t))||r.enumerable});return e},he=(e,n,i)=>(z(e,n,"default"),i&&z(i,n,"default")),me=(e,n,i)=>(i=e!=null?Tt(bt(e)):{},z(n||!e||!e.__esModule?X(i,"default",{value:e,enumerable:!0}):i,e)),Lt=e=>z(X({},"__esModule",{value:!0}),e);var ye=Rt((Qt,xe)=>{var Wt=me(Et("vs/editor/editor.api"));xe.exports=Wt});var Bt={};Pt(Bt,{CompletionAdapter:()=>D,DefinitionAdapter:()=>A,DiagnosticsAdapter:()=>W,DocumentColorAdapter:()=>N,DocumentFormattingEditProvider:()=>U,DocumentHighlightAdapter:()=>F,DocumentLinkAdapter:()=>fe,DocumentRangeFormattingEditProvider:()=>H,DocumentSymbolAdapter:()=>j,FoldingRangeAdapter:()=>O,HoverAdapter:()=>S,ReferenceAdapter:()=>M,RenameAdapter:()=>K,SelectionRangeAdapter:()=>V,WorkerManager:()=>_,fromPosition:()=>k,fromRange:()=>pe,setupMode:()=>$t,toRange:()=>y,toTextEdit:()=>P});var d={};he(d,me(ye()));var Dt=2*60*1e3,_=class{constructor(n){this._defaults=n,this._worker=null,this._client=null,this._idleCheckInterval=window.setInterval(()=>this._checkIfIdle(),30*1e3),this._lastUsedTime=0,this._configChangeListener=this._defaults.onDidChange(()=>this._stopWorker())}_stopWorker(){this._worker&&(this._worker.dispose(),this._worker=null),this._client=null}dispose(){clearInterval(this._idleCheckInterval),this._configChangeListener.dispose(),this._stopWorker()}_checkIfIdle(){if(!this._worker)return;Date.now()-this._lastUsedTime>Dt&&this._stopWorker()}_getClient(){return this._lastUsedTime=Date.now(),this._client||(this._worker=d.editor.createWebWorker({moduleId:"vs/language/css/cssWorker",label:this._defaults.languageId,createData:{options:this._defaults.options,languageId:this._defaults.languageId}}),this._client=this._worker.getProxy()),this._client}getLanguageServiceWorker(...n){let i;return this._getClient().then(r=>{i=r}).then(r=>{if(this._worker)return this._worker.withSyncedResources(n)}).then(r=>i)}};var ve;(function(e){function n(i){return typeof i=="string"}e.is=n})(ve||(ve={}));var Z;(function(e){function n(i){return typeof i=="string"}e.is=n})(Z||(Z={}));var Ie;(function(e){e.MIN_VALUE=-2147483648,e.MAX_VALUE=2147483647;function n(i){return typeof i=="number"&&e.MIN_VALUE<=i&&i<=e.MAX_VALUE}e.is=n})(Ie||(Ie={}));var $;(function(e){e.MIN_VALUE=0,e.MAX_VALUE=2147483647;function n(i){return typeof i=="number"&&e.MIN_VALUE<=i&&i<=e.MAX_VALUE}e.is=n})($||($={}));var I;(function(e){function n(r,t){return r===Number.MAX_VALUE&&(r=$.MAX_VALUE),t===Number.MAX_VALUE&&(t=$.MAX_VALUE),{line:r,character:t}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&a.uinteger(t.line)&&a.uinteger(t.character)}e.is=i})(I||(I={}));var h;(function(e){function n(r,t,o,s){if(a.uinteger(r)&&a.uinteger(t)&&a.uinteger(o)&&a.uinteger(s))return{start:I.create(r,t),end:I.create(o,s)};if(I.is(r)&&I.is(t))return{start:r,end:t};throw new Error(`Range#create called with invalid arguments[${r}, ${t}, ${o}, ${s}]`)}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&I.is(t.start)&&I.is(t.end)}e.is=i})(h||(h={}));var B;(function(e){function n(r,t){return{uri:r,range:t}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&h.is(t.range)&&(a.string(t.uri)||a.undefined(t.uri))}e.is=i})(B||(B={}));var ke;(function(e){function n(r,t,o,s){return{targetUri:r,targetRange:t,targetSelectionRange:o,originSelectionRange:s}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&h.is(t.targetRange)&&a.string(t.targetUri)&&h.is(t.targetSelectionRange)&&(h.is(t.originSelectionRange)||a.undefined(t.originSelectionRange))}e.is=i})(ke||(ke={}));var ee;(function(e){function n(r,t,o,s){return{red:r,green:t,blue:o,alpha:s}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&a.numberRange(t.red,0,1)&&a.numberRange(t.green,0,1)&&a.numberRange(t.blue,0,1)&&a.numberRange(t.alpha,0,1)}e.is=i})(ee||(ee={}));var Te;(function(e){function n(r,t){return{range:r,color:t}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&h.is(t.range)&&ee.is(t.color)}e.is=i})(Te||(Te={}));var _e;(function(e){function n(r,t,o){return{label:r,textEdit:t,additionalTextEdits:o}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&a.string(t.label)&&(a.undefined(t.textEdit)||w.is(t))&&(a.undefined(t.additionalTextEdits)||a.typedArray(t.additionalTextEdits,w.is))}e.is=i})(_e||(_e={}));var C;(function(e){e.Comment="comment",e.Imports="imports",e.Region="region"})(C||(C={}));var Ce;(function(e){function n(r,t,o,s,u,g){let f={startLine:r,endLine:t};return a.defined(o)&&(f.startCharacter=o),a.defined(s)&&(f.endCharacter=s),a.defined(u)&&(f.kind=u),a.defined(g)&&(f.collapsedText=g),f}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&a.uinteger(t.startLine)&&a.uinteger(t.startLine)&&(a.undefined(t.startCharacter)||a.uinteger(t.startCharacter))&&(a.undefined(t.endCharacter)||a.uinteger(t.endCharacter))&&(a.undefined(t.kind)||a.string(t.kind))}e.is=i})(Ce||(Ce={}));var te;(function(e){function n(r,t){return{location:r,message:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&B.is(t.location)&&a.string(t.message)}e.is=i})(te||(te={}));var T;(function(e){e.Error=1,e.Warning=2,e.Information=3,e.Hint=4})(T||(T={}));var be;(function(e){e.Unnecessary=1,e.Deprecated=2})(be||(be={}));var we;(function(e){function n(i){let r=i;return a.objectLiteral(r)&&a.string(r.href)}e.is=n})(we||(we={}));var q;(function(e){function n(r,t,o,s,u,g){let f={range:r,message:t};return a.defined(o)&&(f.severity=o),a.defined(s)&&(f.code=s),a.defined(u)&&(f.source=u),a.defined(g)&&(f.relatedInformation=g),f}e.create=n;function i(r){var t;let o=r;return a.defined(o)&&h.is(o.range)&&a.string(o.message)&&(a.number(o.severity)||a.undefined(o.severity))&&(a.integer(o.code)||a.string(o.code)||a.undefined(o.code))&&(a.undefined(o.codeDescription)||a.string((t=o.codeDescription)===null||t===void 0?void 0:t.href))&&(a.string(o.source)||a.undefined(o.source))&&(a.undefined(o.relatedInformation)||a.typedArray(o.relatedInformation,te.is))}e.is=i})(q||(q={}));var b;(function(e){function n(r,t,...o){let s={title:r,command:t};return a.defined(o)&&o.length>0&&(s.arguments=o),s}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.title)&&a.string(t.command)}e.is=i})(b||(b={}));var w;(function(e){function n(o,s){return{range:o,newText:s}}e.replace=n;function i(o,s){return{range:{start:o,end:o},newText:s}}e.insert=i;function r(o){return{range:o,newText:""}}e.del=r;function t(o){let s=o;return a.objectLiteral(s)&&a.string(s.newText)&&h.is(s.range)}e.is=t})(w||(w={}));var ne;(function(e){function n(r,t,o){let s={label:r};return t!==void 0&&(s.needsConfirmation=t),o!==void 0&&(s.description=o),s}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&a.string(t.label)&&(a.boolean(t.needsConfirmation)||t.needsConfirmation===void 0)&&(a.string(t.description)||t.description===void 0)}e.is=i})(ne||(ne={}));var E;(function(e){function n(i){let r=i;return a.string(r)}e.is=n})(E||(E={}));var Ee;(function(e){function n(o,s,u){return{range:o,newText:s,annotationId:u}}e.replace=n;function i(o,s,u){return{range:{start:o,end:o},newText:s,annotationId:u}}e.insert=i;function r(o,s){return{range:o,newText:"",annotationId:s}}e.del=r;function t(o){let s=o;return w.is(s)&&(ne.is(s.annotationId)||E.is(s.annotationId))}e.is=t})(Ee||(Ee={}));var re;(function(e){function n(r,t){return{textDocument:r,edits:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&ue.is(t.textDocument)&&Array.isArray(t.edits)}e.is=i})(re||(re={}));var ie;(function(e){function n(r,t,o){let s={kind:"create",uri:r};return t!==void 0&&(t.overwrite!==void 0||t.ignoreIfExists!==void 0)&&(s.options=t),o!==void 0&&(s.annotationId=o),s}e.create=n;function i(r){let t=r;return t&&t.kind==="create"&&a.string(t.uri)&&(t.options===void 0||(t.options.overwrite===void 0||a.boolean(t.options.overwrite))&&(t.options.ignoreIfExists===void 0||a.boolean(t.options.ignoreIfExists)))&&(t.annotationId===void 0||E.is(t.annotationId))}e.is=i})(ie||(ie={}));var oe;(function(e){function n(r,t,o,s){let u={kind:"rename",oldUri:r,newUri:t};return o!==void 0&&(o.overwrite!==void 0||o.ignoreIfExists!==void 0)&&(u.options=o),s!==void 0&&(u.annotationId=s),u}e.create=n;function i(r){let t=r;return t&&t.kind==="rename"&&a.string(t.oldUri)&&a.string(t.newUri)&&(t.options===void 0||(t.options.overwrite===void 0||a.boolean(t.options.overwrite))&&(t.options.ignoreIfExists===void 0||a.boolean(t.options.ignoreIfExists)))&&(t.annotationId===void 0||E.is(t.annotationId))}e.is=i})(oe||(oe={}));var se;(function(e){function n(r,t,o){let s={kind:"delete",uri:r};return t!==void 0&&(t.recursive!==void 0||t.ignoreIfNotExists!==void 0)&&(s.options=t),o!==void 0&&(s.annotationId=o),s}e.create=n;function i(r){let t=r;return t&&t.kind==="delete"&&a.string(t.uri)&&(t.options===void 0||(t.options.recursive===void 0||a.boolean(t.options.recursive))&&(t.options.ignoreIfNotExists===void 0||a.boolean(t.options.ignoreIfNotExists)))&&(t.annotationId===void 0||E.is(t.annotationId))}e.is=i})(se||(se={}));var ae;(function(e){function n(i){let r=i;return r&&(r.changes!==void 0||r.documentChanges!==void 0)&&(r.documentChanges===void 0||r.documentChanges.every(t=>a.string(t.kind)?ie.is(t)||oe.is(t)||se.is(t):re.is(t)))}e.is=n})(ae||(ae={}));var Re;(function(e){function n(r){return{uri:r}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.uri)}e.is=i})(Re||(Re={}));var Pe;(function(e){function n(r,t){return{uri:r,version:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.uri)&&a.integer(t.version)}e.is=i})(Pe||(Pe={}));var ue;(function(e){function n(r,t){return{uri:r,version:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.uri)&&(t.version===null||a.integer(t.version))}e.is=i})(ue||(ue={}));var Le;(function(e){function n(r,t,o,s){return{uri:r,languageId:t,version:o,text:s}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.uri)&&a.string(t.languageId)&&a.integer(t.version)&&a.string(t.text)}e.is=i})(Le||(Le={}));var de;(function(e){e.PlainText="plaintext",e.Markdown="markdown";function n(i){let r=i;return r===e.PlainText||r===e.Markdown}e.is=n})(de||(de={}));var L;(function(e){function n(i){let r=i;return a.objectLiteral(i)&&de.is(r.kind)&&a.string(r.value)}e.is=n})(L||(L={}));var m;(function(e){e.Text=1,e.Method=2,e.Function=3,e.Constructor=4,e.Field=5,e.Variable=6,e.Class=7,e.Interface=8,e.Module=9,e.Property=10,e.Unit=11,e.Value=12,e.Enum=13,e.Keyword=14,e.Snippet=15,e.Color=16,e.File=17,e.Reference=18,e.Folder=19,e.EnumMember=20,e.Constant=21,e.Struct=22,e.Event=23,e.Operator=24,e.TypeParameter=25})(m||(m={}));var Q;(function(e){e.PlainText=1,e.Snippet=2})(Q||(Q={}));var We;(function(e){e.Deprecated=1})(We||(We={}));var De;(function(e){function n(r,t,o){return{newText:r,insert:t,replace:o}}e.create=n;function i(r){let t=r;return t&&a.string(t.newText)&&h.is(t.insert)&&h.is(t.replace)}e.is=i})(De||(De={}));var Se;(function(e){e.asIs=1,e.adjustIndentation=2})(Se||(Se={}));var Fe;(function(e){function n(i){let r=i;return r&&(a.string(r.detail)||r.detail===void 0)&&(a.string(r.description)||r.description===void 0)}e.is=n})(Fe||(Fe={}));var Ae;(function(e){function n(i){return{label:i}}e.create=n})(Ae||(Ae={}));var Me;(function(e){function n(i,r){return{items:i||[],isIncomplete:!!r}}e.create=n})(Me||(Me={}));var G;(function(e){function n(r){return r.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}e.fromPlainText=n;function i(r){let t=r;return a.string(t)||a.objectLiteral(t)&&a.string(t.language)&&a.string(t.value)}e.is=i})(G||(G={}));var Ke;(function(e){function n(i){let r=i;return!!r&&a.objectLiteral(r)&&(L.is(r.contents)||G.is(r.contents)||a.typedArray(r.contents,G.is))&&(i.range===void 0||h.is(i.range))}e.is=n})(Ke||(Ke={}));var je;(function(e){function n(i,r){return r?{label:i,documentation:r}:{label:i}}e.create=n})(je||(je={}));var Ue;(function(e){function n(i,r,...t){let o={label:i};return a.defined(r)&&(o.documentation=r),a.defined(t)?o.parameters=t:o.parameters=[],o}e.create=n})(Ue||(Ue={}));var R;(function(e){e.Text=1,e.Read=2,e.Write=3})(R||(R={}));var He;(function(e){function n(i,r){let t={range:i};return a.number(r)&&(t.kind=r),t}e.create=n})(He||(He={}));var x;(function(e){e.File=1,e.Module=2,e.Namespace=3,e.Package=4,e.Class=5,e.Method=6,e.Property=7,e.Field=8,e.Constructor=9,e.Enum=10,e.Interface=11,e.Function=12,e.Variable=13,e.Constant=14,e.String=15,e.Number=16,e.Boolean=17,e.Array=18,e.Object=19,e.Key=20,e.Null=21,e.EnumMember=22,e.Struct=23,e.Event=24,e.Operator=25,e.TypeParameter=26})(x||(x={}));var Ne;(function(e){e.Deprecated=1})(Ne||(Ne={}));var Oe;(function(e){function n(i,r,t,o,s){let u={name:i,kind:r,location:{uri:o,range:t}};return s&&(u.containerName=s),u}e.create=n})(Oe||(Oe={}));var Ve;(function(e){function n(i,r,t,o){return o!==void 0?{name:i,kind:r,location:{uri:t,range:o}}:{name:i,kind:r,location:{uri:t}}}e.create=n})(Ve||(Ve={}));var ze;(function(e){function n(r,t,o,s,u,g){let f={name:r,detail:t,kind:o,range:s,selectionRange:u};return g!==void 0&&(f.children=g),f}e.create=n;function i(r){let t=r;return t&&a.string(t.name)&&a.number(t.kind)&&h.is(t.range)&&h.is(t.selectionRange)&&(t.detail===void 0||a.string(t.detail))&&(t.deprecated===void 0||a.boolean(t.deprecated))&&(t.children===void 0||Array.isArray(t.children))&&(t.tags===void 0||Array.isArray(t.tags))}e.is=i})(ze||(ze={}));var Xe;(function(e){e.Empty="",e.QuickFix="quickfix",e.Refactor="refactor",e.RefactorExtract="refactor.extract",e.RefactorInline="refactor.inline",e.RefactorRewrite="refactor.rewrite",e.Source="source",e.SourceOrganizeImports="source.organizeImports",e.SourceFixAll="source.fixAll"})(Xe||(Xe={}));var J;(function(e){e.Invoked=1,e.Automatic=2})(J||(J={}));var $e;(function(e){function n(r,t,o){let s={diagnostics:r};return t!=null&&(s.only=t),o!=null&&(s.triggerKind=o),s}e.create=n;function i(r){let t=r;return a.defined(t)&&a.typedArray(t.diagnostics,q.is)&&(t.only===void 0||a.typedArray(t.only,a.string))&&(t.triggerKind===void 0||t.triggerKind===J.Invoked||t.triggerKind===J.Automatic)}e.is=i})($e||($e={}));var Be;(function(e){function n(r,t,o){let s={title:r},u=!0;return typeof t=="string"?(u=!1,s.kind=t):b.is(t)?s.command=t:s.edit=t,u&&o!==void 0&&(s.kind=o),s}e.create=n;function i(r){let t=r;return t&&a.string(t.title)&&(t.diagnostics===void 0||a.typedArray(t.diagnostics,q.is))&&(t.kind===void 0||a.string(t.kind))&&(t.edit!==void 0||t.command!==void 0)&&(t.command===void 0||b.is(t.command))&&(t.isPreferred===void 0||a.boolean(t.isPreferred))&&(t.edit===void 0||ae.is(t.edit))}e.is=i})(Be||(Be={}));var qe;(function(e){function n(r,t){let o={range:r};return a.defined(t)&&(o.data=t),o}e.create=n;function i(r){let t=r;return a.defined(t)&&h.is(t.range)&&(a.undefined(t.command)||b.is(t.command))}e.is=i})(qe||(qe={}));var Qe;(function(e){function n(r,t){return{tabSize:r,insertSpaces:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.uinteger(t.tabSize)&&a.boolean(t.insertSpaces)}e.is=i})(Qe||(Qe={}));var Ge;(function(e){function n(r,t,o){return{range:r,target:t,data:o}}e.create=n;function i(r){let t=r;return a.defined(t)&&h.is(t.range)&&(a.undefined(t.target)||a.string(t.target))}e.is=i})(Ge||(Ge={}));var Je;(function(e){function n(r,t){return{range:r,parent:t}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&h.is(t.range)&&(t.parent===void 0||e.is(t.parent))}e.is=i})(Je||(Je={}));var Ye;(function(e){e.namespace="namespace",e.type="type",e.class="class",e.enum="enum",e.interface="interface",e.struct="struct",e.typeParameter="typeParameter",e.parameter="parameter",e.variable="variable",e.property="property",e.enumMember="enumMember",e.event="event",e.function="function",e.method="method",e.macro="macro",e.keyword="keyword",e.modifier="modifier",e.comment="comment",e.string="string",e.number="number",e.regexp="regexp",e.operator="operator",e.decorator="decorator"})(Ye||(Ye={}));var Ze;(function(e){e.declaration="declaration",e.definition="definition",e.readonly="readonly",e.static="static",e.deprecated="deprecated",e.abstract="abstract",e.async="async",e.modification="modification",e.documentation="documentation",e.defaultLibrary="defaultLibrary"})(Ze||(Ze={}));var et;(function(e){function n(i){let r=i;return a.objectLiteral(r)&&(r.resultId===void 0||typeof r.resultId=="string")&&Array.isArray(r.data)&&(r.data.length===0||typeof r.data[0]=="number")}e.is=n})(et||(et={}));var tt;(function(e){function n(r,t){return{range:r,text:t}}e.create=n;function i(r){let t=r;return t!=null&&h.is(t.range)&&a.string(t.text)}e.is=i})(tt||(tt={}));var nt;(function(e){function n(r,t,o){return{range:r,variableName:t,caseSensitiveLookup:o}}e.create=n;function i(r){let t=r;return t!=null&&h.is(t.range)&&a.boolean(t.caseSensitiveLookup)&&(a.string(t.variableName)||t.variableName===void 0)}e.is=i})(nt||(nt={}));var rt;(function(e){function n(r,t){return{range:r,expression:t}}e.create=n;function i(r){let t=r;return t!=null&&h.is(t.range)&&(a.string(t.expression)||t.expression===void 0)}e.is=i})(rt||(rt={}));var it;(function(e){function n(r,t){return{frameId:r,stoppedLocation:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&h.is(r.stoppedLocation)}e.is=i})(it||(it={}));var ce;(function(e){e.Type=1,e.Parameter=2;function n(i){return i===1||i===2}e.is=n})(ce||(ce={}));var le;(function(e){function n(r){return{value:r}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&(t.tooltip===void 0||a.string(t.tooltip)||L.is(t.tooltip))&&(t.location===void 0||B.is(t.location))&&(t.command===void 0||b.is(t.command))}e.is=i})(le||(le={}));var ot;(function(e){function n(r,t,o){let s={position:r,label:t};return o!==void 0&&(s.kind=o),s}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&I.is(t.position)&&(a.string(t.label)||a.typedArray(t.label,le.is))&&(t.kind===void 0||ce.is(t.kind))&&t.textEdits===void 0||a.typedArray(t.textEdits,w.is)&&(t.tooltip===void 0||a.string(t.tooltip)||L.is(t.tooltip))&&(t.paddingLeft===void 0||a.boolean(t.paddingLeft))&&(t.paddingRight===void 0||a.boolean(t.paddingRight))}e.is=i})(ot||(ot={}));var st;(function(e){function n(i){return{kind:"snippet",value:i}}e.createSnippet=n})(st||(st={}));var at;(function(e){function n(i,r,t,o){return{insertText:i,filterText:r,range:t,command:o}}e.create=n})(at||(at={}));var ut;(function(e){function n(i){return{items:i}}e.create=n})(ut||(ut={}));var dt;(function(e){e.Invoked=0,e.Automatic=1})(dt||(dt={}));var ct;(function(e){function n(i,r){return{range:i,text:r}}e.create=n})(ct||(ct={}));var lt;(function(e){function n(i,r){return{triggerKind:i,selectedCompletionInfo:r}}e.create=n})(lt||(lt={}));var gt;(function(e){function n(i){let r=i;return a.objectLiteral(r)&&Z.is(r.uri)&&a.string(r.name)}e.is=n})(gt||(gt={}));var ft;(function(e){function n(o,s,u,g){return new ge(o,s,u,g)}e.create=n;function i(o){let s=o;return!!(a.defined(s)&&a.string(s.uri)&&(a.undefined(s.languageId)||a.string(s.languageId))&&a.uinteger(s.lineCount)&&a.func(s.getText)&&a.func(s.positionAt)&&a.func(s.offsetAt))}e.is=i;function r(o,s){let u=o.getText(),g=t(s,(l,p)=>{let v=l.range.start.line-p.range.start.line;return v===0?l.range.start.character-p.range.start.character:v}),f=u.length;for(let l=g.length-1;l>=0;l--){let p=g[l],v=o.offsetAt(p.range.start),c=o.offsetAt(p.range.end);if(c<=f)u=u.substring(0,v)+p.newText+u.substring(c,u.length);else throw new Error("Overlapping edit");f=v}return u}e.applyEdits=r;function t(o,s){if(o.length<=1)return o;let u=o.length/2|0,g=o.slice(0,u),f=o.slice(u);t(g,s),t(f,s);let l=0,p=0,v=0;for(;l0&&n.push(i.length),this._lineOffsets=n}return this._lineOffsets}positionAt(n){n=Math.max(Math.min(n,this._content.length),0);let i=this.getLineOffsets(),r=0,t=i.length;if(t===0)return I.create(0,n);for(;rn?t=s:r=s+1}let o=r-1;return I.create(o,n-i[o])}offsetAt(n){let i=this.getLineOffsets();if(n.line>=i.length)return this._content.length;if(n.line<0)return 0;let r=i[n.line],t=n.line+1"u"}e.undefined=r;function t(c){return c===!0||c===!1}e.boolean=t;function o(c){return n.call(c)==="[object String]"}e.string=o;function s(c){return n.call(c)==="[object Number]"}e.number=s;function u(c,Y,kt){return n.call(c)==="[object Number]"&&Y<=c&&c<=kt}e.numberRange=u;function g(c){return n.call(c)==="[object Number]"&&-2147483648<=c&&c<=2147483647}e.integer=g;function f(c){return n.call(c)==="[object Number]"&&0<=c&&c<=2147483647}e.uinteger=f;function l(c){return n.call(c)==="[object Function]"}e.func=l;function p(c){return c!==null&&typeof c=="object"}e.objectLiteral=p;function v(c,Y){return Array.isArray(c)&&c.every(Y)}e.typedArray=v})(a||(a={}));var W=class{constructor(n,i,r){this._languageId=n;this._worker=i;this._disposables=[];this._listener=Object.create(null);let t=s=>{let u=s.getLanguageId();if(u!==this._languageId)return;let g;this._listener[s.uri.toString()]=s.onDidChangeContent(()=>{window.clearTimeout(g),g=window.setTimeout(()=>this._doValidate(s.uri,u),500)}),this._doValidate(s.uri,u)},o=s=>{d.editor.setModelMarkers(s,this._languageId,[]);let u=s.uri.toString(),g=this._listener[u];g&&(g.dispose(),delete this._listener[u])};this._disposables.push(d.editor.onDidCreateModel(t)),this._disposables.push(d.editor.onWillDisposeModel(o)),this._disposables.push(d.editor.onDidChangeModelLanguage(s=>{o(s.model),t(s.model)})),this._disposables.push(r(s=>{d.editor.getModels().forEach(u=>{u.getLanguageId()===this._languageId&&(o(u),t(u))})})),this._disposables.push({dispose:()=>{d.editor.getModels().forEach(o);for(let s in this._listener)this._listener[s].dispose()}}),d.editor.getModels().forEach(t)}dispose(){this._disposables.forEach(n=>n&&n.dispose()),this._disposables.length=0}_doValidate(n,i){this._worker(n).then(r=>r.doValidation(n.toString())).then(r=>{let t=r.map(s=>At(n,s)),o=d.editor.getModel(n);o&&o.getLanguageId()===i&&d.editor.setModelMarkers(o,i,t)}).then(void 0,r=>{console.error(r)})}};function Ft(e){switch(e){case T.Error:return d.MarkerSeverity.Error;case T.Warning:return d.MarkerSeverity.Warning;case T.Information:return d.MarkerSeverity.Info;case T.Hint:return d.MarkerSeverity.Hint;default:return d.MarkerSeverity.Info}}function At(e,n){let i=typeof n.code=="number"?String(n.code):n.code;return{severity:Ft(n.severity),startLineNumber:n.range.start.line+1,startColumn:n.range.start.character+1,endLineNumber:n.range.end.line+1,endColumn:n.range.end.character+1,message:n.message,code:i,source:n.source}}var D=class{constructor(n,i){this._worker=n;this._triggerCharacters=i}get triggerCharacters(){return this._triggerCharacters}provideCompletionItems(n,i,r,t){let o=n.uri;return this._worker(o).then(s=>s.doComplete(o.toString(),k(i))).then(s=>{if(!s)return;let u=n.getWordUntilPosition(i),g=new d.Range(i.lineNumber,u.startColumn,i.lineNumber,u.endColumn),f=s.items.map(l=>{let p={label:l.label,insertText:l.insertText||l.label,sortText:l.sortText,filterText:l.filterText,documentation:l.documentation,detail:l.detail,command:jt(l.command),range:g,kind:Kt(l.kind)};return l.textEdit&&(Mt(l.textEdit)?p.range={insert:y(l.textEdit.insert),replace:y(l.textEdit.replace)}:p.range=y(l.textEdit.range),p.insertText=l.textEdit.newText),l.additionalTextEdits&&(p.additionalTextEdits=l.additionalTextEdits.map(P)),l.insertTextFormat===Q.Snippet&&(p.insertTextRules=d.languages.CompletionItemInsertTextRule.InsertAsSnippet),p});return{isIncomplete:s.isIncomplete,suggestions:f}})}};function k(e){if(e)return{character:e.column-1,line:e.lineNumber-1}}function pe(e){if(e)return{start:{line:e.startLineNumber-1,character:e.startColumn-1},end:{line:e.endLineNumber-1,character:e.endColumn-1}}}function y(e){if(e)return new d.Range(e.start.line+1,e.start.character+1,e.end.line+1,e.end.character+1)}function Mt(e){return typeof e.insert<"u"&&typeof e.replace<"u"}function Kt(e){let n=d.languages.CompletionItemKind;switch(e){case m.Text:return n.Text;case m.Method:return n.Method;case m.Function:return n.Function;case m.Constructor:return n.Constructor;case m.Field:return n.Field;case m.Variable:return n.Variable;case m.Class:return n.Class;case m.Interface:return n.Interface;case m.Module:return n.Module;case m.Property:return n.Property;case m.Unit:return n.Unit;case m.Value:return n.Value;case m.Enum:return n.Enum;case m.Keyword:return n.Keyword;case m.Snippet:return n.Snippet;case m.Color:return n.Color;case m.File:return n.File;case m.Reference:return n.Reference}return n.Property}function P(e){if(e)return{range:y(e.range),text:e.newText}}function jt(e){return e&&e.command==="editor.action.triggerSuggest"?{id:e.command,title:e.title,arguments:e.arguments}:void 0}var S=class{constructor(n){this._worker=n}provideHover(n,i,r){let t=n.uri;return this._worker(t).then(o=>o.doHover(t.toString(),k(i))).then(o=>{if(o)return{range:y(o.range),contents:Ht(o.contents)}})}};function Ut(e){return e&&typeof e=="object"&&typeof e.kind=="string"}function pt(e){return typeof e=="string"?{value:e}:Ut(e)?e.kind==="plaintext"?{value:e.value.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}:{value:e.value}:{value:"```"+e.language+` -`+e.value+"\n```\n"}}function Ht(e){if(e)return Array.isArray(e)?e.map(pt):[pt(e)]}var F=class{constructor(n){this._worker=n}provideDocumentHighlights(n,i,r){let t=n.uri;return this._worker(t).then(o=>o.findDocumentHighlights(t.toString(),k(i))).then(o=>{if(o)return o.map(s=>({range:y(s.range),kind:Nt(s.kind)}))})}};function Nt(e){switch(e){case R.Read:return d.languages.DocumentHighlightKind.Read;case R.Write:return d.languages.DocumentHighlightKind.Write;case R.Text:return d.languages.DocumentHighlightKind.Text}return d.languages.DocumentHighlightKind.Text}var A=class{constructor(n){this._worker=n}provideDefinition(n,i,r){let t=n.uri;return this._worker(t).then(o=>o.findDefinition(t.toString(),k(i))).then(o=>{if(o)return[ht(o)]})}};function ht(e){return{uri:d.Uri.parse(e.uri),range:y(e.range)}}var M=class{constructor(n){this._worker=n}provideReferences(n,i,r,t){let o=n.uri;return this._worker(o).then(s=>s.findReferences(o.toString(),k(i))).then(s=>{if(s)return s.map(ht)})}},K=class{constructor(n){this._worker=n}provideRenameEdits(n,i,r,t){let o=n.uri;return this._worker(o).then(s=>s.doRename(o.toString(),k(i),r)).then(s=>Ot(s))}};function Ot(e){if(!e||!e.changes)return;let n=[];for(let i in e.changes){let r=d.Uri.parse(i);for(let t of e.changes[i])n.push({resource:r,versionId:void 0,textEdit:{range:y(t.range),text:t.newText}})}return{edits:n}}var j=class{constructor(n){this._worker=n}provideDocumentSymbols(n,i){let r=n.uri;return this._worker(r).then(t=>t.findDocumentSymbols(r.toString())).then(t=>{if(t)return t.map(o=>Vt(o)?mt(o):{name:o.name,detail:"",containerName:o.containerName,kind:xt(o.kind),range:y(o.location.range),selectionRange:y(o.location.range),tags:[]})})}};function Vt(e){return"children"in e}function mt(e){return{name:e.name,detail:e.detail??"",kind:xt(e.kind),range:y(e.range),selectionRange:y(e.selectionRange),tags:e.tags??[],children:(e.children??[]).map(n=>mt(n))}}function xt(e){let n=d.languages.SymbolKind;switch(e){case x.File:return n.File;case x.Module:return n.Module;case x.Namespace:return n.Namespace;case x.Package:return n.Package;case x.Class:return n.Class;case x.Method:return n.Method;case x.Property:return n.Property;case x.Field:return n.Field;case x.Constructor:return n.Constructor;case x.Enum:return n.Enum;case x.Interface:return n.Interface;case x.Function:return n.Function;case x.Variable:return n.Variable;case x.Constant:return n.Constant;case x.String:return n.String;case x.Number:return n.Number;case x.Boolean:return n.Boolean;case x.Array:return n.Array}return n.Function}var fe=class{constructor(n){this._worker=n}provideLinks(n,i){let r=n.uri;return this._worker(r).then(t=>t.findDocumentLinks(r.toString())).then(t=>{if(t)return{links:t.map(o=>({range:y(o.range),url:o.target}))}})}},U=class{constructor(n){this._worker=n}provideDocumentFormattingEdits(n,i,r){let t=n.uri;return this._worker(t).then(o=>o.format(t.toString(),null,yt(i)).then(s=>{if(!(!s||s.length===0))return s.map(P)}))}},H=class{constructor(n){this._worker=n;this.canFormatMultipleRanges=!1}provideDocumentRangeFormattingEdits(n,i,r,t){let o=n.uri;return this._worker(o).then(s=>s.format(o.toString(),pe(i),yt(r)).then(u=>{if(!(!u||u.length===0))return u.map(P)}))}};function yt(e){return{tabSize:e.tabSize,insertSpaces:e.insertSpaces}}var N=class{constructor(n){this._worker=n}provideDocumentColors(n,i){let r=n.uri;return this._worker(r).then(t=>t.findDocumentColors(r.toString())).then(t=>{if(t)return t.map(o=>({color:o.color,range:y(o.range)}))})}provideColorPresentations(n,i,r){let t=n.uri;return this._worker(t).then(o=>o.getColorPresentations(t.toString(),i.color,pe(i.range))).then(o=>{if(o)return o.map(s=>{let u={label:s.label};return s.textEdit&&(u.textEdit=P(s.textEdit)),s.additionalTextEdits&&(u.additionalTextEdits=s.additionalTextEdits.map(P)),u})})}},O=class{constructor(n){this._worker=n}provideFoldingRanges(n,i,r){let t=n.uri;return this._worker(t).then(o=>o.getFoldingRanges(t.toString(),i)).then(o=>{if(o)return o.map(s=>{let u={start:s.startLine+1,end:s.endLine+1};return typeof s.kind<"u"&&(u.kind=zt(s.kind)),u})})}};function zt(e){switch(e){case C.Comment:return d.languages.FoldingRangeKind.Comment;case C.Imports:return d.languages.FoldingRangeKind.Imports;case C.Region:return d.languages.FoldingRangeKind.Region}}var V=class{constructor(n){this._worker=n}provideSelectionRanges(n,i,r){let t=n.uri;return this._worker(t).then(o=>o.getSelectionRanges(t.toString(),i.map(k))).then(o=>{if(o)return o.map(s=>{let u=[];for(;s;)u.push({range:y(s.range)}),s=s.parent;return u})})}};function $t(e){let n=[],i=[],r=new _(e);n.push(r);let t=(...s)=>r.getLanguageServiceWorker(...s);function o(){let{languageId:s,modeConfiguration:u}=e;It(i),u.completionItems&&i.push(d.languages.registerCompletionItemProvider(s,new D(t,["/","-",":"]))),u.hovers&&i.push(d.languages.registerHoverProvider(s,new S(t))),u.documentHighlights&&i.push(d.languages.registerDocumentHighlightProvider(s,new F(t))),u.definitions&&i.push(d.languages.registerDefinitionProvider(s,new A(t))),u.references&&i.push(d.languages.registerReferenceProvider(s,new M(t))),u.documentSymbols&&i.push(d.languages.registerDocumentSymbolProvider(s,new j(t))),u.rename&&i.push(d.languages.registerRenameProvider(s,new K(t))),u.colors&&i.push(d.languages.registerColorProvider(s,new N(t))),u.foldingRanges&&i.push(d.languages.registerFoldingRangeProvider(s,new O(t))),u.diagnostics&&i.push(new W(s,t,e.onDidChange)),u.selectionRanges&&i.push(d.languages.registerSelectionRangeProvider(s,new V(t))),u.documentFormattingEdits&&i.push(d.languages.registerDocumentFormattingEditProvider(s,new U(t))),u.documentRangeFormattingEdits&&i.push(d.languages.registerDocumentRangeFormattingEditProvider(s,new H(t)))}return o(),n.push(vt(i)),vt(n)}function vt(e){return{dispose:()=>It(e)}}function It(e){for(;e.length;)e.pop().dispose()}return Lt(Bt);})(); -return moduleExports; -}); diff --git a/public/js/monaco-editor-0.52.2/min/vs/language/css/cssWorker.js b/public/js/monaco-editor-0.52.2/min/vs/language/css/cssWorker.js deleted file mode 100644 index 920ea72634..0000000000 --- a/public/js/monaco-editor-0.52.2/min/vs/language/css/cssWorker.js +++ /dev/null @@ -1,77 +0,0 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) - * Released under the MIT license - * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt - *-----------------------------------------------------------------------------*/ -define("vs/language/css/cssWorker", ["require","require"],(require)=>{ -"use strict";var moduleExports=(()=>{var Er=Object.defineProperty;var Fo=Object.getOwnPropertyDescriptor;var Eo=Object.getOwnPropertyNames;var _o=Object.prototype.hasOwnProperty;var Io=(n,e)=>{for(var t in e)Er(n,t,{get:e[t],enumerable:!0})},Do=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Eo(e))!_o.call(n,i)&&i!==t&&Er(n,i,{get:()=>e[i],enumerable:!(r=Fo(e,i))||r.enumerable});return n};var Ro=n=>Do(Er({},"__esModule",{value:!0}),n);var nl={};Io(nl,{CSSWorker:()=>Fr,create:()=>tl});var c;(function(n){n[n.Ident=0]="Ident",n[n.AtKeyword=1]="AtKeyword",n[n.String=2]="String",n[n.BadString=3]="BadString",n[n.UnquotedString=4]="UnquotedString",n[n.Hash=5]="Hash",n[n.Num=6]="Num",n[n.Percentage=7]="Percentage",n[n.Dimension=8]="Dimension",n[n.UnicodeRange=9]="UnicodeRange",n[n.CDO=10]="CDO",n[n.CDC=11]="CDC",n[n.Colon=12]="Colon",n[n.SemiColon=13]="SemiColon",n[n.CurlyL=14]="CurlyL",n[n.CurlyR=15]="CurlyR",n[n.ParenthesisL=16]="ParenthesisL",n[n.ParenthesisR=17]="ParenthesisR",n[n.BracketL=18]="BracketL",n[n.BracketR=19]="BracketR",n[n.Whitespace=20]="Whitespace",n[n.Includes=21]="Includes",n[n.Dashmatch=22]="Dashmatch",n[n.SubstringOperator=23]="SubstringOperator",n[n.PrefixOperator=24]="PrefixOperator",n[n.SuffixOperator=25]="SuffixOperator",n[n.Delim=26]="Delim",n[n.EMS=27]="EMS",n[n.EXS=28]="EXS",n[n.Length=29]="Length",n[n.Angle=30]="Angle",n[n.Time=31]="Time",n[n.Freq=32]="Freq",n[n.Exclamation=33]="Exclamation",n[n.Resolution=34]="Resolution",n[n.Comma=35]="Comma",n[n.Charset=36]="Charset",n[n.EscapedJavaScript=37]="EscapedJavaScript",n[n.BadEscapedJavaScript=38]="BadEscapedJavaScript",n[n.Comment=39]="Comment",n[n.SingleLineComment=40]="SingleLineComment",n[n.EOF=41]="EOF",n[n.ContainerQueryLength=42]="ContainerQueryLength",n[n.CustomToken=43]="CustomToken"})(c||(c={}));var un=class{constructor(e){this.source=e,this.len=e.length,this.position=0}substring(e,t=this.position){return this.source.substring(e,t)}eos(){return this.len<=this.position}pos(){return this.position}goBackTo(e){this.position=e}goBack(e){this.position-=e}advance(e){this.position+=e}nextChar(){return this.source.charCodeAt(this.position++)||0}peekChar(e=0){return this.source.charCodeAt(this.position+e)||0}lookbackChar(e=0){return this.source.charCodeAt(this.position-e)||0}advanceIfChar(e){return e===this.source.charCodeAt(this.position)?(this.position++,!0):!1}advanceIfChars(e){if(this.position+e.length>this.source.length)return!1;let t=0;for(;tt&&r===Ui?(e=!0,!1):(t=r===_r,!0)),e&&this.stream.advance(1),!0}return!1}_number(){let e=0,t;return this.stream.peekChar()===Bi&&(e=1),t=this.stream.peekChar(e),t>=At&&t<=Wt?(this.stream.advance(e+1),this.stream.advanceWhileChar(r=>r>=At&&r<=Wt||e===0&&r===Bi),!0):!1}_newline(e){let t=this.stream.peekChar();switch(t){case dt:case $t:case ct:return this.stream.advance(1),e.push(String.fromCharCode(t)),t===dt&&this.stream.advanceIfChar(ct)&&e.push(` -`),!0}return!1}_escape(e,t){let r=this.stream.peekChar();if(r===Ir){this.stream.advance(1),r=this.stream.peekChar();let i=0;for(;i<6&&(r>=At&&r<=Wt||r>=pn&&r<=Pi||r>=mn&&r<=Wi);)this.stream.advance(1),r=this.stream.peekChar(),i++;if(i>0){try{let s=parseInt(this.stream.substring(this.stream.pos()-i),16);s&&e.push(String.fromCharCode(s))}catch{}return r===Dr||r===Rr?this.stream.advance(1):this._newline([]),!0}if(r!==dt&&r!==$t&&r!==ct)return this.stream.advance(1),e.push(String.fromCharCode(r)),!0;if(t)return this._newline(e)}return!1}_stringChar(e,t){let r=this.stream.peekChar();return r!==0&&r!==e&&r!==Ir&&r!==dt&&r!==$t&&r!==ct?(this.stream.advance(1),t.push(String.fromCharCode(r)),!0):!1}_string(e){if(this.stream.peekChar()===ji||this.stream.peekChar()===Vi){let t=this.stream.nextChar();for(e.push(String.fromCharCode(t));this._stringChar(t,e)||this._escape(e,!0););return this.stream.peekChar()===t?(this.stream.nextChar(),e.push(String.fromCharCode(t)),c.String):c.BadString}return null}_unquotedChar(e){let t=this.stream.peekChar();return t!==0&&t!==Ir&&t!==ji&&t!==Vi&&t!==Ki&&t!==Gi&&t!==Dr&&t!==Rr&&t!==ct&&t!==$t&&t!==dt?(this.stream.advance(1),e.push(String.fromCharCode(t)),!0):!1}_unquotedString(e){let t=!1;for(;this._unquotedChar(e)||this._escape(e);)t=!0;return t}_whitespace(){return this.stream.advanceWhileChar(t=>t===Dr||t===Rr||t===ct||t===$t||t===dt)>0}_name(e){let t=!1;for(;this._identChar(e)||this._escape(e);)t=!0;return t}ident(e){let t=this.stream.pos();if(this._minus(e)){if(this._minus(e)||this._identFirstChar(e)||this._escape(e)){for(;this._identChar(e)||this._escape(e););return!0}}else if(this._identFirstChar(e)||this._escape(e)){for(;this._identChar(e)||this._escape(e););return!0}return this.stream.goBackTo(t),!1}_identFirstChar(e){let t=this.stream.peekChar();return t===$i||t>=pn&&t<=Ai||t>=mn&&t<=Li||t>=128&&t<=65535?(this.stream.advance(1),e.push(String.fromCharCode(t)),!0):!1}_minus(e){let t=this.stream.peekChar();return t===Qe?(this.stream.advance(1),e.push(String.fromCharCode(t)),!0):!1}_identChar(e){let t=this.stream.peekChar();return t===$i||t===Qe||t>=pn&&t<=Ai||t>=mn&&t<=Li||t>=At&&t<=Wt||t>=128&&t<=65535?(this.stream.advance(1),e.push(String.fromCharCode(t)),!0):!1}_unicodeRange(){if(this.stream.advanceIfChar(Ho)){let e=r=>r>=At&&r<=Wt||r>=pn&&r<=Pi||r>=mn&&r<=Wi,t=this.stream.advanceWhileChar(e)+this.stream.advanceWhileChar(r=>r===Go);if(t>=1&&t<=6)if(this.stream.advanceIfChar(Qe)){let r=this.stream.advanceWhileChar(e);if(r>=1&&r<=6)return!0}else return!0}return!1}};function V(n,e){if(n.length0?n.lastIndexOf(e)===t:t===0?n===e:!1}function Hi(n,e,t=4){let r=Math.abs(n.length-e.length);if(r>t)return 0;let i=[],s=[],a,l;for(a=0;a0;)(e&1)===1&&(t+=n),n+=n,e=e>>>1;return t}var m;(function(n){n[n.Undefined=0]="Undefined",n[n.Identifier=1]="Identifier",n[n.Stylesheet=2]="Stylesheet",n[n.Ruleset=3]="Ruleset",n[n.Selector=4]="Selector",n[n.SimpleSelector=5]="SimpleSelector",n[n.SelectorInterpolation=6]="SelectorInterpolation",n[n.SelectorCombinator=7]="SelectorCombinator",n[n.SelectorCombinatorParent=8]="SelectorCombinatorParent",n[n.SelectorCombinatorSibling=9]="SelectorCombinatorSibling",n[n.SelectorCombinatorAllSiblings=10]="SelectorCombinatorAllSiblings",n[n.SelectorCombinatorShadowPiercingDescendant=11]="SelectorCombinatorShadowPiercingDescendant",n[n.Page=12]="Page",n[n.PageBoxMarginBox=13]="PageBoxMarginBox",n[n.ClassSelector=14]="ClassSelector",n[n.IdentifierSelector=15]="IdentifierSelector",n[n.ElementNameSelector=16]="ElementNameSelector",n[n.PseudoSelector=17]="PseudoSelector",n[n.AttributeSelector=18]="AttributeSelector",n[n.Declaration=19]="Declaration",n[n.Declarations=20]="Declarations",n[n.Property=21]="Property",n[n.Expression=22]="Expression",n[n.BinaryExpression=23]="BinaryExpression",n[n.Term=24]="Term",n[n.Operator=25]="Operator",n[n.Value=26]="Value",n[n.StringLiteral=27]="StringLiteral",n[n.URILiteral=28]="URILiteral",n[n.EscapedValue=29]="EscapedValue",n[n.Function=30]="Function",n[n.NumericValue=31]="NumericValue",n[n.HexColorValue=32]="HexColorValue",n[n.RatioValue=33]="RatioValue",n[n.MixinDeclaration=34]="MixinDeclaration",n[n.MixinReference=35]="MixinReference",n[n.VariableName=36]="VariableName",n[n.VariableDeclaration=37]="VariableDeclaration",n[n.Prio=38]="Prio",n[n.Interpolation=39]="Interpolation",n[n.NestedProperties=40]="NestedProperties",n[n.ExtendsReference=41]="ExtendsReference",n[n.SelectorPlaceholder=42]="SelectorPlaceholder",n[n.Debug=43]="Debug",n[n.If=44]="If",n[n.Else=45]="Else",n[n.For=46]="For",n[n.Each=47]="Each",n[n.While=48]="While",n[n.MixinContentReference=49]="MixinContentReference",n[n.MixinContentDeclaration=50]="MixinContentDeclaration",n[n.Media=51]="Media",n[n.Keyframe=52]="Keyframe",n[n.FontFace=53]="FontFace",n[n.Import=54]="Import",n[n.Namespace=55]="Namespace",n[n.Invocation=56]="Invocation",n[n.FunctionDeclaration=57]="FunctionDeclaration",n[n.ReturnStatement=58]="ReturnStatement",n[n.MediaQuery=59]="MediaQuery",n[n.MediaCondition=60]="MediaCondition",n[n.MediaFeature=61]="MediaFeature",n[n.FunctionParameter=62]="FunctionParameter",n[n.FunctionArgument=63]="FunctionArgument",n[n.KeyframeSelector=64]="KeyframeSelector",n[n.ViewPort=65]="ViewPort",n[n.Document=66]="Document",n[n.AtApplyRule=67]="AtApplyRule",n[n.CustomPropertyDeclaration=68]="CustomPropertyDeclaration",n[n.CustomPropertySet=69]="CustomPropertySet",n[n.ListEntry=70]="ListEntry",n[n.Supports=71]="Supports",n[n.SupportsCondition=72]="SupportsCondition",n[n.NamespacePrefix=73]="NamespacePrefix",n[n.GridLine=74]="GridLine",n[n.Plugin=75]="Plugin",n[n.UnknownAtRule=76]="UnknownAtRule",n[n.Use=77]="Use",n[n.ModuleConfiguration=78]="ModuleConfiguration",n[n.Forward=79]="Forward",n[n.ForwardVisibility=80]="ForwardVisibility",n[n.Module=81]="Module",n[n.UnicodeRange=82]="UnicodeRange",n[n.Layer=83]="Layer",n[n.LayerNameList=84]="LayerNameList",n[n.LayerName=85]="LayerName",n[n.PropertyAtRule=86]="PropertyAtRule",n[n.Container=87]="Container"})(m||(m={}));var z;(function(n){n[n.Mixin=0]="Mixin",n[n.Rule=1]="Rule",n[n.Variable=2]="Variable",n[n.Function=3]="Function",n[n.Keyframe=4]="Keyframe",n[n.Unknown=5]="Unknown",n[n.Module=6]="Module",n[n.Forward=7]="Forward",n[n.ForwardVisibility=8]="ForwardVisibility",n[n.Property=9]="Property"})(z||(z={}));function Hn(n,e){let t=null;return!n||en.end?null:(n.accept(r=>r.offset===-1&&r.length===-1?!0:r.offset<=e&&r.end>=e?(t?r.length<=t.length&&(t=r):t=r,!0):!1),t)}function vt(n,e){let t=Hn(n,e),r=[];for(;t;)r.unshift(t),t=t.parent;return r}function Xi(n){let e=n.findParent(m.Declaration),t=e&&e.getValue();return t&&t.encloses(n)?e:null}var x=class{get end(){return this.offset+this.length}constructor(e=-1,t=-1,r){this.parent=null,this.offset=e,this.length=t,r&&(this.nodeType=r)}set type(e){this.nodeType=e}get type(){return this.nodeType||m.Undefined}getTextProvider(){let e=this;for(;e&&!e.textProvider;)e=e.parent;return e?e.textProvider:()=>"unknown"}getText(){return this.getTextProvider()(this.offset,this.length)}matches(e){return this.length===e.length&&this.getTextProvider()(this.offset,this.length)===e}startsWith(e){return this.length>=e.length&&this.getTextProvider()(this.offset,e.length)===e}endsWith(e){return this.length>=e.length&&this.getTextProvider()(this.end-e.length,e.length)===e}accept(e){if(e(this)&&this.children)for(let t of this.children)t.accept(e)}acceptVisitor(e){this.accept(e.visitNode.bind(e))}adoptChild(e,t=-1){if(e.parent&&e.parent.children){let i=e.parent.children.indexOf(e);i>=0&&e.parent.children.splice(i,1)}e.parent=this;let r=this.children;return r||(r=this.children=[]),t!==-1?r.splice(t,0,e):r.push(e),e}attachTo(e,t=-1){return e&&e.adoptChild(this,t),this}collectIssues(e){this.issues&&e.push.apply(e,this.issues)}addIssue(e){this.issues||(this.issues=[]),this.issues.push(e)}hasIssue(e){return Array.isArray(this.issues)&&this.issues.some(t=>t.getRule()===e)}isErroneous(e=!1){return this.issues&&this.issues.length>0?!0:e&&Array.isArray(this.children)&&this.children.some(t=>t.isErroneous(!0))}setNode(e,t,r=-1){return t?(t.attachTo(this,r),this[e]=t,!0):!1}addChild(e){return e?(this.children||(this.children=[]),e.attachTo(this),this.updateOffsetAndLength(e),!0):!1}updateOffsetAndLength(e){(e.offsetthis.end||this.length===-1)&&(this.length=t-this.offset)}hasChildren(){return!!this.children&&this.children.length>0}getChildren(){return this.children?this.children.slice(0):[]}getChild(e){return this.children&&e=0;r--)if(t=this.children[r],t.offset<=e)return t}return null}findChildAtOffset(e,t){let r=this.findFirstChildBeforeOffset(e);return r&&r.end>=e?t&&r.findChildAtOffset(e,!0)||r:null}encloses(e){return this.offset<=e.offset&&this.offset+this.length>=e.offset+e.length}getParent(){let e=this.parent;for(;e instanceof J;)e=e.parent;return e}findParent(e){let t=this;for(;t&&t.type!==e;)t=t.parent;return t}findAParent(...e){let t=this;for(;t&&!e.some(r=>t.type===r);)t=t.parent;return t}setData(e,t){this.options||(this.options={}),this.options[e]=t}getData(e){return!this.options||!this.options.hasOwnProperty(e)?null:this.options[e]}},J=class extends x{constructor(e,t=-1){super(-1,-1),this.attachTo(e,t),this.offset=-1,this.length=-1}},gn=class extends x{constructor(e,t){super(e,t)}get type(){return m.UnicodeRange}setRangeStart(e){return this.setNode("rangeStart",e)}getRangeStart(){return this.rangeStart}setRangeEnd(e){return this.setNode("rangeEnd",e)}getRangeEnd(){return this.rangeEnd}},G=class extends x{constructor(e,t){super(e,t),this.isCustomProperty=!1}get type(){return m.Identifier}containsInterpolation(){return this.hasChildren()}},bn=class extends x{constructor(e,t){super(e,t)}get type(){return m.Stylesheet}},Ze=class extends x{constructor(e,t){super(e,t)}get type(){return m.Declarations}},L=class extends x{constructor(e,t){super(e,t)}getDeclarations(){return this.declarations}setDeclarations(e){return this.setNode("declarations",e)}},ae=class extends L{constructor(e,t){super(e,t)}get type(){return m.Ruleset}getSelectors(){return this.selectors||(this.selectors=new J(this)),this.selectors}isNested(){return!!this.parent&&this.parent.findParent(m.Declarations)!==null}},de=class extends x{constructor(e,t){super(e,t)}get type(){return m.Selector}},he=class extends x{constructor(e,t){super(e,t)}get type(){return m.SimpleSelector}};var ht=class extends x{constructor(e,t){super(e,t)}},wn=class extends L{constructor(e,t){super(e,t)}get type(){return m.CustomPropertySet}},Q=class n extends ht{constructor(e,t){super(e,t),this.property=null}get type(){return m.Declaration}setProperty(e){return this.setNode("property",e)}getProperty(){return this.property}getFullPropertyName(){let e=this.property?this.property.getName():"unknown";if(this.parent instanceof Ze&&this.parent.getParent()instanceof Ut){let t=this.parent.getParent().getParent();if(t instanceof n)return t.getFullPropertyName()+e}return e}getNonPrefixedPropertyName(){let e=this.getFullPropertyName();if(e&&e.charAt(0)==="-"){let t=e.indexOf("-",1);if(t!==-1)return e.substring(t+1)}return e}setValue(e){return this.setNode("value",e)}getValue(){return this.value}setNestedProperties(e){return this.setNode("nestedProperties",e)}getNestedProperties(){return this.nestedProperties}},vn=class extends Q{constructor(e,t){super(e,t)}get type(){return m.CustomPropertyDeclaration}setPropertySet(e){return this.setNode("propertySet",e)}getPropertySet(){return this.propertySet}},Ve=class extends x{constructor(e,t){super(e,t)}get type(){return m.Property}setIdentifier(e){return this.setNode("identifier",e)}getIdentifier(){return this.identifier}getName(){return Ji(this.getText(),/[_\+]+$/)}isCustomProperty(){return!!this.identifier&&this.identifier.isCustomProperty}},Tr=class extends x{constructor(e,t){super(e,t)}get type(){return m.Invocation}getArguments(){return this.arguments||(this.arguments=new J(this)),this.arguments}},me=class extends Tr{constructor(e,t){super(e,t)}get type(){return m.Function}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}getName(){return this.identifier?this.identifier.getText():""}},ye=class extends x{constructor(e,t){super(e,t)}get type(){return m.FunctionParameter}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}getName(){return this.identifier?this.identifier.getText():""}setDefaultValue(e){return this.setNode("defaultValue",e,0)}getDefaultValue(){return this.defaultValue}},le=class extends x{constructor(e,t){super(e,t)}get type(){return m.FunctionArgument}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}getName(){return this.identifier?this.identifier.getText():""}setValue(e){return this.setNode("value",e,0)}getValue(){return this.value}},yn=class extends L{constructor(e,t){super(e,t)}get type(){return m.If}setExpression(e){return this.setNode("expression",e,0)}setElseClause(e){return this.setNode("elseClause",e)}},xn=class extends L{constructor(e,t){super(e,t)}get type(){return m.For}setVariable(e){return this.setNode("variable",e,0)}},Sn=class extends L{constructor(e,t){super(e,t)}get type(){return m.Each}getVariables(){return this.variables||(this.variables=new J(this)),this.variables}},Cn=class extends L{constructor(e,t){super(e,t)}get type(){return m.While}},kn=class extends L{constructor(e,t){super(e,t)}get type(){return m.Else}},De=class extends L{constructor(e,t){super(e,t)}get type(){return m.FunctionDeclaration}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}getName(){return this.identifier?this.identifier.getText():""}getParameters(){return this.parameters||(this.parameters=new J(this)),this.parameters}},Fn=class extends L{constructor(e,t){super(e,t)}get type(){return m.ViewPort}},pt=class extends L{constructor(e,t){super(e,t)}get type(){return m.FontFace}},Ut=class extends L{constructor(e,t){super(e,t)}get type(){return m.NestedProperties}},mt=class extends L{constructor(e,t){super(e,t)}get type(){return m.Keyframe}setKeyword(e){return this.setNode("keyword",e,0)}getKeyword(){return this.keyword}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}getName(){return this.identifier?this.identifier.getText():""}},Vt=class extends L{constructor(e,t){super(e,t)}get type(){return m.KeyframeSelector}},je=class extends x{constructor(e,t){super(e,t)}get type(){return m.Import}setMedialist(e){return e?(e.attachTo(this),!0):!1}},En=class extends x{get type(){return m.Use}getParameters(){return this.parameters||(this.parameters=new J(this)),this.parameters}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}},_n=class extends x{get type(){return m.ModuleConfiguration}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}getName(){return this.identifier?this.identifier.getText():""}setValue(e){return this.setNode("value",e,0)}getValue(){return this.value}},In=class extends x{get type(){return m.Forward}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}getMembers(){return this.members||(this.members=new J(this)),this.members}getParameters(){return this.parameters||(this.parameters=new J(this)),this.parameters}},Dn=class extends x{get type(){return m.ForwardVisibility}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}},Rn=class extends x{constructor(e,t){super(e,t)}get type(){return m.Namespace}},Be=class extends L{constructor(e,t){super(e,t)}get type(){return m.Media}},et=class extends L{constructor(e,t){super(e,t)}get type(){return m.Supports}},zn=class extends L{constructor(e,t){super(e,t)}get type(){return m.Layer}setNames(e){return this.setNode("names",e)}getNames(){return this.names}},Mn=class extends L{constructor(e,t){super(e,t)}get type(){return m.PropertyAtRule}setName(e){return e?(e.attachTo(this),this.name=e,!0):!1}getName(){return this.name}},Tn=class extends L{constructor(e,t){super(e,t)}get type(){return m.Document}},Nn=class extends L{constructor(e,t){super(e,t)}get type(){return m.Container}},ut=class extends x{constructor(e,t){super(e,t)}},ft=class extends x{constructor(e,t){super(e,t)}get type(){return m.MediaQuery}},On=class extends x{constructor(e,t){super(e,t)}get type(){return m.MediaCondition}},Pn=class extends x{constructor(e,t){super(e,t)}get type(){return m.MediaFeature}},Re=class extends x{constructor(e,t){super(e,t)}get type(){return m.SupportsCondition}},An=class extends L{constructor(e,t){super(e,t)}get type(){return m.Page}},Wn=class extends L{constructor(e,t){super(e,t)}get type(){return m.PageBoxMarginBox}},gt=class extends x{constructor(e,t){super(e,t)}get type(){return m.Expression}},qe=class extends x{constructor(e,t){super(e,t)}get type(){return m.BinaryExpression}setLeft(e){return this.setNode("left",e)}getLeft(){return this.left}setRight(e){return this.setNode("right",e)}getRight(){return this.right}setOperator(e){return this.setNode("operator",e)}getOperator(){return this.operator}},Ln=class extends x{constructor(e,t){super(e,t)}get type(){return m.Term}setOperator(e){return this.setNode("operator",e)}getOperator(){return this.operator}setExpression(e){return this.setNode("expression",e)}getExpression(){return this.expression}},$n=class extends x{constructor(e,t){super(e,t)}get type(){return m.AttributeSelector}setNamespacePrefix(e){return this.setNode("namespacePrefix",e)}getNamespacePrefix(){return this.namespacePrefix}setIdentifier(e){return this.setNode("identifier",e)}getIdentifier(){return this.identifier}setOperator(e){return this.setNode("operator",e)}getOperator(){return this.operator}setValue(e){return this.setNode("value",e)}getValue(){return this.value}};var tt=class extends x{constructor(e,t){super(e,t)}get type(){return m.HexColorValue}},Un=class extends x{constructor(e,t){super(e,t)}get type(){return m.RatioValue}},Yo=46,Qo=48,Zo=57,nt=class extends x{constructor(e,t){super(e,t)}get type(){return m.NumericValue}getValue(){let e=this.getText(),t=0,r;for(let i=0,s=e.length;i0&&(t+=`/${Array.isArray(e.comment)?e.comment.join(""):e.comment}`),i=e.args??{};let s=ea?.[t];return s?typeof s=="string"?Jn(s,i):s.comment?Jn(s.message,i):Jn(r,i):Jn(r,i)}var ta=/{([^}]+)}/g;function Jn(n,e){return Object.keys(e).length===0?n:n.replace(ta,(t,r)=>e[r]??t)}var O=class{constructor(e,t){this.id=e,this.message=t}},f={NumberExpected:new O("css-numberexpected",p("number expected")),ConditionExpected:new O("css-conditionexpected",p("condition expected")),RuleOrSelectorExpected:new O("css-ruleorselectorexpected",p("at-rule or selector expected")),DotExpected:new O("css-dotexpected",p("dot expected")),ColonExpected:new O("css-colonexpected",p("colon expected")),SemiColonExpected:new O("css-semicolonexpected",p("semi-colon expected")),TermExpected:new O("css-termexpected",p("term expected")),ExpressionExpected:new O("css-expressionexpected",p("expression expected")),OperatorExpected:new O("css-operatorexpected",p("operator expected")),IdentifierExpected:new O("css-identifierexpected",p("identifier expected")),PercentageExpected:new O("css-percentageexpected",p("percentage expected")),URIOrStringExpected:new O("css-uriorstringexpected",p("uri or string expected")),URIExpected:new O("css-uriexpected",p("URI expected")),VariableNameExpected:new O("css-varnameexpected",p("variable name expected")),VariableValueExpected:new O("css-varvalueexpected",p("variable value expected")),PropertyValueExpected:new O("css-propertyvalueexpected",p("property value expected")),LeftCurlyExpected:new O("css-lcurlyexpected",p("{ expected")),RightCurlyExpected:new O("css-rcurlyexpected",p("} expected")),LeftSquareBracketExpected:new O("css-rbracketexpected",p("[ expected")),RightSquareBracketExpected:new O("css-lbracketexpected",p("] expected")),LeftParenthesisExpected:new O("css-lparentexpected",p("( expected")),RightParenthesisExpected:new O("css-rparentexpected",p(") expected")),CommaExpected:new O("css-commaexpected",p("comma expected")),PageDirectiveOrDeclarationExpected:new O("css-pagedirordeclexpected",p("page directive or declaraton expected")),UnknownAtRule:new O("css-unknownatrule",p("at-rule unknown")),UnknownKeyword:new O("css-unknownkeyword",p("unknown keyword")),SelectorExpected:new O("css-selectorexpected",p("selector expected")),StringLiteralExpected:new O("css-stringliteralexpected",p("string literal expected")),WhitespaceExpected:new O("css-whitespaceexpected",p("whitespace expected")),MediaQueryExpected:new O("css-mediaqueryexpected",p("media query expected")),IdentifierOrWildcardExpected:new O("css-idorwildcardexpected",p("identifier or wildcard expected")),WildcardExpected:new O("css-wildcardexpected",p("wildcard expected")),IdentifierOrVariableExpected:new O("css-idorvarexpected",p("identifier or variable expected"))};var Nr;(function(n){function e(t){return typeof t=="string"}n.is=e})(Nr||(Nr={}));var Or;(function(n){function e(t){return typeof t=="string"}n.is=e})(Or||(Or={}));var Yi;(function(n){n.MIN_VALUE=-2147483648,n.MAX_VALUE=2147483647;function e(t){return typeof t=="number"&&n.MIN_VALUE<=t&&t<=n.MAX_VALUE}n.is=e})(Yi||(Yi={}));var Xn;(function(n){n.MIN_VALUE=0,n.MAX_VALUE=2147483647;function e(t){return typeof t=="number"&&n.MIN_VALUE<=t&&t<=n.MAX_VALUE}n.is=e})(Xn||(Xn={}));var H;(function(n){function e(r,i){return r===Number.MAX_VALUE&&(r=Xn.MAX_VALUE),i===Number.MAX_VALUE&&(i=Xn.MAX_VALUE),{line:r,character:i}}n.create=e;function t(r){let i=r;return g.objectLiteral(i)&&g.uinteger(i.line)&&g.uinteger(i.character)}n.is=t})(H||(H={}));var R;(function(n){function e(r,i,s,a){if(g.uinteger(r)&&g.uinteger(i)&&g.uinteger(s)&&g.uinteger(a))return{start:H.create(r,i),end:H.create(s,a)};if(H.is(r)&&H.is(i))return{start:r,end:i};throw new Error(`Range#create called with invalid arguments[${r}, ${i}, ${s}, ${a}]`)}n.create=e;function t(r){let i=r;return g.objectLiteral(i)&&H.is(i.start)&&H.is(i.end)}n.is=t})(R||(R={}));var it;(function(n){function e(r,i){return{uri:r,range:i}}n.create=e;function t(r){let i=r;return g.objectLiteral(i)&&R.is(i.range)&&(g.string(i.uri)||g.undefined(i.uri))}n.is=t})(it||(it={}));var Qi;(function(n){function e(r,i,s,a){return{targetUri:r,targetRange:i,targetSelectionRange:s,originSelectionRange:a}}n.create=e;function t(r){let i=r;return g.objectLiteral(i)&&R.is(i.targetRange)&&g.string(i.targetUri)&&R.is(i.targetSelectionRange)&&(R.is(i.originSelectionRange)||g.undefined(i.originSelectionRange))}n.is=t})(Qi||(Qi={}));var Yn;(function(n){function e(r,i,s,a){return{red:r,green:i,blue:s,alpha:a}}n.create=e;function t(r){let i=r;return g.objectLiteral(i)&&g.numberRange(i.red,0,1)&&g.numberRange(i.green,0,1)&&g.numberRange(i.blue,0,1)&&g.numberRange(i.alpha,0,1)}n.is=t})(Yn||(Yn={}));var Pr;(function(n){function e(r,i){return{range:r,color:i}}n.create=e;function t(r){let i=r;return g.objectLiteral(i)&&R.is(i.range)&&Yn.is(i.color)}n.is=t})(Pr||(Pr={}));var Ar;(function(n){function e(r,i,s){return{label:r,textEdit:i,additionalTextEdits:s}}n.create=e;function t(r){let i=r;return g.objectLiteral(i)&&g.string(i.label)&&(g.undefined(i.textEdit)||_.is(i))&&(g.undefined(i.additionalTextEdits)||g.typedArray(i.additionalTextEdits,_.is))}n.is=t})(Ar||(Ar={}));var Wr;(function(n){n.Comment="comment",n.Imports="imports",n.Region="region"})(Wr||(Wr={}));var Lr;(function(n){function e(r,i,s,a,l,o){let d={startLine:r,endLine:i};return g.defined(s)&&(d.startCharacter=s),g.defined(a)&&(d.endCharacter=a),g.defined(l)&&(d.kind=l),g.defined(o)&&(d.collapsedText=o),d}n.create=e;function t(r){let i=r;return g.objectLiteral(i)&&g.uinteger(i.startLine)&&g.uinteger(i.startLine)&&(g.undefined(i.startCharacter)||g.uinteger(i.startCharacter))&&(g.undefined(i.endCharacter)||g.uinteger(i.endCharacter))&&(g.undefined(i.kind)||g.string(i.kind))}n.is=t})(Lr||(Lr={}));var $r;(function(n){function e(r,i){return{location:r,message:i}}n.create=e;function t(r){let i=r;return g.defined(i)&&it.is(i.location)&&g.string(i.message)}n.is=t})($r||($r={}));var yt;(function(n){n.Error=1,n.Warning=2,n.Information=3,n.Hint=4})(yt||(yt={}));var Zi;(function(n){n.Unnecessary=1,n.Deprecated=2})(Zi||(Zi={}));var es;(function(n){function e(t){let r=t;return g.objectLiteral(r)&&g.string(r.href)}n.is=e})(es||(es={}));var Bt;(function(n){function e(r,i,s,a,l,o){let d={range:r,message:i};return g.defined(s)&&(d.severity=s),g.defined(a)&&(d.code=a),g.defined(l)&&(d.source=l),g.defined(o)&&(d.relatedInformation=o),d}n.create=e;function t(r){var i;let s=r;return g.defined(s)&&R.is(s.range)&&g.string(s.message)&&(g.number(s.severity)||g.undefined(s.severity))&&(g.integer(s.code)||g.string(s.code)||g.undefined(s.code))&&(g.undefined(s.codeDescription)||g.string((i=s.codeDescription)===null||i===void 0?void 0:i.href))&&(g.string(s.source)||g.undefined(s.source))&&(g.undefined(s.relatedInformation)||g.typedArray(s.relatedInformation,$r.is))}n.is=t})(Bt||(Bt={}));var Me;(function(n){function e(r,i,...s){let a={title:r,command:i};return g.defined(s)&&s.length>0&&(a.arguments=s),a}n.create=e;function t(r){let i=r;return g.defined(i)&&g.string(i.title)&&g.string(i.command)}n.is=t})(Me||(Me={}));var _;(function(n){function e(s,a){return{range:s,newText:a}}n.replace=e;function t(s,a){return{range:{start:s,end:s},newText:a}}n.insert=t;function r(s){return{range:s,newText:""}}n.del=r;function i(s){let a=s;return g.objectLiteral(a)&&g.string(a.newText)&&R.is(a.range)}n.is=i})(_||(_={}));var Ur;(function(n){function e(r,i,s){let a={label:r};return i!==void 0&&(a.needsConfirmation=i),s!==void 0&&(a.description=s),a}n.create=e;function t(r){let i=r;return g.objectLiteral(i)&&g.string(i.label)&&(g.boolean(i.needsConfirmation)||i.needsConfirmation===void 0)&&(g.string(i.description)||i.description===void 0)}n.is=t})(Ur||(Ur={}));var xt;(function(n){function e(t){let r=t;return g.string(r)}n.is=e})(xt||(xt={}));var ts;(function(n){function e(s,a,l){return{range:s,newText:a,annotationId:l}}n.replace=e;function t(s,a,l){return{range:{start:s,end:s},newText:a,annotationId:l}}n.insert=t;function r(s,a){return{range:s,newText:"",annotationId:a}}n.del=r;function i(s){let a=s;return _.is(a)&&(Ur.is(a.annotationId)||xt.is(a.annotationId))}n.is=i})(ts||(ts={}));var St;(function(n){function e(r,i){return{textDocument:r,edits:i}}n.create=e;function t(r){let i=r;return g.defined(i)&&qr.is(i.textDocument)&&Array.isArray(i.edits)}n.is=t})(St||(St={}));var Vr;(function(n){function e(r,i,s){let a={kind:"create",uri:r};return i!==void 0&&(i.overwrite!==void 0||i.ignoreIfExists!==void 0)&&(a.options=i),s!==void 0&&(a.annotationId=s),a}n.create=e;function t(r){let i=r;return i&&i.kind==="create"&&g.string(i.uri)&&(i.options===void 0||(i.options.overwrite===void 0||g.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||g.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||xt.is(i.annotationId))}n.is=t})(Vr||(Vr={}));var jr;(function(n){function e(r,i,s,a){let l={kind:"rename",oldUri:r,newUri:i};return s!==void 0&&(s.overwrite!==void 0||s.ignoreIfExists!==void 0)&&(l.options=s),a!==void 0&&(l.annotationId=a),l}n.create=e;function t(r){let i=r;return i&&i.kind==="rename"&&g.string(i.oldUri)&&g.string(i.newUri)&&(i.options===void 0||(i.options.overwrite===void 0||g.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||g.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||xt.is(i.annotationId))}n.is=t})(jr||(jr={}));var Br;(function(n){function e(r,i,s){let a={kind:"delete",uri:r};return i!==void 0&&(i.recursive!==void 0||i.ignoreIfNotExists!==void 0)&&(a.options=i),s!==void 0&&(a.annotationId=s),a}n.create=e;function t(r){let i=r;return i&&i.kind==="delete"&&g.string(i.uri)&&(i.options===void 0||(i.options.recursive===void 0||g.boolean(i.options.recursive))&&(i.options.ignoreIfNotExists===void 0||g.boolean(i.options.ignoreIfNotExists)))&&(i.annotationId===void 0||xt.is(i.annotationId))}n.is=t})(Br||(Br={}));var Qn;(function(n){function e(t){let r=t;return r&&(r.changes!==void 0||r.documentChanges!==void 0)&&(r.documentChanges===void 0||r.documentChanges.every(i=>g.string(i.kind)?Vr.is(i)||jr.is(i)||Br.is(i):St.is(i)))}n.is=e})(Qn||(Qn={}));var ns;(function(n){function e(r){return{uri:r}}n.create=e;function t(r){let i=r;return g.defined(i)&&g.string(i.uri)}n.is=t})(ns||(ns={}));var qt;(function(n){function e(r,i){return{uri:r,version:i}}n.create=e;function t(r){let i=r;return g.defined(i)&&g.string(i.uri)&&g.integer(i.version)}n.is=t})(qt||(qt={}));var qr;(function(n){function e(r,i){return{uri:r,version:i}}n.create=e;function t(r){let i=r;return g.defined(i)&&g.string(i.uri)&&(i.version===null||g.integer(i.version))}n.is=t})(qr||(qr={}));var rs;(function(n){function e(r,i,s,a){return{uri:r,languageId:i,version:s,text:a}}n.create=e;function t(r){let i=r;return g.defined(i)&&g.string(i.uri)&&g.string(i.languageId)&&g.integer(i.version)&&g.string(i.text)}n.is=t})(rs||(rs={}));var se;(function(n){n.PlainText="plaintext",n.Markdown="markdown";function e(t){let r=t;return r===n.PlainText||r===n.Markdown}n.is=e})(se||(se={}));var Ct;(function(n){function e(t){let r=t;return g.objectLiteral(t)&&se.is(r.kind)&&g.string(r.value)}n.is=e})(Ct||(Ct={}));var k;(function(n){n.Text=1,n.Method=2,n.Function=3,n.Constructor=4,n.Field=5,n.Variable=6,n.Class=7,n.Interface=8,n.Module=9,n.Property=10,n.Unit=11,n.Value=12,n.Enum=13,n.Keyword=14,n.Snippet=15,n.Color=16,n.File=17,n.Reference=18,n.Folder=19,n.EnumMember=20,n.Constant=21,n.Struct=22,n.Event=23,n.Operator=24,n.TypeParameter=25})(k||(k={}));var te;(function(n){n.PlainText=1,n.Snippet=2})(te||(te={}));var Te;(function(n){n.Deprecated=1})(Te||(Te={}));var is;(function(n){function e(r,i,s){return{newText:r,insert:i,replace:s}}n.create=e;function t(r){let i=r;return i&&g.string(i.newText)&&R.is(i.insert)&&R.is(i.replace)}n.is=t})(is||(is={}));var ss;(function(n){n.asIs=1,n.adjustIndentation=2})(ss||(ss={}));var os;(function(n){function e(t){let r=t;return r&&(g.string(r.detail)||r.detail===void 0)&&(g.string(r.description)||r.description===void 0)}n.is=e})(os||(os={}));var Kr;(function(n){function e(t){return{label:t}}n.create=e})(Kr||(Kr={}));var Gr;(function(n){function e(t,r){return{items:t||[],isIncomplete:!!r}}n.create=e})(Gr||(Gr={}));var Kt;(function(n){function e(r){return r.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}n.fromPlainText=e;function t(r){let i=r;return g.string(i)||g.objectLiteral(i)&&g.string(i.language)&&g.string(i.value)}n.is=t})(Kt||(Kt={}));var Hr;(function(n){function e(t){let r=t;return!!r&&g.objectLiteral(r)&&(Ct.is(r.contents)||Kt.is(r.contents)||g.typedArray(r.contents,Kt.is))&&(t.range===void 0||R.is(t.range))}n.is=e})(Hr||(Hr={}));var as;(function(n){function e(t,r){return r?{label:t,documentation:r}:{label:t}}n.create=e})(as||(as={}));var ls;(function(n){function e(t,r,...i){let s={label:t};return g.defined(r)&&(s.documentation=r),g.defined(i)?s.parameters=i:s.parameters=[],s}n.create=e})(ls||(ls={}));var Ge;(function(n){n.Text=1,n.Read=2,n.Write=3})(Ge||(Ge={}));var Jr;(function(n){function e(t,r){let i={range:t};return g.number(r)&&(i.kind=r),i}n.create=e})(Jr||(Jr={}));var ge;(function(n){n.File=1,n.Module=2,n.Namespace=3,n.Package=4,n.Class=5,n.Method=6,n.Property=7,n.Field=8,n.Constructor=9,n.Enum=10,n.Interface=11,n.Function=12,n.Variable=13,n.Constant=14,n.String=15,n.Number=16,n.Boolean=17,n.Array=18,n.Object=19,n.Key=20,n.Null=21,n.EnumMember=22,n.Struct=23,n.Event=24,n.Operator=25,n.TypeParameter=26})(ge||(ge={}));var cs;(function(n){n.Deprecated=1})(cs||(cs={}));var Xr;(function(n){function e(t,r,i,s,a){let l={name:t,kind:r,location:{uri:s,range:i}};return a&&(l.containerName=a),l}n.create=e})(Xr||(Xr={}));var ds;(function(n){function e(t,r,i,s){return s!==void 0?{name:t,kind:r,location:{uri:i,range:s}}:{name:t,kind:r,location:{uri:i}}}n.create=e})(ds||(ds={}));var Yr;(function(n){function e(r,i,s,a,l,o){let d={name:r,detail:i,kind:s,range:a,selectionRange:l};return o!==void 0&&(d.children=o),d}n.create=e;function t(r){let i=r;return i&&g.string(i.name)&&g.number(i.kind)&&R.is(i.range)&&R.is(i.selectionRange)&&(i.detail===void 0||g.string(i.detail))&&(i.deprecated===void 0||g.boolean(i.deprecated))&&(i.children===void 0||Array.isArray(i.children))&&(i.tags===void 0||Array.isArray(i.tags))}n.is=t})(Yr||(Yr={}));var Gt;(function(n){n.Empty="",n.QuickFix="quickfix",n.Refactor="refactor",n.RefactorExtract="refactor.extract",n.RefactorInline="refactor.inline",n.RefactorRewrite="refactor.rewrite",n.Source="source",n.SourceOrganizeImports="source.organizeImports",n.SourceFixAll="source.fixAll"})(Gt||(Gt={}));var Zn;(function(n){n.Invoked=1,n.Automatic=2})(Zn||(Zn={}));var Qr;(function(n){function e(r,i,s){let a={diagnostics:r};return i!=null&&(a.only=i),s!=null&&(a.triggerKind=s),a}n.create=e;function t(r){let i=r;return g.defined(i)&&g.typedArray(i.diagnostics,Bt.is)&&(i.only===void 0||g.typedArray(i.only,g.string))&&(i.triggerKind===void 0||i.triggerKind===Zn.Invoked||i.triggerKind===Zn.Automatic)}n.is=t})(Qr||(Qr={}));var Ht;(function(n){function e(r,i,s){let a={title:r},l=!0;return typeof i=="string"?(l=!1,a.kind=i):Me.is(i)?a.command=i:a.edit=i,l&&s!==void 0&&(a.kind=s),a}n.create=e;function t(r){let i=r;return i&&g.string(i.title)&&(i.diagnostics===void 0||g.typedArray(i.diagnostics,Bt.is))&&(i.kind===void 0||g.string(i.kind))&&(i.edit!==void 0||i.command!==void 0)&&(i.command===void 0||Me.is(i.command))&&(i.isPreferred===void 0||g.boolean(i.isPreferred))&&(i.edit===void 0||Qn.is(i.edit))}n.is=t})(Ht||(Ht={}));var hs;(function(n){function e(r,i){let s={range:r};return g.defined(i)&&(s.data=i),s}n.create=e;function t(r){let i=r;return g.defined(i)&&R.is(i.range)&&(g.undefined(i.command)||Me.is(i.command))}n.is=t})(hs||(hs={}));var ps;(function(n){function e(r,i){return{tabSize:r,insertSpaces:i}}n.create=e;function t(r){let i=r;return g.defined(i)&&g.uinteger(i.tabSize)&&g.boolean(i.insertSpaces)}n.is=t})(ps||(ps={}));var Zr;(function(n){function e(r,i,s){return{range:r,target:i,data:s}}n.create=e;function t(r){let i=r;return g.defined(i)&&R.is(i.range)&&(g.undefined(i.target)||g.string(i.target))}n.is=t})(Zr||(Zr={}));var kt;(function(n){function e(r,i){return{range:r,parent:i}}n.create=e;function t(r){let i=r;return g.objectLiteral(i)&&R.is(i.range)&&(i.parent===void 0||n.is(i.parent))}n.is=t})(kt||(kt={}));var ms;(function(n){n.namespace="namespace",n.type="type",n.class="class",n.enum="enum",n.interface="interface",n.struct="struct",n.typeParameter="typeParameter",n.parameter="parameter",n.variable="variable",n.property="property",n.enumMember="enumMember",n.event="event",n.function="function",n.method="method",n.macro="macro",n.keyword="keyword",n.modifier="modifier",n.comment="comment",n.string="string",n.number="number",n.regexp="regexp",n.operator="operator",n.decorator="decorator"})(ms||(ms={}));var us;(function(n){n.declaration="declaration",n.definition="definition",n.readonly="readonly",n.static="static",n.deprecated="deprecated",n.abstract="abstract",n.async="async",n.modification="modification",n.documentation="documentation",n.defaultLibrary="defaultLibrary"})(us||(us={}));var fs;(function(n){function e(t){let r=t;return g.objectLiteral(r)&&(r.resultId===void 0||typeof r.resultId=="string")&&Array.isArray(r.data)&&(r.data.length===0||typeof r.data[0]=="number")}n.is=e})(fs||(fs={}));var gs;(function(n){function e(r,i){return{range:r,text:i}}n.create=e;function t(r){let i=r;return i!=null&&R.is(i.range)&&g.string(i.text)}n.is=t})(gs||(gs={}));var bs;(function(n){function e(r,i,s){return{range:r,variableName:i,caseSensitiveLookup:s}}n.create=e;function t(r){let i=r;return i!=null&&R.is(i.range)&&g.boolean(i.caseSensitiveLookup)&&(g.string(i.variableName)||i.variableName===void 0)}n.is=t})(bs||(bs={}));var ws;(function(n){function e(r,i){return{range:r,expression:i}}n.create=e;function t(r){let i=r;return i!=null&&R.is(i.range)&&(g.string(i.expression)||i.expression===void 0)}n.is=t})(ws||(ws={}));var vs;(function(n){function e(r,i){return{frameId:r,stoppedLocation:i}}n.create=e;function t(r){let i=r;return g.defined(i)&&R.is(r.stoppedLocation)}n.is=t})(vs||(vs={}));var ei;(function(n){n.Type=1,n.Parameter=2;function e(t){return t===1||t===2}n.is=e})(ei||(ei={}));var ti;(function(n){function e(r){return{value:r}}n.create=e;function t(r){let i=r;return g.objectLiteral(i)&&(i.tooltip===void 0||g.string(i.tooltip)||Ct.is(i.tooltip))&&(i.location===void 0||it.is(i.location))&&(i.command===void 0||Me.is(i.command))}n.is=t})(ti||(ti={}));var ys;(function(n){function e(r,i,s){let a={position:r,label:i};return s!==void 0&&(a.kind=s),a}n.create=e;function t(r){let i=r;return g.objectLiteral(i)&&H.is(i.position)&&(g.string(i.label)||g.typedArray(i.label,ti.is))&&(i.kind===void 0||ei.is(i.kind))&&i.textEdits===void 0||g.typedArray(i.textEdits,_.is)&&(i.tooltip===void 0||g.string(i.tooltip)||Ct.is(i.tooltip))&&(i.paddingLeft===void 0||g.boolean(i.paddingLeft))&&(i.paddingRight===void 0||g.boolean(i.paddingRight))}n.is=t})(ys||(ys={}));var xs;(function(n){function e(t){return{kind:"snippet",value:t}}n.createSnippet=e})(xs||(xs={}));var Ss;(function(n){function e(t,r,i,s){return{insertText:t,filterText:r,range:i,command:s}}n.create=e})(Ss||(Ss={}));var Cs;(function(n){function e(t){return{items:t}}n.create=e})(Cs||(Cs={}));var ks;(function(n){n.Invoked=0,n.Automatic=1})(ks||(ks={}));var Fs;(function(n){function e(t,r){return{range:t,text:r}}n.create=e})(Fs||(Fs={}));var Es;(function(n){function e(t,r){return{triggerKind:t,selectedCompletionInfo:r}}n.create=e})(Es||(Es={}));var _s;(function(n){function e(t){let r=t;return g.objectLiteral(r)&&Or.is(r.uri)&&g.string(r.name)}n.is=e})(_s||(_s={}));var Is;(function(n){function e(s,a,l,o){return new ni(s,a,l,o)}n.create=e;function t(s){let a=s;return!!(g.defined(a)&&g.string(a.uri)&&(g.undefined(a.languageId)||g.string(a.languageId))&&g.uinteger(a.lineCount)&&g.func(a.getText)&&g.func(a.positionAt)&&g.func(a.offsetAt))}n.is=t;function r(s,a){let l=s.getText(),o=i(a,(h,u)=>{let w=h.range.start.line-u.range.start.line;return w===0?h.range.start.character-u.range.start.character:w}),d=l.length;for(let h=o.length-1;h>=0;h--){let u=o[h],w=s.offsetAt(u.range.start),b=s.offsetAt(u.range.end);if(b<=d)l=l.substring(0,w)+u.newText+l.substring(b,l.length);else throw new Error("Overlapping edit");d=w}return l}n.applyEdits=r;function i(s,a){if(s.length<=1)return s;let l=s.length/2|0,o=s.slice(0,l),d=s.slice(l);i(o,a),i(d,a);let h=0,u=0,w=0;for(;h0&&e.push(t.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let t=this.getLineOffsets(),r=0,i=t.length;if(i===0)return H.create(0,e);for(;re?i=a:r=a+1}let s=r-1;return H.create(s,e-t[s])}offsetAt(e){let t=this.getLineOffsets();if(e.line>=t.length)return this._content.length;if(e.line<0)return 0;let r=t[e.line],i=e.line+1"u"}n.undefined=r;function i(b){return b===!0||b===!1}n.boolean=i;function s(b){return e.call(b)==="[object String]"}n.string=s;function a(b){return e.call(b)==="[object Number]"}n.number=a;function l(b,y,E){return e.call(b)==="[object Number]"&&y<=b&&b<=E}n.numberRange=l;function o(b){return e.call(b)==="[object Number]"&&-2147483648<=b&&b<=2147483647}n.integer=o;function d(b){return e.call(b)==="[object Number]"&&0<=b&&b<=2147483647}n.uinteger=d;function h(b){return e.call(b)==="[object Function]"}n.func=h;function u(b){return b!==null&&typeof b=="object"}n.objectLiteral=u;function w(b,y){return Array.isArray(b)&&b.every(y)}n.typedArray=w})(g||(g={}));var er=class n{constructor(e,t,r,i){this._uri=e,this._languageId=t,this._version=r,this._content=i,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){let t=this.offsetAt(e.start),r=this.offsetAt(e.end);return this._content.substring(t,r)}return this._content}update(e,t){for(let r of e)if(n.isIncremental(r)){let i=Rs(r.range),s=this.offsetAt(i.start),a=this.offsetAt(i.end);this._content=this._content.substring(0,s)+r.text+this._content.substring(a,this._content.length);let l=Math.max(i.start.line,0),o=Math.max(i.end.line,0),d=this._lineOffsets,h=Ds(r.text,!1,s);if(o-l===h.length)for(let w=0,b=h.length;we?i=a:r=a+1}let s=r-1;return{line:s,character:e-t[s]}}offsetAt(e){let t=this.getLineOffsets();if(e.line>=t.length)return this._content.length;if(e.line<0)return 0;let r=t[e.line],i=e.line+1{let w=h.range.start.line-u.range.start.line;return w===0?h.range.start.character-u.range.start.character:w}),o=0,d=[];for(let h of l){let u=i.offsetAt(h.range.start);if(uo&&d.push(a.substring(o,u)),h.newText.length&&d.push(h.newText),o=i.offsetAt(h.range.end)}return d.push(a.substr(o)),d.join("")}n.applyEdits=r})(Jt||(Jt={}));function ri(n,e){if(n.length<=1)return n;let t=n.length/2|0,r=n.slice(0,t),i=n.slice(t);ri(r,e),ri(i,e);let s=0,a=0,l=0;for(;st.line||e.line===t.line&&e.character>t.character?{start:t,end:e}:n}function na(n){let e=Rs(n.range);return e!==n.range?{newText:n.newText,range:e}:n}var zs;(function(n){n.LATEST={textDocument:{completion:{completionItem:{documentationFormat:[se.Markdown,se.PlainText]}},hover:{contentFormat:[se.Markdown,se.PlainText]}}}})(zs||(zs={}));var st;(function(n){n[n.Unknown=0]="Unknown",n[n.File=1]="File",n[n.Directory=2]="Directory",n[n.SymbolicLink=64]="SymbolicLink"})(st||(st={}));var Ms={E:"Edge",FF:"Firefox",S:"Safari",C:"Chrome",IE:"IE",O:"Opera"};function Ts(n){switch(n){case"experimental":return`\u26A0\uFE0F Property is experimental. Be cautious when using it.\uFE0F - -`;case"nonstandard":return`\u{1F6A8}\uFE0F Property is nonstandard. Avoid using it. - -`;case"obsolete":return`\u{1F6A8}\uFE0F\uFE0F\uFE0F Property is obsolete. Avoid using it. - -`;default:return""}}function Ce(n,e,t){let r;if(e?r={kind:"markdown",value:ia(n,t)}:r={kind:"plaintext",value:ra(n,t)},r.value!=="")return r}function tr(n){return n=n.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&"),n.replace(//g,">")}function ra(n,e){if(!n.description||n.description==="")return"";if(typeof n.description!="string")return n.description.value;let t="";if(e?.documentation!==!1){n.status&&(t+=Ts(n.status)),t+=n.description;let r=Ns(n.browsers);r&&(t+=` -(`+r+")"),"syntax"in n&&(t+=` - -Syntax: ${n.syntax}`)}return n.references&&n.references.length>0&&e?.references!==!1&&(t.length>0&&(t+=` - -`),t+=n.references.map(r=>`${r.name}: ${r.url}`).join(" | ")),t}function ia(n,e){if(!n.description||n.description==="")return"";let t="";if(e?.documentation!==!1){n.status&&(t+=Ts(n.status)),typeof n.description=="string"?t+=tr(n.description):t+=n.description.kind===se.Markdown?n.description.value:tr(n.description.value);let r=Ns(n.browsers);r&&(t+=` - -(`+tr(r)+")"),"syntax"in n&&n.syntax&&(t+=` - -Syntax: ${tr(n.syntax)}`)}return n.references&&n.references.length>0&&e?.references!==!1&&(t.length>0&&(t+=` - -`),t+=n.references.map(r=>`[${r.name}](${r.url})`).join(" | ")),t}function Ns(n=[]){return n.length===0?null:n.map(e=>{let t="",r=e.match(/([A-Z]+)(\d+)?/),i=r[1],s=r[2];return i in Ms&&(t+=Ms[i]),s&&(t+=" "+s),t}).join(", ")}var sa=/(^#([0-9A-F]{3}){1,2}$)|(^#([0-9A-F]{4}){1,2}$)/i,Ws=[{label:"rgb",func:"rgb($red, $green, $blue)",insertText:"rgb(${1:red}, ${2:green}, ${3:blue})",desc:p("Creates a Color from red, green, and blue values.")},{label:"rgba",func:"rgba($red, $green, $blue, $alpha)",insertText:"rgba(${1:red}, ${2:green}, ${3:blue}, ${4:alpha})",desc:p("Creates a Color from red, green, blue, and alpha values.")},{label:"rgb relative",func:"rgb(from $color $red $green $blue)",insertText:"rgb(from ${1:color} ${2:r} ${3:g} ${4:b})",desc:p("Creates a Color from the red, green, and blue values of another Color.")},{label:"hsl",func:"hsl($hue, $saturation, $lightness)",insertText:"hsl(${1:hue}, ${2:saturation}, ${3:lightness})",desc:p("Creates a Color from hue, saturation, and lightness values.")},{label:"hsla",func:"hsla($hue, $saturation, $lightness, $alpha)",insertText:"hsla(${1:hue}, ${2:saturation}, ${3:lightness}, ${4:alpha})",desc:p("Creates a Color from hue, saturation, lightness, and alpha values.")},{label:"hsl relative",func:"hsl(from $color $hue $saturation $lightness)",insertText:"hsl(from ${1:color} ${2:h} ${3:s} ${4:l})",desc:p("Creates a Color from the hue, saturation, and lightness values of another Color.")},{label:"hwb",func:"hwb($hue $white $black)",insertText:"hwb(${1:hue} ${2:white} ${3:black})",desc:p("Creates a Color from hue, white, and black values.")},{label:"hwb relative",func:"hwb(from $color $hue $white $black)",insertText:"hwb(from ${1:color} ${2:h} ${3:w} ${4:b})",desc:p("Creates a Color from the hue, white, and black values of another Color.")},{label:"lab",func:"lab($lightness $a $b)",insertText:"lab(${1:lightness} ${2:a} ${3:b})",desc:p("Creates a Color from lightness, a, and b values.")},{label:"lab relative",func:"lab(from $color $lightness $a $b)",insertText:"lab(from ${1:color} ${2:l} ${3:a} ${4:b})",desc:p("Creates a Color from the lightness, a, and b values of another Color.")},{label:"oklab",func:"oklab($lightness $a $b)",insertText:"oklab(${1:lightness} ${2:a} ${3:b})",desc:p("Creates a Color from lightness, a, and b values.")},{label:"oklab relative",func:"oklab(from $color $lightness $a $b)",insertText:"oklab(from ${1:color} ${2:l} ${3:a} ${4:b})",desc:p("Creates a Color from the lightness, a, and b values of another Color.")},{label:"lch",func:"lch($lightness $chroma $hue)",insertText:"lch(${1:lightness} ${2:chroma} ${3:hue})",desc:p("Creates a Color from lightness, chroma, and hue values.")},{label:"lch relative",func:"lch(from $color $lightness $chroma $hue)",insertText:"lch(from ${1:color} ${2:l} ${3:c} ${4:h})",desc:p("Creates a Color from the lightness, chroma, and hue values of another Color.")},{label:"oklch",func:"oklch($lightness $chroma $hue)",insertText:"oklch(${1:lightness} ${2:chroma} ${3:hue})",desc:p("Creates a Color from lightness, chroma, and hue values.")},{label:"oklch relative",func:"oklch(from $color $lightness $chroma $hue)",insertText:"oklch(from ${1:color} ${2:l} ${3:c} ${4:h})",desc:p("Creates a Color from the lightness, chroma, and hue values of another Color.")},{label:"color",func:"color($color-space $red $green $blue)",insertText:"color(${1|srgb,srgb-linear,display-p3,a98-rgb,prophoto-rgb,rec2020,xyx,xyz-d50,xyz-d65|} ${2:red} ${3:green} ${4:blue})",desc:p("Creates a Color in a specific color space from red, green, and blue values.")},{label:"color relative",func:"color(from $color $color-space $red $green $blue)",insertText:"color(from ${1:color} ${2|srgb,srgb-linear,display-p3,a98-rgb,prophoto-rgb,rec2020,xyx,xyz-d50,xyz-d65|} ${3:r} ${4:g} ${5:b})",desc:p("Creates a Color in a specific color space from the red, green, and blue values of another Color.")},{label:"color-mix",func:"color-mix(in $color-space, $color $percentage, $color $percentage)",insertText:"color-mix(in ${1|srgb,srgb-linear,lab,oklab,xyz,xyz-d50,xyz-d65|}, ${3:color} ${4:percentage}, ${5:color} ${6:percentage})",desc:p("Mix two colors together in a rectangular color space.")},{label:"color-mix hue",func:"color-mix(in $color-space $interpolation-method hue, $color $percentage, $color $percentage)",insertText:"color-mix(in ${1|hsl,hwb,lch,oklch|} ${2|shorter hue,longer hue,increasing hue,decreasing hue|}, ${3:color} ${4:percentage}, ${5:color} ${6:percentage})",desc:p("Mix two colors together in a polar color space.")}],oa=/^(rgb|rgba|hsl|hsla|hwb)$/i,Xt={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rebeccapurple:"#663399",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},aa=new RegExp(`^(${Object.keys(Xt).join("|")})$`,"i"),rr={currentColor:"The value of the 'color' property. The computed value of the 'currentColor' keyword is the computed value of the 'color' property. If the 'currentColor' keyword is set on the 'color' property itself, it is treated as 'color:inherit' at parse time.",transparent:"Fully transparent. This keyword can be considered a shorthand for rgba(0,0,0,0) which is its computed value."},la=new RegExp(`^(${Object.keys(rr).join("|")})$`,"i");function He(n,e){let r=n.getText().match(/^([-+]?[0-9]*\.?[0-9]+)(%?)$/);if(r){r[2]&&(e=100);let i=parseFloat(r[1])/e;if(i>=0&&i<=1)return i}throw new Error}function Os(n){let e=n.getText(),t=e.match(/^([-+]?[0-9]*\.?[0-9]+)(deg|rad|grad|turn)?$/);if(t)switch(t[2]){case"deg":return parseFloat(e)%360;case"rad":return parseFloat(e)*180/Math.PI%360;case"grad":return parseFloat(e)*.9%360;case"turn":return parseFloat(e)*360%360;default:if(typeof t[2]>"u")return parseFloat(e)%360}throw new Error}function Ls(n){let e=n.getName();return e?oa.test(e):!1}function ii(n){return sa.test(n)||aa.test(n)||la.test(n)}var Ps=48,ca=57,da=65;var nr=97,ha=102;function B(n){return n=nr&&n<=ha?n-nr+10:0)}function As(n){if(n[0]!=="#")return null;switch(n.length){case 4:return{red:B(n.charCodeAt(1))*17/255,green:B(n.charCodeAt(2))*17/255,blue:B(n.charCodeAt(3))*17/255,alpha:1};case 5:return{red:B(n.charCodeAt(1))*17/255,green:B(n.charCodeAt(2))*17/255,blue:B(n.charCodeAt(3))*17/255,alpha:B(n.charCodeAt(4))*17/255};case 7:return{red:(B(n.charCodeAt(1))*16+B(n.charCodeAt(2)))/255,green:(B(n.charCodeAt(3))*16+B(n.charCodeAt(4)))/255,blue:(B(n.charCodeAt(5))*16+B(n.charCodeAt(6)))/255,alpha:1};case 9:return{red:(B(n.charCodeAt(1))*16+B(n.charCodeAt(2)))/255,green:(B(n.charCodeAt(3))*16+B(n.charCodeAt(4)))/255,blue:(B(n.charCodeAt(5))*16+B(n.charCodeAt(6)))/255,alpha:(B(n.charCodeAt(7))*16+B(n.charCodeAt(8)))/255}}return null}function $s(n,e,t,r=1){if(n=n/60,e===0)return{red:t,green:t,blue:t,alpha:r};{let i=(l,o,d)=>{for(;d<0;)d+=6;for(;d>=6;)d-=6;return d<1?(o-l)*d+l:d<3?o:d<4?(o-l)*(4-d)+l:l},s=t<=.5?t*(e+1):t+e-t*e,a=t*2-s;return{red:i(a,s,n+2),green:i(a,s,n),blue:i(a,s,n-2),alpha:r}}}function si(n){let e=n.red,t=n.green,r=n.blue,i=n.alpha,s=Math.max(e,t,r),a=Math.min(e,t,r),l=0,o=0,d=(a+s)/2,h=s-a;if(h>0){switch(o=Math.min(d<=.5?h/(2*d):h/(2-2*d),1),s){case e:l=(t-r)/h+(t=1){let o=e/(e+t);return{red:o,green:o,blue:o,alpha:r}}let i=$s(n,1,.5,r),s=i.red;s*=1-e-t,s+=e;let a=i.green;a*=1-e-t,a+=e;let l=i.blue;return l*=1-e-t,l+=e,{red:s,green:a,blue:l,alpha:r}}function Us(n){let e=si(n),t=Math.min(n.red,n.green,n.blue),r=1-Math.max(n.red,n.green,n.blue);return{h:e.h,w:t,b:r,a:e.a}}function Vs(n){if(n.type===m.HexColorValue){let e=n.getText();return As(e)}else if(n.type===m.Function){let e=n,t=e.getName(),r=e.getArguments().getChildren();if(r.length===1){let i=r[0].getChildren();if(i.length===1&&i[0].type===m.Expression&&(r=i[0].getChildren(),r.length===3)){let s=r[2];if(s instanceof qe){let a=s.getLeft(),l=s.getRight(),o=s.getOperator();a&&l&&o&&o.matches("/")&&(r=[r[0],r[1],a,l])}}}if(!t||r.length<3||r.length>4)return null;try{let i=r.length===4?He(r[3],1):1;if(t==="rgb"||t==="rgba")return{red:He(r[0],255),green:He(r[1],255),blue:He(r[2],255),alpha:i};if(t==="hsl"||t==="hsla"){let s=Os(r[0]),a=He(r[1],100),l=He(r[2],100);return $s(s,a,l,i)}else if(t==="hwb"){let s=Os(r[0]),a=He(r[1],100),l=He(r[2],100);return pa(s,a,l,i)}}catch{return null}}else if(n.type===m.Identifier){if(n.parent&&n.parent.type!==m.Term)return null;let e=n.parent;if(e&&e.parent&&e.parent.type===m.BinaryExpression){let i=e.parent;if(i.parent&&i.parent.type===m.ListEntry&&i.parent.key===i)return null}let t=n.getText().toLowerCase();if(t==="none")return null;let r=Xt[t];if(r)return As(r)}return null}var oi={bottom:"Computes to \u2018100%\u2019 for the vertical position if one or two values are given, otherwise specifies the bottom edge as the origin for the next offset.",center:"Computes to \u201850%\u2019 (\u2018left 50%\u2019) for the horizontal position if the horizontal position is not otherwise specified, or \u201850%\u2019 (\u2018top 50%\u2019) for the vertical position if it is.",left:"Computes to \u20180%\u2019 for the horizontal position if one or two values are given, otherwise specifies the left edge as the origin for the next offset.",right:"Computes to \u2018100%\u2019 for the horizontal position if one or two values are given, otherwise specifies the right edge as the origin for the next offset.",top:"Computes to \u20180%\u2019 for the vertical position if one or two values are given, otherwise specifies the top edge as the origin for the next offset."},ai={"no-repeat":"Placed once and not repeated in this direction.",repeat:"Repeated in this direction as often as needed to cover the background painting area.","repeat-x":"Computes to \u2018repeat no-repeat\u2019.","repeat-y":"Computes to \u2018no-repeat repeat\u2019.",round:"Repeated as often as will fit within the background positioning area. If it doesn\u2019t fit a whole number of times, it is rescaled so that it does.",space:"Repeated as often as will fit within the background positioning area without being clipped and then the images are spaced out to fill the area."},li={dashed:"A series of square-ended dashes.",dotted:"A series of round dots.",double:"Two parallel solid lines with some space between them.",groove:"Looks as if it were carved in the canvas.",hidden:"Same as \u2018none\u2019, but has different behavior in the border conflict resolution rules for border-collapsed tables.",inset:"Looks as if the content on the inside of the border is sunken into the canvas.",none:"No border. Color and width are ignored.",outset:"Looks as if the content on the inside of the border is coming out of the canvas.",ridge:"Looks as if it were coming out of the canvas.",solid:"A single line segment."},js=["medium","thick","thin"],ci={"border-box":"The background is painted within (clipped to) the border box.","content-box":"The background is painted within (clipped to) the content box.","padding-box":"The background is painted within (clipped to) the padding box."},di={"margin-box":"Uses the margin box as reference box.","fill-box":"Uses the object bounding box as reference box.","stroke-box":"Uses the stroke bounding box as reference box.","view-box":"Uses the nearest SVG viewport as reference box."},hi={initial:"Represents the value specified as the property\u2019s initial value.",inherit:"Represents the computed value of the property on the element\u2019s parent.",unset:"Acts as either `inherit` or `initial`, depending on whether the property is inherited or not."},pi={"var()":"Evaluates the value of a custom variable.","calc()":"Evaluates an mathematical expression. The following operators can be used: + - * /."},mi={"url()":"Reference an image file by URL","image()":"Provide image fallbacks and annotations.","-webkit-image-set()":"Provide multiple resolutions. Remember to use unprefixed image-set() in addition.","image-set()":"Provide multiple resolutions of an image and const the UA decide which is most appropriate in a given situation.","-moz-element()":"Use an element in the document as an image. Remember to use unprefixed element() in addition.","element()":"Use an element in the document as an image.","cross-fade()":"Indicates the two images to be combined and how far along in the transition the combination is.","-webkit-gradient()":"Deprecated. Use modern linear-gradient() or radial-gradient() instead.","-webkit-linear-gradient()":"Linear gradient. Remember to use unprefixed version in addition.","-moz-linear-gradient()":"Linear gradient. Remember to use unprefixed version in addition.","-o-linear-gradient()":"Linear gradient. Remember to use unprefixed version in addition.","linear-gradient()":"A linear gradient is created by specifying a straight gradient line, and then several colors placed along that line.","-webkit-repeating-linear-gradient()":"Repeating Linear gradient. Remember to use unprefixed version in addition.","-moz-repeating-linear-gradient()":"Repeating Linear gradient. Remember to use unprefixed version in addition.","-o-repeating-linear-gradient()":"Repeating Linear gradient. Remember to use unprefixed version in addition.","repeating-linear-gradient()":"Same as linear-gradient, except the color-stops are repeated infinitely in both directions, with their positions shifted by multiples of the difference between the last specified color-stop\u2019s position and the first specified color-stop\u2019s position.","-webkit-radial-gradient()":"Radial gradient. Remember to use unprefixed version in addition.","-moz-radial-gradient()":"Radial gradient. Remember to use unprefixed version in addition.","radial-gradient()":"Colors emerge from a single point and smoothly spread outward in a circular or elliptical shape.","-webkit-repeating-radial-gradient()":"Repeating radial gradient. Remember to use unprefixed version in addition.","-moz-repeating-radial-gradient()":"Repeating radial gradient. Remember to use unprefixed version in addition.","repeating-radial-gradient()":"Same as radial-gradient, except the color-stops are repeated infinitely in both directions, with their positions shifted by multiples of the difference between the last specified color-stop\u2019s position and the first specified color-stop\u2019s position."},ui={ease:"Equivalent to cubic-bezier(0.25, 0.1, 0.25, 1.0).","ease-in":"Equivalent to cubic-bezier(0.42, 0, 1.0, 1.0).","ease-in-out":"Equivalent to cubic-bezier(0.42, 0, 0.58, 1.0).","ease-out":"Equivalent to cubic-bezier(0, 0, 0.58, 1.0).",linear:"Equivalent to cubic-bezier(0.0, 0.0, 1.0, 1.0).","step-end":"Equivalent to steps(1, end).","step-start":"Equivalent to steps(1, start).","steps()":"The first parameter specifies the number of intervals in the function. The second parameter, which is optional, is either the value \u201Cstart\u201D or \u201Cend\u201D.","cubic-bezier()":"Specifies a cubic-bezier curve. The four values specify points P1 and P2 of the curve as (x1, y1, x2, y2).","cubic-bezier(0.6, -0.28, 0.735, 0.045)":"Ease-in Back. Overshoots.","cubic-bezier(0.68, -0.55, 0.265, 1.55)":"Ease-in-out Back. Overshoots.","cubic-bezier(0.175, 0.885, 0.32, 1.275)":"Ease-out Back. Overshoots.","cubic-bezier(0.6, 0.04, 0.98, 0.335)":"Ease-in Circular. Based on half circle.","cubic-bezier(0.785, 0.135, 0.15, 0.86)":"Ease-in-out Circular. Based on half circle.","cubic-bezier(0.075, 0.82, 0.165, 1)":"Ease-out Circular. Based on half circle.","cubic-bezier(0.55, 0.055, 0.675, 0.19)":"Ease-in Cubic. Based on power of three.","cubic-bezier(0.645, 0.045, 0.355, 1)":"Ease-in-out Cubic. Based on power of three.","cubic-bezier(0.215, 0.610, 0.355, 1)":"Ease-out Cubic. Based on power of three.","cubic-bezier(0.95, 0.05, 0.795, 0.035)":"Ease-in Exponential. Based on two to the power ten.","cubic-bezier(1, 0, 0, 1)":"Ease-in-out Exponential. Based on two to the power ten.","cubic-bezier(0.19, 1, 0.22, 1)":"Ease-out Exponential. Based on two to the power ten.","cubic-bezier(0.47, 0, 0.745, 0.715)":"Ease-in Sine.","cubic-bezier(0.445, 0.05, 0.55, 0.95)":"Ease-in-out Sine.","cubic-bezier(0.39, 0.575, 0.565, 1)":"Ease-out Sine.","cubic-bezier(0.55, 0.085, 0.68, 0.53)":"Ease-in Quadratic. Based on power of two.","cubic-bezier(0.455, 0.03, 0.515, 0.955)":"Ease-in-out Quadratic. Based on power of two.","cubic-bezier(0.25, 0.46, 0.45, 0.94)":"Ease-out Quadratic. Based on power of two.","cubic-bezier(0.895, 0.03, 0.685, 0.22)":"Ease-in Quartic. Based on power of four.","cubic-bezier(0.77, 0, 0.175, 1)":"Ease-in-out Quartic. Based on power of four.","cubic-bezier(0.165, 0.84, 0.44, 1)":"Ease-out Quartic. Based on power of four.","cubic-bezier(0.755, 0.05, 0.855, 0.06)":"Ease-in Quintic. Based on power of five.","cubic-bezier(0.86, 0, 0.07, 1)":"Ease-in-out Quintic. Based on power of five.","cubic-bezier(0.23, 1, 0.320, 1)":"Ease-out Quintic. Based on power of five."},fi={"circle()":"Defines a circle.","ellipse()":"Defines an ellipse.","inset()":"Defines an inset rectangle.","polygon()":"Defines a polygon."},ir={length:["cap","ch","cm","cqb","cqh","cqi","cqmax","cqmin","cqw","dvb","dvh","dvi","dvw","em","ex","ic","in","lh","lvb","lvh","lvi","lvw","mm","pc","pt","px","q","rcap","rch","rem","rex","ric","rlh","svb","svh","svi","svw","vb","vh","vi","vmax","vmin","vw"],angle:["deg","rad","grad","turn"],time:["ms","s"],frequency:["Hz","kHz"],resolution:["dpi","dpcm","dppx"],percentage:["%","fr"]},Bs=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","const","video","wbr"],qs=["circle","clipPath","cursor","defs","desc","ellipse","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","filter","foreignObject","g","hatch","hatchpath","image","line","linearGradient","marker","mask","mesh","meshpatch","meshrow","metadata","mpath","path","pattern","polygon","polyline","radialGradient","rect","set","solidcolor","stop","svg","switch","symbol","text","textPath","tspan","use","view"],Ks=["@bottom-center","@bottom-left","@bottom-left-corner","@bottom-right","@bottom-right-corner","@left-bottom","@left-middle","@left-top","@right-bottom","@right-middle","@right-top","@top-center","@top-left","@top-left-corner","@top-right","@top-right-corner"];function Yt(n){return Object.keys(n).map(e=>n[e])}function ie(n){return typeof n<"u"}var ke=class{constructor(e=new ce){this.keyframeRegex=/^@(\-(webkit|ms|moz|o)\-)?keyframes$/i,this.scanner=e,this.token={type:c.EOF,offset:-1,len:0,text:""},this.prevToken=void 0}peekIdent(e){return c.Ident===this.token.type&&e.length===this.token.text.length&&e===this.token.text.toLowerCase()}peekKeyword(e){return c.AtKeyword===this.token.type&&e.length===this.token.text.length&&e===this.token.text.toLowerCase()}peekDelim(e){return c.Delim===this.token.type&&e===this.token.text}peek(e){return e===this.token.type}peekOne(...e){return e.indexOf(this.token.type)!==-1}peekRegExp(e,t){return e!==this.token.type?!1:t.test(this.token.text)}hasWhitespace(){return!!this.prevToken&&this.prevToken.offset+this.prevToken.len!==this.token.offset}consumeToken(){this.prevToken=this.token,this.token=this.scanner.scan()}acceptUnicodeRange(){let e=this.scanner.tryScanUnicode();return e?(this.prevToken=e,this.token=this.scanner.scan(),!0):!1}mark(){return{prev:this.prevToken,curr:this.token,pos:this.scanner.pos()}}restoreAtMark(e){this.prevToken=e.prev,this.token=e.curr,this.scanner.goBackTo(e.pos)}try(e){let t=this.mark(),r=e();return r||(this.restoreAtMark(t),null)}acceptOneKeyword(e){if(c.AtKeyword===this.token.type){for(let t of e)if(t.length===this.token.text.length&&t===this.token.text.toLowerCase())return this.consumeToken(),!0}return!1}accept(e){return e===this.token.type?(this.consumeToken(),!0):!1}acceptIdent(e){return this.peekIdent(e)?(this.consumeToken(),!0):!1}acceptKeyword(e){return this.peekKeyword(e)?(this.consumeToken(),!0):!1}acceptDelim(e){return this.peekDelim(e)?(this.consumeToken(),!0):!1}acceptRegexp(e){return e.test(this.token.text)?(this.consumeToken(),!0):!1}_parseRegexp(e){let t=this.createNode(m.Identifier);do;while(this.acceptRegexp(e));return this.finish(t)}acceptUnquotedString(){let e=this.scanner.pos();this.scanner.goBackTo(this.token.offset);let t=this.scanner.scanUnquotedString();return t?(this.token=t,this.consumeToken(),!0):(this.scanner.goBackTo(e),!1)}resync(e,t){for(;;){if(e&&e.indexOf(this.token.type)!==-1)return this.consumeToken(),!0;if(t&&t.indexOf(this.token.type)!==-1)return!0;if(this.token.type===c.EOF)return!1;this.token=this.scanner.scan()}}createNode(e){return new x(this.token.offset,this.token.len,e)}create(e){return new e(this.token.offset,this.token.len)}finish(e,t,r,i){if(!(e instanceof J)&&(t&&this.markError(e,t,r,i),this.prevToken)){let s=this.prevToken.offset+this.prevToken.len;e.length=s>e.offset?s-e.offset:0}return e}markError(e,t,r,i){this.token!==this.lastErrorToken&&(e.addIssue(new wt(e,t,ee.Error,void 0,this.token.offset,this.token.len)),this.lastErrorToken=this.token),(r||i)&&this.resync(r,i)}parseStylesheet(e){let t=e.version,r=e.getText(),i=(s,a)=>{if(e.version!==t)throw new Error("Underlying model has changed, AST is no longer valid");return r.substr(s,a)};return this.internalParse(r,this._parseStylesheet,i)}internalParse(e,t,r){this.scanner.setSource(e),this.token=this.scanner.scan();let i=t.bind(this)();return i&&(r?i.textProvider=r:i.textProvider=(s,a)=>e.substr(s,a)),i}_parseStylesheet(){let e=this.create(bn);for(;e.addChild(this._parseStylesheetStart()););let t=!1;do{let r=!1;do{r=!1;let i=this._parseStylesheetStatement();for(i&&(e.addChild(i),r=!0,t=!1,!this.peek(c.EOF)&&this._needsSemicolonAfter(i)&&!this.accept(c.SemiColon)&&this.markError(e,f.SemiColonExpected));this.accept(c.SemiColon)||this.accept(c.CDO)||this.accept(c.CDC);)r=!0,t=!1}while(r);if(this.peek(c.EOF))break;t||(this.peek(c.AtKeyword)?this.markError(e,f.UnknownAtRule):this.markError(e,f.RuleOrSelectorExpected),t=!0),this.consumeToken()}while(!this.peek(c.EOF));return this.finish(e)}_parseStylesheetStart(){return this._parseCharset()}_parseStylesheetStatement(e=!1){return this.peek(c.AtKeyword)?this._parseStylesheetAtStatement(e):this._parseRuleset(e)}_parseStylesheetAtStatement(e=!1){return this._parseImport()||this._parseMedia(e)||this._parsePage()||this._parseFontFace()||this._parseKeyframe()||this._parseSupports(e)||this._parseLayer(e)||this._parsePropertyAtRule()||this._parseViewPort()||this._parseNamespace()||this._parseDocument()||this._parseContainer(e)||this._parseUnknownAtRule()}_tryParseRuleset(e){let t=this.mark();if(this._parseSelector(e)){for(;this.accept(c.Comma)&&this._parseSelector(e););if(this.accept(c.CurlyL))return this.restoreAtMark(t),this._parseRuleset(e)}return this.restoreAtMark(t),null}_parseRuleset(e=!1){let t=this.create(ae),r=t.getSelectors();if(!r.addChild(this._parseSelector(e)))return null;for(;this.accept(c.Comma);)if(!r.addChild(this._parseSelector(e)))return this.finish(t,f.SelectorExpected);return this._parseBody(t,this._parseRuleSetDeclaration.bind(this))}_parseRuleSetDeclarationAtStatement(){return this._parseMedia(!0)||this._parseSupports(!0)||this._parseLayer(!0)||this._parseContainer(!0)||this._parseUnknownAtRule()}_parseRuleSetDeclaration(){return this.peek(c.AtKeyword)?this._parseRuleSetDeclarationAtStatement():this.peek(c.Ident)?this._tryParseRuleset(!0)||this._parseDeclaration():this._parseRuleset(!0)}_needsSemicolonAfter(e){switch(e.type){case m.Keyframe:case m.ViewPort:case m.Media:case m.Ruleset:case m.Namespace:case m.If:case m.For:case m.Each:case m.While:case m.MixinDeclaration:case m.FunctionDeclaration:case m.MixinContentDeclaration:return!1;case m.ExtendsReference:case m.MixinContentReference:case m.ReturnStatement:case m.MediaQuery:case m.Debug:case m.Import:case m.AtApplyRule:case m.CustomPropertyDeclaration:return!0;case m.VariableDeclaration:return e.needsSemicolon;case m.MixinReference:return!e.getContent();case m.Declaration:return!e.getNestedProperties()}return!1}_parseDeclarations(e){let t=this.create(Ze);if(!this.accept(c.CurlyL))return null;let r=e();for(;t.addChild(r)&&!this.peek(c.CurlyR);){if(this._needsSemicolonAfter(r)&&!this.accept(c.SemiColon))return this.finish(t,f.SemiColonExpected,[c.SemiColon,c.CurlyR]);for(r&&this.prevToken&&this.prevToken.type===c.SemiColon&&(r.semicolonPosition=this.prevToken.offset);this.accept(c.SemiColon););r=e()}return this.accept(c.CurlyR)?this.finish(t):this.finish(t,f.RightCurlyExpected,[c.CurlyR,c.SemiColon])}_parseBody(e,t){return e.setDeclarations(this._parseDeclarations(t))?this.finish(e):this.finish(e,f.LeftCurlyExpected,[c.CurlyR,c.SemiColon])}_parseSelector(e){let t=this.create(de),r=!1;for(e&&(r=t.addChild(this._parseCombinator()));t.addChild(this._parseSimpleSelector());)r=!0,t.addChild(this._parseCombinator());return r?this.finish(t):null}_parseDeclaration(e){let t=this._tryParseCustomPropertyDeclaration(e);if(t)return t;let r=this.create(Q);return r.setProperty(this._parseProperty())?this.accept(c.Colon)?(this.prevToken&&(r.colonPosition=this.prevToken.offset),r.setValue(this._parseExpr())?(r.addChild(this._parsePrio()),this.peek(c.SemiColon)&&(r.semicolonPosition=this.token.offset),this.finish(r)):this.finish(r,f.PropertyValueExpected)):this.finish(r,f.ColonExpected,[c.Colon],e||[c.SemiColon]):null}_tryParseCustomPropertyDeclaration(e){if(!this.peekRegExp(c.Ident,/^--/))return null;let t=this.create(vn);if(!t.setProperty(this._parseProperty()))return null;if(!this.accept(c.Colon))return this.finish(t,f.ColonExpected,[c.Colon]);this.prevToken&&(t.colonPosition=this.prevToken.offset);let r=this.mark();if(this.peek(c.CurlyL)){let s=this.create(wn),a=this._parseDeclarations(this._parseRuleSetDeclaration.bind(this));if(s.setDeclarations(a)&&!a.isErroneous(!0)&&(s.addChild(this._parsePrio()),this.peek(c.SemiColon)))return this.finish(s),t.setPropertySet(s),t.semicolonPosition=this.token.offset,this.finish(t);this.restoreAtMark(r)}let i=this._parseExpr();return i&&!i.isErroneous(!0)&&(this._parsePrio(),this.peekOne(...e||[],c.SemiColon,c.EOF))?(t.setValue(i),this.peek(c.SemiColon)&&(t.semicolonPosition=this.token.offset),this.finish(t)):(this.restoreAtMark(r),t.addChild(this._parseCustomPropertyValue(e)),t.addChild(this._parsePrio()),ie(t.colonPosition)&&this.token.offset===t.colonPosition+1?this.finish(t,f.PropertyValueExpected):this.finish(t))}_parseCustomPropertyValue(e=[c.CurlyR]){let t=this.create(x),r=()=>s===0&&a===0&&l===0,i=()=>e.indexOf(this.token.type)!==-1,s=0,a=0,l=0;e:for(;;){switch(this.token.type){case c.SemiColon:if(r())break e;break;case c.Exclamation:if(r())break e;break;case c.CurlyL:s++;break;case c.CurlyR:if(s--,s<0){if(i()&&a===0&&l===0)break e;return this.finish(t,f.LeftCurlyExpected)}break;case c.ParenthesisL:a++;break;case c.ParenthesisR:if(a--,a<0){if(i()&&l===0&&s===0)break e;return this.finish(t,f.LeftParenthesisExpected)}break;case c.BracketL:l++;break;case c.BracketR:if(l--,l<0)return this.finish(t,f.LeftSquareBracketExpected);break;case c.BadString:break e;case c.EOF:let o=f.RightCurlyExpected;return l>0?o=f.RightSquareBracketExpected:a>0&&(o=f.RightParenthesisExpected),this.finish(t,o)}this.consumeToken()}return this.finish(t)}_tryToParseDeclaration(e){let t=this.mark();return this._parseProperty()&&this.accept(c.Colon)?(this.restoreAtMark(t),this._parseDeclaration(e)):(this.restoreAtMark(t),null)}_parseProperty(){let e=this.create(Ve),t=this.mark();return(this.acceptDelim("*")||this.acceptDelim("_"))&&this.hasWhitespace()?(this.restoreAtMark(t),null):e.setIdentifier(this._parsePropertyIdentifier())?this.finish(e):null}_parsePropertyIdentifier(){return this._parseIdent()}_parseCharset(){if(!this.peek(c.Charset))return null;let e=this.create(x);return this.consumeToken(),this.accept(c.String)?this.accept(c.SemiColon)?this.finish(e):this.finish(e,f.SemiColonExpected):this.finish(e,f.IdentifierExpected)}_parseImport(){if(!this.peekKeyword("@import"))return null;let e=this.create(je);return this.consumeToken(),!e.addChild(this._parseURILiteral())&&!e.addChild(this._parseStringLiteral())?this.finish(e,f.URIOrStringExpected):this._completeParseImport(e)}_completeParseImport(e){if(this.acceptIdent("layer")&&this.accept(c.ParenthesisL)){if(!e.addChild(this._parseLayerName()))return this.finish(e,f.IdentifierExpected,[c.SemiColon]);if(!this.accept(c.ParenthesisR))return this.finish(e,f.RightParenthesisExpected,[c.ParenthesisR],[])}return this.acceptIdent("supports")&&this.accept(c.ParenthesisL)&&(e.addChild(this._tryToParseDeclaration()||this._parseSupportsCondition()),!this.accept(c.ParenthesisR))?this.finish(e,f.RightParenthesisExpected,[c.ParenthesisR],[]):(!this.peek(c.SemiColon)&&!this.peek(c.EOF)&&e.setMedialist(this._parseMediaQueryList()),this.finish(e))}_parseNamespace(){if(!this.peekKeyword("@namespace"))return null;let e=this.create(Rn);return this.consumeToken(),!e.addChild(this._parseURILiteral())&&(e.addChild(this._parseIdent()),!e.addChild(this._parseURILiteral())&&!e.addChild(this._parseStringLiteral()))?this.finish(e,f.URIExpected,[c.SemiColon]):this.accept(c.SemiColon)?this.finish(e):this.finish(e,f.SemiColonExpected)}_parseFontFace(){if(!this.peekKeyword("@font-face"))return null;let e=this.create(pt);return this.consumeToken(),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))}_parseViewPort(){if(!this.peekKeyword("@-ms-viewport")&&!this.peekKeyword("@-o-viewport")&&!this.peekKeyword("@viewport"))return null;let e=this.create(Fn);return this.consumeToken(),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))}_parseKeyframe(){if(!this.peekRegExp(c.AtKeyword,this.keyframeRegex))return null;let e=this.create(mt),t=this.create(x);return this.consumeToken(),e.setKeyword(this.finish(t)),t.matches("@-ms-keyframes")&&this.markError(t,f.UnknownKeyword),e.setIdentifier(this._parseKeyframeIdent())?this._parseBody(e,this._parseKeyframeSelector.bind(this)):this.finish(e,f.IdentifierExpected,[c.CurlyR])}_parseKeyframeIdent(){return this._parseIdent([z.Keyframe])}_parseKeyframeSelector(){let e=this.create(Vt),t=!1;if(e.addChild(this._parseIdent())&&(t=!0),this.accept(c.Percentage)&&(t=!0),!t)return null;for(;this.accept(c.Comma);)if(t=!1,e.addChild(this._parseIdent())&&(t=!0),this.accept(c.Percentage)&&(t=!0),!t)return this.finish(e,f.PercentageExpected);return this._parseBody(e,this._parseRuleSetDeclaration.bind(this))}_tryParseKeyframeSelector(){let e=this.create(Vt),t=this.mark(),r=!1;if(e.addChild(this._parseIdent())&&(r=!0),this.accept(c.Percentage)&&(r=!0),!r)return null;for(;this.accept(c.Comma);)if(r=!1,e.addChild(this._parseIdent())&&(r=!0),this.accept(c.Percentage)&&(r=!0),!r)return this.restoreAtMark(t),null;return this.peek(c.CurlyL)?this._parseBody(e,this._parseRuleSetDeclaration.bind(this)):(this.restoreAtMark(t),null)}_parsePropertyAtRule(){if(!this.peekKeyword("@property"))return null;let e=this.create(Mn);return this.consumeToken(),!this.peekRegExp(c.Ident,/^--/)||!e.setName(this._parseIdent([z.Property]))?this.finish(e,f.IdentifierExpected):this._parseBody(e,this._parseDeclaration.bind(this))}_parseLayer(e=!1){if(!this.peekKeyword("@layer"))return null;let t=this.create(zn);this.consumeToken();let r=this._parseLayerNameList();return r&&t.setNames(r),(!r||r.getChildren().length===1)&&this.peek(c.CurlyL)?this._parseBody(t,this._parseLayerDeclaration.bind(this,e)):this.accept(c.SemiColon)?this.finish(t):this.finish(t,f.SemiColonExpected)}_parseLayerDeclaration(e=!1){return e?this._tryParseRuleset(!0)||this._tryToParseDeclaration()||this._parseStylesheetStatement(!0):this._parseStylesheetStatement(!1)}_parseLayerNameList(){let e=this.createNode(m.LayerNameList);if(!e.addChild(this._parseLayerName()))return null;for(;this.accept(c.Comma);)if(!e.addChild(this._parseLayerName()))return this.finish(e,f.IdentifierExpected);return this.finish(e)}_parseLayerName(){let e=this.createNode(m.LayerName);if(!e.addChild(this._parseIdent()))return null;for(;!this.hasWhitespace()&&this.acceptDelim(".");)if(this.hasWhitespace()||!e.addChild(this._parseIdent()))return this.finish(e,f.IdentifierExpected);return this.finish(e)}_parseSupports(e=!1){if(!this.peekKeyword("@supports"))return null;let t=this.create(et);return this.consumeToken(),t.addChild(this._parseSupportsCondition()),this._parseBody(t,this._parseSupportsDeclaration.bind(this,e))}_parseSupportsDeclaration(e=!1){return e?this._tryParseRuleset(!0)||this._tryToParseDeclaration()||this._parseStylesheetStatement(!0):this._parseStylesheetStatement(!1)}_parseSupportsCondition(){let e=this.create(Re);if(this.acceptIdent("not"))e.addChild(this._parseSupportsConditionInParens());else if(e.addChild(this._parseSupportsConditionInParens()),this.peekRegExp(c.Ident,/^(and|or)$/i)){let t=this.token.text.toLowerCase();for(;this.acceptIdent(t);)e.addChild(this._parseSupportsConditionInParens())}return this.finish(e)}_parseSupportsConditionInParens(){let e=this.create(Re);if(this.accept(c.ParenthesisL))return this.prevToken&&(e.lParent=this.prevToken.offset),!e.addChild(this._tryToParseDeclaration([c.ParenthesisR]))&&!this._parseSupportsCondition()?this.finish(e,f.ConditionExpected):this.accept(c.ParenthesisR)?(this.prevToken&&(e.rParent=this.prevToken.offset),this.finish(e)):this.finish(e,f.RightParenthesisExpected,[c.ParenthesisR],[]);if(this.peek(c.Ident)){let t=this.mark();if(this.consumeToken(),!this.hasWhitespace()&&this.accept(c.ParenthesisL)){let r=1;for(;this.token.type!==c.EOF&&r!==0;)this.token.type===c.ParenthesisL?r++:this.token.type===c.ParenthesisR&&r--,this.consumeToken();return this.finish(e)}else this.restoreAtMark(t)}return this.finish(e,f.LeftParenthesisExpected,[],[c.ParenthesisL])}_parseMediaDeclaration(e=!1){return e?this._tryParseRuleset(!0)||this._tryToParseDeclaration()||this._parseStylesheetStatement(!0):this._parseStylesheetStatement(!1)}_parseMedia(e=!1){if(!this.peekKeyword("@media"))return null;let t=this.create(Be);return this.consumeToken(),t.addChild(this._parseMediaQueryList())?this._parseBody(t,this._parseMediaDeclaration.bind(this,e)):this.finish(t,f.MediaQueryExpected)}_parseMediaQueryList(){let e=this.create(ut);if(!e.addChild(this._parseMediaQuery()))return this.finish(e,f.MediaQueryExpected);for(;this.accept(c.Comma);)if(!e.addChild(this._parseMediaQuery()))return this.finish(e,f.MediaQueryExpected);return this.finish(e)}_parseMediaQuery(){let e=this.create(ft),t=this.mark();if(this.acceptIdent("not"),this.peek(c.ParenthesisL))this.restoreAtMark(t),e.addChild(this._parseMediaCondition());else{if(this.acceptIdent("only"),!e.addChild(this._parseIdent()))return null;this.acceptIdent("and")&&e.addChild(this._parseMediaCondition())}return this.finish(e)}_parseRatio(){let e=this.mark(),t=this.create(Un);return this._parseNumeric()?this.acceptDelim("/")?this._parseNumeric()?this.finish(t):this.finish(t,f.NumberExpected):(this.restoreAtMark(e),null):null}_parseMediaCondition(){let e=this.create(On);this.acceptIdent("not");let t=!0;for(;t;){if(!this.accept(c.ParenthesisL))return this.finish(e,f.LeftParenthesisExpected,[],[c.CurlyL]);if(this.peek(c.ParenthesisL)||this.peekIdent("not")?e.addChild(this._parseMediaCondition()):e.addChild(this._parseMediaFeature()),!this.accept(c.ParenthesisR))return this.finish(e,f.RightParenthesisExpected,[],[c.CurlyL]);t=this.acceptIdent("and")||this.acceptIdent("or")}return this.finish(e)}_parseMediaFeature(){let e=[c.ParenthesisR],t=this.create(Pn);if(t.addChild(this._parseMediaFeatureName())){if(this.accept(c.Colon)){if(!t.addChild(this._parseMediaFeatureValue()))return this.finish(t,f.TermExpected,[],e)}else if(this._parseMediaFeatureRangeOperator()){if(!t.addChild(this._parseMediaFeatureValue()))return this.finish(t,f.TermExpected,[],e);if(this._parseMediaFeatureRangeOperator()&&!t.addChild(this._parseMediaFeatureValue()))return this.finish(t,f.TermExpected,[],e)}}else if(t.addChild(this._parseMediaFeatureValue())){if(!this._parseMediaFeatureRangeOperator())return this.finish(t,f.OperatorExpected,[],e);if(!t.addChild(this._parseMediaFeatureName()))return this.finish(t,f.IdentifierExpected,[],e);if(this._parseMediaFeatureRangeOperator()&&!t.addChild(this._parseMediaFeatureValue()))return this.finish(t,f.TermExpected,[],e)}else return this.finish(t,f.IdentifierExpected,[],e);return this.finish(t)}_parseMediaFeatureRangeOperator(){return this.acceptDelim("<")||this.acceptDelim(">")?(this.hasWhitespace()||this.acceptDelim("="),!0):!!this.acceptDelim("=")}_parseMediaFeatureName(){return this._parseIdent()}_parseMediaFeatureValue(){return this._parseRatio()||this._parseTermExpression()}_parseMedium(){let e=this.create(x);return e.addChild(this._parseIdent())?this.finish(e):null}_parsePageDeclaration(){return this._parsePageMarginBox()||this._parseRuleSetDeclaration()}_parsePage(){if(!this.peekKeyword("@page"))return null;let e=this.create(An);if(this.consumeToken(),e.addChild(this._parsePageSelector())){for(;this.accept(c.Comma);)if(!e.addChild(this._parsePageSelector()))return this.finish(e,f.IdentifierExpected)}return this._parseBody(e,this._parsePageDeclaration.bind(this))}_parsePageMarginBox(){if(!this.peek(c.AtKeyword))return null;let e=this.create(Wn);return this.acceptOneKeyword(Ks)||this.markError(e,f.UnknownAtRule,[],[c.CurlyL]),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))}_parsePageSelector(){if(!this.peek(c.Ident)&&!this.peek(c.Colon))return null;let e=this.create(x);return e.addChild(this._parseIdent()),this.accept(c.Colon)&&!e.addChild(this._parseIdent())?this.finish(e,f.IdentifierExpected):this.finish(e)}_parseDocument(){if(!this.peekKeyword("@-moz-document"))return null;let e=this.create(Tn);return this.consumeToken(),this.resync([],[c.CurlyL]),this._parseBody(e,this._parseStylesheetStatement.bind(this))}_parseContainerDeclaration(e=!1){return e?this._tryParseRuleset(!0)||this._tryToParseDeclaration()||this._parseStylesheetStatement(!0):this._parseStylesheetStatement(!1)}_parseContainer(e=!1){if(!this.peekKeyword("@container"))return null;let t=this.create(Nn);return this.consumeToken(),t.addChild(this._parseIdent()),t.addChild(this._parseContainerQuery()),this._parseBody(t,this._parseContainerDeclaration.bind(this,e))}_parseContainerQuery(){let e=this.create(x);if(this.acceptIdent("not"))e.addChild(this._parseContainerQueryInParens());else if(e.addChild(this._parseContainerQueryInParens()),this.peekIdent("and"))for(;this.acceptIdent("and");)e.addChild(this._parseContainerQueryInParens());else if(this.peekIdent("or"))for(;this.acceptIdent("or");)e.addChild(this._parseContainerQueryInParens());return this.finish(e)}_parseContainerQueryInParens(){let e=this.create(x);if(this.accept(c.ParenthesisL)){if(this.peekIdent("not")||this.peek(c.ParenthesisL)?e.addChild(this._parseContainerQuery()):e.addChild(this._parseMediaFeature()),!this.accept(c.ParenthesisR))return this.finish(e,f.RightParenthesisExpected,[],[c.CurlyL])}else if(this.acceptIdent("style")){if(this.hasWhitespace()||!this.accept(c.ParenthesisL))return this.finish(e,f.LeftParenthesisExpected,[],[c.CurlyL]);if(e.addChild(this._parseStyleQuery()),!this.accept(c.ParenthesisR))return this.finish(e,f.RightParenthesisExpected,[],[c.CurlyL])}else return this.finish(e,f.LeftParenthesisExpected,[],[c.CurlyL]);return this.finish(e)}_parseStyleQuery(){let e=this.create(x);if(this.acceptIdent("not"))e.addChild(this._parseStyleInParens());else if(this.peek(c.ParenthesisL)){if(e.addChild(this._parseStyleInParens()),this.peekIdent("and"))for(;this.acceptIdent("and");)e.addChild(this._parseStyleInParens());else if(this.peekIdent("or"))for(;this.acceptIdent("or");)e.addChild(this._parseStyleInParens())}else e.addChild(this._parseDeclaration([c.ParenthesisR]));return this.finish(e)}_parseStyleInParens(){let e=this.create(x);if(this.accept(c.ParenthesisL)){if(e.addChild(this._parseStyleQuery()),!this.accept(c.ParenthesisR))return this.finish(e,f.RightParenthesisExpected,[],[c.CurlyL])}else return this.finish(e,f.LeftParenthesisExpected,[],[c.CurlyL]);return this.finish(e)}_parseUnknownAtRule(){if(!this.peek(c.AtKeyword))return null;let e=this.create(bt);e.addChild(this._parseUnknownAtRuleName());let t=()=>i===0&&s===0&&a===0,r=0,i=0,s=0,a=0;e:for(;;){switch(this.token.type){case c.SemiColon:if(t())break e;break;case c.EOF:return i>0?this.finish(e,f.RightCurlyExpected):a>0?this.finish(e,f.RightSquareBracketExpected):s>0?this.finish(e,f.RightParenthesisExpected):this.finish(e);case c.CurlyL:r++,i++;break;case c.CurlyR:if(i--,r>0&&i===0){if(this.consumeToken(),a>0)return this.finish(e,f.RightSquareBracketExpected);if(s>0)return this.finish(e,f.RightParenthesisExpected);break e}if(i<0){if(s===0&&a===0)break e;return this.finish(e,f.LeftCurlyExpected)}break;case c.ParenthesisL:s++;break;case c.ParenthesisR:if(s--,s<0)return this.finish(e,f.LeftParenthesisExpected);break;case c.BracketL:a++;break;case c.BracketR:if(a--,a<0)return this.finish(e,f.LeftSquareBracketExpected);break}this.consumeToken()}return e}_parseUnknownAtRuleName(){let e=this.create(x);return this.accept(c.AtKeyword)?this.finish(e):e}_parseOperator(){if(this.peekDelim("/")||this.peekDelim("*")||this.peekDelim("+")||this.peekDelim("-")||this.peek(c.Dashmatch)||this.peek(c.Includes)||this.peek(c.SubstringOperator)||this.peek(c.PrefixOperator)||this.peek(c.SuffixOperator)||this.peekDelim("=")){let e=this.createNode(m.Operator);return this.consumeToken(),this.finish(e)}else return null}_parseUnaryOperator(){if(!this.peekDelim("+")&&!this.peekDelim("-"))return null;let e=this.create(x);return this.consumeToken(),this.finish(e)}_parseCombinator(){if(this.peekDelim(">")){let e=this.create(x);this.consumeToken();let t=this.mark();if(!this.hasWhitespace()&&this.acceptDelim(">")){if(!this.hasWhitespace()&&this.acceptDelim(">"))return e.type=m.SelectorCombinatorShadowPiercingDescendant,this.finish(e);this.restoreAtMark(t)}return e.type=m.SelectorCombinatorParent,this.finish(e)}else if(this.peekDelim("+")){let e=this.create(x);return this.consumeToken(),e.type=m.SelectorCombinatorSibling,this.finish(e)}else if(this.peekDelim("~")){let e=this.create(x);return this.consumeToken(),e.type=m.SelectorCombinatorAllSiblings,this.finish(e)}else if(this.peekDelim("/")){let e=this.create(x);this.consumeToken();let t=this.mark();if(!this.hasWhitespace()&&this.acceptIdent("deep")&&!this.hasWhitespace()&&this.acceptDelim("/"))return e.type=m.SelectorCombinatorShadowPiercingDescendant,this.finish(e);this.restoreAtMark(t)}return null}_parseSimpleSelector(){let e=this.create(he),t=0;for(e.addChild(this._parseElementName()||this._parseNestingSelector())&&t++;(t===0||!this.hasWhitespace())&&e.addChild(this._parseSimpleSelectorBody());)t++;return t>0?this.finish(e):null}_parseNestingSelector(){if(this.peekDelim("&")){let e=this.createNode(m.SelectorCombinator);return this.consumeToken(),this.finish(e)}return null}_parseSimpleSelectorBody(){return this._parsePseudo()||this._parseHash()||this._parseClass()||this._parseAttrib()}_parseSelectorIdent(){return this._parseIdent()}_parseHash(){if(!this.peek(c.Hash)&&!this.peekDelim("#"))return null;let e=this.createNode(m.IdentifierSelector);if(this.acceptDelim("#")){if(this.hasWhitespace()||!e.addChild(this._parseSelectorIdent()))return this.finish(e,f.IdentifierExpected)}else this.consumeToken();return this.finish(e)}_parseClass(){if(!this.peekDelim("."))return null;let e=this.createNode(m.ClassSelector);return this.consumeToken(),this.hasWhitespace()||!e.addChild(this._parseSelectorIdent())?this.finish(e,f.IdentifierExpected):this.finish(e)}_parseElementName(){let e=this.mark(),t=this.createNode(m.ElementNameSelector);return t.addChild(this._parseNamespacePrefix()),!t.addChild(this._parseSelectorIdent())&&!this.acceptDelim("*")?(this.restoreAtMark(e),null):this.finish(t)}_parseNamespacePrefix(){let e=this.mark(),t=this.createNode(m.NamespacePrefix);return!t.addChild(this._parseIdent())&&this.acceptDelim("*"),this.acceptDelim("|")?this.finish(t):(this.restoreAtMark(e),null)}_parseAttrib(){if(!this.peek(c.BracketL))return null;let e=this.create($n);return this.consumeToken(),e.setNamespacePrefix(this._parseNamespacePrefix()),e.setIdentifier(this._parseIdent())?(e.setOperator(this._parseOperator())&&(e.setValue(this._parseBinaryExpr()),this.acceptIdent("i"),this.acceptIdent("s")),this.accept(c.BracketR)?this.finish(e):this.finish(e,f.RightSquareBracketExpected)):this.finish(e,f.IdentifierExpected)}_parsePseudo(){let e=this._tryParsePseudoIdentifier();if(e){if(!this.hasWhitespace()&&this.accept(c.ParenthesisL)){let t=()=>{let i=this.create(x);if(!i.addChild(this._parseSelector(!0)))return null;for(;this.accept(c.Comma)&&i.addChild(this._parseSelector(!0)););return this.peek(c.ParenthesisR)?this.finish(i):null};if(!e.addChild(this.try(t))&&e.addChild(this._parseBinaryExpr())&&this.acceptIdent("of")&&!e.addChild(this.try(t)))return this.finish(e,f.SelectorExpected);if(!this.accept(c.ParenthesisR))return this.finish(e,f.RightParenthesisExpected)}return this.finish(e)}return null}_tryParsePseudoIdentifier(){if(!this.peek(c.Colon))return null;let e=this.mark(),t=this.createNode(m.PseudoSelector);return this.consumeToken(),this.hasWhitespace()?(this.restoreAtMark(e),null):(this.accept(c.Colon),this.hasWhitespace()||!t.addChild(this._parseIdent())?this.finish(t,f.IdentifierExpected):this.finish(t))}_tryParsePrio(){let e=this.mark(),t=this._parsePrio();return t||(this.restoreAtMark(e),null)}_parsePrio(){if(!this.peek(c.Exclamation))return null;let e=this.createNode(m.Prio);return this.accept(c.Exclamation)&&this.acceptIdent("important")?this.finish(e):null}_parseExpr(e=!1){let t=this.create(gt);if(!t.addChild(this._parseBinaryExpr()))return null;for(;;){if(this.peek(c.Comma)){if(e)return this.finish(t);this.consumeToken()}if(!t.addChild(this._parseBinaryExpr()))break}return this.finish(t)}_parseUnicodeRange(){if(!this.peekIdent("u"))return null;let e=this.create(gn);return this.acceptUnicodeRange()?this.finish(e):null}_parseNamedLine(){if(!this.peek(c.BracketL))return null;let e=this.createNode(m.GridLine);for(this.consumeToken();e.addChild(this._parseIdent()););return this.accept(c.BracketR)?this.finish(e):this.finish(e,f.RightSquareBracketExpected)}_parseBinaryExpr(e,t){let r=this.create(qe);if(!r.setLeft(e||this._parseTerm()))return null;if(!r.setOperator(t||this._parseOperator()))return this.finish(r);if(!r.setRight(this._parseTerm()))return this.finish(r,f.TermExpected);r=this.finish(r);let i=this._parseOperator();return i&&(r=this._parseBinaryExpr(r,i)),this.finish(r)}_parseTerm(){let e=this.create(Ln);return e.setOperator(this._parseUnaryOperator()),e.setExpression(this._parseTermExpression())?this.finish(e):null}_parseTermExpression(){return this._parseURILiteral()||this._parseUnicodeRange()||this._parseFunction()||this._parseIdent()||this._parseStringLiteral()||this._parseNumeric()||this._parseHexColor()||this._parseOperation()||this._parseNamedLine()}_parseOperation(){if(!this.peek(c.ParenthesisL))return null;let e=this.create(x);return this.consumeToken(),e.addChild(this._parseExpr()),this.accept(c.ParenthesisR)?this.finish(e):this.finish(e,f.RightParenthesisExpected)}_parseNumeric(){if(this.peek(c.Num)||this.peek(c.Percentage)||this.peek(c.Resolution)||this.peek(c.Length)||this.peek(c.EMS)||this.peek(c.EXS)||this.peek(c.Angle)||this.peek(c.Time)||this.peek(c.Dimension)||this.peek(c.ContainerQueryLength)||this.peek(c.Freq)){let e=this.create(nt);return this.consumeToken(),this.finish(e)}return null}_parseStringLiteral(){if(!this.peek(c.String)&&!this.peek(c.BadString))return null;let e=this.createNode(m.StringLiteral);return this.consumeToken(),this.finish(e)}_parseURILiteral(){if(!this.peekRegExp(c.Ident,/^url(-prefix)?$/i))return null;let e=this.mark(),t=this.createNode(m.URILiteral);return this.accept(c.Ident),this.hasWhitespace()||!this.peek(c.ParenthesisL)?(this.restoreAtMark(e),null):(this.scanner.inURL=!0,this.consumeToken(),t.addChild(this._parseURLArgument()),this.scanner.inURL=!1,this.accept(c.ParenthesisR)?this.finish(t):this.finish(t,f.RightParenthesisExpected))}_parseURLArgument(){let e=this.create(x);return!this.accept(c.String)&&!this.accept(c.BadString)&&!this.acceptUnquotedString()?null:this.finish(e)}_parseIdent(e){if(!this.peek(c.Ident))return null;let t=this.create(G);return e&&(t.referenceTypes=e),t.isCustomProperty=this.peekRegExp(c.Ident,/^--/),this.consumeToken(),this.finish(t)}_parseFunction(){let e=this.mark(),t=this.create(me);if(!t.setIdentifier(this._parseFunctionIdentifier()))return null;if(this.hasWhitespace()||!this.accept(c.ParenthesisL))return this.restoreAtMark(e),null;if(t.getArguments().addChild(this._parseFunctionArgument()))for(;this.accept(c.Comma)&&!this.peek(c.ParenthesisR);)t.getArguments().addChild(this._parseFunctionArgument())||this.markError(t,f.ExpressionExpected);return this.accept(c.ParenthesisR)?this.finish(t):this.finish(t,f.RightParenthesisExpected)}_parseFunctionIdentifier(){if(!this.peek(c.Ident))return null;let e=this.create(G);if(e.referenceTypes=[z.Function],this.acceptIdent("progid")){if(this.accept(c.Colon))for(;this.accept(c.Ident)&&this.acceptDelim("."););return this.finish(e)}return this.consumeToken(),this.finish(e)}_parseFunctionArgument(){let e=this.create(le);return e.setValue(this._parseExpr(!0))?this.finish(e):null}_parseHexColor(){if(this.peekRegExp(c.Hash,/^#([A-Fa-f0-9]{3}|[A-Fa-f0-9]{4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/g)){let e=this.create(tt);return this.consumeToken(),this.finish(e)}else return null}};function Hs(n,e){let t=0,r=n.length;if(r===0)return 0;for(;te+t||this.offset===e&&this.length===t?this.findInScope(e,t):null}findInScope(e,t=0){let r=e+t,i=Hs(this.children,a=>a.offset>r);if(i===0)return this;let s=this.children[i-1];return s.offset<=e&&s.offset+s.length>=e+t?s.findInScope(e,t):this}addSymbol(e){this.symbols.push(e)}getSymbol(e,t){for(let r=0;r{"use strict";var n={470:i=>{function s(o){if(typeof o!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(o))}function a(o,d){for(var h,u="",w=0,b=-1,y=0,E=0;E<=o.length;++E){if(E2){var A=u.lastIndexOf("/");if(A!==u.length-1){A===-1?(u="",w=0):w=(u=u.slice(0,A)).length-1-u.lastIndexOf("/"),b=E,y=0;continue}}else if(u.length===2||u.length===1){u="",w=0,b=E,y=0;continue}}d&&(u.length>0?u+="/..":u="..",w=2)}else u.length>0?u+="/"+o.slice(b+1,E):u=o.slice(b+1,E),w=E-b-1;b=E,y=0}else h===46&&y!==-1?++y:y=-1}return u}var l={resolve:function(){for(var o,d="",h=!1,u=arguments.length-1;u>=-1&&!h;u--){var w;u>=0?w=arguments[u]:(o===void 0&&(o=process.cwd()),w=o),s(w),w.length!==0&&(d=w+"/"+d,h=w.charCodeAt(0)===47)}return d=a(d,!h),h?d.length>0?"/"+d:"/":d.length>0?d:"."},normalize:function(o){if(s(o),o.length===0)return".";var d=o.charCodeAt(0)===47,h=o.charCodeAt(o.length-1)===47;return(o=a(o,!d)).length!==0||d||(o="."),o.length>0&&h&&(o+="/"),d?"/"+o:o},isAbsolute:function(o){return s(o),o.length>0&&o.charCodeAt(0)===47},join:function(){if(arguments.length===0)return".";for(var o,d=0;d0&&(o===void 0?o=h:o+="/"+h)}return o===void 0?".":l.normalize(o)},relative:function(o,d){if(s(o),s(d),o===d||(o=l.resolve(o))===(d=l.resolve(d)))return"";for(var h=1;hE){if(d.charCodeAt(b+I)===47)return d.slice(b+I+1);if(I===0)return d.slice(b+I)}else w>E&&(o.charCodeAt(h+I)===47?A=I:I===0&&(A=0));break}var P=o.charCodeAt(h+I);if(P!==d.charCodeAt(b+I))break;P===47&&(A=I)}var T="";for(I=h+A+1;I<=u;++I)I!==u&&o.charCodeAt(I)!==47||(T.length===0?T+="..":T+="/..");return T.length>0?T+d.slice(b+A):(b+=A,d.charCodeAt(b)===47&&++b,d.slice(b))},_makeLong:function(o){return o},dirname:function(o){if(s(o),o.length===0)return".";for(var d=o.charCodeAt(0),h=d===47,u=-1,w=!0,b=o.length-1;b>=1;--b)if((d=o.charCodeAt(b))===47){if(!w){u=b;break}}else w=!1;return u===-1?h?"/":".":h&&u===1?"//":o.slice(0,u)},basename:function(o,d){if(d!==void 0&&typeof d!="string")throw new TypeError('"ext" argument must be a string');s(o);var h,u=0,w=-1,b=!0;if(d!==void 0&&d.length>0&&d.length<=o.length){if(d.length===o.length&&d===o)return"";var y=d.length-1,E=-1;for(h=o.length-1;h>=0;--h){var A=o.charCodeAt(h);if(A===47){if(!b){u=h+1;break}}else E===-1&&(b=!1,E=h+1),y>=0&&(A===d.charCodeAt(y)?--y==-1&&(w=h):(y=-1,w=E))}return u===w?w=E:w===-1&&(w=o.length),o.slice(u,w)}for(h=o.length-1;h>=0;--h)if(o.charCodeAt(h)===47){if(!b){u=h+1;break}}else w===-1&&(b=!1,w=h+1);return w===-1?"":o.slice(u,w)},extname:function(o){s(o);for(var d=-1,h=0,u=-1,w=!0,b=0,y=o.length-1;y>=0;--y){var E=o.charCodeAt(y);if(E!==47)u===-1&&(w=!1,u=y+1),E===46?d===-1?d=y:b!==1&&(b=1):d!==-1&&(b=-1);else if(!w){h=y+1;break}}return d===-1||u===-1||b===0||b===1&&d===u-1&&d===h+1?"":o.slice(d,u)},format:function(o){if(o===null||typeof o!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof o);return function(d,h){var u=h.dir||h.root,w=h.base||(h.name||"")+(h.ext||"");return u?u===h.root?u+w:u+"/"+w:w}(0,o)},parse:function(o){s(o);var d={root:"",dir:"",base:"",ext:"",name:""};if(o.length===0)return d;var h,u=o.charCodeAt(0),w=u===47;w?(d.root="/",h=1):h=0;for(var b=-1,y=0,E=-1,A=!0,I=o.length-1,P=0;I>=h;--I)if((u=o.charCodeAt(I))!==47)E===-1&&(A=!1,E=I+1),u===46?b===-1?b=I:P!==1&&(P=1):b!==-1&&(P=-1);else if(!A){y=I+1;break}return b===-1||E===-1||P===0||P===1&&b===E-1&&b===y+1?E!==-1&&(d.base=d.name=y===0&&w?o.slice(1,E):o.slice(y,E)):(y===0&&w?(d.name=o.slice(1,b),d.base=o.slice(1,E)):(d.name=o.slice(y,b),d.base=o.slice(y,E)),d.ext=o.slice(b,E)),y>0?d.dir=o.slice(0,y-1):w&&(d.dir="/"),d},sep:"/",delimiter:":",win32:null,posix:null};l.posix=l,i.exports=l}},e={};function t(i){var s=e[i];if(s!==void 0)return s.exports;var a=e[i]={exports:{}};return n[i](a,a.exports,t),a.exports}t.d=(i,s)=>{for(var a in s)t.o(s,a)&&!t.o(i,a)&&Object.defineProperty(i,a,{enumerable:!0,get:s[a]})},t.o=(i,s)=>Object.prototype.hasOwnProperty.call(i,s),t.r=i=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(i,"__esModule",{value:!0})};var r={};(()=>{let i;t.r(r),t.d(r,{URI:()=>w,Utils:()=>Ie}),typeof process=="object"?i=process.platform==="win32":typeof navigator=="object"&&(i=navigator.userAgent.indexOf("Windows")>=0);let s=/^\w[\w\d+.-]*$/,a=/^\//,l=/^\/\//;function o(S,v){if(!S.scheme&&v)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${S.authority}", path: "${S.path}", query: "${S.query}", fragment: "${S.fragment}"}`);if(S.scheme&&!s.test(S.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(S.path){if(S.authority){if(!a.test(S.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(l.test(S.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}let d="",h="/",u=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class w{static isUri(v){return v instanceof w||!!v&&typeof v.authority=="string"&&typeof v.fragment=="string"&&typeof v.path=="string"&&typeof v.query=="string"&&typeof v.scheme=="string"&&typeof v.fsPath=="string"&&typeof v.with=="function"&&typeof v.toString=="function"}scheme;authority;path;query;fragment;constructor(v,F,C,N,D,M=!1){typeof v=="object"?(this.scheme=v.scheme||d,this.authority=v.authority||d,this.path=v.path||d,this.query=v.query||d,this.fragment=v.fragment||d):(this.scheme=function(oe,Z){return oe||Z?oe:"file"}(v,M),this.authority=F||d,this.path=function(oe,Z){switch(oe){case"https":case"http":case"file":Z?Z[0]!==h&&(Z=h+Z):Z=h}return Z}(this.scheme,C||d),this.query=N||d,this.fragment=D||d,o(this,M))}get fsPath(){return P(this,!1)}with(v){if(!v)return this;let{scheme:F,authority:C,path:N,query:D,fragment:M}=v;return F===void 0?F=this.scheme:F===null&&(F=d),C===void 0?C=this.authority:C===null&&(C=d),N===void 0?N=this.path:N===null&&(N=d),D===void 0?D=this.query:D===null&&(D=d),M===void 0?M=this.fragment:M===null&&(M=d),F===this.scheme&&C===this.authority&&N===this.path&&D===this.query&&M===this.fragment?this:new y(F,C,N,D,M)}static parse(v,F=!1){let C=u.exec(v);return C?new y(C[2]||d,Y(C[4]||d),Y(C[5]||d),Y(C[7]||d),Y(C[9]||d),F):new y(d,d,d,d,d)}static file(v){let F=d;if(i&&(v=v.replace(/\\/g,h)),v[0]===h&&v[1]===h){let C=v.indexOf(h,2);C===-1?(F=v.substring(2),v=h):(F=v.substring(2,C),v=v.substring(C)||h)}return new y("file",F,v,d,d)}static from(v){let F=new y(v.scheme,v.authority,v.path,v.query,v.fragment);return o(F,!0),F}toString(v=!1){return T(this,v)}toJSON(){return this}static revive(v){if(v){if(v instanceof w)return v;{let F=new y(v);return F._formatted=v.external,F._fsPath=v._sep===b?v.fsPath:null,F}}return v}}let b=i?1:void 0;class y extends w{_formatted=null;_fsPath=null;get fsPath(){return this._fsPath||(this._fsPath=P(this,!1)),this._fsPath}toString(v=!1){return v?T(this,!0):(this._formatted||(this._formatted=T(this,!1)),this._formatted)}toJSON(){let v={$mid:1};return this._fsPath&&(v.fsPath=this._fsPath,v._sep=b),this._formatted&&(v.external=this._formatted),this.path&&(v.path=this.path),this.scheme&&(v.scheme=this.scheme),this.authority&&(v.authority=this.authority),this.query&&(v.query=this.query),this.fragment&&(v.fragment=this.fragment),v}}let E={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function A(S,v,F){let C,N=-1;for(let D=0;D=97&&M<=122||M>=65&&M<=90||M>=48&&M<=57||M===45||M===46||M===95||M===126||v&&M===47||F&&M===91||F&&M===93||F&&M===58)N!==-1&&(C+=encodeURIComponent(S.substring(N,D)),N=-1),C!==void 0&&(C+=S.charAt(D));else{C===void 0&&(C=S.substr(0,D));let oe=E[M];oe!==void 0?(N!==-1&&(C+=encodeURIComponent(S.substring(N,D)),N=-1),C+=oe):N===-1&&(N=D)}}return N!==-1&&(C+=encodeURIComponent(S.substring(N))),C!==void 0?C:S}function I(S){let v;for(let F=0;F1&&S.scheme==="file"?`//${S.authority}${S.path}`:S.path.charCodeAt(0)===47&&(S.path.charCodeAt(1)>=65&&S.path.charCodeAt(1)<=90||S.path.charCodeAt(1)>=97&&S.path.charCodeAt(1)<=122)&&S.path.charCodeAt(2)===58?v?S.path.substr(1):S.path[1].toLowerCase()+S.path.substr(2):S.path,i&&(F=F.replace(/\//g,"\\")),F}function T(S,v){let F=v?I:A,C="",{scheme:N,authority:D,path:M,query:oe,fragment:Z}=S;if(N&&(C+=N,C+=":"),(D||N==="file")&&(C+=h,C+=h),D){let $=D.indexOf("@");if($!==-1){let Ue=D.substr(0,$);D=D.substr($+1),$=Ue.lastIndexOf(":"),$===-1?C+=F(Ue,!1,!1):(C+=F(Ue.substr(0,$),!1,!1),C+=":",C+=F(Ue.substr($+1),!1,!0)),C+="@"}D=D.toLowerCase(),$=D.lastIndexOf(":"),$===-1?C+=F(D,!1,!0):(C+=F(D.substr(0,$),!1,!0),C+=D.substr($))}if(M){if(M.length>=3&&M.charCodeAt(0)===47&&M.charCodeAt(2)===58){let $=M.charCodeAt(1);$>=65&&$<=90&&(M=`/${String.fromCharCode($+32)}:${M.substr(3)}`)}else if(M.length>=2&&M.charCodeAt(1)===58){let $=M.charCodeAt(0);$>=65&&$<=90&&(M=`${String.fromCharCode($+32)}:${M.substr(2)}`)}C+=F(M,!0,!1)}return oe&&(C+="?",C+=F(oe,!1,!1)),Z&&(C+="#",C+=v?Z:A(Z,!1,!1)),C}function j(S){try{return decodeURIComponent(S)}catch{return S.length>3?S.substr(0,3)+j(S.substr(3)):S}}let X=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function Y(S){return S.match(X)?S.replace(X,v=>j(v)):S}var $e=t(470);let K=$e.posix||$e,_e="/";var Ie;(function(S){S.joinPath=function(v,...F){return v.with({path:K.join(v.path,...F)})},S.resolvePath=function(v,...F){let C=v.path,N=!1;C[0]!==_e&&(C=_e+C,N=!0);let D=K.resolve(C,...F);return N&&D[0]===_e&&!v.authority&&(D=D.substring(1)),v.with({path:D})},S.dirname=function(v){if(v.path.length===0||v.path===_e)return v;let F=K.dirname(v.path);return F.length===1&&F.charCodeAt(0)===46&&(F=""),v.with({path:F})},S.basename=function(v){return K.basename(v.path)},S.extname=function(v){return K.extname(v.path)}})(Ie||(Ie={}))})(),Js=r})();var{URI:Zt,Utils:Fe}=Js;function ar(n){return Fe.dirname(Zt.parse(n)).toString(!0)}function Je(n,...e){return Fe.joinPath(Zt.parse(n),...e).toString(!0)}var cr=class{constructor(e){this.readDirectory=e,this.literalCompletions=[],this.importCompletions=[]}onCssURILiteralValue(e){this.literalCompletions.push(e)}onCssImportPath(e){this.importCompletions.push(e)}async computeCompletions(e,t){let r={items:[],isIncomplete:!1};for(let i of this.literalCompletions){let s=i.uriValue,a=vi(s);if(a==="."||a==="..")r.isIncomplete=!0;else{let l=await this.providePathSuggestions(s,i.position,i.range,e,t);for(let o of l)r.items.push(o)}}for(let i of this.importCompletions){let s=i.pathValue,a=vi(s);if(a==="."||a==="..")r.isIncomplete=!0;else{let l=await this.providePathSuggestions(s,i.position,i.range,e,t);e.languageId==="scss"&&l.forEach(o=>{V(o.label,"_")&&fn(o.label,".scss")&&(o.textEdit?o.textEdit.newText=o.label.slice(1,-5):o.label=o.label.slice(1,-5))});for(let o of l)r.items.push(o)}}return r}async providePathSuggestions(e,t,r,i,s){let a=vi(e),l=V(e,"'")||V(e,'"'),o=l?a.slice(0,t.character-(r.start.character+1)):a.slice(0,t.character-r.start.character),d=i.uri,h=l?ba(r,1,-1):r,u=fa(o,a,h),w=o.substring(0,o.lastIndexOf("/")+1),b=s.resolveReference(w||".",d);if(b)try{let y=[],E=await this.readDirectory(b);for(let[A,I]of E)A.charCodeAt(0)!==ua&&(I===st.Directory||Je(b,A)!==d)&&y.push(ga(A,I===st.Directory,u));return y}catch{}return[]}},ua=46;function vi(n){return V(n,"'")||V(n,'"')?n.slice(1,-1):n}function fa(n,e,t){let r,i=n.lastIndexOf("/");if(i===-1)r=t;else{let s=e.slice(i+1),a=dr(t.end,-s.length),l=s.indexOf(" "),o;l!==-1?o=dr(a,l):o=t.end,r=R.create(a,o)}return r}function ga(n,e,t){return e?(n=n+"/",{label:lr(n),kind:k.Folder,textEdit:_.replace(t,lr(n)),command:{title:"Suggest",command:"editor.action.triggerSuggest"}}):{label:lr(n),kind:k.File,textEdit:_.replace(t,lr(n))}}function lr(n){return n.replace(/(\s|\(|\)|,|"|')/g,"\\$1")}function dr(n,e){return H.create(n.line,n.character+e)}function ba(n,e,t){let r=dr(n.start,e),i=dr(n.end,t);return R.create(r,i)}var Ne=te.Snippet,Xs={title:"Suggest",command:"editor.action.triggerSuggest"},Ee;(function(n){n.Enums=" ",n.Normal="d",n.VendorPrefixed="x",n.Term="y",n.Variable="z"})(Ee||(Ee={}));var Xe=class{constructor(e=null,t,r){this.variablePrefix=e,this.lsOptions=t,this.cssDataManager=r,this.completionParticipants=[]}configure(e){this.defaultSettings=e}getSymbolContext(){return this.symbolContext||(this.symbolContext=new ot(this.styleSheet)),this.symbolContext}setCompletionParticipants(e){this.completionParticipants=e||[]}async doComplete2(e,t,r,i,s=this.defaultSettings){if(!this.lsOptions.fileSystemProvider||!this.lsOptions.fileSystemProvider.readDirectory)return this.doComplete(e,t,r,s);let a=new cr(this.lsOptions.fileSystemProvider.readDirectory),l=this.completionParticipants;this.completionParticipants=[a].concat(l);let o=this.doComplete(e,t,r,s);try{let d=await a.computeCompletions(e,i);return{isIncomplete:o.isIncomplete||d.isIncomplete,itemDefaults:o.itemDefaults,items:d.items.concat(o.items)}}finally{this.completionParticipants=l}}doComplete(e,t,r,i){this.offset=e.offsetAt(t),this.position=t,this.currentWord=va(e,this.offset),this.defaultReplaceRange=R.create(H.create(this.position.line,this.position.character-this.currentWord.length),this.position),this.textDocument=e,this.styleSheet=r,this.documentSettings=i;try{let s={isIncomplete:!1,itemDefaults:{editRange:{start:{line:t.line,character:t.character-this.currentWord.length},end:t}},items:[]};this.nodePath=vt(this.styleSheet,this.offset);for(let a=this.nodePath.length-1;a>=0;a--){let l=this.nodePath[a];if(l instanceof Ve)this.getCompletionsForDeclarationProperty(l.getParent(),s);else if(l instanceof gt)l.parent instanceof rt?this.getVariableProposals(null,s):this.getCompletionsForExpression(l,s);else if(l instanceof he){let o=l.findAParent(m.ExtendsReference,m.Ruleset);if(o)if(o.type===m.ExtendsReference)this.getCompletionsForExtendsReference(o,l,s);else{let d=o;this.getCompletionsForSelector(d,d&&d.isNested(),s)}}else if(l instanceof le)this.getCompletionsForFunctionArgument(l,l.getParent(),s);else if(l instanceof Ze)this.getCompletionsForDeclarations(l,s);else if(l instanceof xe)this.getCompletionsForVariableDeclaration(l,s);else if(l instanceof ae)this.getCompletionsForRuleSet(l,s);else if(l instanceof rt)this.getCompletionsForInterpolation(l,s);else if(l instanceof De)this.getCompletionsForFunctionDeclaration(l,s);else if(l instanceof ze)this.getCompletionsForMixinReference(l,s);else if(l instanceof me)this.getCompletionsForFunctionArgument(null,l,s);else if(l instanceof et)this.getCompletionsForSupports(l,s);else if(l instanceof Re)this.getCompletionsForSupportsCondition(l,s);else if(l instanceof Se)this.getCompletionsForExtendsReference(l,null,s);else if(l.type===m.URILiteral)this.getCompletionForUriLiteralValue(l,s);else if(l.parent===null)this.getCompletionForTopLevel(s);else if(l.type===m.StringLiteral&&this.isImportPathParent(l.parent.type))this.getCompletionForImportPath(l,s);else continue;if(s.items.length>0||this.offset>l.offset)return this.finalize(s)}return this.getCompletionsForStylesheet(s),s.items.length===0&&this.variablePrefix&&this.currentWord.indexOf(this.variablePrefix)===0&&this.getVariableProposals(null,s),this.finalize(s)}finally{this.position=null,this.currentWord=null,this.textDocument=null,this.styleSheet=null,this.symbolContext=null,this.defaultReplaceRange=null,this.nodePath=null}}isImportPathParent(e){return e===m.Import}finalize(e){return e}findInNodePath(...e){for(let t=this.nodePath.length-1;t>=0;t--){let r=this.nodePath[t];if(e.indexOf(r.type)!==-1)return r}return null}getCompletionsForDeclarationProperty(e,t){return this.getPropertyProposals(e,t)}getPropertyProposals(e,t){let r=this.isTriggerPropertyValueCompletionEnabled,i=this.isCompletePropertyWithSemicolonEnabled;return this.cssDataManager.getProperties().forEach(a=>{let l,o,d=!1;e?(l=this.getCompletionRange(e.getProperty()),o=a.name,ie(e.colonPosition)||(o+=": ",d=!0)):(l=this.getCompletionRange(null),o=a.name+": ",d=!0),!e&&i&&(o+="$0;"),e&&!e.semicolonPosition&&i&&this.offset>=this.textDocument.offsetAt(l.end)&&(o+="$0;");let h={label:a.name,documentation:Ce(a,this.doesSupportMarkdown()),tags:en(a)?[Te.Deprecated]:[],textEdit:_.replace(l,o),insertTextFormat:te.Snippet,kind:k.Property};a.restrictions||(d=!1),r&&d&&(h.command=Xs);let w=(255-(typeof a.relevance=="number"?Math.min(Math.max(a.relevance,0),99):50)).toString(16),b=V(a.name,"-")?Ee.VendorPrefixed:Ee.Normal;h.sortText=b+"_"+w,t.items.push(h)}),this.completionParticipants.forEach(a=>{a.onCssProperty&&a.onCssProperty({propertyName:this.currentWord,range:this.defaultReplaceRange})}),t}get isTriggerPropertyValueCompletionEnabled(){return this.documentSettings?.triggerPropertyValueCompletion??!0}get isCompletePropertyWithSemicolonEnabled(){return this.documentSettings?.completePropertyWithSemicolon??!0}getCompletionsForDeclarationValue(e,t){let r=e.getFullPropertyName(),i=this.cssDataManager.getProperty(r),s=e.getValue()||null;for(;s&&s.hasChildren();)s=s.findChildAtOffset(this.offset,!1);if(this.completionParticipants.forEach(a=>{a.onCssPropertyValue&&a.onCssPropertyValue({propertyName:r,propertyValue:this.currentWord,range:this.getCompletionRange(s)})}),i){if(i.restrictions)for(let a of i.restrictions)switch(a){case"color":this.getColorProposals(i,s,t);break;case"position":this.getPositionProposals(i,s,t);break;case"repeat":this.getRepeatStyleProposals(i,s,t);break;case"line-style":this.getLineStyleProposals(i,s,t);break;case"line-width":this.getLineWidthProposals(i,s,t);break;case"geometry-box":this.getGeometryBoxProposals(i,s,t);break;case"box":this.getBoxProposals(i,s,t);break;case"image":this.getImageProposals(i,s,t);break;case"timing-function":this.getTimingFunctionProposals(i,s,t);break;case"shape":this.getBasicShapeProposals(i,s,t);break}this.getValueEnumProposals(i,s,t),this.getCSSWideKeywordProposals(i,s,t),this.getUnitProposals(i,s,t)}else{let a=wa(this.styleSheet,e);for(let l of a.getEntries())t.items.push({label:l,textEdit:_.replace(this.getCompletionRange(s),l),kind:k.Value})}return this.getVariableProposals(s,t),this.getTermProposals(i,s,t),t}getValueEnumProposals(e,t,r){if(e.values)for(let i of e.values){let s=i.name,a;if(fn(s,")")){let d=s.lastIndexOf("(");d!==-1&&(s=s.substring(0,d+1)+"$1"+s.substring(d+1),a=Ne)}let l=Ee.Enums;V(i.name,"-")&&(l+=Ee.VendorPrefixed);let o={label:i.name,documentation:Ce(i,this.doesSupportMarkdown()),tags:en(e)?[Te.Deprecated]:[],textEdit:_.replace(this.getCompletionRange(t),s),sortText:l,kind:k.Value,insertTextFormat:a};r.items.push(o)}return r}getCSSWideKeywordProposals(e,t,r){for(let i in hi)r.items.push({label:i,documentation:hi[i],textEdit:_.replace(this.getCompletionRange(t),i),kind:k.Value});for(let i in pi){let s=Et(i);r.items.push({label:i,documentation:pi[i],textEdit:_.replace(this.getCompletionRange(t),s),kind:k.Function,insertTextFormat:Ne,command:V(i,"var")?Xs:void 0})}return r}getCompletionsForInterpolation(e,t){return this.offset>=e.offset+2&&this.getVariableProposals(null,t),t}getVariableProposals(e,t){let r=this.getSymbolContext().findSymbolsAtOffset(this.offset,z.Variable);for(let i of r){let s=V(i.name,"--")?`var(${i.name})`:i.name,a={label:i.name,documentation:i.value?zr(i.value):i.value,textEdit:_.replace(this.getCompletionRange(e),s),kind:k.Variable,sortText:Ee.Variable};if(typeof a.documentation=="string"&&ii(a.documentation)&&(a.kind=k.Color),i.node.type===m.FunctionParameter){let l=i.node.getParent();l.type===m.MixinDeclaration&&(a.detail=p("argument from '{0}'",l.getName()))}t.items.push(a)}return t}getVariableProposalsForCSSVarFunction(e){let t=new tn;this.styleSheet.acceptVisitor(new xi(t,this.offset));let r=this.getSymbolContext().findSymbolsAtOffset(this.offset,z.Variable);for(let i of r){if(V(i.name,"--")){let s={label:i.name,documentation:i.value?zr(i.value):i.value,textEdit:_.replace(this.getCompletionRange(null),i.name),kind:k.Variable};typeof s.documentation=="string"&&ii(s.documentation)&&(s.kind=k.Color),e.items.push(s)}t.remove(i.name)}for(let i of t.getEntries())if(V(i,"--")){let s={label:i,textEdit:_.replace(this.getCompletionRange(null),i),kind:k.Variable};e.items.push(s)}return e}getUnitProposals(e,t,r){let i="0";if(this.currentWord.length>0){let s=this.currentWord.match(/^-?\d[\.\d+]*/);s&&(i=s[0],r.isIncomplete=i.length===this.currentWord.length)}else this.currentWord.length===0&&(r.isIncomplete=!0);if(t&&t.parent&&t.parent.type===m.Term&&(t=t.getParent()),e.restrictions)for(let s of e.restrictions){let a=ir[s];if(a)for(let l of a){let o=i+l;r.items.push({label:o,textEdit:_.replace(this.getCompletionRange(t),o),kind:k.Unit})}}return r}getCompletionRange(e){if(e&&e.offset<=this.offset&&this.offset<=e.end){let t=e.end!==-1?this.textDocument.positionAt(e.end):this.position,r=this.textDocument.positionAt(e.offset);if(r.line===t.line)return R.create(r,t)}return this.defaultReplaceRange}getColorProposals(e,t,r){for(let s in Xt)r.items.push({label:s,documentation:Xt[s],textEdit:_.replace(this.getCompletionRange(t),s),kind:k.Color});for(let s in rr)r.items.push({label:s,documentation:rr[s],textEdit:_.replace(this.getCompletionRange(t),s),kind:k.Value});let i=new tn;this.styleSheet.acceptVisitor(new yi(i,this.offset));for(let s of i.getEntries())r.items.push({label:s,textEdit:_.replace(this.getCompletionRange(t),s),kind:k.Color});for(let s of Ws)r.items.push({label:s.label,detail:s.func,documentation:s.desc,textEdit:_.replace(this.getCompletionRange(t),s.insertText),insertTextFormat:Ne,kind:k.Function});return r}getPositionProposals(e,t,r){for(let i in oi)r.items.push({label:i,documentation:oi[i],textEdit:_.replace(this.getCompletionRange(t),i),kind:k.Value});return r}getRepeatStyleProposals(e,t,r){for(let i in ai)r.items.push({label:i,documentation:ai[i],textEdit:_.replace(this.getCompletionRange(t),i),kind:k.Value});return r}getLineStyleProposals(e,t,r){for(let i in li)r.items.push({label:i,documentation:li[i],textEdit:_.replace(this.getCompletionRange(t),i),kind:k.Value});return r}getLineWidthProposals(e,t,r){for(let i of js)r.items.push({label:i,textEdit:_.replace(this.getCompletionRange(t),i),kind:k.Value});return r}getGeometryBoxProposals(e,t,r){for(let i in di)r.items.push({label:i,documentation:di[i],textEdit:_.replace(this.getCompletionRange(t),i),kind:k.Value});return r}getBoxProposals(e,t,r){for(let i in ci)r.items.push({label:i,documentation:ci[i],textEdit:_.replace(this.getCompletionRange(t),i),kind:k.Value});return r}getImageProposals(e,t,r){for(let i in mi){let s=Et(i);r.items.push({label:i,documentation:mi[i],textEdit:_.replace(this.getCompletionRange(t),s),kind:k.Function,insertTextFormat:i!==s?Ne:void 0})}return r}getTimingFunctionProposals(e,t,r){for(let i in ui){let s=Et(i);r.items.push({label:i,documentation:ui[i],textEdit:_.replace(this.getCompletionRange(t),s),kind:k.Function,insertTextFormat:i!==s?Ne:void 0})}return r}getBasicShapeProposals(e,t,r){for(let i in fi){let s=Et(i);r.items.push({label:i,documentation:fi[i],textEdit:_.replace(this.getCompletionRange(t),s),kind:k.Function,insertTextFormat:i!==s?Ne:void 0})}return r}getCompletionsForStylesheet(e){let t=this.styleSheet.findFirstChildBeforeOffset(this.offset);return t?t instanceof ae?this.getCompletionsForRuleSet(t,e):t instanceof et?this.getCompletionsForSupports(t,e):e:this.getCompletionForTopLevel(e)}getCompletionForTopLevel(e){return this.cssDataManager.getAtDirectives().forEach(t=>{e.items.push({label:t.name,textEdit:_.replace(this.getCompletionRange(null),t.name),documentation:Ce(t,this.doesSupportMarkdown()),tags:en(t)?[Te.Deprecated]:[],kind:k.Keyword})}),this.getCompletionsForSelector(null,!1,e),e}getCompletionsForRuleSet(e,t){let r=e.getDeclarations();return r&&r.endsWith("}")&&this.offset>=r.end?this.getCompletionForTopLevel(t):!r||this.offset<=r.offset?this.getCompletionsForSelector(e,e.isNested(),t):this.getCompletionsForDeclarations(e.getDeclarations(),t)}getCompletionsForSelector(e,t,r){let i=this.findInNodePath(m.PseudoSelector,m.IdentifierSelector,m.ClassSelector,m.ElementNameSelector);if(!i&&this.hasCharacterAtPosition(this.offset-this.currentWord.length-1,":")&&(this.currentWord=":"+this.currentWord,this.hasCharacterAtPosition(this.offset-this.currentWord.length-1,":")&&(this.currentWord=":"+this.currentWord),this.defaultReplaceRange=R.create(H.create(this.position.line,this.position.character-this.currentWord.length),this.position)),this.cssDataManager.getPseudoClasses().forEach(d=>{let h=Et(d.name),u={label:d.name,textEdit:_.replace(this.getCompletionRange(i),h),documentation:Ce(d,this.doesSupportMarkdown()),tags:en(d)?[Te.Deprecated]:[],kind:k.Function,insertTextFormat:d.name!==h?Ne:void 0};V(d.name,":-")&&(u.sortText=Ee.VendorPrefixed),r.items.push(u)}),this.cssDataManager.getPseudoElements().forEach(d=>{let h=Et(d.name),u={label:d.name,textEdit:_.replace(this.getCompletionRange(i),h),documentation:Ce(d,this.doesSupportMarkdown()),tags:en(d)?[Te.Deprecated]:[],kind:k.Function,insertTextFormat:d.name!==h?Ne:void 0};V(d.name,"::-")&&(u.sortText=Ee.VendorPrefixed),r.items.push(u)}),!t){for(let d of Bs)r.items.push({label:d,textEdit:_.replace(this.getCompletionRange(i),d),kind:k.Keyword});for(let d of qs)r.items.push({label:d,textEdit:_.replace(this.getCompletionRange(i),d),kind:k.Keyword})}let l={};l[this.currentWord]=!0;let o=this.textDocument.getText();if(this.styleSheet.accept(d=>{if(d.type===m.SimpleSelector&&d.length>0){let h=o.substr(d.offset,d.length);return h.charAt(0)==="."&&!l[h]&&(l[h]=!0,r.items.push({label:h,textEdit:_.replace(this.getCompletionRange(i),h),kind:k.Keyword})),!1}return!0}),e&&e.isNested()){let d=e.getSelectors().findFirstChildBeforeOffset(this.offset);d&&e.getSelectors().getChildren().indexOf(d)===0&&this.getPropertyProposals(null,r)}return r}getCompletionsForDeclarations(e,t){if(!e||this.offset===e.offset)return t;let r=e.findFirstChildBeforeOffset(this.offset);if(!r)return this.getCompletionsForDeclarationProperty(null,t);if(r instanceof ht){let i=r;if(!ie(i.colonPosition)||this.offset<=i.colonPosition)return this.getCompletionsForDeclarationProperty(i,t);if(ie(i.semicolonPosition)&&i.semicolonPositione.colonPosition&&this.getVariableProposals(e.getValue()||null,t),t}getCompletionsForExpression(e,t){let r=e.getParent();if(r instanceof le)return this.getCompletionsForFunctionArgument(r,r.getParent(),t),t;let i=e.findParent(m.Declaration);if(!i)return this.getTermProposals(void 0,null,t),t;let s=e.findChildAtOffset(this.offset,!0);return s?s instanceof nt||s instanceof G?this.getCompletionsForDeclarationValue(i,t):t:this.getCompletionsForDeclarationValue(i,t)}getCompletionsForFunctionArgument(e,t,r){let i=t.getIdentifier();return i&&i.matches("var")&&(!t.getArguments().hasChildren()||t.getArguments().getChild(0)===e)&&this.getVariableProposalsForCSSVarFunction(r),r}getCompletionsForFunctionDeclaration(e,t){let r=e.getDeclarations();return r&&this.offset>r.offset&&this.offset{s.onCssMixinReference&&s.onCssMixinReference({mixinName:this.currentWord,range:this.getCompletionRange(i)})}),t}getTermProposals(e,t,r){let i=this.getSymbolContext().findSymbolsAtOffset(this.offset,z.Function);for(let s of i)s.node instanceof De&&r.items.push(this.makeTermProposal(s,s.node.getParameters(),t));return r}makeTermProposal(e,t,r){let i=e.node,s=t.getChildren().map(l=>l instanceof ye?l.getName():l.getText()),a=e.name+"("+s.map((l,o)=>"${"+(o+1)+":"+l+"}").join(", ")+")";return{label:e.name,detail:e.name+"("+s.join(", ")+")",textEdit:_.replace(this.getCompletionRange(r),a),insertTextFormat:Ne,kind:k.Function,sortText:Ee.Term}}getCompletionsForSupportsCondition(e,t){let r=e.findFirstChildBeforeOffset(this.offset);if(r){if(r instanceof Q)return!ie(r.colonPosition)||this.offset<=r.colonPosition?this.getCompletionsForDeclarationProperty(r,t):this.getCompletionsForDeclarationValue(r,t);if(r instanceof Re)return this.getCompletionsForSupportsCondition(r,t)}return ie(e.lParent)&&this.offset>e.lParent&&(!ie(e.rParent)||this.offset<=e.rParent)?this.getCompletionsForDeclarationProperty(null,t):t}getCompletionsForSupports(e,t){let r=e.getDeclarations();if(!r||this.offset<=r.offset){let s=e.findFirstChildBeforeOffset(this.offset);return s instanceof Re?this.getCompletionsForSupportsCondition(s,t):t}return this.getCompletionForTopLevel(t)}getCompletionsForExtendsReference(e,t,r){return r}getCompletionForUriLiteralValue(e,t){let r,i,s;if(e.hasChildren()){let a=e.getChild(0);r=a.getText(),i=this.position,s=this.getCompletionRange(a)}else{r="",i=this.position;let a=this.textDocument.positionAt(e.offset+4);s=R.create(a,a)}return this.completionParticipants.forEach(a=>{a.onCssURILiteralValue&&a.onCssURILiteralValue({uriValue:r,position:i,range:s})}),t}getCompletionForImportPath(e,t){return this.completionParticipants.forEach(r=>{r.onCssImportPath&&r.onCssImportPath({pathValue:e.getText(),position:this.position,range:this.getCompletionRange(e)})}),t}hasCharacterAtPosition(e,t){let r=this.textDocument.getText();return e>=0&&e=0&&` -\r":{[()]},*>+`.indexOf(r.charAt(t))===-1;)t--;return r.substring(t+1,e)}var rn=class n{constructor(){this.parent=null,this.children=null,this.attributes=null}findAttribute(e){if(this.attributes){for(let t of this.attributes)if(t.name===e)return t.value}return null}addChild(e){e instanceof n&&(e.parent=this),this.children||(this.children=[]),this.children.push(e)}append(e){if(this.attributes){let t=this.attributes[this.attributes.length-1];t.value=t.value+e}}prepend(e){if(this.attributes){let t=this.attributes[0];t.value=e+t.value}}findRoot(){let e=this;for(;e.parent&&!(e.parent instanceof Ye);)e=e.parent;return e}removeChild(e){if(this.children){let t=this.children.indexOf(e);if(t!==-1)return this.children.splice(t,1),!0}return!1}addAttr(e,t){this.attributes||(this.attributes=[]);for(let r of this.attributes)if(r.name===e){r.value+=" "+t;return}this.attributes.push({name:e,value:t})}clone(e=!0){let t=new n;if(this.attributes){t.attributes=[];for(let r of this.attributes)t.addAttr(r.name,r.value)}if(e&&this.children){t.children=[];for(let r=0;r"),this.writeLine(t,i.join(""))}},Oe;(function(n){function e(r,i){return i+t(r)+i}n.ensure=e;function t(r){let i=r.match(/^['"](.*)["']$/);return i?i[1]:r}n.remove=t})(Oe||(Oe={}));var nn=class{constructor(){this.id=0,this.attr=0,this.tag=0}};function Ys(n,e){let t=new rn;for(let r of n.getChildren())switch(r.type){case m.SelectorCombinator:if(e){let l=r.getText().split("&");if(l.length===1){t.addAttr("name",l[0]);break}t=e.cloneWithParent(),l[0]&&t.findRoot().prepend(l[0]);for(let o=1;o1){let d=e.cloneWithParent();t.addChild(d.findRoot()),t=d}t.append(l[o])}}break;case m.SelectorPlaceholder:if(r.matches("@at-root"))return t;case m.ElementNameSelector:let i=r.getText();t.addAttr("name",i==="*"?"element":pe(i));break;case m.ClassSelector:t.addAttr("class",pe(r.getText().substring(1)));break;case m.IdentifierSelector:t.addAttr("id",pe(r.getText().substring(1)));break;case m.MixinDeclaration:t.addAttr("class",r.getName());break;case m.PseudoSelector:t.addAttr(pe(r.getText()),"");break;case m.AttributeSelector:let s=r,a=s.getIdentifier();if(a){let l=s.getValue(),o=s.getOperator(),d;if(l&&o)switch(pe(o.getText())){case"|=":d=`${Oe.remove(pe(l.getText()))}-\u2026`;break;case"^=":d=`${Oe.remove(pe(l.getText()))}\u2026`;break;case"$=":d=`\u2026${Oe.remove(pe(l.getText()))}`;break;case"~=":d=` \u2026 ${Oe.remove(pe(l.getText()))} \u2026 `;break;case"*=":d=`\u2026${Oe.remove(pe(l.getText()))}\u2026`;break;default:d=Oe.remove(pe(l.getText()));break}t.addAttr(pe(a.getText()),d)}break}return t}function pe(n){let e=new ce;e.setSource(n);let t=e.scanUnquotedString();return t?t.text:n}var pr=class{constructor(e){this.cssDataManager=e}selectorToMarkedString(e,t){let r=xa(e);if(r){let i=new hr('"').print(r,t);return i.push(this.selectorToSpecificityMarkedString(e)),i}else return[]}simpleSelectorToMarkedString(e){let t=Ys(e),r=new hr('"').print(t);return r.push(this.selectorToSpecificityMarkedString(e)),r}isPseudoElementIdentifier(e){let t=e.match(/^::?([\w-]+)/);return t?!!this.cssDataManager.getPseudoElement("::"+t[1]):!1}selectorToSpecificityMarkedString(e){let t=s=>{let a=new nn,l=new nn;for(let o of s)for(let d of o.getChildren()){let h=r(d);if(h.id>l.id){l=h;continue}else if(h.idl.attr){l=h;continue}else if(h.attrl.tag){l=h;continue}}return a.id+=l.id,a.attr+=l.attr,a.tag+=l.tag,a},r=s=>{let a=new nn;e:for(let l of s.getChildren()){switch(l.type){case m.IdentifierSelector:a.id++;break;case m.ClassSelector:case m.AttributeSelector:a.attr++;break;case m.ElementNameSelector:if(l.matches("*"))break;a.tag++;break;case m.PseudoSelector:let o=l.getText(),d=l.getChildren();if(this.isPseudoElementIdentifier(o)){if(o.match(/^::slotted/i)&&d.length>0){a.tag++;let h=t(d);a.id+=h.id,a.attr+=h.attr,a.tag+=h.tag;continue e}a.tag++;continue e}if(o.match(/^:where/i))continue e;if(o.match(/^:(?:not|has|is)/i)&&d.length>0){let h=t(d);a.id+=h.id,a.attr+=h.attr,a.tag+=h.tag;continue e}if(o.match(/^:(?:host|host-context)/i)&&d.length>0){a.attr++;let h=t(d);a.id+=h.id,a.attr+=h.attr,a.tag+=h.tag;continue e}if(o.match(/^:(?:nth-child|nth-last-child)/i)&&d.length>0){if(a.attr++,d.length===3&&d[1].type===23){let y=t(d[2].getChildren());a.id+=y.id,a.attr+=y.attr,a.tag+=y.tag;continue e}let h=new ke,u=d[1].getText();h.scanner.setSource(u);let w=h.scanner.scan(),b=h.scanner.scan();if(w.text==="n"||w.text==="-n"&&b.text==="of"){let y=[],A=u.slice(b.offset+2).split(",");for(let P of A){let T=h.internalParse(P,h._parseSelector);T&&y.push(T)}let I=t(y);a.id+=I.id,a.attr+=I.attr,a.tag+=I.tag;continue e}continue e}a.attr++;continue e}if(l.getChildren().length>0){let o=r(l);a.id+=o.id,a.attr+=o.attr,a.tag+=o.tag}}return a},i=r(e);return`[${p("Selector Specificity")}](https://developer.mozilla.org/docs/Web/CSS/Specificity): (${i.id}, ${i.attr}, ${i.tag})`}},Si=class{constructor(e){this.prev=null,this.element=e}processSelector(e){let t=null;if(!(this.element instanceof Ye)&&e.getChildren().some(r=>r.hasChildren()&&r.getChild(0).type===m.SelectorCombinator)){let r=this.element.findRoot();r.parent instanceof Ye&&(t=this.element,this.element=r.parent,this.element.removeChild(r),this.prev=null)}for(let r of e.getChildren()){if(r instanceof he){if(this.prev instanceof he){let a=new sn("\u2026");this.element.addChild(a),this.element=a}else this.prev&&(this.prev.matches("+")||this.prev.matches("~"))&&this.element.parent&&(this.element=this.element.parent);this.prev&&this.prev.matches("~")&&this.element.addChild(new sn("\u22EE"));let i=Ys(r,t),s=i.findRoot();this.element.addChild(s),this.element=i}(r instanceof he||r.type===m.SelectorCombinatorParent||r.type===m.SelectorCombinatorShadowPiercingDescendant||r.type===m.SelectorCombinatorSibling||r.type===m.SelectorCombinatorAllSiblings)&&(this.prev=r)}}};function ya(n){switch(n.type){case m.MixinDeclaration:case m.Stylesheet:return!0}return!1}function xa(n){if(n.matches("@at-root"))return null;let e=new Ye,t=[],r=n.getParent();if(r instanceof ae){let s=r.getParent();for(;s&&!ya(s);){if(s instanceof ae){if(s.getSelectors().matches("@at-root"))break;t.push(s)}s=s.getParent()}}let i=new Si(e);for(let s=t.length-1;s>=0;s--){let a=t[s].getSelectors().getChild(0);a&&i.processSelector(a)}return i.processSelector(n),e}var _t=class{constructor(e,t){this.clientCapabilities=e,this.cssDataManager=t,this.selectorPrinting=new pr(t)}configure(e){this.defaultSettings=e}doHover(e,t,r,i=this.defaultSettings){function s(h){return R.create(e.positionAt(h.offset),e.positionAt(h.end))}let a=e.offsetAt(t),l=vt(r,a),o=null,d;for(let h=0;htypeof t=="string"?t:t.value):e.value}doesSupportMarkdown(){if(!ie(this.supportsMarkdown)){if(!ie(this.clientCapabilities))return this.supportsMarkdown=!0,this.supportsMarkdown;let e=this.clientCapabilities.textDocument&&this.clientCapabilities.textDocument.hover;this.supportsMarkdown=e&&e.contentFormat&&Array.isArray(e.contentFormat)&&e.contentFormat.indexOf(se.Markdown)!==-1}return this.supportsMarkdown}};var Qs=/^\w+:\/\//,Zs=/^data:/,lt=class{constructor(e,t){this.fileSystemProvider=e,this.resolveModuleReferences=t}configure(e){this.defaultSettings=e}findDefinition(e,t,r){let i=new ot(r),s=e.offsetAt(t),a=Hn(r,s);if(!a)return null;let l=i.findSymbolFromNode(a);return l?{uri:e.uri,range:Pe(l.node,e)}:null}findReferences(e,t,r){return this.findDocumentHighlights(e,t,r).map(s=>({uri:e.uri,range:s.range}))}getHighlightNode(e,t,r){let i=e.offsetAt(t),s=Hn(r,i);if(!(!s||s.type===m.Stylesheet||s.type===m.Declarations))return s.type===m.Identifier&&s.parent&&s.parent.type===m.ClassSelector&&(s=s.parent),s}findDocumentHighlights(e,t,r){let i=[],s=this.getHighlightNode(e,t,r);if(!s)return i;let a=new ot(r),l=a.findSymbolFromNode(s),o=s.getText();return r.accept(d=>{if(l){if(a.matchesSymbol(d,l))return i.push({kind:to(d),range:Pe(d,e)}),!1}else s&&s.type===d.type&&d.matches(o)&&i.push({kind:to(d),range:Pe(d,e)});return!0}),i}isRawStringDocumentLinkNode(e){return e.type===m.Import}findDocumentLinks(e,t,r){let i=this.findUnresolvedLinks(e,t),s=[];for(let a of i){let l=a.link,o=l.target;if(!(!o||Zs.test(o)))if(Qs.test(o))s.push(l);else{let d=r.resolveReference(o,e.uri);d&&(l.target=d),s.push(l)}}return s}async findDocumentLinks2(e,t,r){let i=this.findUnresolvedLinks(e,t),s=[];for(let a of i){let l=a.link,o=l.target;if(!(!o||Zs.test(o)))if(Qs.test(o))s.push(l);else{let d=await this.resolveReference(o,e.uri,r,a.isRawLink);d!==void 0&&(l.target=d,s.push(l))}}return s}findUnresolvedLinks(e,t){let r=[],i=s=>{let a=s.getText(),l=Pe(s,e);if(l.start.line===l.end.line&&l.start.character===l.end.character)return;(V(a,"'")||V(a,'"'))&&(a=a.slice(1,-1));let o=s.parent?this.isRawStringDocumentLinkNode(s.parent):!1;r.push({link:{target:a,range:l},isRawLink:o})};return t.accept(s=>{if(s.type===m.URILiteral){let a=s.getChild(0);return a&&i(a),!1}if(s.parent&&this.isRawStringDocumentLinkNode(s.parent)){let a=s.getText();return(V(a,"'")||V(a,'"'))&&i(s),!1}return!0}),r}findSymbolInformations(e,t){let r=[],i=(s,a,l)=>{let o=l instanceof x?Pe(l,e):l,d={name:s||p(""),kind:a,location:it.create(e.uri,o)};r.push(d)};return this.collectDocumentSymbols(e,t,i),r}findDocumentSymbols(e,t){let r=[],i=[],s=(a,l,o,d,h)=>{let u=o instanceof x?Pe(o,e):o,w=d instanceof x?Pe(d,e):d;(!w||!eo(u,w))&&(w=R.create(u.start,u.start));let b={name:a||p(""),kind:l,range:u,selectionRange:w},y=i.pop();for(;y&&!eo(y[1],u);)y=i.pop();if(y){let E=y[0];E.children||(E.children=[]),E.children.push(b),i.push(y)}else r.push(b);h&&i.push([b,Pe(h,e)])};return this.collectDocumentSymbols(e,t,s),r}collectDocumentSymbols(e,t,r){t.accept(i=>{if(i instanceof ae){for(let s of i.getSelectors().getChildren())if(s instanceof de){let a=R.create(e.positionAt(s.offset),e.positionAt(i.end));r(s.getText(),ge.Class,a,s,i.getDeclarations())}}else if(i instanceof xe)r(i.getName(),ge.Variable,i,i.getVariable(),void 0);else if(i instanceof ue)r(i.getName(),ge.Method,i,i.getIdentifier(),i.getDeclarations());else if(i instanceof De)r(i.getName(),ge.Function,i,i.getIdentifier(),i.getDeclarations());else if(i instanceof mt){let s=p("@keyframes {0}",i.getName());r(s,ge.Class,i,i.getIdentifier(),i.getDeclarations())}else if(i instanceof pt){let s=p("@font-face");r(s,ge.Class,i,void 0,i.getDeclarations())}else if(i instanceof Be){let s=i.getChild(0);if(s instanceof ut){let a="@media "+s.getText();r(a,ge.Module,i,s,i.getDeclarations())}}return!0})}findDocumentColors(e,t){let r=[];return t.accept(i=>{let s=Sa(i,e);return s&&r.push(s),!0}),r}getColorPresentations(e,t,r,i){let s=[],a=Math.round(r.red*255),l=Math.round(r.green*255),o=Math.round(r.blue*255),d;r.alpha===1?d=`rgb(${a}, ${l}, ${o})`:d=`rgba(${a}, ${l}, ${o}, ${r.alpha})`,s.push({label:d,textEdit:_.replace(i,d)}),r.alpha===1?d=`#${at(a)}${at(l)}${at(o)}`:d=`#${at(a)}${at(l)}${at(o)}${at(Math.round(r.alpha*255))}`,s.push({label:d,textEdit:_.replace(i,d)});let h=si(r);h.a===1?d=`hsl(${h.h}, ${Math.round(h.s*100)}%, ${Math.round(h.l*100)}%)`:d=`hsla(${h.h}, ${Math.round(h.s*100)}%, ${Math.round(h.l*100)}%, ${h.a})`,s.push({label:d,textEdit:_.replace(i,d)});let u=Us(r);return u.a===1?d=`hwb(${u.h} ${Math.round(u.w*100)}% ${Math.round(u.b*100)}%)`:d=`hwb(${u.h} ${Math.round(u.w*100)}% ${Math.round(u.b*100)}% / ${u.a})`,s.push({label:d,textEdit:_.replace(i,d)}),s}prepareRename(e,t,r){let i=this.getHighlightNode(e,t,r);if(i)return R.create(e.positionAt(i.offset),e.positionAt(i.end))}doRename(e,t,r,i){let a=this.findDocumentHighlights(e,t,i).map(l=>_.replace(l.range,r));return{changes:{[e.uri]:a}}}async resolveModuleReference(e,t,r){if(V(t,"file://")){let i=Ca(e);if(i&&i!=="."&&i!==".."){let s=r.resolveReference("/",t),a=ar(t),l=await this.resolvePathToModule(i,a,s);if(l){let o=e.substring(i.length+1);return Je(l,o)}}}}async mapReference(e,t){return e}async resolveReference(e,t,r,i=!1,s=this.defaultSettings){if(e[0]==="~"&&e[1]!=="/"&&this.fileSystemProvider)return e=e.substring(1),this.mapReference(await this.resolveModuleReference(e,t,r),i);let a=await this.mapReference(r.resolveReference(e,t),i);if(this.resolveModuleReferences){if(a&&await this.fileExists(a))return a;let l=await this.mapReference(await this.resolveModuleReference(e,t,r),i);if(l)return l}if(a&&!await this.fileExists(a)){let l=r.resolveReference("/",t);if(s&&l){if(e in s)return this.mapReference(Je(l,s[e]),i);let o=e.indexOf("/"),d=`${e.substring(0,o)}/`;if(d in s){let h=s[d].slice(0,-1),u=Je(l,h);return this.mapReference(u=Je(u,e.substring(d.length-1)),i)}}}return a}async resolvePathToModule(e,t,r){let i=Je(t,"node_modules",e,"package.json");if(await this.fileExists(i))return ar(i);if(r&&t.startsWith(r)&&t.length!==r.length)return this.resolvePathToModule(e,ar(t),r)}async fileExists(e){if(!this.fileSystemProvider)return!1;try{let t=await this.fileSystemProvider.stat(e);return!(t.type===st.Unknown&&t.size===-1)}catch{return!1}}};function Sa(n,e){let t=Vs(n);if(t){let r=Pe(n,e);return{color:t,range:r}}return null}function Pe(n,e){return R.create(e.positionAt(n.offset),e.positionAt(n.end))}function eo(n,e){let t=e.start.line,r=e.end.line,i=n.start.line,s=n.end.line;return!(ts||r>s||t===i&&e.start.charactern.end.character)}function to(n){if(n.type===m.Selector)return Ge.Write;if(n instanceof G&&n.parent&&n.parent instanceof Ve&&n.isCustomProperty)return Ge.Write;if(n.parent)switch(n.parent.type){case m.FunctionDeclaration:case m.MixinDeclaration:case m.Keyframe:case m.VariableDeclaration:case m.FunctionParameter:return Ge.Write}return Ge.Read}function at(n){let e=n.toString(16);return e.length!==2?"0"+e:e}function Ca(n){let e=n.indexOf("/");if(e===-1)return"";if(n[0]==="@"){let t=n.indexOf("/",e+1);return t===-1?n:n.substring(0,t)}return n.substring(0,e)}var It=ee.Warning,no=ee.Error,be=ee.Ignore,q=class{constructor(e,t,r){this.id=e,this.message=t,this.defaultValue=r}},Ci=class{constructor(e,t,r){this.id=e,this.message=t,this.defaultValue=r}},W={AllVendorPrefixes:new q("compatibleVendorPrefixes",p("When using a vendor-specific prefix make sure to also include all other vendor-specific properties"),be),IncludeStandardPropertyWhenUsingVendorPrefix:new q("vendorPrefix",p("When using a vendor-specific prefix also include the standard property"),It),DuplicateDeclarations:new q("duplicateProperties",p("Do not use duplicate style definitions"),be),EmptyRuleSet:new q("emptyRules",p("Do not use empty rulesets"),It),ImportStatemement:new q("importStatement",p("Import statements do not load in parallel"),be),BewareOfBoxModelSize:new q("boxModel",p("Do not use width or height when using padding or border"),be),UniversalSelector:new q("universalSelector",p("The universal selector (*) is known to be slow"),be),ZeroWithUnit:new q("zeroUnits",p("No unit for zero needed"),be),RequiredPropertiesForFontFace:new q("fontFaceProperties",p("@font-face rule must define 'src' and 'font-family' properties"),It),HexColorLength:new q("hexColorLength",p("Hex colors must consist of three, four, six or eight hex numbers"),no),ArgsInColorFunction:new q("argumentsInColorFunction",p("Invalid number of parameters"),no),UnknownProperty:new q("unknownProperties",p("Unknown property."),It),UnknownAtRules:new q("unknownAtRules",p("Unknown at-rule."),It),IEStarHack:new q("ieHack",p("IE hacks are only necessary when supporting IE7 and older"),be),UnknownVendorSpecificProperty:new q("unknownVendorSpecificProperties",p("Unknown vendor specific property."),be),PropertyIgnoredDueToDisplay:new q("propertyIgnoredDueToDisplay",p("Property is ignored due to the display."),It),AvoidImportant:new q("important",p("Avoid using !important. It is an indication that the specificity of the entire CSS has gotten out of control and needs to be refactored."),be),AvoidFloat:new q("float",p("Avoid using 'float'. Floats lead to fragile CSS that is easy to break if one aspect of the layout changes."),be),AvoidIdSelector:new q("idSelector",p("Selectors should not contain IDs because these rules are too tightly coupled with the HTML."),be)},ro={ValidProperties:new Ci("validProperties",p("A list of properties that are not validated against the `unknownProperties` rule."),[])},mr=class{constructor(e={}){this.conf=e}getRule(e){if(this.conf.hasOwnProperty(e.id)){let t=ka(this.conf[e.id]);if(t)return t}return e.defaultValue}getSetting(e){return this.conf[e.id]}};function ka(n){switch(n){case"ignore":return ee.Ignore;case"warning":return ee.Warning;case"error":return ee.Error}return null}var Dt=class{constructor(e){this.cssDataManager=e}doCodeActions(e,t,r,i){return this.doCodeActions2(e,t,r,i).map(s=>{let a=s.edit&&s.edit.documentChanges&&s.edit.documentChanges[0];return Me.create(s.title,"_css.applyCodeAction",e.uri,e.version,a&&a.edits)})}doCodeActions2(e,t,r,i){let s=[];if(r.diagnostics)for(let a of r.diagnostics)this.appendFixesForMarker(e,i,a,s);return s}getFixesForUnknownProperty(e,t,r,i){let s=t.getName(),a=[];this.cssDataManager.getProperties().forEach(o=>{let d=Hi(s,o.name);d>=s.length/2&&a.push({property:o.name,score:d})}),a.sort((o,d)=>d.score-o.score||o.property.localeCompare(d.property));let l=3;for(let o of a){let d=o.property,h=p("Rename to '{0}'",d),u=_.replace(r.range,d),w=qt.create(e.uri,e.version),b={documentChanges:[St.create(w,[u])]},y=Ht.create(h,b,Gt.QuickFix);if(y.diagnostics=[r],i.push(y),--l<=0)return}}appendFixesForMarker(e,t,r,i){if(r.code!==W.UnknownProperty.id)return;let s=e.offsetAt(r.range.start),a=e.offsetAt(r.range.end),l=vt(t,s);for(let o=l.length-1;o>=0;o--){let d=l[o];if(d instanceof Q){let h=d.getProperty();if(h&&h.offset===s&&h.end===a){this.getFixesForUnknownProperty(e,h,r,i);return}}}}};var ur=class{constructor(e){this.fullPropertyName=e.getFullPropertyName().toLowerCase(),this.node=e}};function on(n,e,t,r){let i=n[e];i.value=t,t&&(gi(i.properties,r)||i.properties.push(r))}function Fa(n,e,t){on(n,"top",e,t),on(n,"right",e,t),on(n,"bottom",e,t),on(n,"left",e,t)}function ne(n,e,t,r){e==="top"||e==="right"||e==="bottom"||e==="left"?on(n,e,t,r):Fa(n,t,r)}function ki(n,e,t){switch(e.length){case 1:ne(n,void 0,e[0],t);break;case 2:ne(n,"top",e[0],t),ne(n,"bottom",e[0],t),ne(n,"right",e[1],t),ne(n,"left",e[1],t);break;case 3:ne(n,"top",e[0],t),ne(n,"right",e[1],t),ne(n,"left",e[1],t),ne(n,"bottom",e[2],t);break;case 4:ne(n,"top",e[0],t),ne(n,"right",e[1],t),ne(n,"bottom",e[2],t),ne(n,"left",e[3],t);break}}function Fi(n,e){for(let t of e)if(n.matches(t))return!0;return!1}function an(n,e=!0){return e&&Fi(n,["initial","unset"])?!1:parseFloat(n.getText())!==0}function io(n,e=!0){return n.map(t=>an(t,e))}function fr(n,e=!0){return!(Fi(n,["none","hidden"])||e&&Fi(n,["initial","unset"]))}function Ea(n,e=!0){return n.map(t=>fr(t,e))}function _a(n){let e=n.getChildren();if(e.length===1){let t=e[0];return an(t)&&fr(t)}for(let t of e){let r=t;if(!an(r,!1)||!fr(r,!1))return!1}return!0}function Ei(n){let e={top:{value:!1,properties:[]},right:{value:!1,properties:[]},bottom:{value:!1,properties:[]},left:{value:!1,properties:[]}};for(let t of n){let r=t.node.value;if(!(typeof r>"u"))switch(t.fullPropertyName){case"box-sizing":return{top:{value:!1,properties:[]},right:{value:!1,properties:[]},bottom:{value:!1,properties:[]},left:{value:!1,properties:[]}};case"width":e.width=t;break;case"height":e.height=t;break;default:let i=t.fullPropertyName.split("-");switch(i[0]){case"border":switch(i[1]){case void 0:case"top":case"right":case"bottom":case"left":switch(i[2]){case void 0:ne(e,i[1],_a(r),t);break;case"width":ne(e,i[1],an(r,!1),t);break;case"style":ne(e,i[1],fr(r,!0),t);break}break;case"width":ki(e,io(r.getChildren(),!1),t);break;case"style":ki(e,Ea(r.getChildren(),!0),t);break}break;case"padding":i.length===1?ki(e,io(r.getChildren(),!0),t):ne(e,i[1],an(r,!0),t);break}break}}return e}var gr=class{constructor(){this.data={}}add(e,t,r){let i=this.data[e];i||(i={nodes:[],names:[]},this.data[e]=i),i.names.push(t),r&&i.nodes.push(r)}},ln=class n{static entries(e,t,r,i,s){let a=new n(t,r,i);return e.acceptVisitor(a),a.completeValidations(),a.getEntries(s)}constructor(e,t,r){this.cssDataManager=r,this.warnings=[],this.settings=t,this.documentText=e.getText(),this.keyframes=new gr,this.validProperties={};let i=t.getSetting(ro.ValidProperties);Array.isArray(i)&&i.forEach(s=>{if(typeof s=="string"){let a=s.trim().toLowerCase();a.length&&(this.validProperties[a]=!0)}})}isValidPropertyDeclaration(e){let t=e.fullPropertyName;return this.validProperties[t]}fetch(e,t){let r=[];for(let i of e)i.fullPropertyName===t&&r.push(i);return r}fetchWithValue(e,t,r){let i=[];for(let s of e)if(s.fullPropertyName===t){let a=s.node.getValue();a&&this.findValueInExpression(a,r)&&i.push(s)}return i}findValueInExpression(e,t){let r=!1;return e.accept(i=>(i.type===m.Identifier&&i.matches(t)&&(r=!0),!r)),r}getEntries(e=ee.Warning|ee.Error){return this.warnings.filter(t=>(t.getLevel()&e)!==0)}addEntry(e,t,r){let i=new wt(e,t,this.settings.getRule(t),r);this.warnings.push(i)}getMissingNames(e,t){let r=e.slice(0);for(let s=0;s0){let o=this.fetch(r,"float");for(let d=0;d0){let o=this.fetch(r,"vertical-align");for(let d=0;d1)for(let w=0;wX.startsWith(j))&&y.delete(P)}}let E=[];for(let I=0,P=n.prefixes.length;Is instanceof qe?(i+=1,!1):!0),i!==r&&this.addEntry(e,W.ArgsInColorFunction)),!0}};ln.prefixes=["-ms-","-moz-","-o-","-webkit-"];var Rt=class{constructor(e){this.cssDataManager=e}configure(e){this.settings=e}doValidation(e,t,r=this.settings){if(r&&r.validate===!1)return[];let i=[];i.push.apply(i,Gn.entries(t)),i.push.apply(i,ln.entries(t,e,new mr(r&&r.lint),this.cssDataManager));let s=[];for(let l in W)s.push(W[l].id);function a(l){let o=R.create(e.positionAt(l.getOffset()),e.positionAt(l.getOffset()+l.getLength())),d=e.languageId;return{code:l.getRule().id,source:d,message:l.getMessage(),severity:l.getLevel()===ee.Warning?yt.Warning:yt.Error,range:o}}return i.filter(l=>l.getLevel()!==ee.Ignore).map(a)}};var so=47,Ia=10,Da=13,Ra=12,za=36,Ma=35,Ta=123,cn=61,Na=33,Oa=60,Pa=62,_i=46;var Ae=c.CustomToken,br=Ae++,Mt=Ae++,pc=Ae++,Ii=Ae++,Di=Ae++,wr=Ae++,vr=Ae++,dn=Ae++,mc=Ae++,zt=class extends ce{scanNext(e){if(this.stream.advanceIfChar(za)){let t=["$"];if(this.ident(t))return this.finishToken(e,br,t.join(""));this.stream.goBackTo(e)}return this.stream.advanceIfChars([Ma,Ta])?this.finishToken(e,Mt):this.stream.advanceIfChars([cn,cn])?this.finishToken(e,Ii):this.stream.advanceIfChars([Na,cn])?this.finishToken(e,Di):this.stream.advanceIfChar(Oa)?this.stream.advanceIfChar(cn)?this.finishToken(e,vr):this.finishToken(e,c.Delim):this.stream.advanceIfChar(Pa)?this.stream.advanceIfChar(cn)?this.finishToken(e,wr):this.finishToken(e,c.Delim):this.stream.advanceIfChars([_i,_i,_i])?this.finishToken(e,dn):super.scanNext(e)}comment(){return super.comment()?!0:!this.inURL&&this.stream.advanceIfChars([so,so])?(this.stream.advanceWhileChar(e=>{switch(e){case Ia:case Da:case Ra:return!1;default:return!0}}),!0):!1}};var hn=class{constructor(e,t){this.id=e,this.message=t}},yr={FromExpected:new hn("scss-fromexpected",p("'from' expected")),ThroughOrToExpected:new hn("scss-throughexpected",p("'through' or 'to' expected")),InExpected:new hn("scss-fromexpected",p("'in' expected"))};var xr=class extends ke{constructor(){super(new zt)}_parseStylesheetStatement(e=!1){return this.peek(c.AtKeyword)?this._parseWarnAndDebug()||this._parseControlStatement()||this._parseMixinDeclaration()||this._parseMixinContent()||this._parseMixinReference()||this._parseFunctionDeclaration()||this._parseForward()||this._parseUse()||this._parseRuleset(e)||super._parseStylesheetAtStatement(e):this._parseRuleset(!0)||this._parseVariableDeclaration()}_parseImport(){if(!this.peekKeyword("@import"))return null;let e=this.create(je);if(this.consumeToken(),!e.addChild(this._parseURILiteral())&&!e.addChild(this._parseStringLiteral()))return this.finish(e,f.URIOrStringExpected);for(;this.accept(c.Comma);)if(!e.addChild(this._parseURILiteral())&&!e.addChild(this._parseStringLiteral()))return this.finish(e,f.URIOrStringExpected);return this._completeParseImport(e)}_parseVariableDeclaration(e=[]){if(!this.peek(br))return null;let t=this.create(xe);if(!t.setVariable(this._parseVariable()))return null;if(!this.accept(c.Colon))return this.finish(t,f.ColonExpected);if(this.prevToken&&(t.colonPosition=this.prevToken.offset),!t.setValue(this._parseExpr()))return this.finish(t,f.VariableValueExpected,[],e);for(;this.peek(c.Exclamation);)if(!t.addChild(this._tryParsePrio())){if(this.consumeToken(),!this.peekRegExp(c.Ident,/^(default|global)$/))return this.finish(t,f.UnknownKeyword);this.consumeToken()}return this.peek(c.SemiColon)&&(t.semicolonPosition=this.token.offset),this.finish(t)}_parseMediaCondition(){return this._parseInterpolation()||super._parseMediaCondition()}_parseMediaFeatureRangeOperator(){return this.accept(vr)||this.accept(wr)||super._parseMediaFeatureRangeOperator()}_parseMediaFeatureName(){return this._parseModuleMember()||this._parseFunction()||this._parseIdent()||this._parseVariable()}_parseKeyframeSelector(){return this._tryParseKeyframeSelector()||this._parseControlStatement(this._parseKeyframeSelector.bind(this))||this._parseWarnAndDebug()||this._parseMixinReference()||this._parseFunctionDeclaration()||this._parseVariableDeclaration()||this._parseMixinContent()}_parseVariable(){if(!this.peek(br))return null;let e=this.create(Ke);return this.consumeToken(),e}_parseModuleMember(){let e=this.mark(),t=this.create(jt);return t.setIdentifier(this._parseIdent([z.Module]))?this.hasWhitespace()||!this.acceptDelim(".")||this.hasWhitespace()?(this.restoreAtMark(e),null):t.addChild(this._parseVariable()||this._parseFunction())?t:this.finish(t,f.IdentifierOrVariableExpected):null}_parseIdent(e){if(!this.peek(c.Ident)&&!this.peek(Mt)&&!this.peekDelim("-"))return null;let t=this.create(G);t.referenceTypes=e,t.isCustomProperty=this.peekRegExp(c.Ident,/^--/);let r=!1,i=()=>{let s=this.mark();return this.acceptDelim("-")&&(this.hasWhitespace()||this.acceptDelim("-"),this.hasWhitespace())?(this.restoreAtMark(s),null):this._parseInterpolation()};for(;(this.accept(c.Ident)||t.addChild(i())||r&&this.acceptRegexp(/^[\w-]/))&&(r=!0,!this.hasWhitespace()););return r?this.finish(t):null}_parseTermExpression(){return this._parseModuleMember()||this._parseVariable()||this._parseNestingSelector()||super._parseTermExpression()}_parseInterpolation(){if(this.peek(Mt)){let e=this.create(rt);return this.consumeToken(),!e.addChild(this._parseExpr())&&!this._parseNestingSelector()?this.accept(c.CurlyR)?this.finish(e):this.finish(e,f.ExpressionExpected):this.accept(c.CurlyR)?this.finish(e):this.finish(e,f.RightCurlyExpected)}return null}_parseOperator(){if(this.peek(Ii)||this.peek(Di)||this.peek(wr)||this.peek(vr)||this.peekDelim(">")||this.peekDelim("<")||this.peekIdent("and")||this.peekIdent("or")||this.peekDelim("%")){let e=this.createNode(m.Operator);return this.consumeToken(),this.finish(e)}return super._parseOperator()}_parseUnaryOperator(){if(this.peekIdent("not")){let e=this.create(x);return this.consumeToken(),this.finish(e)}return super._parseUnaryOperator()}_parseRuleSetDeclaration(){return this.peek(c.AtKeyword)?this._parseKeyframe()||this._parseImport()||this._parseMedia(!0)||this._parseFontFace()||this._parseWarnAndDebug()||this._parseControlStatement()||this._parseFunctionDeclaration()||this._parseExtends()||this._parseMixinReference()||this._parseMixinContent()||this._parseMixinDeclaration()||this._parseRuleset(!0)||this._parseSupports(!0)||this._parseLayer()||this._parsePropertyAtRule()||this._parseContainer(!0)||this._parseRuleSetDeclarationAtStatement():this._parseVariableDeclaration()||this._tryParseRuleset(!0)||this._parseDeclaration()}_parseDeclaration(e){let t=this._tryParseCustomPropertyDeclaration(e);if(t)return t;let r=this.create(Q);if(!r.setProperty(this._parseProperty()))return null;if(!this.accept(c.Colon))return this.finish(r,f.ColonExpected,[c.Colon],e||[c.SemiColon]);this.prevToken&&(r.colonPosition=this.prevToken.offset);let i=!1;if(r.setValue(this._parseExpr())&&(i=!0,r.addChild(this._parsePrio())),this.peek(c.CurlyL))r.setNestedProperties(this._parseNestedProperties());else if(!i)return this.finish(r,f.PropertyValueExpected);return this.peek(c.SemiColon)&&(r.semicolonPosition=this.token.offset),this.finish(r)}_parseNestedProperties(){let e=this.create(Ut);return this._parseBody(e,this._parseDeclaration.bind(this))}_parseExtends(){if(this.peekKeyword("@extend")){let e=this.create(Se);if(this.consumeToken(),!e.getSelectors().addChild(this._parseSimpleSelector()))return this.finish(e,f.SelectorExpected);for(;this.accept(c.Comma);)e.getSelectors().addChild(this._parseSimpleSelector());return this.accept(c.Exclamation)&&!this.acceptIdent("optional")?this.finish(e,f.UnknownKeyword):this.finish(e)}return null}_parseSimpleSelectorBody(){return this._parseSelectorPlaceholder()||super._parseSimpleSelectorBody()}_parseNestingSelector(){if(this.peekDelim("&")){let e=this.createNode(m.SelectorCombinator);for(this.consumeToken();!this.hasWhitespace()&&(this.acceptDelim("-")||this.accept(c.Num)||this.accept(c.Dimension)||e.addChild(this._parseIdent())||this.acceptDelim("&")););return this.finish(e)}return null}_parseSelectorPlaceholder(){if(this.peekDelim("%")){let e=this.createNode(m.SelectorPlaceholder);return this.consumeToken(),this._parseIdent(),this.finish(e)}else if(this.peekKeyword("@at-root")){let e=this.createNode(m.SelectorPlaceholder);if(this.consumeToken(),this.accept(c.ParenthesisL)){if(!this.acceptIdent("with")&&!this.acceptIdent("without"))return this.finish(e,f.IdentifierExpected);if(!this.accept(c.Colon))return this.finish(e,f.ColonExpected);if(!e.addChild(this._parseIdent()))return this.finish(e,f.IdentifierExpected);if(!this.accept(c.ParenthesisR))return this.finish(e,f.RightParenthesisExpected,[c.CurlyR])}return this.finish(e)}return null}_parseElementName(){let e=this.mark(),t=super._parseElementName();return t&&!this.hasWhitespace()&&this.peek(c.ParenthesisL)?(this.restoreAtMark(e),null):t}_tryParsePseudoIdentifier(){return this._parseInterpolation()||super._tryParsePseudoIdentifier()}_parseWarnAndDebug(){if(!this.peekKeyword("@debug")&&!this.peekKeyword("@warn")&&!this.peekKeyword("@error"))return null;let e=this.createNode(m.Debug);return this.consumeToken(),e.addChild(this._parseExpr()),this.finish(e)}_parseControlStatement(e=this._parseRuleSetDeclaration.bind(this)){return this.peek(c.AtKeyword)?this._parseIfStatement(e)||this._parseForStatement(e)||this._parseEachStatement(e)||this._parseWhileStatement(e):null}_parseIfStatement(e){return this.peekKeyword("@if")?this._internalParseIfStatement(e):null}_internalParseIfStatement(e){let t=this.create(yn);if(this.consumeToken(),!t.setExpression(this._parseExpr(!0)))return this.finish(t,f.ExpressionExpected);if(this._parseBody(t,e),this.acceptKeyword("@else")){if(this.peekIdent("if"))t.setElseClause(this._internalParseIfStatement(e));else if(this.peek(c.CurlyL)){let r=this.create(kn);this._parseBody(r,e),t.setElseClause(r)}}return this.finish(t)}_parseForStatement(e){if(!this.peekKeyword("@for"))return null;let t=this.create(xn);return this.consumeToken(),t.setVariable(this._parseVariable())?this.acceptIdent("from")?t.addChild(this._parseBinaryExpr())?!this.acceptIdent("to")&&!this.acceptIdent("through")?this.finish(t,yr.ThroughOrToExpected,[c.CurlyR]):t.addChild(this._parseBinaryExpr())?this._parseBody(t,e):this.finish(t,f.ExpressionExpected,[c.CurlyR]):this.finish(t,f.ExpressionExpected,[c.CurlyR]):this.finish(t,yr.FromExpected,[c.CurlyR]):this.finish(t,f.VariableNameExpected,[c.CurlyR])}_parseEachStatement(e){if(!this.peekKeyword("@each"))return null;let t=this.create(Sn);this.consumeToken();let r=t.getVariables();if(!r.addChild(this._parseVariable()))return this.finish(t,f.VariableNameExpected,[c.CurlyR]);for(;this.accept(c.Comma);)if(!r.addChild(this._parseVariable()))return this.finish(t,f.VariableNameExpected,[c.CurlyR]);return this.finish(r),this.acceptIdent("in")?t.addChild(this._parseExpr())?this._parseBody(t,e):this.finish(t,f.ExpressionExpected,[c.CurlyR]):this.finish(t,yr.InExpected,[c.CurlyR])}_parseWhileStatement(e){if(!this.peekKeyword("@while"))return null;let t=this.create(Cn);return this.consumeToken(),t.addChild(this._parseBinaryExpr())?this._parseBody(t,e):this.finish(t,f.ExpressionExpected,[c.CurlyR])}_parseFunctionBodyDeclaration(){return this._parseVariableDeclaration()||this._parseReturnStatement()||this._parseWarnAndDebug()||this._parseControlStatement(this._parseFunctionBodyDeclaration.bind(this))}_parseFunctionDeclaration(){if(!this.peekKeyword("@function"))return null;let e=this.create(De);if(this.consumeToken(),!e.setIdentifier(this._parseIdent([z.Function])))return this.finish(e,f.IdentifierExpected,[c.CurlyR]);if(!this.accept(c.ParenthesisL))return this.finish(e,f.LeftParenthesisExpected,[c.CurlyR]);if(e.getParameters().addChild(this._parseParameterDeclaration())){for(;this.accept(c.Comma)&&!this.peek(c.ParenthesisR);)if(!e.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(e,f.VariableNameExpected)}return this.accept(c.ParenthesisR)?this._parseBody(e,this._parseFunctionBodyDeclaration.bind(this)):this.finish(e,f.RightParenthesisExpected,[c.CurlyR])}_parseReturnStatement(){if(!this.peekKeyword("@return"))return null;let e=this.createNode(m.ReturnStatement);return this.consumeToken(),e.addChild(this._parseExpr())?this.finish(e):this.finish(e,f.ExpressionExpected)}_parseMixinDeclaration(){if(!this.peekKeyword("@mixin"))return null;let e=this.create(ue);if(this.consumeToken(),!e.setIdentifier(this._parseIdent([z.Mixin])))return this.finish(e,f.IdentifierExpected,[c.CurlyR]);if(this.accept(c.ParenthesisL)){if(e.getParameters().addChild(this._parseParameterDeclaration())){for(;this.accept(c.Comma)&&!this.peek(c.ParenthesisR);)if(!e.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(e,f.VariableNameExpected)}if(!this.accept(c.ParenthesisR))return this.finish(e,f.RightParenthesisExpected,[c.CurlyR])}return this._parseBody(e,this._parseRuleSetDeclaration.bind(this))}_parseParameterDeclaration(){let e=this.create(ye);return e.setIdentifier(this._parseVariable())?(this.accept(dn),this.accept(c.Colon)&&!e.setDefaultValue(this._parseExpr(!0))?this.finish(e,f.VariableValueExpected,[],[c.Comma,c.ParenthesisR]):this.finish(e)):null}_parseMixinContent(){if(!this.peekKeyword("@content"))return null;let e=this.create(Vn);if(this.consumeToken(),this.accept(c.ParenthesisL)){if(e.getArguments().addChild(this._parseFunctionArgument())){for(;this.accept(c.Comma)&&!this.peek(c.ParenthesisR);)if(!e.getArguments().addChild(this._parseFunctionArgument()))return this.finish(e,f.ExpressionExpected)}if(!this.accept(c.ParenthesisR))return this.finish(e,f.RightParenthesisExpected)}return this.finish(e)}_parseMixinReference(){if(!this.peekKeyword("@include"))return null;let e=this.create(ze);this.consumeToken();let t=this._parseIdent([z.Mixin]);if(!e.setIdentifier(t))return this.finish(e,f.IdentifierExpected,[c.CurlyR]);if(!this.hasWhitespace()&&this.acceptDelim(".")&&!this.hasWhitespace()){let r=this._parseIdent([z.Mixin]);if(!r)return this.finish(e,f.IdentifierExpected,[c.CurlyR]);let i=this.create(jt);t.referenceTypes=[z.Module],i.setIdentifier(t),e.setIdentifier(r),e.addChild(i)}if(this.accept(c.ParenthesisL)){if(e.getArguments().addChild(this._parseFunctionArgument())){for(;this.accept(c.Comma)&&!this.peek(c.ParenthesisR);)if(!e.getArguments().addChild(this._parseFunctionArgument()))return this.finish(e,f.ExpressionExpected)}if(!this.accept(c.ParenthesisR))return this.finish(e,f.RightParenthesisExpected)}return(this.peekIdent("using")||this.peek(c.CurlyL))&&e.setContent(this._parseMixinContentDeclaration()),this.finish(e)}_parseMixinContentDeclaration(){let e=this.create(jn);if(this.acceptIdent("using")){if(!this.accept(c.ParenthesisL))return this.finish(e,f.LeftParenthesisExpected,[c.CurlyL]);if(e.getParameters().addChild(this._parseParameterDeclaration())){for(;this.accept(c.Comma)&&!this.peek(c.ParenthesisR);)if(!e.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(e,f.VariableNameExpected)}if(!this.accept(c.ParenthesisR))return this.finish(e,f.RightParenthesisExpected,[c.CurlyL])}return this.peek(c.CurlyL)&&this._parseBody(e,this._parseMixinReferenceBodyStatement.bind(this)),this.finish(e)}_parseMixinReferenceBodyStatement(){return this._tryParseKeyframeSelector()||this._parseRuleSetDeclaration()}_parseFunctionArgument(){let e=this.create(le),t=this.mark(),r=this._parseVariable();if(r)if(this.accept(c.Colon))e.setIdentifier(r);else{if(this.accept(dn))return e.setValue(r),this.finish(e);this.restoreAtMark(t)}return e.setValue(this._parseExpr(!0))?(this.accept(dn),e.addChild(this._parsePrio()),this.finish(e)):e.setValue(this._tryParsePrio())?this.finish(e):null}_parseURLArgument(){let e=this.mark(),t=super._parseURLArgument();if(!t||!this.peek(c.ParenthesisR)){this.restoreAtMark(e);let r=this.create(x);return r.addChild(this._parseBinaryExpr()),this.finish(r)}return t}_parseOperation(){if(!this.peek(c.ParenthesisL))return null;let e=this.create(x);for(this.consumeToken();e.addChild(this._parseListElement());)this.accept(c.Comma);return this.accept(c.ParenthesisR)?this.finish(e):this.finish(e,f.RightParenthesisExpected)}_parseListElement(){let e=this.create(Bn),t=this._parseBinaryExpr();if(!t)return null;if(this.accept(c.Colon)){if(e.setKey(t),!e.setValue(this._parseBinaryExpr()))return this.finish(e,f.ExpressionExpected)}else e.setValue(t);return this.finish(e)}_parseUse(){if(!this.peekKeyword("@use"))return null;let e=this.create(En);if(this.consumeToken(),!e.addChild(this._parseStringLiteral()))return this.finish(e,f.StringLiteralExpected);if(!this.peek(c.SemiColon)&&!this.peek(c.EOF)){if(!this.peekRegExp(c.Ident,/as|with/))return this.finish(e,f.UnknownKeyword);if(this.acceptIdent("as")&&!e.setIdentifier(this._parseIdent([z.Module]))&&!this.acceptDelim("*"))return this.finish(e,f.IdentifierOrWildcardExpected);if(this.acceptIdent("with")){if(!this.accept(c.ParenthesisL))return this.finish(e,f.LeftParenthesisExpected,[c.ParenthesisR]);if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,f.VariableNameExpected);for(;this.accept(c.Comma)&&!this.peek(c.ParenthesisR);)if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,f.VariableNameExpected);if(!this.accept(c.ParenthesisR))return this.finish(e,f.RightParenthesisExpected)}}return!this.accept(c.SemiColon)&&!this.accept(c.EOF)?this.finish(e,f.SemiColonExpected):this.finish(e)}_parseModuleConfigDeclaration(){let e=this.create(_n);return e.setIdentifier(this._parseVariable())?!this.accept(c.Colon)||!e.setValue(this._parseExpr(!0))?this.finish(e,f.VariableValueExpected,[],[c.Comma,c.ParenthesisR]):this.accept(c.Exclamation)&&(this.hasWhitespace()||!this.acceptIdent("default"))?this.finish(e,f.UnknownKeyword):this.finish(e):null}_parseForward(){if(!this.peekKeyword("@forward"))return null;let e=this.create(In);if(this.consumeToken(),!e.addChild(this._parseStringLiteral()))return this.finish(e,f.StringLiteralExpected);if(this.acceptIdent("as")){let t=this._parseIdent([z.Forward]);if(!e.setIdentifier(t))return this.finish(e,f.IdentifierExpected);if(this.hasWhitespace()||!this.acceptDelim("*"))return this.finish(e,f.WildcardExpected)}if(this.acceptIdent("with")){if(!this.accept(c.ParenthesisL))return this.finish(e,f.LeftParenthesisExpected,[c.ParenthesisR]);if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,f.VariableNameExpected);for(;this.accept(c.Comma)&&!this.peek(c.ParenthesisR);)if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,f.VariableNameExpected);if(!this.accept(c.ParenthesisR))return this.finish(e,f.RightParenthesisExpected)}else if((this.peekIdent("hide")||this.peekIdent("show"))&&!e.addChild(this._parseForwardVisibility()))return this.finish(e,f.IdentifierOrVariableExpected);return!this.accept(c.SemiColon)&&!this.accept(c.EOF)?this.finish(e,f.SemiColonExpected):this.finish(e)}_parseForwardVisibility(){let e=this.create(Dn);for(e.setIdentifier(this._parseIdent());e.addChild(this._parseVariable()||this._parseIdent());)this.accept(c.Comma);return e.getChildren().length>1?e:null}_parseSupportsCondition(){return this._parseInterpolation()||super._parseSupportsCondition()}};var We=p("Sass documentation"),we=class n extends Xe{constructor(e,t){super("$",e,t),oo(n.scssModuleLoaders),oo(n.scssModuleBuiltIns)}isImportPathParent(e){return e===m.Forward||e===m.Use||super.isImportPathParent(e)}getCompletionForImportPath(e,t){let r=e.getParent().type;if(r===m.Forward||r===m.Use)for(let i of n.scssModuleBuiltIns){let s={label:i.label,documentation:i.documentation,textEdit:_.replace(this.getCompletionRange(e),`'${i.label}'`),kind:k.Module};t.items.push(s)}return super.getCompletionForImportPath(e,t)}createReplaceFunction(){let e=1;return(t,r)=>"\\"+r+": ${"+e+++":"+(n.variableDefaults[r]||"")+"}"}createFunctionProposals(e,t,r,i){for(let s of e){let a=s.func.replace(/\[?(\$\w+)\]?/g,this.createReplaceFunction()),o={label:s.func.substr(0,s.func.indexOf("(")),detail:s.func,documentation:s.desc,textEdit:_.replace(this.getCompletionRange(t),a),insertTextFormat:te.Snippet,kind:k.Function};r&&(o.sortText="z"),i.items.push(o)}return i}getCompletionsForSelector(e,t,r){return this.createFunctionProposals(n.selectorFuncs,null,!0,r),super.getCompletionsForSelector(e,t,r)}getTermProposals(e,t,r){let i=n.builtInFuncs;return e&&(i=i.filter(s=>!s.type||!e.restrictions||e.restrictions.indexOf(s.type)!==-1)),this.createFunctionProposals(i,t,!0,r),super.getTermProposals(e,t,r)}getColorProposals(e,t,r){return this.createFunctionProposals(n.colorProposals,t,!1,r),super.getColorProposals(e,t,r)}getCompletionsForDeclarationProperty(e,t){return this.getCompletionForAtDirectives(t),this.getCompletionsForSelector(null,!0,t),super.getCompletionsForDeclarationProperty(e,t)}getCompletionsForExtendsReference(e,t,r){let i=this.getSymbolContext().findSymbolsAtOffset(this.offset,z.Rule);for(let s of i){let a={label:s.name,textEdit:_.replace(this.getCompletionRange(t),s.name),kind:k.Function};r.items.push(a)}return r}getCompletionForAtDirectives(e){return e.items.push(...n.scssAtDirectives),e}getCompletionForTopLevel(e){return this.getCompletionForAtDirectives(e),this.getCompletionForModuleLoaders(e),super.getCompletionForTopLevel(e),e}getCompletionForModuleLoaders(e){return e.items.push(...n.scssModuleLoaders),e}};we.variableDefaults={$red:"1",$green:"2",$blue:"3",$alpha:"1.0",$color:"#000000",$weight:"0.5",$hue:"0",$saturation:"0%",$lightness:"0%",$degrees:"0",$amount:"0",$string:'""',$substring:'"s"',$number:"0",$limit:"1"};we.colorProposals=[{func:"red($color)",desc:p("Gets the red component of a color.")},{func:"green($color)",desc:p("Gets the green component of a color.")},{func:"blue($color)",desc:p("Gets the blue component of a color.")},{func:"mix($color, $color, [$weight])",desc:p("Mixes two colors together.")},{func:"hue($color)",desc:p("Gets the hue component of a color.")},{func:"saturation($color)",desc:p("Gets the saturation component of a color.")},{func:"lightness($color)",desc:p("Gets the lightness component of a color.")},{func:"adjust-hue($color, $degrees)",desc:p("Changes the hue of a color.")},{func:"lighten($color, $amount)",desc:p("Makes a color lighter.")},{func:"darken($color, $amount)",desc:p("Makes a color darker.")},{func:"saturate($color, $amount)",desc:p("Makes a color more saturated.")},{func:"desaturate($color, $amount)",desc:p("Makes a color less saturated.")},{func:"grayscale($color)",desc:p("Converts a color to grayscale.")},{func:"complement($color)",desc:p("Returns the complement of a color.")},{func:"invert($color)",desc:p("Returns the inverse of a color.")},{func:"alpha($color)",desc:p("Gets the opacity component of a color.")},{func:"opacity($color)",desc:"Gets the alpha component (opacity) of a color."},{func:"rgba($color, $alpha)",desc:p("Changes the alpha component for a color.")},{func:"opacify($color, $amount)",desc:p("Makes a color more opaque.")},{func:"fade-in($color, $amount)",desc:p("Makes a color more opaque.")},{func:"transparentize($color, $amount)",desc:p("Makes a color more transparent.")},{func:"fade-out($color, $amount)",desc:p("Makes a color more transparent.")},{func:"adjust-color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])",desc:p("Increases or decreases one or more components of a color.")},{func:"scale-color($color, [$red], [$green], [$blue], [$saturation], [$lightness], [$alpha])",desc:p("Fluidly scales one or more properties of a color.")},{func:"change-color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])",desc:p("Changes one or more properties of a color.")},{func:"ie-hex-str($color)",desc:p("Converts a color into the format understood by IE filters.")}];we.selectorFuncs=[{func:"selector-nest($selectors\u2026)",desc:p("Nests selector beneath one another like they would be nested in the stylesheet.")},{func:"selector-append($selectors\u2026)",desc:p("Appends selectors to one another without spaces in between.")},{func:"selector-extend($selector, $extendee, $extender)",desc:p("Extends $extendee with $extender within $selector.")},{func:"selector-replace($selector, $original, $replacement)",desc:p("Replaces $original with $replacement within $selector.")},{func:"selector-unify($selector1, $selector2)",desc:p("Unifies two selectors to produce a selector that matches elements matched by both.")},{func:"is-superselector($super, $sub)",desc:p("Returns whether $super matches all the elements $sub does, and possibly more.")},{func:"simple-selectors($selector)",desc:p("Returns the simple selectors that comprise a compound selector.")},{func:"selector-parse($selector)",desc:p("Parses a selector into the format returned by &.")}];we.builtInFuncs=[{func:"unquote($string)",desc:p("Removes quotes from a string.")},{func:"quote($string)",desc:p("Adds quotes to a string.")},{func:"str-length($string)",desc:p("Returns the number of characters in a string.")},{func:"str-insert($string, $insert, $index)",desc:p("Inserts $insert into $string at $index.")},{func:"str-index($string, $substring)",desc:p("Returns the index of the first occurance of $substring in $string.")},{func:"str-slice($string, $start-at, [$end-at])",desc:p("Extracts a substring from $string.")},{func:"to-upper-case($string)",desc:p("Converts a string to upper case.")},{func:"to-lower-case($string)",desc:p("Converts a string to lower case.")},{func:"percentage($number)",desc:p("Converts a unitless number to a percentage."),type:"percentage"},{func:"round($number)",desc:p("Rounds a number to the nearest whole number.")},{func:"ceil($number)",desc:p("Rounds a number up to the next whole number.")},{func:"floor($number)",desc:p("Rounds a number down to the previous whole number.")},{func:"abs($number)",desc:p("Returns the absolute value of a number.")},{func:"min($numbers)",desc:p("Finds the minimum of several numbers.")},{func:"max($numbers)",desc:p("Finds the maximum of several numbers.")},{func:"random([$limit])",desc:p("Returns a random number.")},{func:"length($list)",desc:p("Returns the length of a list.")},{func:"nth($list, $n)",desc:p("Returns a specific item in a list.")},{func:"set-nth($list, $n, $value)",desc:p("Replaces the nth item in a list.")},{func:"join($list1, $list2, [$separator])",desc:p("Joins together two lists into one.")},{func:"append($list1, $val, [$separator])",desc:p("Appends a single value onto the end of a list.")},{func:"zip($lists)",desc:p("Combines several lists into a single multidimensional list.")},{func:"index($list, $value)",desc:p("Returns the position of a value within a list.")},{func:"list-separator(#list)",desc:p("Returns the separator of a list.")},{func:"map-get($map, $key)",desc:p("Returns the value in a map associated with a given key.")},{func:"map-merge($map1, $map2)",desc:p("Merges two maps together into a new map.")},{func:"map-remove($map, $keys)",desc:p("Returns a new map with keys removed.")},{func:"map-keys($map)",desc:p("Returns a list of all keys in a map.")},{func:"map-values($map)",desc:p("Returns a list of all values in a map.")},{func:"map-has-key($map, $key)",desc:p("Returns whether a map has a value associated with a given key.")},{func:"keywords($args)",desc:p("Returns the keywords passed to a function that takes variable arguments.")},{func:"feature-exists($feature)",desc:p("Returns whether a feature exists in the current Sass runtime.")},{func:"variable-exists($name)",desc:p("Returns whether a variable with the given name exists in the current scope.")},{func:"global-variable-exists($name)",desc:p("Returns whether a variable with the given name exists in the global scope.")},{func:"function-exists($name)",desc:p("Returns whether a function with the given name exists.")},{func:"mixin-exists($name)",desc:p("Returns whether a mixin with the given name exists.")},{func:"inspect($value)",desc:p("Returns the string representation of a value as it would be represented in Sass.")},{func:"type-of($value)",desc:p("Returns the type of a value.")},{func:"unit($number)",desc:p("Returns the unit(s) associated with a number.")},{func:"unitless($number)",desc:p("Returns whether a number has units.")},{func:"comparable($number1, $number2)",desc:p("Returns whether two numbers can be added, subtracted, or compared.")},{func:"call($name, $args\u2026)",desc:p("Dynamically calls a Sass function.")}];we.scssAtDirectives=[{label:"@extend",documentation:p("Inherits the styles of another selector."),kind:k.Keyword},{label:"@at-root",documentation:p("Causes one or more rules to be emitted at the root of the document."),kind:k.Keyword},{label:"@debug",documentation:p("Prints the value of an expression to the standard error output stream. Useful for debugging complicated Sass files."),kind:k.Keyword},{label:"@warn",documentation:p("Prints the value of an expression to the standard error output stream. Useful for libraries that need to warn users of deprecations or recovering from minor mixin usage mistakes. Warnings can be turned off with the `--quiet` command-line option or the `:quiet` Sass option."),kind:k.Keyword},{label:"@error",documentation:p("Throws the value of an expression as a fatal error with stack trace. Useful for validating arguments to mixins and functions."),kind:k.Keyword},{label:"@if",documentation:p("Includes the body if the expression does not evaluate to `false` or `null`."),insertText:`@if \${1:expr} { - $0 -}`,insertTextFormat:te.Snippet,kind:k.Keyword},{label:"@for",documentation:p("For loop that repeatedly outputs a set of styles for each `$var` in the `from/through` or `from/to` clause."),insertText:"@for \\$${1:var} from ${2:start} ${3|to,through|} ${4:end} {\n $0\n}",insertTextFormat:te.Snippet,kind:k.Keyword},{label:"@each",documentation:p("Each loop that sets `$var` to each item in the list or map, then outputs the styles it contains using that value of `$var`."),insertText:"@each \\$${1:var} in ${2:list} {\n $0\n}",insertTextFormat:te.Snippet,kind:k.Keyword},{label:"@while",documentation:p("While loop that takes an expression and repeatedly outputs the nested styles until the statement evaluates to `false`."),insertText:`@while \${1:condition} { - $0 -}`,insertTextFormat:te.Snippet,kind:k.Keyword},{label:"@mixin",documentation:p("Defines styles that can be re-used throughout the stylesheet with `@include`."),insertText:`@mixin \${1:name} { - $0 -}`,insertTextFormat:te.Snippet,kind:k.Keyword},{label:"@include",documentation:p("Includes the styles defined by another mixin into the current rule."),kind:k.Keyword},{label:"@function",documentation:p("Defines complex operations that can be re-used throughout stylesheets."),kind:k.Keyword}];we.scssModuleLoaders=[{label:"@use",documentation:p("Loads mixins, functions, and variables from other Sass stylesheets as 'modules', and combines CSS from multiple stylesheets together."),references:[{name:We,url:"https://sass-lang.com/documentation/at-rules/use"}],insertText:"@use $0;",insertTextFormat:te.Snippet,kind:k.Keyword},{label:"@forward",documentation:p("Loads a Sass stylesheet and makes its mixins, functions, and variables available when this stylesheet is loaded with the @use rule."),references:[{name:We,url:"https://sass-lang.com/documentation/at-rules/forward"}],insertText:"@forward $0;",insertTextFormat:te.Snippet,kind:k.Keyword}];we.scssModuleBuiltIns=[{label:"sass:math",documentation:p("Provides functions that operate on numbers."),references:[{name:We,url:"https://sass-lang.com/documentation/modules/math"}]},{label:"sass:string",documentation:p("Makes it easy to combine, search, or split apart strings."),references:[{name:We,url:"https://sass-lang.com/documentation/modules/string"}]},{label:"sass:color",documentation:p("Generates new colors based on existing ones, making it easy to build color themes."),references:[{name:We,url:"https://sass-lang.com/documentation/modules/color"}]},{label:"sass:list",documentation:p("Lets you access and modify values in lists."),references:[{name:We,url:"https://sass-lang.com/documentation/modules/list"}]},{label:"sass:map",documentation:p("Makes it possible to look up the value associated with a key in a map, and much more."),references:[{name:We,url:"https://sass-lang.com/documentation/modules/map"}]},{label:"sass:selector",documentation:p("Provides access to Sass\u2019s powerful selector engine."),references:[{name:We,url:"https://sass-lang.com/documentation/modules/selector"}]},{label:"sass:meta",documentation:p("Exposes the details of Sass\u2019s inner workings."),references:[{name:We,url:"https://sass-lang.com/documentation/modules/meta"}]}];function oo(n){n.forEach(e=>{if(e.documentation&&e.references&&e.references.length>0){let t=typeof e.documentation=="string"?{kind:"markdown",value:e.documentation}:{kind:"markdown",value:e.documentation.value};t.value+=` - -`,t.value+=e.references.map(r=>`[${r.name}](${r.url})`).join(" | "),e.documentation=t}})}var ao=47,Wa=10,La=13,$a=12,Ri=96,zi=46,Ua=c.CustomToken,Sr=Ua++,Tt=class extends ce{scanNext(e){let t=this.escapedJavaScript();return t!==null?this.finishToken(e,t):this.stream.advanceIfChars([zi,zi,zi])?this.finishToken(e,Sr):super.scanNext(e)}comment(){return super.comment()?!0:!this.inURL&&this.stream.advanceIfChars([ao,ao])?(this.stream.advanceWhileChar(e=>{switch(e){case Wa:case La:case $a:return!1;default:return!0}}),!0):!1}escapedJavaScript(){return this.stream.peekChar()===Ri?(this.stream.advance(1),this.stream.advanceWhileChar(t=>t!==Ri),this.stream.advanceIfChar(Ri)?c.EscapedJavaScript:c.BadEscapedJavaScript):null}};var Cr=class extends ke{constructor(){super(new Tt)}_parseStylesheetStatement(e=!1){return this.peek(c.AtKeyword)?this._parseVariableDeclaration()||this._parsePlugin()||super._parseStylesheetAtStatement(e):this._tryParseMixinDeclaration()||this._tryParseMixinReference()||this._parseFunction()||this._parseRuleset(!0)}_parseImport(){if(!this.peekKeyword("@import")&&!this.peekKeyword("@import-once"))return null;let e=this.create(je);if(this.consumeToken(),this.accept(c.ParenthesisL)){if(!this.accept(c.Ident))return this.finish(e,f.IdentifierExpected,[c.SemiColon]);do if(!this.accept(c.Comma))break;while(this.accept(c.Ident));if(!this.accept(c.ParenthesisR))return this.finish(e,f.RightParenthesisExpected,[c.SemiColon])}return!e.addChild(this._parseURILiteral())&&!e.addChild(this._parseStringLiteral())?this.finish(e,f.URIOrStringExpected,[c.SemiColon]):(!this.peek(c.SemiColon)&&!this.peek(c.EOF)&&e.setMedialist(this._parseMediaQueryList()),this._completeParseImport(e))}_parsePlugin(){if(!this.peekKeyword("@plugin"))return null;let e=this.createNode(m.Plugin);return this.consumeToken(),e.addChild(this._parseStringLiteral())?this.accept(c.SemiColon)?this.finish(e):this.finish(e,f.SemiColonExpected):this.finish(e,f.StringLiteralExpected)}_parseMediaQuery(){let e=super._parseMediaQuery();if(!e){let t=this.create(ft);return t.addChild(this._parseVariable())?this.finish(t):null}return e}_parseMediaDeclaration(e=!1){return this._tryParseRuleset(e)||this._tryToParseDeclaration()||this._tryParseMixinDeclaration()||this._tryParseMixinReference()||this._parseDetachedRuleSetMixin()||this._parseStylesheetStatement(e)}_parseMediaFeatureName(){return this._parseIdent()||this._parseVariable()}_parseVariableDeclaration(e=[]){let t=this.create(xe),r=this.mark();if(!t.setVariable(this._parseVariable(!0)))return null;if(this.accept(c.Colon)){if(this.prevToken&&(t.colonPosition=this.prevToken.offset),t.setValue(this._parseDetachedRuleSet()))t.needsSemicolon=!1;else if(!t.setValue(this._parseExpr()))return this.finish(t,f.VariableValueExpected,[],e);t.addChild(this._parsePrio())}else return this.restoreAtMark(r),null;return this.peek(c.SemiColon)&&(t.semicolonPosition=this.token.offset),this.finish(t)}_parseDetachedRuleSet(){let e=this.mark();if(this.peekDelim("#")||this.peekDelim("."))if(this.consumeToken(),!this.hasWhitespace()&&this.accept(c.ParenthesisL)){let r=this.create(ue);if(r.getParameters().addChild(this._parseMixinParameter()))for(;(this.accept(c.Comma)||this.accept(c.SemiColon))&&!this.peek(c.ParenthesisR);)r.getParameters().addChild(this._parseMixinParameter())||this.markError(r,f.IdentifierExpected,[],[c.ParenthesisR]);if(!this.accept(c.ParenthesisR))return this.restoreAtMark(e),null}else return this.restoreAtMark(e),null;if(!this.peek(c.CurlyL))return null;let t=this.create(L);return this._parseBody(t,this._parseDetachedRuleSetBody.bind(this)),this.finish(t)}_parseDetachedRuleSetBody(){return this._tryParseKeyframeSelector()||this._parseRuleSetDeclaration()}_addLookupChildren(e){if(!e.addChild(this._parseLookupValue()))return!1;let t=!1;for(;this.peek(c.BracketL)&&(t=!0),!!e.addChild(this._parseLookupValue());)t=!1;return!t}_parseLookupValue(){let e=this.create(x),t=this.mark();return this.accept(c.BracketL)?(e.addChild(this._parseVariable(!1,!0))||e.addChild(this._parsePropertyIdentifier()))&&this.accept(c.BracketR)||this.accept(c.BracketR)?e:(this.restoreAtMark(t),null):(this.restoreAtMark(t),null)}_parseVariable(e=!1,t=!1){let r=!e&&this.peekDelim("$");if(!this.peekDelim("@")&&!r&&!this.peek(c.AtKeyword))return null;let i=this.create(Ke),s=this.mark();for(;this.acceptDelim("@")||!e&&this.acceptDelim("$");)if(this.hasWhitespace())return this.restoreAtMark(s),null;return!this.accept(c.AtKeyword)&&!this.accept(c.Ident)?(this.restoreAtMark(s),null):!t&&this.peek(c.BracketL)&&!this._addLookupChildren(i)?(this.restoreAtMark(s),null):i}_parseTermExpression(){return this._parseVariable()||this._parseEscaped()||super._parseTermExpression()||this._tryParseMixinReference(!1)}_parseEscaped(){if(this.peek(c.EscapedJavaScript)||this.peek(c.BadEscapedJavaScript)){let e=this.createNode(m.EscapedValue);return this.consumeToken(),this.finish(e)}if(this.peekDelim("~")){let e=this.createNode(m.EscapedValue);return this.consumeToken(),this.accept(c.String)||this.accept(c.EscapedJavaScript)?this.finish(e):this.finish(e,f.TermExpected)}return null}_parseOperator(){let e=this._parseGuardOperator();return e||super._parseOperator()}_parseGuardOperator(){if(this.peekDelim(">")){let e=this.createNode(m.Operator);return this.consumeToken(),this.acceptDelim("="),e}else if(this.peekDelim("=")){let e=this.createNode(m.Operator);return this.consumeToken(),this.acceptDelim("<"),e}else if(this.peekDelim("<")){let e=this.createNode(m.Operator);return this.consumeToken(),this.acceptDelim("="),e}return null}_parseRuleSetDeclaration(){return this.peek(c.AtKeyword)?this._parseKeyframe()||this._parseMedia(!0)||this._parseImport()||this._parseSupports(!0)||this._parseLayer()||this._parsePropertyAtRule()||this._parseContainer(!0)||this._parseDetachedRuleSetMixin()||this._parseVariableDeclaration()||this._parseRuleSetDeclarationAtStatement():this._tryParseMixinDeclaration()||this._tryParseRuleset(!0)||this._tryParseMixinReference()||this._parseFunction()||this._parseExtend()||this._parseDeclaration()}_parseKeyframeIdent(){return this._parseIdent([z.Keyframe])||this._parseVariable()}_parseKeyframeSelector(){return this._parseDetachedRuleSetMixin()||super._parseKeyframeSelector()}_parseSelector(e){let t=this.create(de),r=!1;for(e&&(r=t.addChild(this._parseCombinator()));t.addChild(this._parseSimpleSelector());){r=!0;let i=this.mark();if(t.addChild(this._parseGuard())&&this.peek(c.CurlyL))break;this.restoreAtMark(i),t.addChild(this._parseCombinator())}return r?this.finish(t):null}_parseNestingSelector(){if(this.peekDelim("&")){let e=this.createNode(m.SelectorCombinator);for(this.consumeToken();!this.hasWhitespace()&&(this.acceptDelim("-")||this.accept(c.Num)||this.accept(c.Dimension)||e.addChild(this._parseIdent())||this.acceptDelim("&")););return this.finish(e)}return null}_parseSelectorIdent(){if(!this.peekInterpolatedIdent())return null;let e=this.createNode(m.SelectorInterpolation);return this._acceptInterpolatedIdent(e)?this.finish(e):null}_parsePropertyIdentifier(e=!1){let t=/^[\w-]+/;if(!this.peekInterpolatedIdent()&&!this.peekRegExp(this.token.type,t))return null;let r=this.mark(),i=this.create(G);i.isCustomProperty=this.acceptDelim("-")&&this.acceptDelim("-");let s=!1;return e?i.isCustomProperty?s=i.addChild(this._parseIdent()):s=i.addChild(this._parseRegexp(t)):i.isCustomProperty?s=this._acceptInterpolatedIdent(i):s=this._acceptInterpolatedIdent(i,t),s?(!e&&!this.hasWhitespace()&&(this.acceptDelim("+"),this.hasWhitespace()||this.acceptIdent("_")),this.finish(i)):(this.restoreAtMark(r),null)}peekInterpolatedIdent(){return this.peek(c.Ident)||this.peekDelim("@")||this.peekDelim("$")||this.peekDelim("-")}_acceptInterpolatedIdent(e,t){let r=!1,i=()=>{let a=this.mark();return this.acceptDelim("-")&&(this.hasWhitespace()||this.acceptDelim("-"),this.hasWhitespace())?(this.restoreAtMark(a),null):this._parseInterpolation()},s=t?()=>this.acceptRegexp(t):()=>this.accept(c.Ident);for(;(s()||e.addChild(this._parseInterpolation()||this.try(i)))&&(r=!0,!this.hasWhitespace()););return r}_parseInterpolation(){let e=this.mark();if(this.peekDelim("@")||this.peekDelim("$")){let t=this.createNode(m.Interpolation);return this.consumeToken(),this.hasWhitespace()||!this.accept(c.CurlyL)?(this.restoreAtMark(e),null):t.addChild(this._parseIdent())?this.accept(c.CurlyR)?this.finish(t):this.finish(t,f.RightCurlyExpected):this.finish(t,f.IdentifierExpected)}return null}_tryParseMixinDeclaration(){let e=this.mark(),t=this.create(ue);if(!t.setIdentifier(this._parseMixinDeclarationIdentifier())||!this.accept(c.ParenthesisL))return this.restoreAtMark(e),null;if(t.getParameters().addChild(this._parseMixinParameter()))for(;(this.accept(c.Comma)||this.accept(c.SemiColon))&&!this.peek(c.ParenthesisR);)t.getParameters().addChild(this._parseMixinParameter())||this.markError(t,f.IdentifierExpected,[],[c.ParenthesisR]);return this.accept(c.ParenthesisR)?(t.setGuard(this._parseGuard()),this.peek(c.CurlyL)?this._parseBody(t,this._parseMixInBodyDeclaration.bind(this)):(this.restoreAtMark(e),null)):(this.restoreAtMark(e),null)}_parseMixInBodyDeclaration(){return this._parseFontFace()||this._parseRuleSetDeclaration()}_parseMixinDeclarationIdentifier(){let e;if(this.peekDelim("#")||this.peekDelim(".")){if(e=this.create(G),this.consumeToken(),this.hasWhitespace()||!e.addChild(this._parseIdent()))return null}else if(this.peek(c.Hash))e=this.create(G),this.consumeToken();else return null;return e.referenceTypes=[z.Mixin],this.finish(e)}_parsePseudo(){if(!this.peek(c.Colon))return null;let e=this.mark(),t=this.create(Se);return this.consumeToken(),this.acceptIdent("extend")?this._completeExtends(t):(this.restoreAtMark(e),super._parsePseudo())}_parseExtend(){if(!this.peekDelim("&"))return null;let e=this.mark(),t=this.create(Se);return this.consumeToken(),this.hasWhitespace()||!this.accept(c.Colon)||!this.acceptIdent("extend")?(this.restoreAtMark(e),null):this._completeExtends(t)}_completeExtends(e){if(!this.accept(c.ParenthesisL))return this.finish(e,f.LeftParenthesisExpected);let t=e.getSelectors();if(!t.addChild(this._parseSelector(!0)))return this.finish(e,f.SelectorExpected);for(;this.accept(c.Comma);)if(!t.addChild(this._parseSelector(!0)))return this.finish(e,f.SelectorExpected);return this.accept(c.ParenthesisR)?this.finish(e):this.finish(e,f.RightParenthesisExpected)}_parseDetachedRuleSetMixin(){if(!this.peek(c.AtKeyword))return null;let e=this.mark(),t=this.create(ze);return t.addChild(this._parseVariable(!0))&&(this.hasWhitespace()||!this.accept(c.ParenthesisL))?(this.restoreAtMark(e),null):this.accept(c.ParenthesisR)?this.finish(t):this.finish(t,f.RightParenthesisExpected)}_tryParseMixinReference(e=!0){let t=this.mark(),r=this.create(ze),i=this._parseMixinDeclarationIdentifier();for(;i;){this.acceptDelim(">");let a=this._parseMixinDeclarationIdentifier();if(a)r.getNamespaces().addChild(i),i=a;else break}if(!r.setIdentifier(i))return this.restoreAtMark(t),null;let s=!1;if(this.accept(c.ParenthesisL)){if(s=!0,r.getArguments().addChild(this._parseMixinArgument())){for(;(this.accept(c.Comma)||this.accept(c.SemiColon))&&!this.peek(c.ParenthesisR);)if(!r.getArguments().addChild(this._parseMixinArgument()))return this.finish(r,f.ExpressionExpected)}if(!this.accept(c.ParenthesisR))return this.finish(r,f.RightParenthesisExpected);i.referenceTypes=[z.Mixin]}else i.referenceTypes=[z.Mixin,z.Rule];return this.peek(c.BracketL)?e||this._addLookupChildren(r):r.addChild(this._parsePrio()),!s&&!this.peek(c.SemiColon)&&!this.peek(c.CurlyR)&&!this.peek(c.EOF)?(this.restoreAtMark(t),null):this.finish(r)}_parseMixinArgument(){let e=this.create(le),t=this.mark(),r=this._parseVariable();return r&&(this.accept(c.Colon)?e.setIdentifier(r):this.restoreAtMark(t)),e.setValue(this._parseDetachedRuleSet()||this._parseExpr(!0))?this.finish(e):(this.restoreAtMark(t),null)}_parseMixinParameter(){let e=this.create(ye);if(this.peekKeyword("@rest")){let r=this.create(x);return this.consumeToken(),this.accept(Sr)?(e.setIdentifier(this.finish(r)),this.finish(e)):this.finish(e,f.DotExpected,[],[c.Comma,c.ParenthesisR])}if(this.peek(Sr)){let r=this.create(x);return this.consumeToken(),e.setIdentifier(this.finish(r)),this.finish(e)}let t=!1;return e.setIdentifier(this._parseVariable())&&(this.accept(c.Colon),t=!0),!e.setDefaultValue(this._parseDetachedRuleSet()||this._parseExpr(!0))&&!t?null:this.finish(e)}_parseGuard(){if(!this.peekIdent("when"))return null;let e=this.create(qn);if(this.consumeToken(),!e.getConditions().addChild(this._parseGuardCondition()))return this.finish(e,f.ConditionExpected);for(;this.acceptIdent("and")||this.accept(c.Comma);)if(!e.getConditions().addChild(this._parseGuardCondition()))return this.finish(e,f.ConditionExpected);return this.finish(e)}_parseGuardCondition(){let e=this.create(Kn);return e.isNegated=this.acceptIdent("not"),this.accept(c.ParenthesisL)?(e.addChild(this._parseExpr()),this.accept(c.ParenthesisR)?this.finish(e):this.finish(e,f.RightParenthesisExpected)):e.isNegated?this.finish(e,f.LeftParenthesisExpected):null}_parseFunction(){let e=this.mark(),t=this.create(me);if(!t.setIdentifier(this._parseFunctionIdentifier()))return null;if(this.hasWhitespace()||!this.accept(c.ParenthesisL))return this.restoreAtMark(e),null;if(t.getArguments().addChild(this._parseMixinArgument())){for(;(this.accept(c.Comma)||this.accept(c.SemiColon))&&!this.peek(c.ParenthesisR);)if(!t.getArguments().addChild(this._parseMixinArgument()))return this.finish(t,f.ExpressionExpected)}return this.accept(c.ParenthesisR)?this.finish(t):this.finish(t,f.RightParenthesisExpected)}_parseFunctionIdentifier(){if(this.peekDelim("%")){let e=this.create(G);return e.referenceTypes=[z.Function],this.consumeToken(),this.finish(e)}return super._parseFunctionIdentifier()}_parseURLArgument(){let e=this.mark(),t=super._parseURLArgument();if(!t||!this.peek(c.ParenthesisR)){this.restoreAtMark(e);let r=this.create(x);return r.addChild(this._parseBinaryExpr()),this.finish(r)}return t}};var Nt=class n extends Xe{constructor(e,t){super("@",e,t)}createFunctionProposals(e,t,r,i){for(let s of e){let a={label:s.name,detail:s.example,documentation:s.description,textEdit:_.replace(this.getCompletionRange(t),s.name+"($0)"),insertTextFormat:te.Snippet,kind:k.Function};r&&(a.sortText="z"),i.items.push(a)}return i}getTermProposals(e,t,r){let i=n.builtInProposals;return e&&(i=i.filter(s=>!s.type||!e.restrictions||e.restrictions.indexOf(s.type)!==-1)),this.createFunctionProposals(i,t,!0,r),super.getTermProposals(e,t,r)}getColorProposals(e,t,r){return this.createFunctionProposals(n.colorProposals,t,!1,r),super.getColorProposals(e,t,r)}getCompletionsForDeclarationProperty(e,t){return this.getCompletionsForSelector(null,!0,t),super.getCompletionsForDeclarationProperty(e,t)}};Nt.builtInProposals=[{name:"if",example:"if(condition, trueValue [, falseValue]);",description:p("returns one of two values depending on a condition.")},{name:"boolean",example:"boolean(condition);",description:p('"store" a boolean test for later evaluation in a guard or if().')},{name:"length",example:"length(@list);",description:p("returns the number of elements in a value list")},{name:"extract",example:"extract(@list, index);",description:p("returns a value at the specified position in the list")},{name:"range",example:"range([start, ] end [, step]);",description:p("generate a list spanning a range of values")},{name:"each",example:"each(@list, ruleset);",description:p("bind the evaluation of a ruleset to each member of a list.")},{name:"escape",example:"escape(@string);",description:p("URL encodes a string")},{name:"e",example:"e(@string);",description:p("escape string content")},{name:"replace",example:"replace(@string, @pattern, @replacement[, @flags]);",description:p("string replace")},{name:"unit",example:"unit(@dimension, [@unit: '']);",description:p("remove or change the unit of a dimension")},{name:"color",example:"color(@string);",description:p("parses a string to a color"),type:"color"},{name:"convert",example:"convert(@value, unit);",description:p("converts numbers from one type into another")},{name:"data-uri",example:"data-uri([mimetype,] url);",description:p("inlines a resource and falls back to `url()`"),type:"url"},{name:"abs",description:p("absolute value of a number"),example:"abs(number);"},{name:"acos",description:p("arccosine - inverse of cosine function"),example:"acos(number);"},{name:"asin",description:p("arcsine - inverse of sine function"),example:"asin(number);"},{name:"ceil",example:"ceil(@number);",description:p("rounds up to an integer")},{name:"cos",description:p("cosine function"),example:"cos(number);"},{name:"floor",description:p("rounds down to an integer"),example:"floor(@number);"},{name:"percentage",description:p("converts to a %, e.g. 0.5 > 50%"),example:"percentage(@number);",type:"percentage"},{name:"round",description:p("rounds a number to a number of places"),example:"round(number, [places: 0]);"},{name:"sqrt",description:p("calculates square root of a number"),example:"sqrt(number);"},{name:"sin",description:p("sine function"),example:"sin(number);"},{name:"tan",description:p("tangent function"),example:"tan(number);"},{name:"atan",description:p("arctangent - inverse of tangent function"),example:"atan(number);"},{name:"pi",description:p("returns pi"),example:"pi();"},{name:"pow",description:p("first argument raised to the power of the second argument"),example:"pow(@base, @exponent);"},{name:"mod",description:p("first argument modulus second argument"),example:"mod(number, number);"},{name:"min",description:p("returns the lowest of one or more values"),example:"min(@x, @y);"},{name:"max",description:p("returns the lowest of one or more values"),example:"max(@x, @y);"}];Nt.colorProposals=[{name:"argb",example:"argb(@color);",description:p("creates a #AARRGGBB")},{name:"hsl",example:"hsl(@hue, @saturation, @lightness);",description:p("creates a color")},{name:"hsla",example:"hsla(@hue, @saturation, @lightness, @alpha);",description:p("creates a color")},{name:"hsv",example:"hsv(@hue, @saturation, @value);",description:p("creates a color")},{name:"hsva",example:"hsva(@hue, @saturation, @value, @alpha);",description:p("creates a color")},{name:"hue",example:"hue(@color);",description:p("returns the `hue` channel of `@color` in the HSL space")},{name:"saturation",example:"saturation(@color);",description:p("returns the `saturation` channel of `@color` in the HSL space")},{name:"lightness",example:"lightness(@color);",description:p("returns the `lightness` channel of `@color` in the HSL space")},{name:"hsvhue",example:"hsvhue(@color);",description:p("returns the `hue` channel of `@color` in the HSV space")},{name:"hsvsaturation",example:"hsvsaturation(@color);",description:p("returns the `saturation` channel of `@color` in the HSV space")},{name:"hsvvalue",example:"hsvvalue(@color);",description:p("returns the `value` channel of `@color` in the HSV space")},{name:"red",example:"red(@color);",description:p("returns the `red` channel of `@color`")},{name:"green",example:"green(@color);",description:p("returns the `green` channel of `@color`")},{name:"blue",example:"blue(@color);",description:p("returns the `blue` channel of `@color`")},{name:"alpha",example:"alpha(@color);",description:p("returns the `alpha` channel of `@color`")},{name:"luma",example:"luma(@color);",description:p("returns the `luma` value (perceptual brightness) of `@color`")},{name:"saturate",example:"saturate(@color, 10%);",description:p("return `@color` 10% points more saturated")},{name:"desaturate",example:"desaturate(@color, 10%);",description:p("return `@color` 10% points less saturated")},{name:"lighten",example:"lighten(@color, 10%);",description:p("return `@color` 10% points lighter")},{name:"darken",example:"darken(@color, 10%);",description:p("return `@color` 10% points darker")},{name:"fadein",example:"fadein(@color, 10%);",description:p("return `@color` 10% points less transparent")},{name:"fadeout",example:"fadeout(@color, 10%);",description:p("return `@color` 10% points more transparent")},{name:"fade",example:"fade(@color, 50%);",description:p("return `@color` with 50% transparency")},{name:"spin",example:"spin(@color, 10);",description:p("return `@color` with a 10 degree larger in hue")},{name:"mix",example:"mix(@color1, @color2, [@weight: 50%]);",description:p("return a mix of `@color1` and `@color2`")},{name:"greyscale",example:"greyscale(@color);",description:p("returns a grey, 100% desaturated color")},{name:"contrast",example:"contrast(@color1, [@darkcolor: black], [@lightcolor: white], [@threshold: 43%]);",description:p("return `@darkcolor` if `@color1 is> 43% luma` otherwise return `@lightcolor`, see notes")},{name:"multiply",example:"multiply(@color1, @color2);"},{name:"screen",example:"screen(@color1, @color2);"},{name:"overlay",example:"overlay(@color1, @color2);"},{name:"softlight",example:"softlight(@color1, @color2);"},{name:"hardlight",example:"hardlight(@color1, @color2);"},{name:"difference",example:"difference(@color1, @color2);"},{name:"exclusion",example:"exclusion(@color1, @color2);"},{name:"average",example:"average(@color1, @color2);"},{name:"negation",example:"negation(@color1, @color2);"}];function co(n,e){let t=ja(n);return Ba(t,e)}function ja(n){function e(h){return n.positionAt(h.offset).line}function t(h){return n.positionAt(h.offset+h.len).line}function r(){switch(n.languageId){case"scss":return new zt;case"less":return new Tt;default:return new ce}}function i(h,u){let w=e(h),b=t(h);return w!==b?{startLine:w,endLine:b,kind:u}:null}let s=[],a=[],l=r();l.ignoreComment=!1,l.setSource(n.getText());let o=l.scan(),d=null;for(;o.type!==c.EOF;){switch(o.type){case c.CurlyL:case Mt:{a.push({line:e(o),type:"brace",isStart:!0});break}case c.CurlyR:{if(a.length!==0){let h=lo(a,"brace");if(!h)break;let u=t(o);h.type==="brace"&&(d&&t(d)!==u&&u--,h.line!==u&&s.push({startLine:h.line,endLine:u,kind:void 0}))}break}case c.Comment:{let h=b=>b==="#region"?{line:e(o),type:"comment",isStart:!0}:{line:t(o),type:"comment",isStart:!1},w=(b=>{let y=b.text.match(/^\s*\/\*\s*(#region|#endregion)\b\s*(.*?)\s*\*\//);if(y)return h(y[1]);if(n.languageId==="scss"||n.languageId==="less"){let E=b.text.match(/^\s*\/\/\s*(#region|#endregion)\b\s*(.*?)\s*/);if(E)return h(E[1])}return null})(o);if(w)if(w.isStart)a.push(w);else{let b=lo(a,"comment");if(!b)break;b.type==="comment"&&b.line!==w.line&&s.push({startLine:b.line,endLine:w.line,kind:"region"})}else{let b=i(o,"comment");b&&s.push(b)}break}}d=o,o=l.scan()}return s}function lo(n,e){if(n.length===0)return null;for(let t=n.length-1;t>=0;t--)if(n[t].type===e&&n[t].isStart)return n.splice(t,1)[0];return null}function Ba(n,e){let t=e&&e.rangeLimit||Number.MAX_VALUE,r=n.sort((a,l)=>{let o=a.startLine-l.startLine;return o===0&&(o=a.endLine-l.endLine),o}),i=[],s=-1;return r.forEach(a=>{a.startLine=0;d--)if(this.__items[d].match(o))return!0;return!1},s.prototype.set_indent=function(o,d){this.is_empty()&&(this.__indent_count=o||0,this.__alignment_count=d||0,this.__character_count=this.__parent.get_indent_size(this.__indent_count,this.__alignment_count))},s.prototype._set_wrap_point=function(){this.__parent.wrap_line_length&&(this.__wrap_point_index=this.__items.length,this.__wrap_point_character_count=this.__character_count,this.__wrap_point_indent_count=this.__parent.next_line.__indent_count,this.__wrap_point_alignment_count=this.__parent.next_line.__alignment_count)},s.prototype._should_wrap=function(){return this.__wrap_point_index&&this.__character_count>this.__parent.wrap_line_length&&this.__wrap_point_character_count>this.__parent.next_line.__character_count},s.prototype._allow_wrap=function(){if(this._should_wrap()){this.__parent.add_new_line();var o=this.__parent.current_line;return o.set_indent(this.__wrap_point_indent_count,this.__wrap_point_alignment_count),o.__items=this.__items.slice(this.__wrap_point_index),this.__items=this.__items.slice(0,this.__wrap_point_index),o.__character_count+=this.__character_count-this.__wrap_point_character_count,this.__character_count=this.__wrap_point_character_count,o.__items[0]===" "&&(o.__items.splice(0,1),o.__character_count-=1),!0}return!1},s.prototype.is_empty=function(){return this.__items.length===0},s.prototype.last=function(){return this.is_empty()?null:this.__items[this.__items.length-1]},s.prototype.push=function(o){this.__items.push(o);var d=o.lastIndexOf(` -`);d!==-1?this.__character_count=o.length-d:this.__character_count+=o.length},s.prototype.pop=function(){var o=null;return this.is_empty()||(o=this.__items.pop(),this.__character_count-=o.length),o},s.prototype._remove_indent=function(){this.__indent_count>0&&(this.__indent_count-=1,this.__character_count-=this.__parent.indent_size)},s.prototype._remove_wrap_indent=function(){this.__wrap_point_indent_count>0&&(this.__wrap_point_indent_count-=1)},s.prototype.trim=function(){for(;this.last()===" ";)this.__items.pop(),this.__character_count-=1},s.prototype.toString=function(){var o="";return this.is_empty()?this.__parent.indent_empty_lines&&(o=this.__parent.get_indent_string(this.__indent_count)):(o=this.__parent.get_indent_string(this.__indent_count,this.__alignment_count),o+=this.__items.join("")),o};function a(o,d){this.__cache=[""],this.__indent_size=o.indent_size,this.__indent_string=o.indent_char,o.indent_with_tabs||(this.__indent_string=new Array(o.indent_size+1).join(o.indent_char)),d=d||"",o.indent_level>0&&(d=new Array(o.indent_level+1).join(this.__indent_string)),this.__base_string=d,this.__base_string_length=d.length}a.prototype.get_indent_size=function(o,d){var h=this.__base_string_length;return d=d||0,o<0&&(h=0),h+=o*this.__indent_size,h+=d,h},a.prototype.get_indent_string=function(o,d){var h=this.__base_string;return d=d||0,o<0&&(o=0,h=""),d+=o*this.__indent_size,this.__ensure_cache(d),h+=this.__cache[d],h},a.prototype.__ensure_cache=function(o){for(;o>=this.__cache.length;)this.__add_column()},a.prototype.__add_column=function(){var o=this.__cache.length,d=0,h="";this.__indent_size&&o>=this.__indent_size&&(d=Math.floor(o/this.__indent_size),o-=d*this.__indent_size,h=new Array(d+1).join(this.__indent_string)),o&&(h+=new Array(o+1).join(" ")),this.__cache.push(h)};function l(o,d){this.__indent_cache=new a(o,d),this.raw=!1,this._end_with_newline=o.end_with_newline,this.indent_size=o.indent_size,this.wrap_line_length=o.wrap_line_length,this.indent_empty_lines=o.indent_empty_lines,this.__lines=[],this.previous_line=null,this.current_line=null,this.next_line=new s(this),this.space_before_token=!1,this.non_breaking_space=!1,this.previous_token_wrapped=!1,this.__add_outputline()}l.prototype.__add_outputline=function(){this.previous_line=this.current_line,this.current_line=this.next_line.clone_empty(),this.__lines.push(this.current_line)},l.prototype.get_line_number=function(){return this.__lines.length},l.prototype.get_indent_string=function(o,d){return this.__indent_cache.get_indent_string(o,d)},l.prototype.get_indent_size=function(o,d){return this.__indent_cache.get_indent_size(o,d)},l.prototype.is_empty=function(){return!this.previous_line&&this.current_line.is_empty()},l.prototype.add_new_line=function(o){return this.is_empty()||!o&&this.just_added_newline()?!1:(this.raw||this.__add_outputline(),!0)},l.prototype.get_code=function(o){this.trim(!0);var d=this.current_line.pop();d&&(d[d.length-1]===` -`&&(d=d.replace(/\n+$/g,"")),this.current_line.push(d)),this._end_with_newline&&this.__add_outputline();var h=this.__lines.join(` -`);return o!==` -`&&(h=h.replace(/[\n]/g,o)),h},l.prototype.set_wrap_point=function(){this.current_line._set_wrap_point()},l.prototype.set_indent=function(o,d){return o=o||0,d=d||0,this.next_line.set_indent(o,d),this.__lines.length>1?(this.current_line.set_indent(o,d),!0):(this.current_line.set_indent(),!1)},l.prototype.add_raw_token=function(o){for(var d=0;d1&&this.current_line.is_empty();)this.__lines.pop(),this.current_line=this.__lines[this.__lines.length-1],this.current_line.trim();this.previous_line=this.__lines.length>1?this.__lines[this.__lines.length-2]:null},l.prototype.just_added_newline=function(){return this.current_line.is_empty()},l.prototype.just_added_blankline=function(){return this.is_empty()||this.current_line.is_empty()&&this.previous_line.is_empty()},l.prototype.ensure_empty_line_above=function(o,d){for(var h=this.__lines.length-2;h>=0;){var u=this.__lines[h];if(u.is_empty())break;if(u.item(0).indexOf(o)!==0&&u.item(-1)!==d){this.__lines.splice(h+1,0,new s(this)),this.previous_line=this.__lines[this.__lines.length-2];break}h--}},i.exports.Output=l},,,,function(i){function s(o,d){this.raw_options=a(o,d),this.disabled=this._get_boolean("disabled"),this.eol=this._get_characters("eol","auto"),this.end_with_newline=this._get_boolean("end_with_newline"),this.indent_size=this._get_number("indent_size",4),this.indent_char=this._get_characters("indent_char"," "),this.indent_level=this._get_number("indent_level"),this.preserve_newlines=this._get_boolean("preserve_newlines",!0),this.max_preserve_newlines=this._get_number("max_preserve_newlines",32786),this.preserve_newlines||(this.max_preserve_newlines=0),this.indent_with_tabs=this._get_boolean("indent_with_tabs",this.indent_char===" "),this.indent_with_tabs&&(this.indent_char=" ",this.indent_size===1&&(this.indent_size=4)),this.wrap_line_length=this._get_number("wrap_line_length",this._get_number("max_char")),this.indent_empty_lines=this._get_boolean("indent_empty_lines"),this.templating=this._get_selection_list("templating",["auto","none","angular","django","erb","handlebars","php","smarty"],["auto"])}s.prototype._get_array=function(o,d){var h=this.raw_options[o],u=d||[];return typeof h=="object"?h!==null&&typeof h.concat=="function"&&(u=h.concat()):typeof h=="string"&&(u=h.split(/[^a-zA-Z0-9_\/\-]+/)),u},s.prototype._get_boolean=function(o,d){var h=this.raw_options[o],u=h===void 0?!!d:!!h;return u},s.prototype._get_characters=function(o,d){var h=this.raw_options[o],u=d||"";return typeof h=="string"&&(u=h.replace(/\\r/,"\r").replace(/\\n/,` -`).replace(/\\t/," ")),u},s.prototype._get_number=function(o,d){var h=this.raw_options[o];d=parseInt(d,10),isNaN(d)&&(d=0);var u=parseInt(h,10);return isNaN(u)&&(u=d),u},s.prototype._get_selection=function(o,d,h){var u=this._get_selection_list(o,d,h);if(u.length!==1)throw new Error("Invalid Option Value: The option '"+o+`' can only be one of the following values: -`+d+` -You passed in: '`+this.raw_options[o]+"'");return u[0]},s.prototype._get_selection_list=function(o,d,h){if(!d||d.length===0)throw new Error("Selection list cannot be empty.");if(h=h||[d[0]],!this._is_valid_selection(h,d))throw new Error("Invalid Default Value!");var u=this._get_array(o,h);if(!this._is_valid_selection(u,d))throw new Error("Invalid Option Value: The option '"+o+`' can contain only the following values: -`+d+` -You passed in: '`+this.raw_options[o]+"'");return u},s.prototype._is_valid_selection=function(o,d){return o.length&&d.length&&!o.some(function(h){return d.indexOf(h)===-1})};function a(o,d){var h={};o=l(o);var u;for(u in o)u!==d&&(h[u]=o[u]);if(d&&o[d])for(u in o[d])h[u]=o[d][u];return h}function l(o){var d={},h;for(h in o){var u=h.replace(/-/g,"_");d[u]=o[h]}return d}i.exports.Options=s,i.exports.normalizeOpts=l,i.exports.mergeOpts=a},,function(i){var s=RegExp.prototype.hasOwnProperty("sticky");function a(l){this.__input=l||"",this.__input_length=this.__input.length,this.__position=0}a.prototype.restart=function(){this.__position=0},a.prototype.back=function(){this.__position>0&&(this.__position-=1)},a.prototype.hasNext=function(){return this.__position=0&&l=0&&o=l.length&&this.__input.substring(o-l.length,o).toLowerCase()===l},i.exports.InputScanner=a},,,,,function(i){function s(a,l){a=typeof a=="string"?a:a.source,l=typeof l=="string"?l:l.source,this.__directives_block_pattern=new RegExp(a+/ beautify( \w+[:]\w+)+ /.source+l,"g"),this.__directive_pattern=/ (\w+)[:](\w+)/g,this.__directives_end_ignore_pattern=new RegExp(a+/\sbeautify\signore:end\s/.source+l,"g")}s.prototype.get_directives=function(a){if(!a.match(this.__directives_block_pattern))return null;var l={};this.__directive_pattern.lastIndex=0;for(var o=this.__directive_pattern.exec(a);o;)l[o[1]]=o[2],o=this.__directive_pattern.exec(a);return l},s.prototype.readIgnored=function(a){return a.readUntilAfter(this.__directives_end_ignore_pattern)},i.exports.Directives=s},,function(i,s,a){var l=a(16).Beautifier,o=a(17).Options;function d(h,u){var w=new l(h,u);return w.beautify()}i.exports=d,i.exports.defaultOptions=function(){return new o}},function(i,s,a){var l=a(17).Options,o=a(2).Output,d=a(8).InputScanner,h=a(13).Directives,u=new h(/\/\*/,/\*\//),w=/\r\n|[\r\n]/,b=/\r\n|[\r\n]/g,y=/\s/,E=/(?:\s|\n)+/g,A=/\/\*(?:[\s\S]*?)((?:\*\/)|$)/g,I=/\/\/(?:[^\n\r\u2028\u2029]*)/g;function P(T,j){this._source_text=T||"",this._options=new l(j),this._ch=null,this._input=null,this.NESTED_AT_RULE={page:!0,"font-face":!0,keyframes:!0,media:!0,supports:!0,document:!0},this.CONDITIONAL_GROUP_RULE={media:!0,supports:!0,document:!0},this.NON_SEMICOLON_NEWLINE_PROPERTY=["grid-template-areas","grid-template"]}P.prototype.eatString=function(T){var j="";for(this._ch=this._input.next();this._ch;){if(j+=this._ch,this._ch==="\\")j+=this._input.next();else if(T.indexOf(this._ch)!==-1||this._ch===` -`)break;this._ch=this._input.next()}return j},P.prototype.eatWhitespace=function(T){for(var j=y.test(this._input.peek()),X=0;y.test(this._input.peek());)this._ch=this._input.next(),T&&this._ch===` -`&&(X===0||X0&&this._indentLevel--},P.prototype.beautify=function(){if(this._options.disabled)return this._source_text;var T=this._source_text,j=this._options.eol;j==="auto"&&(j=` -`,T&&w.test(T||"")&&(j=T.match(w)[0])),T=T.replace(b,` -`);var X=T.match(/^[\t ]*/)[0];this._output=new o(this._options,X),this._input=new d(T),this._indentLevel=0,this._nestedLevel=0,this._ch=null;for(var Y=0,$e=!1,K=!1,_e=!1,Ie=!1,S=!1,v=this._ch,F=!1,C,N,D;C=this._input.read(E),N=C!=="",D=v,this._ch=this._input.next(),this._ch==="\\"&&this._input.hasNext()&&(this._ch+=this._input.next()),v=this._ch,this._ch;)if(this._ch==="/"&&this._input.peek()==="*"){this._output.add_new_line(),this._input.back();var M=this._input.read(A),oe=u.get_directives(M);oe&&oe.ignore==="start"&&(M+=u.readIgnored(this._input)),this.print_string(M),this.eatWhitespace(!0),this._output.add_new_line()}else if(this._ch==="/"&&this._input.peek()==="/")this._output.space_before_token=!0,this._input.back(),this.print_string(this._input.read(I)),this.eatWhitespace(!0);else if(this._ch==="$"){this.preserveSingleSpace(N),this.print_string(this._ch);var Z=this._input.peekUntilAfter(/[: ,;{}()[\]\/='"]/g);Z.match(/[ :]$/)&&(Z=this.eatString(": ").replace(/\s+$/,""),this.print_string(Z),this._output.space_before_token=!0),Y===0&&Z.indexOf(":")!==-1&&(K=!0,this.indent())}else if(this._ch==="@")if(this.preserveSingleSpace(N),this._input.peek()==="{")this.print_string(this._ch+this.eatString("}"));else{this.print_string(this._ch);var $=this._input.peekUntilAfter(/[: ,;{}()[\]\/='"]/g);$.match(/[ :]$/)&&($=this.eatString(": ").replace(/\s+$/,""),this.print_string($),this._output.space_before_token=!0),Y===0&&$.indexOf(":")!==-1?(K=!0,this.indent()):$ in this.NESTED_AT_RULE?(this._nestedLevel+=1,$ in this.CONDITIONAL_GROUP_RULE&&(_e=!0)):Y===0&&!K&&(Ie=!0)}else if(this._ch==="#"&&this._input.peek()==="{")this.preserveSingleSpace(N),this.print_string(this._ch+this.eatString("}"));else if(this._ch==="{")K&&(K=!1,this.outdent()),Ie=!1,_e?(_e=!1,$e=this._indentLevel>=this._nestedLevel):$e=this._indentLevel>=this._nestedLevel-1,this._options.newline_between_rules&&$e&&this._output.previous_line&&this._output.previous_line.item(-1)!=="{"&&this._output.ensure_empty_line_above("/",","),this._output.space_before_token=!0,this._options.brace_style==="expand"?(this._output.add_new_line(),this.print_string(this._ch),this.indent(),this._output.set_indent(this._indentLevel)):(D==="("?this._output.space_before_token=!1:D!==","&&this.indent(),this.print_string(this._ch)),this.eatWhitespace(!0),this._output.add_new_line();else if(this._ch==="}")this.outdent(),this._output.add_new_line(),D==="{"&&this._output.trim(!0),K&&(this.outdent(),K=!1),this.print_string(this._ch),$e=!1,this._nestedLevel&&this._nestedLevel--,this.eatWhitespace(!0),this._output.add_new_line(),this._options.newline_between_rules&&!this._output.just_added_blankline()&&this._input.peek()!=="}"&&this._output.add_new_line(!0),this._input.peek()===")"&&(this._output.trim(!0),this._options.brace_style==="expand"&&this._output.add_new_line(!0));else if(this._ch===":"){for(var Ue=0;Ue"||this._ch==="+"||this._ch==="~")&&!K&&Y===0)this._options.space_around_combinator?(this._output.space_before_token=!0,this.print_string(this._ch),this._output.space_before_token=!0):(this.print_string(this._ch),this.eatWhitespace(),this._ch&&y.test(this._ch)&&(this._ch=""));else if(this._ch==="]")this.print_string(this._ch);else if(this._ch==="[")this.preserveSingleSpace(N),this.print_string(this._ch);else if(this._ch==="=")this.eatWhitespace(),this.print_string("="),y.test(this._ch)&&(this._ch="");else if(this._ch==="!"&&!this._input.lookBack("\\"))this._output.space_before_token=!0,this.print_string(this._ch);else{var Co=D==='"'||D==="'";this.preserveSingleSpace(Co||N),this.print_string(this._ch),!this._output.just_added_newline()&&this._input.peek()===` -`&&F&&this._output.add_new_line()}var ko=this._output.get_code(j);return ko},i.exports.Beautifier=P},function(i,s,a){var l=a(6).Options;function o(d){l.call(this,d,"css"),this.selector_separator_newline=this._get_boolean("selector_separator_newline",!0),this.newline_between_rules=this._get_boolean("newline_between_rules",!0);var h=this._get_boolean("space_around_selector_separator");this.space_around_combinator=this._get_boolean("space_around_combinator")||h;var u=this._get_selection_list("brace_style",["collapse","expand","end-expand","none","preserve-inline"]);this.brace_style="collapse";for(var w=0;w0&&fo(r,u-1);)u--;u===0||uo(r,u-1)?h=u:u0){let h=t.insertSpaces?Mr(" ",l*s):Mr(" ",s);d=d.split(` -`).join(` -`+h),e.start.character===0&&(d=h+d)}return[{range:e,newText:d}]}function mo(n){return n.replace(/^\s+/,"")}var qa=123,Ka=125;function Ga(n,e){for(;e>=0;){let t=n.charCodeAt(e);if(t===qa)return!0;if(t===Ka)return!1;e--}return!1}function Le(n,e,t){if(n&&n.hasOwnProperty(e)){let r=n[e];if(r!==null)return r}return t}function Ha(n,e,t){let r=e,i=0,s=t.tabSize||4;for(;r && ]#",relevance:50,description:"@counter-style descriptor. Specifies the symbols used by the marker-construction algorithm specified by the system descriptor. Needs to be specified if the counter system is 'additive'.",restrictions:["integer","string","image","identifier"]},{name:"align-content",browsers:["E12","FF28","S9","C29","IE11","O16"],values:[{name:"center",description:"Lines are packed toward the center of the flex container."},{name:"flex-end",description:"Lines are packed toward the end of the flex container."},{name:"flex-start",description:"Lines are packed toward the start of the flex container."},{name:"space-around",description:"Lines are evenly distributed in the flex container, with half-size spaces on either end."},{name:"space-between",description:"Lines are evenly distributed in the flex container."},{name:"stretch",description:"Lines stretch to take up the remaining space."},{name:"start"},{name:"end"},{name:"normal"},{name:"baseline"},{name:"first baseline"},{name:"last baseline"},{name:"space-around"},{name:"space-between"},{name:"space-evenly"},{name:"stretch"},{name:"safe"},{name:"unsafe"}],syntax:"normal | | | ? ",relevance:66,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/align-content"}],description:"Aligns a flex container's lines within the flex container when there is extra space in the cross-axis, similar to how 'justify-content' aligns individual items within the main-axis.",restrictions:["enum"]},{name:"align-items",browsers:["E12","FF20","S9","C29","IE11","O16"],values:[{name:"baseline",description:"If the flex item's inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."},{name:"center",description:"The flex item's margin box is centered in the cross axis within the line."},{name:"flex-end",description:"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."},{name:"flex-start",description:"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line."},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."},{name:"normal"},{name:"start"},{name:"end"},{name:"self-start"},{name:"self-end"},{name:"first baseline"},{name:"last baseline"},{name:"stretch"},{name:"safe"},{name:"unsafe"}],syntax:"normal | stretch | | [ ? ]",relevance:87,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/align-items"}],description:"Aligns flex items along the cross axis of the current line of the flex container.",restrictions:["enum"]},{name:"justify-items",browsers:["E12","FF20","S9","C52","IE11","O12.1"],values:[{name:"auto"},{name:"normal"},{name:"end"},{name:"start"},{name:"flex-end",description:'"Flex items are packed toward the end of the line."'},{name:"flex-start",description:'"Flex items are packed toward the start of the line."'},{name:"self-end",description:"The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis."},{name:"self-start",description:"The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis.."},{name:"center",description:"The items are packed flush to each other toward the center of the of the alignment container."},{name:"left"},{name:"right"},{name:"baseline"},{name:"first baseline"},{name:"last baseline"},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."},{name:"safe"},{name:"unsafe"},{name:"legacy"}],syntax:"normal | stretch | | ? [ | left | right ] | legacy | legacy && [ left | right | center ]",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/justify-items"}],description:"Defines the default justify-self for all items of the box, giving them the default way of justifying each box along the appropriate axis",restrictions:["enum"]},{name:"justify-self",browsers:["E16","FF45","S10.1","C57","IE10","O44"],values:[{name:"auto"},{name:"normal"},{name:"end"},{name:"start"},{name:"flex-end",description:'"Flex items are packed toward the end of the line."'},{name:"flex-start",description:'"Flex items are packed toward the start of the line."'},{name:"self-end",description:"The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis."},{name:"self-start",description:"The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis.."},{name:"center",description:"The items are packed flush to each other toward the center of the of the alignment container."},{name:"left"},{name:"right"},{name:"baseline"},{name:"first baseline"},{name:"last baseline"},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."},{name:"save"},{name:"unsave"}],syntax:"auto | normal | stretch | | ? [ | left | right ]",relevance:55,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/justify-self"}],description:"Defines the way of justifying a box inside its container along the appropriate axis.",restrictions:["enum"]},{name:"align-self",browsers:["E12","FF20","S9","C29","IE10","O12.1"],values:[{name:"auto",description:"Computes to the value of 'align-items' on the element's parent, or 'stretch' if the element has no parent. On absolutely positioned elements, it computes to itself."},{name:"normal"},{name:"self-end"},{name:"self-start"},{name:"baseline",description:"If the flex item's inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."},{name:"center",description:"The flex item's margin box is centered in the cross axis within the line."},{name:"flex-end",description:"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."},{name:"flex-start",description:"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line."},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."},{name:"baseline"},{name:"first baseline"},{name:"last baseline"},{name:"safe"},{name:"unsafe"}],syntax:"auto | normal | stretch | | ? ",relevance:73,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/align-self"}],description:"Allows the default alignment along the cross axis to be overridden for individual flex items.",restrictions:["enum"]},{name:"all",browsers:["E79","FF27","S9.1","C37","O24"],values:[],syntax:"initial | inherit | unset | revert | revert-layer",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/all"}],description:"Shorthand that resets all properties except 'direction' and 'unicode-bidi'.",restrictions:["enum"]},{name:"alt",browsers:["S9"],values:[],relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/alt"}],description:"Provides alternative text for assistive technology to replace the generated content of a ::before or ::after element.",restrictions:["string","enum"]},{name:"animation",browsers:["E12","FF16","S9","C43","IE10","O30"],values:[{name:"alternate",description:"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."},{name:"alternate-reverse",description:"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."},{name:"backwards",description:"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."},{name:"both",description:"Both forwards and backwards fill modes are applied."},{name:"forwards",description:"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."},{name:"infinite",description:"Causes the animation to repeat forever."},{name:"none",description:"No animation is performed"},{name:"normal",description:"Normal playback."},{name:"reverse",description:"All iterations of the animation are played in the reverse direction from the way they were specified."}],syntax:"#",relevance:82,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/animation"}],description:"Shorthand property combines six of the animation properties into a single property.",restrictions:["time","timing-function","enum","identifier","number"]},{name:"animation-delay",browsers:["E12","FF16","S9","C43","IE10","O30"],syntax:"